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

          Line data    Source code
       1             : !------------------------------------------------------------------------------
       2             : !                   Harmonized Emissions Component (HEMCO)                    !
       3             : !------------------------------------------------------------------------------
       4             : !!BOP
       5             : !
       6             : ! !MODULE: hco_chartools_mod.F90
       7             : !
       8             : ! !DESCRIPTION: Module HCO\_CHARTOOLS\_MOD contains a collection of
       9             : ! helper routines to handle character strings and parse tokens. It also
      10             : ! contains definitions of special characters such as space, tab and
      11             : ! comment.
      12             : ! \\
      13             : ! !INTERFACE:
      14             : !
      15             : MODULE HCO_CharTools_Mod
      16             : !
      17             : ! !USES:
      18             : !
      19             :   USE HCO_Error_Mod
      20             : 
      21             :   IMPLICIT NONE
      22             :   PRIVATE
      23             : !
      24             : ! !PUBLIC MEMBER FUNCTIONS:
      25             : !
      26             :   PUBLIC :: HCO_CharSplit
      27             :   PUBLIC :: HCO_CharMatch
      28             :   PUBLIC :: HCO_CharParse
      29             :   PUBLIC :: HCO_GetBase
      30             :   PUBLIC :: IsInWord
      31             :   PUBLIC :: NextCharPos
      32             :   PUBLIC :: GetNextLine
      33             :   PUBLIC :: HCO_READLINE
      34             : !
      35             : ! !REVISION HISTORY:
      36             : !  18 Dec 2013 - C. Keller   - Initialization
      37             : !  See https://github.com/geoschem/hemco for complete history
      38             : !EOP
      39             : !------------------------------------------------------------------------------
      40             : !BOC
      41             : !
      42             : ! !MODULE INTERFACES:
      43             : !
      44             :   INTERFACE HCO_CharSplit
      45             :      MODULE PROCEDURE HCO_CharSplit_R8
      46             :      MODULE PROCEDURE HCO_CharSplit_R4
      47             :      MODULE PROCEDURE HCO_CharSplit_INT
      48             :   END INTERFACE
      49             : !
      50             : ! !MODULE PARAMETER:
      51             : !
      52             :   ! Fixed characters
      53             :   CHARACTER(LEN=1), PARAMETER, PUBLIC :: HCO_SPC     = ' '
      54             :   CHARACTER(LEN=1), PARAMETER, PUBLIC :: HCO_TAB     = ACHAR(9)
      55             :   CHARACTER(LEN=1), PARAMETER, PUBLIC :: HCO_CMT     = '#'
      56             : !
      57             : ! !PRIVATE MEMBER FUNCTIONS:
      58             : !
      59             : CONTAINS
      60             : !EOC
      61             : !------------------------------------------------------------------------------
      62             : !                   Harmonized Emissions Component (HEMCO)                    !
      63             : !------------------------------------------------------------------------------
      64             : !BOP
      65             : !
      66             : ! !IROUTINE: HCO_CharSplit_R8
      67             : !
      68             : ! !DESCRIPTION: Subroutine HCO\_CharSplit\_R8 splits the passed character
      69             : ! string into N real8 values, using character SEP as separator. Wildcard
      70             : ! values (WC) are set to -999.
      71             : !\\
      72             : ! !INTERFACE:
      73             : !
      74           0 :   SUBROUTINE HCO_CharSplit_R8( CharStr, SEP, WC, Reals, N, RC )
      75             : !
      76             : ! !USES:
      77             : !
      78             :     USE HCO_CharPak_Mod,  ONLY : StrSplit
      79             : !
      80             : ! !INPUT PARAMETERS:
      81             : !
      82             :     CHARACTER(LEN=*), INTENT(IN   ) :: CharStr   ! Character string
      83             :     CHARACTER(LEN=1), INTENT(IN   ) :: SEP       ! Separator
      84             :     CHARACTER(LEN=1), INTENT(IN   ) :: WC        ! Wildcard character
      85             : !
      86             : ! !OUTPUT PARAMETERS:
      87             : !
      88             :     REAL(dp),         INTENT(  OUT) :: Reals(:)  ! Output values
      89             :     INTEGER,          INTENT(  OUT) :: N         ! # of valid values
      90             : !
      91             : ! !INPUT/OUTPUT PARAMETERS:
      92             : !
      93             :     INTEGER,          INTENT(INOUT) :: RC         ! Return code
      94             : !
      95             : ! !REVISION HISTORY:
      96             : !  18 Sep 2013 - C. Keller - Initial version (update)
      97             : !  See https://github.com/geoschem/hemco for complete history
      98             : !EOP
      99             : !------------------------------------------------------------------------------
     100             : !BOC
     101             : !
     102             : ! !LOCAL VARIABLES:
     103             : !
     104             : 
     105             :     INTEGER            :: I
     106             :     CHARACTER(LEN=255) :: SUBSTR(255)
     107             :     CHARACTER(LEN=255) :: LOC
     108             : 
     109             :     !=================================================================
     110             :     ! HCO_CharSplit_R8 begins here!
     111             :     !=================================================================
     112             : 
     113             :     ! Enter
     114           0 :     LOC = 'HCO_CharSplit_R8 (HCO_CHARTOOLS_MOD.F90)'
     115             : 
     116             :     ! Init
     117           0 :     Reals(:) = -999_dp
     118             : 
     119             :     ! Extract strings to be translated into integers
     120             :     !CALL STRSPLIT( CharStr, TRIM(SEP), SUBSTR, N )
     121           0 :     CALL STRSPLIT( CharStr, SEP, SUBSTR, N )
     122           0 :     IF ( N > SIZE(Reals,1) ) THEN
     123           0 :        WRITE(*,*) 'Too many substrings - error in ', TRIM(LOC)
     124           0 :        RC = HCO_FAIL
     125           0 :        RETURN
     126             :     ENDIF
     127             : 
     128             :     ! Return here if no entry found
     129           0 :     IF ( N == 0 ) RETURN
     130             : 
     131             :     ! Pass all extracted strings to integer vector. Replace wildcard
     132             :     ! character with -999!
     133           0 :     DO I = 1, N
     134           0 :        IF ( TRIM(SUBSTR(I)) == TRIM(WC) ) THEN
     135           0 :           Reals(I) = -999_dp
     136           0 :        ELSEIF ( TRIM(SUBSTR(I)) == '-' ) THEN
     137           0 :           Reals(I) = -999_dp
     138             :        ELSE
     139           0 :           READ( SUBSTR(I), * ) Reals(I)
     140             :        ENDIF
     141             :     ENDDO
     142             : 
     143             :     ! Leave w/ success
     144           0 :     RC = HCO_SUCCESS
     145             : 
     146             :   END SUBROUTINE HCO_CharSplit_R8
     147             : !EOC
     148             : !------------------------------------------------------------------------------
     149             : !                   Harmonized Emissions Component (HEMCO)                    !
     150             : !------------------------------------------------------------------------------
     151             : !BOP
     152             : !
     153             : ! !IROUTINE: HCO_CharSplit_R4
     154             : !
     155             : ! !DESCRIPTION: Subroutine HCO\_CharSplit\_R4 splits the passed character
     156             : ! string into N real4 values, using character SEP as separator. Wildcard
     157             : ! values (WC) are set to -999.
     158             : !\\
     159             : ! !INTERFACE:
     160             : !
     161           0 :   SUBROUTINE HCO_CharSplit_R4( CharStr, SEP, WC, Reals, N, RC )
     162             : !
     163             : ! !USES:
     164             : !
     165             :     USE HCO_CharPak_Mod,  ONLY : StrSplit
     166             : !
     167             : ! !INPUT PARAMETERS:
     168             : !
     169             :     CHARACTER(LEN=*), INTENT(IN   ) :: CharStr    ! Character string
     170             :     CHARACTER(LEN=1), INTENT(IN   ) :: SEP        ! Separator
     171             :     CHARACTER(LEN=1), INTENT(IN   ) :: WC         ! Wildcard character
     172             : !
     173             : ! !OUTPUT PARAMETERS:
     174             : !
     175             :     REAL(sp),         INTENT(  OUT) :: Reals(:)   ! Output values
     176             :     INTEGER,          INTENT(  OUT) :: N          ! # of valid values
     177             : !
     178             : ! !INPUT/OUTPUT PARAMETERS:
     179             : !
     180             :     INTEGER,          INTENT(INOUT) :: RC         ! Return code
     181             : !
     182             : ! !REVISION HISTORY:
     183             : !  18 Sep 2013 - C. Keller - Initial version (update)
     184             : !  See https://github.com/geoschem/hemco for complete history
     185             : !EOP
     186             : !------------------------------------------------------------------------------
     187             : !BOC
     188             : !
     189             : ! !LOCAL VARIABLES:
     190             : !
     191             :     INTEGER               :: I
     192             :     CHARACTER(LEN=255)    :: SUBSTR(255)
     193             :     CHARACTER(LEN=255)    :: LOC
     194             : 
     195             :     !=================================================================
     196             :     ! HCO_CharSplit_R4 begins here!
     197             :     !=================================================================
     198             : 
     199             :     ! Enter
     200           0 :     LOC = 'HCO_CharSplit_R4 (HCO_CHARTOOLS_MOD.F90)'
     201             : 
     202             :     ! Init
     203           0 :     Reals(:) = -999._sp
     204             : 
     205             :     ! Extract strings to be translated into integers
     206             :     !CALL STRSPLIT( CharStr, TRIM(SEP), SUBSTR, N )
     207           0 :     CALL STRSPLIT( CharStr, SEP, SUBSTR, N )
     208           0 :     IF ( N > SIZE(Reals,1) ) THEN
     209           0 :        WRITE(*,*) 'Too many substrings - error in ', TRIM(LOC)
     210           0 :        RC = HCO_FAIL
     211           0 :        RETURN
     212             :     ENDIF
     213             : 
     214             :     ! Return here if no entry found
     215           0 :     IF ( N == 0 ) RETURN
     216             : 
     217             :     ! Pass all extracted strings to integer vector. Replace wildcard
     218             :     ! character with -999!
     219           0 :     DO I = 1, N
     220           0 :        IF ( TRIM(SUBSTR(I)) == TRIM(WC) ) THEN
     221           0 :           Reals(I) = -999._sp
     222           0 :        ELSEIF ( TRIM(SUBSTR(I)) == '-' ) THEN
     223           0 :           Reals(I) = -999._sp
     224             :        ELSE
     225           0 :           READ( SUBSTR(I), * ) Reals(I)
     226             :        ENDIF
     227             :     ENDDO
     228             : 
     229             :     ! Leave w/ success
     230           0 :     RC = HCO_SUCCESS
     231             : 
     232             :   END SUBROUTINE HCO_CharSplit_R4
     233             : !EOC
     234             : !------------------------------------------------------------------------------
     235             : !                   Harmonized Emissions Component (HEMCO)                    !
     236             : !------------------------------------------------------------------------------
     237             : !BOP
     238             : !
     239             : ! !IROUTINE: HCO_CharSplit_Int
     240             : !
     241             : ! !DESCRIPTION: Subroutine HCO\_CharSplit\_Int splits the passed character
     242             : ! string into N integers, using character SEP as separator. Wildcard
     243             : ! values (WC) are set to -999.
     244             : !\\
     245             : ! !INTERFACE:
     246             : !
     247           0 :   SUBROUTINE HCO_CharSplit_INT( CharStr, SEP, WC, Ints, N, RC )
     248             : !
     249             : ! !USES:
     250             : !
     251             :     USE HCO_CharPak_Mod, ONLY : StrSplit
     252             : !
     253             : ! !INPUT PARAMETERS:
     254             : !
     255             :     CHARACTER(LEN=*), INTENT(IN   ) :: CharStr    ! Character string
     256             :     CHARACTER(LEN=1), INTENT(IN   ) :: SEP        ! Separator
     257             :     CHARACTER(LEN=1), INTENT(IN   ) :: WC         ! Wildcard character
     258             : !
     259             : ! !OUTPUT PARAMETERS:
     260             : !
     261             :     INTEGER,          INTENT(  OUT) :: Ints(:)    ! Output values
     262             :     INTEGER,          INTENT(  OUT) :: N          ! # of valid values
     263             : !
     264             : ! !INPUT/OUTPUT PARAMETERS:
     265             : !
     266             :     INTEGER,          INTENT(INOUT) :: RC         ! Return code
     267             : !
     268             : ! !REVISION HISTORY:
     269             : !  18 Sep 2013 - C. Keller - Initial version (update)
     270             : !  See https://github.com/geoschem/hemco for complete history
     271             : !EOP
     272             : !------------------------------------------------------------------------------
     273             : !BOC
     274             : !
     275             : ! !LOCAL VARIABLES:
     276             : !
     277             :     INTEGER               :: I
     278             :     CHARACTER(LEN=255)    :: SUBSTR(255)
     279             :     CHARACTER(LEN=255)    :: LOC
     280             : 
     281             :     !=================================================================
     282             :     ! HCO_CharSplit_INT begins here!
     283             :     !=================================================================
     284             : 
     285             :     ! Enter
     286           0 :     LOC = 'HCO_CharSplit_Int (HCO_CHARTOOLS_MOD.F90)'
     287             : 
     288             :     ! Init
     289           0 :     Ints(:) = -999
     290             : 
     291             :     ! If input string is wildcard or otherwise empty, return here.
     292           0 :     IF ( TRIM(CharStr) == TRIM(WC) .OR. &
     293             :          TRIM(CharStr) == '-'            ) THEN
     294           0 :        N = 0
     295           0 :        RETURN
     296             :     ENDIF
     297             : 
     298             :     ! Extract strings to be translated into integers
     299             :     !CALL STRSPLIT( CharStr, TRIM(SEP), SUBSTR, N )
     300           0 :     CALL STRSPLIT( CharStr, SEP, SUBSTR, N )
     301           0 :     IF ( N > SIZE(Ints,1) ) THEN
     302           0 :        WRITE(*,*) 'Too many substrings - error in ', TRIM(LOC)
     303           0 :        RC = HCO_FAIL
     304           0 :        RETURN
     305             :     ENDIF
     306             : 
     307             :     ! Return here if no entry found
     308           0 :     IF ( N == 0 ) RETURN
     309             : 
     310             :     ! Pass all extracted strings to integer vector.
     311           0 :     DO I = 1, N
     312           0 :        READ( SUBSTR(I), * ) Ints(I)
     313             :     ENDDO
     314             : 
     315             :     ! Leave w/ success
     316           0 :     RC = HCO_SUCCESS
     317             : 
     318             :   END SUBROUTINE HCO_CharSplit_INT
     319             : !EOC
     320             : !------------------------------------------------------------------------------
     321             : !                   Harmonized Emissions Component (HEMCO)                    !
     322             : !------------------------------------------------------------------------------
     323             : !BOP
     324             : !
     325             : ! !IROUTINE: HCO_CharMatch
     326             : !
     327             : ! !DESCRIPTION: Subroutine HCO\_CharMatch returns the index of each
     328             : ! vector element of vec1 in vec2. nnmatch denotes the number of
     329             : ! vec1 elements which have a matching counterpart in vec2.
     330             : ! For example, if vec1 is (/ 'NO', 'CO', 'ALK4', 'HBr' /), and
     331             : ! vec2 is (/ 'CO', 'NO', 'CH3Br' /), then matchidx becomes
     332             : ! (/ 2, 1, -1, -1 /) and nnmatch is 2.
     333             : !\\
     334             : !\\
     335             : ! !INTERFACE:
     336             : !
     337           0 :   SUBROUTINE HCO_CharMatch( vec1, n1, vec2, n2, matchidx, nnmatch )
     338             : !
     339             : ! !INPUT PARAMETERS:
     340             : !
     341             :     INTEGER,          INTENT(IN   ) :: n1           ! len of vec1
     342             :     INTEGER,          INTENT(IN   ) :: n2           ! len of vec2
     343             :     CHARACTER(LEN=*), INTENT(IN   ) :: vec1(n1)     ! char. vector 1
     344             :     CHARACTER(LEN=*), INTENT(IN   ) :: vec2(n2)     ! char. vector 2
     345             : !
     346             : ! !OUTPUT PARAMETERS:
     347             : !
     348             :     INTEGER,          INTENT(  OUT) :: matchidx(n1) ! index of vec2 in vec1
     349             :     INTEGER,          INTENT(  OUT) :: nnmatch      ! # of matches
     350             : !
     351             : ! !REVISION HISTORY:
     352             : !  18 Sep 2013 - C. Keller - Initial version (update)
     353             : !  See https://github.com/geoschem/hemco for complete history
     354             : !EOP
     355             : !------------------------------------------------------------------------------
     356             : !BOC
     357             : !
     358             : ! !LOCAL VARIABLES:
     359             : !
     360             :     INTEGER :: I, J
     361             : 
     362             :     !=================================================================
     363             :     ! HCO_CharMatch begins here!
     364             :     !=================================================================
     365             : 
     366             :     ! Init
     367           0 :     nnmatch = 0
     368             : 
     369             :     ! Do for every element in vec1
     370           0 :     DO I = 1, n1
     371             : 
     372             :        ! Default = no match
     373           0 :        matchidx(I) = -1
     374             : 
     375           0 :        DO J = 1, n2
     376           0 :           IF ( TRIM(vec1(I)) == TRIM(vec2(J)) ) THEN
     377           0 :              matchidx(I) = J
     378           0 :              nnmatch     = nnmatch + 1
     379           0 :              EXIT
     380             :           ENDIF
     381             :        ENDDO
     382             :     ENDDO
     383             : 
     384           0 :   END SUBROUTINE HCO_CharMatch
     385             : !EOC
     386             : !------------------------------------------------------------------------------
     387             : !                   Harmonized Emissions Component (HEMCO)                    !
     388             : !------------------------------------------------------------------------------
     389             : !BOP
     390             : !
     391             : ! !IROUTINE: HCO_CharParse
     392             : !
     393             : ! !DESCRIPTION: Routine HCO\_CharParse parses the provided character string
     394             : ! by searching for tokens such as \$ROOT, \$YYYY, etc., within the string and
     395             : ! replacing those values by the intendend characters.
     396             : !\\
     397             : !\\
     398             : ! The following list shows the 'default' HEMCO tokens. These are available
     399             : ! in any HEMCO simulation. Tokens \$ROOT, \$MET, and \$RES are internally
     400             : ! stored as a HEMCO option in module hco\_extlist\_mod.F90 (see subroutine
     401             : ! HCO\_SetDefaultToken).
     402             : ! \begin{itemize}
     403             : ! \item \$ROOT: will be replaced by the root path specified in the settings
     404             : ! section of the configuration file.
     405             : ! \item \$MET: will be replaced by the met-field token.
     406             : ! \item \$RES: will be replaced by the resolution token.
     407             : ! \item \$YYYY: will be replaced by the (4-digit) year according to the
     408             : ! source time settings set in the configuration file.
     409             : ! \item \$MM: will be replaced by the (2-digit) month according to the
     410             : ! source time settings set in the configuration file.
     411             : ! \item \$DD: will be replaced by the (2-digit) day according to the
     412             : ! source time settings set in the configuration file.
     413             : ! \item \$HH: will be replaced by the (2-digit) hour according to the
     414             : ! source time settings set in the configuration file.
     415             : ! \item \$MN: will be replaced by the (2-digit) minute.
     416             : ! \end{itemize}
     417             : !
     418             : ! !INTERFACE:
     419             : !
     420           0 :   SUBROUTINE HCO_CharParse ( HcoConfig, str, yyyy, mm, dd, hh, mn, RC )
     421             : !
     422             : ! !USES:
     423             : !
     424             :     USE HCO_ExtList_Mod, ONLY  : HCO_GetOpt, HCO_Root
     425             :     USE HCO_Types_Mod,   ONLY  : ConfigObj
     426             : !
     427             : ! !INPUT PARAMETERS:
     428             : !
     429             :     TYPE(ConfigObj),  POINTER        :: HcoConfig
     430             :     INTEGER,          INTENT(IN   )  :: yyyy  ! replace $YYYY with this value
     431             :     INTEGER,          INTENT(IN   )  :: mm    ! replace $MM with this value
     432             :     INTEGER,          INTENT(IN   )  :: dd    ! replace $DD with this value
     433             :     INTEGER,          INTENT(IN   )  :: hh    ! replace $HH with this value
     434             :     INTEGER,          INTENT(IN   )  :: mn    ! replace $MN with this value
     435             : !
     436             : ! !OUTPUT PARAMETERS:
     437             : !
     438             :     CHARACTER(LEN=*), INTENT(  OUT)  :: str   ! string to be parsed
     439             : !
     440             : ! !INPUT/OUTPUT PARAMETERS:
     441             : !
     442             :     INTEGER,          INTENT(INOUT)  :: RC         ! return code
     443             : !
     444             : ! !REVISION HISTORY:
     445             : !  01 Oct 2014 - C. Keller - Initial version
     446             : !  See https://github.com/geoschem/hemco for complete history
     447             : !EOP
     448             : !------------------------------------------------------------------------------
     449             : !BOC
     450             : !
     451             : ! !LOCAL VARIABLES:
     452             : !
     453             :     CHARACTER(LEN=255)  :: MSG
     454             :     CHARACTER(LEN=255)  :: LOC = 'HCO_CharParse (HCO_CharTools_Mod.F90)'
     455             :     CHARACTER(LEN=255)  :: TOKEN
     456             :     CHARACTER(LEN=2047) :: TMPSTR, BEFORE, AFTER
     457             :     INTEGER             :: I, LN, IDX, OFF
     458             :     CHARACTER(LEN=4)    :: str4
     459             :     CHARACTER(LEN=2)    :: str2
     460             :     CHARACTER(LEN=1)    :: SEP
     461             : 
     462             :     !=================================================================
     463             :     ! HCO_CharParse begins here
     464             :     !=================================================================
     465             : 
     466             :     ! Get characters
     467           0 :     SEP = HCO_GetOpt(HcoConfig%ExtList,'Separator')
     468             : 
     469             :     ! Check for year token
     470             :     !-------------------------------------------------------------------
     471           0 :     DO
     472           0 :        IDX = INDEX( str, '$YYYY' )
     473           0 :        IF ( IDX <= 0 ) EXIT
     474           0 :        LN = LEN(str)
     475           0 :        IF ( IDX > 1 ) THEN
     476           0 :           BEFORE = str(1:(IDX-1))
     477             :        ELSE
     478           0 :           BEFORE = ''
     479             :        ENDIF
     480           0 :        OFF   = 5
     481           0 :        AFTER = str((IDX+OFF):LN)
     482             : 
     483           0 :        WRITE(str4,'(i4.4)') yyyy
     484             : 
     485             :        ! Updated string
     486           0 :        str = TRIM(BEFORE) // TRIM(str4) // TRIM(AFTER)
     487             :     ENDDO
     488             : 
     489             :     ! Check for month token
     490             :     !-------------------------------------------------------------------
     491           0 :     DO
     492           0 :        IDX = INDEX( str, '$MM' )
     493           0 :        IF ( IDX <= 0 ) EXIT
     494           0 :        LN = LEN(str)
     495           0 :        IF ( IDX > 1 ) THEN
     496           0 :           BEFORE = str(1:(IDX-1))
     497             :        ELSE
     498           0 :           BEFORE = ''
     499             :        ENDIF
     500           0 :        OFF   = 3
     501           0 :        AFTER = str((IDX+OFF):LN)
     502             : 
     503           0 :        WRITE(str2,'(i2.2)') mm
     504             : 
     505             :        ! Updated string
     506           0 :        str = TRIM(BEFORE) // TRIM(str2) // TRIM(AFTER)
     507             :     ENDDO
     508             : 
     509             :     ! Check for day token
     510             :     !-------------------------------------------------------------------
     511           0 :     DO
     512           0 :        IDX = INDEX( str, '$DD' )
     513           0 :        IF ( IDX <= 0 ) EXIT
     514           0 :        LN = LEN(str)
     515           0 :        IF ( IDX > 1 ) THEN
     516           0 :           BEFORE = str(1:(IDX-1))
     517             :        ELSE
     518           0 :           BEFORE = ''
     519             :        ENDIF
     520           0 :        OFF   = 3
     521           0 :        AFTER = str((IDX+OFF):LN)
     522             : 
     523           0 :        WRITE(str2,'(i2.2)') dd
     524             : 
     525             :        ! Updated string
     526           0 :        str = TRIM(BEFORE) // TRIM(str2) // TRIM(AFTER)
     527             :     ENDDO
     528             : 
     529             :     ! Check for hour token
     530             :     !-------------------------------------------------------------------
     531           0 :     DO
     532           0 :        IDX = INDEX( str, '$HH' )
     533           0 :        IF ( IDX <= 0 ) EXIT
     534           0 :        LN = LEN(str)
     535           0 :        IF ( IDX > 1 ) THEN
     536           0 :           BEFORE = str(1:(IDX-1))
     537             :        ELSE
     538           0 :           BEFORE = ''
     539             :        ENDIF
     540           0 :        OFF   = 3
     541           0 :        AFTER = str((IDX+OFF):LN)
     542             : 
     543           0 :        WRITE(str2,'(i2.2)') hh
     544             : 
     545             :        ! Updated string
     546           0 :        str = TRIM(BEFORE) // TRIM(str2) // TRIM(AFTER)
     547             :     ENDDO
     548             : 
     549             :     ! Check for minute token
     550             :     !-------------------------------------------------------------------
     551           0 :     DO
     552           0 :        IDX = INDEX( str, '$MN' )
     553           0 :        IF ( IDX <= 0 ) EXIT
     554           0 :        LN = LEN(str)
     555           0 :        IF ( IDX > 1 ) THEN
     556           0 :           BEFORE = str(1:(IDX-1))
     557             :        ELSE
     558           0 :           BEFORE = ''
     559             :        ENDIF
     560           0 :        OFF   = 3
     561           0 :        AFTER = str((IDX+OFF):LN)
     562             : 
     563           0 :        WRITE(str2,'(i2.2)') mn
     564             : 
     565             :        ! Updated string
     566           0 :        str = TRIM(BEFORE) // TRIM(str2) // TRIM(AFTER)
     567             :     ENDDO
     568             : 
     569             :     ! Check for root token
     570             :     !-------------------------------------------------------------------
     571           0 :     IDX = INDEX( str, '$ROOT' )
     572           0 :     IF ( IDX > 0 ) THEN
     573           0 :        LN = LEN(str)
     574           0 :        IF ( IDX > 1 ) THEN
     575           0 :           BEFORE = str(1:(IDX-1))
     576             :        ELSE
     577           0 :           BEFORE = ''
     578             :        ENDIF
     579           0 :        OFF   = 5
     580           0 :        AFTER = str((IDX+OFF):LN)
     581             : 
     582             :        ! Updated string
     583           0 :        str = TRIM(BEFORE) // TRIM(HCO_ROOT(HcoConfig)) // TRIM(AFTER)
     584             :     ENDIF
     585             : 
     586             :     ! Check for any other token
     587             :     !-------------------------------------------------------------------
     588           0 :     DO
     589           0 :        IDX = INDEX( str, '$' )
     590           0 :        IF ( IDX <= 0 ) EXIT
     591           0 :        LN = LEN(TRIM(str))
     592             : 
     593             :        ! Determine token name:
     594             :        ! Find end of token by starting at the first character after the
     595             :        ! token and then advance in string until a 'token end character'
     596             :        ! is encountered.
     597           0 :        DO I = IDX+1,LN
     598             : 
     599             :           ! Special case that end of string is encountered:
     600           0 :           IF ( I == LN ) THEN
     601           0 :              TOKEN = str( (IDX+1) : I )
     602             :              OFF   = I
     603             :              EXIT
     604             :           ENDIF
     605             : 
     606             :           ! Scan for token cap:
     607           0 :           IF ( str(I:I) == ' '  .OR. &
     608             :                str(I:I) == '.'  .OR. &
     609             :                str(I:I) == ':'  .OR. &
     610             :                str(I:I) == '$'  .OR. &
     611             :                str(I:I) == '%'  .OR. &
     612             :                str(I:I) == '+'  .OR. &
     613             :                str(I:I) == '*'  .OR. &
     614             :                str(I:I) == '/'  .OR. &
     615             :                str(I:I) == '^'  .OR. &
     616             :                str(I:I) == '_'  .OR. &
     617             :                str(I:I) == '*'  .OR. &
     618             :                str(I:I) == '/'  .OR. &
     619             :                str(I:I) == '^'  .OR. &
     620             :                str(I:I) == '-'  .OR. &
     621             :                str(I:I) == 'x'  .OR. &
     622             :                str(I:I) == '('  .OR. &
     623             :                str(I:I) == ')'  .OR. &
     624             :                str(I:I) == '0'  .OR. &
     625             :                str(I:I) == '1'  .OR. &
     626             :                str(I:I) == '2'  .OR. &
     627             :                str(I:I) == '3'  .OR. &
     628             :                str(I:I) == '4'  .OR. &
     629             :                str(I:I) == '5'  .OR. &
     630             :                str(I:I) == '6'  .OR. &
     631             :                str(I:I) == '7'  .OR. &
     632             :                str(I:I) == '8'  .OR. &
     633           0 :                str(I:I) == '9'  .OR. &
     634           0 :                str(I:I) == SEP        ) THEN
     635             : 
     636           0 :              TOKEN = str( (IDX+1) : (I-1) )
     637             :              OFF   = I
     638             :              EXIT
     639             :           ENDIF
     640             :        ENDDO
     641             : 
     642           0 :        IF ( IDX > 1 ) THEN
     643           0 :           BEFORE = str(1:(IDX-1))
     644             :        ELSE
     645           0 :           BEFORE = ''
     646             :        ENDIF
     647           0 :        IF ( OFF >= LN ) THEN
     648           0 :           AFTER = ''
     649             :        ELSE
     650           0 :           AFTER = str(OFF:LN)
     651             :        ENDIF
     652             : 
     653             :        ! Update string
     654             :        str = TRIM(BEFORE) // &
     655             :              TRIM(HCO_GetOpt(HcoConfig%ExtList,TOKEN)) // &
     656           0 :              TRIM(AFTER)
     657             : 
     658             :     ENDDO
     659             : 
     660             :     ! Return w/ success
     661           0 :     RC = HCO_SUCCESS
     662             : 
     663           0 :   END SUBROUTINE HCO_CharParse
     664             : !EOC
     665             : !------------------------------------------------------------------------------
     666             : !                   Harmonized Emissions Component (HEMCO)                    !
     667             : !------------------------------------------------------------------------------
     668             : !BOP
     669             : !
     670             : ! !IROUTINE: HCO_GetBase
     671             : !
     672             : ! !DESCRIPTION: Routine HCO\_GetBase returns the base location of the given
     673             : ! file. This is the entire file path up to the last forward slash, e.g. for
     674             : ! file '/home/dir/Config.rc', the base is '/home/dir/'
     675             : !
     676             : ! !INTERFACE:
     677             : !
     678           0 :   SUBROUTINE HCO_GetBase ( str, base, RC )
     679             : !
     680             : ! !USES:
     681             : !
     682             :     USE HCO_CharPak_Mod, ONLY : StrSplit
     683             : !
     684             : ! !INPUT PARAMETERS:
     685             : !
     686             :     CHARACTER(LEN=*), INTENT(IN   )  :: str   ! string to be checked
     687             : !
     688             : ! !OUTPUT PARAMETERS:
     689             : !
     690             :     CHARACTER(LEN=*), INTENT(  OUT)  :: base  ! base
     691             : !
     692             : ! !INPUT/OUTPUT PARAMETERS:
     693             : !
     694             :     INTEGER,          INTENT(INOUT)  :: RC         ! return code
     695             : !
     696             : ! !REVISION HISTORY:
     697             : !  16 Mar 2015 - C. Keller - Initial version
     698             : !  See https://github.com/geoschem/hemco for complete history
     699             : !EOP
     700             : !------------------------------------------------------------------------------
     701             : !BOC
     702             : !
     703             : ! !LOCAL VARIABLES:
     704             : !
     705             :     INTEGER             :: I, N
     706             :     CHARACTER(LEN=255)  :: SUBSTR(255)
     707             : 
     708             :     !=================================================================
     709             :     ! HCO_GetBase begins here
     710             :     !=================================================================
     711             : 
     712           0 :     CALL STRSPLIT( str, '/', SUBSTR, N )
     713           0 :     IF ( N <= 1 ) THEN
     714           0 :        base = '.'
     715             :     ELSE
     716           0 :        base = '/' // TRIM(SUBSTR(1))
     717           0 :        IF ( N > 2 ) THEN
     718           0 :           DO I = 2,(N-1)
     719           0 :              base = TRIM(base) // '/' // TRIM(SUBSTR(I))
     720             :           ENDDO
     721             :        ENDIF
     722             :     ENDIF
     723             : 
     724             : 
     725             :     ! Return w/ success
     726           0 :     RC = HCO_SUCCESS
     727             : 
     728           0 :   END SUBROUTINE HCO_GetBase
     729             : !EOC
     730             : !------------------------------------------------------------------------------
     731             : !                   Harmonized Emissions Component (HEMCO)                    !
     732             : !------------------------------------------------------------------------------
     733             : !BOP
     734             : !
     735             : ! !IROUTINE: IsInWord
     736             : !
     737             : ! !DESCRIPTION: Function IsInWord checks if the word InString contains the
     738             : ! sequence of SearchString.
     739             : !\\
     740             : ! !INTERFACE:
     741             : !
     742           0 :   FUNCTION IsInWord( InString, SearchString ) RESULT ( Cnt )
     743             : !
     744             : ! !INPUT PARAMETERS:
     745             : !
     746             :     CHARACTER(LEN=*), INTENT(IN   ) :: InString
     747             :     CHARACTER(LEN=*), INTENT(IN   ) :: SearchString
     748             : !
     749             : ! !RETURN VALUE:
     750             : !
     751             :     LOGICAL                         :: Cnt
     752             : !
     753             : ! !REVISION HISTORY:
     754             : !  23 Oct 2012 - C. Keller - Initial Version
     755             : !  See https://github.com/geoschem/hemco for complete history
     756             : !EOP
     757             : !------------------------------------------------------------------------------
     758             : 
     759           0 :     Cnt = INDEX( TRIM(InString), TRIM(SearchString) ) > 0
     760             : 
     761           0 :   END FUNCTION IsInWord
     762             : !EOC
     763             : !------------------------------------------------------------------------------
     764             : !                   Harmonized Emissions Component (HEMCO)                    !
     765             : !------------------------------------------------------------------------------
     766             : !BOP
     767             : !
     768             : ! !IROUTINE: NextCharPos
     769             : !
     770             : ! !DESCRIPTION: Function NextCharPos returns the position of the next
     771             : ! occurrence of character CHR in word WORD, starting from position START.
     772             : ! Returns -1 if the word does not contain CHR at all (after position START).
     773             : !\\
     774             : !\\
     775             : ! !INTERFACE:
     776             : !
     777           0 :   FUNCTION NextCharPos ( WORD, CHR, START ) RESULT ( POS )
     778             : !
     779             : ! !USES:
     780             : !
     781             : !
     782             : ! !INPUT ARGUMENTS:
     783             : !
     784             :     CHARACTER(LEN=*),           INTENT(IN)  :: WORD
     785             :     CHARACTER(LEN=1),           INTENT(IN)  :: CHR
     786             :     INTEGER,          OPTIONAL, INTENT(IN)  :: START
     787             : !
     788             : ! !RETURN ARGUMENT:
     789             : !
     790             :     INTEGER                                 :: POS
     791             : !
     792             : ! !REVISION HISTORY:
     793             : !  09 Jul 2014 - C. Keller - Initial Version
     794             : !  See https://github.com/geoschem/hemco for complete history
     795             : !EOP
     796             : !------------------------------------------------------------------------------
     797             : !BOC
     798             : !
     799             : ! LOCAL VARIABLES:
     800             : !
     801             :     INTEGER                         :: LNG, N, BEG
     802             : 
     803             :     !=================================================================
     804             :     ! NextCharPos begins here
     805             :     !=================================================================
     806             : 
     807             :     ! Initialize
     808           0 :     POS = -1
     809             : 
     810             :     ! Get first index
     811           0 :     IF ( PRESENT(START) ) THEN
     812           0 :        BEG = START
     813             :     ELSE
     814             :        BEG = 1
     815             :     ENDIF
     816             : 
     817             :     ! Lenght of word
     818           0 :     LNG = LEN(TRIM(WORD))
     819             : 
     820             :     ! Error traps
     821           0 :     IF ( BEG > LNG ) RETURN
     822             : 
     823             :     ! Search for occurrence of CHR
     824           0 :     DO N = BEG, LNG
     825           0 :        IF ( WORD(N:N) == CHR ) THEN
     826             :           POS = N
     827             :           EXIT
     828             :        ENDIF
     829             :     ENDDO
     830             : 
     831             :   END FUNCTION NextCharPos
     832             : !EOC
     833             : !------------------------------------------------------------------------------
     834             : !                   Harmonized Emissions Component (HEMCO)                    !
     835             : !------------------------------------------------------------------------------
     836             : !BOP
     837             : !
     838             : ! !IROUTINE: GetNextLine
     839             : !
     840             : ! !DESCRIPTION: Subroutine GetNextLine returns the next line.
     841             : !\\
     842             : !\\
     843             : ! !INTERFACE:
     844             : !
     845           0 :   SUBROUTINE GetNextLine( LUN, LINE, EOF, RC )
     846             : !
     847             : ! !USES:
     848             : !
     849             : !
     850             : ! !INPUT PARAMETERS:
     851             : !
     852             :     INTEGER,          INTENT(IN   ) :: LUN         ! Stream to read from
     853             : !
     854             : ! !OUTPUT PARAMETERS
     855             : !
     856             :     CHARACTER(LEN=*), INTENT(  OUT) :: LINE        ! Next (valid) line in stream
     857             : !
     858             : ! !INPUT/OUTPUT PARAMETERS
     859             : !
     860             :     LOGICAL,          INTENT(INOUT) :: EOF         ! End of file encountered?
     861             :     INTEGER,          INTENT(INOUT) :: RC          ! Success or failure?
     862             : !
     863             : ! !REVISION HISTORY:
     864             : !  10 Apr 2015 - C. Keller - Initial Version
     865             : !  See https://github.com/geoschem/hemco for complete history
     866             : !EOP
     867             : !------------------------------------------------------------------------------
     868             : !BOC
     869             : !
     870             : ! LOCAL VARIABLES:
     871             : !
     872             :     INTEGER             :: IOS
     873             :     CHARACTER(LEN=5500) :: DUM
     874             : 
     875             :     !=================================================================
     876             :     ! GetNextLine begins here
     877             :     !=================================================================
     878             : 
     879             :     ! Init
     880           0 :     RC = HCO_SUCCESS
     881             : 
     882             :     ! Repeat until valid line is encountered
     883             :     DO
     884           0 :        CALL HCO_ReadLine( LUN, DUM, EOF, RC )
     885           0 :        IF ( EOF .OR. RC /= HCO_SUCCESS ) RETURN
     886             : 
     887             :        ! Skip if empty or commented line
     888           0 :        IF ( TRIM(DUM) == ''      ) CYCLE
     889           0 :        IF ( DUM(1:1)  == HCO_CMT ) CYCLE
     890             : 
     891             :        ! Make sure that character string DUM is not longer than LINE
     892           0 :        IF ( LEN_TRIM(DUM) > LEN(LINE) ) THEN
     893           0 :           WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     894           0 :           WRITE( 6, * ) ' Line is too long - cannot copy into output argument '
     895           0 :           WRITE( 6, * ) TRIM(DUM)
     896           0 :           WRITE( 6, * ) ' '
     897           0 :           WRITE( 6, * ) ' To fix this, increase length of argument `LINE` in '
     898           0 :           WRITE( 6, * ) ' the subprogram which is calling '
     899           0 :           WRITE( 6, * ) ' HCO_ReadLine (hco_chartools_mod.F90)'
     900           0 :           RC = HCO_FAIL
     901           0 :           RETURN
     902             :           WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     903             :        ELSE
     904             :           ! If we get here, exit loop
     905           0 :           LINE = DUM
     906             :           EXIT
     907             :        ENDIF
     908             : 
     909             :     ENDDO
     910             : 
     911             :     ! Return w/ success
     912           0 :     RC = HCO_SUCCESS
     913             : 
     914           0 :   END SUBROUTINE GetNextLine
     915             : !EOC
     916             : !------------------------------------------------------------------------------
     917             : !                   Harmonized Emissions Component (HEMCO)                    !
     918             : !------------------------------------------------------------------------------
     919             : !BOP
     920             : !
     921             : ! !IROUTINE: HCO_ReadLine
     922             : !
     923             : ! !DESCRIPTION: Subroutine HCO\_Line reads a line from the provided stream.
     924             : !\\
     925             : !\\
     926             : ! !INTERFACE:
     927             : !
     928           0 :   SUBROUTINE HCO_ReadLine( LUN, LINE, EOF, RC )
     929             : !
     930             : ! !USES:
     931             : !
     932             :     USE Hco_CharPak_Mod, ONLY : CStrip
     933             : !
     934             : ! !INPUT PARAMETERS:
     935             : !
     936             :     INTEGER,          INTENT(IN   ) :: LUN      ! Stream LUN
     937             : !
     938             : ! !OUTPUT PARAMETERS:
     939             : !
     940             :     CHARACTER(LEN=*), INTENT(INOUT) :: LINE     ! Line
     941             :     LOGICAL,          INTENT(INOUT) :: EOF      ! End of file?
     942             :     INTEGER,          INTENT(INOUT) :: RC       ! Return code
     943             : !
     944             : ! !REVISION HISTORY:
     945             : !  18 Sep 2013 - C. Keller - Initial version (adapted from B. Yantosca's code)
     946             : !  See https://github.com/geoschem/hemco for complete history
     947             : !EOP
     948             : !------------------------------------------------------------------------------
     949             : !BOC
     950             : !
     951             : ! !LOCAL VARIABLES:
     952             : !
     953             :     INTEGER             :: IOS, C
     954             :     CHARACTER(LEN=255)  :: MSG
     955             :     CHARACTER(LEN=5500) :: DUM
     956             : 
     957             :     !=================================================================
     958             :     ! HCO_ReadLine begins here!
     959             :     !=================================================================
     960             : 
     961             :     ! Initialize
     962           0 :     EOF = .FALSE.
     963           0 :     RC  = HCO_SUCCESS
     964             : 
     965             :     ! Read a line from the file
     966           0 :     READ( LUN, '(a)', IOSTAT=IOS ) DUM
     967             : 
     968             :     ! IO Status < 0: EOF condition
     969           0 :     IF ( IOS < 0 ) THEN
     970           0 :        EOF = .TRUE.
     971           0 :        RETURN
     972             :     ENDIF
     973             : 
     974             :     ! IO Status > 0: true I/O error condition
     975           0 :     IF ( IOS > 0 ) THEN
     976           0 :        WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     977           0 :        WRITE( 6, 100   ) IOS
     978             : 100    FORMAT( 'ERROR ', i5, ' in HCO_Readline (hco_chartools_mod.F90)' )
     979           0 :        WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     980           0 :        RC = HCO_FAIL
     981           0 :        RETURN
     982             :     ENDIF
     983             : 
     984             :     ! Make sure that character string DUM is not longer than LINE
     985           0 :     IF ( LEN(TRIM(DUM)) > LEN(LINE) ) THEN
     986           0 :        WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     987           0 :        WRITE( 6, * ) ' Line is too long - cannot read line ', TRIM(DUM)
     988           0 :        WRITE( 6, * ) ' '
     989           0 :        WRITE( 6, * ) ' To fix this, increase length of argument `LINE` in '
     990           0 :        WRITE( 6, * ) ' HCO_ReadLine (hco_chartools_mod.F90)'
     991           0 :        RC = HCO_FAIL
     992           0 :        RETURN
     993             :        WRITE( 6, '(a)' ) REPEAT( '=', 79 )
     994             :     ELSE
     995           0 :        LINE = DUM(1:LEN(LINE))
     996             :     ENDIF
     997             : 
     998             :     ! Strip tabs and other non-printing characters but keep spaces
     999           0 :     CALL CStrip( Line, KeepSpaces=.TRUE. )
    1000             : 
    1001             :     ! Skip any comments at the end of a line (unless the 
    1002             :     ! comment character # is in the first column)
    1003           0 :     C = INDEX( Line, '#' )
    1004           0 :     IF ( C > 1 ) Line = Line(1:C-1)
    1005             : 
    1006           0 :   END SUBROUTINE HCO_ReadLine
    1007             : !EOC
    1008             : END MODULE HCO_CharTools_Mod

Generated by: LCOV version 1.14