diff --git a/.gitmodules b/.gitmodules index a77b99743f..03cbcece4c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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"] diff --git a/doc/ChangeLog b/doc/ChangeLog index 37e1c0c0a2..dac00fcadd 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,6 +1,73 @@ =============================================================== +Tag name: cam6_4_079 +Originator(s): nusbaume, cacraig +Date: March 21, 2025 +One-line Summary: First round of work on CCPP'izing PUMAS +Github PR URL: https://github.com/ESCOMP/CAM/pull/1275 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Partially addresses PUMAS interface needs to become CCPP-compliant: https://github.com/ESCOMP/CAM/issue/1151 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: jimmielin + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M .gitmodules + - update PUMAS external to version which has CAM dependencies removed + +M src/physics/cam7/micro_pumas_cam.F90 + - Changes to interface to PUMAS + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +derecho/intel/aux_cam: all BFB except for pre-existing test failures + + ERP_D_Ln9.ne30pg3_ne30pg3_mt232.QPC7.derecho_intel.cam-outfrq3s_cosp (Overall: FAIL) details: + FAIL ERP_D_Ln9.ne30pg3_ne30pg3_mt232.QPC7.derecho_intel.cam-outfrq3s_cosp COMPARE_base_rest + ERS_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERS_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s COMPARE_base_rest + - pre-existing failures introduced in cam6_4_078 (see issue #1281) + + SMS_D_Ln9_P1280x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.derecho_intel.cam-outfrq9s (Overall: PASS) details: + [ SMS_D_Ln9_P1280x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.derecho_intel.cam-outfrq9s (Overall: DIFF) details: + - This particular test passed this time, but I belived it fails "sometimes"] + + SMS_D_Ln9_P1280x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.derecho_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL SMS_D_Ln9_P1280x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.derecho_intel.cam-outfrq9s SETUP + - pre-existing failures due to build-namelist error requiring CLM/CTSM external update + + ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s BASELINE /glade/campaign/cesm/community/amwg/cam_baselines/cam6_4_078_intel: DIFF + SMS_Lh12.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq3h BASELINE /glade/campaign/cesm/community/amwg/cam_baselines/cam6_4 + - pre-existing failures due to HEMCO not having reproducible results (issues #1018 and #856) + +derecho/nvhpc/aux_cam: all BFB + +izumi/nag/aux_cam: all BFB + +izumi/gnu/aux_cam: all BFB + +=============================================================== +=============================================================== + Tag name: cam6_4_078 Originator(s): PeterHjortLauritzen, mbramberger, cacraig Date: March 19, 2025 diff --git a/src/physics/cam7/micro_pumas_cam.F90 b/src/physics/cam7/micro_pumas_cam.F90 index ca57878b6d..d6f9a2ebb1 100644 --- a/src/physics/cam7/micro_pumas_cam.F90 +++ b/src/physics/cam7/micro_pumas_cam.F90 @@ -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 @@ -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 @@ -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") @@ -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 @@ -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) @@ -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) @@ -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) diff --git a/src/physics/pumas b/src/physics/pumas index 84f27d8042..8e61d3f608 160000 --- a/src/physics/pumas +++ b/src/physics/pumas @@ -1 +1 @@ -Subproject commit 84f27d804207e79e344e8deec98b471207f9b1f0 +Subproject commit 8e61d3f6089024956f3e54c8b393b76301d3fc39