Skip to content

Commit a108c1f

Browse files
committed
Add PUMAS CCPP run-phase cap, and fix bugs found during testing.
1 parent 36e5c97 commit a108c1f

File tree

1 file changed

+68
-56
lines changed

1 file changed

+68
-56
lines changed

src/physics/cam7/micro_pumas_cam.F90

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,7 +1479,7 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
14791479
use micro_pumas_utils, only: mg_liq_props, mg_ice_props, avg_diameter
14801480
use micro_pumas_utils, only: rhoi, rhosn, rhow, rhows, rhog, qsmall, mincld
14811481

1482-
use micro_pumas_v1, only: micro_pumas_tend
1482+
use micro_pumas_ccpp, only: micro_pumas_ccpp_run
14831483

14841484
use physics_buffer, only: pbuf_col_type_index
14851485
use subcol, only: subcol_field_avg
@@ -1894,8 +1894,10 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
18941894
integer :: col_type ! Flag to store whether accessing grid or sub-columns in pbuf_get_field
18951895
integer :: ierr
18961896
integer :: nlev
1897+
integer :: num_dust_bins
18971898

1898-
character(128) :: errstring ! return status (non-blank for error return)
1899+
character(512) :: ccpp_errmsg ! CCPP return status (non-blank for error return)
1900+
character(128) :: pumas_errstring ! PUMAS return status (non-blank for error return)
18991901

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

1951-
call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
1953+
call handle_errmsg(pumas_errstring, subname="micro_pumas_cam_tend")
19521954

19531955

19541956
call phys_getopts(use_subcol_microp_out=use_subcol_microp)
@@ -2380,60 +2382,70 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
23802382
frzcnt(:ncol,:top_lev-1)=0._r8
23812383
frzdep(:ncol,:top_lev-1)=0._r8
23822384

2385+
!Determine number of dust size bins:
2386+
num_dust_bins = size(rndst, dim=3)
2387+
23832388
do it = 1, num_steps
23842389

