diff --git a/.gitmodules b/.gitmodules index fa2c4d99f5..4edb7602a5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -153,7 +153,7 @@ fxDONOTUSEurl = https://github.com/ESMCI/cime [submodule "cmeps"] path = components/cmeps url = https://github.com/ESCOMP/CMEPS.git -fxtag = cmeps1.1.54 +fxtag = cmeps1.1.58 fxrequired = ToplevelRequired fxDONOTUSEurl = https://github.com/ESCOMP/CMEPS.git diff --git a/bld/build-namelist b/bld/build-namelist index aa3826d2e8..45a8e4f27b 100755 --- a/bld/build-namelist +++ b/bld/build-namelist @@ -5362,6 +5362,7 @@ sub check_snapshot_settings { # cam7 physpkg push(@validList_ac, ("'chem_emissions'", "'clubb_tend_cam'", + "'microp_aero'", "'pumas_tend'")); if ($use_subcol_microp =~ /$TRUE/io) { push (@validList_bc, ("'microp_driver_tend_subcol'")); @@ -5403,6 +5404,7 @@ sub check_snapshot_settings { } else { push (@validList_bc, ("'macrop_driver_tend'")); } + push (@validList_bc, ("'microp_aero'")); push (@validList_bc, ("'pumas_tend'")); if ($use_subcol_microp =~ /$TRUE/io) { push (@validList_bc, ("'microp_driver_tend_subcol'")); diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml index ca1c31fc7a..8d19021136 100644 --- a/bld/namelist_files/namelist_definition.xml +++ b/bld/namelist_files/namelist_definition.xml @@ -5976,7 +5976,7 @@ Default: + group="phys_ctl_nl" valid_values="pumas_tend,chem_emissions,aoa_tracers_timestep_tend,co2_cycle_set_ptend,chem_timestep_tend,orographic_form_drag_stress,vertical_diffusion_section,aero_model_drydep,gw_tend,qbo_relax,iondrag_calc_section,physics_dme_adjust,physics_dme_adjust,dadadj_tend,convect_deep_tend,convect_shallow_tend,convect_diagnostics_calc,macrop_driver_tend,clubb_tend_cam,,microp_aero,microp_driver_tend_subcol,aero_model_wetdep,radiation_tend,held_suarez_tend,kessler_tend,thatcher_jablonowski_precip_tend,rk_stratiform_tend,rayleigh_friction_tend,user_set" > Name of parameterization to take snapshot before running user_set is used when a user inserts a call to cam_snapshot_all_outfld using cam_snapshot_before_num as the first argument. @@ -5984,7 +5984,7 @@ Default: Unused + group="phys_ctl_nl" valid_values="pumas_tend,chem_emissions,aoa_tracers_timestep_tend,co2_cycle_set_ptend,chem_timestep_tend,orographic_form_drag_stress,vertical_diffusion_section,aero_model_drydep,gw_tend,qbo_relax,iondrag_calc_section,physics_dme_adjust,physics_dme_adjust,dadadj_tend,convect_deep_tend,convect_shallow_tend,convect_diagnostics_calc,macrop_driver_tend,clubb_tend_cam,,microp_aero,microp_driver_tend_subcol,aero_model_wetdep,radiation_tend,held_suarez_tend,kessler_tend,thatcher_jablonowski_precip_tend,rk_stratiform_tend,rayleigh_friction_tend,user_set" > Name of parameterization to take snapshot after running user_set is used when a user inserts a call to cam_snapshot_all_outfld using cam_snapshot_after_num as the first argument. diff --git a/bld/namelist_files/use_cases/1850_trop_strat_t4s_cam7.xml b/bld/namelist_files/use_cases/1850_trop_strat_t4s_cam7.xml index f5ad20c1c1..cbe6763c79 100644 --- a/bld/namelist_files/use_cases/1850_trop_strat_t4s_cam7.xml +++ b/bld/namelist_files/use_cases/1850_trop_strat_t4s_cam7.xml @@ -3,7 +3,7 @@ -atm/cam/inic/se/b.e30_alpha07c_cesm.B1850C_MTt4s.ne30_t232_wgx3.251.001.cam.i.0032-01-01_c260304.nc +atm/cam/inic/se/b.e30_alpha09b.B1850C_MTt4s.ne30_t233_wgx3.360.cam.i.0031-01-01_c260821.nc atm/cam/solar/SolarForcingCMIP7piControl_c20250103.nc diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index 7b60402d5e..8a0be80a27 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -2049,7 +2049,7 @@ - + diff --git a/components/cmeps b/components/cmeps index 4d4b45aec6..f621f772a7 160000 --- a/components/cmeps +++ b/components/cmeps @@ -1 +1 @@ -Subproject commit 4d4b45aec66e42c0dde24757c4f151dfeb2ea408 +Subproject commit f621f772a7fe4109460b47500aa1f0bc3e1dd7cd diff --git a/doc/ChangeLog b/doc/ChangeLog index 8972183746..320c25ad23 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,310 @@ +=============================================================== + +Tag name: cam6_4_197 +Originator(s): jimmielin +Date: August 22, 2026 +One-line Summary: BAM bugfix (answer-changing BAM only); fix history unit; sync some files to CAM-SIMA abstract interface +Github PR URL: https://github.com/ESCOMP/CAM/pull/1652 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): +- Fixes #1597 - Wrong rfac_oc, rfac_bc (aerosol growth factor) in BAM aero_model computed in interpolation +- Fixes #1608 - MAM wateruptake: 'wat_a' history field has incorrect units annotation +- Fixes #1653 - nvhpc fails when using externals in cesm3_0_beta09 + +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: fvitt + +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 +M components/cmeps + - cmeps external update + +M bld/build-namelist +M src/physics/cam/physpkg.F90 +M src/physics/cam7/physpkg.F90 +M bld/namelist_files/namelist_definition.xml + - add microp_aero snapshot point + +M bld/namelist_files/use_cases/1850_trop_strat_t4s_cam7.xml + - update t4s initial condition file + +M cime_config/testdefs/testlist_cam.xml + - update t4s test ocean mask to mt233 + +M src/chemistry/aerosol/aerosol_optics_core.F90 + - add DOI + +M src/chemistry/aerosol/aerosol_properties_mod.F90 + - add DOIs + - mark pure function + +M src/chemistry/aerosol/aerosol_state_mod.F90 +M src/physics/cam/hetfrz_classnuc_cam.F90 + - thread through pi to mass_mean_radius + +M src/chemistry/aerosol/bulk_aerosol_properties_mod.F90 + - improve error handling and sync with CAM-SIMA + +M src/chemistry/aerosol/bulk_aerosol_state_mod.F90 + - remove nuclice_get_numdens_bam bfb shim -- ANSWER CHANGING for prescribed BAM with ice nucleation + - oc and bc rfac interpolation table bug fix -- ANSWER CHANGING for prognostic BAM + +M src/chemistry/aerosol/hygro_aerosol_optics_mod.F90 +M src/chemistry/aerosol/hygroscopic_aerosol_optics_mod.F90 +M src/chemistry/aerosol/insoluble_aerosol_optics_mod.F90 +M src/chemistry/aerosol/volcrad_aerosol_optics_mod.F90 + - improve destructors + +M src/chemistry/utils/modal_aero_wateruptake.F90 + - history units bug fix + +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: + SMS_D_Ln9.ne30pg3_ne30pg3_mt233.1850_CAM70%MT%CT4S2_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.derecho_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mt233.1850_CAM70%MT%CT4S2_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.derecho_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mt233.1850_CAM70%MT%CT4S2_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.derecho_intel.cam-outfrq9s BASELINE /glade/campaign/cesm/community/amwg/cam_baselines/cam6_4_196_intel: ERROR BFAIL baseline directory '/glade/campaign/cesm/community/amwg/cam_baselines/cam6_4_196_intel/SMS_D_Ln9.ne30pg3_ne30pg3_mt233.1850_CAM70%MT%CT4S2_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.derecho_intel.cam-outfrq9s' does not exist + - test updated to mt233 ocean mask + - T4S initial condition file updated due to original file lost on GDEX (RC-39649) + + ERC_D_Ln9.f19_f19_mg17.QPMOZ.derecho_intel.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9.f19_f19_mg17.QPMOZ.derecho_intel.cam-outfrq3s NLCOMP + FAIL ERC_D_Ln9.f19_f19_mg17.QPMOZ.derecho_intel.cam-outfrq3s BASELINE /glade/campaign/cesm/community/amwg/cam_baselines/cam6_4_196_intel: DIFF + - Prognostic BAM answer change due to bug fix. + + ERC_D_Ln9.f09_f09_mt232.FHIST_BDRD.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f09_f09_mt232.FHIST_BDRD.derecho_intel.cam-outfrq9s NLCOMP + ERC_D_Ln9.f19_f19_mt232.QPC6.derecho_intel.cam-outfrq3s_cosp (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f19_f19_mt232.QPC6.derecho_intel.cam-outfrq3s_cosp NLCOMP + ERC_D_Ln9.mpasa120_mpasa120.F2000climo.derecho_intel.cam-outfrq9s_mpasa120 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa120_mpasa120.F2000climo.derecho_intel.cam-outfrq9s_mpasa120 NLCOMP + ERC_D_Ln9.mpasa120_mpasa120.FHISTC_LTso.derecho_intel.cam-outfrq9s_mpasa120 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa120_mpasa120.FHISTC_LTso.derecho_intel.cam-outfrq9s_mpasa120 NLCOMP + ERC_D_Ln9.mpasa120_mpasa120.QPC7.derecho_intel.cam-outfrq9s_mpasa120 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa120_mpasa120.QPC7.derecho_intel.cam-outfrq9s_mpasa120 NLCOMP + ERC_D_Ln9.ne30pg2_ne30pg2_mt232.QPC7.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne30pg2_ne30pg2_mt232.QPC7.derecho_intel.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_LTso.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_LTso.derecho_intel.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne3_ne3_mg37.QPC7.derecho_intel.cam-outfrq9s_rttov (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3_ne3_mg37.QPC7.derecho_intel.cam-outfrq9s_rttov NLCOMP + ERC_Ln9.C96_C96_mt232.F2000climo.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_Ln9.C96_C96_mt232.F2000climo.derecho_intel.cam-outfrq9s NLCOMP + ERI_D_Ln18.f09_f09_mt232.FHIST.derecho_intel.cam-outfrq3s_eri (Overall: NLFAIL) details: + FAIL ERI_D_Ln18.f09_f09_mt232.FHIST.derecho_intel.cam-outfrq3s_eri NLCOMP + ERI_D_Ln18.f19_f19_mt232.FHIST_C5.derecho_intel.cam-outfrq3s_eri (Overall: NLFAIL) details: + FAIL ERI_D_Ln18.f19_f19_mt232.FHIST_C5.derecho_intel.cam-outfrq3s_eri NLCOMP + ERI_D_Ln18.ne16pg3_ne16pg3_mt232.FHIST_C4.derecho_intel.cam-outfrq3s_eri (Overall: NLFAIL) details: + FAIL ERI_D_Ln18.ne16pg3_ne16pg3_mt232.FHIST_C4.derecho_intel.cam-outfrq3s_eri NLCOMP + ERI_D_Ln18.ne30pg3_ne30pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq3s_eri (Overall: NLFAIL) details: + FAIL ERI_D_Ln18.ne30pg3_ne30pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq3s_eri NLCOMP + ERP_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_MTso.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_MTso.derecho_intel.cam-outfrq9s NLCOMP + ERP_D_Ln9_P64x2.f09_f09_mg17.QSC6.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_D_Ln9_P64x2.f09_f09_mg17.QSC6.derecho_intel.cam-outfrq9s NLCOMP + ERP_Ld3.ne16pg3_ne16pg3_mg17.FHISTC_WAt1ma.derecho_intel.cam-reduced_hist1d (Overall: NLFAIL) details: + FAIL ERP_Ld3.ne16pg3_ne16pg3_mg17.FHISTC_WAt1ma.derecho_intel.cam-reduced_hist1d NLCOMP + ERP_Ld3.ne30pg3_ne30pg3_mt232.FHISTC_MTt4s.derecho_intel.cam-outfrq1d_aoa (Overall: NLFAIL) details: + FAIL ERP_Ld3.ne30pg3_ne30pg3_mt232.FHISTC_MTt4s.derecho_intel.cam-outfrq1d_aoa NLCOMP + ERP_Lh12.f19_f19_mg17.FW4madSD.derecho_intel.cam-outfrq3h (Overall: NLFAIL) details: + FAIL ERP_Lh12.f19_f19_mg17.FW4madSD.derecho_intel.cam-outfrq3h NLCOMP + ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s NLCOMP + ERP_Ln9.f19_f19_mg17.FWsc1850.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_Ln9.f19_f19_mg17.FWsc1850.derecho_intel.cam-outfrq9s NLCOMP + ERP_Ln9.ne30pg3_ne30pg3_mg17.FCnudged.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_Ln9.ne30pg3_ne30pg3_mg17.FCnudged.derecho_intel.cam-outfrq9s NLCOMP + ERP_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WAma.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERP_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WAma.derecho_intel.cam-outfrq9s NLCOMP + ERR_Ln9.ne16pg3_ne16pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq9s_bwic (Overall: NLFAIL) details: + FAIL ERR_Ln9.ne16pg3_ne16pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq9s_bwic NLCOMP + ERS_Ln9.f09_f09_mg17.FX2000.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERS_Ln9.f09_f09_mg17.FX2000.derecho_intel.cam-outfrq9s NLCOMP + ERS_Ln9.f19_f19_mg17.FXSD.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERS_Ln9.f19_f19_mg17.FXSD.derecho_intel.cam-outfrq9s NLCOMP + ERS_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s_ctem (Overall: NLFAIL) details: + FAIL ERS_Ln9.ne30pg3_ne30pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s_ctem NLCOMP + SCT_D_Ln7.ne3_ne3_mg37.QPC5.derecho_intel.cam-scm_prep (Overall: NLFAIL) details: + FAIL SCT_D_Ln7.ne3_ne3_mg37.QPC5.derecho_intel.cam-scm_prep NLCOMP + SMS_C2_D_Ln9.ne16pg3_ne16pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_C2_D_Ln9.ne16pg3_ne16pg3_mg17.FHISTC_WXma.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ld5.f09_f09_mt232.PC6.derecho_intel.cam-cam6_port_f09 (Overall: NLFAIL) details: + FAIL SMS_D_Ld5.f09_f09_mt232.PC6.derecho_intel.cam-cam6_port_f09 NLCOMP + SMS_D_Ld5.f19_f19_mt232.PC4.derecho_intel.cam-cam4_port5d (Overall: NLFAIL) details: + FAIL SMS_D_Ld5.f19_f19_mt232.PC4.derecho_intel.cam-cam4_port5d NLCOMP + SMS_D_Ln9.f09_f09_mg17.FCts2nudged.derecho_intel.cam-outfrq9s_leapday (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f09_f09_mg17.FCts2nudged.derecho_intel.cam-outfrq9s_leapday NLCOMP + SMS_D_Ln9.f09_f09_mg17.FCvbsxHIST.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f09_f09_mg17.FCvbsxHIST.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9.f09_f09_mg17.FSD.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f09_f09_mg17.FSD.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9.f19_f19_mg17.FCARMA2000climo.derecho_intel.cam-outfrq9s_carma_rad_diag (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mg17.FCARMA2000climo.derecho_intel.cam-outfrq9s_carma_rad_diag NLCOMP + SMS_D_Ln9.f19_f19_mg17.FCHIST_SLH.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mg17.FCHIST_SLH.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9.f19_f19_mg17.FWma2000climo.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mg17.FWma2000climo.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9.f19_f19_mg17.FWma2000climo.derecho_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mg17.FWma2000climo.derecho_intel.cam-outfrq9s_waccm_ma_mam4 NLCOMP + SMS_D_Ln9.f19_f19_mg17.QPC2000climo.derecho_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mg17.QPC2000climo.derecho_intel.cam-outfrq3s_usecase NLCOMP + SMS_D_Ln9.f19_f19_mt232.FHIST_C5.derecho_intel.cam-mam7 (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mt232.FHIST_C5.derecho_intel.cam-mam7 NLCOMP + SMS_D_Ln9.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9.ne16_ne16_mg17.QPX2000.derecho_intel.cam-outfrq9s_amie (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.ne16_ne16_mg17.QPX2000.derecho_intel.cam-outfrq9s_amie NLCOMP + SMS_D_Ln9.ne30pg3_ne30pg3_mt232.FHISTC_MTso.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mt232.FHISTC_MTso.derecho_intel.cam-outfrq9s NLCOMP + SMS_D_Ln9_P1280x1.ne30pg3_ne30pg3_mt232.FHISTC_MTt1s.derecho_intel.cam-outfrq9s_Leung_dust (Overall: NLFAIL) details: + FAIL SMS_D_Ln9_P1280x1.ne30pg3_ne30pg3_mt232.FHISTC_MTt1s.derecho_intel.cam-outfrq9s_Leung_dust NLCOMP + SMS_D_Ln9_P1536x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.derecho_intel.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9_P1536x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.derecho_intel.cam-outfrq9s NLCOMP + SMS_Ld1.f09_f09_mg17.FCHIST_GC.derecho_intel.cam-outfrq1d (Overall: NLFAIL) details: + FAIL SMS_Ld1.f09_f09_mg17.FCHIST_GC.derecho_intel.cam-outfrq1d NLCOMP + SMS_Ld1.f09_f09_mg17.FW2000climo.derecho_intel.cam-outfrq1d (Overall: NLFAIL) details: + FAIL SMS_Ld1.f09_f09_mg17.FW2000climo.derecho_intel.cam-outfrq1d NLCOMP + SMS_Ld1.ne30pg3_ne30pg3_mg17.FC2010climo.derecho_intel.cam-outfrq1d (Overall: NLFAIL) details: + FAIL SMS_Ld1.ne30pg3_ne30pg3_mg17.FC2010climo.derecho_intel.cam-outfrq1d NLCOMP + SMS_Lh12.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq3h (Overall: NLFAIL) details: + FAIL SMS_Lh12.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq3h NLCOMP + SMS_Ln9.f09_f09_mg17.F2010climo.derecho_intel.cam-nudging (Overall: NLFAIL) details: + FAIL SMS_Ln9.f09_f09_mg17.F2010climo.derecho_intel.cam-nudging NLCOMP + SMS_Ln9.f09_f09_mg17.FW1850.derecho_intel.cam-reduced_hist3s (Overall: NLFAIL) details: + FAIL SMS_Ln9.f09_f09_mg17.FW1850.derecho_intel.cam-reduced_hist3s NLCOMP + SMS_Ln9.f19_f19_mt232.F2000climo.derecho_intel.cam-silhs (Overall: NLFAIL) details: + FAIL SMS_Ln9.f19_f19_mt232.F2000climo.derecho_intel.cam-silhs NLCOMP + SMS_Ln9.ne30pg3_ne30pg3_mg17.FW2000climo.derecho_intel.cam-outfrq9s_rrtmgp (Overall: NLFAIL) details: + FAIL SMS_Ln9.ne30pg3_ne30pg3_mg17.FW2000climo.derecho_intel.cam-outfrq9s_rrtmgp NLCOMP + - NLCOMP failure due to CMEPS external update. + +derecho/nvhpc/aux_cam: All PASS + +izumi/nag/aux_cam: + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-outfrq9s_nochem (Overall: DIFF) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-outfrq9s_nochem NLCOMP + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-outfrq9s_nochem BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_4_196_nag: DIFF + - BAM ice nucleation answer change (roundoff) + + ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-outfrq3s_subcol (Overall: FAIL) details: + FAIL ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-outfrq3s_subcol NLCOMP + FAIL ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-outfrq3s_subcol COMPARE_base_rest + - pre-existing failure -- see https://github.com/ESCOMP/CAM/issues/1514 + + ERC_D_Ln27.ne3pg3_ne3pg3_mt232.FKESSLER.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln27.ne3pg3_ne3pg3_mt232.FKESSLER.izumi_nag.cam-outfrq9s NLCOMP + ERC_D_Ln9.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq9s_tuvx_waccm_ma_mam5 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq9s_tuvx_waccm_ma_mam5 NLCOMP + ERC_D_Ln9.f10_f10_mt232.FHIST.izumi_nag.cam-outfrq3s_cospsathist (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f10_f10_mt232.FHIST.izumi_nag.cam-outfrq3s_cospsathist NLCOMP + ERC_D_Ln9.mpasa480_mpasa480_mt232.FHS94.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa480_mpasa480_mt232.FHS94.izumi_nag.cam-outfrq9s NLCOMP + ERC_D_Ln9.mpasa480_mpasa480_mt232.QPC7.izumi_nag.cam-outfrq9s_mpasa480 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa480_mpasa480_mt232.QPC7.izumi_nag.cam-outfrq9s_mpasa480 NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-cosp_rad_diags (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-cosp_rad_diags NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC4.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC4.izumi_nag.cam-outfrq9s NLCOMP + ERC_D_Ln9_P1x1.ne3pg3_ne3pg3_mt232.FADIAB.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9_P1x1.ne3pg3_ne3pg3_mt232.FADIAB.izumi_nag.cam-outfrq9s NLCOMP + SMS_D_Ld2.f45_f45_mg37.PC5.izumi_nag.cam-outfrq24h_port (Overall: NLFAIL) details: + FAIL SMS_D_Ld2.f45_f45_mg37.PC5.izumi_nag.cam-outfrq24h_port NLCOMP + SMS_D_Ln3.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + FAIL SMS_D_Ln3.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s NLCOMP + SMS_D_Ln6.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem (Overall: NLFAIL) details: + FAIL SMS_D_Ln6.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem NLCOMP + SMS_D_Ln9.f10_f10_mt232.F1850.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f10_f10_mt232.F1850.izumi_nag.cam-outfrq9s NLCOMP + SMS_D_Ln9.ne3pg3_ne3pg3_mt232.QPC7.izumi_nag.cam-carma_test_tracers (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.ne3pg3_ne3pg3_mt232.QPC7.izumi_nag.cam-carma_test_tracers NLCOMP + TMC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-mc_ttrac (Overall: NLFAIL) details: + FAIL TMC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-mc_ttrac NLCOMP + - NLCOMP failure due to CMEPS external update. + +izumi/gnu/aux_cam: + ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-rad_diag (Overall: DIFF) details: + FAIL ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-rad_diag NLCOMP + FAIL ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-rad_diag BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_4_196_gnu: DIFF + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-nochem_clubbmf (Overall: DIFF) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-nochem_clubbmf NLCOMP + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-nochem_clubbmf BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_4_196_gnu: DIFF + - BAM ice nucleation answer change (roundoff) + + SMS_D_Ln3.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc (Overall: DIFF) details: + FAIL SMS_D_Ln3.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc NLCOMP + FAIL SMS_D_Ln3.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_4_196_gnu: DIFF + - Prognostic BAM answer change due to bug fix. + + ERC_D_Ln9.C48_C48_mg17.QPC6.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.C48_C48_mg17.QPC6.izumi_gnu.cam-outfrq9s NLCOMP + ERC_D_Ln9.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags NLCOMP + ERC_D_Ln9.f19_f19_mt232.FHIST.izumi_gnu.cam-lonlat_fv_diags (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.f19_f19_mt232.FHIST.izumi_gnu.cam-lonlat_fv_diags NLCOMP + ERC_D_Ln9.mpasa480_mpasa480_mt232.FHISTC_LTso.izumi_gnu.cam-outfrq9s_mpasa480 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.mpasa480_mpasa480_mt232.FHISTC_LTso.izumi_gnu.cam-outfrq9s_mpasa480 NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.F1850_C4.izumi_gnu.cam-co2rmp (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.F1850_C4.izumi_gnu.cam-co2rmp NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FGRAYRAD.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FGRAYRAD.izumi_gnu.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST_C5.izumi_gnu.cam-carma_cosp_rad_diag_mam (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST_C5.izumi_gnu.cam-carma_cosp_rad_diag_mam NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_gnu.cam-sat_lcltod (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_gnu.cam-sat_lcltod NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FTJ16.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FTJ16.izumi_gnu.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC5.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC5.izumi_gnu.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC7.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne3pg3_ne3pg3_mt232.QPC7.izumi_gnu.cam-outfrq9s NLCOMP + ERC_D_Ln9.ne5_ne5_mg37.QPC4.izumi_gnu.cam-outfrq3s_nudging_ne5_L26 (Overall: NLFAIL) details: + FAIL ERC_D_Ln9.ne5_ne5_mg37.QPC4.izumi_gnu.cam-outfrq3s_nudging_ne5_L26 NLCOMP + ERS_Ln9_P24x1.mpasa480_mpasa480.F2000climo.izumi_gnu.cam-outfrq9s_mpasa480 (Overall: NLFAIL) details: + FAIL ERS_Ln9_P24x1.mpasa480_mpasa480.F2000climo.izumi_gnu.cam-outfrq9s_mpasa480 NLCOMP + PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + FAIL PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal0 NLCOMP + PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + FAIL PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal1 NLCOMP + PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + FAIL PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal3 NLCOMP + SCT_D_Ln7.ne3_ne3_mg37.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: NLFAIL) details: + FAIL SCT_D_Ln7.ne3_ne3_mg37.QPC6.izumi_gnu.cam-scm_prep_c6 NLCOMP + SMS_D_Ln3.ne3pg3_ne3pg3_mt232.PC7.izumi_gnu.cam-pc7_ne3pg3 (Overall: NLFAIL) details: + FAIL SMS_D_Ln3.ne3pg3_ne3pg3_mt232.PC7.izumi_gnu.cam-pc7_ne3pg3 NLCOMP + SMS_D_Ln9.f10_f10_mg37.FWmaHIST.izumi_gnu.cam-outfrq9s_mee_fluxes (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f10_f10_mg37.FWmaHIST.izumi_gnu.cam-outfrq9s_mee_fluxes NLCOMP + SMS_D_Ln9.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee NLCOMP + SMS_D_Ln9.f19_f19_mt232.FW4madSD.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SMS_D_Ln9.f19_f19_mt232.FW4madSD.izumi_gnu.cam-outfrq9s NLCOMP + SUB_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + FAIL SUB_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-outfrq9s NLCOMP + - NLCOMP failure due to CMEPS external update. + +Summarize any changes to answers: +- BAM compsets answer change due to bug fix and removal of bfb shim for ice nucleation +- NLCOMP failure due to cmeps external update: + DRIVER_attributes->PELAYOUT_attributes->ALLCOMP_attributes: + - MED_model : cesm + + MED_model : cmeps + DRIVER_attributes->PELAYOUT_attributes->ALLCOMP_attributes->MED_attributes: + histaux_wav2med_file1_flds as key +- T4S test answer change due to updated IC file from S. Tilmes, F. Vitt +- All other answers bit-for-bit =============================================================== diff --git a/src/chemistry/aerosol/aerosol_optics_core.F90 b/src/chemistry/aerosol/aerosol_optics_core.F90 index 63d47f8496..d4726d3891 100644 --- a/src/chemistry/aerosol/aerosol_optics_core.F90 +++ b/src/chemistry/aerosol/aerosol_optics_core.F90 @@ -13,7 +13,8 @@ module aerosol_optics_core public :: aerosol_optics_sw_bin public :: aerosol_optics_lw_bin - ! Jasper Kok et al. (2017) Fig. 1d: 20-60 % higher mass extinction efficiency + ! Jasper Kok et al. (2017) https://doi.org/10.1038/ngeo2912 + ! Fig. 1d: 20-60 % higher mass extinction efficiency ! because dust is aspherical. Currently not captured by the spherical assumption ! in the optical calculation. Asphericity is strong for D > 1 um (coarse mode). real(r8), parameter, public :: dustaspherical_opts = 1.3_r8 diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index db2f740226..b50af8b6b0 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -35,7 +35,7 @@ module aerosol_properties_mod real(r8), allocatable :: rhcrystal_(:) ! crystallization RH real(r8), allocatable :: rhdeliques_(:) ! deliquescence RH ! Abdul-Razzak, H., S.J. Ghan, and C. Rivera-Carpio, A parameterization of aerosol activation, - ! 1, Singleaerosoltype. J. Geophys. Res., 103, 6123-6132, 1998. + ! 1, Singleaerosoltype. J. Geophys. Res., 103, 6123-6132, 1998. https://doi.org/10.1029/97JD03735 real(r8) :: soa_equivso4_factor_ = -huge(1._r8) real(r8) :: pom_equivso4_factor_ = -huge(1._r8) integer, public :: list_idx_ = 0 ! radiation list index (0=climate) @@ -702,13 +702,14 @@ end function get_rhdeliques !------------------------------------------------------------------------------ ! returns maximum supersaturation !------------------------------------------------------------------------------ - function maxsat(self, zeta,eta,smc) result(smax) + pure function maxsat(self, zeta,eta,smc) result(smax) !------------------------------------------------------------------------- ! Calculates maximum supersaturation for multiple competing aerosols. ! ! Abdul-Razzak and Ghan, A parameterization of aerosol activation. ! 2. Multiple aerosol types. J. Geophys. Res., 105, 6837-6844., 2000 + ! https://doi.org/10.1029/1999JD901161 !------------------------------------------------------------------------- class(aerosol_properties), intent(in) :: self diff --git a/src/chemistry/aerosol/aerosol_state_mod.F90 b/src/chemistry/aerosol/aerosol_state_mod.F90 index 2242717cd8..9cf6bdf47a 100644 --- a/src/chemistry/aerosol/aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/aerosol_state_mod.F90 @@ -1,7 +1,6 @@ module aerosol_state_mod use shr_kind_mod, only: r8 => shr_kind_r8 use aerosol_properties_mod, only: aerosol_properties, aero_name_len - use physconst, only: pi implicit none @@ -753,7 +752,7 @@ end function coated_frac ! returns the radius [m] of particles in aerosol subset `bin_ndx` assuming all particles are ! the same size and only species `species_ndx` contributes to the particle volume !------------------------------------------------------------------------------ - function mass_mean_radius(self, bin_ndx, species_ndx, ncol, nlev, aero_props, rho) result(radius) + function mass_mean_radius(self, bin_ndx, species_ndx, ncol, nlev, aero_props, rho, pi) result(radius) class(aerosol_state), intent(in) :: self integer, intent(in) :: bin_ndx ! bin number @@ -762,6 +761,7 @@ function mass_mean_radius(self, bin_ndx, species_ndx, ncol, nlev, aero_props, rh integer, intent(in) :: nlev ! number of vertical levels class(aerosol_properties), intent(in) :: aero_props ! aerosol properties object real(r8), intent(in) :: rho(:,:) ! air density (kg m-3) + real(r8), intent(in) :: pi real(r8) :: radius(ncol,nlev) ! m diff --git a/src/chemistry/aerosol/bulk_aerosol_properties_mod.F90 b/src/chemistry/aerosol/bulk_aerosol_properties_mod.F90 index 4b68185b58..e5f365cc1e 100644 --- a/src/chemistry/aerosol/bulk_aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/bulk_aerosol_properties_mod.F90 @@ -64,39 +64,41 @@ function constructor(list_idx) result(newobj) integer, optional, intent(in) :: list_idx ! radiation list index (0=climate) type(bulk_aerosol_properties), pointer :: newobj - integer,allocatable :: nspecies(:) - real(r8),allocatable :: alogsig(:) - real(r8),allocatable :: f1(:) + integer, allocatable :: nspecies(:) + real(r8), allocatable :: alogsig(:) + real(r8), allocatable :: f1(:) integer :: ierr, naero, i + character(len=256) :: alloc_errmsg integer :: list_idx_loc real(r8) :: dispersion_val + character(len=*), parameter :: subname = 'bulk_aerosol_properties::constructor' list_idx_loc = 0 if (present(list_idx)) list_idx_loc = list_idx - allocate(newobj,stat=ierr) + allocate(newobj, stat=ierr, errmsg=alloc_errmsg) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': ' // alloc_errmsg) end if call rad_aer_get_info(list_idx_loc, naero=naero) ! Here treat each aerosol as a separate bin - allocate( nspecies(naero),stat=ierr ) + allocate(nspecies(naero), stat=ierr, errmsg=alloc_errmsg) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': ' // alloc_errmsg) end if - allocate( alogsig(naero),stat=ierr ) + allocate(alogsig(naero), stat=ierr, errmsg=alloc_errmsg) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': ' // alloc_errmsg) end if - allocate( f1(naero),stat=ierr ) + allocate(f1(naero), stat=ierr, errmsg=alloc_errmsg) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': ' // alloc_errmsg) end if ! Bulk aerosols have 1 chemical species in each bin @@ -120,7 +122,7 @@ function constructor(list_idx) result(newobj) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': failed to initialize object') end if end function constructor diff --git a/src/chemistry/aerosol/bulk_aerosol_state_mod.F90 b/src/chemistry/aerosol/bulk_aerosol_state_mod.F90 index 2c884c521e..7dc171d271 100644 --- a/src/chemistry/aerosol/bulk_aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/bulk_aerosol_state_mod.F90 @@ -61,8 +61,6 @@ module bulk_aerosol_state_mod procedure :: aqu_gain_binfraction procedure :: surf_area_dens procedure :: get_bulk_num_and_mass - ! for bit-for-bit - procedure :: nuclice_get_numdens => nuclice_get_numdens_bam final :: destructor @@ -86,12 +84,14 @@ function constructor(ncol, host, list_idx) result(newobj) integer, intent(in), optional :: list_idx type(bulk_aerosol_state), pointer :: newobj + character(len=*), parameter :: subname = 'bulk_aerosol_state::constructor' integer :: ierr + character(len=256) :: alloc_errmsg - allocate(newobj,stat=ierr) + allocate(newobj, stat=ierr, errmsg=alloc_errmsg) if( ierr /= 0 ) then nullify(newobj) - return + call endrun(subname//': newobj allocation error: '//trim(alloc_errmsg)) end if newobj%host_ = host @@ -104,11 +104,15 @@ function constructor(ncol, host, list_idx) result(newobj) ! Allocate per-object workspace for derived number fields. ! Thread-safe: in CAM, each chunk has its own state object. - allocate(newobj%num_work_(pcols, pver), stat=ierr) - if (ierr /= 0) call endrun('bulk_aerosol_state constructor: num_work_ allocation error') + allocate(newobj%num_work_(pcols, pver), stat=ierr, errmsg=alloc_errmsg) + if (ierr /= 0) then + call endrun(subname//': num_work_ allocation error: '//trim(alloc_errmsg)) + end if newobj%num_work_(:,:) = 0._r8 - allocate(newobj%zero_fld_(pcols, pver), stat=ierr) - if (ierr /= 0) call endrun('bulk_aerosol_state constructor: zero_fld_ allocation error') + allocate(newobj%zero_fld_(pcols, pver), stat=ierr, errmsg=alloc_errmsg) + if (ierr /= 0) then + call endrun(subname//': zero_fld_ allocation error: '//trim(alloc_errmsg)) + end if newobj%zero_fld_(:,:) = 0._r8 end function constructor @@ -662,8 +666,8 @@ subroutine surf_area_dens(self, aero_props, types_list, ncol, nlev, beglev, endl factor = (relhum(i,k) - table_rh(rh_l))/(table_rh(rh_u) - table_rh(rh_l)) rfac_sulf = table_rfac_sulf(rh_l) + factor*(table_rfac_sulf(rh_u) - table_rfac_sulf(rh_l)) - rfac_oc = table_rfac_oc(rh_u) + factor*(table_rfac_oc(rh_u) - table_rfac_oc(rh_l)) - rfac_bc = table_rfac_bc(rh_u) + factor*(table_rfac_bc(rh_u) - table_rfac_bc(rh_l)) + rfac_oc = table_rfac_oc(rh_l) + factor*(table_rfac_oc(rh_u) - table_rfac_oc(rh_l)) + rfac_bc = table_rfac_bc(rh_l) + factor*(table_rfac_bc(rh_u) - table_rfac_bc(rh_l)) end if dm_sulf_wet = dm_sulf * rfac_sulf @@ -789,8 +793,8 @@ subroutine get_bulk_num_and_mass(self, bin_ndx, ncol, rho, naer2, maerosol) ! Note: only SULFATE gets the scale factor here. ! Volcanic aerosol (which also has spectype 'sulfate') does not get scaled in the ! ndrop_bam/CCN path (which only scales idxsul, SULFATE here) - ! Ice nucleation has been unified to also use this path, but it does scale volcanic - ! aerosol; it will apply this scale factor separately. + ! Ice nucleation instead derives numbers via get_ambient_num, which does apply + ! the scale factor to volcanic aerosol as well. maerosol(:ncol,:) = mmr(:ncol,:) * rho(:ncol,:) select case ( to_lower( aname(:4) ) ) @@ -802,78 +806,4 @@ subroutine get_bulk_num_and_mass(self, bin_ndx, ncol, rho, naer2, maerosol) end subroutine get_bulk_num_and_mass - ! NOTE on bit-for-bit: The base-class nuclice_get_numdens computes: - ! size_wght * type_wght * num_col(#/kg) * rho * per_cm3 - ! where for BAM: num_col = mmr * ntm [* bam_sulfate_scale], size_wght = 1/25, type_wght = 1.0 - ! giving: (1/25) * 1.0 * (mmr * ntm) * rho * 1e-6 - ! - ! The original inline BAM code (nucleate_ice_cam.F90, removed) computed: - ! naer2 = aer_mmr * rho * ntm (mmr * rho first, then * ntm) - ! dust_num = naer2 / 25 * 1e-6 - ! giving: (mmr * rho * ntm) / 25 * 1e-6 - ! - ! These differ only in floating-point operation order (associativity). - ! It has been shown that this rearranging causes answer differences, so we - ! use this subroutine to replicate the original behavior. - subroutine nuclice_get_numdens_bam(self, aero_props, use_preexisting_ice, & - ncol, nlev, rho, dust_num_col, sulf_num_col, soot_num_col, sulf_num_tot_col) - !REMOVECAM: host-model specific dimensions - use ppgrid, only: pcols, pver - !REMOVECAM_END - - class(bulk_aerosol_state), intent(in) :: self - class(aerosol_properties), intent(in) :: aero_props - logical, intent(in) :: use_preexisting_ice - integer, intent(in) :: ncol - integer, intent(in) :: nlev - real(r8), intent(in) :: rho(:,:) - real(r8), intent(out) :: dust_num_col(:,:) - real(r8), intent(out) :: sulf_num_col(:,:) - real(r8), intent(out) :: soot_num_col(:,:) - real(r8), intent(out) :: sulf_num_tot_col(:,:) - - real(r8) :: naer2_1bin(ncol,nlev) - real(r8) :: maerosol_1bin(ncol,nlev) - character(len=32) :: spectype, aname - integer :: m, i, k - real(r8), parameter :: per_cm3 = 1.e-6_r8 - - dust_num_col(:,:) = 0._r8 - sulf_num_col(:,:) = 0._r8 - soot_num_col(:,:) = 0._r8 - sulf_num_tot_col(:,:) = 0._r8 - - do m = 1, aero_props%nbins() - call aero_props%species_type(m, 1, spectype) - call self%get_bulk_num_and_mass(m, ncol, rho, naer2_1bin, maerosol_1bin) - - ! get_bulk_num_and_mass only applied bam_sulfate_scale to SULFATE (by name). - ! For the nucleate_ice path, volcanic aerosol (spectype 'sulfate', name 'volc*') - ! also needs the scale, matching the original inline code which scaled ALL - ! spectype=='sulfate' bins including volcanic aerosol, so we will do it here: - ! (but do not do it again for SULFATE) - if (spectype == 'sulfate') then - call rad_aer_get_props(self%list_idx_, m, aername=aname) - if (to_lower(aname(:4)) == 'volc') then - naer2_1bin(:ncol,:nlev) = naer2_1bin(:ncol,:nlev) * bam_sulfate_scale - end if - end if - - do k = 1, nlev - do i = 1, ncol - select case (trim(spectype)) - case ('dust') - dust_num_col(i,k) = dust_num_col(i,k) + naer2_1bin(i,k) / bam_icenuc_size_wght_denom * per_cm3 - case ('sulfate') - sulf_num_col(i,k) = sulf_num_col(i,k) + naer2_1bin(i,k) / bam_icenuc_size_wght_denom * per_cm3 - sulf_num_tot_col(i,k) = sulf_num_tot_col(i,k) + naer2_1bin(i,k) / bam_icenuc_size_wght_denom * per_cm3 - case ('black-c') - soot_num_col(i,k) = soot_num_col(i,k) + naer2_1bin(i,k) / bam_icenuc_size_wght_denom * per_cm3 - end select - end do - end do - end do - - end subroutine nuclice_get_numdens_bam - end module bulk_aerosol_state_mod diff --git a/src/chemistry/aerosol/hygro_aerosol_optics_mod.F90 b/src/chemistry/aerosol/hygro_aerosol_optics_mod.F90 index b116cddf94..b7ec6d2596 100644 --- a/src/chemistry/aerosol/hygro_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/hygro_aerosol_optics_mod.F90 @@ -154,6 +154,13 @@ subroutine destructor(self) deallocate(self%wrh) deallocate(self%krh) + ! table and mmr pointers are views of data owned elsewhere; disassociate only + nullify(self%ext_sw) + nullify(self%ssa_sw) + nullify(self%asm_sw) + nullify(self%abs_lw) + nullify(self%mmr) + end subroutine destructor end module hygro_aerosol_optics_mod diff --git a/src/chemistry/aerosol/hygroscopic_aerosol_optics_mod.F90 b/src/chemistry/aerosol/hygroscopic_aerosol_optics_mod.F90 index d1d9fd656b..3efd943ddc 100644 --- a/src/chemistry/aerosol/hygroscopic_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/hygroscopic_aerosol_optics_mod.F90 @@ -159,6 +159,13 @@ subroutine destructor(self) deallocate(self%wrh) deallocate(self%krh) + ! table and mmr pointers are views of data owned elsewhere; disassociate only + nullify(self%ext_sw) + nullify(self%ssa_sw) + nullify(self%asm_sw) + nullify(self%abs_lw) + nullify(self%mmr) + end subroutine destructor end module hygroscopic_aerosol_optics_mod diff --git a/src/chemistry/aerosol/insoluble_aerosol_optics_mod.F90 b/src/chemistry/aerosol/insoluble_aerosol_optics_mod.F90 index 3b9f9228c2..e715d1017f 100644 --- a/src/chemistry/aerosol/insoluble_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/insoluble_aerosol_optics_mod.F90 @@ -74,6 +74,13 @@ subroutine destructor(self) type(insoluble_aerosol_optics), intent(inout) :: self + ! table and mmr pointers are views of data owned elsewhere; disassociate only + nullify(self%lw_abs) + nullify(self%sw_ext) + nullify(self%sw_ssa) + nullify(self%sw_asm) + nullify(self%mmr) + end subroutine destructor !------------------------------------------------------------------------------ diff --git a/src/chemistry/aerosol/volcrad_aerosol_optics_mod.F90 b/src/chemistry/aerosol/volcrad_aerosol_optics_mod.F90 index 58059706a5..0996d707b1 100644 --- a/src/chemistry/aerosol/volcrad_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/volcrad_aerosol_optics_mod.F90 @@ -196,6 +196,14 @@ subroutine destructor(self) deallocate(self%wmu) deallocate(self%kmu) + ! table and mmr pointers are views of data owned elsewhere; disassociate only + nullify(self%r_sw_ext) + nullify(self%r_sw_scat) + nullify(self%r_sw_ascat) + nullify(self%r_lw_abs) + nullify(self%r_mu) + nullify(self%mmr) + end subroutine destructor end module volcrad_aerosol_optics_mod diff --git a/src/chemistry/utils/modal_aero_wateruptake.F90 b/src/chemistry/utils/modal_aero_wateruptake.F90 index 0f14d81fac..6a9451a584 100644 --- a/src/chemistry/utils/modal_aero_wateruptake.F90 +++ b/src/chemistry/utils/modal_aero_wateruptake.F90 @@ -115,7 +115,7 @@ subroutine modal_aero_wateruptake_init(pbuf2d) 'dry dgnum, interstitial, mode '//trnum(2:3)) call addfld('dgnw_a'//trnum(2:3), (/ 'lev' /), 'A', 'm', & 'wet dgnum, interstitial, mode '//trnum(2:3)) - call addfld('wat_a'//trnum(3:3), (/ 'lev' /), 'A', 'm', & + call addfld('wat_a'//trnum(3:3), (/ 'lev' /), 'A', 'kg kg-1', & 'aerosol water, interstitial, mode '//trnum(2:3)) ! determine default variables diff --git a/src/physics/cam/hetfrz_classnuc_cam.F90 b/src/physics/cam/hetfrz_classnuc_cam.F90 index 175ba8cfbb..d50216bcbe 100644 --- a/src/physics/cam/hetfrz_classnuc_cam.F90 +++ b/src/physics/cam/hetfrz_classnuc_cam.F90 @@ -442,7 +442,7 @@ subroutine hetfrz_classnuc_cam_calc(aero_props, aero_state, state, deltatin, fac call outfld(amb_dens_hnames(i), amb_aer_num(:,:,i), pcols, lchnk) call outfld(cld_dens_hnames(i), cld_aer_num(:,:,i), pcols, lchnk) - aer_radius(:ncol,:,i) = aero_state%mass_mean_radius( indices(i)%bin_ndx, indices(i)%spc_ndx, ncol, pver, aero_props, rho ) + aer_radius(:ncol,:,i) = aero_state%mass_mean_radius( indices(i)%bin_ndx, indices(i)%spc_ndx, ncol, pver, aero_props, rho, pi ) coated(:ncol,:,i) = aero_state%coated_frac( indices(i)%bin_ndx, types(i), ncol, pver, aero_props, aer_radius(:,:,i) ) diff --git a/src/physics/cam/physpkg.F90 b/src/physics/cam/physpkg.F90 index 46116c39ab..98aded5110 100644 --- a/src/physics/cam/physpkg.F90 +++ b/src/physics/cam/physpkg.F90 @@ -2138,6 +2138,7 @@ subroutine tphysbc (ztodt, state, & use physics_types, only: physics_state, physics_tend, physics_ptend, & physics_update, physics_ptend_init, physics_ptend_sum, & physics_state_check, physics_ptend_scale, & + physics_state_copy, physics_ptend_copy, & dyn_te_idx use cam_diagnostics, only: diag_conv_tend_ini, diag_phys_writeout, diag_conv, diag_export, diag_state_b4_phys_write use cam_diagnostics, only: diag_clip_tend_writeout @@ -2206,6 +2207,8 @@ subroutine tphysbc (ztodt, state, & type(physics_ptend) :: ptend_sc ! ptend for sub-columns type(physics_ptend) :: ptend_aero ! ptend for microp_aero type(physics_ptend) :: ptend_aero_sc ! ptend for microp_aero on sub-columns + type(physics_state) :: state_snap ! state copy for the post-apply microp_aero snapshot + type(physics_ptend) :: ptend_snap ! ptend_aero copy for the snapshot apply type(physics_tend) :: tend_sc ! tend for sub-columns integer :: nstep ! current timestep number @@ -2788,10 +2791,32 @@ subroutine tphysbc (ztodt, state, & call carma_diags_obj%update(cam_in, state, pbuf) + if (trim(cam_take_snapshot_before) == "microp_aero") then + call cam_snapshot_all_outfld_tphysbc(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf, & + flx_heat, cmfmc, cmfcme, zdu, rliq, dlf, dlf2, rliq2, det_s, det_ice, net_flx) + end if + call t_startf('microp_aero_run') call microp_aero_run(state, ptend_aero, cld_macmic_ztodt, pbuf) call t_stopf('microp_aero_run') + if ( (trim(cam_take_snapshot_after) == "microp_aero") .and. & + (trim(cam_take_snapshot_before) == trim(cam_take_snapshot_after))) then + call cam_snapshot_ptend_outfld(ptend_aero, lchnk) + end if + + if (trim(cam_take_snapshot_after) == "microp_aero") then + ! ptend_aero is only applied to state by the combined physics_update + ! after the microphysics, so apply it to copies here to snapshot the + ! post-apply constituents: + call physics_state_copy(state, state_snap) + call physics_ptend_copy(ptend_aero, ptend_snap) + call physics_update(state_snap, ptend_snap, cld_macmic_ztodt) + call cam_snapshot_all_outfld_tphysbc(cam_snapshot_after_num, state_snap, tend, cam_in, cam_out, pbuf, & + flx_heat, cmfmc, cmfcme, zdu, rliq, dlf, dlf2, rliq2, det_s, det_ice, net_flx) + call physics_state_dealloc(state_snap) + end if + if (trim(cam_take_snapshot_before) == "pumas_tend") then call cam_snapshot_all_outfld_tphysbc(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf, & flx_heat, cmfmc, cmfcme, zdu, rliq, dlf, dlf2, rliq2, det_s, det_ice, net_flx) diff --git a/src/physics/cam7/physpkg.F90 b/src/physics/cam7/physpkg.F90 index 1e25131b6b..199ace2704 100644 --- a/src/physics/cam7/physpkg.F90 +++ b/src/physics/cam7/physpkg.F90 @@ -1423,7 +1423,8 @@ subroutine tphysac (ztodt, cam_in, & use cam_snapshot_common,only: cam_snapshot_ptend_outfld use lunar_tides, only: lunar_tides_tend use ssatcontrail, only: ssatcontrail_d0 - use physics_types, only: physics_ptend_init, physics_ptend_sum, physics_ptend_scale + use physics_types, only: physics_ptend_init, physics_ptend_sum, physics_ptend_scale, & + physics_state_copy, physics_ptend_copy use microp_driver, only: microp_driver_tend use microp_aero, only: microp_aero_run use clubb_intr, only: clubb_tend_cam, clubb_emissions_cam @@ -1473,6 +1474,8 @@ subroutine tphysac (ztodt, cam_in, & type(physics_ptend) :: ptend_sc ! ptend for sub-columns type(physics_ptend) :: ptend_aero ! ptend for microp_aero type(physics_ptend) :: ptend_aero_sc ! ptend for microp_aero on sub-columns + type(physics_state) :: state_snap ! state copy for the post-apply microp_aero snapshot + type(physics_ptend) :: ptend_snap ! ptend_aero copy for the snapshot apply type(physics_tend) :: tend_sc ! tend for sub-columns integer :: nstep ! current timestep number @@ -1834,10 +1837,32 @@ subroutine tphysac (ztodt, cam_in, & call check_energy_timestep_init(state_sc, tend_sc, pbuf, col_type_subcol) end if + if (trim(cam_take_snapshot_before) == "microp_aero") then + call cam_snapshot_all_outfld_tphysac(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf, & + fh2o, surfric, obklen, flx_heat, cmfmc, dlf, det_s, det_ice, net_flx) + end if + call t_startf('microp_aero_run') call microp_aero_run(state, ptend_aero, cld_macmic_ztodt, pbuf) call t_stopf('microp_aero_run') + if ( (trim(cam_take_snapshot_after) == "microp_aero") .and. & + (trim(cam_take_snapshot_before) == trim(cam_take_snapshot_after))) then + call cam_snapshot_ptend_outfld(ptend_aero, lchnk) + end if + + if (trim(cam_take_snapshot_after) == "microp_aero") then + ! ptend_aero is only applied to state by the combined physics_update + ! after the microphysics, so apply it to copies here to snapshot the + ! post-apply constituents: + call physics_state_copy(state, state_snap) + call physics_ptend_copy(ptend_aero, ptend_snap) + call physics_update(state_snap, ptend_snap, cld_macmic_ztodt) + call cam_snapshot_all_outfld_tphysac(cam_snapshot_after_num, state_snap, tend, cam_in, cam_out, pbuf, & + fh2o, surfric, obklen, flx_heat, cmfmc, dlf, det_s, det_ice, net_flx) + call physics_state_dealloc(state_snap) + end if + call t_startf('microp_tend') if (trim(cam_take_snapshot_before) == "pumas_tend") then