Changeset 4591 for palm/trunk/SOURCE/shared_memory_io_mod.f90
- Timestamp:
- Jul 6, 2020 3:56:08 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/shared_memory_io_mod.f90
r4536 r4591 1 1 !> @file shared_memory_io_mod.f90 2 !------------------------------------------------------------------------------! 3 ! This file is part of PALM. 4 ! 5 ! PALM is free software: you can redistribute it and/or modify it under the 6 ! terms of the GNU General Public License as published by the Free Software 7 ! Foundation, either version 3 of the License, or (at your option) any later 8 ! version. 9 ! 10 ! PALM is distributed in the hope that it will be useful, but WITHOUT ANY 11 ! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 12 ! A PARTICULAR PURPOSE. See the GNU General Public License for more details. 13 ! 14 ! You should have received a copy of the GNU General Public License along with 15 ! PALM. If not, see <http://www.gnu.org/licenses/>. 2 !--------------------------------------------------------------------------------------------------! 3 ! This file is part of the PALM model system. 4 ! 5 ! PALM is free software: you can redistribute it and/or modify it under the terms of the GNU General 6 ! Public License as published by the Free Software Foundation, either version 3 of the License, or 7 ! (at your option) any later version. 8 ! 9 ! PALM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 10 ! implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 ! Public License for more details. 12 ! 13 ! You should have received a copy of the GNU General Public License along with PALM. If not, see 14 ! <http://www.gnu.org/licenses/>. 16 15 ! 17 16 ! Copyright 1997-2020 Leibniz Universitaet Hannover 18 !------------------------------------------------------------------------------! 17 !--------------------------------------------------------------------------------------------------! 18 ! 19 19 ! 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 23 ! 22 ! 23 ! 24 24 ! Former revisions: 25 25 ! $Id$ 26 26 ! 27 ! File re-formatted to follow the PALM coding standard 28 ! 29 ! 30 ! 27 31 ! Initial version (Klaus Ketelsen) 28 32 ! 29 ! 30 ! 31 ! Description: 32 ! ------------ 33 !> handle MPI-IO or NetCDF-IO shared memory arrays.34 !> This module performs the organization of new communicators, adapted PE-grids 35 !> and allocation ofshared memory arrays. The IO itself is not done here.36 !------------------------------------------------------------------------------ !33 ! 34 ! 35 ! Description: 36 ! ------------ 37 !> Handle MPI-IO or NetCDF-IO shared memory arrays. 38 !> This module performs the organization of new communicators, adapted PE-grids and allocation of 39 !> shared memory arrays. The IO itself is not done here. 40 !--------------------------------------------------------------------------------------------------! 37 41 MODULE shared_memory_io_mod 38 42 … … 48 52 49 53 USE control_parameters, & 50 ONLY: maximum_grid_level, mg_switch_to_pe0_level, message_string 54 ONLY: maximum_grid_level, & 55 message_string, & 56 mg_switch_to_pe0_level 57 51 58 52 59 USE indices, & 53 ONLY: nbgp, nnx, nny, nnz, nx, nxl, nxlg, nxr, nxrg, ny, nyn, nyng, nys, nysg, nzb, nzt 60 ONLY: nbgp, & 61 nnx, & 62 nny, & 63 nnz, & 64 nx, & 65 nxl, & 66 nxlg, & 67 nxr, & 68 nxrg, & 69 ny, & 70 nyn, & 71 nyng, & 72 nys, & 73 nysg, & 74 nzb, & 75 nzt 54 76 55 77 USE kinds, & 56 ONLY: wp, iwp 78 ONLY: iwp, & 79 wp 80 57 81 58 82 USE transpose_indices, & 59 ONLY: nys_x, nyn_x, nys_z, nyn_z, nxl_z, nxr_z 83 ONLY: nxl_z, & 84 nxr_z, & 85 nyn_x, & 86 nyn_z, & 87 nys_x, & 88 nys_z 89 90 60 91 61 92 USE pegrid, & 62 ONLY: comm1dx, comm1dy, comm2d, ierr, myid, myidx, myidy, npex, npey, numprocs, pdims, & 63 pleft, pnorth, pright, psouth, sendrecvcount_xy 93 ONLY: comm1dx, & 94 comm1dy, & 95 comm2d, & 96 ierr, & 97 myid, & 98 myidx, & 99 myidy, & 100 npex, & 101 npey, & 102 numprocs, & 103 pdims, & 104 pleft, & 105 pnorth, & 106 pright, & 107 psouth, & 108 sendrecvcount_xy 109 64 110 #if defined( __parallel ) 65 111 USE pegrid, & 66 ONLY: pcoord, reorder 112 ONLY: pcoord, & 113 reorder 67 114 #endif 68 115 … … 75 122 ! 76 123 !-- Type to store grid information 77 TYPE, PUBLIC :: local_boundaries 78 79 INTEGER(iwp) :: nxl 80 INTEGER(iwp) :: nxr 81 INTEGER(iwp) :: nys 82 INTEGER(iwp) :: nyn 83 INTEGER(iwp) :: nnx 84 INTEGER(iwp) :: nny 85 INTEGER(iwp) :: nx 86 INTEGER(iwp) :: ny 124 TYPE, PUBLIC :: local_boundaries !< 125 126 INTEGER(iwp) :: nnx !< 127 INTEGER(iwp) :: nny !< 128 INTEGER(iwp) :: nx !< 129 INTEGER(iwp) :: nxl !< 130 INTEGER(iwp) :: nxr !< 131 INTEGER(iwp) :: ny !< 132 INTEGER(iwp) :: nyn !< 133 INTEGER(iwp) :: nys !< 134 135 136 87 137 88 138 END TYPE local_boundaries … … 91 141 !-- Class definition for shared memory instances. 92 142 !-- For every use of shared memory IO, one instance of this class is created. 93 TYPE, PUBLIC :: sm_class 94 95 INTEGER(iwp) :: nr_io_pe_per_node = 2!< typical configuration, 2 sockets per node96 LOGICAL :: no_shared_Memory_in_this_run143 TYPE, PUBLIC :: sm_class !< 144 145 INTEGER(iwp) :: nr_io_pe_per_node = 2 !< typical configuration, 2 sockets per node 146 LOGICAL :: no_shared_Memory_in_this_run !< 97 147 ! 98 148 !-- Variables for the shared memory communicator 99 INTEGER(iwp), PUBLIC :: comm_shared 100 INTEGER(iwp), PUBLIC :: sh_npes 101 INTEGER(iwp), PUBLIC :: sh_rank 149 INTEGER(iwp), PUBLIC :: comm_shared !< Communicator for processes with shared array 150 INTEGER(iwp), PUBLIC :: sh_npes !< 151 INTEGER(iwp), PUBLIC :: sh_rank !< 102 152 103 153 LOGICAL, PUBLIC :: iam_io_pe = .TRUE. !< This PE is an IO-PE 104 154 ! 105 155 !-- Variables for the I/O virtual grid 106 INTEGER(iwp), PUBLIC :: comm_io 107 INTEGER(iwp), PUBLIC :: io_npes 108 INTEGER(iwp), PUBLIC :: io_rank 156 INTEGER(iwp), PUBLIC :: comm_io !< Communicator for all IO processes 157 INTEGER(iwp), PUBLIC :: io_npes !< 158 INTEGER(iwp), PUBLIC :: io_rank !< 109 159 110 160 TYPE( local_boundaries ), PUBLIC :: io_grid … … 112 162 ! 113 163 !-- Variables for the node local communicator 114 INTEGER(iwp) :: comm_node!< Communicator for all processes of current node115 INTEGER(iwp) :: io_pe_global_rank116 INTEGER(iwp) :: n_npes117 INTEGER(iwp) :: n_rank118 119 120 121 122 123 PROCEDURE, PASS(this), PUBLIC :: is_sm_active 124 PROCEDURE, PASS(this), PUBLIC :: sm_adjust_outer_boundary 125 PROCEDURE, PASS(this), PUBLIC :: sm_free_shared 126 PROCEDURE, PASS(this), PUBLIC :: sm_init_comm 127 PROCEDURE, PASS(this), PUBLIC :: sm_node_barrier 128 #if defined( __parallel ) 129 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_1d 130 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_2d 131 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_2di 132 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_3d 164 INTEGER(iwp) :: comm_node !< Communicator for all processes of current node 165 INTEGER(iwp) :: io_pe_global_rank !< 166 INTEGER(iwp) :: n_npes !< 167 INTEGER(iwp) :: n_rank !< 168 169 CONTAINS 170 171 PRIVATE 172 173 PROCEDURE, PASS(this), PUBLIC :: is_sm_active !< 174 PROCEDURE, PASS(this), PUBLIC :: sm_adjust_outer_boundary !< 175 PROCEDURE, PASS(this), PUBLIC :: sm_free_shared !< 176 PROCEDURE, PASS(this), PUBLIC :: sm_init_comm !< 177 PROCEDURE, PASS(this), PUBLIC :: sm_node_barrier !< 178 #if defined( __parallel ) 179 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_1d !< 180 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_2d !< 181 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_2di !< 182 PROCEDURE, PASS(this), PUBLIC :: sm_allocate_shared_3d !< 133 183 134 184 GENERIC, PUBLIC :: sm_allocate_shared => sm_allocate_shared_1d, sm_allocate_shared_2d, & 135 sm_allocate_shared_2di, sm_allocate_shared_3d185 sm_allocate_shared_2di, sm_allocate_shared_3d !< 136 186 #endif 137 187 END TYPE sm_class 138 188 139 189 140 CONTAINS190 CONTAINS 141 191 142 192 … … 154 204 155 205 #if defined( __parallel ) 156 INTEGER :: color157 INTEGER ::max_n_npes !< Maximum number of PEs/node206 INTEGER :: color !< 207 INTEGER :: max_n_npes !< Maximum number of PEs/node 158 208 #endif 159 209 … … 244 294 IMPLICIT NONE 245 295 246 INTEGER(iwp), INTENT(OUT) :: color247 248 INTEGER(iwp) :: group_start 249 INTEGER(iwp) :: n250 INTEGER(iwp) :: my_color251 INTEGER(iwp) :: pe 252 INTEGER(iwp) :: sh_group_size 253 254 INTEGER(iwp), DIMENSION(4,0:this%n_npes-1) :: local_dim_s 255 INTEGER(iwp), DIMENSION(4,0:this%n_npes-1) :: local_dim_r 256 257 TYPE(local_boundaries), DIMENSION(32) :: node_grid 258 259 ! 260 !-- N nshared memory I/O on one node jobs296 INTEGER(iwp), INTENT(OUT) :: color !< 297 298 INTEGER(iwp) :: group_start !< 299 INTEGER(iwp) :: my_color !< 300 INTEGER(iwp) :: n !< 301 INTEGER(iwp) :: pe !< 302 INTEGER(iwp) :: sh_group_size !< 303 304 INTEGER(iwp), DIMENSION(4,0:this%n_npes-1) :: local_dim_s !< 305 INTEGER(iwp), DIMENSION(4,0:this%n_npes-1) :: local_dim_r !< 306 307 TYPE(local_boundaries), DIMENSION(32) :: node_grid !< 308 309 ! 310 !-- No shared memory I/O on one node jobs 261 311 IF ( numprocs < this%n_npes ) THEN 262 312 this%no_shared_memory_in_this_run = .TRUE. … … 337 387 !> Function to return if shared Memory IO is active. 338 388 !--------------------------------------------------------------------------------------------------! 339 FUNCTION is_sm_active( this ) RESULT( ac )340 341 IMPLICIT NONE 342 343 CLASS(sm_class), INTENT(inout) :: this 344 345 LOGICAL :: ac 389 FUNCTION is_sm_active( this ) RESULT( ac ) 390 391 IMPLICIT NONE 392 393 CLASS(sm_class), INTENT(inout) :: this !< 394 395 LOGICAL :: ac !< 346 396 347 397 ac = .NOT. this%no_shared_memory_in_this_run … … 360 410 IMPLICIT NONE 361 411 362 CLASS(sm_class), INTENT(inout) :: this363 364 INTEGER(iwp) :: disp_unit365 INTEGER(iwp), INTENT(IN) :: d1366 INTEGER(iwp), INTENT(IN) :: d2367 INTEGER(iwp), SAVE :: pe_from = 0368 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size369 INTEGER(iwp), INTENT(OUT) :: win370 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize371 372 INTEGER, DIMENSION(1) :: buf_shape 373 374 REAL(wp), DIMENSION(:), POINTER :: buf 375 REAL(wp), DIMENSION(:), POINTER :: p1 376 377 TYPE(C_PTR), SAVE :: base_ptr 378 TYPE(C_PTR), SAVE :: rem_ptr 412 CLASS(sm_class), INTENT(inout) :: this !< 413 !< 414 INTEGER(iwp) :: disp_unit !< 415 INTEGER(iwp), INTENT(IN) :: d1 !< 416 INTEGER(iwp), INTENT(IN) :: d2 !< 417 INTEGER(iwp), SAVE :: pe_from = 0 !< 418 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size !< 419 INTEGER(iwp), INTENT(OUT) :: win !< 420 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize !< 421 422 INTEGER, DIMENSION(1) :: buf_shape !< 423 424 REAL(wp), DIMENSION(:), POINTER :: buf !< 425 REAL(wp), DIMENSION(:), POINTER :: p1 !< 426 427 TYPE(C_PTR), SAVE :: base_ptr !< 428 TYPE(C_PTR), SAVE :: rem_ptr !< 379 429 380 430 … … 415 465 IMPLICIT NONE 416 466 417 CLASS(sm_class), INTENT(INOUT) :: this 418 419 INTEGER(iwp) :: disp_unit 420 INTEGER(iwp), INTENT(IN) :: n_nxlg 421 INTEGER(iwp), INTENT(IN) :: n_nxrg 422 INTEGER(iwp), INTENT(IN) :: n_nyng 423 INTEGER(iwp), INTENT(IN) :: n_nysg 424 INTEGER(iwp), SAVE :: pe_from = 0 425 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size 426 INTEGER(iwp), INTENT(OUT) :: win 427 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize 428 429 INTEGER(iwp), DIMENSION(2) :: buf_shape 430 431 REAL(wp), DIMENSION(:,:), POINTER :: buf 432 REAL(wp), DIMENSION(:,:), POINTER :: p2 433 434 TYPE(C_PTR),SAVE :: base_ptr 435 TYPE(C_PTR),SAVE :: rem_ptr 467 CLASS(sm_class), INTENT(INOUT) :: this !< 468 469 INTEGER(iwp) :: disp_unit !< 470 INTEGER(iwp), INTENT(IN) :: n_nxlg !< 471 INTEGER(iwp), INTENT(IN) :: n_nxrg !< 472 INTEGER(iwp), INTENT(IN) :: n_nyng !< 473 INTEGER(iwp), INTENT(IN) :: n_nysg !< 474 INTEGER(iwp), SAVE :: pe_from = 0 !< 475 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size !< 476 INTEGER(iwp), INTENT(OUT) :: win !< 477 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize !< 478 479 INTEGER(iwp), DIMENSION(2) :: buf_shape !< 480 481 REAL(wp), DIMENSION(:,:), POINTER :: buf !< 482 REAL(wp), DIMENSION(:,:), POINTER :: p2 !< 483 484 TYPE(C_PTR),SAVE :: base_ptr !< 485 TYPE(C_PTR),SAVE :: rem_ptr !< 436 486 437 487 … … 474 524 IMPLICIT NONE 475 525 476 CLASS(sm_class), INTENT(inout) :: this477 478 INTEGER(iwp) :: disp_unit 479 INTEGER(iwp), INTENT(IN) :: n_nxlg 480 INTEGER(iwp), INTENT(IN) :: n_nxrg 481 INTEGER(iwp), INTENT(IN) :: n_nyng 482 INTEGER(iwp), INTENT(IN) :: n_nysg 483 INTEGER(iwp), SAVE :: pe_from = 0 484 INTEGER(kind=MPI_ADDRESS_KIND) :: rem_size 485 INTEGER(iwp), INTENT(OUT) :: win 486 INTEGER(kind=MPI_ADDRESS_KIND) :: wsize 487 488 INTEGER(iwp), DIMENSION(2) :: buf_shape 489 490 INTEGER(iwp), DIMENSION(:,:), POINTER :: buf 491 INTEGER(iwp), DIMENSION(:,:), POINTER :: p2i 492 493 TYPE(C_PTR),SAVE :: base_ptr 494 TYPE(C_PTR),SAVE :: rem_ptr 526 CLASS(sm_class), INTENT(inout) :: this !< 527 528 INTEGER(iwp) :: disp_unit !< 529 INTEGER(iwp), INTENT(IN) :: n_nxlg !< 530 INTEGER(iwp), INTENT(IN) :: n_nxrg !< 531 INTEGER(iwp), INTENT(IN) :: n_nyng !< 532 INTEGER(iwp), INTENT(IN) :: n_nysg !< 533 INTEGER(iwp), SAVE :: pe_from = 0 !< 534 INTEGER(kind=MPI_ADDRESS_KIND) :: rem_size !< 535 INTEGER(iwp), INTENT(OUT) :: win !< 536 INTEGER(kind=MPI_ADDRESS_KIND) :: wsize !< 537 538 INTEGER(iwp), DIMENSION(2) :: buf_shape !< 539 540 INTEGER(iwp), DIMENSION(:,:), POINTER :: buf !< 541 INTEGER(iwp), DIMENSION(:,:), POINTER :: p2i !< 542 543 TYPE(C_PTR),SAVE :: base_ptr !< 544 TYPE(C_PTR),SAVE :: rem_ptr !< 495 545 496 546 … … 533 583 IMPLICIT NONE 534 584 535 CLASS(sm_class), INTENT(inout) :: this 536 537 INTEGER :: disp_unit 538 INTEGER, INTENT(IN) :: d1e 539 INTEGER, INTENT(IN) :: d1s 540 INTEGER, INTENT(IN) :: d2e 541 INTEGER, INTENT(IN) :: d2s 542 INTEGER, INTENT(IN) :: d3e 543 INTEGER, INTENT(IN) :: d3s 544 INTEGER, SAVE :: pe_from = 0 545 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size 546 INTEGER, INTENT(OUT) :: win 547 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize 548 549 INTEGER, DIMENSION(3) :: buf_shape 550 551 REAL(wp), DIMENSION(:,:,:), POINTER :: buf 552 REAL(wp), DIMENSION(:,:,:), POINTER :: p3 553 554 TYPE(C_PTR), SAVE :: base_ptr 555 TYPE(C_PTR), SAVE :: rem_ptr 585 CLASS(sm_class), INTENT(inout) :: this !< 586 587 INTEGER :: disp_unit !< 588 INTEGER, INTENT(IN) :: d1e !< 589 INTEGER, INTENT(IN) :: d1s !< 590 INTEGER, INTENT(IN) :: d2e !< 591 INTEGER, INTENT(IN) :: d2s !< 592 INTEGER, INTENT(IN) :: d3e !< 593 INTEGER, INTENT(IN) :: d3s !< 594 INTEGER, SAVE :: pe_from = 0 !< 595 INTEGER(KIND=MPI_ADDRESS_KIND) :: rem_size !< 596 INTEGER, INTENT(OUT) :: win !< 597 INTEGER(KIND=MPI_ADDRESS_KIND) :: wsize !< 598 599 INTEGER, DIMENSION(3) :: buf_shape !< 600 601 REAL(wp), DIMENSION(:,:,:), POINTER :: buf !< 602 REAL(wp), DIMENSION(:,:,:), POINTER :: p3 !< 603 604 TYPE(C_PTR), SAVE :: base_ptr !< 605 TYPE(C_PTR), SAVE :: rem_ptr !< 556 606 557 607 … … 596 646 IMPLICIT NONE 597 647 598 CLASS(sm_class), INTENT(inout) :: this 648 CLASS(sm_class), INTENT(inout) :: this !< 599 649 600 650 … … 640 690 IMPLICIT NONE 641 691 642 CLASS(sm_class), INTENT(inout) :: this 643 644 INTEGER(iwp), INTENT(INOUT) :: win 692 CLASS(sm_class), INTENT(inout) :: this !< 693 694 INTEGER(iwp), INTENT(INOUT) :: win !< 645 695 646 696 IF ( this%no_shared_memory_in_this_run .OR. win == -1234567890 ) RETURN … … 662 712 IMPLICIT NONE 663 713 664 CLASS(sm_class), INTENT(inout) :: this714 CLASS(sm_class), INTENT(inout) :: this !< 665 715 666 716
Note: See TracChangeset
for help on using the changeset viewer.