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

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hco_driver_mod.F90
           7             : !
           8             : ! !DESCRIPTION: Module HCO\_Driver\_Mod contains the driver routines
           9             : ! (INIT, RUN, FINAL) for the HEMCO core module. It calls all the
          10             : ! subroutines to initialize, execute and finalize the HEMCO core
          11             : ! emissions calculations, i.e. all emissions not calculated in a HEMCO
          12             : ! extension (See module hcox\_driver\_mod.F90 for the extensions).
          13             : !\\
          14             : !\\
          15             : ! Call this module at the HEMCO - model interface level to execute the
          16             : ! HEMCO core operations.
          17             : !\\
          18             : !\\
          19             : ! !INTERFACE:
          20             : !
          21             : MODULE HCO_Driver_Mod
          22             : !
          23             : ! !USES:
          24             : !
          25             :   USE HCO_Error_Mod
          26             :   USE HCO_State_Mod, ONLY : HCO_State
          27             :
          28             :   IMPLICIT NONE
          29             :   PRIVATE
          30             : !
          31             : ! !PUBLIC MEMBER FUNCTIONS:
          32             : !
          33             :   PUBLIC :: HCO_Init
          34             :   PUBLIC :: HCO_Run
          35             :   PUBLIC :: HCO_Final
          36             : !
          37             : ! !REVISION HISTORY:
          38             : !  27 May 2012 - C. Keller   - Initialization
          39             : !  See https://github.com/geoschem/hemco for complete history
          40             : !EOP
          41             : !------------------------------------------------------------------------------
          42             : !BOC
          43             : CONTAINS
          44             : !EOC
          45             : !------------------------------------------------------------------------------
          46             : !                   Harmonized Emissions Component (HEMCO)                    !
          47             : !------------------------------------------------------------------------------
          48             : !BOP
          49             : !
          50             : ! !IROUTINE: HCO_Run
          51             : !
          52             : ! !DESCRIPTION: Subroutine HCO\_Run is the HEMCO core run routine. It
          53             : ! calculates the HEMCO emissions as specified in the HEMCO configuration
          54             : ! file. All calculation settings, such as the extension number, the
          55             : ! lowest and highest species ID, and the lowest and highest emission
          56             : ! category, are passed through the HEMCO options object (HcoState%Opt).
          57             : ! The time stamp is taken from the HEMCO clock object. Subroutine
          58             : ! HcoClock\_Set should be used to update the HEMCO clock (see module
          59             : ! hco\_clock\_mod.F90). This should be done at the HEMCO - model
          60             : ! interface level.
          61             : !\\
          62             : !\\
          63             : ! !INTERFACE:
          64             : !
          65           0 :   SUBROUTINE HCO_Run( HcoState, Phase, RC, IsEndStep )
          66             : !
          67             : ! !USES:
          68             : !
          69             :     USE HCO_Calc_Mod,     ONLY : HCO_CalcEmis
          70             :     USE HCO_ReadList_Mod, ONLY : ReadList_Read
          71             :     USE HCO_Clock_Mod,    ONLY : HcoClock_Get
          72             :     USE HCO_Clock_Mod,    ONLY : HcoClock_First
          73             :     USE HCO_Clock_Mod,    ONLY : HcoClock_InitTzPtr
          74             :     USE HCOIO_DIAGN_MOD,  ONLY : HcoDiagn_Write
          75             : !
          76             : ! !INPUT PARAMETERS:
          77             : !
          78             :     INTEGER,         INTENT(IN   ) :: Phase       ! Run phase (1 or 2)
          79             :     LOGICAL,         INTENT(IN   ), OPTIONAL :: IsEndStep ! Last timestep of simulation?
          80             : !
          81             : ! !INPUT/OUTPUT PARAMETERS:
          82             : !
          83             :     TYPE(HCO_State), POINTER       :: HcoState    ! HEMCO state object
          84             :     INTEGER,         INTENT(INOUT) :: RC          ! Success or failure?
          85             : !
          86             : ! !REVISION HISTORY:
          87             : !  27 May 2012 - C. Keller   - Initialization
          88             : !  See https://github.com/geoschem/hemco for complete history
          89             : !EOP
          90             : !------------------------------------------------------------------------------
          91             : !BOC
          92             : !
          93             : ! !LOCAL VARIABLES:
          94             : !
          95             :     ! Scalars
          96             :     LOGICAL            :: IsEmisTime
          97             :     LOGICAL            :: notDryRun
          98             :     LOGICAL            :: ItIsEndStep
          99             :
         100             :     ! Strings
         101             :     CHARACTER(LEN=255) :: MSG, LOC
         102             :
         103             :     !=================================================================
         104             :     ! HCO_RUN begins here!
         105             :     !=================================================================
         106           0 :     LOC = 'HCO_RUN (HCO_DRIVER_MOD.F90)'
         107             :
         108             :     ! Enter
         109           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         110           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         111           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         112           0 :         RETURN
         113             :     ENDIF
         114             :
         115             :     ! Define a local convenience variable to negate HcoState%Options%isDryRun
         116           0 :     notDryRun = ( .not. HcoState%Options%isDryRun )
         117             :
         118             :     ! Define a shadow variable for optional argument IsEndStep
         119           0 :     IF ( PRESENT( IsEndStep ) ) THEN
         120           0 :        ItIsEndStep = IsEndStep
         121             :     ELSE
         122             :        ItIsEndStep = .FALSE.
         123             :     ENDIF
         124             :
         125             :     !--------------------------------------------------------------
         126             :     ! 1. Check if it's time for emissions
         127             :     !--------------------------------------------------------------
         128           0 :     CALL HcoClock_Get ( HcoState%Clock, IsEmisTime=IsEmisTime, RC=RC )
         129           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         130           0 :         CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         131           0 :         RETURN
         132             :     ENDIF
         133             :
         134             :     !--------------------------------------------------------------
         135             :     ! 2. Write HEMCO diagnostics. Do this only if the corresponding
         136             :     ! option is enabled. Otherwise, let the user decide when to
         137             :     ! call HcoDiagn_Write.  Skip if it is a GEOS-Chem "dry-run".
         138             :     !--------------------------------------------------------------
         139           0 :     IF ( HcoState%Options%HcoWritesDiagn .and. notDryRun ) THEN
         140           0 :        CALL HcoDiagn_Write( HcoState, .FALSE., RC )
         141           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         142           0 :            CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         143           0 :            RETURN
         144             :        ENDIF
         145             :     ENDIF
         146             :
         147             :     ! Check if this is the last timestep of simulation. If so, return
         148             :     ! and not read in update data.
         149           0 :     IF ( ItIsEndStep .and. notDryRun ) RETURN
         150             :
         151             :     !--------------------------------------------------------------
         152             :     ! 3. Read/update data
         153             :     !
         154             :     ! Check if there are any data files that need to be read or
         155             :     ! updated, e.g. on the first call of HEMCO or if we enter a new
         156             :     ! month, year, etc.
         157             :     !
         158             :     ! NOTE: If this is a GEOS-Chem "dry-run", then HEMCO will
         159             :     ! print the files that will be read to either the stdout
         160             :     ! (log file) and HEMCO log file, but will not read them.
         161             :     !--------------------------------------------------------------
         162             :
         163             :     ! Update data, as specified in ReadList.
         164           0 :     IF ( Phase /= 2 ) THEN
         165           0 :        CALL ReadList_Read( HcoState, RC )
         166           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         167           0 :           PRINT *, "Error in ReadList_Read called from hco_run"
         168           0 :           RETURN
         169             :        ENDIF
         170             :
         171             :        ! If we are reading timezone data (i.e. offsets from UTC in hours)
         172             :        ! from a file, then we need to initialize the TIMEZONES pointer
         173             :        ! variable in hco_clock_mod.F90.  This has to be done only on the
         174             :        ! very first emissions timestep, after the call to READLIST_READ.
         175             :        ! We must leave this call here (instead of in the more customary
         176             :        ! initialization routine HCO_INIT) because the HEMCO configuration
         177             :        ! file has to be read in its entirety before the timezone data
         178             :        ! is loaded into a data container. (bmy, 2/23/15)
         179           0 :        IF ( HcoClock_First(HcoState%Clock,.FALSE.) ) THEN
         180           0 :           CALL HcoClock_InitTzPtr( HcoState, RC )
         181             :        ENDIF
         182             :
         183             :     ENDIF
         184             :
         185             :
         186             :     !-----------------------------------------------------------------
         187             :     ! 4. Calculate the emissions for current time stamp based on the
         188             :     ! content of EmisList. Emissions become written into HcoState.
         189             :     ! Do this only if it's time for emissions and NOT a dry-run.
         190             :     !-----------------------------------------------------------------
         191           0 :     IF ( IsEmisTime .AND. Phase > 1 .and. notDryRun ) THEN
         192             :
         193             :        ! Use emission data only
         194           0 :        CALL HCO_CalcEmis( HcoState, .FALSE., RC )
         195           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         196           0 :            CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
         197           0 :            RETURN
         198             :        ENDIF
         199             :
         200             :        ! Use concentration data only
         201             :        ! This is currently not being used. Concentrations can be read
         202             :        ! through HEMCO but should be assembled manually.
         203             :        !CALL HCO_CalcEmis( HcoState, .TRUE., RC )
         204             :        !IF ( RC /= HCO_SUCCESS ) RETURN
         205             :     ENDIF
         206             :
         207             :     ! Leave w/ success
         208           0 :     CALL HCO_LEAVE( HcoState%Config%Err, RC )
         209             :
         210             :   END SUBROUTINE HCO_Run
         211             : !EOC
         212             : !------------------------------------------------------------------------------
         213             : !                   Harmonized Emissions Component (HEMCO)                    !
         214             : !------------------------------------------------------------------------------
         215             : !BOP
         216             : !
         217             : ! !IROUTINE: HCO_Init
         218             : !
         219             : ! !DESCRIPTION: Subroutine HCO\_INIT initializes the HEMCO core modules.
         220             : ! This routine assumes that the HEMCO configuration file has already been
         221             : ! read to buffer (subroutine Config\_ReadFile in HCO\_CONFIG\_MOD.F90)
         222             : ! and that the HEMCO state object has already been initialized. This has
         223             : ! to be done at the HEMCO - model interface level.
         224             : !\\
         225             : !\\
         226             : ! !INTERFACE:
         227             : !
         228           0 :   SUBROUTINE HCO_Init( HcoState, RC )
         229             : !
         230             : ! !USES:
         231             : !
         232             :     USE HCO_Diagn_Mod,    ONLY : HcoDiagn_Init
         233             :     USE HCO_tIdx_Mod,     ONLY : tIDx_Init
         234             :     USE HCO_Clock_Mod,    ONLY : HcoClock_Init
         235             :     USE HCO_Config_Mod,   ONLY : SetReadList
         236             :     USE HCO_Scale_Mod,    ONLY : HCO_ScaleInit
         237             : !
         238             : ! !INPUT/OUTPUT PARAMETERS:
         239             : !
         240             :     TYPE(HCO_State),  POINTER       :: HcoState   ! HcoState object
         241             :     INTEGER,          INTENT(INOUT) :: RC         ! Failure or success
         242             : !
         243             : ! !REVISION HISTORY:
         244             : !  27 May 2012 - C. Keller   - Initialization
         245             : !  See https://github.com/geoschem/hemco for complete history
         246             : !EOP
         247             : !------------------------------------------------------------------------------
         248             : !BOC
         249             : !
         250             : !
         251             : ! !LOCAL VARIABLES:
         252             : !
         253             :     CHARACTER(LEN=255)  :: LOC
         254             :     !=================================================================
         255             :     ! HCO_INIT begins here!
         256             :     !=================================================================
         257           0 :     LOC = 'HCO_INIT (HCO_DRIVER_MOD.F90)'
         258             :
         259             :     ! Enter
         260           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         261           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         262           0 :        PRINT *, "Error in HCO_ENTER called from HCO_Init"
         263           0 :        RETURN
         264             :     ENDIF
         265             :
         266             :     ! Initialize time slice pointers
         267           0 :     CALL tIDx_Init( HcoState, RC )
         268           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         269           0 :        PRINT *, "Error in tIDx_Init called from HCO_Init"
         270           0 :        RETURN
         271             :     ENDIF
         272             :
         273             :     ! Initialize HEMCO Clock
         274           0 :     HcoState%Clock => NULL()
         275           0 :     CALL HcoClock_Init( HcoState, RC )
         276           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         277           0 :        PRINT *, "Error in HcoClock_Init called from HCO_Init"
         278           0 :        RETURN
         279             :     ENDIF
         280             :
         281             :     ! Initialize the HEMCO diagnostics
         282           0 :     CALL HcoDiagn_Init( HcoState, RC )
         283           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         284           0 :        PRINT *, "Error in HcoDiagn_Init called from HCO_Init"
         285           0 :        RETURN
         286             :     ENDIF
         287             :
         288             :     ! Set ReadList based upon the content of the configuration file.
         289           0 :     CALL SetReadList( HcoState, RC )
         290           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         291           0 :        PRINT *, "Error in SetReadList called from HCO_Init"
         292           0 :        RETURN
         293             :     ENDIF
         294             :
         295             :     ! Define universal scale factor for each HEMCO species
         296           0 :     CALL Hco_ScaleInit( HcoState, RC )
         297           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         298           0 :        PRINT *, "Error in Hco_ScaleInit called from HCO_Init"
         299           0 :        RETURN
         300             :     ENDIF
         301             :
         302             :     ! Leave w/ success
         303           0 :     CALL HCO_LEAVE ( HcoState%Config%Err, RC )
         304             :
         305             :   END SUBROUTINE HCO_Init
         306             : !EOC
         307             : !------------------------------------------------------------------------------
         308             : !                   Harmonized Emissions Component (HEMCO)                    !
         309             : !------------------------------------------------------------------------------
         310             : !BOP
         311             : !
         312             : ! !IROUTINE: HCO_Final
         313             : !
         314             : ! !DESCRIPTION: Subroutine HCO\_Final finalizes HEMCO core.
         315             : !\\
         316             : !\\
         317             : ! !INTERFACE:
         318             : !
         319           0 :   SUBROUTINE HCO_Final( HcoState, ERROR, RC )
         320             : !
         321             : ! !USES:
         322             : !
         323             :     USE HCO_Clock_Mod,     ONLY : HcoClock_Cleanup
         324             :     USE HCO_tIdx_Mod,      ONLY : tIDx_Cleanup
         325             :     USE HCO_DataCont_Mod,  ONLY : cIDList_Cleanup
         326             :     USE HCO_ReadList_Mod,  ONLY : ReadList_Cleanup
         327             :     USE HCO_DataCont_Mod,  ONLY : ListCont_Cleanup
         328             :     USE HCO_ExtList_Mod,   ONLY : ExtFinal
         329             :     USE HCOIO_DIAGN_MOD,   ONLY : HcoDiagn_Write
         330             :     USE HCO_Scale_Mod,     ONLY : HCO_ScaleFinal
         331             : !
         332             : ! !INPUT PARAMETERS:
         333             : !
         334             :     LOGICAL,          INTENT(IN   ) :: ERROR      ! Cleanup because of crash?
         335             : !
         336             : ! !INPUT/OUTPUT PARAMETERS:
         337             : !
         338             :     TYPE(HCO_State),  POINTER       :: HcoState   ! HcoState object
         339             :     INTEGER,          INTENT(INOUT) :: RC         ! Failure or success
         340             : !
         341             : ! !REMARKS:
         342             : !  (1) ConfigFile_Cleanup also cleans up the data containers, while routine
         343             : !       EmisList_Cleanup and ReadList_Cleanup only removes the pointers to
         344             : !       them. Hence, we have to call these routines before ConfigFile_Cleanup!
         345             : !  (2) HcoState is cleaned up in the HEMCO-module interface.
         346             : !
         347             : ! !REVISION HISTORY:
         348             : !  27 May 2012 - C. Keller   - Initialization
         349             : !  See https://github.com/geoschem/hemco for complete history
         350             : !EOP
         351             : !------------------------------------------------------------------------------
         352             : !BOC
         353             :
         354             :     !=================================================================
         355             :     ! HCO_FINAL begins here
         356             :     !=================================================================
         357             :
         358             :     ! Write diagnostics if needed
         359           0 :     IF ( HcoState%Options%HcoWritesDiagn .AND. .NOT. ERROR ) THEN
         360           0 :        CALL  HcoDiagn_Write( HcoState, .FALSE., RC )
         361           0 :        CALL  HcoDiagn_Write( HcoState, .TRUE.,  RC )
         362             :     ENDIF
         363             :
         364           0 :     CALL cIDList_Cleanup  ( HcoState                           )
         365           0 :     CALL HcoClock_Cleanup ( HcoState%Clock                     )
         366           0 :     CALL tIDx_Cleanup     ( HcoState%AlltIDx                   )
         367           0 :     CALL ReadList_Cleanup ( HcoState%ReadLists,        .FALSE. )
         368           0 :     CALL ListCont_Cleanup ( HcoState%EmisList,         .FALSE. )
         369           0 :     CALL ListCont_Cleanup ( HcoState%Config%ConfigList, .TRUE. )
         370           0 :     HcoState%nnEmisCont = 0
         371           0 :     HcoState%SetReadListCalled = .FALSE.
         372             :
         373             :     ! Cleanup scaling factors
         374           0 :     CALL HCO_ScaleFinal()
         375             :
         376             :     ! Cleanup the extension list object
         377           0 :     CALL ExtFinal         ( HcoState%Config%ExtList )
         378             :
         379             :     ! Close the logfile and cleanup error object.
         380           0 :     CALL HCO_Error_Final  ( HcoState%Config%Err )
         381             :
         382             :     ! Return w/ success
         383           0 :     RC = HCO_SUCCESS
         384             :
         385           0 :   END SUBROUTINE HCO_Final
         386             : !EOC
         387             : END MODULE HCO_Driver_Mod

Generated by: LCOV version 1.14