Skip to content

Commit e2f5ec2

Browse files
authored
Merge pull request #3 from jimmielin/pumas_round3
Updates for bit-for-bit fields that interact with RRTMGP
2 parents 4656a6b + e56dc31 commit e2f5ec2

12 files changed

Lines changed: 598 additions & 162 deletions

schemes/pumas/micro_pumas_ccpp_dimensions_post.F90

Lines changed: 142 additions & 74 deletions
Large diffs are not rendered by default.

schemes/pumas/micro_pumas_ccpp_dimensions_post.meta

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,11 @@
5252
dimensions = ()
5353
type = integer
5454
intent = in
55-
[pint]
56-
standard_name = air_pressure_at_interface
57-
long_name = air pressure at interface
58-
units = Pa
59-
dimensions = (horizontal_loop_extent, vertical_interface_dimension)
60-
type = real
61-
kind = kind_phys
62-
intent = out
63-
[pumas_pint]
64-
standard_name = pumas_air_pressure_at_interface
65-
long_name = pumas air pressure at interface
66-
units = Pa
67-
dimensions = (microphysics_horizontal_loop_extent, microphysics_vertical_interface_dimension)
68-
type = real
69-
kind = pumas_r8
55+
[trop_cloud_top_lev]
56+
standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
57+
units = index
58+
type = integer
59+
dimensions = ()
7060
intent = in
7161
[qcsinksum_rate1ord]
7262
standard_name = direct_conversion_rate_of_stratiform_cloud_water_to_precipitation_for_scavenging
@@ -464,7 +454,7 @@
464454
kind = pumas_r8
465455
intent = in
466456
[deffi]
467-
standard_name = effective_diameter_of_stratiform_cloud_ice_crystals_for_radiation
457+
standard_name = effective_diameter_of_stratiform_cloud_ice_crystal_for_radiation
468458
long_name = effective diameter of stratiform cloud ice particles for radiation
469459
units = um
470460
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
@@ -528,10 +518,9 @@
528518
kind = pumas_r8
529519
intent = in
530520
[scaled_diam_snow]
531-
standard_name = effective_diameter_of_stratiform_snow_particle_for_radiation
521+
standard_name = effective_diameter_of_stratiform_snow_crystal_for_radiation
532522
long_name = snow scaled diameter
533-
#rrtmgp takes um and the CCPP framework will convert from m
534-
units = m
523+
units = um
535524
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
536525
type = real
537526
kind = kind_phys

