Changeset 12080 for utils/tools/SIREN/src/attribute.f90
- Timestamp:
- 2019-12-06T10:30:14+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
utils/tools/SIREN/src/attribute.f90
r9598 r12080 2 2 ! NEMO system team, System and Interface for oceanic RElocable Nesting 3 3 !---------------------------------------------------------------------- 4 !5 ! MODULE: att6 4 ! 7 5 ! DESCRIPTION: … … 79 77 !> 80 78 !> @author J.Paul 81 ! REVISION HISTORY:79 !> 82 80 !> @date November, 2013 - Initial Version 83 81 !> @date November, 2014 … … 85 83 !> @date September, 2015 86 84 !> - manage useless (dummy) attributes 87 ! 88 !> @note Software governed by the CeCILL licence (./LICENSE) 85 !> @date May, 2019 86 !> - read number of element for each dummy array in configuration file 87 !> 88 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 89 89 !---------------------------------------------------------------------- 90 90 MODULE att 91 91 92 USE netcdf ! nf90 library 92 93 USE global ! global variable … … 94 95 USE logger ! log file manager 95 96 USE fct ! basic useful function 97 96 98 IMPLICIT NONE 99 97 100 ! NOTE_avoid_public_variables_if_possible 98 101 … … 100 103 PUBLIC :: TATT !< attribute structure 101 104 102 PRIVATE :: cm_dumatt !< dummy attribute array 105 PRIVATE :: im_ndumatt !< number of elt in dummy attribute array 106 PRIVATE :: cm_dumatt !< dummy attribute array 103 107 104 108 ! function and subroutine … … 141 145 END TYPE TATT 142 146 143 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumatt !< dummy attribute 147 INTEGER(i4) , SAVE :: im_ndumatt !< number of elt in dummy attribute array 148 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumatt !< dummy attribute 144 149 145 150 INTERFACE att_init … … 175 180 176 181 CONTAINS 182 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 183 FUNCTION att__copy_arr(td_att) & 184 & RESULT(tf_att) 177 185 !------------------------------------------------------------------- 178 186 !> @brief … … 196 204 !> @return copy of input array of attribute structure 197 205 !------------------------------------------------------------------- 198 FUNCTION att__copy_arr( td_att ) 199 IMPLICIT NONE 200 ! Argument 201 TYPE(TATT), DIMENSION(:), INTENT(IN) :: td_att 202 ! function 203 TYPE(TATT), DIMENSION(SIZE(td_att(:))) :: att__copy_arr 206 207 IMPLICIT NONE 208 209 ! Argument 210 TYPE(TATT), DIMENSION(:) , INTENT(IN) :: td_att 211 ! function 212 TYPE(TATT), DIMENSION(SIZE(td_att(:))) :: tf_att 204 213 205 214 ! local variable … … 209 218 210 219 DO ji=1,SIZE(td_att(:)) 211 att__copy_arr(ji)=att_copy(td_att(ji))220 tf_att(ji)=att_copy(td_att(ji)) 212 221 ENDDO 213 222 214 223 END FUNCTION att__copy_arr 224 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 225 FUNCTION att__copy_unit(td_att) & 226 & RESULT (tf_att) 215 227 !------------------------------------------------------------------- 216 228 !> @brief … … 235 247 !> @return copy of input attribute structure 236 248 !------------------------------------------------------------------- 237 FUNCTION att__copy_unit( td_att ) 238 IMPLICIT NONE 249 250 IMPLICIT NONE 251 239 252 ! Argument 240 253 TYPE(TATT), INTENT(IN) :: td_att 241 ! function 242 TYPE(TATT) :: att__copy_unit 254 255 ! function 256 TYPE(TATT) :: tf_att 243 257 244 258 ! local variable … … 247 261 248 262 ! copy attribute variable 249 att__copy_unit%c_name = TRIM(td_att%c_name)250 att__copy_unit%i_id = td_att%i_id251 att__copy_unit%i_type = td_att%i_type252 att__copy_unit%i_len = td_att%i_len253 att__copy_unit%c_value = TRIM(td_att%c_value)263 tf_att%c_name = TRIM(td_att%c_name) 264 tf_att%i_id = td_att%i_id 265 tf_att%i_type = td_att%i_type 266 tf_att%i_len = td_att%i_len 267 tf_att%c_value = TRIM(td_att%c_value) 254 268 255 269 ! copy attribute pointer in an independant variable 256 IF( ASSOCIATED( att__copy_unit%d_value) ) DEALLOCATE(att__copy_unit%d_value)270 IF( ASSOCIATED(tf_att%d_value) ) DEALLOCATE(tf_att%d_value) 257 271 IF( ASSOCIATED(td_att%d_value) )THEN 258 272 ALLOCATE( dl_value(td_att%i_len) ) 259 273 dl_value(:) = td_att%d_value(:) 260 274 261 ALLOCATE( att__copy_unit%d_value(att__copy_unit%i_len) )262 att__copy_unit%d_value(:) = dl_value(:)275 ALLOCATE( tf_att%d_value(tf_att%i_len) ) 276 tf_att%d_value(:) = dl_value(:) 263 277 264 278 DEALLOCATE( dl_value ) … … 266 280 267 281 END FUNCTION att__copy_unit 282 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 FUNCTION att_get_index(td_att, cd_name) & 284 & RESULT(if_idx) 268 285 !------------------------------------------------------------------- 269 286 !> @brief This function return attribute index, in a array of attribute structure, … … 279 296 !> @return attribute index 280 297 !------------------------------------------------------------------- 281 INTEGER(i4) FUNCTION att_get_index( td_att, cd_name ) 282 IMPLICIT NONE 298 299 IMPLICIT NONE 300 283 301 ! Argument 284 302 TYPE(TATT), DIMENSION(:), INTENT(IN) :: td_att 285 303 CHARACTER(LEN=*), INTENT(IN) :: cd_name 286 304 305 ! function 306 INTEGER(i4) :: if_idx 307 287 308 ! local variable 288 309 INTEGER(i4) :: il_size … … 291 312 INTEGER(i4) :: ji 292 313 !---------------------------------------------------------------- 293 att_get_index=0314 if_idx=0 294 315 295 316 il_size=SIZE(td_att(:)) 296 317 DO ji=1,il_size 297 318 IF( TRIM(td_att(ji)%c_name) == TRIM(cd_name) )THEN 298 att_get_index=ji319 if_idx=ji 299 320 EXIT 300 321 ENDIF … … 302 323 303 324 END FUNCTION att_get_index 325 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 FUNCTION att_get_id(td_att, cd_name) & 327 & RESULT (if_id) 304 328 !------------------------------------------------------------------- 305 329 !> @brief This function return attribute id, read from a file.<br/> … … 316 340 !> @return attribute id 317 341 !------------------------------------------------------------------- 318 INTEGER(i4) FUNCTION att_get_id( td_att, cd_name ) 319 IMPLICIT NONE 342 343 IMPLICIT NONE 344 320 345 ! Argument 321 346 TYPE(TATT), DIMENSION(:), INTENT(IN) :: td_att 322 347 CHARACTER(LEN=*), INTENT(IN) :: cd_name 323 348 349 ! function 350 INTEGER(i4) :: if_id 351 324 352 ! local variable 325 353 INTEGER(i4) :: il_size … … 328 356 INTEGER(i4) :: ji 329 357 !---------------------------------------------------------------- 330 att_get_id=0358 if_id=0 331 359 332 360 il_size=SIZE(td_att(:)) 333 361 DO ji=1,il_size 334 362 IF( TRIM(td_att(ji)%c_name) == TRIM(cd_name) )THEN 335 att_get_id=td_att(ji)%i_id363 if_id=td_att(ji)%i_id 336 364 EXIT 337 365 ENDIF … … 339 367 340 368 END FUNCTION att_get_id 369 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 370 FUNCTION att__init_c(cd_name, cd_value) & 371 & RESULT (tf_att) 341 372 !------------------------------------------------------------------- 342 373 !> @brief This function initialize an attribute structure with character … … 350 381 !> @return attribute structure 351 382 !------------------------------------------------------------------- 352 TYPE(TATT) FUNCTION att__init_c( cd_name, cd_value ) 353 IMPLICIT NONE 383 384 IMPLICIT NONE 385 354 386 ! Argument 355 387 CHARACTER(LEN=*), INTENT(IN) :: cd_name 356 388 CHARACTER(LEN=*), INTENT(IN) :: cd_value 389 390 ! function 391 TYPE(TATT) :: tf_att 357 392 !---------------------------------------------------------------- 358 393 359 394 ! clean attribute 360 CALL att_clean( att__init_c)395 CALL att_clean(tf_att) 361 396 362 397 CALL logger_trace( & … … 364 399 & " attribute value "//TRIM(ADJUSTL(cd_value)) ) 365 400 366 att__init_c%c_name=TRIM(ADJUSTL(cd_name))367 att__init_c%i_type=NF90_CHAR368 369 att__init_c%c_value=TRIM(ADJUSTL(cd_value))370 att__init_c%i_len=LEN( TRIM(ADJUSTL(cd_value)) )401 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 402 tf_att%i_type=NF90_CHAR 403 404 tf_att%c_value=TRIM(ADJUSTL(cd_value)) 405 tf_att%i_len=LEN( TRIM(ADJUSTL(cd_value)) ) 371 406 372 407 END FUNCTION att__init_c 408 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 FUNCTION att__init_dp(cd_name, dd_value, id_type) & 410 & RESULT (tf_att) 373 411 !------------------------------------------------------------------- 374 412 !> @brief This function initialize an attribute structure with array … … 385 423 !> @return attribute structure 386 424 !------------------------------------------------------------------- 387 TYPE(TATT) FUNCTION att__init_dp( cd_name, dd_value, id_type ) 425 388 426 IMPLICIT NONE 389 427 … … 393 431 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 394 432 433 ! function 434 TYPE(TATT) :: tf_att 435 395 436 ! local value 396 437 INTEGER(i4) :: il_len … … 402 443 403 444 ! clean attribute 404 CALL att_clean( att__init_dp)445 CALL att_clean(tf_att) 405 446 406 447 ! array size … … 417 458 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 418 459 419 att__init_dp%c_name=TRIM(ADJUSTL(cd_name))460 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 420 461 421 462 IF( PRESENT(id_type) )THEN 422 att__init_dp%i_type=id_type463 tf_att%i_type=id_type 423 464 ELSE 424 att__init_dp%i_type=NF90_DOUBLE425 ENDIF 426 427 IF( ASSOCIATED( att__init_dp%d_value) )THEN428 DEALLOCATE( att__init_dp%d_value)429 ENDIF 430 ALLOCATE( att__init_dp%d_value(il_len))431 432 att__init_dp%d_value(:)=dd_value(:)433 att__init_dp%i_len=il_len465 tf_att%i_type=NF90_DOUBLE 466 ENDIF 467 468 IF( ASSOCIATED(tf_att%d_value) )THEN 469 DEALLOCATE(tf_att%d_value) 470 ENDIF 471 ALLOCATE(tf_att%d_value(il_len)) 472 473 tf_att%d_value(:)=dd_value(:) 474 tf_att%i_len=il_len 434 475 435 476 END FUNCTION att__init_dp 477 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 FUNCTION att__init_dp_0d(cd_name, dd_value, id_type) & 479 & RESULT (tf_att) 436 480 !------------------------------------------------------------------- 437 481 !> @brief This function initialize an attribute structure with … … 448 492 !> @return attribute structure 449 493 !------------------------------------------------------------------- 450 TYPE(TATT) FUNCTION att__init_dp_0d( cd_name, dd_value, id_type ) 451 IMPLICIT NONE 494 495 IMPLICIT NONE 496 452 497 ! Argument 453 498 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 455 500 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 456 501 502 ! function 503 TYPE(TATT) :: tf_att 504 457 505 ! local value 458 506 CHARACTER(LEN=lc) :: cl_value … … 460 508 461 509 ! clean attribute 462 CALL att_clean( att__init_dp_0d)510 CALL att_clean(tf_att) 463 511 464 512 cl_value="(/"//TRIM(fct_str(dd_value))//"/)" … … 468 516 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 469 517 470 att__init_dp_0d%c_name=TRIM(ADJUSTL(cd_name))518 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 471 519 472 520 IF( PRESENT(id_type) )THEN 473 att__init_dp_0d%i_type=id_type521 tf_att%i_type=id_type 474 522 ELSE 475 att__init_dp_0d%i_type=NF90_DOUBLE476 ENDIF 477 478 IF( ASSOCIATED( att__init_dp_0d%d_value) )THEN479 DEALLOCATE( att__init_dp_0d%d_value)480 ENDIF 481 ALLOCATE( att__init_dp_0d%d_value(1))482 483 att__init_dp_0d%d_value(1)=dd_value484 att__init_dp_0d%i_len=1523 tf_att%i_type=NF90_DOUBLE 524 ENDIF 525 526 IF( ASSOCIATED(tf_att%d_value) )THEN 527 DEALLOCATE(tf_att%d_value) 528 ENDIF 529 ALLOCATE(tf_att%d_value(1)) 530 531 tf_att%d_value(1)=dd_value 532 tf_att%i_len=1 485 533 486 534 END FUNCTION att__init_dp_0d 535 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 FUNCTION att__init_sp(cd_name, rd_value, id_type) & 537 & RESULT (tf_att) 487 538 !------------------------------------------------------------------- 488 539 !> @brief This function initialize an attribute structure with array … … 499 550 !> @return attribute structure 500 551 !------------------------------------------------------------------- 501 TYPE(TATT) FUNCTION att__init_sp( cd_name, rd_value, id_type ) 502 IMPLICIT NONE 552 553 IMPLICIT NONE 554 503 555 ! Argument 504 556 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 506 558 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 507 559 560 ! function 561 TYPE(TATT) :: tf_att 562 508 563 ! local value 509 564 INTEGER(i4) :: il_len … … 515 570 516 571 ! clean attribute 517 CALL att_clean( att__init_sp)572 CALL att_clean(tf_att) 518 573 519 574 ! array size … … 524 579 cl_value=TRIM(cl_value)//TRIM(fct_str(rd_value(ji)))//"," 525 580 ENDDO 581 CALL logger_trace( & 582 & " ATT INIT: attribute name: il_len "//fct_str(il_len)& 583 ) 526 584 cl_value=TRIM(cl_value)//TRIM(fct_str(rd_value(il_len)))//"/)" 527 585 … … 530 588 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 531 589 532 att__init_sp%c_name=TRIM(ADJUSTL(cd_name))590 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 533 591 534 592 IF( PRESENT(id_type) )THEN 535 att__init_sp%i_type=id_type593 tf_att%i_type=id_type 536 594 ELSE 537 att__init_sp%i_type=NF90_FLOAT538 ENDIF 539 540 IF( ASSOCIATED( att__init_sp%d_value) )THEN541 DEALLOCATE( att__init_sp%d_value)542 ENDIF 543 ALLOCATE( att__init_sp%d_value(il_len))544 545 att__init_sp%d_value(:)=REAL(rd_value(:),dp)546 att__init_sp%i_len=il_len595 tf_att%i_type=NF90_FLOAT 596 ENDIF 597 598 IF( ASSOCIATED(tf_att%d_value) )THEN 599 DEALLOCATE(tf_att%d_value) 600 ENDIF 601 ALLOCATE(tf_att%d_value(il_len)) 602 603 tf_att%d_value(:)=REAL(rd_value(:),dp) 604 tf_att%i_len=il_len 547 605 548 606 END FUNCTION att__init_sp 607 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 FUNCTION att__init_sp_0d(cd_name, rd_value, id_type) & 609 & RESULT (tf_att) 549 610 !------------------------------------------------------------------- 550 611 !> @brief This function initialize an attribute structure with … … 561 622 !> @return attribute structure 562 623 !------------------------------------------------------------------- 563 TYPE(TATT) FUNCTION att__init_sp_0d( cd_name, rd_value, id_type ) 564 IMPLICIT NONE 624 625 IMPLICIT NONE 626 565 627 ! Argument 566 628 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 568 630 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 569 631 632 ! function 633 TYPE(TATT) :: tf_att 634 570 635 ! local value 571 636 CHARACTER(LEN=lc) :: cl_value … … 573 638 574 639 ! clean attribute 575 CALL att_clean( att__init_sp_0d)640 CALL att_clean(tf_att) 576 641 577 642 cl_value="(/"//TRIM(fct_str(rd_value))//"/)" … … 581 646 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 582 647 583 att__init_sp_0d%c_name=TRIM(ADJUSTL(cd_name))648 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 584 649 585 650 IF( PRESENT(id_type) )THEN 586 att__init_sp_0d%i_type=id_type651 tf_att%i_type=id_type 587 652 ELSE 588 att__init_sp_0d%i_type=NF90_FLOAT589 ENDIF 590 591 IF( ASSOCIATED( att__init_sp_0d%d_value) )THEN592 DEALLOCATE( att__init_sp_0d%d_value)593 ENDIF 594 ALLOCATE( att__init_sp_0d%d_value(1))595 596 att__init_sp_0d%d_value(1)=REAL(rd_value,dp)597 att__init_sp_0d%i_len=1653 tf_att%i_type=NF90_FLOAT 654 ENDIF 655 656 IF( ASSOCIATED(tf_att%d_value) )THEN 657 DEALLOCATE(tf_att%d_value) 658 ENDIF 659 ALLOCATE(tf_att%d_value(1)) 660 661 tf_att%d_value(1)=REAL(rd_value,dp) 662 tf_att%i_len=1 598 663 599 664 END FUNCTION att__init_sp_0d 665 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 FUNCTION att__init_i1(cd_name, bd_value, id_type) & 667 & RESULT (tf_att) 600 668 !------------------------------------------------------------------- 601 669 !> @brief This function initialize an attribute structure with array … … 612 680 !> @return attribute structure 613 681 !------------------------------------------------------------------- 614 TYPE(TATT) FUNCTION att__init_i1( cd_name, bd_value, id_type ) 615 IMPLICIT NONE 682 683 IMPLICIT NONE 684 616 685 ! Argument 617 686 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 619 688 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 620 689 690 ! function 691 TYPE(TATT) :: tf_att 692 621 693 ! local value 622 694 INTEGER(i4) :: il_len … … 628 700 629 701 ! clean attribute 630 CALL att_clean( att__init_i1)702 CALL att_clean(tf_att) 631 703 632 704 ! array size … … 643 715 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 644 716 645 att__init_i1%c_name=TRIM(ADJUSTL(cd_name))717 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 646 718 647 719 IF( PRESENT(id_type) )THEN 648 att__init_i1%i_type=id_type720 tf_att%i_type=id_type 649 721 ELSE 650 att__init_i1%i_type=NF90_BYTE651 ENDIF 652 653 IF( ASSOCIATED( att__init_i1%d_value) )THEN654 DEALLOCATE( att__init_i1%d_value)655 ENDIF 656 ALLOCATE( att__init_i1%d_value(il_len))657 658 att__init_i1%d_value(:)=REAL(bd_value(:),dp)659 att__init_i1%i_len=il_len722 tf_att%i_type=NF90_BYTE 723 ENDIF 724 725 IF( ASSOCIATED(tf_att%d_value) )THEN 726 DEALLOCATE(tf_att%d_value) 727 ENDIF 728 ALLOCATE(tf_att%d_value(il_len)) 729 730 tf_att%d_value(:)=REAL(bd_value(:),dp) 731 tf_att%i_len=il_len 660 732 661 733 END FUNCTION att__init_i1 734 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 735 FUNCTION att__init_i1_0d(cd_name, bd_value, id_type) & 736 & RESULT (tf_att) 662 737 !------------------------------------------------------------------- 663 738 !> @brief This function initialize an attribute structure with … … 674 749 !> @return attribute structure 675 750 !------------------------------------------------------------------- 676 TYPE(TATT) FUNCTION att__init_i1_0d( cd_name, bd_value, id_type ) 677 IMPLICIT NONE 751 752 IMPLICIT NONE 753 678 754 ! Argument 679 755 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 681 757 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 682 758 759 ! function 760 TYPE(TATT) :: tf_att 761 683 762 !local value 684 763 CHARACTER(LEN=lc) :: cl_value … … 686 765 687 766 ! clean attribute 688 CALL att_clean( att__init_i1_0d)767 CALL att_clean(tf_att) 689 768 690 769 cl_value="(/"//TRIM(fct_str(bd_value))//"/)" … … 694 773 & " attibute value "//TRIM(ADJUSTL(cl_value)) ) 695 774 696 att__init_i1_0d%c_name=TRIM(ADJUSTL(cd_name))775 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 697 776 698 777 IF( PRESENT(id_type) )THEN 699 att__init_i1_0d%i_type=id_type778 tf_att%i_type=id_type 700 779 ELSE 701 att__init_i1_0d%i_type=NF90_BYTE780 tf_att%i_type=NF90_BYTE 702 781 ENDIF 703 782 704 IF( ASSOCIATED( att__init_i1_0d%d_value) )THEN705 DEALLOCATE( att__init_i1_0d%d_value)706 ENDIF 707 ALLOCATE( att__init_i1_0d%d_value(1))708 709 att__init_i1_0d%d_value(1)=REAL(bd_value,dp)710 att__init_i1_0d%i_len=1783 IF( ASSOCIATED(tf_att%d_value) )THEN 784 DEALLOCATE(tf_att%d_value) 785 ENDIF 786 ALLOCATE(tf_att%d_value(1)) 787 788 tf_att%d_value(1)=REAL(bd_value,dp) 789 tf_att%i_len=1 711 790 712 791 END FUNCTION att__init_i1_0d 792 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 793 FUNCTION att__init_i2(cd_name, sd_value, id_type) & 794 & RESULT (tf_att) 713 795 !------------------------------------------------------------------- 714 796 !> @brief This function initialize an attribute structure with array … … 725 807 !> @return attribute structure 726 808 !------------------------------------------------------------------- 727 TYPE(TATT) FUNCTION att__init_i2( cd_name, sd_value, id_type ) 728 IMPLICIT NONE 809 810 IMPLICIT NONE 811 729 812 ! Argument 730 813 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 732 815 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 733 816 817 ! function 818 TYPE(TATT) :: tf_att 819 734 820 ! local value 735 821 INTEGER(i4) :: il_len … … 741 827 742 828 ! clean attribute 743 CALL att_clean( att__init_i2)829 CALL att_clean(tf_att) 744 830 745 831 ! array size … … 756 842 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 757 843 758 att__init_i2%c_name=TRIM(ADJUSTL(cd_name))844 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 759 845 760 846 IF( PRESENT(id_type) )THEN 761 att__init_i2%i_type=id_type847 tf_att%i_type=id_type 762 848 ELSE 763 att__init_i2%i_type=NF90_SHORT764 ENDIF 765 766 IF( ASSOCIATED( att__init_i2%d_value) )THEN767 DEALLOCATE( att__init_i2%d_value)768 ENDIF 769 ALLOCATE( att__init_i2%d_value(il_len))770 771 att__init_i2%d_value(:)=REAL(sd_value(:),dp)772 att__init_i2%i_len=il_len849 tf_att%i_type=NF90_SHORT 850 ENDIF 851 852 IF( ASSOCIATED(tf_att%d_value) )THEN 853 DEALLOCATE(tf_att%d_value) 854 ENDIF 855 ALLOCATE(tf_att%d_value(il_len)) 856 857 tf_att%d_value(:)=REAL(sd_value(:),dp) 858 tf_att%i_len=il_len 773 859 774 860 END FUNCTION att__init_i2 861 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 FUNCTION att__init_i2_0d(cd_name, sd_value, id_type) & 863 & RESULT (tf_att) 775 864 !------------------------------------------------------------------- 776 865 !> @brief This function initialize an attribute structure with … … 787 876 !> @return attribute structure 788 877 !------------------------------------------------------------------- 789 TYPE(TATT) FUNCTION att__init_i2_0d( cd_name, sd_value, id_type ) 790 IMPLICIT NONE 878 879 IMPLICIT NONE 880 791 881 ! Argument 792 882 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 794 884 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 795 885 886 ! function 887 TYPE(TATT) :: tf_att 888 796 889 !local value 797 890 CHARACTER(LEN=lc) :: cl_value … … 799 892 800 893 ! clean attribute 801 CALL att_clean( att__init_i2_0d)894 CALL att_clean(tf_att) 802 895 803 896 cl_value="(/"//TRIM(fct_str(sd_value))//"/)" … … 807 900 & " attibute value "//TRIM(ADJUSTL(cl_value)) ) 808 901 809 att__init_i2_0d%c_name=TRIM(ADJUSTL(cd_name))902 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 810 903 811 904 IF( PRESENT(id_type) )THEN 812 att__init_i2_0d%i_type=id_type905 tf_att%i_type=id_type 813 906 ELSE 814 att__init_i2_0d%i_type=NF90_SHORT815 ENDIF 816 817 IF( ASSOCIATED( att__init_i2_0d%d_value) )THEN818 DEALLOCATE( att__init_i2_0d%d_value)819 ENDIF 820 ALLOCATE( att__init_i2_0d%d_value(1))821 822 att__init_i2_0d%d_value(1)=REAL(sd_value,dp)823 att__init_i2_0d%i_len=1907 tf_att%i_type=NF90_SHORT 908 ENDIF 909 910 IF( ASSOCIATED(tf_att%d_value) )THEN 911 DEALLOCATE(tf_att%d_value) 912 ENDIF 913 ALLOCATE(tf_att%d_value(1)) 914 915 tf_att%d_value(1)=REAL(sd_value,dp) 916 tf_att%i_len=1 824 917 825 918 END FUNCTION att__init_i2_0d 919 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 920 FUNCTION att__init_i4(cd_name, id_value, id_type) & 921 & RESULT(tf_att) 826 922 !------------------------------------------------------------------- 827 923 !> @brief This function initialize an attribute structure with array … … 838 934 !> @return attribute structure 839 935 !------------------------------------------------------------------- 840 TYPE(TATT) FUNCTION att__init_i4( cd_name, id_value, id_type ) 841 IMPLICIT NONE 936 937 IMPLICIT NONE 938 842 939 ! Argument 843 940 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 845 942 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 846 943 944 ! function 945 TYPE(TATT) :: tf_att 946 847 947 ! local value 848 948 INTEGER(i4) :: il_len … … 854 954 855 955 ! clean attribute 856 CALL att_clean( att__init_i4)956 CALL att_clean(tf_att) 857 957 858 958 ! array size … … 869 969 & " attribute value "//TRIM(ADJUSTL(cl_value)) ) 870 970 871 att__init_i4%c_name=TRIM(ADJUSTL(cd_name))971 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 872 972 873 973 IF( PRESENT(id_type) )THEN 874 att__init_i4%i_type=id_type974 tf_att%i_type=id_type 875 975 ELSE 876 att__init_i4%i_type=NF90_INT877 ENDIF 878 879 IF( ASSOCIATED( att__init_i4%d_value) )THEN880 DEALLOCATE( att__init_i4%d_value)881 ENDIF 882 ALLOCATE( att__init_i4%d_value(il_len))883 884 att__init_i4%d_value(:)=REAL(id_value(:),dp)885 att__init_i4%i_len=il_len976 tf_att%i_type=NF90_INT 977 ENDIF 978 979 IF( ASSOCIATED(tf_att%d_value) )THEN 980 DEALLOCATE(tf_att%d_value) 981 ENDIF 982 ALLOCATE(tf_att%d_value(il_len)) 983 984 tf_att%d_value(:)=REAL(id_value(:),dp) 985 tf_att%i_len=il_len 886 986 887 987 END FUNCTION att__init_i4 988 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 989 FUNCTION att__init_i4_0d(cd_name, id_value, id_type) & 990 & RESULT (tf_att) 888 991 !------------------------------------------------------------------- 889 992 !> @brief This function initialize an attribute structure with … … 900 1003 !> @return attribute structure 901 1004 !------------------------------------------------------------------- 902 TYPE(TATT) FUNCTION att__init_i4_0d( cd_name, id_value, id_type ) 903 IMPLICIT NONE 1005 1006 IMPLICIT NONE 1007 904 1008 ! Argument 905 1009 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 907 1011 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 908 1012 1013 ! function 1014 TYPE(TATT) :: tf_att 1015 909 1016 !local value 910 1017 CHARACTER(LEN=lc) :: cl_value … … 912 1019 913 1020 ! clean attribute 914 CALL att_clean( att__init_i4_0d)1021 CALL att_clean(tf_att) 915 1022 916 1023 cl_value="(/"//TRIM(fct_str(id_value))//"/)" … … 920 1027 & " attibute value "//TRIM(ADJUSTL(cl_value)) ) 921 1028 922 att__init_i4_0d%c_name=TRIM(ADJUSTL(cd_name))1029 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 923 1030 924 1031 IF( PRESENT(id_type) )THEN 925 att__init_i4_0d%i_type=id_type1032 tf_att%i_type=id_type 926 1033 ELSE 927 att__init_i4_0d%i_type=NF90_INT928 ENDIF 929 930 IF( ASSOCIATED( att__init_i4_0d%d_value) )THEN931 DEALLOCATE( att__init_i4_0d%d_value)932 ENDIF 933 ALLOCATE( att__init_i4_0d%d_value(1))934 935 att__init_i4_0d%d_value(1)=REAL(id_value,dp)936 att__init_i4_0d%i_len=11034 tf_att%i_type=NF90_INT 1035 ENDIF 1036 1037 IF( ASSOCIATED(tf_att%d_value) )THEN 1038 DEALLOCATE(tf_att%d_value) 1039 ENDIF 1040 ALLOCATE(tf_att%d_value(1)) 1041 1042 tf_att%d_value(1)=REAL(id_value,dp) 1043 tf_att%i_len=1 937 1044 938 1045 END FUNCTION att__init_i4_0d 1046 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1047 FUNCTION att__init_i8(cd_name, kd_value, id_type) & 1048 & RESULT (tf_att) 939 1049 !------------------------------------------------------------------- 940 1050 !> @brief This function initialize an attribute structure with array … … 951 1061 !> @return attribute structure 952 1062 !------------------------------------------------------------------- 953 TYPE(TATT) FUNCTION att__init_i8( cd_name, kd_value, id_type ) 954 IMPLICIT NONE 1063 1064 IMPLICIT NONE 1065 955 1066 ! Argument 956 1067 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 958 1069 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 959 1070 1071 ! function 1072 TYPE(TATT) :: tf_att 1073 960 1074 ! local value 961 1075 INTEGER(i4) :: il_len … … 967 1081 968 1082 ! clean attribute 969 CALL att_clean( att__init_i8)1083 CALL att_clean(tf_att) 970 1084 971 1085 ! array size … … 982 1096 & " attibute value "//TRIM(ADJUSTL(cl_value)) ) 983 1097 984 att__init_i8%c_name=TRIM(ADJUSTL(cd_name))1098 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 985 1099 986 1100 IF( PRESENT(id_type) )THEN 987 att__init_i8%i_type=id_type1101 tf_att%i_type=id_type 988 1102 ELSE 989 att__init_i8%i_type=NF90_INT990 ENDIF 991 992 IF( ASSOCIATED( att__init_i8%d_value) )THEN993 DEALLOCATE( att__init_i8%d_value)994 ENDIF 995 ALLOCATE( att__init_i8%d_value(il_len))996 997 att__init_i8%d_value(:)=REAL(kd_value(:),dp)998 att__init_i8%i_len=il_len1103 tf_att%i_type=NF90_INT 1104 ENDIF 1105 1106 IF( ASSOCIATED(tf_att%d_value) )THEN 1107 DEALLOCATE(tf_att%d_value) 1108 ENDIF 1109 ALLOCATE(tf_att%d_value(il_len)) 1110 1111 tf_att%d_value(:)=REAL(kd_value(:),dp) 1112 tf_att%i_len=il_len 999 1113 1000 1114 END FUNCTION att__init_i8 1115 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1116 FUNCTION att__init_i8_0d(cd_name, kd_value, id_type) & 1117 & RESULT (tf_att) 1001 1118 !------------------------------------------------------------------- 1002 1119 !> @brief This function initialize an attribute structure with … … 1013 1130 !> @return attribute structure 1014 1131 !------------------------------------------------------------------- 1015 TYPE(TATT) FUNCTION att__init_i8_0d( cd_name, kd_value, id_type ) 1016 IMPLICIT NONE 1132 1133 IMPLICIT NONE 1134 1017 1135 ! Argument 1018 1136 CHARACTER(LEN=*), INTENT(IN) :: cd_name … … 1020 1138 INTEGER(i4) , INTENT(IN), OPTIONAL :: id_type 1021 1139 1140 ! function 1141 TYPE(TATT) :: tf_att 1142 1022 1143 ! local value 1023 1144 CHARACTER(LEN=lc) :: cl_value … … 1025 1146 1026 1147 ! clean attribute 1027 CALL att_clean( att__init_i8_0d)1148 CALL att_clean(tf_att) 1028 1149 1029 1150 cl_value="(/"//TRIM(fct_str(kd_value))//"/)" … … 1033 1154 & " attibute value "//TRIM(ADJUSTL(cl_value)) ) 1034 1155 1035 att__init_i8_0d%c_name=TRIM(ADJUSTL(cd_name))1156 tf_att%c_name=TRIM(ADJUSTL(cd_name)) 1036 1157 1037 1158 IF( PRESENT(id_type) )THEN 1038 att__init_i8_0d%i_type=id_type1159 tf_att%i_type=id_type 1039 1160 ELSE 1040 att__init_i8_0d%i_type=NF90_INT1041 ENDIF 1042 1043 IF( ASSOCIATED( att__init_i8_0d%d_value) )THEN1044 DEALLOCATE( att__init_i8_0d%d_value)1045 ENDIF 1046 ALLOCATE( att__init_i8_0d%d_value(1))1047 1048 att__init_i8_0d%d_value(1)=REAL(kd_value,dp)1049 att__init_i8_0d%i_len=11161 tf_att%i_type=NF90_INT 1162 ENDIF 1163 1164 IF( ASSOCIATED(tf_att%d_value) )THEN 1165 DEALLOCATE(tf_att%d_value) 1166 ENDIF 1167 ALLOCATE(tf_att%d_value(1)) 1168 1169 tf_att%d_value(1)=REAL(kd_value,dp) 1170 tf_att%i_len=1 1050 1171 1051 1172 END FUNCTION att__init_i8_0d 1173 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1174 SUBROUTINE att__print_arr(td_att) 1052 1175 !------------------------------------------------------------------- 1053 1176 !> @brief This subroutine print informations of an array of attribute. … … 1058 1181 !> @param[in] td_att array of attribute structure 1059 1182 !------------------------------------------------------------------- 1060 SUBROUTINE att__print_arr(td_att) 1183 1061 1184 IMPLICIT NONE 1062 1185 … … 1073 1196 1074 1197 END SUBROUTINE att__print_arr 1198 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1199 SUBROUTINE att__print_unit(td_att) 1075 1200 !------------------------------------------------------------------- 1076 1201 !> @brief This subroutine print attribute information. … … 1083 1208 !> @param[in] td_att attribute structure 1084 1209 !------------------------------------------------------------------- 1085 SUBROUTINE att__print_unit(td_att) 1210 1086 1211 IMPLICIT NONE 1087 1212 … … 1205 1330 1206 1331 END SUBROUTINE att__print_unit 1332 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1333 SUBROUTINE att__clean_unit(td_att) 1207 1334 !------------------------------------------------------------------- 1208 1335 !> @brief … … 1211 1338 !> @author J.Paul 1212 1339 !> @date November, 2013 - Initial Version 1213 ! 1340 !> @date January, 2019 1341 !> - nullify array inside attribute structure 1342 !> 1214 1343 !> @param[inout] td_att attribute strcuture 1215 1344 !------------------------------------------------------------------- 1216 SUBROUTINE att__clean_unit( td_att ) 1217 IMPLICIT NONE 1345 1346 IMPLICIT NONE 1347 1218 1348 ! Argument 1219 1349 TYPE(TATT), INTENT(INOUT) :: td_att … … 1229 1359 ! clean value 1230 1360 DEALLOCATE(td_att%d_value) 1361 NULLIFY(td_att%d_value) 1231 1362 ENDIF 1232 1363 … … 1235 1366 1236 1367 END SUBROUTINE att__clean_unit 1368 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1369 SUBROUTINE att__clean_arr(td_att) 1237 1370 !------------------------------------------------------------------- 1238 1371 !> @brief … … 1244 1377 !> @param[inout] td_att attribute strcuture 1245 1378 !------------------------------------------------------------------- 1246 SUBROUTINE att__clean_arr( td_att ) 1247 IMPLICIT NONE 1379 1380 IMPLICIT NONE 1381 1248 1382 ! Argument 1249 1383 TYPE(TATT), DIMENSION(:), INTENT(INOUT) :: td_att … … 1259 1393 1260 1394 END SUBROUTINE att__clean_arr 1395 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 SUBROUTINE att_get_dummy(cd_dummy) 1261 1397 !------------------------------------------------------------------- 1262 1398 !> @brief This subroutine fill dummy attribute array … … 1266 1402 !> @date Marsh, 2016 1267 1403 !> - close file (bugfix) 1268 ! 1404 !> @date May, 2019 1405 !> - read number of dummy element 1406 !> 1269 1407 !> @param[in] cd_dummy dummy configuration file 1270 1408 !------------------------------------------------------------------- 1271 SUBROUTINE att_get_dummy( cd_dummy ) 1272 IMPLICIT NONE 1409 1410 IMPLICIT NONE 1411 1273 1412 ! Argument 1274 1413 CHARACTER(LEN=*), INTENT(IN) :: cd_dummy … … 1280 1419 LOGICAL :: ll_exist 1281 1420 1282 ! loop indices1283 1421 ! namelist 1422 INTEGER(i4) :: in_ndumvar 1423 INTEGER(i4) :: in_ndumdim 1424 INTEGER(i4) :: in_ndumatt 1284 1425 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumvar 1285 1426 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumdim 1286 1427 CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumatt 1287 1288 1428 !---------------------------------------------------------------- 1289 1429 NAMELIST /namdum/ & !< dummy namelist 1430 & in_ndumvar,& !< number of dummy elt in variable array 1431 & in_ndumdim,& !< number of dummy elt in dimension array 1432 & in_ndumatt,& !< number of dummy elt in attribute array 1290 1433 & cn_dumvar, & !< variable name 1291 1434 & cn_dumdim, & !< dimension name … … 1314 1457 1315 1458 READ( il_fileid, NML = namdum ) 1316 cm_dumatt(:)=cn_dumatt(:) 1459 im_ndumatt = in_ndumatt 1460 cm_dumatt(:)= cn_dumatt(:) 1317 1461 1318 1462 CLOSE( il_fileid ) 1463 1464 IF( im_ndumatt > ip_maxdumcfg )THEN 1465 CALL logger_fatal("ATT GET dUMMY : too much dummy attributes & 1466 & ( >"//fct_str(ip_maxdumcfg)//" ). & 1467 & set ip_maxdumcfg to higher value.") 1468 ENDIF 1319 1469 1320 1470 ENDIF 1321 1471 1322 1472 END SUBROUTINE att_get_dummy 1473 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1474 FUNCTION att_is_dummy(td_att) & 1475 & RESULT (lf_dummy) 1323 1476 !------------------------------------------------------------------- 1324 1477 !> @brief This function check if attribute is defined as dummy attribute … … 1327 1480 !> @author J.Paul 1328 1481 !> @date September, 2015 - Initial Version 1329 ! 1482 !> @date, May, 2019 1483 !> - use number of dummy elt in do-loop 1484 !> 1330 1485 !> @param[in] td_att attribute structure 1331 1486 !> @return true if attribute is dummy attribute 1332 1487 !------------------------------------------------------------------- 1333 FUNCTION att_is_dummy(td_att) 1488 1334 1489 IMPLICIT NONE 1335 1490 … … 1338 1493 1339 1494 ! function 1340 LOGICAL :: att_is_dummy1495 LOGICAL :: lf_dummy 1341 1496 1342 1497 ! loop indices … … 1344 1499 !---------------------------------------------------------------- 1345 1500 1346 att_is_dummy=.FALSE. 1347 DO ji=1,ip_maxdumcfg 1501 CALL logger_trace("ATT IS DUMMY : check if attribute is useless") 1502 1503 lf_dummy=.FALSE. 1504 DO ji=1,im_ndumatt 1348 1505 IF( fct_lower(td_att%c_name) == fct_lower(cm_dumatt(ji)) )THEN 1349 att_is_dummy=.TRUE.1506 lf_dummy=.TRUE. 1350 1507 EXIT 1351 1508 ENDIF 1352 1509 ENDDO 1353 1510 1511 CALL logger_trace("ATT IS DUMMY : check ok") 1512 1354 1513 END FUNCTION att_is_dummy 1514 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1355 1515 END MODULE att 1356 1516
Note: See TracChangeset
for help on using the changeset viewer.