37 1 NSN ,NSNR ,X ,BMINMA ,NOD2SP ,
38 2 NBX ,NBY ,NBZ ,MARGE ,ITASK ,
39 3 NLIST ,SPBUF ,JVOIS ,JSTOR ,JPERM ,
40 4 DVOIS ,IREDUCE ,NSP2SORTF,NSP2SORTL,VOXEL ,
41 5 KXSP ,IXSP ,KREDUCE ,LGAUGE ,GAUGE ,
51#include
"implicit_f.inc"
57 INTEGER NVECSZ ,NSP2SORTF, NSP2SORTL
58 PARAMETER (NVECSZ = mvsiz)
91 INTEGER NSN,ITASK,NSNR,NBX,NBY,NBZ,
92 . NLIST(*),NOD2SP(*) ,
93 . VOXEL(NBX+2,NBY+2,NBZ+2),JVOIS(*) ,JSTOR(*), JPERM(*) ,
94 . IREDUCE,KXSP(NISP,*), IXSP(KVOISPH,*), KREDUCE(*),
95 . LGAUGE(3,*),KXSPR(*),IXSPR(KVOISPH,*)
99 . marge ,spbuf(nspbuf,*), dvois(*), gauge(llgauge,*)
103 INTEGER NB_NCN,,NB_ECN,I,J,DIR,NB_NC,NB_EC,
104 . N1,N2,N3,N4,NN,NE,K,L,II,JJ,JS,NS,N,
105 . NSNF, NSNL,NVOIS, IG, IL
108 . DX,DY,DZ,XS,YS,ZS,XX,SX,SY,SZ,S2,XN,YN,ZN,
109 . xmin, xmax,ymin,
ymax,zmin, zmax, tz,
110 . d1x,d1y,d1z,d2,a2,alpha_marge,distmax
111 my_real,
DIMENSION(:),
ALLOCATABLE :: tab_dk
113 INTEGER LAST_NOD(NSN+NSNR)
114 INTEGER IX,IY,IZ,NEXT,
115 . IX1,IY1,IZ1,IX2,IY2,IZ2
116 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IIX,IIY,IIZ
118 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
119 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa,bbb,
121 INTEGER FIRST,NEW,LAST,REQ_RECV(NSPMD)
122 SAVE iix,iiy,iiz,distmax,tab_dk
123 INTEGER,
DIMENSION(:),
ALLOCATABLE,
SAVE :: NEXT_NOD_LOCAL
124 INTEGER,
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: VOXEL_LOCAL
128 ALLOCATE(iix(nsn+nsnr))
129 ALLOCATE(iiy(nsn+nsnr))
130 ALLOCATE(iiz(nsn+nsnr))
131 ALLOCATE(tab_dk(numsph))
132 ALLOCATE(next_nod_local(nsn))
133 ALLOCATE( voxel_local(nbx+2,nby+2,nbz+2) )
139 alpha_marge = sqrt(one +spasort)
170 distmax =
max(distmax,spbuf(1,j))
173 IF(x(1,nn) < xmin) cycle
174 IF(x(1,nn) > xmax) cycle
175 IF(x(2,nn) < ymin) cycle
176 IF(x(2,nn) >
ymax) cycle
177 IF(x(3,nn) < zmin) cycle
178 IF(x(3,nn) > zmax) cycle
180 iix(i)=int(nbx*(x(1,nn)-xminb)/(xmaxb-xminb))
181 iiy(i)=int(nby*(x(2,nn)-yminb)/(ymaxb-yminb))
182 iiz(i)=int(nbz*(x(3,nn)-zminb)/(zmaxb-zminb))
184 iix(i)=
max(1,2+
min(nbx,iix(i)))
185 iiy(i)=
max(1,2+
min(nby,iiy(i)))
186 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
188 first = voxel(iix(i),iiy(i),iiz(i))
191 voxel(iix(i),iiy(i),iiz(i)) = i
194 ELSEIF(last_nod(first) == 0)
THEN
203 last = last_nod(first)
209 voxel_local(1:nbx+2,1:nby+2,1:nbz+2) = voxel(1:nbx+2,1:nby+2,1:nbz+2)
210 next_nod_local(1:nsn) =
next_nod(1:nsn)
218 distmax =
max(distmax,xsphr(2,n))
219 iix(i)=int(nbx*(xsphr(3,n)-xminb)/(xmaxb-xminb))
220 iiy(i)=int(nby*(xsphr(4,n)-yminb)/(ymaxb-yminb))
221 iiz(i)=int(nbz*(xsphr(5
222 iix(i)=
max(1,2+
min(nbx,iix(i
224 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
226 first = voxel(iix(i),iiy(i),iiz(i))
229 voxel(iix(i),iiy(i),iiz(i)) = i
232 ELSEIF(last_nod(first) == 0)
THEN
241 last = last_nod(first)
261 DO ne = nsp2sortf,nsp2sortl
269 aaa = two*spbuf(1,j)* alpha_marge
273 ix1=int(nbx*(x(1,nn)-aaa-xminb)/(xmaxb-xminb))
274 iy1=int(nby*(x(2,nn)-aaa-yminb)/(ymaxb-yminb))
275 iz1=int(nbz*(x(3,nn)-aaa-zminb)/(zmaxb-zminb))
281 ix2=int(nbx*(x(1,nn)+aaa-xminb)/(xmaxb-xminb))
282 iy2=int(nby*(x(2,nn)+aaa-yminb)/(ymaxb-yminb))
283 iz2=int(nbz*(x(3,nn)+aaa-zminb)/(zmaxb-zminb))
308 IF(spbuf(1,js) > spbuf(1,j) .OR.
309 . (spbuf(1,js) == spbuf(1,j) .AND. kxsp(8,js)>=kxsp(8,j)))
GOTO 200
316 aaa = spbuf(1,j)+spbuf(1,js)
319 IF(xsphr(2,n) > spbuf(1,j).OR.
320 . (xsphr(2,n) == spbuf(1,j) .AND.(nint(xsphr(6,n))>=kxsp(8,j) ) ) )
GOTO 200
325 aaa = spbuf(1,j)+xsphr(2,n)
328 bbb = aaa * alpha_marge
330 IF(xs<=x(1,nn)-bbb)
GOTO 200
331 IF(xs>=x(1,nn)+bbb)
GOTO 200
332 IF(ys<=x(2,nn)-bbb)
GOTO 200
333 IF(ys>=x(2,nn)+bbb)
GOTO 200
334 IF(zs<=x(3,nn)-bbb)
GOTO 200
335 IF(zs>=x(3,nn)+bbb)
GOTO 200
343 d2 = d1x*d1x+d1y*d1y+d1z*d1z
369 CALL sppro3(j ,kxsp ,ixsp ,nod2sp,jvois,
370 . jstor,jperm ,dvois,ireduce,kreduce,
371 . kxspr,ixspr,tab_dk)
388 DO j = itask+1, nsnr, nthread
393 aaa = two * xsphr(2,n) * alpha_marge
397 ix1=int(nbx*(xsphr(3,n)-aaa-xminb)/(xmaxb-xminb))
398 iy1=int(nby*(xsphr(4,n)-aaa-yminb)/(ymaxb-yminb))
399 iz1=int(nbz*(xsphr(5,n)-aaa-zminb)/(zmaxb-zminb))
405 ix2=int(nbx*(xsphr(3,n)+aaa-xminb)/(xmaxb-xminb))
406 iy2=int(nby*(xsphr(4,n)+aaa-yminb)/(ymaxb-yminb))
407 iz2=int(nbz*(xsphr(5,n)+aaa-zminb)/(zmaxb
424 jj = voxel_local(ix,iy,iz)
432 IF(xsphr(2,n) < spbuf(1,js).OR.
433 . (xsphr(2,n)==spbuf(1,js).AND.nint(xsphr(6,n))<kxsp(8,js)) )
GOTO 250
440 aaa = xsphr(2,n)+spbuf(1,js)
443 bbb = aaa * alpha_marge
445 IF(xs<=xsphr(3,n)-bbb)
GOTO 250
446 IF(xs>=xsphr(3,n)+bbb)
GOTO 250
447 IF(ys<=xsphr(4,n)-bbb)
GOTO 250
448 IF(ys>=xsphr(4,n)+bbb)
GOTO 250
449 IF(zs<=xsphr(5,n)-bbb)
GOTO 250
450 IF(zs>=xsphr(5,n)+bbb)
GOTO 250
455 d1x = xsphr(3,n) - xs
456 d1y = xsphr(4,n) - ys
457 d1z = xsphr(5,n) - zs
458 d2 = d1x*d1x+d1y*d1y+d1z*d1z
473 jj = next_nod_local(jj)
485 CALL sppro3(j+numsph,kxsp ,ixsp ,nod2sp,jvois,
486 . jstor,jperm ,dvois,ireduce,kreduce,
487 . kxspr,ixspr,tab_dk)
497 IF(lgauge(1,ig) > -(numels+1))cycle
504 aaa = (two*distmax)* alpha_marge
508 ix1=int(nbx*(xn-aaa-xminb)/(xmaxb-xminb))
509 iy1=int(nby*(yn-aaa-yminb)/(ymaxb-yminb))
510 iz1=int(nbz*(zn-aaa-zminb)/(zmaxb-zminb))
516 ix2=int(nbx*(xn+aaa-xminb)/(xmaxb-xminb))
517 iy2=int(nby*(yn+aaa-yminb)/(ymaxb-yminb))
518 iz2=int(nbz*(zn+aaa-zminb)/(zmaxb-zminb))
535 jj = voxel_local(ix,iy,iz)
548 aaa = two*spbuf(1,js)
553 bbb = aaa * alpha_marge
555 IF(xs<=xn-bbb)
GOTO 300
556 IF(xs>=xn+bbb)
GOTO 300
557 IF(ys<=yn-bbb)
GOTO 300
558 IF(ys>=yn+bbb)
GOTO 300
559 IF(zs<=zn-bbb)
GOTO 300
560 IF(zs>=zn+bbb)
GOTO 300
567 d2 = d1x*d1x+d1y*d1y+d1z*d1z
581 jj = next_nod_local(jj)
594 CALL sppro3(il ,kxsp ,ixsp ,nod2sp,jvois,
595 . jstor,jperm ,dvois,ireduce,kreduce,
596 . kxspr,ixspr, tab_dk)
612 DO i=nsp2sortf,nsp2sortl
614 voxel(iix(i),iiy(i),iiz(i))=0
621 nsnf = 1 + itask*nsnr / nthread
622 nsnl = (itask+1)*nsnr / nthread
624 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))=0
635 DEALLOCATE( next_nod_local )
636 DEALLOCATE( voxel_local )