Ignore:
Timestamp:
Apr 5, 2022, 3:44:30 PM (2 years ago)
Author:
dcugnet
Message:
  • New water names: H2Ov, H2Ol, H2Oi, H2Or -> H2O_g, H2O_l, H2O_s, H2O_r.
  • Corrections for the lOldCode=.FALSE., not activated yet.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/misc/strings_mod.F90

    r4069 r4120  
    2626!                 horzcat_d1,  horzcat_dm,
    2727                                           horzcat_sm,  horzcat_im,  horzcat_rm; END INTERFACE cat
    28   INTERFACE find;       MODULE PROCEDURE      strFind,    find_int,    find_boo; END INTERFACE find
     28  INTERFACE find;         MODULE PROCEDURE    strFind,    find_int,    find_boo; END INTERFACE find
    2929  INTERFACE dispOutliers; MODULE PROCEDURE dispOutliers_1, dispOutliers_2; END INTERFACE dispOutliers
    3030  INTERFACE reduceExpr;   MODULE PROCEDURE   reduceExpr_1,   reduceExpr_m; END INTERFACE reduceExpr
     
    105105  LOGICAL,          OPTIONAL, INTENT(IN) :: ll
    106106  INTEGER,          OPTIONAL, INTENT(IN) :: unit
     107  CHARACTER(LEN=maxlen) :: subn
    107108  INTEGER :: unt
     109  subn = '';    IF(PRESENT(modname)) subn = modname
    108110  IF(PRESENT(ll)) THEN; IF(.NOT.ll) RETURN; END IF
    109111  unt = lunout; IF(PRESENT(unit)) unt = unit
    110   IF(PRESENT(modname)) THEN
    111     WRITE(unt,'(a)') TRIM(modname)//': '//str              !--- Routine name provided
    112   ELSE
    113     WRITE(unt,'(a)') str                                   !--- Simple message
    114   END IF
     112  IF(subn == '') WRITE(unt,'(a)') str                                          !--- Simple message
     113  IF(subn /= '') WRITE(unt,'(a)') TRIM(subn)//': '//str                        !--- Routine name provided
    115114END SUBROUTINE msg_1
    116115!==============================================================================================================================
     
    123122  INTEGER,          OPTIONAL, INTENT(IN) :: nmax
    124123  CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:)
     124  CHARACTER(LEN=maxlen) :: subn
    125125  INTEGER :: unt, nmx, k
    126126  LOGICAL :: l
     127  subn = '';    IF(PRESENT(modname)) subn = modname
    127128  l   = .TRUE.; IF(PRESENT(ll))     l = ll
    128129  unt = lunout; IF(PRESENT(unit)) unt = unit
    129130  nmx = 128;    IF(PRESENT(nmax)) nmx = nmax
    130131  s = strStackm(str, ', ', nmx)
    131   IF(PRESENT(modname)) THEN
    132     DO k=1,SIZE(s); CALL msg_1(s(k), modname, l, unt); END DO
    133   ELSE
    134     DO k=1,SIZE(s); CALL msg_1(s(k), ll=l, unit=unt);  END DO
    135   END IF
     132  DO k=1,SIZE(s); CALL msg_1(s(k), subn,  l,   unt); END DO
    136133END SUBROUTINE msg_m
    137134!==============================================================================================================================
     
    141138  LOGICAL,          OPTIONAL, INTENT(IN) :: ll
    142139  INTEGER,          OPTIONAL, INTENT(IN) :: unit
     140  CHARACTER(LEN=maxlen) :: subn
    143141  INTEGER :: unt
     142  subn = '';    IF(PRESENT(modname)) subn = modname
    144143  l   = .TRUE.; IF(PRESENT(ll))     l = ll
    145144  unt = lunout; IF(PRESENT(unit)) unt = unit
    146   IF(PRESENT(modname)) THEN
    147     CALL msg_1(str, modname, l, unt)
    148   ELSE
    149     CALL msg_1(str, ll=l, unit=unt)
    150   END IF
     145  CALL msg_1(str, subn, l, unt)
    151146END FUNCTION fmsg_1
    152147!==============================================================================================================================
     
    157152  INTEGER,          OPTIONAL, INTENT(IN) :: unit
    158153  INTEGER,          OPTIONAL, INTENT(IN)  :: nmax
     154  CHARACTER(LEN=maxlen) :: subn
    159155  INTEGER :: unt, nmx
     156  subn = '';    IF(PRESENT(modname)) subn = modname
    160157  l   = .TRUE.; IF(PRESENT(ll))     l = ll
    161158  unt = lunout; IF(PRESENT(unit)) unt = unit
    162159  nmx = 128;    IF(PRESENT(nmax)) nmx = nmax
    163   IF(PRESENT(modname)) THEN
    164     CALL msg_m(str, modname, l, unt, nmx)
    165   ELSE
    166     CALL msg_m(str, ll=l, unit=unt, nmax=nmx)
    167   END IF
     160  CALL msg_m(str, subn, l, unt, nmx)
    168161END FUNCTION fmsg_m
    169162!==============================================================================================================================
     
    178171  out = str
    179172  DO k=1,LEN_TRIM(str)
    180     IF(str(k:k)>='A'.OR.str(k:k)<='Z') out(k:k)=ACHAR(IACHAR(str(k:k))+32)
     173    IF(str(k:k)>='A' .AND. str(k:k)<='Z') out(k:k)=ACHAR(IACHAR(str(k:k))+32)
    181174  END DO
    182175END FUNCTION strLower
     
    187180  out = str
    188181  DO k=1,LEN_TRIM(str)
    189     IF(str(k:k)>='a'.OR.str(k:k)<='z') out(k:k)=ACHAR(IACHAR(str(k:k))-32)
     182    IF(str(k:k)>='a' .AND. str(k:k)<='z') out(k:k)=ACHAR(IACHAR(str(k:k))-32)
    190183  END DO
    191184END FUNCTION strUpper
     
    222215  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
    223216  IF(PRESENT(sep)) THEN
    224     out = [(strHead_1(str(k),sep,.NOT.lf),    k=1, SIZE(str))]
     217    out = [(strHead_1(str(k), sep,   lf), k=1, SIZE(str))]
    225218  ELSE
    226     out = [(strHead_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))]
     219    out = [(strHead_1(str(k), lFirst=lf), k=1, SIZE(str))]
    227220  END IF
    228221END FUNCTION strHead_m
     
    230223!=== Extract the substring following the last (first if lFirst==TRUE) occurrence of separator "sep" in "str"   ================
    231224!=== Examples for str='a_b_c' and sep='_' and the bash command with the same effect:                           ================
    232 !===    * strHead(..,.FALSE.) = 'b_c'         ${str#*$sep}                                                     ================
    233 !===    * strHead(..,.TRUE.)  = 'c'           ${str##*$sep}                                                    ================
     225!===    * strTail(..,.FALSE.) = 'c'           ${str#*$sep}                                                     ================
     226!===    * strTail(..,.TRUE.)  = 'b_c'         ${str##*$sep}                                                    ================
    234227!==============================================================================================================================
    235228CHARACTER(LEN=maxlen) FUNCTION strTail_1(str,sep,lFirst) RESULT(out)
     
    256249  lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst
    257250  IF(PRESENT(sep)) THEN
    258     out = [(strTail_1(str(k),sep,.NOT.lf),    k=1, SIZE(str))]
     251    out = [(strTail_1(str(k), sep,   lf), k=1, SIZE(str))]
    259252  ELSE
    260     out = [(strTail_1(str(k),lFirst=.NOT.lf), k=1, SIZE(str))]
     253    out = [(strTail_1(str(k), lFirst=lf), k=1, SIZE(str))]
    261254  END IF
    262255END FUNCTION strTail_m
     
    861854!=== The profile "p" describe in which order to pick up the columns from "s", "i" and "r" for display.
    862855!==============================================================================================================================
    863 LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nmax, unit) RESULT(lerr)
     856LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nmax, unit, sub) RESULT(lerr)
    864857  CHARACTER(LEN=*),           INTENT(IN)  :: p             !--- DISPLAY MAP: s/i/r
    865858  CHARACTER(LEN=*),           INTENT(IN)  :: titles(:)     !--- TITLES (ONE EACH COLUMN)
     
    870863  INTEGER,          OPTIONAL, INTENT(IN)  :: nmax          !--- Display less than "nrow" rows
    871864  INTEGER,          OPTIONAL, INTENT(IN)  :: unit          !--- Output unit (default: screen)
     865  CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: sub           !--- Subroutine name
    872866
    873867  CHARACTER(LEN=2048) :: row
    874   CHARACTER(LEN=maxlen)  :: rFm, el
     868  CHARACTER(LEN=maxlen)  :: rFm, el, subn
    875869  CHARACTER(LEN=maxlen), ALLOCATABLE :: d(:,:)
    876870  CHARACTER(LEN=1) :: s1, sp
     
    881875  LOGICAL :: ls, li, lr
    882876
    883 !  modname = 'dispTable'
     877  subn = '';    IF(PRESENT(sub)) subn = sub
    884878  rFm = '*';    IF(PRESENT(rFmt)) rFm = rFmt               !--- Specified format for reals
    885879  unt = lunout; IF(PRESENT(unit)) unt = unit               !--- Specified output unit
     
    890884
    891885  !--- CHECK ARGUMENTS COHERENCE
    892   lerr = np /= SIZE(titles); IF(fmsg('string "pattern" length and titles list mismatch', ll=lerr)) RETURN
    893   IF(ls) THEN; ns = SIZE(s, DIM=1); ncol = ncol + SIZE(s, DIM=2)
    894     lerr = COUNT([(p(ic:ic)=='s', ic=1, np)]) /= SIZE(s, DIM=2)
    895   END IF
    896   IF(li) THEN; ni = SIZE(i, DIM=1); ncol = ncol + SIZE(i, DIM=2)
    897     lerr = COUNT([(p(ic:ic)=='i', ic=1, np)]) /= SIZE(i, DIM=2)
    898   END IF
    899   IF(lr) THEN; nr = SIZE(r, DIM=1); ncol = ncol + SIZE(r, DIM=2)
    900     lerr = COUNT([(p(ic:ic)=='r', ic=1, np)]) /= SIZE(r, DIM=2)
    901   END IF
    902   IF(fmsg('string "pattern" length and arguments number mismatch', ll=lerr)) RETURN
    903   lerr = ncol /= SIZE(titles); IF(fmsg('"titles" length and arguments number mismatch', ll=lerr)) RETURN
    904   lerr = ls.AND.li.AND.ns/=ni; IF(fmsg('string and integer arguments lengths mismatch', ll=lerr)) RETURN
    905   lerr = ls.AND.lr.AND.ns/=nr; IF(fmsg(   'string and real arguments lengths mismatch', ll=lerr)) RETURN
    906   lerr = li.AND.lr.AND.ni/=nr; IF(fmsg(  'integer and real arguments lengths mismatch', ll=lerr)) RETURN
     886  lerr = np /= SIZE(titles); IF(fmsg('string "pattern" length and titles list mismatch', subn, lerr)) RETURN
     887  IF(ls) THEN
     888    ns = SIZE(s, 1); ncol = ncol + SIZE(s, 2); lerr = COUNT([(p(ic:ic)=='s', ic=1, np)]) /= SIZE(s, 2)
     889  END IF
     890  IF(li) THEN
     891    ni = SIZE(i, 1); ncol = ncol + SIZE(i, 2); lerr = COUNT([(p(ic:ic)=='i', ic=1, np)]) /= SIZE(i, 2)
     892  END IF
     893  IF(lr) THEN
     894    nr = SIZE(r, 1); ncol = ncol + SIZE(r, 2); lerr = COUNT([(p(ic:ic)=='r', ic=1, np)]) /= SIZE(r, 2)
     895  END IF
     896  IF(fmsg('string "pattern" length and arguments number mismatch', subn, lerr)) RETURN
     897  lerr = ncol /= SIZE(titles); IF(fmsg('"titles" length and arguments number mismatch', subn, lerr)) RETURN
     898  lerr = ls.AND.li.AND.ns/=ni; IF(fmsg('string and integer arguments lengths mismatch', subn, lerr)) RETURN
     899  lerr = ls.AND.lr.AND.ns/=nr; IF(fmsg(   'string and real arguments lengths mismatch', subn, lerr)) RETURN
     900  lerr = li.AND.lr.AND.ni/=nr; IF(fmsg(  'integer and real arguments lengths mismatch', subn, lerr)) RETURN
    907901  nrow = MAX(ns,ni,nr)+1
    908902  nmx = nrow; IF(PRESENT(nmax)) nmx = MIN(nmx,nmax+1)
     
    931925    END DO
    932926    nr = LEN_TRIM(row)-1                                             !--- Final separator removed
    933     CALL msg(row(1:nr), unit=unt)
     927    CALL msg(row(1:nr), subn, unit=unt)
    934928    IF(ir /= 1) CYCLE                                                !--- Titles are underlined
    935929    row=''; DO ic=1,ncol; row=TRIM(row)//REPEAT('-',n(ic))//'+'; END DO
    936     CALL msg(row(1:LEN_TRIM(row)-1), unit=unt)
     930    CALL msg(row(1:LEN_TRIM(row)-1), subn, unit=unt)
    937931  END DO
    938932
Note: See TracChangeset for help on using the changeset viewer.