From 283bd5005ef0c922198654fb6c4751e7f63b2c89 Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Fri, 10 Dec 2021 07:39:06 -0700 Subject: [PATCH] New Thompson cloud fraction (updated subroutine cal_cldfra3) (#432) 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. --- ccpp/data/GFS_typedefs.F90 | 22 ++++++- ccpp/data/GFS_typedefs.meta | 42 ++++++++++++ ccpp/driver/GFS_diagnostics.F90 | 112 +++++++++++++++++++++++++++++++- ccpp/physics | 2 +- 4 files changed, 174 insertions(+), 4 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 7df223ee8..541d34e18 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -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 @@ -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 @@ -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 @@ -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. diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 0c5f943ef..213338275 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -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 diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index d8c77176d..8d9e67cdb 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -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' @@ -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' @@ -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' diff --git a/ccpp/physics b/ccpp/physics index cbc7e3662..fb752d447 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cbc7e3662373c19d63b226065243f694e1755814 +Subproject commit fb752d4475044bdc332619b5280f116369b64c04