Skip to content

cam6_4_079: First round of work on CCPP'izing PUMAS #1275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 21, 2025
Merged
6 changes: 3 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
fxDONOTUSEurl = https://github.com/ESCOMP/CARMA_base.git

[submodule "pumas"]
path = src/physics/pumas
url = https://github.com/ESCOMP/PUMAS
path = src/physics/pumas
url = https://github.com/ESCOMP/PUMAS
fxrequired = AlwaysRequired
fxtag = pumas_cam-release_v1.36
fxtag = pumas_cam-release_v1.38
fxDONOTUSEurl = https://github.com/ESCOMP/PUMAS

[submodule "pumas-frozen"]
Expand Down
183 changes: 99 additions & 84 deletions src/physics/cam7/micro_pumas_cam.F90
Original file line number Diff line number Diff line change
Expand Up @@ -866,7 +866,7 @@ end subroutine micro_pumas_cam_init_cnst
subroutine micro_pumas_cam_init(pbuf2d)
use time_manager, only: is_first_step
use micro_pumas_utils, only: micro_pumas_utils_init
use micro_pumas_v1, only: micro_mg_init3_0 => micro_pumas_init
use micro_pumas_ccpp, only: micro_pumas_ccpp_init
use stochastic_tau_cam, only: stochastic_tau_init_cam
use stochastic_emulated_cam, only: stochastic_emulated_init_cam

Expand All @@ -879,15 +879,15 @@ subroutine micro_pumas_cam_init(pbuf2d)
type(physics_buffer_desc), pointer :: pbuf2d(:,:)

integer :: m, mm
logical :: history_amwg ! output the variables used by the AMWG diag package
logical :: history_budget ! Output tendencies and state variables for CAM4
! temperature, water vapor, cloud ice and cloud
! liquid budgets.
logical :: history_amwg ! output the variables used by the AMWG diag package
logical :: history_budget ! Output tendencies and state variables for CAM4
! temperature, water vapor, cloud ice and cloud
! liquid budgets.
logical :: use_subcol_microp
logical :: do_clubb_sgs
integer :: budget_histfile ! output history file number for budget fields
integer :: budget_histfile ! output history file number for budget fields
integer :: ierr
character(128) :: errstring ! return status (non-blank for error return)
character(len=512) :: errstring ! return status (non-blank for error return)

character(len=cl) :: stochastic_emulated_filename_quantile, stochastic_emulated_filename_input_scale, &
stochastic_emulated_filename_output_scale
Expand Down Expand Up @@ -928,27 +928,30 @@ subroutine micro_pumas_cam_init(pbuf2d)
stochastic_emulated_filename_output_scale)
end if

call micro_mg_init3_0( &
r8, gravit, rair, rh2o, cpair, &
tmelt, latvap, latice, rhmini, &
micro_mg_dcs, &
micro_mg_do_hail,micro_mg_do_graupel, &
microp_uniform, do_cldice, use_hetfrz_classnuc, &
micro_mg_precip_frac_method, micro_mg_berg_eff_factor, &
micro_mg_accre_enhan_fact , &
micro_mg_autocon_fact , micro_mg_autocon_nd_exp, micro_mg_autocon_lwp_exp, micro_mg_homog_size, &
micro_mg_vtrmi_factor, micro_mg_vtrms_factor, micro_mg_effi_factor, &
micro_mg_iaccr_factor, micro_mg_max_nicons, &
allow_sed_supersat, micro_mg_warm_rain, &
micro_mg_evap_sed_off, micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr,&
micro_mg_accre_sees_auto, micro_mg_implicit_fall, &
micro_mg_nccons, micro_mg_nicons, micro_mg_ncnst, &
micro_mg_ninst, micro_mg_ngcons, micro_mg_ngnst, &
micro_mg_nrcons, micro_mg_nrnst, micro_mg_nscons, micro_mg_nsnst, &
stochastic_emulated_filename_quantile, stochastic_emulated_filename_input_scale, &
stochastic_emulated_filename_output_scale, iulog, errstring)
call micro_pumas_ccpp_init(gravit, rair, rh2o, cpair, tmelt, latvap, latice, &
rhmini, iulog, micro_mg_do_hail, micro_mg_do_graupel, &
microp_uniform, do_cldice, use_hetfrz_classnuc, &
allow_sed_supersat, micro_mg_evap_sed_off, &
micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, &
micro_mg_precip_fall_corr, micro_mg_accre_sees_auto, &
micro_mg_implicit_fall, micro_mg_nccons, &
micro_mg_nicons, micro_mg_ngcons, micro_mg_nrcons, &
micro_mg_nscons, micro_mg_precip_frac_method, &
micro_mg_warm_rain, &
stochastic_emulated_filename_quantile, &
stochastic_emulated_filename_input_scale, &
stochastic_emulated_filename_output_scale, &
micro_mg_dcs, &
micro_mg_berg_eff_factor, micro_mg_accre_enhan_fact, &
micro_mg_autocon_fact, micro_mg_autocon_nd_exp, &
micro_mg_autocon_lwp_exp, micro_mg_homog_size, &
micro_mg_vtrmi_factor, micro_mg_vtrms_factor, &
micro_mg_effi_factor, micro_mg_iaccr_factor, &
micro_mg_max_nicons, micro_mg_ncnst, &
micro_mg_ninst, micro_mg_ngnst, micro_mg_nrnst, &
micro_mg_nsnst, errstring, ierr)

