Changeset 5748 for LMDZ6/trunk/libf/misc/strings_mod.f90
- Timestamp:
- Jul 2, 2025, 12:00:08 PM (38 hours ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/misc/strings_mod.f90
r5747 r5748 1 1 MODULE strings_mod 2 3 USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: REAL64, REAL32 2 4 3 5 IMPLICIT NONE … … 8 10 PUBLIC :: strUpper, strTail, strStackm, strParse, strReplace, strFind, find, duplicate, cat 9 11 PUBLIC :: dispTable, dispOutliers, dispNameList 10 PUBLIC :: is_numeric, bool2str, int2str, real2str, dble2str 11 PUBLIC :: reduceExpr, str2bool, str2int, str2real, str2dble 12 PUBLIC :: addQuotes, checkList, removeComment 12 PUBLIC :: is_numeric, num2str, str2bool, str2int, str2real, str2dble 13 PUBLIC :: reduceExpr, addQuotes, checkList, removeComment 13 14 14 15 INTERFACE get_in; MODULE PROCEDURE getin_s, getin_i, getin_r, getin_l; END INTERFACE get_in 16 INTERFACE num2str; MODULE PROCEDURE bool2str, int2str, real2str, dble2str; END INTERFACE num2str 15 17 INTERFACE msg; MODULE PROCEDURE msg_1, msg_m; END INTERFACE msg 16 18 INTERFACE strHead; MODULE PROCEDURE strHead_1, strHead_m; END INTERFACE strHead … … 21 23 INTERFACE strCount; MODULE PROCEDURE strCount_m1, strCount_11, strCount_1m; END INTERFACE strCount 22 24 INTERFACE strReplace; MODULE PROCEDURE strReplace_1, strReplace_m; END INTERFACE strReplace 23 INTERFACE cat; MODULE PROCEDURE horzcat_s00, horzcat_i00, horzcat_r00, & !horzcat_d00, &24 horzcat_s10, horzcat_i10, horzcat_r10, & !horzcat_d10, &25 horzcat_s11, horzcat_i11, horzcat_r11, & !horzcat_d11, &26 horzcat_s21, horzcat_i21, horzcat_r21;END INTERFACE cat !horzcat_d2127 INTERFACE strFind; MODULE PROCEDURE strFind_1, strFind_m; 25 INTERFACE cat; MODULE PROCEDURE horzcat_s00, horzcat_i00, horzcat_r00, horzcat_d00, & 26 horzcat_s10, horzcat_i10, horzcat_r10, horzcat_d10, & 27 horzcat_s11, horzcat_i11, horzcat_r11, horzcat_d11, & 28 horzcat_s21, horzcat_i21, horzcat_r21; END INTERFACE cat !horzcat_d21 29 INTERFACE strFind; MODULE PROCEDURE strFind_1, strFind_m; END INTERFACE strFind 28 30 INTERFACE find; MODULE PROCEDURE strFind_1, strFind_m, intFind_1, intFind_m, booFind; END INTERFACE find 29 31 INTERFACE duplicate; MODULE PROCEDURE dupl_s, dupl_i, dupl_r, dupl_l; END INTERFACE duplicate … … 68 70 INTEGER, INTENT(IN) :: def 69 71 val = def; CALL getin(nam, val) 70 IF(val/=def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM( int2str(val))72 IF(val/=def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM(num2str(val)) 71 73 END SUBROUTINE getin_i 72 74 !============================================================================================================================== … … 78 80 REAL, INTENT(IN) :: def 79 81 val = def; CALL getin(nam, val) 80 IF(val/=def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM( real2str(val))82 IF(val/=def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM(num2str(val)) 81 83 END SUBROUTINE getin_r 82 84 !============================================================================================================================== … … 88 90 LOGICAL, INTENT(IN) :: def 89 91 val = def; CALL getin(nam, val) 90 IF(val.NEQV.def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM( bool2str(val))92 IF(val.NEQV.def) WRITE(lunout,*)TRIM(nam)//' = '//TRIM(num2str(val)) 91 93 END SUBROUTINE getin_l 92 94 !============================================================================================================================== … … 953 955 FUNCTION horzcat_r00(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 954 956 IMPLICIT NONE 955 REAL , INTENT(IN) :: r0956 REAL , OPTIONAL, TARGET, INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9957 REAL , ALLOCATABLE :: out(:)958 REAL , POINTER:: r957 REAL(KIND=REAL32), INTENT(IN) :: r0 958 REAL(KIND=REAL32), OPTIONAL, TARGET, INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9 959 REAL(KIND=REAL32), ALLOCATABLE :: out(:) 960 REAL(KIND=REAL32), POINTER :: r 959 961 INTEGER :: ncol, iv 960 962 LOGICAL :: pre(9) … … 975 977 FUNCTION horzcat_r10(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 976 978 IMPLICIT NONE 977 REAL , INTENT(IN) :: r0(:), r1978 REAL , OPTIONAL, INTENT(IN) :: r2, r3, r4, r5, r6, r7, r8, r9979 REAL , ALLOCATABLE :: out(:), tmp(:)979 REAL(KIND=REAL32), INTENT(IN) :: r0(:), r1 980 REAL(KIND=REAL32), OPTIONAL, INTENT(IN) :: r2, r3, r4, r5, r6, r7, r8, r9 981 REAL(KIND=REAL32), ALLOCATABLE :: out(:), tmp(:) 980 982 INTEGER :: nc 981 983 nc = SIZE(r0) … … 987 989 FUNCTION horzcat_r11(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 988 990 IMPLICIT NONE 989 REAL , INTENT(IN) :: r0(:)990 REAL , OPTIONAL, TARGET, INTENT(IN) :: r1(:), r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:)991 REAL , ALLOCATABLE :: out(:,:)992 REAL , POINTER :: r(:)993 INTEGER 994 LOGICAL 991 REAL(KIND=REAL32), INTENT(IN) :: r0(:) 992 REAL(KIND=REAL32), OPTIONAL, TARGET, INTENT(IN) :: r1(:), r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:) 993 REAL(KIND=REAL32), ALLOCATABLE :: out(:,:) 994 REAL(KIND=REAL32), POINTER :: r(:) 995 INTEGER :: nrow, ncol, iv, n 996 LOGICAL :: pre(9) 995 997 !------------------------------------------------------------------------------------------------------------------------------ 996 998 pre(:) = [PRESENT(r1),PRESENT(r2),PRESENT(r3),PRESENT(r4),PRESENT(r5),PRESENT(r6),PRESENT(r7),PRESENT(r8),PRESENT(r9)] … … 1012 1014 FUNCTION horzcat_r21(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 1013 1015 IMPLICIT NONE 1014 REAL , INTENT(IN) :: r0(:,:), r1(:)1015 REAL , OPTIONAL, INTENT(IN) :: r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:)1016 REAL , ALLOCATABLE :: out(:,:), tmp(:,:)1016 REAL(KIND=REAL32), INTENT(IN) :: r0(:,:), r1(:) 1017 REAL(KIND=REAL32), OPTIONAL, INTENT(IN) :: r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:) 1018 REAL(KIND=REAL32), ALLOCATABLE :: out(:,:), tmp(:,:) 1017 1019 INTEGER :: nc 1018 1020 nc = SIZE(r0, 2) … … 1024 1026 FUNCTION horzcat_d00(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1025 1027 IMPLICIT NONE 1026 DOUBLE PRECISION, INTENT(IN) :: d01027 DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d91028 DOUBLE PRECISION, ALLOCATABLE :: out(:)1029 DOUBLE PRECISION, POINTER :: d1028 REAL(KIND=REAL64), INTENT(IN) :: d0 1029 REAL(KIND=REAL64), OPTIONAL, TARGET, INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d9 1030 REAL(KIND=REAL64), ALLOCATABLE :: out(:) 1031 REAL(KIND=REAL64), POINTER :: d 1030 1032 INTEGER :: ncol, iv 1031 1033 LOGICAL :: pre(9) … … 1046 1048 FUNCTION horzcat_d10(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1047 1049 IMPLICIT NONE 1048 DOUBLE PRECISION, INTENT(IN) :: d0(:), d11049 DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2, d3, d4, d5, d6, d7, d8, d91050 DOUBLE PRECISION, ALLOCATABLE :: out(:), tmp(:)1050 REAL(KIND=REAL64), INTENT(IN) :: d0(:), d1 1051 REAL(KIND=REAL64), OPTIONAL, INTENT(IN) :: d2, d3, d4, d5, d6, d7, d8, d9 1052 REAL(KIND=REAL64), ALLOCATABLE :: out(:), tmp(:) 1051 1053 INTEGER :: nc 1052 1054 nc = SIZE(d0) … … 1058 1060 FUNCTION horzcat_d11(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1059 1061 IMPLICIT NONE 1060 DOUBLE PRECISION, INTENT(IN) :: d0(:)1061 DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1(:), d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:)1062 DOUBLE PRECISION, ALLOCATABLE :: out(:,:)1063 DOUBLE PRECISION, POINTER :: d(:)1062 REAL(KIND=REAL64), INTENT(IN) :: d0(:) 1063 REAL(KIND=REAL64), OPTIONAL, TARGET, INTENT(IN) :: d1(:), d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:) 1064 REAL(KIND=REAL64), ALLOCATABLE :: out(:,:) 1065 REAL(KIND=REAL64), POINTER :: d(:) 1064 1066 INTEGER :: nrow, ncol, iv, n 1065 1067 LOGICAL :: pre(9) … … 1082 1084 FUNCTION horzcat_d21(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1083 1085 IMPLICIT NONE 1084 DOUBLE PRECISION, INTENT(IN) :: d0(:,:), d1(:)1085 DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:)1086 DOUBLE PRECISION, ALLOCATABLE :: out(:,:), tmp(:,:)1086 REAL(KIND=REAL64), INTENT(IN) :: d0(:,:), d1(:) 1087 REAL(KIND=REAL64), OPTIONAL, INTENT(IN) :: d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:) 1088 REAL(KIND=REAL64), ALLOCATABLE :: out(:,:), tmp(:,:) 1087 1089 INTEGER :: nc 1088 1090 nc = SIZE(d0, 2) … … 1159 1161 d(1,ic) = TRIM(titles(ic)) 1160 1162 SELECT CASE(p(ic:ic)) 1161 CASE('s'); d(2:nmx,ic) = 1162 CASE('i'); d(2:nmx,ic) = int2str(i(:,ii) ); ii = ii + 11163 CASE('r'); d(2:nmx,ic) = real2str(r(:,ir),rFm); ir = ir + 11163 CASE('s'); d(2:nmx,ic) = s(:,is) ; is = is + 1 1164 CASE('i'); d(2:nmx,ic) = num2str(i(:,ii) ); ii = ii + 1 1165 CASE('r'); d(2:nmx,ic) = num2str(r(:,ir),rFm); ir = ir + 1 1164 1166 END SELECT 1165 1167 END DO … … 1260 1262 d(1,ic) = TRIM(titles(ic)) 1261 1263 SELECT CASE(p(ic:ic)) 1262 CASE('s'); d(2:nrow,ic) = 1263 CASE('i'); d(2:nrow,ic) = int2str(i(:,ii) ); ii = ii + 11264 CASE('r'); d(2:nrow,ic) = real2str(r(:,ir),rFm); ir = ir + 11264 CASE('s'); d(2:nrow,ic) = s(:,is) ; is = is + 1 1265 CASE('i'); d(2:nrow,ic) = num2str(i(:,ii) ); ii = ii + 1 1266 CASE('r'); d(2:nrow,ic) = num2str(r(:,ir),rFm); ir = ir + 1 1265 1267 END SELECT 1266 1268 END DO … … 1362 1364 IF(.NOT.ANY(m)) CYCLE !--- no outlayers for tracer "itr" 1363 1365 v = TRIM(vnm(MIN(itr,SIZE(vnm))))//'('//TRIM(s) !--- "<name>(" 1364 IF(nv == 1) ttl(rk) = TRIM(v)//','// int2str(itr)//')' !--- "<name>(i,j,itr)" (single name)1366 IF(nv == 1) ttl(rk) = TRIM(v)//','//num2str(itr)//')' !--- "<name>(i,j,itr)" (single name) 1365 1367 IF(nv /= 1) ttl(rk) = TRIM(v)//')' !--- "<nam(itr)>(i,j)" (one name each table/itr index) 1366 1368 IF(rk==2) lerr = dispTable('ir', ttl, i=cat(PACK(ki,m)), r=cat(PACK(a(ib:ie),m)), & … … 1485 1487 CHARACTER(LEN=*), INTENT(IN) :: str 1486 1488 CHARACTER(LEN=*), INTENT(OUT) :: val 1487 DOUBLE PRECISION,ALLOCATABLE :: vl(:)1489 REAL(KIND=REAL64), ALLOCATABLE :: vl(:) 1488 1490 INTEGER, ALLOCATABLE :: id(:) 1489 1491 CHARACTER(LEN=maxlen), ALLOCATABLE :: ky(:) … … 1491 1493 !------------------------------------------------------------------------------------------------------------------------------ 1492 1494 CHARACTER(LEN=1024) :: s 1493 DOUBLE PRECISION:: v, vm, vp1495 REAL(KIND=REAL64) :: v, vm, vp 1494 1496 INTEGER :: i, ni, io 1495 1497 lerr = .FALSE. … … 1500 1502 IF(lerr) RETURN !--- Problem with the parsing 1501 1503 vl = str2dble(ky) !--- Conversion to doubles 1502 lerr = ANY(vl >= HUGE(1. d0))1504 lerr = ANY(vl >= HUGE(1._REAL64)) 1503 1505 CALL msg('Some values are non-numeric in: '//TRIM(s), ll=lerr) 1504 1506 IF(lerr) RETURN !--- Non-numerical values found … … 1519 1521 END DO 1520 1522 END DO 1521 val = dble2str(vl(1))1523 val = num2str(vl(1)) 1522 1524 1523 1525 END FUNCTION reduceExpr_basic … … 1581 1583 END FUNCTION str2int 1582 1584 !============================================================================================================================== 1583 ELEMENTAL REAL FUNCTION str2real(str) RESULT(out)1585 ELEMENTAL REAL(KIND=REAL32) FUNCTION str2real(str) RESULT(out) 1584 1586 IMPLICIT NONE 1585 1587 CHARACTER(LEN=*), INTENT(IN) :: str 1586 1588 INTEGER :: ierr 1587 1589 READ(str,*,IOSTAT=ierr) out 1588 IF(ierr/=0) out = -HUGE(1. )1590 IF(ierr/=0) out = -HUGE(1._REAL32) 1589 1591 END FUNCTION str2real 1590 1592 !============================================================================================================================== 1591 ELEMENTAL DOUBLE PRECISIONFUNCTION str2dble(str) RESULT(out)1593 ELEMENTAL REAL(KIND=REAL64) FUNCTION str2dble(str) RESULT(out) 1592 1594 IMPLICIT NONE 1593 1595 CHARACTER(LEN=*), INTENT(IN) :: str 1594 1596 INTEGER :: ierr 1595 1597 READ(str,*,IOSTAT=ierr) out 1596 IF(ierr/=0) out = -HUGE(1. d0)1598 IF(ierr/=0) out = -HUGE(1._REAL64) 1597 1599 END FUNCTION str2dble 1598 1600 !============================================================================================================================== … … 1617 1619 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out) 1618 1620 IMPLICIT NONE 1619 REAL ,INTENT(IN) :: r1621 REAL(KIND=REAL32), INTENT(IN) :: r 1620 1622 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt 1621 1623 !------------------------------------------------------------------------------------------------------------------------------ … … 1627 1629 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out) 1628 1630 IMPLICIT NONE 1629 DOUBLE PRECISION,INTENT(IN) :: d1631 REAL(KIND=REAL64), INTENT(IN) :: d 1630 1632 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt 1631 1633 !------------------------------------------------------------------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.