43
44 USE elbufdef_mod
47
48
49
50#include "implicit_f.inc"
51#include "comlock.inc"
52
53
54
55#include "com01_c.inc"
56#include "com04_c.inc"
57#include "com08_c.inc"
58#include "param_c.inc"
59#include "sphcom.inc"
60#include "scr11_c.inc"
61#include "scr17_c.inc"
62#include "task_c.inc"
63#include "vect01_c.inc"
64
65
66
67 INTEGER (NIXS,*), KXSP(NISP,*), ITASK,
68 . IPARTSP(*), IRST(3,*), NGROUNC, IGROUNC(*),
69 . IPARTS(*), IPARG(NPARG,*), SOL2SPH(2,*), IPART(LIPART1,*),
70 . IGEO(NPROPGI,*)
72 . v(3,*), a(3,*), spbuf(nspbuf,*), ms(*), partsav(npsav,*),
73 . pm(npropm,*)
74 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
75
76
77
78 INTEGER I, J, IR, IS, IT, KP, NP, N, INOD, IG, NG, MG, NEL,
79 . N1, N2, N3, N4, N5, N6, N7, N8, IPRT, IMAT,
80 . , OFFSET, NSPHDIR, KFT, IERROR
81
83 . vx1,vx2,vx3,vx4,vx5,vx6,vx7,vx8,
84 . vy1,vy2,vy3,vy4,vy5,vy6,vy7,vy8,
85 . vz1,vz2,vz3,vz4,vz5,vz6,vz7,vz8,
86 . phi1,phi2,phi3,phi4,phi5,phi6,phi7,phi8,
87 . ksi, eta, zeta, wi,
88 . vxi, vyi, vzi, usdt, dt05,
89 . xmass_t, xmomt_t, ymomt_t, zmomt_t, encin_t,
90 . rho0, mass, vi2
91
92 TYPE(G_BUFEL_) ,POINTER :: GBUF, GBUFSP
93 TYPE(L_BUFEL_) ,POINTER :: LBUF
94 TYPE(BUF_MAT_) ,POINTER :: MBUF
95
97 . a_gauss(9,9),a_gauss_tetra(9,9)
98 DATA a_gauss /
99 1 0. ,0. ,0. ,
100 1 0. ,0. ,0. ,
101 1 0. ,0. ,0. ,
102 2 -.5 ,0.5 ,0. ,
103 2 0. ,0. ,0. ,
104 2 0. ,0. ,0. ,
105 3 -.666666666666666,0. ,0.666666666666666,
106 3 0. ,0. ,0. ,
107 3 0. ,0. ,0. ,
108 4 -.75 ,-.25 ,0.25 ,
109 4 0.75 ,0. ,0. ,
110 4 0. ,0. ,0. ,
111 5 -.8 ,-.4 ,0. ,
112 5 0.4 ,0.8 ,0. ,
113 5 0. ,0. ,0. ,
114 6 -.833333333333333,-.5 ,-.166666666666666,
115 6 0.166666666666666,0.5 ,0.833333333333333,
116 6 0. ,0. ,0. ,
117 7 -.857142857142857,-.571428571428571,-.285714285714285,
118 7 0. ,0.285714285714285,0.571428571428571,
119 7 0.857142857142857,0. ,0. ,
120 8 -.875 ,-.625 ,-.375 ,
121 8 -.125 ,0.125 ,0.375,
122 8 0.625 ,0.875 ,0. ,
123 9 -.888888888888888,-.666666666666666,-.444444444444444,
124 9 -.222222222222222,0. ,0.222222222222222,
125 9 0.444444444444444,0.666666666666666,0.888888888888888/
126
127 DATA a_gauss_tetra /
128 1 0.250000000000000,0.000000000000000,0.000000000000000,
129 1 0.000000000000000,0.000000000000000,0.000000000000000,
130 1 0.000000000000000,0.000000000000000,0.000000000000000,
131 2 0.166666666666667,0.500000000000000,0.000000000000000,
132 2 0.000000000000000,0.000000000000000,0.000000000000000,
133 2 0.000000000000000,0.000000000000000,0.000000000000000,
134 3 0.125000000000000,0.375000000000000,0.625000000000000,
135 3 0.000000000000000,0.000000000000000,0.000000000000000,
136 3 0.000000000000000,0.000000000000000,0.000000000000000,
137 4 0.100000000000000,0.300000000000000,0.500000000000000,
138 4 0.700000000000000,0.000000000000000,0.000000000000000,
139 4 0.000000000000000,0.000000000000000,0.000000000000000,
140 5 0.083333333333333,0.250000000000000,0.416666666666667,
141 5 0.583333333333333,0.750000000000000,0.000000000000000,
142 5 0.000000000000000,0.000000000000000,0.000000000000000,
143 6 0.071428571428571,0.214285714285714,0.357142857142857,
144 6 0.500000000000000,0.642857142857143,0.785714285714286,
145 6 0.000000000000000,0.000000000000000,0.000000000000000,
146 7 0.062500000000000,0.187500000000000,0.312500000000000,
147 7 0.437500000000000,0.562500000000000,0.687500000000000,
148 7 0.812500000000000,0.000000000000000,0.000000000000000,
149 8 0.055555555555556,0.166666666666667,0.277777777777778,
150 8 0.388888888888889,0.500000000000000,0.611111111111111,
151 8 0.722222222222222,0.833333333333333,0.000000000000000,
152 9 0.050000000000000,0.150000000000000,0.250000000000000,
153 9 0.350000000000000,0.450000000000000,0.550000000000000,
154 9 0.650000000000000,0.750000000000000,0.850000000000000/
155
156 IF(itask==0)THEN
157 ALLOCATE(wpartsav(nthread,npsav,npart),stat=ierror)
158 IF(ierror/=0) THEN
159 CALL ancmsg(msgid=19,anmode=aninfo,
160 . c1='(SOLIDS to SPH)')
162 ENDIF
163 END IF
164
166
167 usdt=one/dt12
168 dt05=half*dt1
169 xmass_t=zero
170 xmomt_t=zero
171 ymomt_t=zero
172 zmomt_t=zero
173 encin_t=zero
174 DO iprt=itask+1,npart,nthread
175 DO j=1,npsav
176 DO i=1,nthread
177 wpartsav(i,j,iprt)=zero
178 END DO
179 END DO
180 END DO
181
182
183 DO ig = 1, ngrounc
184 ng = igrounc(ig)
185 IF(iparg(8,ng)==1)GOTO 250
187 DO nelem = 1,iparg(2,ng),nvsiz
188 offset = nelem - 1
189 nel =iparg(2,ng)
190 nft =iparg(3,ng) + offset
191 iad =iparg(4,ng)
192 ity =iparg(5,ng)
193 ipartsph=iparg(69,ng)
194 lft=1
195 llt=
min(nvsiz,nel-nelem+1)
196 IF(ity==1.AND.ipartsph/=0) THEN
197
198 gbuf => elbuf_tab(ng)%GBUF
199 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
200 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
201
202
203
204 IF (iparg(28,ng)==4) THEN
205
206 DO i=lft,llt
207 n=nft+i
208 IF(gbuf%OFF(i)==zero) cycle
209
210
211 n1=ixs(2,n)
212 vx1=v(1,n1)+dt12*a(1,n1)
213 vy1=v(2,n1)+dt12*a(2,n1)
214 vz1=v(3,n1)+dt12*a(3,n1)
215 n2=ixs(4,n)
216 vx2=v(1,n2)+dt12*a(1,n2)
217 vy2=v(2,n2)+dt12*a(2,n2)
218 vz2=v(3,n2)+dt12*a(3,n2)
219 n3=ixs(7,n)
220 vx3=v(1,n3)+dt12*a(1,n3)
221 vy3=v(2,n3)+dt12*a(2,n3)
222 vz3=v(3,n3)+dt12*a(3,n3)
223 n4=ixs(6,n)
224 vx4=v(1,n4)+dt12*a(1,n4)
225 vy4=v(2,n4)+dt12*a(2,n4)
226 vz4=v(3,n4)+dt12*a(3,n4)
227
228 nsphdir=igeo(37,ixs(10,n))
229
230 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
231 np =sol2sph(1,n)+kp
232 ir=irst(1,np-first_sphsol+1)
233 is=irst(2,np-first_sphsol+1)
234 it=irst(3,np-first_sphsol+1)
235 ksi = a_gauss_tetra(ir,nsphdir)
236 eta = a_gauss_tetra(is,nsphdir)
237 zeta = a_gauss_tetra(it,nsphdir)
238
239 phi1=ksi
240 phi2=eta
241 phi3=zeta
242 phi4=1-ksi-eta-zeta
243
244 vxi=phi1*vx1+phi2*vx2+phi3*vx3+phi4*vx4
245 vyi=phi1*vy1+phi2*vy2+phi3*vy3+phi4*vy4
246 vzi=phi1*vz1+phi2*vz2+phi3*vz3+phi4*vz4
247
248 inod=kxsp(3,np)
249 a(1,inod)=(vxi-v(1,inod))*usdt
250 a(2,inod)=(vyi-v(2,inod))*usdt
251 a(3,inod)=(vzi-v(3,inod))*usdt
252 ENDDO
253 ENDDO
254
255 ELSE
256
257
258
259 DO i=lft,llt
260 n=nft+i
261 IF(gbuf%OFF(i)==zero) cycle
262
263
264 n1=ixs(2,n)
265 vx1=v(1,n1)+dt12*a(1,n1)
266 vy1=v(2,n1)+dt12*a(2,n1)
267 vz1=v(3,n1)+dt12*a(3,n1)
268 n2=ixs(3,n)
269 vx2=v(1,n2)+dt12*a(1,n2)
270 vy2=v(2,n2)+dt12*a(2,n2)
271 vz2=v(3,n2)+dt12*a(3,n2)
272 n3=ixs(4,n)
273 vx3=v(1,n3)+dt12*a(1,n3)
274 vy3=v(2,n3)+dt12*a(2,n3)
275 vz3=v(3,n3)+dt12*a(3,n3)
276 n4=ixs(5,n)
277 vx4=v(1,n4)+dt12*a(1,n4)
278 vy4=v(2,n4)+dt12*a(2,n4)
279 vz4=v(3,n4)+dt12*a(3,n4)
280 n5=ixs(6,n)
281 vx5=v(1,n5)+dt12*a(1,n5)
282 vy5=v(2,n5)+dt12*a(2,n5)
283 vz5=v(3,n5)+dt12*a(3,n5)
284 n6=ixs(7,n)
285 vx6=v(1,n6)+dt12*a(1,n6)
286 vy6=v(2,n6)+dt12*a(2,n6)
287 vz6=v(3,n6)+dt12*a(3,n6)
288 n7=ixs(8,n)
289 vx7=v(1,n7)+dt12*a(1,n7)
290 vy7=v(2,n7)+dt12*a(2,n7)
291 vz7=v(3,n7)+dt12*a(3,n7)
292 n8=ixs(9,n)
293 vx8=v(1,n8)+dt12*a(1,n8)
294 vy8=v(2,n8)+dt12*a(2,n8)
295 vz8=v(3,n8)+dt12*a(3,n8)
296
297
298 nsphdir=nint((sol2sph(2,n)-sol2sph(1,n))**third)
299
300 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
301 np =sol2sph(1,n)+kp
302 ir=irst(1,np-first_sphsol+1)
303 is=irst(2,np-first_sphsol+1)
304 it=irst(3,np-first_sphsol+1)
305 ksi = a_gauss(ir,nsphdir)
306 eta = a_gauss(is,nsphdir)
307 zeta = a_gauss(it,nsphdir)
308
309 phi1=(one-ksi)*(one-eta)*(one-zeta)
310 phi2=(one-ksi)*(one-eta)*(one+zeta)
311 phi3=(one+ksi)*(one-eta)*(one+zeta)
312 phi4=(one+ksi)*(one-eta)*(one-zeta)
313 phi5=(one-ksi)*(one+eta)*(one-zeta)
314 phi6=(one-ksi)*(one+eta)*(one+zeta)
315 phi7=(one+ksi)*(one+eta)*(one+zeta)
316 phi8=(one+ksi)*(one+eta)*(one-zeta)
317 vxi=one_over_8*(phi1*vx1+phi2*vx2+phi3*vx3+phi4*vx4+
318 . phi5*vx5+phi6*vx6+phi7*vx7+phi8*vx8)
319 vyi=one_over_8*(phi1*vy1+phi2*vy2+phi3*vy3+phi4*vy4+
320 . phi5*vy5+phi6*vy6+phi7*vy7+phi8*vy8)
321 vzi=one_over_8*(phi1*vz1+phi2*vz2+phi3*vz3+phi4*vz4+
322 . phi5*vz5+phi6*vz6+phi7*vz7+phi8*vz8)
323
324 inod=kxsp(3,np)
325 a(1,inod)=(vxi-v(1,inod))*usdt
326 a(2,inod)=(vyi-v(2,inod))*usdt
327 a(3,inod)=(vzi-v(3,inod))*usdt
328 ENDDO
329 ENDDO
330
331 ENDIF
332
333 ENDIF
335 END DO
336
337 250 CONTINUE
338 END DO
339
340
341
342 DO ig = 1, ngrounc
343 ng = igrounc(ig)
344 IF(iparg(8,ng)==1)GOTO 350
346 DO nelem = 1,iparg(2,ng),nvsiz
347 offset = nelem - 1
348 nel =iparg(2,ng)
349 nft =iparg(3,ng) + offset
350 iad =iparg(4,ng)
351 ity =iparg(5,ng)
352 ipartsph=iparg(69,ng)
353 lft=1
354 llt=
min(nvsiz,nel-nelem+1)
355 IF(ity==1.AND.ipartsph/=0) THEN
356
357 gbuf => elbuf_tab(ng)%GBUF
358 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
359 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
360
361 DO i=lft,llt
362 n=nft+i
363 IF(gbuf%OFF(i)/=zero) THEN
364
365
366
367 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
368
369 np=sol2sph(1,n)+kp
370 mg =mod(-kxsp(2,np),ngroup+1)
371
372 inod=kxsp(3,np)
373 vxi=v(1,inod)+dt05*a(1,inod)
374 vyi=v(2,inod)+dt05*a(2,inod)
375 vzi=v(3,inod)+dt05*a(3,inod)
376 xmass_t=xmass_t-ms(inod)
377 xmomt_t=xmomt_t-ms(inod)*vxi
378 ymomt_t=ymomt_t-ms(inod)*vyi
379 zmomt_t=zmomt_t-ms(inod)*vzi
380 encin_t=encin_t
381 . -half*ms(inod)*(vxi*vxi+vyi*vyi+vzi*vzi)
382
383
384
385 IF(iparg(8,mg)==1)cycle
386
387 kft=iparg(3,mg)
388 gbufsp => elbuf_tab(mg)%GBUF
389 iprt=ipartsp(np)
390 wpartsav(itask+1,1,iprt)=wpartsav(itask+1,1,iprt)
391 . -gbufsp%VOL(np-kft)*gbufsp%EINT(np-kft)
392 wpartsav(itask+1,2,iprt)=wpartsav(itask+1,2,iprt)
393 . -half*ms(inod)*(vxi*vxi+vyi*vyi+vzi*vzi)
394 wpartsav(itask+1,3,iprt)=wpartsav(itask+1,3,iprt)
395 . -ms(inod)*vxi
396 wpartsav(itask+1,4,iprt)=wpartsav(itask+1,4,iprt)
397 . -ms(inod)*vyi
398 wpartsav(itask+1,5,iprt)=wpartsav(itask+1,5,iprt)
399 . -ms(inod)*vzi
400 wpartsav(itask+1,6,iprt)=wpartsav(itask+1,6,iprt)
401 . -ms(inod)
402
403 ENDDO
404 END IF
405 END DO
406 END IF
407 END DO
409 350 CONTINUE
410 END DO
411
412
413#include "lockon.inc"
414 encin=encin + encin_t
415 xmass=xmass + xmass_t
416 xmomt=xmomt + xmomt_t
417 ymomt=ymomt + ymomt_t
418 zmomt=zmomt + zmomt_t
419#include "lockoff.inc"
420 DO iprt=itask+1,npart,nthread
421 DO j=1,npsav
422 DO i=1,nthread
423 partsav(j,iprt)=partsav(j,iprt)+wpartsav(i,j,iprt)
424 END DO
425 END DO
426 END DO
427
429
430 IF(itask==0) DEALLOCATE(wpartsav)
431
432 RETURN
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)