Skip to content

Commit 0fb42f3

Browse files
committed
Bug fix and feature dealing with enhanced diff
(1) GFDL reported a bug in the computation of the diffusivity at the interface below the boundary layer in some instances where lenhanced_diff = .false. This bug has been fixed. (2) The KPP regression test has been updated. The test that computes diffusivities when the boundary layer is above / below a cell center now runs with both lenhanced_diff = .true. (old behavior) and lenhanced_diff = .false. (previously un-tested). This new test confirms that the fix for (1) is behaving as expected.
1 parent cebc973 commit 0fb42f3

File tree

2 files changed

+95
-72
lines changed

2 files changed

+95
-72
lines changed

src/drivers/cvmix_kpp_drv.F90

Lines changed: 93 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@ Subroutine cvmix_kpp_driver()
5555
real(cvmix_r8), dimension(:,:), allocatable, target :: hor_vel
5656
real(cvmix_r8), dimension(2) :: ref_vel
5757
real(cvmix_r8), dimension(4) :: shape_coeffs
58-
integer :: fid, kt, kw, nlev1, nlev3, nlev4, max_nlev4, OBL_levid4, nlev5
58+
integer :: i, fid, kt, kw, nlev1, nlev3, nlev4, max_nlev4, OBL_levid4, nlev5
5959
real(cvmix_r8) :: hmix1, hmix5, ri_crit, layer_thick1, layer_thick4, &
6060
layer_thick5, OBL_depth4, OBL_depth5, N, Nsqr
6161
real(cvmix_r8) :: kOBL_depth, Bslope, Vslope
6262
real(cvmix_r8) :: sigma6, OBL_depth6, surf_buoy_force6, surf_fric_vel6, &
6363
vonkarman6, tao, rho0, grav, alpha, Qnonpen, Cp0, &
6464
w_m6, w_s6, wm6_true, ws6_true
6565
character(len=cvmix_strlen) :: interp_type_t1, interp_type_t4, interp_type_t5
66+
character(len=cvmix_strlen) :: filename
6667
! True => run specified test
6768
logical :: ltest1, ltest2, ltest3, ltest4, ltest5, ltest6
6869
logical :: lnoDGat1 ! True => G'(1) = 0 (in test 4)
@@ -264,13 +265,17 @@ Subroutine cvmix_kpp_driver()
264265
deallocate(zeta, w_m, w_s)
265266
endif ! ltest3
266267

268+
! Test 4: Compute boundary layer diffusivity
269+
! 1) Boundary layer between top interface and cell center
270+
! 2) Boundary layer between cell center and bottom interface
271+
! 3,4) Same as above, without enhanced diffusivity
267272
if (ltest4) then
268273
print*, ""
269274
print*, "Test 4: Computing Diffusivity in boundary layer"
270275
print*, " (2 cases - boundary layer above and below cell center)"
276+
print*, " (Both cases run with and without enhanced diffusivity)"
271277
print*, "----------"
272278

273-
call cvmix_init_kpp(MatchTechnique='MatchGradient')
274279
nlev4 = 5
275280
max_nlev4 = 10
276281
if (OBL_levid4.gt.nlev4) &
@@ -305,88 +310,106 @@ Subroutine cvmix_kpp_driver()
305310
call cvmix_put(CVmix_vars4, 'surf_buoy', real(100, cvmix_r8))
306311
call cvmix_put(CVmix_vars4, 'Coriolis', 1e-4_cvmix_r8)
307312

