LCOV - code coverage report
Current view: top level - hemco/HEMCO/src/Extensions - hcox_finn_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 471 0.0 %
Date: 2024-12-17 22:39:59 Functions: 0 8 0.0 %

          Line data    Source code
       1             : !------------------------------------------------------------------------------
       2             : !                   Harmonized Emissions Component (HEMCO)                    !
       3             : !------------------------------------------------------------------------------
       4             : !BOP
       5             : !
       6             : ! !MODULE: hcox_finn_mod.F90
       7             : !
       8             : ! !DESCRIPTION: Module HCOX\_FINN\_MOD contains routines and variables to
       9             : ! calculate FINN biomass burning emissions in HEMCO.
      10             : !
      11             : ! !INTERFACE:
      12             : !
      13             : MODULE HcoX_FINN_Mod
      14             : !
      15             : ! !USES:
      16             : !
      17             :   USE HCO_Error_Mod
      18             :   USE HCO_Diagn_Mod
      19             :   USE HCOX_TOOLS_MOD
      20             :   USE HCO_State_Mod,  ONLY : HCO_State
      21             :   USE HCOX_State_Mod, ONLY : Ext_State
      22             : 
      23             :   IMPLICIT NONE
      24             :   PRIVATE
      25             : !
      26             : ! !PUBLIC MEMBER FUNCTIONS:
      27             : !
      28             :   PUBLIC :: HCOX_FINN_Init
      29             :   PUBLIC :: HCOX_FINN_Run
      30             :   PUBLIC :: HCOX_FINN_Final
      31             : !
      32             : ! !REMARKS:
      33             : !  Emissions of biomass burning species are read at monthly or daily
      34             : !  resolution. Note: no emission factors are used here - emissions of
      35             : !  individual species are given in input files. Emissions on the FINN 0.5x0.5
      36             : !  degree grid are regridded to the current model grid.
      37             : !                                                                             .
      38             : !  FINN biomass burning emissions are computed for the following gas-phase
      39             : !  and aerosol-phase species:
      40             : !                                                                             .
      41             : !     (1 ) NOx  [ kg/m2/s]     (13) BC   [kgC/m2/s]
      42             : !     (2 ) CO   [ kg/m2/s]     (14) OC   [kgC/m2/s]
      43             : !     (3 ) ALK4 [kgC/m2/s]     (15) MGLY [ kg/m2/s]
      44             : !     (4 ) ACET [kgC/m2/s]     (16) BENZ [kgC/m2/s]
      45             : !     (5 ) MEK  [kgC/m2/s]     (17) TOLU [kgC/m2/s]
      46             : !     (6 ) ALD2 [kgC/m2/s]     (18) C2H4 [kgC/m2/s]
      47             : !     (7 ) PRPE [kgC/m2/s]     (19) C2H2 [kgC/m2/s]
      48             : !     (8 ) C3H8 [kgC/m2/s]     (20) GLYC [ kg/m2/s]
      49             : !     (9 ) CH2O [ kg/m2/s]     (21) HAC  [ kg/m2/s]
      50             : !     (10) C2H6 [kgC/m2/s]     (22) CO2  [ kg/m2/s]
      51             : !     (11) SO2  [ kg/m2/s]     (23) CH4  [ kg/m2/s]
      52             : !     (12) NH3  [ kg/m2/s]     (24)
      53             : !
      54             : !
      55             : ! All species to be used must be listed in the settings section of the HEMCO
      56             : ! configuration file. For every listed species, individual scale factors as
      57             : ! well as masks can be defined. For example, to scale FINN CO emissions by a
      58             : ! factor of 1.05 and restrict them to North America, as well as to scale NO
      59             : ! emissions by a factor of 1.5:
      60             : !
      61             : !114     FINN              : on    NO/CO/ALK4/ACET/MEK/ALD2/PRPE/C3H8/CH2O/C2H6/SO2/NH3/BCPI/BCPO/OCPI/OCPO/GLYC/HAC
      62             : !    --> FINN_daily        :       false
      63             : !    --> hydrophilic BC    :       0.2
      64             : !    --> hydrophilic OC    :       0.5
      65             : !    --> Mask_CO           :       NAMASK
      66             : !    --> Scaling_CO        :       1.05
      67             : !    --> Scaling_NO        :       1.5
      68             : !
      69             : ! Field NAMASK must be defined in section mask of the HEMCO configuration file.
      70             : !
      71             : !  References:
      72             : !  ============================================================================
      73             : !  (1 ) Original FINN database from Christine Wiedinmyer
      74             : !        http://bai.acd.ucar.edu/Data/fire/
      75             : !  (2 ) Wiedinmyer, C., Akagi, S.K., Yokelson, R.J., Emmons, L.K.,
      76             : !       Al-Saadi, J.A., Orlando, J.J., and Soja, A.J.: The Fire
      77             : !       INventory from NCAR (FINN): a high resolution global model to
      78             : !       estimate the emissions from open burning, Geoscientific Model
      79             : !       Development, 4, 625-641, doi:10.5194/gmd-4-625-2011, 2011.
      80             : !
      81             : ! !REVISION HISTORY:
      82             : !  02 Jan 2013 - J. Mao & J.A. Fisher - Initial version, based on GFED3
      83             : !  See https://github.com/geoschem/hemco for complete history
      84             : !EOP
      85             : !------------------------------------------------------------------------------
      86             : !BOC
      87             : !
      88             : ! !DEFINED PARAMETERS:
      89             : !
      90             :   !=================================================================
      91             :   ! MODULE PARAMETERS
      92             :   !
      93             :   ! nSpcMax : Maximum number of emitted species
      94             :   ! N_EMFAC : Number of emission factors per species
      95             :   ! N_SPEC  : Number of FINN species
      96             :   ! MW_CO2  : Molecular weight of CO2  (g/mol)
      97             :   ! MW_NMOC : Molecular weight of NMOC (g/mol). Assumed MW for NMOC
      98             :   !           is 68 g/mol.
      99             :   !=================================================================
     100             :   INTEGER,           PARAMETER   :: nSpcMax = 100
     101             :   INTEGER,           PARAMETER   :: N_EMFAC = 6
     102             :   INTEGER,           PARAMETER   :: N_SPEC  = 58
     103             :   REAL(dp),          PARAMETER   :: MW_CO2  = 44.01_dp
     104             :   REAL(dp),          PARAMETER   :: MW_NMOC = 68.00_dp
     105             : !
     106             : ! !PRIVATE TYPES:
     107             : !
     108             :   TYPE :: MyInst
     109             :    !=================================================================
     110             :    ! HEMCO VARIABLES
     111             :    !
     112             :    ! ExtNr   : Extension number
     113             :    ! UseDay  : True if daily data is used
     114             :    !=================================================================
     115             :    INTEGER                        :: Instance
     116             :    INTEGER                        :: ExtNr
     117             :    LOGICAL                        :: UseDay
     118             : 
     119             :    !=================================================================
     120             :    ! SPECIES VARIABLES
     121             :    !
     122             :    ! nSpc           : Number of used species (specified in config. file)
     123             :    ! SpcNames       : Names of all used species
     124             :    ! HcoIDs         : HEMCO species IDs of all used species
     125             :    ! FinnIDs        : Index of used species within FINN
     126             :    ! FINN_SPEC_NAME : Names of all FINN species
     127             :    !=================================================================
     128             :    INTEGER                        :: nSpc
     129             :    CHARACTER(LEN=31), POINTER     :: SpcNames(:)
     130             :    CHARACTER(LEN=61), POINTER     :: SpcScalFldNme(:)
     131             :    INTEGER,           POINTER     :: HcoIDs(:)
     132             :    INTEGER,           POINTER     :: FinnIDs(:)
     133             :    CHARACTER(LEN=6),  POINTER     :: FINN_SPEC_NAME(:)
     134             : 
     135             :    !=================================================================
     136             :    ! SCALE FACTORS
     137             :    !
     138             :    ! FINN_EMFAC: emission scale factors for each species and
     139             :    !             emission factor type. The filename of the emissions
     140             :    !             emissions factor table is specified in the HEMCO
     141             :    !             configuration file. The scale factors are converted
     142             :    !             to kg species/kg CO2 when reading them from disk.
     143             :    ! OCPIfrac  : Fraction of OC that converts into hydrophilic OC.
     144             :    !             Can be set in HEMCO configuration file (default=0.5)
     145             :    ! BCPIfrac  : Fraction of BC that converts into hydrophilic BC.
     146             :    !             Can be set in HEMCO configuration file (default=0.2)
     147             :    ! SpcScal  : Additional scaling factors assigned to species through
     148             :    !            the HEMCO configuration file (e.g. Scaling_CO).
     149             :    !=================================================================
     150             :    REAL(dp),          POINTER     :: FINN_EMFAC(:,:)
     151             :    REAL(sp),          POINTER     :: SpcScal(:)
     152             :    REAL(sp)                       :: OCPIfrac
     153             :    REAL(sp)                       :: BCPIfrac
     154             : 
     155             :    !=================================================================
     156             :    ! DATA ARRAY POINTERS
     157             :    !
     158             :    ! These are the pointers to the 6 vegetation type data arrays
     159             :    ! specified in the configuration file
     160             :    !=================================================================
     161             :    REAL(hp),          POINTER     :: VEGTYP1(:,:) => NULL()
     162             :    REAL(hp),          POINTER     :: VEGTYP2(:,:) => NULL()
     163             :    REAL(hp),          POINTER     :: VEGTYP3(:,:) => NULL()
     164             :    REAL(hp),          POINTER     :: VEGTYP4(:,:) => NULL()
     165             :    REAL(hp),          POINTER     :: VEGTYP5(:,:) => NULL()
     166             :    REAL(hp),          POINTER     :: VEGTYP9(:,:) => NULL()
     167             : 
     168             :    TYPE(MyInst), POINTER           :: NextInst => NULL()
     169             :   END TYPE MyInst
     170             : 
     171             :   ! Pointer to instances
     172             :   TYPE(MyInst), POINTER            :: AllInst => NULL()
     173             : 
     174             : CONTAINS
     175             : !EOC
     176             : !------------------------------------------------------------------------------
     177             : !                   Harmonized Emissions Component (HEMCO)                    !
     178             : !------------------------------------------------------------------------------
     179             : !BOP
     180             : !
     181             : ! !IROUTINE: HCOX_FINN_Run
     182             : !
     183             : ! !DESCRIPTION: Subroutine HCOX\_FINN\_Run computes the FINN biomass
     184             : !  burning emissions for the current date.
     185             : !\\
     186             : !\\
     187             : ! !INTERFACE:
     188             :   !
     189           0 :   SUBROUTINE HCOX_FINN_Run( ExtState, HcoState, RC )
     190             : !
     191             : ! !USES:
     192             : !
     193             :     USE HCO_EmisList_mod,  ONLY : HCO_GetPtr
     194             :     USE HCO_Calc_Mod,      ONLY : HCO_EvalFld
     195             :     USE HCO_FluxArr_mod,   ONLY : HCO_EmisAdd
     196             :     USE HCO_State_mod,     ONLY : HCO_GetHcoID
     197             :     USE HCO_Clock_mod,     ONLY : HcoClock_Get
     198             :     USE HCO_Clock_mod,     ONLY : HcoClock_First
     199             :     USE HCO_Clock_mod,     ONLY : HcoClock_NewMonth, HcoClock_NewDay
     200             : !
     201             : ! !INPUT PARAMETERS:
     202             : !
     203             :     TYPE(Ext_State), POINTER        :: ExtState   ! Module options
     204             : !
     205             : ! !INPUT/OUTPUT PARAMETERS:
     206             : !
     207             :     TYPE(HCO_State), POINTER        :: HcoState   ! Output obj
     208             :     INTEGER,         INTENT(INOUT)  :: RC         ! Success or failure?
     209             : !
     210             : ! !REVISION HISTORY:
     211             : !  02 Jan 2012 - J. Mao & J. Fisher - Initial version, based on GFED3
     212             : !  See https://github.com/geoschem/hemco for complete history
     213             : !EOP
     214             : !------------------------------------------------------------------------------
     215             : !BOC
     216             : !
     217             : ! !LOCAL VARIABLES:
     218             : !
     219             :     ! Scalars
     220             :     INTEGER             :: N, M, NF
     221             :     INTEGER             :: FinnID, HcoID
     222             : !    LOGICAL, SAVE       :: FIRST = .TRUE.
     223             :     LOGICAL             :: DoRepeat
     224             :     INTEGER             :: Cnt
     225             :     CHARACTER(LEN=31)   :: PREFIX, FLDNME
     226             :     INTEGER             :: NDAYS, cYYYY, cMM, cDD
     227             :     REAL(dp)            :: TOTAL
     228             :     CHARACTER(LEN=255)  :: MSG, LOC
     229             : 
     230             :     ! Arrays
     231           0 :     REAL(hp), TARGET    :: SpcArr(HcoState%NX,HcoState%NY)
     232           0 :     REAL(hp), TARGET    :: TypArr(HcoState%NX,HcoState%NY)
     233             : 
     234             : !==============================================================================
     235             : ! This code is required for the vertical distribution of biomass burning emiss.
     236             : ! We will keep it here for a future implementation. (mps, 4/24/17)
     237             : !    INTEGER             :: I, J, L, N, M
     238             : !    INTEGER             :: PBL_MAX
     239             : !    REAL(hp)            :: PBL_FRAC, F_OF_PBL, F_OF_FT
     240             : !    REAL(hp)            :: DELTPRES, TOTPRESFT
     241             : !    REAL(hp), TARGET    :: SpcArr3D(HcoState%NX,HcoState%NY,HcoState%NZ)
     242             : !==============================================================================
     243             : 
     244             :     ! Pointers
     245           0 :     REAL(hp), POINTER   :: THISTYP(:,:)
     246             : 
     247             :     ! Local instance
     248             :     TYPE(MyInst), POINTER :: Inst
     249             : 
     250             :     !=======================================================================
     251             :     ! HCOX_FINN_Run begins here!
     252             :     !=======================================================================
     253           0 :     LOC = 'HCOX_FINN_Run (HCOX_FINN_MOD.F90)'
     254             : 
     255             :     ! Return if extension disabled
     256           0 :     IF ( ExtState%FINN <= 0 ) RETURN
     257             : 
     258             :     ! Enter
     259           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
     260           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     261           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
     262           0 :         RETURN
     263             :     ENDIF
     264             : 
     265             :     ! Init
     266           0 :     THISTYP => NULL()
     267             : 
     268             :     ! Get instance
     269           0 :     Inst => NULL()
     270           0 :     CALL InstGet ( ExtState%FINN, Inst, RC )
     271           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     272           0 :        WRITE(MSG,*) 'Cannot find FINN instance Nr. ', ExtState%FINN
     273           0 :        CALL HCO_ERROR(MSG,RC)
     274           0 :        RETURN
     275             :     ENDIF
     276             : 
     277             : !==============================================================================
     278             : ! This code is required for the vertical distribution of biomass burning emiss.
     279             : ! We will keep it here for a future implementation. (mps, 4/24/17)
     280             : !    ! Add only 65% biomass burning source to boundary layer, the
     281             : !    ! rest is emitted into the free troposphere (mps from evf+tjb, 3/10/17)
     282             : !    PBL_FRAC = 0.65_hp
     283             : !==============================================================================
     284             : 
     285             :     !-----------------------------------------------------------------------
     286             :     ! Get pointers to data arrays
     287             :     !-----------------------------------------------------------------------
     288             :     !IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
     289           0 :        IF ( Inst%UseDay ) THEN
     290           0 :           PREFIX = 'FINN_DAILY_'
     291             :        ELSE
     292           0 :           PREFIX = 'FINN_'
     293             :        ENDIF
     294             : 
     295           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP1'
     296           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP1, RC )
     297           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     298           0 :            CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
     299           0 :            RETURN
     300             :        ENDIF
     301             : 
     302           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP2'
     303           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP2, RC )
     304           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     305           0 :            CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
     306           0 :            RETURN
     307             :        ENDIF
     308             : 
     309           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP3'
     310           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP3, RC )
     311           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     312           0 :            CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
     313           0 :            RETURN
     314             :        ENDIF
     315             : 
     316           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP4'
     317           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP4, RC )
     318           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     319           0 :            CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
     320           0 :            RETURN
     321             :        ENDIF
     322             : 
     323           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP5'
     324           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP5, RC )
     325           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     326           0 :            CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
     327           0 :            RETURN
     328             :        ENDIF
     329             : 
     330           0 :        FLDNME = TRIM(PREFIX) // 'VEGTYP9'
     331           0 :        CALL HCO_EvalFld( HcoState, TRIM(FLDNME), Inst%VEGTYP9, RC )
     332           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     333           0 :            CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
     334           0 :            RETURN
     335             :        ENDIF
     336             : 
     337             : !       FIRST = .FALSE.
     338             :     !ENDIF
     339             : 
     340             :     ! For logfile
     341           0 :     IF ( HcoState%amIRoot ) THEN
     342           0 :        IF ( Inst%UseDay ) THEN
     343           0 :           IF ( HcoClock_NewDay( HcoState%Clock, .TRUE. ) ) THEN
     344             :              CALL HcoClock_Get( HcoState%Clock, &
     345           0 :                                 cYYYY=cYYYY, cMM=cMM, cDD=cDD, RC=RC )
     346           0 :              IF ( RC/=HCO_SUCCESS ) RETURN
     347           0 :              WRITE(MSG, 100) cYYYY, cMM, cDD
     348           0 :              CALL HCO_MSG(HcoState%Config%Err,MSG)
     349             : 100          FORMAT( 'FINN daily emissions for year, month, day: ', &
     350             :                       i4, '/', i2.2, '/', i2.2 )
     351             :           ENDIF
     352             :        ELSE
     353           0 :           IF ( HcoClock_NewMonth( HcoState%Clock, .TRUE. ) ) THEN
     354             :              CALL HcoClock_Get( HcoState%Clock, &
     355           0 :                                 cYYYY=cYYYY, cMM=cMM, LMD=NDAYS, RC=RC)
     356           0 :              IF ( RC/=HCO_SUCCESS ) RETURN
     357           0 :              WRITE(MSG, 110) cYYYY, cMM
     358           0 :              CALL HCO_MSG(HcoState%Config%Err,MSG)
     359             : 110          FORMAT( 'FINN monthly emissions for year, month: ', &
     360             :                       i4, '/', i2.2 )
     361             :           ENDIF
     362             :        ENDIF
     363             :     ENDIF
     364             : 
     365             :     !-----------------------------------------------------------------------
     366             :     ! Calculate emissions for all selected species
     367             :     !-----------------------------------------------------------------------
     368             : 
     369             :     ! Loop over all emitted species
     370           0 :     DO N = 1, Inst%nSpc
     371             : 
     372             :        ! ID is the FINN species index of this species
     373           0 :        FinnID = Inst%FinnIDs(N)
     374           0 :        IF ( FinnID <= 0 ) CYCLE
     375             : 
     376             :        ! HcoID is the HEMCO species index of this species
     377           0 :        HcoID = Inst%HcoIDs(N)
     378           0 :        IF ( HcoID < 0 ) CYCLE
     379             : 
     380             :        ! Species with no emission factor have FINN_EMFAC=0
     381           0 :        IF ( MAXVAL(Inst%FINN_EMFAC(FinnID,:)) <= 0.0_hp ) CYCLE
     382             : 
     383             :        ! SpcArr are the total biomass burning emissions for this
     384             :        ! species. TypArr are the emissions from a given vegetation type.
     385           0 :        SpcArr   = 0.0_hp
     386             : !==============================================================================
     387             : ! This code is required for the vertical distribution of biomass burning emiss.
     388             : ! We will keep it here for a future implementation. (mps, 4/24/17)
     389             : !       SpcArr3D = 0.0_hp
     390             : !==============================================================================
     391             : 
     392             :        ! Calculate emissions for all source types
     393           0 :        DO NF = 1, N_EMFAC
     394             : 
     395             :           ! Select emission factor array
     396             :           IF ( NF == 1 ) THEN
     397           0 :              THISTYP => Inst%VEGTYP1
     398             :           ELSEIF ( NF == 2 ) THEN
     399           0 :              THISTYP => Inst%VEGTYP2
     400             :           ELSEIF ( NF == 3 ) THEN
     401           0 :              THISTYP => Inst%VEGTYP3
     402             :           ELSEIF ( NF == 4 ) THEN
     403           0 :              THISTYP => Inst%VEGTYP4
     404             :           ELSEIF ( NF == 5 ) THEN
     405           0 :              THISTYP => Inst%VEGTYP5
     406             :           ELSEIF ( NF == 6 ) THEN
     407           0 :              THISTYP => Inst%VEGTYP9
     408             :           ELSE
     409           0 :              CALL HCO_ERROR ( 'Undefined emission factor', RC )
     410           0 :              RETURN
     411             :           ENDIF
     412             : 
     413             :           ! Multiply CO2 emissions by appropriate ratio for each land
     414             :           ! type and sum to get total emissions for the species on the
     415             :           ! native grid - emissions are in [kg CO2/m2/s[. FINN_EMFAC is
     416             :           ! in [kg X]/[kg CO2].
     417           0 :           TypArr(:,:) = THISTYP(:,:) * Inst%FINN_EMFAC(FinnID,NF)
     418             : 
     419             :           ! TODO: Add to diagnostics here
     420             : 
     421             :           ! Add to species array
     422           0 :           SpcArr = SpcArr + TypArr
     423             :        ENDDO !NF
     424             : 
     425             :        ! Apply species specific scale factors
     426           0 :        SpcArr = SpcArr * Inst%SpcScal(N)
     427             : 
     428             :        ! Check for masking
     429           0 :        CALL HCOX_SCALE( HcoState, SpcArr, TRIM(Inst%SpcScalFldNme(N)), RC )
     430           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     431           0 :            CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
     432           0 :            RETURN
     433             :        ENDIF
     434             : 
     435           0 :        SELECT CASE ( Inst%SpcNames(N) )
     436             :           CASE ( 'OCPI' )
     437           0 :              SpcArr = SpcArr * Inst%OCPIfrac
     438             :           CASE ( 'OCPO' )
     439           0 :              SpcArr = SpcArr * (1.0_sp - Inst%OCPIfrac)
     440             :           CASE ( 'BCPI' )
     441           0 :              SpcArr = SpcArr * Inst%BCPIfrac
     442             :           CASE ( 'BCPO' )
     443           0 :              SpcArr = SpcArr * (1.0_sp - Inst%BCPIfrac)
     444             :        END SELECT
     445             : 
     446             : !==============================================================================
     447             : ! This code is required for the vertical distribution of biomass burning emiss.
     448             : ! We will keep it here for a future implementation. (mps, 4/24/17)
     449             : !
     450             : !       !--------------------------------------------------------------------
     451             : !       ! For grid boxes with emissions, distribute 65% to PBL and 35% to FT
     452             : !       !--------------------------------------------------------------------
     453             : !       DO J = 1, HcoState%Ny
     454             : !       DO I = 1, HcoState%Nx
     455             : !
     456             : !          IF ( SpcArr(I,J) > 0e+0_hp ) THEN
     457             : !
     458             : !             ! Initialize
     459             : !             PBL_MAX  = 1
     460             : !             F_OF_PBL = 0e+0_hp
     461             : !             F_OF_FT  = 0e+0_hp
     462             : !             DELTPRES = 0e+0_hp
     463             : !
     464             : !             ! Determine PBL height
     465             : !             DO L = HcoState%NZ, 1, -1
     466             : !                IF ( ExtState%FRAC_OF_PBL%Arr%Val(I,J,L) > 0.0_hp ) THEN
     467             : !                   PBL_MAX = L
     468             : !                   EXIT
     469             : !                ENDIF
     470             : !             ENDDO
     471             : !
     472             : !             ! Loop over the boundary layer
     473             : !             DO L = 1, PBL_MAX
     474             : !
     475             : !                ! Fraction of PBL that box (I,J,L) makes up [unitless]
     476             : !                F_OF_PBL = ExtState%FRAC_OF_PBL%Arr%Val(I,J,L)
     477             : !
     478             : !                ! Add only 65% biomass burning source to PBL
     479             : !                ! Distribute emissions thru the entire boundary layer
     480             : !                ! (mps from evf+tjb, 3/10/17)
     481             : !                SpcArr3D(I,J,L) = SpcArr(I,J) * PBL_FRAC * F_OF_PBL
     482             : !
     483             : !             ENDDO
     484             : !
     485             : !             ! Total thickness of the free troposphere [hPa]
     486             : !             ! (considered here to be 10 levels above the PBL)
     487             : !             TOTPRESFT = HcoState%Grid%PEDGE%Val(I,J,PBL_MAX+1) - &
     488             : !                         HcoState%Grid%PEDGE%Val(I,J,PBL_MAX+11)
     489             : !
     490             : !             ! Loop over the free troposphere
     491             : !             DO L = PBL_MAX+1, PBL_MAX+10
     492             : !
     493             : !                ! Thickness of level L [hPa]
     494             : !                DELTPRES= HcoState%Grid%PEDGE%Val(I,J,L) - &
     495             : !                          HcoState%Grid%PEDGE%Val(I,J,L+1)
     496             : !
     497             : !                ! Fraction of FT that box (I,J,L) makes up [unitless]
     498             : !                F_OF_FT = DELTPRES / TOTPRESFT
     499             : !
     500             : !                ! Add 35% of biomass burning source to free troposphere
     501             : !                ! Distribute emissions thru 10 model levels above the BL
     502             : !                ! (mps from evf+tjb, 3/10/17)
     503             : !                SpcArr3D(I,J,L) = SpcArr(I,J) * (1.0-PBL_FRAC) * F_OF_FT
     504             : !
     505             : !             ENDDO
     506             : !
     507             : !          ENDIF
     508             : !
     509             : !       ENDDO
     510             : !       ENDDO
     511             : !
     512             : !       ! Add flux to HEMCO emission array
     513             : !       ! Now 3D flux (mps, 3/10/17)
     514             : !       CALL HCO_EmisAdd( HcoState, SpcArr3D, HcoID, &
     515             : !                         RC,       ExtNr=ExtNr, Cat=-1,   Hier=-1 )
     516             : !==============================================================================
     517             : 
     518             :        ! Add flux to HEMCO emission array
     519             :        CALL HCO_EmisAdd( HcoState, SpcArr, HcoID, &
     520           0 :                          RC,       ExtNr=Inst%ExtNr, Cat=-1, Hier=-1 )
     521           0 :        IF ( RC /= HCO_SUCCESS ) THEN
     522           0 :           MSG = 'HCO_EmisAdd error: ' // TRIM(HcoState%Spc(HcoID)%SpcName)
     523           0 :           CALL HCO_ERROR(MSG, RC )
     524           0 :           RETURN
     525             :        ENDIF
     526             : 
     527             :        ! Write out total (daily or monthly) emissions to log-file
     528           0 :        IF ( HcoState%amIRoot ) THEN
     529           0 :           IF ( Inst%UseDay ) THEN
     530           0 :              IF ( HcoClock_NewDay( HcoState%Clock, .TRUE. ) ) THEN
     531           0 :                 TOTAL = SUM(SpcArr(:,:)*HcoState%Grid%AREA_M2%Val(:,:))
     532           0 :                 TOTAL = TOTAL * 86400.0_hp * 1e-9_hp
     533           0 :                 WRITE(MSG, 120) HcoState%Spc(HcoID)%SpcName, TOTAL
     534           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
     535             : 120             FORMAT( 'SUM biomass ', a4,1x,': ', f11.4,1x,'[Tg]' )
     536             :              ENDIF
     537             :           ELSE
     538           0 :              IF ( HcoClock_NewMonth( HcoState%Clock, .TRUE. ) ) THEN
     539           0 :                 TOTAL = SUM(SpcArr(:,:)*HcoState%Grid%AREA_M2%Val(:,:))
     540           0 :                 TOTAL = TOTAL * NDAYS * 86400.0_hp * 1e-9_hp
     541           0 :                 WRITE(MSG, 130) HcoState%Spc(HcoID)%SpcName, TOTAL
     542           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
     543             : 130             FORMAT( 'SUM biomass ', a4,1x,': ', f11.4,1x,'[Tg]' )
     544             :              ENDIF
     545             :           ENDIF
     546             :        ENDIF
     547             : 
     548             :     ENDDO !N
     549             : 
     550             :     ! Nullify pointers
     551           0 :     THISTYP   => NULL()
     552           0 :     Inst      => NULL()
     553             : 
     554             :     ! Leave w/ success
     555           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
     556             : 
     557           0 :   END SUBROUTINE HCOX_FINN_Run
     558             : !EOC
     559             : !------------------------------------------------------------------------------
     560             : !                   Harmonized Emissions Component (HEMCO)                    !
     561             : !------------------------------------------------------------------------------
     562             : !BOP
     563             : !
     564             : ! !IROUTINE: HCOX_FINN_Init
     565             : !
     566             : ! !DESCRIPTION: Subroutine HCOX\_FINN\_INIT initializes all module
     567             : ! arrays and variables.
     568             : !\\
     569             : !\\
     570             : ! !INTERFACE:
     571             : !
     572           0 :   SUBROUTINE HCOX_FINN_Init( HcoState, ExtName, ExtState, RC )
     573             : !
     574             : ! !USES:
     575             : !
     576             :     USE HCO_State_Mod,   ONLY : HCO_GetHcoID
     577             :     USE HCO_State_Mod,   ONLY : HCO_GetExtHcoID
     578             :     USE HCO_ExtList_Mod, ONLY : GetExtNr, GetExtOpt
     579             :     USE HCO_ExtList_Mod, ONLY : GetExtSpcVal
     580             : !
     581             : ! !INPUT PARAMETERS:
     582             : !
     583             :     TYPE(HCO_State),  POINTER        :: HcoState    ! HEMCO state object
     584             :     CHARACTER(LEN=*), INTENT(IN   )  :: ExtName     ! Extension name
     585             :     TYPE(Ext_State),  POINTER        :: ExtState    ! Extensions object
     586             : !
     587             : ! !INPUT/OUTPUT PARAMETERS:
     588             : !
     589             :     INTEGER,          INTENT(INOUT)  :: RC          ! Return status
     590             : !
     591             : ! !REVISION HISTORY:
     592             : !  02 Jan 2013 - J. Mao & J. Fisher - Initial version, based on GFED3
     593             : !  See https://github.com/geoschem/hemco for complete history
     594             : !EOP
     595             : !------------------------------------------------------------------------------
     596             : !BOC
     597             : !
     598             : ! !LOCAL VARIABLES
     599             : !
     600             :     ! Scalars
     601             :     INTEGER               :: ExtNr
     602             :     INTEGER               :: N_SPEC_EMFAC  ! # of CO2 file emission species
     603             :     INTEGER               :: N_NMOC        ! # of VOC file NMOC ratios
     604             :     INTEGER               :: IU_FILE, L, N_LUMPED, tmpNr
     605             :     INTEGER               :: AS, IOS, M, N, NDUM
     606             :     INTEGER               :: N_SPECSTRS, N_NMOCSTRS
     607             :     INTEGER               :: NCHAR
     608             :     LOGICAL               :: IS_NMOC, Matched, Missing, FOUND
     609             :     CHARACTER(LEN=1023)   :: ADUM
     610             :     CHARACTER(LEN=255)    :: SDUM(255)
     611             :     CHARACTER(LEN=255)    :: IN_SPEC_NAME(255)
     612             :     CHARACTER(LEN=255)    :: IN_NMOC_NAME(255)
     613             :     CHARACTER(LEN=255)    :: TMPNAME
     614             :     CHARACTER(LEN=  6)    :: SPCNAME
     615             :     REAL*8                :: C_MOLEC
     616             :     REAL(dp)              :: AdjFact
     617             :     REAL(sp)              :: ValSp
     618             :     CHARACTER(LEN=255)    :: MSG, EF_CO2_FILE, VOC_SPEC_FILE, LOC
     619             : 
     620             :     ! Temporary variables. These values will be passed to module
     621             :     ! array nSpc, SpcNames, etc.
     622             :     INTEGER                        :: tnSpc
     623           0 :     CHARACTER(LEN=31), ALLOCATABLE :: tSpcNames(:)
     624           0 :     CHARACTER(LEN=61), ALLOCATABLE :: tSpcScalFldNme(:)
     625           0 :     REAL(sp),          ALLOCATABLE :: tSpcScal(:)
     626           0 :     INTEGER,           ALLOCATABLE :: tHcoIDs(:)
     627             : 
     628             :     ! Arrays
     629           0 :     REAL(dp), ALLOCATABLE :: EMFAC_IN(:,:)
     630           0 :     REAL(dp), ALLOCATABLE :: NMOC_RATIO_IN(:,:)
     631             :     REAL*8                :: NMOC_EMFAC(N_EMFAC), NMOC_RATIO(N_EMFAC)
     632             : 
     633             :     ! Local instance
     634             :     TYPE(MyInst), POINTER :: Inst
     635             : 
     636             :     !=======================================================================
     637             :     ! HCOX_FINN_INIT begins here!
     638             :     !=======================================================================
     639           0 :     LOC = 'HCOX_FINN_INIT (HCOX_FINN_MOD.F90)'
     640             : 
     641             :     ! Extension Nr.
     642           0 :     ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
     643           0 :     IF ( ExtNr <= 0 ) RETURN
     644             : 
     645             :     ! Enter
     646           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
     647           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     648           0 :         CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
     649           0 :         RETURN
     650             :     ENDIF
     651             : 
     652             :     ! Create local instance for this simulation
     653           0 :     Inst => NULL()
     654           0 :     CALL InstCreate ( ExtNr, ExtState%FINN, Inst, RC )
     655           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     656           0 :        CALL HCO_ERROR ( 'Cannot create FINN instance', RC )
     657           0 :        RETURN
     658             :     ENDIF
     659             : 
     660             :     ! Check if this is GFED4
     661             :     !-----------------------------------------------------------------------
     662             :     ! Get settings
     663             :     ! The CO scale factor (to account for oxidation from VOCs) as well as
     664             :     ! the speciation of carbon aerosols into hydrophilic and hydrophobic
     665             :     ! fractions can be specified in the configuration file, e.g.:
     666             :     ! 100     GFED3           : on    NO/CO/OCPI/OCPO/BCPI/BCPO
     667             :     !     --> hydrophilic BC  :       0.2
     668             :     !     --> hydrophilic OC  :       0.5
     669             :     !
     670             :     ! Setting these values is optional and default values are applied if
     671             :     ! they are not specified. The values only take effect if the
     672             :     ! corresponding species (CO, BCPI/BCPO, OCPI/OCPO) are listed as species
     673             :     ! to be used.
     674             :     !-----------------------------------------------------------------------
     675             : 
     676             :     ! Try to read hydrophilic fractions of BC. Defaults to 0.2.
     677             :     CALL GetExtOpt( HcoState%Config, ExtNr, 'hydrophilic BC', &
     678           0 :                      OptValSp=ValSp, FOUND=FOUND, RC=RC )
     679           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     680           0 :         CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
     681           0 :         RETURN
     682             :     ENDIF
     683           0 :     IF ( .NOT. FOUND ) THEN
     684           0 :        Inst%BCPIfrac = 0.2
     685             :     ELSE
     686           0 :        Inst%BCPIfrac = ValSp
     687             :     ENDIF
     688             : 
     689             :     ! Try to read hydrophilic fractions of OC. Defaults to 0.5.
     690             :     CALL GetExtOpt( HcoState%Config, ExtNr, 'hydrophilic OC', &
     691           0 :                      OptValSp=ValSp, FOUND=FOUND, RC=RC )
     692           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     693           0 :         CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
     694           0 :         RETURN
     695             :     ENDIF
     696           0 :     IF ( .NOT. FOUND ) THEN
     697           0 :        Inst%OCPIfrac = 0.5
     698             :     ELSE
     699           0 :        Inst%OCPIfrac = ValSp
     700             :     ENDIF
     701             : 
     702             :     ! Error check: OCPIfrac and BCPI frac must be between 0 and 1
     703             :     IF ( Inst%OCPIfrac < 0.0_sp .OR. Inst%OCPIfrac > 1.0_sp .OR. &
     704           0 :          Inst%BCPIfrac < 0.0_sp .OR. Inst%BCPIfrac > 1.0_sp     ) THEN
     705           0 :        WRITE(MSG,*) 'hydrophilic fractions must be between 0-1: ', &
     706           0 :           Inst%OCPIfrac, Inst%BCPIfrac
     707           0 :        CALL HCO_ERROR(MSG, RC )
     708           0 :        RETURN
     709             :     ENDIF
     710             : 
     711             :     ! Use daily data?
     712             :     CALL GetExtOpt( HcoState%Config, ExtNr, 'FINN_daily', &
     713           0 :                      OptValBool=Inst%UseDay, FOUND=FOUND, RC=RC )
     714           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     715           0 :         CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
     716           0 :         RETURN
     717             :     ENDIF
     718           0 :     IF ( .NOT. FOUND ) THEN
     719           0 :        Inst%UseDay = .FALSE.
     720             :     ENDIF
     721             : 
     722             :     !-----------------------------------------------------------------------
     723             :     ! Allocate arrays
     724             :     !-----------------------------------------------------------------------
     725             : 
     726             :     ! FINN species names
     727           0 :     ALLOCATE ( Inst%FINN_SPEC_NAME ( N_SPEC ), STAT=AS )
     728           0 :     IF ( AS/=0 ) THEN
     729           0 :        CALL HCO_ERROR( 'Cannot allocate FINN_SPEC_NAME', RC )
     730           0 :        RETURN
     731             :     ENDIF
     732           0 :     Inst%FINN_SPEC_NAME = ''
     733             : 
     734             :     ! Allocate scale factors table: FINN_EMFAC holds the species/CO2
     735             :     ! scale factors for all FINN species.
     736           0 :     ALLOCATE ( Inst%FINN_EMFAC ( N_SPEC, N_EMFAC ), STAT=AS )
     737             :     IF ( AS/=0 ) THEN
     738           0 :        CALL HCO_ERROR( 'Cannot allocate FINN_EMFAC', RC )
     739           0 :        RETURN
     740             :     ENDIF
     741           0 :     Inst%FINN_EMFAC = 0.0_dp
     742             : 
     743             :     ! Allocate and initialize vectors holding species information for
     744             :     ! all species to be emitted
     745             :     ALLOCATE ( Inst%FinnIDs(nSpcMax), Inst%HcoIDs(nSpcMax), Inst%SpcNames(nSpcMax), &
     746           0 :                Inst%SpcScal(nSpcMax), Inst%SpcScalFldNme(nSpcMax), STAT=AS )
     747             : 
     748           0 :     IF ( AS/=0 ) THEN
     749           0 :        CALL HCO_ERROR( 'Cannot allocate FinnIDs', RC )
     750           0 :        RETURN
     751             :     ENDIF
     752           0 :     Inst%nSpc             = 0
     753           0 :     Inst%FinnIDs(:)       = -1
     754           0 :     Inst%HcoIDs(:)        = -1
     755           0 :     Inst%SpcScal          = 1.0_sp
     756           0 :     Inst%SpcNames(:)      = ''
     757           0 :     Inst%SpcScalFldNme(:) = HCOX_NOSCALE
     758             : 
     759             :     ALLOCATE ( Inst%VEGTYP1(HcoState%NX,HcoState%NY), &
     760             :                Inst%VEGTYP2(HcoState%NX,HcoState%NY), &
     761             :                Inst%VEGTYP3(HcoState%NX,HcoState%NY), &
     762             :                Inst%VEGTYP4(HcoState%NX,HcoState%NY), &
     763             :                Inst%VEGTYP5(HcoState%NX,HcoState%NY), &
     764           0 :                Inst%VEGTYP9(HcoState%NX,HcoState%NY), STAT=AS )
     765           0 :     IF ( AS/=0 ) THEN
     766           0 :        CALL HCO_ERROR( 'Cannot allocate VEGTYP', RC )
     767           0 :        RETURN
     768             :     ENDIF
     769           0 :     Inst%VEGTYP1 = 0.0_hp
     770           0 :     Inst%VEGTYP2 = 0.0_hp
     771           0 :     Inst%VEGTYP3 = 0.0_hp
     772           0 :     Inst%VEGTYP4 = 0.0_hp
     773           0 :     Inst%VEGTYP5 = 0.0_hp
     774           0 :     Inst%VEGTYP9 = 0.0_hp
     775             : 
     776             :     !-----------------------------------------------------------------------
     777             :     ! Define FINN species names
     778             :     !-----------------------------------------------------------------------
     779             : 
     780             :     ! Species listed in emission factor ratios (CO2/X) table (except NMOC,
     781             :     ! which is speciated as specified in the VOC speciation table).
     782           0 :     Inst%FINN_SPEC_NAME(1)  = 'CO2'
     783           0 :     Inst%FINN_SPEC_NAME(2)  = 'CO'
     784           0 :     Inst%FINN_SPEC_NAME(3)  = 'CH4'
     785           0 :     Inst%FINN_SPEC_NAME(4)  = 'NOx'
     786           0 :     Inst%FINN_SPEC_NAME(5)  = 'SO2'
     787           0 :     Inst%FINN_SPEC_NAME(6)  = 'OC'
     788           0 :     Inst%FINN_SPEC_NAME(7)  = 'BC'
     789           0 :     Inst%FINN_SPEC_NAME(8)  = 'NH3'
     790           0 :     Inst%FINN_SPEC_NAME(9)  = 'NO'    ! Currently not used
     791           0 :     Inst%FINN_SPEC_NAME(10) = 'NO2'   ! Currently not used
     792             : 
     793             :     ! Species listed in VOC speciation table
     794           0 :     Inst%FINN_SPEC_NAME(11) = 'ACET'
     795           0 :     Inst%FINN_SPEC_NAME(12) = 'ACTA'   ! Not currently emitted by BB in GC
     796           0 :     Inst%FINN_SPEC_NAME(13) = 'ALD2'
     797           0 :     Inst%FINN_SPEC_NAME(14) = 'ALK4'
     798           0 :     Inst%FINN_SPEC_NAME(15) = 'APINE'  ! Currently lumped into MTPA
     799           0 :     Inst%FINN_SPEC_NAME(16) = 'AROM'   ! Currently not used
     800           0 :     Inst%FINN_SPEC_NAME(17) = 'BENZ'
     801           0 :     Inst%FINN_SPEC_NAME(18) = 'BPINE'  ! Currently lumped into MTPA
     802           0 :     Inst%FINN_SPEC_NAME(19) = 'C2H2'
     803           0 :     Inst%FINN_SPEC_NAME(20) = 'C2H4'
     804           0 :     Inst%FINN_SPEC_NAME(21) = 'C2H6'
     805           0 :     Inst%FINN_SPEC_NAME(22) = 'C3H8'
     806           0 :     Inst%FINN_SPEC_NAME(23) = 'CARENE' ! Currently lumped into MTPA
     807           0 :     Inst%FINN_SPEC_NAME(24) = 'CH2Br2'
     808           0 :     Inst%FINN_SPEC_NAME(25) = 'CH2O'
     809           0 :     Inst%FINN_SPEC_NAME(26) = 'CH3Br'
     810           0 :     Inst%FINN_SPEC_NAME(27) = 'CH3CN'
     811           0 :     Inst%FINN_SPEC_NAME(28) = 'CH3I'
     812           0 :     Inst%FINN_SPEC_NAME(29) = 'DMS'
     813           0 :     Inst%FINN_SPEC_NAME(30) = 'EOH'    ! Not currently emitted in GC
     814           0 :     Inst%FINN_SPEC_NAME(31) = 'ETBENZ' ! Currently lumped with TOLU
     815           0 :     Inst%FINN_SPEC_NAME(32) = 'FUR'    ! Currently not used
     816           0 :     Inst%FINN_SPEC_NAME(33) = 'GLYC'
     817           0 :     Inst%FINN_SPEC_NAME(34) = 'GLYX'
     818           0 :     Inst%FINN_SPEC_NAME(35) = 'HAC'
     819           0 :     Inst%FINN_SPEC_NAME(36) = 'HCN'    ! Not currently emitted in GC
     820           0 :     Inst%FINN_SPEC_NAME(37) = 'HCOOH'  ! Not currently emitted by BB in GC
     821           0 :     Inst%FINN_SPEC_NAME(38) = 'HNO2'   ! Not currently emitted in GC
     822           0 :     Inst%FINN_SPEC_NAME(39) = 'ISOP'   ! Not currently emitted by BB in GC
     823           0 :     Inst%FINN_SPEC_NAME(40) = 'LIMO'
     824           0 :     Inst%FINN_SPEC_NAME(41) = 'MACR'   ! Not currently emitted in GC
     825           0 :     Inst%FINN_SPEC_NAME(42) = 'MEK'
     826           0 :     Inst%FINN_SPEC_NAME(43) = 'MGLY'
     827           0 :     Inst%FINN_SPEC_NAME(44) = 'MNO3'
     828           0 :     Inst%FINN_SPEC_NAME(45) = 'MOH'    ! Not currently emitted in GC
     829           0 :     Inst%FINN_SPEC_NAME(46) = 'MTPO'   ! Not currently emitted in GC
     830           0 :     Inst%FINN_SPEC_NAME(47) = 'MVK'    ! Not currently emitted in GC
     831           0 :     Inst%FINN_SPEC_NAME(48) = 'PRPE'
     832           0 :     Inst%FINN_SPEC_NAME(49) = 'R4N2'   ! Not currently emitted in GC
     833           0 :     Inst%FINN_SPEC_NAME(50) = 'RCHO'   ! Not currently emitted by BB in GC
     834           0 :     Inst%FINN_SPEC_NAME(51) = 'RCOOH'  ! Currently not used
     835           0 :     Inst%FINN_SPEC_NAME(52) = 'ROH'    ! Currently not used
     836           0 :     Inst%FINN_SPEC_NAME(53) = 'SESQ'   ! Currently not used
     837           0 :     Inst%FINN_SPEC_NAME(54) = 'STYR'   ! Currently lumped with TOLU
     838           0 :     Inst%FINN_SPEC_NAME(55) = 'TMB'    ! Currently lumped with XYLE
     839           0 :     Inst%FINN_SPEC_NAME(56) = 'TOLU'
     840           0 :     Inst%FINN_SPEC_NAME(57) = 'XYLE'
     841           0 :     Inst%FINN_SPEC_NAME(58) = 'H2'     ! Currently not used
     842             : 
     843             :     !=======================================================================
     844             :     ! We now get the following input information from hard-coded F90
     845             :     ! assignment statements in the include file "hcox_finn_include.H":
     846             :     !
     847             :     ! Quantities formerly defined in the "FINN_EFratios_CO2.csv" file:
     848             :     ! ----------------------------------------------------------------------
     849             :     ! (1 ) N_SPEC_EMFAC  : # of species in the FINN_EFratios_CO2.csv file
     850             :     ! (2 ) N_SPECSTRS    : Synonym for N_SPEC_EMFAC
     851             :     ! (3 ) IN_SPEC_NAME  : Name of emissions species
     852             :     ! (4 ) EMFAC_IN      : Emission ratios for each species
     853             :     !
     854             :     ! Quantities formerly defined in the "FINN_VOC_speciation.csv" file:
     855             :     ! ----------------------------------------------------------------------
     856             :     ! (5 ) N_NMOC_       : # of species in the FINN_EFratios_CO2.csv file
     857             :     ! (6 ) N_NMOCSTRS    : Synonym for N_NMOC
     858             :     ! (7 ) IN_NMOC_NAME  : Name of NMOC ratios
     859             :     ! (8 ) NMOC_RATIO_IN : NMOC ratios for each species
     860             :     !
     861             :     ! Furthermore, the F90 statements to allocate the arrays IN_SPEC_NAME
     862             :     ! and IN_NMOC_NAME are included in "hcox_finn_include.H".
     863             :     !
     864             :     ! NOTE: If new FINN emisison factors and NMOC ratios are issued in the
     865             :     ! future, you can regenerate the include file "hcox_finn_include.H"
     866             :     ! with the Perl script HEMCO/Extensions/Preprocess/finn.pl.
     867             :     !=======================================================================
     868             : #include "hcox_finn_include.H"
     869             : 
     870             :     !-----------------------------------------------------------------------
     871             :     ! Match specified species with FINN species. The species to be used are
     872             :     ! specified in the HEMCO configuration file.
     873             :     !-----------------------------------------------------------------------
     874             : 
     875             :     ! Write to log file
     876           0 :     IF ( HcoState%amIRoot ) THEN
     877             : 
     878             :        ! Write the name of the extension regardless of the verbose setting
     879           0 :        msg = 'Using HEMCO extension: FINN (biomass burning)'
     880           0 :        IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
     881           0 :           CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
     882             :        ELSE
     883           0 :           CALL HCO_Msg( msg, verb=.TRUE.                   ) ! w/o separator
     884             :        ENDIF
     885             : 
     886             :        ! Other print statements will only be written as debug output
     887           0 :        WRITE(MSG,*) '   - Use daily data          : ', Inst%UseDay
     888           0 :        CALL HCO_MSG(HcoState%Config%Err,MSG )
     889             :     ENDIF
     890             : 
     891             :     ! Get HEMCO species IDs of all species specified in configuration file
     892           0 :     CALL HCO_GetExtHcoID( HcoState, ExtNr, tHcoIDs, tSpcNames, tnSpc, RC)
     893           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     894           0 :         CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
     895           0 :         RETURN
     896             :     ENDIF
     897           0 :     IF ( tnSpc == 0 ) THEN
     898           0 :        MSG = 'No FINN species specified'
     899           0 :        CALL HCO_ERROR(MSG, RC )
     900           0 :        RETURN
     901             :     ENDIF
     902             : 
     903             :     ! Get species scale factors
     904             :     CALL GetExtSpcVal( HcoState%Config, ExtNr, tnSpc, &
     905           0 :                        tSpcNames, 'Scaling', 1.0_sp, tSpcScal, RC )
     906           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     907           0 :         CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
     908           0 :         RETURN
     909             :     ENDIF
     910             : 
     911             :     ! Get species mask fields
     912             :     CALL GetExtSpcVal( HcoState%Config, ExtNr, tnSpc, &
     913           0 :                        tSpcNames, 'ScaleField', HCOX_NOSCALE, tSpcScalFldNme, RC )
     914           0 :     IF ( RC /= HCO_SUCCESS ) THEN
     915           0 :         CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
     916           0 :         RETURN
     917             :     ENDIF
     918             : 
     919             :     ! Error trap: in previous versions, CO, POA and NAP scale factor were given as
     920             :     ! 'CO scale factor', etc. Make sure those attributes do not exist any more!
     921             :     CALL GetExtOpt( HcoState%Config, ExtNr, 'CO scale factor', &
     922           0 :                      OptValSp=ValSp, FOUND=FOUND, RC=RC )
     923           0 :     IF ( .NOT. FOUND ) THEN
     924             :        CALL GetExtOpt( HcoState%Config, ExtNr, 'POA scale factor', &
     925           0 :                         OptValSp=ValSp, FOUND=FOUND, RC=RC )
     926             :     ENDIF
     927           0 :     IF ( .NOT. FOUND ) THEN
     928             :        CALL GetExtOpt( HcoState%Config, ExtNr, 'NAP scale factor', &
     929           0 :                         OptValSp=ValSp, FOUND=FOUND, RC=RC )
     930             :     ENDIF
     931           0 :     IF ( FOUND ) THEN
     932             :        MSG = 'Found old definition of CO, POA and/or NAP scale factor! '  // &
     933             :              'This version of HEMCO expects species scale factors to be ' // &
     934             :              'set as `Scaling_XX` instead of `XX scale factor`. '         // &
     935           0 :              'Please update the FINN settings section accordingly.'
     936           0 :        CALL HCO_ERROR(MSG, RC )
     937           0 :        RETURN
     938             :     ENDIF
     939             : 
     940             :     ! Find matching FINN index for each specified species.
     941             :     ! Also get appropriate emission ratios to CO2 (jaf, 10/2/13).
     942             :     ! Do this only for species selected for emission calculation. For
     943             :     ! all others, keep default values in FINN_EMFAC.
     944           0 :     DO L = 1, tnSpc
     945           0 :        IF ( tHcoIDs(L) < 0 ) CYCLE
     946           0 :        SpcName  = tSpcNames(L)
     947           0 :        N_LUMPED = 0
     948           0 :        Matched  = .FALSE.
     949           0 :        Missing  = .TRUE.
     950             : 
     951             :        ! Reduce species if needed
     952           0 :        NCHAR   = LEN(SpcName)
     953             :        IF ( NCHAR > 3 ) THEN
     954           0 :           IF ( SpcName(1:3) == 'CO2' ) THEN
     955           0 :              SpcName = 'CO2'
     956           0 :           ELSEIF ( SpcName(1:3) == 'CH4' ) THEN
     957           0 :              SpcName = 'CH4'
     958           0 :           ELSEIF ( SpcName(1:3) == 'CO_' ) THEN
     959           0 :              SpcName = 'CO'
     960           0 :           ELSEIF ( SpcName(1:2) == 'BC' ) THEN
     961           0 :              SpcName = 'BC'
     962           0 :           ELSEIF ( SpcName(1:2) == 'OC' ) THEN
     963           0 :              SpcName = 'OC'
     964             :           ENDIF
     965             :        ENDIF
     966             :        ! For model species NO, the emission factors are taken from FINN
     967             :        ! species NOx.  For model species MTPA, the emission factors are
     968             :        ! taken from FINN species APINE (BPINE and CARENE will be lumped
     969             :        ! into it as well).
     970           0 :        IF ( TRIM(SpcName) == 'POA1' ) SpcName = 'OC'
     971           0 :        IF ( TRIM(SpcName) == 'NAP'  ) SpcName = 'CO'
     972           0 :        IF ( TRIM(SpcName) == 'NO'   ) SpcName = 'NOx'
     973           0 :        IF ( TRIM(SpcName) == 'MTPA' ) SpcName = 'APINE'
     974           0 :        IF ( TRIM(SpcName) == 'Hg0'  ) SpcName = 'CO'
     975           0 :        IF ( TRIM(SpcName) == 'SOAP' ) SpcName = 'CO'
     976             : 
     977             :        ! For lumped species, we have to repeat the lookup multiple times,
     978             :        ! so use a while loop here.  For example, for species TOLU this will
     979             :        ! make sure that FINN species 'TOLU', 'ETBENZ', and 'STYR' are
     980             :        ! associated with HEMCO species TOLU. Variable nSpc keeps track of
     981             :        ! the total number of species emitted by FINN. All species vectors
     982             :        ! (FinnIDs, HcoIDs, SpcNames, SpcScal, etc.) contain nSpc valid
     983             :        ! elements.
     984           0 :        DO WHILE ( Missing )
     985             : 
     986             :           ! Search for SpcName in FINN
     987           0 :           DO N = 1, N_SPEC
     988           0 :              IF ( TRIM(SpcName) == TRIM(Inst%FINN_SPEC_NAME(N)) ) THEN
     989             : 
     990             :                 ! Update number of species to be emitted via FINN and
     991             :                 ! archive all related information in vectors FinnIDs,
     992             :                 ! HcoIDs, SpcNames, etc.
     993             : 
     994             :                 ! nSpc is the total number of emitted FINN species. Must
     995             :                 ! not exceed nSpcMax.
     996           0 :                 Inst%nSpc = Inst%nSpc + 1
     997           0 :                 IF ( Inst%nSpc > nSpcMax ) THEN
     998             :                    MSG = 'nSpc greater than nSpcMax, please increase ' // &
     999           0 :                          'parameter `nSpcMax` in hcox_finn_mod.F90'
    1000           0 :                    CALL HCO_ERROR ( MSG, RC )
    1001           0 :                    RETURN
    1002             :                 ENDIF
    1003             : 
    1004             :                 ! Archive corresponding FINN species ID, HEMCO species ID,
    1005             :                 ! scale factor, etc.
    1006           0 :                 Matched             = .TRUE.
    1007           0 :                 Inst%FinnIDs(Inst%nSpc)       = N
    1008           0 :                 Inst%HcoIDs (Inst%nSpc)       = tHcoIDs(L)
    1009           0 :                 Inst%SpcNames(Inst%nSpc)      = tSpcNames(L)
    1010           0 :                 Inst%SpcScalFldNme(Inst%nSpc) = tSpcScalFldNme(L)
    1011           0 :                 Inst%SpcScal(Inst%nSpc)       = tSpcScal(L)
    1012             : 
    1013             :                 ! Verbose
    1014           0 :                 IF ( HcoState%amIRoot ) THEN
    1015           0 :                    MSG = '   - FINN species ' // TRIM(Inst%FINN_SPEC_NAME(N)) // &
    1016           0 :                          '     will be emitted as ' // TRIM(Inst%SpcNames(Inst%nSpc))
    1017           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG )
    1018           0 :                 WRITE(MSG,*) '     --> Uniform scale factor : ', Inst%SpcScal(Inst%nSpc)
    1019           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG )
    1020           0 :                 WRITE(MSG,*) '     --> Scale field          : ', TRIM(Inst%SpcScalFldNme(Inst%nSpc))
    1021           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG )
    1022             :                 ENDIF
    1023             : 
    1024             :                 ! Reset variables
    1025           0 :                 IS_NMOC    = .FALSE.
    1026           0 :                 C_MOLEC    = 1d0
    1027           0 :                 NMOC_RATIO = 0d0
    1028             : 
    1029             :                 ! Get emission factor in [kg X]/[kg CO2].
    1030           0 :                 DO M = 1, N_SPECSTRS
    1031           0 :                    TMPNAME = IN_SPEC_NAME(M)
    1032           0 :                    IF ( TRIM(Inst%FINN_SPEC_NAME(N)) == TRIM(TMPNAME(5:8)) ) THEN
    1033             :                       ! First two entries are not species. Also, EMFAC
    1034             :                       ! is stored as [mole CO2]/[mole X], but we want the
    1035             :                       ! inverse.  This gives us [mole X]/[mole CO2].
    1036             :                       ! To convert this to  [kg X]/[kg CO2], we also need
    1037             :                       ! to adjust for the molecular weights of species X
    1038             :                       ! and CO2.  The EF ratios of OC and BC are in
    1039             :                       ! [mole CO2]/[g X], so the adjustment factor is
    1040             :                       ! calculated slightly differently for those two
    1041             :                       ! species!
    1042           0 :                       IF ( TRIM(Inst%FINN_SPEC_NAME(N)) == 'OC' .OR. &
    1043           0 :                            TRIM(Inst%FINN_SPEC_NAME(N)) == 'BC'       ) THEN
    1044             :                          AdjFact = 1.0_dp / MW_CO2
    1045             : 
    1046             :                       ! Make sure that adjustment factor for CO is always
    1047             :                       ! computed using the MW of CO. CO might be used as
    1048             :                       ! proxy for other species (e.g. Hg0), in which case
    1049             :                       ! we still want to normalize by the MW of CO.
    1050           0 :                       ELSEIF ( TRIM(Inst%FINN_SPEC_NAME(N)) == 'CO' ) THEN
    1051             :                          AdjFact = 28.01_dp / MW_CO2
    1052             : 
    1053             :                       ! Normalize by species' molecular weight.
    1054             :                       ELSE
    1055             :                          AdjFact = 1.0_dp / MW_CO2 * &
    1056           0 :                                    HcoState%Spc(Inst%HcoIDs(Inst%nSpc))%MW_g
    1057             :                       ENDIF
    1058           0 :                       Inst%FINN_EMFAC(N,:) = AdjFact / EMFAC_IN(M,:)
    1059           0 :                       IF ( HcoState%amIRoot ) THEN
    1060           0 :                          WRITE( MSG, 200 ) TRIM( Inst%FINN_SPEC_NAME(N))
    1061           0 :                          CALL HCO_MSG(HcoState%Config%Err,MSG )
    1062             :                       ENDIF
    1063           0 :                       EXIT
    1064             : 
    1065             :                    ! NMOC_EMFAC is converted to [kg NMOC]/[kg CO2].
    1066             :                    ! Input unit is [mole CO2]/[mole NMOC].
    1067           0 :                    ELSE IF ( TRIM(TMPNAME(5:8)) == 'NMOC' ) THEN
    1068           0 :                       AdjFact = MW_NMOC / MW_CO2
    1069           0 :                       NMOC_EMFAC = AdjFact / EMFAC_IN(M,:)
    1070             : 
    1071             :                    ENDIF
    1072             :                 ENDDO
    1073             : 200             FORMAT( 'Found FINN emission ratio for species ',a5 )
    1074             : 
    1075           0 :                 DO M = 1, N_NMOCSTRS
    1076           0 :                    TMPNAME = IN_NMOC_NAME(M)
    1077           0 :                    IF ( TRIM(Inst%FINN_SPEC_NAME(N)) == TRIM(TMPNAME) ) THEN
    1078             :                       ! First two entries are not species
    1079           0 :                       NMOC_RATIO = NMOC_RATIO_IN(M,:)
    1080           0 :                       IS_NMOC = .TRUE.
    1081           0 :                       IF ( HcoState%amIRoot ) THEN
    1082           0 :                          WRITE( MSG, 201 ) TRIM( Inst%FINN_SPEC_NAME(N) )
    1083           0 :                          CALL HCO_MSG(HcoState%Config%Err,MSG )
    1084             :                       ENDIF
    1085           0 :                       EXIT
    1086             :                    ENDIF
    1087             :                 ENDDO
    1088             : 201             FORMAT( 'Found FINN NMOC factor for species ',a5 )
    1089             : 
    1090             :                 ! Create emission factor for NMOC species
    1091             :                 ! NMOC_EMFAC is [kg NMOC] / [kg CO2]
    1092             :                 ! NMOC_RATIO is [mole X] / [kg NMOC]
    1093             :                 ! To convert NMOC_RATIO to [kg X] / [kg NMOC], we need to
    1094             :                 ! multiply by the MW of X (kg/mol this time).
    1095           0 :                 IF ( IS_NMOC ) THEN
    1096           0 :                    DO M = 1, N_EMFAC
    1097           0 :                       AdjFact = HcoState%Spc(Inst%HcoIDs(Inst%nSpc))%MW_g
    1098           0 :                       Inst%FINN_EMFAC(N,M) = NMOC_EMFAC(M) * &
    1099             :                                              NMOC_RATIO(M) * &
    1100           0 :                                              ( AdjFact * 1e-3_hp )
    1101             :                    ENDDO
    1102             :                 ENDIF
    1103             :              ENDIF
    1104             : 
    1105             :           ENDDO !N
    1106             : 
    1107             :           ! Update variable Missing. Missing has to be False to exit the
    1108             :           ! while loop.
    1109           0 :           Missing = .FALSE.
    1110             : 
    1111             :           ! For lumped species, we have to repeat the lookup for all
    1112             :           ! lumped species. For lumped species, we just assign the same
    1113             :           ! HEMCO species ID to multiple FINN species, so that all of
    1114             :           ! them will be added to the same model species.
    1115             : 
    1116             :           ! --> TMB is lumped into XYLE
    1117           0 :           IF ( Inst%SpcNames(Inst%nSpc) == 'XYLE' ) THEN
    1118           0 :              IF ( N_LUMPED == 0 ) THEN
    1119           0 :                 SpcName  = 'TMB'
    1120           0 :                 Missing  = .TRUE.
    1121           0 :                 N_LUMPED = N_LUMPED + 1
    1122             :              ENDIF
    1123             :           ENDIF
    1124             : 
    1125             :           ! --> ETBENZ and STYR are lumped into TOLU
    1126           0 :           IF ( Inst%SpcNames(Inst%nSpc) == 'TOLU' ) THEN
    1127           0 :              IF ( N_LUMPED == 0 ) THEN
    1128           0 :                 SpcName  = 'ETBENZ'
    1129           0 :                 Missing  = .TRUE.
    1130           0 :                 N_LUMPED = N_LUMPED + 1
    1131           0 :              ELSEIF ( N_LUMPED == 1 ) THEN
    1132           0 :                 SpcName  = 'STYR'
    1133           0 :                 Missing  = .TRUE.
    1134           0 :                 N_LUMPED = N_LUMPED + 1
    1135             :              ENDIF
    1136             :           ENDIF
    1137             : 
    1138             :           ! --> BPINE and CARENE are lumped into MTPA
    1139           0 :           IF ( Inst%SpcNames(Inst%nSpc) == 'MTPA' ) THEN
    1140           0 :              IF ( N_LUMPED == 0 ) THEN
    1141           0 :                 SpcName  = 'BPINE'
    1142           0 :                 Missing  = .TRUE.
    1143           0 :                 N_LUMPED = N_LUMPED + 1
    1144           0 :              ELSEIF ( N_LUMPED == 1 ) THEN
    1145           0 :                 SpcName  = 'CARENE'
    1146           0 :                 Missing  = .TRUE.
    1147           0 :                 N_LUMPED = N_LUMPED + 1
    1148             :              ENDIF
    1149             :           ENDIF
    1150             : 
    1151             :        ENDDO !While missing
    1152             : 
    1153             :        ! Error check: we must not specify a species that is not defined
    1154             :        ! in FINN.
    1155           0 :        IF ( .NOT. Matched ) THEN
    1156           0 :           MSG = 'Species '// TRIM(SpcName) //' not found in FINN'
    1157           0 :           CALL HCO_ERROR(MSG, RC )
    1158           0 :           RETURN
    1159             :        ENDIF
    1160             :     ENDDO !L
    1161             : 
    1162             :     !=======================================================================
    1163             :     ! Activate this module and the fields of ExtState that it uses
    1164             :     !=======================================================================
    1165             : 
    1166             : !==============================================================================
    1167             : ! This code is required for the vertical distribution of biomass burning emiss.
    1168             : ! We will keep it here for a future implementation. (mps, 4/24/17)
    1169             : !    ! Activate met fields required by this extension
    1170             : !    ExtState%FRAC_OF_PBL%DoUse = .TRUE.
    1171             : !==============================================================================
    1172             : 
    1173             :     ! Cleanup
    1174           0 :     IF ( ALLOCATED(EMFAC_IN        )) DEALLOCATE( EMFAC_IN       )
    1175           0 :     IF ( ALLOCATED(NMOC_RATIO_IN   )) DEALLOCATE( NMOC_RATIO_IN  )
    1176           0 :     IF ( ALLOCATED(tHcoIDs         )) DEALLOCATE( tHcoIDs        )
    1177           0 :     IF ( ALLOCATED(tSpcNames       )) DEALLOCATE( tSpcNames      )
    1178           0 :     IF ( ALLOCATED(tSpcScalFldNme  )) DEALLOCATE( tSpcScalFldNme )
    1179           0 :     IF ( ALLOCATED(tSpcScal        )) DEALLOCATE( tSpcScal       )
    1180             : 
    1181             :     ! Return w/ success
    1182           0 :     Inst => NULL()
    1183           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
    1184             : 
    1185           0 :   END SUBROUTINE HCOX_FINN_Init
    1186             : !EOC
    1187             : !------------------------------------------------------------------------------
    1188             : !                   Harmonized Emissions Component (HEMCO)                    !
    1189             : !------------------------------------------------------------------------------
    1190             : !BOP
    1191             : !
    1192             : ! !IROUTINE: HCOX_FINN_Final
    1193             : !
    1194             : ! !DESCRIPTION: Subroutine HCOX\_FINN\_FINAL deallocates all module
    1195             : !  arrays.
    1196             : !\\
    1197             : !\\
    1198             : ! !INTERFACE:
    1199             : !
    1200           0 :   SUBROUTINE HCOX_FINN_FINAL( ExtState )
    1201             : !
    1202             : ! !INPUT PARAMETERS:
    1203             : !
    1204             :     TYPE(Ext_State),  POINTER       :: ExtState   ! Module options
    1205             : !
    1206             : ! !REVISION HISTORY:
    1207             : !  02 Jan 2013 - J. Mao & J. Fisher - Initial version, based on GFED3
    1208             : !  See https://github.com/geoschem/hemco for complete history
    1209             : !EOP
    1210             : !------------------------------------------------------------------------------
    1211             : !BOC
    1212             : !
    1213             :     !=================================================================
    1214             :     ! HCOX_FINN_FINAL begins here!
    1215             :     !=================================================================
    1216             : 
    1217           0 :     CALL InstRemove ( ExtState%FINN )
    1218             : 
    1219           0 :   END SUBROUTINE HCOX_FINN_Final
    1220             : !EOC
    1221             : !------------------------------------------------------------------------------
    1222             : !                   Harmonized Emissions Component (HEMCO)                    !
    1223             : !------------------------------------------------------------------------------
    1224             : !BOP
    1225             : !
    1226             : ! !IROUTINE: InstGet
    1227             : !
    1228             : ! !DESCRIPTION: Subroutine InstGet returns a poiner to the desired instance.
    1229             : !\\
    1230             : !\\
    1231             : ! !INTERFACE:
    1232             : !
    1233           0 :   SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
    1234             : !
    1235             : ! !INPUT PARAMETERS:
    1236             : !
    1237             :     INTEGER                             :: Instance
    1238             :     TYPE(MyInst),     POINTER           :: Inst
    1239             :     INTEGER                             :: RC
    1240             :     TYPE(MyInst),     POINTER, OPTIONAL :: PrevInst
    1241             : !
    1242             : ! !REVISION HISTORY:
    1243             : !  18 Feb 2016 - C. Keller   - Initial version
    1244             : !  See https://github.com/geoschem/hemco for complete history
    1245             : !EOP
    1246             : !------------------------------------------------------------------------------
    1247             : !BOC
    1248             :     TYPE(MyInst),     POINTER    :: PrvInst
    1249             : 
    1250             :     !=================================================================
    1251             :     ! InstGet begins here!
    1252             :     !=================================================================
    1253             : 
    1254             :     ! Get instance. Also archive previous instance.
    1255           0 :     PrvInst => NULL()
    1256           0 :     Inst    => AllInst
    1257           0 :     DO WHILE ( ASSOCIATED(Inst) )
    1258           0 :        IF ( Inst%Instance == Instance ) EXIT
    1259           0 :        PrvInst => Inst
    1260           0 :        Inst    => Inst%NextInst
    1261             :     END DO
    1262           0 :     IF ( .NOT. ASSOCIATED( Inst ) ) THEN
    1263           0 :        RC = HCO_FAIL
    1264           0 :        RETURN
    1265             :     ENDIF
    1266             : 
    1267             :     ! Pass output arguments
    1268           0 :     IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
    1269             : 
    1270             :     ! Cleanup & Return
    1271           0 :     PrvInst => NULL()
    1272           0 :     RC = HCO_SUCCESS
    1273             : 
    1274             :   END SUBROUTINE InstGet
    1275             : !EOC
    1276             : !------------------------------------------------------------------------------
    1277             : !                   Harmonized Emissions Component (HEMCO)                    !
    1278             : !------------------------------------------------------------------------------
    1279             : !BOP
    1280             : !
    1281             : ! !IROUTINE: InstCreate
    1282             : !
    1283             : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
    1284             : !\\
    1285             : !\\
    1286             : ! !INTERFACE:
    1287             : !
    1288           0 :   SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
    1289             : !
    1290             : ! !INPUT PARAMETERS:
    1291             : !
    1292             :     INTEGER,       INTENT(IN)       :: ExtNr
    1293             : !
    1294             : ! !OUTPUT PARAMETERS:
    1295             : !
    1296             :     INTEGER,       INTENT(  OUT)    :: Instance
    1297             :     TYPE(MyInst),  POINTER          :: Inst
    1298             : !
    1299             : ! !INPUT/OUTPUT PARAMETERS:
    1300             : !
    1301             :     INTEGER,       INTENT(INOUT)    :: RC
    1302             : !
    1303             : ! !REVISION HISTORY:
    1304             : !  18 Feb 2016 - C. Keller   - Initial version
    1305             : !  See https://github.com/geoschem/hemco for complete history
    1306             : !EOP
    1307             : !------------------------------------------------------------------------------
    1308             : !BOC
    1309             :     TYPE(MyInst), POINTER          :: TmpInst
    1310             :     INTEGER                        :: nnInst
    1311             : 
    1312             :     !=================================================================
    1313             :     ! InstCreate begins here!
    1314             :     !=================================================================
    1315             : 
    1316             :     ! ----------------------------------------------------------------
    1317             :     ! Generic instance initialization
    1318             :     ! ----------------------------------------------------------------
    1319             : 
    1320             :     ! Initialize
    1321           0 :     Inst => NULL()
    1322             : 
    1323             :     ! Get number of already existing instances
    1324           0 :     TmpInst => AllInst
    1325           0 :     nnInst = 0
    1326           0 :     DO WHILE ( ASSOCIATED(TmpInst) )
    1327           0 :        nnInst  =  nnInst + 1
    1328           0 :        TmpInst => TmpInst%NextInst
    1329             :     END DO
    1330             : 
    1331             :     ! Create new instance
    1332           0 :     ALLOCATE(Inst)
    1333           0 :     Inst%Instance = nnInst + 1
    1334           0 :     Inst%ExtNr    = ExtNr
    1335             : 
    1336             :     ! Attach to instance list
    1337           0 :     Inst%NextInst => AllInst
    1338           0 :     AllInst       => Inst
    1339             : 
    1340             :     ! Update output instance
    1341           0 :     Instance = Inst%Instance
    1342             : 
    1343             :     ! ----------------------------------------------------------------
    1344             :     ! Type specific initialization statements follow below
    1345             :     ! ----------------------------------------------------------------
    1346             : 
    1347             :     ! Return w/ success
    1348           0 :     RC = HCO_SUCCESS
    1349             : 
    1350           0 :   END SUBROUTINE InstCreate
    1351             : !EOC
    1352             : !------------------------------------------------------------------------------
    1353             : !                   Harmonized Emissions Component (HEMCO)                    !
    1354             : !------------------------------------------------------------------------------
    1355             : !BOP
    1356             : !
    1357             : ! !IROUTINE: InstRemove
    1358             : !
    1359             : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
    1360             : !\\
    1361             : !\\
    1362             : ! !INTERFACE:
    1363             : !
    1364           0 :   SUBROUTINE InstRemove ( Instance )
    1365             : !
    1366             : ! !INPUT PARAMETERS:
    1367             : !
    1368             :     INTEGER                         :: Instance
    1369             : !
    1370             : ! !REVISION HISTORY:
    1371             : !  18 Feb 2016 - C. Keller   - Initial version
    1372             : !  See https://github.com/geoschem/hemco for complete history
    1373             : !EOP
    1374             : !------------------------------------------------------------------------------
    1375             : !BOC
    1376             :     INTEGER                     :: RC
    1377             :     TYPE(MyInst), POINTER       :: PrevInst
    1378             :     TYPE(MyInst), POINTER       :: Inst
    1379             : 
    1380             :     !=================================================================
    1381             :     ! InstRemove begins here!
    1382             :     !=================================================================
    1383             : 
    1384             :     ! Init
    1385           0 :     PrevInst => NULL()
    1386           0 :     Inst     => NULL()
    1387             : 
    1388             :     ! Get instance. Also archive previous instance.
    1389           0 :     CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
    1390             : 
    1391             :     ! Instance-specific deallocation
    1392           0 :     IF ( ASSOCIATED(Inst) ) THEN
    1393             : 
    1394             :        !---------------------------------------------------------------------
    1395             :        ! Deallocate fields of Inst before popping off from the list
    1396             :        ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
    1397             :        !---------------------------------------------------------------------
    1398           0 :        IF ( ASSOCIATED( Inst%VEGTYP1 ) ) THEN
    1399           0 :           DEALLOCATE( Inst%VEGTYP1 )
    1400             :        ENDIF
    1401           0 :        Inst%VEGTYP1 => NULL()
    1402             : 
    1403           0 :        IF ( ASSOCIATED( Inst%VEGTYP2 ) ) THEN
    1404           0 :           DEALLOCATE( Inst%VEGTYP2 )
    1405             :        ENDIF
    1406           0 :        Inst%VEGTYP2 => NULL()
    1407             : 
    1408           0 :        IF ( ASSOCIATED( Inst%VEGTYP3 ) ) THEN
    1409           0 :           DEALLOCATE( Inst%VEGTYP3 )
    1410             :        ENDIF
    1411           0 :        Inst%VEGTYP3 => NULL()
    1412             : 
    1413           0 :        IF ( ASSOCIATED( Inst%VEGTYP4 ) ) THEN
    1414           0 :           DEALLOCATE(Inst%VEGTYP4 )
    1415             :        ENDIF
    1416           0 :        Inst%VEGTYP4 => NULL()
    1417             : 
    1418           0 :        IF ( ASSOCIATED( Inst%VEGTYP5 ) ) THEN
    1419           0 :           DEALLOCATE( Inst%VEGTYP5 )
    1420             :        ENDIF
    1421           0 :        Inst%VEGTYP5 => NULL()
    1422             : 
    1423           0 :        IF ( ASSOCIATED( Inst%VEGTYP9 ) ) THEN
    1424           0 :           DEALLOCATE( Inst%VEGTYP9 )
    1425             :        ENDIF
    1426           0 :        Inst%VEGTYP9 => NULL()
    1427             : 
    1428           0 :        IF ( ASSOCIATED( Inst%FINN_EMFAC ) ) THEN
    1429           0 :           DEALLOCATE( Inst%FINN_EMFAC )
    1430             :        ENDIF
    1431           0 :        Inst%FINN_EMFAC => NULL()
    1432             : 
    1433           0 :        IF ( ASSOCIATED( Inst%FinnIDs ) ) THEN
    1434           0 :           DEALLOCATE( Inst%FinnIDs )
    1435             :        ENDIF
    1436           0 :        Inst%FinnIDs => NULL()
    1437             : 
    1438           0 :        IF ( ASSOCIATED( Inst%HcoIDs ) ) THEN 
    1439           0 :           DEALLOCATE( Inst%HcoIDs )
    1440             :        ENDIF
    1441           0 :        Inst%HcoIDs => NULL()
    1442             : 
    1443           0 :        IF ( ASSOCIATED( Inst%SpcNames ) ) THEN
    1444           0 :           DEALLOCATE( Inst%SpcNames )
    1445             :        ENDIF
    1446           0 :        Inst%SpcNames => NULL()
    1447             : 
    1448           0 :        IF ( ASSOCIATED( Inst%SpcScalFldNme ) ) THEN
    1449           0 :           DEALLOCATE( Inst%SpcScalFldNme )
    1450             :        ENDIF
    1451           0 :        Inst%SpcScalFldNme  => NULL()
    1452             : 
    1453           0 :        IF ( ASSOCIATED( Inst%SpcScal ) ) THEN
    1454           0 :           DEALLOCATE( Inst%SpcScal )
    1455             :        ENDIF
    1456           0 :        Inst%SpcScal => NULL()
    1457             : 
    1458           0 :        IF ( ASSOCIATED( Inst%FINN_SPEC_NAME ) ) THEN
    1459           0 :           DEALLOCATE( Inst%FINN_SPEC_NAME )
    1460             :        ENDIF
    1461           0 :        Inst%FINN_SPEC_NAME => NULL()
    1462             : 
    1463             :        !---------------------------------------------------------------------
    1464             :        ! Pop off instance from list
    1465             :        !---------------------------------------------------------------------
    1466           0 :        IF ( ASSOCIATED(PrevInst) ) THEN
    1467           0 :           PrevInst%NextInst => Inst%NextInst
    1468             :        ELSE
    1469           0 :           AllInst => Inst%NextInst
    1470             :        ENDIF
    1471           0 :        DEALLOCATE(Inst)
    1472             :     ENDIF
    1473             : 
    1474             :     ! Free pointers before exiting
    1475           0 :     PrevInst => NULL()
    1476           0 :     Inst     => NULL()
    1477             : 
    1478           0 :    END SUBROUTINE InstRemove
    1479             : !EOC
    1480           0 : END MODULE HCOX_FINN_Mod

Generated by: LCOV version 1.14