Changeset 4120 for LMDZ6/trunk/libf/misc/strings_mod.F90
- Timestamp:
- Apr 5, 2022, 3:44:30 PM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/misc/strings_mod.F90
r4069 r4120 26 26 ! horzcat_d1, horzcat_dm, 27 27 horzcat_sm, horzcat_im, horzcat_rm; END INTERFACE cat 28 INTERFACE find; MODULE PROCEDUREstrFind, find_int, find_boo; END INTERFACE find28 INTERFACE find; MODULE PROCEDURE strFind, find_int, find_boo; END INTERFACE find 29 29 INTERFACE dispOutliers; MODULE PROCEDURE dispOutliers_1, dispOutliers_2; END INTERFACE dispOutliers 30 30 INTERFACE reduceExpr; MODULE PROCEDURE reduceExpr_1, reduceExpr_m; END INTERFACE reduceExpr … … 105 105 LOGICAL, OPTIONAL, INTENT(IN) :: ll 106 106 INTEGER, OPTIONAL, INTENT(IN) :: unit 107 CHARACTER(LEN=maxlen) :: subn 107 108 INTEGER :: unt 109 subn = ''; IF(PRESENT(modname)) subn = modname 108 110 IF(PRESENT(ll)) THEN; IF(.NOT.ll) RETURN; END IF 109 111 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 115 114 END SUBROUTINE msg_1 116 115 !============================================================================================================================== … … 123 122 INTEGER, OPTIONAL, INTENT(IN) :: nmax 124 123 CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:) 124 CHARACTER(LEN=maxlen) :: subn 125 125 INTEGER :: unt, nmx, k 126 126 LOGICAL :: l 127 subn = ''; IF(PRESENT(modname)) subn = modname 127 128 l = .TRUE.; IF(PRESENT(ll)) l = ll 128 129 unt = lunout; IF(PRESENT(unit)) unt = unit 129 130 nmx = 128; IF(PRESENT(nmax)) nmx = nmax 130 131 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 136 133 END SUBROUTINE msg_m 137 134 !============================================================================================================================== … … 141 138 LOGICAL, OPTIONAL, INTENT(IN) :: ll 142 139 INTEGER, OPTIONAL, INTENT(IN) :: unit 140 CHARACTER(LEN=maxlen) :: subn 143 141 INTEGER :: unt 142 subn = ''; IF(PRESENT(modname)) subn = modname 144 143 l = .TRUE.; IF(PRESENT(ll)) l = ll 145 144 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) 151 146 END FUNCTION fmsg_1 152 147 !============================================================================================================================== … … 157 152 INTEGER, OPTIONAL, INTENT(IN) :: unit 158 153 INTEGER, OPTIONAL, INTENT(IN) :: nmax 154 CHARACTER(LEN=maxlen) :: subn 159 155 INTEGER :: unt, nmx 156 subn = ''; IF(PRESENT(modname)) subn = modname 160 157 l = .TRUE.; IF(PRESENT(ll)) l = ll 161 158 unt = lunout; IF(PRESENT(unit)) unt = unit 162 159 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) 168 161 END FUNCTION fmsg_m 169 162 !============================================================================================================================== … … 178 171 out = str 179 172 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) 181 174 END DO 182 175 END FUNCTION strLower … … 187 180 out = str 188 181 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) 190 183 END DO 191 184 END FUNCTION strUpper … … 222 215 lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst 223 216 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))] 225 218 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))] 227 220 END IF 228 221 END FUNCTION strHead_m … … 230 223 !=== Extract the substring following the last (first if lFirst==TRUE) occurrence of separator "sep" in "str" ================ 231 224 !=== Examples for str='a_b_c' and sep='_' and the bash command with the same effect: ================ 232 !=== * str Head(..,.FALSE.) = 'b_c'${str#*$sep} ================233 !=== * str Head(..,.TRUE.) = 'c'${str##*$sep} ================225 !=== * strTail(..,.FALSE.) = 'c' ${str#*$sep} ================ 226 !=== * strTail(..,.TRUE.) = 'b_c' ${str##*$sep} ================ 234 227 !============================================================================================================================== 235 228 CHARACTER(LEN=maxlen) FUNCTION strTail_1(str,sep,lFirst) RESULT(out) … … 256 249 lf = .FALSE.; IF(PRESENT(lFirst)) lf=lFirst 257 250 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))] 259 252 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))] 261 254 END IF 262 255 END FUNCTION strTail_m … … 861 854 !=== The profile "p" describe in which order to pick up the columns from "s", "i" and "r" for display. 862 855 !============================================================================================================================== 863 LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nmax, unit ) RESULT(lerr)856 LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nmax, unit, sub) RESULT(lerr) 864 857 CHARACTER(LEN=*), INTENT(IN) :: p !--- DISPLAY MAP: s/i/r 865 858 CHARACTER(LEN=*), INTENT(IN) :: titles(:) !--- TITLES (ONE EACH COLUMN) … … 870 863 INTEGER, OPTIONAL, INTENT(IN) :: nmax !--- Display less than "nrow" rows 871 864 INTEGER, OPTIONAL, INTENT(IN) :: unit !--- Output unit (default: screen) 865 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sub !--- Subroutine name 872 866 873 867 CHARACTER(LEN=2048) :: row 874 CHARACTER(LEN=maxlen) :: rFm, el 868 CHARACTER(LEN=maxlen) :: rFm, el, subn 875 869 CHARACTER(LEN=maxlen), ALLOCATABLE :: d(:,:) 876 870 CHARACTER(LEN=1) :: s1, sp … … 881 875 LOGICAL :: ls, li, lr 882 876 883 ! modname = 'dispTable' 877 subn = ''; IF(PRESENT(sub)) subn = sub 884 878 rFm = '*'; IF(PRESENT(rFmt)) rFm = rFmt !--- Specified format for reals 885 879 unt = lunout; IF(PRESENT(unit)) unt = unit !--- Specified output unit … … 890 884 891 885 !--- CHECK ARGUMENTS COHERENCE 892 lerr = np /= SIZE(titles); IF(fmsg('string "pattern" length and titles list mismatch', ll=lerr)) RETURN893 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)) RETURN903 lerr = ncol /= SIZE(titles); IF(fmsg('"titles" length and arguments number mismatch', ll=lerr)) RETURN904 lerr = ls.AND.li.AND.ns/=ni; IF(fmsg('string and integer arguments lengths mismatch', ll=lerr)) RETURN905 lerr = ls.AND.lr.AND.ns/=nr; IF(fmsg( 'string and real arguments lengths mismatch', ll=lerr)) RETURN906 lerr = li.AND.lr.AND.ni/=nr; IF(fmsg( 'integer and real arguments lengths mismatch', ll=lerr)) RETURN886 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 907 901 nrow = MAX(ns,ni,nr)+1 908 902 nmx = nrow; IF(PRESENT(nmax)) nmx = MIN(nmx,nmax+1) … … 931 925 END DO 932 926 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) 934 928 IF(ir /= 1) CYCLE !--- Titles are underlined 935 929 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) 937 931 END DO 938 932
Note: See TracChangeset
for help on using the changeset viewer.