call handle_errmsg(errstring, subname="micro_pumas_cam_init")

Expand Down Expand Up @@ -1478,7 +1481,7 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
use micro_pumas_utils, only: mg_liq_props, mg_ice_props, avg_diameter
use micro_pumas_utils, only: rhoi, rhosn, rhow, rhows, rhog, qsmall, mincld

use micro_pumas_v1, only: micro_pumas_tend
use micro_pumas_ccpp, only: micro_pumas_ccpp_run

use physics_buffer, only: pbuf_col_type_index
use subcol, only: subcol_field_avg
Expand Down Expand Up @@ -1938,8 +1941,10 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
integer :: col_type ! Flag to store whether accessing grid or sub-columns in pbuf_get_field
integer :: ierr
integer :: nlev
integer :: num_dust_bins

character(128) :: errstring ! return status (non-blank for error return)
character(512) :: ccpp_errmsg ! CCPP return status (non-blank for error return)
character(128) :: pumas_errstring ! PUMAS return status (non-blank for error return)

! For rrtmg optics. specified distribution.
real(r8), parameter :: dcon = 25.e-6_r8 ! Convective size distribution effective radius (meters)
Expand Down Expand Up @@ -1990,9 +1995,9 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
! all the other arrays in this routine are dimensioned pver. This is required because
! PUMAS only gets the top_lev:pver array subsection, and the proc_rates arrays
! need to be the same levels.
call proc_rates%allocate(ncol, nlev, ncd, micro_mg_warm_rain, errstring)
call proc_rates%allocate(ncol, nlev, ncd, micro_mg_warm_rain, pumas_errstring)

call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
call handle_errmsg(pumas_errstring, subname="micro_pumas_cam_tend")


call phys_getopts(use_subcol_microp_out=use_subcol_microp)
Expand Down Expand Up @@ -2469,60 +2474,70 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
frzcnt(:ncol,:top_lev-1)=0._r8
frzdep(:ncol,:top_lev-1)=0._r8

!Determine number of dust size bins:
num_dust_bins = size(rndst, dim=3)

do it = 1, num_steps

