Skip to content

Commit b7e39b5

Browse files
committed
Adding upgradient diagnostics to clubb_intr.F90
1 parent ea101b3 commit b7e39b5

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

src/physics/cam/clubb_intr.F90

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ module clubb_intr
3636
hm_metadata_type, sclr_idx_type
3737

3838
use clubb_api_module, only: nparams
39+
use grid_class, only: ddzt
3940
use clubb_mf, only: do_clubb_mf, do_clubb_mf_diag
4041
use cloud_fraction, only: dp1, dp2
4142
#endif
@@ -1819,6 +1820,22 @@ subroutine clubb_ini_cam(pbuf2d)
18191820
call addfld ('UM_CLUBB', (/ 'lev' /), 'A', 'm/s', 'Zonal Wind', sampled_on_subcycle=.true.)
18201821
call addfld ('VM_CLUBB', (/ 'lev' /), 'A', 'm/s', 'Meridional Wind', sampled_on_subcycle=.true.)
18211822
call addfld ('WM_ZT_CLUBB', (/ 'lev' /), 'A', 'm/s', 'Vertical Velocity', sampled_on_subcycle=.true.)
1823+
1824+
call addfld ('DUDZ_CLUBB', (/ 'ilev' /), 'A', 'm2/s2', '')
1825+
call addfld ('DVDZ_CLUBB', (/ 'ilev' /), 'A', 'm2/s2', '')
1826+
call addfld ('UPWP_UG_CLUBB', (/ 'ilev' /), 'A', 'm2/s2', 'Zonal Momentum Upgradient Flux')
1827+
call addfld ('VPWP_UG_CLUBB', (/ 'ilev' /), 'A', 'm2/s2', 'Meridional Momentum Upgradient Flux')
1828+
call addfld ('UPWP_UG_CT_CLUBB', horiz_only, 'A', 'm2/s2', '')
1829+
call addfld ('VPWP_UG_CT_CLUBB', horiz_only, 'A', 'm2/s2', '')
1830+
call addfld ('UPWP_UG_MEAN_HGT', horiz_only, 'A', 'm2/s2', '')
1831+
call addfld ('VPWP_UG_MEAN_HGT', horiz_only, 'A', 'm2/s2', '')
1832+
call addfld ('UPWP_UG_MEAN_LEV', horiz_only, 'A', 'm2/s2', '')
1833+
call addfld ('VPWP_UG_MEAN_LEV', horiz_only, 'A', 'm2/s2', '')
1834+
call addfld ('UPWP_UG_MIN_LEV', horiz_only, 'A', 'm2/s2', '')
1835+
call addfld ('VPWP_UG_MIN_LEV', horiz_only, 'A', 'm2/s2', '')
1836+
call addfld ('UPWP_UG_MAX_LEV', horiz_only, 'A', 'm2/s2', '')
1837+
call addfld ('VPWP_UG_MAX_LEV', horiz_only, 'A', 'm2/s2', '')
1838+
18221839
call addfld ('PBLH', horiz_only, 'A', 'm', 'PBL height', sampled_on_subcycle=.true.)
18231840
call addfld ('CLDST', (/ 'lev' /), 'A', 'fraction', 'Stratus cloud fraction', sampled_on_subcycle=.true.)
18241841
call addfld ('ZMDLF', (/ 'lev' /), 'A', 'kg/kg/s', 'Detrained liquid water from ZM convection', sampled_on_subcycle=.true.)
@@ -2608,6 +2625,16 @@ subroutine clubb_tend_cam( state, ptend_all, pbuf, hdtime, &
26082625
type(nu_vertical_res_dep) :: nu_vert_res_dep ! Vertical resolution dependent nu values
26092626
real(r8) :: lmin
26102627

2628+
real(r8), dimension(state%ncol, pverp) :: dudz_cam, dvdz_cam
2629+
real(r8), dimension(state%ncol, pverp+1) :: dudz, dvdz
2630+
real(r8), dimension(pcols,pverp) :: upwp_levels_ug, vpwp_levels_ug, upwp_height_ug, vpwp_height_ug, &
2631+
upwp_ug, vpwp_ug
2632+
real(r8), dimension(pcols) :: upwp_ug_mean_lev, vpwp_ug_mean_lev, upwp_ug_min_lev, vpwp_ug_min_lev, &
2633+
upwp_ug_max_lev, vpwp_ug_max_lev, upwp_ug_mean_hgt, vpwp_ug_mean_hgt, &
2634+
upwp_ug_count, vpwp_ug_count
2635+
integer :: nz_count
2636+
logical :: min_lev_not_found
2637+
26112638
real(r8), dimension(state%ncol,nparams) :: &
26122639
clubb_params ! Adjustable CLUBB parameters (C1, C2 ...)
26132640

@@ -4414,6 +4441,85 @@ subroutine clubb_tend_cam( state, ptend_all, pbuf, hdtime, &
44144441
call t_stopf('clubb_cam_tend:do_liqsupersat')
44154442
end if
44164443

4444+
! Calculate the upgradient flux diagnostic !
4445+
! ------------------------------------------------------------ !
4446+
if ( clubb_l_predict_upwp_vpwp ) then
4447+
upwp_ug = 0
4448+
vpwp_ug = 0
4449+
upwp_ug_count = 0
4450+
vpwp_ug_count = 0
4451+
upwp_levels_ug = 0
4452+
vpwp_levels_ug = 0
4453+
upwp_ug_mean_lev = 0
4454+
vpwp_ug_mean_lev = 0
4455+
upwp_ug_min_lev = 0
4456+
vpwp_ug_min_lev = 0
4457+
upwp_ug_max_lev = 0
4458+
vpwp_ug_max_lev = 0
4459+
upwp_height_ug = 0
4460+
vpwp_height_ug = 0
4461+
dudz = ddzt( pver+1-top_lev+1, ncol, gr, um_in )
4462+
dvdz = ddzt( pver+1-top_lev+1, ncol, gr, vm_in )
4463+
do k=1, pver+1-top_lev+1
4464+
do i=1, ncol
4465+
dudz_cam(i,pverp-k+1) = dudz(i,k)
4466+
dvdz_cam(i,pverp-k+1) = dvdz(i,k)
4467+
end do
4468+
end do
4469+
do i = 1, ncol
4470+
do k = top_lev, pver !top_lev, nlev + top_lev - 1
4471+
if ( ( dudz_cam(i,k) < 0 .and. upwp(i,k) < 0 ) .or. ( dudz_cam(i,k) > 0 .and. upwp(i,k) > 0 ) ) then
4472+
upwp_ug(i,k) = upwp(i,k)
4473+
upwp_ug_count(i) = upwp_ug_count(i) + 1
4474+
upwp_levels_ug(i,k) = k
4475+
upwp_height_ug(i,k) = state1%zm(i,k)
4476+
end if
4477+
if ( ( dvdz_cam(i,k) < 0 .and. vpwp(i,k) < 0 ) .or. ( dvdz_cam(i,k) > 0 .and. vpwp(i,k) > 0 ) ) then
4478+
vpwp_ug(i,k) = vpwp(i,k)
4479+
vpwp_ug_count(i) = vpwp_ug_count(i) + 1
4480+
vpwp_levels_ug(i,k) = k
4481+
vpwp_height_ug(i,k) = state1%zm(i,k)
4482+
end if
4483+
end do
4484+
end do
4485+
do i=1, ncol
4486+
nz_count = 0
4487+
min_lev_not_found = .true.
4488+
do k = top_lev, pver !top_lev, nlev + top_lev - 1
4489+
if ( upwp_levels_ug(i,k) .ne. 0 ) then
4490+
nz_count = nz_count + 1
4491+
upwp_ug_max_lev(i) = upwp_levels_ug(i,k)
4492+
if (min_lev_not_found) then
4493+
upwp_ug_min_lev(i) = upwp_levels_ug(i,k)
4494+
min_lev_not_found = .false.
4495+
end if
4496+
end if
4497+
end do
4498+
if (nz_count .ne. 0) then
4499+
upwp_ug_mean_lev(i) = sum(upwp_levels_ug(i,:))/nz_count
4500+
upwp_ug_mean_hgt(i) = sum(upwp_height_ug(i,:))/nz_count
4501+
end if
4502+
nz_count = 0
4503+
min_lev_not_found = .true.
4504+
do k = top_lev, pver !top_lev, nlev + top_lev - 1
4505+
if ( vpwp_levels_ug(i,k) .ne. 0 ) then
4506+
nz_count = nz_count + 1
4507+
vpwp_ug_max_lev(i) = vpwp_levels_ug(i,k)
4508+
if (min_lev_not_found) then
4509+
vpwp_ug_min_lev(i) = vpwp_levels_ug(i,k)
4510+
min_lev_not_found = .false.
4511+
end if
4512+
end if
4513+
end do
4514+
if (nz_count .ne. 0) then
4515+
vpwp_ug_mean_lev(i) = sum(vpwp_levels_ug(i,:))/nz_count
4516+
vpwp_ug_mean_hgt(i) = sum(vpwp_height_ug(i,:))/nz_count
4517+
end if
4518+
end do
4519+
end if
4520+
4521+
! ------------------------------------------------------------ !
4522+
44174523
! ------------------------------------------------------------ !
44184524
! The rest of the code deals with diagnosing variables !
44194525
! for microphysics/radiation computation and macrophysics !
@@ -4789,6 +4895,20 @@ subroutine clubb_tend_cam( state, ptend_all, pbuf, hdtime, &
47894895
call outfld( 'UM_CLUBB', um(:,1:pver), pcols, lchnk )
47904896
call outfld( 'VM_CLUBB', vm(:,1:pver), pcols, lchnk )
47914897
call outfld( 'WM_ZT_CLUBB', wm_zt_out(:,1:pver), pcols, lchnk )
4898+
call outfld( 'DUDZ_CLUBB', dudz_cam, pcols, lchnk )
4899+
call outfld( 'DVDZ_CLUBB', dvdz_cam, pcols, lchnk )
4900+
call outfld( 'UPWP_UG_CLUBB', upwp_ug, pcols, lchnk )
4901+
call outfld( 'VPWP_UG_CLUBB', vpwp_ug, pcols, lchnk )
4902+
call outfld( 'UPWP_UG_CT_CLUBB', upwp_ug_count, pcols, lchnk )
4903+
call outfld( 'VPWP_UG_CT_CLUBB', vpwp_ug_count, pcols, lchnk )
4904+
call outfld( 'UPWP_UG_MEAN_HGT', upwp_ug_mean_hgt, pcols, lchnk )
4905+
call outfld( 'VPWP_UG_MEAN_HGT', vpwp_ug_mean_hgt, pcols, lchnk )
4906+
call outfld( 'UPWP_UG_MEAN_LEV', upwp_ug_mean_lev, pcols, lchnk )
4907+
call outfld( 'VPWP_UG_MEAN_LEV', vpwp_ug_mean_lev, pcols, lchnk )
4908+
call outfld( 'UPWP_UG_MIN_LEV', upwp_ug_min_lev, pcols, lchnk )
4909+
call outfld( 'VPWP_UG_MIN_LEV', vpwp_ug_min_lev, pcols, lchnk )
4910+
call outfld( 'UPWP_UG_MAX_LEV', upwp_ug_max_lev, pcols, lchnk )
4911+
call outfld( 'VPWP_UG_MAX_LEV', vpwp_ug_max_lev, pcols, lchnk )
47924912
call outfld( 'CONCLD', concld, pcols, lchnk )
47934913
call outfld( 'DP_CLD', deepcu, pcols, lchnk )
47944914
call outfld( 'ZMDLF', dlf_liq_out, pcols, lchnk )

0 commit comments

Comments
 (0)