Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
path = src/physics/ali_arms
url = https://github.com/ESCOMP/ALI-ARMS
fxrequired = AlwaysRequired
fxtag = ALI_ARMS_v1.0.1
fxtag = ALI_ARMS_v1.0.2
fxDONOTUSEurl = https://github.com/ESCOMP/ALI-ARMS

[submodule "atmos_phys"]
Expand Down
114 changes: 114 additions & 0 deletions doc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,119 @@
===============================================================

Tag name: cam6_4_162
Originator(s): fvitt
Date: 2 Apr 2026
One-line Summary: Fix issue with aerosol optics diagnostics; GNU Fortran compiler workarounds
Github PR URLs:
https://github.com/ESCOMP/CAM/pull/1500
https://github.com/ESCOMP/CAM/pull/1520

Purpose of changes (include the issue number and title text for each relevant GitHub issue):

Fix issues with aerosol optics diagnostics for bulk and prescribed volcanic aerosols
-- issue #1497

Fix compile errors with GNU Fortran 14.3.0 on Derecho
-- issues #1512 and #1519

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: cacraigucar, jimmielin

List all files eliminated: N/A

List all files added and what they do:

List all existing files that have been modified, and describe the changes:
M .gitmodules
M src/physics/ali_arms
- update ALI-ARMS tag -- gnu compiler fix

M src/chemistry/mozart/mo_tuvx.F90
- gnu compiler bug workaround

M src/chemistry/aerosol/bulk_aerosol_state_mod.F90
- define volume functions used in aerosol optics diags

M src/physics/cam/aerosol_optics_cam.F90
- changes for bulk and prescribed volcanic aerosol optics diags

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:
DIFF ERC_D_Ln9.f09_f09_mt232.FHIST_BDRD.derecho_intel.cam-outfrq9s
DIFF ERC_D_Ln9.f19_f19_mg17.QPMOZ.derecho_intel.cam-outfrq3s
DIFF ERC_D_Ln9.mpasa120_mpasa120.F2000climo.derecho_intel.cam-outfrq9s_mpasa120
DIFF ERC_D_Ln9.mpasa120_mpasa120.FHISTC_LTso.derecho_intel.cam-outfrq9s_mpasa120
DIFF ERC_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_LTso.derecho_intel.cam-outfrq9s
DIFF ERC_Ln9.C96_C96_mt232.F2000climo.derecho_intel.cam-outfrq9s
DIFF ERI_D_Ln18.f09_f09_mt232.FHIST.derecho_intel.cam-outfrq3s_eri
DIFF ERI_D_Ln18.f19_f19_mt232.FHIST_C5.derecho_intel.cam-outfrq3s_eri
DIFF ERI_D_Ln18.ne16pg3_ne16pg3_mt232.FHIST_C4.derecho_intel.cam-outfrq3s_eri
DIFF ERI_D_Ln18.ne30pg3_ne30pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq3s_eri
DIFF ERP_D_Ln9.ne30pg3_ne30pg3_mt232.F1850C_MTso.derecho_intel.cam-outfrq9s
DIFF ERP_Lh12.f19_f19_mg17.FW4madSD.derecho_intel.cam-outfrq3h
DIFF ERP_Ln9.f19_f19_mg17.FWsc1850.derecho_intel.cam-outfrq9s
DIFF ERR_Ln9.ne16pg3_ne16pg3_mt232.FHISTC_LTso.derecho_intel.cam-outfrq9s_bwic
DIFF SMS_D_Ln9.f09_f09_mg17.FSD.derecho_intel.cam-outfrq9s
DIFF SMS_D_Ln9.f19_f19_mt232.FHIST_C5.derecho_intel.cam-mam7
DIFF SMS_D_Ln9.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.derecho_intel.cam-outfrq9s
DIFF SMS_D_Ln9.ne30pg3_ne30pg3_mt232.FHISTC_MTso.derecho_intel.cam-outfrq9s
- expected differences in aerosol optical properties, otherwise bit-for-bit

derecho/nvhpc/aux_cam:
FAIL ERS_Ln9.ne30pg3_ne30pg3_mt232.FHISTC_LTso.derecho_nvhpc.cam-outfrq9s_gpu_default BASELINE /glade/campaign/cesm/community/amwg/cam_baselines/cam6_4_161_nvhpc: DIFF
- expected differences in aerosol optical properties, otherwise bit-for-bit

FAIL ERS_Ln9.ne30pg3_ne30pg3_mt232.FHISTC_LTso.derecho_nvhpc.cam-outfrq9s_gpu_default COMPARE_base_rest
- pre-existing failure -- see https://github.com/ESCOMP/CAM/issues/1513

izumi/nag/aux_cam:
FAIL ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-outfrq3s_subcol
- pre-existing failure -- see https://github.com/ESCOMP/CAM/issues/1514

