186 type(ocean_grid_type),
intent(inout) :: g
187 type(verticalgrid_type),
intent(in) :: gv
188 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
190 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
192 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
195 type(thermo_var_ptrs),
intent(in) :: tv
197 type(vertvisc_type),
intent(inout) :: visc
199 type(time_type),
intent(in) :: time_local
201 real,
intent(in) :: dt
202 type(forcing),
intent(in) :: fluxes
204 real,
dimension(:,:),
pointer :: p_surf_begin
206 real,
dimension(:,:),
pointer :: p_surf_end
208 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
211 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
214 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
215 intent(inout) :: uhtr
217 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
218 intent(inout) :: vhtr
220 real,
dimension(SZI_(G),SZJ_(G)),
intent(out) :: eta_av
222 type(mom_dyn_unsplit_cs),
pointer :: cs
224 type(varmix_cs),
pointer :: varmix
226 type(meke_type),
pointer :: meke
259 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_av, hp
260 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: up, upp
261 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: vp, vpp
262 real,
dimension(:,:),
pointer :: p_surf
265 logical :: dyn_p_surf
266 integer :: i, j, k, is, ie, js, je, isq, ieq, jsq, jeq, nz
267 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
268 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
271 h_av(:,:,:) = 0; hp(:,:,:) = 0
272 up(:,:,:) = 0; upp(:,:,:) = 0
273 vp(:,:,:) = 0; vpp(:,:,:) = 0
275 dyn_p_surf =
associated(p_surf_begin) .and.
associated(p_surf_end)
277 call safe_alloc_ptr(p_surf,g%isd,g%ied,g%jsd,g%jed) ; p_surf(:,:) = 0.0
279 p_surf => fluxes%p_surf
286 call mom_state_chksum(
"Start First Predictor ", u, v, h, uh, vh, g, gv)
290 call enable_averaging(dt,time_local, cs%diag)
291 call cpu_clock_begin(id_clock_horvisc)
292 call horizontal_viscosity(u, v, h, cs%diffu, cs%diffv, meke, varmix, &
293 g, gv, cs%hor_visc_CSp)
294 call cpu_clock_end(id_clock_horvisc)
295 call disable_averaging(cs%diag)
299 call cpu_clock_begin(id_clock_continuity)
300 call continuity(u, v, h, hp, uh, vh, dt*0.5, g, gv, cs%continuity_CSp, &
302 call cpu_clock_end(id_clock_continuity)
303 call cpu_clock_begin(id_clock_pass)
304 call pass_var(hp, g%Domain)
305 call pass_vector(uh, vh, g%Domain)
306 call cpu_clock_end(id_clock_pass)
308 call enable_averaging(0.5*dt,time_local-set_time(int(0.5*dt)), cs%diag)
310 if (cs%id_uh > 0)
call post_data(cs%id_uh, uh, cs%diag)
311 if (cs%id_vh > 0)
call post_data(cs%id_vh, vh, cs%diag)
312 call disable_averaging(cs%diag)
316 call cpu_clock_begin(id_clock_mom_update)
318 do j=js-2,je+2 ;
do i=is-2,ie+2
319 h_av(i,j,k) = (h(i,j,k) + hp(i,j,k)) * 0.5
321 do j=js,je ;
do i=isq,ieq
322 u(i,j,k) = u(i,j,k) + dt * cs%diffu(i,j,k) * g%mask2dCu(i,j)
324 do j=jsq,jeq ;
do i=is,ie
325 v(i,j,k) = v(i,j,k) + dt * cs%diffv(i,j,k) * g%mask2dCv(i,j)
327 do j=js-2,je+2 ;
do i=isq-2,ieq+2
328 uhtr(i,j,k) = uhtr(i,j,k) + 0.5*dt*uh(i,j,k)
330 do j=jsq-2,jeq+2 ;
do i=is-2,ie+2
331 vhtr(i,j,k) = vhtr(i,j,k) + 0.5*dt*vh(i,j,k)
334 call cpu_clock_end(id_clock_mom_update)
335 call cpu_clock_begin(id_clock_pass)
336 call pass_vector(u, v, g%Domain)
337 call cpu_clock_end(id_clock_pass)
340 call cpu_clock_begin(id_clock_cor)
341 call coradcalc(u, v, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
342 g, gv, cs%CoriolisAdv_CSp)
343 call cpu_clock_end(id_clock_cor)
346 call cpu_clock_begin(id_clock_pres)
347 if (dyn_p_surf)
then ;
do j=js-2,je+2 ;
do i=is-2,ie+2
348 p_surf(i,j) = 0.75*p_surf_begin(i,j) + 0.25*p_surf_end(i,j)
349 enddo ;
enddo ;
endif 350 call pressureforce(h_av, tv, cs%PFu, cs%PFv, g, gv, &
351 cs%PressureForce_CSp, cs%ALE_CSp, p_surf)
352 call cpu_clock_end(id_clock_pres)
354 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 355 call update_obc_data(cs%OBC, g, gv, tv, h, cs%update_OBC_CSp, time_local)
357 if (
associated(cs%OBC))
then 358 call open_boundary_zero_normal_flow(cs%OBC, g, cs%PFu, cs%PFv)
359 call open_boundary_zero_normal_flow(cs%OBC, g, cs%CAu, cs%CAv)
363 call cpu_clock_begin(id_clock_mom_update)
364 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
365 up(i,j,k) = g%mask2dCu(i,j) * (u(i,j,k) + dt_pred * &
366 (cs%PFu(i,j,k) + cs%CAu(i,j,k)))
367 enddo ;
enddo ;
enddo 368 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
369 vp(i,j,k) = g%mask2dCv(i,j) * (v(i,j,k) + dt_pred * &
370 (cs%PFv(i,j,k) + cs%CAv(i,j,k)))
371 enddo ;
enddo ;
enddo 372 call cpu_clock_end(id_clock_mom_update)
375 call mom_state_chksum(
"Predictor 1", up, vp, h_av, uh, vh, g, gv)
376 call mom_accel_chksum(
"Predictor 1 accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv,&
377 cs%diffu, cs%diffv, g, gv)
381 call cpu_clock_begin(id_clock_vertvisc)
382 call enable_averaging(dt, time_local, cs%diag)
383 call set_viscous_ml(u, v, h_av, tv, fluxes, visc, dt*0.5, g, gv, &
385 call disable_averaging(cs%diag)
386 call vertvisc_coef(up, vp, h_av, fluxes, visc, dt*0.5, g, gv, &
387 cs%vertvisc_CSp, cs%OBC)
388 call vertvisc(up, vp, h_av, fluxes, visc, dt*0.5, cs%OBC, cs%ADp, cs%CDp, &
389 g, gv, cs%vertvisc_CSp)
390 call cpu_clock_end(id_clock_vertvisc)
391 call cpu_clock_begin(id_clock_pass)
392 call pass_vector(up, vp, g%Domain)
393 call cpu_clock_end(id_clock_pass)
397 call cpu_clock_begin(id_clock_continuity)
398 call continuity(up, vp, hp, h_av, uh, vh, &
399 (0.5*dt), g, gv, cs%continuity_CSp, obc=cs%OBC)
400 call cpu_clock_end(id_clock_continuity)
401 call cpu_clock_begin(id_clock_pass)
402 call pass_var(h_av, g%Domain)
403 call pass_vector(uh, vh, g%Domain)
404 call cpu_clock_end(id_clock_pass)
407 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
408 h_av(i,j,k) = (hp(i,j,k) + h_av(i,j,k)) * 0.5
409 enddo ;
enddo ;
enddo 412 call cpu_clock_begin(id_clock_cor)
413 call coradcalc(up, vp, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
414 g, gv, cs%CoriolisAdv_CSp)
415 call cpu_clock_end(id_clock_cor)
418 call cpu_clock_begin(id_clock_pres)
419 if (dyn_p_surf)
then ;
do j=js-2,je+2 ;
do i=is-2,ie+2
420 p_surf(i,j) = 0.25*p_surf_begin(i,j) + 0.75*p_surf_end(i,j)
421 enddo ;
enddo ;
endif 422 call pressureforce(h_av, tv, cs%PFu, cs%PFv, g, gv, &
423 cs%PressureForce_CSp, cs%ALE_CSp, p_surf)
424 call cpu_clock_end(id_clock_pres)
426 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 427 call update_obc_data(cs%OBC, g, gv, tv, h, cs%update_OBC_CSp, time_local)
429 if (
associated(cs%OBC))
then 430 call open_boundary_zero_normal_flow(cs%OBC, g, cs%PFu, cs%PFv)
431 call open_boundary_zero_normal_flow(cs%OBC, g, cs%CAu, cs%CAv)
435 call cpu_clock_begin(id_clock_mom_update)
436 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
437 upp(i,j,k) = g%mask2dCu(i,j) * (u(i,j,k) + dt * 0.5 * &
438 (cs%PFu(i,j,k) + cs%CAu(i,j,k)))
439 enddo ;
enddo ;
enddo 440 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
441 vpp(i,j,k) = g%mask2dCv(i,j) * (v(i,j,k) + dt * 0.5 * &
442 (cs%PFv(i,j,k) + cs%CAv(i,j,k)))
443 enddo ;
enddo ;
enddo 444 call cpu_clock_end(id_clock_mom_update)
447 call mom_state_chksum(
"Predictor 2", upp, vpp, h_av, uh, vh, g, gv)
448 call mom_accel_chksum(
"Predictor 2 accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv,&
449 cs%diffu, cs%diffv, g, gv)
453 call cpu_clock_begin(id_clock_vertvisc)
454 call vertvisc_coef(upp, vpp, hp, fluxes, visc, dt*0.5, g, gv, &
455 cs%vertvisc_CSp, cs%OBC)
456 call vertvisc(upp, vpp, hp, fluxes, visc, dt*0.5, cs%OBC, cs%ADp, cs%CDp, &
457 g, gv, cs%vertvisc_CSp)
458 call cpu_clock_end(id_clock_vertvisc)
459 call cpu_clock_begin(id_clock_pass)
460 call pass_vector(upp, vpp, g%Domain)
461 call cpu_clock_end(id_clock_pass)
465 call cpu_clock_begin(id_clock_continuity)
466 call continuity(upp, vpp, hp, h, uh, vh, &
467 (dt*0.5), g, gv, cs%continuity_CSp, obc=cs%OBC)
468 call cpu_clock_end(id_clock_continuity)
469 call cpu_clock_begin(id_clock_pass)
470 call pass_var(h, g%Domain)
471 call pass_vector(uh, vh, g%Domain)
472 call cpu_clock_end(id_clock_pass)
475 call diag_update_remap_grids(cs%diag)
477 call enable_averaging(0.5*dt, time_local, cs%diag)
479 if (cs%id_uh > 0)
call post_data(cs%id_uh, uh, cs%diag)
480 if (cs%id_vh > 0)
call post_data(cs%id_vh, vh, cs%diag)
481 call disable_averaging(cs%diag)
482 call enable_averaging(dt, time_local, cs%diag)
486 do j=js-2,je+2 ;
do i=is-2,ie+2
487 h_av(i,j,k) = 0.5*(h(i,j,k) + hp(i,j,k))
489 do j=js-2,je+2 ;
do i=isq-2,ieq+2
490 uhtr(i,j,k) = uhtr(i,j,k) + 0.5*dt*uh(i,j,k)
492 do j=jsq-2,jeq+2 ;
do i=is-2,ie+2
493 vhtr(i,j,k) = vhtr(i,j,k) + 0.5*dt*vh(i,j,k)
498 call cpu_clock_begin(id_clock_cor)
499 call coradcalc(upp, vpp, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
500 g, gv, cs%CoriolisAdv_CSp)
501 call cpu_clock_end(id_clock_cor)
504 call cpu_clock_begin(id_clock_pres)
505 call pressureforce(h_av, tv, cs%PFu, cs%PFv, g, gv, &
506 cs%PressureForce_CSp, cs%ALE_CSp, p_surf)
507 call cpu_clock_end(id_clock_pres)
509 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 510 call update_obc_data(cs%OBC, g, gv, tv, h, cs%update_OBC_CSp, time_local)
514 if (
associated(cs%OBC))
then 515 call open_boundary_zero_normal_flow(cs%OBC, g, cs%PFu, cs%PFv)
516 call open_boundary_zero_normal_flow(cs%OBC, g, cs%CAu, cs%CAv)
518 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
519 u(i,j,k) = g%mask2dCu(i,j) * (u(i,j,k) + dt * &
520 (cs%PFu(i,j,k) + cs%CAu(i,j,k)))
521 enddo ;
enddo ;
enddo 522 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
523 v(i,j,k) = g%mask2dCv(i,j) * (v(i,j,k) + dt * &
524 (cs%PFv(i,j,k) + cs%CAv(i,j,k)))
525 enddo ;
enddo ;
enddo 528 call cpu_clock_begin(id_clock_vertvisc)
529 call vertvisc_coef(u, v, h_av, fluxes, visc, dt, g, gv, cs%vertvisc_CSp, cs%OBC)
530 call vertvisc(u, v, h_av, fluxes, visc, dt, cs%OBC, cs%ADp, cs%CDp, &
531 g, gv, cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot)
532 call cpu_clock_end(id_clock_vertvisc)
533 call cpu_clock_begin(id_clock_pass)
534 call pass_vector(u, v, g%Domain)
535 call cpu_clock_end(id_clock_pass)
538 call mom_state_chksum(
"Corrector", u, v, h, uh, vh, g, gv)
539 call mom_accel_chksum(
"Corrector accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
540 cs%diffu, cs%diffv, g, gv)
543 if (gv%Boussinesq)
then 544 do j=js,je ;
do i=is,ie ; eta_av(i,j) = -g%bathyT(i,j) ;
enddo ;
enddo 546 do j=js,je ;
do i=is,ie ; eta_av(i,j) = 0.0 ;
enddo ;
enddo 548 do k=1,nz ;
do j=js,je ;
do i=is,ie
549 eta_av(i,j) = eta_av(i,j) + h_av(i,j,k)
550 enddo ;
enddo ;
enddo 552 if (dyn_p_surf)
deallocate(p_surf)
556 if (cs%id_PFu > 0)
call post_data(cs%id_PFu, cs%PFu, cs%diag)
557 if (cs%id_PFv > 0)
call post_data(cs%id_PFv, cs%PFv, cs%diag)
558 if (cs%id_CAu > 0)
call post_data(cs%id_CAu, cs%CAu, cs%diag)
559 if (cs%id_CAv > 0)
call post_data(cs%id_CAv, cs%CAv, cs%diag)