RK2 splitting for time stepping MOM adiabatic dynamics.
237 type(ocean_grid_type),
intent(inout) :: G
238 type(verticalGrid_type),
intent(in) :: GV
239 type(unit_scale_type),
intent(in) :: US
240 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
241 target,
intent(inout) :: u
242 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
243 target,
intent(inout) :: v
244 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
246 type(thermo_var_ptrs),
intent(in) :: tv
247 type(vertvisc_type),
intent(inout) :: visc
248 type(time_type),
intent(in) :: Time_local
249 real,
intent(in) :: dt
250 type(mech_forcing),
intent(in) :: forces
251 real,
dimension(:,:),
pointer :: p_surf_begin
253 real,
dimension(:,:),
pointer :: p_surf_end
255 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
256 target,
intent(inout) :: uh
258 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
259 target,
intent(inout) :: vh
261 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
262 intent(inout) :: uhtr
264 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
265 intent(inout) :: vhtr
267 real,
dimension(SZI_(G),SZJ_(G)),
intent(out) :: eta_av
269 type(MOM_dyn_split_RK2_CS),
pointer :: CS
270 logical,
intent(in) :: calc_dtbt
271 type(VarMix_CS),
pointer :: VarMix
272 type(MEKE_type),
pointer :: MEKE
273 type(thickness_diffuse_CS),
pointer :: thickness_diffuse_CSp
275 type(wave_parameters_CS),
optional,
pointer :: Waves
281 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: up
282 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: vp
283 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: hp
285 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: u_bc_accel
286 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: v_bc_accel
290 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
target :: uh_in
291 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
target :: vh_in
295 real,
dimension(SZIB_(G),SZJ_(G)) :: uhbt_out
296 real,
dimension(SZI_(G),SZJB_(G)) :: vhbt_out
300 real,
dimension(SZI_(G),SZJ_(G)) :: eta_pred
304 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
target :: u_adj
305 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
target :: v_adj
310 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: u_old_rad_OBC
311 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: v_old_rad_OBC
316 real,
pointer,
dimension(:,:) :: &
317 p_surf => null(), eta_pf_start => null(), &
318 taux_bot => null(), tauy_bot => null(), &
321 real,
pointer,
dimension(:,:,:) :: &
322 uh_ptr => null(), u_ptr => null(), vh_ptr => null(), v_ptr => null(), &
323 u_init => null(), v_init => null(), &
328 logical :: dyn_p_surf
329 logical :: BT_cont_BT_thick
333 logical :: showCallTree, sym
335 integer :: i, j, k, is, ie, js, je, Isq, Ieq, Jsq, Jeq, nz
336 integer :: cont_stencil
337 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
338 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
339 u_av => cs%u_av ; v_av => cs%v_av ; h_av => cs%h_av ; eta => cs%eta
342 sym=.false.;
if (g%Domain%symmetric) sym=.true.
344 showcalltree = calltree_showquery()
345 if (showcalltree)
call calltree_enter(
"step_MOM_dyn_split_RK2(), MOM_dynamics_split_RK2.F90")
349 do j=g%jsd,g%jed ;
do i=g%isdB,g%iedB ; up(i,j,k) = 0.0 ;
enddo ;
enddo
350 do j=g%jsdB,g%jedB ;
do i=g%isd,g%ied ; vp(i,j,k) = 0.0 ;
enddo ;
enddo
351 do j=g%jsd,g%jed ;
do i=g%isd,g%ied ; hp(i,j,k) = h(i,j,k) ;
enddo ;
enddo
355 call updatecfltruncationvalue(time_local, cs%vertvisc_CSp)
358 call mom_state_chksum(
"Start predictor ", u, v, h, uh, vh, g, gv, symmetric=sym)
359 call check_redundant(
"Start predictor u ", u, v, g)
360 call check_redundant(
"Start predictor uh ", uh, vh, g)
363 dyn_p_surf =
associated(p_surf_begin) .and.
associated(p_surf_end)
366 call safe_alloc_ptr(eta_pf_start,g%isd,g%ied,g%jsd,g%jed)
367 eta_pf_start(:,:) = 0.0
369 p_surf => forces%p_surf
372 if (
associated(cs%OBC))
then
373 if (cs%debug_OBC)
call open_boundary_test_extern_h(g, cs%OBC, h)
375 do k=1,nz ;
do j=g%jsd,g%jed ;
do i=g%IsdB,g%IedB
376 u_old_rad_obc(i,j,k) = u_av(i,j,k)
377 enddo ;
enddo ;
enddo
378 do k=1,nz ;
do j=g%JsdB,g%JedB ;
do i=g%isd,g%ied
379 v_old_rad_obc(i,j,k) = v_av(i,j,k)
380 enddo ;
enddo ;
enddo
383 bt_cont_bt_thick = .false.
384 if (
associated(cs%BT_cont)) bt_cont_bt_thick = &
385 (
allocated(cs%BT_cont%h_u) .and.
allocated(cs%BT_cont%h_v))
387 if (cs%split_bottom_stress)
then
388 taux_bot => cs%taux_bot ; tauy_bot => cs%tauy_bot
393 cont_stencil = continuity_stencil(cs%continuity_CSp)
396 call cpu_clock_begin(id_clock_pass)
397 call create_group_pass(cs%pass_eta, eta, g%Domain)
398 call create_group_pass(cs%pass_visc_rem, cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
399 to_all+scalar_pair, cgrid_ne, halo=max(1,cont_stencil))
400 call create_group_pass(cs%pass_uvp, up, vp, g%Domain, halo=max(1,cont_stencil))
401 call create_group_pass(cs%pass_hp_uv, hp, g%Domain, halo=2)
402 call create_group_pass(cs%pass_hp_uv, u_av, v_av, g%Domain, halo=2)
403 call create_group_pass(cs%pass_hp_uv, uh(:,:,:), vh(:,:,:), g%Domain, halo=2)
405 call create_group_pass(cs%pass_uv, u, v, g%Domain, halo=max(2,cont_stencil))
406 call create_group_pass(cs%pass_h, h, g%Domain, halo=max(2,cont_stencil))
407 call create_group_pass(cs%pass_av_uvh, u_av, v_av, g%Domain, halo=2)
408 call create_group_pass(cs%pass_av_uvh, uh(:,:,:), vh(:,:,:), g%Domain, halo=2)
409 call cpu_clock_end(id_clock_pass)
415 if (cs%begw == 0.0)
call enable_averaging(dt, time_local, cs%diag)
416 call cpu_clock_begin(id_clock_pres)
417 call pressureforce(h, tv, cs%PFu, cs%PFv, g, gv, us, cs%PressureForce_CSp, &
418 cs%ALE_CSp, p_surf, cs%pbce, cs%eta_PF)
420 pa_to_eta = 1.0 / gv%H_to_Pa
422 do j=jsq,jeq+1 ;
do i=isq,ieq+1
423 eta_pf_start(i,j) = cs%eta_PF(i,j) - pa_to_eta * &
424 (p_surf_begin(i,j) - p_surf_end(i,j))
427 call cpu_clock_end(id_clock_pres)
428 call disable_averaging(cs%diag)
429 if (showcalltree)
call calltree_waypoint(
"done with PressureForce (step_MOM_dyn_split_RK2)")
431 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then
432 call update_obc_data(cs%OBC, g, gv, us, tv, h, cs%update_OBC_CSp, time_local)
434 if (
associated(cs%OBC) .and. cs%debug_OBC) &
435 call open_boundary_zero_normal_flow(cs%OBC, g, cs%PFu, cs%PFv)
437 if (g%nonblocking_updates) &
438 call start_group_pass(cs%pass_eta, g%Domain, clock=id_clock_pass)
441 call cpu_clock_begin(id_clock_cor)
442 call coradcalc(u_av, v_av, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
443 g, gv, us, cs%CoriolisAdv_CSp)
444 call cpu_clock_end(id_clock_cor)
445 if (showcalltree)
call calltree_waypoint(
"done with CorAdCalc (step_MOM_dyn_split_RK2)")
448 call cpu_clock_begin(id_clock_btforce)
451 do j=js,je ;
do i=isq,ieq
452 u_bc_accel(i,j,k) = (cs%Cau(i,j,k) + cs%PFu(i,j,k)) + us%s_to_T*cs%diffu(i,j,k)
454 do j=jsq,jeq ;
do i=is,ie
455 v_bc_accel(i,j,k) = (cs%Cav(i,j,k) + cs%PFv(i,j,k)) + us%s_to_T*cs%diffv(i,j,k)
458 if (
associated(cs%OBC))
then
459 call open_boundary_zero_normal_flow(cs%OBC, g, u_bc_accel, v_bc_accel)
461 call cpu_clock_end(id_clock_btforce)
464 call mom_accel_chksum(
"pre-btstep accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
465 cs%diffu, cs%diffv, g, gv, us, cs%pbce, u_bc_accel, v_bc_accel, &
467 call check_redundant(
"pre-btstep CS%Ca ", cs%Cau, cs%Cav, g)
468 call check_redundant(
"pre-btstep CS%PF ", cs%PFu, cs%PFv, g)
469 call check_redundant(
"pre-btstep CS%diff ", cs%diffu, cs%diffv, g)
470 call check_redundant(
"pre-btstep u_bc_accel ", u_bc_accel, v_bc_accel, g)
473 call cpu_clock_begin(id_clock_vertvisc)
476 do j=js,je ;
do i=isq,ieq
477 up(i,j,k) = g%mask2dCu(i,j) * (u(i,j,k) + dt * u_bc_accel(i,j,k))
479 do j=jsq,jeq ;
do i=is,ie
480 vp(i,j,k) = g%mask2dCv(i,j) * (v(i,j,k) + dt * v_bc_accel(i,j,k))
484 call enable_averaging(dt, time_local, cs%diag)
485 call set_viscous_ml(u, v, h, tv, forces, visc, dt, g, gv, us, &
487 call disable_averaging(cs%diag)
490 call uvchksum(
"before vertvisc: up", up, vp, g%HI, haloshift=0, symmetric=sym)
492 call vertvisc_coef(up, vp, h, forces, visc, dt, g, gv, us, cs%vertvisc_CSp, cs%OBC)
493 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt, g, gv, us, cs%vertvisc_CSp)
494 call cpu_clock_end(id_clock_vertvisc)
495 if (showcalltree)
call calltree_waypoint(
"done with vertvisc_coef (step_MOM_dyn_split_RK2)")
498 call cpu_clock_begin(id_clock_pass)
499 if (g%nonblocking_updates)
then
500 call complete_group_pass(cs%pass_eta, g%Domain)
501 call start_group_pass(cs%pass_visc_rem, g%Domain)
503 call do_group_pass(cs%pass_eta, g%Domain)
504 call do_group_pass(cs%pass_visc_rem, g%Domain)
506 call cpu_clock_end(id_clock_pass)
508 call cpu_clock_begin(id_clock_btcalc)
510 if (.not.bt_cont_bt_thick) &
511 call btcalc(h, g, gv, cs%barotropic_CSp, obc=cs%OBC)
512 call bt_mass_source(h, eta, .true., g, gv, cs%barotropic_CSp)
513 call cpu_clock_end(id_clock_btcalc)
515 if (g%nonblocking_updates) &
516 call complete_group_pass(cs%pass_visc_rem, g%Domain, clock=id_clock_pass)
519 if (
associated(cs%BT_cont) .or. cs%BT_use_layer_fluxes)
then
520 call cpu_clock_begin(id_clock_continuity)
521 call continuity(u, v, h, hp, uh_in, vh_in, dt, g, gv, us, &
522 cs%continuity_CSp, obc=cs%OBC, visc_rem_u=cs%visc_rem_u, &
523 visc_rem_v=cs%visc_rem_v, bt_cont=cs%BT_cont)
524 call cpu_clock_end(id_clock_continuity)
525 if (bt_cont_bt_thick)
then
526 call btcalc(h, g, gv, cs%barotropic_CSp, cs%BT_cont%h_u, cs%BT_cont%h_v, &
529 if (showcalltree)
call calltree_waypoint(
"done with continuity[BT_cont] (step_MOM_dyn_split_RK2)")
532 if (cs%BT_use_layer_fluxes)
then
533 uh_ptr => uh_in; vh_ptr => vh_in; u_ptr => u; v_ptr => v
536 u_init => u ; v_init => v
537 call cpu_clock_begin(id_clock_btstep)
538 if (calc_dtbt)
call set_dtbt(g, gv, us, cs%barotropic_CSp, eta, cs%pbce)
539 if (showcalltree)
call calltree_enter(
"btstep(), MOM_barotropic.F90")
541 call btstep(u, v, eta, dt, u_bc_accel, v_bc_accel, forces, cs%pbce, cs%eta_PF, &
542 u_av, v_av, cs%u_accel_bt, cs%v_accel_bt, eta_pred, cs%uhbt, cs%vhbt, &
543 g, gv, us, cs%barotropic_CSp, cs%visc_rem_u, cs%visc_rem_v, &
544 obc=cs%OBC, bt_cont=cs%BT_cont, eta_pf_start=eta_pf_start, &
545 taux_bot=taux_bot, tauy_bot=tauy_bot, &
546 uh0=uh_ptr, vh0=vh_ptr, u_uh0=u_ptr, v_vh0=v_ptr)
547 if (showcalltree)
call calltree_leave(
"btstep()")
548 call cpu_clock_end(id_clock_btstep)
552 call cpu_clock_begin(id_clock_mom_update)
556 do j=jsq,jeq ;
do i=is,ie
557 vp(i,j,k) = g%mask2dCv(i,j) * (v_init(i,j,k) + dt_pred * &
558 (v_bc_accel(i,j,k) + cs%v_accel_bt(i,j,k)))
560 do j=js,je ;
do i=isq,ieq
561 up(i,j,k) = g%mask2dCu(i,j) * (u_init(i,j,k) + dt_pred * &
562 (u_bc_accel(i,j,k) + cs%u_accel_bt(i,j,k)))
565 call cpu_clock_end(id_clock_mom_update)
568 call uvchksum(
"Predictor 1 [uv]", up, vp, g%HI, haloshift=0, symmetric=sym)
569 call hchksum(h,
"Predictor 1 h", g%HI, haloshift=1, scale=gv%H_to_m)
570 call uvchksum(
"Predictor 1 [uv]h", uh, vh, g%HI,haloshift=2, &
571 symmetric=sym, scale=gv%H_to_m)
573 call mom_accel_chksum(
"Predictor accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
574 cs%diffu, cs%diffv, g, gv, us, cs%pbce, cs%u_accel_bt, cs%v_accel_bt, symmetric=sym)
575 call mom_state_chksum(
"Predictor 1 init", u_init, v_init, h, uh, vh, g, gv, haloshift=2, &
577 call check_redundant(
"Predictor 1 up", up, vp, g)
578 call check_redundant(
"Predictor 1 uh", uh, vh, g)
583 call cpu_clock_begin(id_clock_vertvisc)
585 call uvchksum(
"0 before vertvisc: [uv]p", up, vp, g%HI,haloshift=0, symmetric=sym)
587 call vertvisc_coef(up, vp, h, forces, visc, dt_pred, g, gv, us, cs%vertvisc_CSp, &
589 call vertvisc(up, vp, h, forces, visc, dt_pred, cs%OBC, cs%ADp, cs%CDp, g, &
590 gv, us, cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot, waves=waves)
591 if (showcalltree)
call calltree_waypoint(
"done with vertvisc (step_MOM_dyn_split_RK2)")
592 if (g%nonblocking_updates)
then
593 call cpu_clock_end(id_clock_vertvisc)
594 call start_group_pass(cs%pass_uvp, g%Domain, clock=id_clock_pass)
595 call cpu_clock_begin(id_clock_vertvisc)
597 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt_pred, g, gv, us, cs%vertvisc_CSp)
598 call cpu_clock_end(id_clock_vertvisc)
600 call do_group_pass(cs%pass_visc_rem, g%Domain, clock=id_clock_pass)
601 if (g%nonblocking_updates)
then
602 call complete_group_pass(cs%pass_uvp, g%Domain, clock=id_clock_pass)
604 call do_group_pass(cs%pass_uvp, g%Domain, clock=id_clock_pass)
609 call cpu_clock_begin(id_clock_continuity)
610 call continuity(up, vp, h, hp, uh, vh, dt, g, gv, us, cs%continuity_CSp, &
611 cs%uhbt, cs%vhbt, cs%OBC, cs%visc_rem_u, cs%visc_rem_v, &
612 u_av, v_av, bt_cont=cs%BT_cont)
613 call cpu_clock_end(id_clock_continuity)
614 if (showcalltree)
call calltree_waypoint(
"done with continuity (step_MOM_dyn_split_RK2)")
616 call do_group_pass(cs%pass_hp_uv, g%Domain, clock=id_clock_pass)
618 if (
associated(cs%OBC))
then
621 call uvchksum(
"Pre OBC avg [uv]", u_av, v_av, g%HI, haloshift=1, symmetric=sym)
623 call radiation_open_bdry_conds(cs%OBC, u_av, u_old_rad_obc, v_av, v_old_rad_obc, g, dt_pred)
626 call uvchksum(
"Post OBC avg [uv]", u_av, v_av, g%HI, haloshift=1, symmetric=sym)
632 if (g%nonblocking_updates)
then
633 call start_group_pass(cs%pass_av_uvh, g%Domain, clock=id_clock_pass)
638 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
639 h_av(i,j,k) = 0.5*(h(i,j,k) + hp(i,j,k))
640 enddo ;
enddo ;
enddo
643 call enable_averaging(dt, time_local, cs%diag)
649 call cpu_clock_begin(id_clock_btcalc)
650 call bt_mass_source(hp, eta_pred, .false., g, gv, cs%barotropic_CSp)
651 call cpu_clock_end(id_clock_btcalc)
653 if (cs%begw /= 0.0)
then
658 do k=1,nz ;
do j=js-1,je+1 ;
do i=is-1,ie+1
659 hp(i,j,k) = (1.0-cs%begw)*h(i,j,k) + cs%begw*hp(i,j,k)
660 enddo ;
enddo ;
enddo
664 call cpu_clock_begin(id_clock_pres)
665 call pressureforce(hp, tv, cs%PFu, cs%PFv, g, gv, us, cs%PressureForce_CSp, &
666 cs%ALE_CSp, p_surf, cs%pbce, cs%eta_PF)
667 call cpu_clock_end(id_clock_pres)
668 if (showcalltree)
call calltree_waypoint(
"done with PressureForce[hp=(1-b).h+b.h] (step_MOM_dyn_split_RK2)")
671 if (g%nonblocking_updates) &
672 call complete_group_pass(cs%pass_av_uvh, g%Domain, clock=id_clock_pass)
674 if (bt_cont_bt_thick)
then
675 call btcalc(h, g, gv, cs%barotropic_CSp, cs%BT_cont%h_u, cs%BT_cont%h_v, &
677 if (showcalltree)
call calltree_waypoint(
"done with btcalc[BT_cont_BT_thick] (step_MOM_dyn_split_RK2)")
681 call mom_state_chksum(
"Predictor ", up, vp, hp, uh, vh, g, gv, symmetric=sym)
682 call uvchksum(
"Predictor avg [uv]", u_av, v_av, g%HI, haloshift=1, symmetric=sym)
683 call hchksum(h_av,
"Predictor avg h", g%HI, haloshift=0, scale=gv%H_to_m)
685 call check_redundant(
"Predictor up ", up, vp, g)
686 call check_redundant(
"Predictor uh ", uh, vh, g)
690 call cpu_clock_begin(id_clock_horvisc)
691 call horizontal_viscosity(u_av, v_av, h_av, cs%diffu, cs%diffv, &
692 meke, varmix, g, gv, us, cs%hor_visc_CSp, &
693 obc=cs%OBC, bt=cs%barotropic_CSp)
694 call cpu_clock_end(id_clock_horvisc)
695 if (showcalltree)
call calltree_waypoint(
"done with horizontal_viscosity (step_MOM_dyn_split_RK2)")
698 call cpu_clock_begin(id_clock_cor)
699 call coradcalc(u_av, v_av, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
700 g, gv, us, cs%CoriolisAdv_CSp)
701 call cpu_clock_end(id_clock_cor)
702 if (showcalltree)
call calltree_waypoint(
"done with CorAdCalc (step_MOM_dyn_split_RK2)")
707 call cpu_clock_begin(id_clock_btforce)
710 do j=js,je ;
do i=isq,ieq
711 u_bc_accel(i,j,k) = (cs%Cau(i,j,k) + cs%PFu(i,j,k)) + us%s_to_T*cs%diffu(i,j,k)
713 do j=jsq,jeq ;
do i=is,ie
714 v_bc_accel(i,j,k) = (cs%Cav(i,j,k) + cs%PFv(i,j,k)) + us%s_to_T*cs%diffv(i,j,k)
717 if (
associated(cs%OBC))
then
718 call open_boundary_zero_normal_flow(cs%OBC, g, u_bc_accel, v_bc_accel)
720 call cpu_clock_end(id_clock_btforce)
723 call mom_accel_chksum(
"corr pre-btstep accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
724 cs%diffu, cs%diffv, g, gv, us, cs%pbce, u_bc_accel, v_bc_accel, &
726 call check_redundant(
"corr pre-btstep CS%Ca ", cs%Cau, cs%Cav, g)
727 call check_redundant(
"corr pre-btstep CS%PF ", cs%PFu, cs%PFv, g)
728 call check_redundant(
"corr pre-btstep CS%diff ", cs%diffu, cs%diffv, g)
729 call check_redundant(
"corr pre-btstep u_bc_accel ", u_bc_accel, v_bc_accel, g)
734 call cpu_clock_begin(id_clock_btstep)
735 if (cs%BT_use_layer_fluxes)
then
736 uh_ptr => uh ; vh_ptr => vh ; u_ptr => u_av ; v_ptr => v_av
739 if (showcalltree)
call calltree_enter(
"btstep(), MOM_barotropic.F90")
741 call btstep(u, v, eta, dt, u_bc_accel, v_bc_accel, forces, cs%pbce, &
742 cs%eta_PF, u_av, v_av, cs%u_accel_bt, cs%v_accel_bt, &
743 eta_pred, cs%uhbt, cs%vhbt, g, gv, us, cs%barotropic_CSp, &
744 cs%visc_rem_u, cs%visc_rem_v, etaav=eta_av, obc=cs%OBC, &
745 bt_cont = cs%BT_cont, eta_pf_start=eta_pf_start, &
746 taux_bot=taux_bot, tauy_bot=tauy_bot, &
747 uh0=uh_ptr, vh0=vh_ptr, u_uh0=u_ptr, v_vh0=v_ptr)
748 do j=js,je ;
do i=is,ie ; eta(i,j) = eta_pred(i,j) ;
enddo ;
enddo
749 call cpu_clock_end(id_clock_btstep)
750 if (showcalltree)
call calltree_leave(
"btstep()")
753 call check_redundant(
"u_accel_bt ", cs%u_accel_bt, cs%v_accel_bt, g)
757 call cpu_clock_begin(id_clock_mom_update)
760 do j=js,je ;
do i=isq,ieq
761 u(i,j,k) = g%mask2dCu(i,j) * (u_init(i,j,k) + dt * &
762 (u_bc_accel(i,j,k) + cs%u_accel_bt(i,j,k)))
764 do j=jsq,jeq ;
do i=is,ie
765 v(i,j,k) = g%mask2dCv(i,j) * (v_init(i,j,k) + dt * &
766 (v_bc_accel(i,j,k) + cs%v_accel_bt(i,j,k)))
769 call cpu_clock_end(id_clock_mom_update)
772 call uvchksum(
"Corrector 1 [uv]", u, v, g%HI,haloshift=0, symmetric=sym)
773 call hchksum(h,
"Corrector 1 h", g%HI, haloshift=2, scale=gv%H_to_m)
774 call uvchksum(
"Corrector 1 [uv]h", uh, vh, g%HI, haloshift=2, &
775 symmetric=sym, scale=gv%H_to_m)
777 call mom_accel_chksum(
"Corrector accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
778 cs%diffu, cs%diffv, g, gv, us, cs%pbce, cs%u_accel_bt, cs%v_accel_bt, &
784 call cpu_clock_begin(id_clock_vertvisc)
785 call vertvisc_coef(u, v, h, forces, visc, dt, g, gv, us, cs%vertvisc_CSp, cs%OBC)
786 call vertvisc(u, v, h, forces, visc, dt, cs%OBC, cs%ADp, cs%CDp, g, gv, us, &
787 cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot,waves=waves)
788 if (g%nonblocking_updates)
then
789 call cpu_clock_end(id_clock_vertvisc)
790 call start_group_pass(cs%pass_uv, g%Domain, clock=id_clock_pass)
791 call cpu_clock_begin(id_clock_vertvisc)
793 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt, g, gv, us, cs%vertvisc_CSp)
794 call cpu_clock_end(id_clock_vertvisc)
795 if (showcalltree)
call calltree_waypoint(
"done with vertvisc (step_MOM_dyn_split_RK2)")
799 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
800 h_av(i,j,k) = h(i,j,k)
801 enddo ;
enddo ;
enddo
803 call do_group_pass(cs%pass_visc_rem, g%Domain, clock=id_clock_pass)
804 if (g%nonblocking_updates)
then
805 call complete_group_pass(cs%pass_uv, g%Domain, clock=id_clock_pass)
807 call do_group_pass(cs%pass_uv, g%Domain, clock=id_clock_pass)
813 call cpu_clock_begin(id_clock_continuity)
814 call continuity(u, v, h, h, uh, vh, dt, g, gv, us, &
815 cs%continuity_CSp, cs%uhbt, cs%vhbt, cs%OBC, &
816 cs%visc_rem_u, cs%visc_rem_v, u_av, v_av)
817 call cpu_clock_end(id_clock_continuity)
818 call do_group_pass(cs%pass_h, g%Domain, clock=id_clock_pass)
821 call diag_update_remap_grids(cs%diag)
822 if (showcalltree)
call calltree_waypoint(
"done with continuity (step_MOM_dyn_split_RK2)")
824 if (g%nonblocking_updates)
then
825 call start_group_pass(cs%pass_av_uvh, g%Domain, clock=id_clock_pass)
827 call do_group_pass(cs%pass_av_uvh, g%domain, clock=id_clock_pass)
830 if (
associated(cs%OBC))
then
831 call radiation_open_bdry_conds(cs%OBC, u, u_old_rad_obc, v, v_old_rad_obc, g, dt)
836 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
837 h_av(i,j,k) = 0.5*(h_av(i,j,k) + h(i,j,k))
838 enddo ;
enddo ;
enddo
840 if (g%nonblocking_updates) &
841 call complete_group_pass(cs%pass_av_uvh, g%Domain, clock=id_clock_pass)
845 do j=js-2,je+2 ;
do i=isq-2,ieq+2
846 uhtr(i,j,k) = uhtr(i,j,k) + uh(i,j,k)*dt
848 do j=jsq-2,jeq+2 ;
do i=is-2,ie+2
849 vhtr(i,j,k) = vhtr(i,j,k) + vh(i,j,k)*dt
858 if (cs%id_PFu > 0)
call post_data(cs%id_PFu, cs%PFu, cs%diag)
859 if (cs%id_PFv > 0)
call post_data(cs%id_PFv, cs%PFv, cs%diag)
860 if (cs%id_CAu > 0)
call post_data(cs%id_CAu, cs%CAu, cs%diag)
861 if (cs%id_CAv > 0)
call post_data(cs%id_CAv, cs%CAv, cs%diag)
864 if (cs%id_uh > 0)
call post_data(cs%id_uh , uh, cs%diag)
865 if (cs%id_vh > 0)
call post_data(cs%id_vh , vh, cs%diag)
866 if (cs%id_uav > 0)
call post_data(cs%id_uav, u_av, cs%diag)
867 if (cs%id_vav > 0)
call post_data(cs%id_vav, v_av, cs%diag)
868 if (cs%id_u_BT_accel > 0)
call post_data(cs%id_u_BT_accel, cs%u_accel_bt, cs%diag)
869 if (cs%id_v_BT_accel > 0)
call post_data(cs%id_v_BT_accel, cs%v_accel_bt, cs%diag)
872 call mom_state_chksum(
"Corrector ", u, v, h, uh, vh, g, gv, symmetric=sym)
873 call uvchksum(
"Corrector avg [uv]", u_av, v_av, g%HI,haloshift=1, symmetric=sym)
874 call hchksum(h_av,
"Corrector avg h", g%HI, haloshift=1, scale=gv%H_to_m)
878 if (showcalltree)
call calltree_leave(
"step_MOM_dyn_split_RK2()")