Changeset 12080 for utils/tools/SIREN/src/dimension.f90
- Timestamp:
- 2019-12-06T10:30:14+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
utils/tools/SIREN/src/dimension.f90
r9598 r12080 2 2 ! NEMO system team, System and Interface for oceanic RElocable Nesting 3 3 !---------------------------------------------------------------------- 4 !5 ! MODULE: dim6 4 ! 7 5 ! DESCRIPTION: … … 152 150 !> 153 151 !> @author J.Paul 154 ! REVISION HISTORY:152 !> 155 153 !> @date November, 2013 - Initial Version 156 !> @date S petember, 2015154 !> @date September, 2015 157 155 !> - manage useless (dummy) dimension 158 156 !> @date October, 2016 159 157 !> - dimension allowed read in configuration file 160 !> 161 !> @note Software governed by the CeCILL licence (./LICENSE) 158 !> @date May, 2019 159 !> - read number of element for each dimension allowed in configuration file 160 !> - read number of element for each dummy array in configuration file 161 !> 162 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 162 163 !---------------------------------------------------------------------- 163 164 MODULE dim 165 164 166 USE global ! global variable 165 167 USE kind ! F90 kind parameter 166 168 USE logger ! log file manager 167 169 USE fct ! basic useful function 170 168 171 IMPLICIT NONE 169 172 ! NOTE_avoid_public_variables_if_possible … … 172 175 PUBLIC :: TDIM !< dimension structure 173 176 177 PRIVATE :: im_ndumdim !< number of elt in dummy dimension array 174 178 PRIVATE :: cm_dumdim !< dummy dimension array 179 PRIVATE :: im_dimX !< number of elt in x dimension array 180 PRIVATE :: im_dimY !< number of elt in y dimension array 181 PRIVATE :: im_dimZ !< number of elt in z dimension array 182 PRIVATE :: im_dimT !< number of elt in t dimension array 175 183 PRIVATE :: cm_dimX !< x dimension array 176 184 PRIVATE :: cm_dimY !< y dimension array … … 223 231 END TYPE 224 232 225 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumdim !< dummy dimension 226 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimX !< x dimension 227 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimY !< y dimension 228 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimZ !< z dimension 229 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimT !< t dimension 233 INTEGER(i4) , SAVE :: im_ndumdim !< number of elt in dummy dimension array 234 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumdim !< dummy dimension 235 INTEGER(i4) , SAVE :: im_dimX !< number of elt in x dimension array 236 INTEGER(i4) , SAVE :: im_dimY !< number of elt in y dimension array 237 INTEGER(i4) , SAVE :: im_dimZ !< number of elt in z dimension array 238 INTEGER(i4) , SAVE :: im_dimT !< number of elt in t dimension array 239 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimX !< x dimension 240 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimY !< y dimension 241 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimZ !< z dimension 242 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg), SAVE :: cm_dimT !< t dimension 230 243 231 244 INTERFACE dim_print … … 265 278 266 279 CONTAINS 280 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 281 FUNCTION dim__copy_arr(td_dim) & 282 & RESULT (tf_dim) 267 283 !------------------------------------------------------------------- 268 284 !> @brief … … 283 299 !> @return copy of input array of dimension structure 284 300 !------------------------------------------------------------------- 285 FUNCTION dim__copy_arr( td_dim ) 286 IMPLICIT NONE 301 302 IMPLICIT NONE 303 287 304 ! Argument 288 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 305 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 306 289 307 ! function 290 TYPE(TDIM), DIMENSION(SIZE(td_dim(:))) :: dim__copy_arr308 TYPE(TDIM), DIMENSION(SIZE(td_dim(:))) :: tf_dim 291 309 292 310 ! local variable … … 296 314 297 315 DO ji=1,SIZE(td_dim(:)) 298 dim__copy_arr(ji)=dim_copy(td_dim(ji))316 tf_dim(ji)=dim_copy(td_dim(ji)) 299 317 ENDDO 300 318 301 319 END FUNCTION dim__copy_arr 320 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 321 FUNCTION dim__copy_unit(td_dim) & 322 & RESULT (tf_dim) 302 323 !------------------------------------------------------------------- 303 324 !> @brief … … 318 339 !> @return copy of input dimension structure 319 340 !------------------------------------------------------------------- 320 FUNCTION dim__copy_unit( td_dim ) 321 IMPLICIT NONE 341 342 IMPLICIT NONE 343 322 344 ! Argument 323 345 TYPE(TDIM), INTENT(IN) :: td_dim 346 324 347 ! function 325 TYPE(TDIM) :: dim__copy_unit348 TYPE(TDIM) :: tf_dim 326 349 327 350 ! local variable 328 351 !---------------------------------------------------------------- 329 352 330 dim__copy_unit=td_dim353 tf_dim=td_dim 331 354 332 355 END FUNCTION dim__copy_unit 356 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 FUNCTION dim_get_index(td_dim, cd_name, cd_sname) & 358 & RESULT (if_idx) 333 359 !------------------------------------------------------------------- 334 360 !> @brief This function returns dimension index, … … 349 375 !> @return dimension index 350 376 !------------------------------------------------------------------- 351 INTEGER(i4) FUNCTION dim_get_index( td_dim, cd_name, cd_sname ) 352 IMPLICIT NONE 377 378 IMPLICIT NONE 379 353 380 ! Argument 354 381 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 355 382 CHARACTER(LEN=*), INTENT(IN) :: cd_name 356 383 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 384 385 ! function 386 INTEGER(i4) :: if_idx 357 387 358 388 ! local variable … … 366 396 ! loop indices 367 397 INTEGER(i4) :: ji 368 INTEGER(i4) :: jj369 398 !---------------------------------------------------------------- 370 399 ! init 371 dim_get_index=0400 if_idx=0 372 401 373 402 il_ndim=SIZE(td_dim(:)) … … 376 405 cl_name=fct_lower(cd_name) 377 406 ! check if dimension is in array of dimension structure 378 jj=0379 407 DO ji=1,il_ndim 380 408 cl_dim_name=fct_lower(td_dim(ji)%c_name) 381 409 IF( TRIM(cl_dim_name) == TRIM(cl_name) )THEN 382 dim_get_index=ji383 410 if_idx=ji 411 EXIT 384 412 ENDIF 385 413 ENDDO 386 414 387 415 ! look for dimension short name 388 IF( dim_get_index == 0 )THEN416 IF( if_idx == 0 )THEN 389 417 390 418 cl_sname=fct_lower(cd_name) 391 419 ! check if dimension is in array of dimension structure 392 jj=0393 420 DO ji=1,il_ndim 394 421 cl_dim_sname=fct_lower(td_dim(ji)%c_sname) 395 422 IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ) )THEN 396 423 CALL logger_debug("DIM GET INDEX: variable short name "//& 397 &TRIM(ADJUSTL(cd_name))//" already in file")398 dim_get_index=ji424 & TRIM(ADJUSTL(cd_name))//" already in file") 425 if_idx=ji 399 426 EXIT 400 427 ENDIF … … 405 432 ! look for dimension short name 406 433 IF( PRESENT(cd_sname) )THEN 407 IF( dim_get_index == 0 )THEN434 IF( if_idx == 0 )THEN 408 435 409 436 cl_sname=fct_lower(cd_sname) 410 437 ! check if dimension is in array of dimension structure 411 jj=0412 438 DO ji=1,il_ndim 413 439 cl_dim_sname=fct_lower(td_dim(ji)%c_sname) 414 440 IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ) )THEN 415 441 CALL logger_debug("DIM GET INDEX: variable short name "//& 416 &TRIM(ADJUSTL(cd_sname))//" already in file")417 dim_get_index=ji442 & TRIM(ADJUSTL(cd_sname))//" already in file") 443 if_idx=ji 418 444 EXIT 419 445 ENDIF … … 424 450 425 451 END FUNCTION dim_get_index 452 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 FUNCTION dim_get_id(td_dim, cd_name, cd_sname) & 454 & RESULT (if_id) 426 455 !------------------------------------------------------------------- 427 456 !> @brief This function returns dimension id, in a array of dimension structure, … … 437 466 !> @return dimension id 438 467 !------------------------------------------------------------------- 439 INTEGER(i4) FUNCTION dim_get_id( td_dim, cd_name, cd_sname ) 440 IMPLICIT NONE 468 469 IMPLICIT NONE 470 441 471 ! Argument 442 472 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 443 473 CHARACTER(LEN=*), INTENT(IN) :: cd_name 444 474 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 475 476 ! function 477 INTEGER(i4) :: if_id 445 478 446 479 ! local variable … … 457 490 !---------------------------------------------------------------- 458 491 ! init 459 dim_get_id=0492 if_id=0 460 493 461 494 il_ndim=SIZE(td_dim(:)) … … 470 503 & td_dim(ji)%l_use )THEN 471 504 IF( td_dim(ji)%i_id /= 0 )THEN 472 dim_get_id=td_dim(ji)%i_id505 if_id=td_dim(ji)%i_id 473 506 EXIT 474 507 ENDIF … … 477 510 478 511 ! look for dimension short name 479 IF( dim_get_id == 0 )THEN512 IF( if_id == 0 )THEN 480 513 481 514 cl_sname=fct_lower(cd_name) … … 487 520 & td_dim(ji)%l_use )THEN 488 521 IF( td_dim(ji)%i_id /= 0 )THEN 489 dim_get_id=td_dim(ji)%i_id522 if_id=td_dim(ji)%i_id 490 523 EXIT 491 524 ENDIF … … 497 530 ! look for dimension short name 498 531 IF( PRESENT(cd_sname) )THEN 499 IF( dim_get_id == 0 )THEN532 IF( if_id == 0 )THEN 500 533 501 534 cl_sname=fct_lower(cd_sname) … … 505 538 cl_dim_sname=fct_lower(td_dim(ji)%c_sname) 506 539 IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ).AND.& 507 &td_dim(ji)%l_use )THEN540 & td_dim(ji)%l_use )THEN 508 541 IF( td_dim(ji)%i_id /= 0 )THEN 509 dim_get_id=td_dim(ji)%i_id542 if_id=td_dim(ji)%i_id 510 543 EXIT 511 544 ENDIF … … 517 550 518 551 END FUNCTION dim_get_id 552 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 553 FUNCTION dim_init(cd_name, id_len, ld_uld, cd_sname, ld_use) & 554 & RESULT (tf_dim) 519 555 !------------------------------------------------------------------- 520 556 !> @brief This function initialize a dimension structure with given … … 533 569 !> - Bug fix: inform order to disorder table instead of disorder to order 534 570 !> table 535 ! 571 !> @date May, 2019 572 !> - use number of element for each dimention allowed, instead of while loop 573 !> 536 574 !> @param[in] cd_name dimension name 537 575 !> @param[in] id_len dimension length … … 541 579 !> @return dimension structure 542 580 !------------------------------------------------------------------- 543 TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname, ld_use ) 581 544 582 IMPLICIT NONE 545 583 … … 551 589 LOGICAL, INTENT(IN), OPTIONAL :: ld_use 552 590 591 ! function 592 TYPE(TDIM) :: tf_dim 593 553 594 ! local variable 554 595 CHARACTER(LEN=lc) :: cl_name … … 557 598 558 599 ! clean dimension 559 CALL dim_clean( dim_init)600 CALL dim_clean(tf_dim) 560 601 561 602 cl_name=fct_upper(cd_name) … … 563 604 CALL logger_debug( & 564 605 & " DIM INIT: dimension name: "//TRIM(cl_name) ) 565 dim_init%c_name=TRIM(ADJUSTL(cd_name))606 tf_dim%c_name=TRIM(ADJUSTL(cd_name)) 566 607 567 608 IF( PRESENT(id_len) )THEN 568 609 CALL logger_debug( & 569 610 & " DIM INIT: dimension length: "//fct_str(id_len) ) 570 dim_init%i_len=id_len611 tf_dim%i_len=id_len 571 612 ENDIF 572 613 573 614 ! define dimension is supposed to be used 574 615 IF( PRESENT(ld_use) )THEN 575 dim_init%l_use=ld_use616 tf_dim%l_use=ld_use 576 617 ELSE 577 dim_init%l_use=.TRUE.618 tf_dim%l_use=.TRUE. 578 619 ENDIF 579 620 … … 588 629 CALL logger_debug( & 589 630 & " DIM INIT: dimension short name: "//TRIM(cd_sname) ) 590 dim_init%c_sname=TRIM(cd_sname)631 tf_dim%c_sname=TRIM(cd_sname) 591 632 ELSE 592 633 CALL logger_warn("DIM INIT: invalid short name."//& … … 595 636 ENDIF 596 637 597 IF( TRIM(fct_lower( dim_init%c_sname)) == 'u' )THEN638 IF( TRIM(fct_lower(tf_dim%c_sname)) == 'u' )THEN 598 639 599 640 cl_name=fct_lower(cd_name) 600 641 601 IF( dim__is_allowed(TRIM(cl_name), cm_dimX(:) ) )THEN602 dim_init%c_sname='x'603 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimY(:) ) )THEN604 dim_init%c_sname='y'605 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimZ(:) ) )THEN606 dim_init%c_sname='z'607 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimT(:) ) )THEN608 dim_init%c_sname='t'642 IF( dim__is_allowed(TRIM(cl_name), cm_dimX(:), im_dimX) )THEN 643 tf_dim%c_sname='x' 644 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimY(:), im_dimY) )THEN 645 tf_dim%c_sname='y' 646 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimZ(:), im_dimZ) )THEN 647 tf_dim%c_sname='z' 648 ELSEIF( dim__is_allowed(TRIM(cl_name), cm_dimT(:), im_dimT) )THEN 649 tf_dim%c_sname='t' 609 650 ELSE 610 651 CALL logger_warn("DIM INIT: "//TRIM(cd_name)//& … … 617 658 CALL logger_debug( & 618 659 & " DIM INIT: unlimited dimension: "//fct_str(ld_uld) ) 619 dim_init%l_uld=ld_uld660 tf_dim%l_uld=ld_uld 620 661 ELSE 621 IF( TRIM(fct_lower( dim_init%c_sname)) =='t' )THEN622 dim_init%l_uld=.TRUE.662 IF( TRIM(fct_lower(tf_dim%c_sname)) =='t' )THEN 663 tf_dim%l_uld=.TRUE. 623 664 ENDIF 624 665 ENDIF 625 666 626 667 ! get dimension order indices 627 dim_init%i_xyzt2=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname))668 tf_dim%i_xyzt2=SCAN(TRIM(cp_dimorder),TRIM(tf_dim%c_sname)) 628 669 629 670 END FUNCTION dim_init 671 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 672 SUBROUTINE dim__print_arr(td_dim) 630 673 !------------------------------------------------------------------- 631 674 !> @brief This subroutine print informations of an array of dimension. … … 636 679 !> @param[in] td_dim array of dimension structure 637 680 !------------------------------------------------------------------- 638 SUBROUTINE dim__print_arr(td_dim) 681 639 682 IMPLICIT NONE 640 683 … … 651 694 652 695 END SUBROUTINE dim__print_arr 696 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 SUBROUTINE dim__print_unit(td_dim) 653 698 !------------------------------------------------------------------- 654 699 !> @brief This subrtoutine print dimension information. … … 659 704 !> @param[in] td_dim dimension structure 660 705 !------------------------------------------------------------------- 661 SUBROUTINE dim__print_unit(td_dim) 706 662 707 IMPLICIT NONE 663 708 … … 666 711 !---------------------------------------------------------------- 667 712 668 WRITE(*,'((3x,a,a),(/6x,a,a),(a,i1),(a,i 4),2(a,a),2(a,i1))') &713 WRITE(*,'((3x,a,a),(/6x,a,a),(a,i1),(a,i5),2(a,a),2(a,i1))') & 669 714 & " dimension : ",TRIM(td_dim%c_name), & 670 715 & " short name : ",TRIM(td_dim%c_sname), & … … 677 722 678 723 END SUBROUTINE dim__print_unit 724 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 FUNCTION dim_fill_unused(td_dim) & 726 & RESULT (tf_dim) 679 727 !------------------------------------------------------------------- 680 728 !> @brief This function fill unused dimension of an array of dimension … … 695 743 !> @return 4elts array of dimension structure 696 744 !------------------------------------------------------------------- 697 FUNCTION dim_fill_unused(td_dim) 698 IMPLICIT NONE 745 746 IMPLICIT NONE 747 699 748 ! Argument 700 749 TYPE(TDIM), DIMENSION(:), INTENT(IN), OPTIONAL :: td_dim 701 750 702 751 ! function 703 TYPE(TDIM), DIMENSION(ip_maxdim) :: dim_fill_unused752 TYPE(TDIM), DIMENSION(ip_maxdim) :: tf_dim 704 753 705 754 ! local variable … … 707 756 INTEGER(i4) , DIMENSION(1) :: il_ind ! index 708 757 709 TYPE(TDIM), DIMENSION(ip_maxdim) :: tl_dim710 711 758 ! loop indices 712 759 INTEGER(i4) :: ji … … 714 761 715 762 IF( PRESENT(td_dim) )THEN 716 t l_dim(1:SIZE(td_dim(:)))=td_dim(:)763 tf_dim(1:SIZE(td_dim(:)))=td_dim(:) 717 764 ENDIF 718 765 ! concatenate short nem dimension in a character string 719 cl_dimin=fct_lower(fct_concat(t l_dim(:)%c_sname))766 cl_dimin=fct_lower(fct_concat(tf_dim(:)%c_sname)) 720 767 DO ji = 1, ip_maxdim 721 768 … … 723 770 IF( INDEX(cl_dimin,TRIM(fct_lower(cp_dimorder(ji:ji)))) == 0 )THEN 724 771 ! search first empty dimension (see dim_init) 725 il_ind(:)=MINLOC( t l_dim(:)%i_xyzt2, tl_dim(:)%i_xyzt2 == 0 )772 il_ind(:)=MINLOC( tf_dim(:)%i_xyzt2, tf_dim(:)%i_xyzt2 == 0 ) 726 773 727 774 ! put missing dimension instead of empty one 728 t l_dim(il_ind(1))%c_sname=fct_lower(cp_dimorder(ji:ji))775 tf_dim(il_ind(1))%c_sname=fct_lower(cp_dimorder(ji:ji)) 729 776 ! update output structure 730 t l_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji))731 t l_dim(il_ind(1))%i_xyzt2=ji732 t l_dim(il_ind(1))%i_len=1733 t l_dim(il_ind(1))%l_use=.FALSE.777 tf_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji)) 778 tf_dim(il_ind(1))%i_xyzt2=ji 779 tf_dim(il_ind(1))%i_len=1 780 tf_dim(il_ind(1))%l_use=.FALSE. 734 781 ENDIF 735 782 736 783 ENDDO 737 784 738 ! save result739 dim_fill_unused(:)=tl_dim(:)740 741 ! clean742 CALL dim_clean(tl_dim(:))743 744 785 END FUNCTION dim_fill_unused 786 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 SUBROUTINE dim_reorder(td_dim, cd_dimorder) 745 788 !------------------------------------------------------------------- 746 789 !> @brief … … 764 807 !> @param[in] cd_dimorder dimension order to be output 765 808 !------------------------------------------------------------------- 766 SUBROUTINE dim_reorder(td_dim, cd_dimorder) 767 IMPLICIT NONE 809 810 IMPLICIT NONE 811 768 812 ! Argument 769 813 TYPE(TDIM) , DIMENSION(:), INTENT(INOUT) :: td_dim … … 846 890 847 891 END SUBROUTINE dim_reorder 892 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 893 SUBROUTINE dim_disorder(td_dim) 848 894 !------------------------------------------------------------------- 849 895 !> @brief This subroutine switch dimension array from ordered dimension ('x','y','z','t') … … 859 905 !> @param[inout] td_dim array of dimension structure 860 906 !------------------------------------------------------------------- 861 SUBROUTINE dim_disorder(td_dim) 862 IMPLICIT NONE 907 908 IMPLICIT NONE 909 863 910 ! Argument 864 911 TYPE(TDIM), DIMENSION(:), INTENT(INOUT) :: td_dim … … 906 953 907 954 END SUBROUTINE dim_disorder 955 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 956 FUNCTION dim__reshape_2xyzt_dp(td_dim, dd_value) & 957 & RESULT (df_value) 908 958 !------------------------------------------------------------------- 909 959 !> @brief This function reshape real(8) 4D array … … 918 968 !> @author J.Paul 919 969 !> @date November, 2013 - Initial Version 920 ! 970 !> @date January, 2019 971 !> - do not reshape array already order 972 !> 921 973 !> @param[in] td_dim array of dimension structure 922 974 !> @param[in] dd_value array of value to reshape 923 975 !> @return array of value reshaped 924 976 !------------------------------------------------------------------- 925 FUNCTION dim__reshape_2xyzt_dp(td_dim, dd_value) 977 926 978 IMPLICIT NONE 927 979 … … 932 984 ! function 933 985 REAL(dp), DIMENSION(td_dim(1)%i_len, & 934 &td_dim(2)%i_len, &935 &td_dim(3)%i_len, &936 & td_dim(4)%i_len) :: dim__reshape_2xyzt_dp986 & td_dim(2)%i_len, & 987 & td_dim(3)%i_len, & 988 & td_dim(4)%i_len) :: df_value 937 989 938 990 ! local variable … … 942 994 ! loop indices 943 995 INTEGER(i4) :: ji 996 INTEGER(i4) :: jj 997 INTEGER(i4) :: jk 998 INTEGER(i4) :: jl 944 999 !---------------------------------------------------------------- 945 1000 … … 966 1021 DO ji=1,ip_maxdim 967 1022 CALL logger_debug(" DIM RESHAPE 2 XYZT: dim "//& 968 & TRIM(td_dim(td_dim(ji)%i_xyzt2)%c_name)//" "//&969 & TRIM(fct_str(td_dim(td_dim(ji)%i_xyzt2)%i_len))//" vs "//&970 & TRIM(fct_str(il_shape(ji))) )1023 & TRIM(td_dim(td_dim(ji)%i_xyzt2)%c_name)//" "//& 1024 & TRIM(fct_str(td_dim(td_dim(ji)%i_xyzt2)%i_len))//" vs "//& 1025 & TRIM(fct_str(il_shape(ji))) ) 971 1026 ENDDO 972 1027 CALL logger_fatal(" DIM RESHAPE 2 XYZT: wrong input dimensions " ) … … 993 1048 & TRIM(cl_dim) ) 994 1049 1050 IF( td_dim(1)%i_xyzt2 == 1 .AND. & 1051 & td_dim(2)%i_xyzt2 == 2 .AND. & 1052 & td_dim(3)%i_xyzt2 == 3 .AND. & 1053 & td_dim(4)%i_xyzt2 == 4 )THEN 1054 1055 DO jl=1,td_dim(4)%i_len 1056 DO jk=1,td_dim(3)%i_len 1057 DO jj=1,td_dim(2)%i_len 1058 DO ji=1,td_dim(1)%i_len 1059 df_value(ji,jj,jk,jl)=dd_value(ji,jj,jk,jl) 1060 ENDDO 1061 ENDDO 1062 ENDDO 1063 ENDDO 1064 1065 ELSE 1066 995 1067 ! reorder dimension to x,y,z,t 996 d im__reshape_2xyzt_dp(:,:,:,:)=RESHAPE(SOURCE=dd_value(:,:,:,:),&997 & SHAPE = (/ td_dim(1)%i_len, &998 & td_dim(2)%i_len, &999 & td_dim(3)%i_len, &1000 & td_dim(4)%i_len /),&1001 & ORDER = (/ td_dim(1)%i_2xyzt,&1002 & td_dim(2)%i_2xyzt,&1003 & td_dim(3)%i_2xyzt,&1004 & td_dim(4)%i_2xyzt/))1005 1068 df_value(:,:,:,:)=RESHAPE(SOURCE=dd_value(:,:,:,:),& 1069 & SHAPE = (/ td_dim(1)%i_len, & 1070 & td_dim(2)%i_len, & 1071 & td_dim(3)%i_len, & 1072 & td_dim(4)%i_len /),& 1073 & ORDER = (/ td_dim(1)%i_2xyzt, & 1074 & td_dim(2)%i_2xyzt, & 1075 & td_dim(3)%i_2xyzt, & 1076 & td_dim(4)%i_2xyzt /)) 1077 ENDIF 1006 1078 ENDIF 1007 1079 ENDIF 1008 1080 1009 1081 END FUNCTION dim__reshape_2xyzt_dp 1082 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1083 FUNCTION dim__reshape_xyzt2_dp(td_dim, dd_value) & 1084 & RESULT (df_value) 1010 1085 !------------------------------------------------------------------- 1011 1086 !> @brief This function reshape ordered real(8) 4D array with dimension … … 1025 1100 !> @return array of value reshaped 1026 1101 !------------------------------------------------------------------- 1027 FUNCTION dim__reshape_xyzt2_dp(td_dim, dd_value) 1102 1028 1103 IMPLICIT NONE 1029 1104 … … 1034 1109 ! function 1035 1110 REAL(dp), DIMENSION(td_dim(td_dim(1)%i_xyzt2)%i_len, & 1036 &td_dim(td_dim(2)%i_xyzt2)%i_len, &1037 &td_dim(td_dim(3)%i_xyzt2)%i_len, &1038 & td_dim(td_dim(4)%i_xyzt2)%i_len) :: dim__reshape_xyzt2_dp1111 & td_dim(td_dim(2)%i_xyzt2)%i_len, & 1112 & td_dim(td_dim(3)%i_xyzt2)%i_len, & 1113 & td_dim(td_dim(4)%i_xyzt2)%i_len) :: df_value 1039 1114 1040 1115 ! local variable … … 1095 1170 1096 1171 ! reshape array 1097 d im__reshape_xyzt2_dp(:,:,:,:)=RESHAPE(SOURCE=dd_value, &1098 & SHAPE = (/ td_dim(td_dim(1)%i_xyzt2)%i_len, &1099 & td_dim(td_dim(2)%i_xyzt2)%i_len, &1100 & td_dim(td_dim(3)%i_xyzt2)%i_len, &1101 & td_dim(td_dim(4)%i_xyzt2)%i_len /),&1102 & ORDER = (/ td_dim(1)%i_xyzt2, &1103 & td_dim(2)%i_xyzt2, &1104 & td_dim(3)%i_xyzt2, &1105 & td_dim(4)%i_xyzt2 /))1172 df_value(:,:,:,:)=RESHAPE(SOURCE=dd_value, & 1173 & SHAPE = (/ td_dim(td_dim(1)%i_xyzt2)%i_len, & 1174 & td_dim(td_dim(2)%i_xyzt2)%i_len, & 1175 & td_dim(td_dim(3)%i_xyzt2)%i_len, & 1176 & td_dim(td_dim(4)%i_xyzt2)%i_len /),& 1177 & ORDER = (/ td_dim(1)%i_xyzt2, & 1178 & td_dim(2)%i_xyzt2, & 1179 & td_dim(3)%i_xyzt2, & 1180 & td_dim(4)%i_xyzt2 /)) 1106 1181 1107 1182 ENDIF … … 1109 1184 1110 1185 END FUNCTION dim__reshape_xyzt2_dp 1186 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1187 FUNCTION dim__reorder_2xyzt_i4(td_dim, id_arr) & 1188 & RESULT (if_value) 1111 1189 !------------------------------------------------------------------- 1112 1190 !> @brief This function reordered integer(4) 1D array to be suitable … … 1121 1199 !> @return array of value reshaped 1122 1200 !------------------------------------------------------------------- 1123 FUNCTION dim__reorder_2xyzt_i4(td_dim, id_arr) 1201 1124 1202 IMPLICIT NONE 1125 1203 … … 1129 1207 1130 1208 ! function 1131 INTEGER(i4), DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_i41209 INTEGER(i4), DIMENSION(ip_maxdim) :: if_value 1132 1210 1133 1211 ! loop indices … … 1149 1227 1150 1228 DO ji=1,ip_maxdim 1151 dim__reorder_2xyzt_i4(ji)=id_arr(td_dim(ji)%i_2xyzt)1229 if_value(ji)=id_arr(td_dim(ji)%i_2xyzt) 1152 1230 ENDDO 1153 1231 ENDIF 1154 1232 1155 1233 END FUNCTION dim__reorder_2xyzt_i4 1234 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1235 FUNCTION dim__reorder_xyzt2_i4(td_dim, id_arr) & 1236 & RESULT (if_value) 1156 1237 !------------------------------------------------------------------- 1157 1238 !> @brief This function disordered integer(4) 1D array to be suitable with … … 1166 1247 !> @return array of value reshaped 1167 1248 !------------------------------------------------------------------- 1168 FUNCTION dim__reorder_xyzt2_i4(td_dim, id_arr) 1249 1169 1250 IMPLICIT NONE 1170 1251 … … 1172 1253 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1173 1254 INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_arr 1174 1255 1175 1256 ! function 1176 INTEGER(i4), DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_i41177 1257 INTEGER(i4), DIMENSION(ip_maxdim) :: if_value 1258 1178 1259 ! loop indices 1179 1260 INTEGER(i4) :: ji … … 1194 1275 1195 1276 DO ji=1,ip_maxdim 1196 dim__reorder_xyzt2_i4(ji)=id_arr(td_dim(ji)%i_xyzt2)1277 if_value(ji)=id_arr(td_dim(ji)%i_xyzt2) 1197 1278 ENDDO 1198 1279 ENDIF 1199 1280 1200 1281 END FUNCTION dim__reorder_xyzt2_i4 1282 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 FUNCTION dim__reorder_2xyzt_l(td_dim, ld_arr) & 1284 & RESULT (lf_arr) 1201 1285 !------------------------------------------------------------------- 1202 1286 !> @brief This function reordered logical 1D array to be suitable … … 1211 1295 !> @return array of value reordered 1212 1296 !------------------------------------------------------------------- 1213 FUNCTION dim__reorder_2xyzt_l(td_dim, ld_arr) 1214 IMPLICIT NONE 1297 1298 IMPLICIT NONE 1299 1215 1300 ! Argument 1216 1301 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim … … 1218 1303 1219 1304 ! function 1220 LOGICAL, DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_l1305 LOGICAL, DIMENSION(ip_maxdim) :: lf_arr 1221 1306 1222 1307 ! loop indices … … 1238 1323 1239 1324 DO ji=1,ip_maxdim 1240 dim__reorder_2xyzt_l(ji)=ld_arr(td_dim(ji)%i_2xyzt)1325 lf_arr(ji)=ld_arr(td_dim(ji)%i_2xyzt) 1241 1326 ENDDO 1242 1327 ENDIF 1243 1328 1244 1329 END FUNCTION dim__reorder_2xyzt_l 1330 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1331 FUNCTION dim__reorder_xyzt2_l(td_dim, ld_arr) & 1332 & RESULT (lf_arr) 1245 1333 !------------------------------------------------------------------- 1246 1334 !> @brief This function disordered logical 1D array to be suitable with … … 1255 1343 !> @return array of value reordered 1256 1344 !------------------------------------------------------------------- 1257 FUNCTION dim__reorder_xyzt2_l(td_dim, ld_arr) 1345 1258 1346 IMPLICIT NONE 1259 1347 … … 1261 1349 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1262 1350 LOGICAL , DIMENSION(:), INTENT(IN) :: ld_arr 1263 1351 1264 1352 ! function 1265 LOGICAL, DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_l1266 1353 LOGICAL, DIMENSION(ip_maxdim) :: lf_arr 1354 1267 1355 ! loop indices 1268 1356 INTEGER(i4) :: ji … … 1283 1371 1284 1372 DO ji=1,ip_maxdim 1285 dim__reorder_xyzt2_l(ji)=ld_arr(td_dim(ji)%i_xyzt2)1373 lf_arr(ji)=ld_arr(td_dim(ji)%i_xyzt2) 1286 1374 ENDDO 1287 1375 ENDIF 1288 1376 1289 1377 END FUNCTION dim__reorder_xyzt2_l 1378 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1379 FUNCTION dim__reorder_2xyzt_c(td_dim, cd_arr) & 1380 & RESULT (cf_arr) 1290 1381 !------------------------------------------------------------------- 1291 1382 !> @brief This function reordered string 1D array to be suitable … … 1300 1391 !> @return array of value reordered 1301 1392 !------------------------------------------------------------------- 1302 FUNCTION dim__reorder_2xyzt_c(td_dim, cd_arr) 1303 IMPLICIT NONE 1393 1394 IMPLICIT NONE 1395 1304 1396 ! Argument 1305 1397 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 1306 1398 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_arr 1307 1399 1308 1400 ! function 1309 CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_c1401 CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: cf_arr 1310 1402 1311 1403 ! loop indices … … 1327 1419 1328 1420 DO ji=1,ip_maxdim 1329 dim__reorder_2xyzt_c(ji)=TRIM(cd_arr(td_dim(ji)%i_2xyzt))1421 cf_arr(ji)=TRIM(cd_arr(td_dim(ji)%i_2xyzt)) 1330 1422 ENDDO 1331 1423 ENDIF 1332 1424 1333 1425 END FUNCTION dim__reorder_2xyzt_c 1426 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1427 FUNCTION dim__reorder_xyzt2_c(td_dim, cd_arr) & 1428 & RESULT (cf_arr) 1334 1429 !------------------------------------------------------------------- 1335 1430 !> @brief This function disordered string 1D array to be suitable with … … 1344 1439 !> @return array of value reordered 1345 1440 !------------------------------------------------------------------- 1346 FUNCTION dim__reorder_xyzt2_c(td_dim, cd_arr) 1441 1347 1442 IMPLICIT NONE 1348 1443 … … 1350 1445 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 1351 1446 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_arr 1352 1447 1353 1448 ! function 1354 CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_c1449 CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: cf_arr 1355 1450 1356 1451 ! loop indices … … 1371 1466 1372 1467 DO ji=1,ip_maxdim 1373 dim__reorder_xyzt2_c(ji)=TRIM(cd_arr(td_dim(ji)%i_xyzt2))1468 cf_arr(ji)=TRIM(cd_arr(td_dim(ji)%i_xyzt2)) 1374 1469 ENDDO 1375 1470 ENDIF 1376 1471 1377 1472 END FUNCTION dim__reorder_xyzt2_c 1473 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1474 SUBROUTINE dim__clean_unit(td_dim) 1378 1475 !------------------------------------------------------------------- 1379 1476 !> @brief This subroutine clean dimension structure. … … 1384 1481 !> @param[in] td_dim dimension strucutre 1385 1482 !------------------------------------------------------------------- 1386 SUBROUTINE dim__clean_unit( td_dim ) 1387 IMPLICIT NONE 1483 1484 IMPLICIT NONE 1485 1388 1486 ! Argument 1389 1487 TYPE(TDIM), INTENT(INOUT) :: td_dim … … 1400 1498 1401 1499 END SUBROUTINE dim__clean_unit 1500 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1501 SUBROUTINE dim__clean_arr(td_dim) 1402 1502 !------------------------------------------------------------------- 1403 1503 !> @brief This subroutine clean array of dimension structure … … 1408 1508 !> @param[in] td_dim array of dimension strucutre 1409 1509 !------------------------------------------------------------------- 1410 SUBROUTINE dim__clean_arr( td_dim ) 1510 1411 1511 IMPLICIT NONE 1412 1512 ! Argument … … 1422 1522 1423 1523 END SUBROUTINE dim__clean_arr 1524 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1525 SUBROUTINE dim_get_dummy(cd_dummy) 1424 1526 !------------------------------------------------------------------- 1425 1527 !> @brief This subroutine fill dummy dimension array … … 1427 1529 !> @author J.Paul 1428 1530 !> @date September, 2015 - Initial Version 1429 ! 1531 !> @date May, 2019 1532 !> - read number of dummy element 1533 !> 1430 1534 !> @param[in] cd_dummy dummy configuration file 1431 1535 !------------------------------------------------------------------- 1432 SUBROUTINE dim_get_dummy( cd_dummy ) 1536 1433 1537 IMPLICIT NONE 1434 1538 ! Argument … … 1443 1547 ! loop indices 1444 1548 ! namelist 1549 INTEGER(i4) :: in_ndumvar 1550 INTEGER(i4) :: in_ndumdim 1551 INTEGER(i4) :: in_ndumatt 1445 1552 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumvar 1446 1553 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumdim … … 1449 1556 !---------------------------------------------------------------- 1450 1557 NAMELIST /namdum/ & !< dummy namelist 1558 & in_ndumvar,& !< number of variable name 1559 & in_ndumdim,& !< number of dimension name 1560 & in_ndumatt,& !< number of attribute name 1451 1561 & cn_dumvar, & !< variable name 1452 1562 & cn_dumdim, & !< dimension name … … 1475 1585 1476 1586 READ( il_fileid, NML = namdum ) 1477 cm_dumdim(:)=cn_dumdim(:) 1587 im_ndumdim = in_ndumdim 1588 cm_dumdim(:)= cn_dumdim(:) 1478 1589 1479 1590 CLOSE( il_fileid ) 1480 1591 1592 IF( im_ndumdim > ip_maxdumcfg )THEN 1593 CALL logger_fatal("DIM GET dUMMY : too much dummy dimension & 1594 & ( >"//fct_str(ip_maxdumcfg)//" ). & 1595 & set ip_maxdumcfg to higher value.") 1596 ENDIF 1481 1597 ENDIF 1482 1598 1483 1599 END SUBROUTINE dim_get_dummy 1600 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1601 FUNCTION dim_is_dummy(td_dim) & 1602 & RESULT (lf_dummy) 1484 1603 !------------------------------------------------------------------- 1485 1604 !> @brief This function check if dimension is defined as dummy dimension … … 1488 1607 !> @author J.Paul 1489 1608 !> @date September, 2015 - Initial Version 1490 ! 1609 !> @date, May, 2019 1610 !> - use number of dummy elt in do-loop 1611 !> 1491 1612 !> @param[in] td_dim dimension structure 1492 1613 !> @return true if dimension is dummy dimension 1493 1614 !------------------------------------------------------------------- 1494 FUNCTION dim_is_dummy(td_dim) 1615 1495 1616 IMPLICIT NONE 1496 1617 … … 1499 1620 1500 1621 ! function 1501 LOGICAL :: dim_is_dummy1622 LOGICAL :: lf_dummy 1502 1623 1503 1624 ! loop indices … … 1505 1626 !---------------------------------------------------------------- 1506 1627 1507 dim_is_dummy=.FALSE.1508 DO ji=1,i p_maxdumcfg1628 lf_dummy=.FALSE. 1629 DO ji=1,im_ndumdim 1509 1630 IF( fct_lower(td_dim%c_name) == fct_lower(cm_dumdim(ji)) )THEN 1510 dim_is_dummy=.TRUE.1631 lf_dummy=.TRUE. 1511 1632 EXIT 1512 1633 ENDIF … … 1514 1635 1515 1636 END FUNCTION dim_is_dummy 1637 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1638 SUBROUTINE dim_def_extra(cd_file) 1516 1639 !------------------------------------------------------------------- 1517 1640 !> @brief This subroutine read dimension configuration file, … … 1520 1643 !> @author J.Paul 1521 1644 !> @date Ocotber, 2016 - Initial Version 1645 !> @date May, 2019 1646 !> - read number of element for each dimention 1522 1647 ! 1523 1648 !> @param[in] cd_file input file (dimension configuration file) 1524 1649 !------------------------------------------------------------------- 1525 SUBROUTINE dim_def_extra( cd_file ) 1650 1526 1651 IMPLICIT NONE 1527 1652 … … 1537 1662 ! loop indices 1538 1663 ! namelist 1664 INTEGER(i4) :: in_dimX = 0 1665 INTEGER(i4) :: in_dimY = 0 1666 INTEGER(i4) :: in_dimZ = 0 1667 INTEGER(i4) :: in_dimT = 0 1539 1668 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg) :: cn_dimX = '' 1540 1669 CHARACTER(LEN=lc), DIMENSION(ip_maxdimcfg) :: cn_dimY = '' … … 1544 1673 !---------------------------------------------------------------- 1545 1674 NAMELIST /namdim/ & !< dimension namelist 1675 & in_dimX, & !< number of x dimension name allowed 1676 & in_dimY, & !< number of y dimension name allowed 1677 & in_dimZ, & !< number of z dimension name allowed 1678 & in_dimT, & !< number of t dimension name allowed 1546 1679 & cn_dimX, & !< x dimension name allowed 1547 1680 & cn_dimY, & !< y dimension name allowed … … 1575 1708 1576 1709 READ( il_fileid, NML = namdim ) 1710 im_dimX =in_dimX 1711 im_dimY =in_dimY 1712 im_dimZ =in_dimZ 1713 im_dimT =in_dimT 1577 1714 cm_dimX(:)=cn_dimX(:) 1578 1715 cm_dimY(:)=cn_dimY(:) … … 1590 1727 1591 1728 END SUBROUTINE dim_def_extra 1729 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1730 FUNCTION dim__is_allowed(cd_name, cd_dim, id_ndim) & 1731 & RESULT (lf_allowed) 1592 1732 !------------------------------------------------------------------- 1593 1733 !> @brief This function check if dimension is allowed, i.e defined … … 1595 1735 !> 1596 1736 !> @author J.Paul 1597 !> @date OCTOber, 2016 - Initial Version 1737 !> @date October, 2016 - Initial Version 1738 !> @date May, 2019 1739 !> - use number of element for each dimention allowed, instead of while loop 1598 1740 ! 1599 1741 !> @param[in] cd_name dimension name 1600 1742 !> @param[in] cd_dim array dimension name allowed 1743 !> @param[in] id_ndim number of elt in array dimension name allowed 1601 1744 !> @return true if dimension is allowed 1602 1745 !------------------------------------------------------------------- 1603 FUNCTION dim__is_allowed(cd_name, cd_dim) 1746 1604 1747 IMPLICIT NONE 1605 1748 … … 1607 1750 CHARACTER(LEN=*), INTENT(IN) :: cd_name 1608 1751 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_dim 1752 INTEGER(i4) , INTENT(IN) :: id_ndim 1609 1753 1610 1754 ! function 1611 LOGICAL :: dim__is_allowed1755 LOGICAL :: lf_allowed 1612 1756 1613 1757 ! loop indices … … 1615 1759 !---------------------------------------------------------------- 1616 1760 1617 dim__is_allowed=.FALSE. 1618 ji=1 1619 DO WHILE( TRIM(cd_dim(ji)) /= '' ) 1761 lf_allowed=.FALSE. 1762 DO ji=1,id_ndim 1620 1763 IF( TRIM(fct_lower(cd_name)) == TRIM(fct_lower(cd_dim(ji))) )THEN 1621 dim__is_allowed=.TRUE.1764 lf_allowed=.TRUE. 1622 1765 EXIT 1623 1766 ENDIF 1624 ji=ji+11625 1767 ENDDO 1626 1768 1627 1769 END FUNCTION dim__is_allowed 1628 1770 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1629 1771 END MODULE dim 1630 1772
Note: See TracChangeset
for help on using the changeset viewer.