UCX chemistry mechanism: Difference between revisions
Line 52: | Line 52: | ||
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. | 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. | ||
'''''Sebastian Eastham wrote:''''' | '''''[[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>—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. | :The division is necessary to compensate for the change from <tt>N2O5 -> 2HNO3</tt> to <tt>N2O5 + H2O -> 2HNO3</tt>—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. | ||
Line 91: | Line 91: | ||
--[[User:Bmy|Bob Y.]] 14:56, 13 May 2014 (EDT) | --[[User:Bmy|Bob Y.]] 14:56, 13 May 2014 (EDT) | ||
=== Read 2D data for individual NOx species in ucx_mod.F === | |||
'''''This update is slated for inclusion in [[GEOS-Chem v10-01]]. | |||
'''''[[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 | |' | |||
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 = '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 ) | |||
TRAC_IDX = IDTNO3 | |||
TRAC_SET = 'NO3' | |||
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 ) | |||
ENDIF | |||
--[[User:Melissa Payer|Melissa Sulprizio]] 11:23, 18 June 2014 (EDT) |
Revision as of 15:23, 18 June 2014
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
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)
--Sebastian D. Eastham 13:08, 03 March 2014 (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 is currently undergoing benchmarking and validiation. It will be included in the GEOS-Chem v10-01 public release, slated for late 2014.
--Bob Y. 14:44, 25 April 2014 (EDT)
Previous issues that are now resolved
The following issues were discovered and corrected when UCX was added into the standard GEOS-Chem code (in version v10-01):
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 is slated for inclusion in GEOS-Chem v10-01.
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 | |' 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 = '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 ) TRAC_IDX = IDTNO3 TRAC_SET = 'NO3' 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 ) ENDIF
--Melissa Sulprizio 11:23, 18 June 2014 (EDT)