Changeset 5746
- Timestamp:
- Jul 1, 2025, 5:48:46 PM (2 days ago)
- Location:
- LMDZ6/trunk/libf
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/misc/readTracFiles_mod.f90
r5508 r5746 2 2 3 3 USE strings_mod, ONLY: msg, find, get_in, dispTable, strHead, strReduce, strFind, strStack, strIdx, & 4 removeComment, cat, fmsg,maxlen, checkList, strParse, strReplace, strTail, strCount, reduceExpr, &4 removeComment, cat, maxlen, checkList, strParse, strReplace, strTail, strCount, reduceExpr, & 5 5 int2str, str2int, real2str, str2real, bool2str, str2bool 6 6 … … 220 220 !--- GET THE TRACERS NUMBER 221 221 READ(90,'(i3)',IOSTAT=ierr)ntrac !--- Number of lines/tracers 222 lerr = ierr/=0; IF(fmsg('Invalid format for "'//TRIM(fname)//'"', modname, lerr)) RETURN222 lerr = ierr/=0; CALL msg('Invalid format for "'//TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN 223 223 224 224 !--- READ THE REMAINING LINES: <hadv> <vadv> <tracer> [<transporting fluid>] … … 226 226 DO it = 1, ntrac !=== READ RAW DATA: loop on the line/tracer number 227 227 READ(90,'(a)',IOSTAT=ierr) str 228 lerr = ierr>0; IF(fmsg('Invalid format for "' //TRIM(fname)//'"', modname, lerr)) RETURN229 lerr = ierr<0; IF(fmsg('Not enough lines in "'//TRIM(fname)//'"', modname, lerr)) RETURN228 lerr = ierr>0; CALL msg('Invalid format for "' //TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN 229 lerr = ierr<0; CALL msg('Not enough lines in "'//TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN 230 230 lerr = strParse(str, ' ', s, ns) 231 231 CALL msg('This file is for air tracers only', modname, ns == 3 .AND. it == 1) … … 609 609 jq = strIdx(tname(:), parent(jq)) 610 610 lerr = jq == 0 611 IF(fmsg('Orphan tracer "'//TRIM(tname(iq))//'"', modname, lerr)) RETURN611 CALL msg('Orphan tracer "'//TRIM(tname(iq))//'"', modname, lerr); IF(lerr) RETURN 612 612 ig = ig + 1 613 613 END DO … … 882 882 lerr = getKey(keys(ik), v1, i1, k1) 883 883 lerr = getKey(keys(ik), v2, i2, k2) 884 lerr = v1 /= v2; IF(fmsg(TRIM(keys(ik))//TRIM(s1), modname, lerr)) RETURN884 lerr = v1 /= v2; CALL msg(TRIM(keys(ik))//TRIM(s1), modname, lerr); IF(lerr) RETURN 885 885 END DO 886 886 … … 1122 1122 !--- THE INPUT FILE MUST BE PRESENT 1123 1123 INQUIRE(FILE=TRIM(fnam), EXIST=lFound); lerr = .NOT.lFound 1124 IF(fmsg('Missing isotopes parameters file "'//TRIM(fnam)//'"', modname, lerr)) RETURN1124 CALL msg('Missing isotopes parameters file "'//TRIM(fnam)//'"', modname, lerr); IF(lerr) RETURN 1125 1125 1126 1126 !--- READ THE FILE SECTIONS, ONE EACH PARENT TRACER … … 1188 1188 END DO 1189 1189 lerr = dispTable(prf, ttl, val, cat([(it,it=1,nt)]), rFmt='(EN8.4)', nColMax=maxTableWidth, nHead=2, sub=modname) 1190 IF(fmsg('Problem with the table content', modname, lerr)) RETURN1190 CALL msg('Problem with the table content', modname, lerr); IF(lerr) RETURN 1191 1191 DEALLOCATE(ttl, val) 1192 1192 END DO … … 1237 1237 DO it = 1, SIZE(iNames) 1238 1238 lerr = ALL(p /= iNames(it)) 1239 IF(fmsg('No isotopes class "'//TRIM(iNames(it))//'" found among tracers', modname, lerr)) RETURN1239 CALL msg('No isotopes class "'//TRIM(iNames(it))//'" found among tracers', modname, lerr); IF(lerr) RETURN 1240 1240 END DO 1241 1241 p = iNames; nbIso = SIZE(p) … … 1765 1765 lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, def, lDisp); IF(lerr) RETURN 1766 1766 lerr = strParse(sval, ',', val) 1767 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1767 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1768 1768 END FUNCTION getKeyByIndex_s1m1 1769 1769 !============================================================================================================================== … … 1782 1782 IF(lerr) RETURN 1783 1783 lerr = strParse(sval, ',', svals) 1784 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1784 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1785 1785 val = str2int(svals) 1786 1786 lerr = ANY(val == -HUGE(1)) … … 1802 1802 IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp) 1803 1803 lerr = strParse(sval, ',', svals) 1804 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1804 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1805 1805 val = str2real(svals) 1806 1806 lerr = ANY(val == -HUGE(1.)) … … 1823 1823 IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp) 1824 1824 lerr = strParse(sval, ',', svals) 1825 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1825 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1826 1826 ivals = str2bool(svals) 1827 1827 lerr = ANY(ivals == -1) … … 1843 1843 lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, def, lDisp); IF(lerr) RETURN 1844 1844 lerr = strParse(sval, ',', val) 1845 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1845 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1846 1846 END FUNCTION getKeyByIndex_smm1 1847 1847 !============================================================================================================================== … … 1860 1860 IF(lerr) RETURN 1861 1861 lerr = strParse(sval, ',', svals) 1862 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1862 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1863 1863 val = str2int(svals) 1864 1864 lerr = ANY(val == -HUGE(1)) … … 1881 1881 IF(lerr) RETURN 1882 1882 lerr = strParse(sval, ',', svals) 1883 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1883 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1884 1884 val = str2real(svals) 1885 1885 lerr = ANY(val == -HUGE(1.)) … … 1903 1903 IF(lerr) RETURN 1904 1904 lerr = strParse(sval, ',', svals) 1905 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN1905 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 1906 1906 ivals = str2bool(svals) 1907 1907 lerr = ANY(ivals == -1) … … 2220 2220 lerr = getKeyByName_sm11([keyn], sval, tname, ky, def, lDisp); IF(lerr) RETURN 2221 2221 lerr = strParse(sval, ',', val) 2222 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2222 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2223 2223 END FUNCTION getKeyByName_s1m1 2224 2224 !============================================================================================================================== … … 2236 2236 IF(lerr) RETURN 2237 2237 lerr = strParse(sval, ',', svals) 2238 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2238 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2239 2239 val = str2int(svals) 2240 2240 lerr = ANY(val == -HUGE(1)) … … 2256 2256 IF(lerr) RETURN 2257 2257 lerr = strParse(sval, ',', svals) 2258 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2258 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2259 2259 val = str2real(svals) 2260 2260 lerr = ANY(val == -HUGE(1.)) … … 2277 2277 IF(lerr) RETURN 2278 2278 lerr = strParse(sval, ',', svals) 2279 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2279 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2280 2280 ivals = str2bool(svals) 2281 2281 lerr = ANY(ivals == -1) … … 2296 2296 lerr = getKeyByName_sm11(keyn, sval, tname, ky, def, lDisp); IF(lerr) RETURN 2297 2297 lerr = strParse(sval, ',', val) 2298 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2298 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2299 2299 END FUNCTION getKeyByName_smm1 2300 2300 !============================================================================================================================== … … 2312 2312 IF(lerr) RETURN 2313 2313 lerr = strParse(sval, ',', svals) 2314 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2314 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2315 2315 val = str2int(svals) 2316 2316 lerr = ANY(val == -HUGE(1)) … … 2332 2332 IF(lerr) RETURN 2333 2333 lerr = strParse(sval, ',', svals) 2334 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2334 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2335 2335 val = str2real(svals) 2336 2336 lerr = ANY(val == -HUGE(1.)) … … 2353 2353 IF(lerr) RETURN 2354 2354 lerr = strParse(sval, ',', svals) 2355 IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN2355 CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN 2356 2356 ivals = str2bool(svals) 2357 2357 lerr = ANY(ivals == -1) … … 2646 2646 INTEGER :: nt, ix 2647 2647 lerr = .NOT.ALLOCATED(tracs) 2648 IF(fmsg('Can''t remove tracer "'//TRIM(tname)//'" from an empty tracers descriptor', modname, lerr)) RETURN2648 CALL msg('Can''t remove tracer "'//TRIM(tname)//'" from an empty tracers descriptor', modname, lerr); IF(lerr) RETURN 2649 2649 nt = SIZE(tracs) 2650 2650 lerr = getKey('name', tnames, ky=tracs(:)%keys); IF(lerr) RETURN -
LMDZ6/trunk/libf/misc/strings_mod.f90
r5745 r5746 4 4 5 5 PRIVATE 6 PUBLIC :: maxlen, init_printout, msg, fmsg,get_in, lunout, prt_level6 PUBLIC :: maxlen, init_printout, msg, get_in, lunout, prt_level 7 7 PUBLIC :: strLower, strHead, strStack, strCount, strReduce, strClean, strIdx 8 8 PUBLIC :: strUpper, strTail, strStackm, strParse, strReplace, strFind, find, cat … … 14 14 INTERFACE get_in; MODULE PROCEDURE getin_s, getin_i, getin_r, getin_l; END INTERFACE get_in 15 15 INTERFACE msg; MODULE PROCEDURE msg_1, msg_m; END INTERFACE msg 16 INTERFACE fmsg; MODULE PROCEDURE fmsg_1, fmsg_m; END INTERFACE fmsg17 16 INTERFACE strHead; MODULE PROCEDURE strHead_1, strHead_m; END INTERFACE strHead 18 17 INTERFACE strTail; MODULE PROCEDURE strTail_1, strTail_m; END INTERFACE strTail … … 136 135 DO k=1,SIZE(s); CALL msg_1(s(k), subn, l, unt); END DO 137 136 END SUBROUTINE msg_m 138 !==============================================================================================================================139 FUNCTION fmsg_1(str, modname, ll, unit) RESULT(l)140 IMPLICIT NONE141 CHARACTER(LEN=*), INTENT(IN) :: str142 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname143 LOGICAL, OPTIONAL, INTENT(IN) :: ll144 INTEGER, OPTIONAL, INTENT(IN) :: unit145 LOGICAL :: l146 !------------------------------------------------------------------------------------------------------------------------------147 CHARACTER(LEN=maxlen) :: subn148 INTEGER :: unt149 subn = ''; IF(PRESENT(modname)) subn = modname150 l = .TRUE.; IF(PRESENT(ll)) l = ll151 unt = lunout; IF(PRESENT(unit)) unt = unit152 CALL msg_1(str, subn, l, unt)153 END FUNCTION fmsg_1154 !==============================================================================================================================155 FUNCTION fmsg_m(str, modname, ll, unit, nmax) RESULT(l)156 IMPLICIT NONE157 CHARACTER(LEN=*), INTENT(IN) :: str(:)158 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname159 LOGICAL, OPTIONAL, INTENT(IN) :: ll160 INTEGER, OPTIONAL, INTENT(IN) :: unit161 INTEGER, OPTIONAL, INTENT(IN) :: nmax162 LOGICAL :: l163 !------------------------------------------------------------------------------------------------------------------------------164 CHARACTER(LEN=maxlen) :: subn165 INTEGER :: unt, nmx166 subn = ''; IF(PRESENT(modname)) subn = modname167 l = .TRUE.; IF(PRESENT(ll)) l = ll168 unt = lunout; IF(PRESENT(unit)) unt = unit169 nmx = 128; IF(PRESENT(nmax)) nmx = nmax170 CALL msg_m(str, subn, l, unt, nmx)171 END FUNCTION fmsg_m172 137 !============================================================================================================================== 173 138 … … 592 557 DO 593 558 lerr = strIdx_prv(r, delimiter, ib, ie, jd, ll) 594 IF(fmsg('"'//TRIM(r(ib:ie-1))//'" is not numeric', ll=lerr)) RETURN559 CALL msg('"'//TRIM(r(ib:ie-1))//'" is not numeric', ll = lerr); IF(lerr) RETURN 595 560 IF(ie == 0 .OR. jd == 0) EXIT 596 561 ib = ie + LEN(delimiter(jd)) … … 1119 1084 1120 1085 !--- CHECK ARGUMENTS COHERENCE 1121 lerr = np /= SIZE(titles); IF(fmsg('display map "p" length and titles list mismatch', subn, lerr)) RETURN1086 lerr = np /= SIZE(titles); CALL msg('display map "p" length and titles list mismatch', subn, lerr); IF(lerr) RETURN 1122 1087 IF(ls) THEN 1123 1088 ns = SIZE(s, 1); ncol = ncol + SIZE(s, 2); lerr = COUNT([(p(ic:ic)=='s', ic=1, np)]) /= SIZE(s, 2) … … 1129 1094 nr = SIZE(r, 1); ncol = ncol + SIZE(r, 2); lerr = COUNT([(p(ic:ic)=='r', ic=1, np)]) /= SIZE(r, 2) 1130 1095 END IF 1131 IF(fmsg('display map "p" length and arguments number mismatch', subn, lerr)) RETURN1132 lerr = ncol /= SIZE(titles); IF(fmsg('"titles" length and arguments number mismatch', subn, lerr)) RETURN1133 lerr = ls.AND.li.AND.ns/=ni; IF(fmsg('string and integer arguments lengths mismatch', subn, lerr)) RETURN1134 lerr = ls.AND.lr.AND.ns/=nr; IF(fmsg( 'string and real arguments lengths mismatch', subn, lerr)) RETURN1135 lerr = li.AND.lr.AND.ni/=nr; IF(fmsg( 'integer and real arguments lengths mismatch', subn, lerr)) RETURN1096 CALL msg('display map "p" length and arguments number mismatch', subn, lerr); IF(lerr) RETURN 1097 lerr = ncol /= SIZE(titles); CALL msg('"titles" length and arguments number mismatch', subn, lerr); IF(lerr) RETURN 1098 lerr = ls.AND.li.AND.ns/=ni; CALL msg('string and integer arguments lengths mismatch', subn, lerr); IF(lerr) RETURN 1099 lerr = ls.AND.lr.AND.ns/=nr; CALL msg( 'string and real arguments lengths mismatch', subn, lerr); IF(lerr) RETURN 1100 lerr = li.AND.lr.AND.ni/=nr; CALL msg( 'integer and real arguments lengths mismatch', subn, lerr); IF(lerr) RETURN 1136 1101 nmx = MAX(ns,ni,nr)+1; IF(PRESENT(nRowMax)) nmx = MIN(nmx,nRowMax+1) 1137 1102 … … 1230 1195 lerr = COUNT([(p(ic:ic)=='r', ic=1, np)]) /= SIZE(r, DIM=2) 1231 1196 END IF 1232 IF(fmsg('display map "p" length and arguments number mismatch', ll=lerr)) RETURN1233 lerr = ncol /= SIZE(titles); IF(fmsg('"titles" length and arguments number mismatch', ll=lerr)) RETURN1234 lerr = ls.AND.li.AND.ns/=ni; IF(fmsg('string and integer arguments lengths mismatch', ll=lerr)) RETURN1235 lerr = ls.AND.lr.AND.ns/=nr; IF(fmsg( 'string and real arguments lengths mismatch', ll=lerr)) RETURN1236 lerr = li.AND.lr.AND.ni/=nr; IF(fmsg( 'integer and real arguments lengths mismatch', ll=lerr)) RETURN1197 CALL msg('display map "p" length and arguments number mismatch', ll=lerr); IF(lerr) RETURN 1198 lerr = ncol /= SIZE(titles); CALL msg('"titles" length and arguments number mismatch', ll=lerr); IF(lerr) RETURN 1199 lerr = ls.AND.li.AND.ns/=ni; CALL msg('string and integer arguments lengths mismatch', ll=lerr); IF(lerr) RETURN 1200 lerr = ls.AND.lr.AND.ns/=nr; CALL msg( 'string and real arguments lengths mismatch', ll=lerr); IF(lerr) RETURN 1201 lerr = li.AND.lr.AND.ni/=nr; CALL msg( 'integer and real arguments lengths mismatch', ll=lerr); IF(lerr) RETURN 1237 1202 1238 1203 !--- Allocate the assembled quantities array … … 1386 1351 nHd = 1; IF(PRESENT(nHead)) nHd = nHead !--- Number of front columns to duplicate 1387 1352 unt = lunout; IF(PRESENT(unit)) unt = unit !--- Unit to print messages 1388 lerr= SIZE(vnm) /= nv; IF(fmsg('SIZE(nam) /= SIZE(a,2)', sub, lerr, unt)) RETURN1389 lerr= SIZE(a,1) /= SIZE(ll); IF(fmsg('"ll" and "a" sizes mismatch', sub, lerr, unt)) RETURN1390 lerr= SIZE(a,1) /= PRODUCT(n); IF(fmsg('profile "n" does not match "a" and "ll"', sub, lerr, unt)) RETURN1353 lerr= SIZE(vnm) /= nv; CALL msg('SIZE(nam) /= SIZE(a,2)', sub, lerr, unt); IF(lerr) RETURN 1354 lerr= SIZE(a,1) /= SIZE(ll); CALL msg('"ll" and "a" sizes mismatch', sub, lerr, unt); IF(lerr) RETURN 1355 lerr= SIZE(a,1) /= PRODUCT(n); CALL msg('profile "n" does not match "a" and "ll"', sub, lerr, unt); IF(lerr) RETURN 1391 1356 1392 1357 SELECT CASE(rk) !--- Indices list … … 1433 1398 ll = strCount(s,')',nn) 1434 1399 lerr = nl /= nn 1435 IF(fmsg('Mismatching number of opening and closing parenthesis: '//TRIM(s), ll=lerr)) RETURN1400 CALL msg('Mismatching number of opening and closing parenthesis: '//TRIM(s), ll=lerr); IF(lerr) RETURN 1436 1401 nl = 2*nl-1 1437 1402 -
LMDZ6/trunk/libf/phylmdiso/isotrac_mod.F90
r5199 r5746 148 148 USE isotopes_mod, ONLY: iso_eau, ntracisoOR, initialisation_iso 149 149 USE dimphy, ONLY: klon, klev 150 USE strings_mod, ONLY: int2str, strStack, strTail, strHead, strIdx , fmsg150 USE strings_mod, ONLY: int2str, strStack, strTail, strHead, strIdx 151 151 152 152 IMPLICIT NONE … … 157 157 INTEGER :: nzone_opt 158 158 159 IF(fmsg("traceurs_init 18: isotrac ne marche que si on met l'eau comme isotope", 'iso_traceurs_init', iso_eau==0)) STOP 159 CALL msg("traceurs_init 18: isotrac ne marche que si on met l'eau comme isotope", 'iso_traceurs_init', iso_eau==0) 160 IF(lerr) STOP 160 161 161 162 !--- Initialize
Note: See TracChangeset
for help on using the changeset viewer.