10 integer,
pointer,
dimension(:) :: &
17 integer,
pointer,
dimension(:) :: &
27 integer,
pointer,
dimension(:) :: &
39 double precision,
dimension(:),
pointer :: &
41 integer,
dimension(:),
pointer :: &
43 character,
dimension(:),
pointer :: &
47 integer,
pointer,
dimension(:) :: &
85 subroutine ijk_of( ijkp, i,j,k )
86 integer,
intent(in) :: ijkp
87 integer,
intent(out) :: i,j,k
89 integer :: k1,k2, j1,j2, i1,i2, &
90 ijk, isize,jsize,ksize, gijk
92 character(len=32),
parameter :: name =
"ijk_of" 93 logical :: isok_k, isok_j, isok_i, is_same, isok
118 if (mod(ijk,isize*jsize).ne.0)
then 119 k = int( ijk/(isize*jsize) ) + k1
121 k = int( ijk/(isize*jsize) ) + k1 -1
123 ijk = ijk - (k-k1)*(isize*jsize)
125 if (mod(ijk,isize).ne.0)
then 126 j = int( ijk/isize ) + j1
128 j = int( ijk/isize ) + j1 - 1
130 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 )
154 integer,
intent(in) :: ijkp
155 integer,
intent(out) :: i,j,k
157 integer :: k1,k2, j1,j2, i1,i2, &
158 ijk, isize,jsize,ksize, gijk
160 character(len=32),
parameter :: name =
"ijk_of_gl" 161 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
203 isok_i = (i1 <= i) .and. (i <= i2)
204 isok_j = (j1 <= j) .and. (j <= j2)
205 isok_k = (k1 <= k) .and. (k <= k2)
206 gijk = 1 + (i-i1) + (j-j1)*(i2-i1+1) + &
207 (k-k1)*(j2-j1+1)*(i2-i1+1)
208 is_same = (gijk .eq. ijkp)
209 isok = isok_i .and. isok_j .and. isok_k .and. is_same
212 call write_debug( name,
'ijkp, gijk ', ijkp, gijk )
221 cyclic_i,cyclic_j,cyclic_k,
idebug )
227 integer,
intent(in) :: comm
228 logical,
intent(in) :: cyclic_i,cyclic_j,cyclic_k
230 integer,
intent(in),
optional :: idebug
242 character(len=80),
parameter :: name =
'sendrecv3_init' 244 character(len=80),
pointer,
dimension(:) :: line
247 integer :: layer,request, source, tag, datatype
250 integer :: isize,jsize,ksize, ijksize
251 integer :: recvsize1, recvsize2, &
254 integer :: iter, i,j,k, ii, jj,kk, &
255 ntotal, icount,ipos, &
256 ilayer, i1,i2, j1,j2, k1,k2, &
257 ijk, ijk2, iproc, jproc, src,dest, &
260 logical :: isok, isvalid, ismine, is_halobc
262 integer,
dimension(:,:,:),
pointer :: ijk2proc
263 integer,
pointer,
dimension(:) :: &
264 istartx,iendx, jstartx,jendx, kstartx,kendx, &
266 recvproc, recvtag, xrecv, recvijk, &
267 sendproc, sendtag, xsend, sendijk
269 logical,
parameter :: jfastest = .true.
272 integer,
parameter :: message_tag_offset = 1000
278 integer :: message_tag
280 message_tag(src,dest) = message_tag_offset + (1+src + dest*10*
numpes)
299 xrecv,recvproc, recvijk, recvtag, &
300 xsend,sendproc, sendijk, sendtag )
309 if (
present(idebug))
then 314 call mpi_comm_size( comm,
numpes, ierror )
315 call mpi_check(
'sendrecv3_init:MPI_COMM_SIZE ', ierror )
317 call mpi_comm_rank( comm,
mype, ierror )
318 call mpi_check(
'sendrecv3_init:MPI_COMM_RANK ', ierror )
329 '** sendrecv3_init: invalid kmin1, ' // &
330 ' kmin1, minval(kstart1_all(:)) ', &
334 '** sendrecv3_init: invalid kmin2, ' // &
335 ' kmin2, minval(kstart2_all(:)) ', &
339 '** sendrecv3_init: invalid kmin3, ' // &
340 ' kmin3, minval(kstart3_all(:)) ', &
345 '** sendrecv3_init: invalid kmax1, ' // &
346 ' kmax1, maxval(kend1_all(:)) ', &
350 '** sendrecv3_init: invalid kmax2, ' // &
351 ' kmax2, maxval(kend2_all(:)) ', &
355 '** sendrecv3_init: invalid kmax3, ' // &
356 ' kmax3, maxval(kend3_all(:)) ', &
363 '** sendrecv3_init: invalid kmin4, ' // &
364 ' kmin4, minval(kstart4_all(:)) ', &
367 '** sendrecv3_init: invalid kmax4, ' // &
368 ' kmax4, maxval(kend4_all(:)) ', &
375 '** sendrecv3_init: invalid jmin1, ' // &
376 ' jmin1, minval(jstart1_all(:)) ', &
380 '** sendrecv3_init: invalid jmin2, ' // &
381 ' jmin2, minval(jstart2_all(:)) ', &
385 '** sendrecv3_init: invalid jmin3, ' // &
386 ' jmin3, minval(jstart3_all(:)) ', &
391 '** sendrecv3_init: invalid jmax1, ' // &
392 ' jmax1, maxval(jend1_all(:)) ', &
396 '** sendrecv3_init: invalid jmax2, ' // &
397 ' jmax2, maxval(jend2_all(:)) ', &
401 '** sendrecv3_init: invalid jmax3, ' // &
402 ' jmax3, maxval(jend3_all(:)) ', &
408 '** sendrecv3_init: invalid jmin4, ' // &
409 ' jmin4, minval(jstart4_all(:)) ', &
412 '** sendrecv3_init: invalid jmax4, ' // &
413 ' jmax4, maxval(jend4_all(:)) ', &
420 '** sendrecv3_init: invalid imin1, ' // &
421 ' imin1, minval(istart1_all(:)) ', &
425 '** sendrecv3_init: invalid imin2, ' // &
426 ' imin2, minval(istart2_all(:)) ', &
430 '** sendrecv3_init: invalid imin3, ' // &
431 ' imin3, minval(istart3_all(:)) ', &
436 '** sendrecv3_init: invalid imax1, ' // &
437 ' imax1, maxval(iend1_all(:)) ', &
441 '** sendrecv3_init: invalid imax2, ' // &
442 ' imax2, maxval(iend2_all(:)) ', &
446 '** sendrecv3_init: invalid imax3, ' // &
447 ' imax3, maxval(iend3_all(:)) ', &
454 '** sendrecv3_init: invalid imin4, ' // &
455 ' imin4, minval(istart4_all(:)) ', &
458 '** sendrecv3_init: invalid imax4, ' // &
459 ' imax4, maxval(iend4_all(:)) ', &
465 '** sendrecv3_init: jmin1,jmax1 ',
jmin1,
jmax1 )
467 '** sendrecv3_init: jmin2,jmax2 ',
jmin2,
jmax2 )
469 '** sendrecv3_init: jmin3,jmax3 ',
jmin3,
jmax3 )
472 '** sendrecv3_init: kmin1,kmax1 ',
kmin1,
kmax1 )
474 '** sendrecv3_init: kmin2,kmax2 ',
kmin2,
kmax2 )
476 '** sendrecv3_init: kmin3,kmax3 ',
kmin3,
kmax3 )
479 '** sendrecv3_init: imin1,imax1 ',
imin1,
imax1 )
481 '** sendrecv3_init: imin2,imax2 ',
imin2,
imax2 )
483 '** sendrecv3_init: imin3,imax3 ',
imin3,
imax3 )
490 '** sendrecv3_init: jmin4,jmax4 ',
jmin4,
jmax4 )
492 '** sendrecv3_init: imin4,imax4 ',
imin4,
imax4 )
494 '** sendrecv3_init: kmin4,kmax4 ',
kmin4,
kmax4 )
519 allocate( ijk2proc( i1:i2, j1:j2, k1:k2 ) )
545 call ijk_of(ijk, ii,jj,kk)
546 ijk2 = funijk( ii,jj,kk)
548 isvalid = (ii.eq.i).and.(jj.eq.j).and.(kk.eq.k).and.(ijk.eq.ijk2)
549 if (.not.isvalid)
then 552 call write_debug( name,
'istart3_all(myPE),iend3_all(myPE) ', &
554 call write_debug( name,
'jstart3_all(myPE),jend3_all(myPE) ', &
556 call write_debug( name,
'kstart3_all(myPE),kend3_all(myPE) ', &
559 call write_debug( name,
'i,j,k, ijk ', i,j,k, ijk )
560 call write_debug( name,
'ii,jj,kk, ijk2 ',ii,jj,kk,ijk2 )
569 if (lidebug.ge.1)
then 585 ijk2proc( :,:,: ) = 0
616 ijk2proc(i,j,k) = ijk2proc(i,j,k) + 1
623 do k=lbound(ijk2proc,3),ubound(ijk2proc,3)
624 do j=lbound(ijk2proc,2),ubound(ijk2proc,2)
625 do i=lbound(ijk2proc,1),ubound(ijk2proc,1)
626 isvalid = (ijk2proc(i,j,k) .eq. 1)
627 if (.not.isvalid)
then 631 call write_debug(name,
'ijk2proc(i,j,k) ', ijk2proc(i,j,k))
674 ijk2proc(i,j,k) = iproc
683 allocate( ncount(0:
numpes-1) )
685 allocate( istartx(0:
numpes-1) )
686 allocate( jstartx(0:
numpes-1) )
687 allocate( kstartx(0:
numpes-1) )
689 allocate( iendx(0:
numpes-1) )
690 allocate( jendx(0:
numpes-1) )
691 allocate( kendx(0:
numpes-1) )
698 if (ilayer.eq.1)
then 705 else if (ilayer.eq.2)
then 712 else if (ilayer.eq.3)
then 728 if (lidebug.ge.1)
then 749 if (iproc.ne.
mype)
then 752 k1 = lbound(ijk2proc,3)
753 k2 = ubound(ijk2proc,3)
754 j1 = lbound(ijk2proc,2)
755 j2 = ubound(ijk2proc,2)
756 i1 = lbound(ijk2proc,1)
757 i2 = ubound(ijk2proc,1)
760 do k=kstartx(iproc),kendx(iproc)
761 do j=jstartx(iproc),jendx(iproc)
762 do i=istartx(iproc),iendx(iproc)
768 isvalid = (k1.le.kk).and.(kk.le.k2)
769 call assert( isvalid,
'** sendrecv3_init: invalid kk ', kk )
771 isvalid = (j1.le.jj).and.(jj.le.j2)
772 call assert( isvalid,
'** sendrecv3_init: invalid jj ', jj )
774 isvalid = (i1.le.ii).and.(ii.le.i2)
775 call assert( isvalid,
'** sendrecv3_init: invalid ii ', ii )
777 jproc = ijk2proc( ii,jj,kk )
779 ismine = (jproc .eq.
mype)
781 ncount(iproc) = ncount(iproc) + 1
798 ntotal = ntotal + ncount(iproc)
799 if (ncount(iproc).ge.1)
then 804 if (lidebug.ge.1)
then 810 allocate( xsend(
nsend+1) )
812 allocate( sendijk( max(1,ntotal) ) )
813 allocate( sendproc(max(1,
nsend)) )
817 if (ncount(iproc).ne.0)
then 819 sendproc(
nsend) = iproc
826 xsend(i+1) = xsend(i) + ncount(iproc)
829 allocate( sendtag( max(1,
nsend) ) )
834 sendtag(ii) = message_tag( src, dest )
844 iproc = sendproc(iter)
847 do k=kstartx(iproc),kendx(iproc)
851 do i=istartx(iproc),iendx(iproc)
852 do j=jstartx(iproc),jendx(iproc)
858 jproc = ijk2proc(ii,jj,kk)
859 ismine = (jproc.eq.
mype)
862 ijk = funijk(ii,jj,kk)
864 ipos = xsend(iter)-1 + icount
865 sendijk( ipos ) = ijk
874 do j=jstartx(iproc),jendx(iproc)
875 do i=istartx(iproc),iendx(iproc)
881 jproc = ijk2proc(ii,jj,kk)
882 ismine = (jproc.eq.
mype)
885 ijk = funijk(ii,jj,kk)
887 ipos = xsend(iter)-1 + icount
888 sendijk( ipos ) = ijk
897 isvalid = (icount .eq. ncount(iproc))
899 '** sendrecv3_init: icount != ncount(iproc) ', iproc)
905 if (lidebug.ge.1)
then 922 k1 = lbound(ijk2proc,3)
923 k2 = ubound(ijk2proc,3)
924 j1 = lbound(ijk2proc,2)
925 j2 = ubound(ijk2proc,2)
926 i1 = lbound(ijk2proc,1)
927 i2 = ubound(ijk2proc,1)
938 isvalid = (k1.le.kk).and.(kk.le.k2)
939 call assert( isvalid,
'** sendrecv3_init: invalid kk ', kk )
941 isvalid = (j1.le.jj).and.(jj.le.j2)
942 call assert( isvalid,
'** sendrecv3_init: invalid jj ', jj )
944 isvalid = (i1.le.ii).and.(ii.le.i2)
945 call assert( isvalid,
'** sendrecv3_init: invalid ii ', ii )
951 iproc = ijk2proc(ii,jj,kk)
952 is_halobc = (iproc.eq.-1)
953 ismine = (iproc.eq.
mype)
954 if (.not.ismine)
then 956 isvalid = (0 .le. iproc) .and. &
957 (iproc.le.
numpes-1) .and. &
961 '** sendrecv3_init: invalid iproc ',iproc)
963 ncount(iproc) = ncount(iproc) + 1
973 ntotal = ntotal + ncount(iproc)
976 nrecv = count( ncount(:) .ne. 0)
978 allocate( recvproc( max(1,
nrecv) ) )
982 if (ncount(iproc).ne.0)
then 984 recvproc(
nrecv) = iproc
988 allocate( xrecv(
nrecv+1) )
989 allocate( recvijk(max(1,ntotal)) )
993 iproc = recvproc(iter)
994 xrecv(iter+1) = xrecv(iter) + ncount(iproc)
997 allocate( recvtag( max(1,
nrecv) ) )
1000 iproc = recvproc(iter)
1003 recvtag(iter) = message_tag( src, dest )
1010 if (lidebug.ge.1)
then 1017 jproc = recvproc(iter)
1030 iproc = ijk2proc(ii,jj,kk)
1031 is_halobc = (iproc.eq.-1)
1033 ismine = (iproc.eq.
mype)
1034 if ((.not.ismine) .and. (iproc.eq.jproc))
then 1037 ijk = funijk( i,j,k)
1038 recvijk( ipos ) = ijk
1055 iproc = ijk2proc(ii,jj,kk)
1056 is_halobc = (iproc.eq.-1)
1058 ismine = (iproc.eq.
mype)
1059 if ((.not.ismine) .and. (iproc.eq.jproc))
then 1062 ijk = funijk( i,j,k)
1063 recvijk( ipos ) = ijk
1074 if (ilayer.eq.1)
then 1088 else if (ilayer.eq.2)
then 1102 else if (ilayer.eq.3)
then 1135 deallocate( ncount )
1136 deallocate( ijk2proc )
1138 deallocate( istartx )
1139 deallocate( jstartx )
1140 deallocate( kstartx )
1157 if (lidebug.ge.1)
then 1159 call write_debug( name,
' allocate message buffers ' )
1167 allocate( line(lmax) )
1180 write(line(ip),9001) ii,ijk, i,j,k
1181 9001
format(
'recvijk1( ', i6,
') = ', &
1182 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1190 allocate( line(lmax) )
1204 write(line(ip),9101) ii,ijk, i,j,k
1205 9101
format(
'recvijk2( ', i6,
') = ', &
1206 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1214 call write_debug( name,
' allocate message buffers ' )
1223 allocate(line(lmax))
1237 write(line(ip),9002) ii,ijk, i,j,k
1238 9002
format(
'sendijk1( ', i6,
') = ', &
1239 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1249 allocate(line(lmax))
1263 write(line(ip),9102) ii,ijk, i,j,k
1264 9102
format(
'sendijk2( ', i6,
') = ', &
1265 i6,
'( ', i6,
',',i6,
',',i6,
') ')
1300 isize = max(1,max(recvsize1,recvsize2))
1306 isize = max(1,max(sendsize1,sendsize2))
1312 datatype = mpi_double_precision
1317 if (layer.eq.1)
then 1333 else if (layer.eq.2)
then 1349 else if (layer.eq.3)
then 1377 source = recvproc( ii )
1381 if (lidebug.ge.2)
then 1383 call write_debug(name,
'mpi_recv_init: ii,j1,j2 ', &
1390 call mpi_recv_init(
drecvbuffer(j1), icount, datatype, &
1391 source, tag, comm, request, ierror )
1392 call mpi_check(
'sendrecv3_begin_1d:MPI_IRECV ', ierror )
1401 dest = sendproc( ii )
1405 if (lidebug.ge.2)
then 1407 call write_debug(name,
'mpi_send_init: ii,j1,j2 ', &
1414 call mpi_send_init(
dsendbuffer(j1), icount, datatype, &
1416 comm, request, ierror )
1417 call mpi_check(
'sendrecv3_begin_1d:MPI_SEND_INIT ', ierror )
1425 if (lidebug.ge.1)
then 1442 integer,
intent(in),
optional :: ilayer
1443 double precision,
intent(inout),
dimension(:) :: XX
1444 integer,
intent(in),
optional :: idebug
1451 character(len=80),
parameter :: name =
'sendrecv3_begin_1d' 1455 integer :: layer, datatype, comm, recvsize, sendsize, &
1456 ijk,jj,j1,j2, request, ii,count,source,dest, tag, ierror
1460 if (
present(idebug))
then 1465 if (
present(ilayer))
then 1469 if (layer.eq.1)
then 1485 else if (layer.eq.2)
then 1501 else if (layer.eq.3)
then 1528 if (lidebug.ge.1)
then 1532 if (
nrecv.ge.1)
then 1536 if (lidebug.ge.1)
then 1537 call write_debug( name,
'recvsize, ubound(drecvbuffer,1) ', &
1552 datatype = mpi_double_precision
1560 if (lidebug.ge.2)
then 1561 call write_debug( name,
'before startall for recv ',&
1567 if (lidebug.ge.2)
then 1568 call write_debug( name,
'after startall for recv, ierror',&
1572 call mpi_check(
'sendrecv3_begin: MPI_STARTALL ', ierror )
1588 if (lidebug.ge.2)
then 1590 call write_debug(name,
'mpi_irecv: ii,j1,j2 ', ii,j1,j2 )
1595 call mpi_irecv(
drecvbuffer(j1), count, datatype, source, tag, &
1596 comm, request, ierror )
1598 call mpi_check(
'sendrecv3_begin_1d:MPI_IRECV ', ierror )
1610 if (lidebug.ge.1)
then 1612 call write_debug(name,
'post asynchronous sends ')
1615 if (
nsend.ge.1)
then 1619 if (lidebug.ge.1)
then 1622 'sendsize, ubound(dsendbuffer,1) ', &
1640 datatype = mpi_double_precision
1658 if (lidebug.ge.2)
then 1659 call write_debug(name,
'before mpi_startall send ',&
1665 if (lidebug .ge.2)
then 1666 call write_debug(name,
'after mpi_startall send ',&
1670 call mpi_check(
'sendrecv3_begin_1d:MPI_STARTALL ', ierror )
1693 if (lidebug.ge.2)
then 1695 call write_debug(name,
'mpi_isend: ii,j1,j2 ', ii,j1,j2)
1696 call write_debug(name,
'count, dest, tag ', count,dest,tag )
1700 call mpi_isend(
dsendbuffer(j1), count, datatype, dest, tag, &
1701 comm, request, ierror )
1702 call mpi_check(
'sendrecv3_begin_1d:MPI_ISEND ', ierror )
1723 integer,
intent(in),
optional :: ilayer
1724 integer,
intent(inout),
dimension(:) :: XX
1725 integer,
intent(in),
optional :: idebug
1732 character(len=80),
parameter :: name =
'sendrecv3_begin_1i' 1736 integer :: layer, datatype, comm, recvsize, sendsize, &
1737 ijk,jj,j1,j2, request, ii,count,source,dest, tag, ierror
1740 if (
present(idebug))
then 1745 if (
present(ilayer))
then 1749 if (layer.eq.1)
then 1761 else if (layer.eq.2)
then 1773 else if (layer.eq.3)
then 1795 if (lidebug.ge.1)
then 1797 'post asynchronous receives, nrecv = ',
nrecv )
1800 if (
nrecv.ge.1)
then 1804 if (lidebug.ge.1)
then 1806 'recvsize, ubound(irecvbuffer,1) ', &
1821 datatype = mpi_integer
1832 if (lidebug.ge.2)
then 1834 call write_debug(name,
'mpi_irecv: ii,j1,j2 ', ii,j1,j2 )
1839 call mpi_irecv(
irecvbuffer(j1), count, datatype, source, tag, &
1840 comm, request, ierror )
1842 call mpi_check(
'sendrecv3_begin_1i:MPI_IRECV ', ierror )
1853 if (lidebug.ge.1)
then 1855 call write_debug(name,
'post asynchronous sends ')
1858 if (
nsend.ge.1)
then 1862 if (lidebug.ge.1)
then 1864 call write_debug( name,
'sendsize, ubound(isendbuffer,1) ', &
1882 datatype = mpi_integer
1903 if (lidebug.ge.2)
then 1905 call write_debug(name,
'mpi_isend: ii,j1,j2 ', ii,j1,j2)
1906 call write_debug(name,
'count, dest, tag ', count,dest,tag )
1910 call mpi_isend(
isendbuffer(j1), count, datatype, dest, tag, &
1911 comm, request, ierror )
1912 call mpi_check(
'sendrecv3_begin_1i:MPI_ISEND ', ierror )
1931 integer,
intent(in),
optional :: ilayer
1932 character(len=*),
intent(inout),
dimension(:) :: XX
1933 integer,
intent(in),
optional :: idebug
1940 character(len=80),
parameter :: name =
'sendrecv3_begin_1c' 1944 integer :: layer, datatype, comm, recvsize, sendsize, &
1945 ijk,jj,j1,j2, request, ii,count,source,dest, tag, ierror
1947 integer :: ic, clen, jpos
1950 if (
present(idebug))
then 1955 if (
present(ilayer))
then 1960 clen = len( xx( jpos ) )
1962 if (layer.eq.1)
then 1974 else if (layer.eq.2)
then 1986 else if (layer.eq.3)
then 2009 if (lidebug.ge.1)
then 2013 if (
nrecv.ge.1)
then 2018 if (lidebug.ge.1)
then 2019 call write_debug( name,
'recvsize, ubound(crecvbuffer,1) ', &
2034 datatype = mpi_character
2048 if (lidebug.ge.2)
then 2050 call write_debug(name,
'mpi_irecv: ii,j1,j2 ', ii,j1,j2 )
2055 jpos = 1 + (j1-1)*clen
2056 call mpi_irecv(
crecvbuffer(jpos), count, datatype, source, tag, &
2057 comm, request, ierror )
2059 call mpi_check(
'sendrecv3_begin_1c:MPI_IRECV ', ierror )
2070 if (lidebug.ge.1)
then 2072 call write_debug(name,
'post asynchronous sends ')
2075 if (
nsend.ge.1)
then 2080 if (lidebug.ge.1)
then 2082 call write_debug( name,
'sendsize, ubound(csendbuffer,1) ', &
2100 datatype = mpi_character
2119 jpos = (jj-1)*clen +
ic 2127 if (lidebug.ge.2)
then 2129 call write_debug(name,
'mpi_isend: ii,j1,j2 ', ii,j1,j2)
2130 call write_debug(name,
'count, dest, tag ', count,dest,tag )
2134 jpos = (j1-1)*clen + 1
2135 call mpi_isend(
csendbuffer(jpos), count, datatype, dest, tag, &
2136 comm, request, ierror )
2137 call mpi_check(
'sendrecv3_begin_1c:MPI_ISEND ', ierror )
2155 double precision,
intent(inout),
dimension(:) :: XX
2156 integer,
intent(in),
optional :: idebug
2163 character(len=80),
parameter :: name =
'sendrecv3_end_1d' 2165 logical,
parameter :: use_waitany = .false.
2168 integer :: jj,ijk, jindex, ii,j1,j2, ierror
2170 integer,
dimension(:,:),
pointer :: send_status
2177 if (
present(idebug))
then 2181 if (
nsend .ge.1)
then 2183 if (lidebug.ge.1)
then 2186 'waiting for sends to complete, nsend = ',
nsend )
2189 allocate( send_status(mpi_status_size,
nsend))
2193 send_status, ierror )
2198 call mpi_check(
'sendrecv3_end_1d:MPI_WAITALL ', ierror )
2200 deallocate( send_status )
2201 nullify( send_status )
2210 if (
nrecv.ge.1)
then 2212 if (lidebug.ge.1)
then 2215 'waiting for receives to complete, nrecv = ',
nrecv )
2218 if (use_waitany)
then 2223 jindex, mpi_status_ignore, ierror )
2226 jindex, mpi_status_ignore, ierror )
2229 call mpi_check(
'sendrecv3_end_1d:MPI_WAITANY ', ierror )
2231 j1 =
xrecv( jindex )
2232 j2 =
xrecv( jindex + 1)-1
2234 if (lidebug.ge.2)
then 2235 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2 )
2249 call mpi_check(
'sendrecv3_end_1d:MPI_WAITALL recv ', ierror )
2271 character(len=*),
intent(inout),
dimension(:) :: XX
2272 integer,
intent(in),
optional :: idebug
2279 character(len=80),
parameter :: name =
'sendrecv3_end_1c' 2281 integer :: ic, clen, jpos
2283 logical,
parameter :: use_waitany = .false.
2286 integer :: jj,ijk, jindex, ii,j1,j2, ierror
2288 integer,
dimension(:,:),
pointer :: send_status
2295 if (
present(idebug))
then 2300 clen = len(xx(jpos))
2302 if (
nsend .ge.1)
then 2304 if (lidebug.ge.1)
then 2307 'waiting for sends to complete, nsend = ',
nsend )
2311 allocate( send_status(mpi_status_size,
nsend))
2314 call mpi_check(
'sendrecv3_end_1c:MPI_WAITALL ', ierror )
2316 deallocate( send_status )
2317 nullify( send_status )
2328 if (
nrecv.ge.1)
then 2330 if (lidebug.ge.1)
then 2333 'waiting for receives to complete, nrecv = ',
nrecv )
2336 if (use_waitany)
then 2339 call mpi_check(
'sendrecv3_end_1c:MPI_WAITANY ', ierror )
2341 j1 =
xrecv( jindex )
2342 j2 =
xrecv( jindex + 1)-1
2344 if (lidebug.ge.2)
then 2345 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2 )
2352 jpos = (jj-1)*clen +
ic 2360 call mpi_check(
'sendrecv3_end_1c:MPI_WAITALL recv ', ierror )
2368 jpos = (jj-1)*clen +
ic 2393 integer,
intent(inout),
dimension(:) :: XX
2394 integer,
intent(in),
optional :: idebug
2401 character(len=80),
parameter :: name =
'sendrecv3_end_1i' 2403 logical,
parameter :: use_waitany = .false.
2406 integer :: jj,ijk, jindex, ii,j1,j2, ierror
2408 integer,
dimension(:,:),
pointer :: send_status
2415 if (
present(idebug))
then 2419 if (
nsend .ge.1)
then 2421 if (lidebug.ge.1)
then 2424 'waiting for sends to complete, nsend = ',
nsend )
2427 allocate( send_status(mpi_status_size,
nsend))
2430 call mpi_check(
'sendrecv3_end_1i:MPI_WAITALL ', ierror )
2432 deallocate( send_status )
2433 nullify( send_status )
2444 if (
nrecv.ge.1)
then 2446 if (lidebug.ge.1)
then 2449 'waiting for receives to complete, nrecv = ',
nrecv )
2452 if (use_waitany)
then 2455 call mpi_check(
'sendrecv3_end_1i:MPI_WAITANY ', ierror )
2457 j1 =
xrecv( jindex )
2458 j2 =
xrecv( jindex + 1)-1
2460 if (lidebug.ge.2)
then 2461 call write_debug(name,
'jindex, j1,j2 ', jindex,j1,j2 )
2471 call mpi_check(
'sendrecv3_end_1i:MPI_WAITALL recv ', ierror )
2494 character(len=*),
dimension(:),
intent(inout) :: XX
2495 integer,
intent(in),
optional :: ilayer,idebug
2497 integer :: lidebug, layer
2501 if (
present(idebug))
then 2506 if (
present(ilayer))
then 2520 double precision,
dimension(:),
intent(inout) :: XX
2521 integer,
intent(in),
optional :: ilayer,idebug
2523 integer :: lidebug, layer
2527 if (
present(idebug))
then 2532 if (
present(ilayer))
then 2546 double precision,
dimension(:,:),
intent(inout) :: XX
2547 integer,
intent(in),
optional :: ilayer,idebug
2549 integer :: lidebug, layer
2554 if (
present(idebug))
then 2559 if (
present(ilayer))
then 2563 do j=lbound(xx,2),ubound(xx,2)
2575 double precision,
dimension(:,:,:),
intent(inout) :: XX
2576 integer,
intent(in),
optional :: ilayer,idebug
2578 integer :: lidebug, layer
2584 if (
present(idebug))
then 2589 if (
present(ilayer))
then 2593 do k=lbound(xx,3),ubound(xx,3)
2594 do j=lbound(xx,2),ubound(xx,2)
2607 integer,
dimension(:),
intent(inout) :: XX
2608 integer,
intent(in),
optional :: ilayer,idebug
2610 integer :: lidebug, layer
2614 if (
present(idebug))
then 2619 if (
present(ilayer))
then integer, dimension(:), allocatable istart1_all
integer, dimension(:), allocatable imap
integer, dimension(:), pointer recvproc2
subroutine sendrecv3_begin_1c(XX, ilayer, idebug)
integer, dimension(:), allocatable kstart1_all
integer, dimension(:), pointer send_persistent_request
integer, dimension(:), allocatable i_of
integer, dimension(:), allocatable jstart4_all
subroutine ijk_of(ijkp, i, j, k)
integer, dimension(:), allocatable kend4_all
integer, dimension(:), allocatable kend1_all
integer, dimension(:), allocatable istart2_all
subroutine ijk_of_gl(ijkp, i, j, k)
subroutine send_recv3_2d(XX, ilayer, idebug)
integer, dimension(:), pointer recv_persistent_request
integer, dimension(:), allocatable kstart2_all
integer, dimension(:), pointer irecvbuffer
integer, dimension(:), allocatable iend3_all
integer, dimension(:), allocatable istart4_all
integer, dimension(:), pointer send_persistent_request3
integer, dimension(:), pointer recvproc1
logical, parameter localfunc
integer, dimension(:), pointer xsend2
subroutine sendrecv3_end_1c(XX, idebug)
subroutine send_recv3_1c(XX, ilayer, idebug)
subroutine send_recv3_3d(XX, ilayer, idebug)
integer, dimension(:), pointer sendtag3
character, dimension(:), pointer csendbuffer
subroutine sendrecv3_begin_1d(XX, ilayer, idebug)
integer, dimension(:), pointer sendproc
integer, dimension(:), pointer recvtag
integer, dimension(:), pointer recvproc3
subroutine send_recv3_1i(XX, ilayer, idebug)
integer, dimension(:), pointer recvijk1
integer, dimension(:), allocatable k_of
subroutine sendrecv3_end_1d(XX, idebug)
double precision, dimension(:), pointer drecvbuffer
integer, dimension(:), allocatable kstart4_all
integer, parameter nlayers
integer, dimension(:), allocatable kstart3_all
subroutine mfix_exit(myID, normal_termination)
integer, dimension(:), allocatable istart3_all
character, dimension(:), pointer crecvbuffer
integer, dimension(:), pointer xsend
integer, dimension(:), pointer xrecv
integer, dimension(:), pointer recv_persistent_request2
integer, dimension(:), allocatable j_of
integer, dimension(:), allocatable jend2_all
integer, dimension(:), allocatable jend4_all
integer, dimension(:), pointer recv_persistent_request3
integer, dimension(:), pointer send_persistent_request2
integer, dimension(:), pointer isendbuffer
integer, dimension(:), allocatable iend2_all
integer, dimension(:), allocatable jstart3_all
integer, dimension(:), pointer sendtag1
integer, dimension(:), pointer xrecv1
integer, dimension(:), pointer sendijk3
integer, dimension(:), pointer xrecv2
integer, dimension(:), allocatable kend2_all
integer, dimension(:), pointer sendproc1
integer, dimension(:), pointer sendrequest
integer, dimension(:), pointer send_persistent_request1
integer, dimension(:), pointer sendproc3
subroutine mpi_check(msg, ierr)
integer, dimension(:), allocatable jstart1_all
integer, dimension(:), pointer sendijk2
integer, dimension(:), pointer recvrequest
subroutine sendrecv3_end_1i(XX, idebug)
integer, dimension(:), allocatable kend3_all
integer, dimension(:), pointer xrecv3
integer, dimension(:), pointer recvijk3
subroutine sendrecv3_init( comm, cyclic_i, cyclic_j, cyclic_k, idebug)
integer, dimension(:), allocatable jend3_all
integer, dimension(:), pointer sendproc2
integer, dimension(:), allocatable jend1_all
integer, dimension(:), pointer xsend1
integer, dimension(:), pointer sendtag
integer, dimension(:), allocatable jmap
integer, dimension(:), pointer recvijk2
integer, dimension(:), pointer sendijk1
subroutine send_recv3_1d(XX, ilayer, idebug)
integer, dimension(:), allocatable iend4_all
integer, dimension(:), pointer recvproc
integer, dimension(:), pointer recvtag3
integer, dimension(:), pointer recvijk
logical, parameter use_persistent_message
integer, dimension(:), pointer sendtag2
integer, dimension(:), pointer recvtag1
integer, dimension(:), pointer recv_persistent_request1
integer, dimension(:), pointer recvtag2
double precision, dimension(:), pointer dsendbuffer
subroutine write_error(name, line, lmax)
integer, dimension(:), allocatable jstart2_all
integer, dimension(:), pointer xsend3
integer, dimension(:), pointer sendijk
integer, dimension(:), allocatable kmap
integer, dimension(:), allocatable iend1_all
subroutine sendrecv3_begin_1i(XX, ilayer, idebug)