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

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hco_interface_common
           7             : !
           8             : ! !DESCRIPTION: Module HCO\_Interface\_Common defines common utilities for interfacing
           9             : !  with HEMCO from other models. The common toolbox should be present for all
          10             : !  models interacting with HEMCO.
          11             : !\\
          12             : !\\
          13             : ! !INTERFACE:
          14             : !
          15             : MODULE HCO_Interface_Common
          16             : !
          17             : ! !USES:
          18             : !
          19             :   USE HCO_Error_Mod
          20             :   USE HCO_State_Mod,  ONLY: HCO_State
          21             :   USE HCOX_State_Mod, ONLY: Ext_State
          22             :
          23             :   IMPLICIT NONE
          24             :   PRIVATE
          25             : !
          26             : ! !PUBLIC MEMBER FUNCTIONS:
          27             : !
          28             :   PUBLIC  :: SetHcoTime
          29             :   PUBLIC  :: GetHcoVal
          30             :   PUBLIC  :: GetHcoDiagn
          31             : !
          32             : ! !REMARKS:
          33             : !  These utilities were mostly migrated from GEOS-Chem HCO_Interface_Mod.
          34             : !  All functions now accept as input the HEMCO state (HcoState) as there may
          35             : !  be multiple instances and all variables should not be inferred.
          36             : !
          37             : ! !REVISION HISTORY:
          38             : !  12 Mar 2020 - H.P. Lin    - Initial version
          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: SetHcoTime
          51             : !
          52             : ! !DESCRIPTION: SUBROUTINE SetHcoTime sets the current simulation
          53             : ! datetime in HcoState.
          54             : !\\
          55             : !\\
          56             : ! !INTERFACE:
          57             : !
          58           0 :   SUBROUTINE SetHcoTime( HcoState,  ExtState,   year,   month,  &
          59             :                          day,       dayOfYr,    hour,   minute, &
          60             :                          second,    IsEmisTime, RC             )
          61             : !
          62             : ! !USES:
          63             : !
          64             :     USE HCO_CLOCK_MOD, ONLY : HcoClock_Set
          65             : !
          66             : ! !INPUT PARAMETERS:
          67             : !
          68             :     TYPE(HCO_State), POINTER       :: HcoState    ! HEMCO state object
          69             :     TYPE(Ext_State), POINTER       :: ExtState    ! HEMCO extensions state object
          70             :     INTEGER,         INTENT(IN)    :: year        ! UTC year
          71             :     INTEGER,         INTENT(IN)    :: month       ! UTC month
          72             :     INTEGER,         INTENT(IN)    :: day         ! UTC day
          73             :     INTEGER,         INTENT(IN)    :: dayOfYr     ! UTC day of year
          74             :     INTEGER,         INTENT(IN)    :: hour        ! UTC hour
          75             :     INTEGER,         INTENT(IN)    :: minute      ! UTC minute
          76             :     INTEGER,         INTENT(IN)    :: second      ! UTC second
          77             :     LOGICAL,         INTENT(IN)    :: IsEmisTime  ! Time for emissions?
          78             : !
          79             : ! !INPUT/OUTPUT PARAMETERS:
          80             : !
          81             :     INTEGER,         INTENT(INOUT) :: RC
          82             : !
          83             : ! !REVISION HISTORY:
          84             : !  23 Oct 2012 - C. Keller - Initial Version
          85             : !  See https://github.com/geoschem/hemco for complete history
          86             : !EOP
          87             : !------------------------------------------------------------------------------
          88             : !BOC
          89             : !
          90             : ! LOCAL VARIABLES:
          91             : !
          92             :     !=================================================================
          93             :     ! SetHcoTime begins here
          94             :     !=================================================================
          95             :
          96             :     CALL HcoClock_Set ( HcoState, year, month, day, hour, minute, &
          97           0 :                         second, dayOfYr, IsEmisTime=IsEmisTime, RC=RC )
          98             :
          99           0 :   END SUBROUTINE SetHcoTime
         100             : !EOC
         101             : !------------------------------------------------------------------------------
         102             : !                    Harmonized Emissions Component (HEMCO)                   !
         103             : !------------------------------------------------------------------------------
         104             : !BOP
         105             : !
         106             : ! !IROUTINE: GetHcoVal
         107             : !
         108             : ! !DESCRIPTION: Subroutine GetHcoVal is a wrapper routine to return an
         109             : ! emission (kg/m2/s) or deposition (1/s) value from the HEMCO state object
         110             : ! for a given species at position I, J, L.
         111             : ! A value of zero is returned if no HEMCO species is defined for the given
         112             : ! tracer, and the output parameter Found is set to false.
         113             : !\\
         114             : !\\
         115             : ! !INTERFACE:
         116             : !
         117           0 :   SUBROUTINE GetHcoVal ( HcoState, ExtState, &
         118             :                          HcoID, I, J, L, Found, Emis, Dep )
         119             : !
         120             : ! !USES:
         121             : !
         122             : !
         123             : ! !INPUT ARGUMENTS:
         124             : !
         125             :     TYPE(HCO_State),    POINTER        :: HcoState    ! HEMCO state object
         126             :     TYPE(Ext_State),    POINTER        :: ExtState    ! HEMCO extensions state object
         127             :     INTEGER,            INTENT(IN   )  :: HcoID       ! HEMCO tracer ID
         128             :     INTEGER,            INTENT(IN   )  :: I, J, L     ! Position
         129             : !
         130             : ! !OUTPUT ARGUMENTS:
         131             : !
         132             :     LOGICAL,            INTENT(  OUT)  :: Found       ! Was this tracer ID found?
         133             :     REAL(hp), OPTIONAL, INTENT(  OUT)  :: Emis        ! Emissions  [kg/m2/s]
         134             :     REAL(hp), OPTIONAL, INTENT(  OUT)  :: Dep         ! Deposition [1/s]
         135             : !
         136             : ! !REMARKS:
         137             : !  Tracer ID passed is now always HcoID. This is because GEOS-Chem uses the same
         138             : !  HcoID = TrcID. If your model is not, please do a mapping internally in the
         139             : !  interface.
         140             : !
         141             : !  Note that HEMCO expects the grid to be 3-D in IJL indices. If your model
         142             : !  (e.g. CAM) stores data in 2-D columns (K, I) where I is a chunked set of
         143             : !  columns, one dummy dimension needs to be added. Refer to ESCOMP/HEMCO_CESM
         144             : !  (hplin, 3/12/20)
         145             : !
         146             : ! !REVISION HISTORY:
         147             : !  20 Oct 2014 - C. Keller - Initial Version
         148             : !  See https://github.com/geoschem/hemco for complete history
         149             : !EOP
         150             : !------------------------------------------------------------------------------
         151             : !BOC
         152             :     !=================================================================
         153             :     ! GetHcoVal begins here
         154             :     !=================================================================
         155             :
         156             :     ! Init
         157           0 :     FOUND = .FALSE.
         158           0 :     IF ( PRESENT(Emis) ) Emis = 0.0_hp
         159           0 :     IF ( PRESENT(Dep ) ) Dep  = 0.0_hp
         160             :
         161             :     ! If HEMCO species exists, get value from HEMCO state
         162           0 :     IF ( HcoID > 0 ) THEN
         163           0 :        IF ( PRESENT(Emis) ) THEN
         164           0 :           IF ( ASSOCIATED(HcoState%Spc(HcoID)%Emis%Val) ) THEN
         165           0 :              Emis  = HcoState%Spc(HcoID)%Emis%Val(I,J,L)
         166           0 :              FOUND = .TRUE.
         167             :           ENDIF
         168             :        ENDIF
         169           0 :        IF ( PRESENT(Dep) ) THEN
         170           0 :           IF ( ASSOCIATED(HcoState%Spc(HcoID)%Depv%Val) ) THEN
         171           0 :              Dep   = HcoState%Spc(HcoID)%Depv%Val(I,J)
         172           0 :              FOUND = .TRUE.
         173             :           ENDIF
         174             :        ENDIF
         175             :     ENDIF
         176             :
         177           0 :   END SUBROUTINE GetHcoVal
         178             : !EOC
         179             : !------------------------------------------------------------------------------
         180             : !                    Harmonized Emissions Component (HEMCO)                   !
         181             : !------------------------------------------------------------------------------
         182             : !BOP
         183             : !
         184             : ! !IROUTINE: GetHcoDiagn
         185             : !
         186             : ! !DESCRIPTION: Subroutine GetHcoDiagn is a convenience wrapper routine to
         187             : !  get a HEMCO diagnostics from an external model.
         188             : !\\
         189             : !\\
         190             : ! !INTERFACE:
         191             : !
         192           0 :   SUBROUTINE GetHcoDiagn ( HcoState,       ExtState,  DiagnName, &
         193             :                            StopIfNotFound, RC,        Ptr2D,     &
         194             :                            Ptr3D,          COL,       AutoFill  )
         195             : !
         196             : ! !USES:
         197             : !
         198             :     USE HCO_TYPES_MOD,      ONLY : DiagnCont
         199             :     USE HCO_DIAGN_MOD
         200             : !
         201             : ! !INPUT PARAMETERS:
         202             : !
         203             :     TYPE(HCO_State), POINTER               :: HcoState       ! HEMCO state object
         204             :     TYPE(Ext_State), POINTER               :: ExtState       ! HEMCO extensions state object
         205             :     CHARACTER(LEN=*), INTENT(IN)           :: DiagnName      ! Name of diagnostics
         206             :     LOGICAL,          INTENT(IN)           :: StopIfNotFound ! Stop if diagnostics
         207             :                                                              ! does not exist?
         208             :     INTEGER,          INTENT(IN), OPTIONAL :: COL            ! Collection Nr.
         209             :     INTEGER,          INTENT(IN), OPTIONAL :: AutoFill       ! AutoFill diagnostics only?
         210             : !
         211             : ! !INPUT/OUTPUT PARAMETERS:
         212             : !
         213             :     INTEGER,          INTENT(INOUT)        :: RC             ! Error return code
         214             : !
         215             : ! !OUTPUT PARAMETERS:
         216             : !
         217             :     REAL(sp),         POINTER, OPTIONAL    :: Ptr2D(:,:)     ! Pointer to 2D data
         218             :     REAL(sp),         POINTER, OPTIONAL    :: Ptr3D(:,:,:)   ! Pointer to 3D data
         219             : !
         220             : ! !REVISION HISTORY:
         221             : !  24 Sep 2014 - C. Keller   - Initial version
         222             : !  See https://github.com/geoschem/hemco for complete history
         223             : !EOP
         224             : !------------------------------------------------------------------------------
         225             : !BOC
         226             : !
         227             : ! !LOCAL VARIABLES:
         228             : !
         229             :     INTEGER                   :: FLAG, LevIDx, PS, AF
         230             :     TYPE(DiagnCont), POINTER  :: DgnCont  => NULL()
         231             :
         232             :     ! Strings
         233             :     CHARACTER(LEN=255) :: ErrMsg
         234             :     CHARACTER(LEN=255) :: ThisLoc
         235             :
         236             :     !=======================================================================
         237             :     ! GetHcoDiagn begins here
         238             :     !=======================================================================
         239             :
         240             :     ! Initialize
         241           0 :     RC      = HCO_SUCCESS
         242             :
         243             :     ! For error handling
         244           0 :     ErrMsg  = ''
         245             :
         246             :     ! Set collection number
         247           0 :     PS = HcoState%Diagn%HcoDiagnIDManual
         248           0 :     IF ( PRESENT(COL) ) PS = COL
         249             :
         250             :     ! Set AutoFill flag
         251           0 :     AF = -1
         252           0 :     IF ( PRESENT(AutoFill) ) AF = AutoFill
         253             :
         254             :     ! Get diagnostics by name. Search all diagnostics, i.e. both AutoFill
         255             :     ! and manually filled diagnostics. Also include those with a manual
         256             :     ! output interval.
         257             :     CALL Diagn_Get( HcoState, .FALSE., DgnCont, FLAG, RC, &
         258           0 :                     cName=TRIM(DiagnName), AutoFill=AF, COL=PS )
         259             :
         260             :     ! Trap potential errors
         261           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         262           0 :        ErrMsg = 'Error in getting diagnostics: ' // TRIM(DiagnName)
         263           0 :        CALL HCO_Error( ErrMsg, RC )
         264           0 :        RETURN
         265             :     ENDIF
         266             :
         267           0 :     IF ( (FLAG /= HCO_SUCCESS) .AND. StopIfNotFound ) THEN
         268             :        ErrMsg = 'Cannot get diagnostics for this time stamp: ' //    &
         269           0 :                  TRIM(DiagnName)
         270           0 :        CALL HCO_Error( ErrMsg, RC )
         271           0 :        RETURN
         272             :     ENDIF
         273             :
         274             :     ! Pass data to output pointer (only if diagnostics defined):
         275           0 :     IF ( FLAG == HCO_SUCCESS ) THEN
         276             :
         277             :        ! 2D pointer
         278           0 :        IF ( PRESENT(Ptr2D) ) THEN
         279             :
         280             :           ! Pass 2D data
         281           0 :           IF ( ASSOCIATED(DgnCont%Arr2D%Val) ) THEN
         282           0 :              Ptr2D => DgnCont%Arr2D%Val
         283             :
         284             :           ! Pass 3D data. Get level index from diagnostics (if set)
         285           0 :           ELSEIF ( ASSOCIATED(DgnCont%Arr3D%Val) ) THEN
         286           0 :              LevIDx = DgnCont%LevIdx
         287           0 :              IF ( LevIdx < 1 ) LevIdx = 1
         288           0 :              Ptr2D => DgnCont%Arr3D%Val(:,:,LevIDx)
         289             :
         290             :           ! Error if no 2D or 3D data available
         291             :           ELSE
         292           0 :              ErrMsg = 'no data defined: '// TRIM(DiagnName)
         293           0 :              CALL HCO_Error( ErrMsg, RC )
         294           0 :              RETURN
         295             :           ENDIF
         296             :
         297             :        ! 3D pointer: must point to 3D data
         298           0 :        ELSEIF ( PRESENT(Ptr3D) ) THEN
         299           0 :           IF ( ASSOCIATED(DgnCont%Arr3D%Val) ) THEN
         300           0 :              Ptr3D => DgnCont%Arr3D%Val
         301             :           ELSE
         302           0 :              ErrMsg = 'no 3D data defined: '// TRIM(DiagnName)
         303           0 :              CALL HCO_Error( ErrMsg, RC )
         304           0 :              RETURN
         305             :           ENDIF
         306             :
         307             :        ! Error otherwise
         308             :        ELSE
         309           0 :           ErrMsg = 'Please define output data pointer: ' // TRIM(DiagnName)
         310           0 :           CALL HCO_Error( ErrMsg, RC )
         311           0 :           RETURN
         312             :        ENDIF
         313             :     ENDIF
         314             :
         315             :     ! Free pointer
         316           0 :     DgnCont  => NULL()
         317             :
         318             :     ! Leave with success
         319           0 :     RC = HCO_SUCCESS
         320             :
         321             :   END SUBROUTINE GetHcoDiagn
         322             :
         323             : !EOC
         324             : END MODULE HCO_Interface_Common

Generated by: LCOV version 1.14