Changeset 146 for codes/icosagcm/trunk/src/transfert_mpi.f90
- Timestamp:
- 03/12/13 16:34:45 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/transfert_mpi.f90
r74 r146 4 4 TYPE array 5 5 INTEGER,POINTER :: value(:) 6 INTEGER,POINTER :: sign(:) 6 7 INTEGER :: domain 7 8 INTEGER :: rank … … 17 18 INTEGER :: max_size 18 19 INTEGER :: size 20 LOGICAL :: vector 19 21 INTEGER,POINTER :: src_domain(:) 20 22 INTEGER,POINTER :: src_i(:) … … 24 26 INTEGER,POINTER :: target_i(:) 25 27 INTEGER,POINTER :: target_j(:) 28 INTEGER,POINTER :: target_sign(:) 26 29 INTEGER :: nrecv 27 30 TYPE(ARRAY),POINTER :: recv(:) … … 31 34 32 35 TYPE(t_request),POINTER :: req_i1(:) 33 TYPE(t_request),POINTER :: req_e1(:) 36 TYPE(t_request),POINTER :: req_e1_scal(:) 37 TYPE(t_request),POINTER :: req_e1_vect(:) 34 38 35 39 … … 84 88 CALL finalize_request(req_i1) 85 89 86 CALL create_request(field_u,req_e1 )90 CALL create_request(field_u,req_e1_scal) 87 91 DO ind=1,ndomain 88 92 CALL swap_dimensions(ind) 89 93 DO i=ii_begin,ii_end 90 CALL request_add_point(ind,i,jj_begin-1,req_e1 ,rup)91 CALL request_add_point(ind,i+1,jj_begin-1,req_e1 ,lup)94 CALL request_add_point(ind,i,jj_begin-1,req_e1_scal,rup) 95 CALL request_add_point(ind,i+1,jj_begin-1,req_e1_scal,lup) 92 96 ENDDO 93 97 94 98 DO j=jj_begin,jj_end 95 CALL request_add_point(ind,ii_end+1,j,req_e1 ,left)96 CALL request_add_point(ind,ii_end+1,j-1,req_e1 ,lup)99 CALL request_add_point(ind,ii_end+1,j,req_e1_scal,left) 100 CALL request_add_point(ind,ii_end+1,j-1,req_e1_scal,lup) 97 101 ENDDO 98 102 99 103 DO i=ii_begin,ii_end 100 CALL request_add_point(ind,i,jj_end+1,req_e1 ,ldown)101 CALL request_add_point(ind,i-1,jj_end+1,req_e1 ,rdown)104 CALL request_add_point(ind,i,jj_end+1,req_e1_scal,ldown) 105 CALL request_add_point(ind,i-1,jj_end+1,req_e1_scal,rdown) 102 106 ENDDO 103 107 104 108 DO j=jj_begin,jj_end 105 CALL request_add_point(ind,ii_begin-1,j,req_e1 ,right)106 CALL request_add_point(ind,ii_begin-1,j+1,req_e1 ,rdown)109 CALL request_add_point(ind,ii_begin-1,j,req_e1_scal,right) 110 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_scal,rdown) 107 111 ENDDO 108 112 109 113 DO i=ii_begin+1,ii_end-1 110 CALL request_add_point(ind,i,jj_begin,req_e1 ,right)111 CALL request_add_point(ind,i,jj_end,req_e1 ,right)114 CALL request_add_point(ind,i,jj_begin,req_e1_scal,right) 115 CALL request_add_point(ind,i,jj_end,req_e1_scal,right) 112 116 ENDDO 113 117 114 118 DO j=jj_begin+1,jj_end-1 115 CALL request_add_point(ind,ii_begin,j,req_e1 ,rup)116 CALL request_add_point(ind,ii_end,j,req_e1 ,rup)119 CALL request_add_point(ind,ii_begin,j,req_e1_scal,rup) 120 CALL request_add_point(ind,ii_end,j,req_e1_scal,rup) 117 121 ENDDO 118 122 119 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1,left) 120 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1,ldown) 121 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1,left) 122 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1,ldown) 123 124 CALL finalize_request(req_e1) 125 126 ENDDO 127 123 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_scal,left) 124 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_scal,ldown) 125 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_scal,left) 126 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_scal,ldown) 127 128 ENDDO 129 130 CALL finalize_request(req_e1_scal) 131 132 CALL create_request(field_u,req_e1_vect,.TRUE.) 133 DO ind=1,ndomain 134 CALL swap_dimensions(ind) 135 DO i=ii_begin,ii_end 136 CALL request_add_point(ind,i,jj_begin-1,req_e1_vect,rup) 137 CALL request_add_point(ind,i+1,jj_begin-1,req_e1_vect,lup) 138 ENDDO 139 140 DO j=jj_begin,jj_end 141 CALL request_add_point(ind,ii_end+1,j,req_e1_vect,left) 142 CALL request_add_point(ind,ii_end+1,j-1,req_e1_vect,lup) 143 ENDDO 144 145 DO i=ii_begin,ii_end 146 CALL request_add_point(ind,i,jj_end+1,req_e1_vect,ldown) 147 CALL request_add_point(ind,i-1,jj_end+1,req_e1_vect,rdown) 148 ENDDO 149 150 DO j=jj_begin,jj_end 151 CALL request_add_point(ind,ii_begin-1,j,req_e1_vect,right) 152 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_vect,rdown) 153 ENDDO 154 155 DO i=ii_begin+1,ii_end-1 156 CALL request_add_point(ind,i,jj_begin,req_e1_vect,right) 157 CALL request_add_point(ind,i,jj_end,req_e1_vect,right) 158 ENDDO 159 160 DO j=jj_begin+1,jj_end-1 161 CALL request_add_point(ind,ii_begin,j,req_e1_vect,rup) 162 CALL request_add_point(ind,ii_end,j,req_e1_vect,rup) 163 ENDDO 164 165 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_vect,left) 166 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_vect,ldown) 167 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_vect,left) 168 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_vect,ldown) 169 170 171 ENDDO 172 173 CALL finalize_request(req_e1_vect) 174 128 175 END SUBROUTINE init_transfert 129 176 130 SUBROUTINE create_request(type_field,request )177 SUBROUTINE create_request(type_field,request,vector) 131 178 USE domain_mod 132 179 USE field_mod … … 134 181 INTEGER :: type_field 135 182 TYPE(t_request),POINTER :: request(:) 183 LOGICAL,OPTIONAL :: vector 184 136 185 TYPE(t_request),POINTER :: req 137 186 TYPE(t_domain),POINTER :: d 138 187 INTEGER :: ind 139 188 INTEGER :: max_size 140 189 141 190 ALLOCATE(request(ndomain)) 142 191 … … 155 204 req%max_size=max_size*2 156 205 req%size=0 206 req%vector=.FALSE. 207 IF (PRESENT(vector)) req%vector=vector 157 208 ALLOCATE(req%src_domain(req%max_size)) 158 209 ALLOCATE(req%src_ind(req%max_size)) … … 162 213 ALLOCATE(req%target_i(req%max_size)) 163 214 ALLOCATE(req%target_j(req%max_size)) 215 ALLOCATE(req%target_sign(req%max_size)) 164 216 ENDDO 165 217 … … 177 229 INTEGER,POINTER :: target_i(:) 178 230 INTEGER,POINTER :: target_j(:) 231 INTEGER,POINTER :: target_sign(:) 179 232 180 233 PRINT *,"REALLOCATE_REQUEST" … … 186 239 target_i=>req%target_i 187 240 target_j=>req%target_j 241 target_sign=>req%target_sign 188 242 ! req%max_size=req%max_size*2 189 243 ALLOCATE(req%src_domain(req%max_size*2)) … … 194 248 ALLOCATE(req%target_i(req%max_size*2)) 195 249 ALLOCATE(req%target_j(req%max_size*2)) 250 ALLOCATE(req%target_sign(req%max_size*2)) 196 251 197 252 req%src_domain(1:req%max_size)=src_domain(:) … … 202 257 req%target_i(1:req%max_size)=target_i(:) 203 258 req%target_j(1:req%max_size)=target_j(:) 259 req%target_sign(1:req%max_size)=target_sign(:) 204 260 205 261 req%max_size=req%max_size*2 … … 212 268 DEALLOCATE(target_i) 213 269 DEALLOCATE(target_j) 270 DEALLOCATE(target_sign) 214 271 215 272 END SUBROUTINE reallocate_request … … 243 300 244 301 req%target_ind(req%size)=(j-1)*d%iim+i 302 req%target_sign(req%size)=1 245 303 req%src_domain(req%size)=src_domain 246 304 req%src_ind(req%size)=(src_j-1)*src_iim+src_i … … 254 312 src_n=(src_j-1)*src_iim+src_i 255 313 src_delta=domain(ind)%delta(i,j) 256 257 ! src_pos=MOD(pos-1+src_delta+6,6)+1258 314 src_pos=domain(ind)%edge_assign_pos(pos-1,i,j)+1 259 315 260 316 req%target_ind(req%size)=(j-1)*d%iim+i+d%u_pos(pos) 317 318 req%target_sign(req%size)= 1 319 IF (req%vector) req%target_sign(req%size)= domain(ind)%edge_assign_sign(pos-1,i,j) 320 261 321 req%src_domain(req%size)=src_domain 262 322 req%src_ind(req%size)=src_n+domain_glo(src_domain)%u_pos(src_pos) 263 264 ! req%target_i(req%size)=i265 ! req%target_j(req%size)=j266 ! req%src_i(req%size)=domain(ind)%assign_i(i,j)267 ! req%src_j(req%size)=domain(ind)%assign_j(i,j)268 269 ! PRINT *,"1--->",ind,i,j,pos270 ! PRINT *,"2--->",src_domain,src_i,src_j,src_pos271 323 272 324 ELSE IF (req%type_field==field_z) THEN … … 283 335 284 336 req%target_ind(req%size)=(j-1)*d%iim+i+d%z_pos(pos) 337 req%target_sign(req%size)=1 285 338 req%src_domain(req%size)=src_domain 286 339 req%src_ind(req%size)=src_n+domain_glo(src_domain)%z_pos(src_pos) … … 338 391 req%recv(irecv)%domain=domglo_loc_ind(ind_glo) 339 392 ALLOCATE(req%recv(irecv)%value(req%recv(irecv)%size)) 393 ALLOCATE(req%recv(irecv)%sign(req%recv(irecv)%size)) 340 394 ALLOCATE(req%recv(irecv)%buffer(req%recv(irecv)%size)) 341 395 ENDIF … … 350 404 req%recv(irecv)%value(size)=req%src_ind(i) 351 405 req%recv(irecv)%buffer(size)=req%target_ind(i) 406 req%recv(irecv)%sign(size)=req%target_sign(i) 352 407 ENDDO 353 408 ENDDO … … 362 417 ENDDO 363 418 ENDDO 364 365 419 366 420 CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) … … 465 519 DO irecv=1,req%nrecv 466 520 req%recv(irecv)%value(:)=req%recv(irecv)%buffer(:) 521 req%recv(irecv)%sign(:) =req%recv(irecv)%sign(:) 467 522 DEALLOCATE(req%recv(irecv)%buffer) 468 523 ENDDO … … 470 525 471 526 472 ! nb_domain_recv(:)=0 473 ! nb_data_domain_recv(:)=0 474 ! 475 ! DO ind_loc=1,ndomain 476 ! 477 ! DO i=1,req%size 478 ! ind_glo=req%src_domain(i) 479 ! nb_data_domain_recv(ind_glo)=nb_data_domain_recv(ind_glo)+1 480 ! ENDDO 481 ! 482 ! DO ind_glo=1,ndomain_glo 483 ! IF ( nb_data_domain_recv(ind_glo) > 0 ) nb_domain_recv(domglo_rank(ind_glo))=nb_domain_recv(domglo_rank(ind_glo))+1 484 ! ENDDO 485 ! 486 ! CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) 487 ! ENDDO 488 ! 489 ! DO 490 ! recv=sum(nb_domain_recv(:)) 491 ! send=sum(nb_domain_send(:)) 492 493 ! ALLOCATE(req%recv(recv)) 494 ! ALLOCATE(req%send(send)) 495 496 ! ALLOCATE(mpi_req(2*(send+recv))) 497 ! ALLOCATE(status(MPI_STATUS_SIZE,2*(send+recv))) 498 ! 499 ! recv=0 500 ! ireq=0 501 ! DO ind_glo=1,ndomain_glo 502 ! IF (nb_data_domain_recv(ind_glo)>0) THEN 503 ! recv=recv+1 504 ! list_domain_recv(ind_glo)=recv 505 ! req%recv(recv)%rank=domglo_rank(ind_glo) 506 ! req%recv(recv)%size=nb_data_domain_recv(ind_glo) 507 ! req%recv(recv)%domain=domglo_loc_ind(ind_glo) 508 ! ALLOCATE(req%recv(recv)%value(req%recv(recv)%size)) 509 ! ireq=ireq+1 510 ! CALL MPI_ISEND(req%recv(recv)%domain,1,MPI_INTEGER,req%recv(recv)%rank,0,comm_icosa, mpi_req(ireq),ierr) 511 ! ireq=ireq+1 512 ! CALL MPI_ISEND(req%recv(recv)%size,1,MPI_INTEGER,req%recv(recv)%rank,0,comm_icosa, mpi_req(ireq),ierr) 513 ! ENDIF 514 ! ENDDO 515 ! 516 ! 517 ! send=0 518 ! DO rank=0,mpi_size-1 519 ! DO j=1,nb_domain_send(rank) 520 ! send=send+1 521 ! req%send(send)%rank=rank 522 ! ireq=ireq+1 523 ! CALL MPI_IRECV(req%send(send)%domain,1,MPI_INTEGER,rank,0,comm_icosa, mpi_req(ireq),ierr) 524 ! ireq=ireq+1 525 ! CALL MPI_IRECV(req%send(send)%size,1,MPI_INTEGER,rank,0,comm_icosa, mpi_req(ireq),ierr) 526 ! ENDDO 527 ! ENDDO 528 ! 529 ! CALL MPI_WAITALL(2*(send+recv),mpi_req,status,ierr) 530 531 ! req%recv(:)%size=0 532 ! 533 ! DO i=1,req%size 534 ! j=list_domain_recv(req%src_domain(i)) 535 ! req%recv(j)%size=req%recv(j)%size+1 536 ! size=req%recv(j)%size 537 ! req%recv(j)%value(size)=req%src_ind(i) 538 ! ENDDO 539 ! 540 ! ireq=0 541 ! DO i=1,recv 542 ! ireq=ireq+1 543 ! CALL MPI_ISEND(req%recv(i)%value,req%recv(i)%size,MPI_INTEGER,req%recv(i)%rank,req%recv(i)%domain,comm_icosa, mpi_req(ireq),ierr) 544 ! ENDDO 545 546 ! DO i=1,send 547 ! ireq=ireq+1 548 ! ALLOCATE(req%send(i)%value(req%send(i)%size)) 549 ! CALL MPI_IRECV(req%send(i)%value,req%send(i)%size,MPI_INTEGER,req%send(i)%rank,req%send(i)%domain,comm_icosa, mpi_req(ireq),ierr) 550 ! ENDDO 551 ! 552 ! CALL MPI_WAITALL(send+recv,mpi_req,status,ierr) 553 554 555 END SUBROUTINE Finalize_request 527 END SUBROUTINE Finalize_request 556 528 557 529 … … 571 543 REAL(rstd),POINTER :: buffer_r4(:,:,:) 572 544 INTEGER,POINTER :: value(:) 545 INTEGER,POINTER :: sgn(:) 573 546 TYPE(ARRAY),POINTER :: recv,send 574 547 TYPE(t_request),POINTER :: req … … 634 607 buffer_r2=>recv%buffer_r2 635 608 value=>recv%value 609 sgn=>recv%sign 636 610 DO n=1,recv%size 637 rval2d(value(n))=buffer_r2(n) 611 rval2d(value(n))=buffer_r2(n)*sgn(n) 638 612 ENDDO 639 613 DEALLOCATE(recv%buffer_r2) … … 697 671 buffer_r3=>recv%buffer_r3 698 672 value=>recv%value 673 sgn=>recv%sign 699 674 DO n=1,recv%size 700 rval3d(value(n),:)=buffer_r3(n,:) 675 rval3d(value(n),:)=buffer_r3(n,:)*sgn(n) 701 676 ENDDO 702 677 DEALLOCATE(recv%buffer_r3) … … 760 735 buffer_r4=>recv%buffer_r4 761 736 value=>recv%value 737 sgn=>recv%sign 762 738 DO n=1,recv%size 763 rval4d(value(n),:,:)=buffer_r4(n,:,:) 739 rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n) 764 740 ENDDO 765 741 DEALLOCATE(recv%buffer_r4) … … 797 773 IF (field(ind)%ndim==2) THEN 798 774 DO n=1,req%size 799 rval2d(req%target_ind(n))=field(req%src_domain(n))%rval2d(req%src_ind(n)) 775 rval2d(req%target_ind(n))=field(req%src_domain(n))%rval2d(req%src_ind(n))*req%target_sign(n) 800 776 ENDDO 801 777 ELSE IF (field(ind)%ndim==3) THEN 802 778 DO n=1,req%size 803 rval3d(req%target_ind(n),:)=field(req%src_domain(n))%rval3d(req%src_ind(n),:) 779 rval3d(req%target_ind(n),:)=field(req%src_domain(n))%rval3d(req%src_ind(n),:)*req%target_sign(n) 804 780 ENDDO 805 781 ELSE IF (field(ind)%ndim==4) THEN 806 782 DO n=1,req%size 807 rval4d(req%target_ind(n),:,:)=field(req%src_domain(n))%rval4d(req%src_ind(n),:,:) 783 rval4d(req%target_ind(n),:,:)=field(req%src_domain(n))%rval4d(req%src_ind(n),:,:)*req%target_sign(n) 808 784 ENDDO 809 785 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.