UCX chemistry mechanism
On this page, we provide information about the Universal tropospheric-stratospheric Chemistry eXtension (UCX) mechanism in GEOS-Chem. UCX combines both tropospheric and stratospheric reactions into a single chemistry mechanism. It was developed by Sebastian Eastham, Debra Weisenstein, and Steven Barrett at the Laboratory for Aviation and the Environment at the Massachusetts Institute of Technology.
Overview
The UCX adds online stratospheric chemistry to GEOS-Chem. Switching on the UCX results in the following changes to GEOS-Chem:
- Photolysis and UV transfer is calculated using the Fast-JX v7.0a model in 18 wavelength bins, covering 177-850 nm. Switching off the UCX removes 6 of the high-frequency bins for the sake of computational speed
- In-model column ozone can now be used to estimate ozone optical depth for photolysis calculations, allowing photochemistry to couple to modeled ozone depletion or production
- Long-lived species such as N2O, CH4, OCS, CFCs, HCFCs and halons are emitted, advected and lost as part of the chemistry mechanism, instead of ignored or set to fixed mixing ratios
- Stratospheric water is treated as an advected tracer, and can be enhanced by changes in tropospheric meteorology and upwelling CH4
- Stratospheric aerosols (LBS, STS, NAT and ice) are formed according to thermodynamics equilibrium. These aerosols are advected, interact with radiation, can settle (based on a log-normal approximation) and take part in heterogeneous chemistry as described in Kirner et al 2011
- A mesospheric steady-state approximation is applied to NOy and SOx to prevent formation of an unrealistic high-altitude reservoir while conserving total nitrogen and sulfur
All other mesospheric chemistry is approximated using the linearized GMI mechanism. In total, the UCX decreases run speed by about 50% in a 4x5 simulation. For more information on the UCX please see the following documents, which describe the UCX mechanism in more detail:
- Eastham, S.D., Weisenstein, D.K., Barrett, S.R.H., Development and evaluation of the unified tropospheric–stratospheric chemistry extension (UCX) for the global chemistry-transport model GEOS-Chem, Atmos. Env., June 2014. (Article)
- Technical Note: The GEOS-Chem Unified Tropospheric-Stratospheric Chemistry Extension (UCX): Interim Distribution, September 2013 (Article)
Running with the UCX
Running GEOS-Chem with online stratospheric chemistry requires the following:
- The code must be compiled with the option
UCX=yes
, e.g.make -j4 UCX=yes GRID=4x5 MET=GEOS5
- The tracer restart file must use the native vertical resolution (72 layers in MERRA, GEOS-5 and GEOS-FP) and have the additional UCX tracers (total count of 92 in v10-01)
- The lines
Use UCX strat. chem?
,Online CH4 chemistry?
andActive strat. H2O?
should be set toT
in theinput.geos
chemistry menu. The lines regarding LINOZ and linearized stratospheric chemistry should be left on, as they will continue to operate in the mesosphere. The additional stratospheric tracers must also be listed ininput.geos
Alternatively, just download the source code with UCX options already specified, as described below.
--Sebastian D. Eastham 10:15, 11 May 2015 (EDT)
Obtaining the source code
Provisional code
Steven Barrett wrote:
- As a few people have asked for the code for the strat chem version of GEOS-Chem, we've posted it as a simple compressed file here as a temporary location so they can use it right away until it gets integrated into the main code. [Until then], we'll just keep track of any fixes/issues that come up until then.
--Bob Y. 13:44, 30 September 2013 (EDT)
Standard code
UCX has been added to GEOS-Chem v10-01c, which was tested with 1-month benchmark simulations approved on 29 May 2014 and 1-year benchmark simulations approved on 26 June 2014. It is included in the GEOS-Chem v10-01 public release.
--Bob Y. 14:44, 25 April 2014 (EDT)
Spinning up the stratosphere
The default settings in the Emissions Menu of input.geos are:
=> Set initial glob MRs:--- => strat. H2O? : T => CH4? : T => OCS? : T => CFCs? : T => Cl species? : T => strat Bry (GCCM)?: T => Br species? : F => strat. Br? : F => strat. NOx/HNO3? : T => N2O? : T => strat. SO4? : T => CFC emission year : 0
This may be problematic when splitting your GEOS–Chem simulation into several stages in order to fit within the time limits imposed by your batch queuing system.
Sebastian Eastham wrote:
- [The above settings] means that the stratosphere never really spun up. Overwriting strat H2O is definitely advisable for every run – allowing stratospheric H2O to evolve is an experiment at best - and resetting the long-lived species (CH4/OCS/CFCs/N2O) is unlikely to make a difference, but Cl species, all Br, strat NOx/HNO3 and strat SO4 probably need to be allowed to evolve on their own after the initial setup. Stratospheric NOx/HNO3 in particular takes about a year or more to sort itself out after the original run – the strat in general takes up to 5 years to spin up properly due to the long transport times and slow circulation. Any of these flags being set to T results in the restart file being ignored for those species, either within the stratosphere or over the whole domain (depending on the flag), such that 6 2-month runs will not yield the same results as 1 12-month run if any of them are true.
In order to properly spin up the stratosphere, the following settings are recommended for run stages 2 and beyond:
=> Set initial glob MRs:--- => strat. H2O? : F => CH4? : F => OCS? : F => CFCs? : F => Cl species? : F => strat Bry (GCCM)?: F => Br species? : F => strat. Br? : F => strat. NOx/HNO3? : F => N2O? : F => strat. SO4? : F => CFC emission year : 0
Sebastian Eastham wrote:
- Regarding H2O, the only truly consistent approaches would be either to treat H2O identically to the other species, or to set Active strat. H2O: F throughout. For a single year benchmark the former approach would probably be fine – the stratospheric H2O does diverge from meteorology over time but the anomaly isn’t too bad over short time periods, and allowing stratospheric dehydration is a useful feature of the UCX.
--Melissa Sulprizio 11:18, 8 September 2014 (EDT)
Previous issues that are now resolved
Fix for black carbon in ucx_mod.F
This fix will be validated with the 1-month benchmark simulation v11-01b.
Sebastian Eastham wrote:
- After one hour of simulation with the standard initial restart file, a layer of black carbon appears at the stratopause, and the mesopause empties of black carbon entirely (although I’m not sure why there is so much up there to begin with). This layer is due to an error in the sedimentation calculation. On line 2699 of ucx_mod.F, the line
RWET(IBC) = RAA(IND999,29)
Should be changed to
RWET(IBC) = RAA(IND999,29) * 1.0e-6_fp
This was just a unit conversion error, and has probably been there since the UCX was first developed. I only noticed it because there seems to be a lot more high altitude black carbon in the model now than there was in v9-01-03, when the UCX was developed. I’m still looking into why this is the case.
--Melissa Sulprizio (talk) 16:06, 13 July 2015 (UTC)
Reactivate bromine species photolysis for tropospheric simulations
This update was validated in the 1-month benchmark simulation v10-01c and approved on 29 May 2014.
In the original Fast-JX input files, photolysis for several bromine species had been deactivated for tropospheric simulations. A full description of the error and its fix may be found in this post on our Fast-JX v7.0 photolysis mechanism wiki page.
--Melissa Sulprizio 13:43, 14 May 2014 (EDT)
Error in Fast-JX for tropospheric only simulation
This update was validated in the 1-month benchmark simulation v10-01c and approved on 29 May 2014.
An bug in the original Fast-JX code caused the cross-sections to be interpolated incorrectly for tropospheric-only chemistry simulations. A full description of this error may be found in this post on our FAST-JX v7.0 photolysis mechanism wiki page.
--Bob Y. 14:27, 20 May 2014 (EDT)
Modify treatment of N2O5 + H2O reaction in calcrate.F
This update was validated in the 1-month benchmark simulation v10-01c and approved on 29 May 2014.
The reaction for N2O5 + H2O was found to be problematic in long-term UCX simulations where the H2O concentration (stored in the EDUCTCONC variable in file GeosCore/calcrate.F) was low and caused the solver to choke. Sebastian Eastham suggested that we include the following fix in the standard code.
Sebastian Eastham wrote:
- The division is necessary to compensate for the change from N2O5 -> 2HNO3 to N2O5 + H2O -> 2HNO3—it's still "as in base GEOS-Chem" though in the sense that it doesn't check to see if N2O5 or H2O is the limiting reactant (and possibly herein lies the problem!). It might be worth seeing if the treatment used for the other aerosol reactions (not including the check against parameter PSCMINLIFE) would help.
Following Sebastian's suggestion, we have made the following modification in this section of calcrate.F for better numerical stability:
! If all these checks are passed, we set k = ki/[B]. ! Rxn 11 is first-order - ignore IF (PSCIDX.eq.1) THEN !------------------------------------------------------------------------------ ! Prior to 5/12/14: ! Use same treatment used for other aerosol reactions (not including the ! check against PSCMINLIFE) (sde, mps, 5/12/14) ! ! N2O5 + H2O is an old reaction, allow to proceed ! ! as it did in base GEOS-Chem ! IF (IS_SAFE_DIV(ADJUSTEDRATE,EDUCTCONC)) THEN ! ADJUSTEDRATE = ADJUSTEDRATE/EDUCTCONC ! ELSE ! ADJUSTEDRATE = 0d0 ! ENDIF !------------------------------------------------------------------------------ ! Convert from 1st-order to 2nd-order IF (IS_SAFE_DIV(EDUCTCONC,LIMITCONC)) THEN ! Temporarily store [B]/(T*[A]) LIMITCONC = EDUCTCONC/(PSCMINLIFE*LIMITCONC) IF (ADJUSTEDRATE.gt.LIMITCONC) THEN ADJUSTEDRATE = LIMITCONC ENDIF ELSE ADJUSTEDRATE = 0d0 ENDIF IF ((EDUCTCONC.gt.1.d2).and. & (IS_SAFE_DIV(ADJUSTEDRATE,EDUCTCONC))) THEN ADJUSTEDRATE = ADJUSTEDRATE/EDUCTCONC ELSE ADJUSTEDRATE = 0d0 ENDIF
--Bob Y. 14:56, 13 May 2014 (EDT)
Read 2D data for individual NOx species in ucx_mod.F
This update was validated with the 1-month benchmark simulation v10-01f and approved on Approved 13 Jan 2015.
Sebastian Eastham wrote:
- A quick and easy improvement can be made now that NOx has been split out into separate species. In ucx_mod.F at line 504, the NO tracer is currently given the full NOx burden – however, the file from which they are read, DiurnalAvg.nc, contains NO, NO2, HNO2 (as HONO) and NO3 separately, as well as lumped – with HNO3 and PAN – into the single variable ‘NOx’. The attached file, a specifically updated version of ucx_mod.F based on my download of Code.tar.gz, would fully implement the update with a change of only about 15 lines (which also prevents a doubling of HNO3 at one pole upon initialization, since the old “NOx” value from the 2D model includes PAN and HNO3).
In routine SET_INITIAL_MIXRATIOS, change the following lines:
! Stratospheric NOy IF (LSETNOYSTRAT) THEN IF ( am_I_Root ) THEN WRITE(6,*) '|NOx |HNO3 | |' WRITE(6,*) '|---------|---------|---------|' ENDIF ! No Montreal scaling SCALEFAC = 1.d0 TRAC_IDX = IDTHNO3 TRAC_SET = 'HNO3' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTNO TRAC_SET = 'NOX' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) ENDIF
to:
! Stratospheric NOy IF (LSETNOYSTRAT) THEN IF ( am_I_Root ) THEN WRITE(6,*) '|NO |NO2 |NO3 |' WRITE(6,*) '|---------|---------|---------|' WRITE(6,*) '|HNO2 |HNO3 |HNO4 |' WRITE(6,*) '|---------|---------|---------|' WRITE(6,*) '|N2O5 |PAN | |' WRITE(6,*) '|---------|---------|---------|' ENDIF ! No Montreal scaling SCALEFAC = 1.d0 TRAC_IDX = IDTNO TRAC_SET = 'NO' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTNO2 TRAC_SET = 'NO2' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) ! Unstable product of ETO2 + NO2 gets lumped into NO2 for now TRAC_SET = 'ETHO2NO2' CALL APPLY_2DTRAC( .TRUE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTNO3 TRAC_SET = 'NO3' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTN2O5 TRAC_SET = 'N2O5' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTHNO2 TRAC_SET = 'HONO' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTHNO3 TRAC_SET = 'HNO3' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTHNO4 TRAC_SET = 'HO2NO2' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) TRAC_IDX = IDTPAN TRAC_SET = 'PAN' CALL APPLY_2DTRAC( .FALSE., .TRUE., .FALSE., SCALEFAC, & Input_Opt, State_Met, State_Chm ) ENDIF
--Melissa Sulprizio 11:23, 18 June 2014 (EDT)