POPs simulation
On this page we include information relevant to the persistent organic pollutant (POPs) simulation in GEOS-Chem.
Overview
Authors and collaborators
- Noelle Selin (MIT)
- Carey Friedman (MIT)
PAH simulation
This update was tested in the 1-month benchmark simulation v9-02c and approved on 29 Nov 2012.
A simulation for polycyclic aromatic hydrocarbons (PAHs) has been added to GEOS-Chem v8-03-02 following Friedman and Selin (2012). Three separate PAHs are modeled: phenanthrene (PHE), pyrene (PYR), and benzo[a]pyrene (BaP). Separate modules have been created for each of the PAHs. Users can choose between different compounds in the input file.
--Melissa Payer 12:31, 21 September 2012 (EDT)
PCB simulation
Info to be added.
References
- Friedman, C. L., Pierce, J. R., Selin, N. E., Assessing the influence of secondary organic versus primary carbonaceous aerosols on long-range atmospheric polycyclic aromatic hydrocarbon transport, Environ. Sci. Technol., in press, 2014.
- Friedman, C. L, Zhang, Y., Selin, N. E, Climate change and emissions impacts on atmospheric PAH transport to the Arctic, Environ. Sci. Technol., 48, pp4 29-437, 2014.
- Friedman, C. L and, N. E. Selin, Long-Range Atmospheric Transport of Polycyclic Aromatic Hydrocarbons: A Global 3-D Model Analysis Including Evaluation of Arctic Sources, Environ. Sci. Technol., 2012, 46 (17), pp 9501–9510, 2012. Article
--Bob Y. 14:27, 14 April 2014 (EDT)
Previous issues that are now resolved
Prevent error when reading global OC
NOTE: This issue was resolved in the GEOS-Chem v9-02 public release (03 Mar 2014).
In routine GET_GLOBAL_OC (in module GeosCore/global_oc_mod.F), we have:
! Data is only available for 2005-2009 IF ( THISYEAR < 2005 ) THEN YEAR = 2005 ELSE IF ( THIS YEAR > 2009 ) THEN YEAR = 2009 ELSE YEAR = THISYEAR ENDIF ! Get the TAU0 value for the start of the given month XTAU = GET_TAU0( THISMONTH, 1, THISYEAR )
To avoid a segmentation fault error when THISYEAR is outside of 2005-2009, we must change XTAU to:
! Get the TAU0 value for the start of the given month XTAU = GET_TAU0( THISMONTH, 1, YEAR )
--Melissa Sulprizio 10:33, 24 February 2014 (EST)
Outstanding issues
Avoid div-by-zero errors in POPs simulation
These updates were validated with 1-month benchmark simulation GEOS-Chem v10-01c, which was approved on 29 May 2014.
While testing the POPs simulation with the GEOS-Chem Unit Tester, we encountered some division-by-zero errors. The fixes are as follows:
(1) At about line 1661 of routine EMISSPOPS (in module file GeosCore/pops_mod.F), change this line of code:
! Check that sum thru PBL is equal to original emissions array SUM_OF_ALL(I,J) = POP_TOT_EM(I,J) / SUM_OF_ALL(I,J)
to this:
! Check that sum thru PBL is equal to original emissions array ! NOTE: Prevent div-by-zero floating point error (bmy, 4/14/14) IF ( SUM_OF_ALL(I,J) > 0d0 ) THEN SUM_OF_ALL(I,J) = POP_TOT_EM(I,J) / SUM_OF_ALL(I,J) ENDIF
This prevents us from dividing by SUM_OF_ALL(I,J) if it’s zero. Otherwise some kind of junk value or NaN could possibly propagate thru the code.
(2) In routine CHEM_POPGP (in module GeosCore/pops_mod.F), make the following modifications:
USE ERROR_MOD, ONLY : SAFE_DIV ! Add this w/ the other USE statements . . . REAL*8 :: DENOM ! Add this w/ the other variable declarations . . . ! Get AIRVOL AIR_VOL = State_Met%AIRVOL(I,J,L) !----------------------------------------------------------------------------- ! Prior to 4/14/14: ! Need to put error traps to prevent div-by-zero (bmy, 4/14/14) ! ! Define volume ratios: ! ! VR_OC_AIR = volume ratio of OC to air [unitless] ! VR_OC_AIR = C_OC_CHEM1 / AIR_VOL ! could be zero ! ! ! VR_OC_BC = volume ratio of OC to BC [unitless] ! VR_OC_BC = C_OC_CHEM1 / C_BC_CHEM1 ! could be zero or undefined ! ! ! VR_BC_AIR = volume ratio of BC to air [unitless] ! VR_BC_AIR = VR_OC_AIR / VR_OC_BC ! could be zero or undefined ! ! ! VR_BC_OC = volume ratio of BC to OC [unitless] ! VR_BC_OC = 1d0 / VR_OC_BC ! could be zero or undefined ! ! ! Redefine fractions of total POPs in box (I,J,L) that are OC-phase, ! ! BC-phase, and gas phase with new time step (should only change if ! ! temp changes or OC/BC concentrations change) ! OC_AIR_RATIO = 1d0 / (KOA_T * VR_OC_AIR) ! OC_BC_RATIO = 1d0 / (KOC_BC_T * VR_OC_BC) ! ! BC_AIR_RATIO = 1d0 / (KBC_T * VR_BC_AIR) ! BC_OC_RATIO = 1d0 / (KBC_OC_T * VR_BC_OC) !----------------------------------------------------------------------------- ! Define volume ratios: ! VR_OC_AIR = volume ratio of OC to air [unitless] VR_OC_AIR = C_OC_CHEM1 / AIR_VOL ! could be zero ! VR_OC_BC = volume ratio of OC to BC [unitless] VR_OC_BC = SAFE_DIV( C_OC_CHEM1, C_BC_CHEM1, 0d0 ) ! VR_BC_AIR = volume ratio of BC to air [unitless] VR_BC_AIR = SAFE_DIV( VR_OC_AIR, VR_OC_BC, 0d0 ) ! VR_BC_OC = volume ratio of BC to OC [unitless] VR_BC_OC = SAFE_DIV( 1d0, VR_OC_BC, 0d0 ) ! Redefine fractions of total POPs in box (I,J,L) that are OC-phase, ! BC-phase, and gas phase with new time step (should only change if ! temp changes or OC/BC concentrations change) DENOM = KOA_T * VR_OC_AIR OC_AIR_RATIO = SAFE_DIV( 1d0, DENOM, 0d0 ) DENOM = KOC_BC_T * VR_OC_BC OC_BC_RATIO = SAFE_DIV( 1d0, DENOM, 0d0 ) DENOM = KBC_T * VR_BC_AIR BC_AIR_RATIO = SAFE_DIV( 1d0, DENOM, 0d0 ) DENOM = KBC_OC_T * VR_BC_OC BC_OC_RATIO = SAFE_DIV( 1d0, DENOM, 0d0 )
The function SAFE_DIV (in module file GeosUtil/error_mod.F) tests if the division can be done, and if not, it will assign an alternate value (in this case, 0d0). Using SAFE_DIV prevents div-by-zero errors from happening in the computations for variables: VR_OC_AIR, VR_BC_AIR, VR_BC_OC, VR_OC_BC, OC_AIR_RATIO, OC_BC_RATIO, BC_AIR_RATIO, BC_OC_RATIO.
--Bob Y. 17:02, 30 May 2014 (EDT)
References
- Friedman, C.L. and N.E. Selin. Long-range atmospheric transport of polycyclic aromatic hydrocarbons: A global 3-D model analysis including evaluation of Arctic sources, Environ. Sci. Technol., 46, 9501-9510, 2012.