call micro_pumas_tend( &
ncol, nlev, dtime/num_steps,&
state_loc%t(:ncol,top_lev:), state_loc%q(:ncol,top_lev:,ixq), &
state_loc%q(:ncol,top_lev:,ixcldliq), state_loc%q(:ncol,top_lev:,ixcldice), &
state_loc%q(:ncol,top_lev:,ixnumliq), state_loc%q(:ncol,top_lev:,ixnumice), &
state_loc%q(:ncol,top_lev:,ixrain), state_loc%q(:ncol,top_lev:,ixsnow), &
state_loc%q(:ncol,top_lev:,ixnumrain), state_loc%q(:ncol,top_lev:,ixnumsnow), &
state_loc_graup(:ncol,top_lev:), state_loc_numgraup(:ncol,top_lev:), &
relvar(:ncol,top_lev:), accre_enhan(:ncol,top_lev:), &
state_loc%pmid(:ncol,top_lev:), state_loc%pdel(:ncol,top_lev:), state_loc%pint(:ncol,top_lev:), &
ast(:ncol,top_lev:), alst_mic(:ncol,top_lev:), aist_mic(:ncol,top_lev:), qsatfac(:ncol,top_lev:), &
rate1cld(:ncol,top_lev:), &
naai(:ncol,top_lev:), npccn(:ncol,top_lev:), &
rndst(:ncol,top_lev:,:), nacon(:ncol,top_lev:,:), &
tlat(:ncol,top_lev:), qvlat(:ncol,top_lev:), &
qcten(:ncol,top_lev:), qiten(:ncol,top_lev:), &
ncten(:ncol,top_lev:), niten(:ncol,top_lev:), &
qrten(:ncol,top_lev:), qsten(:ncol,top_lev:), &
nrten(:ncol,top_lev:), nsten(:ncol,top_lev:), &
qgten(:ncol,top_lev:), ngten(:ncol,top_lev:), &
rel(:ncol,top_lev:), rel_fn_dum(:ncol,top_lev:), rei(:ncol,top_lev:), &
sadice(:ncol,top_lev:), sadsnow(:ncol,top_lev:), &
prect(:ncol), preci(:ncol), &
nevapr(:ncol,top_lev:), am_evp_st(:ncol,top_lev:), &
prain(:ncol,top_lev:), &
cmeice(:ncol,top_lev:), dei(:ncol,top_lev:), &
mu(:ncol,top_lev:), lambdac(:ncol,top_lev:), &
qsout(:ncol,top_lev:), des(:ncol,top_lev:), &
qgout(:ncol,top_lev:), ngout(:ncol,top_lev:), dgout(:ncol,top_lev:), &
cflx(:ncol,top_lev:), iflx(:ncol,top_lev:), &
gflx(:ncol,top_lev:), &
rflx(:ncol,top_lev:), sflx(:ncol,top_lev:), qrout(:ncol,top_lev:), &
reff_rain_dum(:ncol,top_lev:), reff_snow_dum(:ncol,top_lev:), reff_grau_dum(:ncol,top_lev:), &
nrout(:ncol,top_lev:), nsout(:ncol,top_lev:), &
refl(:ncol,top_lev:), arefl(:ncol,top_lev:), areflz(:ncol,top_lev:), &
frefl(:ncol,top_lev:), csrfl(:ncol,top_lev:), acsrfl(:ncol,top_lev:), &
fcsrfl(:ncol,top_lev:), &
refl10cm(:ncol,top_lev:), reflz10cm(:ncol,top_lev:), rercld(:ncol,top_lev:), &
ncai(:ncol,top_lev:), ncal(:ncol,top_lev:), &
qrout2(:ncol,top_lev:), qsout2(:ncol,top_lev:), &
nrout2(:ncol,top_lev:), nsout2(:ncol,top_lev:), &
drout_dum(:ncol,top_lev:), dsout2_dum(:ncol,top_lev:), &
qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:), &
freqs(:ncol,top_lev:), freqr(:ncol,top_lev:), &
nfice(:ncol,top_lev:), qcrat(:ncol,top_lev:), &
proc_rates, &
errstring, &
tnd_qsnow(:ncol,top_lev:),tnd_nsnow(:ncol,top_lev:),re_ice(:ncol,top_lev:),&
prer_evap(:ncol,top_lev:), &
frzimm(:ncol,top_lev:), frzcnt(:ncol,top_lev:), frzdep(:ncol,top_lev:) )

