45
46
47
49 USE elbufdef_mod
53
54
55
56
57#include "implicit_f.inc"
58#include "comlock.inc"
59
60
61
62#include "vect01_c.inc"
63#include "com01_c.inc"
64#include "com04_c.inc"
65#include "com06_c.inc"
66#include "com08_c.inc"
67#include "param_c.inc"
68#include "sphcom.inc"
69#include "scr05_c.inc"
70#include "tabsiz_c.inc"
71#include "scr17_c.inc"
72#include "rad2r_c.inc"
73
74
75
76 INTEGER KXSP(NISP,*),IXSP(KVOISPH,*),NOD2SP(*),ITAB(*),NPC(*),
77 . IPARG(NPARG,*),ISPHIO(NISPHIO,*),IPART(LIPART1,*),
78 . LPRTSPH(2,0:NPART),LONFSPH(*),
79 . 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,*)
84 double precision
85 . xdp(3,*)
86 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION (NGROUP) ::
87 TYPE (SURF_) , DIMENSION(NSURF) :: IGRSURF
88 DOUBLE PRECISION,INTENT(INOUT) :: WFEXT
89
90
91
92 INTEGER I, ITYPE, IVAD,IX, N2ENTER,
93 . II,IPT,JJ,NPF,
94 . IFVITS,IFDENS,IFPRES,IFENER,
95 . INACTIV,J,N,INOD,IACTIVE,
96 . ISU,NSEG,IN1,IN2,IN3,IN4,
97 . IMAT,IPROP,IPRT,NEL,KAD,NG,K,
98 . KP,NP2SORT,NBAND,
99 . KNSX,KISX,KNSY,KISY,KNSZ,KISZ,
100 . ,KIPX,KNPY,KIPY,KNPZ,KIPZ,KVNORM,KXPROJ,KF,
101 . IUN,IAD2,NSEGB
103 . pentv,vt,vn,vv,
104 . pentr,rhon,rho0,pentp,pn,pshft,pente,en,ei,
105 . t05,sseg,mp,wfextt,volo,
106 . x1,x2,x3,x4,xp,y1,y2,y3,y4,yp,z1,z2,z3,z4,zp,
107 . x12,y12,z12,x23,y23,z23,x31,y31,z31,nx,ny,nz,nn,
108 . xi,yi,zi,dd,diam,dmax,dps,vol,bid
109 TYPE(G_BUFEL_) ,POINTER :: GBUF
110
112 . get_u_geo
113 EXTERNAL get_u_geo
114 DATA iun/1/
115
116 wfextt=zero
117 bid=zero
118 en = 0
119 rhon = zero
120
121
122 DO i=1,nsphio
123 iprt =isphio(2,i)
124
125 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
126 n=lonfsph(iactive)
127 kxsp(2,n)=mod(kxsp(2,n),ngroup+1)
128 ENDDO
129 ENDDO
130
131 DO i=1,nsphio
132 itype=isphio(1,i)
133 IF(itype==1)THEN
134 iprt =isphio(2,i)
135
136
137 ivad=isphio(4,i)
138 t05=tt - half*dt1
139
140 ifvits=isphio(8,i)
141 vn =zero
142 IF(ifvits/=0)THEN
143 npf = (npc(ifvits+1)-npc(ifvits))/2
144 ii = npc(ifvits)
145 IF (t05<=pld(ii)) THEN
146 pentv=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
147 vn =pld(ii+1)+pentv*(t05-pld(ii))
148 ELSEIF (t05>=pld(ii+2*(npf-1))) THEN
149 jj=ii+2*(npf-1)
150 pentv=(pld(jj+1)-pld(jj-1))/(pld(jj)-pld(jj-2))
151 vn =pld(jj+1)+
max(-pld(jj+1),pentv*(t05-pld(jj)))
152 ELSE
153 DO ipt=1,npf-1
154 IF (pld(ii)<=t05.AND.t05<=pld(ii+2)) THEN
155 pentv=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
156 vn =pld(ii+1)+pentv*(t05-pld(ii))
157 GOTO 20
158 ENDIF
159 ii=ii+2
160 ENDDO
161 20 CONTINUE
162 ENDIF
163 ENDIF
164
165 vv =abs(vn)
166 vt =vv*vv
167
168 ifdens=isphio(5,i)
169 IF(ifdens==0)THEN
170 rhon=vsphio(ivad)
171 ELSE
172 npf = (npc(ifdens+1)-npc(ifdens))/2
173 ii = npc(ifdens)
174 IF (tt<=pld(ii)) THEN
175 pentr=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
176 rhon =pld(ii+1)+pentr*(tt-pld(ii))
177 ELSEIF (tt>=pld(ii+2*(npf-1))) THEN
178 jj=ii+2*(npf-1)
179 pentr=(pld(jj+1)-pld(jj-1))/(pld(jj)-pld(jj-2))
180 rhon =pld(jj+1)+
max(-pld(jj+1),pentr*(tt-pld(jj)))
181 ELSE
182 DO ipt=1,npf-1
183 IF (pld(ii)<=tt.AND.tt<=pld(ii+2)) THEN
184 pentr=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
185 rhon =pld(ii+1)+pentr*(tt-pld(ii))
186 GOTO 30
187 ENDIF
188 ii=ii+2
189 ENDDO
190 30 CONTINUE
191 ENDIF
192 rhon=rhon*vsphio(ivad)
193 ENDIF
194
195 ifener=isphio(7,i)
196 IF(ifener==0)THEN
197 en=vsphio(ivad+2)
198 ELSE
199 npf = (npc(ifener+1)-npc(ifener))/2
200 ii = npc(ifener)
201 IF (tt<=pld(ii)) THEN
202 pente=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
203 en =pld(ii+1)+pente*(tt-pld(ii))
204 ELSEIF (tt>=pld(ii+2*(npf-1))) THEN
205 jj=ii+2*(npf-1)
206 pente=(pld(jj+1)-pld(jj-1))/(pld(jj)-pld(jj-2))
207 en =pld(jj+1)+
max(-pld(jj+1),pente*(tt-pld(jj)))
208 ELSE
209 DO ipt=1,npf-1
210 IF (pld(ii)<=tt.AND.tt<=pld(ii+2)) THEN
211 pente=(pld(ii+3)-pld(ii+1))/(pld(ii+2)-pld(ii))
212 en =pld(ii+1)+pente*(tt-pld(ii))
213 GOTO 50
214 ENDIF
215 ii=ii+2
216 ENDDO
217 50 CONTINUE
218 ENDIF
219 en=en*vsphio(ivad+2)
220 ENDIF
221
222 iprop=ipart(2,iprt)
223 diam =get_u_geo(6,iprop)
224 imat =ipart(1,iprt)
225
226 rho0 =pm(1 ,imat)
227 ei =en*(rho0/rhon)
228
229
230 IF(diam==zero) THEN
231 mp = get_u_geo(1,iprop)
232 vol = mp/rho0
233 diam= (sqr2*vol)**third
234 END IF
235
236
237 xbmin =ep20
238 ybmin =ep20
239 zbmin =ep20
240 xbmax=-ep20
241 ybmax=-ep20
242 zbmax=-ep20
243
244 isu =isphio(3,i)
245
246 nsegb=igrsurf(isu)%NSEG
247
248 nseg=isphio(10,i)
249
250
251 iad2 =isphio(11,i)
252 dmax=vsphio(ivad+3)
253
254
255
256 DO j=0,nseg-1
257 in1=ibufssg_io(iad2+nibsph*j )
258 in2=ibufssg_io(iad2+nibsph*j+1)
259 in3=ibufssg_io(iad2+nibsph*j+2)
260 in4=ibufssg_io(iad2+nibsph*j+3)
261 xp=x(1,in1)
262 yp=x(2,in1)
263 zp=x(3,in1)
270 xp=x(1,in2)
271 yp=x(2,in2)
272 zp=x(3,in2)
279 xp=x(1,in3)
280 yp=x(2,in3)
281 zp=x(3,in3)
288 IF(in4/=in3)THEN
289 xp=x(1,in4)
290 yp=x(2,in4)
291 zp=x(3,in4)
298 ENDIF
299 ENDDO
300 xbmin=xbmin-dmax
301 ybmin=ybmin-dmax
302 zbmin=zbmin-dmax
303 xbmax=xbmax+dmax
304 ybmax=ybmax+dmax
305 zbmax=zbmax+dmax
306
307 np2sort=0
308 DO iactive=lprtsph(2,iprt-1)+1,lprtsph(1,iprt)
309 n=lonfsph(iactive)
310 inod=kxsp(3,n)
311 xi=x(1,inod)
312 yi=x(2,inod)
313 zi=x(3,inod)
314 IF( xi>xbmin.AND.yi>ybmin.AND.zi>zbmin
315 . .AND.xi<xbmax.AND.yi<ybmax.AND.zi<zbmax)THEN
316 np2sort=np2sort+1
317 mwa(np2sort)=iactive
318 ENDIF
319 ENDDO
320
321
322 dbucs=dmax
323 DO j=1,nseg
324 in1=ibufssg_io(iad2+nibsph*(j-1) )
325 in2=ibufssg_io(iad2+nibsph*(j-1)+1)
326 in3=ibufssg_io(iad2+nibsph*(j-1)+2)
327 in4=ibufssg_io(iad2+nibsph*(j-1)+3)
328 x1=x(1,in1)
329 y1=x(2,in1)
330 z1=x(3,in1)
331 x2=x(1,in2)
332 y2=x(2,in2)
333 z2=x(3,in2)
334 x3=x(1,in3)
335 y3=x(2,in3)
336 z3=x(3,in3)
337 dbucs=
max(dbucs,abs(x1-x2))
338 dbucs=
max(dbucs,abs(y1-y2))
339 dbucs=
max(dbucs,abs(z1-z2))
340 dbucs=
max(dbucs,abs(x2-x3))
341 dbucs=
max(dbucs,abs(y2-y3))
342 dbucs=
max(dbucs,abs(z2-z3))
343 dbucs=
max(dbucs,abs(x3-x1))
344 dbucs=
max(dbucs,abs(y3-y1))
345 dbucs=
max(dbucs,abs(z3-z1))
346 IF(in4/=in3)THEN
347 x4=x(1,in4)
348 y4=x(2,in4)
349 z4=x(3,in4)
350 ELSE
351 x4=x3
352 y4=y3
353 z4=z3
354 ENDIF
355 dbucs=
max(dbucs,abs(x1-x4))
356 dbucs=
max(dbucs,abs(y1-y4))
357 dbucs=
max(dbucs,abs(z1-z4))
358 dbucs=
max(dbucs,abs(x2-x4))
359 dbucs=
max(dbucs,abs(y2-y4))
360 dbucs=
max(dbucs,abs(z2-z4))
361 dbucs=
max(dbucs,abs(x3-x4))
362 dbucs=
max(dbucs,abs(y3-y4))
363 dbucs=
max(dbucs,abs(z3-z4))
364 ENDDO
365
366 nbox =
max(iun,int((xbmax-xbmin)/dbucs))
367 nboy =
max(iun,int((ybmax-ybmin)/dbucs))
368 nboz =
max(iun,int((zbmax-zbmin)/dbucs))
369 nband=
max(nbox,nboy,nboz)+1
370 knsx=numsph+1
371 kisx=knsx+nband+1
372 knsy=kisx+4*nseg
373 kisy=knsy+nband+1
374 knsz=kisy+4*nseg
375 kisz=knsz+nband+1
376 knpx=kisz+4*nseg
377 kipx=knpx+nband+1
378 knpy=kipx+3*np2sort
379 kipy=knpy+nband+1
380 knpz=kipy+3*np2sort
381 kipz=knpz+nband+1
382 kvnorm=kipz+3*np2sort
383
384 CALL sphreqs(nseg ,ibufssg_io(iad2) ,x ,np2sort ,mwa ,
385 2 lonfsph ,kxsp ,wa(knsx) ,wa(kisx) ,wa(knsy) ,
386 3 wa(kisy) ,wa(knsz) ,wa(kisz) ,wa(knpx) ,wa(kipx) ,
387 4 wa(knpy) ,wa(kipy) ,wa(knpz) ,wa(kipz) ,wa ,
388 5 wa(kvnorm),bid ,bid ,v ,spbuf ,
389 6 isphio(1,i))
390
391
392 DO kp=1,np2sort
393 dps=wa(kp)
394 IF(dps>=0..AND.dps<dmax)THEN
395 iactive=mwa(kp)
396 n=lonfsph(iactive)
397 inod=kxsp(3,n)
398 wfextt=wfextt + half*ms(inod)*(vt-
399 . (v(1,inod)*v(1,inod)+v(2,inod)*v(2,inod)+v(3,inod)*v(3,inod)))
400 vnormal(1,n)=-wa(kvnorm+3*(n-1))
401 vnormal(2,n)=-wa(kvnorm+3*(n-1)+1)
402 vnormal(3,n)=-wa(kvnorm+3*(n-1)+2)
403 v(1,inod)=vn*vnormal(1,n)
404 v(2,inod)=vn*vnormal(2,n)
405 v(3,inod)=vn*vnormal(3,n)
406 ng=mod(kxsp(2,n),ngroup+1)
407 kxsp(2,n) =ng+i*(ngroup+1)
408 ENDIF
409 ENDDO
410
411
412 mp =get_u_geo(1,iprop)
413 n2enter=0
414 ix=ivad+4
415
416
417 DO j=0,(nsegb-1)
418 sseg =vsphio(ix+1)
419 vsphio(ix)=vsphio(ix)+rhon*sseg*vv*dt1
420 IF(vsphio(ix)>=mp)THEN
421 n2enter=n2enter+1
422 ENDIF
423 ix=ix+2
424 ENDDO
425
426 IF(n2enter>0)THEN
427 isphbuc=1
428
429 inactiv=lprtsph(2,iprt)-lprtsph(1,iprt)
430 IF(inactiv<n2enter)THEN
431 CALL ancmsg(msgid=175,anmode=aninfo,
432 . i1=isphio(nisphio,i))
434 RETURN
435 ENDIF
436
437
438 ix=ivad+4
439 iactive=lprtsph(1,iprt)
440 DO j=0,(nsegb-1)
441 IF(vsphio(ix)>=mp)THEN
442
443 iactive=iactive+1
444 n =lonfsph(iactive)
445
446 lprtsph(1,iprt)=iactive
447
448 in1=igrsurf(isu)%NODES(j+1,1)
449 in2=igrsurf(isu)%NODES(j+1,2)
450 in3=igrsurf(isu)%NODES(j+1,3)
451 in4=igrsurf(isu)%NODES(j+1,4)
452
453
454
455
456 x1=x(1,in1)
457 y1=x(2,in1)
458 z1=x(3,in1)
459 x2=x(1,in2)
460 y2=x(2,in2)
461 z2=x(3,in2)
462 x3=x(1,in3)
463 y3=x(2,in3)
464 z3=x(3,in3)
465 IF(in4/=in3)THEN
466 x4=x(1,in4)
467 y4=x(2,in4)
468 z4=x(3,in4)
469 xp=fourth*(x1+x2+x3+x4)
470 yp=fourth*(y1+y2+y3+y4)
471 zp=fourth*(z1+z2+z3+z4)
472 ELSE
473 x4=x3
474 y4=y3
475 z4=z3
476 xp=third*(x1+x2+x3)
477 yp=third*(y1+y2+y3)
478 zp=third*(z1+z2+z3)
479 ENDIF
480
481 x12=half*(x2+x3-x1-x4)
482 y12=half*(y2+y3-y1-y4)
483 z12=half*(z2+z3-z1-z4)
484 x23=half*(x3+x4-x1-x2)
485 y23=half*(y3+y4-y1-y2)
486 z23=half*(z3+z4-z1-z2)
487 nx = y12*z23-z12*y23
488 ny =-x12*z23+z12*x23
489 nz = x12*y23-y12*x23
490 nn =one/
max(em20,sqrt(nx*nx+ny*ny+nz*nz))
491 nx=nn*nx
492 ny=nn*ny
493 nz=nn*nz
494
495 inod=kxsp(3,n)
496 IF (itab(inod) >= 1000000000) THEN
497 d(1,inod)=xp-xi_res
498 d(2,inod)=yp-yi_res
499 d(3,inod)=zp-zi_res
500 ELSE
501 d(1,inod)=xp-x(1,inod)+d(1,inod)
502 d(2,inod)=yp-x(2,inod)+d(2,inod)
503 d(3,inod)=zp-x(3,inod)+d(3,inod)
504 ENDIF
505 x(1,inod)=xp
506 x(2,inod)=yp
507 x(3,inod)=zp
508 IF (iresp==1) THEN
509 xdp(1,inod)=xp
510 xdp(2,inod)=yp
511 xdp(3,inod)=zp
512 END IF
513 wfextt=wfextt+half*mp*vt
514 vnormal(1,n)=nx
515 vnormal(2,n)=ny
516 vnormal(3,n)=nz
517 v(1,inod)=vn*nx
518 v(2,inod)=vn*ny
519 v(3,inod)=vn*nz
520 IF (r2r_siu/=0) off_sph_r2r(inod) = 2
521
522 ng=-kxsp(2,n)
523 iparg(8,ng) =0
524 iparg(10,ng)=iparg(10,ng)+1
526 2 mtn ,nel ,nft ,kad ,ity ,
527 3 npt ,jale ,ismstr ,jeul ,jtur ,
528 4 jthe ,jlag ,jmult ,jhbe ,jivf ,
529 5 nvaux ,jpor ,jcvt ,jclose ,jplasol ,
530 6 irep ,iint ,igtyp ,israt ,isrot ,
531 7 icsen ,isorth ,isorthg ,ifailure,jsms )
532 gbuf => elbuf_tab(ng)%GBUF
533 k=n-nft
534 volo=gbuf%VOL(k)
535 wfextt=wfextt+ei*volo
536 gbuf%EINT(k) =ei
537 gbuf%OFF(k) =one
538 gbuf%RHO(k) =rhon
539 spbuf(1,n)=diam
540 spbuf(2,n) =rhon
541 spbuf(12,n)=ms(inod)
542 kxsp(2,n) =ng+i*(ngroup+1)
543
544
545 vsphio(ix)=vsphio(ix)-mp
546 ENDIF
547 ix=ix+2
548 ENDDO
549 ENDIF
550 ENDIF
551 ENDDO
552
553
554 wfext=wfext+wfextt
555
556 RETURN
subroutine initbuf(iparg, ng, mtn, llt, nft, iad, ity, npt, jale, ismstr, jeul, jtur, jthe, jlag, jmult, jhbe, jivf, mid, jpor, jcvt, jclose, jpla, irep, iint, igtyp, israt, isrot, icsen, isorth, isorthg, ifailure, jsms)
subroutine sphreqs(nseg, iseg, x, ncel, ixp, lonfsph, kxsp, nsx, isx, nsy, isy, nsz, isz, npx, ipx, npy, ipy, npz, ipz, dps, wnormal, dt_old, mass_cum, v, spbuf, itype)
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)