65 2 ELBUF_TAB,WA ,PLD ,BUFMAT ,PARTSAV ,
66 3 IPARG ,NPC ,IPART ,ITAB ,BUFGEO ,
67 4 XFRAME ,KXSP ,IXSP ,NOD2SP ,IPARTSP ,
68 5 SPBUF ,ISPCOND ,ISPSYM ,XSPSYM ,VSPSYM ,
69 6 WASPH ,LPRTSPH ,LONFSPH ,WSP2SORT ,
70 7 ISPHIO ,VSPHIO ,IGRSURF ,D ,
71 8 SPHVELN ,ITASK ,XDP, IBUFSSG_IO ,LGAUGE ,
72 9 GAUGE ,NGROUNC ,IGROUNC ,SOL2SPH ,SPH2SOL ,
73 A IXS ,IADS ,ADDCNE ,FSKYD ,DMSPH ,
74 B WASPACT ,ICONTACT,OFF_SPH_R2R,WSMCOMP,IRUNN_BIS,
75 C SPH_IORD1,SPH_WORK,WFEXT)
86 USE sph_crit_voxel_mod
90#include "implicit_f.inc"
101#include "units_c.inc"
102#include "tabsiz_c.inc"
103#include "scr17_c.inc"
104#include "timeri_c.inc"
105#include "scr07_c.inc"
107 COMMON /sphsort/dmax, dbuc, bminma(12)
111 TYPE(timer_),
INTENT(INOUT) :: TIMERS
112 INTEGER IPART(LIPART1,*),NPC(*),IPARG(NPARG,*),(*),ITAB(*),
113 . KXSP(NISP,*),IXSP(KVOISPH,*),NOD2SP(*),
114 . ISPCOND(NISPCOND,*),ISPSYM(NSPCOND,*),
115 . LPRTSPH(2,0:NPART),LONFSPH(*),WSP2SORT(*),
116 . ISPHIO(NISPHIO,*),ITASK,
117 . IBUFSSG_IO(SIBUFSSG_IO), LGAUGE(3,*),
118 . NGROUNC, IGROUNC(*), SOL2SPH(2,*), SPH2SOL(*), IXS(NIXS,*),
119 . iads(8,*), addcne(*), waspact(*), icontact(*), off_sph_r2r(*),
121 INTEGER,
INTENT(INOUT) :: SPH_IORD1
124 . x(3,*), v(3,*), ms(*),pm(npropm,*),
125 . geo(npropg,*),bufmat(*), bufgeo(*), pld(*),
126 . wa(*), partsav(*), xframe(nxframe,*) ,
128 . wasph(*), vsphio(*), d(3,*), sphveln(*), gauge(llgauge,*),
132 TYPE (ELBUF_STRUCT_),
DIMENSION (NGROUP) :: ELBUF_TAB
134 my_real,
DIMENSION(:) ,
POINTER :: buf
135 END TYPE spsym_struct
136 TYPE (SPSYM_STRUCT) :: ,VSPSYM,WSMCOMP
137 TYPE (SURF_) ,
DIMENSION(NSURF) :: IGRSURF
138 TYPE (SPH_WORK_) :: SPH_WORK
139 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
143 INTEGER I,N,NG,JFT,JLT,K,NELEM,NEL,OFFSET,
144 . isortsp,inod,jnod,j,nvois,m,ireduce,ns,
145 . kvnorm,iprt,nsp2sortf,nsp2sortl,
146 . isortspg,ierror,nbk,voxsiz
149 . dxmin,dxmax,dymin,dymax,dzmin,dzmax,majord,
150 . dxminl,dxmaxl,dyminl,dymaxl,dzminl,dzmaxl,
151 . dsx,dsy,dsz,maxds,majords,spalinr,myspatrue,
152 . xmax,
ymax,zmax, dmax, buftmp(6),dbuc, bminma
154 . xmin,ymin,zmin,diam_max,majord_vox,
155 . xminl,yminl,zminl,xmaxl,ymaxl,zmaxl,diam_maxl,
158 SAVE isortspg,dxmin,dxmax,dymin,dymax,dzmin,dzmax,
159 . xmin,ymin,zmin,xmax,
ymax,zmax,diam_max
167 . x ,spbuf ,kxsp ,ixsp ,ipartsp ,
168 . iparg ,ngrounc ,igrounc ,elbuf_tab,itask ,
169 . nod2sp ,sol2sph ,sph2sol ,ixs ,ms ,
170 . pm ,iads ,addcne ,fskyd ,dmsph ,
193 CALL sponof1(x ,v ,d ,ms ,spbuf ,
194 2 itab ,kxsp ,ixsp ,nod2sp ,npc ,
195 3 pld ,iparg ,elbuf_tab,isphio ,vsphio ,
196 4 pm ,ipart ,ipartsp ,igrsurf ,
198 6 xdp,ibufssg_io, off_sph_r2r,wfext)
201 DO k=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
203 wsp2sort(nsp2sort)=lonfsph(k)
215 IF(isphbuc>1)isphbuc=1
218 IF(tt==zero)isphbuc=1
239 nsp2sortf = 1 + itask*nsp2sort / nthread
240 nsp2sortl = (itask+1)*nsp2sort / nthread
247 1 x ,v ,ms ,spbuf ,itab ,
248 2 kxsp ,ixsp ,nod2sp ,ispcond ,xframe ,
249 3 isortsp ,iparg ,elbuf_tab,wsp2sort,nsp2sortf,
266 DO ns=nsp2sortf,nsp2sortl
269 dx =x(1,inod)-spbuf(5,n)
270 dy =x(2,inod)-spbuf(6,n)
271 dz =x(3,inod)-spbuf(7,n)
272 dxminl=
min(dxminl,dx)
273 dyminl=
min(dyminl,dy)
274 dzminl=
min(dzminl,dz)
275 dxmaxl=
max(dxmaxl,dx)
276 dymaxl=
max(dymaxl,dy)
277 dzmaxl=
max(dzmaxl,dz)
279 xminl=
min(xminl,x(1,inod))
280 yminl=
min(yminl,x(2,inod))
281 zminl=
min(zminl,x(3,inod))
282 xmaxl=
max(xmaxl,x(1,inod))
283 ymaxl=
max(ymaxl,x(2,inod))
284 zmaxl=
max(zmaxl,x(3,inod))
285 diam_maxl =
max(diam_maxl, spbuf(1,n))
288 DO n=itask+1,nbgauge,nthread
289 IF(lgauge(1,n) <= -(numels+1))
THEN
290 dx =gauge(2,n)-gauge(6,n)
291 dy =gauge(3,n)-gauge(7,n)
292 dz =gauge(4,n)-gauge(8,n)
293 dxminl=
min(dxminl,dx)
294 dyminl=
min(dyminl,dy)
295 dzminl=
min(dzminl,dz)
296 dxmaxl=
max(dxmaxl,dx)
297 dymaxl=
max(dymaxl,dy)
298 dzmaxl=
max(dzmaxl,dz)
300 xminl=
min(xminl,gauge(2,n))
301 yminl=
min(yminl,gauge(3,n))
302 zminl=
min(zminl,gauge(4,n))
303 xmaxl=
max(xmaxl,gauge(2,n))
304 ymaxl=
max(ymaxl,gauge(3,n))
305 zmaxl=
max(zmaxl,gauge(4,n))
306 diam_maxl =
max(diam_maxl, spbuf(1,n))
311 dxmin=
min(dxmin,dxminl)
312 dymin=
min(dymin,dyminl)
313 dzmin=
min(dzmin,dzminl)
314 dxmax=
max(dxmax,dxmaxl)
315 dymax=
max(dymax,dymaxl)
316 dzmax=
max(dzmax,dzmaxl)
323 diam_max=
max(diam_max,diam_maxl)
324#include "lockoff.inc"
346 CALL spmd_allreduce(tmp1,tmpo,13,spmd_max)
365 majord=sqrt(dx*dx+dy*dy+dz*dz)*half
367 spalinr=sqrt(one+spatrue)
370 IF(spalinr*spbuf(8,n)-majord<=spbuf(1,n))
THEN
381 IF(isortsp>1)isortsp=1
387 IF (itask/= 0) isortsp = isortspg
393 nbk = sph_work%voxel_nb
394 voxsiz = 7*nbk*nbk*nbk
395 call sph_crit_voxel(xmax ,
ymax ,zmax ,xmin ,ymin ,
396 1 zmin ,diam_max ,voxsiz ,majord_vox,nbk ,
397 2 nsp2sortf,nsp2sortl,itask ,nbgauge ,nthread ,
398 3 lgauge ,numels ,spbuf ,wsp2sort ,kxsp ,
399 4 nisp ,nspbuf ,numsph ,x ,numnod ,
400 5 llgauge ,gauge ,nspmd ,sph_work%voxel)
406 IF(spalinr*spbuf(8,n)-majord_vox<=spbuf(1,n))
THEN
413 IF(isortsp>1)isortsp=1
431 IF (itask/= 0) isortsp = isortspg
433 sph_work%WREDUCE(1+itask*numsph/nthread:(itask+1)*numsph/nthread)=0
438 IF(itask==0)
CALL startime(timers,90)
440 IF(ispmd==0.and.itask == 0)
THEN
442 .
' ** INFO ** SPH RE-SEARCH FOR NEIGHBOURS'
454 CALL sphtri0(timers, x ,spbuf,kxsp,wsp2sort,bminma ,dmax,
455 2 nsp2sortf,nsp2sortl,nsp2sort,itask, dbuc)
460 1
CALL sphtri(x ,spbuf ,kxsp ,ixsp ,nod2sp,
461 2 ireduce ,wsp2sort ,bminma ,nsp2sortf,nsp2sortl,
462 3 itask ,sph_work%WREDUCE ,lgauge ,gauge )
466 isphred=
max(isphred,ireduce)
467#include "lockoff.inc"
483 CALL spmd_sphgat(kxsp,ixsp,wsp2sort,isphred,lgauge)
491 IF(itask==0)
CALL stoptime(timers,90)
4961000
FORMAT(
' ** INFO ** SPH RE-SEARCH FOR NEIGHBOURS AT TIME = '
507 IF(itask==0)
CALL startime(timers,90)
530 1 x , ispcond ,ispsym ,xframe ,xspsym ,
531 2 vspsym ,wsp2sort ,dmax ,itask ,wsmcomp ,
532 3 myspatrue,spbuf ,kxsp)
540 1 x ,v ,ms ,spbuf ,itab ,
541 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym
542 3 xframe ,xspsym%BUF ,vspsym%BUF ,ireduce ,
543 4 wsp2sort ,myspatrue,dmax ,itask ,sph_work%WREDUCE ,
547 IF(ireduce>isphred)
THEN
550#include
"lockoff.inc"
579 CALL spclasv(x ,spbuf ,kxsp ,ixsp ,nod2sp ,
580 1 ispsym,xspsym%BUF,wsp2sort ,itask ,myspatrue,
581 2 ireduce,sph_work%WREDUCE,lgauge ,gauge ,isortsp)
588 IF(imonm == 2.AND.itask==0)
THEN
604 IF(myspatrue<spatrue)
THEN
607#include "lockoff.inc"
632 IF(itask==0)
CALL stoptime(timers,90)
636 IF(itask==0)
CALL startime(timers,94)
655 IF ((ncycle==0).OR.(irunn_bis>1).OR.(mcheck/=0))
THEN
657 ALLOCATE(xspsym%BUF(3*nsphsym),stat=ierror)
658 IF(ierror==0) xspsym%BUF = 0
659 ALLOCATE(vspsym%BUF(3*nsphsym),stat=ierror)
660 IF(ierror==0) vspsym%BUF = 0
661 ALLOCATE(wsmcomp%BUF(6*nsphsym),stat=ierror)
662 IF(ierror==0) wsmcomp%BUF = 0
673 1 x ,v ,ms ,spbuf ,itab ,
674 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym ,
675 3 xframe ,xspsym%BUF ,wsp2sort ,itask )
683 CALL spclasv(x ,spbuf ,kxsp ,ixsp ,nod2sp
684 1 ispsym,xspsym%BUF,wsp2sort ,itask ,myspatrue,
685 2 ireduce,sph_work%WREDUCE,lgauge ,gauge ,isortsp)
709 1 x ,v ,ms ,spbuf ,itab ,
710 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym ,
711 3 xframe ,vspsym%BUF ,wsp2sort ,itask)
716 IF(itask==0)
CALL stoptime(timers,94)
725 CALL sponof2(x ,v ,d ,ms ,spbuf ,
726 2 itab ,kxsp ,ixsp ,nod2sp ,npc ,
727 3 pld ,iparg ,elbuf_tab,isphio ,vsphio ,
728 4 pm ,ipart ,ipartsp ,igrsurf ,
729 5 lprtsph ,lonfsph ,wa ,wa(numsph+1) ,wa(2*numsph+1) ,
730 6 wasph(kvnorm),sphveln,xdp, ibufssg_io, off_sph_r2r,
734 DO k=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
736 wsp2sort(nsp2sort)=lonfsph(k)
748 . x ,spbuf ,kxsp ,ixsp ,ipartsp ,
749 . iparg ,ngrounc ,igrounc ,elbuf_tab,itask ,
750 . nod2sp ,sol2sph ,sph2sol ,ixs ,ms ,
751 . pm ,iads ,addcne ,fskyd ,dmsph ,
765 . x ,spbuf ,kxsp ,ipartsp ,elbuf_tab,
766 . iparg ,ngrounc ,igrounc ,itask ,ixsp ,
767 . nod2sp ,sol2sph ,waspact )
782 1 x ,v ,ms ,spbuf ,itab ,
783 2 kxsp ,ixsp ,nod2sp ,ispsym ,xspsym%BUF ,
784 3 vspsym%BUF ,iparg ,wasph ,ispcond ,
785 4 xframe ,wsmcomp%BUF,geo,ipart ,ipartsp ,
786 5 waspact ,itask ,sph_iord1,numgeo,ncycle,