Skip to content
Draft
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
25 changes: 22 additions & 3 deletions GeosCore/aerosol_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,13 @@ MODULE AEROSOL_MOD
INTEGER :: id_ASOA1, id_ASOA2, id_ASOA3, id_DUST01
INTEGER :: id_SOAS, id_SALACL, id_HMS, id_SOAGX
INTEGER :: id_SOAIE, id_INDIOL, id_LVOCOA
INTEGER :: id_BrC

! Index to map between NRHAER and species database hygroscopic species
! NOTE: Increasing value of NRHAER in CMN_SIZE_Mod.F90 (e.g. if there is
! a new hygroscopic species) requires manual update of this mapping
! (ewl, 1/23/17)
INTEGER :: Map_NRHAER(5)
INTEGER :: Map_NRHAER(6)


CONTAINS
Expand All @@ -122,6 +123,7 @@ SUBROUTINE AEROSOL_CONC( Input_Opt, State_Chm, State_Diag, &
!
! !USES:
!
USE CMN_SIZE_Mod, ONLY : NRHAER
USE ErrCode_Mod
USE ERROR_MOD

Expand Down Expand Up @@ -529,6 +531,17 @@ SUBROUTINE AEROSOL_CONC( Input_Opt, State_Chm, State_Diag, &
* State_chm%AerMass%OCFOPOA(I,J) / AIRVOL(I,J,L)
ENDIF

! BrC [kg/m3]
! Species concentrations are KG_SPECIES within AEROSOL_CONC. (MH,5/6/26)
IF ( NRHAER == 6 ) THEN
State_Chm%AerMass%WAERSL(I,J,L,6) = 0.0_fp
IF ( id_BrC > 0 ) THEN
State_Chm%AerMass%WAERSL(I,J,L,6) = &
State_Chm%AerMass%WAERSL(I,J,L,6) + &
Spc(id_BrC)%Conc(I,J,L) / AIRVOL(I,J,L)
ENDIF
ENDIF

! Now avoid division by zero (bmy, 4/20/04)
State_Chm%AerMass%BCPI(I,J,L) = MAX( State_Chm%AerMass%BCPI(I,J,L), 1e-35_fp )
State_Chm%AerMass%OCPI(I,J,L) = MAX( State_Chm%AerMass%OCPI(I,J,L), 1e-35_fp )
Expand Down Expand Up @@ -1460,6 +1473,9 @@ SUBROUTINE RDAER( Input_Opt, State_Chm, State_Diag, State_Grid, State_Met, &
ENDIF
MSDENS(4) = State_Chm%SpcData(id_SALA)%Info%Density
MSDENS(5) = State_Chm%SpcData(id_SALC)%Info%Density
IF ( NRHAER == 6 .and. id_BrC > 0 ) THEN
MSDENS(6) = State_Chm%SpcData(id_BrC)%Info%Density
ENDIF

! These default values unused (actively retrieved from ucx_mod)
MSDENS(NRHAER+1) = 1700.0d0 ! SSA/STS
Expand Down Expand Up @@ -2473,6 +2489,7 @@ SUBROUTINE Init_Aerosol( Input_Opt, State_Chm, State_Diag, State_Grid, RC )
id_NIT = Ind_( 'NIT' )
id_OCPO = Ind_( 'OCPO' )
id_OCPI = Ind_( 'OCPI' )
id_BrC = Ind_( 'BRC' )
id_SOAS = Ind_( 'SOAS' )
id_SALA = Ind_( 'SALA' )
id_SALC = Ind_( 'SALC' )
Expand Down Expand Up @@ -2544,9 +2561,11 @@ SUBROUTINE Init_Aerosol( Input_Opt, State_Chm, State_Diag, State_Grid, RC )
Map_NRHAER(N) = 4
CASE ( 'SALC' )
Map_NRHAER(N) = 5
CASE ( 'BRC' )
Map_NRHAER(N) = 6
CASE DEFAULT
ErrMsg = 'WARNING: aerosol diagnostics not defined' // &
' for NRHAER greater than 5!'
' for NRHAER greater than 6!'
CALL GC_ERROR( ErrMsg, RC, 'Init_Aerosol in aerosol_mod.F90' )
SpcInfo => NULL()
RETURN
Expand Down Expand Up @@ -2739,7 +2758,7 @@ SUBROUTINE RD_AOD( Input_Opt, State_Chm, RC )
! info but ref index is similar e.g. Scarchilli et al. (2005)
!(DAR 05/2015)
SPECFIL = (/ "so4.dat ", "soot.dat ", "org.dat ", "ssa.dat ", &
"ssc.dat ", "h2so4.dat", "h2so4.dat", "dust.dat " /)
"ssc.dat ", "brc.dat ", "h2so4.dat", "dust.dat " /)

! Loop over the array of filenames
DO k = 1, State_Chm%Phot%NSPAA
Expand Down
3 changes: 2 additions & 1 deletion GeosCore/carbon_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ MODULE CARBON_MOD
INTEGER :: id_TSOG3, id_XYLE, id_LBRO2N, id_LBRO2H, id_LTRO2N
INTEGER :: id_LTRO2H, id_LXRO2N, id_LXRO2H, id_LNRO2N, id_LNRO2H
INTEGER :: id_LISOPOH, id_LISOPNO3
INTEGER :: id_SOAS, id_SOAP
INTEGER :: id_SOAS, id_SOAP, id_BRC

#ifdef APM
REAL(fp), ALLOCATABLE :: BCCONVNEW(:,:,:)
Expand Down Expand Up @@ -7676,6 +7676,7 @@ SUBROUTINE INIT_CARBON( Input_Opt, State_Chm, State_Diag, State_Grid, RC )
id_OH = IND_('OH' )
id_OCPO = IND_('OCPO' )
id_OCPI = IND_('OCPI' )
id_BRC = IND_('BRC' )
id_OPOA1 = IND_('OPOA1' )
id_OPOG1 = IND_('OPOG1' )
id_OPOA2 = IND_('OPOA2' )
Expand Down
64 changes: 52 additions & 12 deletions GeosCore/cldj_interface_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!
CHARACTER(LEN=255) :: ErrMsg, ThisLoc
INTEGER :: A, I, J, L, K, N, S, MaxLev, RH_ind
INTEGER :: SO4_ind, BC_ind, OC_ind, SALA_ind, SALC_ind
INTEGER :: SO4_ind, BC_ind, OC_ind, SALA_ind, SALC_ind, BrC_ind
INTEGER :: S_rh0, S_rhx, K_rh0, K_rhx, ind_1000
REAL(8) :: MW_g, BoxHt, Delta_P, IWC, LWC
REAL(8) :: FRAC, RAA_eff, QAA_eff, SAA_eff
Expand Down Expand Up @@ -314,11 +314,13 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
REAL(fp) :: SPHU_kgkg
REAL(fp) :: H2O_kgkgdry
REAL(fp) :: MW_kg
REAL(fp) :: BrC_kgm3

! Species ids
INTEGER, SAVE :: id_H2O
INTEGER, SAVE :: id_O3
INTEGER, SAVE :: id_SO4
INTEGER, SAVE :: id_BRC

! Index for Cloud-J prints if GEOS-Chem verbose is on
INTEGER :: I_PRT, J_PRT
Expand Down Expand Up @@ -364,6 +366,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
OC_ind = 3
SALA_ind = 4
SALC_ind = 5
BrC_ind = 6

! Relative humidities in FJX_spec-aer.dat
RH_lut(1) = 0.d0
Expand Down Expand Up @@ -392,6 +395,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
id_H2O = Ind_('H2O')
id_O3 = Ind_('O3')
id_SO4 = Ind_('SO4')
id_BRC = Ind_('BRC')
IF ( id_O3 <= 0 ) THEN
ErrMsg = 'O3 is not a defined species but is required for Cloud-J photolysis!'
CALL GC_Error( ErrMsg, RC, ThisLoc )
Expand Down Expand Up @@ -671,7 +675,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
IF ( Input_Opt%LSULF .AND. State_Met%InTroposphere(I,J,L) ) THEN

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRHAER*(SO4_ind-1) + 1 ! SO4 index for RH=0 in NDXAER
S_rh0 = 3 + NDUST + NRH*(SO4_ind-1) + 1 ! SO4 index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1 ! Sulfate index for this RH
K_rh0 = NDXAER(L,S_rh0) ! index for RH=0 in FJX_spec-aer.dat
K_rhx = NDXAER(L,S_rhx) ! index for this RH in FJX_spec-aer.dat
Expand Down Expand Up @@ -707,7 +711,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!----------------------------------------------------

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRHAER*(BC_ind-1) + 1 ! BC index for RH=0 in NDXAER
S_rh0 = 3 + NDUST + NRH*(BC_ind-1) + 1 ! BC index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1 ! BC index for this RH
K_rh0 = NDXAER(L,S_rh0) ! index for RH=0 in FJX_spec-aer.dat
K_rhx = NDXAER(L,S_rhx) ! index for this RH in FJX_spec-aer.dat
Expand Down Expand Up @@ -756,7 +760,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!----------------------------------------------------

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRHAER*(OC_ind-1) + 1 ! OC index for RH=0 in NDXAER
S_rh0 = 3 + NDUST + NRH*(OC_ind-1) + 1 ! OC index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1 ! OC index for this RH
K_rh0 = NDXAER(L,S_rh0) ! index for RH=0 in FJX_spec-aer.dat
K_rhx = NDXAER(L,S_rhx) ! index for this RH in FJX_spec-aer.dat
Expand All @@ -781,6 +785,42 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
* dry_to_wet_factor * Q_interp_factor / R_interp_factor ) ) &
* 1.d3 * BoxHt

