! $Id: tracerid_mod.f,v 1.1 2009/06/09 21:51:50 daven Exp $ MODULE TRACERID_MOD ! !****************************************************************************** ! Module TRACERID_MOD contains variables which point to SMVGEAR species, ! CTM Tracers, Biomass species, and biofuel species located within various ! GEOS-CHEM arrays. (bmy, 11/12/02, 2/14/08) ! ! Module Variables: ! ============================================================================ ! (1 ) NNNTRID (INTEGER) : Max # of tracers ! (2 ) MMMEMBER (INTEGER) : Max # of members per chemical family ! (3 ) NMEMBER (INTEGER) : Number of members per each family tracer ! (4 ) IDTRMB (INTEGER) : Species # for each component of family tracer ! (5 ) IDEMIS (INTEGER) : Emission array for SMVGEAR ! (6 ) CTRMB (REAL*8 ) : Array for # of moles member/moles tracer ! (7 ) IDO3 (INTEGER) : O3 index w/in CSPEC array ("comode_mod.f") ! (8 ) IDNO2 (INTEGER) : NO2 index w/in CSPEC array ("comode_mod.f") ! (9 ) IDNO3 (INTEGER) : NO3 index w/in CSPEC array ("comode_mod.f") ! (10 ) IDN2O5 (INTEGER) : N2O5 index w/in CSPEC array ("comode_mod.f") ! (11 ) IDHNO4 (INTEGER) : HNO4 index w/in CSPEC array ("comode_mod.f") ! (12 ) IDOX (INTEGER) : OX index w/in CSPEC array ("comode_mod.f") ! (13 ) IDNOX (INTEGER) : NOX index w/in CSPEC array ("comode_mod.f") ! (14 ) IDHC1 (INTEGER) : HC1 index w/in CSPEC array ("comode_mod.f") ! (15 ) IDNO (INTEGER) : NO index w/in CSPEC array ("comode_mod.f") ! (16 ) IDHNO2 (INTEGER) : HNO2 index w/in CSPEC array ("comode_mod.f") ! (17 ) IDCO (INTEGER) : CO index w/in CSPEC array ("comode_mod.f") ! (18 ) IDPRPE (INTEGER) : PRPE index w/in CSPEC array ("comode_mod.f") ! (19 ) IDISOP (INTEGER) : ISOP index w/in CSPEC array ("comode_mod.f") ! (20 ) IDALK4 (INTEGER) : ALK4 index w/in CSPEC array ("comode_mod.f") ! (21 ) IDC3H8 (INTEGER) : C3H8 index w/in CSPEC array ("comode_mod.f") ! (22 ) IDPAN (INTEGER) : PAN index w/in CSPEC array ("comode_mod.f") ! (23 ) IDGLPAN (INTEGER) : GLPAN index w/in CSPEC array ("comode_mod.f") ! (24 ) IDGPAN (INTEGER) : GPAN index w/in CSPEC array ("comode_mod.f") ! (25 ) IDPMN (INTEGER) : PMN index w/in CSPEC array ("comode_mod.f") ! (26 ) IDPPN (INTEGER) : PPN index w/in CSPEC array ("comode_mod.f") ! (27 ) IDHNO3 (INTEGER) : HNO3 index w/in CSPEC array ("comode_mod.f") ! (28 ) IDOH (INTEGER) : OH index w/in CSPEC array ("comode_mod.f") ! (29 ) IDHO2 (INTEGER) : HO2 index w/in CSPEC array ("comode_mod.f") ! (30 ) IDH2O2 (INTEGER) : H2O2 index w/in CSPEC array ("comode_mod.f") ! (31 ) IDACET (INTEGER) : ACET index w/in CSPEC array ("comode_mod.f") ! (32 ) IDMEK (INTEGER) : MEK index w/in CSPEC array ("comode_mod.f") ! (33 ) IDALD2 (INTEGER) : ALD2 index w/in CSPEC array ("comode_mod.f") ! (34 ) IDRCHO (INTEGER) : RCHO index w/in CSPEC array ("comode_mod.f") ! (35 ) IDMVK (INTEGER) : MVK index w/in CSPEC array ("comode_mod.f") ! (36 ) IDMACR (INTEGER) : MACR index w/in CSPEC array ("comode_mod.f") ! (37 ) IDISN2 (INTEGER) : ISN2 index w/in CSPEC array ("comode_mod.f") ! (38 ) IDR4N2 (INTEGER) : R4N2 index w/in CSPEC array ("comode_mod.f") ! (39 ) IDCH2O (INTEGER) : CH2O index w/in CSPEC array ("comode_mod.f") ! (40 ) IDC2H6 (INTEGER) : C2H6 index w/in CSPEC array ("comode_mod.f") ! (41 ) IDMP (INTEGER) : MP index w/in CSPEC array ("comode_mod.f") ! (42 ) IDDMS (INTEGER) : DMS index w/in CSPEC array ("comode_mod.f") ! (43 ) IDSO2 (INTEGER) : SO2 index w/in CSPEC array ("comode_mod.f") ! (44 ) IDSO4 (INTEGER) : SO4 index w/in CSPEC array ("comode_mod.f") ! (45 ) IDMSA (INTEGER) : MSA index w/in CSPEC array ("comode_mod.f") ! (46 ) IDDRYO3 (INTEGER) : DRYO3 index w/in CSPEC array ("comode_mod.f") ! (47 ) IDDRYPAN (INTEGER) : DRYPAN index w/in CSPEC array ("comode_mod.f") ! (48 ) IDDRYNO2 (INTEGER) : DRYNO2 index w/in CSPEC array ("comode_mod.f") ! (49 ) IDTNOX (INTEGER) : NOx index w/in STT array ("tracer_mod.f") ! (50 ) IDTOX (INTEGER) : Ox index w/in STT array ("CMN") ! (51 ) IDTPAN (INTEGER) : PAN index w/in STT array ("tracer_mod.f") ! (52 ) IDTCO (INTEGER) : CO index w/in STT array ("tracer_mod.f") ! (53 ) IDTALK4 (INTEGER) : ALK4 index w/in STT array ("tracer_mod.f") ! (54 ) IDTISOP (INTEGER) : ISOP index w/in STT array ("tracer_mod.f") ! (55 ) IDTHNO3 (INTEGER) : HNO3 index w/in STT array ("tracer_mod.f") ! (56 ) IDTH2O2 (INTEGER) : H2O2 index w/in STT array ("tracer_mod.f") ! (57 ) IDTACET (INTEGER) : ACET index w/in STT array ("tracer_mod.f") ! (58 ) IDTMEK (INTEGER) : MEK index w/in STT array ("tracer_mod.f") ! (59 ) IDTALD2 (INTEGER) : ALD2 index w/in STT array ("tracer_mod.f") ! (60 ) IDTRCHO (INTEGER) : RCHO index w/in STT array ("tracer_mod.f") ! (61 ) IDTMVK (INTEGER) : MVK index w/in STT array ("tracer_mod.f") ! (62 ) IDTMACR (INTEGER) : MACR index w/in STT array ("tracer_mod.f") ! (63 ) IDTPMN (INTEGER) : PMN index w/in STT array ("tracer_mod.f") ! (64 ) IDTPPN (INTEGER) : PPN index w/in STT array ("tracer_mod.f") ! (65 ) IDTISN2 (INTEGER) : ISN2 index w/in STT array ("tracer_mod.f") ! (66 ) IDTR4N2 (INTEGER) : R4N2 index w/in STT array ("tracer_mod.f") ! (67 ) IDTPRPE (INTEGER) : PRPE index w/in STT array ("tracer_mod.f") ! (68 ) IDTC3H8 (INTEGER) : C3H8 index w/in STT array ("tracer_mod.f") ! (69 ) IDTCH2O (INTEGER) : CH2O index w/in STT array ("tracer_mod.f") ! (70 ) IDTMP (INTEGER) : MP index w/in STT array ("tracer_mod.f") ! (71 ) IDTN2O5 (INTEGER) : N2O5 index w/in STT array ("tracer_mod.f") ! (72 ) IDTHNO4 (INTEGER) : HNO4 index w/in STT array ("tracer_mod.f") ! (73 ) IDTC2H6 (INTEGER) : C2H6 index w/in STT array ("tracer_mod.f") ! (74 ) IDTDMS (INTEGER) : DMS index w/in STT array ("tracer_mod.f") ! (75 ) IDTSO2 (INTEGER) : SO2 index w/in STT array ("tracer_mod.f") ! (76 ) IDTSO4 (INTEGER) : SO4 index w/in STT array ("tracer_mod.f") ! (77 ) IDTSO4aq (INTEGER) : SO4aq index w/in STT array ("tracer_mod.f") ! (78 ) IDTSO4s (INTEGER) : SO4s index w/in STT array ("tracer_mod.f") ! (79 ) IDTMSA (INTEGER) : MSA index w/in STT array ("tracer_mod.f") ! (80 ) IDTNH3 (INTEGER) : NH3 index w/in STT array ("tracer_mod.f") ! (81 ) IDTNH4 (INTEGER) : NH4 index w/in STT array ("tracer_mod.f") ! (82 ) IDTNIT (INTEGER) : NIT index w/in STT array ("tracer_mod.f") ! (83 ) IDTNITs (INTEGER) : NITs index w/in STT array ("tracer_mod.f") ! (84 ) IDTRN (INTEGER) : Rn index w/in STT array ("tracer_mod.f") ! (85 ) IDTPB (INTEGER) : Pb index w/in STT array ("tracer_mod.f") ! (86 ) IDTBE7 (INTEGER) : Be7 index w/in STT array ("tracer_mod.f") ! (87 ) IDTBCPI (INTEGER) : BCPI index w/in STT array ("tracer_mod.f") ! (88 ) IDTBCPO (INTEGER) : BCPO index w/in STT array ("tracer_mod.f") ! (89 ) IDTOCPI (INTEGER) : OCPI index w/in STT array ("tracer_mod.f") ! (90 ) IDTOCPO (INTEGER) : OCPO index w/in STT array ("tracer_mod.f") ! (91 ) IDTALPH (INTEGER) : ALPH index w/in STT array ("tracer_mod.f") ! (92 ) IDTLIMO (INTEGER) : LIMO index w/in STT array ("tracer_mod.f") ! (93 ) IDTALCO (INTEGER) : ALCO index w/in STT array ("tracer_mod.f") ! (94 ) IDTSOG1 (INTEGER) : SOG1 index w/in STT array ("tracer_mod.f") ! (95 ) IDTSOG2 (INTEGER) : SOG2 index w/in STT array ("tracer_mod.f") ! (96 ) IDTSOG3 (INTEGER) : SOG3 index w/in STT array ("tracer_mod.f") ! (97 ) IDTSOA1 (INTEGER) : SOA1 index w/in STT array ("tracer_mod.f") ! (98 ) IDTSOA2 (INTEGER) : SOA2 index w/in STT array ("tracer_mod.f") ! (99 ) IDTSOA3 (INTEGER) : SOA3 index w/in STT array ("tracer_mod.f") ! (100) IDTDST1 (INTEGER) : DST1 index w/in STT array ("tracer_mod.f") ! (101) IDTDST2 (INTEGER) : DST2 index w/in STT array ("tracer_mod.f") ! (102) IDTDST3 (INTEGER) : DST3 index w/in STT array ("tracer_mod.f") ! (103) IDTDST4 (INTEGER) : DST4 index w/in STT array ("tracer_mod.f") ! (104) IDTSALA (INTEGER) : SALA index w/in STT array ("tracer_mod.f") ! (105) IDTSALC (INTEGER) : SALC index w/in STT array ("tracer_mod.f") ! (109) IDENOX (INTEGER) : NOx index w/in EMISRRN array ("CMN_O3") ! (110) IDEOX (INTEGER) : Ox index w/in EMISRR array ("CMN_O3") ! (111) IDECO (INTEGER) : CO index w/in EMISRR array ("CMN_O3") ! (112) IDEPRPE (INTEGER) : PRPE index w/in EMISRR array ("CMN_O3") ! (113) IDEC3H8 (INTEGER) : C3H8 index w/in EMISRR array ("CMN_O3") ! (114) IDEALK4 (INTEGER) : ALK4 index w/in EMISRR array ("CMN_O3") ! (115) IDEC2H6 (INTEGER) : C2H6 index w/in EMISRR array ("CMN_O3") ! (116) IDEISOP (INTEGER) : ISOP index w/in EMISRR array ("CMN_O3") ! (117) IDEACET (INTEGER) : ACET index w/in EMISRR array ("CMN_O3") ! (118) IDEMEK (INTEGER) : MEK index w/in EMISRR array ("CMN_O3") ! (119) IDEALD2 (INTEGER) : ALD2 index w/in EMISRR array ("CMN_O3") ! (120) IDECH2O (INTEGER) : CH2O index w/in EMISRR array ("CMN_O3") ! (121) NEMBIOG (INTEGER) : # of biogenic emission species for SMVGEAR ! (122) NEMANTHRO (INTEGER) : # of anthro emission species for SMVGEAR ! (132) IDBFPRPE (INTEGER) : PRPE index w/in BURNEMIS array (biofuel_mod.f) ! (133) IDBALK4 (INTEGER) : ALD4 index w/in BURNEMIS array (biomass_mod.f) ! (134) IDBFNOX (INTEGER) : NOx index w/in BIOFUEL array (biofuel_mod.f) ! (135) IDBFCO (INTEGER) : CO index w/in BIOFUEL array (biofuel_mod.f) ! (136) IDBFALK4 (INTEGER) : ALK4 index w/in BIOFUEL array (biofuel_mod.f) ! (137) IDBFACET (INTEGER) : ACET index w/in BIOFUEL array (biofuel_mod.f) ! (138) IDBFMEK (INTEGER) : MEK index w/in BIOFUEL array (biofuel_mod.f) ! (139) IDBFALD2 (INTEGER) : ALD2 index w/in BIOFUEL array (biofuel_mod.f) ! (140) IDBFPRPE (INTEGER) : PRPE index w/in BIOFUEL array (biofuel_mod.f) ! (141) IDBFC3H8 (INTEGER) : NOx index w/in BIOFUEL array (biofuel_mod.f) ! (142) IDBFCH2O (INTEGER) : NOx index w/in BIOFUEL array (biofuel_mod.f) ! (143) IDBFC2H6 (INTEGER) : NOx index w/in BIOFUEL array (biofuel_mod.f) ! ! Module Routines: ! ============================================================================ ! (1 ) TRACERID : Defines tracer, biomass, biofuel, & anthro ID numbers ! (2 ) SETTRACE : Defines ID numbers for species in SMVGEAR mechanism ! (3 ) INIT_TRACERID : Zeroes all module variables ! ! GEOS-CHEM modules referenced by tracerid_mod.f ! ============================================================================ ! (1 ) charpak_mod.f : Module containing string handling routines ! (2 ) error_mod.f : Module containing I/O error and NaN check routines ! ! NOTES: ! (1 ) Added additional SMVGEAR species flags for DMS, SO2, SO4, MSA, so that ! these species can be handled w/in SMVGEAR (rjp, bmy, 3/23/03) ! (2 ) Added modifications for SMVGEAR II (bdf, bmy, 4/1/03) ! (3 ) Added extra flags for carbon & dust tracers (rjp, tdf, bmy, 4/1/04) ! (4 ) Added extra flags for seasalt tracers (rjp, bec, bmy, 4/20/04) ! (5 ) Increase NNNTRID for carb+dust+seasalt tracers (bmy, 4/26/04) ! (6 ) Increase NNNTRID & add extra flags for SOA tracers. (rjp, bmy, 7/13/04) ! (7 ) Bug fix: reverse IDECH2O and IDEISOP (bmy, 11/15/04) ! (8 ) Added IDTHG0, IDTHG2, IDTHGP + tagged Hg's (eck, bmy, 12/7/04) ! (9 ) Added IDTAS, IDTAHS, IDTLET, IDTNH4aq, IDTSO4aq (cas, bmy, 12/20/04) ! (10) Added IDTSO4s, IDTNITs ! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (12) Added functions IS_Hg0, IS_Hg2, IS_HgP. Also now use index arrays ! ID_Hg0, ID_Hg2, ID_HgP for tagged Hg tracers. (cdh, bmy, 1/5/06) ! (13) Remove IDBxxxx biomass flags; these aren't needed. (bmy, 4/5/06) ! (14) Add IDTSOG4 and IDTSOA4 (dkh, bmy, 5/18/06) ! (15) Minor fixes for CH3I simulation (bmy, 7/25/06) ! (16) Add IDTH2 and IDTHD for H2/HD simulation (hup, lyj, phs, 9/18/07) ! (17) Set IDECO=1 for Tagged CO simulation (jaf, mak, bmy, 2/14/08) ! (18) Add IDEHNO3 to deal with ship NOx emissions (phs, 3/4/08) ! (19) Added tracers and emissions for dicarbonyl simulation (tmf, 1/7/09) !****************************************************************************** ! IMPLICIT NONE ! for CTM tracers INTEGER, PARAMETER :: NNNTRID = 73 INTEGER, PARAMETER :: MMMEMBER = 10 INTEGER :: NMEMBER(NNNTRID) INTEGER :: IDTRMB(NNNTRID,MMMEMBER) INTEGER :: IDEMIS(NNNTRID) REAL*8 :: CTRMB(NNNTRID,MMMEMBER) ! ID's for SMVGEAR species INTEGER :: IDO3, IDNO2, IDNO3, IDN2O5, IDHNO4 INTEGER :: IDOX, IDNOX, IDHC1, IDNO, IDHNO2 INTEGER :: IDCO, IDPRPE, IDISOP, IDALK4, IDC3H8 INTEGER :: IDPAN, IDGLPAN, IDGPAN, IDPMN, IDPPN INTEGER :: IDHNO3, IDOH, IDHO2, IDH2O2, IDACET INTEGER :: IDMEK, IDALD2, IDRCHO, IDMVK, IDMACR INTEGER :: IDISN2, IDR4N2, IDCH2O, IDC2H6, IDMP INTEGER :: IDDMS, IDSO2, IDSO4, IDMSA INTEGER :: IDDRYO3, IDDRYPAN, IDDRYNO2, IDSO4s INTEGER :: IDGLYX, IDMGLY INTEGER :: IDBENZ, IDTOLU, IDXYLE, IDMONX INTEGER :: IDDRYGLYX, IDDRYMGLY INTEGER :: IDC2H2, IDC2H4 INTEGER :: IDMBO, IDGLYC INTEGER :: IDHAC INTEGER :: IDAPAN, IDENPAN, IDMPAN, IDNIPAN INTEGER :: IDDRYAPAN, IDDRYENPAN, IDDRYGLPAN INTEGER :: IDDRYGPAN, IDDRYMPAN, IDDRYNIPAN ! GEOS-CHEM tracer ID's INTEGER :: IDTNOX, IDTOX, IDTPAN, IDTCO, IDTALK4 INTEGER :: IDTISOP, IDTHNO3, IDTH2O2, IDTACET, IDTMEK INTEGER :: IDTALD2, IDTRCHO, IDTMVK, IDTMACR, IDTPMN INTEGER :: IDTPPN, IDTISN2, IDTR4N2, IDTPRPE, IDTC3H8 INTEGER :: IDTCH2O, IDTMP, IDTN2O5, IDTHNO4, IDTC2H6 INTEGER :: IDTDMS, IDTSO2, IDTSO4, IDTMSA, IDTNH3 INTEGER :: IDTNH4, IDTNIT, IDTRN, IDTPB, IDTBE7 INTEGER :: IDTBCPI, IDTBCPO, IDTOCPI, IDTOCPO, IDTDST1 INTEGER :: IDTDST2, IDTDST3, IDTDST4, IDTSALA, IDTSALC INTEGER :: IDTALPH, IDTLIMO, IDTALCO, IDTSOG1, IDTSOG2 INTEGER :: IDTSOG3, IDTSOG4, IDTSOA1, IDTSOA2, IDTSOA3 INTEGER :: IDTSOA4, IDTHG0, IDTHg2, IDTHgP, IDTAS INTEGER :: IDTAHS, IDTLET, IDTNH4aq,IDTSO4aq,IDTSO4s INTEGER :: IDTNITs INTEGER :: IDTBENZ, IDTTOLU, IDTXYLE, IDTMONX INTEGER :: IDTGLYX, IDTMGLY INTEGER :: IDTSOAG, IDTSOAM INTEGER :: IDTC2H2, IDTC2H4 INTEGER :: IDTMBO, IDTGLYC INTEGER :: IDTAPAN, IDTENPAN, IDTMPAN, IDTNIPAN INTEGER :: IDTGLPAN, IDTGPAN INTEGER :: IDTHAC !fp for NEI08 INTEGER :: IDTCH4, IDTNO, IDTNO2, IDTHNO2 INTEGER :: IDTEOH, IDTMOH ! For H2/HD simulation INTEGER :: IDTH2, IDTHD ! (hup, phs, 9/18/07) ! For tagged Hg simulation INTEGER :: N_Hg_CATS INTEGER, ALLOCATABLE :: ID_Hg0(:), ID_Hg2(:), ID_HgP(:) INTEGER :: ID_Hg_tot, ID_Hg_na, ID_Hg_eu INTEGER :: ID_Hg_as, ID_Hg_rw, ID_Hg_oc INTEGER :: ID_Hg_ln, ID_Hg_nt ! GEOS-CHEM emission ID's INTEGER :: IDENOX, IDEOX, IDECO, IDEPRPE, IDEC3H8 INTEGER :: IDEALK4, IDEC2H6, IDEISOP, IDEACET, IDEMEK INTEGER :: IDEALD2, IDECH2O, IDEHNO3 INTEGER :: NEMBIOG, NEMANTHRO INTEGER :: IDEBENZ, IDETOLU, IDEXYLE, IDEMONX INTEGER :: IDEC2H2, IDEC2H4 INTEGER :: IDEMBO INTEGER :: IDEGLYC INTEGER :: IDEGLYX, IDEMGLY INTEGER :: IDEHAC ! GEOS-CHEM biofuel ID's INTEGER :: IDBFNOX, IDBFCO, IDBFALK4, IDBFACET INTEGER :: IDBFMEK, IDBFALD2, IDBFPRPE, IDBFC3H8 INTEGER :: IDBFCH2O, IDBFC2H6 INTEGER :: IDBFBENZ, IDBFTOLU, IDBFXYLE INTEGER :: IDBFC2H2, IDBFC2H4 INTEGER :: IDBFGLYC INTEGER :: IDBFGLYX, IDBFMGLY INTEGER :: IDBFHAC CONTAINS !------------------------------------------------------------------------------ SUBROUTINE TRACERID ! !****************************************************************************** ! Subroutine TRACERID reads the "tracer.dat" file and determines which ! tracers, emission species, biomass burning species, and biofuel burning ! species are turned on/off. (bmy, 3/16/01, 9/18/07) ! ! NOTES: ! (1 ) Original code from Loretta's version of the GISS-II model. Now we ! loop thru the tracer names and flag tracers that way. (bmy, 11/12/02) ! (2 ) Added extra CASEs to the CASE statement for carbon & dust tracers. ! (rjp, tdf, bmy, 4/1/04) ! (3 ) Added extra CASEs to the CASE statement for seasalt tracers. ! (rjp, bec, bmy, 4/20/04) ! (4 ) Added extra CASEs to the CASE statement for SOA tracers. ! (rjp, bmy, 7/13/04) ! (5 ) Now references "tracer_mod.f". NAME is now CHAR*14. (bmy, 7/20/04) ! (6 ) Reverse the position of IDEISOP and IDECH2O so as to keep all of the ! anthropogenic tracers together in IDEMS (bmy, 11/15/04) ! (7 ) Added IDTHG0, IDTHG2, IDTHGP flags (eck, bmy, 12/7/04) ! (8 ) Added IDTAS, IDTAHS, IDTLET, IDTNH4aq, IDTSO4aq. Now no longer need ! to declare IDTCO, IDBCO, IDBFCO for offline aerosol simulations. ! (cas, bmy, 1/26/05) ! (9 ) Added IDTSO4s and IDTNITs (bec, bmy, 4/13/05) ! (10) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (11) Add alternate names for tagged Hg tracers. Also define ocean mercury ! flux categories. Now references LSPLIT from "logical_mod.f". ! (cdh, bmy, 12/15/05) ! (12) Now remove IDBxxx biomass flags (bmy, 4/5/06) ! (13) Now look for IDTSOG4 and IDTSOA4 (bmy, 5/18/06) ! (14) Minor fixes for CH3I simulation (bmy, 7/25/06) ! (15) Now define IDTH2, IDTHD (hup, lyj, phs, 9/18/07) ! (16) To satisfy IF statement in EMISSDR for using EMFOSSIL, we need ! to set IDECO=1 instead of IDECO=2. (jaf, mak, bmy, 2/14/08) ! (17) Increase NEMANTHRO from 10 to 12 and set IDEOX and IDEHNO3 (phs, 3/4/08) !****************************************************************************** ! ! References to F90 modules USE CHARPAK_MOD, ONLY : TRANUC USE LOGICAL_MOD, ONLY : LSPLIT USE TRACER_MOD, ONLY : ITS_A_C2H6_SIM, ITS_A_FULLCHEM_SIM USE TRACER_MOD, ONLY : ITS_A_TAGCO_SIM, ITS_A_MERCURY_SIM USE TRACER_MOD, ONLY : ITS_A_H2HD_SIM USE TRACER_MOD, ONLY : N_TRACERS, TRACER_NAME # include "CMN_SIZE" ! Size parameters # include "comode.h" ! IDEMS ! Local variables INTEGER :: N, COUNT, COUNT_Hg0, COUNT_Hg2, COUNT_HgP CHARACTER(LEN=14) :: NAME !================================================================= ! TRACERID begins here! ! ! NOTE: There are still some vestiges of historical baggage, we ! will get rid of this as time allows (bmy, 11/12/02) !================================================================= ! Zero all ID #'s and allocate Hg index arrays (if necessary) CALL INIT_TRACERID ! Initialize counters COUNT = 0 COUNT_Hg0 = 0 COUNT_Hg2 = 0 COUNT_HgP = 0 !================================================================= ! Assign tracer, biomass, biofuel, and anthro emission ID's !================================================================= DO N = 1, N_TRACERS ! Convert tracer name to upper case. TCNAME is in the "CMN" header ! file -- we might use something better later on (bmy, 11/12/02) NAME = TRACER_NAME(N) CALL TRANUC( NAME ) ! Find each tracer SELECT CASE ( TRIM( NAME ) ) !------------------------ ! Full chem tracers !------------------------ CASE ( 'NOX' ) COUNT = COUNT + 1 IDTNOX = N IDBFNOX = COUNT CASE ( 'OX' ) IDTOX = N CASE ( 'PAN' ) IDTPAN = N CASE ( 'CO' ) COUNT = COUNT + 1 IDTCO = N IDBFCO = COUNT ! Special case: Tagged CO ! Set some emission flags and then exit ! NOTE: To satisfy IF statement in EMISSDR for using ! EMFOSSIL, we need to set IDECO=1 instead of IDECO=2. ! (jaf, mak, bmy, 2/14/08) IF ( ITS_A_TAGCO_SIM() ) THEN NEMANTHRO = 1 IDECO = 1 IDTISOP = 1 EXIT ENDIF !----------------------------------- ! FEW ASSUMPTIONS FOR H2HD SIM: ! IDTH2=1, IDTHD=2, IDTCO=N('H2') ! H2/HD simulation requires CO... ! (hup, lyj, phs, 9/18/07) !----------------------------------- CASE ( 'H2' ) COUNT = COUNT + 1 IDTCO = N IDBFCO = COUNT ! Special case: Tagged H2 (hup 4/28/2004) ! Set some emissions flags then exit IF ( ITS_A_H2HD_SIM() ) THEN NEMANTHRO = 1 IDECO = 2 IDTISOP = 1 IDTH2 = 1 ! (hup 7/14/2004) ENDIF ! ... and HD CASE ( 'HD' ) COUNT = COUNT + 1 IDTHD = N CASE ( 'ALK4' ) COUNT = COUNT + 1 IDTALK4 = N IDBFALK4 = COUNT CASE ( 'ISOP' ) IDTISOP = N CASE ( 'HNO3' ) IDTHNO3 = N CASE ( 'H2O2' ) IDTH2O2 = N CASE ( 'ACET' ) COUNT = COUNT + 1 IDTACET = N IDBFACET = COUNT CASE ( 'MEK' ) COUNT = COUNT + 1 IDTMEK = N IDBFMEK = COUNT CASE ( 'ALD2' ) COUNT = COUNT + 1 IDTALD2 = N IDBFALD2 = COUNT CASE ( 'RCHO' ) IDTRCHO = N CASE ( 'MVK' ) IDTMVK = N CASE ( 'MACR' ) IDTMACR = N CASE ( 'PMN' ) IDTPMN = N CASE ( 'PPN' ) IDTPPN = N CASE ( 'R4N2' ) IDTR4N2 = N CASE ( 'PRPE' ) COUNT = COUNT + 1 IDTPRPE = N IDBFPRPE = COUNT CASE ( 'C3H8' ) COUNT = COUNT + 1 IDTC3H8 = N IDBFC3H8 = COUNT CASE ( 'CH2O' ) COUNT = COUNT + 1 IDTCH2O = N IDBFCH2O = COUNT CASE ( 'C2H6' ) COUNT = COUNT + 1 IDTC2H6 = N IDBFC2H6 = COUNT ! Special case: tagged C2H6 ! Set emission flags and then exit IF ( ITS_A_C2H6_SIM() ) THEN NEMANTHRO = 1 IDEC2H6 = 1 EXIT ENDIF CASE ( 'N2O5' ) IDTN2O5 = N CASE ( 'HNO4' ) IDTHNO4 = N CASE ( 'MP' ) IDTMP = N !-------------------------------- ! Sulfur & nitrate aerosols !-------------------------------- CASE ( 'DMS' ) IDTDMS = N CASE ( 'SO2' ) IDTSO2 = N CASE ( 'SO4' ) IDTSO4 = N CASE ( 'SO4S' ) IDTSO4s = N CASE ( 'MSA' ) IDTMSA = N CASE ( 'NH3' ) IDTNH3 = N CASE ( 'NH4' ) IDTNH4 = N CASE ( 'NIT' ) IDTNIT = N CASE ( 'NITS' ) IDTNITs = N !-------------------------------- ! Crystalline & aqueous aerosols !-------------------------------- CASE ( 'AS' ) IDTAS = N CASE ( 'AHS' ) IDTAHS = N CASE ( 'LET' ) IDTLET = N CASE ( 'NH4AQ' ) IDTNH4aq = N CASE ( 'SO4AQ' ) IDTSO4aq = N !-------------------------------- ! Carbon & 2dy organic aerosols !-------------------------------- CASE ( 'BCPI' ) IDTBCPI = N CASE ( 'OCPI' ) IDTOCPI = N CASE ( 'BCPO' ) IDTBCPO = N CASE ( 'OCPO' ) IDTOCPO = N CASE ( 'ALPH' ) IDTALPH = N CASE ( 'LIMO' ) IDTLIMO = N CASE ( 'ALCO' ) IDTALCO = N CASE ( 'SOG1' ) IDTSOG1 = N CASE ( 'SOG2' ) IDTSOG2 = N CASE ( 'SOG3' ) IDTSOG3 = N CASE ( 'SOG4' ) IDTSOG4 = N CASE ( 'SOA1' ) IDTSOA1 = N CASE ( 'SOA2' ) IDTSOA2 = N CASE ( 'SOA3' ) IDTSOA3 = N CASE ( 'SOA4' ) IDTSOA4 = N !-------------------------------- ! Mineral dust aerosols !-------------------------------- CASE ( 'DST1' ) IDTDST1 = N CASE ( 'DST2' ) IDTDST2 = N CASE ( 'DST3' ) IDTDST3 = N CASE ( 'DST4' ) IDTDST4 = N !-------------------------------- ! Seasalt aerosols !-------------------------------- CASE ( 'SALA' ) IDTSALA = N CASE ( 'SALC' ) IDTSALC = N !-------------------------------- ! Dicarbonyls GLYX & MGLY !-------------------------------- CASE ( 'GLYX' ) COUNT = COUNT + 1 IDTGLYX = N IDBFGLYX = COUNT CASE ( 'MGLY' ) COUNT = COUNT + 1 IDTMGLY = N IDBFMGLY = COUNT !-------------------------------- ! Aromatics tracers !-------------------------------- CASE ( 'BENZ' ) COUNT = COUNT + 1 IDTBENZ = N IDBFBENZ = COUNT CASE ( 'TOLU' ) COUNT = COUNT + 1 IDTTOLU = N IDBFTOLU = COUNT CASE ( 'XYLE' ) COUNT = COUNT + 1 IDTXYLE = N IDBFXYLE = COUNT !-------------------------------- ! Monoterpene !-------------------------------- CASE ( 'MONX' ) IDTMONX = N !-------------------------------- ! SOA from GLYX and MGLY !-------------------------------- CASE ( 'SOAG' ) IDTSOAG = N CASE ( 'SOAM' ) IDTSOAM = N !-------------------------------- ! C2H4 !-------------------------------- CASE ( 'C2H4' ) COUNT = COUNT + 1 IDTC2H4 = N IDBFC2H4 = COUNT !-------------------------------- ! C2H2 !-------------------------------- CASE ( 'C2H2' ) COUNT = COUNT + 1 IDTC2H2 = N IDBFC2H2 = COUNT !-------------------------------- ! MBO !-------------------------------- CASE ( 'MBO' ) IDTMBO = N !-------------------------------- ! GLYC !-------------------------------- CASE ( 'GLYC' ) COUNT = COUNT + 1 IDTGLYC = N IDBFGLYC = COUNT !-------------------------------- ! HAC !-------------------------------- CASE ( 'HAC' ) COUNT = COUNT + 1 IDTHAC = N IDBFHAC = COUNT !-------------------------------- ! new PAN species !-------------------------------- CASE ( 'APAN' ) IDTAPAN = N CASE ( 'ENPAN' ) IDTENPAN = N CASE ( 'GLPAN' ) IDTGLPAN = N CASE ( 'GPAN' ) IDTGPAN = N CASE ( 'MPAN' ) IDTMPAN = N CASE ( 'NIPAN' ) IDTNIPAN = N !-------------------------------- ! Rn-Pb-Be tracers !-------------------------------- CASE ( 'RN' ) IDTRN = N CASE ( 'PB' ) IDTPB = N CASE ( 'BE7' ) IDTBE7 = N !-------------------------------- ! CH3I and HCN tracers !-------------------------------- ! Special case: CH3I needs CO biomass/biofuel CASE ( 'CH3I', 'CH3IOC' ) COUNT = COUNT + 1 IDTCO = 1 IDBFCO = COUNT NEMANTHRO= 8 ! Reset NEMANTHRO here too (bmy, 7/25/06) EXIT ! Special case: HCN needs CO biomass/biofuel CASE ( 'HCN' ) COUNT = COUNT + 1 IDTCO = 1 IDBFCO = COUNT EXIT !-------------------------------- ! Total & tagged mercury tracers ! (eck, cdh, bmy, 12/15/05) !-------------------------------- CASE ( 'HG0' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_tot = COUNT_Hg0 IDTHg0 = N ID_Hg0(COUNT_Hg0) = N CASE ( 'HG2' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HGP' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HG0_AN_NA', 'HG0_AN' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_na = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_AN_EU', 'HG0_AE' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_eu = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_AN_AS', 'HG0_AA' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_as = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_AN_RW', 'HG0_AR' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_rw = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_OC' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_oc = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_LN' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_ln = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG0_NT' ) COUNT_Hg0 = COUNT_Hg0 + 1 ID_Hg_nt = COUNT_Hg0 ID_Hg0(COUNT_Hg0) = N CASE ( 'HG2_AN_NA', 'HG2_AN' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_AN_EU', 'HG2_AE' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_AN_AS', 'HG2_AA' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_AN_RW', 'HG2_AR' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_OC' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_LN' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HG2_NT' ) COUNT_Hg2 = COUNT_Hg2 + 1 ID_Hg2(COUNT_Hg2) = N CASE ( 'HGP_AN_NA', 'HGP_AN' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_AN_EU', 'HGP_AE' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_AN_AS', 'HGP_AA' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_AN_RW', 'HGP_AR' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_OC' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_LN' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE ( 'HGP_NT' ) COUNT_HgP = COUNT_HgP + 1 ID_HgP(COUNT_HgP) = N CASE DEFAULT ! Nothing END SELECT ENDDO !================================================================= ! SPECIAL CASE: we need to hardwire the emission flags so that ! they are in the same order as the old emissions code. The ! order should be: 1 4 18 19 5 21 9 10 11 20 6. Think of a ! better way to implement this later on. (bmy, 12/20/04) ! Added HNO3 and Ox to deal with ship NOx emissions (3/4/08, phs) !================================================================= IF ( ITS_A_FULLCHEM_SIM() ) THEN !----------------------------------------------------------------- ! Prior to 3/2/09 ! NEMANTHRO = 12 !phs - replaces 10 ! NEMBIOG = 1 !----------------------------------------------------------------- NEMANTHRO = 21 !phs - replaces 10 NEMBIOG = 3 IDENOX = 1 IDECO = 2 IDEPRPE = 3 IDEC3H8 = 4 IDEALK4 = 5 IDEC2H6 = 6 IDEACET = 7 IDEMEK = 8 IDEALD2 = 9 IDECH2O = 10 IDEOX = 11 !PHS IDEHNO3 = 12 !PHS IDEGLYX = 13 IDEMGLY = 14 IDEBENZ = 15 IDETOLU = 16 IDEXYLE = 17 IDEC2H4 = 18 IDEC2H2 = 19 IDEGLYC = 20 IDEHAC = 21 IDEISOP = 22 IDEMONX = 23 IDEMBO = 24 ENDIF !================================================================= ! Fill IDEMS with appropriate tracer ID #'s ! ! NOTE: IDEMS is in "comode.h", maybe later split this off into ! an F90 module somehow. Think about this later. (bmy, 11/12/02) !================================================================= IF ( IDENOX /= 0 ) IDEMS(IDENOX ) = IDTNOX IF ( IDECO /= 0 ) IDEMS(IDECO ) = IDTCO IF ( IDEPRPE /= 0 ) IDEMS(IDEPRPE) = IDTPRPE IF ( IDEC3H8 /= 0 ) IDEMS(IDEC3H8) = IDTC3H8 IF ( IDEALK4 /= 0 ) IDEMS(IDEALK4) = IDTALK4 IF ( IDEC2H6 /= 0 ) IDEMS(IDEC2H6) = IDTC2H6 IF ( IDEISOP /= 0 ) IDEMS(IDEISOP) = IDTISOP IF ( IDEACET /= 0 ) IDEMS(IDEACET) = IDTACET IF ( IDEMEK /= 0 ) IDEMS(IDEMEK ) = IDTMEK IF ( IDEALD2 /= 0 ) IDEMS(IDEALD2) = IDTALD2 IF ( IDECH2O /= 0 ) IDEMS(IDECH2O) = IDTCH2O IF ( IDEOX /= 0 ) IDEMS(IDEOX ) = IDTOX ! PHS IF ( IDEHNO3 /= 0 ) IDEMS(IDEHNO3) = IDTHNO3 ! PHS IF ( IDEGLYX /= 0 ) IDEMS(IDEGLYX) = IDTGLYX IF ( IDEMGLY /= 0 ) IDEMS(IDEMGLY) = IDTMGLY IF ( IDEBENZ /= 0 ) IDEMS(IDEBENZ) = IDTBENZ IF ( IDETOLU /= 0 ) IDEMS(IDETOLU) = IDTTOLU IF ( IDEXYLE /= 0 ) IDEMS(IDEXYLE) = IDTXYLE IF ( IDEMONX /= 0 ) IDEMS(IDEMONX) = IDTMONX IF ( IDEC2H4 /= 0 ) IDEMS(IDEC2H4) = IDTC2H4 IF ( IDEC2H2 /= 0 ) IDEMS(IDEC2H2) = IDTC2H2 IF ( IDEMBO /= 0 ) IDEMS(IDEMBO ) = IDTMBO IF ( IDEGLYC /= 0 ) IDEMS(IDEGLYC) = IDTGLYC IF ( IDEHAC /= 0 ) IDEMS(IDEHAC ) = IDTHAC ! Echo anthro & biogenic emitted tracers WRITE( 6, 100 ) IDEMS ( 1:NEMANTHRO+NEMBIOG ) 100 FORMAT( /, 'TRACERID: Emitted tracers (anthro & bio) :', 20i3 ) ! Return to calling program END SUBROUTINE TRACERID !------------------------------------------------------------------------------ SUBROUTINE SETTRACE ! !****************************************************************************** ! Subroutine SETTRACE flags certain chemical species w/in the SMVGEAR full ! chemistry mechanism. (lwh, jyl, gmg, djj, 1990's; bmy, 11/12/02, 10/3/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) NTRACER : Number of GEOS-CHEM tracers to process ! ! NOTES: ! (1 ) Added comment header. ! (2 ) Now initialize IDDMS, IDSO2, IDSO4, IDMSA. Updated comments, ! cosmetic changes. (rjp, bmy, 3/23/03) ! (3 ) Currently there are only families for the troposphere, so manually ! set NCS = NCSURBAN. Replace NAMESPEC w/ NAMEGAS for SMVGEAR II. ! (bdf, bmy, 4/23/03) ! (4 ) Make sure IDEMIS etc doesn't go out of array bounds (bmy, 4/26/04) ! (5 ) Removed NTRACER from the arg list, we can use N_TRACERS from ! "tracer_mod.f". Now references "tracer_mod.f". Now does not have ! to read the "tracer.dat" file. (bmy, 7/20/04) ! (6 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) !****************************************************************************** ! ! References to F90 modules USE ERROR_MOD, ONLY : ERROR_STOP USE TRACER_MOD, ONLY : ID_EMITTED, N_TRACERS USE TRACER_MOD, ONLY : TRACER_COEFF, TRACER_CONST USE TRACER_MOD, ONLY : TRACER_N_CONST, TRACER_NAME # include "CMN_SIZE" ! Size parameters # include "comode.h" ! NAMEGAS ! Local variabales INTEGER :: I, J, T, C !================================================================= ! SETTRACE begins here! !================================================================= ! Reset NCS = NCSURBAN, since we have defined our GEOS-CHEM ! mechanism in the urban slot of SMVGEAR II (bmy, 4/21/03) NCS = NCSURBAN DO I = 1, NSPEC(NCS) IF ( NAMEGAS(I) == 'O3' ) IDO3 = I IF ( NAMEGAS(I) == 'NO2' ) IDNO2 = I IF ( NAMEGAS(I) == 'NO3' ) IDNO3 = I IF ( NAMEGAS(I) == 'N2O5' ) IDN2O5 = I IF ( NAMEGAS(I) == 'HNO4' ) IDHNO4 = I IF ( NAMEGAS(I) == 'HNO2' ) IDHNO2 = I IF ( NAMEGAS(I) == 'NO' ) IDNO = I IF ( NAMEGAS(I) == 'CO' ) IDCO = I IF ( NAMEGAS(I) == 'PRPE' ) IDPRPE = I IF ( NAMEGAS(I) == 'C3H8' ) IDC3H8 = I IF ( NAMEGAS(I) == 'ISOP' ) IDISOP = I IF ( NAMEGAS(I) == 'ALK4' ) IDALK4 = I IF ( NAMEGAS(I) == 'PAN' ) IDPAN = I IF ( NAMEGAS(I) == 'GLPAN' ) IDGLPAN = I IF ( NAMEGAS(I) == 'GPAN' ) IDGPAN = I IF ( NAMEGAS(I) == 'PMN' ) IDPMN = I IF ( NAMEGAS(I) == 'PPN' ) IDPPN = I IF ( NAMEGAS(I) == 'HNO3' ) IDHNO3 = I IF ( NAMEGAS(I) == 'OH' ) IDOH = I IF ( NAMEGAS(I) == 'HO2' ) IDHO2 = I !(rvm, bmy, 2/27/02) IF ( NAMEGAS(I) == 'H2O2' ) IDH2O2 = I IF ( NAMEGAS(I) == 'ACET' ) IDACET = I IF ( NAMEGAS(I) == 'MEK' ) IDMEK = I IF ( NAMEGAS(I) == 'ALD2' ) IDALD2 = I IF ( NAMEGAS(I) == 'RCHO' ) IDRCHO = I IF ( NAMEGAS(I) == 'MVK' ) IDMVK = I IF ( NAMEGAS(I) == 'MACR' ) IDMACR = I IF ( NAMEGAS(I) == 'ISN2' ) IDISN2 = I IF ( NAMEGAS(I) == 'R4N2' ) IDR4N2 = I IF ( NAMEGAS(I) == 'CH2O' ) IDCH2O = I IF ( NAMEGAS(I) == 'C2H6' ) IDC2H6 = I IF ( NAMEGAS(I) == 'DMS' ) IDDMS = I !(rjp, bmy, 3/23/03) IF ( NAMEGAS(I) == 'SO2' ) IDSO2 = I !(rjp, bmy, 3/23/03) IF ( NAMEGAS(I) == 'SO4' ) IDSO4 = I !(rjp, bmy, 3/23/03) IF ( NAMEGAS(I) == 'MSA' ) IDMSA = I !(rjp, bmy, 3/23/03) IF ( NAMEGAS(I) == 'DRYNO2' ) IDDRYNO2 = I IF ( NAMEGAS(I) == 'DRYPAN' ) IDDRYPAN = I IF ( NAMEGAS(I) == 'DRYO3 ' ) IDDRYO3 = I IF ( NAMEGAS(I) == 'BENZ' ) IDBENZ = I IF ( NAMEGAS(I) == 'TOLU' ) IDTOLU = I IF ( NAMEGAS(I) == 'XYLE' ) IDXYLE = I IF ( NAMEGAS(I) == 'MONX' ) IDMONX = I IF ( NAMEGAS(I) == 'GLYX' ) IDGLYX = I IF ( NAMEGAS(I) == 'MGLY' ) IDMGLY = I IF ( NAMEGAS(I) == 'DRYGLYX') IDDRYGLYX = I IF ( NAMEGAS(I) == 'DRYMGLY') IDDRYMGLY = I IF ( NAMEGAS(I) == 'C2H4' ) IDC2H4 = I IF ( NAMEGAS(I) == 'C2H2' ) IDC2H2 = I IF ( NAMEGAS(I) == 'MBO' ) IDMBO = I IF ( NAMEGAS(I) == 'GLYC' ) IDGLYC = I IF ( NAMEGAS(I) == 'HAC' ) IDHAC = I IF ( NAMEGAS(I) == 'APAN' ) IDAPAN = I IF ( NAMEGAS(I) == 'ENPAN' ) IDENPAN = I IF ( NAMEGAS(I) == 'MPAN' ) IDMPAN = I IF ( NAMEGAS(I) == 'NIPAN' ) IDNIPAN = I IF ( NAMEGAS(I) == 'DRYAPAN' ) IDDRYAPAN = I IF ( NAMEGAS(I) == 'DRYENPAN') IDDRYENPAN = I IF ( NAMEGAS(I) == 'DRYGLPAN') IDDRYGLPAN = I IF ( NAMEGAS(I) == 'DRYGPAN' ) IDDRYGPAN = I IF ( NAMEGAS(I) == 'DRYMPAN' ) IDDRYMPAN = I IF ( NAMEGAS(I) == 'DRYNIPAN') IDDRYNIPAN = I ENDDO !================================================================= ! Initialize arrays !================================================================= DO I=1, NNNTRID NMEMBER(I) = 0 IDEMIS(I) = 0 DO J=1, MMMEMBER IDTRMB(I, J)= 0 CTRMB(I, J)= 0. ENDDO ENDDO !================================================================= ! Save IDs for tracers (sequence in NAMESPEC.) ! ! IDTRMB(T,C) = species number for J'th component of tracer I ! CTRMB(T,C)+1 = coefficient of tracer constituent (e.g., each NO3 ! molec. represents 2 units of Ox, so CTRMB=1) ! TRACER_N(T) = number of component species in tracer I ! IDEMIS(T) = which component of tracer I (in IDTRMB sense) ! receives the emissions ! NIDEMIS = 0,1 -- indicates which species is emitting species. ! If there is only one species in tracer family and ! it's emitted, you still need a "1" in the spot. ! ljm changes: now read input from data file, tracer.dat !================================================================= ! Loop over tracers DO T = 1, N_TRACERS ! Number of constituents that tracer T has NMEMBER(T) = TRACER_N_CONST(T) ! Index of which tracer constituent ! will receive the emissions IF ( ID_EMITTED(T) > 0 ) THEN IDEMIS(T) = ID_EMITTED(T) ENDIF ! Loop over all the species which make up the tracer DO C = 1, NMEMBER(T) ! Store tracer coefficient in CTRMB CTRMB(T,C) = TRACER_COEFF(T,C) - 1 ! Loop over all species in "globchem.dat" DO J = 1, NSPEC(NCS) ! Special case: hydrocarbon tracers as atoms C IF ( TRACER_CONST(T,C) == 'C' ) THEN ! Test SMVGEAR species name against TRACER_NAME IF ( NAMEGAS(J) == TRACER_NAME(T) ) THEN IDTRMB(T,C) = J ENDIF ELSE ! Test SMVGEAR species name TRACER_CONST IF ( NAMEGAS(J) == TRACER_CONST(T,C) ) THEN IDTRMB(T,C) = J ENDIF ENDIF ENDDO !### Debug !PRINT*, '###--------------------' !PRINT*, '### T, C : ', T, C !PRINT*, '### NAME : ', TRACER_NAME(T) !PRINT*, '### NMEMBER : ', NMEMBER(T) !PRINT*, '### CONST(T,C) : ', TRACER_CONST(T,C) !PRINT*, '### CTRMB(T,C) : ', CTRMB(T,C) !PRINT*, '### IDEMIS(T) : ', IDEMIS(T) !PRINT*, '### IDTRMB(T,C): ', IDTRMB(T,C) ENDDO ENDDO ! Return to calling program END SUBROUTINE SETTRACE !------------------------------------------------------------------------------ FUNCTION IS_Hg0( N ) RESULT( IT_IS_Hg0 ) ! !****************************************************************************** ! Function IS_Hg0 returns TRUE if tracer N is a total or tagged Hg0 tracer. ! (cdh, bmy, 12/15/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) N (INTEGER) : GEOS-CHEM tracer number ! ! NOTES: !****************************************************************************** ! ! Arguments INTEGER, INTENT(IN) :: N ! Local variables LOGICAL :: IT_IS_Hg0 INTEGER :: C !================================================================= ! IS_Hg0 begins here! !================================================================= ! Initialize IT_IS_Hg0 = .FALSE. ! Loop over Hg0 categories DO C = 1, N_Hg_CATS ! Exit with TRUE if corresponds to an Hg0 tracer IF ( N == ID_Hg0(C) ) THEN IT_IS_Hg0 = .TRUE. EXIT ENDIF ENDDO ! Return to calling program END FUNCTION IS_Hg0 !------------------------------------------------------------------------------ FUNCTION IS_Hg2( N ) RESULT( IT_IS_Hg2 ) ! !****************************************************************************** ! Function IS_Hg2 returns TRUE if tracer N is a total or tagged Hg2 tracer. ! (cdh, bmy, 12/15/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) N (INTEGER) : GEOS-CHEM tracer number ! ! NOTES: !****************************************************************************** ! ! Arguments INTEGER, INTENT(IN) :: N ! Local variables LOGICAL :: IT_IS_Hg2 INTEGER :: C !================================================================= ! IS_Hg2 begins here! !================================================================= ! Initialize IT_IS_Hg2 = .FALSE. ! Loop over Hg2 categories DO C = 1, N_Hg_CATS ! Exit with TRUE if corresponds to an Hg2 tracer IF ( N == ID_Hg2(C) ) THEN IT_IS_Hg2 = .TRUE. EXIT ENDIF ENDDO ! Return to calling program END FUNCTION IS_Hg2 !------------------------------------------------------------------------------ FUNCTION IS_HgP( N ) RESULT( IT_IS_HgP ) ! !****************************************************************************** ! Function IS_HgP returns TRUE if tracer N is a total or tagged HgP tracer. ! (cdh, bmy, 12/15/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) N (INTEGER) : GEOS-CHEM tracer number ! ! NOTES: !****************************************************************************** ! ! Arguments INTEGER, INTENT(IN) :: N ! Local variables LOGICAL :: IT_IS_HgP INTEGER :: C !================================================================= ! IS_HgP begins here! !================================================================= ! Initialize IT_IS_HgP = .FALSE. ! Loop over Hg2 categories DO C = 1, N_Hg_CATS ! Exit with TRUE if corresponds to an HgP tracer IF ( N == ID_HgP(C) ) THEN IT_IS_HgP = .TRUE. EXIT ENDIF ENDDO ! Return to calling program END FUNCTION IS_HgP !------------------------------------------------------------------------------ FUNCTION GET_Hg0_CAT( N ) RESULT( NN ) ! !****************************************************************************** ! Function GET_Hg0_CAT the Hg0 category number given the tracer number. ! (eck, sas, cdh, bmy, 1/6/05) ! ! Arguments as Input: ! ---------------------------------------------------------------------------- ! (1 ) N (INTEGER) : GEOS-CHEM tracer number ! ! NOTES: !****************************************************************************** ! ! Arguments INTEGER, INTENT(IN) :: N ! Function value INTEGER :: NN !================================================================= ! GET_Hg2_CAT begins here! !================================================================= ! Pick the Hg2 category number from the tracer number IF ( N == ID_Hg0(ID_Hg_tot) ) THEN ! Total NN = ID_Hg_tot ELSE IF ( N == ID_Hg0(ID_Hg_na) ) THEN ! Anthro North America NN = ID_Hg_na ELSE IF ( N == ID_Hg0(ID_Hg_eu) ) THEN ! Anthro Europe NN = ID_Hg_eu ELSE IF ( N == ID_Hg0(ID_Hg_as) ) THEN ! Anthro Asia NN = ID_Hg_as ELSE IF ( N == ID_Hg0(ID_Hg_rw) ) THEN ! Anthro Rest of World NN = ID_Hg_rw ELSE IF ( N == ID_Hg0(ID_Hg_oc) ) THEN ! Oceans NN = ID_Hg_oc ELSE IF ( N == ID_Hg0(ID_Hg_ln) ) THEN ! Land re-emission NN = ID_Hg_ln ELSE IF ( N == ID_Hg0(ID_Hg_nt) ) THEN ! Natural source NN = ID_Hg_nt ELSE ! Invalid category NN = -1 ENDIF ! Return to calling program END FUNCTION GET_Hg0_CAT !------------------------------------------------------------------------------ FUNCTION GET_Hg2_CAT( N ) RESULT( NN ) ! !****************************************************************************** ! Function GET_Hg2_CAT the Hg2 category number (i.e. index for DD_Hg2 and ! WD_Hg2) given the tracer number. (eck, sas, cdh, bmy, 1/6/05) ! ! Arguments as Input: ! ---------------------------------------------------------------------------- ! (1 ) N (INTEGER) : GEOS-CHEM tracer number ! ! NOTES: !****************************************************************************** ! ! Arguments INTEGER, INTENT(IN) :: N ! Function value INTEGER :: NN !================================================================= ! GET_Hg2_CAT begins here! !================================================================= ! Pick the Hg2 category number from the tracer number IF ( N == ID_Hg2(ID_Hg_tot) ) THEN ! Total NN = ID_Hg_tot ELSE IF ( N == ID_Hg2(ID_Hg_na) ) THEN ! Anthro North America NN = ID_Hg_na ELSE IF ( N == ID_Hg2(ID_Hg_eu) ) THEN ! Anthro Europe NN = ID_Hg_eu ELSE IF ( N == ID_Hg2(ID_Hg_as) ) THEN ! Anthro Asia NN = ID_Hg_as ELSE IF ( N == ID_Hg2(ID_Hg_rw) ) THEN ! Anthro Rest of World NN = ID_Hg_rw ELSE IF ( N == ID_Hg2(ID_Hg_oc) ) THEN ! Oceans NN = ID_Hg_oc ELSE IF ( N == ID_Hg2(ID_Hg_ln) ) THEN ! Land re-emission NN = ID_Hg_ln ELSE IF ( N == ID_Hg2(ID_Hg_nt) ) THEN ! Natural source NN = ID_Hg_nt ELSE ! Invalid category NN = -1 ENDIF ! Return to calling program END FUNCTION GET_Hg2_CAT !------------------------------------------------------------------------------ SUBROUTINE INIT_TRACERID ! !****************************************************************************** ! Subroutine INIT_TRACERID zeroes module variables. (bmy, 11/12/02, 9/18/07) ! ! NOTES: ! (1 ) Now also zero IDDMS, IDSO2, IDSO4, IDMSA (rjp, bmy, 3/23/03) ! (2 ) Now zero extra flags for carbon & dust tracers (rjp, tdf, bmy, 4/1/04) ! (3 ) Now zero extra flags for seasalt tracers (rjp, bec, bmy, 4/1/04) ! (4 ) Now zero extra flags for SOA tracers (rjp, bmy, 7/13/04) ! (5 ) Now zero IDTHG0, IDTHG2, IDTHGP + tagged Hg's (eck, bmy, 12/7/04) ! (6 ) Now zero IDTAS, IDTAHS, IDTLET, IDTNH4aq, IDTSO4aq (cas, bmy, 12/20/04) ! (7 ) Now allocate ID_Hg0, ID_Hg2, ID_HgP (bmy, 12/16/05) ! (8 ) Now zero IDTSOG4, IDTSOA4 (dkh, bmy, 5/18/06) ! (9 ) Now zero IDTH2, IDTHD (hup, lyj, phs, 9/18/07) ! (10) Now zero IDEHNO3 (PHS, 3/4/08) !****************************************************************************** ! ! References to F90 modules USE ERROR_MOD, ONLY : ALLOC_ERR USE LOGICAL_MOD, ONLY : LSPLIT USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM ! Local variables INTEGER :: AS ! SMVGEAR species ID #'s IDO3 = 0 IDNO2 = 0 IDNO3 = 0 IDN2O5 = 0 IDHNO4 = 0 IDOX = 0 IDNOX = 0 IDHC1 = 0 IDNO = 0 IDHNO2 = 0 IDCO = 0 IDPRPE = 0 IDISOP = 0 IDALK4 = 0 IDC3H8 = 0 IDPAN = 0 IDGLPAN = 0 IDGPAN = 0 IDPMN = 0 IDPPN = 0 IDHNO3 = 0 IDOH = 0 IDHO2 = 0 IDH2O2 = 0 IDACET = 0 IDMEK = 0 IDALD2 = 0 IDRCHO = 0 IDMVK = 0 IDMACR = 0 IDISN2 = 0 IDR4N2 = 0 IDCH2O = 0 IDC2H6 = 0 IDMP = 0 IDDMS = 0 IDSO2 = 0 IDSO4 = 0 IDMSA = 0 IDDRYO3 = 0 IDDRYPAN = 0 IDDRYNO2 = 0 IDBENZ = 0 IDTOLU = 0 IDXYLE = 0 IDMONX = 0 IDGLYX = 0 IDMGLY = 0 IDDRYGLYX = 0 IDDRYMGLY = 0 IDC2H4 = 0 IDC2H2 = 0 IDMBO = 0 IDGLYC = 0 IDHAC = 0 IDAPAN = 0 IDENPAN = 0 IDMPAN = 0 IDNIPAN = 0 IDDRYAPAN = 0 IDDRYENPAN = 0 IDDRYGLPAN = 0 IDDRYGPAN = 0 IDDRYMPAN = 0 IDDRYNIPAN = 0 ! GEOS-CHEM Tracer ID #'s IDTNOX = 0 IDTOX = 0 IDTPAN = 0 IDTCO = 0 IDTH2 = 0 ! (hup, 7/14/2004) IDTHD = 0 ! (jaegle, 11/07/2005) IDTALK4 = 0 IDTISOP = 0 IDTHNO3 = 0 IDTH2O2 = 0 IDTACET = 0 IDTMEK = 0 IDTALD2 = 0 IDTRCHO = 0 IDTMVK = 0 IDTMACR = 0 IDTPMN = 0 IDTPPN = 0 IDTISN2 = 0 IDTR4N2 = 0 IDTPRPE = 0 IDTC3H8 = 0 IDTCH2O = 0 IDTC2H6 = 0 IDTN2O5 = 0 IDTHNO4 = 0 IDTMP = 0 IDTDMS = 0 IDTSO2 = 0 IDTSO4 = 0 IDTMSA = 0 IDTNH3 = 0 IDTNH4 = 0 IDTNIT = 0 IDTAS = 0 IDTAHS = 0 IDTNH4aq = 0 IDTLET = 0 IDTSO4aq = 0 IDTBCPI = 0 IDTOCPI = 0 IDTBCPO = 0 IDTOCPO = 0 IDTALPH = 0 IDTLIMO = 0 IDTALCO = 0 IDTSOG1 = 0 IDTSOG2 = 0 IDTSOG3 = 0 IDTSOG4 = 0 IDTSOA1 = 0 IDTSOA2 = 0 IDTSOA3 = 0 IDTSOA4 = 0 IDTDST1 = 0 IDTDST2 = 0 IDTDST3 = 0 IDTDST4 = 0 IDTSALA = 0 IDTSALC = 0 IDTRN = 0 IDTPB = 0 IDTBE7 = 0 IDTGLYX = 0 IDTMGLY = 0 IDTBENZ = 0 IDTTOLU = 0 IDTXYLE = 0 IDTMONX = 0 IDTSOAG = 0 IDTSOAM = 0 IDTC2H4 = 0 IDTC2H2 = 0 IDTMBO = 0 IDTGLYC = 0 IDTHAC = 0 IDTAPAN = 0 IDTENPAN = 0 IDTGLPAN = 0 IDTGPAN = 0 IDTMPAN = 0 IDTNIPAN = 0 !added for NEI08 compatibility IDTCH4 = 0 IDTNO = 0 IDTNO2 = 0 IDTHNO2 = 0 IDTEOH = 0 IDTMOH = 0 ! GEOS-CHEM Emission ID #'s NEMANTHRO = 0 NEMBIOG = 0 IDENOX = 0 IDEOX = 0 IDECO = 0 IDEPRPE = 0 IDEC3H8 = 0 IDEALK4 = 0 IDEC2H6 = 0 IDEACET = 0 IDEMEK = 0 IDEALD2 = 0 IDEISOP = 0 IDECH2O = 0 IDEHNO3 = 0 !phs (3/4/08) IDEGLYX = 0 IDEMGLY = 0 IDEBENZ = 0 IDETOLU = 0 IDEXYLE = 0 IDEMONX = 0 IDEC2H4 = 0 IDEC2H2 = 0 IDEMBO = 0 IDEGLYC = 0 IDEHAC = 0 ! GEOS-CHEM Biofuel ID #'s IDBFNOX = 0 IDBFCO = 0 IDBFALK4 = 0 IDBFACET = 0 IDBFMEK = 0 IDBFALD2 = 0 IDBFPRPE = 0 IDBFC3H8 = 0 IDBFCH2O = 0 IDBFC2H6 = 0 IDBFBENZ = 0 IDBFTOLU = 0 IDBFXYLE = 0 IDBFC2H2 = 0 IDBFC2H4 = 0 IDBFGLYC = 0 IDBFGLYX = 0 IDBFMGLY = 0 IDBFHAC = 0 !----------------------------------- ! Initialize tagged Hg index arrays !----------------------------------- IF ( ITS_A_MERCURY_SIM() ) THEN ! Initialize category flags ID_Hg_tot = 0 ID_Hg_na = 0 ID_Hg_eu = 0 ID_Hg_as = 0 ID_Hg_rw = 0 ID_Hg_oc = 0 ID_Hg_ln = 0 ID_Hg_nt = 0 ! Number of Hg categories IF ( LSPLIT ) THEN N_Hg_CATS = 8 ELSE N_Hg_CATS = 1 ENDIF ! Index array for Hg0 tracers ALLOCATE( ID_Hg0( N_Hg_CATS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'ID_Hg0' ) ID_Hg0 = 0 ! Index array for Hg2 tracers ALLOCATE( ID_Hg2( N_Hg_CATS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'ID_Hg2' ) ID_Hg2 = 0 ! Index array for HgP tracers ALLOCATE( ID_HgP( N_Hg_CATS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'ID_HgP' ) ID_HgP = 0 ENDIF ! Return to calling program END SUBROUTINE INIT_TRACERID !------------------------------------------------------------------------------ SUBROUTINE CLEANUP_TRACERID ! !****************************************************************************** ! Subroutine CLEANUP_TRACERID deallocates all module arrays (bmy, 12/16/05) ! ! NOTES: !****************************************************************************** ! !================================================================= ! CLEANUP_TRACERID begins here! !================================================================= IF ( ALLOCATED( ID_Hg0 ) ) DEALLOCATE( ID_Hg0 ) IF ( ALLOCATED( ID_Hg2 ) ) DEALLOCATE( ID_Hg2 ) IF ( ALLOCATED( ID_HgP ) ) DEALLOCATE( ID_HgP ) ! Return to calling program END SUBROUTINE CLEANUP_TRACERID !------------------------------------------------------------------------------ ! End of module END MODULE TRACERID_MOD