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