call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
call micro_pumas_ccpp_run( &
ncol, nlev, nlev+1, num_dust_bins, dtime/num_steps, &
state_loc%t(:ncol,top_lev:), state_loc%q(:ncol,top_lev:,ixq), &
state_loc%q(:ncol,top_lev:,ixcldliq), state_loc%q(:ncol,top_lev:,ixcldice), &
state_loc%q(:ncol,top_lev:,ixnumliq), state_loc%q(:ncol,top_lev:,ixnumice), &
state_loc%q(:ncol,top_lev:,ixrain), state_loc%q(:ncol,top_lev:,ixsnow), &
state_loc%q(:ncol,top_lev:,ixnumrain), state_loc%q(:ncol,top_lev:,ixnumsnow), &
state_loc_graup(:ncol,top_lev:), state_loc_numgraup(:ncol,top_lev:), &
relvar(:ncol,top_lev:), accre_enhan(:ncol,top_lev:), &
state_loc%pmid(:ncol,top_lev:), state_loc%pdel(:ncol,top_lev:), &
state_loc%pint(:ncol,top_lev:), &
ast(:ncol,top_lev:), alst_mic(:ncol,top_lev:), &
aist_mic(:ncol,top_lev:), qsatfac(:ncol,top_lev:), &
naai(:ncol,top_lev:), npccn(:ncol,top_lev:), &
rndst(:ncol,top_lev:,:), nacon(:ncol,top_lev:,:), &
tnd_qsnow(:ncol,top_lev:), tnd_nsnow(:ncol,top_lev:), &
re_ice(:ncol,top_lev:), &
frzimm(:ncol,top_lev:), frzcnt(:ncol,top_lev:), &
frzdep(:ncol,top_lev:), rate1cld(:ncol,top_lev:), &
tlat(:ncol,top_lev:), qvlat(:ncol,top_lev:), &
qcten(:ncol,top_lev:), qiten(:ncol,top_lev:), &
ncten(:ncol,top_lev:), niten(:ncol,top_lev:), &
qrten(:ncol,top_lev:), qsten(:ncol,top_lev:), &
nrten(:ncol,top_lev:), nsten(:ncol,top_lev:), &
qgten(:ncol,top_lev:), ngten(:ncol,top_lev:), &
rel(:ncol,top_lev:), rel_fn_dum(:ncol,top_lev:), &
rei(:ncol,top_lev:), &
sadice(:ncol,top_lev:), sadsnow(:ncol,top_lev:), &
prect(:ncol), preci(:ncol), &
nevapr(:ncol,top_lev:), am_evp_st(:ncol,top_lev:), &
prain(:ncol,top_lev:), &
cmeice(:ncol,top_lev:), dei(:ncol,top_lev:), &
mu(:ncol,top_lev:), lambdac(:ncol,top_lev:), &
qsout(:ncol,top_lev:), des(:ncol,top_lev:), &
qgout(:ncol,top_lev:), ngout(:ncol,top_lev:), &
dgout(:ncol,top_lev:), &
cflx(:ncol,top_lev:), iflx(:ncol,top_lev:), &
gflx(:ncol,top_lev:), &
rflx(:ncol,top_lev:), sflx(:ncol,top_lev:), &
qrout(:ncol,top_lev:), reff_rain_dum(:ncol,top_lev:), &
reff_snow_dum(:ncol,top_lev:), reff_grau_dum(:ncol,top_lev:), &
nrout(:ncol,top_lev:), nsout(:ncol,top_lev:), &
refl(:ncol,top_lev:), arefl(:ncol,top_lev:), &
areflz(:ncol,top_lev:), frefl(:ncol,top_lev:), &
csrfl(:ncol,top_lev:), acsrfl(:ncol,top_lev:), &
fcsrfl(:ncol,top_lev:), refl10cm(:ncol,top_lev:), &
reflz10cm(:ncol,top_lev:), rercld(:ncol,top_lev:), &
ncai(:ncol,top_lev:), ncal(:ncol,top_lev:), &
qrout2(:ncol,top_lev:), qsout2(:ncol,top_lev:), &
nrout2(:ncol,top_lev:), nsout2(:ncol,top_lev:), &
drout_dum(:ncol,top_lev:), dsout2_dum(:ncol,top_lev:), &
qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), &
dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:), &
freqs(:ncol,top_lev:), freqr(:ncol,top_lev:), &
nfice(:ncol,top_lev:), qcrat(:ncol,top_lev:), &
prer_evap(:ncol,top_lev:), proc_rates, &
ccpp_errmsg, ierr )

call handle_errmsg(ccpp_errmsg, subname="micro_pumas_cam_tend")

call physics_ptend_init(ptend_loc, psetcols, "micro_pumas", &
ls=.true., lq=lq)
Expand Down