!----------------------------------------------------
! Brown carbon (Hammer et al. 2016), MH 5/6/26
!----------------------------------------------------

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRH*(BrC_ind-1) + 1 ! BrC index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1
K_rh0 = NDXAER(L,S_rh0)
K_rhx = NDXAER(L,S_rhx)

! Get interpolated effective radius and extinction for RH in this grid box
IF ( RH_ind == NRH ) THEN
RAA_eff = RAA(K_rhx)
QAA_eff = QAA(ind_1000,K_rhx)
ELSE
FRAC = ( State_Met%RH(I,J,L) - RH_lut(RH_ind) ) &
/ ( RH_lut(RH_ind+1) - RH_lut(RH_ind) )
RAA_eff = RAA(K_rhx) + FRAC * ( RAA(K_rhx+1) - RAA(K_rhx) )
QAA_eff = QAA(ind_1000,K_rhx) + FRAC * ( QAA(ind_1000,K_rhx+1) - QAA(ind_1000,K_rhx) )
ENDIF
dry_to_wet_factor = ( RAA_eff / RAA(K_rh0) )**3
R_interp_factor = RAA_eff / RAA(K_rhx)
Q_interp_factor = QAA_eff / QAA(ind_1000,K_rhx)

BrC_kgm3 = 0.d0
IF ( id_BRC > 0 ) THEN
BrC_kgm3 = State_Chm%Species(id_BRC)%Conc(I,J,L) &
* State_Chm%SpcData(id_BRC)%Info%MW_g &
/ AVO * 1.d3
ENDIF

