Skip to content
Open
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ This file documents all notable changes to the GEOS-Chem repository starting in

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased] -TBD
### Added
- Added multiphase sulfate chemistry and cloud Hplus diagnostic for Travis et al. (2025)

### Changed
- Renamed `State_Chm%Isorrop*` fields to `State_Chm%Ate*` (aerosol thermodynamical equilibrium), as ISORROPIA is no longer used
- Updated routine `fullchem_SetStateHet` to accept `id_DSTbin{1..7}`, `id_pFe`, `id_SO2`, and `id_SO4`pFe` as arguments

## [14.7.0] - 2026-02-05
### Added
- Added entries for FINNv25 biomass burning emissions to template HEMCO configuration files
Expand Down
51 changes: 28 additions & 23 deletions GeosCore/aerosol_thermodynamics_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
REAL(f8) :: HETP_HCl, HETP_Na, HETP_Ca, HETP_K
REAL(f8) :: HETP_Mg, HETP_H, HETP_OH, HETP_LWC
REAL(f8) :: HETP_frNa, HETP_frCa, HETP_frK, HETP_frMg
REAL(f8) :: HETP_frSO4, HETP_num
REAL(f8) :: HETP_frSO4, HETP_num, HETP_IONIC

! Strings
CHARACTER(LEN=15) :: SCASI
Expand Down Expand Up @@ -268,14 +268,15 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &

! Zero State_Chm arrays to avoid leftover values from hanging
! around between calls -- especially up near the tropopause
State_Chm%IsorropAeropH = 0.0_fp
State_Chm%IsorropHplus = 0.0_fp
State_Chm%IsorropAeroH2O = 0.0_fp
State_Chm%IsorropSulfate = 0.0_fp
State_Chm%IsorropNitrate = 0.0_fp
State_Chm%IsorropBisulfate = 0.0_fp
State_Chm%IsorropChloride = 0.0_fp

State_Chm%AteAeropH = 0.0_fp
State_Chm%AteHplus = 0.0_fp
State_Chm%AteAeroH2O = 0.0_fp
State_Chm%AteSulfate = 0.0_fp
State_Chm%AteNitrate = 0.0_fp
State_Chm%AteBisulfate = 0.0_fp
State_Chm%AteChloride = 0.0_fp
State_Chm%AteIONIC = 0.0_fp
State_Chm%AteOH = 0.0_fp
! First-time initialization
IF ( FIRST ) THEN

Expand Down Expand Up @@ -492,7 +493,7 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
!$OMP PRIVATE( HETP_HCl, HETP_Na, HETP_Ca, HETP_K ) &
!$OMP PRIVATE( HETP_Mg, HETP_H, HETP_OH, HETP_LWC ) &
!$OMP PRIVATE( HETP_frNa, HETP_frCa, HETP_frK, HETP_frMg ) &
!$OMP PRIVATE( HETP_frSO4, HETP_num ) &
!$OMP PRIVATE( HETP_frSO4, HETP_num, HETP_IONIC ) &
!$OMP COLLAPSE( 3 ) &
!$OMP SCHEDULE( DYNAMIC, 8 )
DO L = 1, State_Grid%NZ
Expand Down Expand Up @@ -818,14 +819,15 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
! For safety
GAS = 0.0d0
AERLIQ = 0.0d0
OTHER = 0.0d0
Call MACH_HETP_Main_15Cases( WI(2), WI(3), WI(4), WI(1), WI(5), &
WI(6), WI(7), WI(8), TEMPI, RHI, &
HETP_SO4, HETP_HSO4, HETP_CaSO4, HETP_NH4, &
HETP_NH3, HETP_NO3, HETP_HNO3, HETP_Cl, &
HETP_HCl, HETP_Na, HETP_Ca, HETP_K, &
HETP_Mg, HETP_H, HETP_OH, HETP_LWC, &
HETP_frNa, HETP_frCa, HETP_frK, HETP_frMg, &
HETP_frSO4, HETP_num )
HETP_frSO4, HETP_IONIC, HETP_num )
! Spoof ISORROPIA outputs which are still used
GAS(1) = HETP_NH3
GAS(2) = HETP_HNO3
Expand All @@ -838,7 +840,8 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
AERLIQ( 5) = HETP_SO4
AERLIQ( 6) = HETP_HSO4
AERLIQ( 7) = HETP_NO3
AERLIQ( 8) = HETP_LWC
AERLIQ( 8) = HETP_LWC
OTHER( 5) = HETP_IONIC
! WT is used below but is identical to WI for a forward case
WT(:) = WI(:)

Expand Down Expand Up @@ -954,15 +957,15 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
IF ( AERLIQ(8) < 1e-18_fp ) THEN
! Aerosol is dry so HPLUSTEMP and PH_SAV are undefined
! We force HPLUSTEMP to 1d20 (hotp, ccc, 12/18/09)
! Force IsorropAeropH to 20e0 (X. Wang, 6/27/19)
! Force AteAeropH to 20e0 (X. Wang, 6/27/19)
!HPLUSTEMP = 1e+20_fp
HPLUSTEMP = 1.0e-30_fp
SULFTEMP = 1.0e-30_fp
BISULTEMP = 1.0e-30_fp
NITRTEMP = 1.0e-30_fp
CLTEMP = 1.0e-30_fp
!State_Chm%IsorropAeropH(I,J,L,N) = -999e+0_fp
State_Chm%IsorropAeropH(I,J,L,N) = 20.0_fp
!State_Chm%AteAeropH(I,J,L,N) = -999e+0_fp
State_Chm%AteAeropH(I,J,L,N) = 20.0_fp
ELSE
HPLUSTEMP = AERLIQ(1) / AERLIQ(8) * 1.0e+3_fp / 18.0_fp
SULFTEMP = AERLIQ(5) / AERLIQ(8) * 1.0e+3_fp / 18.0_fp
Expand All @@ -971,19 +974,21 @@ SUBROUTINE DO_ATE( Input_Opt, State_Chm, State_Diag, &
CLTEMP = AERLIQ(4) / AERLIQ(8) * 1.0e+3_fp / 18.0_fp

! Use SAFELOG10 to prevent NAN
State_Chm%IsorropAeropH(I,J,L,N)=-1.0_fp*SAFELOG10(HPLUSTEMP)
State_Chm%AteAeropH(I,J,L,N)=-1.0_fp*SAFELOG10(HPLUSTEMP)
ENDIF

! Additional Info
State_Chm%IsorropHplus(I,J,L,N) = MAX(HPLUSTEMP, 1e-30_fp)
State_Chm%IsorropAeroH2O(I,J,L,N) = MAX((AERLIQ(8)*18e+6_fp),1e-30_fp) ! mol/m3 -> ug/m3
State_Chm%IsorropNitrate(I,J,L,N) = MAX(NITRTEMP, 1e-30_fp)
State_Chm%IsorropChloride(I,J,L,N)= MAX(CLTEMP, 1e-30_fp)
State_Chm%AteHplus(I,J,L,N) = MAX(HPLUSTEMP, 1e-30_fp)
State_Chm%AteAeroH2O(I,J,L,N) = MAX((AERLIQ(8)*18e+6_fp),1e-30_fp) ! mol/m3 -> ug/m3
State_Chm%AteNitrate(I,J,L,N) = MAX(NITRTEMP, 1e-30_fp)
State_Chm%AteChloride(I,J,L,N)= MAX(CLTEMP, 1e-30_fp)
IF (N==1) THEN
State_Chm%IsorropSulfate(I,J,L) = MAX(SULFTEMP, 1e-30_fp)
State_Chm%IsorropBisulfate(I,J,L)= MAX(BISULTEMP, 1e-30_fp)
State_Chm%AteSulfate(I,J,L) = MAX(SULFTEMP, 1e-30_fp)
State_Chm%AteBisulfate(I,J,L)= MAX(BISULTEMP, 1e-30_fp)
State_Chm%AeroH2O(I,J,L,1+NDUST) = AERLIQ(8) * 18e+0_fp ! mol/m3 -> g/m3

State_Chm%AteIONIC(I,J,L) = max(OTHER(5), 1e-30_fp) ! mol/m3
State_Chm%AteOH(I,J,L) = max(OTHER(4), 1E-30_fp) ! mol/m3

NUM_SAV = ( Spc(id_NH3 )%Conc(I,J,L) / 17.0_fp &
+ Spc(id_NH4 )%Conc(I,J,L) / 18.0_fp &
+ Spc(id_SALA)%Conc(I,J,L) * 0.3061_fp / 23.0_fp )
Expand Down
55 changes: 38 additions & 17 deletions GeosCore/fullchem_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ MODULE FullChem_Mod
! !PRIVATE TYPES:
!
! Species ID flags (and logicals to denote if species are present)
INTEGER :: id_OH, id_HO2, id_O3P, id_O1D, id_CH4
INTEGER :: id_PCO, id_LCH4, id_NH3, id_SO4
INTEGER :: id_SALAAL, id_SALCAL, id_SALC, id_SALA
INTEGER :: id_PSO4
INTEGER :: id_OH, id_HO2, id_O3P, id_O1D
INTEGER :: id_CH4, id_PCO, id_LCH4, id_NH3
INTEGER :: id_SO4, id_SALAAL, id_SALCAL, id_SALC
INTEGER :: id_SALA, id_DSTbin1, id_DSTbin2, id_DSTbin3
INTEGER :: id_DSTbin4, id_DSTbin5, id_DSTbin6, id_DSTbin7
INTEGER :: id_SO2, id_pFe, id_PSO4
#ifdef TOMAS
INTEGER :: id_NK05, id_NK08, id_NK10, id_NK20
#endif
Expand Down Expand Up @@ -882,18 +884,28 @@ SUBROUTINE Do_FullChem( Input_Opt, State_Chm, State_Diag, &
!=====================================================================

! Populate fields of the State_Het object
CALL fullchem_SetStateHet( I = I, &
J = J, &
L = L, &
id_SALA = id_SALA, &
id_SALAAL = id_SALAAL, &
id_SALC = id_SALC, &
id_SALCAL = id_SALCAL, &
Input_Opt = Input_Opt, &
State_Chm = State_Chm, &
State_Met = State_Met, &
H = State_Het, &
RC = RC )
CALL fullchem_SetStateHet( I = I, &
J = J, &
L = L, &
id_DSTbin1 = id_DSTbin1, &
id_DSTbin2 = id_DSTbin2, &
id_DSTbin3 = id_DSTbin3, &
id_DSTbin4 = id_DSTbin4, &
id_DSTbin5 = id_DSTbin5, &
id_DSTbin6 = id_DSTbin6, &
id_DSTbin7 = id_DSTbin7, &
id_pFe = id_pFe, &
id_SALA = id_SALA, &
id_SALAAL = id_SALAAL, &
id_SALC = id_SALC, &
id_SALCAL = id_SALCAL, &
id_SO2 = id_SO2, &
id_SO4 = id_SO4, &
Input_Opt = Input_Opt, &
State_Chm = State_Chm, &
State_Met = State_Met, &
H = State_Het, &
RC = RC )

!=====================================================================
! CHEMISTRY MECHANISM INITIALIZATION (#5)
Expand Down Expand Up @@ -2792,12 +2804,21 @@ SUBROUTINE Init_FullChem( Input_Opt, State_Chm, State_Diag, RC )
ENDIF

! Initialize species flags
id_CH4 = Ind_( 'CH4', 'A' ) ! CH4 advected species
id_CH4 = Ind_( 'CH4', 'A' ) ! CH4 advected species
id_DSTbin1 = Ind_( 'DSTbin1' )
id_DSTbin2 = Ind_( 'DSTbin2' )
id_DSTbin3 = Ind_( 'DSTbin3' )
id_DSTbin4 = Ind_( 'DSTbin4' )
id_DSTbin5 = Ind_( 'DSTbin5' )
id_DSTbin6 = Ind_( 'DSTbin6' )
id_DSTbin7 = Ind_( 'DSTbin7' )
id_HO2 = Ind_( 'HO2' )
id_NH3 = Ind_( 'NH3' )
id_O3P = Ind_( 'O' )
id_O1D = Ind_( 'O1D' )
id_OH = Ind_( 'OH' )
id_pFe = Ind_( 'pFe' )
id_SO2 = Ind_( 'SO2' )
id_SO4 = Ind_( 'SO4' )
id_SALA = Ind_( 'SALA' )
id_SALAAL = Ind_( 'SALAAL' )
Expand Down
8 changes: 4 additions & 4 deletions GeosCore/planeflight_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2174,16 +2174,16 @@ SUBROUTINE PLANEFLIGHT( Input_Opt, State_Chm, State_Diag, &
! ISORROPIA/HETP H+ and pH (eam, 06/2015)
!---------------------------------------------------------------
CASE( 5001 )
VARI(V) = State_Chm%IsorropHplus(I,J,L,1)
VARI(V) = State_Chm%AteHplus(I,J,L,1)

CASE( 5002 )
VARI(V) = State_Chm%IsorropAeropH(I,J,L,1)
VARI(V) = State_Chm%AteAeropH(I,J,L,1)

CASE( 5003 )
VARI(V) = State_Chm%IsorropAeroH2O(I,J,L,1)
VARI(V) = State_Chm%AteAeroH2O(I,J,L,1)

CASE( 5004 )
VARI(V) = State_Chm%IsorropBisulfate(I,J,L)
VARI(V) = State_Chm%AteBisulfate(I,J,L)

!---------------------------------------------------------------
! Local Time (eam, 06/2015)
Expand Down
Loading