29 integer,
pointer,
dimension(:) :: &
35 integer,
pointer,
dimension(:) :: &
43 double precision,
dimension(:),
pointer :: &
45 integer,
dimension(:),
pointer :: &
47 character,
dimension(:),
pointer :: &
51 integer,
pointer,
dimension(:) :: &
87 subroutine ijk_of( ijkp, i,j,k )
92 integer,
intent(in) :: ijkp
93 integer,
intent(out) :: i,j,k
98 integer :: k1,k2, j1,j2, i1,i2, &
99 ijk, isize,jsize,ksize, gijk
101 character(len=32),
parameter :: name =
"ijk_of" 102 logical :: isok_k, isok_j, isok_i, is_same, isok
119 if (mod(ijk,isize*jsize).ne.0)
then 120 k = int( ijk/(isize*jsize) ) + k1
122 k = int( ijk/(isize*jsize) ) + k1 -1
124 ijk = ijk - (k-k1)*(isize*jsize)
126 if (mod(ijk,isize).ne.0)
then 127 j = int( ijk/isize ) + j1
129 j = int( ijk/isize ) + j1 - 1
131 ijk = ijk - (j-j1)*isize
136 isok_i = (i1 <= i) .and. (i <= i2)
137 isok_j = (j1 <= j) .and. (j <= j2)
138 isok_k = (k1 <= k) .and. (k <= k2)
139 gijk = 1 + (i-i1) + (j-j1)*(i2-i1+1) + &
140 (k-k1)*(j2-j1+1)*(i2-i1+1)
141 is_same = (gijk .eq. ijkp)
142 isok = isok_i .and. isok_j .and. isok_k .and. is_same
145 call write_debug( name,
'ijkp, gijk ', ijkp, gijk )
159 integer,
intent(in) :: ijkp
160 integer,
intent(out) :: i,j,k
165 integer :: k1,k2, j1,j2, i1,i2, &
166 ijk, isize,jsize,ksize, gijk
168 character(len=32),
parameter :: name =
"ijk_of_gl" 169 logical :: isok_k, isok_j, isok_i, is_same, isok
185 if (mod(ijk,isize*jsize).ne.0)
then 186 k = int( ijk/(isize*jsize) ) + k1
188 k = int( ijk/(isize*jsize) ) + k1 -1
190 ijk = ijk - (k-k1)*(isize*jsize)
192 if (mod(ijk,isize).ne.0)
then 193 j = int( ijk/isize ) + j1
195 j = int( ijk/isize ) + j1 - 1
197 ijk = ijk - (j-j1)*isize
202 isok_i = (i1 <= i) .and. (i <= i2)
203 isok_j = (j1 <= j) .and. (j <= j2)
204 isok_k = (k1 <= k) .and. (k <= k2)
205 gijk = 1 + (i-i1) + (j-j1)*(i2-i1+1) + &
206 (k-k1)*(j2-j1+1)*(i2-i1+1)
207 is_same = (gijk .eq. ijkp)
208 isok = isok_i .and. isok_j .and. isok_k .and. is_same
211 call write_debug( name,
'ijkp, gijk ', ijkp, gijk )
223 cyclic_i,cyclic_j,cyclic_k,
idebug )
229 integer,
intent(in) :: comm
230 logical,
intent(in) :: cyclic_i,cyclic_j,cyclic_k
231 integer,
intent(in),
optional :: idebug
237 logical,
parameter :: jfastest = .true.
238 integer,
parameter :: message_tag_offset = 11
240 character(len=80),
parameter :: name =
'sendrecv_init' 242 character(len=80),
pointer,
dimension(:) :: line
245 integer :: layer,request, source, tag, datatype
248 integer :: isize,jsize,ksize, ijksize
249 integer :: recvsize1, recvsize2, &
252 integer :: iter, i,j,k, ii, jj,kk, &
253 ntotal, icount,ipos, &
254 ilayer, i1,i2, j1,j2, k1,k2, &
255 ijk, ijk2, iproc, jproc, src,dest, &
258 logical :: isok, isvalid, ismine, is_halobc
260 integer,
dimension(:,:,:),
pointer :: ijk2proc
261 integer,
pointer,
dimension(:) :: &
262 istartx,iendx, jstartx,jendx, kstartx,kendx, &
264 recvproc, recvtag, xrecv, recvijk, &
265 sendproc, sendtag, xsend, sendijk
269 integer :: message_tag
272 message_tag(src,dest) = message_tag_offset + (1+src + dest*
numpes)
291 xrecv,recvproc, recvijk, recvtag, &
292 xsend,sendproc, sendijk, sendtag )
296 if (
present(idebug))
then 301 call mpi_comm_size( comm,
numpes, ierror )
302 call mpi_check(
'sendrecv_init:MPI_COMM_SIZE ', ierror )
304 call mpi_comm_rank( comm,
mype, ierror )
305 call mpi_check(
'sendrecv_init:MPI_COMM_RANK ', ierror )
310 '** sendrecv_init: invalid kmin1, ' // &
311 ' kmin1, minval(kstart1_all(:)) ', &
315 '** sendrecv_init: invalid kmin2, ' // &
316 ' kmin2, minval(kstart2_all(:)) ', &
320 '** sendrecv_init: invalid kmin3, ' // &
321 ' kmin3, minval(kstart3_all(:)) ', &
325 '** sendrecv_init: invalid kmax1, ' // &
326 ' kmax1, maxval(kend1_all(:)) ', &
330 '** sendrecv_init: invalid kmax2, ' // &
331 ' kmax2, maxval(kend2_all(:)) ', &
335 '** sendrecv_init: invalid kmax3, ' // &
336 ' kmax3, maxval(kend3_all(:)) ', &
341 '** sendrecv_init: invalid jmin1, ' // &
342 ' jmin1, minval(jstart1_all(:)) ', &
346 '** sendrecv_init: invalid jmin2, ' // &
347 ' jmin2, minval(jstart2_all(:)) ', &
351 '** sendrecv_init: invalid jmin3, ' // &
352 ' jmin3, minval(jstart3_all(:)) ', &
356 '** sendrecv_init: invalid jmax1, ' // &
357 ' jmax1, maxval(jend1_all(:)) ', &
361 '** sendrecv_init: invalid jmax2, ' // &
362 ' jmax2, maxval(jend2_all(:)) ', &
366 '** sendrecv_init: invalid jmax3, ' // &
367 ' jmax3, maxval(jend3_all(:)) ', &
372 '** sendrecv_init: invalid imin1, ' // &
373 ' imin1, minval(istart1_all(:)) ', &
377 '** sendrecv_init: invalid imin2, ' // &
378 ' imin2, minval(istart2_all(:)) ', &
382 '** sendrecv_init: invalid imin3, ' // &
383 ' imin3, minval(istart3_all(:)) ', &
387 '** sendrecv_init: invalid imax1, ' // &
388 ' imax1, maxval(iend1_all(:)) ', &
392 '** sendrecv_init: invalid imax2, ' // &
393 ' imax2, maxval(iend2_all(:)) ', &
397 '** sendrecv_init: invalid imax3, ' // &
398 ' imax3, maxval(iend3_all(:)) ', &
404 '** sendrecv_init: jmin1,jmax1 ',
jmin1,
jmax1 )
406 '** sendrecv_init: jmin2,jmax2 ',
jmin2,
jmax2 )
408 '** sendrecv_init: jmin3,jmax3 ',
jmin3,
jmax3 )
411 '** sendrecv_init: kmin1,kmax1 ',
kmin1,
kmax1 )
413 '** sendrecv_init: kmin2,kmax2 ',
kmin2,
kmax2 )
415 '** sendrecv_init: kmin3,kmax3 ',
kmin3,
kmax3 )
418 '** sendrecv_init: imin1,imax1 ',
imin1,
imax1 )
420 '** sendrecv_init: imin2,imax2 ',
imin2,
imax2 )
422 '** sendrecv_init: imin3,imax3 ',
imin3,
imax3 )
433 allocate( ijk2proc( i1:i2, j1:j2, k1:k2 ) )
441 call ijk_of(ijk, ii,jj,kk)
442 ijk2 = funijk( ii,jj,kk)
444 isvalid = (ii.eq.i).and.(jj.eq.j).and.(kk.eq.k).and.(ijk.eq.ijk2)
445 if (.not.isvalid)
then 449 'istart3_all(myPE),iend3_all(myPE) ', &
452 'jstart3_all(myPE),jend3_all(myPE) ', &
455 'kstart3_all(myPE),kend3_all(myPE) ', &
458 call write_debug( name,
'i,j,k, ijk ', i,j,k, ijk )
468 if (lidebug.ge.1)
then 482 ijk2proc( :,:,: ) = 0
504 ijk2proc(i,j,k) = ijk2proc(i,j,k) + 1
510 do k=lbound(ijk2proc,3),ubound(ijk2proc,3)
511 do j=lbound(ijk2proc,2),ubound(ijk2proc,2)
512 do i=lbound(ijk2proc,1),ubound(ijk2proc,1)
513 isvalid = (ijk2proc(i,j,k) .eq. 1)
514 if (.not.isvalid)
then 542 ijk2proc(i,j,k) = iproc
549 allocate( ncount(0:
numpes-1) )
550 allocate( istartx(0:
numpes-1) )
551 allocate( jstartx(0:
numpes-1) )
552 allocate( kstartx(0:
numpes-1) )
553 allocate( iendx(0:
numpes-1) )
554 allocate( jendx(0:
numpes-1) )
555 allocate( kendx(0:
numpes-1) )
559 if (ilayer.eq.1)
then 575 if (lidebug.ge.1)
then 588 if (iproc.ne.
mype)
then 589 k1 = lbound(ijk2proc,3)
590 k2 = ubound(ijk2proc,3)
591 j1 = lbound(ijk2proc,2)
592 j2 = ubound(ijk2proc,2)
593 i1 = lbound(ijk2proc,1)
594 i2 = ubound(ijk2proc,1)
596 do k=kstartx(iproc),kendx(iproc)
597 do j=jstartx(iproc),jendx(iproc)
598 do i=istartx(iproc),iendx(iproc)
603 isvalid = (k1.le.kk).and.(kk.le.k2)
604 call assert( isvalid,
'** sendrecv_init: invalid kk ', kk )
605 isvalid = (j1.le.jj).and.(jj.le.j2)
606 call assert( isvalid,
'** sendrecv_init: invalid jj ', jj )
607 isvalid = (i1.le.ii).and.(ii.le.i2)
608 call assert( isvalid,
'** sendrecv_init: invalid ii ', ii )
609 jproc = ijk2proc( ii,jj,kk )
611 ismine = (jproc .eq.
mype)
613 ncount(iproc) = ncount(iproc) + 1
627 ntotal = ntotal + ncount(iproc)
628 if (ncount(iproc).ge.1)
then 633 if (lidebug.ge.1)
then 638 allocate( xsend(
nsend+1) )
639 allocate( sendijk( max(1,ntotal) ) )
640 allocate( sendproc(max(1,
nsend)) )
644 if (ncount(iproc).ne.0)
then 646 sendproc(
nsend) = iproc
653 xsend(i+1) = xsend(i) + ncount(iproc)
656 allocate( sendtag( max(1,
nsend) ) )
661 sendtag(ii) = message_tag( src, dest )
670 iproc = sendproc(iter)
672 do k=kstartx(iproc),kendx(iproc)
675 do i=istartx(iproc),iendx(iproc)
676 do j=jstartx(iproc),jendx(iproc)
680 jproc = ijk2proc(ii,jj,kk)
681 ismine = (jproc.eq.
mype)
684 ijk = funijk(ii,jj,kk)
685 ipos = xsend(iter)-1 + icount
686 sendijk( ipos ) = ijk
691 do j=jstartx(iproc),jendx(iproc)
692 do i=istartx(iproc),iendx(iproc)
696 jproc = ijk2proc(ii,jj,kk)
697 ismine = (jproc.eq.
mype)
700 ijk = funijk(ii,jj,kk)
701 ipos = xsend(iter)-1 + icount
702 sendijk( ipos ) = ijk
708 isvalid = (icount .eq. ncount(iproc))
710 '** sendrecv_init: icount != ncount(iproc) ', iproc)
713 if (lidebug.ge.1)
then 730 k1 = lbound(ijk2proc,3)
731 k2 = ubound(ijk2proc,3)
732 j1 = lbound(ijk2proc,2)
733 j2 = ubound(ijk2proc,2)
734 i1 = lbound(ijk2proc,1)
735 i2 = ubound(ijk2proc,1)
744 isvalid = (k1.le.kk).and.(kk.le.k2)
745 call assert( isvalid,
'** sendrecv_init: invalid kk ', kk )
747 isvalid = (j1.le.jj).and.(jj.le.j2)
748 call assert( isvalid,
'** sendrecv_init: invalid jj ', jj )
750 isvalid = (i1.le.ii).and.(ii.le.i2)
751 call assert( isvalid,
'** sendrecv_init: invalid ii ', ii )
754 iproc = ijk2proc(ii,jj,kk)
755 is_halobc = (iproc.eq.-1)
756 ismine = (iproc.eq.
mype)
757 if (.not.ismine)
then 758 isvalid = (0 .le. iproc) .and. &
759 (iproc.le.
numpes-1) .and. &
762 '** sendrecv_init: invalid iproc ',iproc)
764 ncount(iproc) = ncount(iproc) + 1
774 ntotal = ntotal + ncount(iproc)
777 nrecv = count( ncount(:) .ne. 0)
779 allocate( recvproc( max(1,
nrecv) ) )
783 if (ncount(iproc).ne.0)
then 785 recvproc(
nrecv) = iproc
789 allocate( xrecv(
nrecv+1) )
790 allocate( recvijk(max(1,ntotal)) )
794 iproc = recvproc(iter)
795 xrecv(iter+1) = xrecv(iter) + ncount(iproc)
798 allocate( recvtag( max(1,
nrecv) ) )
801 iproc = recvproc(iter)
804 recvtag(iter) = message_tag( src, dest )
811 if (lidebug.ge.1)
then 818 jproc = recvproc(iter)
828 iproc = ijk2proc(ii,jj,kk)
829 is_halobc = (iproc.eq.-1)
830 ismine = (iproc.eq.
mype)
832 if ((.not.ismine) .and. (iproc.eq.jproc))
then 834 recvijk( ipos ) = ijk
847 iproc = ijk2proc(ii,jj,kk)
848 is_halobc = (iproc.eq.-1)
849 ismine = (iproc.eq.
mype)
851 if ((.not.ismine) .and. (iproc.eq.jproc))
then 853 recvijk( ipos ) = ijk
863 if (ilayer.eq.1)
then 903 deallocate( ijk2proc )
905 deallocate( istartx )
906 deallocate( jstartx )
907 deallocate( kstartx )
924 if (lidebug.ge.1)
then 925 call write_debug( name,
' allocate message buffers ' )
932 allocate( line(lmax) )
945 write(line(ip),9001) ii,ijk, i,j,k
946 9001
format(
'recvijk1( ', i6,
') = ', &
947 i6,
'( ', i6,
',',i6,
',',i6,
') ')
957 allocate( line(lmax) )
970 write(line(ip),9101) ii,ijk, i,j,k
971 9101
format(
'recvijk2( ', i6,
') = ', &
972 i6,
'( ', i6,
',',i6,
',',i6,
') ')
980 call write_debug( name,
' allocate message buffers ' )
1000 write(line(ip),9002) ii,ijk, i,j,k
1001 9002
format(
'sendijk1( ', i6,
') = ', &
1002 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1011 allocate(line(lmax))
1024 write(line(ip),9102) ii,ijk, i,j,k
1025 9102
format(
'sendijk2( ', i6,
') = ', &
1026 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1054 isize = max(1,max(recvsize1,recvsize2))
1060 isize = max(1,max(sendsize1,sendsize2))
1065 datatype = mpi_double_precision
1068 if (layer.eq.1)
then 1105 source = recvproc( ii )
1108 if (lidebug.ge.2)
then 1109 call write_debug(name,
'mpi_recv_init: ii,j1,j2 ', &
1115 call mpi_recv_init(
drecvbuffer(j1), icount, datatype, &
1116 source, tag, comm, request, ierror )
1117 call mpi_check(
'sendrecv_begin_1d:MPI_IRECV ', ierror )
1125 dest = sendproc( ii )
1129 if (lidebug.ge.2)
then 1130 call write_debug(name,
'mpi_send_init: ii,j1,j2 ', &
1136 call mpi_send_init(
dsendbuffer(j1), icount, datatype, &
1137 dest, tag, comm, request, ierror )
1138 call mpi_check(
'sendrecv_begin_1d:MPI_SEND_INIT ', &
1147 if (lidebug.ge.1)
then 1165 integer,
intent(in),
optional :: ilayer
1166 double precision,
intent(inout),
dimension(:) :: XX
1167 integer,
intent(in),
optional :: idebug
1173 character(len=80),
parameter :: name =
'sendrecv_begin_1d' 1175 integer :: layer, datatype, comm, recvsize, sendsize, &
1176 request, count, source,dest, tag, ierror
1177 integer :: ijk, jj, j1, j2, ii
1182 if (
present(idebug))
then 1187 if (
present(ilayer))
then 1191 if (layer.eq.1)
then 1228 if (lidebug.ge.1)
then 1229 call write_debug(name,
'post asynchronous receives, nrecv = ', &
1233 if (
nrecv.ge.1)
then 1236 if (lidebug.ge.1)
then 1237 call write_debug( name,
'recvsize, ubound(drecvbuffer,1) ',&
1249 datatype = mpi_double_precision
1254 if (lidebug.ge.2)
then 1255 call write_debug( name,
'before startall for recv ',&
1261 if (lidebug.ge.2)
then 1262 call write_debug( name,
'after startall for recv, ierror',&
1266 call mpi_check(
'sendrecv_begin: MPI_STARTALL ', ierror )
1277 if (lidebug.ge.2)
then 1284 call mpi_irecv(
drecvbuffer(j1), count, datatype, &
1285 source, tag, comm, request, ierror )
1287 call mpi_check(
'sendrecv_begin_1d:MPI_IRECV ', ierror )
1297 if (lidebug.ge.1)
then 1298 call write_debug(name,
'post asynchronous sends ')
1301 if (
nsend.ge.1)
then 1304 if (lidebug.ge.1)
then 1306 'sendsize, ubound(dsendbuffer,1) ', &
1318 datatype = mpi_double_precision
1333 if (lidebug.ge.2)
then 1334 call write_debug(name,
'before mpi_startall send ',&
1340 if (lidebug .ge.2)
then 1341 call write_debug(name,
'after mpi_startall send ',&
1345 call mpi_check(
'sendrecv_begin_1d:MPI_STARTALL ', ierror )
1363 if (lidebug.ge.2)
then 1370 call mpi_isend(
dsendbuffer(j1), count, datatype, dest, &
1371 tag, comm, request, ierror )
1372 call mpi_check(
'sendrecv_begin_1d:MPI_ISEND ', ierror )
1394 integer,
intent(in),
optional :: ilayer
1395 integer,
intent(inout),
dimension(:) :: XX
1396 integer,
intent(in),
optional :: idebug
1402 character(len=80),
parameter :: name =
'sendrecv_begin_1i' 1404 integer :: layer, datatype, comm, recvsize, sendsize, &
1405 request, count, source, dest, tag, ierror
1406 integer :: ijk, jj, j1, j2, ii
1411 if (
present(idebug))
then 1416 if (
present(ilayer))
then 1420 if (layer.eq.1)
then 1450 if (lidebug.ge.1)
then 1452 'post asynchronous receives, nrecv = ',
nrecv )
1455 if (
nrecv.ge.1)
then 1459 if (lidebug.ge.1)
then 1461 'recvsize, ubound(irecvbuffer,1) ', &
1472 datatype = mpi_integer
1482 if (lidebug.ge.2)
then 1483 call write_debug(name,
'mpi_irecv: ii,j1,j2 ', ii,j1,j2 )
1488 call mpi_irecv(
irecvbuffer(j1), count, datatype, &
1489 source, tag, comm, request, ierror )
1490 call mpi_check(
'sendrecv_begin_1i:MPI_IRECV ', ierror )
1501 if (lidebug.ge.1)
then 1502 call write_debug(name,
'post asynchronous sends ')
1505 if (
nsend.ge.1)
then 1509 if (lidebug.ge.1)
then 1510 call write_debug( name,
'sendsize, ubound(isendbuffer,1) ',&
1521 datatype = mpi_integer
1538 if (lidebug.ge.2)
then 1539 call write_debug(name,
'mpi_isend: ii,j1,j2 ', ii,j1,j2)
1540 call write_debug(name,
'count, dest, tag ', count, &
1544 call mpi_isend(
isendbuffer(j1), count, datatype, dest, &
1545 tag, comm, request, ierror )
1546 call mpi_check(
'sendrecv_begin_1i:MPI_ISEND ', ierror )
1571 integer,
intent(in),
optional :: ilayer
1572 character(len=*),
intent(inout),
dimension(:) :: XX
1573 integer,
intent(in),
optional :: idebug
1579 character(len=80),
parameter :: name =
'sendrecv_begin_1c' 1581 integer :: layer, datatype, comm, recvsize, sendsize, &
1582 request, count, source, dest, tag, ierror
1583 integer :: ijk, jj, j1, j2, ii
1584 integer :: ic, clen, jpos
1589 if (
present(idebug))
then 1594 if (
present(ilayer))
then 1599 clen = len( xx( jpos ) )
1601 if (layer.eq.1)
then 1630 if (lidebug.ge.1)
then 1631 call write_debug(name,
'post asynchronous receives, nrecv = ',&
1635 if (
nrecv.ge.1)
then 1640 if (lidebug.ge.1)
then 1641 call write_debug( name,
'recvsize, ubound(crecvbuffer,1) ', &
1652 datatype = mpi_character
1665 if (lidebug.ge.2)
then 1666 call write_debug(name,
'mpi_irecv: ii,j1,j2 ', ii,j1,j2 )
1671 jpos = 1 + (j1-1)*clen
1672 call mpi_irecv(
crecvbuffer(jpos), count, datatype, source, &
1673 tag, comm, request, ierror )
1674 call mpi_check(
'sendrecv_begin_1c:MPI_IRECV ', ierror )
1684 if (lidebug.ge.1)
then 1685 call write_debug(name,
'post asynchronous sends ')
1688 if (
nsend.ge.1)
then 1693 if (lidebug.ge.1)
then 1694 call write_debug( name,
'sendsize, ubound(csendbuffer,1) ', &
1705 datatype = mpi_character
1719 jpos = (jj-1)*clen +
ic 1727 if (lidebug.ge.2)
then 1728 call write_debug(name,
'mpi_isend: ii,j1,j2 ', ii,j1,j2)
1729 call write_debug(name,
'count, dest, tag ', count, &
1733 jpos = (j1-1)*clen + 1
1734 call mpi_isend(
csendbuffer(jpos), count, datatype, dest, &
1735 tag, comm, request, ierror )
1736 call mpi_check(
'sendrecv_begin_1c:MPI_ISEND ', ierror )
1758 double precision,
intent(inout),
dimension(:) :: XX
1759 integer,
intent(in),
optional :: idebug
1765 character(len=80),
parameter :: name =
'sendrecv_end_1d' 1766 logical,
parameter :: use_waitany = .false.
1768 integer :: jj, ijk, jindex, ii, j1, j2, ierror
1769 integer,
dimension(MPI_STATUS_SIZE) :: recv_status_any
1770 integer,
dimension(:,:),
pointer :: recv_status
1771 integer,
dimension(:,:),
pointer :: send_status
1777 if (
present(idebug))
then 1781 if (
nsend.ge.1)
then 1782 if (lidebug.ge.1)
then 1784 'waiting for sends to complete, nsend = ',
nsend )
1787 allocate( send_status(mpi_status_size,
nsend))
1791 send_status, ierror )
1796 call mpi_check(
'sendrecv_end_1d:MPI_WAITALL ', ierror )
1798 deallocate( send_status )
1799 nullify( send_status )
1804 if (
nrecv.ge.1)
then 1805 if (lidebug.ge.1)
then 1807 'waiting for receives to complete, nrecv = ',
nrecv )
1810 if (use_waitany)
then 1814 jindex, recv_status_any, ierror )
1817 jindex, recv_status_any, ierror )
1820 call mpi_check(
'sendrecv_end_1d:MPI_WAITANY ', ierror )
1822 j1 =
xrecv( jindex )
1823 j2 =
xrecv( jindex + 1)-1
1825 if (lidebug.ge.2)
then 1826 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2)
1837 allocate( recv_status(mpi_status_size,
nrecv))
1840 recv_status, ierror )
1846 call mpi_check(
'sendrecv_end_1d:MPI_WAITALL recv ', &
1848 deallocate( recv_status )
1849 nullify( recv_status )
1877 character(len=*),
intent(inout),
dimension(:) :: XX
1878 integer,
intent(in),
optional :: idebug
1884 character(len=80),
parameter :: name =
'sendrecv_end_1c' 1885 integer :: ic, clen, jpos
1886 logical,
parameter :: use_waitany = .false.
1888 integer :: jj, ijk, jindex, ii, j1, j2, ierror
1889 integer,
dimension(MPI_STATUS_SIZE) :: recv_status_any
1890 integer,
dimension(:,:),
pointer :: recv_status
1891 integer,
dimension(:,:),
pointer :: send_status
1897 if (
present(idebug))
then 1902 clen = len(xx(jpos))
1904 if (
nsend.ge.1)
then 1905 if (lidebug.ge.1)
then 1907 'waiting for sends to complete, nsend = ',
nsend )
1910 allocate( send_status(mpi_status_size,
nsend))
1913 call mpi_check(
'sendrecv_end_1c:MPI_WAITALL ', ierror )
1915 deallocate( send_status )
1916 nullify( send_status )
1925 if (
nrecv.ge.1)
then 1926 if (lidebug.ge.1)
then 1928 'waiting for receives to complete, nrecv = ',
nrecv )
1931 if (use_waitany)
then 1934 recv_status_any, ierror )
1935 call mpi_check(
'sendrecv_end_1c:MPI_WAITANY ', ierror )
1937 j1 =
xrecv( jindex )
1938 j2 =
xrecv( jindex + 1)-1
1940 if (lidebug.ge.2)
then 1941 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2 )
1948 jpos = (jj-1)*clen +
ic 1956 allocate( recv_status(mpi_status_size,
nrecv))
1958 call mpi_check(
'sendrecv_end_1c:MPI_WAITALL recv ', ierror )
1960 deallocate( recv_status )
1961 nullify( recv_status )
1968 jpos = (jj-1)*clen +
ic 1995 integer,
intent(inout),
dimension(:) :: XX
1996 integer,
intent(in),
optional :: idebug
2003 character(len=80),
parameter :: name =
'sendrecv_end_1i' 2004 logical,
parameter :: use_waitany = .false.
2006 integer :: jj, ijk, jindex, ii, j1, j2, ierror
2007 integer,
dimension(MPI_STATUS_SIZE) :: recv_status_any
2008 integer,
dimension(:,:),
pointer :: recv_status
2009 integer,
dimension(:,:),
pointer :: send_status
2014 if (
present(idebug))
then 2018 if (
nsend.ge.1)
then 2019 if (lidebug.ge.1)
then 2021 'waiting for sends to complete, nsend = ',
nsend )
2024 allocate( send_status(mpi_status_size,
nsend))
2027 call mpi_check(
'sendrecv_end_1i:MPI_WAITALL ', ierror )
2029 deallocate( send_status )
2030 nullify( send_status )
2037 if (
nrecv.ge.1)
then 2038 if (lidebug.ge.1)
then 2040 'waiting for receives to complete, nrecv = ',
nrecv )
2043 if (use_waitany)
then 2046 recv_status_any, ierror )
2047 call mpi_check(
'sendrecv_end_1i:MPI_WAITANY ', ierror )
2049 j1 =
xrecv( jindex )
2050 j2 =
xrecv( jindex + 1)-1
2052 if (lidebug.ge.2)
then 2053 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2 )
2062 allocate( recv_status(mpi_status_size,
nrecv))
2064 call mpi_check(
'sendrecv_end_1i:MPI_WAITALL recv ', ierror )
2065 deallocate( recv_status )
2066 nullify( recv_status )
2096 character(len=*),
dimension(:),
intent(inout) :: XX
2097 integer,
intent(in),
optional :: ilayer,idebug
2101 integer :: lidebug, layer
2106 if (
present(idebug))
then 2111 if (
present(ilayer))
then 2132 double precision,
dimension(:),
intent(inout) :: XX
2133 integer,
intent(in),
optional :: ilayer,idebug
2137 integer :: lidebug, layer
2142 if (
present(idebug))
then 2147 if (
present(ilayer))
then 2167 double precision,
dimension(:,:),
intent(inout) :: XX
2168 integer,
intent(in),
optional :: ilayer,idebug
2172 integer :: lidebug, layer
2178 if (
present(idebug))
then 2183 if (
present(ilayer))
then 2187 do j=lbound(xx,2),ubound(xx,2)
2205 double precision,
dimension(:,:,:),
intent(inout) :: XX
2206 integer,
intent(in),
optional :: ilayer,idebug
2210 integer :: lidebug, layer
2215 if (
present(idebug))
then 2220 if (
present(ilayer))
then 2224 do k=lbound(xx,3),ubound(xx,3)
2225 do j=lbound(xx,2),ubound(xx,2)
2245 integer,
dimension(:),
intent(inout) :: XX
2246 integer,
intent(in),
optional :: ilayer,idebug
2250 integer :: lidebug, layer
2254 if (
present(idebug))
then 2259 if (
present(ilayer))
then 2279 integer,
intent(in) :: comm
2281 integer,
intent(in),
optional :: idebug
2291 character(len=80),
parameter :: name =
'sendrecv_init' 2293 character(len=80),
pointer,
dimension(:) :: line
2296 integer :: layer,request, source, tag, datatype
2299 integer :: isize,jsize,ksize, ijksize
2300 integer :: recvsize1, recvsize2, &
2301 sendsize1, sendsize2
2303 integer :: iter, i,j,k, ii, jj,kk, &
2304 ntotal, icount,ipos, &
2305 ilayer, i1,i2, j1,j2, k1,k2, &
2306 ijk, ijk2, iproc, jproc, src,dest, &
2309 logical :: isok, isvalid, ismine, is_halobc
2311 integer,
dimension(:,:,:),
pointer :: ijk2proc
2312 integer,
pointer,
dimension(:) :: &
2313 istartx,iendx, jstartx,jendx, kstartx,kendx, &
2315 recvproc, recvtag, xrecv, recvijk, &
2316 sendproc, sendtag, xsend, sendijk
2318 logical,
parameter :: jfastest = .true.
2321 integer,
parameter :: message_tag_offset = 11
2327 integer :: message_tag
2333 datatype = mpi_double_precision
2338 if (layer.eq.1)
then 2378 source = recvproc( ii )
2383 if (lidebug.ge.2)
then 2392 call mpi_recv_init(
drecvbuffer(j1), icount, datatype, &
2393 source, tag, comm, request, ierror )
2394 call mpi_check(
'sendrecv_begin_1d:MPI_IRECV ', ierror )
2403 dest = sendproc( ii )
2407 if (lidebug.ge.2)
then 2416 call mpi_send_init(
dsendbuffer(j1), icount, datatype, &
2418 comm, request, ierror )
2419 call mpi_check(
'sendrecv_begin_1d:MPI_SEND_INIT ', ierror )
integer, dimension(:), allocatable istart1_all
integer, dimension(:), allocatable imap
integer, dimension(:), pointer sendijk2
integer, dimension(:), pointer recvtag
integer, dimension(:), allocatable kstart1_all
subroutine sendrecv_begin_1d(XX, ilayer, idebug)
integer, dimension(:), pointer recvijk2
integer, dimension(:), allocatable i_of
subroutine send_recv_1d(XX, ilayer, idebug)
integer, dimension(:), pointer recvtag1
integer, dimension(:), allocatable kend1_all
integer, dimension(:), allocatable istart2_all
integer, dimension(:), pointer recvproc2
integer, dimension(:), allocatable kstart2_all
logical, parameter use_persistent_message
subroutine send_recv_3d(XX, ilayer, idebug)
integer, dimension(:), pointer xsend1
integer, dimension(:), allocatable iend3_all
subroutine send_recv_1i(XX, ilayer, idebug)
integer, dimension(:), pointer sendijk1
integer, dimension(:), pointer isendbuffer
integer, dimension(:), pointer recv_persistent_request1
integer, dimension(:), pointer sendijk
subroutine sendrecv_begin_1c(XX, ilayer, idebug)
integer, dimension(:), pointer recvrequest
integer, dimension(:), pointer sendtag
integer, dimension(:), allocatable k_of
integer, dimension(:), pointer recvijk
integer, dimension(:), pointer recv_persistent_request
integer, dimension(:), pointer irecvbuffer
integer, dimension(:), pointer send_persistent_request
integer, dimension(:), allocatable kstart3_all
subroutine mfix_exit(myID, normal_termination)
integer, dimension(:), allocatable istart3_all
integer, dimension(:), allocatable j_of
integer, dimension(:), allocatable jend2_all
integer, dimension(:), pointer recvproc
subroutine sendrecv_init(comm, cyclic_i, cyclic_j, cyclic_k, idebug)
integer, dimension(:), allocatable iend2_all
integer, dimension(:), allocatable jstart3_all
subroutine send_recv_2d(XX, ilayer, idebug)
integer, dimension(:), allocatable kend2_all
integer, dimension(:), pointer xsend2
integer, dimension(:), pointer xrecv1
integer, dimension(:), pointer recvproc1
integer, dimension(:), pointer xrecv
integer, dimension(:), pointer xrecv2
subroutine mpi_check(msg, ierr)
integer, dimension(:), allocatable jstart1_all
integer, dimension(:), pointer sendtag1
integer, dimension(:), pointer send_persistent_request1
subroutine send_recv_1c(XX, ilayer, idebug)
integer, dimension(:), pointer sendproc1
integer, dimension(:), pointer recvtag2
integer, dimension(:), allocatable kend3_all
character, dimension(:), pointer csendbuffer
subroutine sendrecv_end_1c(XX, idebug)
subroutine sendrecv_begin_1i(XX, ilayer, idebug)
integer, dimension(:), pointer sendproc2
integer, dimension(:), allocatable jend3_all
subroutine sendrecv_end_1i(XX, idebug)
integer, dimension(:), allocatable jend1_all
integer, dimension(:), pointer send_persistent_request2
character, dimension(:), pointer crecvbuffer
integer, dimension(:), pointer recvijk1
integer, dimension(:), allocatable jmap
subroutine sendrecv_re_init_after_re_indexing(comm, idebug)
double precision, dimension(:), pointer drecvbuffer
subroutine sendrecv_end_1d(XX, idebug)
subroutine ijk_of_gl(ijkp, i, j, k)
subroutine ijk_of(ijkp, i, j, k)
integer, dimension(:), pointer recv_persistent_request2
subroutine write_error(name, line, lmax)
integer, dimension(:), allocatable jstart2_all
integer, dimension(:), pointer sendproc
integer, dimension(:), pointer sendtag2
double precision, dimension(:), pointer dsendbuffer
integer, dimension(:), allocatable kmap
integer, dimension(:), allocatable iend1_all
integer, dimension(:), pointer xsend
logical, parameter localfunc
integer, dimension(:), pointer sendrequest