! BrC is hygroscopic. Set concentration, converting [dry kg/m3] -> [wet g/m2]
AERSP(L,S_rhx) = BrC_kgm3 * dry_to_wet_factor &
* Q_interp_factor / R_interp_factor &
* 1.d3 * BoxHt

ENDIF

!----------------------------------------------------
Expand All @@ -794,7 +834,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!----------------------------------------------------

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRHAER*(SALA_ind-1) + 1 ! SALA index for RH=0 in NDXAER
S_rh0 = 3 + NDUST + NRH*(SALA_ind-1) + 1 ! SALA index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1 ! SALA index for this RH
K_rh0 = NDXAER(L,S_rh0) ! index for RH=0 in FJX_spec-aer.dat
K_rhx = NDXAER(L,S_rhx) ! index for this RH in FJX_spec-aer.dat
Expand Down Expand Up @@ -822,7 +862,7 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!----------------------------------------------------

! Get indexes to optical property LUT
S_rh0 = 3 + NDUST + NRHAER*(SALC_ind-1) + 1 ! SALC index for RH=0 in NDXAER
S_rh0 = 3 + NDUST + NRH*(SALC_ind-1) + 1 ! SALC index for RH=0 in NDXAER
S_rhx = S_rh0 + RH_ind - 1 ! SALC index for this RH
K_rh0 = NDXAER(L,S_rh0) ! index for RH=0 in FJX_spec-aer.dat
K_rhx = NDXAER(L,S_rhx) ! index for this RH in FJX_spec-aer.dat
Expand Down Expand Up @@ -859,14 +899,14 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
! depth computed in GEOS-Chem is non-zero.

