Skip to content

Commit fd5ae75

Browse files
committed
Merge pull request #61 from mnlevy1981/bugfix/improve_convective
Bugfix/improve convective
2 parents 10c430e + 16a0ad4 commit fd5ae75

File tree

1 file changed

+33
-20
lines changed

1 file changed

+33
-20
lines changed

src/shared/cvmix_convection.F90

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)