DIFF ERC_D_Ln9.f10_f10_mt232.FHIST.izumi_nag.cam-outfrq3s_cospsathist
DIFF ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-cosp_rad_diags
DIFF ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_nag.cam-outfrq9s_nochem
DIFF SMS_D_Ln6.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem
DIFF SMS_D_Ln9.f10_f10_mt232.F1850.izumi_nag.cam-outfrq9s
DIFF TMC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_nag.cam-mc_ttrac
- expected differences in aerosol optical properties, otherwise bit-for-bit

izumi/gnu/aux_cam:
DIFF ERC_D_Ln9.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags
DIFF ERC_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-rad_diag
DIFF ERC_D_Ln9.f19_f19_mt232.FHIST.izumi_gnu.cam-lonlat_fv_diags
DIFF ERC_D_Ln9.mpasa480_mpasa480_mt232.FHISTC_LTso.izumi_gnu.cam-outfrq9s_mpasa480
DIFF ERC_D_Ln9.ne3pg3_ne3pg3_mt232.F1850_C4.izumi_gnu.cam-co2rmp
DIFF ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHISTC_LTso.izumi_gnu.cam-sat_lcltod
DIFF ERC_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-nochem_clubbmf
DIFF ERS_Ln9_P24x1.mpasa480_mpasa480.F2000climo.izumi_gnu.cam-outfrq9s_mpasa480
DIFF PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal0
DIFF PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal1
DIFF PLB_D_Ln9.f10_f10_mt232.FHIST_C5.izumi_gnu.cam-ttrac_loadbal3
DIFF SMS_D_Ln3.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc
DIFF SMS_D_Ln9.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee
DIFF SMS_D_Ln9.f19_f19_mt232.FW4madSD.izumi_gnu.cam-outfrq9s
DIFF SUB_D_Ln9.ne3pg3_ne3pg3_mt232.FHIST.izumi_gnu.cam-outfrq9s
- expected differences in aerosol optical properties, otherwise bit-for-bit

Summarize any changes to answers:

changes in aerosol optics diagnostics , otherwise bit-for-bit

===============================================================
===============================================================

Tag name: cam6_4_161
Originator(s): fvitt
Date: 27 Mar 2026
Expand Down
14 changes: 10 additions & 4 deletions src/chemistry/aerosol/bulk_aerosol_state_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module bulk_aerosol_state_mod
use shr_kind_mod, only: r8 => shr_kind_r8
use rad_constituents, only: rad_cnst_get_aer_mmr
use cam_abortutils, only: endrun

use physics_buffer, only: physics_buffer_desc
use physics_types, only: physics_state

Expand Down Expand Up @@ -336,8 +336,13 @@ function dry_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol)
integer, intent(in) :: nlev ! number of levels

real(r8) :: vol(ncol,nlev) ! m3/kg
real(r8), pointer :: mmr(:,:) ! kg/kg
real(r8) :: dens ! kg/m3

call aero_props%get(bin_idx, 1, density=dens)
call self%get_ambient_mmr(list_idx, 1, bin_idx, mmr)

vol = -huge(1._r8)
vol(:ncol,:nlev) = mmr(:ncol,:nlev)/dens

end function dry_volume

Expand All @@ -356,7 +361,8 @@ function wet_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol)

real(r8) :: vol(ncol,nlev) ! m3/kg

vol = -huge(1._r8)
vol = self%dry_volume(aero_props, list_idx, bin_idx, ncol, nlev) &
+ self%water_volume(aero_props, list_idx, bin_idx, ncol, nlev)

end function wet_volume

Expand All @@ -375,7 +381,7 @@ function water_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vo

real(r8) :: vol(ncol,nlev) ! m3/kg

vol = -huge(1._r8)
vol = 0._r8

end function water_volume

