Changeset 5745
- Timestamp:
- Jul 1, 2025, 5:14:13 PM (6 hours ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/misc/strings_mod.f90
r5510 r5745 38 38 CONTAINS 39 39 40 41 40 !============================================================================================================================== 42 41 SUBROUTINE init_printout(lunout_, prt_level_) … … 177 176 !=== Lower/upper case conversion function. ==================================================================================== 178 177 !============================================================================================================================== 179 ELEMENTAL FUNCTION strLower(str) RESULT(out)178 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strLower(str) RESULT(out) 180 179 IMPLICIT NONE 181 180 CHARACTER(LEN=*), INTENT(IN) :: str 182 181 INTEGER :: k 183 CHARACTER(LEN=maxlen) :: out184 182 out = str 185 183 DO k=1,LEN_TRIM(str) … … 188 186 END FUNCTION strLower 189 187 !============================================================================================================================== 190 ELEMENTAL FUNCTION strUpper(str) RESULT(out)188 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strUpper(str) RESULT(out) 191 189 IMPLICIT NONE 192 190 CHARACTER(LEN=*), INTENT(IN) :: str 193 191 INTEGER :: k 194 CHARACTER(LEN=maxlen) :: out195 192 out = str 196 193 DO k=1,LEN_TRIM(str) … … 207 204 !=== * strHead(..,.TRUE.) = 'a_b' ${str%$sep*} ================ 208 205 !============================================================================================================================== 209 206 CHARACTER(LEN=maxlen) FUNCTION strHead_1(str, sep, lBackward) RESULT(out) 210 207 IMPLICIT NONE 211 208 CHARACTER(LEN=*), INTENT(IN) :: str 212 209 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep 213 210 LOGICAL, OPTIONAL, INTENT(IN) :: lBackward 214 CHARACTER(LEN=maxlen) :: out215 211 !------------------------------------------------------------------------------------------------------------------------------ 216 212 IF(PRESENT(sep)) THEN … … 246 242 !=== * strTail(str, '_', .TRUE.) = 'c' ${str##*$sep} ================ 247 243 !============================================================================================================================== 248 244 CHARACTER(LEN=maxlen) FUNCTION strTail_1(str, sep, lBackWard) RESULT(out) 249 245 IMPLICIT NONE 250 246 CHARACTER(LEN=*), INTENT(IN) :: str 251 247 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep 252 248 LOGICAL, OPTIONAL, INTENT(IN) :: lBackWard 253 CHARACTER(LEN=maxlen) :: out254 249 !------------------------------------------------------------------------------------------------------------------------------ 255 250 IF(PRESENT(sep)) THEN … … 412 407 !=== OPTIONALY: GET THE NUMBER OF FOUND ELEMENTS "n". NB: UNFOUND => INDEX=0 ============================ 413 408 !============================================================================================================================== 414 409 INTEGER FUNCTION strIdx_1(str, s) RESULT(out) 415 410 IMPLICIT NONE 416 411 CHARACTER(LEN=*), INTENT(IN) :: str(:), s 417 INTEGER :: out418 412 DO out = 1, SIZE(str); IF(str(out) == s) EXIT; END DO 419 413 IF(out == 1+SIZE(str) .OR. SIZE(str)==0) out = 0 … … 482 476 FUNCTION booFind(l,n) RESULT(out) 483 477 IMPLICIT NONE 484 LOGICAL, INTENT(IN) :: l(:)478 LOGICAL, INTENT(IN) :: l(:) 485 479 INTEGER, OPTIONAL, INTENT(OUT) :: n 486 480 INTEGER, ALLOCATABLE :: out(:) … … 498 492 !=== * THEN TEST WHETHER THE STRING FROM START TO THE FOUND SEPARATOR IS A CORRECTLY FORMATTED NUMBER 499 493 !============================================================================================================================== 500 FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)494 LOGICAL FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr) 501 495 IMPLICIT NONE 502 496 CHARACTER(LEN=*), INTENT(IN) :: rawList !--- String in which delimiters have to be identified … … 505 499 INTEGER, INTENT(OUT) :: idx !--- Index of the first identified delimiter in "rawList" 506 500 INTEGER, INTENT(OUT) :: idel !--- Index of the identified delimiter (0 if idx==0) 507 LOGICAL, OPTIONAL, INTENT(IN) :: lSc 508 LOGICAL :: lerr 509 !--- Care about nbs with front sign or in scient. notation 501 LOGICAL, OPTIONAL, INTENT(IN) :: lSc !--- Care about nbs with front sign or in scient. notation 510 502 !------------------------------------------------------------------------------------------------------------------------------ 511 503 INTEGER :: idx0 !--- Used to display an identified non-numeric string … … 535 527 536 528 !------------------------------------------------------------------------------------------------------------------------------ 537 FUNCTION strIdx1(str, del, ib, id) RESULT(i)529 INTEGER FUNCTION strIdx1(str, del, ib, id) RESULT(i) 538 530 !--- Get the index of the first appereance of one of the delimiters "del(:)" in "str" starting from position "ib". 539 531 !--- "id" is the index in "del(:)" of the first delimiter found. … … 542 534 INTEGER, INTENT(IN) :: ib 543 535 INTEGER, INTENT(OUT) :: id 544 INTEGER :: i545 536 !------------------------------------------------------------------------------------------------------------------------------ 546 537 DO i = ib, LEN_TRIM(str); id = strIdx(del, str(i:i)); IF(id /= 0) EXIT; END DO … … 555 546 !=== Count the number of elements separated by "delimiter" in list "rawList". ================================================= 556 547 !============================================================================================================================== 557 FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)548 LOGICAL FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr) 558 549 IMPLICIT NONE 559 550 CHARACTER(LEN=*), INTENT(IN) :: rawList … … 561 552 INTEGER, INTENT(OUT) :: nb 562 553 LOGICAL, OPTIONAL, INTENT(IN) :: lSc 563 LOGICAL :: lerr564 554 !------------------------------------------------------------------------------------------------------------------------------ 565 555 LOGICAL :: ll … … 568 558 END FUNCTION strCount_11 569 559 !============================================================================================================================== 570 FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)560 LOGICAL FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr) 571 561 IMPLICIT NONE 572 562 CHARACTER(LEN=*), INTENT(IN) :: rawList(:) … … 574 564 INTEGER, ALLOCATABLE, INTENT(OUT) :: nb(:) 575 565 LOGICAL, OPTIONAL, INTENT(IN) :: lSc 576 LOGICAL :: lerr577 566 !------------------------------------------------------------------------------------------------------------------------------ 578 567 LOGICAL :: ll … … 586 575 END FUNCTION strCount_m1 587 576 !============================================================================================================================== 588 FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)577 LOGICAL FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr) 589 578 IMPLICIT NONE 590 579 CHARACTER(LEN=*), INTENT(IN) :: rawList … … 596 585 LOGICAL :: ll 597 586 CHARACTER(LEN=1024) :: r 598 LOGICAL :: lerr599 600 587 lerr = .FALSE. 601 588 ll = .FALSE.; IF(PRESENT(lSc)) ll = lSc … … 619 606 !=== Corresponding "vals" remains empty if the element does not contain "=" sign. ==================================== 620 607 !============================================================================================================================== 621 FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)608 LOGICAL FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr) 622 609 IMPLICIT NONE 623 610 CHARACTER(LEN=*), INTENT(IN) :: rawList, delimiter … … 625 612 INTEGER, OPTIONAL, INTENT(OUT) :: n 626 613 CHARACTER(LEN=maxlen), ALLOCATABLE, OPTIONAL, INTENT(OUT) :: vals(:) 627 LOGICAL :: lerr628 614 !------------------------------------------------------------------------------------------------------------------------------ 629 615 CHARACTER(LEN=1024) :: r … … 640 626 641 627 !------------------------------------------------------------------------------------------------------------------------------ 642 FUNCTION countK() RESULT(nkeys)628 INTEGER FUNCTION countK() RESULT(nkeys) 643 629 !--- Get the number of elements after parsing. 644 630 IMPLICIT NONE 645 INTEGER :: nkeys646 631 !------------------------------------------------------------------------------------------------------------------------------ 647 632 INTEGER :: ib, ie, nl … … 696 681 END FUNCTION strParse 697 682 !============================================================================================================================== 698 FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)683 LOGICAL FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr) 699 684 IMPLICIT NONE 700 685 CHARACTER(LEN=*), INTENT(IN) :: rawList, delimiter(:) … … 704 689 LOGICAL, OPTIONAL, INTENT(IN) :: lSc !--- Take care about numbers in scientific notation 705 690 INTEGER, OPTIONAL, ALLOCATABLE, INTENT(OUT) :: id(:) !--- Indexes of the separators in "delimiter(:)" vector 706 LOGICAL :: lerr707 691 !------------------------------------------------------------------------------------------------------------------------------ 708 692 CHARACTER(LEN=1024) :: r … … 1212 1196 1213 1197 !============================================================================================================================== 1214 1198 LOGICAL FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr) 1215 1199 IMPLICIT NONE 1216 1200 INTEGER, INTENT(IN) :: unt !--- Output unit … … 1222 1206 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: rFmt !--- Format for reals 1223 1207 LOGICAL, OPTIONAL, INTENT(IN) :: llast !--- Last variable: no final ',' 1224 LOGICAL :: lerr1225 1208 !------------------------------------------------------------------------------------------------------------------------------ 1226 1209 CHARACTER(LEN=maxlen) :: rFm, el … … 1296 1279 1297 1280 !============================================================================================================================== 1298 1281 LOGICAL FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr) 1299 1282 IMPLICIT NONE 1300 1283 ! Display outliers list in tables … … 1308 1291 INTEGER, OPTIONAL, INTENT(IN) :: nHead !--- Number of front columns to duplicate (default: 1) 1309 1292 INTEGER, OPTIONAL, INTENT(IN) :: unit !--- Output unit (def: lunout) 1310 LOGICAL :: lerr1311 1293 !------------------------------------------------------------------------------------------------------------------------------ 1312 1294 CHARACTER(LEN=maxlen), ALLOCATABLE :: ttl(:) … … 1376 1358 END FUNCTION dispOutliers_1 1377 1359 !============================================================================================================================== 1378 1360 LOGICAL FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr) 1379 1361 IMPLICIT NONE 1380 1362 ! Display outliers list in tables … … 1388 1370 INTEGER, OPTIONAL, INTENT(IN) :: nHead !--- Number of front columns to duplicate (default: 1) 1389 1371 INTEGER, OPTIONAL, INTENT(IN) :: unit !--- Output unit (def: lunout) 1390 LOGICAL :: lerr1391 1372 !------------------------------------------------------------------------------------------------------------------------------ 1392 1373 CHARACTER(LEN=maxlen) :: mes, sub, fm='(f12.9)', prf … … 1435 1416 !=== Reduce an algebrical expression (basic operations and parenthesis) to a single number (string format) ==================== 1436 1417 !============================================================================================================================== 1437 1418 LOGICAL FUNCTION reduceExpr_1(str, val) RESULT(lerr) 1438 1419 IMPLICIT NONE 1439 1420 CHARACTER(LEN=*), INTENT(IN) :: str 1440 1421 CHARACTER(LEN=maxlen), INTENT(OUT) :: val 1441 LOGICAL :: lerr1442 1422 !------------------------------------------------------------------------------------------------------------------------------ 1443 1423 CHARACTER(LEN=maxlen) :: v … … 1486 1466 !=== Reduce a simple algebrical expression (basic operations, no parenthesis) to a single number (string format) ============== 1487 1467 !============================================================================================================================== 1488 FUNCTION reduceExpr_basic(str, val) RESULT(lerr)1468 LOGICAL FUNCTION reduceExpr_basic(str, val) RESULT(lerr) 1489 1469 IMPLICIT NONE 1490 1470 CHARACTER(LEN=*), INTENT(IN) :: str … … 1494 1474 CHARACTER(LEN=maxlen), ALLOCATABLE :: ky(:) 1495 1475 CHARACTER(LEN=1), ALLOCATABLE :: op(:) 1496 LOGICAL :: lerr1497 1476 !------------------------------------------------------------------------------------------------------------------------------ 1498 1477 CHARACTER(LEN=1024) :: s … … 1547 1526 !=== Check whether a string is a number or not ================================================================================ 1548 1527 !============================================================================================================================== 1549 ELEMENTAL FUNCTION is_numeric(str) RESULT(out)1528 ELEMENTAL LOGICAL FUNCTION is_numeric(str) RESULT(out) 1550 1529 IMPLICIT NONE 1551 1530 CHARACTER(LEN=*), INTENT(IN) :: str … … 1553 1532 INTEGER :: e 1554 1533 CHARACTER(LEN=12) :: fmt 1555 LOGICAL :: out1556 1557 1534 IF(TRIM(str) == '') THEN; out = .FALSE.; RETURN; END IF 1558 1535 WRITE(fmt,'("(f",i0,".0)")') LEN_TRIM(str) … … 1566 1543 !=== Convert a string into a logical/integer integer or an integer/real into a string ========================================= 1567 1544 !============================================================================================================================== 1568 ELEMENTAL FUNCTION str2bool(str) RESULT(out) !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean1545 ELEMENTAL INTEGER FUNCTION str2bool(str) RESULT(out) !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean 1569 1546 IMPLICIT NONE 1570 1547 CHARACTER(LEN=*), INTENT(IN) :: str 1571 1548 INTEGER :: ierr 1572 1549 LOGICAL :: lout 1573 INTEGER :: out1574 1575 1550 READ(str,*,IOSTAT=ierr) lout 1576 1577 1551 out = -HUGE(1) 1578 1552 IF(ierr /= 0) THEN … … 1584 1558 END FUNCTION str2bool 1585 1559 !============================================================================================================================== 1586 ELEMENTAL FUNCTION str2int(str) RESULT(out)1560 ELEMENTAL INTEGER FUNCTION str2int(str) RESULT(out) 1587 1561 IMPLICIT NONE 1588 1562 CHARACTER(LEN=*), INTENT(IN) :: str 1589 1563 INTEGER :: ierr 1590 INTEGER :: out1591 1592 1564 READ(str,*,IOSTAT=ierr) out 1593 1565 IF(ierr/=0) out = -HUGE(1) 1594 1566 END FUNCTION str2int 1595 1567 !============================================================================================================================== 1596 ELEMENTAL FUNCTION str2real(str) RESULT(out)1568 ELEMENTAL REAL FUNCTION str2real(str) RESULT(out) 1597 1569 IMPLICIT NONE 1598 1570 CHARACTER(LEN=*), INTENT(IN) :: str 1599 1571 INTEGER :: ierr 1600 REAL :: out1601 1602 1572 READ(str,*,IOSTAT=ierr) out 1603 1573 IF(ierr/=0) out = -HUGE(1.) 1604 1574 END FUNCTION str2real 1605 1575 !============================================================================================================================== 1606 ELEMENTAL FUNCTION str2dble(str) RESULT(out)1576 ELEMENTAL DOUBLE PRECISION FUNCTION str2dble(str) RESULT(out) 1607 1577 IMPLICIT NONE 1608 1578 CHARACTER(LEN=*), INTENT(IN) :: str 1609 1579 INTEGER :: ierr 1610 DOUBLE PRECISION :: out1611 1612 1580 READ(str,*,IOSTAT=ierr) out 1613 1581 IF(ierr/=0) out = -HUGE(1.d0) 1614 1582 END FUNCTION str2dble 1615 1583 !============================================================================================================================== 1616 ELEMENTAL FUNCTION bool2str(b) RESULT(out)1584 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION bool2str(b) RESULT(out) 1617 1585 IMPLICIT NONE 1618 1586 LOGICAL, INTENT(IN) :: b 1619 CHARACTER(LEN=maxlen) :: out1620 1587 WRITE(out,*)b 1621 1588 out = ADJUSTL(out) 1622 1589 END FUNCTION bool2str 1623 1590 !============================================================================================================================== 1624 ELEMENTAL FUNCTION int2str(i, nDigits) RESULT(out)1591 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION int2str(i, nDigits) RESULT(out) 1625 1592 IMPLICIT NONE 1626 1593 INTEGER, INTENT(IN) :: i 1627 1594 INTEGER, OPTIONAL, INTENT(IN) :: nDigits 1628 CHARACTER(LEN=maxlen) :: out1629 1595 !------------------------------------------------------------------------------------------------------------------------------ 1630 1596 WRITE(out,*)i … … 1634 1600 END FUNCTION int2str 1635 1601 !============================================================================================================================== 1636 ELEMENTAL FUNCTION real2str(r,fmt) RESULT(out)1602 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out) 1637 1603 IMPLICIT NONE 1638 1604 REAL, INTENT(IN) :: r 1639 1605 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt 1640 CHARACTER(LEN=maxlen) :: out1641 1606 !------------------------------------------------------------------------------------------------------------------------------ 1642 1607 IF( PRESENT(fmt)) WRITE(out,fmt)r … … 1645 1610 END FUNCTION real2str 1646 1611 !============================================================================================================================== 1647 ELEMENTAL FUNCTION dble2str(d,fmt) RESULT(out)1612 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out) 1648 1613 IMPLICIT NONE 1649 1614 DOUBLE PRECISION, INTENT(IN) :: d 1650 1615 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt 1651 CHARACTER(LEN=maxlen) :: out1652 1616 !------------------------------------------------------------------------------------------------------------------------------ 1653 1617 IF( PRESENT(fmt)) WRITE(out,fmt)d … … 1694 1658 END FUNCTION addQuotes_m 1695 1659 !============================================================================================================================== 1696 ELEMENTAL FUNCTION needQuotes(s) RESULT(out)1660 ELEMENTAL LOGICAL FUNCTION needQuotes(s) RESULT(out) 1697 1661 IMPLICIT NONE 1698 1662 CHARACTER(LEN=*), INTENT(IN) :: s 1699 1663 CHARACTER(LEN=1) :: b, e 1700 LOGICAL :: out1701 1664 !------------------------------------------------------------------------------------------------------------------------------ 1702 1665 out = .TRUE.; IF(TRIM(s) == '') RETURN … … 1710 1673 !=== DISPLAY "<message>: the following <items> are <reason>" FOLLOWED BY THE LIST OF <str> FOR WHICH <lerr>==T. =============== 1711 1674 !============================================================================================================================== 1712 FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)1675 LOGICAL FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out) 1713 1676 IMPLICIT NONE 1714 1677 ! Purpose: Messages in case a list contains wrong elements (indicated by lerr boolean vector). … … 1718 1681 CHARACTER(LEN=*), INTENT(IN) :: message, items, reason 1719 1682 INTEGER, OPTIONAL, INTENT(IN) :: nmax 1720 LOGICAL :: out1721 1683 !------------------------------------------------------------------------------------------------------------------------------ 1722 1684 CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:)
Note: See TracChangeset
for help on using the changeset viewer.