Changeset 2801 for palm/trunk/SOURCE/pmc_parent_mod.f90
- Timestamp:
- Feb 14, 2018 4:01:55 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/pmc_parent_mod.f90
r2718 r2801 26 26 ! ----------------- 27 27 ! $Id$ 28 ! Introduce particle transfer in nested models. 29 ! 30 ! 2718 2018-01-02 08:49:38Z maronga 28 31 ! Corrected "Former revisions" section 29 32 ! … … 88 91 ! 89 92 ! Parent part of Palm Model Coupler 90 !------------------------------------------------------------------------------ -!93 !------------------------------------------------------------------------------! 91 94 92 95 #if defined( __parallel ) … … 99 102 #endif 100 103 USE kinds 101 USE pmc_general, 102 ONLY: arraydef, childdef, da_namedef, da_namelen, pedef, 104 USE pmc_general, & 105 ONLY: arraydef, childdef, da_namedef, da_namelen, pedef, & 103 106 pmc_g_setname, pmc_max_array, pmc_max_models, pmc_sort 104 107 105 USE pmc_handle_communicator, 106 ONLY: m_model_comm,m_model_rank,m_model_npes, m_to_child_comm, 108 USE pmc_handle_communicator, & 109 ONLY: m_model_comm,m_model_rank,m_model_npes, m_to_child_comm, & 107 110 m_world_rank, pmc_parent_for_child 108 111 109 USE pmc_mpi_wrapper, 112 USE pmc_mpi_wrapper, & 110 113 ONLY: pmc_alloc_mem, pmc_bcast, pmc_time 111 114 … … 120 123 END TYPE childindexdef 121 124 122 TYPE(childdef), DIMENSION(pmc_max_models) 123 TYPE(childindexdef), DIMENSION(pmc_max_models) :: indchildren !<125 TYPE(childdef), DIMENSION(pmc_max_models),PUBLIC :: children !< 126 TYPE(childindexdef), DIMENSION(pmc_max_models) :: indchildren !< 124 127 125 128 INTEGER :: next_array_in_list = 0 !< … … 148 151 MODULE PROCEDURE pmc_s_set_dataarray_2d 149 152 MODULE PROCEDURE pmc_s_set_dataarray_3d 153 MODULE PROCEDURE pmc_s_set_dataarray_ip2d 150 154 END INTERFACE pmc_s_set_dataarray 151 155 … … 166 170 END INTERFACE pmc_s_set_active_data_array 167 171 168 PUBLIC pmc_parentinit, pmc_s_clear_next_array_list, pmc_s_fillbuffer, & 169 pmc_s_getdata_from_buffer, pmc_s_getnextarray, & 170 pmc_s_setind_and_allocmem, pmc_s_set_active_data_array, & 171 pmc_s_set_dataarray, pmc_s_set_2d_index_list 172 INTERFACE pmc_s_get_child_npes 173 MODULE PROCEDURE pmc_s_get_child_npes 174 END INTERFACE pmc_s_get_child_npes 175 176 PUBLIC pmc_parentinit, pmc_s_clear_next_array_list, pmc_s_fillbuffer, & 177 pmc_s_getdata_from_buffer, pmc_s_getnextarray, & 178 pmc_s_setind_and_allocmem, pmc_s_set_active_data_array, & 179 pmc_s_set_dataarray, pmc_s_set_2d_index_list, & 180 pmc_s_get_child_npes 172 181 173 182 CONTAINS … … 178 187 IMPLICIT NONE 179 188 180 INTEGER :: childid !<181 INTEGER :: i !<182 INTEGER :: j !<183 INTEGER :: istat !<189 INTEGER(iwp) :: childid !< 190 INTEGER(iwp) :: i !< 191 INTEGER(iwp) :: j !< 192 INTEGER(iwp) :: istat !< 184 193 185 194 … … 193 202 ! 194 203 !-- Get rank and size 195 CALL MPI_COMM_RANK( children(childid)%model_comm, 204 CALL MPI_COMM_RANK( children(childid)%model_comm, & 196 205 children(childid)%model_rank, istat ) 197 CALL MPI_COMM_SIZE( children(childid)%model_comm, 206 CALL MPI_COMM_SIZE( children(childid)%model_comm, & 198 207 children(childid)%model_npes, istat ) 199 CALL MPI_COMM_REMOTE_SIZE( children(childid)%inter_comm, 208 CALL MPI_COMM_REMOTE_SIZE( children(childid)%inter_comm, & 200 209 children(childid)%inter_npes, istat ) 201 210 202 211 ! 203 212 !-- Intra communicator is used for MPI_GET 204 CALL MPI_INTERCOMM_MERGE( children(childid)%inter_comm, .FALSE., 213 CALL MPI_INTERCOMM_MERGE( children(childid)%inter_comm, .FALSE., & 205 214 children(childid)%intra_comm, istat ) 206 CALL MPI_COMM_RANK( children(childid)%intra_comm, 215 CALL MPI_COMM_RANK( children(childid)%intra_comm, & 207 216 children(childid)%intra_rank, istat ) 208 217 … … 228 237 IMPLICIT NONE 229 238 230 INTEGER , INTENT(IN) :: childid !<231 INTEGER , DIMENSION(:,:), INTENT(INOUT) :: index_list !<232 233 INTEGER :: ian !<234 INTEGER :: ic !<235 INTEGER :: ie !<236 INTEGER :: ip !<237 INTEGER :: is !<238 INTEGER :: istat !<239 INTEGER :: n!<239 INTEGER(iwp), INTENT(IN) :: childid !< 240 INTEGER(iwp), DIMENSION(:,:), INTENT(INOUT) :: index_list !< 241 242 INTEGER(iwp) :: ian !< 243 INTEGER(iwp) :: ic !< 244 INTEGER(iwp) :: ie !< 245 INTEGER(iwp) :: ip !< 246 INTEGER(iwp) :: is !< 247 INTEGER(iwp) :: istat !< 248 INTEGER(iwp) :: n,i !< 240 249 241 250 … … 268 277 IF ( ian > 0) THEN 269 278 ALLOCATE( indchildren(childid)%index_list_2d(6,ian) ) 270 indchildren(childid)%index_list_2d(:,1:ian) = 279 indchildren(childid)%index_list_2d(:,1:ian) = & 271 280 index_list(:,is:ie) 272 281 ENDIF 273 282 ELSE 274 CALL MPI_SEND( ian, 1, MPI_INTEGER, ip, 1000, m_model_comm, 283 CALL MPI_SEND( ian, 1, MPI_INTEGER, ip, 1000, m_model_comm, & 275 284 istat ) 276 285 IF ( ian > 0) THEN 277 CALL MPI_SEND( index_list(1,is), 6*ian, MPI_INTEGER, ip, 286 CALL MPI_SEND( index_list(1,is), 6*ian, MPI_INTEGER, ip, & 278 287 1001, m_model_comm, istat ) 279 288 ENDIF … … 282 291 ENDDO 283 292 ELSE 284 CALL MPI_RECV( indchildren(childid)%nrpoints, 1, MPI_INTEGER, 0, 1000, 293 CALL MPI_RECV( indchildren(childid)%nrpoints, 1, MPI_INTEGER, 0, 1000, & 285 294 m_model_comm, MPI_STATUS_IGNORE, istat ) 286 295 ian = indchildren(childid)%nrpoints 287 296 IF ( ian > 0 ) THEN 288 297 ALLOCATE( indchildren(childid)%index_list_2d(6,ian) ) 289 CALL MPI_RECV( indchildren(childid)%index_list_2d, 6*ian, 290 MPI_INTEGER, 0, 1001, m_model_comm, 298 CALL MPI_RECV( indchildren(childid)%index_list_2d, 6*ian, & 299 MPI_INTEGER, 0, 1001, m_model_comm, & 291 300 MPI_STATUS_IGNORE, istat) 292 301 ENDIF 293 302 ENDIF 294 CALL set_pe_index_list( childid, children(childid), 295 indchildren(childid)%index_list_2d, 303 CALL set_pe_index_list( childid, children(childid), & 304 indchildren(childid)%index_list_2d, & 296 305 indchildren(childid)%nrpoints ) 297 306 … … 313 322 314 323 ! 315 !-- List handling is still required to get minimal interaction with 316 !-- pmc_interface 317 !-- TODO: what does "still" mean? Is there a chance to change this! 324 !-- Althoug there are no linked lists any more in PMC, this call still looks like working with a list 325 318 326 CHARACTER(LEN=*), INTENT(OUT) :: myname !< 319 327 INTEGER(iwp), INTENT(IN) :: childid !< … … 338 346 myname = ar%name 339 347 ! 340 !-- Return true if legal array341 !-- TODO: what does this comment mean? Can there be non-legal arrays?? 348 !-- Return true if there is still an array in the list 349 342 350 pmc_s_getnextarray = .TRUE. 343 351 … … 350 358 IMPLICIT NONE 351 359 352 INTEGER ,INTENT(IN) :: childid !<360 INTEGER(iwp), INTENT(IN) :: childid !< 353 361 354 362 REAL(wp), INTENT(IN), DIMENSION(:,:), POINTER :: array !< 355 363 REAL(wp), INTENT(IN), DIMENSION(:,:), POINTER, OPTIONAL :: array_2 !< 356 364 357 INTEGER :: nrdims !<358 INTEGER , DIMENSION(4) :: dims !<365 INTEGER(iwp) :: nrdims !< 366 INTEGER(iwp), DIMENSION(4) :: dims !< 359 367 TYPE(C_PTR) :: array_adr !< 360 368 TYPE(C_PTR) :: second_adr !< … … 369 377 IF ( PRESENT( array_2 ) ) THEN 370 378 second_adr = C_LOC(array_2) 371 CALL pmc_s_setarray( childid, nrdims, dims, array_adr, 379 CALL pmc_s_setarray( childid, nrdims, dims, array_adr, & 372 380 second_adr = second_adr) 373 381 ELSE … … 377 385 END SUBROUTINE pmc_s_set_dataarray_2d 378 386 387 SUBROUTINE pmc_s_set_dataarray_ip2d( childid, array ) 388 389 IMPLICIT NONE 390 391 INTEGER(iwp),INTENT(IN) :: childid !< 392 393 INTEGER(idp), INTENT(IN), DIMENSION(:,:), POINTER :: array !< 394 395 INTEGER(iwp) :: nrdims !< 396 INTEGER(iwp), DIMENSION(4) :: dims !< 397 TYPE(C_PTR) :: array_adr !< 398 399 400 dims = 1 401 nrdims = 2 402 dims(1) = SIZE( array,1 ) 403 dims(2) = SIZE( array,2 ) 404 array_adr = C_LOC( array ) 405 406 CALL pmc_s_setarray( childid, nrdims, dims, array_adr , dimkey=22) 407 408 END SUBROUTINE pmc_s_set_dataarray_ip2d 379 409 380 410 … … 383 413 IMPLICIT NONE 384 414 385 INTEGER , INTENT(IN) :: childid !<386 INTEGER , INTENT(IN) :: nz !<387 INTEGER , INTENT(IN) :: nz_cl !<415 INTEGER(iwp), INTENT(IN) :: childid !< 416 INTEGER(iwp), INTENT(IN) :: nz !< 417 INTEGER(iwp), INTENT(IN) :: nz_cl !< 388 418 389 419 REAL(wp), INTENT(IN), DIMENSION(:,:,:), POINTER :: array !< 390 420 REAL(wp), INTENT(IN), DIMENSION(:,:,:), POINTER, OPTIONAL :: array_2 !< 391 421 392 INTEGER :: nrdims !<393 INTEGER , DIMENSION(4) :: dims !<422 INTEGER(iwp) :: nrdims !< 423 INTEGER(iwp), DIMENSION(4) :: dims !< 394 424 TYPE(C_PTR) :: array_adr !< 395 425 TYPE(C_PTR) :: second_adr !< 396 426 397 !398 !-- TODO: the next assignment seems to be obsolete. Please check!399 dims = 1400 dims = 0401 427 nrdims = 3 402 428 dims(1) = SIZE( array,1 ) … … 411 437 IF ( PRESENT( array_2 ) ) THEN 412 438 second_adr = C_LOC( array_2 ) 413 CALL pmc_s_setarray( childid, nrdims, dims, array_adr, 439 CALL pmc_s_setarray( childid, nrdims, dims, array_adr, & 414 440 second_adr = second_adr) 415 441 ELSE … … 423 449 SUBROUTINE pmc_s_setind_and_allocmem( childid ) 424 450 425 USE control_parameters, 451 USE control_parameters, & 426 452 ONLY: message_string 427 453 … … 433 459 !-- send -> parent to child transfer 434 460 !-- recv -> child to parent transfer 435 INTEGER , INTENT(IN) :: childid !<436 437 INTEGER 438 INTEGER 439 INTEGER 440 INTEGER 441 INTEGER 442 INTEGER 443 INTEGER 444 INTEGER 461 INTEGER(iwp), INTENT(IN) :: childid !< 462 463 INTEGER(iwp) :: arlen !< 464 INTEGER(iwp) :: i !< 465 INTEGER(iwp) :: ierr !< 466 INTEGER(iwp) :: istat !< 467 INTEGER(iwp) :: j !< 468 INTEGER(iwp) :: myindex !< 469 INTEGER(iwp) :: rcount !< count MPI requests 470 INTEGER(iwp) :: tag !< 445 471 446 472 INTEGER(idp) :: bufsize !< size of MPI data window 447 473 INTEGER(KIND=MPI_ADDRESS_KIND) :: winsize !< 448 474 449 INTEGER , DIMENSION(1024) :: req !<475 INTEGER(iwp), DIMENSION(1024) :: req !< 450 476 451 477 TYPE(C_PTR) :: base_ptr !< … … 482 508 tag = tag + 1 483 509 rcount = rcount + 1 484 CALL MPI_ISEND( myindex, 1, MPI_INTEGER, i-1, tag, 510 CALL MPI_ISEND( myindex, 1, MPI_INTEGER, i-1, tag, & 485 511 children(childid)%inter_comm, req(rcount), ierr ) 486 512 ! 487 !-- Maximum of 1024 outstanding requests488 !-- TODO: what does this limit mean? Does outstanding mean pending? 513 !-- Maximum of 1024 pending requests 514 489 515 IF ( rcount == 1024 ) THEN 490 516 CALL MPI_WAITALL( rcount, req, MPI_STATUSES_IGNORE, ierr ) … … 515 541 516 542 winsize = bufsize * wp 517 CALL MPI_WIN_CREATE( base_array_pc, winsize, wp, MPI_INFO_NULL, 518 children(childid)%intra_comm, 543 CALL MPI_WIN_CREATE( base_array_pc, winsize, wp, MPI_INFO_NULL, & 544 children(childid)%intra_comm, & 519 545 children(childid)%win_parent_child, ierr ) 520 546 ! … … 533 559 534 560 IF ( ar%sendindex + ar%sendsize > bufsize ) THEN 535 WRITE( message_string, '(a,i4,4i7,1x,a)' ) 536 'parent buffer too small ',i, 537 ar%sendindex,ar%sendsize,ar%sendindex+ar%sendsize, 561 WRITE( message_string, '(a,i4,4i7,1x,a)' ) & 562 'parent buffer too small ',i, & 563 ar%sendindex,ar%sendsize,ar%sendindex+ar%sendsize, & 538 564 bufsize,trim(ar%name) 539 565 CALL message( 'pmc_s_setind_and_allocmem', 'PA0429', 3, 2, 0, 6, 0 ) … … 554 580 !-- Receive index from child 555 581 tag = tag + 1 556 CALL MPI_RECV( myindex, 1, MPI_INTEGER, i-1, tag, 582 CALL MPI_RECV( myindex, 1, MPI_INTEGER, i-1, tag, & 557 583 children(childid)%inter_comm, MPI_STATUS_IGNORE, ierr ) 558 584 IF ( ar%nrdims == 3 ) THEN … … 586 612 587 613 588 SUBROUTINE pmc_s_fillbuffer( childid, waittime )589 590 IMPLICIT NONE 591 592 INTEGER , INTENT(IN) :: childid !<614 SUBROUTINE pmc_s_fillbuffer( childid, waittime, particle_transfer ) 615 616 IMPLICIT NONE 617 618 INTEGER(iwp), INTENT(IN) :: childid !< 593 619 594 620 REAL(wp), INTENT(OUT), OPTIONAL :: waittime !< 595 596 INTEGER :: ierr !< 597 INTEGER :: ij !< 598 INTEGER :: ip !< 599 INTEGER :: istat !< 600 INTEGER :: j !< 601 INTEGER :: myindex !< 602 603 INTEGER, DIMENSION(1) :: buf_shape 621 LOGICAL, INTENT(IN), OPTIONAL :: particle_transfer !< 622 623 624 INTEGER(iwp) :: ierr !< 625 INTEGER(iwp) :: ij !< 626 INTEGER(iwp) :: ip !< 627 INTEGER(iwp) :: istat !< 628 INTEGER(iwp) :: j !< 629 INTEGER(iwp) :: myindex !< 630 631 LOGICAL :: lo_ptrans 632 633 INTEGER(iwp), DIMENSION(1) :: buf_shape 604 634 605 635 REAL(wp) :: t1 !< … … 608 638 REAL(wp), POINTER, DIMENSION(:,:) :: data_2d !< 609 639 REAL(wp), POINTER, DIMENSION(:,:,:) :: data_3d !< 640 INTEGER(idp), POINTER, DIMENSION(:) :: ibuf !< 641 INTEGER(idp), POINTER, DIMENSION(:,:) :: idata_2d !< 610 642 611 643 TYPE(pedef), POINTER :: ape !< … … 625 657 ENDIF 626 658 659 lo_ptrans = .FALSE. 660 IF ( PRESENT( particle_transfer)) lo_ptrans = particle_transfer 661 627 662 DO ip = 1, children(childid)%inter_npes 628 663 ape => children(childid)%pes(ip) … … 630 665 ar => ape%array_list(j) 631 666 myindex = 1 632 IF ( ar%nrdims == 2 ) THEN 667 668 IF ( ar%dimkey == 2 .AND. .NOT.lo_ptrans ) THEN ! PALM 2D REAL*8 Array 669 633 670 buf_shape(1) = ape%nrele 634 671 CALL C_F_POINTER( ar%sendbuf, buf, buf_shape ) … … 638 675 myindex = myindex + 1 639 676 ENDDO 640 ELSEIF ( ar%nrdims == 3 ) THEN 677 678 ELSEIF ( ar%dimkey == 3 .AND. .NOT.lo_ptrans ) THEN ! PALM 3D REAL*8 Array 679 641 680 buf_shape(1) = ape%nrele*ar%a_dim(4) 642 681 CALL C_F_POINTER( ar%sendbuf, buf, buf_shape ) … … 647 686 myindex = myindex + ar%a_dim(4) 648 687 ENDDO 688 ELSEIF ( ar%dimkey == 22 .AND. lo_ptrans ) THEN ! 2D INTEGER*8 Array for particle Transfer 689 690 buf_shape(1) = ape%nrele 691 CALL C_F_POINTER( ar%sendbuf, ibuf, buf_shape ) 692 CALL C_F_POINTER( ar%data, idata_2d, ar%a_dim(1:2) ) 693 DO ij = 1, ape%nrele 694 ibuf(myindex) = idata_2d(ape%locind(ij)%j,ape%locind(ij)%i) 695 myindex = myindex + 1 696 ENDDO 649 697 ENDIF 650 698 ENDDO … … 658 706 659 707 660 SUBROUTINE pmc_s_getdata_from_buffer( childid, waittime )661 662 IMPLICIT NONE 663 664 INTEGER , INTENT(IN) :: childid !<708 SUBROUTINE pmc_s_getdata_from_buffer( childid, waittime , particle_transfer, child_process_nr ) 709 710 IMPLICIT NONE 711 712 INTEGER(iwp), INTENT(IN) :: childid !< 665 713 REAL(wp), INTENT(OUT), OPTIONAL :: waittime !< 666 667 INTEGER :: ierr !< 668 INTEGER :: ij !< 669 INTEGER :: ip !< 670 INTEGER :: istat !< 671 INTEGER :: j !< 672 INTEGER :: myindex !< 673 INTEGER :: nr !< 674 INTEGER :: target_pe !< 714 LOGICAL, INTENT(IN), OPTIONAL :: particle_transfer !< 715 INTEGER(iwp), INTENT(IN), OPTIONAL :: child_process_nr !< 716 717 INTEGER(iwp) :: ierr !< 718 INTEGER(iwp) :: ij !< 719 INTEGER(iwp) :: ip !< 720 INTEGER(iwp) :: ip_start !< 721 INTEGER(iwp) :: ip_end !< 722 INTEGER(iwp) :: istat !< 723 INTEGER(iwp) :: j !< 724 INTEGER(iwp) :: myindex !< 725 INTEGER(iwp) :: nr !< 726 INTEGER(iwp) :: target_pe !< 675 727 INTEGER(kind=MPI_ADDRESS_KIND) :: target_disp !< 676 677 INTEGER, DIMENSION(1) :: buf_shape !< 678 679 REAL(wp) :: t1 !< 680 REAL(wp) :: t2 !< 681 REAL(wp), POINTER, DIMENSION(:) :: buf !< 682 REAL(wp), POINTER, DIMENSION(:,:) :: data_2d !< 683 REAL(wp), POINTER, DIMENSION(:,:,:) :: data_3d !< 684 685 TYPE(pedef), POINTER :: ape !< 686 TYPE(arraydef), POINTER :: ar !< 728 729 LOGICAL :: lo_ptrans 730 731 INTEGER(iwp), DIMENSION(1) :: buf_shape !< 732 733 REAL(wp) :: t1 !< 734 REAL(wp) :: t2 !< 735 REAL(wp), POINTER, DIMENSION(:) :: buf !< 736 REAL(wp), POINTER, DIMENSION(:,:) :: data_2d !< 737 REAL(wp), POINTER, DIMENSION(:,:,:) :: data_3d !< 738 INTEGER(idp), POINTER, DIMENSION(:) :: ibuf !< 739 INTEGER(idp), POINTER, DIMENSION(:,:) :: idata_2d !< 740 741 TYPE(pedef), POINTER :: ape !< 742 TYPE(arraydef), POINTER :: ar !< 687 743 688 744 689 745 t1 = pmc_time() 690 ! 691 !-- Wait for child to fill buffer 692 CALL MPI_BARRIER( children(childid)%intra_comm, ierr ) 693 t2 = pmc_time() - t1 694 IF ( PRESENT( waittime ) ) waittime = t2 695 ! 696 !-- TODO: check next statement 697 !-- Fence might do it, test later 698 !-- CALL MPI_WIN_FENCE( 0, children(childid)%win_parent_child, ierr) 699 CALL MPI_BARRIER( children(childid)%intra_comm, ierr ) 700 701 DO ip = 1, children(childid)%inter_npes 746 747 IF(PRESENT(child_process_nr)) then 748 ip_start = child_process_nr 749 ip_end = child_process_nr 750 ELSE 751 ip_start = 1 752 ip_end = children(childid)%inter_npes 753 END IF 754 755 lo_ptrans = .FALSE. 756 IF ( PRESENT( particle_transfer)) lo_ptrans = particle_transfer 757 758 IF(ip_start == 1) THEN 759 ! 760 !-- Wait for child to fill buffer 761 CALL MPI_BARRIER( children(childid)%intra_comm, ierr ) 762 t2 = pmc_time() - t1 763 IF ( PRESENT( waittime ) ) waittime = t2 764 765 CALL MPI_BARRIER( children(childid)%intra_comm, ierr ) 766 ENDIF 767 768 DO ip = ip_start,ip_end 702 769 ape => children(childid)%pes(ip) 703 770 DO j = 1, ape%nr_arrays … … 706 773 IF ( ar%recvindex < 0 ) CYCLE 707 774 708 IF ( ar% nrdims == 2) THEN775 IF ( ar%dimkey == 2 .AND. .NOT.lo_ptrans ) THEN 709 776 nr = ape%nrele 710 ELSEIF ( ar% nrdims == 3) THEN777 ELSEIF ( ar%dimkey == 3 .AND. .NOT.lo_ptrans ) THEN 711 778 nr = ape%nrele * ar%a_dim(4) 779 ELSE IF ( ar%dimkey == 22 .AND. lo_ptrans) THEN 780 nr = ape%nrele 781 ELSE 782 CYCLE !particle array are not transfered here 712 783 ENDIF 713 784 buf_shape(1) = nr 714 CALL C_F_POINTER( ar%recvbuf, buf, buf_shape ) 785 IF(lo_ptrans) THEN 786 CALL C_F_POINTER( ar%recvbuf, ibuf, buf_shape ) 787 ELSE 788 CALL C_F_POINTER( ar%recvbuf, buf, buf_shape ) 789 ENDIF 790 715 791 ! 716 792 !-- MPI passive target RMA … … 720 796 !-- Child processes are located behind parent process 721 797 target_pe = ip - 1 + m_model_npes 722 CALL MPI_WIN_LOCK( MPI_LOCK_SHARED, target_pe, 0, &798 CALL MPI_WIN_LOCK( MPI_LOCK_SHARED, target_pe, 0, & 723 799 children(childid)%win_parent_child, ierr ) 724 CALL MPI_GET( buf, nr, MPI_REAL, target_pe, target_disp, nr, & 725 MPI_REAL, children(childid)%win_parent_child, ierr ) 726 CALL MPI_WIN_UNLOCK( target_pe, & 800 IF(lo_ptrans) THEN 801 CALL MPI_GET( ibuf, nr*8, MPI_BYTE, target_pe, target_disp, nr*8, & !There is no MPI_INTEGER8 datatype 802 MPI_BYTE, children(childid)%win_parent_child, ierr ) 803 ELSE 804 CALL MPI_GET( buf, nr, MPI_REAL, target_pe, target_disp, nr, & 805 MPI_REAL, children(childid)%win_parent_child, ierr ) 806 ENDIF 807 CALL MPI_WIN_UNLOCK( target_pe, & 727 808 children(childid)%win_parent_child, ierr ) 728 809 ENDIF 729 810 myindex = 1 730 IF ( ar%nrdims == 2 ) THEN 811 IF ( ar%dimkey == 2 .AND. .NOT.lo_ptrans ) THEN 812 731 813 CALL C_F_POINTER( ar%data, data_2d, ar%a_dim(1:2) ) 732 814 DO ij = 1, ape%nrele … … 734 816 myindex = myindex + 1 735 817 ENDDO 736 ELSEIF ( ar%nrdims == 3 ) THEN 818 819 ELSEIF ( ar%dimkey == 3 .AND. .NOT.lo_ptrans ) THEN 820 737 821 CALL C_F_POINTER( ar%data, data_3d, ar%a_dim(1:3)) 738 822 DO ij = 1, ape%nrele 739 data_3d(1:ar%a_dim(4),ape%locind(ij)%j,ape%locind(ij)%i) = 823 data_3d(1:ar%a_dim(4),ape%locind(ij)%j,ape%locind(ij)%i) = & 740 824 buf(myindex:myindex+ar%a_dim(4)-1) 741 825 myindex = myindex + ar%a_dim(4) 742 826 ENDDO 827 828 ELSE IF ( ar%dimkey == 22 .AND. lo_ptrans) THEN 829 830 CALL C_F_POINTER( ar%data, idata_2d, ar%a_dim(1:2) ) 831 DO ij = 1, ape%nrele 832 idata_2d(ape%locind(ij)%j,ape%locind(ij)%i) = ibuf(myindex) 833 myindex = myindex + 1 834 ENDDO 835 743 836 ENDIF 744 837 ENDDO … … 755 848 IMPLICIT NONE 756 849 757 INTEGER , INTENT(IN) :: childid !<850 INTEGER(iwp), INTENT(IN) :: childid !< 758 851 759 852 TYPE(da_namedef) :: myname !< … … 767 860 CALL pmc_bcast( myname%nameonchild, 0, comm=m_to_child_comm(childid) ) 768 861 769 CALL pmc_g_setname( children(childid), myname%couple_index, 862 CALL pmc_g_setname( children(childid), myname%couple_index, & 770 863 myname%nameonparent ) 771 864 ENDDO … … 775 868 776 869 777 SUBROUTINE pmc_s_setarray(childid, nrdims, dims, array_adr, second_adr )870 SUBROUTINE pmc_s_setarray(childid, nrdims, dims, array_adr, second_adr, dimkey ) 778 871 779 872 ! … … 781 874 IMPLICIT NONE 782 875 783 INTEGER, INTENT(IN) :: childid !< 784 INTEGER, INTENT(IN) :: nrdims !< 785 INTEGER, INTENT(IN), DIMENSION(:) :: dims !< 786 787 TYPE(C_PTR), INTENT(IN) :: array_adr !< 788 TYPE(C_PTR), INTENT(IN), OPTIONAL :: second_adr !< 789 790 INTEGER :: i !< local counter 876 INTEGER(iwp), INTENT(IN) :: childid !< 877 INTEGER(iwp), INTENT(IN) :: nrdims !< 878 INTEGER(iwp), INTENT(IN), DIMENSION(:) :: dims !< 879 880 TYPE(C_PTR), INTENT(IN) :: array_adr !< 881 TYPE(C_PTR), INTENT(IN), OPTIONAL :: second_adr !< 882 INTEGER(iwp), INTENT(IN), OPTIONAL :: dimkey !< 883 884 INTEGER(iwp) :: i !< local counter 791 885 792 886 TYPE(pedef), POINTER :: ape !< … … 798 892 ar => ape%array_list(next_array_in_list) 799 893 ar%nrdims = nrdims 894 ar%dimkey = nrdims 895 IF(PRESENT(dimkey)) ar%dimkey = dimkey 800 896 ar%a_dim = dims 801 897 ar%data = array_adr … … 817 913 IMPLICIT NONE 818 914 819 INTEGER , INTENT(IN) :: childid !<820 INTEGER , INTENT(IN) :: iactive !<821 822 INTEGER :: i !<823 INTEGER :: ip !<824 INTEGER :: j !<915 INTEGER(iwp), INTENT(IN) :: childid !< 916 INTEGER(iwp), INTENT(IN) :: iactive !< 917 918 INTEGER(iwp) :: i !< 919 INTEGER(iwp) :: ip !< 920 INTEGER(iwp) :: j !< 825 921 826 922 TYPE(pedef), POINTER :: ape !< … … 831 927 DO j = 1, ape%nr_arrays 832 928 ar => ape%array_list(j) 929 if(mod(ar%dimkey,10) == 2) CYCLE !Not for 2D array 833 930 IF ( iactive == 1 .OR. iactive == 2 ) THEN 834 931 ar%data = ar%po_data(iactive) … … 839 936 END SUBROUTINE pmc_s_set_active_data_array 840 937 938 INTEGER FUNCTION pmc_s_get_child_npes (child_id) 939 IMPLICIT NONE 940 941 INTEGER(iwp),INTENT(IN) :: child_id 942 943 pmc_s_get_child_npes = children(child_id)%inter_npes 944 945 RETURN 946 END FUNCTION pmc_s_get_child_npes 841 947 842 948 … … 845 951 IMPLICIT NONE 846 952 847 INTEGER , INTENT(IN) :: childid !<848 INTEGER , INTENT(IN), DIMENSION(:,:) :: index_list !<849 INTEGER , INTENT(IN) :: nrp !<953 INTEGER(iwp), INTENT(IN) :: childid !< 954 INTEGER(iwp), INTENT(IN), DIMENSION(:,:) :: index_list !< 955 INTEGER(iwp), INTENT(IN) :: nrp !< 850 956 851 957 TYPE(childdef), INTENT(INOUT) :: mychild !< 852 958 853 INTEGER 854 INTEGER 855 INTEGER 856 INTEGER 857 INTEGER 858 INTEGER 859 INTEGER 860 INTEGER 959 INTEGER(iwp) :: i !< 960 INTEGER(iwp) :: ierr !< 961 INTEGER(iwp) :: ind !< 962 INTEGER(iwp) :: indwin !< 963 INTEGER(iwp) :: indwin2 !< 964 INTEGER(iwp) :: i2 !< 965 INTEGER(iwp) :: j !< 966 INTEGER(iwp) :: rempe !< 861 967 INTEGER(KIND=MPI_ADDRESS_KIND) :: winsize !< 862 968 863 INTEGER , DIMENSION(mychild%inter_npes) :: remind !<864 865 INTEGER , DIMENSION(:), POINTER :: remindw !<866 INTEGER , DIMENSION(:), POINTER :: rldef !<969 INTEGER(iwp), DIMENSION(mychild%inter_npes) :: remind !< 970 971 INTEGER(iwp), DIMENSION(:), POINTER :: remindw !< 972 INTEGER(iwp), DIMENSION(:), POINTER :: rldef !< 867 973 868 974 TYPE(pedef), POINTER :: ape !< … … 906 1012 winsize = mychild%inter_npes*c_sizeof(i)*2 907 1013 908 CALL MPI_WIN_CREATE( rldef, winsize, iwp, MPI_INFO_NULL, 1014 CALL MPI_WIN_CREATE( rldef, winsize, iwp, MPI_INFO_NULL, & 909 1015 mychild%intra_comm, indwin, ierr ) 910 1016 ! … … 937 1043 938 1044 CALL MPI_BARRIER( m_model_comm, ierr ) 939 CALL MPI_WIN_CREATE( remindw, winsize*c_sizeof(i), iwp, MPI_INFO_NULL, 1045 CALL MPI_WIN_CREATE( remindw, winsize*c_sizeof(i), iwp, MPI_INFO_NULL, & 940 1046 mychild%intra_comm, indwin2, ierr ) 941 1047 !
Note: See TracChangeset
for help on using the changeset viewer.