Ignore:
Timestamp:
Jul 28, 2025, 7:23:15 PM (7 days ago)
Author:
aborella
Message:

Merge with trunk r5789

Location:
LMDZ6/branches/contrails
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/contrails

  • LMDZ6/branches/contrails/libf/misc/readTracFiles_mod.f90

    r5641 r5791  
    11MODULE readTracFiles_mod
    22
    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, &
    5              int2str, str2int, real2str, str2real, bool2str, str2bool
     3  USE ioipsl_getin_p_mod, ONLY : getin_p
     4  USE strings_mod, ONLY: msg, strIdx, dispTable, strHead,  strReduce,  strFind, strStack, removeComment, num2str, str2real, &
     5       reduceExpr, find, cat, maxlen, checkList, strParse, strReplace, strTail, strCount, maxTableWidth, str2int, str2bool
    66
    77  IMPLICIT NONE
     
    1414  PUBLIC :: getKeysDBase, setKeysDBase                          !--- TOOLS TO GET/SET THE DATABASE (tracers & isotopes)
    1515  PUBLIC :: addTracer, delTracer                                !--- ADD/REMOVE A TRACER FROM
    16   PUBLIC :: addKey,    delKey,    getKey,    keys_type          !--- TOOLS TO SET/DEL/GET KEYS FROM/TO  tracers & isotopes
    17   PUBLIC :: addPhase,  delPhase,  getPhase,  getiPhase,  &      !--- FUNCTIONS RELATED TO THE PHASES
    18    nphases, old_phases, phases_sep, known_phases, phases_names  !--- + ASSOCIATED VARIABLES
     16  PUBLIC :: addKey,    delKey,    getKey,    keys_type          !--- TOOLS TO SET/DEL/GET A KEY   FROM/TO "tracers" / "isotopes"
     17  PUBLIC :: addPhase,  delPhase,  getPhase,  getiPhase          !--- TOOLS TO SET/DEL/GET A PHASE FROM/TO A TRACER'S NAME
     18  PUBLIC ::   old_phases, phases_sep, nphases                   !--- VARIABLES RELATED TO THE PHASES
     19  PUBLIC :: known_phases, phases_names
    1920
    2021  PUBLIC :: oldH2OIso, newH2OIso, old2newH2O, new2oldH2O        !--- H2O ISOTOPES BACKWARD COMPATIBILITY (OLD traceur.def)
     
    2425
    2526  !=== FOR ISOTOPES: GENERAL
    26   PUBLIC :: isot_type, processIsotopes, isoSelect, ixIso, nbIso !--- PROCESS [AND READ] & SELECT ISOTOPES + CLASS IDX & NUMBER
     27  PUBLIC :: isot_type, processIsotopes, isoSelect, isoFamilies  !--- ISOTOPES: TYPE, PROCESSING/SELECTION ROUTINES, FAMILIES NAMES
     28  PUBLIC :: ixIso, nbIso                                        !--- CURRENTLY SELECTED ISOTOPES FAMILY INDEX, NUMBER OF FAMILIES
    2729
    2830  !=== FOR ISOTOPES: H2O FAMILY ONLY
    2931  PUBLIC :: iH2O
    3032
    31   !=== FOR ISOTOPES: DEPENDING ON THE SELECTED ISOTOPES CLASS
     33  !=== FOR ISOTOPES: DEPENDING ON THE SELECTED ISOTOPES FAMILY
    3234  PUBLIC :: isotope, isoKeys                                    !--- SELECTED ISOTOPES DATABASE + ASSOCIATED KEYS
    3335  PUBLIC :: isoName, isoZone, isoPhas                           !--- ISOTOPES AND TAGGING ZONES NAMES AND PHASES
     
    3840  PUBLIC :: isoCheck                                            !--- FLAG TO RUN ISOTOPES CHECKING ROUTINES
    3941
    40   PUBLIC :: maxTableWidth
    4142!------------------------------------------------------------------------------------------------------------------------------
    4243  TYPE :: keys_type                                             !=== TYPE FOR A SET OF KEYS ASSOCIATED TO AN ELEMENT
     
    141142  TYPE(isot_type), ALLOCATABLE, TARGET, SAVE :: isotopes(:)
    142143
     144  !--- NAMES OF THE ISOTOPES FAMILIES
     145  CHARACTER(LEN=maxlen),   SAVE, ALLOCATABLE :: isoFamilies(:)
     146
    143147  !=== ALIASES OF VARIABLES FROM SELECTED ISOTOPES FAMILY EMBEDDED IN "isotope" (isotopes(ixIso))
    144148  TYPE(isot_type),         SAVE, POINTER :: isotope             !--- CURRENTLY SELECTED ISOTOPES FAMILY DESCRIPTOR
    145   INTEGER,                 SAVE          :: ixIso, iH2O=0       !--- Index of the selected isotopes family and H2O family
    146   INTEGER,                 SAVE          :: nbIso               !--- Number of isotopes classes
    147   LOGICAL,                 SAVE          :: isoCheck            !--- Flag to trigger the checking routines
     149  INTEGER,                 SAVE          :: ixIso, iH2O=-1      !--- INDEX OF THE SELECTED ISOTOPES FAMILY, H2O FAMILY INDEX
     150  INTEGER,                 SAVE          :: nbIso               !--- NUMBER OF ISOTOPES FAMILIES
     151  LOGICAL,                 SAVE          :: isoCheck            !--- FLAG TO TRIGGER THE CHECKING ROUTINES
    148152  TYPE(keys_type),         SAVE, POINTER :: isoKeys(:)          !--- ONE SET OF KEYS FOR EACH ISOTOPE (LISTED IN isoName)
    149153  CHARACTER(LEN=maxlen),   SAVE, POINTER :: isoName(:),   &     !--- ISOTOPES NAMES FOR THE CURRENTLY SELECTED FAMILY
     
    160164  LOGICAL, PARAMETER :: lSortByGen  = .TRUE.                    !--- Sort by growing generation
    161165
    162   INTEGER,    PARAMETER :: maxTableWidth = 192                  !--- Maximum width of a table displayed with "dispTable"
    163166  CHARACTER(LEN=maxlen) :: modname
    164167
     
    220223      !--- GET THE TRACERS NUMBER
    221224      READ(90,'(i3)',IOSTAT=ierr)ntrac                               !--- Number of lines/tracers
    222       lerr = ierr/=0; IF(fmsg('Invalid format for "'//TRIM(fname)//'"', modname, lerr)) RETURN
     225      lerr = ierr/=0; CALL msg('Invalid format for "'//TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN
    223226
    224227      !--- READ THE REMAINING LINES: <hadv> <vadv> <tracer> [<transporting fluid>]
     
    226229      DO it = 1, ntrac                                               !=== READ RAW DATA: loop on the line/tracer number
    227230        READ(90,'(a)',IOSTAT=ierr) str
    228         lerr = ierr>0; IF(fmsg('Invalid format for "' //TRIM(fname)//'"', modname, lerr)) RETURN
    229         lerr = ierr<0; IF(fmsg('Not enough lines in "'//TRIM(fname)//'"', modname, lerr)) RETURN
     231        lerr = ierr>0; CALL msg('Invalid format for "' //TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN
     232        lerr = ierr<0; CALL msg('Not enough lines in "'//TRIM(fname)//'"', modname, lerr); IF(lerr) RETURN
    230233        lerr = strParse(str, ' ', s, ns)
    231234        CALL msg('This file is for air tracers only',           modname, ns == 3 .AND. it == 1)
     
    609612      jq = strIdx(tname(:), parent(jq))
    610613      lerr = jq == 0
    611       IF(fmsg('Orphan tracer "'//TRIM(tname(iq))//'"', modname, lerr)) RETURN
     614      CALL msg('Orphan tracer "'//TRIM(tname(iq))//'"', modname, lerr); IF(lerr) RETURN
    612615      ig = ig + 1
    613616    END DO
     
    792795! Purpose: Sort tracers:
    793796!  * Put water at the beginning of the vector, in the "known_phases" order.
    794 !  * lGrowGen == T: in ascending generations numbers.
    795 !  * lGrowGen == F: tracer + its children sorted by growing generation, one after the other.
     797!  * lSortByGen == T: in ascending generations numbers.
     798!  * lSortByGen == F: tracer + its children sorted by growing generation, one after the other.
    796799!   TO BE ADDED IF NECESSARY: HIGHER MOMENTS AT THE END
    797800!------------------------------------------------------------------------------------------------------------------------------
     
    882885        lerr = getKey(keys(ik), v1, i1, k1)
    883886        lerr = getKey(keys(ik), v2, i2, k2)
    884         lerr = v1 /= v2; IF(fmsg(TRIM(keys(ik))//TRIM(s1), modname, lerr)) RETURN
     887        lerr = v1 /= v2; CALL msg(TRIM(keys(ik))//TRIM(s1), modname, lerr); IF(lerr) RETURN
    885888      END DO
    886889
     
    993996  lerr = .FALSE.
    994997  IF(nam(1) == 'iq') THEN
    995     tmp2 = int2str([(iq, iq=1, nq)])
     998    tmp2 = num2str([(iq, iq=1, nq)])
    996999    tmp = tmp2
    9971000  ELSE
     
    10721075    iqParent(iq) = strIdx(tnames, parent(iq))
    10731076    DO; jq = strIdx(tnames, parent(jq)); IF(jq == 0) EXIT; iGen(iq) = iGen(iq) + 1; END DO
    1074     CALL addKey('iqParent',   parent(iq), tr(iq)%keys)
     1077    CALL addKey('iqParent', iqParent(iq), tr(iq)%keys)
    10751078    CALL addKey('iqGeneration', iGen(iq), tr(iq)%keys)
    10761079    tr(iq)%iqParent = iqParent(iq)
     1080    tr(iq)%iGeneration =  iGen(iq)
    10771081  END DO
    10781082
     
    10871091      tr(iq)%nqChildren = SIZE(iqDescen)
    10881092    END DO
    1089     CALL addKey('iqDescen', strStack(int2str(iqDescen)), tr(iq)%keys)
     1093    CALL addKey('iqDescen', strStack(num2str(iqDescen)), tr(iq)%keys)
    10901094    CALL addKey('nqDescen',             SIZE(iqDescen),  tr(iq)%keys)
    10911095    tr(iq)%iqDescen =      iqDescen
     
    11001104!=== READ FILE "fnam" TO APPEND THE "dBase" TRACERS DATABASE WITH AS MUCH SECTIONS AS PARENTS NAMES IN "isot(:)%parent":   ====
    11011105!===  * Each section dBase(i)%name contains the isotopes "dBase(i)%trac(:)" descending on "dBase(i)%name"="iso(i)%parent"  ====
    1102 !===  * For each isotopes class, the <key>=<val> vector of each tracer is moved into the isotopes descriptor "isot"        ====
     1106!===  * For each isotopes family, the <key>=<val> vector of each tracer is moved into the isotopes descriptor "isot"       ====
    11031107!=== NOTES:                                                                                                                ====
    11041108!===  * Most of the "isot" components have been defined in the calling routine (processIsotopes):                          ====
     
    11231127  !--- THE INPUT FILE MUST BE PRESENT
    11241128  INQUIRE(FILE=TRIM(fnam), EXIST=lFound); lerr = .NOT.lFound
    1125   IF(fmsg('Missing isotopes parameters file "'//TRIM(fnam)//'"', modname, lerr)) RETURN
    1126 
    1127   !--- READ THE FILE SECTIONS, ONE EACH PARENT TRACER
     1129  CALL msg('Missing isotopes parameters file "'//TRIM(fnam)//'"', modname, lerr); IF(lerr) RETURN
     1130
     1131  !--- READ THE FILE SECTIONS, ONE EACH ISOTOPES FAMILY
    11281132  nb0 = SIZE(dBase, DIM=1)+1                                         !--- Next database element index
    1129   lerr = readSections(fnam,strStack(isot(:)%parent,'|')); IF(lerr) RETURN !--- Read sections, one each parent tracer
     1133  lerr = readSections(fnam,strStack(isot(:)%parent,'|')); IF(lerr) RETURN !--- Read sections, one each isotopes family
    11301134  ndb = SIZE(dBase, DIM=1)                                           !--- Current database size
    11311135  DO idb = nb0, ndb
     
    11331137
    11341138    !--- GET FEW GLOBAL KEYS FROM "def" FILES AND ADD THEM TO THE 'params' SECTION
    1135     CALL addKeysFromDef(dBase(idb)%trac, 'params')
     1139!    CALL addKeysFromDef(dBase(idb)%trac, 'params')
    11361140
    11371141    !--- SUBSTITUTE THE KEYS DEFINED IN THE 'params' VIRTUAL TRACER ; SUBSTITUTE LOCAL KEYS ; REMOVE 'params' VIRTUAL TRACER
     
    11631167  END IF
    11641168
    1165   !--- GET THE isoCheck ENTRY FROM THE *.DEF FILES (MIGHT BE CHANGED TO A CLASS-DEPENDANT KEYWORD)
    1166   CALL get_in('ok_iso_verif', isot(strIdx(isot%parent, 'H2O'))%check, .FALSE.)
    1167 
    11681169  lerr = dispIsotopes()
    11691170
     
    11761177  CHARACTER(LEN=maxlen), ALLOCATABLE :: ttl(:), val(:,:)
    11771178  CALL msg('Isotopes parameters read from file "'//TRIM(fnam)//'":', modname)
    1178   DO ip = 1, SIZE(isot)                                              !--- Loop on parents tracers
     1179  DO ip = 1, SIZE(isot)                                              !--- Loop on isotopes families
    11791180    nk = SIZE(isot(ip)%keys(1)%key)                                  !--- Same keys for each isotope
    11801181    nt = SIZE(isot(ip)%keys)                                         !--- Number of isotopes
     
    11891190    END DO
    11901191    lerr = dispTable(prf, ttl, val, cat([(it,it=1,nt)]), rFmt='(EN8.4)', nColMax=maxTableWidth, nHead=2, sub=modname)
    1191     IF(fmsg('Problem with the table content', modname, lerr)) RETURN
     1192    CALL msg('Problem with the table content', modname, lerr); IF(lerr) RETURN
    11921193    DEALLOCATE(ttl, val)
    11931194  END DO       
     
    12301231  lerr = getKey('iGeneration', iGen, t%keys); IF(lerr) RETURN       !--- Generation number
    12311232
    1232   !--- GET FROM "tracers" THE FULL LIST OF AVAILABLE ISOTOPES CLASSES
     1233  !--- GET FROM "tracers" THE FULL LIST OF AVAILABLE ISOTOPES FAMILIES
    12331234  p = PACK(delPhase(parent), MASK = dType=='tracer' .AND. iGen==1)
    12341235  CALL strReduce(p, nbIso)
    12351236
    1236   !--- CHECK WHETHER NEEDED ISOTOPES CLASSES "iNames" ARE AVAILABLE OR NOT
     1237  !--- CHECK WHETHER NEEDED ISOTOPES FAMILIES "iNames" ARE AVAILABLE OR NOT
    12371238  IF(PRESENT(iNames)) THEN
    12381239    DO it = 1, SIZE(iNames)
    12391240      lerr = ALL(p /= iNames(it))
    1240       IF(fmsg('No isotopes class "'//TRIM(iNames(it))//'" found among tracers', modname, lerr)) RETURN
     1241      CALL msg('No isotopes family "'//TRIM(iNames(it))//'" found among tracers', modname, lerr); IF(lerr) RETURN
    12411242    END DO
    12421243    p = iNames; nbIso = SIZE(p)
    12431244  END IF
    12441245  IF(ALLOCATED(isotopes)) DEALLOCATE(isotopes)
    1245   ALLOCATE(isotopes(nbIso))
     1246  ALLOCATE(isotopes(nbIso), isoFamilies(nbIso))
    12461247
    12471248  IF(nbIso==0) RETURN                                                !=== NO ISOTOPES: FINISHED
     
    12491250  !--- ISOTOPES RELATED VARIABLES ; NULL OR EMPTY IF NO ISOTOPES
    12501251  isotopes(:)%parent = p
    1251   DO ic = 1, SIZE(p)                                                 !--- Loop on isotopes classes
     1252  DO ic = 1, SIZE(p)                                                 !--- Loop on isotopes families
    12521253    i => isotopes(ic)
    1253     iname = i%parent                                                 !--- Current isotopes class name (parent tracer name)
     1254    iname = i%parent                                                 !--- Current isotopes family name (parent tracer name)
    12541255
    12551256    !=== Isotopes children of tracer "iname": mask, names, number (same for each phase of "iname")
     
    13081309
    13091310  !--- GET THE isoCheck ENTRY FROM THE *.DEF FILES (MIGHT BE CHANGED TO A CLASS-DEPENDANT KEYWORD)
    1310   CALL get_in('ok_iso_verif', isoCheck, .TRUE.)
     1311  CALL getin_p('ok_iso_verif', isoCheck, .TRUE.)
    13111312
    13121313  !=== CHECK CONSISTENCY
     
    13151316  !=== SELECT WATER ISOTOPES CLASS OR, IF UNFOUND, THE FIRST ISOTOPES CLASS
    13161317  IF(.NOT.isoSelect('H2O', .TRUE.)) THEN; iH2O = ixIso; ELSE; lerr = isoSelect(1, .TRUE.); END IF
     1318
     1319  !=== COLLECT THE NAMES OF THE ISOTOPES FAMILIES
     1320  isoFamilies = isotopes(:)%parent
    13171321
    13181322CONTAINS
     
    13291333      np = SUM([(COUNT(tracers(:)%name == addPhase(i%trac(it), i%phase(ip:ip))), ip=1, npha)])
    13301334      lerr = np /= npha
    1331       CALL msg(TRIM(int2str(np))//' phases instead of '//TRIM(int2str(npha))//' for '//TRIM(i%trac(it)), modname, lerr)
     1335      CALL msg(TRIM(num2str(np))//' phases instead of '//TRIM(num2str(npha))//' for '//TRIM(i%trac(it)), modname, lerr)
    13321336      IF(lerr) RETURN
    13331337    END DO
     
    13351339      nz = SUM([(COUNT(i%trac == TRIM(i%trac(it))//'_'//i%zone(iz)), iz=1, nzon)])
    13361340      lerr = nz /= nzon
    1337       CALL msg(TRIM(int2str(nz))//' tagging zones instead of '//TRIM(int2str(nzon))//' for '//TRIM(i%trac(it)), modname, lerr)
     1341      CALL msg(TRIM(num2str(nz))//' tagging zones instead of '//TRIM(num2str(nzon))//' for '//TRIM(i%trac(it)), modname, lerr)
    13381342      IF(lerr) RETURN
    13391343    END DO
     
    13481352!==============================================================================================================================
    13491353!=== THE ROUTINE isoSelect IS USED TO SWITCH FROM AN ISOTOPE FAMILY TO ANOTHER: ISOTOPES DEPENDENT PARAMETERS ARE UPDATED
    1350 !     Single generic "isoSelect" routine, using the predefined index of the parent (fast version) or its name (first call).
     1354!     Single generic "isoSelect" routine, using the predefined index of the family (fast version) or its name (first call).
    13511355!==============================================================================================================================
    13521356LOGICAL FUNCTION isoSelectByName(iName, lVerbose) RESULT(lerr)
     
    13761380   IF(iIso == ixIso) RETURN                                          !--- Nothing to do if the index is already OK
    13771381   lerr = iIso<=0 .OR. iIso>SIZE(isotopes)
    1378    CALL msg('Inconsistent isotopes family index '//TRIM(int2str(iIso))//': should be > 0 and <= '&
    1379           //TRIM(int2str(SIZE(isotopes)))//'"', ll = lerr .AND. lV)
     1382   CALL msg('Inconsistent isotopes family index '//TRIM(num2str(iIso))//': should be > 0 and <= '&
     1383          //TRIM(num2str(SIZE(isotopes)))//'"', ll = lerr .AND. lV)
    13801384   IF(lerr) RETURN
    13811385   ixIso = iIso                                                      !--- Update currently selected family index
     
    14251429  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
    14261430!------------------------------------------------------------------------------------------------------------------------------
    1427   CALL addKey_s11(key, int2str(ival), ky, lOverWrite)
     1431  CALL addKey_s11(key, num2str(ival), ky, lOverWrite)
    14281432END SUBROUTINE addKey_i11
    14291433!==============================================================================================================================
     
    14341438  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
    14351439!------------------------------------------------------------------------------------------------------------------------------
    1436   CALL addKey_s11(key, real2str(rval), ky, lOverWrite)
     1440  CALL addKey_s11(key, num2str(rval), ky, lOverWrite)
    14371441END SUBROUTINE addKey_r11
    14381442!==============================================================================================================================
     
    14431447  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
    14441448!------------------------------------------------------------------------------------------------------------------------------
    1445   CALL addKey_s11(key, bool2str(lval), ky, lOverWrite)
     1449  CALL addKey_s11(key, num2str(lval), ky, lOverWrite)
    14461450END SUBROUTINE addKey_l11
    14471451!==============================================================================================================================
     
    14631467!------------------------------------------------------------------------------------------------------------------------------
    14641468  INTEGER :: itr
    1465   DO itr = 1, SIZE(ky); CALL addKey_s11(key, int2str(ival), ky(itr), lOverWrite); END DO
     1469  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(ival), ky(itr), lOverWrite); END DO
    14661470END SUBROUTINE addKey_i1m
    14671471!==============================================================================================================================
     
    14731477!------------------------------------------------------------------------------------------------------------------------------
    14741478  INTEGER :: itr
    1475   DO itr = 1, SIZE(ky); CALL addKey_s11(key, real2str(rval), ky(itr), lOverWrite); END DO
     1479  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(rval), ky(itr), lOverWrite); END DO
    14761480END SUBROUTINE addKey_r1m
    14771481!==============================================================================================================================
     
    14831487!------------------------------------------------------------------------------------------------------------------------------
    14841488  INTEGER :: itr
    1485   DO itr = 1, SIZE(ky); CALL addKey_s11(key, bool2str(lval), ky(itr), lOverWrite); END DO
     1489  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(lval), ky(itr), lOverWrite); END DO
    14861490END SUBROUTINE addKey_l1m
    14871491!==============================================================================================================================
     
    15031507!------------------------------------------------------------------------------------------------------------------------------
    15041508  INTEGER :: itr
    1505   DO itr = 1, SIZE(ky); CALL addKey_s11(key, int2str(ival(itr)), ky(itr), lOverWrite); END DO
     1509  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(ival(itr)), ky(itr), lOverWrite); END DO
    15061510END SUBROUTINE addKey_imm
    15071511!==============================================================================================================================
     
    15131517!------------------------------------------------------------------------------------------------------------------------------
    15141518  INTEGER :: itr
    1515   DO itr = 1, SIZE(ky); CALL addKey_s11(key, real2str(rval(itr)), ky(itr), lOverWrite); END DO
     1519  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(rval(itr)), ky(itr), lOverWrite); END DO
    15161520END SUBROUTINE addKey_rmm
    15171521!==============================================================================================================================
     
    15231527!------------------------------------------------------------------------------------------------------------------------------
    15241528  INTEGER :: itr
    1525   DO itr = 1, SIZE(ky); CALL addKey_s11(key, bool2str(lval(itr)), ky(itr), lOverWrite); END DO
     1529  DO itr = 1, SIZE(ky); CALL addKey_s11(key, num2str(lval(itr)), ky(itr), lOverWrite); END DO
    15261530END SUBROUTINE addKey_lmm
    15271531!==============================================================================================================================
     
    15311535!=== OVERWRITE THE KEYS OF THE TRACER NAMED "tr0" WITH THE VALUES FOUND IN THE *.def FILES, IF ANY. ===========================
    15321536!==============================================================================================================================
    1533 SUBROUTINE addKeysFromDef(t, tr0)
    1534   TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: t(:)
    1535   CHARACTER(LEN=*),             INTENT(IN)    :: tr0
    1536 !------------------------------------------------------------------------------------------------------------------------------
    1537   CHARACTER(LEN=maxlen) :: val
    1538   INTEGER               :: ik, jd
    1539   jd = strIdx(t%name, tr0)
    1540   IF(jd == 0) RETURN
    1541   DO ik = 1, SIZE(t(jd)%keys%key)
    1542     CALL get_in(t(jd)%keys%key(ik), val, '*none*')
    1543     IF(val /= '*none*') CALL addKey(t(jd)%keys%key(ik), val, t(jd)%keys, .TRUE.)
    1544   END DO
    1545 END SUBROUTINE addKeysFromDef
     1537!SUBROUTINE addKeysFromDef(t, tr0)
     1538!  TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: t(:)
     1539!  CHARACTER(LEN=*),             INTENT(IN)    :: tr0
     1540!------------------------------------------------------------------------------------------------------------------------------
     1541!  CHARACTER(LEN=maxlen) :: val
     1542!  INTEGER               :: ik, jd
     1543!  jd = strIdx(t%name, tr0)
     1544!  IF(jd == 0) RETURN
     1545!  DO ik = 1, SIZE(t(jd)%keys%key)
     1546!    CALL getin_p(t(jd)%keys%key(ik), val, '*none*')
     1547!    IF(val /= '*none*') CALL addKey(t(jd)%keys%key(ik), val, t(jd)%keys, .TRUE.)
     1548!  END DO
     1549!END SUBROUTINE addKeysFromDef
    15461550!==============================================================================================================================
    15471551
     
    16771681  LOGICAL :: lD
    16781682  lD = .TRUE.; IF(PRESENT(lDisp)) lD = lDisp
    1679   s = 'key "'//TRIM(strStack(keyn, '/'))//'" for tracer nr. '//TRIM(int2str(itr))
     1683  s = 'key "'//TRIM(strStack(keyn, '/'))//'" for tracer nr. '//TRIM(num2str(itr))
    16801684  lerr = .TRUE.
    16811685  IF(lerr .AND. PRESENT(ky))         val = fgetKey(ky)                                   !--- "ky"
     
    17071711!------------------------------------------------------------------------------------------------------------------------------
    17081712  CHARACTER(LEN=maxlen) :: sval, s
    1709   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, int2str(def), lDisp)
     1713  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    17101714  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    17111715  IF(lerr) RETURN
    17121716  val = str2int(sval)
    17131717  lerr = val == -HUGE(1)
    1714   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1718  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    17151719  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
    17161720END FUNCTION getKeyByIndex_im11
     
    17251729!------------------------------------------------------------------------------------------------------------------------------
    17261730  CHARACTER(LEN=maxlen) :: sval, s
    1727   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, real2str(def), lDisp)
     1731  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    17281732  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    17291733  IF(lerr) RETURN
    17301734  val = str2real(sval)
    17311735  lerr = val == -HUGE(1.)
    1732   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1736  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    17331737  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
    17341738END FUNCTION getKeyByIndex_rm11
     
    17441748  CHARACTER(LEN=maxlen) :: sval, s
    17451749  INTEGER               :: ival
    1746   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, bool2str(def), lDisp)
     1750  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    17471751  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    17481752  IF(lerr) RETURN
    17491753  ival = str2bool(sval)
    17501754  lerr = ival == -1
    1751   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1755  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    17521756  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
    17531757  IF(.NOT.lerr) val = ival == 1
     
    17661770  lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, def, lDisp); IF(lerr) RETURN
    17671771  lerr = strParse(sval, ',', val)
    1768   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1772  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    17691773END FUNCTION getKeyByIndex_s1m1
    17701774!==============================================================================================================================
     
    17791783  CHARACTER(LEN=maxlen)              :: sval, s
    17801784  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    1781   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, int2str(def), lDisp)
     1785  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, num2str(def), lDisp)
    17821786  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
    17831787  IF(lerr) RETURN
    17841788  lerr = strParse(sval, ',', svals)
    1785   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1789  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    17861790  val = str2int(svals)
    17871791  lerr = ANY(val == -HUGE(1))
    1788   s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1792  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    17891793  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
    17901794END FUNCTION getKeyByIndex_i1m1
     
    18001804  CHARACTER(LEN=maxlen)              :: sval, s
    18011805  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    1802   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, real2str(def), lDisp)
     1806  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, num2str(def), lDisp)
    18031807  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
    18041808  lerr = strParse(sval, ',', svals)
    1805   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1809  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    18061810  val = str2real(svals)
    18071811  lerr = ANY(val == -HUGE(1.))
    1808   s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1812  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    18091813  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
    18101814END FUNCTION getKeyByIndex_r1m1
     
    18211825  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    18221826  INTEGER,               ALLOCATABLE :: ivals(:)
    1823   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, bool2str(def), lDisp)
     1827  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, num2str(def), lDisp)
    18241828  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
    18251829  lerr = strParse(sval, ',', svals)
    1826   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1830  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    18271831  ivals = str2bool(svals)
    18281832  lerr = ANY(ivals == -1)
    1829   s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1833  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    18301834  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
    18311835  IF(.NOT.lerr) val = ivals == 1
     
    18441848  lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, def, lDisp); IF(lerr) RETURN
    18451849  lerr = strParse(sval, ',', val)
    1846   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1850  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    18471851END FUNCTION getKeyByIndex_smm1
    18481852!==============================================================================================================================
     
    18571861  CHARACTER(LEN=maxlen)              :: sval, s
    18581862  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    1859   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, int2str(def), lDisp)
     1863  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    18601864  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    18611865  IF(lerr) RETURN
    18621866  lerr = strParse(sval, ',', svals)
    1863   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1867  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    18641868  val = str2int(svals)
    18651869  lerr = ANY(val == -HUGE(1))
    1866   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1870  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    18671871  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
    18681872END FUNCTION getKeyByIndex_imm1
     
    18781882  CHARACTER(LEN=maxlen)              :: sval, s
    18791883  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    1880   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, real2str(def), lDisp)
     1884  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    18811885  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    18821886  IF(lerr) RETURN
    18831887  lerr = strParse(sval, ',', svals)
    1884   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1888  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    18851889  val = str2real(svals)
    18861890  lerr = ANY(val == -HUGE(1.))
    1887   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1891  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    18881892  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
    18891893END FUNCTION getKeyByIndex_rmm1
     
    19001904  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    19011905  INTEGER,               ALLOCATABLE :: ivals(:)
    1902   IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, bool2str(def), lDisp)
     1906  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, num2str(def), lDisp)
    19031907  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
    19041908  IF(lerr) RETURN
    19051909  lerr = strParse(sval, ',', svals)
    1906   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1910  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    19071911  ivals = str2bool(svals)
    19081912  lerr = ANY(ivals == -1)
    1909   s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1913  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(num2str(itr))//' is not'
    19101914  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
    19111915  IF(.NOT.lerr) val = ivals == 1
     
    20122016  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:), tname(:)
    20132017  LOGICAL,               ALLOCATABLE ::    ll(:)
    2014   IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, int2str(def), lDisp)
     2018  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, num2str(def), lDisp)
    20152019  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
    20162020  IF(lerr) RETURN
     
    20342038  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:), tname(:)
    20352039  LOGICAL,               ALLOCATABLE ::    ll(:)
    2036   IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, real2str(def), lDisp)
     2040  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, num2str(def), lDisp)
    20372041  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
    20382042  IF(lerr) RETURN
     
    20562060  LOGICAL,               ALLOCATABLE ::    ll(:)
    20572061  INTEGER,               ALLOCATABLE :: ivals(:)
    2058   IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, bool2str(def), lDisp)
     2062  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, num2str(def), lDisp)
    20592063  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
    20602064  IF(lerr) RETURN
     
    21652169!------------------------------------------------------------------------------------------------------------------------------
    21662170  CHARACTER(LEN=maxlen) :: sval, s
    2167   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, int2str(def), lDisp)
     2171  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    21682172  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    21692173  IF(lerr) RETURN
     
    21822186!------------------------------------------------------------------------------------------------------------------------------
    21832187  CHARACTER(LEN=maxlen) :: sval, s
    2184   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, real2str(def), lDisp)
     2188  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    21852189  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    21862190  IF(lerr) RETURN
     
    22002204  CHARACTER(LEN=maxlen) :: sval, s
    22012205  INTEGER               :: ival
    2202   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, bool2str(def), lDisp)
     2206  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    22032207  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    22042208  IF(lerr) RETURN
     
    22212225  lerr = getKeyByName_sm11([keyn], sval, tname, ky, def, lDisp); IF(lerr) RETURN
    22222226  lerr = strParse(sval, ',', val)
    2223   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2227  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    22242228END FUNCTION getKeyByName_s1m1
    22252229!==============================================================================================================================
     
    22332237  CHARACTER(LEN=maxlen)              :: sval, s
    22342238  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    2235   IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, int2str(def), lDisp)
     2239  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, num2str(def), lDisp)
    22362240  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
    22372241  IF(lerr) RETURN
    22382242  lerr = strParse(sval, ',', svals)
    2239   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2243  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    22402244  val = str2int(svals)
    22412245  lerr = ANY(val == -HUGE(1))
     
    22532257  CHARACTER(LEN=maxlen)              :: sval, s
    22542258  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    2255   IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, real2str(def), lDisp)
     2259  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, num2str(def), lDisp)
    22562260  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
    22572261  IF(lerr) RETURN
    22582262  lerr = strParse(sval, ',', svals)
    2259   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2263  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    22602264  val = str2real(svals)
    22612265  lerr = ANY(val == -HUGE(1.))
     
    22742278  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    22752279  INTEGER,               ALLOCATABLE :: ivals(:)
    2276   IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, bool2str(def), lDisp)
     2280  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, num2str(def), lDisp)
    22772281  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
    22782282  IF(lerr) RETURN
    22792283  lerr = strParse(sval, ',', svals)
    2280   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2284  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    22812285  ivals = str2bool(svals)
    22822286  lerr = ANY(ivals == -1)
     
    22972301  lerr = getKeyByName_sm11(keyn, sval, tname, ky, def, lDisp); IF(lerr) RETURN
    22982302  lerr = strParse(sval, ',', val)
    2299   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2303  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    23002304END FUNCTION getKeyByName_smm1
    23012305!==============================================================================================================================
     
    23092313  CHARACTER(LEN=maxlen)              :: sval, s
    23102314  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    2311   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, int2str(def), lDisp)
     2315  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    23122316  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    23132317  IF(lerr) RETURN
    23142318  lerr = strParse(sval, ',', svals)
    2315   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2319  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    23162320  val = str2int(svals)
    23172321  lerr = ANY(val == -HUGE(1))
     
    23292333  CHARACTER(LEN=maxlen)              :: sval, s
    23302334  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    2331   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, real2str(def), lDisp)
     2335  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    23322336  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    23332337  IF(lerr) RETURN
    23342338  lerr = strParse(sval, ',', svals)
    2335   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2339  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    23362340  val = str2real(svals)
    23372341  lerr = ANY(val == -HUGE(1.))
     
    23502354  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    23512355  INTEGER,               ALLOCATABLE :: ivals(:)
    2352   IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, bool2str(def), lDisp)
     2356  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, num2str(def), lDisp)
    23532357  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
    23542358  IF(lerr) RETURN
    23552359  lerr = strParse(sval, ',', svals)
    2356   IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2360  CALL msg('can''t parse '//TRIM(sval), modname, lerr); IF(lerr) RETURN
    23572361  ivals = str2bool(svals)
    23582362  lerr = ANY(ivals == -1)
     
    24482452  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    24492453  LOGICAL,               ALLOCATABLE ::    ll(:)
    2450   IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, int2str(def), lDisp)
     2454  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, num2str(def), lDisp)
    24512455  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
    24522456  IF(lerr) RETURN
     
    24682472  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
    24692473  LOGICAL,               ALLOCATABLE ::    ll(:)
    2470   IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, real2str(def), lDisp)
     2474  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, num2str(def), lDisp)
    24712475  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
    24722476  IF(lerr) RETURN
     
    24892493  LOGICAL,               ALLOCATABLE ::    ll(:)
    24902494  INTEGER,               ALLOCATABLE :: ivals(:)
    2491   IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, bool2str(def), lDisp)
     2495  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, num2str(def), lDisp)
    24922496  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
    24932497  IF(lerr) RETURN
     
    26472651  INTEGER :: nt, ix
    26482652  lerr = .NOT.ALLOCATED(tracs)
    2649   IF(fmsg('Can''t remove tracer "'//TRIM(tname)//'" from an empty tracers descriptor', modname, lerr)) RETURN
     2653  CALL msg('Can''t remove tracer "'//TRIM(tname)//'" from an empty tracers descriptor', modname, lerr); IF(lerr) RETURN
    26502654  nt = SIZE(tracs)
    26512655  lerr = getKey('name', tnames, ky=tracs(:)%keys); IF(lerr) RETURN
Note: See TracChangeset for help on using the changeset viewer.