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