40 2 ITAB ,KXSP ,IXSP ,NOD2SP ,NPC ,
41 3 PLD ,IPARG ,ELBUF_TAB,ISPHIO ,VSPHIO ,
42 4 PM ,IPART ,IPARTSP ,IGRSURF ,
43 5 LPRTSPH ,LONFSPH ,IWA ,MWA ,WA ,
44 6 VNORMAL ,SPHVELN ,XDP,IBUFSSG_IO ,OFF_SPH_R2R,
56#include "implicit_f.inc"
61#include "vect01_c.inc"
69#include "tabsiz_c.inc"
75 INTEGER KXSP(,*),IXSP(KVOISPH,*),NOD2SP(*),ITAB(*),NPC(*),
76 . IPARG(NPARG,*),ISPHIO(NISPHIO,*),IPART(LIPART1,*),
77 . LPRTSPH(2,0:NPART),LONFSPH(*),
78 . IWA(*),MWA(*),IBUFSSG_IO(SIBUFSSG_IO),IPARTSP(*),OFF_SPH_R2R(*)
81 . x(3,*) ,v(3,*) ,d(3,*) ,ms(*) ,spbuf(nspbuf,*) ,
82 . pld(*) ,vsphio(*) ,pm(npropm,*),wa(*),
83 . vnormal(3,*), sphveln(2,*)
86 TYPE (ELBUF_STRUCT_),
TARGET,
DIMENSION (NGROUP) :: ELBUF_TAB
87 TYPE (SURF_) ,
DIMENSION(NSURF) :: IGRSURF
88 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
94 . ifvitsx,ifvitsy,ifvitsz,ifdens,ifpres,ifener,
96 . ilaston,nlaston,i1stoff,n1stoff,
97 . isu,nseg,in1,in2,in3,in4,
98 . imat,iprop,iprt,nel,kad,ng,k,
100 . knsx,kisx,knsy,kisy,knsz,kisz,
101 . knpx,kipx,knpy,kipy,knpz,kipz,kvnorm,kf,
102 . ippv,m,jnod,knod,jk,nvois1,nvois2,nvoiss1,nvoiss2,
103 . impose,iun,kk,i1,iad2,
104 . nsegb,impose2,inod0,nn,off,tflag,np2sort_old,koff,ij
108 . x1,x2,x3,x4,xp,y1,y2,y3,y4,yp,z1,z2,z3,z4,zp,
109 . xi,yi,zi,xj,yj,zj,di,dd,dmin,dmax,dps,
110 . xg,yg,zg,xx(12),xx_old(12),vmax,vi,dps_old
111 . yi_old,zi_old,dt_old,vmaxs
113 INTEGER,
DIMENSION(:),
ALLOCATABLE :: OFF_SPH, TAG_SPH
114 TYPE(G_BUFEL_) ,
POINTER :: GBUF
123 ALLOCATE(tag_sph(
nsphr))
124 ALLOCATE(off_sph(numsph))
125 off_sph(1:numsph) = zero
126 tag_sph(1:
nsphr) = zero
137 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
143 vi=sqrt(v(1,inod)**2+v(2,inod)**2+v(3,inod)**2)
147 dt_old = vsphio(ivad+14)
148 IF (itype==4) vsphio(ivad+3)=vmax*
max(dt_old,dt12)
156 IF(lprtsph(1,iprt)>lprtsph(2,iprt-1))
THEN
158 IF ((itype>1).AND.(isphio(12,i)==0))
THEN
169 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
172 di=
max(di,spbuf(1,n))
184 nsegb=igrsurf(isu)%NSEG
189 in1=ibufssg_io(iad2+nibsph*j )
190 in2=ibufssg_io(iad2+nibsph*j+1)
191 in3=ibufssg_io(iad2+nibsph*j+2)
192 in4=ibufssg_io(iad2+nibsph*j+3)
252 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
258 IF( xi>xbmin.AND.yi>ybmin.AND.zi>zbmin
259 . .AND.xi<xbmax.AND.yi<ybmax.AND.zi<zbmax)
THEN
269 kk =iad2+nibsph*(j-1)
289 dbucs=
max(dbucs,abs(x1-x2))
290 dbucs=
max(dbucs,abs(y1-y2))
291 dbucs=
max(dbucs,abs(z1-z2))
292 dbucs=
max(dbucs,abs(x2-x3))
293 dbucs=
max(dbucs,abs(y2-y3))
294 dbucs=
max(dbucs,abs(z2-z3))
295 dbucs=
max(dbucs,abs(x3-x1))
296 dbucs=
max(dbucs,abs(y3-y1))
297 dbucs=
max(dbucs,abs(z3-z1))
307 dbucs=
max(dbucs,abs(x1-x4))
308 dbucs=
max(dbucs,abs(y1-y4))
309 dbucs=
max(dbucs,abs(z1-z4))
310 dbucs=
max(dbucs,abs(x2-x4))
311 dbucs=
max(dbucs,abs(y2-y4))
312 dbucs=
max(dbucs,abs(z2-z4))
313 dbucs=
max(dbucs,abs(x3-x4))
314 dbucs=
max(dbucs,abs(y3-y4))
315 dbucs=
max(dbucs,abs(z3-z4))
318 nbox =
max(iun,int((xbmax-xbmin)/dbucs))
319 nboy =
max(iun,int((ybmax-ybmin)/dbucs))
320 nboz =
max(iun,int((zbmax-zbmin)/dbucs))
321 nband=
max(nbox,nboy,nboz)+1
334 kvnorm=kipz+3*np2sort
340 CALL sphreqs(nseg ,ibufssg_io(iad2) ,x ,np2sort ,mwa ,
341 2 lonfsph ,kxsp ,wa(knsx) ,wa(kisx) ,wa(knsy) ,
342 3 wa(kisy) ,wa(knsz) ,wa(kisz) ,wa(knpx) ,wa(kipx) ,
343 4 wa(knpy) ,wa(kipy) ,wa(knpz) ,wa(kipz) ,wa ,
344 5 wa(kvnorm),vsphio(ivad+14),vsphio(ivad+13),v,spbuf ,
347 vsphio(ivad+14) = dt12
349 ELSEIF (isphio(12,i)>0)
THEN
365 dt_old = vsphio(ivad+14)
366 vsphio(ivad+14) = dt12
370 IF (isphio(12,i)==1)
THEN
372 xi=vsphio(ivad+off+1)
373 yi=vsphio(ivad+off+2)
374 zi=vsphio(ivad+off+3)
377 xi=x(1,isphio(12+ii,i))
378 yi=x(2,isphio(12+ii,i))
379 zi=x(3,isphio(12+ii,i))
380 vi=sqrt(v(1,isphio(12+ii,i))**2+v(2,isphio(12+ii,i))**2+v(3,isphio(12+ii
387 xi = xx(4)+xx(7)-xx(1)
388 yi = xx(5)+xx(8)-xx(2)
389 zi = xx(6)+xx(9)-xx(3)
408 IF (isphio(12,i)==1)
THEN
414 xx_old(3*(ii-1)+1) = x(1,isphio(12+ii,i))-dt_old*v(1,isphio(12+ii,i))
415 xx_old(3*(ii-1)+2) = x(2,isphio(12+ii,i))-dt_old*v(2,isphio(12+ii,i))
416 xx_old(3*(ii-1)+3) = x(3,isphio(12+ii,i))-dt_old*v(3,isphio(12+ii,i))
418 xx_old(10) = xx_old(7)
419 xx_old(11) = xx_old(8)
420 xx_old(12) = xx_old(9)
421 xx_old(7) = xx_old(4)+xx_old(7)-xx_old(1)
422 xx_old(8) = xx_old(5)+xx_old(8)-xx_old(2)
423 xx_old(9) = xx_old(6)+xx_old(9)-xx_old(3)
426 IF (isphio(1,i)==4) dmax = dmax + vmaxs*
max(dt_old,dt12)
437 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
443 IF( xi>xbmin.AND.yi>ybmin.AND.zi>zbmin
444 . .AND.xi<xbmax.AND.yi<ybmax.AND.zi<zbmax)
THEN
447 xi_old = xi - v(1,inod)*dt_old
448 yi_old = yi - v(2,inod)*dt_old
449 zi_old = zi - v(3,inod)*dt_old
450 CALL sph_nodseg(xi_old,yi_old,zi_old,xx_old,tflag,np2sort,lonfsph,mwa,wa,wa(kvnorm),1)
452 CALL sph_nodseg(xi,yi,zi,xx,tflag,np2sort,lonfsph,mwa,wa,wa(kvnorm),1)
454 IF (dps _old*dps<zero)
THEN
458 IF (dps_old>zero) vsphio(ivad+13) = vsphio(ivad+13)-spbuf(12,n)
460 IF (dps_old<zero) vsphio(ivad+13) = vsphio(ivad+13)+spbuf(12,n)
467 IF ((itype==2).OR.(itype==3))
THEN
472 IF(dps>dmax.AND.dps<zero)
THEN
477 ng =mod(kxsp(2,n),ngroup+1)
478 kxsp(2,n)=ng+i*(ngroup+1)
482 sphveln(1,n)= wa(kk )*v(1,inod)
483 . +wa(kk+1)*v(2,inod)
484 . +wa(kk+2)*v(3,inod)
485 ng=mod(kxsp(2,n),ngroup+1)
487 2 mtn ,nel ,nft ,kad ,ity ,
488 3 npt ,jale ,ismstr ,jeul ,jtur ,
489 4 jthe ,jlag ,jmult ,jhbe ,jivf ,
490 5 nvaux ,jpor ,jcvt ,jclose ,jplasol ,
491 6 irep ,iint ,igtyp ,israt ,isrot ,
492 7 icsen ,isorth ,isorthg ,ifailure,jsms)
498 gbuf => elbuf_tab(ng)%GBUF
502 . (gbuf%SIG(jj(1)+k)+gbuf%SIG(jj(2)+k)+gbuf%SIG(jj(3)+k))
506 vnormal(2,n)=wa(kk+1)
507 vnormal(3,n)=wa(kk+2)
508 ELSEIF(dps>=zero.AND.iwa(iactive)==0)
THEN
512 sphveln(1,n)= wa(kk )*v(1,inod)
513 . +wa(kk+1)*v(2,inod)
514 . +wa(kk+2)*v(3,inod)
515 ng=mod(kxsp(2,n),ngroup+1)
517 2 mtn ,nel ,nft ,kad ,ity ,
518 3 npt ,jale ,ismstr ,jeul ,jtur ,
519 4 jthe ,jlag ,jmult ,jhbe ,jivf ,
520 5 nvaux ,jpor ,jcvt ,jclose ,jplasol ,
521 6 irep ,iint ,igtyp ,israt ,isrot ,
522 7 icsen ,isorth ,isorthg ,ifailure,jsms
528 gbuf => elbuf_tab(ng)%GBUF
532 . (gbuf%SIG(jj(1)+k)+gbuf%SIG(jj(2)+k)+gbuf%SIG(jj(3)+k))
548 IF ((itype==2).OR.(itype==3))
THEN
552 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
553 IF(iwa(iactive)/=0)
THEN
568 impose=kxsp(2,m)/(ngroup+1)
573 IF(isphio(1,impose)==1)lbool=.true.
579 dd =(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj)
588 impose = nint(xsphr(12,nn))
590 impose2=isphio(1,impose)
594 IF(impose2==0.OR.impose2==1)
THEN
598 dd =(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj)
610 ng=mod(abs(kxsp(2,n)),ngroup+1)
614 IF (r2r_siu/=0) off_sph_r2r(inod) = -1
625 IF ((itype==2).OR.(itype==3))
THEN
629 iactive=lprtsph(2,iprt-1)+1
630 DO WHILE(iactive<=lprtsph(1,iprt))
631 IF(iwa(iactive)/=0)
THEN
635 IF(tt/=zero)wfextt=wfextt-half*ms(inod)
636 . *(v(1,inod)*v(1,inod)+v(2,inod)*v(2,inod)+v(3,inod)*v(3,inod))
641 IF (isphio(12,i)==0)
THEN
654 ELSEIF (isphio(12,i)==1)
THEN
663 x1 =x(1,isphio(13,i))
664 y1 =x(2,isphio(14,i))
665 z1 =x(3,isphio(15,i))
666 x2 =x(1,isphio(16,i))
667 y2 =x(2,isphio(17,i))
668 z2 =x(3,isphio(18,i))
673 IF(itab(inod) >= 1000000000)
THEN
678 d(1,inod)=xg-x(1,inod)+d(1,inod)
679 d(2,inod)=yg-x(2,inod)+d(2,inod)
680 d(3,inod)=zg-x(3,inod)+d(3,inod)
690 ng=mod(abs(kxsp(2,n)),ngroup+1)
692 2 mtn ,nel ,nft ,kad ,ity ,
693 3 npt ,jale ,ismstr ,jeul ,jtur ,
694 4 jthe ,jlag ,jmult ,jhbe ,jivf ,
695 5 nvaux ,jpor ,jcvt ,jclose ,jplasol ,
696 6 irep ,iint ,igtyp ,israt ,isrot ,
697 7 icsen ,isorth ,isorthg ,ifailure,jsms)
703 gbuf => elbuf_tab(ng)%GBUF
706 wfextt=wfextt-volo*gbuf%EINT(k)
709 gbuf%SIG(jj(1)+k)=zero
710 gbuf%SIG(jj(2)+k)=zero
711 gbuf%SIG(jj(3)+k)=zero
712 gbuf%SIG(jj(4)+k)=zero
713 gbuf%SIG(jj(5)+k)=zero
714 gbuf%SIG(jj(6)+k)=zero
718 iparg(10,ng)=iparg(10,ng)-1
719 IF(iparg(10,ng)==0)iparg(8,ng)=1
722 ilaston =lprtsph(1,iprt)
723 nlaston =lonfsph(ilaston)
724 lonfsph(iactive) =nlaston
725 iwa(iactive) =iwa(ilaston)
728 lprtsph(1,iprt) =ilaston
753 DO k=kxsp(4,m)+1,kxsp(5,m)
762 DO k=kxsp(5,m)+1,kxsp(5,m)+kxsp(6,m)
766 ixsp(nvois2+nvoiss1,m)=jk
768 knod=kxsp(3,jk/(nspcond+1))
771 ixsp(nvois2+nvoiss1,m)=jk
777 DO k=kxsp(5,m)+kxsp(6,m)+1,kxsp(5,m)+kxsp(7,m)
781 ixsp(nvois2+nvoiss2,m)=jk
783 knod=kxsp(3,jk/(nspcond+1))
786 ixsp(nvois2+nvoiss2,m)=jk
816 DEALLOCATE(off_sph,tag_sph)