Changeset 5001 for LMDZ6/trunk/libf/misc/strings_mod.F90
- Timestamp:
- Jul 1, 2024, 11:25:05 AM (3 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/misc/strings_mod.F90
r4987 r5001 10 10 PUBLIC :: is_numeric, bool2str, int2str, real2str, dble2str 11 11 PUBLIC :: reduceExpr, str2bool, str2int, str2real, str2dble 12 PUBLIC :: addQuotes, checkList, removeComment , test12 PUBLIC :: addQuotes, checkList, removeComment 13 13 14 14 INTERFACE get_in; MODULE PROCEDURE getin_s, getin_i, getin_r, getin_l; END INTERFACE get_in … … 22 22 INTERFACE strCount; MODULE PROCEDURE strCount_m1, strCount_11, strCount_1m; END INTERFACE strCount 23 23 INTERFACE strReplace; MODULE PROCEDURE strReplace_1, strReplace_m; END INTERFACE strReplace 24 INTERFACE cat; MODULE PROCEDURE horzcat_s1, horzcat_i1, horzcat_r1, & 25 ! horzcat_d1, horzcat_dm, 26 horzcat_sm, horzcat_im, horzcat_rm; END INTERFACE cat 27 INTERFACE find; MODULE PROCEDURE strFind, find_int, find_boo; END INTERFACE find 24 INTERFACE cat; MODULE PROCEDURE horzcat_s00, horzcat_i00, horzcat_r00, & !horzcat_d00, & 25 horzcat_s10, horzcat_i10, horzcat_r10, & !horzcat_d10, & 26 horzcat_s11, horzcat_i11, horzcat_r11, & !horzcat_d11, & 27 horzcat_s21, horzcat_i21, horzcat_r21; END INTERFACE cat !horzcat_d21 28 INTERFACE strFind; MODULE PROCEDURE strFind_1, strFind_m; END INTERFACE strFind 29 INTERFACE find; MODULE PROCEDURE strFind_1, strFind_m, intFind_1, intFind_m, booFind; END INTERFACE find 28 30 INTERFACE dispOutliers; MODULE PROCEDURE dispOutliers_1, dispOutliers_2; END INTERFACE dispOutliers 29 31 INTERFACE reduceExpr; MODULE PROCEDURE reduceExpr_1, reduceExpr_m; END INTERFACE reduceExpr … … 36 38 CONTAINS 37 39 38 !==============================================================================================================================39 LOGICAL FUNCTION test(lcond, lout) RESULT(lerr)40 LOGICAL, INTENT(IN) :: lcond41 LOGICAL, INTENT(OUT) :: lout42 lerr = lcond; lout = lcond43 END FUNCTION test44 !==============================================================================================================================45 46 40 47 41 !============================================================================================================================== 48 42 SUBROUTINE init_printout(lunout_, prt_level_) 43 IMPLICIT NONE 49 44 INTEGER, INTENT(IN) :: lunout_, prt_level_ 50 45 lunout = lunout_ … … 58 53 !============================================================================================================================== 59 54 SUBROUTINE getin_s(nam, val, def) 60 USE ioipsl_getincom, ONLY: getin 55 USE ioipsl_getincom, ONLY: getin 56 IMPLICIT NONE 61 57 CHARACTER(LEN=*), INTENT(IN) :: nam 62 58 CHARACTER(LEN=*), INTENT(INOUT) :: val … … 67 63 !============================================================================================================================== 68 64 SUBROUTINE getin_i(nam, val, def) 69 USE ioipsl_getincom, ONLY: getin 65 USE ioipsl_getincom, ONLY: getin 66 IMPLICIT NONE 70 67 CHARACTER(LEN=*), INTENT(IN) :: nam 71 68 INTEGER, INTENT(INOUT) :: val … … 76 73 !============================================================================================================================== 77 74 SUBROUTINE getin_r(nam, val, def) 78 USE ioipsl_getincom, ONLY: getin 75 USE ioipsl_getincom, ONLY: getin 76 IMPLICIT NONE 79 77 CHARACTER(LEN=*), INTENT(IN) :: nam 80 78 REAL, INTENT(INOUT) :: val … … 85 83 !============================================================================================================================== 86 84 SUBROUTINE getin_l(nam, val, def) 87 USE ioipsl_getincom, ONLY: getin 85 USE ioipsl_getincom, ONLY: getin 86 IMPLICIT NONE 88 87 CHARACTER(LEN=*), INTENT(IN) :: nam 89 88 LOGICAL, INTENT(INOUT) :: val … … 99 98 !============================================================================================================================== 100 99 SUBROUTINE msg_1(str, modname, ll, unit) 100 IMPLICIT NONE 101 101 !--- Display a simple message "str". Optional parameters: 102 102 ! * "modname": module name, displayed in front of the message (with ": " separator) if present. … … 118 118 !============================================================================================================================== 119 119 SUBROUTINE msg_m(str, modname, ll, unit, nmax) 120 IMPLICIT NONE 120 121 !--- Same as msg_1 with multiple strings that are stacked (separator: coma) on up to "nmax" full lines. 121 122 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 138 139 !============================================================================================================================== 139 140 LOGICAL FUNCTION fmsg_1(str, modname, ll, unit) RESULT(l) 141 IMPLICIT NONE 140 142 CHARACTER(LEN=*), INTENT(IN) :: str 141 143 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname … … 152 154 !============================================================================================================================== 153 155 LOGICAL FUNCTION fmsg_m(str, modname, ll, unit, nmax) RESULT(l) 156 IMPLICIT NONE 154 157 CHARACTER(LEN=*), INTENT(IN) :: str(:) 155 158 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname … … 173 176 !============================================================================================================================== 174 177 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strLower(str) RESULT(out) 178 IMPLICIT NONE 175 179 CHARACTER(LEN=*), INTENT(IN) :: str 176 180 INTEGER :: k … … 182 186 !============================================================================================================================== 183 187 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strUpper(str) RESULT(out) 188 IMPLICIT NONE 184 189 CHARACTER(LEN=*), INTENT(IN) :: str 185 190 INTEGER :: k … … 199 204 !============================================================================================================================== 200 205 CHARACTER(LEN=maxlen) FUNCTION strHead_1(str, sep, lBackward) RESULT(out) 206 IMPLICIT NONE 201 207 CHARACTER(LEN=*), INTENT(IN) :: str 202 208 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep … … 214 220 !============================================================================================================================== 215 221 FUNCTION strHead_m(str, sep, lBackward) RESULT(out) 222 IMPLICIT NONE 216 223 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:) 217 224 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 235 242 !============================================================================================================================== 236 243 CHARACTER(LEN=maxlen) FUNCTION strTail_1(str, sep, lBackWard) RESULT(out) 244 IMPLICIT NONE 237 245 CHARACTER(LEN=*), INTENT(IN) :: str 238 246 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep … … 250 258 !============================================================================================================================== 251 259 FUNCTION strTail_m(str, sep, lBackWard) RESULT(out) 260 IMPLICIT NONE 252 261 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:) 253 262 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 271 280 !============================================================================================================================== 272 281 FUNCTION strStack(str, sep, mask) RESULT(out) 282 IMPLICIT NONE 273 283 CHARACTER(LEN=:), ALLOCATABLE :: out 274 284 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 292 302 !============================================================================================================================== 293 303 FUNCTION strStackm(str, sep, nmax) RESULT(out) 304 IMPLICIT NONE 294 305 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:) 295 306 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 324 335 !============================================================================================================================== 325 336 SUBROUTINE strClean_1(str) 337 IMPLICIT NONE 326 338 CHARACTER(LEN=*), INTENT(INOUT) :: str 327 339 INTEGER :: k, n, m … … 337 349 !============================================================================================================================== 338 350 SUBROUTINE strClean_m(str) 351 IMPLICIT NONE 339 352 CHARACTER(LEN=*), INTENT(INOUT) :: str(:) 340 353 INTEGER :: k … … 349 362 !============================================================================================================================== 350 363 SUBROUTINE strReduce_1(str, nb) 364 IMPLICIT NONE 351 365 CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) :: str(:) 352 366 INTEGER, OPTIONAL, INTENT(OUT) :: nb … … 366 380 !============================================================================================================================== 367 381 SUBROUTINE strReduce_2(str1, str2) 382 IMPLICIT NONE 368 383 CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) :: str1(:) 369 384 CHARACTER(LEN=*), INTENT(IN) :: str2(:) … … 392 407 !============================================================================================================================== 393 408 INTEGER FUNCTION strIdx_1(str, s) RESULT(out) 409 IMPLICIT NONE 394 410 CHARACTER(LEN=*), INTENT(IN) :: str(:), s 395 411 DO out = 1, SIZE(str); IF(str(out) == s) EXIT; END DO … … 398 414 !============================================================================================================================== 399 415 FUNCTION strIdx_m(str, s, n) RESULT(out) 416 IMPLICIT NONE 400 417 CHARACTER(LEN=*), INTENT(IN) :: str(:), s(:) 401 418 INTEGER, OPTIONAL, INTENT(OUT) :: n … … 412 429 !=== GET THE INDEX LIST OF THE ELEMENTS OF "str(:)" EQUAL TO "s" AND OPTIONALY, ITS LENGTH "n" ================================ 413 430 !============================================================================================================================== 414 FUNCTION strFind(str, s, n) RESULT(out) 431 FUNCTION strFind_1(str, s, n) RESULT(out) 432 IMPLICIT NONE 415 433 CHARACTER(LEN=*), INTENT(IN) :: str(:), s 416 434 INTEGER, OPTIONAL, INTENT(OUT) :: n … … 420 438 out = PACK( [(k, k=1, SIZE(str(:), DIM=1))], MASK = str(:) == s ) 421 439 IF(PRESENT(n)) n = SIZE(out(:), DIM=1) 422 END FUNCTION strFind 423 !============================================================================================================================== 424 FUNCTION find_int(i,j,n) RESULT(out) 440 END FUNCTION strFind_1 441 !============================================================================================================================== 442 FUNCTION strFind_m(str, s, n) RESULT(out) 443 IMPLICIT NONE 444 CHARACTER(LEN=*), INTENT(IN) :: str(:), s(:) 445 INTEGER, OPTIONAL, INTENT(OUT) :: n 446 INTEGER, ALLOCATABLE :: out(:) 447 !------------------------------------------------------------------------------------------------------------------------------ 448 INTEGER :: k 449 out = [(strFind_1(str, s(k)), k=1, SIZE(s))] 450 IF(PRESENT(n)) n = SIZE(out(:), DIM=1) 451 END FUNCTION strFind_m 452 !============================================================================================================================== 453 FUNCTION intFind_1(i,j,n) RESULT(out) 454 IMPLICIT NONE 425 455 INTEGER, INTENT(IN) :: i(:), j 426 456 INTEGER, OPTIONAL, INTENT(OUT) :: n … … 430 460 out = PACK( [(k, k=1, SIZE(i(:), DIM=1))], MASK = i(:) == j ) 431 461 IF(PRESENT(n)) n = SIZE(out(:), DIM=1) 432 END FUNCTION find_int 433 !============================================================================================================================== 434 FUNCTION find_boo(l,n) RESULT(out) 435 LOGICAL, INTENT(IN) :: l(:) 462 END FUNCTION intFind_1 463 !============================================================================================================================== 464 FUNCTION intFind_m(i,j,n) RESULT(out) 465 IMPLICIT NONE 466 INTEGER, INTENT(IN) :: i(:), j(:) 467 INTEGER, OPTIONAL, INTENT(OUT) :: n 468 INTEGER, ALLOCATABLE :: out(:) 469 !------------------------------------------------------------------------------------------------------------------------------ 470 INTEGER :: k 471 out = [(intFind_1(i, j(k)), k=1, SIZE(j))] 472 IF(PRESENT(n)) n = SIZE(out(:), DIM=1) 473 END FUNCTION intFind_m 474 !============================================================================================================================== 475 FUNCTION booFind(l,n) RESULT(out) 476 IMPLICIT NONE 477 LOGICAL, INTENT(IN) :: l(:) 436 478 INTEGER, OPTIONAL, INTENT(OUT) :: n 437 479 INTEGER, ALLOCATABLE :: out(:) … … 440 482 out = PACK( [(k, k=1, SIZE(l(:), DIM=1))], MASK = l(:) ) 441 483 IF(PRESENT(n)) n = SIZE(out(:), DIM=1) 442 END FUNCTION find_boo484 END FUNCTION booFind 443 485 !============================================================================================================================== 444 486 … … 450 492 !============================================================================================================================== 451 493 LOGICAL FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr) 494 IMPLICIT NONE 452 495 CHARACTER(LEN=*), INTENT(IN) :: rawList !--- String in which delimiters have to be identified 453 496 CHARACTER(LEN=*), INTENT(IN) :: del(:) !--- List of delimiters … … 469 512 END IF 470 513 471 IF(test(idx == 1 .AND. INDEX('+-',del(idel)) /= 0, lerr)) RETURN!--- The front delimiter is different from +/-: error472 IF( idx /= 1 .AND. is_numeric(rawList(ibeg:idx-1))) RETURN!--- The input string head is a valid number514 lerr = idx == 1 .AND. INDEX('+-',del(idel)) /= 0; IF(lerr) RETURN !--- The front delimiter is different from +/-: error 515 IF( idx /= 1 .AND. is_numeric(rawList(ibeg:idx-1))) RETURN !--- The input string head is a valid number 473 516 474 517 !=== The string part in front of the 1st delimiter is not a valid number: search for next delimiter index "idx" … … 503 546 !============================================================================================================================== 504 547 LOGICAL FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr) 548 IMPLICIT NONE 505 549 CHARACTER(LEN=*), INTENT(IN) :: rawList 506 550 CHARACTER(LEN=*), INTENT(IN) :: delimiter … … 514 558 !============================================================================================================================== 515 559 LOGICAL FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr) 560 IMPLICIT NONE 516 561 CHARACTER(LEN=*), INTENT(IN) :: rawList(:) 517 562 CHARACTER(LEN=*), INTENT(IN) :: delimiter … … 530 575 !============================================================================================================================== 531 576 LOGICAL FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr) 577 IMPLICIT NONE 532 578 CHARACTER(LEN=*), INTENT(IN) :: rawList 533 579 CHARACTER(LEN=*), INTENT(IN) :: delimiter(:) … … 560 606 !============================================================================================================================== 561 607 LOGICAL FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr) 608 IMPLICIT NONE 562 609 CHARACTER(LEN=*), INTENT(IN) :: rawList, delimiter 563 610 CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: keys(:) … … 570 617 r = TRIM(ADJUSTL(rawList)) 571 618 nr = LEN_TRIM(r); IF(nr == 0) THEN; keys = ['']; RETURN; END IF 572 CALL strParse_prv(nk) !--- COUNT THE ELEMENTS 573 ALLOCATE(keys(nk)) 574 IF(PRESENT(vals)) THEN 575 ALLOCATE(vals(nk)); CALL strParse_prv(nk, keys, vals) !--- PARSE THE KEYS 576 ELSE 577 CALL strParse_prv(nk, keys) !--- PARSE THE KEYS 578 END IF 579 IF(PRESENT(n)) n = nk 619 nk = countK() !--- COUNT THE ELEMENTS 620 CALL parseK(keys) !--- PARSE THE KEYS 621 IF(PRESENT(vals)) CALL parseV(vals) !--- PARSE <key>=<val> PAIRS 622 IF(PRESENT(n)) n = nk !--- RETURN THE NUMBER OF KEYS 623 IF(PRESENT(vals)) & 624 print*,'key ; val = '//TRIM(strStack(keys))//' ; '//TRIM(strStack(vals)) 580 625 581 626 CONTAINS 582 627 583 628 !------------------------------------------------------------------------------------------------------------------------------ 584 SUBROUTINE strParse_prv(nkeys, keys, vals) 585 !--- * Get the number of elements after parsing ("nkeys" only is present) 586 !--- * Parse the <key>=<val> pairs and store result in "keys" and "vals" (already allocated) 587 IMPLICIT NONE 588 INTEGER, INTENT(OUT) :: nkeys 589 CHARACTER(LEN=maxlen), OPTIONAL, INTENT(OUT) :: keys(:) 590 CHARACTER(LEN=maxlen), OPTIONAL, INTENT(OUT) :: vals(:) 591 !------------------------------------------------------------------------------------------------------------------------------ 592 INTEGER :: ib, ie 593 nkeys = 1; ib = 1 629 INTEGER FUNCTION countK() RESULT(nkeys) 630 !--- Get the number of elements after parsing. 631 IMPLICIT NONE 632 !------------------------------------------------------------------------------------------------------------------------------ 633 INTEGER :: ib, ie, nl 634 nkeys = 1; ib = 1; nl = LEN(delimiter) 594 635 DO 595 636 ie = INDEX(rawList(ib:nr), delimiter)+ib-1 !--- Determine the next separator start index 596 637 IF(ie == ib-1) EXIT 597 IF(PRESENT(keys)) keys(nkeys) = r(ib:ie-1) !--- Get the ikth key 598 IF(PRESENT(vals)) CALL parseKeys(keys(nkeys), vals(nkeys)) !--- Parse the ikth <key>=<val> pair 638 ib = ie + nl 639 DO WHILE(ANY([0, 9, 32] == IACHAR(r(ib:ib))) .AND. ib < nr) !--- Skip blanks (ascii): NULL (0), TAB (9), SPACE (32) 640 ib = ib + 1 641 END DO !--- Skip spaces before next chain 642 nkeys = nkeys+1 643 END DO 644 END FUNCTION countK 645 646 !------------------------------------------------------------------------------------------------------------------------------ 647 SUBROUTINE parseK(keys) 648 !--- Parse the string separated by "delimiter" from "rawList" into "keys(:)" 649 IMPLICIT NONE 650 CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: keys(:) 651 !------------------------------------------------------------------------------------------------------------------------------ 652 INTEGER :: ib, ie, ik 653 ALLOCATE(keys(nk)) 654 ib = 1 655 DO ik = 1, nk 656 ie = INDEX(rawList(ib:nr), delimiter)+ib-1 !--- Determine the next separator start index 657 IF(ie == ib-1) EXIT 658 keys(ik) = r(ib:ie-1) !--- Get the ikth key 599 659 ib = ie + LEN(delimiter) 600 660 DO WHILE(r(ib:ib) == ' ' .AND. ib < nr); ib = ib + 1; END DO !--- Skip spaces before next chain 601 nkeys = nkeys+1 602 END DO 603 IF(PRESENT(keys)) keys(nkeys) = r(ib:nr) !--- Get the last key 604 IF(PRESENT(vals)) CALL parseKeys(keys(nkeys), vals(nkeys)) !--- Parse the last <key>=<val> pair 605 END SUBROUTINE strParse_prv 606 607 !------------------------------------------------------------------------------------------------------------------------------ 608 SUBROUTINE parseKeys(key, val) 609 CHARACTER(LEN=*), INTENT(INOUT) :: key 610 CHARACTER(LEN=*), INTENT(OUT) :: val 611 !------------------------------------------------------------------------------------------------------------------------------ 612 INTEGER :: ix 613 ix = INDEX(key, '='); IF(ix == 0) RETURN !--- First "=" index in "key" 614 val = ADJUSTL(key(ix+1:LEN_TRIM(key))) 615 key = ADJUSTL(key(1:ix-1)) 616 END SUBROUTINE parseKeys 661 END DO 662 keys(ik) = r(ib:nr) !--- Get the last key 663 END SUBROUTINE parseK 664 665 !------------------------------------------------------------------------------------------------------------------------------ 666 SUBROUTINE parseV(vals) 667 !--- Parse the <key>=<val> pairs in "keys(:)" into "keys" and "vals" 668 IMPLICIT NONE 669 CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: vals(:) 670 !------------------------------------------------------------------------------------------------------------------------------ 671 CHARACTER(LEN=maxlen) :: key 672 INTEGER :: ik, ix 673 ALLOCATE(vals(nk)) 674 DO ik = 1, nk; key = keys(ik) 675 vals(ik) = '' 676 ix = INDEX(key, '='); IF(ix == 0) CYCLE !--- First "=" index in "key" 677 vals(ik) = ADJUSTL(key(ix+1:LEN_TRIM(key))) 678 keys(ik) = ADJUSTL(key(1:ix-1)) 679 END DO 680 END SUBROUTINE parseV 617 681 618 682 END FUNCTION strParse 619 683 !============================================================================================================================== 620 684 LOGICAL FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr) 685 IMPLICIT NONE 621 686 CHARACTER(LEN=*), INTENT(IN) :: rawList, delimiter(:) 622 687 CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: keys(:) !--- Parsed keys vector … … 630 695 LOGICAL :: ll 631 696 ll = .FALSE.; IF(PRESENT(lSc)) ll = lSc 632 IF(test(fmsg("Couldn't parse list: non-numerical strings were found", ll=strCount_1m(rawList, delimiter, nk, ll)),lerr)) RETURN 697 lerr = strCount_1m(rawList, delimiter, nk, ll) 698 CALL msg("Couldn't parse list: non-numerical strings were found", ll=lerr); IF(lerr) RETURN 633 699 634 700 !--- FEW ALLOCATIONS … … 643 709 ib = 1 644 710 DO ik = 1, nk-1 645 IF(test(fmsg('Non-numeric values found', ll=strIdx_prv(r, delimiter, ib, ie, jd, ll)),lerr)) RETURN 711 lerr = strIdx_prv(r, delimiter, ib, ie, jd, ll) 712 CALL msg('Non-numeric values found', ll=lerr); IF(lerr) RETURN 646 713 keys(ik) = r(ib:ie-1) 647 714 IF(PRESENT(vals)) CALL parseKeys(keys(ik), vals(ik)) !--- Parse a <key>=<val> pair … … 657 724 !------------------------------------------------------------------------------------------------------------------------------ 658 725 SUBROUTINE parseKeys(key, val) 726 IMPLICIT NONE 659 727 CHARACTER(LEN=*), INTENT(INOUT) :: key 660 728 CHARACTER(LEN=*), INTENT(OUT) :: val … … 674 742 !============================================================================================================================== 675 743 SUBROUTINE strReplace_1(str, key, val, lsurr) 744 IMPLICIT NONE 676 745 CHARACTER(LEN=*), INTENT(INOUT) :: str !--- Main string 677 746 CHARACTER(LEN=*), INTENT(IN) :: key, val !--- "key" will be replaced by "val" … … 700 769 !============================================================================================================================== 701 770 SUBROUTINE strReplace_m(str, key, val, lsurr) 771 IMPLICIT NONE 702 772 CHARACTER(LEN=*), INTENT(INOUT) :: str(:) !--- Main strings vector 703 773 CHARACTER(LEN=*), INTENT(IN) :: key, val !--- "key" will be replaced by "val" … … 714 784 !=== Contatenate horizontally scalars/vectors of strings/integers/reals into a vector/array =================================== 715 785 !============================================================================================================================== 716 FUNCTION horzcat_s1(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 717 CHARACTER(LEN=*), TARGET, INTENT(IN) :: s0 786 FUNCTION horzcat_s00(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 787 IMPLICIT NONE 788 CHARACTER(LEN=*), INTENT(IN) :: s0 718 789 CHARACTER(LEN=*), OPTIONAL, TARGET, INTENT(IN) :: s1, s2, s3, s4, s5, s6, s7, s8, s9 719 790 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:) 720 !------------------------------------------------------------------------------------------------------------------------------721 791 CHARACTER(LEN=maxlen), POINTER :: s 722 LOGICAL :: lv(10) 723 INTEGER :: iv 724 lv = [ .TRUE. , PRESENT(s1), PRESENT(s2), PRESENT(s3), PRESENT(s4) , & 725 PRESENT(s5), PRESENT(s6), PRESENT(s7), PRESENT(s8), PRESENT(s9) ] 726 ALLOCATE(out(COUNT(lv))) 727 DO iv=1, COUNT(lv) 728 SELECT CASE(iv) 729 CASE(1); s=> s0; CASE(2); s=> s1; CASE(3); s=> s2; CASE(4); s=> s3; CASE(5); s=> s4 730 CASE(6); s=> s5; CASE(7); s=> s6; CASE(8); s=> s7; CASE(9); s=> s8; CASE(10);s=> s9 792 INTEGER :: nrow, iv 793 LOGICAL :: pre(9) 794 !------------------------------------------------------------------------------------------------------------------------------ 795 pre(:) = [PRESENT(s1),PRESENT(s2),PRESENT(s3),PRESENT(s4),PRESENT(s5),PRESENT(s6),PRESENT(s7),PRESENT(s8),PRESENT(s9)] 796 nrow = 1+COUNT(pre) 797 ALLOCATE(out(nrow)) 798 out(1) = s0 799 DO iv = 2, nrow; IF(.NOT.pre(iv-1)) CYCLE 800 SELECT CASE(iv-1) 801 CASE(1); s=> s1; CASE(2); s=> s2; CASE(3); s=> s3; CASE(4); s=> s4; CASE(5); s=> s5 802 CASE(6); s=> s6; CASE(7); s=> s7; CASE(8); s=> s8; CASE(9); s=> s9 731 803 END SELECT 732 804 out(iv) = s 733 805 END DO 734 END FUNCTION horzcat_s1 735 !============================================================================================================================== 736 FUNCTION horzcat_sm(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 737 CHARACTER(LEN=*), TARGET, DIMENSION(:), INTENT(IN) :: s0 738 CHARACTER(LEN=*), OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: s1, s2, s3, s4, s5, s6, s7, s8, s9 806 END FUNCTION horzcat_s00 807 !============================================================================================================================== 808 FUNCTION horzcat_s10(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 809 IMPLICIT NONE 810 CHARACTER(LEN=*), INTENT(IN) :: s0(:), s1 811 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: s2, s3, s4, s5, s6, s7, s8, s9 812 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:), tmp(:) 813 INTEGER :: nc 814 nc = SIZE(s0) 815 tmp = horzcat_s00(s0(nc), s1, s2, s3, s4, s5, s6, s7, s8, s9) 816 out = [s0(1:nc-1), tmp] 817 END FUNCTION horzcat_s10 818 !============================================================================================================================== 819 FUNCTION horzcat_s11(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 820 IMPLICIT NONE 821 CHARACTER(LEN=*), INTENT(IN) :: s0(:) 822 CHARACTER(LEN=*), OPTIONAL, TARGET, INTENT(IN) :: s1(:), s2(:), s3(:), s4(:), s5(:), s6(:), s7(:), s8(:), s9(:) 739 823 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:,:) 740 !------------------------------------------------------------------------------------------------------------------------------741 824 CHARACTER(LEN=maxlen), POINTER :: s(:) 742 LOGICAL :: lv(10) 743 INTEGER :: nrow, ncol, iv, n 744 lv = [ .TRUE. , PRESENT(s1), PRESENT(s2), PRESENT(s3), PRESENT(s4) , & 745 PRESENT(s5), PRESENT(s6), PRESENT(s7), PRESENT(s8), PRESENT(s9) ] 746 nrow = SIZE(s0); ncol=COUNT(lv) 825 INTEGER :: nrow, ncol, iv, n 826 LOGICAL :: pre(9) 827 !------------------------------------------------------------------------------------------------------------------------------ 828 pre(:) = [PRESENT(s1),PRESENT(s2),PRESENT(s3),PRESENT(s4),PRESENT(s5),PRESENT(s6),PRESENT(s7),PRESENT(s8),PRESENT(s9)] 829 nrow = SIZE(s0) 830 ncol = 1+COUNT(pre) 747 831 ALLOCATE(out(nrow, ncol)) 748 DO iv=1, ncol 749 SELECT CASE(iv) 750 CASE(1); s=> s0; CASE(2); s=> s1; CASE(3); s=> s2; CASE(4); s=> s3; CASE(5); s=> s4 751 CASE(6); s=> s5; CASE(7); s=> s6; CASE(8); s=> s7; CASE(9); s=> s8; CASE(10);s=> s9 832 out(:,1) = s0 833 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 834 SELECT CASE(iv-1) 835 CASE(1); s=> s1; CASE(2); s=> s2; CASE(3); s=> s3; CASE(4); s=> s4; CASE(5); s=> s5 836 CASE(6); s=> s6; CASE(7); s=> s7; CASE(8); s=> s8; CASE(9); s=> s9 752 837 END SELECT 753 838 n = SIZE(s, DIM=1) 754 IF(n /=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF839 IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF 755 840 out(:,iv) = s(:) 756 841 END DO 757 END FUNCTION horzcat_sm 758 !============================================================================================================================== 759 FUNCTION horzcat_i1(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 760 INTEGER, TARGET, INTENT(IN) :: i0 842 END FUNCTION horzcat_s11 843 !============================================================================================================================== 844 FUNCTION horzcat_s21(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out) 845 IMPLICIT NONE 846 CHARACTER(LEN=*), INTENT(IN) :: s0(:,:), s1(:) 847 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: s2(:), s3(:), s4(:), s5(:), s6(:), s7(:), s8(:), s9(:) 848 CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:,:), tmp(:,:) 849 INTEGER :: nc 850 nc = SIZE(s0, 2) 851 tmp = horzcat_s11(s0(:,nc), s1, s2, s3, s4, s5, s6, s7, s8, s9) 852 out = RESHAPE([PACK(s0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(s0, 1), nc + SIZE(tmp, 2)-1]) 853 END FUNCTION horzcat_s21 854 !============================================================================================================================== 855 FUNCTION horzcat_i00(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 856 IMPLICIT NONE 857 INTEGER, INTENT(IN) :: i0 761 858 INTEGER, OPTIONAL, TARGET, INTENT(IN) :: i1, i2, i3, i4, i5, i6, i7, i8, i9 762 859 INTEGER, ALLOCATABLE :: out(:) 763 !------------------------------------------------------------------------------------------------------------------------------764 860 INTEGER, POINTER :: i 765 LOGICAL :: lv(10) 766 INTEGER :: iv 767 lv = [ .TRUE. , PRESENT(i1), PRESENT(i2), PRESENT(i3), PRESENT(i4) , & 768 PRESENT(i5), PRESENT(i6), PRESENT(i7), PRESENT(i8), PRESENT(i9) ] 769 ALLOCATE(out(COUNT(lv))) 770 DO iv=1, COUNT(lv) 771 SELECT CASE(iv) 772 CASE(1); i=> i0; CASE(2); i=> i1; CASE(3); i=> i2; CASE(4); i=> i3; CASE(5); i=> i4 773 CASE(6); i=> i5; CASE(7); i=> i6; CASE(8); i=> i7; CASE(9); i=> i8; CASE(10);i=> i9 861 INTEGER :: ncol, iv 862 LOGICAL :: pre(9) 863 !------------------------------------------------------------------------------------------------------------------------------ 864 pre(:) = [PRESENT(i1),PRESENT(i2),PRESENT(i3),PRESENT(i4),PRESENT(i5),PRESENT(i6),PRESENT(i7),PRESENT(i8),PRESENT(i9)] 865 ncol = SIZE(pre) 866 ALLOCATE(out(ncol)) 867 out(1) = i0 868 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 869 SELECT CASE(iv-1) 870 CASE(1); i=> i1; CASE(2); i=> i2; CASE(3); i=> i3; CASE(4); i=> i4; CASE(5); i=> i5 871 CASE(6); i=> i6; CASE(7); i=> i7; CASE(8); i=> i8; CASE(9); i=> i9 774 872 END SELECT 775 873 out(iv) = i 776 874 END DO 777 END FUNCTION horzcat_i1 778 !============================================================================================================================== 779 FUNCTION horzcat_im(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 780 INTEGER, TARGET, DIMENSION(:), INTENT(IN) :: i0 781 INTEGER, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: i1, i2, i3, i4, i5, i6, i7, i8, i9 875 END FUNCTION horzcat_i00 876 !============================================================================================================================== 877 FUNCTION horzcat_i10(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 878 IMPLICIT NONE 879 INTEGER, INTENT(IN) :: i0(:), i1 880 INTEGER, OPTIONAL, INTENT(IN) :: i2, i3, i4, i5, i6, i7, i8, i9 881 INTEGER, ALLOCATABLE :: out(:), tmp(:) 882 INTEGER :: nc 883 nc = SIZE(i0) 884 tmp = horzcat_i00(i0(nc), i1, i2, i3, i4, i5, i6, i7, i8, i9) 885 out = [i0(1:nc-1), tmp] 886 END FUNCTION horzcat_i10 887 !============================================================================================================================== 888 FUNCTION horzcat_i11(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 889 IMPLICIT NONE 890 INTEGER, INTENT(IN) :: i0(:) 891 INTEGER, OPTIONAL, TARGET, INTENT(IN) :: i1(:), i2(:), i3(:), i4(:), i5(:), i6(:), i7(:), i8(:), i9(:) 782 892 INTEGER, ALLOCATABLE :: out(:,:) 783 !------------------------------------------------------------------------------------------------------------------------------784 893 INTEGER, POINTER :: i(:) 785 LOGICAL :: lv(10) 786 INTEGER :: nrow, ncol, iv, n 787 lv = [ .TRUE. , PRESENT(i1), PRESENT(i2), PRESENT(i3), PRESENT(i4) , & 788 PRESENT(i5), PRESENT(i6), PRESENT(i7), PRESENT(i8), PRESENT(i9) ] 789 nrow = SIZE(i0); ncol=COUNT(lv) 894 INTEGER :: nrow, ncol, iv, n 895 LOGICAL :: pre(9) 896 !------------------------------------------------------------------------------------------------------------------------------ 897 pre(:) = [PRESENT(i1),PRESENT(i2),PRESENT(i3),PRESENT(i4),PRESENT(i5),PRESENT(i6),PRESENT(i7),PRESENT(i8),PRESENT(i9)] 898 nrow = SIZE(i0) 899 ncol = 1+COUNT(pre) 790 900 ALLOCATE(out(nrow, ncol)) 791 DO iv=1, ncol 792 SELECT CASE(iv) 793 CASE(1); i=> i0; CASE(2); i=> i1; CASE(3); i=> i2; CASE(4); i=> i3; CASE(5); i=> i4 794 CASE(6); i=> i5; CASE(7); i=> i6; CASE(8); i=> i7; CASE(9); i=> i8; CASE(10);i=> i9 901 out(:,1) = i0 902 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 903 SELECT CASE(iv-1) 904 CASE(1); i=> i1; CASE(2); i=> i2; CASE(3); i=> i3; CASE(4); i=> i4; CASE(5); i=> i5 905 CASE(6); i=> i6; CASE(7); i=> i7; CASE(8); i=> i8; CASE(9); i=> i9 795 906 END SELECT 796 907 n = SIZE(i, DIM=1) 797 IF(n /=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF908 IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF 798 909 out(:,iv) = i(:) 799 910 END DO 800 END FUNCTION horzcat_im 801 !============================================================================================================================== 802 FUNCTION horzcat_r1(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 803 REAL, TARGET, INTENT(IN) :: r0 911 END FUNCTION horzcat_i11 912 !============================================================================================================================== 913 FUNCTION horzcat_i21(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out) 914 IMPLICIT NONE 915 INTEGER, INTENT(IN) :: i0(:,:), i1(:) 916 INTEGER, OPTIONAL, INTENT(IN) :: i2(:), i3(:), i4(:), i5(:), i6(:), i7(:), i8(:), i9(:) 917 INTEGER, ALLOCATABLE :: out(:,:), tmp(:,:) 918 INTEGER :: nc 919 nc = SIZE(i0, 2) 920 tmp = horzcat_i11(i0(:,nc), i1, i2, i3, i4, i5, i6, i7, i8, i9) 921 out = RESHAPE([PACK(i0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(i0, 1), nc + SIZE(tmp, 2)-1]) 922 END FUNCTION horzcat_i21 923 !============================================================================================================================== 924 FUNCTION horzcat_r00(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 925 IMPLICIT NONE 926 REAL, INTENT(IN) :: r0 804 927 REAL, OPTIONAL, TARGET, INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9 805 928 REAL, ALLOCATABLE :: out(:) 806 !------------------------------------------------------------------------------------------------------------------------------807 929 REAL, POINTER :: r 808 LOGICAL :: lv(10) 809 INTEGER :: iv 810 lv = [ .TRUE. , PRESENT(r1), PRESENT(r2), PRESENT(r3), PRESENT(r4) , & 811 PRESENT(r5), PRESENT(r6), PRESENT(r7), PRESENT(r8), PRESENT(r9) ] 812 ALLOCATE(out(COUNT(lv))) 813 DO iv=1, COUNT(lv) 814 SELECT CASE(iv) 815 CASE(1); r=> r0; CASE(2); r=> r1; CASE(3); r=> r2; CASE(4); r=> r3; CASE(5); r=> r4 816 CASE(6); r=> r5; CASE(7); r=> r6; CASE(8); r=> r7; CASE(9); r=> r8; CASE(10);r=> r9 930 INTEGER :: ncol, iv 931 LOGICAL :: pre(9) 932 !------------------------------------------------------------------------------------------------------------------------------ 933 pre(:) = [PRESENT(r1),PRESENT(r2),PRESENT(r3),PRESENT(r4),PRESENT(r5),PRESENT(r6),PRESENT(r7),PRESENT(r8),PRESENT(r9)] 934 ncol = 1+COUNT(pre) 935 ALLOCATE(out(ncol)) 936 out(1) = r0 937 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 938 SELECT CASE(iv-1) 939 CASE(1); r=> r1; CASE(2); r=> r2; CASE(3); r=> r3; CASE(4); r=> r4; CASE(5); r=> r5 940 CASE(6); r=> r6; CASE(7); r=> r7; CASE(8); r=> r8; CASE(9); r=> r9 817 941 END SELECT 818 942 out(iv) = r 819 943 END DO 820 END FUNCTION horzcat_r1 821 !============================================================================================================================== 822 FUNCTION horzcat_rm(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 823 REAL, TARGET, DIMENSION(:), INTENT(IN) :: r0 824 REAL, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9 944 END FUNCTION horzcat_r00 945 !============================================================================================================================== 946 FUNCTION horzcat_r10(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 947 IMPLICIT NONE 948 REAL, INTENT(IN) :: r0(:), r1 949 REAL, OPTIONAL, INTENT(IN) :: r2, r3, r4, r5, r6, r7, r8, r9 950 REAL, ALLOCATABLE :: out(:), tmp(:) 951 INTEGER :: nc 952 nc = SIZE(r0) 953 tmp = horzcat_r00(r0(nc), r1, r2, r3, r4, r5, r6, r7, r8, r9) 954 out = [r0(1:nc-1), tmp] 955 END FUNCTION horzcat_r10 956 !============================================================================================================================== 957 FUNCTION horzcat_r11(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 958 IMPLICIT NONE 959 REAL, INTENT(IN) :: r0(:) 960 REAL, OPTIONAL, TARGET, INTENT(IN) :: r1(:), r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:) 825 961 REAL, ALLOCATABLE :: out(:,:) 826 !------------------------------------------------------------------------------------------------------------------------------827 962 REAL, POINTER :: r(:) 828 LOGICAL :: lv(10) 829 INTEGER :: nrow, ncol, iv, n 830 lv = [ .TRUE. , PRESENT(r1), PRESENT(r2), PRESENT(r3), PRESENT(r4) , & 831 PRESENT(r5), PRESENT(r6), PRESENT(r7), PRESENT(r8), PRESENT(r9) ] 832 nrow = SIZE(r0); ncol=COUNT(lv) 963 INTEGER :: nrow, ncol, iv, n 964 LOGICAL :: pre(9) 965 !------------------------------------------------------------------------------------------------------------------------------ 966 pre(:) = [PRESENT(r1),PRESENT(r2),PRESENT(r3),PRESENT(r4),PRESENT(r5),PRESENT(r6),PRESENT(r7),PRESENT(r8),PRESENT(r9)] 967 nrow = SIZE(r0) 968 ncol = 1+COUNT(pre) 833 969 ALLOCATE(out(nrow, ncol)) 834 DO iv=1, ncol 835 SELECT CASE(iv) 836 CASE(1); r=> r0; CASE(2); r=> r1; CASE(3); r=> r2; CASE(4); r=> r3; CASE(5); r=> r4 837 CASE(6); r=> r5; CASE(7); r=> r6; CASE(8); r=> r7; CASE(9); r=> r8; CASE(10);r=> r9 970 out(:,1) = r0 971 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 972 SELECT CASE(iv-1) 973 CASE(1); r=> r1; CASE(2); r=> r2; CASE(3); r=> r3; CASE(4); r=> r4; CASE(5); r=> r5 974 CASE(6); r=> r5; CASE(7); r=> r7; CASE(8); r=> r8; CASE(9); r=> r9 838 975 END SELECT 839 976 n = SIZE(r, DIM=1) 840 IF(n /=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF977 IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF 841 978 out(:,iv) = r(:) 842 979 END DO 843 END FUNCTION horzcat_rm 844 !============================================================================================================================== 845 FUNCTION horzcat_d1(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 846 DOUBLE PRECISION, TARGET, INTENT(IN) :: d0 980 END FUNCTION horzcat_r11 981 !============================================================================================================================== 982 FUNCTION horzcat_r21(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out) 983 IMPLICIT NONE 984 REAL, INTENT(IN) :: r0(:,:), r1(:) 985 REAL, OPTIONAL, INTENT(IN) :: r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:) 986 REAL, ALLOCATABLE :: out(:,:), tmp(:,:) 987 INTEGER :: nc 988 nc = SIZE(r0, 2) 989 tmp = horzcat_r11(r0(:,nc), r1, r2, r3, r4, r5, r6, r7, r8, r9) 990 out = RESHAPE([PACK(r0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(r0, 1), nc + SIZE(tmp, 2)-1]) 991 END FUNCTION horzcat_r21 992 !============================================================================================================================== 993 FUNCTION horzcat_d00(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 994 IMPLICIT NONE 995 DOUBLE PRECISION, INTENT(IN) :: d0 847 996 DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d9 848 997 DOUBLE PRECISION, ALLOCATABLE :: out(:) 849 !------------------------------------------------------------------------------------------------------------------------------850 998 DOUBLE PRECISION, POINTER :: d 851 LOGICAL :: lv(10) 852 INTEGER :: iv 853 lv = [ .TRUE. , PRESENT(d1), PRESENT(d2), PRESENT(d3), PRESENT(d4) , & 854 PRESENT(d5), PRESENT(d6), PRESENT(d7), PRESENT(d8), PRESENT(d9) ] 855 ALLOCATE(out(COUNT(lv))) 856 DO iv=1, COUNT(lv) 857 SELECT CASE(iv) 858 CASE(1); d=> d0; CASE(2); d=> d1; CASE(3); d=> d2; CASE(4); d=> d3; CASE(5); d=> d4 859 CASE(6); d=> d5; CASE(7); d=> d6; CASE(8); d=> d7; CASE(9); d=> d8; CASE(10);d=> d9 999 INTEGER :: ncol, iv 1000 LOGICAL :: pre(9) 1001 !------------------------------------------------------------------------------------------------------------------------------ 1002 pre(:) = [PRESENT(d1),PRESENT(d2),PRESENT(d3),PRESENT(d4),PRESENT(d5),PRESENT(d6),PRESENT(d7),PRESENT(d8),PRESENT(d9)] 1003 ncol = 1+COUNT(pre) 1004 ALLOCATE(out(ncol)) 1005 out(1) = d0 1006 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 1007 SELECT CASE(iv-1) 1008 CASE(1); d=> d1; CASE(2); d=> d2; CASE(3); d=> d3; CASE(4); d=> d4; CASE(5); d=> d5 1009 CASE(6); d=> d6; CASE(7); d=> d7; CASE(8); d=> d8; CASE(9); d=> d9 860 1010 END SELECT 861 1011 out(iv) = d 862 1012 END DO 863 END FUNCTION horzcat_d1 864 !============================================================================================================================== 865 FUNCTION horzcat_dm(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 866 DOUBLE PRECISION, TARGET, DIMENSION(:), INTENT(IN) :: d0 867 DOUBLE PRECISION, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d9 1013 END FUNCTION horzcat_d00 1014 !============================================================================================================================== 1015 FUNCTION horzcat_d10(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1016 IMPLICIT NONE 1017 DOUBLE PRECISION, INTENT(IN) :: d0(:), d1 1018 DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2, d3, d4, d5, d6, d7, d8, d9 1019 DOUBLE PRECISION, ALLOCATABLE :: out(:), tmp(:) 1020 INTEGER :: nc 1021 nc = SIZE(d0) 1022 tmp = horzcat_d00(d0(nc), d1, d2, d3, d4, d5, d6, d7, d8, d9) 1023 out = [d0(1:nc-1), tmp] 1024 END FUNCTION horzcat_d10 1025 !============================================================================================================================== 1026 FUNCTION horzcat_d11(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1027 IMPLICIT NONE 1028 DOUBLE PRECISION, INTENT(IN) :: d0(:) 1029 DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1(:), d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:) 868 1030 DOUBLE PRECISION, ALLOCATABLE :: out(:,:) 869 !------------------------------------------------------------------------------------------------------------------------------870 1031 DOUBLE PRECISION, POINTER :: d(:) 871 LOGICAL :: lv(10) 872 INTEGER :: nrow, ncol, iv, n 873 lv = [ .TRUE. , PRESENT(d1), PRESENT(d2), PRESENT(d3), PRESENT(d4) , & 874 PRESENT(d5), PRESENT(d6), PRESENT(d7), PRESENT(d8), PRESENT(d9) ] 875 nrow = SIZE(d0); ncol=COUNT(lv) 1032 INTEGER :: nrow, ncol, iv, n 1033 LOGICAL :: pre(9) 1034 !------------------------------------------------------------------------------------------------------------------------------ 1035 nrow = SIZE(d0) 1036 pre(:) = [PRESENT(d1),PRESENT(d2),PRESENT(d3),PRESENT(d4),PRESENT(d5),PRESENT(d6),PRESENT(d7),PRESENT(d8),PRESENT(d9)] 1037 ncol = 1+COUNT(pre) 876 1038 ALLOCATE(out(nrow, ncol)) 877 DO iv =1, ncol878 SELECT CASE(iv )879 CASE(1); d=> d 0; CASE(2); d=> d1; CASE(3); d=> d2; CASE(4); d=> d3; CASE(5); d=> d4880 CASE(6); d=> d 5; CASE(7); d=> d6; CASE(8); d=> d7; CASE(9); d=> d8; CASE(10);d=> d91039 DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE 1040 SELECT CASE(iv-1) 1041 CASE(1); d=> d1; CASE(2); d=> d2; CASE(3); d=> d3; CASE(4); d=> d4; CASE(5); d=> d5 1042 CASE(6); d=> d6; CASE(7); d=> d7; CASE(8); d=> d8; CASE(9); d=> d9 881 1043 END SELECT 882 1044 n = SIZE(d, DIM=1) 883 IF(n /=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF1045 IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF 884 1046 out(:,iv) = d(:) 885 1047 END DO 886 END FUNCTION horzcat_dm 1048 END FUNCTION horzcat_d11 1049 !============================================================================================================================== 1050 FUNCTION horzcat_d21(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out) 1051 IMPLICIT NONE 1052 DOUBLE PRECISION, INTENT(IN) :: d0(:,:), d1(:) 1053 DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:) 1054 DOUBLE PRECISION, ALLOCATABLE :: out(:,:), tmp(:,:) 1055 INTEGER :: nc 1056 nc = SIZE(d0, 2) 1057 tmp = horzcat_d11(d0(:,nc), d1, d2, d3, d4, d5, d6, d7, d8, d9) 1058 out = RESHAPE([PACK(d0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(d0, 1), nc + SIZE(tmp, 2)-1]) 1059 END FUNCTION horzcat_d21 887 1060 !============================================================================================================================== 888 1061 … … 896 1069 !============================================================================================================================== 897 1070 LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nRowMax, nColMax, nHead, unit, sub) RESULT(lerr) 1071 IMPLICIT NONE 898 1072 CHARACTER(LEN=*), INTENT(IN) :: p !--- DISPLAY MAP: s/i/r 899 1073 CHARACTER(LEN=*), INTENT(IN) :: titles(:) !--- TITLES (ONE EACH COLUMN) … … 1004 1178 !============================================================================================================================== 1005 1179 LOGICAL FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr) 1180 IMPLICIT NONE 1006 1181 INTEGER, INTENT(IN) :: unt !--- Output unit 1007 1182 CHARACTER(LEN=*), INTENT(IN) :: p !--- DISPLAY MAP: s/i/r … … 1086 1261 !============================================================================================================================== 1087 1262 LOGICAL FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr) 1263 IMPLICIT NONE 1088 1264 ! Display outliers list in tables 1089 1265 ! If "nam" is supplied, it means the last index is for tracers => one table each tracer for rank > 2. … … 1115 1291 1116 1292 rk = SIZE(n); nv = SIZE(vnm) 1117 IF(test(fmsg('SIZE(nam) /= 1 and /= last "n" element', sub, nv /= 1 .AND. nv /= n(rk), unt),lerr)) RETURN1118 IF(test(fmsg('ll" and "a" sizes mismatch', sub, SIZE(a) /= SIZE(ll), unt),lerr)) RETURN1119 IF(test(fmsg('profile "n" does not match "a" and "ll', sub, SIZE(a) /= PRODUCT(n), unt),lerr)) RETURN1293 lerr = nv/=1 .AND. nv/=n(rk); CALL msg('SIZE(nam) /= 1 and /= last "n" element', sub, lerr); IF(lerr) RETURN 1294 lerr = SIZE(a) /= SIZE(ll); CALL msg('ll" and "a" sizes mismatch', sub, lerr); IF(lerr) RETURN 1295 lerr = SIZE(a) /= PRODUCT(n); CALL msg('profile "n" does not match "a" and "ll', sub, lerr); IF(lerr) RETURN 1120 1296 CALL msg(mes, sub, unit=unt) 1121 1297 … … 1164 1340 !============================================================================================================================== 1165 1341 LOGICAL FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr) 1342 IMPLICIT NONE 1166 1343 ! Display outliers list in tables 1167 1344 ! If "nam" is supplied and, it means the last index is for tracers => one table each tracer for rank > 2. … … 1221 1398 !============================================================================================================================== 1222 1399 LOGICAL FUNCTION reduceExpr_1(str, val) RESULT(lerr) 1400 IMPLICIT NONE 1223 1401 CHARACTER(LEN=*), INTENT(IN) :: str 1224 1402 CHARACTER(LEN=maxlen), INTENT(OUT) :: val … … 1254 1432 DO WHILE(nl > 1) 1255 1433 i = 1; DO WHILE(ip(i) /= 1 .OR. ip(i+1) /= 2); i = i + 1; END DO !IF(i > SIZE(ip)+1) EXIT;END DO 1256 IF(test(reduceExpr_basic(vl(i+1), v), lerr)) RETURN1434 lerr = reduceExpr_basic(vl(i+1), v); IF(lerr) RETURN 1257 1435 v = TRIM(vl(i))//TRIM(v); IF(i+2<=nl) v=TRIM(v)//TRIM(vl(i+2)) 1258 1436 vv = v//REPEAT(' ',768) … … 1270 1448 !============================================================================================================================== 1271 1449 LOGICAL FUNCTION reduceExpr_basic(str, val) RESULT(lerr) 1450 IMPLICIT NONE 1272 1451 CHARACTER(LEN=*), INTENT(IN) :: str 1273 1452 CHARACTER(LEN=*), INTENT(OUT) :: val … … 1284 1463 op = ['^','/','*','+','-'] !--- List of recognized operations 1285 1464 s = str 1286 IF(test(strParse_m(s, op, ky, lSc=.TRUE., id = id), lerr)) RETURN !--- Parse the values 1465 lerr = strParse_m(s, op, ky, lSc=.TRUE., id = id) !--- Parse the values 1466 IF(lerr) RETURN !--- Problem with the parsing 1287 1467 vl = str2dble(ky) !--- Conversion to doubles 1288 1468 lerr = ANY(vl >= HUGE(1.d0)) 1289 IF(fmsg('Some values are non-numeric in: '//TRIM(s), ll=lerr)) RETURN !--- Non-numerical values found 1469 CALL msg('Some values are non-numeric in: '//TRIM(s), ll=lerr) 1470 IF(lerr) RETURN !--- Non-numerical values found 1290 1471 DO io = 1, SIZE(op) !--- Loop on known operators (order matters !) 1291 1472 DO i = SIZE(id), 1, -1 !--- Loop on found operators … … 1293 1474 IF(id(i) /= io) CYCLE !--- Current found operator is not op(io) 1294 1475 vm = vl(i); vp = vl(i+1) !--- Couple of values used for current operation 1295 SELECT CASE(op(io)) 1476 SELECT CASE(op(io)) !--- Perform operation on the two values 1296 1477 CASE('^'); v = vm**vp 1297 1478 CASE('/'); v = vm/vp … … 1311 1492 !============================================================================================================================== 1312 1493 FUNCTION reduceExpr_m(str, val) RESULT(lerr) 1494 IMPLICIT NONE 1313 1495 LOGICAL, ALLOCATABLE :: lerr(:) 1314 1496 CHARACTER(LEN=*), INTENT(IN) :: str(:) … … 1326 1508 !============================================================================================================================== 1327 1509 ELEMENTAL LOGICAL FUNCTION is_numeric(str) RESULT(out) 1510 IMPLICIT NONE 1328 1511 CHARACTER(LEN=*), INTENT(IN) :: str 1329 1512 REAL :: x … … 1357 1540 !============================================================================================================================== 1358 1541 ELEMENTAL INTEGER FUNCTION str2int(str) RESULT(out) 1542 IMPLICIT NONE 1359 1543 CHARACTER(LEN=*), INTENT(IN) :: str 1360 1544 INTEGER :: ierr … … 1364 1548 !============================================================================================================================== 1365 1549 ELEMENTAL REAL FUNCTION str2real(str) RESULT(out) 1550 IMPLICIT NONE 1366 1551 CHARACTER(LEN=*), INTENT(IN) :: str 1367 1552 INTEGER :: ierr … … 1371 1556 !============================================================================================================================== 1372 1557 ELEMENTAL DOUBLE PRECISION FUNCTION str2dble(str) RESULT(out) 1558 IMPLICIT NONE 1373 1559 CHARACTER(LEN=*), INTENT(IN) :: str 1374 1560 INTEGER :: ierr … … 1378 1564 !============================================================================================================================== 1379 1565 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION bool2str(b) RESULT(out) 1566 IMPLICIT NONE 1380 1567 LOGICAL, INTENT(IN) :: b 1381 1568 WRITE(out,*)b … … 1384 1571 !============================================================================================================================== 1385 1572 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION int2str(i, nDigits) RESULT(out) 1573 IMPLICIT NONE 1386 1574 INTEGER, INTENT(IN) :: i 1387 1575 INTEGER, OPTIONAL, INTENT(IN) :: nDigits … … 1394 1582 !============================================================================================================================== 1395 1583 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out) 1584 IMPLICIT NONE 1396 1585 REAL, INTENT(IN) :: r 1397 1586 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt … … 1403 1592 !============================================================================================================================== 1404 1593 ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out) 1594 IMPLICIT NONE 1405 1595 DOUBLE PRECISION, INTENT(IN) :: d 1406 1596 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt … … 1412 1602 !============================================================================================================================== 1413 1603 ELEMENTAL SUBROUTINE cleanZeros(s) 1604 IMPLICIT NONE 1414 1605 CHARACTER(LEN=*), INTENT(INOUT) :: s 1415 1606 INTEGER :: ls, ix, i … … 1429 1620 !============================================================================================================================== 1430 1621 FUNCTION addQuotes_1(s) RESULT(out) 1622 IMPLICIT NONE 1431 1623 CHARACTER(LEN=*), INTENT(IN) :: s 1432 1624 CHARACTER(LEN=:), ALLOCATABLE :: out … … 1435 1627 !============================================================================================================================== 1436 1628 FUNCTION addQuotes_m(s) RESULT(out) 1629 IMPLICIT NONE 1437 1630 CHARACTER(LEN=*), INTENT(IN) :: s(:) 1438 1631 CHARACTER(LEN=:), ALLOCATABLE :: out(:) … … 1447 1640 !============================================================================================================================== 1448 1641 ELEMENTAL LOGICAL FUNCTION needQuotes(s) RESULT(out) 1642 IMPLICIT NONE 1449 1643 CHARACTER(LEN=*), INTENT(IN) :: s 1450 1644 CHARACTER(LEN=1) :: b, e … … 1461 1655 !============================================================================================================================== 1462 1656 LOGICAL FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out) 1657 IMPLICIT NONE 1463 1658 ! Purpose: Messages in case a list contains wrong elements (indicated by lerr boolean vector). 1464 1659 ! Note: Return value "out" is .TRUE. if there are errors (ie at least one element of "lerr" is TRUE). … … 1483 1678 !============================================================================================================================== 1484 1679 SUBROUTINE removeComment(str) 1680 IMPLICIT NONE 1485 1681 CHARACTER(LEN=*), INTENT(INOUT) :: str 1486 1682 INTEGER :: ix
Note: See TracChangeset
for help on using the changeset viewer.