UCX chemistry mechanism: Difference between revisions

From Geos-chem
Jump to navigation Jump to search
No edit summary
 
(55 intermediate revisions by 4 users not shown)
Line 1: Line 1:
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 [http://lae.mit.edu Laboratory for Aviation and the Environment] at the Massachusetts Institute of Technology.
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 [http://lae.mit.edu Laboratory for Aviation and the Environment] at the Massachusetts Institute of Technology.
<span style="color:green">'''''NOTE: The UCX chemistry mechanism is included in the "benchmark" chemistry mechanism, which is selected by default when you compile and run GEOS-Chem "out of the box".  The "benchmark" mechanism adds extra SOA species that are not present in the original UCX implementation.  For more information, see our [[GEOS-Chem chemistry mechanisms]] wiki page.'''''</span>


== Overview ==
== Overview ==


Please see the following documents, which describe the UCX mechanism in more detail:
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.0 photolysis mechanism|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 N<sub>2</sub>O, CH<sub>4</sub>, 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 CH<sub>4</sub>
* 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 [http://www.geosci-model-dev.net/4/169/2011/gmd-4-169-2011.html Kirner et al 2011]
* A mesospheric steady-state approximation is applied to NO<sub>y</sub> and SO<sub>x</sub> to prevent formation of an unrealistic high-altitude reservoir while conserving total nitrogen and sulfur
 
All other mesospheric chemistry is approximated using the [[Stratospheric_chemistry#New_implementation_of_linearized_stratospheric_chemistry|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'', <u>Atmos. Env.</u>, June 2014. [http://dx.doi.org/10.1016/j.atmosenv.2014.02.001 (Article)]
# 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'', <u>Atmos. Env.</u>, June 2014. [http://dx.doi.org/10.1016/j.atmosenv.2014.02.001 (Article)]
#Technical Note: The GEOS-Chem Unified Tropospheric-Stratospheric Chemistry Extension (UCX): Interim Distribution, September 2013 [http://lae.mit.edu/uploads/LAE_report_series/2013/LAE-2013-006-N.pdf (Article)]
#Technical Note: The GEOS-Chem Unified Tropospheric-Stratospheric Chemistry Extension (UCX): Interim Distribution, September 2013 [http://lae.mit.edu/uploads/LAE_report_series/2013/LAE-2013-006-N.pdf (Article)]


--[[User:Sebastian D. Eastham|Sebastian D. Eastham]] 13:08, 03 March 2014 (EDT)
=== Running with the UCX ===
Running GEOS-Chem with online stratospheric chemistry requires the following:


== Code ==
* The code must be compiled with the option <code>UCX=yes</code>, e.g. <code>make -j4 UCX=yes GRID=4x5 MET=GEOS5</code>
* 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 [[GEOS-Chem_v10-01|v10-01]])
* The lines <code>Use UCX strat. chem?</code>, <code>Online CH4 chemistry?</code> and <code>Active strat. H2O?</code> should be set to <code>T</code> in the <code>input.geos</code> chemistry menu. The lines regarding [[Linoz_stratospheric_ozone_chemistry|LINOZ]] and [[Stratospheric_chemistry#New_implementation_of_linearized_stratospheric_chemistry|linearized stratospheric chemistry]] should be left on, as they will continue to operate in the mesosphere. The additional stratospheric tracers must also be listed in <code>input.geos</code>
 
Alternatively, just download the source code with UCX options already specified, as described below.
 
--[[User:Sebastian D. Eastham|Sebastian D. Eastham]] 10:15, 11 May 2015 (EDT)
 
== Obtaining the source code ==


=== Provisional code ===
=== Provisional code ===
Line 22: Line 42:
=== Standard code ===
=== Standard code ===


UCX has been added to [[GEOS-Chem v10-01 benchmark history|GEOS-Chem v10-01c]], which is currently undergoing benchmarking and validiation.  It will be included in the [[GEOS-Chem v10-01]] public release, slated for late 2014.
UCX has been added to GEOS-Chem v10-01c, which was tested with [[GEOS-Chem_v10-01_benchmark_history#v10-01c|1-month benchmark simulations]] approved on 29 May 2014 and [[GEOS-Chem_v10-01_benchmark_history#v10-01c-Run1|1-year benchmark simulations]] approved on 26 June 2014.  It is included in the [[GEOS-Chem v10-01]] public release.


--[[User:Bmy|Bob Y.]] 14:44, 25 April 2014 (EDT)
--[[User:Bmy|Bob Y.]] 14:44, 25 April 2014 (EDT)
== Spinning up the stratosphere ==
=== v11-01 and prior versions ===
The default settings in the Emissions Menu of <tt>input.geos</tt> 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.
'''''[[User:Sebastian_D._Eastham|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?      : T
    => 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
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
:Regarding H2O, the only truly consistent approaches would be either to treat H2O identically to the other species, or to set <tt>Active strat. H2O: F</tt> 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.
--[[User:Melissa Payer|Melissa Sulprizio]] 11:18, 8 September 2014 (EDT)
=== v11-02 ===
<span style="color:green">'''''This update was included in [[GEOS-Chem v11-02#v11-02e|v11-02e]] (approved 24 Mar 2018).'''''</span>
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
<blockquote>When developing the UCX, we recognized that many users would have restart files which didn't contain data on long-lived stratospheric species. Standard spin-up is not an option for these - it would take decades to get strat CFCs to the correct mixing ratio. As a result, we offered them the option of using zonal mean mixing ratios from a 2D stratospheric model (the AER CTM) for long-lived species. These were stored as monthly means in simple ASCII files. If the user set the appropriate switch in input.geos, stratospheric mixing ratios for long-lived species would be overwritten with these zonal mean values at model initialization. Specifically, all values of STT(:,J,L) would be set to STT_2D(J,L), with STT_2D read in from the ASCII file. Many of these routines are hard-coded to deal with only 4x5 and 2x2.5. A spinup would still be needed, but it would be a few years rather than a few decades. This gave users flexibility and meant that users didn't have to deal with modifying GEOS-Chem restart files in IDL (probably my least favorite task).
Five things have changed since then:
#There are restarts available from the GCST which contain reasonable concentrations of long-lived tracers;
#GCC restarts are now NetCDF, which makes everyone's lives easier;
#We have transitioned away from relying on ASCII files, such that the old 2D ASCII files are an irritation;
#GIGC removes the assumption that all cells in STT(:,NY) are at the same latitude, making the old code obsolete; and
#GIGC means that we have way more than 2 resolutions to worry about.
Now, each of these would be easy enough to deal with, but the fact is that the routines are basically obsolete. The only real exception is H2O, which we do need to hold on to but which is set from the met data, so we don't need ASCII input files.</blockquote>
For this update, the following lines have been removed from input.geos:
%%% EMISSIONS MENU %%%  :
Turn on emissions?      : T
HEMCO Input file        : HEMCO_Config.rc
  => 1ppt MBL BRO Sim.?  : F
Switches for UCX        :---
  => Use CH4 emissions?  : F
  => Turn on surface BCs :---
    => CH4?            : T
    => OCS?            : T
    => CFCs?            : T
    => Cl species?      : T
    => Br species?      : F
    => N2O?            : T
  => Set initial glob MRs:---
    => strat. H2O?      : T
    <span style="color:red">=> 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</span>
  => CFC emission year  : 0
--[[User:Lizzie Lundgren|Lizzie Lundgren]] ([[User talk:Lizzie Lundgren|talk]]) 19:28, 10 May 2017 (UTC)
== Previous issues that are now resolved ==
=== Fix for UCX mesospheric NOy routine ===
<span style="color:green">'''''This update was included in [[GEOS-Chem v11-02#v11-02f|v11-02f]] (approved 17 May 2018).'''''</span>
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
:This is just a small fix for the UCX mesospheric NOy routine. UCX currently uses the N, NO, NO2, and NO3 entries in the State_Chm%Species array to determine total NOx, using the species database molar masses to convert between molec/cm3 and kg. However the entry for N isn’t necessarily meaningful, as KPP never acts on mesospheric boxes (yet!), and furthermore the molar mass for N is not necessarily meaningful either – if I remember rightly it is -1 because N is not a tracer. This patch works around that by assuming that “NO” = NO + N, and ignoring whatever is in Species(I,J,L,id_N). This is by no means urgent but should slightly improve the mesospheric simulation.
--[[User:Bmy|Bob Yantosca]] ([[User talk:Bmy|talk]]) 15:57, 17 May 2018 (UTC)
=== UCX stratospheric water boundary condition update  ===
<span style="color:green">'''''This update was included in [[GEOS-Chem v11-02#v11-02e|v11-02e]] (approved 24 Mar 2018).'''''</span>
   
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
   
:Chris Holmes wrote a minor update to the UCX stratospheric water boundary condition (attached), which I think would constitute a useful improvement for GEOS-Chem v11-02. This fix just ensures that the boundary condition for stratospheric water vapor is set at or above the tropical cold point, rather than at the meteorological tropopause. Since the met tropopause can sometimes be below the cold point, the pre-fix UCX would sometimes allow excessive water vapor to enter the stratosphere.
   
--[[User:Lizzie Lundgren|Lizzie Lundgren]] ([[User talk:Lizzie Lundgren|talk]]) 20:09, 5 January 2017 (UTC)
=== Remove UCX #ifdefs and replace with Input_Opt%LUCX ===
<span style="color:green">'''''This update was included in [[GEOS-Chem v11-02#v11-02e|v11-02e]] (approved 24 Mar 2018).'''''</span>
In [[GEOS-Chem_v11-02#v11-02e|v11-02e]], the UCX CPP switch has been removed completely and code previously blocked off with <tt>#if defined( UCX )</tt> has now been replaced with IF statements for <tt>Input_OPpt%LUCX</tt>. This facilitates easily turning on/off the UCX option via the option in input.geos and no longer requires users to recompile GEOS-Chem.
This update also required we certain fields from input.geos up front in order to initialize values in CMN_SIZE_mod.F and CMN_FJX_mod.F that differ when UCX is turned on/off. In main.F, we now initialize Input_Opt first, then read input.geos, then do other initializations.
--[[User:Melissa Payer|Melissa Sulprizio]] ([[User talk:Melissa Payer|talk]]) 19:32, 30 January 2018 (UTC)
=== Fix bug impacting dust radius obtained in RDUST_ONLINE ===
   
<span style="color:green">'''''This update was included in [[GEOS-Chem_v11-02#v11-02d|v11-02d]] (approved 12 Feb 2018).'''''</span>
In the UCX simulation were accessing the wrong file for when obtaining aerosol optical properties for dust. In FAST-JX we have routine RD_AOD to read all the .dat files containing the optical properties for different aerosols. Those files are defined as:
      DATA SPECFIL /"so4.dat","soot.dat","org.dat","ssa.dat","ssc.dat",
#if defined( UCX )
      ! Treating strat sulfate with GADS data but modified to match
      ! the old Fast-J values size (r=0.09um, sg=0.6) - I think there's
      ! evidence that this is too smale and narrow e.g. Deshler et al. 2003
      ! NAT should really be associated with something like cirrus cloud
      ! but for now we are just treating the NAT like the sulfate... limited
      ! info but ref index is similar e.g. Scarchilli et al. (2005)
      !(DAR 05/2015)
      &              "h2so4.dat","h2so4.dat",
#endif
      &              "dust.dat"/
Then in the dust code, we obtain the dust properties (e.g. aerosol radius) from the values read from the dust.dat file.
          ERADIUS(I,J,L,N) = RDAA(N,6) * 1.0e-4_fp
          TAREA(I,J,L,N)  = 3.e+0_fp / ERADIUS(I,J,L,N) *
      &                      DUST(I,J,L,N) / MSDENS(N)
The issue here is that aerosol radius is always accessed with index 6 in the second dimension, which refers to the 6th file read in RD_AOD. For the tropchem simulation, dust.dat is the 6th file read, but for UCX h2so4.dat is the 6th file read. Therefore, in the UCX simulation the properties for H2SO4 will be used for dust aerosol radius, which in turn impacts aerosol area. The aerosol radius and area fields are used in other routines, including gckpp_HetRates.F90. So the wrong values for dust are passed to the heterogeneous chemistry routines and this results in different het rates for the UCX and tropchem simulations. The differences are especially noticeable in regions of high dust concentrations (e.g. the Middle East where we saw large differences in O3 concentrations).
The quick fix is to change the line in the dust code to make sure we obtain the data from the correct file:
<span style="color:green">#if defined ( UCX )
          ERADIUS(I,J,L,N) = RDAA(N,'''8''') * 1.0e-4_fp
#else</span>
          ERADIUS(I,J,L,N) = RDAA(N,6) * 1.0e-4_fp
<span style="color:green">#endif</span>
We could eventually change the order of files listed in FAST-JX so that the h2so4.dat files are listed at the end, but we would need to make sure there are no other places in the code that use hardwiring as in dust_mod.F to access aerosol properties.
--[[User:Melissa Payer|Melissa Sulprizio]] ([[User talk:Melissa Payer|talk]]) 16:19, 2 January 2018 (UTC)
=== Bug fixes for running UCX in ESMF environment ===
<span style="color:green">'''''These fixes were included in [[GEOS-Chem v11-02#v11-02a|v11-02a]] and approved on 12 May 2017.'''''</span>
'''''[[User:Christoph_Keller|Christoph Keller]] wrote:'''''
<blockquote>I just merged [[GEOS-Chem v11-01]] into GEOS-5 and had to add a few bug fixes to GEOS-Chem to make it work. Most of them are minor, i.e. initializing a variable to zero or adding some am_I_Root checks. The only noteworthy fix is that I had to move the definition of variable id_CH4 in flexchem_mod.F90 outside of the compiler bracket:</blockquote>
    '''old:'''
    #if defined( EXTERNAL_GRID ) || defined( EXTERNAL_FORCING )
        !-----------------------------------------------------------------
        !        %%%%%%% GEOS-Chem HP (with ESMF & MPI) %%%%%%%
        !
        ! Do nothing, since we will call these setup routines from the
        ! init method of the ESMF interface (bmy, 10/24/12)
        !-----------------------------------------------------------------
    #else
        !-----------------------------------------------------------------
        !        %%%%%%% GEOS-Chem CLASSIC (with OpenMP) %%%%%%%
        !
        ! Call the following chemistry setup routines only on the very
        ! first chemistry timestep.  This is current practice in the
        ! std GEOS-Chem. (bmy, 10/24/12)
        !-----------------------------------------------------------------
        IF ( FIRSTCHEM ) THEN
          !---------------------------------
          ! Set global concentration of CH4
          !---------------------------------
          <span style="color:red">! Define advected species ID flag
          id_CH4 = Ind_('CH4','A')</span>
    '''new:'''
        <span style="color:green">! Define advected species ID flag
        id_CH4 = Ind_('CH4','A')</span>
    #if defined( EXTERNAL_GRID ) || defined( EXTERNAL_FORCING )
        !-----------------------------------------------------------------
        !        %%%%%%% GEOS-Chem HP (with ESMF & MPI) %%%%%%%
        !
        ! Do nothing, since we will call these setup routines from the
        ! init method of the ESMF interface (bmy, 10/24/12)
        !-----------------------------------------------------------------
    #else
        !-----------------------------------------------------------------
        !        %%%%%%% GEOS-Chem CLASSIC (with OpenMP) %%%%%%%
        !
        ! Call the following chemistry setup routines only on the very
        ! first chemistry timestep.  This is current practice in the
        ! std GEOS-Chem. (bmy, 10/24/12)
        !-----------------------------------------------------------------
        IF ( FIRSTCHEM ) THEN
          !---------------------------------
          ! Set global concentration of CH4
          !---------------------------------
<blockquote>In the original code it would always assume that id_CH4 < 0 and it caused my CH4 concentrations to be zero when running with UCX.</blockquote>
--[[User:Melissa Payer|Melissa Sulprizio]] ([[User talk:Melissa Payer|talk]]) 17:32, 10 March 2017 (UTC)
=== Only allocate certain fields of State_Chm for UCX-based simulations ===
<span style="color:green">'''''This update was included in [[GEOS-Chem v11-01 benchmark history#v11-01k|v11-01k]] and approved on 19 Dec 2016'''''</span>
In [[GEOS-Chem v10-01]] and higher versions, the 3-D fields <code>State_Chm%KHETI_SLA</code> and <code>State_Chm%STATE_PSC</code> are always allocated.  But these fields are only relevant to full-chemistry simulations using the UCX mechanism (e.g. Standard, UCX) and are not used otherwise.  This causes GEOS-Chem to set aside extra, unnecessary memory for simulations that do not use the UCX mechanism.
We have therefore made the following modifications (shown in <span style="color:green">GREEN</span> in routine <code>Init_State_Chm</code> (located in module <code>Headers/state_chm_mod.F90</code>).  This will make sure that we only allocate memory to these fields if we are using the UCX mechanism.  The fields will be set to <code>NULL()</code> otherwise.
    <span style="color:green">! Fields for UCX mechanism
    State_Chm%STATE_PSC  => NULL()
    State_Chm%KHETI_SLA  => NULL()</span>
    . . .
    !=====================================================================
    ! Allocate and initialize fields for UCX mechamism
    !=====================================================================
<span style="color:green">#if defined( UCX )</span>
    ALLOCATE( State_Chm%STATE_PSC ( IM, JM, LM                    ), STAT=RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    State_Chm%STATE_PSC = 0.0_f4
    ALLOCATE( State_Chm%KHETI_SLA ( IM, JM, LM, 11                ), STAT=RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    State_Chm%KHETI_SLA = 0.0_fp
<span style="color:green">#endif</span>
--[[User:Bmy|Bob Yantosca]] ([[User talk:Bmy|talk]]) 18:32, 28 November 2016 (UTC)
===  Fix for mesospheric NOx chemistry ===
<span style="color:green">'''''This update was validated with the 1-month benchmark simulation [[GEOS-Chem v11-01 benchmark history#v11-01j|v11-01j]] and approved on 03 Dec 2016'''''</span>
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
:The first fix is to the [[FlexChem#Incorrect_species_units_used_in_routines_UCX_NOX_and_UCX_H2SO4PHOT|call to <tt>UCX_NOX</tt>]] itself. In the current version of GEOS-Chem, the call to <tt>UCX_NOX</tt> in the FlexChem module occurs while the species array is in molec/cm3, but <tt>UCX_NOX</tt> expects kg. Moving the call to be after the conversion fixes this issue.
:The second fix is to re-establish day-time steady-state for NOx in the mesosphere. This code was already present, but was not functioning correctly, as only NO was being used to estimate total NOx. Partitioning of NOx between N, NO, NO2 and NO3 is now calculated directly in the mesosphere. This assumes that the species will be locally in steady state as long as there is daylight, and that this steady state occurs on a much faster timescale than loss by the reactions N + NO -> N2 + O or N + NO2 -> N2O + O. O(1D) and O(3P) concentrations are taken from archived 2D data, along with J-rates for NO, NO2, NO3 and N2O. The O3 concentration is taken from the species array. Loss rates for NOx and N2O (in addition to the rate of NOx production from N2O) are also estimated, based on the aforementioned loss reactions and destruction of N2O by O(1D) and photolysis.
:Finally, I’ve updated the aforementioned chemistry scheme to improve accuracy. The first change is that the J-rates are no longer taken from 2D data. Instead, the J-rate calculated at the top of the stratosphere is applied vertically throughout the column. This mirrors the approach used to calculate mesospheric H2SO4 photolysis. The second change is that a heavily simplified NOx chemistry mechanism is applied during mesospheric night. Previously, it was assumed that there would be no mesospheric NOx chemistry at night. However, this led to an overestimate of N and NO, and an underestimate of NO2 and NO3 (especially at high latitudes). It is now assumed that when there is no sunlight there is negligible N, O(1D) and O(3P). This reduces the mesospheric NOx mechanism to a 3-reactant chain. All local N is converted immediately to NO, and then only the two following reactions occur: NO + O3 -> NO2 + O2 and NO2 + O3 -> NO3 + O2. The evolution of the partitioning between these species is too slow to be well-represented by steady state, but the simplicity of the mechanism allows for an analytical solution. The extra overhead should be effectively zero, as it requires the evaluation of only three exponentials in each mesospheric night-time grid cell.
--[[User:Melissa Payer|Melissa Sulprizio]] ([[User talk:Melissa Payer|talk]]) 16:27, 21 November 2016 (UTC)
=== Fix for black carbon in ucx_mod.F ===
<span style="color:green">'''''This fix was validated with [[GEOS-Chem_v11-01_benchmark_history#v11-01b|1-month benchmark simulation v11-01b]] and [[GEOS-Chem_v11-01_benchmark_history#v11-01b-Run0|1-year benchmark simulation v11-01b-Run0]]. This version was approved on 19 Aug 2015.'''''</span>
'''''[[User:Sebastian_D._Eastham|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 <tt>ucx_mod.F</tt>, 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.
--[[User:Melissa Payer|Melissa Sulprizio]] ([[User talk:Melissa Payer|talk]]) 16:06, 13 July 2015 (UTC)
=== Reactivate bromine species photolysis for tropospheric simulations===
<span style="color:green">'''''This update was validated in the 1-month benchmark simulation [[GEOS-Chem v10-01 benchmark history#v10-01c|v10-01c]] and approved on 29 May 2014.'''''</span>
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 [[FAST-JX v7.0 photolysis mechanism#Reactivation of bromine species photolysis for tropospheric simulation|this post on our ''Fast-JX v7.0 photolysis mechanism'' wiki page]].
--[[User:Melissa Payer|Melissa Sulprizio]] 13:43, 14 May 2014 (EDT)
=== Error in Fast-JX for tropospheric only simulation ===
<span style="color:green">'''''This update was validated in the 1-month benchmark simulation [[GEOS-Chem v10-01 benchmark history#v10-01c|v10-01c]] and approved on 29 May 2014.'''''</span>
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 [[FAST-JX v7.0 photolysis mechanism#Error_in_reducing_wavelength_bins_for_tropospheric_simulation|this post on our ''FAST-JX v7.0 photolysis mechanism'' wiki page]].
--[[User:Bmy|Bob Y.]] 14:27, 20 May 2014 (EDT)
=== Modify treatment of N2O5 + H2O reaction in calcrate.F ===
<span style="color:green">'''''This update was validated in the 1-month benchmark simulation [[GEOS-Chem v10-01 benchmark history#v10-01c|v10-01c]] and approved on 29 May 2014.'''''</span>
<span style="color:red">'''''NOTE: Routine <tt>calcrate.F</tt> is slated for removal from [[GEOS-Chem v11-01]] once the new FlexChem solver is implemented.'''''</span>
The reaction for <tt>N2O5 + H2O</tt> was found to be problematic in long-term UCX simulations where the <tt>H2O</tt> concentration (stored in the <tt>EDUCTCONC</tt> variable in file <tt>GeosCore/calcrate.F</tt>) was low and caused the solver to choke. Sebastian Eastham suggested that we include the following fix in the standard code.
   
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
   
:The division is necessary to compensate for the change from <tt>N2O5 -> 2HNO3</tt> to <tt>N2O5 + H2O -> 2HNO3</tt>&mdash;it's still "as in base GEOS-Chem" though in the sense that it doesn't check to see if <tt>N2O5</tt> or <tt>H2O</tt> 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 <tt>PSCMINLIFE</tt>) would help.
 
Following Sebastian's suggestion, we have made the following modification in this section of <tt>calcrate.F</tt> 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
   
--[[User:Bmy|Bob Y.]] 14:56, 13 May 2014 (EDT)
=== Read 2D data for individual NOx species in ucx_mod.F ===
<span style="color:green">'''''This update was validated with the 1-month benchmark simulation [[GEOS-Chem v10-01 benchmark history#v10-01f|v10-01f]] and approved on Approved 13 Jan 2015.'''''</span>
'''''[[User:Sebastian_D._Eastham|Sebastian Eastham]] wrote:'''''
:A quick and easy improvement can be made now that NOx has been split out into separate species. In <tt>ucx_mod.F</tt> 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 <tt>ucx_mod.F</tt> 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 <tt>SET_INITIAL_MIXRATIOS</tt>, 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
--[[User:Melissa Payer|Melissa Sulprizio]] 11:23, 18 June 2014 (EDT)
== References ==
# 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'', <u>Atmos. Env.</u>, June 2014. [http://dx.doi.org/10.1016/j.atmosenv.2014.02.001 (Article)]
#Technical Note: The GEOS-Chem Unified Tropospheric-Stratospheric Chemistry Extension (UCX): Interim Distribution, September 2013 [http://lae.mit.edu/uploads/LAE_report_series/2013/LAE-2013-006-N.pdf (Article)]

Latest revision as of 15:57, 17 May 2018

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.

NOTE: The UCX chemistry mechanism is included in the "benchmark" chemistry mechanism, which is selected by default when you compile and run GEOS-Chem "out of the box". The "benchmark" mechanism adds extra SOA species that are not present in the original UCX implementation. For more information, see our GEOS-Chem chemistry mechanisms wiki page.

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:

  1. 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)
  2. 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? and Active strat. H2O? should be set to T in the input.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 in input.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

v11-01 and prior versions

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?      : T
   => 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)

v11-02

This update was included in v11-02e (approved 24 Mar 2018).

Sebastian Eastham wrote:

When developing the UCX, we recognized that many users would have restart files which didn't contain data on long-lived stratospheric species. Standard spin-up is not an option for these - it would take decades to get strat CFCs to the correct mixing ratio. As a result, we offered them the option of using zonal mean mixing ratios from a 2D stratospheric model (the AER CTM) for long-lived species. These were stored as monthly means in simple ASCII files. If the user set the appropriate switch in input.geos, stratospheric mixing ratios for long-lived species would be overwritten with these zonal mean values at model initialization. Specifically, all values of STT(:,J,L) would be set to STT_2D(J,L), with STT_2D read in from the ASCII file. Many of these routines are hard-coded to deal with only 4x5 and 2x2.5. A spinup would still be needed, but it would be a few years rather than a few decades. This gave users flexibility and meant that users didn't have to deal with modifying GEOS-Chem restart files in IDL (probably my least favorite task).

Five things have changed since then:

  1. There are restarts available from the GCST which contain reasonable concentrations of long-lived tracers;
  2. GCC restarts are now NetCDF, which makes everyone's lives easier;
  3. We have transitioned away from relying on ASCII files, such that the old 2D ASCII files are an irritation;
  4. GIGC removes the assumption that all cells in STT(:,NY) are at the same latitude, making the old code obsolete; and
  5. GIGC means that we have way more than 2 resolutions to worry about.

Now, each of these would be easy enough to deal with, but the fact is that the routines are basically obsolete. The only real exception is H2O, which we do need to hold on to but which is set from the met data, so we don't need ASCII input files.

For this update, the following lines have been removed from input.geos:

%%% EMISSIONS MENU %%%  :
Turn on emissions?      : T
HEMCO Input file        : HEMCO_Config.rc
 => 1ppt MBL BRO Sim.?  : F
Switches for UCX        :---
 => Use CH4 emissions?  : F
 => Turn on surface BCs :---
    => CH4?             : T
    => OCS?             : T
    => CFCs?            : T
    => Cl species?      : T
    => Br species?      : F
    => N2O?             : T
 => 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

--Lizzie Lundgren (talk) 19:28, 10 May 2017 (UTC)

Previous issues that are now resolved

Fix for UCX mesospheric NOy routine

This update was included in v11-02f (approved 17 May 2018).

Sebastian Eastham wrote:

This is just a small fix for the UCX mesospheric NOy routine. UCX currently uses the N, NO, NO2, and NO3 entries in the State_Chm%Species array to determine total NOx, using the species database molar masses to convert between molec/cm3 and kg. However the entry for N isn’t necessarily meaningful, as KPP never acts on mesospheric boxes (yet!), and furthermore the molar mass for N is not necessarily meaningful either – if I remember rightly it is -1 because N is not a tracer. This patch works around that by assuming that “NO” = NO + N, and ignoring whatever is in Species(I,J,L,id_N). This is by no means urgent but should slightly improve the mesospheric simulation.

--Bob Yantosca (talk) 15:57, 17 May 2018 (UTC)

UCX stratospheric water boundary condition update

This update was included in v11-02e (approved 24 Mar 2018).

Sebastian Eastham wrote:

Chris Holmes wrote a minor update to the UCX stratospheric water boundary condition (attached), which I think would constitute a useful improvement for GEOS-Chem v11-02. This fix just ensures that the boundary condition for stratospheric water vapor is set at or above the tropical cold point, rather than at the meteorological tropopause. Since the met tropopause can sometimes be below the cold point, the pre-fix UCX would sometimes allow excessive water vapor to enter the stratosphere.

--Lizzie Lundgren (talk) 20:09, 5 January 2017 (UTC)

Remove UCX #ifdefs and replace with Input_Opt%LUCX

This update was included in v11-02e (approved 24 Mar 2018).

In v11-02e, the UCX CPP switch has been removed completely and code previously blocked off with #if defined( UCX ) has now been replaced with IF statements for Input_OPpt%LUCX. This facilitates easily turning on/off the UCX option via the option in input.geos and no longer requires users to recompile GEOS-Chem.

This update also required we certain fields from input.geos up front in order to initialize values in CMN_SIZE_mod.F and CMN_FJX_mod.F that differ when UCX is turned on/off. In main.F, we now initialize Input_Opt first, then read input.geos, then do other initializations.

--Melissa Sulprizio (talk) 19:32, 30 January 2018 (UTC)

Fix bug impacting dust radius obtained in RDUST_ONLINE

This update was included in v11-02d (approved 12 Feb 2018).

In the UCX simulation were accessing the wrong file for when obtaining aerosol optical properties for dust. In FAST-JX we have routine RD_AOD to read all the .dat files containing the optical properties for different aerosols. Those files are defined as:

      DATA SPECFIL /"so4.dat","soot.dat","org.dat","ssa.dat","ssc.dat",
#if defined( UCX )
      ! Treating strat sulfate with GADS data but modified to match
      ! the old Fast-J values size (r=0.09um, sg=0.6) - I think there's
      ! evidence that this is too smale and narrow e.g. Deshler et al. 2003
      ! NAT should really be associated with something like cirrus cloud
      ! but for now we are just treating the NAT like the sulfate... limited
      ! info but ref index is similar e.g. Scarchilli et al. (2005)
      !(DAR 05/2015)
     &              "h2so4.dat","h2so4.dat",
#endif
     &              "dust.dat"/

Then in the dust code, we obtain the dust properties (e.g. aerosol radius) from the values read from the dust.dat file.

         ERADIUS(I,J,L,N) = RDAA(N,6) * 1.0e-4_fp

         TAREA(I,J,L,N)   = 3.e+0_fp / ERADIUS(I,J,L,N) *
     &                      DUST(I,J,L,N) / MSDENS(N)

The issue here is that aerosol radius is always accessed with index 6 in the second dimension, which refers to the 6th file read in RD_AOD. For the tropchem simulation, dust.dat is the 6th file read, but for UCX h2so4.dat is the 6th file read. Therefore, in the UCX simulation the properties for H2SO4 will be used for dust aerosol radius, which in turn impacts aerosol area. The aerosol radius and area fields are used in other routines, including gckpp_HetRates.F90. So the wrong values for dust are passed to the heterogeneous chemistry routines and this results in different het rates for the UCX and tropchem simulations. The differences are especially noticeable in regions of high dust concentrations (e.g. the Middle East where we saw large differences in O3 concentrations).

The quick fix is to change the line in the dust code to make sure we obtain the data from the correct file:

#if defined ( UCX )
         ERADIUS(I,J,L,N) = RDAA(N,8) * 1.0e-4_fp
#else
         ERADIUS(I,J,L,N) = RDAA(N,6) * 1.0e-4_fp
#endif

We could eventually change the order of files listed in FAST-JX so that the h2so4.dat files are listed at the end, but we would need to make sure there are no other places in the code that use hardwiring as in dust_mod.F to access aerosol properties.

--Melissa Sulprizio (talk) 16:19, 2 January 2018 (UTC)

Bug fixes for running UCX in ESMF environment

These fixes were included in v11-02a and approved on 12 May 2017.

Christoph Keller wrote:

I just merged GEOS-Chem v11-01 into GEOS-5 and had to add a few bug fixes to GEOS-Chem to make it work. Most of them are minor, i.e. initializing a variable to zero or adding some am_I_Root checks. The only noteworthy fix is that I had to move the definition of variable id_CH4 in flexchem_mod.F90 outside of the compiler bracket:

   old:
   #if defined( EXTERNAL_GRID ) || defined( EXTERNAL_FORCING )
       !-----------------------------------------------------------------
       !         %%%%%%% GEOS-Chem HP (with ESMF & MPI) %%%%%%%
       !
       ! Do nothing, since we will call these setup routines from the 
       ! init method of the ESMF interface (bmy, 10/24/12)
       !-----------------------------------------------------------------
   #else
       !-----------------------------------------------------------------
       !         %%%%%%% GEOS-Chem CLASSIC (with OpenMP) %%%%%%%
       !
       ! Call the following chemistry setup routines only on the very
       ! first chemistry timestep.  This is current practice in the
       ! std GEOS-Chem. (bmy, 10/24/12)
       !-----------------------------------------------------------------
       IF ( FIRSTCHEM ) THEN

          !---------------------------------
          ! Set global concentration of CH4
          !---------------------------------
          ! Define advected species ID flag
          id_CH4 = Ind_('CH4','A')
   new:
       ! Define advected species ID flag
       id_CH4 = Ind_('CH4','A')

   #if defined( EXTERNAL_GRID ) || defined( EXTERNAL_FORCING )
       !-----------------------------------------------------------------
       !         %%%%%%% GEOS-Chem HP (with ESMF & MPI) %%%%%%%
       !
       ! Do nothing, since we will call these setup routines from the 
       ! init method of the ESMF interface (bmy, 10/24/12)
       !-----------------------------------------------------------------
   #else
       !-----------------------------------------------------------------
       !         %%%%%%% GEOS-Chem CLASSIC (with OpenMP) %%%%%%%
       !
       ! Call the following chemistry setup routines only on the very
       ! first chemistry timestep.  This is current practice in the
       ! std GEOS-Chem. (bmy, 10/24/12)
       !-----------------------------------------------------------------
       IF ( FIRSTCHEM ) THEN

          !---------------------------------
          ! Set global concentration of CH4
          !---------------------------------

In the original code it would always assume that id_CH4 < 0 and it caused my CH4 concentrations to be zero when running with UCX.

--Melissa Sulprizio (talk) 17:32, 10 March 2017 (UTC)

Only allocate certain fields of State_Chm for UCX-based simulations

This update was included in v11-01k and approved on 19 Dec 2016

In GEOS-Chem v10-01 and higher versions, the 3-D fields State_Chm%KHETI_SLA and State_Chm%STATE_PSC are always allocated. But these fields are only relevant to full-chemistry simulations using the UCX mechanism (e.g. Standard, UCX) and are not used otherwise. This causes GEOS-Chem to set aside extra, unnecessary memory for simulations that do not use the UCX mechanism.

We have therefore made the following modifications (shown in GREEN in routine Init_State_Chm (located in module Headers/state_chm_mod.F90). This will make sure that we only allocate memory to these fields if we are using the UCX mechanism. The fields will be set to NULL() otherwise.

    ! Fields for UCX mechanism
    State_Chm%STATE_PSC   => NULL()
    State_Chm%KHETI_SLA   => NULL()

    . . .

    !=====================================================================
    ! Allocate and initialize fields for UCX mechamism
    !=====================================================================
#if defined( UCX )

    ALLOCATE( State_Chm%STATE_PSC ( IM, JM, LM                     ), STAT=RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    State_Chm%STATE_PSC = 0.0_f4

    ALLOCATE( State_Chm%KHETI_SLA ( IM, JM, LM, 11                 ), STAT=RC )
    IF ( RC /= GC_SUCCESS ) RETURN
    State_Chm%KHETI_SLA = 0.0_fp

#endif

--Bob Yantosca (talk) 18:32, 28 November 2016 (UTC)

Fix for mesospheric NOx chemistry

This update was validated with the 1-month benchmark simulation v11-01j and approved on 03 Dec 2016

Sebastian Eastham wrote:

The first fix is to the call to UCX_NOX itself. In the current version of GEOS-Chem, the call to UCX_NOX in the FlexChem module occurs while the species array is in molec/cm3, but UCX_NOX expects kg. Moving the call to be after the conversion fixes this issue.
The second fix is to re-establish day-time steady-state for NOx in the mesosphere. This code was already present, but was not functioning correctly, as only NO was being used to estimate total NOx. Partitioning of NOx between N, NO, NO2 and NO3 is now calculated directly in the mesosphere. This assumes that the species will be locally in steady state as long as there is daylight, and that this steady state occurs on a much faster timescale than loss by the reactions N + NO -> N2 + O or N + NO2 -> N2O + O. O(1D) and O(3P) concentrations are taken from archived 2D data, along with J-rates for NO, NO2, NO3 and N2O. The O3 concentration is taken from the species array. Loss rates for NOx and N2O (in addition to the rate of NOx production from N2O) are also estimated, based on the aforementioned loss reactions and destruction of N2O by O(1D) and photolysis.
Finally, I’ve updated the aforementioned chemistry scheme to improve accuracy. The first change is that the J-rates are no longer taken from 2D data. Instead, the J-rate calculated at the top of the stratosphere is applied vertically throughout the column. This mirrors the approach used to calculate mesospheric H2SO4 photolysis. The second change is that a heavily simplified NOx chemistry mechanism is applied during mesospheric night. Previously, it was assumed that there would be no mesospheric NOx chemistry at night. However, this led to an overestimate of N and NO, and an underestimate of NO2 and NO3 (especially at high latitudes). It is now assumed that when there is no sunlight there is negligible N, O(1D) and O(3P). This reduces the mesospheric NOx mechanism to a 3-reactant chain. All local N is converted immediately to NO, and then only the two following reactions occur: NO + O3 -> NO2 + O2 and NO2 + O3 -> NO3 + O2. The evolution of the partitioning between these species is too slow to be well-represented by steady state, but the simplicity of the mechanism allows for an analytical solution. The extra overhead should be effectively zero, as it requires the evaluation of only three exponentials in each mesospheric night-time grid cell.

--Melissa Sulprizio (talk) 16:27, 21 November 2016 (UTC)

Fix for black carbon in ucx_mod.F

This fix was validated with 1-month benchmark simulation v11-01b and 1-year benchmark simulation v11-01b-Run0. This version was approved on 19 Aug 2015.

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.

NOTE: Routine calcrate.F is slated for removal from GEOS-Chem v11-01 once the new FlexChem solver is implemented.

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)

References

  1. 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)
  2. Technical Note: The GEOS-Chem Unified Tropospheric-Stratospheric Chemistry Extension (UCX): Interim Distribution, September 2013 (Article)