Skip to content

Commit

Permalink
New Thompson cloud fraction (updated subroutine cal_cldfra3) (NCAR#432)
Browse files Browse the repository at this point in the history
Add a new method to calculate cloud fraction for Thompson MP. 
A few diagnostic variables are added for use by the cloud fraction schemes in CCPP, and the icloud==3 switch is repurposed from currently being unused to switch between the original progcld6 and the new progcld_thompson scheme in CCPP.
  • Loading branch information
climbfuji authored Dec 10, 2021
1 parent 86d4bb3 commit 283bd50
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 4 deletions.
22 changes: 20 additions & 2 deletions ccpp/data/GFS_typedefs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,12 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: cldfra (:,:) => null() !< instantaneous 3D cloud fraction
!--- MP quantities for 3D diagnositics
real (kind=kind_phys), pointer :: refl_10cm(:,:) => null() !< instantaneous refl_10cm
real (kind=kind_phys), pointer :: cldfra2d (:) => null() !< instantaneous 2D cloud fraction
real (kind=kind_phys), pointer :: total_albedo (:) => null() !< total sky (with cloud) albedo at toa
real (kind=kind_phys), pointer :: lwp_ex (:) => null() !< liquid water path from microphysics
real (kind=kind_phys), pointer :: iwp_ex (:) => null() !< ice water path from microphysics
real (kind=kind_phys), pointer :: lwp_fc (:) => null() !< liquid water path from cloud fraction scheme
real (kind=kind_phys), pointer :: iwp_fc (:) => null() !< ice water path from cloud fraction scheme

!--- Extra PBL diagnostics
real (kind=kind_phys), pointer :: dkt(:,:) => null() !< Eddy diffusitivity for heat
Expand Down Expand Up @@ -6518,7 +6524,13 @@ subroutine diag_create (Diag, IM, Model)
if (Model%imp_physics == Model%imp_physics_fer_hires) then
allocate (Diag%train (IM,Model%levs))
end if
allocate (Diag%cldfra (IM,Model%levs))
allocate (Diag%cldfra (IM,Model%levr+LTP))
allocate (Diag%cldfra2d (IM))
allocate (Diag%total_albedo (IM))
allocate (Diag%lwp_ex (IM))
allocate (Diag%iwp_ex (IM))
allocate (Diag%lwp_fc (IM))
allocate (Diag%iwp_fc (IM))

!--- 3D diagnostics
if (Model%ldiag3d) then
Expand Down Expand Up @@ -6784,6 +6796,12 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center)
Diag%train = zero
end if
Diag%cldfra = zero
Diag%cldfra2d = zero
Diag%total_albedo = zero
Diag%lwp_ex = zero
Diag%iwp_ex = zero
Diag%lwp_fc = zero
Diag%iwp_fc = zero

Diag%totprcpb = zero
Diag%cnvprcpb = zero
Expand Down Expand Up @@ -6894,7 +6912,7 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center)
Diag%dku = zero

! max hourly diagnostics
Diag%refl_10cm = zero
Diag%refl_10cm = -35.
Diag%refdmax = -35.
Diag%refdmax263k = -35.
Diag%t02max = -999.
Expand Down
42 changes: 42 additions & 0 deletions ccpp/data/GFS_typedefs.meta
Original file line number Diff line number Diff line change
Expand Up @@ -7087,6 +7087,48 @@
dimensions = (horizontal_loop_extent,adjusted_vertical_layer_dimension_for_radiation)
type = real
kind = kind_phys
[cldfra2d]
standard_name = max_in_column_cloud_fraction
long_name = instantaneous 2D (max-in-column) cloud fraction
units = frac
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[lwp_ex]
standard_name = liq_water_path_from_microphysics
long_name = total liquid water path from explicit microphysics
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[iwp_ex]
standard_name = ice_water_path_from_microphysics
long_name = total ice water path from explicit microphysics
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[lwp_fc]
standard_name = liq_water_path_from_cloud_fraction
long_name = total liquid water path from cloud fraction scheme
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[iwp_fc]
standard_name = ice_water_path_from_cloud_fraction
long_name = total ice water path from cloud fraction scheme
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[total_albedo]
standard_name = total_sky_albedo
long_name = total sky albedo at toa
units = frac
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
[edmf_a]
standard_name = emdf_updraft_area
long_name = updraft area from mass flux scheme
Expand Down
112 changes: 111 additions & 1 deletion ccpp/driver/GFS_diagnostics.F90
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,78 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop

idx = 0

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'cldfra2d'
ExtDiag(idx)%desc = 'instantaneous 2D (max-in-column) cloud fraction'
ExtDiag(idx)%unit = 'frac'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%cldfra2d(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'total_albedo'
ExtDiag(idx)%desc = 'total sky albedo at toa'
ExtDiag(idx)%unit = 'frac'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%total_albedo(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'lwp_ex'
ExtDiag(idx)%desc = 'total liquid water path from explicit microphysics'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%lwp_ex(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'iwp_ex'
ExtDiag(idx)%desc = 'total ice water path from explicit microphysics'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%iwp_ex(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'lwp_fc'
ExtDiag(idx)%desc = 'total liquid water path from cloud fraction scheme'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%lwp_fc(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'iwp_fc'
ExtDiag(idx)%desc = 'total ice water path from cloud fraction scheme'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%iwp_fc(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'ALBDO_ave'
Expand Down Expand Up @@ -200,7 +272,6 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%dlwsfci(:)
enddo


idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'ULWRF'
Expand All @@ -215,6 +286,45 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ulwsfc(:)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'DSWRFItoa'
ExtDiag(idx)%desc = 'instantaneous top of atmos downward shortwave flux'
ExtDiag(idx)%unit = 'W/m**2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%cnvfac = cn_one
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%fluxr(:,23)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'USWRFItoa'
ExtDiag(idx)%desc = 'instantaneous top of atmos upward shortwave flux'
ExtDiag(idx)%unit = 'W/m**2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%cnvfac = cn_one
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%fluxr(:,2)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'ULWRFItoa'
ExtDiag(idx)%desc = 'instantaneous top of atmos upward longwave flux'
ExtDiag(idx)%unit = 'W/m**2'
ExtDiag(idx)%mod_name = 'gfs_phys'
ExtDiag(idx)%cnvfac = cn_one
ExtDiag(idx)%intpl_method = 'bilinear'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%fluxr(:,1)
enddo

idx = idx + 1
ExtDiag(idx)%axes = 2
ExtDiag(idx)%name = 'ULWRFI'
Expand Down

0 comments on commit 283bd50

Please sign in to comment.