Changeset 3957 for LMDZ6/branches/LMDZ-tracers/libf/misc
- Timestamp:
- Jul 11, 2021, 11:39:01 PM (3 years ago)
- 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 14 14 PUBLIC :: getKey_init, getKey, setDirectKeys !--- FUNCTIONS TO GET KEYS FROM tracers & isotopes 15 15 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 17 18 18 19 PUBLIC :: tran0, idxAncestor, ancestor !--- GEN 0 TRACER + TOOLS FOR GENERATIONS … … 34 35 !--- SOME PARAMETERS THAT ARE NOT LIKELY TO CHANGE OFTEN 35 36 CHARACTER(LEN=256), SAVE :: tran0 = 'air' !--- Default transporting fluid 37 CHARACTER(LEN=256), PARAMETER :: old_phases = 'vli' !--- Old phases for water (no separator) 36 38 CHARACTER(LEN=256), PARAMETER :: known_phases = 'gls' !--- Known phases initials 37 39 INTEGER, PARAMETER :: nphases = LEN_TRIM(known_phases) !--- Number of phases 38 40 CHARACTER(LEN=256), SAVE :: phases_names(nphases) & !--- Known phases names 39 41 = ['gaseous', 'liquid ', 'solid '] 42 CHARACTER(LEN=1), SAVE :: phases_sep = '_' !--- Phase separator 40 43 LOGICAL, SAVE :: tracs_merge = .TRUE. !--- Merge/stack tracers lists 41 44 LOGICAL, SAVE :: lSortByGen = .TRUE. !--- Sort by growing generation … … 79 82 CHARACTER(LEN=256), ALLOCATABLE :: s(:), sections(:), trac_files(:) 80 83 CHARACTER(LEN=256) :: str, fname, mesg 81 INTEGER :: is, nsec, ierr, it, ntrac, ns 84 INTEGER :: is, nsec, ierr, it, ntrac, ns, ip 82 85 LOGICAL, ALLOCATABLE :: ll(:), lGen3(:) 83 86 !------------------------------------------------------------------------------------------------------------------------------ … … 97 100 IF(.NOT.testFile('traceur.def') .AND. nsec==1) fType = 1 !--- OLD STYLE FILE 98 101 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 USED102 IF(ALL(ll)) fType = 3 !--- NEW STYLE ; SEVERAL FILES, SINGLE SECTION USED 100 103 IF(ANY(ll) .AND. fType/=3) THEN !--- MISSING FILES 101 104 IF(test(checkList(trac_files, .NOT.ll, 'Failed reading tracers description', 'files', 'missing'), lerr)) RETURN … … 129 132 CALL msg(ns == 3 .AND. it == 1, 'This file is for air tracers only') 130 133 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 137 139 tracs(it)%prnt = tran0 !--- Default transporting fluid: Air 138 140 IF(ns == 4) tracs(it)%prnt = s(4) !--- Transporting fluid name … … 549 551 trn=TRIM(tr(iq)%name); nam=trn !--- Tracer name (regular case) 550 552 IF(lTg) nam = TRIM(tr(iq)%prnt) !--- Parent name (tagging case) 551 IF(lEx) nam = TRIM(nam)// '-'//pha(ip:ip)!--- Phase extension needed553 IF(lEx) nam = TRIM(nam)//phases_sep//pha(ip:ip) !--- Phase extension needed 552 554 IF(lTg) nam = TRIM(nam)//'_'//TRIM(trn) !--- <parent>_<name> for tags 553 555 ttr(it) = tr(iq) !--- Same <key>=<val> pairs … … 556 558 ttr(it)%phas = pha(ip:ip) !--- Single phase entry 557 559 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) 560 562 END IF 561 563 it=it+1 … … 698 700 tnam = t1(iq)%name !--- Original name 699 701 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 extension702 tnam_new = TRIM(tnam)//phases_sep//TRIM(sections(is)%name) !--- Same with section extension 701 703 nq = SUM(nt(1:is-1)) !--- Number of tracers in previous sections 702 704 ns = nt(is) !--- Number of tracers in the current section … … 1231 1233 i = INDEX(s, '_'); l = LEN_TRIM(s) 1232 1234 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) 1234 1236 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) 1236 1238 END IF 1237 1239 END FUNCTION delPhase … … 1244 1246 IF(s == '') RETURN 1245 1247 i = INDEX(s, '_'); l = LEN_TRIM(s) 1246 IF(i == 0) out = TRIM(s)// '-'//pha1247 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) 1248 1250 END FUNCTION addPhase_1 1249 1251 !------------------------------------------------------------------------------------------------------------------------------ -
LMDZ6/branches/LMDZ-tracers/libf/misc/strings_mod.F90
r3892 r3957 186 186 187 187 !============================================================================================================================== 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 !============================================================================================================================== 190 CHARACTER(LEN=256) FUNCTION strHead_1(str,sep,lFirst) RESULT(out) 191 191 CHARACTER(LEN=*), INTENT(IN) :: str 192 192 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep 193 LOGICAL, OPTIONAL, INTENT(IN) :: lFirst 194 LOGICAL :: lf 195 lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst 193 196 IF(PRESENT(sep)) THEN 194 out = str(1:INDEX(str,sep,. TRUE.)-1)197 out = str(1:INDEX(str,sep,.NOT.lf)-1) 195 198 ELSE 196 out = str(1:INDEX(str,'/',. TRUE.)-1)199 out = str(1:INDEX(str,'/',.NOT.lf)-1) 197 200 END IF 198 201 IF(out == '') out = str 199 202 END FUNCTION strHead_1 200 203 !============================================================================================================================== 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) 204 FUNCTION strHead_m(str,sep,lFirst) RESULT(out) 213 205 CHARACTER(LEN=256), ALLOCATABLE :: out(:) 214 206 CHARACTER(LEN=*), INTENT(IN) :: str(:) 215 207 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep 208 LOGICAL, OPTIONAL, INTENT(IN) :: lFirst 209 LOGICAL :: lf 216 210 INTEGER :: k 211 lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst 217 212 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))] 219 214 ELSE 220 out = [(strHead_1(str(k) ),k=1, SIZE(str))]215 out = [(strHead_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))] 221 216 END IF 222 217 223 218 END FUNCTION strHead_m 224 219 !============================================================================================================================== 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 !============================================================================================================================== 222 CHARACTER(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 234 END FUNCTION strTail_1 235 !============================================================================================================================== 236 FUNCTION strTail_m(str,sep,lFirst) RESULT(out) 226 237 CHARACTER(LEN=256), ALLOCATABLE :: out(:) 227 238 CHARACTER(LEN=*), INTENT(IN) :: str(:) 228 239 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep 240 LOGICAL, OPTIONAL, INTENT(IN) :: lFirst 241 LOGICAL :: lf 229 242 INTEGER :: k 243 lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst 230 244 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))] 232 246 ELSE 233 out = [(strTail_1(str(k) ),k=1, SIZE(str))]247 out = [(strTail_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))] 234 248 END IF 235 249 END FUNCTION strTail_m
Note: See TracChangeset
for help on using the changeset viewer.