schemes/pumas/micro_pumas_ccpp_dimensions_pre.F90

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ end subroutine micro_pumas_ccpp_dimensions_pre_init
4343
!> \section arg_table_micro_pumas_ccpp_dimensions_pre_run Argument Table
4444
!! \htmlinclude micro_pumas_ccpp_dimensions_pre_run.html
4545
subroutine micro_pumas_ccpp_dimensions_pre_run(ncol, nlev, nlevp1, &
46+
trop_cloud_top_lev, &
4647
micro_ncol, micro_nlev, micro_nlevp1, micro_dust_nbins,&
4748
airT_in, pumas_airT, airq_in, pumas_airq, &
4849
cldliq_in, pumas_cldliq, &
@@ -81,6 +82,8 @@ subroutine micro_pumas_ccpp_dimensions_pre_run(ncol, nlev, nlevp1,
8182
integer, intent(in) :: ncol
8283
integer, intent(in) :: nlev
8384
integer, intent(in) :: nlevp1
85+
integer, intent(in) :: trop_cloud_top_lev !Index of the top model level for which
86+
!cloud physics is applied (1 to nlev)
8487

8588
!PUMAS dimensions/parameters:
8689
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,
194197
pumas_timestep = dtime/micro_mg_num_steps
195198

196199

197-
!+ IH
198-
! For now we just use ncols = micro_ncol, but we need to constrain the vertical extent for the microphysical fields.
199-
! Therefore micro_xxx(:ncol,:) = xxx(:,::)
200-
!- IH
201-
pumas_airT(:ncol,:) = real(airT_in(:,:), pumas_r8)
202-
pumas_airq(:ncol,:) = real(airq_in(:,:), pumas_r8)
203-
pumas_cldliq(:ncol,:) = real(cldliq_in(:,:), pumas_r8)
204-
pumas_cldice(:ncol,:) = real(cldice_in(:,:), pumas_r8)
205-
pumas_numliq(:ncol,:) = real(numliq_in(:,:), pumas_r8)
206-
pumas_numice(:ncol,:) = real(numice_in(:,:), pumas_r8)
207-
pumas_rainliq(:ncol,:) = real(rainliq_in(:,:), pumas_r8)
208-
pumas_snowice(:ncol,:) = real(snowice_in(:,:), pumas_r8)
209-
pumas_numrain(:ncol,:) = real(numrain_in(:,:), pumas_r8)
210-
pumas_numsnow(:ncol,:) = real(numsnow_in(:,:), pumas_r8)
211-
pumas_graupice(:ncol,:) = real(graupice_in(:,:), pumas_r8)
212-
pumas_numgraup(:ncol,:) = real(numgraup_in(:,:), pumas_r8)
213-
pumas_relvar(:ncol,:) = real(relvar_in(:,:), pumas_r8)
214-
pumas_accre_enhan(:ncol,:) = real(accre_enhan_in(:,:), pumas_r8)
215-
pumas_pmid(:ncol,:) = real(pmid_in(:,:), pumas_r8)
216-
pumas_pdel(:ncol,:) = real(pdel_in(:,:), pumas_r8)
217-
pumas_pint(:ncol,:) = real(pint_in(:,:micro_nlevp1), pumas_r8)
218-
pumas_strat_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
200+
! Microphysics runs only over levels trop_cloud_top_lev:nlev (the bottom micro_nlev
201+
! layers of the top-down indexed column). Slice each host input onto that range, so
202+
! pumas_xxx(:ncol,:) receives host levels trop_cloud_top_lev:nlev. Mirrors CAM
203+
! micro_pumas_cam.F90, which passes every field as xxx(:ncol,top_lev:).
204+
pumas_airT(:ncol,:) = real(airT_in(:,trop_cloud_top_lev:), pumas_r8)
205+
pumas_airq(:ncol,:) = real(airq_in(:,trop_cloud_top_lev:), pumas_r8)
206+
pumas_cldliq(:ncol,:) = real(cldliq_in(:,trop_cloud_top_lev:), pumas_r8)
207+
pumas_cldice(:ncol,:) = real(cldice_in(:,trop_cloud_top_lev:), pumas_r8)
208+
pumas_numliq(:ncol,:) = real(numliq_in(:,trop_cloud_top_lev:), pumas_r8)
209+
pumas_numice(:ncol,:) = real(numice_in(:,trop_cloud_top_lev:), pumas_r8)
210+
pumas_rainliq(:ncol,:) = real(rainliq_in(:,trop_cloud_top_lev:), pumas_r8)
211+
pumas_snowice(:ncol,:) = real(snowice_in(:,trop_cloud_top_lev:), pumas_r8)
212+
pumas_numrain(:ncol,:) = real(numrain_in(:,trop_cloud_top_lev:), pumas_r8)
213+
pumas_numsnow(:ncol,:) = real(numsnow_in(:,trop_cloud_top_lev:), pumas_r8)
214+
pumas_graupice(:ncol,:) = real(graupice_in(:,trop_cloud_top_lev:), pumas_r8)
215+
pumas_numgraup(:ncol,:) = real(numgraup_in(:,trop_cloud_top_lev:), pumas_r8)
216+
pumas_relvar(:ncol,:) = real(relvar_in(:,trop_cloud_top_lev:), pumas_r8)
217+
pumas_accre_enhan(:ncol,:) = real(accre_enhan_in(:,trop_cloud_top_lev:), pumas_r8)
218+
pumas_pmid(:ncol,:) = real(pmid_in(:,trop_cloud_top_lev:), pumas_r8)
219+
pumas_pdel(:ncol,:) = real(pdel_in(:,trop_cloud_top_lev:), pumas_r8)
220+
pumas_pint(:ncol,:) = real(pint_in(:,trop_cloud_top_lev:), pumas_r8)
221+
pumas_strat_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
219222
! PUMAS uses total stratiform fraction for both liquid and ice stratus.
220223
! Mirrors CAM micro_pumas_cam.F90: alst_mic => ast; aist_mic => ast.
221-
pumas_strat_liq_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
222-
pumas_strat_ice_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,:), pumas_r8)
223-
pumas_qsatfac(:ncol,:) = real(qsatfac_in(:,:), pumas_r8)
224-
pumas_naai(:ncol,:) = real(naai_in(:,:), pumas_r8)
225-
pumas_npccn(:ncol,:) = real(npccn_in(:,:), pumas_r8)
226-
pumas_rndst(:ncol,:,:) = real(rndst_in(:,:micro_nlev,:), pumas_r8)
227-
pumas_nacon(:ncol,:,:) = real(nacon_in(:,:micro_nlev,:), pumas_r8)
228-
pumas_snowice_tend_external(:ncol,:) = real(snowice_tend_external_in(:,:), pumas_r8)
229-
pumas_numsnow_tend_external(:ncol,:) = real(numsnow_tend_external_in(:,:), pumas_r8)
230-
pumas_effi_external(:ncol,:) = real(effi_external_in(:,:), pumas_r8)
231-
pumas_frzcnt(:ncol,:) = real(frzcnt_in(:,:), pumas_r8)
232-
pumas_frzdep(:ncol,:) = real(frzdep_in(:,:), pumas_r8)
233-
pumas_frzimm(:ncol,:) = real(frzimm_in(:,:), pumas_r8)
224+
pumas_strat_liq_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
225+
pumas_strat_ice_cldfrc(:ncol,:) = real(strat_cldfrc_in(:,trop_cloud_top_lev:), pumas_r8)
226+
pumas_qsatfac(:ncol,:) = real(qsatfac_in(:,trop_cloud_top_lev:), pumas_r8)
227+
pumas_naai(:ncol,:) = real(naai_in(:,trop_cloud_top_lev:), pumas_r8)
228+
pumas_npccn(:ncol,:) = real(npccn_in(:,trop_cloud_top_lev:), pumas_r8)
229+
pumas_rndst(:ncol,:,:) = real(rndst_in(:,trop_cloud_top_lev:,:), pumas_r8)
230+
pumas_nacon(:ncol,:,:) = real(nacon_in(:,trop_cloud_top_lev:,:), pumas_r8)
231+
pumas_snowice_tend_external(:ncol,:) = real(snowice_tend_external_in(:,trop_cloud_top_lev:), pumas_r8)
232+
pumas_numsnow_tend_external(:ncol,:) = real(numsnow_tend_external_in(:,trop_cloud_top_lev:), pumas_r8)
233+
pumas_effi_external(:ncol,:) = real(effi_external_in(:,trop_cloud_top_lev:), pumas_r8)
234+
pumas_frzcnt(:ncol,:) = real(frzcnt_in(:,trop_cloud_top_lev:), pumas_r8)
235+
pumas_frzdep(:ncol,:) = real(frzdep_in(:,trop_cloud_top_lev:), pumas_r8)
236+
pumas_frzimm(:ncol,:) = real(frzimm_in(:,trop_cloud_top_lev:), pumas_r8)
234237

