275 type(ocean_grid_type),
intent(inout) :: g
276 type(verticalgrid_type),
intent(in) :: gv
277 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
278 target,
intent(inout) :: u
279 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
280 target,
intent(inout) :: v
281 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
283 type(thermo_var_ptrs),
intent(in) :: tv
285 type(vertvisc_type),
intent(inout) :: visc
287 type(time_type),
intent(in) :: time_local
289 real,
intent(in) :: dt
290 type(forcing),
intent(in) :: fluxes
293 real,
dimension(:,:),
pointer :: p_surf_begin
296 real,
dimension(:,:),
pointer :: p_surf_end
299 real,
intent(in) :: dt_since_flux
301 real,
intent(in) :: dt_therm
302 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
303 target,
intent(inout) :: uh
305 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
306 target,
intent(inout) :: vh
308 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
309 intent(inout) :: uhtr
312 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
313 intent(inout) :: vhtr
316 real,
dimension(SZI_(G),SZJ_(G)), &
317 intent(out) :: eta_av
320 type(mom_dyn_legacy_split_cs), &
323 logical,
intent(in) :: calc_dtbt
325 type(varmix_cs),
pointer :: varmix
327 type(meke_type),
pointer :: meke
366 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: &
368 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: &
370 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
373 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: u_bc_accel
374 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: v_bc_accel
377 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
target :: uh_in
378 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
target :: vh_in
381 real,
dimension(SZIB_(G),SZJ_(G)) :: uhbt_out
382 real,
dimension(SZI_(G),SZJB_(G)) :: vhbt_out
385 real,
dimension(SZI_(G),SZJ_(G)) :: eta_pred
388 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
target :: u_adj
389 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
target :: v_adj
393 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: u_tmp
394 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: v_tmp
397 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: u_old_rad_obc
398 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: v_old_rad_obc
403 real,
pointer,
dimension(:,:) :: &
404 p_surf => null(), eta_pf_start => null(), &
405 taux_bot => null(), tauy_bot => null(), &
406 uhbt_in, vhbt_in, eta
407 real,
pointer,
dimension(:,:,:) :: &
408 uh_ptr => null(), u_ptr => null(), vh_ptr => null(), v_ptr => null(), &
409 u_init => null(), v_init => null(), &
415 logical :: dyn_p_surf
416 logical :: bt_cont_bt_thick
419 integer :: pid_bbl_h, pid_eta_pf, pid_eta, pid_visc
420 integer :: pid_h, pid_u, pid_u_av, pid_uh, pid_uhbt_in
421 integer :: i, j, k, is, ie, js, je, isq, ieq, jsq, jeq, nz
422 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
423 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
424 u_av => cs%u_av ; v_av => cs%v_av ; h_av => cs%h_av
425 eta => cs%eta ; uhbt_in => cs%uhbt_in ; vhbt_in => cs%vhbt_in
428 up(:,:,:) = 0.0 ; vp(:,:,:) = 0.0 ; hp(:,:,:) = h(:,:,:)
431 call mom_state_chksum(
"Start predictor ", u, v, h, uh, vh, g, gv)
432 call check_redundant(
"Start predictor u ", u, v, g)
433 call check_redundant(
"Start predictor uh ", uh, vh, g)
436 dyn_p_surf =
associated(p_surf_begin) .and.
associated(p_surf_end)
439 call safe_alloc_ptr(eta_pf_start,g%isd,g%ied,g%jsd,g%jed)
440 eta_pf_start(:,:) = 0.0
442 p_surf => fluxes%p_surf
445 if (
associated(cs%OBC))
then 446 do k=1,nz ;
do j=js,je ;
do i=is-2,ie+1
447 u_old_rad_obc(i,j,k) = u(i,j,k)
448 enddo ;
enddo ;
enddo 449 do k=1,nz ;
do j=js-2,je+1 ;
do i=is,ie
450 v_old_rad_obc(i,j,k) = v(i,j,k)
451 enddo ;
enddo ;
enddo 454 if (
ASSOCIATED(cs%ADp%du_other)) cs%ADp%du_other(:,:,:) = 0.0
455 if (
ASSOCIATED(cs%ADp%dv_other)) cs%ADp%dv_other(:,:,:) = 0.0
457 bt_cont_bt_thick = .false.
458 if (
associated(cs%BT_cont)) bt_cont_bt_thick = &
459 (
associated(cs%BT_cont%h_u) .and.
associated(cs%BT_cont%h_v))
461 if (cs%split_bottom_stress)
then 462 taux_bot => cs%taux_bot ; tauy_bot => cs%tauy_bot
467 if (cs%begw == 0.0)
call enable_averaging(dt, time_local, cs%diag)
468 call cpu_clock_begin(id_clock_pres)
469 call pressureforce(h, tv, cs%PFu, cs%PFv, g, gv, cs%PressureForce_CSp, &
470 cs%ALE_CSp, p_surf, cs%pbce, cs%eta_PF)
472 if (gv%Boussinesq)
then 473 pa_to_eta = 1.0 / (gv%Rho0*gv%g_Earth)
475 pa_to_eta = 1.0 / gv%H_to_Pa
477 do j=jsq,jeq+1 ;
do i=isq,ieq+1
478 eta_pf_start(i,j) = cs%eta_PF(i,j) - pa_to_eta * &
479 (p_surf_begin(i,j) - p_surf_end(i,j))
482 call cpu_clock_end(id_clock_pres)
483 call disable_averaging(cs%diag)
485 if (g%nonblocking_updates)
then 486 call cpu_clock_begin(id_clock_pass)
487 pid_eta_pf = pass_var_start(cs%eta_PF, g%Domain)
488 pid_eta = pass_var_start(eta, g%Domain)
489 if (cs%readjust_velocity) &
490 pid_uhbt_in = pass_vector_start(uhbt_in, vhbt_in, g%Domain)
491 call cpu_clock_end(id_clock_pass)
494 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 495 call update_obc_data(cs%OBC, g, gv, tv, h, cs%update_OBC_CSp, time_local)
499 call cpu_clock_begin(id_clock_cor)
500 call coradcalc(u_av, v_av, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, g, gv, &
502 call cpu_clock_end(id_clock_cor)
505 call cpu_clock_begin(id_clock_btforce)
506 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
507 u_bc_accel(i,j,k) = (cs%Cau(i,j,k) + cs%PFu(i,j,k)) + cs%diffu(i,j,k)
508 enddo ;
enddo ;
enddo 509 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
510 v_bc_accel(i,j,k) = (cs%Cav(i,j,k) + cs%PFv(i,j,k)) + cs%diffv(i,j,k)
511 enddo ;
enddo ;
enddo 512 if (
associated(cs%OBC))
then 513 call open_boundary_zero_normal_flow(cs%OBC, g, u_bc_accel, v_bc_accel)
515 call cpu_clock_end(id_clock_btforce)
518 call check_redundant(
"pre-btstep CS%Ca ", cs%Cau, cs%Cav, g)
519 call check_redundant(
"pre-btstep CS%PF ", cs%PFu, cs%PFv, g)
520 call check_redundant(
"pre-btstep CS%diff ", cs%diffu, cs%diffv, g)
521 call check_redundant(
"pre-btstep u_bc_accel ", u_bc_accel, v_bc_accel, g)
524 if (g%nonblocking_updates)
then 525 call cpu_clock_begin(id_clock_pass)
526 call pass_var_complete(pid_eta_pf, cs%eta_PF, g%Domain)
527 call pass_var_complete(pid_eta, eta, g%Domain)
528 if (cs%readjust_velocity) &
529 call pass_vector_complete(pid_uhbt_in, uhbt_in, vhbt_in, g%Domain)
530 call cpu_clock_end(id_clock_pass)
533 call cpu_clock_begin(id_clock_vertvisc)
534 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
535 up(i,j,k) = g%mask2dCu(i,j) * (u(i,j,k) + dt * u_bc_accel(i,j,k))
536 enddo ;
enddo ;
enddo 537 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
538 vp(i,j,k) = g%mask2dCv(i,j) * (v(i,j,k) + dt * v_bc_accel(i,j,k))
539 enddo ;
enddo ;
enddo 540 call enable_averaging(dt, time_local, cs%diag)
541 call set_viscous_ml(u, v, h, tv, fluxes, visc, dt, g, gv, &
543 call disable_averaging(cs%diag)
545 call vertvisc_coef(up, vp, h, fluxes, visc, dt, g, gv, cs%vertvisc_CSp, cs%OBC)
546 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt, g, gv, cs%vertvisc_CSp)
547 call cpu_clock_end(id_clock_vertvisc)
549 call cpu_clock_begin(id_clock_pass)
550 if (g%nonblocking_updates)
then 551 pid_visc = pass_vector_start(cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
552 to_all+scalar_pair, cgrid_ne)
554 call pass_var(cs%eta_PF, g%Domain, complete=.false.)
555 call pass_var(eta, g%Domain)
556 if (cs%readjust_velocity)
call pass_vector(uhbt_in, vhbt_in, g%Domain)
557 call pass_vector(cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
558 to_all+scalar_pair, cgrid_ne)
560 call cpu_clock_end(id_clock_pass)
562 call cpu_clock_begin(id_clock_btcalc)
564 if (.not.bt_cont_bt_thick) &
565 call legacy_btcalc(h, g, gv, cs%barotropic_CSp)
566 call legacy_bt_mass_source(h, eta, fluxes, .true., dt_therm, dt_since_flux, &
567 g, gv, cs%barotropic_CSp)
568 call cpu_clock_end(id_clock_btcalc)
570 if (g%nonblocking_updates)
then 571 call cpu_clock_begin(id_clock_pass)
572 call pass_vector_complete(pid_visc, cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
573 to_all+scalar_pair, cgrid_ne)
574 call cpu_clock_end(id_clock_pass)
578 if (cs%flux_BT_coupling)
then 579 call cpu_clock_begin(id_clock_continuity)
580 if (cs%readjust_velocity)
then 582 call continuity(u, v, h, hp, uh_in, vh_in, dt, g, gv, &
583 cs%continuity_CSp, uhbt_in, vhbt_in, cs%OBC, &
584 cs%visc_rem_u, cs%visc_rem_v, u_adj, v_adj, &
586 u_init => u_adj ; v_init => v_adj
587 if (
ASSOCIATED(cs%ADp%du_other))
then ;
do k=1,nz ;
do j=js,je ;
do i=isq,ieq
588 cs%ADp%du_other(i,j,k) = u_adj(i,j,k) - u(i,j,k)
589 enddo ;
enddo ;
enddo ;
endif 590 if (
ASSOCIATED(cs%ADp%dv_other))
then ;
do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
591 cs%ADp%dv_other(i,j,k) = v_adj(i,j,k) - v(i,j,k)
592 enddo ;
enddo ;
enddo ;
endif 593 cs%readjust_velocity = .false.
595 call continuity(u, v, h, hp, uh_in, vh_in, dt, g, gv, &
596 cs%continuity_CSp, obc=cs%OBC, bt_cont=cs%BT_cont)
600 u_init => u ; v_init => v
602 call cpu_clock_end(id_clock_continuity)
604 if (bt_cont_bt_thick)
then 605 call cpu_clock_begin(id_clock_pass)
606 call pass_vector(cs%BT_cont%h_u, cs%BT_cont%h_v, g%Domain, &
607 to_all+scalar_pair, cgrid_ne)
608 call cpu_clock_end(id_clock_pass)
609 call legacy_btcalc(h, g, gv, cs%barotropic_CSp, cs%BT_cont%h_u, cs%BT_cont%h_v)
611 call cpu_clock_begin(id_clock_btstep)
612 if (calc_dtbt)
call legacy_set_dtbt(g, gv, cs%barotropic_CSp, eta, cs%pbce, cs%BT_cont)
613 call legacy_btstep(.true., uh_in, vh_in, eta, dt, u_bc_accel, v_bc_accel, &
614 fluxes, cs%pbce, cs%eta_PF, uh, vh, cs%u_accel_bt, &
615 cs%v_accel_bt, eta_pred, cs%uhbt, cs%vhbt, g, gv, &
616 cs%barotropic_CSp, cs%visc_rem_u, cs%visc_rem_v, &
617 uhbt_out = uhbt_out, vhbt_out = vhbt_out, obc = cs%OBC, &
618 bt_cont = cs%BT_cont, eta_pf_start = eta_pf_start, &
619 taux_bot=taux_bot, tauy_bot=tauy_bot)
620 call cpu_clock_end(id_clock_btstep)
623 if (
associated(cs%BT_cont) .or. cs%BT_use_layer_fluxes)
then 624 call cpu_clock_begin(id_clock_continuity)
625 call continuity(u, v, h, hp, uh_in, vh_in, dt, g, gv, &
626 cs%continuity_CSp, obc=cs%OBC, &
627 visc_rem_u=cs%visc_rem_u, visc_rem_v=cs%visc_rem_v, &
629 call cpu_clock_end(id_clock_continuity)
630 if (bt_cont_bt_thick)
then 631 call cpu_clock_begin(id_clock_pass)
632 call pass_vector(cs%BT_cont%h_u, cs%BT_cont%h_v, g%Domain, &
633 to_all+scalar_pair, cgrid_ne)
634 call cpu_clock_end(id_clock_pass)
635 call legacy_btcalc(h, g, gv, cs%barotropic_CSp, cs%BT_cont%h_u, cs%BT_cont%h_v)
639 if (cs%BT_use_layer_fluxes)
then 640 uh_ptr => uh_in; vh_ptr => vh_in; u_ptr => u; v_ptr => v
643 u_init => u ; v_init => v
644 call cpu_clock_begin(id_clock_btstep)
645 if (calc_dtbt)
call legacy_set_dtbt(g, gv, cs%barotropic_CSp, eta, cs%pbce)
646 call legacy_btstep(.false., u, v, eta, dt, u_bc_accel, v_bc_accel, &
647 fluxes, cs%pbce, cs%eta_PF, u_av, v_av, cs%u_accel_bt, &
648 cs%v_accel_bt, eta_pred, cs%uhbt, cs%vhbt, g, gv, cs%barotropic_CSp,&
649 cs%visc_rem_u, cs%visc_rem_v, obc=cs%OBC, &
650 bt_cont = cs%BT_cont, eta_pf_start=eta_pf_start, &
651 taux_bot=taux_bot, tauy_bot=tauy_bot, &
652 uh0=uh_ptr, vh0=vh_ptr, u_uh0=u_ptr, v_vh0=v_ptr)
653 call cpu_clock_end(id_clock_btstep)
658 call cpu_clock_begin(id_clock_mom_update)
659 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
660 vp(i,j,k) = g%mask2dCv(i,j) * (v_init(i,j,k) + dt_pred * &
661 (v_bc_accel(i,j,k) + cs%v_accel_bt(i,j,k)))
662 enddo ;
enddo ;
enddo 664 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
665 up(i,j,k) = g%mask2dCu(i,j) * (u_init(i,j,k) + dt_pred * &
666 (u_bc_accel(i,j,k) + cs%u_accel_bt(i,j,k)))
667 enddo ;
enddo ;
enddo 668 call cpu_clock_end(id_clock_mom_update)
671 call uvchksum(
"Predictor 1 [uv]", up, vp, g%HI,haloshift=0)
672 call hchksum(h,
"Predictor 1 h", g%HI, haloshift=1, scale=gv%H_to_m)
673 call uvchksum(
"Predictor 1 [uv]h", uh, vh, &
674 g%HI, haloshift=2, scale=gv%H_to_m)
676 call mom_accel_chksum(
"Predictor accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
677 cs%diffu, cs%diffv, g, gv, cs%pbce, cs%u_accel_bt, cs%v_accel_bt)
678 call mom_state_chksum(
"Predictor 1 init", u_init, v_init, h, uh, vh, g, gv, haloshift=2)
679 call check_redundant(
"Predictor 1 up", up, vp, g)
680 call check_redundant(
"Predictor 1 uh", uh, vh, g)
685 call cpu_clock_begin(id_clock_vertvisc)
686 call vertvisc_coef(up, vp, h, fluxes, visc, dt_pred, g, gv, cs%vertvisc_CSp, &
688 call vertvisc(up, vp, h, fluxes, visc, dt_pred, cs%OBC, cs%ADp, cs%CDp, g, &
689 gv, cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot)
690 if (g%nonblocking_updates)
then 691 call cpu_clock_end(id_clock_vertvisc) ;
call cpu_clock_begin(id_clock_pass)
692 pid_u = pass_vector_start(up, vp, g%Domain)
693 call cpu_clock_end(id_clock_pass) ;
call cpu_clock_begin(id_clock_vertvisc)
695 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt_pred, g, gv, cs%vertvisc_CSp)
696 call cpu_clock_end(id_clock_vertvisc)
698 call cpu_clock_begin(id_clock_pass)
699 call pass_vector(cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
700 to_all+scalar_pair, cgrid_ne)
701 if (g%nonblocking_updates)
then 702 call pass_vector_complete(pid_u, up, vp, g%Domain)
704 call pass_vector(up, vp, g%Domain)
706 call cpu_clock_end(id_clock_pass)
710 call cpu_clock_begin(id_clock_continuity)
711 call continuity(up, vp, h, hp, uh, vh, dt, g, gv, cs%continuity_CSp, &
712 cs%uhbt, cs%vhbt, cs%OBC, cs%visc_rem_u, &
713 cs%visc_rem_v, u_av, v_av, bt_cont=cs%BT_cont)
714 call cpu_clock_end(id_clock_continuity)
716 call cpu_clock_begin(id_clock_pass)
717 call pass_var(hp, g%Domain)
718 if (g%nonblocking_updates)
then 719 pid_u_av = pass_vector_start(u_av, v_av, g%Domain)
720 pid_uh = pass_vector_start(uh(:,:,:), vh(:,:,:), g%Domain)
722 call pass_vector(u_av, v_av, g%Domain, complete=.false.)
723 call pass_vector(uh(:,:,:), vh(:,:,:), g%Domain)
725 call cpu_clock_end(id_clock_pass)
727 if (
associated(cs%OBC))
then 728 call radiation_open_bdry_conds(cs%OBC, u_av, u_old_rad_obc, v_av, v_old_rad_obc, g, dt)
732 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
733 h_av(i,j,k) = 0.5*(h(i,j,k) + hp(i,j,k))
734 enddo ;
enddo ;
enddo 737 call enable_averaging(dt, time_local, cs%diag)
743 call cpu_clock_begin(id_clock_btcalc)
744 call legacy_bt_mass_source(hp, eta_pred, fluxes, .false., dt_therm, &
745 dt_since_flux+dt, g, gv, cs%barotropic_CSp)
746 call cpu_clock_end(id_clock_btcalc)
748 if (cs%begw /= 0.0)
then 752 do k=1,nz ;
do j=js-1,je+1 ;
do i=is-1,ie+1
753 hp(i,j,k) = (1.0-cs%begw)*h(i,j,k) + cs%begw*hp(i,j,k)
754 enddo ;
enddo ;
enddo 758 call cpu_clock_begin(id_clock_pres)
759 call pressureforce(hp, tv, cs%PFu, cs%PFv, g, gv, &
760 cs%PressureForce_CSp, cs%ALE_CSp, &
761 p_surf, cs%pbce, cs%eta_PF)
762 call cpu_clock_end(id_clock_pres)
763 call cpu_clock_begin(id_clock_pass)
764 call pass_var(cs%eta_PF, g%Domain)
765 call cpu_clock_end(id_clock_pass)
768 if (g%nonblocking_updates)
then 769 call cpu_clock_begin(id_clock_pass)
770 call pass_vector_complete(pid_u_av, u_av, v_av, g%Domain)
771 call pass_vector_complete(pid_uh, uh(:,:,:), vh(:,:,:), g%Domain)
772 call cpu_clock_end(id_clock_pass)
775 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 776 call update_obc_data(cs%OBC, g, gv, tv, h, cs%update_OBC_CSp, time_local)
779 if (bt_cont_bt_thick)
then 780 call cpu_clock_begin(id_clock_pass)
781 call pass_vector(cs%BT_cont%h_u, cs%BT_cont%h_v, g%Domain, &
782 to_all+scalar_pair, cgrid_ne)
783 call cpu_clock_end(id_clock_pass)
784 call legacy_btcalc(h, g, gv, cs%barotropic_CSp, cs%BT_cont%h_u, cs%BT_cont%h_v)
788 call mom_state_chksum(
"Predictor ", up, vp, hp, uh, vh, g, gv)
789 call uvchksum(
"Predictor avg [uv]", u_av, v_av, g%HI, haloshift=1)
790 call hchksum(h_av,
"Predictor avg h",g%HI,haloshift=0, scale=gv%H_to_m)
792 call check_redundant(
"Predictor up ", up, vp, g)
793 call check_redundant(
"Predictor uh ", uh, vh, g)
797 call cpu_clock_begin(id_clock_horvisc)
798 call horizontal_viscosity(u_av, v_av, h_av, cs%diffu, cs%diffv, &
799 meke, varmix, g, gv, cs%hor_visc_CSp, obc=cs%OBC)
800 call cpu_clock_end(id_clock_horvisc)
803 call cpu_clock_begin(id_clock_cor)
804 call coradcalc(u_av, v_av, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, g, gv, &
806 call cpu_clock_end(id_clock_cor)
811 call cpu_clock_begin(id_clock_btforce)
812 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
813 u_bc_accel(i,j,k) = (cs%Cau(i,j,k) + cs%PFu(i,j,k)) + cs%diffu(i,j,k)
814 enddo ;
enddo ;
enddo 815 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
816 v_bc_accel(i,j,k) = (cs%Cav(i,j,k) + cs%PFv(i,j,k)) + cs%diffv(i,j,k)
817 enddo ;
enddo ;
enddo 818 if (
associated(cs%OBC))
then 819 call open_boundary_zero_normal_flow(cs%OBC, g, u_bc_accel, v_bc_accel)
821 call cpu_clock_end(id_clock_btforce)
824 call check_redundant(
"corr pre-btstep CS%Ca ", cs%Cau, cs%Cav, g)
825 call check_redundant(
"corr pre-btstep CS%PF ", cs%PFu, cs%PFv, g)
826 call check_redundant(
"corr pre-btstep CS%diff ", cs%diffu, cs%diffv, g)
827 call check_redundant(
"corr pre-btstep u_bc_accel ", u_bc_accel, v_bc_accel, g)
832 call cpu_clock_begin(id_clock_btstep)
833 if (cs%flux_BT_coupling)
then 834 call legacy_btstep(.true., uh_in, vh_in, eta, dt, u_bc_accel, v_bc_accel, &
835 fluxes, cs%pbce, cs%eta_PF, uh, vh, cs%u_accel_bt, &
836 cs%v_accel_bt, eta, cs%uhbt, cs%vhbt, g, gv, &
837 cs%barotropic_CSp, cs%visc_rem_u, cs%visc_rem_v, etaav=eta_av, &
838 uhbt_out = uhbt_out, vhbt_out = vhbt_out, obc=cs%OBC, &
839 bt_cont = cs%BT_cont, eta_pf_start = eta_pf_start, &
840 taux_bot=taux_bot, tauy_bot=tauy_bot)
842 if (cs%BT_use_layer_fluxes)
then 843 uh_ptr => uh ; vh_ptr => vh ; u_ptr => u_av ; v_ptr => v_av
846 call legacy_btstep(.false., u, v, eta, dt, u_bc_accel, v_bc_accel, &
847 fluxes, cs%pbce, cs%eta_PF, u_av, v_av, cs%u_accel_bt, &
848 cs%v_accel_bt, eta, cs%uhbt, cs%vhbt, g, gv, &
849 cs%barotropic_CSp, cs%visc_rem_u, cs%visc_rem_v, &
850 etaav=eta_av, obc=cs%OBC, &
851 bt_cont = cs%BT_cont, eta_pf_start=eta_pf_start, &
852 taux_bot=taux_bot, tauy_bot=tauy_bot, &
853 uh0=uh_ptr, vh0=vh_ptr, u_uh0=u_ptr, v_vh0=v_ptr)
855 call cpu_clock_end(id_clock_btstep)
858 call check_redundant(
"u_accel_bt ", cs%u_accel_bt, cs%v_accel_bt, g)
862 call cpu_clock_begin(id_clock_mom_update)
863 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
864 u(i,j,k) = g%mask2dCu(i,j) * (u_init(i,j,k) + dt * &
865 (u_bc_accel(i,j,k) + cs%u_accel_bt(i,j,k)))
866 enddo ;
enddo ;
enddo 868 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
869 v(i,j,k) = g%mask2dCv(i,j) * (v_init(i,j,k) + dt * &
870 (v_bc_accel(i,j,k) + cs%v_accel_bt(i,j,k)))
871 enddo ;
enddo ;
enddo 872 call cpu_clock_end(id_clock_mom_update)
875 call uvchksum(
"Corrector 1 [uv]", u, v, g%HI, haloshift=0)
876 call hchksum(h,
"Corrector 1 h",g%HI,haloshift=2, scale=gv%H_to_m)
877 call uvchksum(
"Corrector 1 [uv]h", &
878 uh, vh, g%HI, haloshift=2, scale=gv%H_to_m)
880 call mom_accel_chksum(
"Corrector accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
881 cs%diffu, cs%diffv, g, gv, cs%pbce, cs%u_accel_bt, cs%v_accel_bt)
886 call cpu_clock_begin(id_clock_vertvisc)
887 call vertvisc_coef(u, v, h, fluxes, visc, dt, g, gv, cs%vertvisc_CSp, cs%OBC)
888 call vertvisc(u, v, h, fluxes, visc, dt, cs%OBC, cs%ADp, cs%CDp, g, gv, &
889 cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot)
890 if (g%nonblocking_updates)
then 891 call cpu_clock_end(id_clock_vertvisc) ;
call cpu_clock_begin(id_clock_pass)
892 pid_u = pass_vector_start(u, v, g%Domain)
893 call cpu_clock_end(id_clock_pass) ;
call cpu_clock_begin(id_clock_vertvisc)
895 call vertvisc_remnant(visc, cs%visc_rem_u, cs%visc_rem_v, dt, g, gv, cs%vertvisc_CSp)
896 call cpu_clock_end(id_clock_vertvisc)
899 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
900 h_av(i,j,k) = h(i,j,k)
901 enddo ;
enddo ;
enddo 903 call cpu_clock_begin(id_clock_pass)
904 call pass_vector(cs%visc_rem_u, cs%visc_rem_v, g%Domain, &
905 to_all+scalar_pair, cgrid_ne)
906 if (g%nonblocking_updates)
then 907 call pass_vector_complete(pid_u, u, v, g%Domain)
909 call pass_vector(u, v, g%Domain)
911 call cpu_clock_end(id_clock_pass)
915 if (cs%flux_BT_coupling)
then 919 if (
ASSOCIATED(cs%ADp%du_other))
then ;
do k=1,nz ;
do j=js,je ;
do i=isq,ieq
920 u_tmp(i,j,k) = u(i,j,k)
921 enddo ;
enddo ;
enddo ;
endif 922 if (
ASSOCIATED(cs%ADp%dv_other))
then ;
do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
923 v_tmp(i,j,k) = v(i,j,k)
924 enddo ;
enddo ;
enddo ;
endif 925 call cpu_clock_begin(id_clock_continuity)
926 call continuity(u, v, h, h, uh, vh, dt, g, gv, &
927 cs%continuity_CSp, cs%uhbt, cs%vhbt, cs%OBC, &
928 cs%visc_rem_u, cs%visc_rem_v, u_av, v_av, &
929 uhbt_out, vhbt_out, u, v)
930 call cpu_clock_end(id_clock_continuity)
933 call diag_update_remap_grids(cs%diag)
934 if (g%nonblocking_updates)
then 935 call cpu_clock_begin(id_clock_pass)
936 pid_h = pass_var_start(h, g%Domain)
937 call cpu_clock_end(id_clock_pass)
939 if (
ASSOCIATED(cs%ADp%du_other))
then ;
do k=1,nz ;
do j=js,je ;
do i=isq,ieq
940 cs%ADp%du_other(i,j,k) = cs%ADp%du_other(i,j,k) + (u(i,j,k) - u_tmp(i,j,k))
941 enddo ;
enddo ;
enddo ;
endif 942 if (
ASSOCIATED(cs%ADp%dv_other))
then ;
do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
943 cs%ADp%dv_other(i,j,k) = cs%ADp%dv_other(i,j,k) + (v(i,j,k) - v_tmp(i,j,k))
944 enddo ;
enddo ;
enddo ;
endif 946 call cpu_clock_begin(id_clock_vertvisc)
947 call vertvisc_limit_vel(u, v, h_av, cs%ADp, cs%CDp, fluxes, visc, dt, g, gv, cs%vertvisc_CSp)
948 if (g%nonblocking_updates)
then 949 call cpu_clock_end(id_clock_vertvisc) ;
call cpu_clock_begin(id_clock_pass)
950 pid_u = pass_vector_start(u, v, g%Domain)
951 call cpu_clock_end(id_clock_pass) ;
call cpu_clock_begin(id_clock_vertvisc)
953 call vertvisc_limit_vel(u_av, v_av, h_av, cs%ADp, cs%CDp, fluxes, visc, dt, g, gv, cs%vertvisc_CSp)
954 call cpu_clock_end(id_clock_vertvisc)
956 call cpu_clock_begin(id_clock_pass)
957 if (g%nonblocking_updates)
then 958 call pass_var_complete(pid_h, h, g%Domain)
959 call pass_vector_complete(pid_u, u, v, g%Domain)
961 call pass_var(h, g%Domain)
962 call pass_vector(u, v, g%Domain, complete=.false.)
964 call cpu_clock_end(id_clock_pass)
967 call cpu_clock_begin(id_clock_continuity)
968 call continuity(u, v, h, h, uh, vh, dt, g, gv, &
969 cs%continuity_CSp, cs%uhbt, cs%vhbt, cs%OBC, &
970 cs%visc_rem_u, cs%visc_rem_v, u_av, v_av)
971 call cpu_clock_end(id_clock_continuity)
974 call diag_update_remap_grids(cs%diag)
975 call cpu_clock_begin(id_clock_pass)
976 call pass_var(h, g%Domain)
977 call cpu_clock_end(id_clock_pass)
980 call cpu_clock_begin(id_clock_pass)
981 if (g%nonblocking_updates)
then 982 pid_uh = pass_vector_start(uh(:,:,:), vh(:,:,:), g%Domain)
983 pid_u_av = pass_vector_start(u_av, v_av, g%Domain)
985 call pass_vector(u_av, v_av, g%Domain, complete=.false.)
986 call pass_vector(uh(:,:,:), vh(:,:,:), g%Domain)
988 call cpu_clock_end(id_clock_pass)
990 if (
associated(cs%OBC))
then 991 call radiation_open_bdry_conds(cs%OBC, u, u_old_rad_obc, v, v_old_rad_obc, g, dt)
995 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
996 h_av(i,j,k) = 0.5*(h_av(i,j,k) + h(i,j,k))
997 enddo ;
enddo ;
enddo 999 if (g%nonblocking_updates)
then 1000 call cpu_clock_begin(id_clock_pass)
1001 call pass_vector_complete(pid_uh, uh(:,:,:), vh(:,:,:), g%Domain)
1002 call pass_vector_complete(pid_u_av, u_av, v_av, g%Domain)
1003 call cpu_clock_end(id_clock_pass)
1006 do k=1,nz ;
do j=js-2,je+2 ;
do i=isq-2,ieq+2
1007 uhtr(i,j,k) = uhtr(i,j,k) + uh(i,j,k)*dt
1008 enddo ;
enddo ;
enddo 1009 do k=1,nz ;
do j=jsq-2,jeq+2 ;
do i=is-2,ie+2
1010 vhtr(i,j,k) = vhtr(i,j,k) + vh(i,j,k)*dt
1011 enddo ;
enddo ;
enddo 1018 if (cs%id_PFu > 0)
call post_data(cs%id_PFu, cs%PFu, cs%diag)
1019 if (cs%id_PFv > 0)
call post_data(cs%id_PFv, cs%PFv, cs%diag)
1020 if (cs%id_CAu > 0)
call post_data(cs%id_CAu, cs%CAu, cs%diag)
1021 if (cs%id_CAv > 0)
call post_data(cs%id_CAv, cs%CAv, cs%diag)
1024 if (cs%id_uh > 0)
call post_data(cs%id_uh, uh, cs%diag)
1025 if (cs%id_vh > 0)
call post_data(cs%id_vh, vh, cs%diag)
1026 if (cs%id_uav > 0)
call post_data(cs%id_uav, u_av, cs%diag)
1027 if (cs%id_vav > 0)
call post_data(cs%id_vav, v_av, cs%diag)
1028 if (cs%id_u_BT_accel > 0)
call post_data(cs%id_u_BT_accel, cs%u_accel_bt, cs%diag)
1029 if (cs%id_v_BT_accel > 0)
call post_data(cs%id_v_BT_accel, cs%v_accel_bt, cs%diag)
1030 if (cs%id_du_adj > 0)
call post_data(cs%id_du_adj, cs%ADp%du_other, cs%diag)
1031 if (cs%id_dv_adj > 0)
call post_data(cs%id_dv_adj, cs%ADp%dv_other, cs%diag)
1033 call mom_state_chksum(
"Corrector ", u, v, h, uh, vh, g, gv)
1034 call uvchksum(
"Corrector avg [uv]", u_av, v_av, g%HI, haloshift=1)
1035 call hchksum(h_av,
"Corrector avg h",g%HI,haloshift=1, scale=gv%H_to_m)