Changeset 5510


Ignore:
Timestamp:
Jan 28, 2025, 7:02:29 PM (2 days ago)
Author:
yann meurdesoif
Message:

GPU port : LOKI has some difficulty to parse correctly return type of function when present on the definition CALL
=> redefine return type as argument
=> could be revert when bug will be fixed in LOKI
YM

File:
1 edited

Legend:

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

    r5353 r5510  
    138138END SUBROUTINE msg_m
    139139!==============================================================================================================================
    140 LOGICAL FUNCTION fmsg_1(str, modname, ll, unit) RESULT(l)
     140 FUNCTION fmsg_1(str, modname, ll, unit) RESULT(l)
    141141  IMPLICIT NONE
    142142  CHARACTER(LEN=*),           INTENT(IN) :: str
     
    144144  LOGICAL,          OPTIONAL, INTENT(IN) :: ll
    145145  INTEGER,          OPTIONAL, INTENT(IN) :: unit
     146  LOGICAL                                :: l
    146147!------------------------------------------------------------------------------------------------------------------------------
    147148  CHARACTER(LEN=maxlen) :: subn
     
    153154END FUNCTION fmsg_1
    154155!==============================================================================================================================
    155 LOGICAL FUNCTION fmsg_m(str, modname, ll, unit, nmax) RESULT(l)
     156 FUNCTION fmsg_m(str, modname, ll, unit, nmax) RESULT(l)
    156157  IMPLICIT NONE
    157158  CHARACTER(LEN=*),           INTENT(IN)  :: str(:)
     
    160161  INTEGER,          OPTIONAL, INTENT(IN) :: unit
    161162  INTEGER,          OPTIONAL, INTENT(IN)  :: nmax
     163  LOGICAL                                 :: l
    162164!------------------------------------------------------------------------------------------------------------------------------
    163165  CHARACTER(LEN=maxlen) :: subn
     
    175177!=== Lower/upper case conversion function. ====================================================================================
    176178!==============================================================================================================================
    177 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strLower(str) RESULT(out)
     179ELEMENTAL FUNCTION strLower(str) RESULT(out)
    178180  IMPLICIT NONE
    179181  CHARACTER(LEN=*), INTENT(IN) :: str
    180182  INTEGER :: k
     183  CHARACTER(LEN=maxlen) :: out
    181184  out = str
    182185  DO k=1,LEN_TRIM(str)
     
    185188END FUNCTION strLower
    186189!==============================================================================================================================
    187 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strUpper(str) RESULT(out)
     190ELEMENTAL FUNCTION strUpper(str) RESULT(out)
    188191  IMPLICIT NONE
    189192  CHARACTER(LEN=*), INTENT(IN) :: str
    190193  INTEGER :: k
     194  CHARACTER(LEN=maxlen)  :: out
    191195  out = str
    192196  DO k=1,LEN_TRIM(str)
     
    203207!===    * strHead(..,.TRUE.)  = 'a_b'         ${str%$sep*}                                                     ================
    204208!==============================================================================================================================
    205 CHARACTER(LEN=maxlen) FUNCTION strHead_1(str, sep, lBackward) RESULT(out)
     209  FUNCTION strHead_1(str, sep, lBackward) RESULT(out)
    206210  IMPLICIT NONE
    207211  CHARACTER(LEN=*),           INTENT(IN) :: str
    208212  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
    209213  LOGICAL,          OPTIONAL, INTENT(IN) :: lBackward
     214  CHARACTER(LEN=maxlen) :: out
    210215!------------------------------------------------------------------------------------------------------------------------------
    211216  IF(PRESENT(sep)) THEN
     
    241246!===    * strTail(str, '_', .TRUE.)  = 'c'           ${str##*$sep}                                             ================
    242247!==============================================================================================================================
    243 CHARACTER(LEN=maxlen) FUNCTION strTail_1(str, sep, lBackWard) RESULT(out)
     248  FUNCTION strTail_1(str, sep, lBackWard) RESULT(out)
    244249  IMPLICIT NONE
    245250  CHARACTER(LEN=*),           INTENT(IN) :: str
    246251  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
    247252  LOGICAL,          OPTIONAL, INTENT(IN) :: lBackWard
     253  CHARACTER(LEN=maxlen) :: out
    248254!------------------------------------------------------------------------------------------------------------------------------
    249255  IF(PRESENT(sep)) THEN
     
    406412!=== OPTIONALY: GET THE NUMBER OF FOUND ELEMENTS "n". NB: UNFOUND => INDEX=0                       ============================
    407413!==============================================================================================================================
    408 INTEGER FUNCTION strIdx_1(str, s) RESULT(out)
     414  FUNCTION strIdx_1(str, s) RESULT(out)
    409415  IMPLICIT NONE
    410416  CHARACTER(LEN=*), INTENT(IN) :: str(:), s
     417  INTEGER :: out
    411418  DO out = 1, SIZE(str); IF(str(out) == s) EXIT; END DO
    412419  IF(out == 1+SIZE(str) .OR. SIZE(str)==0) out = 0
     
    491498!===                     * THEN TEST WHETHER THE STRING FROM START TO THE FOUND SEPARATOR IS A CORRECTLY FORMATTED NUMBER
    492499!==============================================================================================================================
    493 LOGICAL FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)
     500 FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)
    494501  IMPLICIT NONE
    495502  CHARACTER(LEN=*),  INTENT(IN)  :: rawList                          !--- String in which delimiters have to be identified
     
    498505  INTEGER,           INTENT(OUT) :: idx                              !--- Index of the first identified delimiter in "rawList"
    499506  INTEGER,           INTENT(OUT) :: idel                             !--- Index of the identified delimiter (0 if idx==0)
    500   LOGICAL, OPTIONAL, INTENT(IN)  :: lSc                              !--- Care about nbs with front sign or in scient. notation
     507  LOGICAL, OPTIONAL, INTENT(IN)  :: lSc 
     508  LOGICAL :: lerr
     509!--- Care about nbs with front sign or in scient. notation
    501510!------------------------------------------------------------------------------------------------------------------------------
    502511  INTEGER :: idx0                                                    !--- Used to display an identified non-numeric string
     
    526535
    527536!------------------------------------------------------------------------------------------------------------------------------
    528 INTEGER FUNCTION strIdx1(str, del, ib, id) RESULT(i)
     537 FUNCTION strIdx1(str, del, ib, id) RESULT(i)
    529538!--- Get the index of the first appereance of one of the delimiters "del(:)" in "str" starting from position "ib".
    530539!--- "id" is the index in "del(:)" of the first delimiter found.
     
    533542  INTEGER,           INTENT(IN)  :: ib
    534543  INTEGER,           INTENT(OUT) :: id
     544  INTEGER :: i
    535545!------------------------------------------------------------------------------------------------------------------------------
    536546  DO i = ib, LEN_TRIM(str); id = strIdx(del, str(i:i)); IF(id /= 0) EXIT; END DO
     
    545555!=== Count the number of elements separated by "delimiter" in list "rawList". =================================================
    546556!==============================================================================================================================
    547 LOGICAL FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)
     557 FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)
    548558  IMPLICIT NONE
    549559  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
     
    551561  INTEGER,           INTENT(OUT) :: nb
    552562  LOGICAL, OPTIONAL, INTENT(IN)  :: lSc
     563  LOGICAL :: lerr
    553564!------------------------------------------------------------------------------------------------------------------------------
    554565  LOGICAL :: ll
     
    557568END FUNCTION strCount_11
    558569!==============================================================================================================================
    559 LOGICAL FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)
     570 FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)
    560571  IMPLICIT NONE
    561572  CHARACTER(LEN=*),     INTENT(IN)  :: rawList(:)
     
    563574  INTEGER, ALLOCATABLE, INTENT(OUT) :: nb(:)
    564575  LOGICAL,    OPTIONAL, INTENT(IN)  :: lSc
     576  LOGICAL :: lerr
    565577!------------------------------------------------------------------------------------------------------------------------------
    566578  LOGICAL :: ll
     
    574586END FUNCTION strCount_m1
    575587!==============================================================================================================================
    576 LOGICAL FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)
     588 FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)
    577589  IMPLICIT NONE
    578590  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
     
    584596  LOGICAL              :: ll
    585597  CHARACTER(LEN=1024)  :: r
     598  LOGICAL :: lerr
     599 
    586600  lerr = .FALSE.
    587601  ll   = .FALSE.; IF(PRESENT(lSc)) ll = lSc
     
    605619!===          Corresponding "vals" remains empty if the element does not contain "=" sign. ====================================
    606620!==============================================================================================================================
    607 LOGICAL FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)
     621 FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)
    608622  IMPLICIT NONE
    609623  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter
     
    611625  INTEGER,                            OPTIONAL, INTENT(OUT) :: n
    612626  CHARACTER(LEN=maxlen), ALLOCATABLE, OPTIONAL, INTENT(OUT) :: vals(:)
     627  LOGICAL :: lerr
    613628!------------------------------------------------------------------------------------------------------------------------------
    614629  CHARACTER(LEN=1024) :: r
     
    625640
    626641!------------------------------------------------------------------------------------------------------------------------------
    627 INTEGER FUNCTION countK() RESULT(nkeys)
     642 FUNCTION countK() RESULT(nkeys)
    628643!--- Get the number of elements after parsing.
    629644  IMPLICIT NONE
     645  INTEGER :: nkeys
    630646!------------------------------------------------------------------------------------------------------------------------------
    631647  INTEGER :: ib, ie, nl
     
    680696END FUNCTION strParse
    681697!==============================================================================================================================
    682 LOGICAL FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)
     698 FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)
    683699  IMPLICIT NONE
    684700  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter(:)
     
    688704  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lSc      !--- Take care about numbers in scientific notation
    689705  INTEGER,               OPTIONAL, ALLOCATABLE, INTENT(OUT) :: id(:)    !--- Indexes of the separators in "delimiter(:)" vector
     706  LOGICAL :: lerr
    690707!------------------------------------------------------------------------------------------------------------------------------
    691708  CHARACTER(LEN=1024) :: r
     
    10851102!===    higher, several partial tables are displayed ; the nHead (default: 1) first columns are included in each sub-table.
    10861103!==============================================================================================================================
    1087 LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nRowMax, nColMax, nHead, unit, sub) RESULT(lerr)
     1104 FUNCTION dispTable(p, titles, s, i, r, rFmt, nRowMax, nColMax, nHead, unit, sub) RESULT(lerr)
    10881105  IMPLICIT NONE
    10891106  CHARACTER(LEN=*),           INTENT(IN)  :: p             !--- DISPLAY MAP: s/i/r
     
    10981115  INTEGER,          OPTIONAL, INTENT(IN)  :: unit          !--- Output unit (default: screen)
    10991116  CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: sub           !--- Subroutine name
     1117  LOGICAL :: lerr
    11001118!------------------------------------------------------------------------------------------------------------------------------
    11011119  CHARACTER(LEN=2048) :: row
     
    11941212
    11951213!==============================================================================================================================
    1196 LOGICAL FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr)
     1214  FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr)
    11971215  IMPLICIT NONE
    11981216  INTEGER,                    INTENT(IN)  :: unt           !--- Output unit
     
    12041222  CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: rFmt          !--- Format for reals
    12051223  LOGICAL,          OPTIONAL, INTENT(IN)  :: llast         !--- Last variable: no final ','
     1224  LOGICAL :: lerr
    12061225!------------------------------------------------------------------------------------------------------------------------------
    12071226  CHARACTER(LEN=maxlen)  :: rFm, el
     
    12771296
    12781297!==============================================================================================================================
    1279 LOGICAL FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr)
     1298  FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr)
    12801299  IMPLICIT NONE
    12811300! Display outliers list in tables
     
    12891308  INTEGER,          OPTIONAL, INTENT(IN)  :: nHead                   !--- Number of front columns to duplicate  (default: 1)
    12901309  INTEGER,          OPTIONAL, INTENT(IN)  :: unit                    !--- Output unit                           (def: lunout)
     1310  LOGICAL :: lerr
    12911311!------------------------------------------------------------------------------------------------------------------------------
    12921312  CHARACTER(LEN=maxlen),      ALLOCATABLE :: ttl(:)
     
    13561376END FUNCTION dispOutliers_1
    13571377!==============================================================================================================================
    1358 LOGICAL FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr)
     1378  FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr)
    13591379  IMPLICIT NONE
    13601380! Display outliers list in tables
     
    13681388  INTEGER,          OPTIONAL, INTENT(IN)  :: nHead                   !--- Number of front columns to duplicate  (default: 1)
    13691389  INTEGER,          OPTIONAL, INTENT(IN)  :: unit                    !--- Output unit                           (def: lunout)
     1390  LOGICAL :: lerr
    13701391!------------------------------------------------------------------------------------------------------------------------------
    13711392  CHARACTER(LEN=maxlen)                   :: mes, sub, fm='(f12.9)', prf
     
    14141435!=== Reduce an algebrical expression (basic operations and parenthesis) to a single number (string format) ====================
    14151436!==============================================================================================================================
    1416 LOGICAL FUNCTION reduceExpr_1(str, val) RESULT(lerr)
     1437  FUNCTION reduceExpr_1(str, val) RESULT(lerr)
    14171438  IMPLICIT NONE
    14181439  CHARACTER(LEN=*),      INTENT(IN)  :: str
    14191440  CHARACTER(LEN=maxlen), INTENT(OUT) :: val
     1441  LOGICAL :: lerr
    14201442!------------------------------------------------------------------------------------------------------------------------------
    14211443  CHARACTER(LEN=maxlen)              :: v
     
    14641486!=== Reduce a simple algebrical expression (basic operations, no parenthesis) to a single number (string format) ==============
    14651487!==============================================================================================================================
    1466 LOGICAL FUNCTION reduceExpr_basic(str, val) RESULT(lerr)
     1488 FUNCTION reduceExpr_basic(str, val) RESULT(lerr)
    14671489  IMPLICIT NONE
    14681490  CHARACTER(LEN=*),      INTENT(IN)  :: str
     
    14721494  CHARACTER(LEN=maxlen), ALLOCATABLE :: ky(:)
    14731495  CHARACTER(LEN=1),      ALLOCATABLE :: op(:)
     1496  LOGICAL :: lerr
    14741497!------------------------------------------------------------------------------------------------------------------------------
    14751498  CHARACTER(LEN=1024) :: s
     
    15241547!=== Check whether a string is a number or not ================================================================================
    15251548!==============================================================================================================================
    1526 ELEMENTAL LOGICAL FUNCTION is_numeric(str) RESULT(out)
     1549ELEMENTAL FUNCTION is_numeric(str) RESULT(out)
    15271550  IMPLICIT NONE
    15281551  CHARACTER(LEN=*), INTENT(IN) :: str
     
    15301553  INTEGER :: e
    15311554  CHARACTER(LEN=12) :: fmt
     1555  LOGICAL :: out
     1556 
    15321557  IF(TRIM(str) == '') THEN; out = .FALSE.; RETURN; END IF
    15331558  WRITE(fmt,'("(f",i0,".0)")') LEN_TRIM(str)
     
    15411566!=== Convert a string into a logical/integer integer or an integer/real into a string =========================================
    15421567!==============================================================================================================================
    1543 ELEMENTAL INTEGER FUNCTION str2bool(str) RESULT(out)  !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean
     1568ELEMENTAL FUNCTION str2bool(str) RESULT(out)  !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean
    15441569  IMPLICIT NONE
    15451570  CHARACTER(LEN=*), INTENT(IN) :: str
    15461571  INTEGER :: ierr
    15471572  LOGICAL :: lout
     1573  INTEGER :: out
     1574
    15481575  READ(str,*,IOSTAT=ierr) lout
     1576 
    15491577  out = -HUGE(1)
    15501578  IF(ierr /= 0) THEN
     
    15561584END FUNCTION str2bool
    15571585!==============================================================================================================================
    1558 ELEMENTAL INTEGER FUNCTION str2int(str) RESULT(out)
     1586ELEMENTAL FUNCTION str2int(str) RESULT(out)
    15591587  IMPLICIT NONE
    15601588  CHARACTER(LEN=*), INTENT(IN) :: str
    15611589  INTEGER :: ierr
     1590  INTEGER :: out
     1591 
    15621592  READ(str,*,IOSTAT=ierr) out
    15631593  IF(ierr/=0) out = -HUGE(1)
    15641594END FUNCTION str2int
    15651595!==============================================================================================================================
    1566 ELEMENTAL REAL FUNCTION str2real(str) RESULT(out)
     1596ELEMENTAL FUNCTION str2real(str) RESULT(out)
    15671597  IMPLICIT NONE
    15681598  CHARACTER(LEN=*), INTENT(IN) :: str
    15691599  INTEGER :: ierr
     1600  REAL :: out
     1601 
    15701602  READ(str,*,IOSTAT=ierr) out
    15711603  IF(ierr/=0) out = -HUGE(1.)
    15721604END FUNCTION str2real
    15731605!==============================================================================================================================
    1574 ELEMENTAL DOUBLE PRECISION FUNCTION str2dble(str) RESULT(out)
     1606ELEMENTAL FUNCTION str2dble(str) RESULT(out)
    15751607  IMPLICIT NONE
    15761608  CHARACTER(LEN=*), INTENT(IN) :: str
    15771609  INTEGER :: ierr
     1610  DOUBLE PRECISION :: out
     1611 
    15781612  READ(str,*,IOSTAT=ierr) out
    15791613  IF(ierr/=0) out = -HUGE(1.d0)
    15801614END FUNCTION str2dble
    15811615!==============================================================================================================================
    1582 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION bool2str(b) RESULT(out)
     1616ELEMENTAL FUNCTION bool2str(b) RESULT(out)
    15831617  IMPLICIT NONE
    15841618  LOGICAL, INTENT(IN) :: b
     1619  CHARACTER(LEN=maxlen) :: out
    15851620  WRITE(out,*)b
    15861621  out = ADJUSTL(out)
    15871622END FUNCTION bool2str
    15881623!==============================================================================================================================
    1589 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION int2str(i, nDigits) RESULT(out)
     1624ELEMENTAL FUNCTION int2str(i, nDigits) RESULT(out)
    15901625  IMPLICIT NONE
    15911626  INTEGER,           INTENT(IN) :: i
    15921627  INTEGER, OPTIONAL, INTENT(IN) :: nDigits
     1628  CHARACTER(LEN=maxlen) :: out
    15931629!------------------------------------------------------------------------------------------------------------------------------
    15941630  WRITE(out,*)i
     
    15981634END FUNCTION int2str
    15991635!==============================================================================================================================
    1600 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out)
     1636ELEMENTAL FUNCTION real2str(r,fmt) RESULT(out)
    16011637  IMPLICIT NONE
    16021638  REAL,                       INTENT(IN) :: r
    16031639  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
     1640  CHARACTER(LEN=maxlen) :: out
    16041641!------------------------------------------------------------------------------------------------------------------------------
    16051642  IF(     PRESENT(fmt)) WRITE(out,fmt)r
     
    16081645END FUNCTION real2str
    16091646!==============================================================================================================================
    1610 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out)
     1647ELEMENTAL FUNCTION dble2str(d,fmt) RESULT(out)
    16111648  IMPLICIT NONE
    16121649  DOUBLE PRECISION,           INTENT(IN) :: d
    16131650  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
     1651  CHARACTER(LEN=maxlen) :: out
    16141652!------------------------------------------------------------------------------------------------------------------------------
    16151653  IF(     PRESENT(fmt)) WRITE(out,fmt)d
     
    16561694END FUNCTION addQuotes_m
    16571695!==============================================================================================================================
    1658 ELEMENTAL LOGICAL FUNCTION needQuotes(s) RESULT(out)
     1696ELEMENTAL FUNCTION needQuotes(s) RESULT(out)
    16591697  IMPLICIT NONE
    16601698  CHARACTER(LEN=*), INTENT(IN) :: s
    16611699  CHARACTER(LEN=1) :: b, e
     1700  LOGICAL :: out
    16621701!------------------------------------------------------------------------------------------------------------------------------
    16631702  out = .TRUE.; IF(TRIM(s) == '') RETURN
     
    16711710!=== DISPLAY "<message>: the following <items> are <reason>" FOLLOWED BY THE LIST OF <str> FOR WHICH <lerr>==T. ===============
    16721711!==============================================================================================================================
    1673 LOGICAL FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)
     1712 FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)
    16741713  IMPLICIT NONE
    16751714! Purpose: Messages in case a list contains wrong elements (indicated by lerr boolean vector).
     
    16791718  CHARACTER(LEN=*),   INTENT(IN)  :: message, items, reason
    16801719  INTEGER,  OPTIONAL, INTENT(IN)  :: nmax
     1720  LOGICAL :: out
    16811721!------------------------------------------------------------------------------------------------------------------------------
    16821722  CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:)
Note: See TracChangeset for help on using the changeset viewer.