LCOV - code coverage report
Current view: | top level - hemco/HEMCO/src/Extensions - hcox_state_mod.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 726 | 0.0 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 0 | 23 | 0.0 %

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hcox_state_mod.F90
           7             : !
           8             : ! !DESCRIPTION: Module HCOX\_State\_Mod contains routines and variables
           9             : ! to organize the extensions state type ExtState. ExtState contains the
          10             : ! logical switches for each extension (denoting whether or not it is
          11             : ! enabled) as well as pointers to all met fields used by the extensions.
          12             : ! ExtState is passed to all extension modules, and the met fields
          13             : ! defined in here are thus available to all extensions. Additional met
          14             : ! fields (and extension switches) can be added as required.
          15             : !\\
          16             : ! This module contains the routines to initialize and finalize the
          17             : ! ExtState object, but doesn't link the met field pointers to the
          18             : ! corresponding fields. This is done in the HEMCO-model interface
          19             : ! routines (e.g. hcoi\_standalone\_mod.F90, hcoi\_gc\_main\_mod.F90).
          20             : ! Newly added met fields will only work if the corresponding pointer
          21             : ! assignments are added to these interface routines!
          22             : !\\
          23             : !\\
          24             : ! !INTERFACE:
          25             : !
          26             : MODULE HCOX_STATE_MOD
          27             : !
          28             : ! !USES:
          29             : !
          30             :   USE HCO_ERROR_MOD
          31             :   USE HCO_ARR_MOD
          32             :
          33             :   IMPLICIT NONE
          34             :   PRIVATE
          35             : !
          36             : ! !PUBLIC MEMBER FUNCTIONS:
          37             : !
          38             :   PUBLIC :: ExtStateInit
          39             :   PUBLIC :: ExtStateFinal
          40             :   PUBLIC :: ExtDat_Set
          41             : !
          42             : ! !DERIVED TYPES:
          43             : !
          44             :   !=========================================================================
          45             :   ! ExtDat_*: Derived types containing pointers to the met field arrays
          46             :   ! (Arr) and a logical flag whether or not the field is used by any of
          47             :   ! the extensions (DoUse).  Arrays can be 3D reals or 2D reals or integer
          48             :   ! All real values are of default precision! (df), as specified in
          49             :   ! HCO\_ERROR\_MOD.  You can add more types if necessary.
          50             :   !=========================================================================
          51             :
          52             :   ! 2D real, default precision
          53             :   TYPE, PUBLIC :: ExtDat_2R
          54             :      TYPE(Arr2D_HP), POINTER :: Arr
          55             :      LOGICAL                 :: DoUse
          56             :      LOGICAL                 :: FromList
          57             :   END TYPE ExtDat_2R
          58             :
          59             :   ! 2D real, single precision
          60             :   TYPE, PUBLIC :: ExtDat_2S
          61             :      TYPE(Arr2D_SP), POINTER :: Arr
          62             :      LOGICAL                 :: DoUse
          63             :      LOGICAL                 :: FromList
          64             :   END TYPE ExtDat_2S
          65             :
          66             :   ! 2D integer
          67             :   TYPE, PUBLIC :: ExtDat_2I
          68             :      TYPE(Arr2D_I),  POINTER :: Arr
          69             :      LOGICAL                 :: DoUse
          70             :      LOGICAL                 :: FromList
          71             :   END TYPE ExtDat_2I
          72             :
          73             :   ! 3D real, default precision
          74             :   TYPE, PUBLIC :: ExtDat_3R
          75             :      TYPE(Arr3D_HP), POINTER :: Arr
          76             :      LOGICAL                 :: DoUse
          77             :      LOGICAL                 :: FromList
          78             :   END TYPE ExtDat_3R
          79             :
          80             :   ! 3D real, single precision
          81             :   TYPE, PUBLIC :: ExtDat_3S
          82             :      TYPE(Arr3D_SP), POINTER :: Arr
          83             :      LOGICAL                 :: DoUse
          84             :      LOGICAL                 :: FromList
          85             :   END TYPE ExtDat_3S
          86             :
          87             :   !=========================================================================
          88             :   ! Ext_State: Derived type declaration for the State object containing
          89             :   ! pointers to all met fields and related quantities used by the HEMCO
          90             :   ! extensions. An 'Ext_State' type called ExtState is defined at the
          91             :   ! beginning of a HEMCO run and populated according to the specifications
          92             :   ! set in the configuration file.  You can add more fields if necessary.
          93             :   !=========================================================================
          94             :   TYPE, PUBLIC :: Ext_State
          95             :
          96             :      !----------------------------------------------------------------------
          97             :      ! Extension switches (enabled?)
          98             :      ! NOTE: When adding a new extension, don't forget to initialize this
          99             :      ! switch in subroutine ExtStateInit below!
         100             :      !----------------------------------------------------------------------
         101             :      INTEGER                   :: Custom         ! Customizable ext.
         102             :      INTEGER                   :: DustDead       ! DEAD dust model
         103             :      INTEGER                   :: DustGinoux     ! Ginoux dust emissions
         104             :      INTEGER                   :: DustAlk        ! Dust alkalinity
         105             :      INTEGER                   :: LightNOx       ! Lightning NOx
         106             :      INTEGER                   :: ParaNOx        ! PARANOX ship emissions
         107             :      INTEGER                   :: SoilNOx        ! Soil NOx emissions
         108             :      INTEGER                   :: Megan          ! MEGAN biogenic emissions
         109             :      INTEGER                   :: SeaFlux        ! air-sea exchange
         110             :      INTEGER                   :: SeaSalt        ! Seasalt emissions
         111             :      INTEGER                   :: GFED           ! GFED biomass burning
         112             :      INTEGER                   :: FINN           ! FINN biomass burning
         113             :      INTEGER                   :: GC_RnPbBe      ! GEOS-Chem Rn-Pb-Be simulation
         114             :      INTEGER                   :: GC_POPs        ! GEOS-Chem POPs simulation
         115             :      INTEGER                   :: Wetland_CH4    ! Methane emiss from wetlands
         116             :      INTEGER                   :: TOMAS_Jeagle   ! TOMAS Jeagle sea salt
         117             :      INTEGER                   :: TOMAS_DustDead ! TOMAS sectional Dead Dust
         118             :      INTEGER                   :: Volcano        ! Volcano emissions
         119             :      INTEGER                   :: Inorg_Iodine   ! Oceanic inorganic iodine emissions
         120             :
         121             :      !----------------------------------------------------------------------
         122             :      ! Data directory
         123             :      !----------------------------------------------------------------------
         124             :      CHARACTER(LEN=255)        :: DATA_DIR    ! Directory for data
         125             :
         126             :      !----------------------------------------------------------------------
         127             :      ! Met fields
         128             :      !----------------------------------------------------------------------
         129             :      TYPE(ExtDat_2R),  POINTER :: U10M        ! E/W 10m wind speed [m/s]
         130             :      TYPE(ExtDat_2R),  POINTER :: V10M        ! N/S 10m wind speed [m/s]
         131             :      TYPE(ExtDat_2R),  POINTER :: ALBD        ! Surface albedo [-]
         132             :      TYPE(ExtDat_2R),  POINTER :: T2M         ! 2m Sfce temperature [K]
         133             :      TYPE(ExtDat_2R),  POINTER :: TSKIN       ! Surface skin temperature [K]
         134             :      TYPE(ExtDat_2R),  POINTER :: GWETROOT    ! Root soil wetness [1]
         135             :      TYPE(ExtDat_2R),  POINTER :: GWETTOP     ! Top soil moisture [-]
         136             :      TYPE(ExtDat_2R),  POINTER :: SNOWHGT     ! Snow height [mm H2O = kg H2O/m2]
         137             :      TYPE(ExtDat_2R),  POINTER :: SNODP       ! Snow depth [m ]
         138             :      TYPE(ExtDat_2R),  POINTER :: SNICE       ! Fraction of snow/ice [1]
         139             :      TYPE(ExtDat_2R),  POINTER :: USTAR       ! Friction velocity [m/s]
         140             :      TYPE(ExtDat_2R),  POINTER :: Z0          ! Sfc roughness height [m]
         141             :      TYPE(ExtDat_2R),  POINTER :: TROPP       ! Tropopause pressure [Pa]
         142             :      TYPE(ExtDat_2R),  POINTER :: SUNCOS      ! COS (SZA)
         143             :      TYPE(ExtDat_2R),  POINTER :: SZAFACT     ! current SZA/total daily SZA
         144             :      TYPE(ExtDat_2R),  POINTER :: PARDR       ! direct photsyn radiation [W/m2]
         145             :      TYPE(ExtDat_2R),  POINTER :: PARDF       ! diffuse photsyn radiation [W/m2]
         146             :      TYPE(ExtDat_2R),  POINTER :: PSC2_WET    ! Interpolated sfc pressure [hPa]
         147             :      TYPE(ExtDat_2R),  POINTER :: RADSWG      ! surface radiation [W/m2]
         148             :      TYPE(ExtDat_2R),  POINTER :: FRCLND      ! Olson land fraction [-]
         149             :      TYPE(ExtDat_2R),  POINTER :: FRLAND      ! land fraction [-]
         150             :      TYPE(ExtDat_2R),  POINTER :: FROCEAN     ! ocean fraction [-]
         151             :      TYPE(ExtDat_2R),  POINTER :: FRSEAICE    ! sea ice fraction [-]
         152             :      TYPE(ExtDat_2R),  POINTER :: QV2M        ! 2m specific humidity [-]
         153             :      TYPE(ExtDat_2R),  POINTER :: FRLAKE      ! lake fraction [-]
         154             :      TYPE(ExtDat_2R),  POINTER :: FRLANDIC    ! land ice fraction [-]
         155             :      TYPE(ExtDat_2R),  POINTER :: CLDFRC      ! cloud fraction [-]
         156             :      TYPE(ExtDat_2R),  POINTER :: JNO2        ! J-Value for NO2 [1/s]
         157             :      TYPE(ExtDat_2R),  POINTER :: JOH         ! J-Value for O3->OH  [1/s]
         158             :      TYPE(ExtDat_2R),  POINTER :: LAI         ! daily leaf area index [cm2/cm2]
         159             :      TYPE(ExtDat_2R),  POINTER :: CHLR        ! daily chlorophyll-a [mg/m3]
         160             :      TYPE(ExtDat_2I),  POINTER :: TropLev     ! Tropopause level [1]
         161             :      TYPE(ExtDat_2R),  POINTER :: FLASH_DENS  ! Lightning flash density [#/km2/s]
         162             :      TYPE(ExtDat_2R),  POINTER :: CONV_DEPTH  ! Convective cloud depth [m]
         163             :      INTEGER,          POINTER :: PBL_MAX     ! Max height of PBL [level]
         164             :      TYPE(ExtDat_3R),  POINTER :: CNV_MFC     ! Convective cloud mass flux [kg/m2/s]
         165             :      TYPE(ExtDat_3R),  POINTER :: FRAC_OF_PBL ! Fraction of grid box in PBL
         166             :      TYPE(ExtDat_3R),  POINTER :: SPHU        ! Spec. humidity [kg H2O/kg total air]
         167             :      TYPE(ExtDat_3R),  POINTER :: TK          ! Air temperature [K]
         168             :      TYPE(ExtDat_3R),  POINTER :: AIR         ! Dry air mass [kg]
         169             :      TYPE(ExtDat_3R),  POINTER :: AIRVOL      ! Air volume [m3]
         170             :      TYPE(ExtDat_3R),  POINTER :: AIRDEN      ! Dry air density [kg/m3]
         171             :      TYPE(ExtDat_3R),  POINTER :: O3          ! O3 mass [kg/kg dry air]
         172             :      TYPE(ExtDat_3R),  POINTER :: NO          ! NO mass [kg/kg dry air]
         173             :      TYPE(ExtDat_3R),  POINTER :: NO2         ! NO2 mass [kg/kg dry air]
         174             :      TYPE(ExtDat_3R),  POINTER :: HNO3        ! HNO3 mass [kg/kg dry air]
         175             :      TYPE(ExtDat_3R),  POINTER :: POPG        ! POPG mass [kg/kg dry air]
         176             :
         177             :      !----------------------------------------------------------------------
         178             :      ! Deposition parameter
         179             :      ! DRY_TOTN and WET_TOTN are the total (dry/wet) deposited N since the
         180             :      ! last emission timestep. Even though these numbers are per second,
         181             :      ! they may represent accumulated deposition velocities if chemistry
         182             :      ! and/or dynamic timestep are not equal to the emission timestep.
         183             :      ! These values are used by the soil NOx module. Note that it is assumed
         184             :      ! that DRY_TOTN and WET_TOTN are summed over chemistry and transport
         185             :      ! timesteps, respectively!
         186             :      !----------------------------------------------------------------------
         187             :      TYPE(ExtDat_2R),  POINTER :: DRY_TOTN    ! Dry deposited N   [molec/cm2/s]
         188             :      TYPE(ExtDat_2R),  POINTER :: WET_TOTN    ! Wet deposited N   [kg N/s]
         189             :      REAL(hp),         POINTER :: DRYCOEFF(:) ! Baldocci drydep coeff.
         190             :
         191             :      !----------------------------------------------------------------------
         192             :      ! Constants for POPs emissions module
         193             :      !----------------------------------------------------------------------
         194             :      REAL(dp)                  :: POP_DEL_H   ! Delta H [J/mol]
         195             :      REAL(dp)                  :: POP_DEL_Hw  ! Delta Hw [J/mol]
         196             :      REAL(dp)                  :: POP_HSTAR   ! Henry's law constant [atm/M/L]
         197             :      REAL(dp)                  :: POP_KOA     ! POP octanol-water partition coef
         198             :      REAL(dp)                  :: POP_KBC     ! POP BC-air partition coeff.
         199             :      REAL(dp)                  :: POP_XMW     ! POP molecular weight [kg/mol]
         200             :
         201             :      !----------------------------------------------------------------------
         202             :      ! Fields used in ESMF environment only. These arrays won't be used
         203             :      ! in a classic environment. They become filled in HCO_SetExtState_ESMF
         204             :      ! in hcoi_esmf_mod.F90 (called from within hcoi_gc_main_mod.F90).
         205             :      !----------------------------------------------------------------------
         206             :      TYPE(ExtDat_3S),  POINTER :: BYNCY       ! Buoyancy
         207             :      TYPE(ExtDat_2S),  POINTER :: LFR         ! Lightning flash rate
         208             :      TYPE(ExtDat_2R),  POINTER :: CNV_FRC     ! convective fraction (filled
         209             :                                               ! from State_Met)
         210             :   END TYPE Ext_State
         211             : !
         212             : ! !PRIVATE MEMBER FUNCTIONS:
         213             : !
         214             : ! !REVISION HISTORY:
         215             : !  02 Oct 2013 - C. Keller   - Initial version
         216             : !  See https://github.com/geoschem/hemco for complete history
         217             : !EOP
         218             : !-----------------------------------------------------------------------------
         219             : !BOC
         220             : !
         221             : ! !MODULE INTERFACES:
         222             : !
         223             :   INTERFACE ExtDat_Init
         224             :      MODULE PROCEDURE ExtDat_Init_2R
         225             :      MODULE PROCEDURE ExtDat_Init_2S
         226             :      MODULE PROCEDURE ExtDat_Init_2I
         227             :      MODULE PROCEDURE ExtDat_Init_3R
         228             :      MODULE PROCEDURE ExtDat_Init_3S
         229             :   END INTERFACE ExtDat_Init
         230             :
         231             :   INTERFACE ExtDat_Set
         232             :      MODULE PROCEDURE ExtDat_Set_2R
         233             :      MODULE PROCEDURE ExtDat_Set_2S
         234             :      MODULE PROCEDURE ExtDat_Set_2I
         235             :      MODULE PROCEDURE ExtDat_Set_3R
         236             :      MODULE PROCEDURE ExtDat_Set_3S
         237             :   END INTERFACE ExtDat_Set
         238             :
         239             :   INTERFACE ExtDat_Cleanup
         240             :      MODULE PROCEDURE ExtDat_Cleanup_2R
         241             :      MODULE PROCEDURE ExtDat_Cleanup_2S
         242             :      MODULE PROCEDURE ExtDat_Cleanup_2I
         243             :      MODULE PROCEDURE ExtDat_Cleanup_3R
         244             :      MODULE PROCEDURE ExtDat_Cleanup_3S
         245             :   END INTERFACE ExtDat_Cleanup
         246             :
         247             : CONTAINS
         248             : !EOC
         249             : !------------------------------------------------------------------------------
         250             : !                   Harmonized Emissions Component (HEMCO)                    !
         251             : !------------------------------------------------------------------------------
         252             : !BOP
         253             : !
         254             : ! !ROUTINE: ExtStateInit
         255             : !
         256             : ! !DESCRIPTION: Initializes all fields of the ExtState object.
         257             : !\\
         258             : !\\
         259             : ! !INTERFACE:
         260             : !
         261           0 :   SUBROUTINE ExtStateInit( ExtState, RC )
         262             : !
         263             : ! !INPUT/OUTPUT PARAMETERS:
         264             : !
         265             :     TYPE(Ext_State), POINTER        :: ExtState   ! ExtState object
         266             :     INTEGER,         INTENT(INOUT)  :: RC         ! Success or failure?
         267             : !
         268             : ! !REMARKS:
         269             : !  You can add more initialization statements as is necessary.
         270             : !
         271             : ! !REVISION HISTORY:
         272             : !  15 Dec 2013 - C. Keller - Initial version
         273             : !  See https://github.com/geoschem/hemco for complete history
         274             : !EOP
         275             : !------------------------------------------------------------------------------
         276             : !BOC
         277             : !
         278             : ! !LOCAL VARIABLES:
         279             : !
         280             :     CHARACTER(LEN=255)  :: LOC
         281             :     !======================================================================
         282             :     ! ExtStateInit begins here
         283             :     !======================================================================
         284           0 :     LOC = 'ExtStateInit (HCOX_STATE_MOD.F90)'
         285             :
         286             :     ! Allocate object
         287           0 :     IF ( .NOT. ASSOCIATED ( ExtState ) ) ALLOCATE ( ExtState )
         288             :
         289             :     !-----------------------------------------------------------------------
         290             :     ! Set all switches to -1
         291             :     !-----------------------------------------------------------------------
         292           0 :     ExtState%Custom         = -1
         293           0 :     ExtState%DustDead       = -1
         294           0 :     ExtState%DustGinoux     = -1
         295           0 :     ExtState%DustAlk        = -1
         296           0 :     ExtState%LightNOx       = -1
         297           0 :     ExtState%ParaNOx        = -1
         298           0 :     ExtState%SoilNOx        = -1
         299           0 :     ExtState%Megan          = -1
         300           0 :     ExtState%SeaFlux        = -1
         301           0 :     ExtState%SeaSalt        = -1
         302           0 :     ExtState%GFED           = -1
         303           0 :     ExtState%FINN           = -1
         304           0 :     ExtState%GC_RnPbBe      = -1
         305           0 :     ExtState%GC_POPs        = -1
         306           0 :     ExtState%Wetland_CH4    = -1
         307           0 :     ExtState%TOMAS_Jeagle   = -1
         308           0 :     ExtState%TOMAS_DustDead = -1
         309           0 :     ExtState%Volcano        = -1
         310           0 :     ExtState%Inorg_Iodine   = -1
         311             :
         312             :     !-----------------------------------------------------------------------
         313             :     ! Initialize constants for POPs emissions module
         314             :     !-----------------------------------------------------------------------
         315           0 :     ExtState%POP_DEL_H      = 0d0
         316           0 :     ExtState%POP_DEL_Hw     = 0d0
         317           0 :     ExtState%POP_HSTAR      = 0d0
         318           0 :     ExtState%POP_KOA        = 0d0
         319           0 :     ExtState%POP_KBC        = 0d0
         320           0 :     ExtState%POP_XMW        = 0d0
         321             :
         322             :     !-----------------------------------------------------------------------
         323             :     ! Initialize all met arrays.
         324             :     ! This defines a nullified pointer for every met field and sets the
         325             :     ! corresponding DoUse flag to FALSE. The pointers to the met fields
         326             :     ! need to be defined in the HEMCO-model interface routine.
         327             :     !-----------------------------------------------------------------------
         328           0 :     CALL ExtDat_Init( ExtState%U10M, RC )
         329           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         330           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         331           0 :         RETURN
         332             :     ENDIF
         333             :
         334           0 :     CALL ExtDat_Init ( ExtState%V10M, RC )
         335           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         336           0 :         CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         337           0 :         RETURN
         338             :     ENDIF
         339             :
         340           0 :     CALL ExtDat_Init ( ExtState%ALBD, RC )
         341           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         342           0 :         CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         343           0 :         RETURN
         344             :     ENDIF
         345             :
         346           0 :     CALL ExtDat_Init ( ExtState%T2M, RC )
         347           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         348           0 :         CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
         349           0 :         RETURN
         350             :     ENDIF
         351             :
         352           0 :     CALL ExtDat_Init ( ExtState%TSKIN, RC )
         353           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         354           0 :         CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
         355           0 :         RETURN
         356             :     ENDIF
         357             :
         358           0 :     CALL ExtDat_Init ( ExtState%GWETROOT, RC )
         359           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         360           0 :         CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
         361           0 :         RETURN
         362             :     ENDIF
         363             :
         364           0 :     CALL ExtDat_Init ( ExtState%GWETTOP, RC )
         365           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         366           0 :         CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
         367           0 :         RETURN
         368             :     ENDIF
         369             :
         370           0 :     CALL ExtDat_Init ( ExtState%SNOWHGT, RC )
         371           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         372           0 :         CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
         373           0 :         RETURN
         374             :     ENDIF
         375             :
         376           0 :     CALL ExtDat_Init ( ExtState%SNODP, RC )
         377           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         378           0 :         CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
         379           0 :         RETURN
         380             :     ENDIF
         381             :
         382           0 :     CALL ExtDat_Init ( ExtState%SNICE, RC )
         383           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         384           0 :         CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
         385           0 :         RETURN
         386             :     ENDIF
         387             :
         388           0 :     CALL ExtDat_Init ( ExtState%USTAR, RC )
         389           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         390           0 :         CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
         391           0 :         RETURN
         392             :     ENDIF
         393             :
         394           0 :     CALL ExtDat_Init ( ExtState%Z0, RC )
         395           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         396           0 :         CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
         397           0 :         RETURN
         398             :     ENDIF
         399             :
         400           0 :     CALL ExtDat_Init ( ExtState%TROPP, RC )
         401           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         402           0 :         CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
         403           0 :         RETURN
         404             :     ENDIF
         405             :
         406           0 :     CALL ExtDat_Init ( ExtState%SUNCOS, RC )
         407           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         408           0 :         CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
         409           0 :         RETURN
         410             :     ENDIF
         411             :
         412           0 :     CALL ExtDat_Init ( ExtState%SZAFACT, RC )
         413           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         414           0 :         CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
         415           0 :         RETURN
         416             :     ENDIF
         417             :
         418           0 :     CALL ExtDat_Init ( ExtState%PARDR, RC )
         419           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         420           0 :         CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
         421           0 :         RETURN
         422             :     ENDIF
         423             :
         424           0 :     CALL ExtDat_Init ( ExtState%PARDF, RC )
         425           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         426           0 :         CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
         427           0 :         RETURN
         428             :     ENDIF
         429             :
         430           0 :     CALL ExtDat_Init ( ExtState%PSC2_WET, RC )
         431           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         432           0 :         CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
         433           0 :         RETURN
         434             :     ENDIF
         435             :
         436           0 :     CALL ExtDat_Init ( ExtState%RADSWG, RC )
         437           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         438           0 :         CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
         439           0 :         RETURN
         440             :     ENDIF
         441             :
         442           0 :     CALL ExtDat_Init ( ExtState%FRCLND, RC )
         443           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         444           0 :         CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
         445           0 :         RETURN
         446             :     ENDIF
         447             :
         448           0 :     CALL ExtDat_Init ( ExtState%FRLAND, RC )
         449           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         450           0 :         CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
         451           0 :         RETURN
         452             :     ENDIF
         453             :
         454           0 :     CALL ExtDat_Init ( ExtState%FROCEAN, RC )
         455           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         456           0 :         CALL HCO_ERROR( 'ERROR 22', RC, THISLOC=LOC )
         457           0 :         RETURN
         458             :     ENDIF
         459             :
         460           0 :     CALL ExtDat_Init ( ExtState%FRSEAICE, RC )
         461           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         462           0 :         CALL HCO_ERROR( 'ERROR 23', RC, THISLOC=LOC )
         463           0 :         RETURN
         464             :     ENDIF
         465             :
         466           0 :     CALL ExtDat_Init ( ExtState%QV2M, RC )
         467           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         468           0 :         CALL HCO_ERROR( 'ERROR 24', RC, THISLOC=LOC )
         469           0 :         RETURN
         470             :     ENDIF
         471             :
         472           0 :     CALL ExtDat_Init ( ExtState%FRLAKE, RC )
         473           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         474           0 :         CALL HCO_ERROR( 'ERROR 25', RC, THISLOC=LOC )
         475           0 :         RETURN
         476             :     ENDIF
         477             :
         478           0 :     CALL ExtDat_Init ( ExtState%FRLANDIC, RC )
         479           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         480           0 :         CALL HCO_ERROR( 'ERROR 26', RC, THISLOC=LOC )
         481           0 :         RETURN
         482             :     ENDIF
         483             :
         484           0 :     CALL ExtDat_Init ( ExtState%CLDFRC, RC )
         485           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         486           0 :         CALL HCO_ERROR( 'ERROR 27', RC, THISLOC=LOC )
         487           0 :         RETURN
         488             :     ENDIF
         489             :
         490           0 :     CALL ExtDat_Init ( ExtState%LAI, RC )
         491           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         492           0 :         CALL HCO_ERROR( 'ERROR 28', RC, THISLOC=LOC )
         493           0 :         RETURN
         494             :     ENDIF
         495             :
         496           0 :     CALL ExtDat_Init ( ExtState%CHLR, RC )
         497           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         498           0 :         CALL HCO_ERROR( 'ERROR 29', RC, THISLOC=LOC )
         499           0 :         RETURN
         500             :     ENDIF
         501             :
         502           0 :     CALL ExtDat_Init ( ExtState%FLASH_DENS, RC )
         503           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         504           0 :         CALL HCO_ERROR( 'ERROR 30', RC, THISLOC=LOC )
         505           0 :         RETURN
         506             :     ENDIF
         507             :
         508           0 :     CALL ExtDat_Init ( ExtState%CONV_DEPTH, RC )
         509           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         510           0 :         CALL HCO_ERROR( 'ERROR 31', RC, THISLOC=LOC )
         511           0 :         RETURN
         512             :     ENDIF
         513             :
         514           0 :     CALL ExtDat_Init ( ExtState%JNO2, RC )
         515           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         516           0 :         CALL HCO_ERROR( 'ERROR 32', RC, THISLOC=LOC )
         517           0 :         RETURN
         518             :     ENDIF
         519             :
         520           0 :     CALL ExtDat_Init ( ExtState%JOH, RC )
         521           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         522           0 :         CALL HCO_ERROR( 'ERROR 33', RC, THISLOC=LOC )
         523           0 :         RETURN
         524             :     ENDIF
         525             :
         526           0 :     CALL ExtDat_Init ( ExtState%CNV_MFC, RC )
         527           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         528           0 :         CALL HCO_ERROR( 'ERROR 34', RC, THISLOC=LOC )
         529           0 :         RETURN
         530             :     ENDIF
         531             :
         532           0 :     ExtState%PBL_MAX    => NULL()
         533             :
         534           0 :     CALL ExtDat_Init ( ExtState%FRAC_OF_PBL, RC )
         535           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         536           0 :         CALL HCO_ERROR( 'ERROR 35', RC, THISLOC=LOC )
         537           0 :         RETURN
         538             :     ENDIF
         539             :
         540           0 :     CALL ExtDat_Init ( ExtState%SPHU, RC )
         541           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         542           0 :         CALL HCO_ERROR( 'ERROR 36', RC, THISLOC=LOC )
         543           0 :         RETURN
         544             :     ENDIF
         545             :
         546           0 :     CALL ExtDat_Init ( ExtState%TK, RC )
         547           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         548           0 :         CALL HCO_ERROR( 'ERROR 37', RC, THISLOC=LOC )
         549           0 :         RETURN
         550             :     ENDIF
         551             :
         552           0 :     CALL ExtDat_Init ( ExtState%AIR, RC )
         553           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         554           0 :         CALL HCO_ERROR( 'ERROR 38', RC, THISLOC=LOC )
         555           0 :         RETURN
         556             :     ENDIF
         557             :
         558           0 :     CALL ExtDat_Init ( ExtState%AIRVOL, RC )
         559           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         560           0 :         CALL HCO_ERROR( 'ERROR 39', RC, THISLOC=LOC )
         561           0 :         RETURN
         562             :     ENDIF
         563             :
         564           0 :     CALL ExtDat_Init ( ExtState%AIRDEN, RC )
         565           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         566           0 :         CALL HCO_ERROR( 'ERROR 40', RC, THISLOC=LOC )
         567           0 :         RETURN
         568             :     ENDIF
         569             :
         570           0 :     CALL ExtDat_Init ( ExtState%O3, RC )
         571           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         572           0 :         CALL HCO_ERROR( 'ERROR 41', RC, THISLOC=LOC )
         573           0 :         RETURN
         574             :     ENDIF
         575             :
         576           0 :     CALL ExtDat_Init ( ExtState%NO, RC )
         577           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         578           0 :         CALL HCO_ERROR( 'ERROR 42', RC, THISLOC=LOC )
         579           0 :         RETURN
         580             :     ENDIF
         581             :
         582           0 :     CALL ExtDat_Init ( ExtState%NO2, RC )
         583           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         584           0 :         CALL HCO_ERROR( 'ERROR 43', RC, THISLOC=LOC )
         585           0 :         RETURN
         586             :     ENDIF
         587             :
         588           0 :     CALL ExtDat_Init ( ExtState%HNO3, RC )
         589           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         590           0 :         CALL HCO_ERROR( 'ERROR 44', RC, THISLOC=LOC )
         591           0 :         RETURN
         592             :     ENDIF
         593             :
         594           0 :     CALL ExtDat_Init ( ExtState%POPG, RC )
         595           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         596           0 :         CALL HCO_ERROR( 'ERROR 45', RC, THISLOC=LOC )
         597           0 :         RETURN
         598             :     ENDIF
         599             :
         600           0 :     CALL ExtDat_Init ( ExtState%DRY_TOTN, RC )
         601           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         602           0 :         CALL HCO_ERROR( 'ERROR 46', RC, THISLOC=LOC )
         603           0 :         RETURN
         604             :     ENDIF
         605             :
         606           0 :     CALL ExtDat_Init ( ExtState%WET_TOTN, RC )
         607           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         608           0 :         CALL HCO_ERROR( 'ERROR 47', RC, THISLOC=LOC )
         609           0 :         RETURN
         610             :     ENDIF
         611             :
         612           0 :     CALL ExtDat_Init ( ExtState%BYNCY, RC )
         613           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         614           0 :         CALL HCO_ERROR( 'ERROR 48', RC, THISLOC=LOC )
         615           0 :         RETURN
         616             :     ENDIF
         617             :
         618           0 :     CALL ExtDat_Init ( ExtState%LFR, RC )
         619           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         620           0 :         CALL HCO_ERROR( 'ERROR 49', RC, THISLOC=LOC )
         621           0 :         RETURN
         622             :     ENDIF
         623             :
         624           0 :     CALL ExtDat_Init ( ExtState%CNV_FRC, RC )
         625           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         626           0 :         CALL HCO_ERROR( 'ERROR 50', RC, THISLOC=LOC )
         627           0 :         RETURN
         628             :     ENDIF
         629             :
         630           0 :     CALL ExtDat_Init ( ExtState%TropLev, RC )
         631           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         632           0 :         CALL HCO_ERROR( 'ERROR 51', RC, THISLOC=LOC )
         633           0 :         RETURN
         634             :     ENDIF
         635             :
         636             :     ! Return w/ success
         637           0 :     RC = HCO_SUCCESS
         638             :
         639             :   END SUBROUTINE ExtStateInit
         640             : !EOC
         641             : !------------------------------------------------------------------------------
         642             : !                   Harmonized Emissions Component (HEMCO)                    !
         643             : !------------------------------------------------------------------------------
         644             : !BOP
         645             : !
         646             : ! !IROUTINE: ExtStateFinal
         647             : !
         648             : ! !DESCRIPTION: Finalizes the ExtState object. This removes all defined
         649             : !  pointer links (i.e. nullifies ExtDat\%Arr), but does not deallocate
         650             : !  the target array!
         651             : !\\
         652             : !\\
         653             : ! !INTERFACE:
         654             : !
         655           0 :   SUBROUTINE ExtStateFinal( ExtState )
         656             : !
         657             : ! !INPUT PARAMETERS:
         658             : !
         659             :     TYPE(Ext_State), POINTER  :: ExtState
         660             : !
         661             : ! !REVISION HISTORY:
         662             : !  03 Oct 2013 - C. Keller - Initial version
         663             : !  See https://github.com/geoschem/hemco for complete history
         664             : !EOP
         665             : !------------------------------------------------------------------------------
         666             : !BOC
         667             :     !======================================================================
         668             :     ! ExtStateFinal begins here
         669             :     !======================================================================
         670             :
         671           0 :     IF ( ASSOCIATED(ExtState) ) THEN
         672             :
         673             :        ! Cleanup arrays. Don't do deepclean, i.e. only nullify pointers!
         674           0 :        CALL ExtDat_Cleanup( ExtState%U10M       )
         675           0 :        CALL ExtDat_Cleanup( ExtState%V10M       )
         676           0 :        CALL ExtDat_Cleanup( ExtState%ALBD       )
         677           0 :        CALL ExtDat_Cleanup( ExtState%T2M        )
         678           0 :        CALL ExtDat_Cleanup( ExtState%TSKIN      )
         679           0 :        CALL ExtDat_Cleanup( ExtState%GWETROOT   )
         680           0 :        CALL ExtDat_Cleanup( ExtState%GWETTOP    )
         681           0 :        CALL ExtDat_Cleanup( ExtState%SNOWHGT    )
         682           0 :        CALL ExtDat_Cleanup( ExtState%SNODP      )
         683           0 :        CALL ExtDat_Cleanup( ExtState%SNICE      )
         684           0 :        CALL ExtDat_Cleanup( ExtState%USTAR      )
         685           0 :        CALL ExtDat_Cleanup( ExtState%Z0         )
         686           0 :        CALL ExtDat_Cleanup( ExtState%TROPP      )
         687           0 :        CALL ExtDat_Cleanup( ExtState%SUNCOS     )
         688           0 :        CALL ExtDat_Cleanup( ExtState%SZAFACT    )
         689           0 :        CALL ExtDat_Cleanup( ExtState%PARDR      )
         690           0 :        CALL ExtDat_Cleanup( ExtState%PARDF      )
         691           0 :        CALL ExtDat_Cleanup( ExtState%PSC2_WET   )
         692           0 :        CALL ExtDat_Cleanup( ExtState%RADSWG     )
         693           0 :        CALL ExtDat_Cleanup( ExtState%FRCLND     )
         694           0 :        CALL ExtDat_Cleanup( ExtState%FRLAND     )
         695           0 :        CALL ExtDat_Cleanup( ExtState%FROCEAN    )
         696           0 :        CALL ExtDat_Cleanup( ExtState%FRSEAICE   )
         697           0 :        CALL ExtDat_Cleanup( ExtState%QV2M       )
         698           0 :        CALL ExtDat_Cleanup( ExtState%FRLAKE     )
         699           0 :        CALL ExtDat_Cleanup( ExtState%FRLANDIC   )
         700           0 :        CALL ExtDat_Cleanup( ExtState%CLDFRC     )
         701           0 :        CALL ExtDat_Cleanup( ExtState%LAI        )
         702           0 :        CALL ExtDat_Cleanup( ExtState%CHLR       )
         703           0 :        CALL ExtDat_Cleanup( ExtState%FLASH_DENS )
         704           0 :        CALL ExtDat_Cleanup( ExtState%CONV_DEPTH )
         705           0 :        CALL ExtDat_Cleanup( ExtState%JNO2       )
         706           0 :        CALL ExtDat_Cleanup( ExtState%JOH        )
         707           0 :        CALL ExtDat_Cleanup( ExtState%CNV_MFC    )
         708           0 :        CALL ExtDat_Cleanup( ExtState%FRAC_OF_PBL)
         709           0 :        CALL ExtDat_Cleanup( ExtState%SPHU       )
         710           0 :        CALL ExtDat_Cleanup( ExtState%TK         )
         711           0 :        CALL ExtDat_Cleanup( ExtState%AIR        )
         712           0 :        CALL ExtDat_Cleanup( ExtState%AIRVOL     )
         713           0 :        CALL ExtDat_Cleanup( ExtState%AIRDEN     )
         714           0 :        CALL ExtDat_Cleanup( ExtState%O3         )
         715           0 :        CALL ExtDat_Cleanup( ExtState%NO         )
         716           0 :        CALL ExtDat_Cleanup( ExtState%NO2        )
         717           0 :        CALL ExtDat_Cleanup( ExtState%HNO3       )
         718           0 :        CALL ExtDat_Cleanup( ExtState%POPG       )
         719           0 :        CALL ExtDat_Cleanup( ExtState%DRY_TOTN   )
         720           0 :        CALL ExtDat_Cleanup( ExtState%WET_TOTN   )
         721           0 :        CALL ExtDat_Cleanup( ExtState%CNV_FRC    )
         722           0 :        CALL ExtDat_Cleanup( ExtState%BYNCY      )
         723           0 :        CALL ExtDat_Cleanup( ExtState%LFR        )
         724           0 :        CALL ExtDat_Cleanup( ExtState%TropLev    )
         725             :
         726           0 :        ExtState%DRYCOEFF   => NULL()
         727           0 :        ExtState%PBL_MAX    => NULL()
         728             :
         729             :     ENDIF
         730             :
         731           0 :   END SUBROUTINE ExtStateFinal
         732             : !EOC
         733             : !------------------------------------------------------------------------------
         734             : !                   Harmonized Emissions Component (HEMCO)                    !
         735             : !------------------------------------------------------------------------------
         736             : !BOP
         737             : !
         738             : ! !IROUTINE: ExtDat_Init_2R
         739             : !
         740             : ! !DESCRIPTION: Subroutine ExtDat\_Init\_2R initializes the given ExtDat type.
         741             : !\\
         742             : !\\
         743             : ! !INTERFACE:
         744             : !
         745           0 :   SUBROUTINE ExtDat_Init_2R ( ExtDat, RC )
         746             : !
         747             : ! !INPUT PARAMETERS:
         748             : !
         749             :     TYPE(ExtDat_2R), POINTER       :: ExtDat
         750             :     INTEGER,         INTENT(INOUT) :: RC        ! Return code
         751             : !
         752             : ! !REVISION HISTORY:
         753             : !  20 Apr 2013 - C. Keller - Initial version
         754             : !  See https://github.com/geoschem/hemco for complete history
         755             : !EOP
         756             : !------------------------------------------------------------------------------
         757             : !BOC
         758             : !
         759             : ! !LOCAL VARIABLES:
         760             : !
         761             :     CHARACTER(LEN=255)  :: LOC
         762             :
         763             :     ! ================================================================
         764             :     ! ExtDat_Init_2R begins here
         765             :     ! ================================================================
         766           0 :     LOC = 'ExtDat_Init_2R (HCOX_STATE_MOD.F90)'
         767             :
         768           0 :     ExtDat     => NULL()
         769           0 :     ALLOCATE(ExtDat)
         770           0 :     ExtDat%Arr => NULL()
         771             :
         772             :     ! Establish pointer to ExtDat%Arr%Val
         773           0 :     CALL HCO_ArrInit( ExtDat%Arr, 0, 0, RC )
         774           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         775           0 :         CALL HCO_ERROR( 'ERROR 52', RC, THISLOC=LOC )
         776           0 :         RETURN
         777             :     ENDIF
         778             :
         779           0 :     ExtDat%DoUse = .FALSE.
         780           0 :     ExtDat%FromList = .FALSE.
         781             :
         782             :     ! Leave
         783           0 :     RC = HCO_SUCCESS
         784             :
         785             :   END SUBROUTINE ExtDat_Init_2R
         786             : !EOC
         787             : !------------------------------------------------------------------------------
         788             : !                   Harmonized Emissions Component (HEMCO)                    !
         789             : !------------------------------------------------------------------------------
         790             : !BOP
         791             : !
         792             : ! !IROUTINE: ExtDat_Init_2S
         793             : !
         794             : ! !DESCRIPTION: Subroutine ExtDat\_Init\_2S initializes the given ExtDat type.
         795             : !\\
         796             : !\\
         797             : ! !INTERFACE:
         798             : !
         799           0 :   SUBROUTINE ExtDat_Init_2S ( ExtDat, RC )
         800             : !
         801             : ! !INPUT PARAMETERS:
         802             : !
         803             :     TYPE(ExtDat_2S), POINTER       :: ExtDat
         804             :     INTEGER,         INTENT(INOUT) :: RC        ! Return code
         805             : !
         806             : ! !REVISION HISTORY:
         807             : !  20 Apr 2013 - C. Keller - Initial version
         808             : !  See https://github.com/geoschem/hemco for complete history
         809             : !EOP
         810             : !------------------------------------------------------------------------------
         811             : !BOC
         812             : !
         813             : ! !LOCAL VARIABLES:
         814             : !
         815             :     CHARACTER(LEN=255)  :: LOC
         816             :
         817             :     ! ================================================================
         818             :     ! ExtDat_Init_2S begins here
         819             :     ! ================================================================
         820           0 :     LOC = 'ExtDat_Init_2S (HCOX_STATE_MOD.F90)'
         821             :
         822           0 :     ExtDat     => NULL()
         823           0 :     ALLOCATE(ExtDat)
         824           0 :     ExtDat%Arr => NULL()
         825             :
         826             :     ! Establish pointer to ExtDat%Arr%Val
         827           0 :     CALL HCO_ArrInit( ExtDat%Arr, 0, 0, RC )
         828           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         829           0 :         CALL HCO_ERROR( 'ERROR 53', RC, THISLOC=LOC )
         830           0 :         RETURN
         831             :     ENDIF
         832             :
         833           0 :     ExtDat%DoUse = .FALSE.
         834           0 :     ExtDat%FromList = .FALSE.
         835             :
         836             :     ! Leave
         837           0 :     RC = HCO_SUCCESS
         838             :
         839             :   END SUBROUTINE ExtDat_Init_2S
         840             : !EOC
         841             : !------------------------------------------------------------------------------
         842             : !                   Harmonized Emissions Component (HEMCO)                    !
         843             : !------------------------------------------------------------------------------
         844             : !BOP
         845             : !
         846             : ! !IROUTINE: ExtDat_Init_2I
         847             : !
         848             : ! !DESCRIPTION: Subroutine ExtDat\_Init\_2I initializes the given ExtDat type.
         849             : !\\
         850             : !\\
         851             : ! !INTERFACE:
         852             : !
         853           0 :   SUBROUTINE ExtDat_Init_2I ( ExtDat, RC )
         854             : !
         855             : ! !INPUT PARAMETERS:
         856             : !
         857             :     TYPE(ExtDat_2I), POINTER       :: ExtDat
         858             :     INTEGER,         INTENT(INOUT) :: RC        ! Return code
         859             : !
         860             : ! !REVISION HISTORY:
         861             : !  20 Apr 2013 - C. Keller - Initial version
         862             : !  See https://github.com/geoschem/hemco for complete history
         863             : !EOP
         864             : !------------------------------------------------------------------------------
         865             : !BOC
         866             : !
         867             : ! !LOCAL VARIABLES:
         868             : !
         869             :     CHARACTER(LEN=255)  :: LOC
         870             :
         871             :     ! ================================================================
         872             :     ! ExtDat_Init_2I begins here
         873             :     ! ================================================================
         874           0 :     LOC = 'ExtDat_Init_2I (HCOX_STATE_MOD.F90)'
         875             :
         876           0 :     ExtDat => NULL()
         877           0 :     ALLOCATE(ExtDat)
         878           0 :     ExtDat%Arr => NULL()
         879             :
         880             :     ! Establish pointer to ExtDat%Arr%Val
         881           0 :     CALL HCO_ArrInit( ExtDat%Arr, 0, 0, RC )
         882           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         883           0 :         CALL HCO_ERROR( 'ERROR 54', RC, THISLOC=LOC )
         884           0 :         RETURN
         885             :     ENDIF
         886             :
         887           0 :     ExtDat%DoUse = .FALSE.
         888           0 :     ExtDat%FromList = .FALSE.
         889             :
         890             :     ! Leave
         891           0 :     RC = HCO_SUCCESS
         892             :
         893             :   END SUBROUTINE ExtDat_Init_2I
         894             : !EOC
         895             : !------------------------------------------------------------------------------
         896             : !                   Harmonized Emissions Component (HEMCO)                    !
         897             : !------------------------------------------------------------------------------
         898             : !BOP
         899             : !
         900             : ! !IROUTINE: ExtDat_Init_3R
         901             : !
         902             : ! !DESCRIPTION: Subroutine ExtDat\_Init\_3R initializes the given ExtDat type.
         903             : !\\
         904             : !\\
         905             : ! !INTERFACE:
         906             : !
         907           0 :   SUBROUTINE ExtDat_Init_3R ( ExtDat, RC )
         908             : !
         909             : ! !INPUT PARAMETERS:
         910             : !
         911             :     TYPE(ExtDat_3R), POINTER       :: ExtDat
         912             :     INTEGER,         INTENT(INOUT) :: RC        ! Return code
         913             : !
         914             : ! !REVISION HISTORY:
         915             : !  20 Apr 2013 - C. Keller - Initial version
         916             : !  See https://github.com/geoschem/hemco for complete history
         917             : !EOP
         918             : !------------------------------------------------------------------------------
         919             : !BOC
         920             : !
         921             : ! !LOCAL VARIABLES:
         922             : !
         923             :     CHARACTER(LEN=255)  :: LOC
         924             :     ! ================================================================
         925             :     ! ExtDat_Init_3R begins here
         926             :     ! ================================================================
         927           0 :     LOC = 'ExtDat_Init_3R (HCOX_STATE_MOD.F90)'
         928             :
         929           0 :     ExtDat => NULL()
         930           0 :     ALLOCATE(ExtDat)
         931           0 :     ExtDat%Arr => NULL()
         932             :
         933             :     ! Establish pointer to ExtDat%Arr%Val
         934           0 :     CALL HCO_ArrInit( ExtDat%Arr, 0, 0, 0, RC )
         935           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         936           0 :         CALL HCO_ERROR( 'ERROR 55', RC, THISLOC=LOC )
         937           0 :         RETURN
         938             :     ENDIF
         939             :
         940           0 :     ExtDat%DoUse = .FALSE.
         941           0 :     ExtDat%FromList = .FALSE.
         942             :
         943             :     ! Leave
         944           0 :     RC = HCO_SUCCESS
         945             :
         946             :   END SUBROUTINE ExtDat_Init_3R
         947             : !EOC
         948             : !------------------------------------------------------------------------------
         949             : !                   Harmonized Emissions Component (HEMCO)                    !
         950             : !------------------------------------------------------------------------------
         951             : !BOP
         952             : !
         953             : ! !IROUTINE: ExtDat_Init_3S
         954             : !
         955             : ! !DESCRIPTION: Subroutine ExtDat\_Init\_3S initializes the given ExtDat type.
         956             : !\\
         957             : !\\
         958             : ! !INTERFACE:
         959             : !
         960           0 :   SUBROUTINE ExtDat_Init_3S ( ExtDat, RC )
         961             : !
         962             : ! !INPUT PARAMETERS:
         963             : !
         964             :     TYPE(ExtDat_3S), POINTER       :: ExtDat
         965             :     INTEGER,         INTENT(INOUT) :: RC        ! Return code
         966             : !
         967             : ! !REVISION HISTORY:
         968             : !  20 Apr 2013 - C. Keller - Initial version
         969             : !  See https://github.com/geoschem/hemco for complete history
         970             : !EOP
         971             : !------------------------------------------------------------------------------
         972             : !BOC
         973             : !
         974             : ! !LOCAL VARIABLES:
         975             : !
         976             :     CHARACTER(LEN=255)  :: LOC
         977             :     ! ================================================================
         978             :     ! ExtDat_Init_3S begins here
         979             :     ! ================================================================
         980           0 :     LOC = 'ExtDat_Init_3S (HCOX_STATE_MOD.F90)'
         981             :
         982           0 :     ExtDat => NULL()
         983           0 :     ALLOCATE(ExtDat)
         984           0 :     ExtDat%Arr => NULL()
         985             :
         986             :     ! Establish pointer to ExtDat%Arr%Val
         987           0 :     CALL HCO_ArrInit( ExtDat%Arr, 0, 0, 0, RC )
         988           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         989           0 :         CALL HCO_ERROR( 'ERROR 56', RC, THISLOC=LOC )
         990           0 :         RETURN
         991             :     ENDIF
         992             :
         993           0 :     ExtDat%DoUse = .FALSE.
         994           0 :     ExtDat%FromList = .FALSE.
         995             :
         996             :     ! Leave
         997           0 :     RC = HCO_SUCCESS
         998             :
         999             :   END SUBROUTINE ExtDat_Init_3S
        1000             : !EOC
        1001             : !------------------------------------------------------------------------------
        1002             : !                   Harmonized Emissions Component (HEMCO)                    !
        1003             : !------------------------------------------------------------------------------
        1004             : !BOP
        1005             : !
        1006             : ! !IROUTINE: ExtDat_Cleanup_2R
        1007             : !
        1008             : ! !DESCRIPTION: Subroutine ExtDat\_Cleanup\_2R removes the given ExtDat type.
        1009             : !\\
        1010             : !\\
        1011             : ! !INTERFACE:
        1012             : !
        1013           0 :   SUBROUTINE ExtDat_Cleanup_2R ( ExtDat )
        1014             : !
        1015             : ! !INPUT PARAMETERS:
        1016             : !
        1017             :     TYPE(ExtDat_2R), POINTER       :: ExtDat
        1018             : !
        1019             : ! !REVISION HISTORY:
        1020             : !  20 Apr 2013 - C. Keller - Initial version
        1021             : !  See https://github.com/geoschem/hemco for complete history
        1022             : !EOP
        1023             : !------------------------------------------------------------------------------
        1024             : !BOC
        1025             :     ! ================================================================
        1026             :     ! ExtDat_Cleanup_2R begins here
        1027             :     ! ================================================================
        1028             :
        1029           0 :     IF ( ASSOCIATED( ExtDat) ) THEN
        1030           0 :        CALL HCO_ArrCleanup( ExtDat%Arr, DeepClean=.TRUE. )
        1031           0 :        DEALLOCATE ( ExtDat )
        1032             :     ENDIF
        1033             :
        1034           0 :   END SUBROUTINE ExtDat_Cleanup_2R
        1035             : !EOC
        1036             : !------------------------------------------------------------------------------
        1037             : !                   Harmonized Emissions Component (HEMCO)                    !
        1038             : !------------------------------------------------------------------------------
        1039             : !BOP
        1040             : !
        1041             : ! !IROUTINE: ExtDat_Cleanup_2S
        1042             : !
        1043             : ! !DESCRIPTION: Subroutine ExtDat\_Cleanup\_2S removes the given ExtDat type.
        1044             : !\\
        1045             : !\\
        1046             : ! !INTERFACE:
        1047             : !
        1048           0 :   SUBROUTINE ExtDat_Cleanup_2S ( ExtDat )
        1049             : !
        1050             : ! !INPUT PARAMETERS:
        1051             : !
        1052             :     TYPE(ExtDat_2S), POINTER       :: ExtDat
        1053             : !
        1054             : ! !REVISION HISTORY:
        1055             : !  20 Apr 2013 - C. Keller - Initial version
        1056             : !  See https://github.com/geoschem/hemco for complete history
        1057             : !EOP
        1058             : !------------------------------------------------------------------------------
        1059             : !BOC
        1060             :     ! ================================================================
        1061             :     ! ExtDat_Cleanup_2S begins here
        1062             :     ! ================================================================
        1063             :
        1064           0 :     IF ( ASSOCIATED( ExtDat) ) THEN
        1065           0 :        CALL HCO_ArrCleanup( ExtDat%Arr, DeepClean=.TRUE. )
        1066           0 :        DEALLOCATE ( ExtDat )
        1067             :     ENDIF
        1068             :
        1069           0 :   END SUBROUTINE ExtDat_Cleanup_2S
        1070             : !EOC
        1071             : !------------------------------------------------------------------------------
        1072             : !                   Harmonized Emissions Component (HEMCO)                    !
        1073             : !------------------------------------------------------------------------------
        1074             : !BOP
        1075             : !
        1076             : ! !IROUTINE: ExtDat_Cleanup_2I
        1077             : !
        1078             : ! !DESCRIPTION: Subroutine ExtDat\_Cleanup\_2I removes the given ExtDat type.
        1079             : !\\
        1080             : !\\
        1081             : ! !INTERFACE:
        1082             : !
        1083           0 :   SUBROUTINE ExtDat_Cleanup_2I ( ExtDat )
        1084             : !
        1085             : ! !INPUT PARAMETERS:
        1086             : !
        1087             :     TYPE(ExtDat_2I), POINTER       :: ExtDat
        1088             : !
        1089             : ! !REVISION HISTORY:
        1090             : !  20 Apr 2013 - C. Keller - Initial version
        1091             : !  See https://github.com/geoschem/hemco for complete history
        1092             : !EOP
        1093             : !------------------------------------------------------------------------------
        1094             : !BOC
        1095             :     ! ================================================================
        1096             :     ! ExtDat_Cleanup_2I begins here
        1097             :     ! ================================================================
        1098             :
        1099           0 :     IF ( ASSOCIATED( ExtDat) ) THEN
        1100           0 :        CALL HCO_ArrCleanup( ExtDat%Arr, DeepClean=.TRUE. )
        1101           0 :        DEALLOCATE ( ExtDat )
        1102             :     ENDIF
        1103             :
        1104           0 :   END SUBROUTINE ExtDat_Cleanup_2I
        1105             : !EOC
        1106             : !------------------------------------------------------------------------------
        1107             : !                   Harmonized Emissions Component (HEMCO)                    !
        1108             : !------------------------------------------------------------------------------
        1109             : !BOP
        1110             : !
        1111             : ! !IROUTINE: ExtDat_Cleanup_3R
        1112             : !
        1113             : ! !DESCRIPTION: Subroutine ExtDat\_Cleanup\_3R removes the given ExtDat type.
        1114             : !\\
        1115             : !\\
        1116             : ! !INTERFACE:
        1117             : !
        1118           0 :   SUBROUTINE ExtDat_Cleanup_3R( ExtDat )
        1119             : !
        1120             : ! !INPUT PARAMETERS:
        1121             : !
        1122             :     TYPE(ExtDat_3R), POINTER       :: ExtDat
        1123             : !
        1124             : ! !REVISION HISTORY:
        1125             : !  20 Apr 2013 - C. Keller - Initial version
        1126             : !  See https://github.com/geoschem/hemco for complete history
        1127             : !EOP
        1128             : !------------------------------------------------------------------------------
        1129             : !BOC
        1130             :     ! ================================================================
        1131             :     ! ExtDat_Cleanup_3R begins here
        1132             :     ! ================================================================
        1133             :
        1134           0 :     IF ( ASSOCIATED( ExtDat) ) THEN
        1135           0 :        CALL HCO_ArrCleanup( ExtDat%Arr, DeepClean=.TRUE. )
        1136           0 :        DEALLOCATE ( ExtDat )
        1137             :     ENDIF
        1138             :
        1139           0 :   END SUBROUTINE ExtDat_Cleanup_3R
        1140             : !EOC
        1141             : !------------------------------------------------------------------------------
        1142             : !                   Harmonized Emissions Component (HEMCO)                    !
        1143             : !------------------------------------------------------------------------------
        1144             : !BOP
        1145             : !
        1146             : ! !IROUTINE: ExtDat_Cleanup_3S
        1147             : !
        1148             : ! !DESCRIPTION: Subroutine ExtDat\_Cleanup\_3S removes the given ExtDat type.
        1149             : !\\
        1150             : !\\
        1151             : ! !INTERFACE:
        1152             : !
        1153           0 :   SUBROUTINE ExtDat_Cleanup_3S( ExtDat )
        1154             : !
        1155             : ! !INPUT PARAMETERS:
        1156             : !
        1157             :     TYPE(ExtDat_3S), POINTER       :: ExtDat
        1158             : !
        1159             : ! !REVISION HISTORY:
        1160             : !  20 Apr 2013 - C. Keller - Initial version
        1161             : !  See https://github.com/geoschem/hemco for complete history
        1162             : !EOP
        1163             : !------------------------------------------------------------------------------
        1164             : !BOC
        1165             :     ! ================================================================
        1166             :     ! ExtDat_Cleanup_3S begins here
        1167             :     ! ================================================================
        1168             :
        1169           0 :     IF ( ASSOCIATED( ExtDat) ) THEN
        1170           0 :        CALL HCO_ArrCleanup( ExtDat%Arr, DeepClean=.TRUE. )
        1171           0 :        DEALLOCATE ( ExtDat )
        1172             :     ENDIF
        1173             :
        1174           0 :   END SUBROUTINE ExtDat_Cleanup_3S
        1175             : !EOC
        1176             : !------------------------------------------------------------------------------
        1177             : !                   Harmonized Emissions Component (HEMCO)                    !
        1178             : !------------------------------------------------------------------------------
        1179             : !BOP
        1180             : !
        1181             : ! !IROUTINE: ExtDat_Set_2R
        1182             : !
        1183             : ! !DESCRIPTION: Subroutine ExtDat\_Set\_2R sets/updates the data array of an
        1184             : ! ExtDat object.
        1185             : !\\
        1186             : !\\
        1187             : ! !INTERFACE:
        1188             : !
        1189           0 :   SUBROUTINE ExtDat_Set_2R ( HcoState, ExtDat,           &
        1190             :                              FldName,  RC,     First,    &
        1191             :                              Trgt,     Filled, NotFillOk )
        1192             : !
        1193             : ! !USES:
        1194             : !
        1195             :     USE HCO_ARR_MOD,        ONLY : HCO_ArrAssert
        1196             :     USE HCO_STATE_MOD,      ONLY : HCO_State
        1197             :     USE HCO_CALC_MOD,       ONLY : HCO_EvalFld
        1198             : !
        1199             : ! !INPUT PARAMETERS:
        1200             : !
        1201             :     TYPE(HCO_State),  POINTER                         :: HcoState
        1202             :     TYPE(ExtDat_2R),  POINTER                         :: ExtDat
        1203             :     CHARACTER(LEN=*), INTENT(IN   )                   :: FldName
        1204             :     INTEGER,          INTENT(INOUT)                   :: RC
        1205             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: First
        1206             :     REAL(hp),         POINTER      , OPTIONAL         :: Trgt(:,:)
        1207             :     LOGICAL,          INTENT(  OUT), OPTIONAL         :: Filled
        1208             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: NotFillOk
        1209             : !
        1210             : ! !REVISION HISTORY:
        1211             : !  03 Apr 2015 - C. Keller - Initial version
        1212             : !  See https://github.com/geoschem/hemco for complete history
        1213             : !EOP
        1214             : !------------------------------------------------------------------------------
        1215             : !BOC
        1216             : !
        1217             : ! !LOCAL VARIABLES:
        1218             : !
        1219             :     INTEGER                :: AS, NX, NY
        1220           0 :     REAL(hp), ALLOCATABLE  :: Arr2D(:,:)
        1221             :     CHARACTER(LEN=255)     :: MSG
        1222             :     CHARACTER(LEN=255)     :: LOC = 'ExtDat_Set_2R (hcox_state_mod.F90)'
        1223             :     LOGICAL                :: FRST
        1224             :     LOGICAL                :: FOUND
        1225             :     LOGICAL                :: FailIfNotFilled
        1226             :
        1227             :     ! ================================================================
        1228             :     ! ExtDat_Set_2R begins here
        1229             :     ! ================================================================
        1230             :
        1231             :     ! Initialize
        1232           0 :     RC = HCO_SUCCESS
        1233           0 :     IF ( PRESENT(Filled) ) Filled = .FALSE.
        1234             :
        1235             :     ! Nothing to do if this ExtDat field is not in use
        1236           0 :     IF ( .NOT. ExtDat%DoUse ) RETURN
        1237             :
        1238             :     ! Check for fill requirement
        1239           0 :     IF ( PRESENT(NotFillOk) ) THEN
        1240           0 :        FailIfNotFilled = .NOT. NotFillOk
        1241             :     ELSE
        1242             :        FailIfNotFilled = .TRUE.
        1243             :     ENDIF
        1244             :
        1245             :     ! First time
        1246           0 :     IF ( PRESENT(FIRST) ) THEN
        1247           0 :        FRST = FIRST
        1248             :     ELSE
        1249             :        FRST = .FALSE.
        1250             :     ENDIF
        1251             :
        1252             :     ! On first call or if data is flagged as being read from list, get data
        1253             :     ! from emissions list
        1254           0 :     IF ( FRST .OR. ExtDat%FromList ) THEN
        1255             :
        1256             :        ! Allocate temporary array
        1257           0 :        ALLOCATE(Arr2D(HcoState%NX,HcoState%NY),STAT=AS)
        1258           0 :        IF ( AS /= 0 ) THEN
        1259           0 :           CALL HCO_ERROR ( "Arr2D allocation error", RC, THISLOC=LOC )
        1260           0 :           RETURN
        1261             :        ENDIF
        1262             :
        1263             :        ! Try to get data from list
        1264           0 :        CALL HCO_EvalFld( HcoState, TRIM(FldName), Arr2D, RC, FOUND=FOUND )
        1265           0 :        IF ( RC /= HCO_SUCCESS ) THEN
        1266           0 :            CALL HCO_ERROR( 'ERROR 57', RC, THISLOC=LOC )
        1267           0 :            RETURN
        1268             :        ENDIF
        1269             :
        1270             :        ! On first call, need to make additional checks
        1271           0 :        IF ( FRST ) THEN
        1272             :
        1273             :           ! If read from list
        1274           0 :           IF ( FOUND ) THEN
        1275           0 :              ExtDat%FromList = .TRUE.
        1276             :
        1277             :              ! Make sure array is allocated
        1278           0 :              CALL HCO_ArrAssert( ExtDat%Arr, HcoState%NX, HcoState%NY, RC )
        1279           0 :              IF ( RC /= HCO_SUCCESS ) THEN
        1280           0 :                  CALL HCO_ERROR( 'ERROR 58', RC, THISLOC=LOC )
        1281           0 :                  RETURN
        1282             :              ENDIF
        1283             :
        1284             :              ! Verbose
        1285           0 :              IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1286           0 :                 MSG = 'Will fill extension field from HEMCO data list field ' // TRIM(FldName)
        1287           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
        1288             :              ENDIF
        1289             :
        1290             :           ! Target to data
        1291           0 :           ELSEIF ( PRESENT(Trgt) ) THEN
        1292             :
        1293             :              ! If target is not associated:
        1294           0 :              IF ( .NOT. ASSOCIATED(Trgt) ) THEN
        1295           0 :                 IF ( FailIfNotFilled ) THEN
        1296             :                    MSG = 'Cannot fill extension field ' // TRIM(FldName) // &
        1297           0 :                          ' because target field is not associated.'
        1298           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1299           0 :                    RETURN
        1300             :                 ENDIF
        1301             :
        1302             :              ! If target is associated:
        1303             :              ELSE
        1304             :
        1305             :                 ! Make sure dimensions agree
        1306           0 :                 NX = SIZE(Trgt,1)
        1307           0 :                 NY = SIZE(Trgt,2)
        1308             :
        1309             :                 ! Must cover the horizontal grid
        1310           0 :                 IF ( (NX/=HcoState%NX) .OR. (NY/=HcoState%NY) ) THEN
        1311           0 :                    WRITE(MSG,*) 'Horizontal dimensions of target data do not ', &
        1312           0 :                       'correspond to simulation grid: ', &
        1313           0 :                       'Expected dimensions: ', HcoState%NX, HcoState%NY, &
        1314           0 :                       '; encountered dimensions: ', NX, NY, '. Error occured ', &
        1315           0 :                       'for field ', TRIM(FldName)
        1316           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1317           0 :                    RETURN
        1318             :                 ENDIF
        1319             :
        1320             :                 ! Link data to target
        1321           0 :                 ExtDat%Arr%Val => Trgt
        1322             :
        1323             :                 ! Make sure it's not from list
        1324           0 :                 ExtDat%FromList = .FALSE.
        1325             :
        1326             :                 ! This array is now filled
        1327           0 :                 IF ( PRESENT(Filled) ) Filled = .TRUE.
        1328             :
        1329             :                 ! Verbose
        1330           0 :                 IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1331           0 :                    MSG = 'Set extension field pointer to external data: ' // TRIM(FldName)
        1332           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG)
        1333             :                 ENDIF
        1334             :              ENDIF
        1335             :
        1336             :           ! Field not found and no target defined
        1337           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1338           0 :              MSG = 'Cannot fill extension field ' // TRIM(FldName)
        1339           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1340           0 :              RETURN
        1341             :           ENDIF
        1342             :        ENDIF ! FIRST
        1343             :
        1344             :        ! Eventually copy field from HEMCO list to ExtState. We need to
        1345             :        ! make a copy and cannot just set a pointer because ExtState fields
        1346             :        ! are in HEMCO precision but the EmisList fields are in single
        1347             :        ! precisions.
        1348           0 :        IF ( ExtDat%FromList ) THEN
        1349           0 :           IF ( FOUND ) THEN
        1350             :              ! Copy values and mark array as filled
        1351           0 :              ExtDat%Arr%Val(:,:) = Arr2D(:,:)
        1352           0 :              IF ( PRESENT(Filled) ) Filled = .TRUE.
        1353           0 :           ELSEIF ( FailIfNotFilled ) Then
        1354           0 :              MSG = 'Cannot find extension field in HEMCO data list: ' // TRIM(FldName)
        1355           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1356           0 :              RETURN
        1357             :           ENDIF
        1358             :        ENDIF ! FromList
        1359             :     ENDIF
        1360             :
        1361             :     ! Make sure array exists
        1362           0 :     IF ( FailIfNotFilled .AND. .NOT. ASSOCIATED(ExtDat%Arr%Val) ) THEN
        1363           0 :        MSG = 'ExtState array not filled: ' // TRIM(FldName)
        1364           0 :        CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1365             :     ENDIF
        1366             :
        1367             :     ! Cleanup
        1368           0 :     IF ( ALLOCATED(Arr2D) ) DEALLOCATE(Arr2D)
        1369             :
        1370             :     ! Return w/ success
        1371           0 :     RC = HCO_SUCCESS
        1372             :
        1373           0 :   END SUBROUTINE ExtDat_Set_2R
        1374             : !EOC
        1375             : !------------------------------------------------------------------------------
        1376             : !                   Harmonized Emissions Component (HEMCO)                    !
        1377             : !------------------------------------------------------------------------------
        1378             : !BOP
        1379             : !
        1380             : ! !IROUTINE: ExtDat_Set_2S
        1381             : !
        1382             : ! !DESCRIPTION: Subroutine ExtDat\_Set\_2S sets/updates the data array of an
        1383             : ! ExtDat object.
        1384             : !\\
        1385             : !\\
        1386             : ! !INTERFACE:
        1387             : !
        1388           0 :   SUBROUTINE ExtDat_Set_2S ( HcoState, ExtDat,           &
        1389             :                              FldName,  RC,     First,    &
        1390             :                              Trgt,     Filled, NotFillOk )
        1391             : !
        1392             : ! !USES:
        1393             : !
        1394             :     USE HCO_ARR_MOD,        ONLY : HCO_ArrAssert
        1395             :     USE HCO_STATE_MOD,      ONLY : HCO_State
        1396             :     USE HCO_CALC_MOD,       ONLY : HCO_EvalFld
        1397             : !
        1398             : ! !INPUT PARAMETERS:
        1399             : !
        1400             :     TYPE(HCO_State),  POINTER                         :: HcoState
        1401             :     TYPE(ExtDat_2S),  POINTER                         :: ExtDat
        1402             :     CHARACTER(LEN=*), INTENT(IN   )                   :: FldName
        1403             :     INTEGER,          INTENT(INOUT)                   :: RC
        1404             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: First
        1405             :     REAL(sp),         POINTER      , OPTIONAL         :: Trgt(:,:)
        1406             :     LOGICAL,          INTENT(  OUT), OPTIONAL         :: Filled
        1407             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: NotFillOk
        1408             : !
        1409             : ! !REVISION HISTORY:
        1410             : !  03 Apr 2015 - C. Keller - Initial version
        1411             : !  See https://github.com/geoschem/hemco for complete history
        1412             : !EOP
        1413             : !------------------------------------------------------------------------------
        1414             : !BOC
        1415             : !
        1416             : ! !LOCAL VARIABLES:
        1417             : !
        1418             :     INTEGER                :: AS, NX, NY
        1419           0 :     REAL(hp), ALLOCATABLE  :: Arr2D(:,:)
        1420             :     CHARACTER(LEN=255)     :: MSG
        1421             :     CHARACTER(LEN=255)     :: LOC = 'ExtDat_Set_2S (hcox_state_mod.F90)'
        1422             :     LOGICAL                :: FRST
        1423             :     LOGICAL                :: FOUND
        1424             :     LOGICAL                :: FailIfNotFilled
        1425             :
        1426             :     ! ================================================================
        1427             :     ! ExtDat_Set_2S begins here
        1428             :     ! ================================================================
        1429             :
        1430             :     ! Init
        1431           0 :     RC = HCO_SUCCESS
        1432           0 :     IF ( PRESENT(Filled) ) Filled = .FALSE.
        1433             :
        1434             :     ! Nothing to do if this ExtDat field is not in use
        1435           0 :     IF ( .NOT. ExtDat%DoUse ) RETURN
        1436             :
        1437             :     ! Check for fill requirement
        1438           0 :     IF ( PRESENT(NotFillOk) ) THEN
        1439           0 :        FailIfNotFilled = .NOT. NotFillOk
        1440             :     ELSE
        1441             :        FailIfNotFilled = .TRUE.
        1442             :     ENDIF
        1443             :
        1444             :     ! First time
        1445           0 :     IF ( PRESENT(FIRST) ) THEN
        1446           0 :        FRST = FIRST
        1447             :     ELSE
        1448             :        FRST = .FALSE.
        1449             :     ENDIF
        1450             :
        1451             :     ! On first call or if data is flagged as being read from list, get data
        1452             :     ! from emissions list
        1453           0 :     IF ( FRST .OR. ExtDat%FromList ) THEN
        1454             :
        1455             :        ! Allocate temporary array
        1456           0 :        ALLOCATE(Arr2D(HcoState%NX,HcoState%NY),STAT=AS)
        1457           0 :        IF ( AS /= 0 ) THEN
        1458           0 :           CALL HCO_ERROR ( "Arr2D allocation error", RC, THISLOC=LOC )
        1459           0 :           RETURN
        1460             :        ENDIF
        1461             :
        1462             :        ! Try to get data from list
        1463           0 :        CALL HCO_EvalFld( HcoState, TRIM(FldName), Arr2D, RC, FOUND=FOUND )
        1464           0 :        IF ( RC /= HCO_SUCCESS ) THEN
        1465           0 :            CALL HCO_ERROR( 'ERROR 59', RC, THISLOC=LOC )
        1466           0 :            RETURN
        1467             :        ENDIF
        1468             :
        1469             :        ! On first call, need to make additional checks
        1470           0 :        IF ( FRST ) THEN
        1471             :
        1472             :           ! If read from list
        1473           0 :           IF ( FOUND ) THEN
        1474           0 :              ExtDat%FromList = .TRUE.
        1475             :
        1476             :              ! Make sure array is allocated
        1477           0 :              CALL HCO_ArrAssert( ExtDat%Arr, HcoState%NX, HcoState%NY, RC )
        1478           0 :              IF ( RC /= HCO_SUCCESS ) THEN
        1479           0 :                  CALL HCO_ERROR( 'ERROR 60', RC, THISLOC=LOC )
        1480           0 :                  RETURN
        1481             :              ENDIF
        1482             :
        1483             :              ! Verbose
        1484           0 :              IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1485           0 :                 MSG = 'Will fill extension field from HEMCO data list field ' // TRIM(FldName)
        1486           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
        1487             :              ENDIF
        1488             :
        1489             :           ! Target to data
        1490           0 :           ELSEIF ( PRESENT(Trgt) ) THEN
        1491             :
        1492             :              ! If target is not associated:
        1493           0 :              IF ( .NOT. ASSOCIATED(Trgt) ) THEN
        1494           0 :                 IF ( FailIfNotFilled ) THEN
        1495             :                    MSG = 'Cannot fill extension field ' // TRIM(FldName) // &
        1496           0 :                          ' because target field is not associated.'
        1497           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1498           0 :                    RETURN
        1499             :                 ENDIF
        1500             :
        1501             :              ! If target is associated:
        1502             :              ELSE
        1503             :
        1504             :                 ! Make sure dimensions agree
        1505           0 :                 NX = SIZE(Trgt,1)
        1506           0 :                 NY = SIZE(Trgt,2)
        1507             :
        1508             :                 ! Must cover the horizontal grid
        1509           0 :                 IF ( (NX/=HcoState%NX) .OR. (NY/=HcoState%NY) ) THEN
        1510           0 :                    WRITE(MSG,*) 'Horizontal dimensions of target data do not ', &
        1511           0 :                       'correspond to simulation grid: ', &
        1512           0 :                       'Expected dimensions: ', HcoState%NX, HcoState%NY, &
        1513           0 :                       '; encountered dimensions: ', NX, NY, '. Error occured ', &
        1514           0 :                       'for field ', TRIM(FldName)
        1515           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1516           0 :                    RETURN
        1517             :                 ENDIF
        1518             :
        1519             :                 ! Link data to target
        1520           0 :                 ExtDat%Arr%Val => Trgt
        1521             :
        1522             :                 ! Make sure it's not from list
        1523           0 :                 ExtDat%FromList = .FALSE.
        1524             :
        1525             :                 ! Mark as filled
        1526           0 :                 IF ( PRESENT(Filled) ) Filled = .TRUE.
        1527             :
        1528             :                 ! Verbose
        1529           0 :                 IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1530           0 :                    MSG = 'Set extension field pointer to external data: ' // TRIM(FldName)
        1531           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG)
        1532             :                 ENDIF
        1533             :              ENDIF
        1534             :
        1535             :           ! Field not found and no target defined
        1536           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1537           0 :              MSG = 'Cannot fill extension field ' // TRIM(FldName)
        1538           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1539           0 :              RETURN
        1540             :           ENDIF
        1541             :        ENDIF ! FIRST
        1542             :
        1543             :        ! Eventually copy field from HEMCO list to ExtState. We need to
        1544             :        ! make a copy and cannot just set a pointer because ExtState fields
        1545             :        ! are in HEMCO precision but the EmisList fields are in single
        1546             :        ! precisions.
        1547           0 :        IF ( ExtDat%FromList ) THEN
        1548           0 :           IF ( FOUND ) THEN
        1549             :              ! Copy values and mark as filled
        1550           0 :              ExtDat%Arr%Val(:,:) = Arr2D(:,:)
        1551           0 :              IF ( PRESENT(Filled) ) Filled = .TRUE.
        1552           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1553           0 :              MSG = 'Cannot find extension field in HEMCO data list: ' // TRIM(FldName)
        1554           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1555           0 :              RETURN
        1556             :           ENDIF
        1557             :        ENDIF ! FromList
        1558             :     ENDIF
        1559             :
        1560             :     ! Make sure array exists
        1561           0 :     IF ( FailIfNotFilled .AND. .NOT. ASSOCIATED(ExtDat%Arr%Val) ) THEN
        1562           0 :        MSG = 'ExtState array not filled: ' // TRIM(FldName)
        1563           0 :        CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1564             :     ENDIF
        1565             :
        1566             :     ! Cleanup
        1567           0 :     IF ( ALLOCATED(Arr2D) ) DEALLOCATE(Arr2D)
        1568             :
        1569             :     ! Return w/ success
        1570           0 :     RC = HCO_SUCCESS
        1571             :
        1572           0 :   END SUBROUTINE ExtDat_Set_2S
        1573             : !EOC
        1574             : !------------------------------------------------------------------------------
        1575             : !                   Harmonized Emissions Component (HEMCO)                    !
        1576             : !------------------------------------------------------------------------------
        1577             : !BOP
        1578             : !
        1579             : ! !IROUTINE: ExtDat_Set_2I
        1580             : !
        1581             : ! !DESCRIPTION: Subroutine ExtDat\_Set\_2I sets/updates the data array of an
        1582             : ! ExtDat object.
        1583             : !\\
        1584             : !\\
        1585             : ! !INTERFACE:
        1586             : !
        1587           0 :   SUBROUTINE ExtDat_Set_2I ( HcoState, ExtDat,           &
        1588             :                              FldName,  RC,     First,    &
        1589             :                              Trgt,     Filled, NotFillOk )
        1590             : !
        1591             : ! !USES:
        1592             : !
        1593             :     USE HCO_ARR_MOD,        ONLY : HCO_ArrAssert
        1594             :     USE HCO_STATE_MOD,      ONLY : HCO_State
        1595             :     USE HCO_CALC_MOD,       ONLY : HCO_EvalFld
        1596             : !
        1597             : ! !INPUT PARAMETERS:
        1598             : !
        1599             :     TYPE(HCO_State),  POINTER                         :: HcoState
        1600             :     TYPE(ExtDat_2I),  POINTER                         :: ExtDat
        1601             :     CHARACTER(LEN=*), INTENT(IN   )                   :: FldName
        1602             :     INTEGER,          INTENT(INOUT)                   :: RC
        1603             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: First
        1604             :     INTEGER,          POINTER,       OPTIONAL         :: Trgt(:,:)
        1605             :     LOGICAL,          INTENT(  OUT), OPTIONAL         :: Filled
        1606             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: NotFillOk
        1607             : !
        1608             : ! !REVISION HISTORY:
        1609             : !  03 Apr 2015 - C. Keller - Initial version
        1610             : !  See https://github.com/geoschem/hemco for complete history
        1611             : !EOP
        1612             : !------------------------------------------------------------------------------
        1613             : !BOC
        1614             : !
        1615             : ! !LOCAL VARIABLES:
        1616             : !
        1617             :     INTEGER                :: AS, NX, NY
        1618           0 :     REAL(hp), ALLOCATABLE  :: Arr2D(:,:)
        1619             :     CHARACTER(LEN=255)     :: MSG
        1620             :     CHARACTER(LEN=255)     :: LOC = 'ExtDat_Set_2I (hcox_state_mod.F90)'
        1621             :     LOGICAL                :: FRST
        1622             :     LOGICAL                :: FOUND
        1623             :     LOGICAL                :: FailIfNotFilled
        1624             :
        1625             :     ! ================================================================
        1626             :     ! ExtDat_Set_2I begins here
        1627             :     ! ================================================================
        1628             :
        1629             :     ! Init
        1630           0 :     RC = HCO_SUCCESS
        1631           0 :     IF ( PRESENT(Filled) ) Filled = .FALSE.
        1632             :
        1633             :     ! Nothing to do if this ExtDat field is not in use
        1634           0 :     IF ( .NOT. ExtDat%DoUse ) RETURN
        1635             :
        1636             :     ! First time
        1637           0 :     IF ( PRESENT(FIRST) ) THEN
        1638           0 :        FRST = FIRST
        1639             :     ELSE
        1640             :        FRST = .FALSE.
        1641             :     ENDIF
        1642             :
        1643             :     ! Check for fill requirement
        1644           0 :     IF ( PRESENT(NotFillOk) ) THEN
        1645           0 :        FailIfNotFilled = .NOT. NotFillOk
        1646             :     ELSE
        1647             :        FailIfNotFilled = .TRUE.
        1648             :     ENDIF
        1649             :
        1650             :     ! On first call or if data is flagged as being read from list, get data
        1651             :     ! from emissions list
        1652           0 :     IF ( FRST .OR. ExtDat%FromList ) THEN
        1653             :
        1654             :        ! Allocate temporary array
        1655           0 :        ALLOCATE(Arr2D(HcoState%NX,HcoState%NY),STAT=AS)
        1656           0 :        IF ( AS /= 0 ) THEN
        1657           0 :           CALL HCO_ERROR ( "Arr2D allocation error", RC, THISLOC=LOC )
        1658           0 :           RETURN
        1659             :        ENDIF
        1660             :
        1661             :        ! Try to get data from list
        1662           0 :        CALL HCO_EvalFld( HcoState, TRIM(FldName), Arr2D, RC, FOUND=FOUND )
        1663           0 :        IF ( RC /= HCO_SUCCESS ) THEN
        1664           0 :            CALL HCO_ERROR( 'ERROR 61', RC, THISLOC=LOC )
        1665           0 :            RETURN
        1666             :        ENDIF
        1667             :
        1668             :        ! On first call, need to make additional checks
        1669           0 :        IF ( FRST ) THEN
        1670             :
        1671             :           ! If read from list
        1672           0 :           IF ( FOUND ) THEN
        1673           0 :              ExtDat%FromList = .TRUE.
        1674             :
        1675             :              ! Make sure array is allocated
        1676           0 :              CALL HCO_ArrAssert( ExtDat%Arr, HcoState%NX, HcoState%NY, RC )
        1677           0 :              IF ( RC /= HCO_SUCCESS ) THEN
        1678           0 :                  CALL HCO_ERROR( 'ERROR 62', RC, THISLOC=LOC )
        1679           0 :                  RETURN
        1680             :              ENDIF
        1681             :
        1682             :              ! Verbose
        1683           0 :              IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1684           0 :                 MSG = 'Will fill extension field from HEMCO data list field ' // TRIM(FldName)
        1685           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
        1686             :              ENDIF
        1687             :
        1688             :           ! Target to data
        1689           0 :           ELSEIF ( PRESENT(Trgt) ) THEN
        1690             :
        1691             :              ! If target is not associated:
        1692           0 :              IF ( .NOT. ASSOCIATED(Trgt) ) THEN
        1693           0 :                 IF ( FailIfNotFilled ) THEN
        1694             :                    MSG = 'Cannot fill extension field ' // TRIM(FldName) // &
        1695           0 :                          ' because target field is not associated.'
        1696           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1697           0 :                    RETURN
        1698             :                 ENDIF
        1699             :
        1700             :              ! If target is associated:
        1701             :              ELSE
        1702             :
        1703             :                 ! Make sure dimensions agree
        1704           0 :                 NX = SIZE(Trgt,1)
        1705           0 :                 NY = SIZE(Trgt,2)
        1706             :
        1707             :                 ! Must cover the horizontal grid
        1708           0 :                 IF ( (NX /= HcoState%NX) .OR. (NY /= HcoState%NY) ) THEN
        1709           0 :                    WRITE(MSG,*) 'Horizontal dimensions of target data do not ', &
        1710           0 :                       'correspond to simulation grid: ', &
        1711           0 :                       'Expected dimensions: ', HcoState%NX, HcoState%NY, &
        1712           0 :                       '; encountered dimensions: ', NX, NY, '. Error occured ', &
        1713           0 :                       'for field ', TRIM(FldName)
        1714           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1715           0 :                    RETURN
        1716             :                 ENDIF
        1717             :
        1718             :                 ! Link data to target
        1719           0 :                 ExtDat%Arr%Val => Trgt
        1720             :
        1721             :                 ! Make sure it's not from list
        1722           0 :                 ExtDat%FromList = .FALSE.
        1723             :
        1724             :                 ! Mark as filled
        1725           0 :                 IF ( PRESENT(Filled) ) Filled = .TRUE.
        1726             :
        1727             :                 ! Verbose
        1728           0 :                 IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1729           0 :                    MSG = 'Set extension field pointer to external data: ' // TRIM(FldName)
        1730           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG)
        1731             :                 ENDIF
        1732             :              ENDIF
        1733             :
        1734             :           ! Not found in list and no target defined
        1735           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1736           0 :              MSG = 'Cannot fill extension field ' // TRIM(FldName)
        1737           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1738           0 :              RETURN
        1739             :           ENDIF
        1740             :
        1741             :        ENDIF ! FIRST
        1742             :
        1743             :        ! Eventually copy field from HEMCO list to ExtState. We need to
        1744             :        ! make a copy and cannot just set a pointer because ExtState fields
        1745             :        ! are in HEMCO precision but the EmisList fields are in single
        1746             :        ! precisions.
        1747           0 :        IF ( ExtDat%FromList ) THEN
        1748           0 :           IF ( FOUND ) THEN
        1749             :
        1750             :              ! Copy values and mark as filled
        1751           0 :              ExtDat%Arr%Val(:,:) = Arr2D(:,:)
        1752           0 :              IF ( PRESENT(Filled) ) Filled = .TRUE.
        1753             :
        1754           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1755           0 :              MSG = 'Cannot find extension field in HEMCO data list: ' // TRIM(FldName)
        1756           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1757           0 :              RETURN
        1758             :           ENDIF
        1759             :
        1760             :        ENDIF !FromList
        1761             :     ENDIF
        1762             :
        1763             :     ! Make sure array exists
        1764           0 :     IF ( FailIfNotFilled .AND. .NOT. ASSOCIATED(ExtDat%Arr%Val) ) THEN
        1765           0 :        MSG = 'ExtState array not filled: ' // TRIM(FldName)
        1766           0 :        CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1767             :     ENDIF
        1768             :
        1769             :     ! Cleanup
        1770           0 :     IF ( ALLOCATED(Arr2D) ) DEALLOCATE(Arr2D)
        1771             :
        1772             :     ! Return w/ success
        1773           0 :     RC = HCO_SUCCESS
        1774             :
        1775           0 :   END SUBROUTINE ExtDat_Set_2I
        1776             : !EOC
        1777             : !------------------------------------------------------------------------------
        1778             : !                   Harmonized Emissions Component (HEMCO)                    !
        1779             : !------------------------------------------------------------------------------
        1780             : !BOP
        1781             : !
        1782             : ! !IROUTINE: ExtDat_Set_3R
        1783             : !
        1784             : ! !DESCRIPTION: Subroutine ExtDat\_Set\_3R sets/updates the data array of an
        1785             : ! ExtDat object.
        1786             : !\\
        1787             : !\\
        1788             : ! !INTERFACE:
        1789             : !
        1790           0 :   SUBROUTINE ExtDat_Set_3R ( HcoState, ExtDat,   FldName,            &
        1791             :                              RC,       First,    Trgt,   OnLevEdge,  &
        1792             :                              Filled,   NotFillOk                     )
        1793             : !
        1794             : ! !USES:
        1795             : !
        1796             :     USE HCO_ARR_MOD,        ONLY : HCO_ArrAssert
        1797             :     USE HCO_STATE_MOD,      ONLY : HCO_State
        1798             :     USE HCO_CALC_MOD,       ONLY : HCO_EvalFld
        1799             : !
        1800             : ! !INPUT PARAMETERS:
        1801             : !
        1802             :     TYPE(HCO_State),  POINTER                         :: HcoState
        1803             :     TYPE(ExtDat_3R),  POINTER                         :: ExtDat
        1804             :     CHARACTER(LEN=*), INTENT(IN   )                   :: FldName
        1805             :     INTEGER,          INTENT(INOUT)                   :: RC
        1806             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: First
        1807             :     REAL(hp),         POINTER      , OPTIONAL         :: Trgt(:,:,:)
        1808             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: OnLevEdge
        1809             :     LOGICAL,          INTENT(  OUT), OPTIONAL         :: Filled
        1810             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: NotFillOk
        1811             : !
        1812             : ! !REVISION HISTORY:
        1813             : !  03 Apr 2015 - C. Keller - Initial version
        1814             : !  See https://github.com/geoschem/hemco for complete history
        1815             : !EOP
        1816             : !------------------------------------------------------------------------------
        1817             : !BOC
        1818             : !
        1819             : ! !LOCAL VARIABLES:
        1820             : !
        1821             :     INTEGER                :: AS, NX, NY, NZ, NZ_EXPECTED
        1822             :     INTEGER                :: L
        1823             :     LOGICAL                :: FRST
        1824             :     LOGICAL                :: FOUND
        1825             :     LOGICAL                :: FailIfNotFilled
        1826           0 :     REAL(hp), ALLOCATABLE  :: Arr3D(:,:,:)
        1827             :     CHARACTER(LEN=255)     :: MSG
        1828             :     CHARACTER(LEN=255)     :: LOC = 'ExtDat_Set_3R (hcox_state_mod.F90)'
        1829             :
        1830             :     ! ================================================================
        1831             :     ! ExtDat_Set_3R begins here
        1832             :     ! ================================================================
        1833             :
        1834             :     ! Init
        1835           0 :     RC = HCO_SUCCESS
        1836           0 :     IF ( PRESENT(Filled) ) Filled = .FALSE.
        1837             :
        1838             :     ! Nothing to do if this ExtDat field is not in use
        1839           0 :     IF ( .NOT. ExtDat%DoUse ) RETURN
        1840             :
        1841             :     ! First time
        1842           0 :     IF ( PRESENT(FIRST) ) THEN
        1843           0 :        FRST = FIRST
        1844             :     ELSE
        1845             :        FRST = .FALSE.
        1846             :     ENDIF
        1847             :
        1848             :     ! Check for fill requirement
        1849           0 :     IF ( PRESENT(NotFillOk) ) THEN
        1850           0 :        FailIfNotFilled = .NOT. NotFillOk
        1851             :     ELSE
        1852             :        FailIfNotFilled = .TRUE.
        1853             :     ENDIF
        1854             :
        1855             :     ! Expected number of vertical levels: NZ if not on edge, NZ+1 if on edge
        1856           0 :     NZ_EXPECTED = HcoState%NZ
        1857           0 :     IF ( PRESENT(OnLevEdge) ) THEN
        1858           0 :        IF ( OnLevEdge ) THEN
        1859           0 :           NZ_EXPECTED = HcoState%NZ + 1
        1860             :        ENDIF
        1861             :     ENDIF
        1862             :
        1863             :     ! On first call or if data is flagged as being read from list, get data
        1864             :     ! from emissions list
        1865           0 :     IF ( FRST .OR. ExtDat%FromList ) THEN
        1866             :
        1867             :        ! Allocate temporary array
        1868           0 :        ALLOCATE(Arr3D(HcoState%NX,HcoState%NY,NZ_EXPECTED),STAT=AS)
        1869           0 :        IF ( AS /= 0 ) THEN
        1870           0 :           CALL HCO_ERROR ( "Arr3D allocation error", RC, THISLOC=LOC )
        1871           0 :           RETURN
        1872             :        ENDIF
        1873             :
        1874             :        ! Try to get data from list
        1875           0 :        CALL HCO_EvalFld( HcoState, TRIM(FldName), Arr3D, RC, FOUND=FOUND )
        1876           0 :        IF ( RC /= HCO_SUCCESS ) THEN
        1877           0 :            CALL HCO_ERROR( 'ERROR 63', RC, THISLOC=LOC )
        1878           0 :            RETURN
        1879             :        ENDIF
        1880             :
        1881             :        ! On first call, need to make additional checks
        1882           0 :        IF ( FRST ) THEN
        1883             :
        1884             :           ! If read from list
        1885           0 :           IF ( FOUND ) THEN
        1886           0 :              ExtDat%FromList = .TRUE.
        1887             :
        1888             :              ! Make sure array is allocated
        1889           0 :              CALL HCO_ArrAssert( ExtDat%Arr, HcoState%NX, HcoState%NY, NZ_EXPECTED, RC )
        1890           0 :              IF ( RC /= HCO_SUCCESS ) THEN
        1891           0 :                  CALL HCO_ERROR( 'ERROR 64', RC, THISLOC=LOC )
        1892           0 :                  RETURN
        1893             :              ENDIF
        1894             :
        1895             :              ! Verbose
        1896           0 :              IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1897           0 :                 MSG = 'Will fill extension field from HEMCO data list field ' // TRIM(FldName)
        1898           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
        1899             :              ENDIF
        1900             :
        1901             :           ! Target to data
        1902           0 :           ELSEIF ( PRESENT(Trgt) ) THEN
        1903             :
        1904             :              ! If target is not associated:
        1905           0 :              IF ( .NOT. ASSOCIATED(Trgt) ) THEN
        1906           0 :                 IF ( FailIfNotFilled ) THEN
        1907             :                    MSG = 'Cannot fill extension field ' // TRIM(FldName) // &
        1908           0 :                          ' because target field is not associated.'
        1909           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1910           0 :                    RETURN
        1911             :                 ENDIF
        1912             :
        1913             :              ! If target is associated:
        1914             :              ELSE
        1915             :
        1916             :                 ! Make sure dimensions agree
        1917           0 :                 NX = SIZE(Trgt,1)
        1918           0 :                 NY = SIZE(Trgt,2)
        1919           0 :                 NZ = SIZE(Trgt,3)
        1920             :
        1921             :                 ! Must cover the horizontal grid
        1922           0 :                 IF ( (NX/=HcoState%NX) .OR. (NY/=HcoState%NY) .OR. (NZ/=NZ_EXPECTED) ) THEN
        1923           0 :                    WRITE(MSG,*) 'Dimensions of target data do not ', &
        1924           0 :                       'correspond to simulation grid: ', &
        1925           0 :                       'Expected dimensions: ', HcoState%NX, HcoState%NY, NZ_EXPECTED, &
        1926           0 :                       '; encountered dimensions: ', NX, NY, NZ, '. Error occured ', &
        1927           0 :                       'for field ', TRIM(FldName)
        1928           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1929           0 :                    RETURN
        1930             :                 ENDIF
        1931             :
        1932             :                 ! Link data to target
        1933           0 :                 ExtDat%Arr%Val => Trgt
        1934             :
        1935             :                 ! Make sure it's not from list
        1936           0 :                 ExtDat%FromList = .FALSE.
        1937             :
        1938             :                 ! Mark as filled
        1939           0 :                 IF ( PRESENT(Filled) ) Filled = .TRUE.
        1940             :
        1941             :                 ! Verbose
        1942           0 :                 IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        1943           0 :                    MSG = 'Set extension field pointer to external data: ' // TRIM(FldName)
        1944           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG)
        1945             :                 ENDIF
        1946             :              ENDIF
        1947             :
        1948             :           ! Not found in list and no target defined
        1949           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1950             :              ! Target array must be present
        1951             :              IF ( .NOT. PRESENT(Trgt) ) THEN
        1952           0 :                 MSG = 'Cannot fill extension field ' // TRIM(FldName)
        1953           0 :                 CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1954           0 :                 RETURN
        1955             :              ENDIF
        1956             :           ENDIF
        1957             :
        1958             :        ENDIF ! FIRST
        1959             :
        1960             :        ! Eventually copy field from HEMCO list to ExtState. We need to
        1961             :        ! make a copy and cannot just set a pointer because ExtState fields
        1962             :        ! are in HEMCO precision but the EmisList fields are in single
        1963             :        ! precisions.
        1964           0 :        IF ( ExtDat%FromList ) THEN
        1965           0 :           IF ( FOUND ) THEN
        1966             :
        1967             :              ! Copy data and mark as filled
        1968           0 :              ExtDat%Arr%Val(:,:,:) = Arr3D(:,:,:)
        1969           0 :              IF ( PRESENT(Filled) ) Filled = .TRUE.
        1970             :
        1971           0 :           ELSEIF ( FailIfNotFilled ) THEN
        1972           0 :              MSG = 'Cannot find extension field in HEMCO data list: ' // TRIM(FldName)
        1973           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1974           0 :              RETURN
        1975             :
        1976             :           ENDIF
        1977             :        ENDIF !FromList
        1978             :     ENDIF
        1979             :
        1980             :     ! Make sure array exists
        1981           0 :     IF ( FailIfNotFilled .AND. .NOT. ASSOCIATED(ExtDat%Arr%Val) ) THEN
        1982           0 :        MSG = 'ExtState array not filled: ' // TRIM(FldName)
        1983           0 :        CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        1984             :     ENDIF
        1985             :
        1986             :     ! Cleanup
        1987           0 :     IF ( ALLOCATED(Arr3D) ) DEALLOCATE(Arr3D)
        1988             :
        1989             :     ! Return w/ success
        1990           0 :     RC = HCO_SUCCESS
        1991             :
        1992           0 :   END SUBROUTINE ExtDat_Set_3R
        1993             : !EOC
        1994             : !------------------------------------------------------------------------------
        1995             : !                   Harmonized Emissions Component (HEMCO)                    !
        1996             : !------------------------------------------------------------------------------
        1997             : !BOP
        1998             : !
        1999             : ! !IROUTINE: ExtDat_Set_3S
        2000             : !
        2001             : ! !DESCRIPTION: Subroutine ExtDat\_Set\_3S sets/updates the data array of an
        2002             : ! ExtDat object.
        2003             : !\\
        2004             : !\\
        2005             : ! !INTERFACE:
        2006             : !
        2007           0 :   SUBROUTINE ExtDat_Set_3S ( HcoState, ExtDat,   FldName,            &
        2008             :                              RC,       First,    Trgt,    OnLevEdge, &
        2009             :                              Filled,   NotFillOk                     )
        2010             : !
        2011             : ! !USES:
        2012             : !
        2013             :     USE HCO_ARR_MOD,        ONLY : HCO_ArrAssert
        2014             :     USE HCO_STATE_MOD,      ONLY : HCO_State
        2015             :     USE HCO_CALC_MOD,       ONLY : HCO_EvalFld
        2016             : !
        2017             : ! !INPUT PARAMETERS:
        2018             : !
        2019             :     TYPE(HCO_State),  POINTER                         :: HcoState
        2020             :     TYPE(ExtDat_3S),  POINTER                         :: ExtDat
        2021             :     CHARACTER(LEN=*), INTENT(IN   )                   :: FldName
        2022             :     INTEGER,          INTENT(INOUT)                   :: RC
        2023             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: First
        2024             :     REAL(sp),         POINTER      , OPTIONAL         :: Trgt(:,:,:)
        2025             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: OnLevEdge
        2026             :     LOGICAL,          INTENT(  OUT), OPTIONAL         :: Filled
        2027             :     LOGICAL,          INTENT(IN   ), OPTIONAL         :: NotFillOk
        2028             : !
        2029             : ! !REVISION HISTORY:
        2030             : !  03 Apr 2015 - C. Keller - Initial version
        2031             : !  See https://github.com/geoschem/hemco for complete history
        2032             : !EOP
        2033             : !------------------------------------------------------------------------------
        2034             : !BOC
        2035             : !
        2036             : ! !LOCAL VARIABLES:
        2037             : !
        2038             :     INTEGER                :: AS, NX, NY, NZ, NZ_EXPECTED
        2039             :     INTEGER                :: L
        2040             :     LOGICAL                :: FRST
        2041             :     LOGICAL                :: FOUND
        2042             :     LOGICAL                :: FailIfNotFilled
        2043           0 :     REAL(hp), ALLOCATABLE  :: Arr3D(:,:,:)
        2044             :     CHARACTER(LEN=255)     :: MSG
        2045             :     CHARACTER(LEN=255)     :: LOC = 'ExtDat_Set_3S (hcox_state_mod.F90)'
        2046             :
        2047             :     ! ================================================================
        2048             :     ! ExtDat_Set_3S begins here
        2049             :     ! ================================================================
        2050             :
        2051             :     ! Init
        2052           0 :     RC = HCO_SUCCESS
        2053           0 :     IF ( PRESENT(Filled) ) Filled = .FALSE.
        2054             :
        2055             :     ! Nothing to do if this ExtDat field is not in use
        2056           0 :     IF ( .NOT. ExtDat%DoUse ) RETURN
        2057             :
        2058             :     ! First time
        2059           0 :     IF ( PRESENT(FIRST) ) THEN
        2060           0 :        FRST = FIRST
        2061             :     ELSE
        2062             :        FRST = .FALSE.
        2063             :     ENDIF
        2064             :
        2065             :     ! Check for fill requirement
        2066           0 :     IF ( PRESENT(NotFillOk) ) THEN
        2067           0 :        FailIfNotFilled = .NOT. NotFillOk
        2068             :     ELSE
        2069             :        FailIfNotFilled = .TRUE.
        2070             :     ENDIF
        2071             :
        2072             :     ! Expected number of vertical levels: NZ if not on edge, NZ+1 if on edge
        2073           0 :     NZ_EXPECTED = HcoState%NZ
        2074           0 :     IF ( PRESENT(OnLevEdge) ) THEN
        2075           0 :        IF ( OnLevEdge ) THEN
        2076           0 :           NZ_EXPECTED = HcoState%NZ + 1
        2077             :        ENDIF
        2078             :     ENDIF
        2079             :
        2080             :     ! On first call or if data is flagged as being read from list, get data
        2081             :     ! from emissions list
        2082           0 :     IF ( FRST .OR. ExtDat%FromList ) THEN
        2083             :
        2084             :        ! Allocate temporary array
        2085           0 :        ALLOCATE(Arr3D(HcoState%NX,HcoState%NY,NZ_EXPECTED),STAT=AS)
        2086           0 :        IF ( AS /= 0 ) THEN
        2087           0 :           CALL HCO_ERROR ( "Arr3D allocation error", RC, THISLOC=LOC )
        2088           0 :           RETURN
        2089             :        ENDIF
        2090             :
        2091             :        ! Try to get data from list
        2092           0 :        CALL HCO_EvalFld( HcoState, TRIM(FldName), Arr3D, RC, FOUND=FOUND )
        2093           0 :        IF ( RC /= HCO_SUCCESS ) THEN
        2094           0 :            CALL HCO_ERROR( 'ERROR 65', RC, THISLOC=LOC )
        2095           0 :            RETURN
        2096             :        ENDIF
        2097             :
        2098             :        ! On first call, need to make additional checks
        2099           0 :        IF ( FRST ) THEN
        2100             :
        2101             :           ! If read from list
        2102           0 :           IF ( FOUND ) THEN
        2103           0 :              ExtDat%FromList = .TRUE.
        2104             :
        2105             :              ! Make sure array is allocated
        2106           0 :              CALL HCO_ArrAssert( ExtDat%Arr, HcoState%NX, HcoState%NY, NZ_EXPECTED, RC )
        2107           0 :              IF ( RC /= HCO_SUCCESS ) THEN
        2108           0 :                  CALL HCO_ERROR( 'ERROR 66', RC, THISLOC=LOC )
        2109           0 :                  RETURN
        2110             :              ENDIF
        2111             :
        2112             :              ! Verbose
        2113           0 :              IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        2114           0 :                 MSG = 'Will fill extension field from HEMCO data list field ' // TRIM(FldName)
        2115           0 :                 CALL HCO_MSG(HcoState%Config%Err,MSG)
        2116             :              ENDIF
        2117             :
        2118             :           ! Target to data
        2119           0 :           ELSEIF ( PRESENT(Trgt) ) THEN
        2120             :
        2121             :              ! If target is not associated:
        2122           0 :              IF ( .NOT. ASSOCIATED(Trgt) ) THEN
        2123           0 :                 IF ( FailIfNotFilled ) THEN
        2124             :                    MSG = 'Cannot fill extension field ' // TRIM(FldName) // &
        2125           0 :                          ' because target field is not associated.'
        2126           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        2127           0 :                    RETURN
        2128             :                 ENDIF
        2129             :
        2130             :              ! If target is associated:
        2131             :              ELSE
        2132             :
        2133             :                 ! Make sure dimensions agree
        2134           0 :                 NX = SIZE(Trgt,1)
        2135           0 :                 NY = SIZE(Trgt,2)
        2136           0 :                 NZ = SIZE(Trgt,3)
        2137             :
        2138             :                 ! Must cover the horizontal grid
        2139           0 :                 IF ( (NX/=HcoState%NX) .OR. (NY/=HcoState%NY) .OR. (NZ/=NZ_EXPECTED) ) THEN
        2140           0 :                    WRITE(MSG,*) 'Dimensions of target data do not ', &
        2141           0 :                       'correspond to simulation grid: ', &
        2142           0 :                       'Expected dimensions: ', HcoState%NX, HcoState%NY, NZ_EXPECTED, &
        2143           0 :                       '; encountered dimensions: ', NX, NY, NZ, '. Error occured ', &
        2144           0 :                       'for field ', TRIM(FldName)
        2145           0 :                    CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        2146           0 :                    RETURN
        2147             :                 ENDIF
        2148             :
        2149             :                 ! Link data to target
        2150           0 :                 ExtDat%Arr%Val => Trgt
        2151             :
        2152             :                 ! Make sure it's not from list
        2153           0 :                 ExtDat%FromList = .FALSE.
        2154             :
        2155             :                 ! Mark as filled
        2156           0 :                 IF ( PRESENT(Filled) ) Filled = .TRUE.
        2157             :
        2158             :                 ! Verbose
        2159           0 :                 IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
        2160           0 :                    MSG = 'Set extension field pointer to external data: ' // TRIM(FldName)
        2161           0 :                    CALL HCO_MSG(HcoState%Config%Err,MSG)
        2162             :                 ENDIF
        2163             :              ENDIF
        2164             :
        2165             :           ! Not found in list and no target defined
        2166           0 :           ELSEIF ( FailIfNotFilled ) THEN
        2167             :              ! Target array must be present
        2168             :              IF ( .NOT. PRESENT(Trgt) ) THEN
        2169           0 :                 MSG = 'Cannot fill extension field ' // TRIM(FldName)
        2170           0 :                 CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        2171           0 :                 RETURN
        2172             :              ENDIF
        2173             :           ENDIF
        2174             :
        2175             :        ENDIF ! FIRST
        2176             :
        2177             :        ! Eventually copy field from HEMCO list to ExtState. We need to
        2178             :        ! make a copy and cannot just set a pointer because ExtState fields
        2179             :        ! are in HEMCO precision but the EmisList fields are in single
        2180             :        ! precisions.
        2181           0 :        IF ( ExtDat%FromList ) THEN
        2182           0 :           IF ( FOUND ) THEN
        2183             :              ! Copy data and mark as filled
        2184           0 :              ExtDat%Arr%Val(:,:,:) = Arr3D(:,:,:)
        2185           0 :              IF ( PRESENT(Filled) ) Filled = .TRUE.
        2186           0 :           ELSEIF ( FailIfNotFilled ) THEN
        2187           0 :              MSG = 'Cannot find extension field in HEMCO data list: ' // TRIM(FldName)
        2188           0 :              CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        2189           0 :              RETURN
        2190             :           ENDIF
        2191             :        ENDIF !FromList
        2192             :     ENDIF
        2193             :
        2194             :     ! Make sure array exists
        2195           0 :     IF ( FailIfNotFilled .AND. .NOT. ASSOCIATED(ExtDat%Arr%Val) ) THEN
        2196           0 :        MSG = 'ExtState array not filled: ' // TRIM(FldName)
        2197           0 :        CALL HCO_ERROR(MSG, RC, THISLOC=LOC )
        2198             :     ENDIF
        2199             :
        2200             :     ! Cleanup
        2201           0 :     IF ( ALLOCATED(Arr3D) ) DEALLOCATE(Arr3D)
        2202             :
        2203             :     ! Return w/ success
        2204           0 :     RC = HCO_SUCCESS
        2205             :
        2206           0 :   END SUBROUTINE ExtDat_Set_3S
        2207             : !EOC
        2208           0 : END MODULE HCOX_STATE_MOD

Generated by: LCOV version 1.14