@@ -75,6 +75,9 @@ module cvmix_convection
7575 ! Brunt-Vaisala parameterization
7676 real (cvmix_r8 ) :: BVsqr_convect ! units: s^-2
7777
78+ ! Only apply below the boundary layer?
79+ logical :: lnoOBL
80+
7881 ! Flag for what to do with old values of CVmix_vars%[MTS]diff
7982 integer :: handle_old_vals
8083 end type cvmix_conv_params_type
@@ -91,7 +94,8 @@ module cvmix_convection
9194! !INTERFACE:
9295
9396 subroutine cvmix_init_conv (convect_diff , convect_visc , lBruntVaisala , &
94- BVsqr_convect , old_vals , CVmix_conv_params_user )
97+ BVsqr_convect , lnoOBL , old_vals , &
98+ CVmix_conv_params_user )
9599
96100! !DESCRIPTION:
97101! Initialization routine for specifying convective mixing coefficients.
@@ -111,6 +115,7 @@ subroutine cvmix_init_conv(convect_diff, convect_visc, lBruntVaisala, &
111115 convect_visc ! viscosity to parameterize convection
112116 logical , intent (in ), optional :: lBruntVaisala ! True => B-V mixing
113117 real (cvmix_r8 ), intent (in ), optional :: BVsqr_convect ! B-V parameter
118+ logical , intent (in ), optional :: lnoOBL ! False => apply in OBL too
114119 character (len= cvmix_strlen), optional , intent (in ) :: old_vals
115120
116121! EOP
@@ -134,6 +139,12 @@ subroutine cvmix_init_conv(convect_diff, convect_visc, lBruntVaisala, &
134139 call cvmix_put_conv(" BVsqr_convect" , cvmix_zero, CVmix_conv_params_user)
135140 end if
136141
142+ if (present (lnoOBL)) then
143+ call cvmix_put_conv(" lnoOBL" , lnoOBL, CVmix_conv_params_user)
144+ else
145+ call cvmix_put_conv(" lnoOBL" , .true. , CVmix_conv_params_user)
146+ end if
147+
137148 if (present (old_vals)) then
138149 select case (trim (old_vals))
139150 case (" overwrite" )
@@ -212,7 +223,8 @@ subroutine cvmix_coeffs_conv_wrap(CVmix_vars, CVmix_conv_params_user)
212223 CVmix_vars% SqrBuoyancyFreq_iface, &
213224 CVmix_vars% WaterDensity_cntr, &
214225 CVmix_vars% AdiabWaterDensity_cntr, &
215- nlev, max_nlev, CVmix_conv_params_user)
226+ nlev, max_nlev, nint (CVMix_vars% kOBL_depth)+ 1 , &
227+ CVmix_conv_params_user)
216228 call cvmix_update_wrap(CVmix_conv_params_in% handle_old_vals, max_nlev, &
217229 Mdiff_out = CVmix_vars% Mdiff_iface, &
218230 new_Mdiff = new_Mdiff, &
@@ -229,7 +241,8 @@ end subroutine cvmix_coeffs_conv_wrap
229241! !INTERFACE:
230242
231243 subroutine cvmix_coeffs_conv_low (Mdiff_out , Tdiff_out , Nsqr , dens , dens_lwr ,&
232- nlev , max_nlev , CVmix_conv_params_user )
244+ nlev , max_nlev , OBL_ind , &
245+ CVmix_conv_params_user )
233246
234247! !DESCRIPTION:
235248! Computes vertical diffusion coefficients for convective mixing.
@@ -242,6 +255,7 @@ subroutine cvmix_coeffs_conv_low(Mdiff_out, Tdiff_out, Nsqr, dens, dens_lwr,&
242255! !INPUT PARAMETERS:
243256
244257 integer , intent (in ) :: nlev, max_nlev
258+ integer , intent (in ) :: OBL_ind
245259 ! max_nlev+1
246260 real (cvmix_r8 ), dimension (max_nlev+1 ), intent (in ) :: Nsqr
247261 ! max_nlev
@@ -263,15 +277,19 @@ subroutine cvmix_coeffs_conv_low(Mdiff_out, Tdiff_out, Nsqr, dens, dens_lwr,&
263277!
264278!- ----------------------------------------------------------------------
265279
266- real (cvmix_r8 ) :: vvconv , wgt
280+ real (cvmix_r8 ) :: convect_mdiff, convect_tdiff , wgt
267281 integer :: kw
282+ logical :: lnoOBL
268283 type (cvmix_conv_params_type), pointer :: CVmix_conv_params_in
269284
270285 if (present (CVmix_conv_params_user)) then
271286 CVmix_conv_params_in = > CVmix_conv_params_user
272287 else
273288 CVmix_conv_params_in = > CVmix_conv_params_saved
274289 end if
290+ lnoOBL = CVMix_conv_params_in% lnoOBL
291+ convect_mdiff = CVMix_conv_params_in% convect_visc
292+ convect_tdiff = CVMix_conv_params_in% convect_diff
275293
276294!- ----------------------------------------------------------------------
277295!
@@ -311,8 +329,8 @@ subroutine cvmix_coeffs_conv_low(Mdiff_out, Tdiff_out, Nsqr, dens, dens_lwr,&
311329 CVmix_conv_params_in)
312330 end do
313331 else ! BVsqr_convect >= 0 => step function
314- do kw= 1 ,nlev-1
315- if (Nsqr(kw).le. 0 ) then
332+ do kw= 1 ,nlev
333+ if (( Nsqr(kw).le. 0 ) .and. ((kw .ge. OBL_ind) .or. ( .not. lnoOBL)) ) then
316334 Mdiff_out(kw) = cvmix_get_conv_real(' convect_visc' , &
317335 CVmix_conv_params_in)
318336 Tdiff_out(kw) = cvmix_get_conv_real(' convect_diff' , &
@@ -322,27 +340,20 @@ subroutine cvmix_coeffs_conv_low(Mdiff_out, Tdiff_out, Nsqr, dens, dens_lwr,&
322340 Tdiff_out(kw) = cvmix_zero
323341 end if
324342 end do
325- Mdiff_out(nlev) = cvmix_zero
326- Tdiff_out(nlev) = cvmix_zero
327343 end if
328344 Mdiff_out(nlev+1 ) = cvmix_zero
329345 Tdiff_out(nlev+1 ) = cvmix_zero
330346 else
331347 ! Default convection mixing based on density
332348 do kw= 1 ,nlev-1
333- if (CVmix_conv_params_in% convect_visc.ne. cvmix_zero) then
334- vvconv = cvmix_get_conv_real(' convect_visc' , CVmix_conv_params_in)
335- else
336- ! convection only affects tracers
337- vvconv = Mdiff_out(kw)
338- end if
339-
340- ! if (CVmix_vars%WaterDensity_cntr(kw).gt. &
341- ! CVmix_vars%AdiabWaterDensity_cntr(kw)) then
342349 if (dens(kw).gt. dens_lwr(kw)) then
343- Mdiff_out(kw+1 ) = vvconv
344- Tdiff_out(kw+1 ) = cvmix_get_conv_real(' convect_diff' , &
345- CVmix_conv_params_in)
350+ if (CVmix_conv_params_in% convect_visc.eq. cvmix_zero) then
351+ ! convection only affects tracers
352+ Mdiff_out(kw+1 ) = Mdiff_out(kw)
353+ else
354+ Mdiff_out(kw+1 ) = convect_mdiff
355+ end if
356+ Tdiff_out(kw+1 ) = convect_tdiff
346357 end if
347358 end do
348359 end if
@@ -485,6 +496,8 @@ subroutine cvmix_put_conv_logical(varname, val, CVmix_conv_params_user)
485496 select case (trim (varname))
486497 case (' lBruntVaisala' )
487498 CVmix_conv_params_out% lBruntVaisala = val
499+ case (' lnoOBL' )
500+ CVmix_conv_params_out% lnoOBL = val
488501 case DEFAULT
489502 print * , " ERROR: " , trim (varname), " not a valid choice!"
490503 stop 1
0 commit comments