! SSA/LBS/STS
IF ( State_Chm%Phot%ODAER(I,J,L,State_Chm%Phot%IWV1000,6) > 0._fp ) THEN
AERSP(L,36) = State_Chm%Species(id_SO4)%Conc(I,J,L) &
IF ( State_Chm%Phot%ODAER(I,J,L,State_Chm%Phot%IWV1000,7) > 0._fp ) THEN
AERSP(L,41) = State_Chm%Species(id_SO4)%Conc(I,J,L) &
* MW_g / AVO * BoxHt * 1e+6_fp
ENDIF

! NAT/ice PSCs
IF ( State_Chm%Phot%ODAER(I,J,L,State_Chm%Phot%IWV1000,7) > 0._fp ) THEN
AERSP(L,37) = State_Chm%Species(id_SO4)%Conc(I,J,L) &
IF ( State_Chm%Phot%ODAER(I,J,L,State_Chm%Phot%IWV1000,8) > 0._fp ) THEN
AERSP(L,42) = State_Chm%Species(id_SO4)%Conc(I,J,L) &
* MW_g / AVO * BoxHt * 1e+6_fp
ENDIF

Expand All @@ -887,8 +927,8 @@ SUBROUTINE Run_CloudJ( Input_Opt, State_Chm, State_Diag, &
!IF ( .NOT. use_oc ) AERSP(:,21:25) = 0.d0
!IF ( .NOT. use_sala ) AERSP(:,26:30) = 0.d0
!IF ( .NOT. use_salc ) AERSP(:,31:35) = 0.d0
!IF ( .NOT. use_stratso4 ) AERSP(:,36) = 0.d0
!IF ( .NOT. use_psc ) AERSP(:,37) = 0.d0
!IF ( .NOT. use_stratso4 ) AERSP(:,41) = 0.d0
!IF ( .NOT. use_psc ) AERSP(:,42) = 0.d0

!-----------------------------------------------------------------
! Set remaining inputs needed for Cloud_JX
Expand Down
2 changes: 1 addition & 1 deletion GeosCore/input_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1650,7 +1650,7 @@ SUBROUTINE Config_Aerosol( Config, Input_Opt, RC )
!------------------------------------------------------------------------
! Use brown carbon aerosols?
!------------------------------------------------------------------------
key = "aerosols%carbon%use_brown_carbon"
key = "aerosols%carbon%brown_carbon"
v_bool = MISSING_BOOL
CALL QFYAML_Add_Get( Config, TRIM( key ), v_bool, "", RC )
IF ( RC /= GC_SUCCESS ) THEN
Expand Down
2 changes: 1 addition & 1 deletion GeosCore/photolysis_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -838,7 +838,7 @@ SUBROUTINE SET_AER( Input_Opt, State_Chm, RC )
MIEDX => State_Chm%Phot%MIEDX

! Taken from aerosol_mod.F
IND = (/22,29,36,43,50/)
IND = (/22,29,36,43,50,57/)

DO I=1,AN_
MIEDX(I) = 0
Expand Down
2 changes: 1 addition & 1 deletion Headers/CMN_SIZE_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ MODULE CMN_SIZE_MOD
INTEGER, PARAMETER :: NDUST = 7

! Number of aerosols undergoing hygroscopic growth
INTEGER, PARAMETER :: NRHAER = 5
INTEGER, PARAMETER :: NRHAER = 6

! Number of stratospheric aerosols (SDE 04/17/13)
INTEGER, PARAMETER :: NSTRATAER = 2
Expand Down
Loading