308-
! Test 4a: Boundary layer above center of level containing it
309-
Tdiff = cvmix_zero
310-
Tdiff(1) = cvmix_one
311-
Tdiff(2) = real(10,cvmix_r8)
312-
Tdiff(3) = real(5,cvmix_r8)
313-
Mdiff = Tdiff
314-
Sdiff = Tdiff
315-
316-
OBL_depth4 = abs(zt(OBL_levid4))-layer_thick4/real(4,cvmix_r8)
317-
call cvmix_put(CVmix_vars4, 'OBL_depth', OBL_depth4)
318-
call cvmix_put(CVmix_vars4, 'kOBL_depth', &
319-
cvmix_kpp_compute_kOBL_depth(zw_iface, zt, OBL_depth4))
320-
321-
print*, "OBL_depth = ", CVmix_vars4%BoundaryLayerDepth
322-
print*, "kOBL_depth = ", CVmix_vars4%kOBL_depth
323-
324-
call cvmix_init_kpp(ri_crit=ri_crit, vonkarman=0.4_cvmix_r8, &
325-
interp_type2=interp_type_t4, lnoDGat1=lnoDGat1)
326-
call cvmix_coeffs_kpp(CVmix_vars4)
327-
328-
print*, "Height and Diffusivity throughout column: "
329-
do kw=1,nlev4+1
330-
write(*,"(1X, F6.2, 1X, F8.5)") zw_iface(kw), Mdiff(kw)
331-
end do
332-
print*, ""
333-
313+
do i=1,2
314+
! Test 4a/c: Boundary layer above center of level containing it
315+
Tdiff = cvmix_zero
316+
Tdiff(1) = cvmix_one
317+
Tdiff(2) = real(10,cvmix_r8)
318+
Tdiff(3) = real(5,cvmix_r8)
319+
Mdiff = Tdiff
320+
Sdiff = Tdiff
321+
322+
OBL_depth4 = abs(zt(OBL_levid4))-layer_thick4/real(4,cvmix_r8)
323+
call cvmix_put(CVmix_vars4, 'OBL_depth', OBL_depth4)
324+
call cvmix_put(CVmix_vars4, 'kOBL_depth', &
325+
cvmix_kpp_compute_kOBL_depth(zw_iface, zt, OBL_depth4))
326+
327+
print*, "OBL_depth = ", CVmix_vars4%BoundaryLayerDepth
328+
print*, "kOBL_depth = ", CVmix_vars4%kOBL_depth
329+
330+
call cvmix_init_kpp(ri_crit=ri_crit, vonkarman=0.4_cvmix_r8, &
331+
interp_type2=interp_type_t4, lnoDGat1=lnoDGat1, &
332+
MatchTechnique='MatchGradient', &
333+
lenhanced_diff=(i.eq.1))
334+
call cvmix_coeffs_kpp(CVmix_vars4)
335+
336+
print*, "Height and Diffusivity throughout column: "
337+
do kw=1,nlev4+1
338+
write(*,"(1X, F6.2, 1X, F8.5)") zw_iface(kw), Mdiff(kw)
339+
end do
340+
print*, ""
341+
342+
if (i.eq.1) then
343+
filename="test4a"
344+
else
345+
filename="test4c"
346+
endif
334347
#ifdef _NETCDF
335-
call cvmix_io_open(fid, "test4a.nc", "nc")
348+
call cvmix_io_open(fid, trim(filename) // ".nc", "nc")
336349
#else
337-
call cvmix_io_open(fid, "test4a.out", "ascii")
350+
call cvmix_io_open(fid, trim(filename) // ".out", "ascii")
338351
#endif
339352

340-
call cvmix_output_write(fid, CVmix_vars4, (/"zt ", "zw ", "Mdiff", &
341-
"Tdiff", "Sdiff"/))
353+
call cvmix_output_write(fid, CVmix_vars4, (/"zt ", "zw ", "Mdiff", &
354+
"Tdiff", "Sdiff"/))
342355
#ifdef _NETCDF
343-
call cvmix_output_write_att(fid, "interp_type2", interp_type_t4)
344-
call cvmix_output_write_att(fid, "OBL_depth", &
345-
CVmix_vars4%BoundaryLayerDepth)
356+
call cvmix_output_write_att(fid, "interp_type2", interp_type_t4)
357+
call cvmix_output_write_att(fid, "OBL_depth", &
358+
CVmix_vars4%BoundaryLayerDepth)
346359
#endif
347360

348-
call cvmix_io_close(fid)
349-
350-
! Test 4b: Boundary layer below center of level containing it
351-
Tdiff = cvmix_zero
352-
Tdiff(1) = cvmix_one
353-
Tdiff(2) = real(10,cvmix_r8)
354-
Tdiff(3) = real(5,cvmix_r8)
355-
Mdiff = Tdiff
356-
Sdiff = Tdiff
357-
358-
OBL_depth4 = abs(zt(OBL_levid4))+layer_thick4/real(4,cvmix_r8)
359-
call cvmix_put(CVmix_vars4, 'OBL_depth', OBL_depth4)
360-
call cvmix_put(CVmix_vars4, 'kOBL_depth', &
361-
cvmix_kpp_compute_kOBL_depth(zw_iface, zt, OBL_depth4))
362-
363-
print*, "OBL_depth = ", CVmix_vars4%BoundaryLayerDepth
364-
print*, "kOBL_depth = ", CVmix_vars4%kOBL_depth
365-
366-
call cvmix_init_kpp(ri_crit=ri_crit, vonkarman=0.4_cvmix_r8, &
367-
interp_type2=interp_type_t4, lnoDGat1=lnoDGat1)
368-
call cvmix_coeffs_kpp(CVmix_vars4)
369-
370-
print*, "Height and Diffusivity throughout column: "
371-
do kw=1,nlev4+1
372-
write(*,"(1X, F6.2, 1X, F8.5)") zw_iface(kw), Mdiff(kw)
373-
end do
374-
361+
call cvmix_io_close(fid)
362+
363+
! Test 4b/d: Boundary layer below center of level containing it
364+
Tdiff = cvmix_zero
365+
Tdiff(1) = cvmix_one
366+
Tdiff(2) = real(10,cvmix_r8)
367+
Tdiff(3) = real(5,cvmix_r8)
368+
Mdiff = Tdiff
369+
Sdiff = Tdiff
370+
371+
OBL_depth4 = abs(zt(OBL_levid4))+layer_thick4/real(4,cvmix_r8)
372+
call cvmix_put(CVmix_vars4, 'OBL_depth', OBL_depth4)
373+
call cvmix_put(CVmix_vars4, 'kOBL_depth', &
374+
cvmix_kpp_compute_kOBL_depth(zw_iface, zt, OBL_depth4))
375+
376+
print*, "OBL_depth = ", CVmix_vars4%BoundaryLayerDepth
377+
print*, "kOBL_depth = ", CVmix_vars4%kOBL_depth
378+
379+
call cvmix_init_kpp(ri_crit=ri_crit, vonkarman=0.4_cvmix_r8, &
380+
interp_type2=interp_type_t4, lnoDGat1=lnoDGat1, &
381+
MatchTechnique='MatchGradient', &
382+
lenhanced_diff=(i.eq.1))
383+
call cvmix_coeffs_kpp(CVmix_vars4)
384+
385+
print*, "Height and Diffusivity throughout column: "
386+
do kw=1,nlev4+1
387+
write(*,"(1X, F6.2, 1X, F8.5)") zw_iface(kw), Mdiff(kw)
388+
end do
389+
390+
if (i.eq.1) then
391+
print*, ""
392+
filename="test4b"
393+
else
394+
filename="test4d"
395+
endif
375396
#ifdef _NETCDF
376-
call cvmix_io_open(fid, "test4b.nc", "nc")
397+
call cvmix_io_open(fid, trim(filename) // ".nc", "nc")
377398
#else
378-
call cvmix_io_open(fid, "test4b.out", "ascii")
399+
call cvmix_io_open(fid, trim(filename) // ".out", "ascii")
379400
#endif
380401

381-
call cvmix_output_write(fid, CVmix_vars4, (/"zt ", "zw ", "Mdiff", &
382-
"Tdiff", "Sdiff"/))
402+
call cvmix_output_write(fid, CVmix_vars4, (/"zt ", "zw ", "Mdiff", &
403+
"Tdiff", "Sdiff"/))
383404
#ifdef _NETCDF
384-
call cvmix_output_write_att(fid, "interp_type2", interp_type_t4)
385-
call cvmix_output_write_att(fid, "OBL_depth", &
386-
CVmix_vars4%BoundaryLayerDepth)
405+
call cvmix_output_write_att(fid, "interp_type2", interp_type_t4)
406+
call cvmix_output_write_att(fid, "OBL_depth", &
407+
CVmix_vars4%BoundaryLayerDepth)
387408
#endif
388409

389-
call cvmix_io_close(fid)
410+
call cvmix_io_close(fid)
411+
412+
end do
390413

391414
deallocate(zt, zw_iface)
392415
deallocate(Mdiff, Tdiff, Sdiff)

src/shared/cvmix_kpp.F90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -952,14 +952,14 @@ subroutine cvmix_coeffs_kpp_low(Mdiff_out, Tdiff_out, Sdiff_out, zw, zt, &
952952
surf_fric, langmuir_Efactor, &
953953
w_m, w_s, &
954954
CVmix_kpp_params_user)
955-
do kw=2,ktup+1
955+
do kw=2,kwup
956956
! (3b) Evaluate G(sigma) at each cell interface
957957
MshapeAtS = cvmix_math_evaluate_cubic(Mshape, sigma(kw))
958958
TshapeAtS = cvmix_math_evaluate_cubic(Tshape, sigma(kw))
959959
SshapeAtS = cvmix_math_evaluate_cubic(Sshape, sigma(kw))
960960

961961
! (3c) Compute nonlocal term at each cell interface
962-
if ((.not.lstable).and.(kw.le.kwup)) then
962+
if (.not.lstable) then
963963
GAtS = cvmix_math_evaluate_cubic(Tshape2, sigma(kw))
964964
Tnonlocal(kw) = CVmix_kpp_params_in%nonlocal_coeff*GAtS
965965
GAtS = cvmix_math_evaluate_cubic(Sshape2, sigma(kw))

0 commit comments

Comments
 (0)