2385-
call micro_pumas_tend( &
2386-
ncol, nlev, dtime/num_steps,&
2387-
state_loc%t(:ncol,top_lev:), state_loc%q(:ncol,top_lev:,ixq), &
2388-
state_loc%q(:ncol,top_lev:,ixcldliq), state_loc%q(:ncol,top_lev:,ixcldice), &
2389-
state_loc%q(:ncol,top_lev:,ixnumliq), state_loc%q(:ncol,top_lev:,ixnumice), &
2390-
state_loc%q(:ncol,top_lev:,ixrain), state_loc%q(:ncol,top_lev:,ixsnow), &
2391-
state_loc%q(:ncol,top_lev:,ixnumrain), state_loc%q(:ncol,top_lev:,ixnumsnow), &
2392-
state_loc_graup(:ncol,top_lev:), state_loc_numgraup(:ncol,top_lev:), &
2393-
relvar(:ncol,top_lev:), accre_enhan(:ncol,top_lev:), &
2394-
state_loc%pmid(:ncol,top_lev:), state_loc%pdel(:ncol,top_lev:), state_loc%pint(:ncol,top_lev:), &
2395-
ast(:ncol,top_lev:), alst_mic(:ncol,top_lev:), aist_mic(:ncol,top_lev:), qsatfac(:ncol,top_lev:), &
2396-
rate1cld(:ncol,top_lev:), &
2397-
naai(:ncol,top_lev:), npccn(:ncol,top_lev:), &
2398-
rndst(:ncol,top_lev:,:), nacon(:ncol,top_lev:,:), &
2399-
tlat(:ncol,top_lev:), qvlat(:ncol,top_lev:), &
2400-
qcten(:ncol,top_lev:), qiten(:ncol,top_lev:), &
2401-
ncten(:ncol,top_lev:), niten(:ncol,top_lev:), &
2402-
qrten(:ncol,top_lev:), qsten(:ncol,top_lev:), &
2403-
nrten(:ncol,top_lev:), nsten(:ncol,top_lev:), &
2404-
qgten(:ncol,top_lev:), ngten(:ncol,top_lev:), &
2405-
rel(:ncol,top_lev:), rel_fn_dum(:ncol,top_lev:), rei(:ncol,top_lev:), &
2406-
sadice(:ncol,top_lev:), sadsnow(:ncol,top_lev:), &
2407-
prect(:ncol), preci(:ncol), &
2408-
nevapr(:ncol,top_lev:), am_evp_st(:ncol,top_lev:), &
2409-
prain(:ncol,top_lev:), &
2410-
cmeice(:ncol,top_lev:), dei(:ncol,top_lev:), &
2411-
mu(:ncol,top_lev:), lambdac(:ncol,top_lev:), &
2412-
qsout(:ncol,top_lev:), des(:ncol,top_lev:), &
2413-
qgout(:ncol,top_lev:), ngout(:ncol,top_lev:), dgout(:ncol,top_lev:), &
2414-
cflx(:ncol,top_lev:), iflx(:ncol,top_lev:), &
2415-
gflx(:ncol,top_lev:), &
2416-
rflx(:ncol,top_lev:), sflx(:ncol,top_lev:), qrout(:ncol,top_lev:), &
2417-
reff_rain_dum(:ncol,top_lev:), reff_snow_dum(:ncol,top_lev:), reff_grau_dum(:ncol,top_lev:), &
2418-
nrout(:ncol,top_lev:), nsout(:ncol,top_lev:), &
2419-
refl(:ncol,top_lev:), arefl(:ncol,top_lev:), areflz(:ncol,top_lev:), &
2420-
frefl(:ncol,top_lev:), csrfl(:ncol,top_lev:), acsrfl(:ncol,top_lev:), &
2421-
fcsrfl(:ncol,top_lev:), &
2422-
refl10cm(:ncol,top_lev:), reflz10cm(:ncol,top_lev:), rercld(:ncol,top_lev:), &
2423-
ncai(:ncol,top_lev:), ncal(:ncol,top_lev:), &
2424-
qrout2(:ncol,top_lev:), qsout2(:ncol,top_lev:), &
2425-
nrout2(:ncol,top_lev:), nsout2(:ncol,top_lev:), &
2426-
drout_dum(:ncol,top_lev:), dsout2_dum(:ncol,top_lev:), &
2427-
qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:), &
2428-
freqs(:ncol,top_lev:), freqr(:ncol,top_lev:), &
2429-
nfice(:ncol,top_lev:), qcrat(:ncol,top_lev:), &
2430-
proc_rates, &
2431-
errstring, &
2432-
tnd_qsnow(:ncol,top_lev:),tnd_nsnow(:ncol,top_lev:),re_ice(:ncol,top_lev:),&
2433-
prer_evap(:ncol,top_lev:), &
2434-
frzimm(:ncol,top_lev:), frzcnt(:ncol,top_lev:), frzdep(:ncol,top_lev:) )
2435-
2436-
call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
2390+
call micro_pumas_ccpp_run( &
2391+
ncol, nlev, nlev+1, num_dust_bins, dtime/num_steps, &
2392+
state_loc%t(:ncol,top_lev:), state_loc%q(:ncol,top_lev:,ixq), &
2393+
state_loc%q(:ncol,top_lev:,ixcldliq), state_loc%q(:ncol,top_lev:,ixcldice), &
2394+
state_loc%q(:ncol,top_lev:,ixnumliq), state_loc%q(:ncol,top_lev:,ixnumice), &
2395+
state_loc%q(:ncol,top_lev:,ixrain), state_loc%q(:ncol,top_lev:,ixsnow), &
2396+
state_loc%q(:ncol,top_lev:,ixnumrain), state_loc%q(:ncol,top_lev:,ixnumsnow), &
2397+
state_loc_graup(:ncol,top_lev:), state_loc_numgraup(:ncol,top_lev:), &
2398+
relvar(:ncol,top_lev:), accre_enhan(:ncol,top_lev:), &
2399+
state_loc%pmid(:ncol,top_lev:), state_loc%pdel(:ncol,top_lev:), &
2400+
state_loc%pint(:ncol,top_lev:), &
2401+
ast(:ncol,top_lev:), alst_mic(:ncol,top_lev:), &
2402+
aist_mic(:ncol,top_lev:), qsatfac(:ncol,top_lev:), &
2403+
naai(:ncol,top_lev:), npccn(:ncol,top_lev:), &
2404+
rndst(:ncol,top_lev:,:), nacon(:ncol,top_lev:,:), &
2405+
tnd_qsnow(:ncol,top_lev:), tnd_nsnow(:ncol,top_lev:), &
2406+
re_ice(:ncol,top_lev:), &
2407+
frzimm(:ncol,top_lev:), frzcnt(:ncol,top_lev:), &
2408+
frzdep(:ncol,top_lev:), rate1cld(:ncol,top_lev:), &
2409+
tlat(:ncol,top_lev:), qvlat(:ncol,top_lev:), &
2410+
qcten(:ncol,top_lev:), qiten(:ncol,top_lev:), &
2411+
ncten(:ncol,top_lev:), niten(:ncol,top_lev:), &
2412+
qrten(:ncol,top_lev:), qsten(:ncol,top_lev:), &
2413+
nrten(:ncol,top_lev:), nsten(:ncol,top_lev:), &
2414+
qgten(:ncol,top_lev:), ngten(:ncol,top_lev:), &
2415+
rel(:ncol,top_lev:), rel_fn_dum(:ncol,top_lev:), &
2416+
rei(:ncol,top_lev:), &
2417+
sadice(:ncol,top_lev:), sadsnow(:ncol,top_lev:), &
2418+
prect(:ncol), preci(:ncol), &
2419+
nevapr(:ncol,top_lev:), am_evp_st(:ncol,top_lev:), &
2420+
prain(:ncol,top_lev:), &
2421+
cmeice(:ncol,top_lev:), dei(:ncol,top_lev:), &
2422+
mu(:ncol,top_lev:), lambdac(:ncol,top_lev:), &
2423+
qsout(:ncol,top_lev:), des(:ncol,top_lev:), &
2424+
qgout(:ncol,top_lev:), ngout(:ncol,top_lev:), &
2425+
dgout(:ncol,top_lev:), &
2426+
cflx(:ncol,top_lev:), iflx(:ncol,top_lev:), &
2427+
gflx(:ncol,top_lev:), &
2428+
rflx(:ncol,top_lev:), sflx(:ncol,top_lev:), &
2429+
qrout(:ncol,top_lev:), reff_rain_dum(:ncol,top_lev:), &
2430+
reff_snow_dum(:ncol,top_lev:), reff_grau_dum(:ncol,top_lev:), &
2431+
nrout(:ncol,top_lev:), nsout(:ncol,top_lev:), &
2432+
refl(:ncol,top_lev:), arefl(:ncol,top_lev:), &
2433+
areflz(:ncol,top_lev:), frefl(:ncol,top_lev:), &
2434+
csrfl(:ncol,top_lev:), acsrfl(:ncol,top_lev:), &
2435+
fcsrfl(:ncol,top_lev:), refl10cm(:ncol,top_lev:), &
2436+
reflz10cm(:ncol,top_lev:), rercld(:ncol,top_lev:), &
2437+
ncai(:ncol,top_lev:), ncal(:ncol,top_lev:), &
2438+
qrout2(:ncol,top_lev:), qsout2(:ncol,top_lev:), &
2439+
nrout2(:ncol,top_lev:), nsout2(:ncol,top_lev:), &
2440+
drout_dum(:ncol,top_lev:), dsout2_dum(:ncol,top_lev:), &
2441+
qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), &
2442+
dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:), &
2443+
freqs(:ncol,top_lev:), freqr(:ncol,top_lev:), &
2444+
nfice(:ncol,top_lev:), qcrat(:ncol,top_lev:), &
2445+
prer_evap(:ncol,top_lev:), proc_rates, &
2446+
ccpp_errmsg, ierr )
2447+
2448+
call handle_errmsg(ccpp_errmsg, subname="micro_pumas_cam_tend")
24372449

24382450
call physics_ptend_init(ptend_loc, psetcols, "micro_pumas", &
24392451
ls=.true., lq=lq)

0 commit comments

Comments
 (0)