Expand Down
4 changes: 3 additions & 1 deletion src/chemistry/mozart/mo_tuvx.F90
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,7 @@ subroutine tuvx_get_photo_rates( pbuf, ncol, lchnk, height_mid, &
integer :: ipht, k, idose
integer :: i_col ! column index
integer :: i_level ! vertical level index
integer :: i_thrd ! index for current OMP thread
real(r8) :: sza ! solar zenith angle [degrees]
real(r8) :: cpe_rates(ncol,pverp+1,number_of_heating_rates) ! heating rates from TUV-x
real(r8), pointer :: cpe_jo2_a(:,:) ! heating rate for jo2_a in physics buffer
Expand Down Expand Up @@ -649,7 +650,8 @@ subroutine tuvx_get_photo_rates( pbuf, ncol, lchnk, height_mid, &
cpe_jo3_a(:,:) = 0.0_r8
cpe_jo3_b(:,:) = 0.0_r8

associate( tuvx => tuvx_ptrs( thread_id( ) ) )
i_thrd = thread_id()
associate( tuvx => tuvx_ptrs( i_thrd ) )

allocate( photo_rates( pcols, pver+2, tuvx%n_photo_rates_ + tuvx%n_euv_rates_ &
+ tuvx%n_special_rates_ ) )
Expand Down
2 changes: 1 addition & 1 deletion src/physics/ali_arms
Submodule ali_arms updated 1 files
+1 −1 ali.c
30 changes: 16 additions & 14 deletions src/physics/cam/aerosol_optics_cam.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1080,24 +1080,25 @@ subroutine update_diags( is_coarse_dust )
sumhygro = hygrosulf(icol) + hygropom(icol) + hygrosoa(icol) + hygrobc(icol) + &
hygrodust(icol) + hygrosslt(icol)

scatdust(icol) = (scatdust(icol) + scath2o*hygrodust(icol)/sumhygro)/sumscat
absdust(icol) = (absdust(icol) + absh2o*hygrodust(icol)/sumhygro)/sumabs
if (sumscat/=0._r8 .and. sumabs/=0._r8 .and. sumhygro/=0._r8) then
scatdust(icol) = (scatdust(icol) + scath2o*hygrodust(icol)/sumhygro)/sumscat
absdust(icol) = (absdust(icol) + absh2o*hygrodust(icol)/sumhygro)/sumabs

scatsulf(icol) = (scatsulf(icol) + scath2o*hygrosulf(icol)/sumhygro)/sumscat
abssulf(icol) = (abssulf(icol) + absh2o*hygrosulf(icol)/sumhygro)/sumabs
scatsulf(icol) = (scatsulf(icol) + scath2o*hygrosulf(icol)/sumhygro)/sumscat
abssulf(icol) = (abssulf(icol) + absh2o*hygrosulf(icol)/sumhygro)/sumabs

scatpom(icol) = (scatpom(icol) + scath2o*hygropom(icol)/sumhygro)/sumscat
abspom(icol) = (abspom(icol) + absh2o*hygropom(icol)/sumhygro)/sumabs
scatpom(icol) = (scatpom(icol) + scath2o*hygropom(icol)/sumhygro)/sumscat
abspom(icol) = (abspom(icol) + absh2o*hygropom(icol)/sumhygro)/sumabs

scatsoa(icol) = (scatsoa(icol) + scath2o*hygrosoa(icol)/sumhygro)/sumscat
abssoa(icol) = (abssoa(icol) + absh2o*hygrosoa(icol)/sumhygro)/sumabs
scatsoa(icol) = (scatsoa(icol) + scath2o*hygrosoa(icol)/sumhygro)/sumscat
abssoa(icol) = (abssoa(icol) + absh2o*hygrosoa(icol)/sumhygro)/sumabs

scatbc(icol)= (scatbc(icol) + scath2o*hygrobc(icol)/sumhygro)/sumscat
absbc(icol) = (absbc(icol) + absh2o*hygrobc(icol)/sumhygro)/sumabs

scatsslt(icol) = (scatsslt(icol) + scath2o*hygrosslt(icol)/sumhygro)/sumscat
abssslt(icol) = (abssslt(icol) + absh2o*hygrosslt(icol)/sumhygro)/sumabs
scatbc(icol)= (scatbc(icol) + scath2o*hygrobc(icol)/sumhygro)/sumscat
absbc(icol) = (absbc(icol) + absh2o*hygrobc(icol)/sumhygro)/sumabs

scatsslt(icol) = (scatsslt(icol) + scath2o*hygrosslt(icol)/sumhygro)/sumscat
abssslt(icol) = (abssslt(icol) + absh2o*hygrosslt(icol)/sumhygro)/sumabs
end if

aodabsbc(icol) = aodabsbc(icol) + absbc(icol)*dopaer(icol)*(1.0_r8-palb(icol))

Expand Down Expand Up @@ -1149,7 +1150,6 @@ subroutine update_diags( is_coarse_dust )
! dmleung 20 Oct 2025 ++
! Then, all these diagnostics are outputted based on the modified dust AOD.
! We simply apply dopaer/dopaer0 (>1 for coarse mode) to the absorption diagnostics.
aodvis(icol) = aodvis(icol) + dopaer(icol)
aodabs(icol) = aodabs(icol) + mass(icol,ilev) * pabs(icol) * dopaer(icol)/dopaer0(icol) ! dmleung
extinct(icol,ilev) = extinct(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev)
absorb(icol,ilev) = absorb(icol,ilev) + air_density(icol,ilev) * pabs(icol) * dopaer(icol)/dopaer0(icol) ! dmleung
Expand All @@ -1161,6 +1161,8 @@ subroutine update_diags( is_coarse_dust )

end if

aodvis(icol) = aodvis(icol) + dopaer(icol)

if (ilev<=troplev(icol)) then
aodvisst(icol) = aodvisst(icol) + dopaer(icol)
end if
Expand Down
Loading