This subroutine imposes the diapycnal mass fluxes and the accompanying diapycnal advection of momentum and tracers.
235 type(ocean_grid_type),
intent(inout) :: g
236 type(verticalgrid_type),
intent(in) :: gv
237 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(inout) :: u
238 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(inout) :: v
239 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(inout) :: h
240 type(thermo_var_ptrs),
intent(inout) :: tv
241 real,
dimension(:,:),
pointer :: hml
242 type(forcing),
intent(inout) :: fluxes
243 type(vertvisc_type),
intent(inout) :: visc
244 type(accel_diag_ptrs),
intent(inout) :: adp
246 type(cont_diag_ptrs),
intent(inout) :: cdp
247 real,
intent(in) :: dt
248 type(diabatic_cs),
pointer :: cs
250 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
267 real,
dimension(SZI_(G),SZJ_(G),CS%nMode) :: &
270 real,
dimension(SZI_(G),SZJ_(G)) :: &
273 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: h_diag
274 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: temp_diag
275 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: saln_diag
276 real,
dimension(SZI_(G),SZJ_(G)) :: tendency_2d
277 real,
dimension(SZI_(G),SZJ_(G)) :: tke_itidal_input_test
281 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
287 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
target :: &
298 real,
pointer,
dimension(:,:,:) :: &
304 integer :: kb(szi_(g),szj_(g))
307 real :: p_ref_cv(szi_(g))
311 logical :: in_boundary(szi_(g))
331 real :: htot(szib_(g))
332 real :: b1(szib_(g)), d1(szib_(g))
333 real :: c1(szib_(g),szk_(g))
340 type(p3d) :: z_ptrs(7)
341 integer :: num_z_diags
343 logical :: showcalltree
344 integer :: i, j, k, is, ie, js, je, isq, ieq, jsq, jeq, nz, nkmb, m
347 logical :: avg_enabled
350 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
351 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
352 nkmb = gv%nk_rho_varies
353 h_neglect = gv%H_subroundoff ; h_neglect2 = h_neglect*h_neglect
354 kd_heat(:,:,:) = 0.0 ; kd_salt(:,:,:) = 0.0
358 showcalltree = calltree_showquery()
359 if (showcalltree)
call calltree_enter(
"diabatic(), MOM_diabatic_driver.F90")
362 eaml => eatr ; ebml => ebtr
367 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_diabatic_driver: "// &
368 "Module must be initialized before it is used.")
371 call mom_state_chksum(
"Start of diabatic ", u, v, h, g, gv, haloshift=0)
372 call mom_forcing_chksum(
"Start of diabatic", fluxes, g, haloshift=0)
374 if (cs%debugConservation)
call mom_state_stats(
'Start of diabatic', u, v, h, tv%T, tv%S, g)
376 if (cs%debug_energy_req) &
377 call diapyc_energy_req_test(h, dt, tv, g, gv, cs%diapyc_en_rec_CSp)
380 call cpu_clock_begin(id_clock_set_diffusivity)
381 call set_bbl_tke(u, v, h, fluxes, visc, g, gv, cs%set_diff_CSp)
382 call cpu_clock_end(id_clock_set_diffusivity)
387 if (
ASSOCIATED(tv%T) .AND.
ASSOCIATED(tv%frazil))
then 389 if(cs%frazil_tendency_diag)
then 390 do k=1,nz ;
do j=js,je ;
do i=is,ie
391 temp_diag(i,j,k) = tv%T(i,j,k)
392 enddo ;
enddo ;
enddo 395 if (
ASSOCIATED(fluxes%p_surf_full))
then 396 call make_frazil(h, tv, g, gv, cs%diabatic_aux_CSp, fluxes%p_surf_full)
398 call make_frazil(h, tv, g, gv, cs%diabatic_aux_CSp)
400 if (showcalltree)
call calltree_waypoint(
"done with 1st make_frazil (diabatic)")
402 if (cs%frazil_tendency_diag)
then 403 call diagnose_frazil_tendency(tv, h, temp_diag, dt, g, gv, cs, 1)
408 if (cs%debugConservation)
call mom_state_stats(
'1st make_frazil', u, v, h, tv%T, tv%S, g)
410 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 412 do k=1,nz ;
do j=js,je ;
do i=is,ie
413 h_orig(i,j,k) = h(i,j,k) ; eaml(i,j,k) = 0.0 ; ebml(i,j,k) = 0.0
414 enddo ;
enddo ;
enddo 417 if (cs%use_geothermal)
then 418 call cpu_clock_begin(id_clock_geothermal)
419 call geothermal(h, tv, dt, eaml, ebml, g, gv, cs%geothermal_CSp)
420 call cpu_clock_end(id_clock_geothermal)
421 if (showcalltree)
call calltree_waypoint(
"geothermal (diabatic)")
422 if (cs%debugConservation)
call mom_state_stats(
'geothermal', u, v, h, tv%T, tv%S, g)
428 call diag_update_remap_grids(cs%diag)
433 if (
associated(cs%optics)) &
434 call set_opacity(cs%optics, fluxes, g, gv, cs%opacity_CSp)
436 if (cs%bulkmixedlayer)
then 438 call mom_forcing_chksum(
"Before mixedlayer", fluxes, g, haloshift=0)
441 if (cs%ML_mix_first > 0.0)
then 449 call find_uv_at_h(u, v, h, u_h, v_h, g, gv)
451 call cpu_clock_begin(id_clock_mixedlayer)
452 if (cs%ML_mix_first < 1.0)
then 454 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt*cs%ML_mix_first, &
455 eaml,ebml, g, gv, cs%bulkmixedlayer_CSp, cs%optics, &
456 hml, cs%aggregate_FW_forcing, dt, last_call=.false.)
457 if (cs%salt_reject_below_ML) &
458 call insert_brine(h, tv, g, gv, fluxes, nkmb, cs%diabatic_aux_CSp, &
459 dt*cs%ML_mix_first, cs%id_brine_lay)
462 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt, eaml, ebml, &
463 g, gv, cs%bulkmixedlayer_CSp, cs%optics, &
464 hml, cs%aggregate_FW_forcing, dt, last_call=.true.)
473 if (
ASSOCIATED(tv%S) .and.
ASSOCIATED(tv%salt_deficit)) &
474 call adjust_salt(h, tv, g, gv, cs%diabatic_aux_CSp)
475 call cpu_clock_end(id_clock_mixedlayer)
477 call mom_state_chksum(
"After mixedlayer ", u, v, h, g, gv, haloshift=0)
478 call mom_forcing_chksum(
"After mixedlayer", fluxes, g, haloshift=0)
480 if (showcalltree)
call calltree_waypoint(
"done with 1st bulkmixedlayer (diabatic)")
481 if (cs%debugConservation)
call mom_state_stats(
'1st bulkmixedlayer', u, v, h, tv%T, tv%S, g)
486 call mom_state_chksum(
"before find_uv_at_h", u, v, h, g, gv, haloshift=0)
488 if (cs%use_kappa_shear .or. cs%use_CVMix_shear)
then 489 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 490 call find_uv_at_h(u, v, h_orig, u_h, v_h, g, gv, eaml, ebml)
492 call hchksum(eaml,
"after find_uv_at_h eaml",g%HI, scale=gv%H_to_m)
493 call hchksum(ebml,
"after find_uv_at_h ebml",g%HI, scale=gv%H_to_m)
496 call find_uv_at_h(u, v, h, u_h, v_h, g, gv)
498 if (showcalltree)
call calltree_waypoint(
"done with find_uv_at_h (diabatic)")
501 if (cs%use_int_tides)
then 506 call set_int_tide_input(u, v, h, tv, fluxes, cs%int_tide_input, dt, g, gv, &
507 cs%int_tide_input_CSp)
510 if (cs%uniform_cg)
then 512 do m=1,cs%nMode ; cn(:,:,m) = cs%cg_test ;
enddo 514 call wave_speeds(h, tv, g, gv, cs%nMode, cn, full_halos=.true.)
521 if (cs%int_tide_source_test)
then 524 tke_itidal_input_test(:,:) = 0.0
525 avg_enabled = query_averaging_enabled(cs%diag,time_end=cs%time_end)
526 if (cs%time_end <= cs%time_max_source)
then 527 do j=g%jsc,g%jec ;
do i=g%isc,g%iec
529 if ((g%idg_offset + i == cs%int_tide_source_x) .and. &
530 (g%jdg_offset + j == cs%int_tide_source_y))
then 531 tke_itidal_input_test(i,j) = 1.0
536 call propagate_int_tide(h, tv, cn, tke_itidal_input_test, &
537 cs%int_tide_input%tideamp, cs%int_tide_input%Nb, dt, g, gv, cs%int_tide_CSp)
540 call propagate_int_tide(h, tv, cn, cs%int_tide_input%TKE_itidal_input, &
541 cs%int_tide_input%tideamp, cs%int_tide_input%Nb, dt, g, gv, cs%int_tide_CSp)
543 if (showcalltree)
call calltree_waypoint(
"done with propagate_int_tide (diabatic)")
546 call cpu_clock_begin(id_clock_set_diffusivity)
550 call set_diffusivity(u, v, h, u_h, v_h, tv, fluxes, cs%optics, visc, dt, g, gv, cs%set_diff_CSp, kd, kd_int)
551 call cpu_clock_end(id_clock_set_diffusivity)
552 if (showcalltree)
call calltree_waypoint(
"done with set_diffusivity (diabatic)")
555 call mom_state_chksum(
"after set_diffusivity ", u, v, h, g, gv, haloshift=0)
556 call mom_forcing_chksum(
"after set_diffusivity ", fluxes, g, haloshift=0)
557 call mom_thermovar_chksum(
"after set_diffusivity ", tv, g)
558 call hchksum(kd,
"after set_diffusivity Kd",g%HI,haloshift=0)
559 call hchksum(kd_int,
"after set_diffusivity Kd_Int",g%HI,haloshift=0)
564 call cpu_clock_begin(id_clock_kpp)
570 call calculatebuoyancyflux2d(g, gv, fluxes, cs%optics, h, tv%T, tv%S, tv, &
571 cs%KPP_buoy_flux, cs%KPP_temp_flux, cs%KPP_salt_flux)
579 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
580 kd_salt(i,j,k) = kd_int(i,j,k)
581 kd_heat(i,j,k) = kd_int(i,j,k)
582 enddo ;
enddo ;
enddo 583 if (
associated(visc%Kd_extra_S))
then 585 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
586 kd_salt(i,j,k) = kd_salt(i,j,k) + visc%Kd_extra_S(i,j,k)
587 enddo ;
enddo ;
enddo 589 if (
associated(visc%Kd_extra_T))
then 591 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
592 kd_heat(i,j,k) = kd_heat(i,j,k) + visc%Kd_extra_T(i,j,k)
593 enddo ;
enddo ;
enddo 597 call kpp_calculate(cs%KPP_CSp, g, gv, h, tv%T, tv%S, u, v, tv%eqn_of_state, &
598 fluxes%ustar, cs%KPP_buoy_flux, kd_heat, kd_salt, visc%Kv_turb, cs%KPP_NLTheat, cs%KPP_NLTscalar)
601 if (.not. cs%KPPisPassive)
then 603 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
604 kd_int(i,j,k) = min( kd_salt(i,j,k), kd_heat(i,j,k) )
605 enddo ;
enddo ;
enddo 606 if (
associated(visc%Kd_extra_S))
then 608 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
609 visc%Kd_extra_S(i,j,k) = kd_salt(i,j,k) - kd_int(i,j,k)
610 enddo ;
enddo ;
enddo 612 if (
associated(visc%Kd_extra_T))
then 614 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
615 visc%Kd_extra_T(i,j,k) = kd_heat(i,j,k) - kd_int(i,j,k)
616 enddo ;
enddo ;
enddo 620 call cpu_clock_end(id_clock_kpp)
621 if (showcalltree)
call calltree_waypoint(
"done with KPP_calculate (diabatic)")
623 call mom_state_chksum(
"after KPP", u, v, h, g, gv, haloshift=0)
624 call mom_forcing_chksum(
"after KPP", fluxes, g, haloshift=0)
625 call mom_thermovar_chksum(
"after KPP", tv, g)
626 call hchksum(kd,
"after KPP Kd",g%HI,haloshift=0)
627 call hchksum(kd_int,
"after KPP Kd_Int",g%HI,haloshift=0)
633 if (cs%useConvection)
call diffconvection_calculate(cs%Conv_CSp, &
634 g, gv, h, tv%T, tv%S, tv%eqn_of_state, kd_int)
638 call cpu_clock_begin(id_clock_kpp)
640 call hchksum(cs%KPP_temp_flux,
"before KPP_applyNLT netHeat",g%HI,haloshift=0, scale=gv%H_to_m)
641 call hchksum(cs%KPP_salt_flux,
"before KPP_applyNLT netSalt",g%HI,haloshift=0, scale=gv%H_to_m)
642 call hchksum(cs%KPP_NLTheat,
"before KPP_applyNLT NLTheat",g%HI,haloshift=0)
643 call hchksum(cs%KPP_NLTscalar,
"before KPP_applyNLT NLTscalar",g%HI,haloshift=0)
647 call kpp_nonlocaltransport_temp(cs%KPP_CSp, g, gv, h, cs%KPP_NLTheat, cs%KPP_temp_flux, dt, tv%T, tv%C_p)
648 call kpp_nonlocaltransport_saln(cs%KPP_CSp, g, gv, h, cs%KPP_NLTscalar, cs%KPP_salt_flux, dt, tv%S)
649 call cpu_clock_end(id_clock_kpp)
650 if (showcalltree)
call calltree_waypoint(
"done with KPP_applyNonLocalTransport (diabatic)")
651 if (cs%debugConservation)
call mom_state_stats(
'KPP_applyNonLocalTransport', u, v, h, tv%T, tv%S, g)
654 call mom_state_chksum(
"after KPP_applyNLT ", u, v, h, g, gv, haloshift=0)
655 call mom_forcing_chksum(
"after KPP_applyNLT ", fluxes, g, haloshift=0)
656 call mom_thermovar_chksum(
"after KPP_applyNLT ", tv, g)
666 if (
associated(visc%Kd_extra_T) .and.
associated(visc%Kd_extra_S) .and.
associated(tv%T))
then 667 call cpu_clock_begin(id_clock_differential_diff)
669 call differential_diffuse_t_s(h, tv, visc, dt, g, gv)
670 call cpu_clock_end(id_clock_differential_diff)
671 if (showcalltree)
call calltree_waypoint(
"done with differential_diffuse_T_S (diabatic)")
672 if (cs%debugConservation)
call mom_state_stats(
'differential_diffuse_T_S', u, v, h, tv%T, tv%S, g)
676 if(.not. cs%useKPP)
then 677 do k=2,nz ;
do j=js,je ;
do i=is,ie
678 kd_heat(i,j,k) = kd_heat(i,j,k) + visc%Kd_extra_T(i,j,k)
679 kd_salt(i,j,k) = kd_salt(i,j,k) + visc%Kd_extra_S(i,j,k)
680 enddo ;
enddo ;
enddo 692 if (cs%useALEalgorithm)
then 694 do j=js,je ;
do i=is,ie
699 do k=2,nz ;
do j=js,je ;
do i=is,ie
700 hval=1.0/(h_neglect + 0.5*(h(i,j,k-1) + h(i,j,k)))
701 ea(i,j,k) = (gv%m_to_H**2) * dt * hval * kd_int(i,j,k)
702 eb(i,j,k-1) = ea(i,j,k)
703 enddo ;
enddo ;
enddo 704 do j=js,je ;
do i=is,ie
707 if (showcalltree)
call calltree_waypoint(
"done setting ea,eb from Kd_int (diabatic)")
712 call cpu_clock_begin(id_clock_entrain)
715 call entrainment_diffusive(u, v, h, tv, fluxes, dt, g, gv, cs%entrain_diffusive_CSp, &
716 ea, eb, kb, kd_lay=kd, kd_int=kd_int)
717 call cpu_clock_end(id_clock_entrain)
718 if (showcalltree)
call calltree_waypoint(
"done with Entrainment_diffusive (diabatic)")
723 call mom_forcing_chksum(
"after calc_entrain ", fluxes, g, haloshift=0)
724 call mom_thermovar_chksum(
"after calc_entrain ", tv, g)
725 call mom_state_chksum(
"after calc_entrain ", u, v, h, g, gv, haloshift=0)
726 call hchksum(ea,
"after calc_entrain ea", g%HI, haloshift=0, scale=gv%H_to_m)
727 call hchksum(eb,
"after calc_entrain eb", g%HI, haloshift=0, scale=gv%H_to_m)
731 if (cs%useALEalgorithm)
then 732 call cpu_clock_begin(id_clock_remap)
737 if(cs%boundary_forcing_tendency_diag)
then 738 do k=1,nz ;
do j=js,je ;
do i=is,ie
739 h_diag(i,j,k) = h(i,j,k)
740 temp_diag(i,j,k) = tv%T(i,j,k)
741 saln_diag(i,j,k) = tv%S(i,j,k)
742 enddo ;
enddo ;
enddo 745 do k=1,nz ;
do j=js,je ;
do i=is,ie
746 h_prebound(i,j,k) = h(i,j,k)
747 enddo ;
enddo ;
enddo 748 if (cs%use_energetic_PBL)
then 750 skinbuoyflux(:,:) = 0.0
751 call applyboundaryfluxesinout(cs%diabatic_aux_CSp, g, gv, dt, fluxes, cs%optics, &
752 h, tv, cs%aggregate_FW_forcing, cs%evap_CFL_limit, &
753 cs%minimum_forcing_depth, ctke, dsv_dt, dsv_ds, skinbuoyflux=skinbuoyflux)
756 call hchksum(ea,
"after applyBoundaryFluxes ea",g%HI,haloshift=0, scale=gv%H_to_m)
757 call hchksum(eb,
"after applyBoundaryFluxes eb",g%HI,haloshift=0, scale=gv%H_to_m)
758 call hchksum(ctke,
"after applyBoundaryFluxes cTKE",g%HI,haloshift=0)
759 call hchksum(dsv_dt,
"after applyBoundaryFluxes dSV_dT",g%HI,haloshift=0)
760 call hchksum(dsv_ds,
"after applyBoundaryFluxes dSV_dS",g%HI,haloshift=0)
763 call find_uv_at_h(u, v, h, u_h, v_h, g, gv)
764 call energetic_pbl(h, u_h, v_h, tv, fluxes, dt, kd_epbl, g, gv, &
765 cs%energetic_PBL_CSp, dsv_dt, dsv_ds, ctke, skinbuoyflux)
768 if (
associated(visc%MLD))
then 769 call energetic_pbl_get_mld(cs%energetic_PBL_CSp, visc%MLD, g)
770 call pass_var(visc%MLD, g%domain, halo=1)
771 hml(:,:) = visc%MLD(:,:)
775 do k=2,nz ;
do j=js,je ;
do i=is,ie
777 if (cs%ePBL_is_additive)
then 778 kd_add_here = kd_epbl(i,j,k)
779 visc%Kv_turb(i,j,k) = visc%Kv_turb(i,j,k) + kd_epbl(i,j,k)
781 kd_add_here = max(kd_epbl(i,j,k) - visc%Kd_turb(i,j,k), 0.0)
782 visc%Kv_turb(i,j,k) = max(visc%Kv_turb(i,j,k), kd_epbl(i,j,k))
784 ent_int = kd_add_here * (gv%m_to_H**2 * dt) / &
785 (0.5*(h(i,j,k-1) + h(i,j,k)) + h_neglect)
786 eb(i,j,k-1) = eb(i,j,k-1) + ent_int
787 ea(i,j,k) = ea(i,j,k) + ent_int
788 kd_int(i,j,k) = kd_int(i,j,k) + kd_add_here
791 kd_heat(i,j,k) = kd_heat(i,j,k) + kd_int(i,j,k)
792 kd_salt(i,j,k) = kd_salt(i,j,k) + kd_int(i,j,k)
794 enddo ;
enddo ;
enddo 797 call hchksum(ea,
"after ePBL ea",g%HI,haloshift=0, scale=gv%H_to_m)
798 call hchksum(eb,
"after ePBL eb",g%HI,haloshift=0, scale=gv%H_to_m)
799 call hchksum(kd_epbl,
"after ePBL Kd_ePBL",g%HI,haloshift=0)
803 call applyboundaryfluxesinout(cs%diabatic_aux_CSp, g, gv, dt, fluxes, cs%optics, &
804 h, tv, cs%aggregate_FW_forcing, &
805 cs%evap_CFL_limit, cs%minimum_forcing_depth)
810 if(cs%boundary_forcing_tendency_diag)
then 811 call diagnose_boundary_forcing_tendency(tv, h, temp_diag, saln_diag, h_diag, dt, g, gv, cs)
814 call cpu_clock_end(id_clock_remap)
816 call mom_forcing_chksum(
"after applyBoundaryFluxes ", fluxes, g, haloshift=0)
817 call mom_thermovar_chksum(
"after applyBoundaryFluxes ", tv, g)
818 call mom_state_chksum(
"after applyBoundaryFluxes ", u, v, h, g, gv, haloshift=0)
820 if (showcalltree)
call calltree_waypoint(
"done with applyBoundaryFluxes (diabatic)")
821 if (cs%debugConservation)
call mom_state_stats(
'applyBoundaryFluxes', u, v, h, tv%T, tv%S, g)
836 hold(i,j,1) = h(i,j,1)
837 h(i,j,1) = h(i,j,1) + (eb(i,j,1) - ea(i,j,2))
838 hold(i,j,nz) = h(i,j,nz)
839 h(i,j,nz) = h(i,j,nz) + (ea(i,j,nz) - eb(i,j,nz-1))
840 if (h(i,j,1) <= 0.0)
then 841 h(i,j,1) = gv%Angstrom
843 if (h(i,j,nz) <= 0.0)
then 844 h(i,j,nz) = gv%Angstrom
847 do k=2,nz-1 ;
do i=is,ie
848 hold(i,j,k) = h(i,j,k)
849 h(i,j,k) = h(i,j,k) + ((ea(i,j,k) - eb(i,j,k-1)) + &
850 (eb(i,j,k) - ea(i,j,k+1)))
851 if (h(i,j,k) <= 0.0)
then 852 h(i,j,k) = gv%Angstrom
857 call mom_state_chksum(
"after negative check ", u, v, h, g, gv, haloshift=0)
858 call mom_forcing_chksum(
"after negative check ", fluxes, g, haloshift=0)
859 call mom_thermovar_chksum(
"after negative check ", tv, g)
861 if (showcalltree)
call calltree_waypoint(
"done with h=ea-eb (diabatic)")
862 if (cs%debugConservation)
call mom_state_stats(
'h=ea-eb', u, v, h, tv%T, tv%S, g)
869 if (cs%bulkmixedlayer)
then 871 if (
ASSOCIATED(tv%T))
then 872 call cpu_clock_begin(id_clock_tridiag)
877 if (cs%massless_match_targets)
then 882 h_tr = hold(i,j,1) + h_neglect
883 b1(i) = 1.0 / (h_tr + eb(i,j,1))
885 tv%T(i,j,1) = b1(i) * (h_tr*tv%T(i,j,1))
886 tv%S(i,j,1) = b1(i) * (h_tr*tv%S(i,j,1))
888 do k=2,nkmb ;
do i=is,ie
889 c1(i,k) = eb(i,j,k-1) * b1(i)
890 h_tr = hold(i,j,k) + h_neglect
891 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
892 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
893 if (k<nkmb) d1(i) = b_denom_1 * b1(i)
894 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,k-1))
895 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,k-1))
898 do k=nkmb+1,nz ;
do i=is,ie
899 if (k == kb(i,j))
then 900 c1(i,k) = eb(i,j,k-1) * b1(i)
901 d1(i) = (((eb(i,j,nkmb)-eb(i,j,k-1)) + hold(i,j,nkmb) + h_neglect) + &
902 d1(i)*ea(i,j,nkmb)) * b1(i)
903 h_tr = hold(i,j,k) + h_neglect
904 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
905 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
906 d1(i) = b_denom_1 * b1(i)
907 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,nkmb))
908 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,nkmb))
909 elseif (k > kb(i,j))
then 910 c1(i,k) = eb(i,j,k-1) * b1(i)
911 h_tr = hold(i,j,k) + h_neglect
912 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
913 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
914 d1(i) = b_denom_1 * b1(i)
915 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,k-1))
916 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,k-1))
917 elseif (eb(i,j,k) < eb(i,j,k-1))
then 922 tv%T(i,j,nkmb) = tv%T(i,j,nkmb) + b1(i) * (eb(i,j,k-1) - eb(i,j,k)) * tv%T(i,j,k)
923 tv%S(i,j,nkmb) = tv%S(i,j,nkmb) + b1(i) * (eb(i,j,k-1) - eb(i,j,k)) * tv%S(i,j,k)
927 do k=nz-1,nkmb,-1 ;
do i=is,ie
928 if (k >= kb(i,j))
then 929 tv%T(i,j,k) = tv%T(i,j,k) + c1(i,k+1)*tv%T(i,j,k+1)
930 tv%S(i,j,k) = tv%S(i,j,k) + c1(i,k+1)*tv%S(i,j,k+1)
933 do i=is,ie ;
if (kb(i,j) <= nz)
then 934 tv%T(i,j,nkmb) = tv%T(i,j,nkmb) + c1(i,kb(i,j))*tv%T(i,j,kb(i,j))
935 tv%S(i,j,nkmb) = tv%S(i,j,nkmb) + c1(i,kb(i,j))*tv%S(i,j,kb(i,j))
937 do k=nkmb-1,1,-1 ;
do i=is,ie
938 tv%T(i,j,k) = tv%T(i,j,k) + c1(i,k+1)*tv%T(i,j,k+1)
939 tv%S(i,j,k) = tv%S(i,j,k) + c1(i,k+1)*tv%S(i,j,k+1)
946 if (cs%tracer_tridiag)
then 947 call tracer_vertdiff(hold, ea, eb, dt, tv%T, g, gv)
948 call tracer_vertdiff(hold, ea, eb, dt, tv%S, g, gv)
950 call tridiagts(g, gv, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
953 call cpu_clock_end(id_clock_tridiag)
956 if (cs%debugConservation)
call mom_state_stats(
'BML tridiag', u, v, h, tv%T, tv%S, g)
958 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 962 do k=1,nz ;
do j=js,je ;
do i=is,ie
963 hold(i,j,k) = h_orig(i,j,k)
964 ea(i,j,k) = ea(i,j,k) + eaml(i,j,k)
965 eb(i,j,k) = eb(i,j,k) + ebml(i,j,k)
966 enddo ;
enddo ;
enddo 968 call hchksum(ea,
"after ea = ea + eaml",g%HI,haloshift=0, scale=gv%H_to_m)
969 call hchksum(eb,
"after eb = eb + ebml",g%HI,haloshift=0, scale=gv%H_to_m)
973 if (cs%ML_mix_first < 1.0)
then 982 call find_uv_at_h(u, v, hold, u_h, v_h, g, gv, ea, eb)
983 if (cs%debug)
call mom_state_chksum(
"find_uv_at_h1 ", u, v, h, g, gv, haloshift=0)
985 dt_mix = min(dt,dt*(1.0 - cs%ML_mix_first))
986 call cpu_clock_begin(id_clock_mixedlayer)
988 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt_mix, ea, eb, &
989 g, gv, cs%bulkmixedlayer_CSp, cs%optics, &
990 hml, cs%aggregate_FW_forcing, dt, last_call=.true.)
992 if (cs%salt_reject_below_ML) &
993 call insert_brine(h, tv, g, gv, fluxes, nkmb, cs%diabatic_aux_CSp, dt_mix, &
1002 if (
ASSOCIATED(tv%S) .and.
ASSOCIATED(tv%salt_deficit)) &
1003 call adjust_salt(h, tv, g, gv, cs%diabatic_aux_CSp)
1005 call cpu_clock_end(id_clock_mixedlayer)
1006 if (showcalltree)
call calltree_waypoint(
"done with 2nd bulkmixedlayer (diabatic)")
1007 if (cs%debugConservation)
call mom_state_stats(
'2nd bulkmixedlayer', u, v, h, tv%T, tv%S, g)
1014 if (
ASSOCIATED(tv%T))
then 1017 call hchksum(ea,
"before triDiagTS ea ",g%HI,haloshift=0, scale=gv%H_to_m)
1018 call hchksum(eb,
"before triDiagTS eb ",g%HI,haloshift=0, scale=gv%H_to_m)
1020 call cpu_clock_begin(id_clock_tridiag)
1022 if(cs%diabatic_diff_tendency_diag)
then 1023 do k=1,nz ;
do j=js,je ;
do i=is,ie
1024 temp_diag(i,j,k) = tv%T(i,j,k)
1025 saln_diag(i,j,k) = tv%S(i,j,k)
1026 enddo ;
enddo ;
enddo 1030 if(cs%tracer_tridiag)
then 1031 call tracer_vertdiff(hold, ea, eb, dt, tv%T, g, gv)
1032 call tracer_vertdiff(hold, ea, eb, dt, tv%S, g, gv)
1034 call tridiagts(g, gv, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
1038 if(cs%diabatic_diff_tendency_diag)
then 1039 call diagnose_diabatic_diff_tendency(tv, hold, temp_diag, saln_diag, dt, g, gv, cs)
1042 call cpu_clock_end(id_clock_tridiag)
1043 if (showcalltree)
call calltree_waypoint(
"done with triDiagTS (diabatic)")
1046 if (cs%debugConservation)
call mom_state_stats(
'triDiagTS', u, v, h, tv%T, tv%S, g)
1053 call mom_state_chksum(
"after mixed layer ", u, v, h, g, gv, haloshift=0)
1054 call mom_thermovar_chksum(
"after mixed layer ", tv, g)
1055 call hchksum(ea,
"after mixed layer ea", g%HI, scale=gv%H_to_m)
1056 call hchksum(eb,
"after mixed layer eb", g%HI, scale=gv%H_to_m)
1059 if (.not. cs%useALEalgorithm)
then 1060 call cpu_clock_begin(id_clock_remap)
1061 call regularize_layers(h, tv, dt, ea, eb, g, gv, cs%regularize_layers_CSp)
1062 call cpu_clock_end(id_clock_remap)
1063 if (showcalltree)
call calltree_waypoint(
"done with regularize_layers (diabatic)")
1064 if (cs%debugConservation)
call mom_state_stats(
'regularize_layers', u, v, h, tv%T, tv%S, g)
1069 call diag_update_remap_grids(cs%diag)
1072 if ((cs%id_Tdif > 0) .or. (cs%id_Tdif_z > 0) .or. &
1073 (cs%id_Tadv > 0) .or. (cs%id_Tadv_z > 0))
then 1074 do j=js,je ;
do i=is,ie
1075 tdif_flx(i,j,1) = 0.0 ; tdif_flx(i,j,nz+1) = 0.0
1076 tadv_flx(i,j,1) = 0.0 ; tadv_flx(i,j,nz+1) = 0.0
1079 do k=2,nz ;
do j=js,je ;
do i=is,ie
1080 tdif_flx(i,j,k) = (idt * 0.5*(ea(i,j,k) + eb(i,j,k-1))) * &
1081 (tv%T(i,j,k-1) - tv%T(i,j,k))
1082 tadv_flx(i,j,k) = (idt * (ea(i,j,k) - eb(i,j,k-1))) * &
1083 0.5*(tv%T(i,j,k-1) + tv%T(i,j,k))
1084 enddo ;
enddo ;
enddo 1086 if ((cs%id_Sdif > 0) .or. (cs%id_Sdif_z > 0) .or. &
1087 (cs%id_Sadv > 0) .or. (cs%id_Sadv_z > 0))
then 1088 do j=js,je ;
do i=is,ie
1089 sdif_flx(i,j,1) = 0.0 ; sdif_flx(i,j,nz+1) = 0.0
1090 sadv_flx(i,j,1) = 0.0 ; sadv_flx(i,j,nz+1) = 0.0
1093 do k=2,nz ;
do j=js,je ;
do i=is,ie
1094 sdif_flx(i,j,k) = (idt * 0.5*(ea(i,j,k) + eb(i,j,k-1))) * &
1095 (tv%S(i,j,k-1) - tv%S(i,j,k))
1096 sadv_flx(i,j,k) = (idt * (ea(i,j,k) - eb(i,j,k-1))) * &
1097 0.5*(tv%S(i,j,k-1) + tv%S(i,j,k))
1098 enddo ;
enddo ;
enddo 1102 call cpu_clock_begin(id_clock_tracers)
1103 if (cs%mix_boundary_tracers)
then 1104 tr_ea_bbl = sqrt(dt*cs%Kd_BBL_tr)
1110 ebtr(i,j,nz) = eb(i,j,nz)
1112 in_boundary(i) = (g%mask2dT(i,j) > 0.0)
1114 do k=nz,2,-1 ;
do i=is,ie
1115 if (in_boundary(i))
then 1116 htot(i) = htot(i) + h(i,j,k)
1125 add_ent = ((dt * cs%Kd_min_tr) * gv%m_to_H**2) * &
1126 ((h(i,j,k-1)+h(i,j,k)+h_neglect) / &
1127 (h(i,j,k-1)*h(i,j,k)+h_neglect2)) - &
1128 0.5*(ea(i,j,k) + eb(i,j,k-1))
1129 if (htot(i) < tr_ea_bbl)
then 1130 add_ent = max(0.0, add_ent, &
1131 (tr_ea_bbl - htot(i)) - min(ea(i,j,k),eb(i,j,k-1)))
1132 elseif (add_ent < 0.0)
then 1133 add_ent = 0.0 ; in_boundary(i) = .false.
1136 ebtr(i,j,k-1) = eb(i,j,k-1) + add_ent
1137 eatr(i,j,k) = ea(i,j,k) + add_ent
1139 ebtr(i,j,k-1) = eb(i,j,k-1) ; eatr(i,j,k) = ea(i,j,k)
1141 if (
associated(visc%Kd_extra_S))
then ;
if (visc%Kd_extra_S(i,j,k) > 0.0)
then 1142 add_ent = ((dt * visc%Kd_extra_S(i,j,k)) * gv%m_to_H**2) / &
1143 (0.25 * ((h(i,j,k-1) + h(i,j,k)) + (hold(i,j,k-1) + hold(i,j,k))) + &
1145 ebtr(i,j,k-1) = ebtr(i,j,k-1) + add_ent
1146 eatr(i,j,k) = eatr(i,j,k) + add_ent
1149 do i=is,ie ; eatr(i,j,1) = ea(i,j,1) ;
enddo 1153 if (cs%useALEalgorithm)
then 1156 call call_tracer_column_fns(h_prebound, h, ea, eb, fluxes, hml, dt, g, gv, tv, &
1157 cs%optics, cs%tracer_flow_CSp, cs%debug, &
1158 evap_cfl_limit = cs%evap_CFL_limit, &
1159 minimum_forcing_depth = cs%minimum_forcing_depth)
1161 call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, hml, dt, g, gv, tv, &
1162 cs%optics, cs%tracer_flow_CSp, cs%debug)
1165 elseif (
associated(visc%Kd_extra_S))
then 1167 do j=js,je ;
do i=is,ie
1168 ebtr(i,j,nz) = eb(i,j,nz) ; eatr(i,j,1) = ea(i,j,1)
1173 do k=nz,2,-1 ;
do j=js,je ;
do i=is,ie
1174 if (visc%Kd_extra_S(i,j,k) > 0.0)
then 1175 add_ent = ((dt * visc%Kd_extra_S(i,j,k)) * gv%m_to_H**2) / &
1176 (0.25 * ((h(i,j,k-1) + h(i,j,k)) + (hold(i,j,k-1) + hold(i,j,k))) + &
1181 ebtr(i,j,k-1) = eb(i,j,k-1) + add_ent
1182 eatr(i,j,k) = ea(i,j,k) + add_ent
1183 enddo ;
enddo ;
enddo 1185 if (cs%useALEalgorithm)
then 1187 call call_tracer_column_fns(h_prebound, h, eatr, ebtr, fluxes, hml, dt, g, gv, tv, &
1188 cs%optics, cs%tracer_flow_CSp, cs%debug,&
1189 evap_cfl_limit = cs%evap_CFL_limit, &
1190 minimum_forcing_depth = cs%minimum_forcing_depth)
1192 call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, hml, dt, g, gv, tv, &
1193 cs%optics, cs%tracer_flow_CSp, cs%debug)
1197 if (cs%useALEalgorithm)
then 1199 call call_tracer_column_fns(h_prebound, h, eatr, ebtr, fluxes, hml, dt, g, gv, tv, &
1200 cs%optics, cs%tracer_flow_CSp, cs%debug, &
1201 evap_cfl_limit = cs%evap_CFL_limit, &
1202 minimum_forcing_depth = cs%minimum_forcing_depth)
1204 call call_tracer_column_fns(hold, h, ea, eb, fluxes, hml, dt, g, gv, tv, &
1205 cs%optics, cs%tracer_flow_CSp, cs%debug)
1212 call cpu_clock_end(id_clock_tracers)
1216 if (cs%use_sponge)
then 1217 call cpu_clock_begin(id_clock_sponge)
1218 if (
associated(cs%ALE_sponge_CSp))
then 1220 call apply_ale_sponge(h, dt, g, cs%ALE_sponge_CSp)
1223 if (cs%bulkmixedlayer .and.
ASSOCIATED(tv%eqn_of_state))
then 1224 do i=is,ie ; p_ref_cv(i) = tv%P_Ref ;
enddo 1227 call calculate_density(tv%T(:,j,1), tv%S(:,j,1), p_ref_cv, rcv_ml(:,j), &
1228 is, ie-is+1, tv%eqn_of_state)
1230 call apply_sponge(h, dt, g, gv, ea, eb, cs%sponge_CSp, rcv_ml)
1232 call apply_sponge(h, dt, g, gv, ea, eb, cs%sponge_CSp)
1235 call cpu_clock_end(id_clock_sponge)
1237 call mom_state_chksum(
"apply_sponge ", u, v, h, g, gv, haloshift=0)
1238 call mom_thermovar_chksum(
"apply_sponge ", tv, g)
1245 if (
ASSOCIATED(cdp%diapyc_vel))
then 1248 do k=2,nz ;
do i=is,ie
1249 cdp%diapyc_vel(i,j,k) = idt * (gv%H_to_m * (ea(i,j,k) - eb(i,j,k-1)))
1252 cdp%diapyc_vel(i,j,1) = 0.0
1253 cdp%diapyc_vel(i,j,nz+1) = 0.0
1261 if (cs%bulkmixedlayer)
then 1263 call hchksum(ea,
"before net flux rearrangement ea",g%HI, scale=gv%H_to_m)
1264 call hchksum(eb,
"before net flux rearrangement eb",g%HI, scale=gv%H_to_m)
1268 do k=2,gv%nkml ;
do i=is,ie
1269 net_ent = ea(i,j,k) - eb(i,j,k-1)
1270 ea(i,j,k) = max(net_ent, 0.0)
1271 eb(i,j,k-1) = max(-net_ent, 0.0)
1275 call hchksum(ea,
"after net flux rearrangement ea",g%HI, scale=gv%H_to_m)
1276 call hchksum(eb,
"after net flux rearrangement eb",g%HI, scale=gv%H_to_m)
1285 hold(i,js-1,k) = gv%Angstrom ; ea(i,js-1,k) = 0.0 ; eb(i,js-1,k) = 0.0
1286 hold(i,je+1,k) = gv%Angstrom ; ea(i,je+1,k) = 0.0 ; eb(i,je+1,k) = 0.0
1289 hold(is-1,j,k) = gv%Angstrom ; ea(is-1,j,k) = 0.0 ; eb(is-1,j,k) = 0.0
1290 hold(ie+1,j,k) = gv%Angstrom ; ea(ie+1,j,k) = 0.0 ; eb(ie+1,j,k) = 0.0
1295 call cpu_clock_begin(id_clock_pass)
1296 if (g%symmetric)
then 1297 call create_group_pass(cs%pass_hold_eb_ea,hold,g%Domain,to_all+omit_corners,halo=1)
1298 call create_group_pass(cs%pass_hold_eb_ea,eb,g%Domain,to_all+omit_corners,halo=1)
1299 call create_group_pass(cs%pass_hold_eb_ea,ea,g%Domain,to_all+omit_corners,halo=1)
1301 call create_group_pass(cs%pass_hold_eb_ea,hold,g%Domain,to_west+to_south+omit_corners,halo=1)
1302 call create_group_pass(cs%pass_hold_eb_ea,eb,g%Domain,to_west+to_south+omit_corners,halo=1)
1303 call create_group_pass(cs%pass_hold_eb_ea,ea,g%Domain,to_west+to_south+omit_corners,halo=1)
1305 call do_group_pass(cs%pass_hold_eb_ea,g%Domain)
1306 call cpu_clock_end(id_clock_pass)
1308 if (.not. cs%useALEalgorithm)
then 1313 call mom_state_chksum(
"before u/v tridiag ", u, v, h, g, gv, haloshift=0)
1314 call hchksum(ea,
"before u/v tridiag ea",g%HI, scale=gv%H_to_m)
1315 call hchksum(eb,
"before u/v tridiag eb",g%HI, scale=gv%H_to_m)
1316 call hchksum(hold,
"before u/v tridiag hold",g%HI, scale=gv%H_to_m)
1318 call cpu_clock_begin(id_clock_tridiag)
1323 if (
ASSOCIATED(adp%du_dt_dia)) adp%du_dt_dia(i,j,1) = u(i,j,1)
1324 hval = (hold(i,j,1) + hold(i+1,j,1)) + (ea(i,j,1) + ea(i+1,j,1)) + h_neglect
1325 b1(i) = 1.0 / (hval + (eb(i,j,1) + eb(i+1,j,1)))
1326 d1(i) = hval * b1(i)
1327 u(i,j,1) = b1(i) * (hval * u(i,j,1))
1329 do k=2,nz ;
do i=isq,ieq
1330 if (
ASSOCIATED(adp%du_dt_dia)) adp%du_dt_dia(i,j,k) = u(i,j,k)
1331 c1(i,k) = (eb(i,j,k-1)+eb(i+1,j,k-1)) * b1(i)
1332 eaval = ea(i,j,k) + ea(i+1,j,k)
1333 hval = hold(i,j,k) + hold(i+1,j,k) + h_neglect
1334 b1(i) = 1.0 / ((eb(i,j,k) + eb(i+1,j,k)) + (hval + d1(i)*eaval))
1335 d1(i) = (hval + d1(i)*eaval) * b1(i)
1336 u(i,j,k) = (hval*u(i,j,k) + eaval*u(i,j,k-1))*b1(i)
1338 do k=nz-1,1,-1 ;
do i=isq,ieq
1339 u(i,j,k) = u(i,j,k) + c1(i,k+1)*u(i,j,k+1)
1340 if (
ASSOCIATED(adp%du_dt_dia)) &
1341 adp%du_dt_dia(i,j,k) = (u(i,j,k) - adp%du_dt_dia(i,j,k)) * idt
1343 if (
ASSOCIATED(adp%du_dt_dia))
then 1345 adp%du_dt_dia(i,j,nz) = (u(i,j,nz)-adp%du_dt_dia(i,j,nz)) * idt
1350 call mom_state_chksum(
"aft 1st loop tridiag ", u, v, h, g, gv, haloshift=0)
1356 if (
ASSOCIATED(adp%dv_dt_dia)) adp%dv_dt_dia(i,j,1) = v(i,j,1)
1357 hval = (hold(i,j,1) + hold(i,j+1,1)) + (ea(i,j,1) + ea(i,j+1,1)) + h_neglect
1358 b1(i) = 1.0 / (hval + (eb(i,j,1) + eb(i,j+1,1)))
1359 d1(i) = hval * b1(i)
1360 v(i,j,1) = b1(i) * (hval * v(i,j,1))
1362 do k=2,nz ;
do i=is,ie
1363 if (
ASSOCIATED(adp%dv_dt_dia)) adp%dv_dt_dia(i,j,k) = v(i,j,k)
1364 c1(i,k) = (eb(i,j,k-1)+eb(i,j+1,k-1)) * b1(i)
1365 eaval = ea(i,j,k) + ea(i,j+1,k)
1366 hval = hold(i,j,k) + hold(i,j+1,k) + h_neglect
1367 b1(i) = 1.0 / ((eb(i,j,k) + eb(i,j+1,k)) + (hval + d1(i)*eaval))
1368 d1(i) = (hval + d1(i)*eaval) * b1(i)
1369 v(i,j,k) = (hval*v(i,j,k) + eaval*v(i,j,k-1))*b1(i)
1371 do k=nz-1,1,-1 ;
do i=is,ie
1372 v(i,j,k) = v(i,j,k) + c1(i,k+1)*v(i,j,k+1)
1373 if (
ASSOCIATED(adp%dv_dt_dia)) &
1374 adp%dv_dt_dia(i,j,k) = (v(i,j,k) - adp%dv_dt_dia(i,j,k)) * idt
1376 if (
ASSOCIATED(adp%dv_dt_dia))
then 1378 adp%dv_dt_dia(i,j,nz) = (v(i,j,nz)-adp%dv_dt_dia(i,j,nz)) * idt
1382 call cpu_clock_end(id_clock_tridiag)
1384 call mom_state_chksum(
"after u/v tridiag ", u, v, h, g, gv, haloshift=0)
1391 if (
ASSOCIATED(tv%T) .AND.
ASSOCIATED(tv%frazil))
then 1393 if(cs%frazil_tendency_diag)
then 1394 do k=1,nz ;
do j=js,je ;
do i=is,ie
1395 temp_diag(i,j,k) = tv%T(i,j,k)
1396 enddo ;
enddo ;
enddo 1399 if (
ASSOCIATED(fluxes%p_surf_full))
then 1400 call make_frazil(h, tv, g, gv, cs%diabatic_aux_CSp, fluxes%p_surf_full)
1402 call make_frazil(h, tv, g, gv, cs%diabatic_aux_CSp)
1405 if (cs%frazil_tendency_diag)
then 1406 call diagnose_frazil_tendency(tv, h, temp_diag, dt, g, gv, cs, 2)
1409 if (showcalltree)
call calltree_waypoint(
"done with 2nd make_frazil (diabatic)")
1410 if (cs%debugConservation)
call mom_state_stats(
'2nd make_frazil', u, v, h, tv%T, tv%S, g)
1416 if (cs%id_Kd_interface > 0)
call post_data(cs%id_Kd_interface, kd_int, cs%diag)
1417 if (cs%id_Kd_heat > 0)
call post_data(cs%id_Kd_heat, kd_heat, cs%diag)
1418 if (cs%id_Kd_salt > 0)
call post_data(cs%id_Kd_salt, kd_salt, cs%diag)
1419 if (cs%id_Kd_ePBL > 0)
call post_data(cs%id_Kd_ePBL, kd_epbl, cs%diag)
1421 if (cs%id_ea > 0)
call post_data(cs%id_ea, ea, cs%diag)
1422 if (cs%id_eb > 0)
call post_data(cs%id_eb, eb, cs%diag)
1424 if (cs%id_dudt_dia > 0)
call post_data(cs%id_dudt_dia, adp%du_dt_dia, cs%diag)
1425 if (cs%id_dvdt_dia > 0)
call post_data(cs%id_dvdt_dia, adp%dv_dt_dia, cs%diag)
1426 if (cs%id_wd > 0)
call post_data(cs%id_wd, cdp%diapyc_vel, cs%diag)
1428 if (cs%id_MLD_003 > 0 .or. cs%id_subMLN2 > 0 .or. cs%id_mlotstsq > 0)
then 1429 call diagnosemldbydensitydifference(cs%id_MLD_003, h, tv, 0.03, g, gv, cs%diag, &
1430 id_n2subml=cs%id_subMLN2, id_mldsq=cs%id_mlotstsq)
1432 if (cs%id_MLD_0125 > 0)
then 1433 call diagnosemldbydensitydifference(cs%id_MLD_0125, h, tv, 0.125, g, gv, cs%diag)
1435 if (cs%id_MLD_user > 0)
then 1436 call diagnosemldbydensitydifference(cs%id_MLD_user, h, tv, cs%MLDdensityDifference, g, gv, cs%diag)
1439 if (cs%id_Tdif > 0)
call post_data(cs%id_Tdif, tdif_flx, cs%diag)
1440 if (cs%id_Tadv > 0)
call post_data(cs%id_Tadv, tadv_flx, cs%diag)
1441 if (cs%id_Sdif > 0)
call post_data(cs%id_Sdif, sdif_flx, cs%diag)
1442 if (cs%id_Sadv > 0)
call post_data(cs%id_Sadv, sadv_flx, cs%diag)
1443 if (cs%use_int_tides)
then 1444 if (cs%id_cg1 > 0)
call post_data(cs%id_cg1, cn(:,:,1),cs%diag)
1446 if (cs%id_cn(m) > 0)
call post_data(cs%id_cn(m),cn(:,:,m),cs%diag)
1451 if (cs%id_Kd_z > 0)
then 1452 num_z_diags = num_z_diags + 1
1453 z_ids(num_z_diags) = cs%id_Kd_z ; z_ptrs(num_z_diags)%p => kd_int
1455 if (cs%id_Tdif_z > 0)
then 1456 num_z_diags = num_z_diags + 1
1457 z_ids(num_z_diags) = cs%id_Tdif_z ; z_ptrs(num_z_diags)%p => tdif_flx
1459 if (cs%id_Tadv_z > 0)
then 1460 num_z_diags = num_z_diags + 1
1461 z_ids(num_z_diags) = cs%id_Tadv_z ; z_ptrs(num_z_diags)%p => tadv_flx
1463 if (cs%id_Sdif_z > 0)
then 1464 num_z_diags = num_z_diags + 1
1465 z_ids(num_z_diags) = cs%id_Sdif_z ; z_ptrs(num_z_diags)%p => sdif_flx
1467 if (cs%id_Sadv_z > 0)
then 1468 num_z_diags = num_z_diags + 1
1469 z_ids(num_z_diags) = cs%id_Sadv_z ; z_ptrs(num_z_diags)%p => sadv_flx
1472 if (num_z_diags > 0) &
1473 call calc_zint_diags(h, z_ptrs, z_ids, num_z_diags, g, gv, cs%diag_to_Z_CSp)
1475 if (cs%debugConservation)
call mom_state_stats(
'leaving diabatic', u, v, h, tv%T, tv%S, g)
1476 if (showcalltree)
call calltree_leave(
"diabatic()")