@@ -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