diff --git a/schemes/pumas/micro_pumas_ccpp_dimensions_post.F90 b/schemes/pumas/micro_pumas_ccpp_dimensions_post.F90
index fd92c24e..5403cae6 100644
--- a/schemes/pumas/micro_pumas_ccpp_dimensions_post.F90
+++ b/schemes/pumas/micro_pumas_ccpp_dimensions_post.F90
@@ -11,7 +11,7 @@ module micro_pumas_ccpp_dimensions_post
!> \section arg_table_micro_pumas_ccpp_dimensions_post_run Argument Table
!! \htmlinclude micro_pumas_ccpp_dimensions_post_run.html
subroutine micro_pumas_ccpp_dimensions_post_run(ncol, micro_ncol, nlev, micro_nlev, &
- nlevp1, micro_nlevp1, pint, pumas_pint, qcsinksum_rate1ord, pumas_qcsinksum_rate1ord, airT_tend, &
+ nlevp1, micro_nlevp1, trop_cloud_top_lev, qcsinksum_rate1ord, pumas_qcsinksum_rate1ord, airT_tend, &
pumas_airT_tend, airq_tend, pumas_airq_tend, &
cldliq_tend, pumas_cldliq_tend, cldice_tend, pumas_cldice_tend, numliq_tend, &
pumas_numliq_tend, numice_tend, pumas_numice_tend, rainliq_tend, pumas_rainliq_tend, &
@@ -51,8 +51,9 @@ subroutine micro_pumas_ccpp_dimensions_post_run(ncol, micro_ncol, nlev, micro_nl
integer, intent(in) :: nlevp1
! microphysics vertical interface dimension
integer, intent(in) :: micro_nlevp1
+ ! index of the top model level for which cloud physics is applied (1 to nlev)
+ integer, intent(in) :: trop_cloud_top_lev
- real(pumas_r8), intent(in) :: pumas_pint(:,:)
!microphysics direct conversion rate of stratiform cloud water to precipitation (s-1)
real(pumas_r8), intent(in) :: pumas_qcsinksum_rate1ord(:, :)
!microphysics tendency of dry air enthalpy at constant pressure (J kg-1 s-1)
@@ -194,7 +195,6 @@ subroutine micro_pumas_ccpp_dimensions_post_run(ncol, micro_ncol, nlev, micro_nl
!microphysics rain evaporation rate wrt moist air and condensed water (kg kg-1 s-1)
real(pumas_r8), intent(in) :: pumas_rain_evap(:, :)
- real(kind_phys), intent(out ) :: pint(:,:)
!direct conversion rate of stratiform cloud water to precipitation (s-1)
real(kind_phys), intent(out) :: qcsinksum_rate1ord(:, :)
!tendency of dry air enthalpy at constant pressure (J kg-1 s-1)
@@ -343,79 +343,147 @@ subroutine micro_pumas_ccpp_dimensions_post_run(ncol, micro_ncol, nlev, micro_nl
errcode = 0
errmsg = ''
- pint(:,:micro_nlevp1) = pumas_pint(:ncol,:)
- qcsinksum_rate1ord(:,:micro_nlev) = pumas_qcsinksum_rate1ord(:ncol,:)
- airT_tend(:,:micro_nlev) = pumas_airT_tend(:ncol,:)
- airq_tend(:,:micro_nlev) = pumas_airq_tend(:ncol,:)
- cldliq_tend(:,:micro_nlev) = pumas_cldliq_tend(:ncol,:)
- cldice_tend(:,:micro_nlev) = pumas_cldice_tend(:ncol,:)
- numliq_tend(:,:micro_nlev) = pumas_numliq_tend(:ncol,:)
- numice_tend(:,:micro_nlev) = pumas_numice_tend(:ncol,:)
- rainliq_tend(:,:micro_nlev) = pumas_rainliq_tend(:ncol,:)
- snowice_tend(:,:micro_nlev) = pumas_snowice_tend(:ncol,:)
- numliq_tend(:,:micro_nlev) = pumas_numliq_tend(:ncol,:)
- numice_tend(:,:micro_nlev) = pumas_numice_tend(:ncol,:)
- numrain_tend(:,:micro_nlev) = pumas_numrain_tend(:ncol,:)
- numsnow_tend(:,:micro_nlev) = pumas_numsnow_tend(:ncol,:)
- graupice_tend(:,:micro_nlev) = pumas_graupice_tend(:ncol,:)
- numgraup_tend(:,:micro_nlev) = pumas_numgraup_tend(:ncol,:)
- effc(:,:micro_nlev) = pumas_effc(:ncol,:)
- effc_fn(:,:micro_nlev) = pumas_effc_fn(:ncol,:)
- effi(:,:micro_nlev) = pumas_effi(:ncol,:)
- sadice(:,:micro_nlev) = pumas_sadice(:ncol,:)
- sadsnow(:,:micro_nlev) = pumas_sadsnow(:ncol,:)
+ ! Copy PUMAS outputs (levels 1:micro_nlev) back onto host levels trop_cloud_top_lev:nlev.
+ qcsinksum_rate1ord(:,trop_cloud_top_lev:) = pumas_qcsinksum_rate1ord(:ncol,:)
+ airT_tend(:,trop_cloud_top_lev:) = pumas_airT_tend(:ncol,:)
+ airq_tend(:,trop_cloud_top_lev:) = pumas_airq_tend(:ncol,:)
+ cldliq_tend(:,trop_cloud_top_lev:) = pumas_cldliq_tend(:ncol,:)
+ cldice_tend(:,trop_cloud_top_lev:) = pumas_cldice_tend(:ncol,:)
+ numliq_tend(:,trop_cloud_top_lev:) = pumas_numliq_tend(:ncol,:)
+ numice_tend(:,trop_cloud_top_lev:) = pumas_numice_tend(:ncol,:)
+ rainliq_tend(:,trop_cloud_top_lev:) = pumas_rainliq_tend(:ncol,:)
+ snowice_tend(:,trop_cloud_top_lev:) = pumas_snowice_tend(:ncol,:)
+ numrain_tend(:,trop_cloud_top_lev:) = pumas_numrain_tend(:ncol,:)
+ numsnow_tend(:,trop_cloud_top_lev:) = pumas_numsnow_tend(:ncol,:)
+ graupice_tend(:,trop_cloud_top_lev:) = pumas_graupice_tend(:ncol,:)
+ numgraup_tend(:,trop_cloud_top_lev:) = pumas_numgraup_tend(:ncol,:)
+ effc(:,trop_cloud_top_lev:) = pumas_effc(:ncol,:)
+ effc_fn(:,trop_cloud_top_lev:) = pumas_effc_fn(:ncol,:)
+ effi(:,trop_cloud_top_lev:) = pumas_effi(:ncol,:)
+ sadice(:,trop_cloud_top_lev:) = pumas_sadice(:ncol,:)
+ sadsnow(:,trop_cloud_top_lev:) = pumas_sadsnow(:ncol,:)
prect(:) = pumas_prect(:ncol)
preci(:) = pumas_preci(:ncol)
- prec_evap(:,:micro_nlev) = pumas_prec_evap(:ncol,:)
- am_evap_st(:,:micro_nlev) = pumas_am_evap_st(:ncol,:)
- prec_prod(:,:micro_nlev) = pumas_prec_prod(:ncol,:)
- cmeice(:,:micro_nlev) = pumas_cmeice(:ncol,:)
- deffi(:,:micro_nlev) = pumas_deffi(:ncol,:)
- pgamrad(:,:micro_nlev) = pumas_pgamrad(:ncol,:)
- lamcrad(:,:micro_nlev) = pumas_lamcrad(:ncol,:)
- snowice_in_prec(:,:micro_nlev) = pumas_snowice_in_prec(:ncol,:)
- scaled_diam_snow(:,:micro_nlev) = pumas_scaled_diam_snow(:ncol,:)
- graupice_in_prec(:,:micro_nlev) = pumas_graupice_in_prec(:ncol,:)
- numgraup_vol_in_prec(:,:micro_nlev) = pumas_numgraup_vol_in_prec(:ncol,:)
- scaled_diam_graup(:,:micro_nlev) = pumas_scaled_diam_graup(:ncol,:)
- lflx(:,:micro_nlevp1) = pumas_lflx(:ncol,:)
- iflx(:,:micro_nlevp1) = pumas_iflx(:ncol,:)
- gflx(:,:micro_nlevp1) = pumas_gflx(:ncol,:)
- rflx(:,:micro_nlevp1) = pumas_rflx(:ncol,:)
- sflx(:,:micro_nlevp1) = pumas_sflx(:ncol,:)
- rainliq_in_prec(:,:micro_nlev) = pumas_rainliq_in_prec(:ncol,:)
- reff_rain(:,:micro_nlev) = pumas_reff_rain(:ncol,:)
- reff_snow(:,:micro_nlev) = pumas_reff_snow(:ncol,:)
- reff_grau(:,:micro_nlev) = pumas_reff_grau(:ncol,:)
- numrain_vol_in_prec(:,:micro_nlev) = pumas_numrain_vol_in_prec(:ncol,:)
- numsnow_vol_in_prec(:,:micro_nlev) = pumas_numsnow_vol_in_prec(:ncol,:)
- refl(:,:micro_nlev) = pumas_refl(:ncol,:)
- arefl(:,:micro_nlev) = pumas_arefl(:ncol,:)
- areflz(:,:micro_nlev) = pumas_areflz(:ncol,:)
- frefl(:,:micro_nlev) = pumas_frefl(:ncol,:)
- csrfl(:,:micro_nlev) = pumas_csrfl(:ncol,:)
- acsrfl(:,:micro_nlev) = pumas_acsrfl(:ncol,:)
- fcsrfl(:,:micro_nlev) = pumas_fcsrfl(:ncol,:)
- refl10cm(:,:micro_nlev) = pumas_refl10cm(:ncol,:)
- reflz10cm(:,:micro_nlev) = pumas_reflz10cm(:ncol,:)
- rercld(:,:micro_nlev) = pumas_rercld(:ncol,:)
- ncai(:,:micro_nlev) = pumas_ncai(:ncol,:)
- ncal(:,:micro_nlev) = pumas_ncal(:ncol,:)
- rainliq(:,:micro_nlev) = pumas_rainliq(:ncol,:)
- snowice(:,:micro_nlev) = pumas_snowice(:ncol,:)
- numrain_vol(:,:micro_nlev) = pumas_numrain_vol(:ncol,:)
- numsnow_vol(:,:micro_nlev) = pumas_numsnow_vol(:ncol,:)
- diam_rain(:,:micro_nlev) = pumas_diam_rain(:ncol,:)
- diam_snow(:,:micro_nlev) = pumas_diam_snow(:ncol,:)
- graupice(:,:micro_nlev) = pumas_graupice(:ncol,:)
- numgraup_vol(:,:micro_nlev) = pumas_numgraup_vol(:ncol,:)
- diam_graup(:,:micro_nlev) = pumas_diam_graup(:ncol,:)
- freq_graup(:,:micro_nlev) = pumas_freq_graup(:ncol,:)
- freq_snow(:,:micro_nlev) = pumas_freq_graup(:ncol,:)
- freq_rain(:,:micro_nlev) = pumas_freq_rain(:ncol,:)
- frac_ice(:,:micro_nlev) = pumas_frac_ice(:ncol,:)
- frac_cldliq_tend(:,:micro_nlev) = pumas_frac_cldliq_tend(:ncol,:)
- rain_evap(:,:micro_nlev) = pumas_rain_evap(:ncol,:)
+ prec_evap(:,trop_cloud_top_lev:) = pumas_prec_evap(:ncol,:)
+ am_evap_st(:,trop_cloud_top_lev:) = pumas_am_evap_st(:ncol,:)
+ prec_prod(:,trop_cloud_top_lev:) = pumas_prec_prod(:ncol,:)
+ cmeice(:,trop_cloud_top_lev:) = pumas_cmeice(:ncol,:)
+ deffi(:,trop_cloud_top_lev:) = pumas_deffi(:ncol,:)
+ pgamrad(:,trop_cloud_top_lev:) = pumas_pgamrad(:ncol,:)
+ lamcrad(:,trop_cloud_top_lev:) = pumas_lamcrad(:ncol,:)
+ snowice_in_prec(:,trop_cloud_top_lev:) = pumas_snowice_in_prec(:ncol,:)
+ scaled_diam_snow(:,trop_cloud_top_lev:) = pumas_scaled_diam_snow(:ncol,:)*1.0e6_kind_phys
+ graupice_in_prec(:,trop_cloud_top_lev:) = pumas_graupice_in_prec(:ncol,:)
+ numgraup_vol_in_prec(:,trop_cloud_top_lev:) = pumas_numgraup_vol_in_prec(:ncol,:)
+ scaled_diam_graup(:,trop_cloud_top_lev:) = pumas_scaled_diam_graup(:ncol,:)
+ lflx(:,trop_cloud_top_lev:) = pumas_lflx(:ncol,:)
+ iflx(:,trop_cloud_top_lev:) = pumas_iflx(:ncol,:)
+ gflx(:,trop_cloud_top_lev:) = pumas_gflx(:ncol,:)
+ rflx(:,trop_cloud_top_lev:) = pumas_rflx(:ncol,:)
+ sflx(:,trop_cloud_top_lev:) = pumas_sflx(:ncol,:)
+ rainliq_in_prec(:,trop_cloud_top_lev:) = pumas_rainliq_in_prec(:ncol,:)
+ reff_rain(:,trop_cloud_top_lev:) = pumas_reff_rain(:ncol,:)
+ reff_snow(:,trop_cloud_top_lev:) = pumas_reff_snow(:ncol,:)
+ reff_grau(:,trop_cloud_top_lev:) = pumas_reff_grau(:ncol,:)
+ numrain_vol_in_prec(:,trop_cloud_top_lev:) = pumas_numrain_vol_in_prec(:ncol,:)
+ numsnow_vol_in_prec(:,trop_cloud_top_lev:) = pumas_numsnow_vol_in_prec(:ncol,:)
+ refl(:,trop_cloud_top_lev:) = pumas_refl(:ncol,:)
+ arefl(:,trop_cloud_top_lev:) = pumas_arefl(:ncol,:)
+ areflz(:,trop_cloud_top_lev:) = pumas_areflz(:ncol,:)
+ frefl(:,trop_cloud_top_lev:) = pumas_frefl(:ncol,:)
+ csrfl(:,trop_cloud_top_lev:) = pumas_csrfl(:ncol,:)
+ acsrfl(:,trop_cloud_top_lev:) = pumas_acsrfl(:ncol,:)
+ fcsrfl(:,trop_cloud_top_lev:) = pumas_fcsrfl(:ncol,:)
+ refl10cm(:,trop_cloud_top_lev:) = pumas_refl10cm(:ncol,:)
+ reflz10cm(:,trop_cloud_top_lev:) = pumas_reflz10cm(:ncol,:)
+ rercld(:,trop_cloud_top_lev:) = pumas_rercld(:ncol,:)
+ ncai(:,trop_cloud_top_lev:) = pumas_ncai(:ncol,:)
+ ncal(:,trop_cloud_top_lev:) = pumas_ncal(:ncol,:)
+ rainliq(:,trop_cloud_top_lev:) = pumas_rainliq(:ncol,:)
+ snowice(:,trop_cloud_top_lev:) = pumas_snowice(:ncol,:)
+ numrain_vol(:,trop_cloud_top_lev:) = pumas_numrain_vol(:ncol,:)
+ numsnow_vol(:,trop_cloud_top_lev:) = pumas_numsnow_vol(:ncol,:)
+ diam_rain(:,trop_cloud_top_lev:) = pumas_diam_rain(:ncol,:)
+ diam_snow(:,trop_cloud_top_lev:) = pumas_diam_snow(:ncol,:)
+ graupice(:,trop_cloud_top_lev:) = pumas_graupice(:ncol,:)
+ numgraup_vol(:,trop_cloud_top_lev:) = pumas_numgraup_vol(:ncol,:)
+ diam_graup(:,trop_cloud_top_lev:) = pumas_diam_graup(:ncol,:)
+ freq_graup(:,trop_cloud_top_lev:) = pumas_freq_graup(:ncol,:)
+ freq_snow(:,trop_cloud_top_lev:) = pumas_freq_snow(:ncol,:)
+ freq_rain(:,trop_cloud_top_lev:) = pumas_freq_rain(:ncol,:)
+ frac_ice(:,trop_cloud_top_lev:) = pumas_frac_ice(:ncol,:)
+ frac_cldliq_tend(:,trop_cloud_top_lev:) = pumas_frac_cldliq_tend(:ncol,:)
+ rain_evap(:,trop_cloud_top_lev:) = pumas_rain_evap(:ncol,:)
+
+ ! Zero the levels above the microphysics range (1:trop_cloud_top_lev-1)
+ qcsinksum_rate1ord(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ airT_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ airq_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ cldliq_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ cldice_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numliq_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numice_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rainliq_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ snowice_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numrain_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numsnow_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ graupice_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numgraup_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ effc(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ effc_fn(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ effi(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ sadice(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ sadsnow(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ prec_evap(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ am_evap_st(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ prec_prod(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ cmeice(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ deffi(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ pgamrad(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ lamcrad(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ snowice_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ scaled_diam_snow(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ graupice_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numgraup_vol_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ scaled_diam_graup(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ lflx(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ iflx(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ gflx(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rflx(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ sflx(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rainliq_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ reff_rain(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ reff_snow(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ reff_grau(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numrain_vol_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numsnow_vol_in_prec(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ refl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ arefl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ areflz(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ frefl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ csrfl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ acsrfl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ fcsrfl(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ refl10cm(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ reflz10cm(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rercld(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ ncai(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ ncal(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rainliq(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ snowice(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numrain_vol(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numsnow_vol(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ diam_rain(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ diam_snow(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ graupice(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ numgraup_vol(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ diam_graup(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ freq_graup(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ freq_snow(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ freq_rain(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ frac_ice(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ frac_cldliq_tend(:,:trop_cloud_top_lev-1) = 0._kind_phys
+ rain_evap(:,:trop_cloud_top_lev-1) = 0._kind_phys
end subroutine micro_pumas_ccpp_dimensions_post_run
diff --git a/schemes/pumas/micro_pumas_ccpp_dimensions_post.meta b/schemes/pumas/micro_pumas_ccpp_dimensions_post.meta
index 0e64c186..728d9479 100644
--- a/schemes/pumas/micro_pumas_ccpp_dimensions_post.meta
+++ b/schemes/pumas/micro_pumas_ccpp_dimensions_post.meta
@@ -52,21 +52,11 @@
dimensions = ()
type = integer
intent = in
-[pint]
- standard_name = air_pressure_at_interface
- long_name = air pressure at interface
- units = Pa
- dimensions = (horizontal_loop_extent, vertical_interface_dimension)
- type = real
- kind = kind_phys
- intent = out
-[pumas_pint]
- standard_name = pumas_air_pressure_at_interface
- long_name = pumas air pressure at interface
- units = Pa
- dimensions = (microphysics_horizontal_loop_extent, microphysics_vertical_interface_dimension)
- type = real
- kind = pumas_r8
+[trop_cloud_top_lev]
+ standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
+ units = index
+ type = integer
+ dimensions = ()
intent = in
[qcsinksum_rate1ord]
standard_name = direct_conversion_rate_of_stratiform_cloud_water_to_precipitation_for_scavenging
@@ -464,7 +454,7 @@
kind = pumas_r8
intent = in
[deffi]
- standard_name = effective_diameter_of_stratiform_cloud_ice_crystals_for_radiation
+ standard_name = effective_diameter_of_stratiform_cloud_ice_crystal_for_radiation
long_name = effective diameter of stratiform cloud ice particles for radiation
units = um
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
@@ -528,10 +518,9 @@
kind = pumas_r8
intent = in
[scaled_diam_snow]
- standard_name = effective_diameter_of_stratiform_snow_particle_for_radiation
+ standard_name = effective_diameter_of_stratiform_snow_crystal_for_radiation
long_name = snow scaled diameter
- #rrtmgp takes um and the CCPP framework will convert from m
- units = m
+ units = um
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
type = real
kind = kind_phys
diff --git a/schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90 b/schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90
index c69a1aac..67b1fca5 100644
--- a/schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90
+++ b/schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90
@@ -43,6 +43,7 @@ end subroutine micro_pumas_ccpp_dimensions_pre_init
!> \section arg_table_micro_pumas_ccpp_dimensions_pre_run Argument Table
!! \htmlinclude micro_pumas_ccpp_dimensions_pre_run.html
subroutine micro_pumas_ccpp_dimensions_pre_run(ncol, nlev, nlevp1, &
+ trop_cloud_top_lev, &
micro_ncol, micro_nlev, micro_nlevp1, micro_dust_nbins,&
airT_in, pumas_airT, airq_in, pumas_airq, &
cldliq_in, pumas_cldliq, &
@@ -81,6 +82,8 @@ subroutine micro_pumas_ccpp_dimensions_pre_run(ncol, nlev, nlevp1,
integer, intent(in) :: ncol
integer, intent(in) :: nlev
integer, intent(in) :: nlevp1
+ integer, intent(in) :: trop_cloud_top_lev !Index of the top model level for which
+ !cloud physics is applied (1 to nlev)
!PUMAS dimensions/parameters:
integer, intent(in) :: micro_ncol !Number of horizontal microphysics columns (count)
@@ -194,43 +197,43 @@ subroutine micro_pumas_ccpp_dimensions_pre_run(ncol, nlev, nlevp1,
pumas_timestep = dtime/micro_mg_num_steps
-!+ IH
-! For now we just use ncols = micro_ncol, but we need to constrain the vertical extent for the microphysical fields.
-! Therefore micro_xxx(:ncol,:) = xxx(:,::)
-!- IH
- pumas_airT(:ncol,:) = real(airT_in(:,:), pumas_r8)
- pumas_airq(:ncol,:) = real(airq_in(:,:), pumas_r8)
- pumas_cldliq(:ncol,:) = real(cldliq_in(:,:), pumas_r8)
- pumas_cldice(:ncol,:) = real(cldice_in(:,:), pumas_r8)
- pumas_numliq(:ncol,:) = real(numliq_in(:,:), pumas_r8)
- pumas_numice(:ncol,:) = real(numice_in(:,:), pumas_r8)
- pumas_rainliq(:ncol,:) = real(rainliq_in(:,:), pumas_r8)
- pumas_snowice(:ncol,:) = real(snowice_in(:,:), pumas_r8)
- pumas_numrain(:ncol,:) = real(numrain_in(:,:), pumas_r8)
- pumas_numsnow(:ncol,:) = real(numsnow_in(:,:), pumas_r8)
- pumas_graupice(:ncol,:) = real(graupice_in(:,:), pumas_r8)
- pumas_numgraup(:ncol,:) = real(numgraup_in(:,:), pumas_r8)
- pumas_relvar(:ncol,:) = real(relvar_in(:,:), pumas_r8)
- pumas_accre_enhan(:ncol,:) = real(accre_enhan_in(:,:), pumas_r8)
- pumas_pmid(:ncol,:) = real(pmid_in(:,:), pumas_r8)
- pumas_pdel(:ncol,:) = real(pdel_in(:,:), pumas_r8)
- pumas_pint(:ncol,:) = real(pint_in(:,:micro_nlevp1), pumas_r8)
- pumas_strat_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
+! Microphysics runs only over levels trop_cloud_top_lev:nlev (the bottom micro_nlev
+! layers of the top-down indexed column). Slice each host input onto that range, so
+! pumas_xxx(:ncol,:) receives host levels trop_cloud_top_lev:nlev. Mirrors CAM
+! micro_pumas_cam.F90, which passes every field as xxx(:ncol,top_lev:).
+ pumas_airT(:ncol,:) = real(airT_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_airq(:ncol,:) = real(airq_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_cldliq(:ncol,:) = real(cldliq_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_cldice(:ncol,:) = real(cldice_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numliq(:ncol,:) = real(numliq_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numice(:ncol,:) = real(numice_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_rainliq(:ncol,:) = real(rainliq_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_snowice(:ncol,:) = real(snowice_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numrain(:ncol,:) = real(numrain_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numsnow(:ncol,:) = real(numsnow_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_graupice(:ncol,:) = real(graupice_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numgraup(:ncol,:) = real(numgraup_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_relvar(:ncol,:) = real(relvar_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_accre_enhan(:ncol,:) = real(accre_enhan_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_pmid(:ncol,:) = real(pmid_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_pdel(:ncol,:) = real(pdel_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_pint(:ncol,:) = real(pint_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_strat_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
! PUMAS uses total stratiform fraction for both liquid and ice stratus.
! Mirrors CAM micro_pumas_cam.F90: alst_mic => ast; aist_mic => ast.
- pumas_strat_liq_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
- pumas_strat_ice_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
- pumas_qsatfac(:ncol,:) = real(qsatfac_in(:,:), pumas_r8)
- pumas_naai(:ncol,:) = real(naai_in(:,:), pumas_r8)
- pumas_npccn(:ncol,:) = real(npccn_in(:,:), pumas_r8)
- pumas_rndst(:ncol,:,:) = real(rndst_in(:,:micro_nlev,:), pumas_r8)
- pumas_nacon(:ncol,:,:) = real(nacon_in(:,:micro_nlev,:), pumas_r8)
- pumas_snowice_tend_external(:ncol,:) = real(snowice_tend_external_in(:,:), pumas_r8)
- pumas_numsnow_tend_external(:ncol,:) = real(numsnow_tend_external_in(:,:), pumas_r8)
- pumas_effi_external(:ncol,:) = real(effi_external_in(:,:), pumas_r8)
- pumas_frzcnt(:ncol,:) = real(frzcnt_in(:,:), pumas_r8)
- pumas_frzdep(:ncol,:) = real(frzdep_in(:,:), pumas_r8)
- pumas_frzimm(:ncol,:) = real(frzimm_in(:,:), pumas_r8)
+ pumas_strat_liq_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_strat_ice_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_qsatfac(:ncol,:) = real(qsatfac_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_naai(:ncol,:) = real(naai_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_npccn(:ncol,:) = real(npccn_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_rndst(:ncol,:,:) = real(rndst_in(:,trop_cloud_top_lev:,:), pumas_r8)
+ pumas_nacon(:ncol,:,:) = real(nacon_in(:,trop_cloud_top_lev:,:), pumas_r8)
+ pumas_snowice_tend_external(:ncol,:) = real(snowice_tend_external_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_numsnow_tend_external(:ncol,:) = real(numsnow_tend_external_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_effi_external(:ncol,:) = real(effi_external_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_frzcnt(:ncol,:) = real(frzcnt_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_frzdep(:ncol,:) = real(frzdep_in(:,trop_cloud_top_lev:), pumas_r8)
+ pumas_frzimm(:ncol,:) = real(frzimm_in(:,trop_cloud_top_lev:), pumas_r8)
end subroutine micro_pumas_ccpp_dimensions_pre_run
diff --git a/schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta b/schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta
index c86d2ffa..a99d07eb 100644
--- a/schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta
+++ b/schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta
@@ -102,6 +102,12 @@
dimensions = ()
type = integer
intent = in
+[trop_cloud_top_lev]
+ standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
+ units = index
+ type = integer
+ dimensions = ()
+ intent = in
[micro_ncol]
#Equivalent to "horizontal_loop_extent" unless subcolumns is enabled
standard_name = microphysics_horizontal_loop_extent
@@ -581,9 +587,9 @@
intent = out
[effi_external_in]
- standard_name = effective_radius_of_stratiform_cloud_ice_crystal
+ standard_name = effective_radius_of_stratiform_cloud_ice_crystal_from_external_microphysics
long_name = effective radius of stratiform cloud ice particle from external microphysics
- units = um
+ units = m
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
type = real
kind = kind_phys
@@ -591,7 +597,7 @@
[pumas_effi_external]
standard_name = pumas_effective_radius_of_stratiform_cloud_ice_crystal_from_external_microphysics
long_name = microphysics effective radius of stratiform cloud ice particle from external microphysics
- units = um
+ units = m
dimensions = (microphysics_horizontal_loop_extent, microphysics_vertical_layer_dimension)
type = real
kind = pumas_r8
diff --git a/schemes/pumas/micro_pumas_ccpp_optics_limiter.F90 b/schemes/pumas/micro_pumas_ccpp_optics_limiter.F90
new file mode 100644
index 00000000..54f876b3
--- /dev/null
+++ b/schemes/pumas/micro_pumas_ccpp_optics_limiter.F90
@@ -0,0 +1,60 @@
+module micro_pumas_ccpp_optics_limiter
+
+ use ccpp_kinds, only: kind_phys
+
+ implicit none
+ private
+
+ public :: micro_pumas_ccpp_optics_limiter_run
+
+ !Convective size distribution parameters, used in place of the stratiform
+ !parameters where the stratiform cloud fraction is negligible.
+ !Mirrors CAM micro_pumas_cam.F90.
+ real(kind_phys), parameter :: dcon = 25.e-6_kind_phys !Convective size distribution effective radius (m)
+ real(kind_phys), parameter :: mucon = 5.3_kind_phys !Convective size distribution shape parameter (1)
+ real(kind_phys), parameter :: deicon = 50._kind_phys !Convective ice effective diameter (um)
+
+ !Stratiform cloud fraction below which the stratiform size distribution is
+ !discarded. PUMAS divides cloud water by the cloud fraction to obtain the
+ !in-cloud values these parameters are derived from, so as the cloud fraction
+ !vanishes the slope and diameters it produces grow without bound.
+ real(kind_phys), parameter :: cldfrc_min = 1.e-4_kind_phys
+
+contains
+ !> \section arg_table_micro_pumas_ccpp_optics_limiter_run Argument Table
+ !! \htmlinclude micro_pumas_ccpp_optics_limiter_run.html
+ subroutine micro_pumas_ccpp_optics_limiter_run(ncol, nlev, trop_cloud_top_lev, &
+ strat_cldfrc, pgamrad, lamcrad, deffi, errmsg, errcode)
+
+ integer, intent(in) :: ncol !Number of horizontal columns (count)
+ integer, intent(in) :: nlev !Number of vertical layers (count)
+ integer, intent(in) :: trop_cloud_top_lev !Index of the top model level for which
+ !tropospheric cloud physics is run (index)
+ real(kind_phys), intent(in) :: strat_cldfrc(:, :) !Stratiform cloud area fraction (fraction)
+ real(kind_phys), intent(inout) :: pgamrad(:, :) !Size distribution shape parameter (1)
+ real(kind_phys), intent(inout) :: lamcrad(:, :) !Slope of droplet distribution (m-1)
+ real(kind_phys), intent(inout) :: deffi(:, :) !Effective diameter of cloud ice particle (um)
+ character(len=512), intent(out) :: errmsg !CCPP error message (none)
+ integer, intent(out) :: errcode !CCPP error code (1)
+
+ integer :: i, k
+
+ errmsg = ''
+ errcode = 0
+
+ !lamcrad is an inverse length; it is declared dimensionless in the metadata
+ !to match the RRTMGP and host declarations, so dcon must stay in meters for
+ !the value handed to radiation to be consistent with CAM.
+ do k = trop_cloud_top_lev, nlev
+ do i = 1, ncol
+ if (strat_cldfrc(i, k) < cldfrc_min) then
+ pgamrad(i, k) = mucon
+ lamcrad(i, k) = (mucon + 1._kind_phys) / dcon
+ deffi(i, k) = deicon
+ end if
+ end do
+ end do
+
+ end subroutine micro_pumas_ccpp_optics_limiter_run
+
+end module micro_pumas_ccpp_optics_limiter
diff --git a/schemes/pumas/micro_pumas_ccpp_optics_limiter.meta b/schemes/pumas/micro_pumas_ccpp_optics_limiter.meta
new file mode 100644
index 00000000..14ad1025
--- /dev/null
+++ b/schemes/pumas/micro_pumas_ccpp_optics_limiter.meta
@@ -0,0 +1,77 @@
+[ccpp-table-properties]
+ name = micro_pumas_ccpp_optics_limiter
+ type = scheme
+########################################################################
+[ccpp-arg-table]
+ name = micro_pumas_ccpp_optics_limiter_run
+ type = scheme
+
+##### Run Arguments
+[ncol]
+ standard_name = horizontal_loop_extent
+ long_name = number of horizontal columns
+ units = count
+ dimensions = ()
+ type = integer
+ intent = in
+[nlev]
+ standard_name = vertical_layer_dimension
+ long_name = vertical layer dimension
+ units = count
+ dimensions = ()
+ type = integer
+ intent = in
+[trop_cloud_top_lev]
+ standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
+ long_name = vertical layer index of troposphere cloud physics top
+ units = index
+ dimensions = ()
+ type = integer
+ intent = in
+[strat_cldfrc]
+ standard_name = stratiform_cloud_area_fraction
+ long_name = stratiform cloud area fraction
+ units = fraction
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+[pgamrad]
+ standard_name = size_distribution_shape_parameter_for_microphysics
+ long_name = cloud particle size distribution shape (gamma) parameter
+ units = 1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = inout
+[lamcrad]
+ standard_name = slope_of_droplet_distribution_for_optics
+ long_name = cloud particle size distribution slope (lambda) parameter
+ units = 1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = inout
+[deffi]
+ standard_name = effective_diameter_of_stratiform_cloud_ice_crystal_for_radiation
+ long_name = effective diameter of stratiform cloud ice particles for radiation
+ units = um
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = inout
+[errmsg]
+ standard_name = ccpp_error_message
+ long_name = error message for error handling in CCPP
+ units = none
+ dimensions = ()
+ type = character
+ kind = len=512
+ intent = out
+[errcode]
+ standard_name = ccpp_error_code
+ long_name = error code for error handling in CCPP
+ units = 1
+ dimensions = ()
+ type = integer
+ intent = out
diff --git a/schemes/pumas/pumas b/schemes/pumas/pumas
index c04b38ad..59cebffc 160000
--- a/schemes/pumas/pumas
+++ b/schemes/pumas/pumas
@@ -1 +1 @@
-Subproject commit c04b38adf4b8c54fe3490e3cab0be8c36053dc52
+Subproject commit 59cebffc735c0298b9afeaf3ce327035b92b617b
diff --git a/schemes/pumas/pumas_post_main.F90 b/schemes/pumas/pumas_post_main.F90
index 66ffd8dd..495dbde6 100644
--- a/schemes/pumas/pumas_post_main.F90
+++ b/schemes/pumas/pumas_post_main.F90
@@ -9,33 +9,63 @@ module pumas_post_main
!> \section arg_table_pumas_post_main_run Argument Table
!! \htmlinclude pumas_post_main_run.html
- subroutine pumas_post_main_run(ncol, cldice, numice, strat_cldfrc, effi, errmsg, errcode)
+ subroutine pumas_post_main_run(ncol, nlev, trop_cloud_top_lev, rair, pmid, temp, &
+ cldliq, numliq, cldice, numice, snow, numsnow, graupel, numgraup, &
+ strat_cldfrc, effi, dei, pgam, lamc, des, degrau, errmsg, errcode)
use ccpp_kinds, only: kind_phys
use pumas_kinds, only: pumas_r8=>kind_r8
- use micro_pumas_utils, only: size_dist_param_basic, mg_ice_props, mincld, qsmall
+ use micro_pumas_utils, only: size_dist_param_basic, size_dist_param_liq, &
+ mg_ice_props, mg_liq_props, avg_diameter, &
+ mincld, qsmall, rhog, rhosn, rhows, rhoi
integer, intent(in) :: ncol
+ integer, intent(in) :: nlev
+ integer, intent(in) :: trop_cloud_top_lev ! Index of the top model level for which
+ ! tropospheric cloud physics is run (index)
+ real(kind_phys), intent(in) :: rair ! gas constant of dry air (J kg-1 K-1)
+ real(kind_phys), dimension(:,:), intent(in) :: pmid ! layer midpoint pressure (Pa)
+ real(kind_phys), dimension(:,:), intent(in) :: temp ! air temperature, before microphysics heating is applied (K)
+ real(kind_phys), dimension(:,:), intent(in) :: cldliq ! updated cloud liquid water mixing ratio (kg/kg)
+ real(kind_phys), dimension(:,:), intent(in) :: numliq ! updated cloud droplet number concentration (kg-1)
real(kind_phys), dimension(:,:), intent(in) :: cldice ! updated cloud ice mixing ratio (kg/kg)
real(kind_phys), dimension(:,:), intent(in) :: numice ! updated cloud ice number concentration (kg-1)
+ real(kind_phys), dimension(:,:), intent(in) :: snow ! updated snow mixing ratio (kg/kg)
+ real(kind_phys), dimension(:,:), intent(in) :: numsnow ! updated snow number concentration (kg-1)
+ real(kind_phys), dimension(:,:), intent(in) :: graupel ! updated graupel mixing ratio (kg/kg)
+ real(kind_phys), dimension(:,:), intent(in) :: numgraup ! updated graupel number concentration (kg-1)
real(kind_phys), dimension(:,:), intent(in) :: strat_cldfrc! total stratiform cloud area fraction (= ast)
real(kind_phys), dimension(:,:), intent(out) :: effi ! ice effective radius (micron)
+ real(kind_phys), dimension(:,:), intent(out) :: dei ! ice effective diameter for radiation (micron)
+ real(kind_phys), dimension(:,:), intent(out) :: pgam ! droplet size distribution shape parameter for radiation (1)
+ real(kind_phys), dimension(:,:), intent(out) :: lamc ! droplet size distribution slope for radiation (1)
+ real(kind_phys), dimension(:,:), intent(out) :: des ! snow effective diameter for radiation (micron)
+ real(kind_phys), dimension(:,:), intent(out) :: degrau ! graupel effective diameter for radiation (m)
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errcode
- integer :: k, nlev
- real(pumas_r8) :: icimrst(ncol, size(cldice,2)) ! in-cloud (grid-mean) ice mixing ratio
- real(pumas_r8) :: niic(ncol, size(cldice,2)) ! in-cloud (grid-mean) ice number conc
- real(pumas_r8) :: rei(ncol, size(cldice,2)) ! ice slope param, then effective radius
+ integer :: k
+ real(pumas_r8) :: icimrst(ncol, nlev) ! in-cloud (grid-mean) ice mixing ratio
+ real(pumas_r8) :: niic(ncol, nlev) ! in-cloud (grid-mean) ice number conc
+ real(pumas_r8) :: rei(ncol, nlev) ! ice slope param, then effective radius
+ real(pumas_r8) :: icwmrst(ncol, nlev) ! in-cloud (grid-mean) liquid mixing ratio
+ real(pumas_r8) :: ncic(ncol, nlev) ! in-cloud (grid-mean) droplet number conc
+ real(pumas_r8) :: rho(ncol, nlev) ! air density
+ real(pumas_r8) :: mu(ncol, nlev) ! droplet size distribution shape parameter
+ real(pumas_r8) :: lambdac(ncol, nlev) ! droplet size distribution slope
+ real(pumas_r8) :: qs(ncol, nlev) ! grid-mean snow mixing ratio
+ real(pumas_r8) :: ns(ncol, nlev) ! grid-mean snow number conc
+ real(pumas_r8) :: dsout2(ncol, nlev) ! mean snow particle diameter
+ real(pumas_r8) :: desm(ncol, nlev) ! snow effective diameter (m)
+ real(pumas_r8) :: qg(ncol, nlev) ! grid-mean graupel mixing ratio
+ real(pumas_r8) :: ng(ncol, nlev) ! grid-mean graupel number conc
+ real(pumas_r8) :: dgout2(ncol, nlev) ! mean graupel particle diameter
errmsg = ' '
errcode = 0
- nlev = size(cldice, 2)
-
! Ice effective radius is recomputed here from the post-microphysics
! grid-mean in-cloud ice, NOT from the raw per-substep value PUMAS returns.
! PUMAS uses the total stratiform fraction for ice cloud (icecldf = ast).
- ! Mirrors CAM micro_pumas_cam.F90:2677 (icimrst), :3174 (niic), :3171-3193 (rei).
icimrst(:,:) = min(real(cldice(:ncol,:), pumas_r8) / &
max(mincld, real(strat_cldfrc(:ncol,:), pumas_r8)), 0.005_pumas_r8)
niic(:,:) = real(numice(:ncol,:), pumas_r8) / &
@@ -54,6 +84,74 @@ subroutine pumas_post_main_run(ncol, cldice, numice, strat_cldfrc, effi, errmsg,
effi(:ncol,:) = real(rei(:,:), kind_phys)
+ ! Ice effective diameter for radiation follows from the recomputed
+ ! effective radius.
+ dei(:ncol,:) = real(rei(:,:) * rhoi/rhows * 2._pumas_r8, kind_phys)
+
+ ! Droplet size distribution parameters for radiation are likewise recomputed
+ ! from the post-microphysics grid-mean in-cloud liquid.
+ ! Air density uses the temperature BEFORE the microphysics heating is applied
+ ! The original comment in CAM noted:
+ ! "State instead of state_loc to preserve answers for MG1 (and in any
+ ! case, it is unlikely to make much difference)."
+ ! PUMAS uses the total stratiform fraction for liquid cloud (liqcldf = ast)
+ rho(:,:) = real(pmid(:ncol,:), pumas_r8) / &
+ (real(rair, pumas_r8) * real(temp(:ncol,:), pumas_r8))
+ icwmrst(:,:) = min(real(cldliq(:ncol,:), pumas_r8) / &
+ max(mincld, real(strat_cldfrc(:ncol,:), pumas_r8)), 0.005_pumas_r8)
+ ncic(:,:) = real(numliq(:ncol,:), pumas_r8) / &
+ max(mincld, real(strat_cldfrc(:ncol,:), pumas_r8))
+
+ mu(:,:) = 0._pumas_r8
+ lambdac(:,:) = 0._pumas_r8
+ do k = trop_cloud_top_lev, nlev
+ call size_dist_param_liq(mg_liq_props, icwmrst(:,k), ncic(:,k), rho(:,k), &
+ mu(:,k), lambdac(:,k), ncol)
+ end do
+
+ ! size_dist_param_liq flags no-cloud points with mu = -100 and reset to zero.
+ where (icwmrst(:,trop_cloud_top_lev:) < qsmall)
+ mu(:,trop_cloud_top_lev:) = 0._pumas_r8
+ end where
+
+ pgam(:ncol,:) = real(mu(:,:), kind_phys)
+ lamc(:ncol,:) = real(lambdac(:,:), kind_phys)
+
+ ! Snow effective diameter for radiation, from the post-microphysics grid-mean snow
+ qs(:,:) = real(snow(:ncol,:), pumas_r8)
+ ns(:,:) = real(numsnow(:ncol,:), pumas_r8)
+
+ dsout2(:,:) = 0._pumas_r8
+ desm(:,:) = 0._pumas_r8
+ where (qs(:,trop_cloud_top_lev:) >= 1.e-7_pumas_r8)
+ dsout2(:,trop_cloud_top_lev:) = avg_diameter( &
+ qs(:,trop_cloud_top_lev:), &
+ ns(:,trop_cloud_top_lev:) * rho(:,trop_cloud_top_lev:), &
+ rho(:,trop_cloud_top_lev:), rhosn)
+ desm(:,trop_cloud_top_lev:) = dsout2(:,trop_cloud_top_lev:) * &
+ 3._pumas_r8 * rhosn/rhows
+ end where
+
+ des(:ncol,:) = real(desm(:,:) * 1.e6_pumas_r8, kind_phys)
+
+ ! Graupel effective diameter for radiation, from the post-microphysics grid-mean graupel
+ qg(:,:) = real(graupel(:ncol,:), pumas_r8)
+ ng(:,:) = real(numgraup(:ncol,:), pumas_r8)
+
+ dgout2(:,:) = 0._pumas_r8
+ where (qg(:,trop_cloud_top_lev:) >= 1.e-7_pumas_r8)
+ dgout2(:,trop_cloud_top_lev:) = avg_diameter( &
+ qg(:,trop_cloud_top_lev:), &
+ ng(:,trop_cloud_top_lev:) * rho(:,trop_cloud_top_lev:), &
+ rho(:,trop_cloud_top_lev:), rhog)
+ end where
+
+ degrau(:ncol,:) = 0._kind_phys
+ where (qg(:,trop_cloud_top_lev:) >= 1.e-7_pumas_r8)
+ degrau(:ncol,trop_cloud_top_lev:) = real(dgout2(:,trop_cloud_top_lev:) * &
+ 3._pumas_r8 * rhog/rhows, kind_phys)
+ end where
+
end subroutine pumas_post_main_run
end module pumas_post_main
diff --git a/schemes/pumas/pumas_post_main.meta b/schemes/pumas/pumas_post_main.meta
index 85f89fac..8b6bf62c 100644
--- a/schemes/pumas/pumas_post_main.meta
+++ b/schemes/pumas/pumas_post_main.meta
@@ -13,6 +13,62 @@
dimensions = ()
type = integer
intent = in
+[nlev]
+ standard_name = vertical_layer_dimension
+ long_name = vertical layer dimension
+ units = count
+ dimensions = ()
+ type = integer
+ intent = in
+[trop_cloud_top_lev]
+ standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
+ long_name = vertical layer index of troposphere cloud physics top
+ units = index
+ dimensions = ()
+ type = integer
+ intent = in
+[rair]
+ standard_name = gas_constant_of_dry_air
+ long_name = ideal gas constant for dry air
+ units = J kg-1 K-1
+ dimensions = ()
+ type = real
+ kind = kind_phys
+ intent = in
+[pmid]
+ standard_name = air_pressure
+ long_name = air pressure
+ units = Pa
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+[temp]
+ standard_name = air_temperature
+ long_name = air temperature
+ units = K
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+[cldliq]
+ standard_name = cloud_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water
+ long_name = cloud liquid water mixing ratio wrt moist air and condensed water
+ units = kg kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
+[numliq]
+ standard_name = mass_number_concentration_of_cloud_liquid_water_droplets_in_moist_air_and_condensed_water
+ long_name = mass number concentration of cloud liquid wrt moist air and condensed water
+ units = kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
[cldice]
standard_name = cloud_ice_mixing_ratio_wrt_moist_air_and_condensed_water
long_name = cloud ice mixing ratio wrt moist air and condensed water
@@ -31,6 +87,42 @@
kind = kind_phys
intent = in
advected = true
+[snow]
+ standard_name = snow_mixing_ratio_wrt_moist_air_and_condensed_water
+ long_name = snow mixing ratio wrt moist air and condensed water
+ units = kg kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
+[numsnow]
+ standard_name = mass_number_concentration_of_snow_crystals_in_moist_air_and_condensed_water
+ long_name = mass number concentration of snow wrt moist air and condensed water
+ units = kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
+[graupel]
+ standard_name = graupel_water_mixing_ratio_wrt_moist_air_and_condensed_water
+ long_name = graupel mixing ratio wrt moist air and condensed water
+ units = kg kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
+[numgraup]
+ standard_name = mass_number_concentration_of_graupel_particles_in_moist_air_and_condensed_water
+ long_name = mass number concentration of graupel wrt moist air and condensed water
+ units = kg-1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = in
+ advected = true
[strat_cldfrc]
standard_name = stratiform_cloud_area_fraction
long_name = stratiform cloud area fraction
@@ -47,6 +139,46 @@
type = real
kind = kind_phys
intent = out
+[dei]
+ standard_name = effective_diameter_of_stratiform_cloud_ice_crystal_for_radiation
+ long_name = effective diameter of stratiform cloud ice particles for radiation
+ units = um
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = out
+[pgam]
+ standard_name = size_distribution_shape_parameter_for_microphysics
+ long_name = cloud particle size distribution shape (gamma) parameter
+ units = 1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = out
+[lamc]
+ standard_name = slope_of_droplet_distribution_for_optics
+ long_name = cloud particle size distribution slope (lambda) parameter
+ units = 1
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = out
+[des]
+ standard_name = effective_diameter_of_stratiform_snow_crystal_for_radiation
+ long_name = effective diameter of stratiform snow particles for radiation
+ units = um
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = out
+[degrau]
+ standard_name = effective_diameter_of_stratiform_cloud_graupel_particle_for_radiation
+ long_name = effective diameter of stratiform graupel particles for radiation
+ units = m
+ dimensions = (horizontal_loop_extent, vertical_layer_dimension)
+ type = real
+ kind = kind_phys
+ intent = out
[errmsg]
standard_name = ccpp_error_message
long_name = error message for error handling in CCPP
diff --git a/schemes/utilities/clamp_number_concentrations.F90 b/schemes/utilities/clamp_number_concentrations.F90
index a581592f..95fc1a64 100644
--- a/schemes/utilities/clamp_number_concentrations.F90
+++ b/schemes/utilities/clamp_number_concentrations.F90
@@ -28,11 +28,11 @@ module clamp_number_concentrations
real(kind_phys), parameter :: qmax = 1.0e10_kind_phys ! maximum number concentration [kg-1]
! Standard names for each species (order matches ix_ variables above)
- character(len=128), parameter :: std_names(num_species) = &
- (/'mass_number_concentration_of_cloud_liquid_water_droplets_in_moist_air_and_condensed_water', &
- 'mass_number_concentration_of_rain_drops_in_moist_air_and_condensed_water ', &
- 'mass_number_concentration_of_ice_wrt_moist_air_and_condensed_water ', &
- 'mass_number_concentration_of_snow_crystals_in_moist_air_and_condensed_water '/)
+ character(len=*), parameter :: std_names(num_species) = &
+ [character(len=128) :: 'mass_number_concentration_of_cloud_liquid_water_droplets_in_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_rain_drops_in_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_ice_wrt_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_snow_crystals_in_moist_air_and_condensed_water']
contains
diff --git a/test/test_schemes/initialize_constituents.F90 b/test/test_schemes/initialize_constituents.F90
index 86566ea1..eb3679b0 100644
--- a/test/test_schemes/initialize_constituents.F90
+++ b/test/test_schemes/initialize_constituents.F90
@@ -35,13 +35,13 @@ subroutine initialize_constituents_register(constituents, errmsg, errcode)
character(len=512) :: alloc_err_msg
character(len=256), allocatable :: constituent_names(:)
character(len=256), allocatable :: const_diag_names(:)
- character(len=65), parameter :: water_species_std_names(6) = &
- ['water_vapor_mixing_ratio_wrt_moist_air_and_condensed_water ', &
- 'cloud_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water', &
- 'rain_mixing_ratio_wrt_moist_air_and_condensed_water ', &
- 'cloud_ice_mixing_ratio_wrt_moist_air_and_condensed_water ', &
- 'snow_mixing_ratio_wrt_moist_air_and_condensed_water ', &
- 'graupel_water_mixing_ratio_wrt_moist_air_and_condensed_water ']
+ character(len=*), parameter :: water_species_std_names(*) = &
+ [character(len=128) :: 'water_vapor_mixing_ratio_wrt_moist_air_and_condensed_water', &
+ 'cloud_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water', &
+ 'rain_mixing_ratio_wrt_moist_air_and_condensed_water', &
+ 'cloud_ice_mixing_ratio_wrt_moist_air_and_condensed_water', &
+ 'snow_mixing_ratio_wrt_moist_air_and_condensed_water', &
+ 'graupel_water_mixing_ratio_wrt_moist_air_and_condensed_water']
character(len=11), parameter :: const_file_names(6) = &
['cnst_Q ', &
@@ -56,12 +56,12 @@ subroutine initialize_constituents_register(constituents, errmsg, errcode)
'cnst_NUMICE', &
'cnst_NUMSNO', &
'cnst_NUMGRA']
- character(len=128), parameter :: water_species_number_std_names(5) = &
- ['mass_number_concentration_of_cloud_liquid_water_droplets_in_moist_air_and_condensed_water', &
- 'mass_number_concentration_of_rain_drops_in_moist_air_and_condensed_water ', &
- 'mass_number_concentration_of_ice_wrt_moist_air_and_condensed_water ', &
- 'mass_number_concentration_of_snow_crystals_in_moist_air_and_condensed_water ', &
- 'mass_number_concentration_of_graupel_particles_in_moist_air_and_condensed_water ']
+ character(len=*), parameter :: water_species_number_std_names(*) = &
+ [character(len=128) :: 'mass_number_concentration_of_cloud_liquid_water_droplets_in_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_rain_drops_in_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_ice_wrt_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_snow_crystals_in_moist_air_and_condensed_water', &
+ 'mass_number_concentration_of_graupel_particles_in_moist_air_and_condensed_water']
errcode = 0
errmsg = ''
diff --git a/test/test_suites/suite_pumas.xml b/test/test_suites/suite_pumas.xml
index bcb605f5..69433dc1 100644
--- a/test/test_suites/suite_pumas.xml
+++ b/test/test_suites/suite_pumas.xml
@@ -21,10 +21,13 @@
apply_constituent_tendencies
clamp_number_concentrations
+
+ pumas_post_main
+ micro_pumas_ccpp_optics_limiter
apply_heating_rate
-
+ qneg
geopotential_temp
-
- pumas_post_main