Ignore:
Timestamp:
Jul 11, 2021, 11:39:01 PM (3 years ago)
Author:
dcugnet
Message:

In readTracFiles: the separator between the tracer name and its phase is no longer hardcoded and equal to "-",
but is a parameter ("phases_sep") which default value is "_".
Few more fixes.

Location:
LMDZ6/branches/LMDZ-tracers/libf/misc
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/LMDZ-tracers/libf/misc/readTracFiles_mod.f90

    r3891 r3957  
    1414  PUBLIC :: getKey_init, getKey, setDirectKeys                            !--- FUNCTIONS TO GET KEYS FROM tracers & isotopes
    1515
    16   PUBLIC :: known_phases, nphases, phases_names, delPhase, addPhase       !--- PHASES RELATED VARIABLES AND ROUTINES
     16  PUBLIC :: known_phases, old_phases, nphases, phases_names, phases_sep, &!--- VARIABLES RELATED TO THE PHASES
     17            delPhase, addPhase                                            !--- ROUTINES TO ADD/REMOVE PHASE TO/FROM A NAME
    1718
    1819  PUBLIC :: tran0, idxAncestor, ancestor                                  !--- GEN 0 TRACER + TOOLS FOR GENERATIONS
     
    3435  !--- SOME PARAMETERS THAT ARE NOT LIKELY TO CHANGE OFTEN
    3536  CHARACTER(LEN=256), SAVE      :: tran0        = 'air'              !--- Default transporting fluid
     37  CHARACTER(LEN=256), PARAMETER :: old_phases   = 'vli'              !--- Old phases for water (no separator)
    3638  CHARACTER(LEN=256), PARAMETER :: known_phases = 'gls'              !--- Known phases initials
    3739  INTEGER,            PARAMETER :: nphases = LEN_TRIM(known_phases)  !--- Number of phases
    3840  CHARACTER(LEN=256), SAVE      :: phases_names(nphases) &           !--- Known phases names
    3941                                 = ['gaseous', 'liquid ', 'solid  ']
     42  CHARACTER(LEN=1),   SAVE      :: phases_sep  =  '_'                !--- Phase separator
    4043  LOGICAL,            SAVE      :: tracs_merge = .TRUE.              !--- Merge/stack tracers lists
    4144  LOGICAL,            SAVE      :: lSortByGen  = .TRUE.              !--- Sort by growing generation
     
    7982  CHARACTER(LEN=256),     ALLOCATABLE ::  s(:), sections(:), trac_files(:)
    8083  CHARACTER(LEN=256)   :: str, fname, mesg
    81   INTEGER              :: is, nsec, ierr, it, ntrac, ns
     84  INTEGER              :: is, nsec, ierr, it, ntrac, ns, ip
    8285  LOGICAL, ALLOCATABLE :: ll(:), lGen3(:)
    8386!------------------------------------------------------------------------------------------------------------------------------
     
    97100  IF(.NOT.testFile('traceur.def') .AND. nsec==1) fType = 1           !--- OLD STYLE FILE
    98101  IF(.NOT.testFile('tracer.def'))                fType = 2           !--- NEW STYLE ; SINGLE  FILE, SEVERAL SECTIONS
    99   IF(ALL(ll))                               fType = 3                !--- NEW STYLE ; SEVERAL FILES, SINGLE SECTION USED
     102  IF(ALL(ll))                                    fType = 3           !--- NEW STYLE ; SEVERAL FILES, SINGLE SECTION USED
    100103  IF(ANY(ll) .AND. fType/=3) THEN                                    !--- MISSING FILES
    101104    IF(test(checkList(trac_files, .NOT.ll, 'Failed reading tracers description', 'files', 'missing'), lerr)) RETURN
     
    129132      CALL msg(ns == 3 .AND. it == 1, 'This file is for air tracers only')
    130133      CALL msg(ns == 4 .AND. it == 1, 'This files specifies the transporting fluid')
    131       SELECT CASE(s(3))                                              !--- name and phase of the tracer
    132         CASE('H2Ov'); tracs(it)%name = 'H2O-g'; tracs(it)%phas = 'g'
    133         CASE('H2Ol'); tracs(it)%name = 'H2O-l'; tracs(it)%phas = 'l'
    134         CASE('H2Oi'); tracs(it)%name = 'H2O-s'; tracs(it)%phas = 's'
    135         CASE DEFAULT; tracs(it)%name = s(3)   ; tracs(it)%phas = 'g'
    136       END SELECT
     134      tracs(it)%name = s(3); tracs(it)%phas = known_phases(1:1)      !--- Default: name, gazeous phase "g"
     135      DO ip = 1, nphases                                             !--- Deal with old water names
     136        IF(s(3) /= 'H2O'//old_phases(ip:ip)) CYCLE
     137        tracs(it)%phas = known_phases(ip:ip); tracs(it)%name = 'H2O'//phases_sep//TRIM(tracs(it)%phas)
     138      END DO
    137139      tracs(it)%prnt = tran0                                         !--- Default transporting fluid: Air
    138140      IF(ns == 4) tracs(it)%prnt = s(4)                              !--- Transporting fluid name
     
    549551        trn=TRIM(tr(iq)%name); nam=trn                               !--- Tracer name (regular case)
    550552        IF(lTg) nam = TRIM(tr(iq)%prnt)                              !--- Parent name (tagging case)
    551         IF(lEx) nam = TRIM(nam)//'-'//pha(ip:ip)                     !--- Phase extension needed
     553        IF(lEx) nam = TRIM(nam)//phases_sep//pha(ip:ip)              !--- Phase extension needed
    552554        IF(lTg) nam = TRIM(nam)//'_'//TRIM(trn)                      !--- <parent>_<name> for tags
    553555        ttr(it) = tr(iq)                                             !--- Same <key>=<val> pairs
     
    556558        ttr(it)%phas = pha(ip:ip)                                    !--- Single phase entry
    557559        IF(lEx.AND.tr(iq)%igen>1) THEN
    558           ttr(it)%prnt = TRIM(ttr(it)%prnt)//'-'//pha(ip:ip)
    559           ttr(it)%nam1 = TRIM(ttr(it)%nam1)//'-'//pha(ip:ip)
     560          ttr(it)%prnt = TRIM(ttr(it)%prnt)//phases_sep//pha(ip:ip)
     561          ttr(it)%nam1 = TRIM(ttr(it)%nam1)//phases_sep//pha(ip:ip)
    560562        END IF
    561563        it=it+1
     
    698700      tnam = t1(iq)%name                                             !--- Original name
    699701      IF(COUNT(t1%name == tnam) == 1) CYCLE                          !--- Current tracer is not duplicated: finished
    700       tnam_new = TRIM(tnam)//'-'//TRIM(sections(is)%name)            !--- Same with section extension
     702      tnam_new = TRIM(tnam)//phases_sep//TRIM(sections(is)%name)     !--- Same with section extension
    701703      nq = SUM(nt(1:is-1))                                           !--- Number of tracers in previous sections
    702704      ns = nt(is)                                                    !--- Number of tracers in the current section
     
    12311233  i = INDEX(s, '_'); l = LEN_TRIM(s)
    12321234  IF(i == 0) THEN
    1233     IF(s(l-1:l-1)=='-' .AND. INDEX(known_phases,s(l:l)) /= 0) out = s(1:l-2)
     1235    IF(s(l-1:l-1)==phases_sep .AND. INDEX(known_phases,s(l:l)) /= 0) out = s(1:l-2)
    12341236  ELSE; i=i-1
    1235     IF(s(i-1:i-1)=='-' .AND. INDEX(known_phases,s(i:i)) /= 0) out = s(1:i-2)//s(i+1:l)
     1237    IF(s(i-1:i-1)==phases_sep .AND. INDEX(known_phases,s(i:i)) /= 0) out = s(1:i-2)//s(i+1:l)
    12361238  END IF
    12371239END FUNCTION delPhase
     
    12441246  IF(s == '') RETURN
    12451247  i = INDEX(s, '_'); l = LEN_TRIM(s)
    1246   IF(i == 0) out =  TRIM(s)//'-'//pha
    1247   IF(i /= 0) out = s(1:i-1)//'-'//pha//'_'//s(i+1:l)
     1248  IF(i == 0) out =  TRIM(s)//phases_sep//pha
     1249  IF(i /= 0) out = s(1:i-1)//phases_sep//pha//'_'//s(i+1:l)
    12481250END FUNCTION addPhase_1
    12491251!------------------------------------------------------------------------------------------------------------------------------
  • LMDZ6/branches/LMDZ-tracers/libf/misc/strings_mod.F90

    r3892 r3957  
    186186
    187187!==============================================================================================================================
    188 !=== Extract first or last element of a string "str" delimited by separator "sep" =============================================
    189 !==============================================================================================================================
    190 CHARACTER(LEN=256) FUNCTION strHead_1(str,sep) RESULT(out)
     188!=== Extract the substring in front of the last (first if lFirst==TRUE) occurrence of separator "sep" in "str" ================
     189!==============================================================================================================================
     190CHARACTER(LEN=256) FUNCTION strHead_1(str,sep,lFirst) RESULT(out)
    191191  CHARACTER(LEN=*),           INTENT(IN) :: str
    192192  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     193  LOGICAL,          OPTIONAL, INTENT(IN) :: lFirst
     194  LOGICAL :: lf
     195  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
    193196  IF(PRESENT(sep)) THEN
    194     out = str(1:INDEX(str,sep,.TRUE.)-1)
     197    out = str(1:INDEX(str,sep,.NOT.lf)-1)
    195198  ELSE
    196     out = str(1:INDEX(str,'/',.TRUE.)-1)
     199    out = str(1:INDEX(str,'/',.NOT.lf)-1)
    197200  END IF
    198201  IF(out == '') out = str
    199202END FUNCTION strHead_1
    200203!==============================================================================================================================
    201 CHARACTER(LEN=256) FUNCTION strTail_1(str,sep) RESULT(out)
    202   CHARACTER(LEN=*),           INTENT(IN) :: str
    203   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
    204   IF(PRESENT(sep)) THEN
    205     out = str(INDEX(str,sep,.TRUE.)+LEN(sep):LEN_TRIM(str))
    206   ELSE
    207     out = str(INDEX(str,'/',.TRUE.)+1:LEN_TRIM(str))
    208   END IF
    209   IF(out == '') out = str
    210 END FUNCTION strTail_1
    211 !==============================================================================================================================
    212 FUNCTION strHead_m(str,sep) RESULT(out)
     204FUNCTION strHead_m(str,sep,lFirst) RESULT(out)
    213205  CHARACTER(LEN=256),        ALLOCATABLE :: out(:)
    214206  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
    215207  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     208  LOGICAL,          OPTIONAL, INTENT(IN) :: lFirst
     209  LOGICAL :: lf
    216210  INTEGER :: k
     211  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
    217212  IF(PRESENT(sep)) THEN
    218     out = [(strHead_1(str(k),sep), k=1, SIZE(str))]
     213    out = [(strHead_1(str(k),sep,.NOT.lf),    k=1, SIZE(str))]
    219214  ELSE
    220     out = [(strHead_1(str(k)),    k=1, SIZE(str))]
     215    out = [(strHead_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))]
    221216  END IF
    222217
    223218END FUNCTION strHead_m
    224219!==============================================================================================================================
    225 FUNCTION strTail_m(str,sep) RESULT(out)
     220!=== Extract the substring following the last (first if lFirst==TRUE) occurrence of separator "sep" in "str" ==================
     221!==============================================================================================================================
     222CHARACTER(LEN=256) FUNCTION strTail_1(str,sep,lFirst) RESULT(out)
     223  CHARACTER(LEN=*),           INTENT(IN) :: str
     224  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     225  LOGICAL,          OPTIONAL, INTENT(IN) :: lFirst
     226  LOGICAL :: lf
     227  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
     228  IF(PRESENT(sep)) THEN
     229    out = str(INDEX(str,sep,.NOT.lf)+LEN(sep):LEN_TRIM(str))
     230  ELSE
     231    out = str(INDEX(str,'/',.NOT.lf)+1:LEN_TRIM(str))
     232  END IF
     233  IF(out == '') out = str
     234END FUNCTION strTail_1
     235!==============================================================================================================================
     236FUNCTION strTail_m(str,sep,lFirst) RESULT(out)
    226237  CHARACTER(LEN=256),        ALLOCATABLE :: out(:)
    227238  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
    228239  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     240  LOGICAL,          OPTIONAL, INTENT(IN) :: lFirst
     241  LOGICAL :: lf
    229242  INTEGER :: k
     243  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
    230244  IF(PRESENT(sep)) THEN
    231     out = [(strTail_1(str(k),sep), k=1, SIZE(str))]
     245    out = [(strTail_1(str(k),sep,.NOT.lf),    k=1, SIZE(str))]
    232246  ELSE
    233     out = [(strTail_1(str(k)),    k=1, SIZE(str))]
     247    out = [(strTail_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))]
    234248  END IF
    235249END FUNCTION strTail_m
Note: See TracChangeset for help on using the changeset viewer.