Subroutine for calculating enhanced diffusivity/viscosity due to convection via CVMix.
144 type(ocean_grid_type),
intent(in) :: G
145 type(verticalGrid_type),
intent(in) :: GV
146 type(unit_scale_type),
intent(in) :: US
147 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
148 type(thermo_var_ptrs),
intent(in) :: tv
149 type(CVMix_conv_cs),
pointer :: CS
151 real,
dimension(SZI_(G),SZJ_(G)),
intent(in) :: hbl
152 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
153 optional,
intent(inout) :: Kd
155 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
156 optional,
intent(inout) :: KV
158 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
159 optional,
intent(inout) :: Kd_aux
164 real,
dimension(SZK_(GV)) :: rho_lwr
167 real,
dimension(SZK_(GV)) :: rho_1d
169 real,
dimension(SZK_(GV)+1) :: N2
170 real,
dimension(SZK_(GV)+1) :: kv_col
171 real,
dimension(SZK_(GV)+1) :: kd_col
172 real,
dimension(SZK_(GV)+1) :: iFaceHeight
173 real,
dimension(SZK_(GV)) :: cellHeight
174 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)+1) :: &
175 kd_conv, & !< Diffusivity added by convection for diagnostics [Z2 T-1 ~> m2 s-1]
176 kv_conv, & !< Viscosity added by convection for diagnostics [Z2 T-1 ~> m2 s-1]
188 g_o_rho0 = us%L_to_Z**2*us%s_to_T**2 * gv%g_Earth / gv%Rho0
191 rho_lwr(:) = 0.0 ; rho_1d(:) = 0.0
194 n2(1) = 0.0 ; n2(gv%ke+1) = 0.0
196 if (cs%id_N2 > 0) n2_3d(:,:,:) = 0.0
197 if (cs%id_kv_conv > 0) kv_conv(:,:,:) = 0.0
198 if (cs%id_kd_conv > 0) kd_conv(:,:,:) = 0.0
206 pref = 0. ;
if (
associated(tv%p_surf)) pref = tv%p_surf(i,j)
211 pref = pref + (gv%H_to_RZ*gv%g_Earth) * h(i,j,k)
212 call calculate_density(tv%t(i,j,k), tv%s(i,j,k), pref, rhok, tv%eqn_of_state)
213 call calculate_density(tv%t(i,j,k-1), tv%s(i,j,k-1), pref, rhokm1, tv%eqn_of_state)
215 dz = ((0.5*(h(i,j,k-1) + h(i,j,k))+gv%H_subroundoff)*gv%H_to_Z)
216 n2(k) = g_o_rho0 * (rhok - rhokm1) / dz
224 dh = h(i,j,k) * gv%H_to_m
226 hcorr = min( dh - cs%min_thickness, 0. )
227 dh = max( dh, cs%min_thickness )
228 cellheight(k) = ifaceheight(k) - 0.5 * dh
229 ifaceheight(k+1) = ifaceheight(k) - dh
233 hbl_kpp = us%Z_to_m*hbl(i,j)
234 kobl = cvmix_kpp_compute_kobl_depth(ifaceheight, cellheight, hbl_kpp)
236 kv_col(:) = 0.0 ; kd_col(:) = 0.0
237 call cvmix_coeffs_conv(mdiff_out=kv_col(:), &
238 tdiff_out=kd_col(:), &
241 dens_lwr=rho_lwr(:), &
246 if (
present(kd))
then
248 do k=max(1,kobl+1),gv%ke+1
249 kd(i,j,k) = kd(i,j,k) + us%m2_s_to_Z2_T * kd_col(k)
252 if (
present(kd_aux))
then
254 do k=max(1,kobl+1),gv%ke+1
255 kd_aux(i,j,k) = kd_aux(i,j,k) + us%m2_s_to_Z2_T * kd_col(k)
259 if (
present(kv))
then
261 do k=max(1,kobl+1),gv%ke+1
262 kv(i,j,k) = kv(i,j,k) + us%m2_s_to_Z2_T * kv_col(k)
267 if (cs%id_kv_conv > 0)
then
269 do k=max(1,kobl+1),gv%ke+1
270 kv_conv(i,j,k) = us%m2_s_to_Z2_T * kv_col(k)
273 if (cs%id_kd_conv > 0)
then
275 do k=max(1,kobl+1),gv%ke+1
276 kd_conv(i,j,k) = us%m2_s_to_Z2_T * kd_col(k)
280 if (cs%id_N2 > 0)
then ;
do k=2,gv%ke ; n2_3d(i,j,k) = us%T_to_s**2*n2(k) ;
enddo ;
endif
291 if (
present(kd))
call hchksum(kv,
"MOM_CVMix_conv: Kd", g%HI, haloshift=0, scale=us%m2_s_to_Z2_T)
292 if (
present(kv))
call hchksum(kv,
"MOM_CVMix_conv: Kv", g%HI, haloshift=0, scale=us%m2_s_to_Z2_T)
296 if (cs%id_N2 > 0)
call post_data(cs%id_N2, n2_3d, cs%diag)
297 if (cs%id_kd_conv > 0)
call post_data(cs%id_kd_conv, kd_conv, cs%diag)
298 if (cs%id_kv_conv > 0)
call post_data(cs%id_kv_conv, kv_conv, cs%diag)