LCOV - code coverage report
Current view: | top level - hemco/HEMCO/src/Core - hco_state_mod.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 265 | 0.0 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 0 | 6 | 0.0 %

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hco_state_mod.F90
           7             : !
           8             : ! !DESCRIPTION: Module HCO\_State\_Mod contains definitions and sub-
           9             : ! routines for the HEMCO state derived type. The HEMCO state object
          10             : ! (HcoState) contains all information related to the HEMCO run, such
          11             : ! as the HEMCO clock, information on the emission grid and the data
          12             : ! fields to be read, details on all used species, various physical
          13             : ! constants, etc.
          14             : ! It also contains the final assembled 3D flux and 2D deposition
          15             : ! arrays (to be passed to the overlaying model) and a pointer to the
          16             : ! HEMCO configuration object (Config). The latter contains error and
          17             : ! traceback information and holds the data fields (in the data list
          18             : ! ConfigList).
          19             : !\\
          20             : !\\
          21             : ! The HEMCO state object (typically called HcoState) for a given HEMCO
          22             : ! run must be defined on the HEMCO-model interface level (subroutine
          23             : ! HcoState\_Init).
          24             : !\\
          25             : !\\
          26             : ! !INTERFACE:
          27             : !
          28             : MODULE HCO_State_Mod
          29             : !
          30             : ! USES:
          31             : !
          32             :   USE HCO_Types_Mod
          33             :   USE HCO_Error_Mod
          34             :   USE HCO_Arr_Mod
          35             :   USE HCO_VertGrid_Mod
          36             :
          37             : #if defined(ESMF_)
          38             :   USE ESMF
          39             : #endif
          40             :
          41             :   IMPLICIT NONE
          42             :   PRIVATE
          43             : !
          44             : ! !PUBLIC MEMBER FUNCTIONS:
          45             : !
          46             :   PUBLIC :: HcoState_Init
          47             :   PUBLIC :: HcoState_Final
          48             :   PUBLIC :: HCO_GetModSpcID
          49             :   PUBLIC :: HCO_GetHcoID
          50             :   PUBLIC :: HCO_GetExtHcoID
          51             :
          52             :   !=========================================================================
          53             :   ! HCO_State: Main HEMCO State derived type
          54             :   !=========================================================================
          55             :   TYPE, PUBLIC :: HCO_State
          56             :
          57             :      !%%%%% Species information %%%%%
          58             :      LOGICAL                     :: amIRoot    ! Is this the root CPU?
          59             :
          60             :      !%%%%% Species information %%%%%
          61             :      INTEGER                     :: nSpc       ! # of species
          62             :      TYPE(HcoSpc),       POINTER :: Spc(:)     ! list of species
          63             :
          64             :      !%%%%% Emission grid information %%%%%
          65             :      INTEGER                     :: NX         ! # of x-pts (lons) on this CPU
          66             :      INTEGER                     :: NY         ! # of y-pts (lats) on this CPU
          67             :      INTEGER                     :: NZ         ! # of z-pts (levs) on this CPU
          68             :      TYPE(HcoGrid),      POINTER :: Grid       ! HEMCO grid information
          69             :      TYPE(HcoClock),     POINTER :: Clock      ! HEMCO clock
          70             :
          71             :      ! Data array
          72             :      TYPE(Arr3D_HP),     POINTER :: Buffer3D   ! Placeholder to store temporary
          73             :                                                ! 3D array.  Emissions will be
          74             :                                                ! written into this array if
          75             :                                                ! option FillBuffer = .TRUE.
          76             :
          77             :      !%%%%% Constants and timesteps %%%%%
          78             :      TYPE(HcoPhys),      POINTER :: Phys       ! Physical constants
          79             :      REAL(sp)                    :: TS_EMIS    ! Emission timestep [s]
          80             :      REAL(sp)                    :: TS_CHEM    ! Chemical timestep [s]
          81             :      REAL(sp)                    :: TS_DYN     ! Dynamic  timestep [s]
          82             :
          83             :      !%%%%% Aerosol quantities %%%%%
          84             :      INTEGER                     :: nDust      ! # of dust species
          85             :      LOGICAL                     :: MarinePOA  ! MUse marine organic aerosols?
          86             :      TYPE(HcoMicroPhys), POINTER :: MicroPhys  ! Microphysics settings
          87             :
          88             :      !%%%%%  Run time options %%%%%
          89             :      TYPE(HcoOpt),       POINTER :: Options    ! HEMCO run options
          90             :
          91             :      !%%%%% ReadLists %%%%%
          92             :      TYPE(RdList),      POINTER  :: ReadLists
          93             :      LOGICAL                     :: SetReadListCalled
          94             :
          95             :      !%%%%% Emissions linked list %%%%%%
          96             :      TYPE(ListCont), POINTER     :: EmisList
          97             :      INTEGER                     :: nnEmisCont =  0 ! # of container in EmisList
          98             :
          99             :      !%%%%% Data container indeces %%%%%
         100             :      ! Element i of cIDList will point to data-container with container
         101             :      ! ID i (e.g. cIDList(3) points to data-container with cID = 3).
         102             :      TYPE(cIDListPnt), POINTER   :: cIDList(:) => NULL()
         103             :
         104             :      ! # of defined data containers. Will be automatically increased
         105             :      ! by one when creating a new data container (DataCont_Init)
         106             :      INTEGER                     :: nnDataCont = 0
         107             :
         108             :      ! Define object based on TimeIdxCollection derived type
         109             :      TYPE(TimeIdxCollection), POINTER :: AlltIDx  => NULL()
         110             :
         111             :      ! HEMCO configuration object
         112             :      TYPE(ConfigObj), POINTER    :: Config => NULL()
         113             :
         114             :      ! Pointer to beginning of collections linked list
         115             :      TYPE(DiagnBundle),  POINTER :: Diagn  => NULL()
         116             :
         117             :      !%%%%%  ESMF objects
         118             : #if defined(ESMF_)
         119             :      TYPE(ESMF_GridComp), POINTER :: GridComp
         120             :      TYPE(ESMF_State),    POINTER :: IMPORT
         121             :      TYPE(ESMF_State),    POINTER :: EXPORT
         122             : #endif
         123             : #ifdef ADJOINT
         124             :      LOGICAL                      :: isAdjoint
         125             : #endif
         126             :   END TYPE HCO_State
         127             : !
         128             : ! !REVISION HISTORY:
         129             : !  20 Aug 2013 - C. Keller   - Initial version, adapted from state_chm_mod.F90
         130             : !  See https://github.com/geoschem/hemco for complete history
         131             : !EOP
         132             : !------------------------------------------------------------------------------
         133             : !BOC
         134             : CONTAINS
         135             : !EOC
         136             : !------------------------------------------------------------------------------
         137             : !                   Harmonized Emissions Component (HEMCO)                    !
         138             : !------------------------------------------------------------------------------
         139             : !BOP
         140             : !
         141             : ! !IROUTINE: HcoState_Init
         142             : !
         143             : ! !DESCRIPTION: Routine HcoState\_Init initializes the HEMCO state object.
         144             : ! This initializes (nullifies) all pointers and sets all HEMCO settings
         145             : ! and options to default values.
         146             : ! The here defined pointers are defined/connected at the HEMCO-model
         147             : ! interface level.
         148             : ! The passed HEMCO configuration object (HcoConfig) must be defined,
         149             : ! e.g. this subroutine must be called after having read (at least
         150             : ! stage 1 of) the HEMCO configuration file (Config\_ReadFile in
         151             : ! hco\_config\_mod.F90).
         152             : !\\
         153             : !\\
         154             : ! !INTERFACE:
         155             : !
         156           0 :   SUBROUTINE HcoState_Init( HcoState, HcoConfig, nSpecies, RC )
         157             : !
         158             : ! !USES:
         159             : !
         160             :     USE HCO_EXTLIST_MOD,    ONLY : GetExtOpt, CoreNr
         161             :     USE HCO_UNIT_MOD,       ONLY : HCO_UnitTolerance
         162             : !
         163             : ! !INPUT PARAMETERS:
         164             : !
         165             :     INTEGER,          INTENT(IN)    :: nSpecies  ! # HEMCO species
         166             : !
         167             : ! !INPUT/OUTPUT PARAMETERS:
         168             : !
         169             :     TYPE(HCO_State),  POINTER       :: HcoState  ! HEMCO State object
         170             :     TYPE(ConfigObj),  POINTER       :: HcoConfig ! HEMCO Config object
         171             :     INTEGER,          INTENT(INOUT) :: RC        ! Return code
         172             : !
         173             : ! !REVISION HISTORY:
         174             : !  20 Aug 2013 - C. Keller - Adapted from gigc_state_chm_mod.F90
         175             : !  See https://github.com/geoschem/hemco for complete history
         176             : !EOP
         177             : !------------------------------------------------------------------------------
         178             : !BOC
         179             : !
         180             : ! !LOCAL VARIABLES:
         181             : !
         182             :     INTEGER            :: I, AS
         183             :     INTEGER            :: UnitTolerance
         184             :     LOGICAL            :: FOUND
         185             :     CHARACTER(LEN=255) :: MSG, LOC
         186             :
         187             :     !=====================================================================
         188             :     ! HcoState_Init begins here!
         189             :     !=====================================================================
         190           0 :     LOC = 'HcoState_Init (HCO_STATE_MOD.F90)'
         191             :
         192             :     ! For error handling
         193           0 :     CALL HCO_ENTER (HcoConfig%Err, LOC, RC )
         194           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         195           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         196           0 :         RETURN
         197             :     ENDIF
         198             :
         199             :     !=====================================================================
         200             :     ! Allocate emission field vectors
         201             :     !=====================================================================
         202             :
         203             :     ! Check if already allocated
         204           0 :     IF ( ASSOCIATED(HcoState)) THEN
         205           0 :        CALL HCO_WARNING( HcoConfig%Err,'HcoState already allocated!', RC )
         206           0 :        RETURN
         207             :     ENDIF
         208           0 :     ALLOCATE ( HcoState )
         209             :
         210             :     ! Is this the Root CPU?
         211           0 :     HcoState%amIRoot = HcoConfig%amIRoot
         212             :
         213             :     ! Initialize vector w/ species information
         214           0 :     HcoState%nSpc = nSpecies
         215           0 :     IF ( nSpecies > 0 ) THEN
         216           0 :        ALLOCATE ( HcoState%Spc (nSpecies ), STAT=AS )
         217           0 :        IF ( AS /= 0 ) THEN
         218           0 :           CALL HCO_ERROR( 'Species', RC )
         219           0 :           RETURN
         220             :        ENDIF
         221             :     ENDIF
         222             :
         223             :     ! Initalize species information. The effective values for species
         224             :     ! names, model IDs, etc. are set in the HEMCO-model interface
         225             :     ! routine.
         226           0 :     DO I = 1, nSpecies
         227           0 :        HcoState%Spc(I)%HcoID      = I
         228           0 :        HcoState%Spc(I)%ModID      = -1
         229           0 :        HcoState%Spc(I)%SpcName    = ''
         230           0 :        HcoState%Spc(I)%MW_g       = 0.0_dp
         231           0 :        HcoState%Spc(I)%HenryK0    = 0.0_dp
         232           0 :        HcoState%Spc(I)%HenryCR    = 0.0_dp
         233           0 :        HcoState%Spc(I)%HenryPKA   = 0.0_dp
         234             :
         235             :        ! Initialize data arrays. Pass dimension zero, which
         236             :        ! will just create a pointer to the data array (XX%Val).
         237             :        ! Will specify the arrays in HEMCO-model interface routine
         238             :        ! or when writing to them for the first time.
         239           0 :        CALL Hco_ArrInit( HcoState%Spc(I)%Emis, 0, 0, 0, RC )
         240           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         241           0 :            CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         242           0 :            RETURN
         243             :        ENDIF
         244             :
         245           0 :        CALL Hco_ArrInit( HcoState%Spc(I)%Conc, 0, 0, 0, RC )
         246           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         247           0 :            CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         248           0 :            RETURN
         249             :        ENDIF
         250             :
         251           0 :        CALL Hco_ArrInit( HcoState%Spc(I)%Depv, 0, 0, RC )
         252           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         253           0 :            CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
         254           0 :            RETURN
         255             :        ENDIF
         256             :     ENDDO !I
         257             :
         258             :     !=====================================================================
         259             :     ! Initialize grid
         260             :     !=====================================================================
         261             :
         262             :     ! Initialize grid dimensions.
         263           0 :     HcoState%NX   = 0
         264           0 :     HcoState%NY   = 0
         265           0 :     HcoState%NZ   = 0
         266           0 :     ALLOCATE ( HcoState%Grid, STAT = AS )
         267             :     IF ( AS /= 0 ) THEN
         268           0 :        CALL HCO_ERROR( 'HEMCO grid', RC )
         269           0 :        RETURN
         270             :     ENDIF
         271             :
         272             :     ! Initialize grid arrays.
         273           0 :     CALL HCO_ArrInit ( HcoState%Grid%XMID,       0, 0,    RC )
         274           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         275           0 :         CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
         276           0 :         RETURN
         277             :     ENDIF
         278           0 :     CALL HCO_ArrInit ( HcoState%Grid%YMID,       0, 0,    RC )
         279           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         280           0 :         CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
         281           0 :         RETURN
         282             :     ENDIF
         283           0 :     CALL HCO_ArrInit ( HcoState%Grid%XEDGE,      0, 0,    RC )
         284           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         285           0 :         CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
         286           0 :         RETURN
         287             :     ENDIF
         288           0 :     CALL HCO_ArrInit ( HcoState%Grid%YEDGE,      0, 0,    RC )
         289           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         290           0 :         CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
         291           0 :         RETURN
         292             :     ENDIF
         293           0 :     CALL HCO_ArrInit ( HcoState%Grid%PEDGE,      0, 0, 0, RC )
         294           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         295           0 :         CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
         296           0 :         RETURN
         297             :     ENDIF
         298           0 :     CALL HCO_ArrInit ( HcoState%Grid%YSIN,       0, 0,    RC )
         299           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         300           0 :         CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
         301           0 :         RETURN
         302             :     ENDIF
         303           0 :     CALL HCO_ArrInit ( HcoState%Grid%AREA_M2,    0, 0,    RC )
         304           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         305           0 :         CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
         306           0 :         RETURN
         307             :     ENDIF
         308           0 :     CALL HCO_ArrInit ( HcoState%Grid%PBLHEIGHT,  0, 0,    RC )
         309           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         310           0 :         CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
         311           0 :         RETURN
         312             :     ENDIF
         313           0 :     CALL HCO_ArrInit ( HcoState%Grid%BXHEIGHT_M, 0, 0, 0, RC )
         314           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         315           0 :         CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
         316           0 :         RETURN
         317             :     ENDIF
         318           0 :     CALL HCO_ArrInit ( HcoState%Grid%ZSFC,       0, 0,    RC )
         319           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         320           0 :         CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
         321           0 :         RETURN
         322             :     ENDIF
         323           0 :     CALL HCO_ArrInit ( HcoState%Grid%PSFC,       0, 0,    RC )
         324           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         325           0 :         CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
         326           0 :         RETURN
         327             :     ENDIF
         328             :
         329             :     ! Initialize vertical grid
         330           0 :     HcoState%Grid%ZGRID => NULL()
         331           0 :     CALL HCO_VertGrid_Init( HcoState%Grid%ZGRID, RC )
         332           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         333           0 :         CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
         334           0 :         RETURN
         335             :     ENDIF
         336             :
         337             :     !=====================================================================
         338             :     ! Set misc. parameter
         339             :     !=====================================================================
         340             :
         341             :     ! Physical constants (Source: NIST, 2014)
         342           0 :     ALLOCATE ( HcoState%Phys, STAT = AS )
         343             :     IF ( AS /= 0 ) THEN
         344           0 :        CALL HCO_ERROR( 'HEMCO physical constants', RC )
         345           0 :        RETURN
         346             :     ENDIF
         347           0 :     HcoState%Phys%Avgdr  = 6.022140857e23_dp
         348           0 :     HcoState%Phys%PI     = 3.14159265358979323_dp
         349           0 :     HcoState%Phys%PI_180 = HcoState%Phys%PI / 180.0_dp
         350           0 :     HcoState%Phys%Re     = 6.3710072e+6_dp                ! Was 6.375e6_dp
         351           0 :     HcoState%Phys%AIRMW  = 28.9644_dp                     ! Was 28.97_dp
         352           0 :     HcoState%Phys%g0     = 9.80665_dp
         353           0 :     HcoState%Phys%Rd     = 287.0_dp
         354           0 :     HcoState%Phys%Rdg0   = HcoState%Phys%Rd / HcoState%Phys%g0
         355           0 :     HcoState%Phys%RSTARG = 8.3144598_dp                   ! Was 8.31450_dp
         356             :
         357             :     ! Timesteps
         358           0 :     HcoState%TS_EMIS = 0.0_sp
         359           0 :     HcoState%TS_CHEM = 0.0_sp
         360           0 :     HcoState%TS_DYN  = 0.0_sp
         361             :
         362             : #ifdef ADJOINT
         363             :     HcoState%isAdjoint = .false.
         364             : #endif
         365             :
         366             :     ! Nullify temporary array. This array may be used as temporary
         367             :     ! place to write emissions into.
         368           0 :     HcoState%Buffer3D => NULL()
         369           0 :     CALL HCO_ArrInit( HcoState%Buffer3D, 0, 0, 0, RC )
         370           0 :     IF ( RC /= 0 ) RETURN
         371             :
         372             :     ! Dust bins (set default to 4)
         373           0 :     HcoState%nDust = 4
         374             :
         375             :     ! Turn off marine POA by default
         376           0 :     HcoState%MarinePOA = .FALSE.
         377             :
         378             :     ! Aerosol options
         379           0 :     ALLOCATE ( HcoState%MicroPhys, STAT = AS )
         380             :     IF ( AS /= 0 ) THEN
         381           0 :        CALL HCO_ERROR( 'HEMCO aerosol microphysics options', RC )
         382           0 :        RETURN
         383             :     ENDIF
         384           0 :     HcoState%MicroPhys%nBins           = 0
         385           0 :     HcoState%MicroPhys%nActiveModeBins = 0
         386           0 :     NULLIFY( HcoState%MicroPhys%BinBound )
         387             :
         388             :     ! Default HEMCO options
         389             :     ! ==> execute HEMCO core; use all species, categories; not ESMF; not dryrun
         390           0 :     ALLOCATE( HcoState%Options )
         391           0 :     HcoState%Options%ExtNr          =  0
         392           0 :     HcoState%Options%SpcMin         =  1
         393           0 :     HcoState%Options%SpcMax         = -1
         394           0 :     HcoState%Options%CatMin         =  1
         395           0 :     HcoState%Options%CatMax         = -1
         396           0 :     HcoState%Options%AutoFillDiagn  = .TRUE.
         397           0 :     HcoState%Options%HcoWritesDiagn = .FALSE.
         398           0 :     HcoState%Options%FillBuffer     = .FALSE.
         399           0 :     HcoState%Options%isESMF         = .FALSE.
         400           0 :     HcoState%Options%isDryRun       = .FALSE.
         401             :
         402             :     ! SetReadList has not been called yet
         403           0 :     HcoState%SetReadListCalled      = .FALSE.
         404             :
         405             :     ! Get negative flag value from configuration file. If not found, set to 0.
         406             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Negative values', &
         407           0 :                      OptValInt=HcoState%Options%NegFlag, Found=Found, RC=RC )
         408           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         409           0 :         CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
         410           0 :         RETURN
         411             :     ENDIF
         412           0 :     IF ( .NOT. Found ) HcoState%Options%NegFlag = 0
         413             :
         414             :     ! Get PBL_DRYDEP flag from configuration file. If not found, set to default
         415             :     ! value of false.
         416             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'PBL dry deposition', &
         417           0 :                      OptValBool=HcoState%Options%PBL_DRYDEP, Found=Found, RC=RC )
         418           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         419           0 :         CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
         420           0 :         RETURN
         421             :     ENDIF
         422           0 :     IF ( .NOT. Found ) HcoState%Options%PBL_DRYDEP = .FALSE.
         423             :
         424             :     ! Apply uniform scale factors specified in HEMCO_Config.rc?
         425             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Scale emissions', &
         426           0 :                      OptValBool=HcoState%Options%ScaleEmis, Found=Found, RC=RC )
         427           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         428           0 :         CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
         429           0 :         RETURN
         430             :     ENDIF
         431           0 :     IF ( .NOT. Found ) HcoState%Options%ScaleEmis = .TRUE.
         432             :
         433             :     ! Only shift hh/mm when applying time shift?
         434             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Cap time shift', &
         435             :                      OptValBool=HcoState%Options%TimeShiftCap, &
         436           0 :                      Found=Found, RC=RC )
         437           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         438           0 :         CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
         439           0 :         RETURN
         440             :     ENDIF
         441           0 :     IF ( .NOT. Found ) HcoState%Options%TimeShiftCap = .FALSE.
         442             :
         443             :     ! Get MaxDepExp from configuration file. If not found, set to default
         444             :     ! value of 20.
         445             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Maximum dep x ts', &
         446           0 :                      OptValHp=HcoState%Options%MaxDepExp, Found=Found, RC=RC )
         447           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         448           0 :         CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
         449           0 :         RETURN
         450             :     ENDIF
         451           0 :     IF ( .NOT. Found ) HcoState%Options%MaxDepExp = 20.0_hp
         452             :
         453             :     ! Get binary mask flag from configuration file. If not found, set to default
         454             :     ! value of TRUE.
         455             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Mask fractions', &
         456           0 :                      OptValBool=HcoState%Options%MaskFractions, Found=Found, RC=RC )
         457           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         458           0 :         CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
         459           0 :         RETURN
         460             :     ENDIF
         461           0 :     IF ( .NOT. Found ) HcoState%Options%MaskFractions = .FALSE.
         462             :
         463             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'ConfigField to diagnostics', &
         464           0 :                      OptValBool=HcoState%Options%Field2Diagn, Found=Found, RC=RC )
         465           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         466           0 :         CALL HCO_ERROR( 'ERROR 22', RC, THISLOC=LOC )
         467           0 :         RETURN
         468             :     ENDIF
         469           0 :     IF ( .NOT. Found ) HcoState%Options%Field2Diagn = .FALSE.
         470             :
         471             :     CALL GetExtOpt ( HcoConfig, CoreNr, 'Vertical weights', &
         472           0 :                      OptValBool=HcoState%Options%VertWeight, Found=Found, RC=RC )
         473           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         474           0 :         CALL HCO_ERROR( 'ERROR 23', RC, THISLOC=LOC )
         475           0 :         RETURN
         476             :     ENDIF
         477           0 :     IF ( .NOT. Found ) HcoState%Options%VertWeight = .TRUE.
         478             :
         479             :     ! Make sure ESMF pointers are not dangling
         480             : #if defined(ESMF_)
         481             :     HcoState%GridComp => NULL()
         482             :     HcoState%IMPORT   => NULL()
         483             :     HcoState%EXPORT   => NULL()
         484             : #endif
         485             :
         486             :     ! Read unit tolerance
         487           0 :     UnitTolerance = HCO_UnitTolerance( HcoConfig )
         488             :
         489             :     ! Connect to config object
         490           0 :     HcoState%Config => HcoConfig
         491             :
         492             :     ! Make sure pointers are not dangling
         493           0 :     HcoState%Diagn     => NULL()
         494           0 :     HcoState%EmisList  => NULL()
         495           0 :     HcoState%ReadLists => NULL()
         496           0 :     HcoState%Clock     => NULL()
         497           0 :     HcoState%cIDList   => NULL()
         498           0 :     HcoState%AlltIDx   => NULL()
         499             :
         500             :     ! Verbose mode
         501           0 :     IF ( HCO_IsVerb( HcoConfig%Err ) ) THEN
         502           0 :        WRITE(MSG,'(A68)') 'Initialized HEMCO state. Will use the following settings:'
         503           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         504           0 :        WRITE(MSG,'(A33,I2)') 'Unit tolerance                 : ', UnitTolerance
         505           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         506           0 :        WRITE(MSG,'(A33,I2)') 'Negative values                : ', HcoState%Options%NegFlag
         507           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         508           0 :        WRITE(MSG,'(A33,L2)') 'Mask fractions                 : ', HcoState%Options%MaskFractions
         509           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         510           0 :        WRITE(MSG,'(A33,L2)') 'Do drydep over entire PBL      : ', HcoState%Options%PBL_DRYDEP
         511           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         512           0 :        WRITE(MSG,'(A33,F6.2)') 'Upper limit for deposition x ts: ', HcoState%Options%MaxDepExp
         513           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         514           0 :        WRITE(MSG,'(A33,L2)') 'Scale emissions                : ', HcoState%Options%ScaleEmis
         515           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         516           0 :        WRITE(MSG,'(A33,L2)') 'Cap time shift                 : ', HcoState%Options%TimeShiftCap
         517           0 :        CALL HCO_MSG(HcoConfig%Err,MSG)
         518             :     ENDIF
         519             :
         520             :     ! Leave w/ success
         521           0 :     CALL HCO_LEAVE ( HcoConfig%Err, RC )
         522             :
         523             :   END SUBROUTINE HcoState_Init
         524             : !EOC
         525             : !------------------------------------------------------------------------------
         526             : !                   Harmonized Emissions Component (HEMCO)                    !
         527             : !------------------------------------------------------------------------------
         528             : !BOP
         529             : !
         530             : ! !IROUTINE: HcoState_Final
         531             : !
         532             : ! !DESCRIPTION: Routine HcoState\_CLEANUP cleans up HcoState.
         533             : !\\
         534             : !\\
         535             : ! !INTERFACE:
         536             : !
         537           0 :   SUBROUTINE HcoState_Final( HcoState )
         538             : !
         539             : ! !INPUT/OUTPUT PARAMETERS:
         540             : !
         541             :     TYPE(HCO_State), POINTER  :: HcoState    ! HEMCO State object
         542             : !
         543             : ! !REVISION HISTORY:
         544             : !  20 Aug 2013 - C. Keller   - Adapted from gigc_state_chm_mod.F90
         545             : !  See https://github.com/geoschem/hemco for complete history
         546             : !EOP
         547             : !------------------------------------------------------------------------------
         548             : !BOC
         549             : !
         550             : ! !LOCAL VARIABLES:
         551             : !
         552             :     INTEGER  :: I
         553             :
         554             :     !=====================================================================
         555             :     ! HcoState_Final begins here!
         556             :     !=====================================================================
         557             :
         558             :     ! Deallocate buffer array
         559           0 :     CALL HCO_ArrCleanup ( HcoState%Buffer3D )
         560             :
         561             :     ! Deallocate all species arrays
         562           0 :     IF ( ASSOCIATED ( HcoState%Spc ) .and. HcoState%nSpc > 0 ) THEN
         563           0 :        DO I = 1, HcoState%nSpc
         564           0 :           CALL HCO_ArrCleanup( HcoState%Spc(I)%Emis )
         565           0 :           CALL HCO_ArrCleanup( HcoState%Spc(I)%Conc )
         566           0 :           CALL HCO_ArrCleanup( HcoState%Spc(I)%Depv )
         567             :        ENDDO
         568           0 :        DEALLOCATE( HcoState%Spc )
         569             :     ENDIF
         570             :
         571             :     ! Deallocate grid information
         572           0 :     IF ( ASSOCIATED ( HcoState%Grid) ) THEN
         573           0 :        CALL HCO_VertGrid_Cleanup( HcoState%Grid%ZGRID )
         574           0 :        CALL HCO_ArrCleanup( HcoState%Grid%XMID        )
         575           0 :        CALL HCO_ArrCleanup( HcoState%Grid%YMID        )
         576           0 :        CALL HCO_ArrCleanup( HcoState%Grid%XEDGE       )
         577           0 :        CALL HCO_ArrCleanup( HcoState%Grid%YEDGE       )
         578           0 :        CALL HCO_ArrCleanup( HcoState%Grid%PEDGE       )
         579           0 :        CALL HCO_ArrCleanup( HcoState%Grid%YSIN        )
         580           0 :        CALL HCO_ArrCleanup( HcoState%Grid%AREA_M2     )
         581           0 :        CALL HCO_ArrCleanup( HcoState%Grid%PBLHEIGHT   )
         582           0 :        CALL HCO_ArrCleanup( HcoState%Grid%BXHEIGHT_M  )
         583           0 :        CALL HCO_ArrCleanup( HcoState%Grid%ZSFC        )
         584           0 :        CALL HCO_ArrCleanup( HcoState%Grid%PSFC        )
         585           0 :        DEALLOCATE(HcoState%Grid)
         586             :     ENDIF
         587             :
         588             :     ! Deallocate microphysics information
         589           0 :     IF ( ASSOCIATED( HcoState%MicroPhys ) ) THEN
         590           0 :        IF ( HcoState%MicroPhys%nBins > 0 ) THEN
         591           0 :           IF ( ASSOCIATED( HcoState%MicroPhys%BinBound ) ) THEN
         592           0 :              NULLIFY( HcoState%MicroPhys%BinBound )
         593             :           ENDIF
         594           0 :           DEALLOCATE( HcoState%MicroPhys )
         595             :        ENDIF
         596             :     ENDIf
         597             :
         598             :     ! Cleanup various types
         599           0 :     IF ( ASSOCIATED ( HcoState%Options ) ) DEALLOCATE ( HcoState%Options )
         600           0 :     IF ( ASSOCIATED ( HcoState%Phys    ) ) DEALLOCATE ( HcoState%Phys    )
         601             :
         602             : #if defined(ESMF_)
         603             :     HcoState%GridComp => NULL()
         604             :     HcoState%IMPORT   => NULL()
         605             :     HcoState%EXPORT   => NULL()
         606             : #endif
         607             :
         608           0 :   END SUBROUTINE HcoState_Final
         609             : !EOC
         610             : !------------------------------------------------------------------------------
         611             : !                   Harmonized Emissions Component (HEMCO)                    !
         612             : !------------------------------------------------------------------------------
         613             : !BOP
         614             : !
         615             : ! !IROUTINE: HCO_GetModSpcId
         616             : !
         617             : ! !DESCRIPTION: Function HCO\_GetModSpcId returns the model species index
         618             : ! of a species by name. Returns -1 if given species is not found, 0 if
         619             : ! name corresponds to the HEMCO wildcard character.
         620             : !\\
         621             : !\\
         622             : ! !INTERFACE:
         623             : !
         624           0 :   FUNCTION HCO_GetModSpcID( name, HcoState ) RESULT( Indx )
         625             : !
         626             : ! !USES:
         627             : !
         628             :       USE HCO_EXTLIST_MOD,     ONLY : HCO_GetOpt
         629             : !
         630             : ! !INPUT PARAMETERS:
         631             : !
         632             :     CHARACTER(LEN=*), INTENT(IN)    :: name      ! Species name
         633             : !
         634             : ! !INPUT/OUTPUT PARAMETERS:
         635             : !
         636             :     TYPE(HCO_State),  INTENT(INOUT) :: HcoState  ! HEMCO State
         637             : !
         638             : ! !RETURN VALUE:
         639             : !
         640             :     INTEGER                         :: Indx      ! Index of this species
         641             : !
         642             : ! !REVISION HISTORY:
         643             : !  20 Aug 2013 - C. Keller - Adapted from gigc_state_chm_mod.F90
         644             : !  See https://github.com/geoschem/hemco for complete history
         645             : !EOP
         646             : !------------------------------------------------------------------------------
         647             : !BOC
         648             : !
         649             : ! !LOCAL VARIABLES:
         650             : !
         651             :     INTEGER :: N
         652             :
         653             :     ! Default
         654           0 :     Indx = -1
         655             :
         656             :     ! Return 0 if wildcard character
         657           0 :     IF ( TRIM(name) == TRIM(HCO_GetOpt(HcoState%Config%ExtList,'Wildcard')) ) THEN
         658           0 :        Indx = 0
         659           0 :        RETURN
         660             :     ENDIF
         661             :
         662             :     ! Loop over all species names
         663           0 :     DO N = 1, HcoState%nSpc
         664             :
         665             :        ! Return the index of the sought-for species
         666           0 :        IF( TRIM( name ) == TRIM( HcoState%Spc(N)%SpcName ) ) THEN
         667           0 :           Indx = HcoState%Spc(N)%ModID
         668           0 :           EXIT
         669             :        ENDIF
         670             :
         671             :     ENDDO
         672             :
         673             :   END FUNCTION HCO_GetModSpcID
         674             : !EOC
         675             : !------------------------------------------------------------------------------
         676             : !                   Harmonized Emissions Component (HEMCO)                    !
         677             : !------------------------------------------------------------------------------
         678             : !BOP
         679             : !
         680             : ! !IROUTINE: HCO_GetHcoId
         681             : !
         682             : ! !DESCRIPTION: Function HCO\_GetHcoIdHCO returns the HEMCO species index
         683             : ! of a species by name. Returns -1 if given species is not found, 0 if
         684             : ! name corresponds to the HEMCO wildcard character.
         685             : !\\
         686             : !\\
         687             : ! !INTERFACE:
         688             : !
         689           0 :   FUNCTION HCO_GetHcoID( name, HcoState ) RESULT( Indx )
         690             : !
         691             : ! !USES:
         692             : !
         693             :       USE HCO_EXTLIST_MOD,   ONLY : HCO_GetOpt
         694             : !
         695             : ! !INPUT PARAMETERS:
         696             : !
         697             :     CHARACTER(LEN=*), INTENT(IN)   :: name         ! Species name
         698             :     TYPE(HCO_State), INTENT(INOUT) :: HcoState     ! HEMCO State
         699             : !
         700             : ! !RETURN VALUE:
         701             : !
         702             :     INTEGER                      :: Indx         ! Index of this species
         703             : !
         704             : ! !REVISION HISTORY:
         705             : !  20 Aug 2013 - C. Keller - Adapted from gigc_state_chm_mod.F90
         706             : !  See https://github.com/geoschem/hemco for complete history
         707             : !EOP
         708             : !------------------------------------------------------------------------------
         709             : !BOC
         710             : !
         711             : ! !LOCAL VARIABLES:
         712             : !
         713             :     INTEGER :: N
         714             :
         715             :     ! Default
         716           0 :     Indx = -1
         717             :
         718             :     ! Return 0 if wildcard character
         719           0 :     IF ( TRIM(name) == TRIM(HCO_GetOpt(HcoState%Config%ExtList,'Wildcard')) ) THEN
         720           0 :        Indx = 0
         721           0 :        RETURN
         722             :     ENDIF
         723             :
         724             :     ! Loop over all species names
         725           0 :     DO N = 1, HcoState%nSpc
         726             :
         727             :        ! Return the index of the sought-for species
         728           0 :        IF( TRIM( name ) == TRIM( HcoState%Spc(N)%SpcName ) ) THEN
         729           0 :           Indx = N
         730           0 :           EXIT
         731             :        ENDIF
         732             :     ENDDO
         733             :
         734             :   END FUNCTION HCO_GetHcoID
         735             : !EOC
         736             : !------------------------------------------------------------------------------
         737             : !                   Harmonized Emissions Component (HEMCO)                    !
         738             : !------------------------------------------------------------------------------
         739             : !BOP
         740             : !
         741             : ! !ROUTINE: HCO_GetExtHcoID
         742             : !
         743             : ! !DESCRIPTION: Subroutine HCO\_GetExtHcoID returns the HEMCO species IDs
         744             : ! and names for all species assigned to the given extension (identified by
         745             : ! its extension number).
         746             : !\\
         747             : !\\
         748             : ! !INTERFACE:
         749             : !
         750           0 :   SUBROUTINE HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, &
         751             :                               SpcNames, nSpc,  RC       )
         752             : !
         753             : ! !USES:
         754             : !
         755             :     USE HCO_CHARPAK_MOD,     ONLY : STRSPLIT
         756             :     USE HCO_EXTLIST_MOD,     ONLY : GetExtSpcStr
         757             :     USE HCO_EXTLIST_MOD,     ONLY : HCO_GetOpt
         758             : !
         759             : ! !INPUT PARAMETERS:
         760             : !
         761             :     TYPE(HCO_State),               POINTER       :: HcoState
         762             :     INTEGER,                       INTENT(IN   ) :: ExtNr       ! Extension #
         763             : !
         764             : ! !OUTPUT PARAMETERS:
         765             : !
         766             :     INTEGER,          ALLOCATABLE, INTENT(  OUT) :: HcoIDs(:)   ! Species IDs
         767             : !
         768             : ! !INPUT/OUTPUT PARAMETERS:
         769             : !
         770             :     CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) :: SpcNames(:) ! Species names
         771             :     INTEGER,                       INTENT(INOUT) :: nSpc        ! # of species
         772             :     INTEGER,                       INTENT(INOUT) :: RC          ! Success/fail
         773             : !
         774             : ! !REVISION HISTORY:
         775             : !  10 Jan 2014 - C. Keller: Initialization (update)
         776             : !  See https://github.com/geoschem/hemco for complete history
         777             : !EOP
         778             : !------------------------------------------------------------------------------
         779             : !BOC
         780             : !
         781             : ! !LOCAL VARIABLES:
         782             : !
         783             :     INTEGER             :: I,      AS
         784             :     CHARACTER(LEN=255)  :: MSG,    LOC
         785             :     CHARACTER(LEN=2047) :: SpcStr, SUBSTR(255)
         786             :     CHARACTER(LEN=2047) :: TmpStr
         787             :
         788             :     !======================================================================
         789             :     ! HCO_GetExtHcoID begins here
         790             :     !======================================================================
         791             :
         792             :     ! Enter
         793           0 :     LOC = 'HCO_GetExtHcoID (hco_state_mod.F90)'
         794             :
         795             :     ! Get all species names belonging to extension Nr. ExtNr
         796           0 :     CALL GetExtSpcStr( HcoState%Config, ExtNr, SpcStr, RC )
         797           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         798           0 :         CALL HCO_ERROR( 'ERROR 24', RC, THISLOC=LOC )
         799           0 :         RETURN
         800             :     ENDIF
         801             :
         802             :     ! Split character into species string.
         803           0 :     CALL STRSPLIT( SpcStr, HCO_GetOpt(HcoState%Config%ExtList,'Separator'), SUBSTR, nSpc )
         804             :
         805             :     ! nothing to do if there are no species
         806           0 :     IF ( nSpc == 0 ) RETURN
         807             :
         808             :     ! Allocate arrays
         809           0 :     IF ( ALLOCATED(HcoIDs  ) ) DEALLOCATE(HcoIDs  )
         810           0 :     IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
         811           0 :     ALLOCATE(HcoIDs(nSpc), SpcNames(nSpc), STAT=AS)
         812             : #if defined( MODEL_GEOS )
         813             :     SpcNames(:) = ''
         814             :     HcoIDs(:)   = -1
         815             : #endif
         816           0 :     IF ( AS/=0 ) THEN
         817           0 :        CALL HCO_ERROR('HcoIDs allocation error', RC, THISLOC=LOC)
         818           0 :        RETURN
         819             :     ENDIF
         820             :
         821             :     ! Extract species information
         822           0 :     DO I = 1, nSpc
         823             :        !---------------------------------------------------------------------
         824             :        ! Prior to 6/26/18:
         825             :        ! This code can cause issues with certain compiler versions,
         826             :        ! so let's rewrite it slightly (bmy, 6/26/18)
         827             :        !SpcNames(I) = SUBSTR(I)
         828             :        !HcoIDs(I)   = HCO_GetHcoID( TRIM(SpcNames(I)), HcoState )
         829             :        !---------------------------------------------------------------------
         830             :
         831             :        ! Rewrite this code to be a little more friendly to compilers with
         832             :        ! strict string-parsing syntax, such as ifort 17. ALSO NOTE: We don't
         833             :        ! necessarily have to do the TRIM in the call to HCO_GetHcoID, because
         834             :        ! the species name will be TRIMmed internally.  We have noticed that
         835             :        ! some compilers don't like taking the TRIM of an array element as
         836             :        ! an argument to a function call. (bmy, 6/26/18)
         837           0 :        TmpStr      = SubStr(I)
         838           0 :        SpcNames(I) = TRIM( TmpStr )
         839           0 :        HcoIDs(I)   = HCO_GetHcoID( TmpStr, HcoState )
         840             :     ENDDO
         841             :
         842             :     ! Return w/ success
         843           0 :     RC = HCO_SUCCESS
         844             :
         845           0 :   END SUBROUTINE HCO_GetExtHcoID
         846             : !EOC
         847           0 : END MODULE HCO_STATE_MOD

Generated by: LCOV version 1.14