Changeset 12080 for utils/tools/SIREN/src/iom_mpp.f90
- Timestamp:
- 2019-12-06T10:30:14+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
utils/tools/SIREN/src/iom_mpp.f90
r9598 r12080 2 2 ! NEMO system team, System and Interface for oceanic RElocable Nesting 3 3 !---------------------------------------------------------------------- 4 !5 ! MODULE: iom_mpp6 4 ! 7 5 ! DESCRIPTION: … … 86 84 !> @author 87 85 !> J.Paul 88 ! REVISION HISTORY:86 !> 89 87 !> @date November, 2013 - Initial Version 90 88 !> 91 !> @note Software governed by the CeCILL licence ( ./LICENSE)89 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 92 90 !---------------------------------------------------------------------- 93 91 MODULE iom_mpp 92 94 93 USE netcdf ! nf90 library 95 94 USE global ! global parameter … … 103 102 USE iom ! I/O manager 104 103 USE mpp ! mpp manager 104 105 105 IMPLICIT NONE 106 106 ! NOTE_avoid_public_variables_if_possible … … 123 123 124 124 CONTAINS 125 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 126 SUBROUTINE iom_mpp_open(td_mpp, id_perio, id_ew) 125 127 !------------------------------------------------------------------- 126 128 !> @brief This subroutine open files composing mpp structure to be used. … … 138 140 !> @author J.Paul 139 141 !> @date November, 2013 - Initial Version 140 ! 142 !> @date August, 2017 143 !> - handle use of domain decomposition for monoproc file 144 !> 141 145 !> @param[inout] td_mpp mpp structure 142 146 !------------------------------------------------------------------- 143 SUBROUTINE iom_mpp_open(td_mpp, id_perio, id_ew) 147 144 148 IMPLICIT NONE 149 145 150 ! Argument 146 151 TYPE(TMPP) , INTENT(INOUT) :: td_mpp … … 150 155 ! local variable 151 156 CHARACTER(LEN=lc) :: cl_name 157 INTEGER(i4) :: il_pid 158 INTEGER(i4) :: il_impp 159 INTEGER(i4) :: il_jmpp 160 INTEGER(i4) :: il_lci 161 INTEGER(i4) :: il_lcj 162 INTEGER(i4) :: il_ldi 163 INTEGER(i4) :: il_ldj 164 INTEGER(i4) :: il_lei 165 INTEGER(i4) :: il_lej 166 LOGICAL :: ll_ctr 167 LOGICAL :: ll_use 168 LOGICAL :: ll_create 169 INTEGER(i4) :: il_iind 170 INTEGER(i4) :: il_jind 152 171 153 172 ! loop indices … … 175 194 176 195 td_mpp%t_proc(:)%c_type=TRIM(td_mpp%c_type) 177 IF( td_mpp%i_nproc > 1 )THEN196 IF( td_mpp%i_nproc > 1 .AND. td_mpp%l_usempp )THEN 178 197 DO ji=1,td_mpp%i_nproc 179 198 IF( td_mpp%t_proc(ji)%l_use )THEN … … 200 219 201 220 CALL iom_open(td_mpp%t_proc(1)) 221 222 IF( .NOT. td_mpp%l_usempp )THEN 223 ! copy file structure of first proc, except layout decomposition 224 ! do not do it when creating output file. 225 ll_create=( ALL(td_mpp%t_proc(:)%l_wrt) .AND. & 226 & ALL(td_mpp%t_proc(:)%l_use) ) 227 IF( .NOT. ll_create )THEN 228 DO ji=2,td_mpp%i_nproc 229 IF( td_mpp%t_proc(ji)%l_use )THEN 230 il_pid = td_mpp%t_proc(ji)%i_pid 231 il_impp = td_mpp%t_proc(ji)%i_impp 232 il_jmpp = td_mpp%t_proc(ji)%i_jmpp 233 il_lci = td_mpp%t_proc(ji)%i_lci 234 il_lcj = td_mpp%t_proc(ji)%i_lcj 235 il_ldi = td_mpp%t_proc(ji)%i_ldi 236 il_ldj = td_mpp%t_proc(ji)%i_ldj 237 il_lei = td_mpp%t_proc(ji)%i_lei 238 il_lej = td_mpp%t_proc(ji)%i_lej 239 ll_ctr = td_mpp%t_proc(ji)%l_ctr 240 ll_use = td_mpp%t_proc(ji)%l_use 241 il_iind = td_mpp%t_proc(ji)%i_iind 242 il_jind = td_mpp%t_proc(ji)%i_jind 243 244 td_mpp%t_proc(ji)=file_copy(td_mpp%t_proc(1)) 245 td_mpp%t_proc(ji)%i_id=td_mpp%t_proc(1)%i_id 246 td_mpp%t_proc(ji)%l_def=.FALSE. 247 248 td_mpp%t_proc(ji)%i_pid = il_pid 249 td_mpp%t_proc(ji)%i_impp = il_impp 250 td_mpp%t_proc(ji)%i_jmpp = il_jmpp 251 td_mpp%t_proc(ji)%i_lci = il_lci 252 td_mpp%t_proc(ji)%i_lcj = il_lcj 253 td_mpp%t_proc(ji)%i_ldi = il_ldi 254 td_mpp%t_proc(ji)%i_ldj = il_ldj 255 td_mpp%t_proc(ji)%i_lei = il_lei 256 td_mpp%t_proc(ji)%i_lej = il_lej 257 td_mpp%t_proc(ji)%l_ctr = ll_ctr 258 td_mpp%t_proc(ji)%l_use = ll_use 259 td_mpp%t_proc(ji)%i_iind = il_iind 260 td_mpp%t_proc(ji)%i_jind = il_jind 261 ENDIF 262 ENDDO 263 ELSE 264 ! keep file id 265 DO ji=2,td_mpp%i_nproc 266 IF( td_mpp%t_proc(ji)%l_use )THEN 267 td_mpp%t_proc(ji)%i_id=td_mpp%t_proc(1)%i_id 268 td_mpp%t_proc(ji)%l_def=.FALSE. 269 ENDIF 270 ENDDO 271 ENDIF 272 ENDIF 273 202 274 ENDIF 203 275 … … 219 291 220 292 END SUBROUTINE iom_mpp_open 293 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 294 SUBROUTINE iom_mpp_create(td_mpp) 221 295 !------------------------------------------------------------------- 222 296 !> @brief This subroutine create files, composing mpp structure to be used, … … 225 299 !> @author J.Paul 226 300 !> @date November, 2013 - Initial Version 227 ! 301 !> 228 302 !> @param[inout] td_mpp mpp structure 229 303 !------------------------------------------------------------------- 230 SUBROUTINE iom_mpp_create(td_mpp) 304 231 305 IMPLICIT NONE 306 232 307 ! Argument 233 308 TYPE(TMPP), INTENT(INOUT) :: td_mpp … … 247 322 248 323 END SUBROUTINE iom_mpp_create 324 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 SUBROUTINE iom_mpp_close(td_mpp) 249 326 !------------------------------------------------------------------- 250 327 !> @brief This subroutine close files composing mpp structure. … … 252 329 !> @author J.Paul 253 330 !> @date November, 2013 - Initial Version 254 ! 331 !> 255 332 !> @param[in] td_mpp mpp structure 256 333 !------------------------------------------------------------------- 257 SUBROUTINE iom_mpp_close(td_mpp) 334 258 335 IMPLICIT NONE 336 259 337 ! Argument 260 338 TYPE(TMPP), INTENT(INOUT) :: td_mpp … … 273 351 td_mpp%i_id=0 274 352 275 DO ji=1,td_mpp%i_nproc 276 IF( td_mpp%t_proc(ji)%i_id /= 0 )THEN 277 CALL iom_close(td_mpp%t_proc(ji)) 353 IF( td_mpp%l_usempp )THEN 354 DO ji=1,td_mpp%i_nproc 355 IF( td_mpp%t_proc(ji)%i_id /= 0 )THEN 356 CALL iom_close(td_mpp%t_proc(ji)) 357 ENDIF 358 ENDDO 359 ELSE 360 IF( td_mpp%t_proc(1)%i_id /= 0 )THEN 361 CALL iom_close(td_mpp%t_proc(1)) 362 td_mpp%t_proc(:)%i_id=0 278 363 ENDIF 279 END DO364 ENDIF 280 365 td_mpp%t_proc(:)%l_use=.FALSE. 366 281 367 ENDIF 282 368 283 369 END SUBROUTINE iom_mpp_close 370 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 371 FUNCTION iom_mpp__read_var_id(td_mpp, id_varid, id_start, id_count) & 372 & RESULT (tf_var) 284 373 !------------------------------------------------------------------- 285 374 !> @brief This function read variable value in opened mpp files, … … 302 391 !> @return variable structure 303 392 !------------------------------------------------------------------- 304 TYPE(TVAR) FUNCTION iom_mpp__read_var_id(td_mpp, id_varid,& 305 & id_start, id_count) 393 306 394 IMPLICIT NONE 395 307 396 ! Argument 308 397 TYPE(TMPP), INTENT(IN) :: td_mpp … … 311 400 INTEGER(i4), DIMENSION(:), INTENT(IN), OPTIONAL :: id_count 312 401 402 ! function 403 TYPE(TVAR) :: tf_var 404 313 405 ! local variable 314 406 INTEGER(i4), DIMENSION(1) :: il_ind … … 334 426 IF( il_ind(1) /= 0 )THEN 335 427 336 iom_mpp__read_var_id=var_copy(td_mpp%t_proc(1)%t_var(il_ind(1)))428 tf_var=var_copy(td_mpp%t_proc(1)%t_var(il_ind(1))) 337 429 338 430 !!! read variable value 339 CALL iom_mpp__read_var_value(td_mpp, iom_mpp__read_var_id, & 340 & id_start, id_count) 431 CALL iom_mpp__read_var_value(td_mpp, tf_var, id_start, id_count) 341 432 342 433 ELSE … … 354 445 355 446 END FUNCTION iom_mpp__read_var_id 447 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 FUNCTION iom_mpp__read_var_name(td_mpp, cd_name, id_start, id_count) & 449 & RESULT (tf_var) 356 450 !------------------------------------------------------------------- 357 451 !> @brief This function read variable value in opened mpp files, … … 365 459 !> exist in file, look for variable standard name.<br/> 366 460 !> If variable name is not present, check variable standard name.<br/> 367 ! 461 !> 368 462 !> @author J.Paul 369 463 !> @date November, 2013 - Initial Version 370 464 !> @date October, 2014 371 465 !> - use start and count array instead of domain structure. 372 ! 466 !> 373 467 !> @param[in] td_mpp mpp structure 374 468 !> @param[in] cd_name variable name … … 378 472 !> @return variable structure 379 473 !------------------------------------------------------------------- 380 TYPE(TVAR) FUNCTION iom_mpp__read_var_name(td_mpp, cd_name, & 381 & id_start, id_count ) 474 382 475 IMPLICIT NONE 476 383 477 ! Argument 384 478 TYPE(TMPP), INTENT(IN) :: td_mpp 385 479 CHARACTER(LEN=*), INTENT(IN) :: cd_name 386 480 INTEGER(i4), DIMENSION(:), INTENT(IN), OPTIONAL :: id_start 387 INTEGER(i4), DIMENSION(:), INTENT(IN), OPTIONAL :: id_count 481 INTEGER(i4), DIMENSION(:), INTENT(IN), OPTIONAL :: id_count 482 483 ! function 484 TYPE(TVAR) :: tf_var 388 485 389 486 ! local variable … … 400 497 CALL logger_error( " IOM MPP READ VAR: mpp structure not opened. "//& 401 498 & " can not read variable in "//TRIM(td_mpp%c_name)) 402 499 403 500 ELSE 404 501 … … 406 503 IF( il_ind /= 0 )THEN 407 504 408 iom_mpp__read_var_name=var_copy(td_mpp%t_proc(1)%t_var(il_ind))505 tf_var=var_copy(td_mpp%t_proc(1)%t_var(il_ind)) 409 506 410 507 !!! read variable value 411 CALL iom_mpp__read_var_value( td_mpp, & 412 & iom_mpp__read_var_name, & 413 & id_start, id_count) 508 CALL iom_mpp__read_var_value( td_mpp, tf_var, id_start, id_count) 414 509 415 510 ELSE … … 424 519 425 520 END FUNCTION iom_mpp__read_var_name 521 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 522 SUBROUTINE iom_mpp__read_var_value(td_mpp, td_var, id_start, id_count) 426 523 !------------------------------------------------------------------- 427 524 !> @brief This subroutine read variable value … … 431 528 !> Optionally start indices and number of point to be read could be specify. 432 529 !> as well as East West ovelap of the global domain. 433 ! 530 !> 434 531 !> @author J.Paul 435 532 !> @date November, 2013 - Initial Version … … 443 540 !> @param[in] id_count number of indices selected along each dimension 444 541 !------------------------------------------------------------------- 445 SUBROUTINE iom_mpp__read_var_value(td_mpp, td_var, & 446 & id_start, id_count ) 542 447 543 IMPLICIT NONE 544 448 545 ! Argument 449 TYPE(TMPP) , INTENT(IN):: td_mpp450 TYPE(TVAR) ,INTENT(INOUT) :: td_var451 INTEGER(i4), DIMENSION(:), INTENT(IN ),OPTIONAL :: id_start452 INTEGER(i4), DIMENSION(:), INTENT(IN ),OPTIONAL :: id_count546 TYPE(TMPP) , INTENT(IN ) :: td_mpp 547 TYPE(TVAR) , INTENT(INOUT) :: td_var 548 INTEGER(i4), DIMENSION(:), INTENT(IN ), OPTIONAL :: id_start 549 INTEGER(i4), DIMENSION(:), INTENT(IN ), OPTIONAL :: id_count 453 550 454 551 ! local variable … … 494 591 & TRIM(fct_str(il_count(jp_K)))//","//& 495 592 & TRIM(fct_str(il_count(jp_L))) ) 593 594 !IF( td_mpp%l_usempp .AND. (PRESENT(id_start) .OR. PRESENT(id_count)))THEN 595 ! CALL logger_fatal("IOM MPP READ VAR VALUE: should not use"//& 596 ! & " start or count arguments when usempp is False.") 597 !ENDIF 496 598 497 599 DO jk=1,ip_maxdim … … 574 676 575 677 IF( (il_i1<=il_i2).AND.(il_j1<=il_j2) )THEN 576 il_strt(:)=(/ il_i1-il_i1p+1, & 577 & il_j1-il_j1p+1, & 578 & 1,1 /) 678 IF( td_mpp%l_usempp )THEN 679 il_strt(:)=(/ il_i1-il_i1p+1, & 680 & il_j1-il_j1p+1, & 681 & 1,1 /) 682 ELSE 683 il_strt(:)=(/ il_i1, & 684 & il_j1, & 685 & 1,1 /) 686 ENDIF 579 687 580 688 il_cnt(:)=(/ il_i2-il_i1+1, & … … 616 724 617 725 END SUBROUTINE iom_mpp__read_var_value 726 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 727 SUBROUTINE iom_mpp_write_file(td_mpp, cd_dimorder) 618 728 !------------------------------------------------------------------- 619 729 !> @brief This subroutine write files composing mpp structure. 620 ! 730 !> 621 731 !> @details 622 732 !> optionally, you could specify the dimension order (default 'xyzt') 623 ! 733 !> 624 734 !> @author J.Paul 625 735 !> @date November, 2013 - Initial Version 626 !> @date July, 2015 - add dimension order option 627 ! 736 !> @date July, 2015 737 !> - add dimension order option 738 !> @date August, 2017 739 !> - handle use of domain decomposition for monoproc file 740 !> 628 741 !> @param[inout] td_mpp mpp structure 629 !> @param[ In] cd_dimorder dimension order630 !------------------------------------------------------------------- 631 SUBROUTINE iom_mpp_write_file(td_mpp, cd_dimorder) 742 !> @param[in] cd_dimorder dimension order 743 !------------------------------------------------------------------- 744 632 745 IMPLICIT NONE 746 633 747 ! Argument 634 748 TYPE(TMPP) , INTENT(INOUT) :: td_mpp … … 639 753 INTEGER(i4) :: ji 640 754 !---------------------------------------------------------------- 755 641 756 ! check if mpp exist 642 757 IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN … … 646 761 647 762 ELSE 648 DO ji=1, td_mpp%i_nproc 649 IF( td_mpp%t_proc(ji)%i_id /= 0 )THEN 650 CALL iom_write_file(td_mpp%t_proc(ji), cd_dimorder) 651 ELSE 652 CALL logger_debug( " MPP WRITE: no id associated to file "//& 653 & TRIM(td_mpp%t_proc(ji)%c_name) ) 763 IF( td_mpp%l_usempp )THEN 764 DO ji=1, td_mpp%i_nproc 765 IF( td_mpp%t_proc(ji)%i_id /= 0 )THEN 766 CALL logger_debug("MPP WRITE: proc "//TRIM(fct_str(ji))) 767 CALL iom_write_file(td_mpp%t_proc(ji), cd_dimorder) 768 ELSE 769 CALL logger_debug( " MPP WRITE: no id associated to file "//& 770 & TRIM(td_mpp%t_proc(ji)%c_name) ) 771 ENDIF 772 ENDDO 773 ELSE 774 CALL iom_write_header(td_mpp%t_proc(1), cd_dimorder, td_mpp%t_dim(:)) 775 776 CALL iom_mpp__write_var(td_mpp, cd_dimorder) 777 ENDIF 778 ENDIF 779 780 END SUBROUTINE iom_mpp_write_file 781 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 782 SUBROUTINE iom_mpp__write_var(td_mpp, cd_dimorder) 783 !------------------------------------------------------------------- 784 !> @brief This subroutine write variables from mpp structure in one output 785 !> file. 786 !> 787 !> @details 788 !> optionally, you could specify the dimension order (default 'xyzt') 789 !> 790 !> @author J.Paul 791 !> @date August, 2017 - Initial Version 792 !> 793 !> @param[inout] td_mpp mpp structure 794 !> @param[in] cd_dimorder dimension order 795 !------------------------------------------------------------------- 796 797 IMPLICIT NONE 798 799 ! Argument 800 TYPE(TMPP) , INTENT(INOUT) :: td_mpp 801 CHARACTER(LEN=*), INTENT(IN ), OPTIONAL :: cd_dimorder 802 803 ! local variable 804 INTEGER(i4), DIMENSION(4) :: il_ind 805 INTEGER(i4) :: il_i1p 806 INTEGER(i4) :: il_i2p 807 INTEGER(i4) :: il_j1p 808 INTEGER(i4) :: il_j2p 809 INTEGER(i4) :: il_i1 810 INTEGER(i4) :: il_i2 811 INTEGER(i4) :: il_j1 812 INTEGER(i4) :: il_j2 813 814 INTEGER(i4), DIMENSION(ip_maxdim) :: il_start 815 INTEGER(i4), DIMENSION(ip_maxdim) :: il_count 816 817 INTEGER(i4), DIMENSION(ip_maxdim) :: il_strt 818 INTEGER(i4), DIMENSION(ip_maxdim) :: il_cnt 819 820 REAL(dp) :: dl_fill 821 822 TYPE(TFILE) :: tl_file 823 824 ! loop indices 825 INTEGER(i4) :: ji 826 INTEGER(i4) :: jj 827 !---------------------------------------------------------------- 828 829 ! write variable in file 830 DO jj = 1, td_mpp%i_nproc 831 832 ! link 833 tl_file=td_mpp%t_proc(jj) 834 CALL logger_debug("IOM MPP WRITE: proc "//fct_str(jj)) 835 836 ! get processor indices 837 il_ind(:)=mpp_get_proc_index( td_mpp, jj ) 838 il_i1p = il_ind(1) 839 il_i2p = il_ind(2) 840 il_j1p = il_ind(3) 841 il_j2p = il_ind(4) 842 843 IF( jj > 1 )THEN 844 ! force to use id from variable write on first proc 845 tl_file%t_var(:)%i_id=td_mpp%t_proc(1)%t_var(:)%i_id 846 ENDIF 847 848 DO ji = 1, tl_file%i_nvar 849 850 IF( jj > 1 )THEN 851 ! check _FillValue 852 dl_fill=td_mpp%t_proc(1)%t_var(ji)%d_fill 853 IF( tl_file%t_var(ji)%d_fill /= dl_fill )THEN 854 CALL var_chg_FillValue( tl_file%t_var(ji), dl_fill ) 855 ENDIF 654 856 ENDIF 857 858 il_start(:)=1 859 il_count(:)=td_mpp%t_dim(:)%i_len 860 861 IF( .NOT. tl_file%t_var(ji)%t_dim(1)%l_use )THEN 862 il_i1p=1 ; il_i2p=1 863 il_count(1) = 1 864 ENDIF 865 IF( .NOT. tl_file%t_var(ji)%t_dim(2)%l_use )THEN 866 il_j1p=1 ; il_j2p=1 867 il_count(2) = 1 868 ENDIF 869 870 il_i1=MAX(il_i1p, il_start(1)) 871 il_i2=MIN(il_i2p, il_count(1)) 872 873 il_j1=MAX(il_j1p, il_start(2)) 874 il_j2=MIN(il_j2p, il_count(2)) 875 876 IF( (il_i1<=il_i2).AND.(il_j1<=il_j2) )THEN 877 il_strt(:)=(/ il_i1, & 878 & il_j1, & 879 & 1,1 /) 880 881 il_cnt(:)=(/ il_i2-il_i1+1, & 882 & il_j2-il_j1+1, & 883 & tl_file%t_var(ji)%t_dim(3)%i_len, & 884 & tl_file%t_var(ji)%t_dim(4)%i_len /) 885 886 CALL iom_write_var(tl_file, cd_dimorder, & 887 & id_start=il_strt(:), & 888 & id_count=il_cnt(:)) 889 ENDIF 890 655 891 ENDDO 656 ENDIF 657 END SUBROUTINE iom_mpp_write_file 892 ENDDO 893 894 END SUBROUTINE iom_mpp__write_var 895 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 658 896 END MODULE iom_mpp
Note: See TracChangeset
for help on using the changeset viewer.