Imposes the diapycnal mass fluxes and the accompanying diapycnal advection of momentum and tracers using the original MOM6 algorithms.
1857 type(ocean_grid_type),
intent(inout) :: g
1858 type(verticalgrid_type),
intent(in) :: gv
1859 type(unit_scale_type),
intent(in) :: us
1860 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(inout) :: u
1861 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(inout) :: v
1862 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(inout) :: h
1863 type(thermo_var_ptrs),
intent(inout) :: tv
1865 real,
dimension(:,:),
pointer :: hml
1866 type(forcing),
intent(inout) :: fluxes
1868 type(vertvisc_type),
intent(inout) :: visc
1869 type(accel_diag_ptrs),
intent(inout) :: adp
1872 type(cont_diag_ptrs),
intent(inout) :: cdp
1873 real,
intent(in) :: dt
1874 type(time_type),
intent(in) :: time_end
1875 type(diabatic_cs),
pointer :: cs
1876 type(wave_parameters_cs),
optional,
pointer :: waves
1878 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
1893 real,
dimension(SZI_(G),SZJ_(G)) :: &
1896 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: h_diag
1897 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: temp_diag
1898 real,
dimension(SZI_(G),SZJ_(G),G%ke) :: saln_diag
1899 real,
dimension(SZI_(G),SZJ_(G)) :: tendency_2d
1903 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
1909 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
target :: &
1919 real,
allocatable,
dimension(:,:) :: &
1920 hf_dudt_dia_2d, hf_dvdt_dia_2d
1923 real,
pointer,
dimension(:,:,:) :: &
1929 integer :: kb(szi_(g),szj_(g))
1932 real :: p_ref_cv(szi_(g))
1935 logical :: in_boundary(szi_(g))
1955 real :: htot(szib_(g))
1956 real :: b1(szib_(g)), d1(szib_(g))
1957 real :: c1(szib_(g),szk_(g))
1964 logical :: showcalltree
1965 integer,
dimension(2) :: eosdom
1966 integer :: i, j, k, is, ie, js, je, isq, ieq, jsq, jeq, nz, nkmb, m, halo
1968 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
1969 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
1970 nkmb = gv%nk_rho_varies
1971 h_neglect = gv%H_subroundoff ; h_neglect2 = h_neglect*h_neglect
1972 kd_heat(:,:,:) = 0.0 ; kd_salt(:,:,:) = 0.0
1975 showcalltree = calltree_showquery()
1976 if (showcalltree)
call calltree_enter(
"layered_diabatic(), MOM_diabatic_driver.F90")
1979 eaml => eatr ; ebml => ebtr
1982 call enable_averages(dt, time_end, cs%diag)
1984 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 1985 halo = cs%halo_TS_diff
1987 do k=1,nz ;
do j=js-halo,je+halo ;
do i=is-halo,ie+halo
1988 h_orig(i,j,k) = h(i,j,k) ; eaml(i,j,k) = 0.0 ; ebml(i,j,k) = 0.0
1989 enddo ;
enddo ;
enddo 1992 if (cs%use_geothermal)
then 1993 call cpu_clock_begin(id_clock_geothermal)
1994 call geothermal_entraining(h, tv, dt, eaml, ebml, g, gv, us, cs%geothermal_CSp, halo=cs%halo_TS_diff)
1995 call cpu_clock_end(id_clock_geothermal)
1996 if (showcalltree)
call calltree_waypoint(
"geothermal (diabatic)")
1997 if (cs%debugConservation)
call mom_state_stats(
'geothermal', u, v, h, tv%T, tv%S, g, gv, us)
2002 call diag_update_remap_grids(cs%diag)
2007 if (
associated(cs%optics)) &
2008 call set_pen_shortwave(cs%optics, fluxes, g, gv, us, cs%diabatic_aux_CSp, cs%opacity_CSp, cs%tracer_flow_CSp)
2010 if (cs%bulkmixedlayer)
then 2011 if (cs%debug)
call mom_forcing_chksum(
"Before mixedlayer", fluxes, g, us, haloshift=0)
2013 if (cs%ML_mix_first > 0.0)
then 2021 call find_uv_at_h(u, v, h, u_h, v_h, g, gv, us)
2023 call cpu_clock_begin(id_clock_mixedlayer)
2024 if (cs%ML_mix_first < 1.0)
then 2026 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt*cs%ML_mix_first, &
2027 eaml,ebml, g, gv, us, cs%bulkmixedlayer_CSp, cs%optics, &
2028 hml, cs%aggregate_FW_forcing, dt, last_call=.false.)
2030 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt, eaml, ebml, &
2031 g, gv, us, cs%bulkmixedlayer_CSp, cs%optics, &
2032 hml, cs%aggregate_FW_forcing, dt, last_call=.true.)
2041 if (
associated(tv%S) .and.
associated(tv%salt_deficit)) &
2042 call adjust_salt(h, tv, g, gv, cs%diabatic_aux_CSp)
2043 call cpu_clock_end(id_clock_mixedlayer)
2045 call mom_state_chksum(
"After mixedlayer ", u, v, h, g, gv, us, haloshift=0)
2046 call mom_forcing_chksum(
"After mixedlayer", fluxes, g, us, haloshift=0)
2048 if (showcalltree)
call calltree_waypoint(
"done with 1st bulkmixedlayer (diabatic)")
2049 if (cs%debugConservation)
call mom_state_stats(
'1st bulkmixedlayer', u, v, h, tv%T, tv%S, g, gv, us)
2054 call mom_state_chksum(
"before find_uv_at_h", u, v, h, g, gv, us, haloshift=0)
2055 if (cs%use_kappa_shear .or. cs%use_CVMix_shear)
then 2056 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 2057 call find_uv_at_h(u, v, h_orig, u_h, v_h, g, gv, us, eaml, ebml)
2059 call hchksum(eaml,
"after find_uv_at_h eaml", g%HI, scale=gv%H_to_m)
2060 call hchksum(ebml,
"after find_uv_at_h ebml", g%HI, scale=gv%H_to_m)
2063 call find_uv_at_h(u, v, h, u_h, v_h, g, gv, us)
2065 if (showcalltree)
call calltree_waypoint(
"done with find_uv_at_h (diabatic)")
2068 call cpu_clock_begin(id_clock_set_diffusivity)
2071 if ((cs%halo_TS_diff > 0) .and. (cs%ML_mix_first > 0.0))
then 2072 if (
associated(tv%T))
call pass_var(tv%T, g%Domain, halo=cs%halo_TS_diff, complete=.false.)
2073 if (
associated(tv%T))
call pass_var(tv%S, g%Domain, halo=cs%halo_TS_diff, complete=.false.)
2074 call pass_var(h, g%domain, halo=cs%halo_TS_diff, complete=.true.)
2077 call mom_state_chksum(
"before set_diffusivity", u, v, h, g, gv, us, haloshift=cs%halo_TS_diff)
2078 call set_diffusivity(u, v, h, u_h, v_h, tv, fluxes, cs%optics, &
2079 visc, dt, g, gv, us, cs%set_diff_CSp, kd_lay, kd_int)
2080 call cpu_clock_end(id_clock_set_diffusivity)
2081 if (showcalltree)
call calltree_waypoint(
"done with set_diffusivity (diabatic)")
2084 call mom_state_chksum(
"after set_diffusivity ", u, v, h, g, gv, us, haloshift=0)
2085 call mom_forcing_chksum(
"after set_diffusivity ", fluxes, g, us, haloshift=0)
2086 call mom_thermovar_chksum(
"after set_diffusivity ", tv, g)
2087 call hchksum(kd_lay,
"after set_diffusivity Kd_lay", g%HI, haloshift=0, scale=us%Z2_T_to_m2_s)
2088 call hchksum(kd_int,
"after set_diffusivity Kd_Int", g%HI, haloshift=0, scale=us%Z2_T_to_m2_s)
2093 call cpu_clock_begin(id_clock_kpp)
2099 call calculatebuoyancyflux2d(g, gv, us, fluxes, cs%optics, h, tv%T, tv%S, tv, &
2100 cs%KPP_buoy_flux, cs%KPP_temp_flux, cs%KPP_salt_flux)
2106 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2107 kd_salt(i,j,k) = kd_int(i,j,k)
2108 kd_heat(i,j,k) = kd_int(i,j,k)
2109 enddo ;
enddo ;
enddo 2111 if (
associated(visc%Kd_extra_S))
then 2113 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2114 kd_salt(i,j,k) = kd_salt(i,j,k) + visc%Kd_extra_S(i,j,k)
2115 enddo ;
enddo ;
enddo 2117 if (
associated(visc%Kd_extra_T))
then 2119 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2120 kd_heat(i,j,k) = kd_heat(i,j,k) + visc%Kd_extra_T(i,j,k)
2121 enddo ;
enddo ;
enddo 2124 call kpp_compute_bld(cs%KPP_CSp, g, gv, us, h, tv%T, tv%S, u, v, tv, &
2125 fluxes%ustar, cs%KPP_buoy_flux, waves=waves)
2127 call kpp_calculate(cs%KPP_CSp, g, gv, us, h, fluxes%ustar, cs%KPP_buoy_flux, kd_heat, &
2128 kd_salt, visc%Kv_shear, cs%KPP_NLTheat, cs%KPP_NLTscalar, waves=waves)
2130 if (
associated(hml))
then 2131 call kpp_get_bld(cs%KPP_CSp, hml(:,:), g, us)
2132 call pass_var(hml, g%domain, halo=1)
2134 if (
associated(visc%MLD)) visc%MLD(:,:) = hml(:,:)
2137 if (.not. cs%KPPisPassive)
then 2139 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2140 kd_int(i,j,k) = min( kd_salt(i,j,k), kd_heat(i,j,k) )
2141 enddo ;
enddo ;
enddo 2142 if (
associated(visc%Kd_extra_S))
then 2144 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2145 visc%Kd_extra_S(i,j,k) = (kd_salt(i,j,k) - kd_int(i,j,k))
2146 enddo ;
enddo ;
enddo 2148 if (
associated(visc%Kd_extra_T))
then 2150 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2151 visc%Kd_extra_T(i,j,k) = (kd_heat(i,j,k) - kd_int(i,j,k))
2152 enddo ;
enddo ;
enddo 2156 call cpu_clock_end(id_clock_kpp)
2157 if (showcalltree)
call calltree_waypoint(
"done with KPP_calculate (diabatic)")
2159 call mom_state_chksum(
"after KPP", u, v, h, g, gv, us, haloshift=0)
2160 call mom_forcing_chksum(
"after KPP", fluxes, g, us, haloshift=0)
2161 call mom_thermovar_chksum(
"after KPP", tv, g)
2162 call hchksum(kd_lay,
"after KPP Kd_lay", g%HI, haloshift=0, scale=us%Z2_T_to_m2_s)
2163 call hchksum(kd_int,
"after KPP Kd_Int", g%HI, haloshift=0, scale=us%Z2_T_to_m2_s)
2169 if (cs%use_CVMix_conv)
then 2170 call calculate_cvmix_conv(h, tv, g, gv, us, cs%CVMix_conv_csp, hml)
2172 do k=1,nz+1 ;
do j=js,je ;
do i=is,ie
2173 kd_int(i,j,k) = kd_int(i,j,k) + cs%CVMix_conv_csp%kd_conv(i,j,k)
2174 visc%Kv_slow(i,j,k) = visc%Kv_slow(i,j,k) + cs%CVMix_conv_csp%kv_conv(i,j,k)
2175 enddo ;
enddo ;
enddo 2179 call cpu_clock_begin(id_clock_kpp)
2181 call hchksum(cs%KPP_temp_flux,
"before KPP_applyNLT netHeat", g%HI, haloshift=0, scale=gv%H_to_m)
2182 call hchksum(cs%KPP_salt_flux,
"before KPP_applyNLT netSalt", g%HI, haloshift=0, scale=gv%H_to_m)
2183 call hchksum(cs%KPP_NLTheat,
"before KPP_applyNLT NLTheat", g%HI, haloshift=0)
2184 call hchksum(cs%KPP_NLTscalar,
"before KPP_applyNLT NLTscalar", g%HI, haloshift=0)
2188 call kpp_nonlocaltransport_temp(cs%KPP_CSp, g, gv, h, cs%KPP_NLTheat, cs%KPP_temp_flux, &
2189 us%T_to_s*dt, tv%T, us%Q_to_J_kg*tv%C_p)
2190 call kpp_nonlocaltransport_saln(cs%KPP_CSp, g, gv, h, cs%KPP_NLTscalar, cs%KPP_salt_flux, &
2192 call cpu_clock_end(id_clock_kpp)
2193 if (showcalltree)
call calltree_waypoint(
"done with KPP_applyNonLocalTransport (diabatic)")
2194 if (cs%debugConservation)
call mom_state_stats(
'KPP_applyNonLocalTransport', u, v, h, tv%T, tv%S, g, gv, us)
2197 call mom_state_chksum(
"after KPP_applyNLT ", u, v, h, g, gv, us, haloshift=0)
2198 call mom_forcing_chksum(
"after KPP_applyNLT ", fluxes, g, us, haloshift=0)
2199 call mom_thermovar_chksum(
"after KPP_applyNLT ", tv, g)
2205 if (
associated(visc%Kd_extra_T) .and.
associated(visc%Kd_extra_S) .and.
associated(tv%T))
then 2207 call cpu_clock_begin(id_clock_differential_diff)
2208 call differential_diffuse_t_s(h, tv, visc, dt, g, gv)
2209 call cpu_clock_end(id_clock_differential_diff)
2210 if (showcalltree)
call calltree_waypoint(
"done with differential_diffuse_T_S (diabatic)")
2211 if (cs%debugConservation)
call mom_state_stats(
'differential_diffuse_T_S', u, v, h, tv%T, tv%S, g, gv, us)
2215 if (.not. cs%useKPP)
then 2217 do k=2,nz ;
do j=js,je ;
do i=is,ie
2218 kd_heat(i,j,k) = kd_heat(i,j,k) + visc%Kd_extra_T(i,j,k)
2219 kd_salt(i,j,k) = kd_salt(i,j,k) + visc%Kd_extra_S(i,j,k)
2220 enddo ;
enddo ;
enddo 2227 call cpu_clock_begin(id_clock_entrain)
2230 call entrainment_diffusive(h, tv, fluxes, dt, g, gv, us, cs%entrain_diffusive_CSp, &
2231 ea, eb, kb, kd_lay=kd_lay, kd_int=kd_int)
2232 call cpu_clock_end(id_clock_entrain)
2233 if (showcalltree)
call calltree_waypoint(
"done with Entrainment_diffusive (diabatic)")
2236 call mom_forcing_chksum(
"after calc_entrain ", fluxes, g, us, haloshift=0)
2237 call mom_thermovar_chksum(
"after calc_entrain ", tv, g)
2238 call mom_state_chksum(
"after calc_entrain ", u, v, h, g, gv, us, haloshift=0)
2239 call hchksum(ea,
"after calc_entrain ea", g%HI, haloshift=0, scale=gv%H_to_m)
2240 call hchksum(eb,
"after calc_entrain eb", g%HI, haloshift=0, scale=gv%H_to_m)
2244 if (cs%boundary_forcing_tendency_diag)
then 2245 do k=1,nz ;
do j=js,je ;
do i=is,ie
2246 h_diag(i,j,k) = h(i,j,k)
2247 temp_diag(i,j,k) = tv%T(i,j,k)
2248 saln_diag(i,j,k) = tv%S(i,j,k)
2249 enddo ;
enddo ;
enddo 2263 hold(i,j,1) = h(i,j,1)
2264 h(i,j,1) = h(i,j,1) + (eb(i,j,1) - ea(i,j,2))
2265 hold(i,j,nz) = h(i,j,nz)
2266 h(i,j,nz) = h(i,j,nz) + (ea(i,j,nz) - eb(i,j,nz-1))
2267 if (h(i,j,1) <= 0.0)
then 2268 h(i,j,1) = gv%Angstrom_H
2270 if (h(i,j,nz) <= 0.0)
then 2271 h(i,j,nz) = gv%Angstrom_H
2274 do k=2,nz-1 ;
do i=is,ie
2275 hold(i,j,k) = h(i,j,k)
2276 h(i,j,k) = h(i,j,k) + ((ea(i,j,k) - eb(i,j,k-1)) + &
2277 (eb(i,j,k) - ea(i,j,k+1)))
2278 if (h(i,j,k) <= 0.0)
then 2279 h(i,j,k) = gv%Angstrom_H
2284 call diag_update_remap_grids(cs%diag)
2287 call mom_state_chksum(
"after negative check ", u, v, h, g, gv, us, haloshift=0)
2288 call mom_forcing_chksum(
"after negative check ", fluxes, g, us, haloshift=0)
2289 call mom_thermovar_chksum(
"after negative check ", tv, g)
2291 if (showcalltree)
call calltree_waypoint(
"done with h=ea-eb (diabatic)")
2292 if (cs%debugConservation)
call mom_state_stats(
'h=ea-eb', u, v, h, tv%T, tv%S, g, gv, us)
2298 if (cs%bulkmixedlayer)
then 2300 if (
associated(tv%T))
then 2301 call cpu_clock_begin(id_clock_tridiag)
2306 if (cs%massless_match_targets)
then 2310 h_tr = hold(i,j,1) + h_neglect
2311 b1(i) = 1.0 / (h_tr + eb(i,j,1))
2312 d1(i) = h_tr * b1(i)
2313 tv%T(i,j,1) = b1(i) * (h_tr*tv%T(i,j,1))
2314 tv%S(i,j,1) = b1(i) * (h_tr*tv%S(i,j,1))
2316 do k=2,nkmb ;
do i=is,ie
2317 c1(i,k) = eb(i,j,k-1) * b1(i)
2318 h_tr = hold(i,j,k) + h_neglect
2319 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
2320 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
2321 if (k<nkmb) d1(i) = b_denom_1 * b1(i)
2322 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,k-1))
2323 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,k-1))
2326 do k=nkmb+1,nz ;
do i=is,ie
2327 if (k == kb(i,j))
then 2328 c1(i,k) = eb(i,j,k-1) * b1(i)
2329 d1(i) = (((eb(i,j,nkmb)-eb(i,j,k-1)) + hold(i,j,nkmb) + h_neglect) + &
2330 d1(i)*ea(i,j,nkmb)) * b1(i)
2331 h_tr = hold(i,j,k) + h_neglect
2332 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
2333 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
2334 d1(i) = b_denom_1 * b1(i)
2335 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,nkmb))
2336 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,nkmb))
2337 elseif (k > kb(i,j))
then 2338 c1(i,k) = eb(i,j,k-1) * b1(i)
2339 h_tr = hold(i,j,k) + h_neglect
2340 b_denom_1 = h_tr + d1(i)*ea(i,j,k)
2341 b1(i) = 1.0 / (b_denom_1 + eb(i,j,k))
2342 d1(i) = b_denom_1 * b1(i)
2343 tv%T(i,j,k) = b1(i) * (h_tr*tv%T(i,j,k) + ea(i,j,k)*tv%T(i,j,k-1))
2344 tv%S(i,j,k) = b1(i) * (h_tr*tv%S(i,j,k) + ea(i,j,k)*tv%S(i,j,k-1))
2345 elseif (eb(i,j,k) < eb(i,j,k-1))
then 2350 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)
2351 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)
2355 do k=nz-1,nkmb,-1 ;
do i=is,ie
2356 if (k >= kb(i,j))
then 2357 tv%T(i,j,k) = tv%T(i,j,k) + c1(i,k+1)*tv%T(i,j,k+1)
2358 tv%S(i,j,k) = tv%S(i,j,k) + c1(i,k+1)*tv%S(i,j,k+1)
2361 do i=is,ie ;
if (kb(i,j) <= nz)
then 2362 tv%T(i,j,nkmb) = tv%T(i,j,nkmb) + c1(i,kb(i,j))*tv%T(i,j,kb(i,j))
2363 tv%S(i,j,nkmb) = tv%S(i,j,nkmb) + c1(i,kb(i,j))*tv%S(i,j,kb(i,j))
2365 do k=nkmb-1,1,-1 ;
do i=is,ie
2366 tv%T(i,j,k) = tv%T(i,j,k) + c1(i,k+1)*tv%T(i,j,k+1)
2367 tv%S(i,j,k) = tv%S(i,j,k) + c1(i,k+1)*tv%S(i,j,k+1)
2374 if (cs%tracer_tridiag)
then 2375 call tracer_vertdiff(hold, ea, eb, dt, tv%T, g, gv)
2376 call tracer_vertdiff(hold, ea, eb, dt, tv%S, g, gv)
2378 call tridiagts(g, gv, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
2381 call cpu_clock_end(id_clock_tridiag)
2384 if (cs%debugConservation)
call mom_state_stats(
'BML tridiag', u, v, h, tv%T, tv%S, g, gv, us)
2386 if ((cs%ML_mix_first > 0.0) .or. cs%use_geothermal)
then 2390 do k=1,nz ;
do j=js,je ;
do i=is,ie
2391 hold(i,j,k) = h_orig(i,j,k)
2392 ea(i,j,k) = ea(i,j,k) + eaml(i,j,k)
2393 eb(i,j,k) = eb(i,j,k) + ebml(i,j,k)
2394 enddo ;
enddo ;
enddo 2396 call hchksum(ea,
"after ea = ea + eaml", g%HI, haloshift=0, scale=gv%H_to_m)
2397 call hchksum(eb,
"after eb = eb + ebml", g%HI, haloshift=0, scale=gv%H_to_m)
2401 if (cs%ML_mix_first < 1.0)
then 2410 call find_uv_at_h(u, v, hold, u_h, v_h, g, gv, us, ea, eb)
2411 if (cs%debug)
call mom_state_chksum(
"find_uv_at_h1 ", u, v, h, g, gv, us, haloshift=0)
2413 dt_mix = min(dt, dt*(1.0 - cs%ML_mix_first))
2414 call cpu_clock_begin(id_clock_mixedlayer)
2416 call bulkmixedlayer(h, u_h, v_h, tv, fluxes, dt_mix, ea, eb, &
2417 g, gv, us, cs%bulkmixedlayer_CSp, cs%optics, &
2418 hml, cs%aggregate_FW_forcing, dt, last_call=.true.)
2426 if (
associated(tv%S) .and.
associated(tv%salt_deficit)) &
2427 call adjust_salt(h, tv, g, gv, cs%diabatic_aux_CSp)
2429 call cpu_clock_end(id_clock_mixedlayer)
2430 if (showcalltree)
call calltree_waypoint(
"done with 2nd bulkmixedlayer (diabatic)")
2431 if (cs%debugConservation)
call mom_state_stats(
'2nd bulkmixedlayer', u, v, h, tv%T, tv%S, g, gv, us)
2437 if (
associated(tv%T))
then 2440 call hchksum(ea,
"before triDiagTS ea ", g%HI, haloshift=0, scale=gv%H_to_m)
2441 call hchksum(eb,
"before triDiagTS eb ", g%HI, haloshift=0, scale=gv%H_to_m)
2443 call cpu_clock_begin(id_clock_tridiag)
2451 if (
associated(tv%S) .and.
associated(tv%salt_deficit)) &
2452 call adjust_salt(h, tv, g, gv, cs%diabatic_aux_CSp)
2454 if (cs%diabatic_diff_tendency_diag)
then 2455 do k=1,nz ;
do j=js,je ;
do i=is,ie
2456 temp_diag(i,j,k) = tv%T(i,j,k)
2457 saln_diag(i,j,k) = tv%S(i,j,k)
2458 enddo ;
enddo ;
enddo 2462 if (cs%tracer_tridiag)
then 2463 call tracer_vertdiff(hold, ea, eb, dt, tv%T, g, gv)
2464 call tracer_vertdiff(hold, ea, eb, dt, tv%S, g, gv)
2466 call tridiagts(g, gv, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
2472 if (cs%diabatic_diff_tendency_diag)
then 2473 call diagnose_diabatic_diff_tendency(tv, hold, temp_diag, saln_diag, dt, g, gv, us, cs)
2474 if (cs%id_diabatic_diff_h > 0)
call post_data(cs%id_diabatic_diff_h, hold, cs%diag, alt_h=hold)
2477 call cpu_clock_end(id_clock_tridiag)
2478 if (showcalltree)
call calltree_waypoint(
"done with triDiagTS (diabatic)")
2481 if (cs%debugConservation)
call mom_state_stats(
'triDiagTS', u, v, h, tv%T, tv%S, g, gv, us)
2486 call mom_state_chksum(
"after mixed layer ", u, v, h, g, gv, us, haloshift=0)
2487 call mom_thermovar_chksum(
"after mixed layer ", tv, g)
2488 call hchksum(ea,
"after mixed layer ea", g%HI, scale=gv%H_to_m)
2489 call hchksum(eb,
"after mixed layer eb", g%HI, scale=gv%H_to_m)
2492 call cpu_clock_begin(id_clock_remap)
2493 call regularize_layers(h, tv, dt, ea, eb, g, gv, us, cs%regularize_layers_CSp)
2494 call cpu_clock_end(id_clock_remap)
2495 if (showcalltree)
call calltree_waypoint(
"done with regularize_layers (diabatic)")
2496 if (cs%debugConservation)
call mom_state_stats(
'regularize_layers', u, v, h, tv%T, tv%S, g, gv, us)
2500 if (
associated(adp%du_dt_dia) .or.
associated(adp%dv_dt_dia)) &
2502 call pass_var(h, g%domain, to_west+to_south+omit_corners, halo=1)
2503 call diag_update_remap_grids(cs%diag)
2507 if ((cs%id_Tdif > 0) .or. (cs%id_Tadv > 0))
then 2508 do j=js,je ;
do i=is,ie
2509 tdif_flx(i,j,1) = 0.0 ; tdif_flx(i,j,nz+1) = 0.0
2510 tadv_flx(i,j,1) = 0.0 ; tadv_flx(i,j,nz+1) = 0.0
2513 do k=2,nz ;
do j=js,je ;
do i=is,ie
2514 tdif_flx(i,j,k) = (idt * 0.5*(ea(i,j,k) + eb(i,j,k-1))) * &
2515 (tv%T(i,j,k-1) - tv%T(i,j,k))
2516 tadv_flx(i,j,k) = (idt * (ea(i,j,k) - eb(i,j,k-1))) * &
2517 0.5*(tv%T(i,j,k-1) + tv%T(i,j,k))
2518 enddo ;
enddo ;
enddo 2520 if ((cs%id_Sdif > 0) .or. (cs%id_Sadv > 0))
then 2521 do j=js,je ;
do i=is,ie
2522 sdif_flx(i,j,1) = 0.0 ; sdif_flx(i,j,nz+1) = 0.0
2523 sadv_flx(i,j,1) = 0.0 ; sadv_flx(i,j,nz+1) = 0.0
2526 do k=2,nz ;
do j=js,je ;
do i=is,ie
2527 sdif_flx(i,j,k) = (idt * 0.5*(ea(i,j,k) + eb(i,j,k-1))) * &
2528 (tv%S(i,j,k-1) - tv%S(i,j,k))
2529 sadv_flx(i,j,k) = (idt * (ea(i,j,k) - eb(i,j,k-1))) * &
2530 0.5*(tv%S(i,j,k-1) + tv%S(i,j,k))
2531 enddo ;
enddo ;
enddo 2535 call cpu_clock_begin(id_clock_tracers)
2536 if (cs%mix_boundary_tracers)
then 2537 tr_ea_bbl = gv%Z_to_H * sqrt(dt*cs%Kd_BBL_tr)
2541 ebtr(i,j,nz) = eb(i,j,nz)
2543 in_boundary(i) = (g%mask2dT(i,j) > 0.0)
2545 do k=nz,2,-1 ;
do i=is,ie
2546 if (in_boundary(i))
then 2547 htot(i) = htot(i) + h(i,j,k)
2556 add_ent = ((dt * cs%Kd_min_tr) * gv%Z_to_H**2) * &
2557 ((h(i,j,k-1)+h(i,j,k)+h_neglect) / &
2558 (h(i,j,k-1)*h(i,j,k)+h_neglect2)) - &
2559 0.5*(ea(i,j,k) + eb(i,j,k-1))
2560 if (htot(i) < tr_ea_bbl)
then 2561 add_ent = max(0.0, add_ent, &
2562 (tr_ea_bbl - htot(i)) - min(ea(i,j,k),eb(i,j,k-1)))
2563 elseif (add_ent < 0.0)
then 2564 add_ent = 0.0 ; in_boundary(i) = .false.
2567 ebtr(i,j,k-1) = eb(i,j,k-1) + add_ent
2568 eatr(i,j,k) = ea(i,j,k) + add_ent
2570 ebtr(i,j,k-1) = eb(i,j,k-1) ; eatr(i,j,k) = ea(i,j,k)
2572 if (
associated(visc%Kd_extra_S))
then ;
if (visc%Kd_extra_S(i,j,k) > 0.0)
then 2573 add_ent = ((dt * visc%Kd_extra_S(i,j,k)) * gv%Z_to_H**2) / &
2574 (0.25 * ((h(i,j,k-1) + h(i,j,k)) + (hold(i,j,k-1) + hold(i,j,k))) + &
2576 ebtr(i,j,k-1) = ebtr(i,j,k-1) + add_ent
2577 eatr(i,j,k) = eatr(i,j,k) + add_ent
2580 do i=is,ie ; eatr(i,j,1) = ea(i,j,1) ;
enddo 2584 call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, hml, dt, g, gv, us, tv, &
2585 cs%optics, cs%tracer_flow_CSp, cs%debug)
2587 elseif (
associated(visc%Kd_extra_S))
then 2589 do j=js,je ;
do i=is,ie
2590 ebtr(i,j,nz) = eb(i,j,nz) ; eatr(i,j,1) = ea(i,j,1)
2593 do k=nz,2,-1 ;
do j=js,je ;
do i=is,ie
2594 if (visc%Kd_extra_S(i,j,k) > 0.0)
then 2595 add_ent = ((dt * visc%Kd_extra_S(i,j,k)) * gv%Z_to_H**2) / &
2596 (0.25 * ((h(i,j,k-1) + h(i,j,k)) + (hold(i,j,k-1) + hold(i,j,k))) + &
2601 ebtr(i,j,k-1) = eb(i,j,k-1) + add_ent
2602 eatr(i,j,k) = ea(i,j,k) + add_ent
2603 enddo ;
enddo ;
enddo 2605 call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, hml, dt, g, gv, us, tv, &
2606 cs%optics, cs%tracer_flow_CSp, cs%debug)
2609 call call_tracer_column_fns(hold, h, ea, eb, fluxes, hml, dt, g, gv, us, tv, &
2610 cs%optics, cs%tracer_flow_CSp, cs%debug)
2614 call cpu_clock_end(id_clock_tracers)
2617 if (cs%use_sponge)
then 2618 call cpu_clock_begin(id_clock_sponge)
2620 if (cs%bulkmixedlayer .and.
associated(tv%eqn_of_state))
then 2621 do i=is,ie ; p_ref_cv(i) = tv%P_Ref ;
enddo 2622 eosdom(:) = eos_domain(g%HI)
2625 call calculate_density(tv%T(:,j,1), tv%S(:,j,1), p_ref_cv, rcv_ml(:,j), &
2626 tv%eqn_of_state, eosdom)
2628 call apply_sponge(h, dt, g, gv, us, ea, eb, cs%sponge_CSp, rcv_ml)
2630 call apply_sponge(h, dt, g, gv, us, ea, eb, cs%sponge_CSp)
2632 call cpu_clock_end(id_clock_sponge)
2634 call mom_state_chksum(
"apply_sponge ", u, v, h, g, gv, us, haloshift=0)
2635 call mom_thermovar_chksum(
"apply_sponge ", tv, g)
2640 if (
associated(cdp%diapyc_vel))
then 2643 do k=2,nz ;
do i=is,ie
2644 cdp%diapyc_vel(i,j,k) = us%s_to_T*idt * (ea(i,j,k) - eb(i,j,k-1))
2647 cdp%diapyc_vel(i,j,1) = 0.0
2648 cdp%diapyc_vel(i,j,nz+1) = 0.0
2656 if (cs%bulkmixedlayer)
then 2658 call hchksum(ea,
"before net flux rearrangement ea", g%HI, scale=gv%H_to_m)
2659 call hchksum(eb,
"before net flux rearrangement eb", g%HI, scale=gv%H_to_m)
2663 do k=2,gv%nkml ;
do i=is,ie
2664 net_ent = ea(i,j,k) - eb(i,j,k-1)
2665 ea(i,j,k) = max(net_ent, 0.0)
2666 eb(i,j,k-1) = max(-net_ent, 0.0)
2670 call hchksum(ea,
"after net flux rearrangement ea", g%HI, scale=gv%H_to_m)
2671 call hchksum(eb,
"after net flux rearrangement eb", g%HI, scale=gv%H_to_m)
2679 hold(i,js-1,k) = gv%Angstrom_H ; ea(i,js-1,k) = 0.0 ; eb(i,js-1,k) = 0.0
2680 hold(i,je+1,k) = gv%Angstrom_H ; ea(i,je+1,k) = 0.0 ; eb(i,je+1,k) = 0.0
2683 hold(is-1,j,k) = gv%Angstrom_H ; ea(is-1,j,k) = 0.0 ; eb(is-1,j,k) = 0.0
2684 hold(ie+1,j,k) = gv%Angstrom_H ; ea(ie+1,j,k) = 0.0 ; eb(ie+1,j,k) = 0.0
2688 call cpu_clock_begin(id_clock_pass)
2689 if (g%symmetric)
then ; dir_flag = to_all+omit_corners
2690 else ; dir_flag = to_west+to_south+omit_corners ;
endif 2691 call create_group_pass(cs%pass_hold_eb_ea, hold, g%Domain, dir_flag, halo=1)
2692 call create_group_pass(cs%pass_hold_eb_ea, eb, g%Domain, dir_flag, halo=1)
2693 call create_group_pass(cs%pass_hold_eb_ea, ea, g%Domain, dir_flag, halo=1)
2694 call do_group_pass(cs%pass_hold_eb_ea, g%Domain)
2695 call cpu_clock_end(id_clock_pass)
2701 call mom_state_chksum(
"before u/v tridiag ", u, v, h, g, gv, us, haloshift=0)
2702 call hchksum(ea,
"before u/v tridiag ea", g%HI, scale=gv%H_to_m)
2703 call hchksum(eb,
"before u/v tridiag eb", g%HI, scale=gv%H_to_m)
2704 call hchksum(hold,
"before u/v tridiag hold", g%HI, scale=gv%H_to_m)
2706 call cpu_clock_begin(id_clock_tridiag)
2707 idt_accel = 1.0 / dt
2711 if (
associated(adp%du_dt_dia)) adp%du_dt_dia(i,j,1) = u(i,j,1)
2712 hval = (hold(i,j,1) + hold(i+1,j,1)) + (ea(i,j,1) + ea(i+1,j,1)) + h_neglect
2713 b1(i) = 1.0 / (hval + (eb(i,j,1) + eb(i+1,j,1)))
2714 d1(i) = hval * b1(i)
2715 u(i,j,1) = b1(i) * (hval * u(i,j,1))
2717 do k=2,nz ;
do i=isq,ieq
2718 if (
associated(adp%du_dt_dia)) adp%du_dt_dia(i,j,k) = u(i,j,k)
2719 c1(i,k) = (eb(i,j,k-1)+eb(i+1,j,k-1)) * b1(i)
2720 eaval = ea(i,j,k) + ea(i+1,j,k)
2721 hval = hold(i,j,k) + hold(i+1,j,k) + h_neglect
2722 b1(i) = 1.0 / ((eb(i,j,k) + eb(i+1,j,k)) + (hval + d1(i)*eaval))
2723 d1(i) = (hval + d1(i)*eaval) * b1(i)
2724 u(i,j,k) = (hval*u(i,j,k) + eaval*u(i,j,k-1))*b1(i)
2726 do k=nz-1,1,-1 ;
do i=isq,ieq
2727 u(i,j,k) = u(i,j,k) + c1(i,k+1)*u(i,j,k+1)
2728 if (
associated(adp%du_dt_dia)) &
2729 adp%du_dt_dia(i,j,k) = (u(i,j,k) - adp%du_dt_dia(i,j,k)) * idt_accel
2731 if (
associated(adp%du_dt_dia))
then 2733 adp%du_dt_dia(i,j,nz) = (u(i,j,nz)-adp%du_dt_dia(i,j,nz)) * idt_accel
2738 call mom_state_chksum(
"aft 1st loop tridiag ", u, v, h, g, gv, us, haloshift=0)
2743 if (
associated(adp%dv_dt_dia)) adp%dv_dt_dia(i,j,1) = v(i,j,1)
2744 hval = (hold(i,j,1) + hold(i,j+1,1)) + (ea(i,j,1) + ea(i,j+1,1)) + h_neglect
2745 b1(i) = 1.0 / (hval + (eb(i,j,1) + eb(i,j+1,1)))
2746 d1(i) = hval * b1(i)
2747 v(i,j,1) = b1(i) * (hval * v(i,j,1))
2749 do k=2,nz ;
do i=is,ie
2750 if (
associated(adp%dv_dt_dia)) adp%dv_dt_dia(i,j,k) = v(i,j,k)
2751 c1(i,k) = (eb(i,j,k-1)+eb(i,j+1,k-1)) * b1(i)
2752 eaval = ea(i,j,k) + ea(i,j+1,k)
2753 hval = hold(i,j,k) + hold(i,j+1,k) + h_neglect
2754 b1(i) = 1.0 / ((eb(i,j,k) + eb(i,j+1,k)) + (hval + d1(i)*eaval))
2755 d1(i) = (hval + d1(i)*eaval) * b1(i)
2756 v(i,j,k) = (hval*v(i,j,k) + eaval*v(i,j,k-1))*b1(i)
2758 do k=nz-1,1,-1 ;
do i=is,ie
2759 v(i,j,k) = v(i,j,k) + c1(i,k+1)*v(i,j,k+1)
2760 if (
associated(adp%dv_dt_dia)) &
2761 adp%dv_dt_dia(i,j,k) = (v(i,j,k) - adp%dv_dt_dia(i,j,k)) * idt_accel
2763 if (
associated(adp%dv_dt_dia))
then 2765 adp%dv_dt_dia(i,j,nz) = (v(i,j,nz)-adp%dv_dt_dia(i,j,nz)) * idt_accel
2769 call cpu_clock_end(id_clock_tridiag)
2771 call mom_state_chksum(
"after u/v tridiag ", u, v, h, g, gv, us, haloshift=0)
2774 call disable_averaging(cs%diag)
2776 call enable_averages(dt, time_end, cs%diag)
2778 if (cs%id_Kd_interface > 0)
call post_data(cs%id_Kd_interface, kd_int, cs%diag)
2779 if (cs%id_Kd_heat > 0)
call post_data(cs%id_Kd_heat, kd_heat, cs%diag)
2780 if (cs%id_Kd_salt > 0)
call post_data(cs%id_Kd_salt, kd_salt, cs%diag)
2781 if (cs%id_Kd_ePBL > 0)
call post_data(cs%id_Kd_ePBL, kd_epbl, cs%diag)
2783 if (cs%id_ea > 0)
call post_data(cs%id_ea, ea, cs%diag)
2784 if (cs%id_eb > 0)
call post_data(cs%id_eb, eb, cs%diag)
2786 if (cs%id_dudt_dia > 0)
call post_data(cs%id_dudt_dia, adp%du_dt_dia, cs%diag)
2787 if (cs%id_dvdt_dia > 0)
call post_data(cs%id_dvdt_dia, adp%dv_dt_dia, cs%diag)
2788 if (cs%id_wd > 0)
call post_data(cs%id_wd, cdp%diapyc_vel, cs%diag)
2790 if (cs%id_Tdif > 0)
call post_data(cs%id_Tdif, tdif_flx, cs%diag)
2791 if (cs%id_Tadv > 0)
call post_data(cs%id_Tadv, tadv_flx, cs%diag)
2792 if (cs%id_Sdif > 0)
call post_data(cs%id_Sdif, sdif_flx, cs%diag)
2793 if (cs%id_Sadv > 0)
call post_data(cs%id_Sadv, sadv_flx, cs%diag)
2796 if (cs%id_hf_dudt_dia_2d > 0)
then 2797 allocate(hf_dudt_dia_2d(g%IsdB:g%IedB,g%jsd:g%jed))
2798 hf_dudt_dia_2d(:,:) = 0.0
2799 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
2800 hf_dudt_dia_2d(i,j) = hf_dudt_dia_2d(i,j) + adp%du_dt_dia(i,j,k) * adp%diag_hfrac_u(i,j,k)
2801 enddo ;
enddo ;
enddo 2802 call post_data(cs%id_hf_dudt_dia_2d, hf_dudt_dia_2d, cs%diag)
2803 deallocate(hf_dudt_dia_2d)
2806 if (cs%id_hf_dvdt_dia_2d > 0)
then 2807 allocate(hf_dvdt_dia_2d(g%isd:g%ied,g%JsdB:g%JedB))
2808 hf_dvdt_dia_2d(:,:) = 0.0
2809 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
2810 hf_dvdt_dia_2d(i,j) = hf_dvdt_dia_2d(i,j) + adp%dv_dt_dia(i,j,k) * adp%diag_hfrac_v(i,j,k)
2811 enddo ;
enddo ;
enddo 2812 call post_data(cs%id_hf_dvdt_dia_2d, hf_dvdt_dia_2d, cs%diag)
2813 deallocate(hf_dvdt_dia_2d)
2816 call disable_averaging(cs%diag)
2818 if (showcalltree)
call calltree_leave(
"layered_diabatic()")