50 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
51#include "implicit_f.inc"
65 INTEGER KXSP(NISP,*), WSP2SORT(*)
67 . x(3,*),bminmal(6), spbuf(nspbuf,*)
72 INTEGER P, I, J, NOD, N, LOC_PROC, NBIRECV,
73 . IERROR, IERROR1, L, IDEB,
75 . IX1, IX2, IY1, IY2, IZ1, IZ2, IX, IY, IZ,
79 . ISINDEXI(NSPMD), NBO(NSPMD),
80 . STATUS(MPI_STATUS_SIZE),
81 . MSGOFF,MSGOFF2,MSGOFF3,
84 . xmaxb,ymaxb,zmaxb,xminb,yminb,zminb,
88 my_real,
dimension(:),
allocatable :: sbuf
95 INTEGER :: SEND_SIZE_BMINMA
96 INTEGER :: REQUEST_BMINMA
97 INTEGER :: RCV_SIZE_BMINMA,TOTAL_RCV_SIZE_BMINMA
99 INTEGER :: SEND_SIZE_CRVOX
100 INTEGER :: REQUEST_CRVOX
101 INTEGER :: RCV_SIZE_CRVOX,TOTAL_RCV_SIZE_CRVOX
102 INTEGER,
DIMENSION(0:LRVOXEL,0:LRVOXEL) :: CRVOXEL_LOC
104 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: INDEX_P
105 INTEGER,
DIMENSION(NSPMD) :: NB_P
106 INTEGER :: REQUEST_NBO
108 INTEGER,
DIMENSION(NSPMD) :: SEND_SIZE_SBUF,DISPLS_SBUF
109 INTEGER :: TOTAL_SEND_SIZE,TOTAL_RCV_SIZE_RBUF
110 INTEGER,
DIMENSION(NSPMD) :: RCV_SIZE_RBUF,DISPLS_RBUF
111 INTEGER :: REQUEST_SBUF
122 ALLOCATE( index_p(nsp2sort,nspmd) )
123 alpha_marge = sqrt(one +spasort)
132 bminma(1,loc_proc) = bminmal(1)
133 bminma(2,loc_proc) = bminmal(2)
134 bminma(3,loc_proc) = bminmal(3)
135 bminma(4,loc_proc) = bminmal(4)
136 bminma(5,loc_proc) = bminmal(5)
137 bminma(6,loc_proc) = bminmal(6)
143 total_rcv_size_bminma = 6*nspmd
148 . total_rcv_size_bminma,rcv_size_bminma,
149 . request_bminma,spmd_comm_world)
162 . total_rcv_size_crvox,rcv_size_crvox,
163 . request_crvox,spmd_comm_world)
177 CALL mpi_wait(request_bminma,status,ierror)
178 CALL mpi_wait(request_crvox,status,ierror)
189 if(p==loc_proc) cycle
202 aaa = spbuf(1,n)* alpha_marge
203 ix1=int(nbx*(x(1,nod)-xminb-aaa)/(xmaxb-xminb))
204 ix2=int(nbx*(x(1,nod)-xminb+aaa)/(xmaxb-xminb))
207 iy1=int(nby*(x(2,nod)-yminb-aaa)/(ymaxb-yminb))
208 iy2=int(nby*(x(2,nod)-yminb+aaa)/(ymaxb-yminb))
211 iz1=int(nbz*(x(3,nod)-zminb-aaa)/(zmaxb-zminb))
212 iz2=int(nbz*(x(3,nod)-zminb+aaa)/(zmaxb-zminb))
227 IF(btest(
crvoxel(iy,iz,p),ix))
THEN
228 nb_p(p) = nb_p(p) + 1
229 index_p(nb_p(p),p) = n
249 . nspmd,1,request_nbo,spmd_comm_world)
261 if(p==loc_proc) cycle
267 sbuf(l+2) = spbuf(1,n)
271 sbuf(l+6) = kxsp(8,n)
281 IF(loc_proc /=p)
THEN
291 IF(
ALLOCATED(dks))
DEALLOCATE(dks)
292 ALLOCATE(dks(
nsphs),stat=ierror1)
293 ierror = ierror1 + ierror
297 CALL ancmsg(msgid=20,anmode=aninfo)
302 ! fill
lsphs with local numbers
306 IF(loc_proc /=p)
THEN
307#include "novectorize.inc"
310 lsphs(ideb) = sbuf(l+1)
326 CALL mpi_wait(request_nbo,status,ierror)
345 send_size_sbuf(1:nspmd) = 0
346 displs_sbuf(1:nspmd) = 0
347 rcv_size_rbuf(1:nspmd) = 0
348 displs_rbuf(1:nspmd) = 0
351 send_size_sbuf(1) =
sizspt*nb_p(1)
352 total_send_size = send_size_sbuf(1)
354 send_size_sbuf(p) =
sizspt*nb_p(p)
355 displs_sbuf(p) = displs_sbuf(p-1) + send_size_sbuf(p-1)
356 total_send_size = total_send_size + send_size_sbuf(p)
360 total_rcv_size_rbuf = rcv_size_rbuf(1)
364 displs_rbuf(p) = displs_rbuf(p-1) + rcv_size_rbuf(p-1)
365 total_rcv_size_rbuf = total_rcv_size_rbuf + rcv_size_rbuf(p)
370 IF(
ALLOCATED(xsphr))
DEALLOCATE(xsphr)
372 ierror = ierror1 + ierror
374 IF(
ALLOCATED(dkr))
DEALLOCATE(dkr)
375 ALLOCATE(dkr(
nsphr),stat=ierror1)
376 ierror = ierror1 + ierror
379 CALL ancmsg(msgid=20,anmode=aninfo)
388 CALL spmd_ialltoallv(sbuf,xsphr,send_size_sbuf,total_send_size,displs_sbuf,
389 . total_rcv_size_rbuf,rcv_size_rbuf,displs_rbuf,
390 . request_sbuf,spmd_comm_world,nspmd)
400 CALL mpi_wait(request_sbuf,status,ierror)
405 DEALLOCATE( index_p )
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)