66 2 ELBUF_TAB,WA ,PLD ,BUFMAT ,PARTSAV ,
67 3 IPARG ,NPC ,IPART ,ITAB ,BUFGEO ,
68 4 XFRAME ,KXSP ,IXSP ,NOD2SP ,IPARTSP ,
69 5 SPBUF ,ISPCOND ,ISPSYM ,XSPSYM ,VSPSYM ,
70 6 WASPH ,LPRTSPH ,LONFSPH ,WSP2SORT ,
71 7 ISPHIO ,VSPHIO ,IGRSURF ,D ,
72 8 SPHVELN ,ITASK ,XDP, IBUFSSG_IO ,LGAUGE ,
73 9 GAUGE ,NGROUNC ,IGROUNC ,SOL2SPH ,SPH2SOL ,
74 A IXS ,IADS ,ADDCNE ,FSKYD ,DMSPH ,
75 B WASPACT ,ICONTACT,OFF_SPH_R2R,WSMCOMP,IRUNN_BIS,
76 C SPH_IORD1,SPH_WORK,WFEXT)
87 USE sph_crit_voxel_mod
88 use element_mod ,
only : nixs
92#include "implicit_f.inc"
101#include "param_c.inc"
103#include "units_c.inc"
104#include "tabsiz_c.inc"
105#include "scr17_c.inc"
106#include "timeri_c.inc"
107#include "scr07_c.inc"
109 COMMON /sphsort/dmax, dbuc, bminma(12)
113 TYPE(timer_),
INTENT(INOUT) :: TIMERS
114 INTEGER IPART(LIPART1,*),NPC(*),IPARG(NPARG,*),IPARTSP(*),ITAB(*),
115 . (NISP,*),IXSP(KVOISPH,*),NOD2SP(*),
116 . ISPCOND(NISPCOND,*),ISPSYM(NSPCOND,*),
117 . LPRTSPH(2,0:NPART),LONFSPH(*),(*),
118 . ISPHIO(NISPHIO,*),ITASK,
119 . IBUFSSG_IO(SIBUFSSG_IO), LGAUGE(3,*),
120 . NGROUNC, IGROUNC(*), SOL2SPH(2,*), SPH2SOL(*), IXS(NIXS,*),
121 . iads(8,*), addcne(*), waspact(*), icontact(*), off_sph_r2r(*),
123 INTEGER,
INTENT(INOUT) :: SPH_IORD1
126 . x(3,*), v(3,*), ms(*),pm(npropm,*),
127 . geo(npropg,*),bufmat(*), bufgeo(*), pld(*),
128 . wa(*), partsav(*), xframe(nxframe,*) ,
130 . wasph(*), vsphio(*), d(3,*), sphveln(*), gauge(llgauge,*),
134 TYPE (ELBUF_STRUCT_),
DIMENSION (NGROUP) :: ELBUF_TAB
136 my_real,
DIMENSION(:) ,
POINTER :: buf
137 END TYPE spsym_struct
138 TYPE (SPSYM_STRUCT) :: XSPSYM,VSPSYM,WSMCOMP
139 TYPE (SURF_) ,
DIMENSION(NSURF) :: IGRSURF
140 TYPE (SPH_WORK_) :: SPH_WORK
141 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
145 INTEGER I,N,NG,JFT,JLT,K,NELEM,NEL,OFFSET,
146 . isortsp,inod,jnod,j,nvois,m,ireduce,ns,
147 . kvnorm,iprt,nsp2sortf,nsp2sortl,
148 . isortspg,ierror,nbk,voxsiz
151 . dxmin,dxmax,dymin,dymax,dzmin,dzmax,majord,
152 . dxminl,dxmaxl,dyminl,dymaxl,dzminl,dzmaxl,
153 . dsx,dsy,dsz,maxds,majords,spalinr,myspatrue,
154 . xmax,
ymax,zmax, dmax, buftmp(6),dbuc, bminma
156 . xmin,ymin,zmin,diam_max,majord_vox,
157 . xminl,yminl,zminl,xmaxl,ymaxl,zmaxl,diam_maxl,
160 SAVE isortspg,dxmin,dxmax,dymin,dymax,dzmin,dzmax,
161 . xmin,ymin,zmin,xmax,
ymax,zmax,diam_max
169 . x ,spbuf ,kxsp ,ixsp ,ipartsp ,
170 . iparg ,ngrounc ,igrounc ,elbuf_tab,itask ,
171 . nod2sp ,sol2sph ,sph2sol ,ixs ,ms ,
172 . pm ,iads ,addcne ,fskyd ,dmsph ,
195 CALL sponof1(x ,v ,d ,ms ,spbuf ,
196 2 itab ,kxsp ,ixsp ,nod2sp ,npc ,
197 3 pld ,iparg ,elbuf_tab,isphio ,vsphio ,
198 4 pm ,ipart ,ipartsp ,igrsurf ,
199 5 lprtsph ,lonfsph ,wa ,wa(numsph+1),wasph(kvnorm),
200 6 xdp,ibufssg_io, off_sph_r2r,wfext)
203 DO k=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
205 wsp2sort(nsp2sort)=lonfsph(k)
217 IF(isphbuc>1)isphbuc=1
220 IF(tt==zero)isphbuc=1
241 nsp2sortf = 1 + itask*nsp2sort / nthread
242 nsp2sortl = (itask+1)*nsp2sort / nthread
249 1 x ,v ,ms ,spbuf ,itab ,
250 2 kxsp ,ixsp ,nod2sp ,ispcond ,xframe ,
251 3 isortsp ,iparg ,elbuf_tab,wsp2sort,nsp2sortf,
268 DO ns=nsp2sortf,nsp2sortl
271 dx =x(1,inod)-spbuf(5,n)
272 dy =x(2,inod)-spbuf(6,n)
273 dz =x(3,inod)-spbuf(7,n)
274 dxminl=
min(dxminl,dx)
275 dyminl=
min(dyminl,dy)
276 dzminl=
min(dzminl,dz)
277 dxmaxl=
max(dxmaxl,dx)
278 dymaxl=
max(dymaxl,dy)
279 dzmaxl=
max(dzmaxl,dz)
281 xminl=
min(xminl,x(1,inod))
282 yminl=
min(yminl,x(2,inod))
283 zminl=
min(zminl,x(3,inod))
284 xmaxl=
max(xmaxl,x(1,inod))
285 ymaxl=
max(ymaxl,x(2,inod))
286 zmaxl=
max(zmaxl,x(3,inod))
287 diam_maxl =
max(diam_maxl, spbuf(1,n))
290 DO n=itask+1,nbgauge,nthread
291 IF(lgauge(1,n) <= -(numels+1))
THEN
292 dx =gauge(2,n)-gauge(6,n)
293 dy =gauge(3,n)-gauge(7,n)
294 dz =gauge(4,n)-gauge(8,n)
295 dxminl=
min(dxminl,dx)
296 dyminl=
min(dyminl,dy)
297 dzminl=
min(dzminl,dz)
298 dxmaxl=
max(dxmaxl,dx)
299 dymaxl=
max(dymaxl,dy)
300 dzmaxl=
max(dzmaxl,dz)
302 xminl=
min(xminl,gauge(2,n))
303 yminl=
min(yminl,gauge(3,n))
304 zminl=
min(zminl,gauge(4,n))
305 xmaxl=
max(xmaxl,gauge(2,n))
306 ymaxl=
max(ymaxl,gauge(3,n))
307 zmaxl=
max(zmaxl,gauge(4,n))
308 diam_maxl =
max(diam_maxl, spbuf(1,n))
313 dxmin=
min(dxmin,dxminl)
314 dymin=
min(dymin,dyminl)
315 dzmin=
min(dzmin,dzminl)
316 dxmax=
max(dxmax,dxmaxl)
317 dymax=
max(dymax,dymaxl)
318 dzmax=
max(dzmax,dzmaxl)
325 diam_max=
max(diam_max,diam_maxl)
326#include "lockoff.inc"
348 CALL spmd_allreduce(tmp1,tmpo,13,spmd_max)
367 majord=sqrt(dx*dx+dy*dy+dz*dz)*half
369 spalinr=sqrt(one+spatrue)
372 IF(spalinr*spbuf(8,n)-majord<=spbuf(1,n))
THEN
383 IF(isortsp>1)isortsp=1
389 IF (itask/= 0) isortsp = isortspg
395 nbk = sph_work%voxel_nb
396 voxsiz = 7*nbk*nbk*nbk
397 call sph_crit_voxel(xmax ,
ymax ,zmax ,xmin ,ymin ,
398 1 zmin ,diam_max ,voxsiz ,majord_vox,nbk ,
399 2 nsp2sortf,nsp2sortl,itask ,nbgauge ,nthread ,
400 3 lgauge ,numels ,spbuf ,wsp2sort ,kxsp ,
401 4 nisp ,nspbuf ,numsph ,x ,numnod ,
402 5 llgauge ,gauge ,nspmd ,sph_work%voxel)
408 IF(spalinr*spbuf(8,n)-majord_vox<=spbuf(1,n))
THEN
415 IF(isortsp>1)isortsp=1
433 IF (itask/= 0) isortsp = isortspg
435 sph_work%WREDUCE(1+itask*numsph/nthread:(itask+1)*numsph/nthread)=0
440 IF(itask==0)
CALL startime(timers,90)
442 IF(ispmd==0.and.itask == 0)
THEN
444 .
' ** INFO ** SPH RE-SEARCH FOR NEIGHBOURS'
456 CALL sphtri0(timers, x ,spbuf,kxsp,wsp2sort,bminma ,dmax,
457 2 nsp2sortf,nsp2sortl,nsp2sort,itask, dbuc)
462 1
CALL sphtri(x ,spbuf ,kxsp ,ixsp ,nod2sp,
463 2 ireduce ,wsp2sort ,bminma ,nsp2sortf,nsp2sortl,
464 3 itask ,sph_work%WREDUCE ,lgauge ,gauge )
468 isphred=
max(isphred,ireduce)
469#include "lockoff.inc"
485 CALL spmd_sphgat(kxsp,ixsp,wsp2sort,isphred,lgauge)
493 IF(itask==0)
CALL stoptime(timers,90)
4981000
FORMAT(
' ** INFO ** SPH RE-SEARCH FOR NEIGHBOURS AT TIME = ',
509 IF(itask==0)
CALL startime(timers,90)
532 1 x , ispcond ,ispsym ,xframe ,xspsym ,
533 2 vspsym ,wsp2sort ,dmax ,itask ,wsmcomp ,
534 3 myspatrue,spbuf ,kxsp)
542 1 x ,v ,ms ,spbuf ,itab ,
543 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym ,
544 3 xframe ,xspsym%BUF ,vspsym%BUF ,ireduce ,
545 4 wsp2sort ,myspatrue,dmax ,itask ,sph_work%WREDUCE ,
549 IF(ireduce>isphred)
THEN
552#include "lockoff.inc"
581 CALL spclasv(x ,spbuf ,kxsp ,ixsp ,nod2sp ,
582 1 ispsym,xspsym%BUF,wsp2sort ,itask ,myspatrue,
583 2 ireduce,sph_work%WREDUCE,lgauge ,gauge ,isortsp)
590 IF(imonm == 2.AND.itask==0)
THEN
606 IF(myspatrue<spatrue)
THEN
609#include "lockoff.inc"
634 IF(itask==0)
CALL stoptime(timers,90)
638 IF(itask==0)
CALL startime(timers,94)
657 IF ((ncycle==0).OR.(irunn_bis>1).OR.(mcheck/=0))
THEN
659 ALLOCATE(xspsym%BUF(3*nsphsym),stat=ierror)
660 IF(ierror==0) xspsym%BUF = 0
661 ALLOCATE(vspsym%BUF(3*nsphsym),stat=ierror)
662 IF(ierror==0) vspsym%BUF = 0
663 ALLOCATE(wsmcomp%BUF(6*nsphsym),stat=ierror)
664 IF(ierror==0) wsmcomp%BUF = 0
675 1 x ,v ,ms ,spbuf ,itab ,
676 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym ,
677 3 xframe ,xspsym%BUF ,wsp2sort ,itask )
685 CALL spclasv(x ,spbuf ,kxsp ,ixsp ,nod2sp ,
686 1 ispsym,xspsym%BUF,wsp2sort ,itask ,myspatrue,
687 2 ireduce,sph_work%WREDUCE,lgauge ,gauge ,isortsp)
711 1 x ,v ,ms ,spbuf ,itab ,
712 2 kxsp ,ixsp ,nod2sp ,ispcond ,ispsym ,
713 3 xframe ,vspsym%BUF ,wsp2sort ,itask)
718 IF(itask==0)
CALL stoptime(timers,94)
727 CALL sponof2(x ,v ,d ,ms ,spbuf ,
728 2 itab ,kxsp ,ixsp ,nod2sp ,npc ,
729 3 pld ,iparg ,elbuf_tab,isphio ,vsphio ,
730 4 pm ,ipart ,ipartsp ,igrsurf ,
731 5 lprtsph ,lonfsph ,wa ,wa(numsph+1) ,wa(2*numsph+1) ,
732 6 wasph(kvnorm),sphveln,xdp, ibufssg_io, off_sph_r2r,
736 DO k=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
738 wsp2sort(nsp2sort)=lonfsph(k)
750 . x ,spbuf ,kxsp ,ixsp ,ipartsp ,
751 . iparg ,ngrounc ,igrounc ,elbuf_tab,itask ,
752 . nod2sp ,sol2sph ,sph2sol ,ixs ,ms ,
753 . pm ,iads ,addcne ,fskyd ,dmsph ,
767 . x ,spbuf ,kxsp ,ipartsp ,elbuf_tab,
768 . iparg ,ngrounc ,igrounc ,itask ,ixsp ,
769 . nod2sp ,sol2sph ,waspact )
784 1 x ,v ,ms ,spbuf ,itab ,
785 2 kxsp ,ixsp ,nod2sp ,ispsym ,xspsym%BUF ,
786 3 vspsym%BUF ,iparg ,wasph ,ispcond ,
787 4 xframe ,wsmcomp%BUF,geo,ipart ,ipartsp ,
788 5 waspact ,itask ,sph_iord1,numgeo,ncycle,