Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
216 changes: 142 additions & 74 deletions schemes/pumas/micro_pumas_ccpp_dimensions_post.F90

Large diffs are not rendered by default.

27 changes: 8 additions & 19 deletions schemes/pumas/micro_pumas_ccpp_dimensions_post.meta
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
73 changes: 38 additions & 35 deletions schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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, &
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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

Expand Down
12 changes: 9 additions & 3 deletions schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -581,17 +587,17 @@
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
intent = in
[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
Expand Down
60 changes: 60 additions & 0 deletions schemes/pumas/micro_pumas_ccpp_optics_limiter.F90
Original file line number Diff line number Diff line change
@@ -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
77 changes: 77 additions & 0 deletions schemes/pumas/micro_pumas_ccpp_optics_limiter.meta
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion schemes/pumas/pumas
Loading
Loading