235238
end subroutine micro_pumas_ccpp_dimensions_pre_run
236239

schemes/pumas/micro_pumas_ccpp_dimensions_pre.meta

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@
102102
dimensions = ()
103103
type = integer
104104
intent = in
105+
[trop_cloud_top_lev]
106+
standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
107+
units = index
108+
type = integer
109+
dimensions = ()
110+
intent = in
105111
[micro_ncol]
106112
#Equivalent to "horizontal_loop_extent" unless subcolumns is enabled
107113
standard_name = microphysics_horizontal_loop_extent
@@ -581,17 +587,17 @@
581587
intent = out
582588

583589
[effi_external_in]
584-
standard_name = effective_radius_of_stratiform_cloud_ice_crystal
590+
standard_name = effective_radius_of_stratiform_cloud_ice_crystal_from_external_microphysics
585591
long_name = effective radius of stratiform cloud ice particle from external microphysics
586-
units = um
592+
units = m
587593
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
588594
type = real
589595
kind = kind_phys
590596
intent = in
591597
[pumas_effi_external]
592598
standard_name = pumas_effective_radius_of_stratiform_cloud_ice_crystal_from_external_microphysics
593599
long_name = microphysics effective radius of stratiform cloud ice particle from external microphysics
594-
units = um
600+
units = m
595601
dimensions = (microphysics_horizontal_loop_extent, microphysics_vertical_layer_dimension)
596602
type = real
597603
kind = pumas_r8
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module micro_pumas_ccpp_optics_limiter
2+
3+
use ccpp_kinds, only: kind_phys
4+
5+
implicit none
6+
private
7+
8+
public :: micro_pumas_ccpp_optics_limiter_run
9+
10+
!Convective size distribution parameters, used in place of the stratiform
11+
!parameters where the stratiform cloud fraction is negligible.
12+
!Mirrors CAM micro_pumas_cam.F90.
13+
real(kind_phys), parameter :: dcon = 25.e-6_kind_phys !Convective size distribution effective radius (m)
14+
real(kind_phys), parameter :: mucon = 5.3_kind_phys !Convective size distribution shape parameter (1)
15+
real(kind_phys), parameter :: deicon = 50._kind_phys !Convective ice effective diameter (um)
16+
17+
!Stratiform cloud fraction below which the stratiform size distribution is
18+
!discarded. PUMAS divides cloud water by the cloud fraction to obtain the
19+
!in-cloud values these parameters are derived from, so as the cloud fraction
20+
!vanishes the slope and diameters it produces grow without bound.
21+
real(kind_phys), parameter :: cldfrc_min = 1.e-4_kind_phys
22+
23+
contains
24+
!> \section arg_table_micro_pumas_ccpp_optics_limiter_run Argument Table
25+
!! \htmlinclude micro_pumas_ccpp_optics_limiter_run.html
26+
subroutine micro_pumas_ccpp_optics_limiter_run(ncol, nlev, trop_cloud_top_lev, &
27+
strat_cldfrc, pgamrad, lamcrad, deffi, errmsg, errcode)
28+
29+
integer, intent(in) :: ncol !Number of horizontal columns (count)
30+
integer, intent(in) :: nlev !Number of vertical layers (count)
31+
integer, intent(in) :: trop_cloud_top_lev !Index of the top model level for which
32+
!tropospheric cloud physics is run (index)
33+
real(kind_phys), intent(in) :: strat_cldfrc(:, :) !Stratiform cloud area fraction (fraction)
34+
real(kind_phys), intent(inout) :: pgamrad(:, :) !Size distribution shape parameter (1)
35+
real(kind_phys), intent(inout) :: lamcrad(:, :) !Slope of droplet distribution (m-1)
36+
real(kind_phys), intent(inout) :: deffi(:, :) !Effective diameter of cloud ice particle (um)
37+
character(len=512), intent(out) :: errmsg !CCPP error message (none)
38+
integer, intent(out) :: errcode !CCPP error code (1)
39+
40+
integer :: i, k
41+
42+
errmsg = ''
43+
errcode = 0
44+
45+
!lamcrad is an inverse length; it is declared dimensionless in the metadata
46+
!to match the RRTMGP and host declarations, so dcon must stay in meters for
47+
!the value handed to radiation to be consistent with CAM.
48+
do k = trop_cloud_top_lev, nlev
49+
do i = 1, ncol
50+
if (strat_cldfrc(i, k) < cldfrc_min) then
51+
pgamrad(i, k) = mucon
52+
lamcrad(i, k) = (mucon + 1._kind_phys) / dcon
53+
deffi(i, k) = deicon
54+
end if
55+
end do
56+
end do
57+
58+
end subroutine micro_pumas_ccpp_optics_limiter_run
59+
60+
end module micro_pumas_ccpp_optics_limiter
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
[ccpp-table-properties]
2+
name = micro_pumas_ccpp_optics_limiter
3+
type = scheme
4+
########################################################################
5+
[ccpp-arg-table]
6+
name = micro_pumas_ccpp_optics_limiter_run
7+
type = scheme
8+
9+
##### Run Arguments
10+
[ncol]
11+
standard_name = horizontal_loop_extent
12+
long_name = number of horizontal columns
13+
units = count
14+
dimensions = ()
15+
type = integer
16+
intent = in
17+
[nlev]
18+
standard_name = vertical_layer_dimension
19+
long_name = vertical layer dimension
20+
units = count
21+
dimensions = ()
22+
type = integer
23+
intent = in
24+
[trop_cloud_top_lev]
25+
standard_name = vertical_layer_index_of_troposphere_cloud_physics_top
26+
long_name = vertical layer index of troposphere cloud physics top
27+
units = index
28+
dimensions = ()
29+
type = integer
30+
intent = in
31+
[strat_cldfrc]
32+
standard_name = stratiform_cloud_area_fraction
33+
long_name = stratiform cloud area fraction
34+
units = fraction
35+
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
36+
type = real
37+
kind = kind_phys
38+
intent = in
39+
[pgamrad]
40+
standard_name = size_distribution_shape_parameter_for_microphysics
41+
long_name = cloud particle size distribution shape (gamma) parameter
42+
units = 1
43+
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
44+
type = real
45+
kind = kind_phys
46+
intent = inout
47+
[lamcrad]
48+
standard_name = slope_of_droplet_distribution_for_optics
49+
long_name = cloud particle size distribution slope (lambda) parameter
50+
units = 1
51+
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
52+
type = real
53+
kind = kind_phys
54+
intent = inout
55+
[deffi]
56+
standard_name = effective_diameter_of_stratiform_cloud_ice_crystal_for_radiation
57+
long_name = effective diameter of stratiform cloud ice particles for radiation
58+
units = um
59+
dimensions = (horizontal_loop_extent, vertical_layer_dimension)
60+
type = real
61+
kind = kind_phys
62+
intent = inout
63+
[errmsg]
64+
standard_name = ccpp_error_message
65+
long_name = error message for error handling in CCPP
66+
units = none
67+
dimensions = ()
68+
type = character
69+
kind = len=512
70+
intent = out
71+
[errcode]
72+
standard_name = ccpp_error_code
73+
long_name = error code for error handling in CCPP
74+
units = 1
75+
dimensions = ()
76+
type = integer
77+
intent = out

0 commit comments

Comments
 (0)