42
43
44
46 USE elbufdef_mod
48
49
50
51#include "implicit_f.inc"
52#include "comlock.inc"
53
54
55
56#include "com01_c.inc"
57#include "com04_c.inc"
58#include "com06_c.inc"
59#include "param_c.inc"
60#include "parit_c.inc"
61#include "scr17_c.inc"
62#include "sphcom.inc"
63#include "task_c.inc"
64#include "units_c.inc"
65#include "vect01_c.inc"
66
67
68
69 INTEGER KXSP(NISP,*),
70 . IPARTSP(*), IPARG(NPARG,*), NGROUNC,
71 . IGROUNC(*), ITASK, IXSP(KVOISPH,*), NOD2SP(*),
72 . SOL2SPH(2,*), SPH2SOL(*), IXS(NIXS,*),
73 . IADS(8,*), ADDCNE(*), ICONTACT(*)
75 . x(3,*), spbuf(nspbuf,*), ms(*), pm(npropm,*), fskyd(*),
76 . dmsph(*), v(3,*)
77 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
78
79
80
81 INTEGER I, N, IP, KP, NG, MG, J, NP, KFT, IG, NELEM,
82 . NEL, OFFSET, NVOIS, M, INOD, JNOD, NN, IPRT, IMAT,
83 . N1, N2, N3, N4, N5, N6, N7, N8,
84 . K1, K2, K3, K4, K5, K6, K7, K8, IERROR,
85 . NODFT, NODLT
87 . dm, rho0, ehourt, ek, vi2, vxi, vyi, vzi,
88 . vx1, vx2, vx3, vx4, vx5, vx6, vx7, vx8,
89 . vy1, vy2, vy3, vy4, vy5, vy6, vy7, vy8,
90 . vz1, vz2, vz3, vz4, vz5, vz6, vz7, vz8
91
92
93 TYPE(G_BUFEL_) ,POINTER :: GBUF, GBUFSP
94 TYPE(L_BUFEL_) ,POINTER :: LBUF
95 TYPE(BUF_MAT_) ,POINTER :: MBUF
96
97
98 DO ig = 1, ngrounc
99 ng = igrounc(ig)
100 IF(iparg(8,ng)==1)GOTO 50
102 DO nelem = 1,iparg(2,ng),nvsiz
103 offset = nelem - 1
104 nel =iparg(2,ng)
105 nft =iparg(3,ng) + offset
106 iad =iparg(4,ng)
107 ity =iparg(5,ng)
108 ipartsph=iparg(69,ng)
109 lft=1
110 llt=
min(nvsiz,nel-nelem+1)
111 IF(ity==1.AND.ipartsph/=0) THEN
112
113 gbuf => elbuf_tab(ng)%GBUF
114 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
115 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
116
117 DO i=lft,llt
118 IF(gbuf%OFF(i)/=zero) THEN
119 n=nft+i
120 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
121 np=sol2sph(1,n)+kp
122 inod=kxsp(3,np)
123 IF(icontact(inod)/=0)THEN
124
125
126 gbuf%OFF(i)=four_over_5
127 idel7nok=1
128#include "lockon.inc"
129 WRITE(iout,*)
130 .' -- PARTICLE INTO CONTACT => DELETE SOLID ELEMENT AT NEXT CYCLE',
131 . ixs(nixs,n)
132 WRITE(istdo,*)
133 .' -- PARTICLE INTO CONTACT => DELETE SOLID ELEMENT AT NEXT CYCLE',
134 . ixs(nixs,n)
135#include "lockoff.inc"
136 EXIT
137 END IF
138 END DO
139 END IF
140 ENDDO
141 END IF
142 END DO
144
145 50 CONTINUE
146 END DO
147
148
149 ehourt=zero
150 IF(iparit==0)THEN
151
152
153
154
155 DO ig = 1, ngrounc
156 ng = igrounc(ig)
157 IF(iparg(8,ng)==1)GOTO 100
159 DO nelem = 1,iparg(2,ng),nvsiz
160 offset = nelem - 1
161 nel =iparg(2,ng)
162 nft =iparg(3,ng) + offset
163 iad =iparg(4,ng)
164 ity =iparg(5,ng)
165 ipartsph=iparg(69,ng)
166 lft=1
167 llt=
min(nvsiz,nel-nelem+1)
168 IF(ity==1.AND.ipartsph/=0) THEN
169
170 gbuf => elbuf_tab(ng)%GBUF
171 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
172 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
173
174 DO i=lft,llt
175 IF(gbuf%OFF(i)==zero) THEN
176
177
178 n=nft+i
179 np=sol2sph(1,n)+1
180 IF(kxsp(2,np)<0)THEN
181
182
183 ek=zero
184 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
185 np=sol2sph(1,n)+kp
186 mg =mod(-kxsp(2,np),ngroup+1)
187 kft=iparg(3,mg)
188 gbufsp => elbuf_tab(mg)%GBUF
189 kxsp(2,np) =abs(kxsp(2,np))
190 gbufsp%OFF(np-kft)=one
191 sph2sol(np) =0
192
193 inod=kxsp(3,np)
194 vi2= v(1,inod)*v(1,inod)
195 . +v(2,inod)*v(2,inod)
196 . +v(3,inod)*v(3,inod)
197 ek=ek+half*ms(inod)*vi2
198 ENDDO
199 n1=ixs(2,n)
200 n2=ixs(3,n)
201 n3=ixs(4,n)
202 n4=ixs(5,n)
203 n5=ixs(6,n)
204 n6=ixs(7,n)
205 n7=ixs(8,n)
206 n8=ixs(9,n)
207 imat=ixs(1,n)
208 rho0=pm(1,imat)
209 dm=one_over_8*gbuf%VOL(i)*rho0
210
211 dmsph(n1)=dmsph(n1)+dm
212 dmsph(n2)=dmsph(n2)+dm
213 dmsph(n3)=dmsph(n3)+dm
214 dmsph(n4)=dmsph(n4)+dm
215 dmsph(n5)=dmsph(n5)+dm
216 dmsph(n6)=dmsph(n6)+dm
217 dmsph(n7)=dmsph(n7)+dm
218 dmsph(n8)=dmsph(n8)+dm
219
220 n1=ixs(2,n)
221 vx1=v(1,n1)
222 vy1=v(2,n1)
223 vz1=v(3,n1)
224 n2=ixs(3,n)
225 vx2=v(1,n2)
226 vy2=v(2,n2)
227 vz2=v(3,n2)
228 n3=ixs(4,n)
229 vx3=v(1,n3)
230 vy3=v(2,n3)
231 vz3=v(3,n3)
232 n4=ixs(5,n)
233 vx4=v(1,n4)
234 vy4=v(2,n4)
235 vz4=v(3,n4)
236 n5=ixs(6,n)
237 vx5=v(1,n5)
238 vy5=v(2,n5)
239 vz5=v(3,n5)
240 n6=ixs(7,n)
241 vx6=v(1,n6)
242 vy6=v(2,n6)
243 vz6=v(3,n6)
244 n7=ixs(8,n)
245 vx7=v(1,n7)
246 vy7=v(2,n7)
247 vz7=v(3,n7)
248 n8=ixs(9,n)
249 vx8=v(1,n8)
250 vy8=v(2,n8)
251 vz8=v(3,n8)
252 vxi=vx1+vx2+vx3+vx4+vx5+vx6+vx7+vx8
253 vyi=vy1+vy2+vy3+vy4+vy5+vy6+vy7+vy8
254 vzi=vz1+vz2+vz3+vz4+vz5+vz6+vz7+vz8
255 vi2=vx1*vx1+vx2*vx2+vx3*vx3+vx4*vx4
256 1 +vx5*vx5+vx6*vx6+vx7*vx7+vx8*vx8
257 2 +vy1*vy1+vy2*vy2+vy3*vy3+vy4*vy4
258 3 +vy5*vy5+vy6*vy6+vy7*vy7+vy8*vy8
259 4 +vz1*vz1+vz2*vz2+vz3*vz3+vz4*vz4
260 5 +vz5*vz5+vz6*vz6+vz7*vz7+vz8*vz8
261
262
263 ehourt=ehourt+half*dm*vi2-ek
264 END IF
265 END IF
266 ENDDO
267 END IF
268 END DO
270
271 100 CONTINUE
272 END DO
273
274 ELSE
275
276
277
278 nodft = 1+itask*numnod/ nthread
279 nodlt = (itask+1)*numnod/nthread
280 DO n = nodft, nodlt
281 fskyd(addcne(n):addcne(n+1)-1)=zero
282 ENDDO
283
285
286
287 DO ig = 1, ngrounc
288 ng = igrounc(ig)
289 IF(iparg(8,ng)==1)GOTO 200
291 DO nelem = 1,iparg(2,ng),nvsiz
292 offset = nelem - 1
293 nel =iparg(2,ng)
294 nft =iparg(3,ng) + offset
295 iad =iparg(4,ng)
296 ity =iparg(5,ng)
297 ipartsph=iparg(69,ng)
298 lft=1
299 llt=
min(nvsiz,nel-nelem+1)
300 IF(ity==1.AND.ipartsph/=0) THEN
301
302 gbuf => elbuf_tab(ng)%GBUF
303 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
304 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
305
306 DO i=lft,llt
307 IF(gbuf%OFF(i)==zero) THEN
308
309
310 n=nft+i
311 np=sol2sph(1,n)+1
312 IF(kxsp(2,np)<0)THEN
313
314
315 ek=zero
316 DO kp=1,sol2sph(2,n)-sol2sph(1,n)
317 np=sol2sph(1,n)+kp
318 mg =mod(-kxsp(2,np),ngroup+1)
319 kft=iparg(3,mg)
320 gbufsp => elbuf_tab(mg)%GBUF
321 kxsp(2,np) =abs(kxsp(2,np))
322 gbufsp%OFF(np-kft)=one
323 sph2sol(np) =0
324
325 inod=kxsp(3,np)
326 vi2= v(1,inod)*v(1,inod)
327 . +v(2,inod)*v(2,inod)
328 . +v(3,inod)*v(3,inod)
329 ek=ek+half*ms(inod)*vi2
330 ENDDO
331 imat=ixs(1,n)
332 rho0=pm(1,imat)
333 dm=one_over_8*gbuf%VOL(i)*rho0
334
335 k1=iads(1,n)
336 fskyd(k1)=dm
337 k2=iads(2,n)
338 fskyd(k2)=dm
339 k3=iads(3,n)
340 fskyd(k3)=dm
341 k4=iads(4,n)
342 fskyd(k4)=dm
343 k5=iads(5,n)
344 fskyd(k5)=dm
345 k6=iads(6,n)
346 fskyd(k6)=dm
347 k7=iads(7,n)
348 fskyd(k7)=dm
349 k8=iads(8,n)
350 fskyd(k8)=dm
351
352 n1=ixs(2,n)
353 vx1=v(1,n1)
354 vy1=v(2,n1)
355 vz1=v(3,n1)
356 n2=ixs(3,n)
357 vx2=v(1,n2)
358 vy2=v(2,n2)
359 vz2=v(3,n2)
360 n3=ixs(4,n)
361 vx3=v(1,n3)
362 vy3=v(2,n3)
363 vz3=v(3,n3)
364 n4=ixs(5,n)
365 vx4=v(1,n4)
366 vy4=v(2,n4)
367 vz4=v(3,n4)
368 n5=ixs(6,n)
369 vx5=v(1,n5)
370 vy5=v(2,n5)
371 vz5=v(3,n5)
372 n6=ixs(7,n)
373 vx6=v(1,n6)
374 vy6=v(2,n6)
375 vz6=v(3,n6)
376 n7=ixs(8,n)
377 vx7=v(1,n7)
378 vy7=v(2,n7)
379 vz7=v(3,n7)
380 n8=ixs(9,n)
381 vx8=v(1,n8)
382 vy8=v(2,n8)
383 vz8=v(3,n8)
384 vxi=vx1+vx2+vx3+vx4+vx5+vx6+vx7+vx8
385 vyi=vy1+vy2+vy3+vy4+vy5+vy6+vy7+vy8
386 vzi=vz1+vz2+vz3+vz4+vz5+vz6+vz7+vz8
387 vi2=vx1*vx1+vx2*vx2+vx3*vx3+vx4*vx4
388 1 +vx5*vx5+vx6*vx6+vx7*vx7+vx8*vx8
389 2 +vy1*vy1+vy2*vy2+vy3*vy3+vy4*vy4
390 3 +vy5*vy5+vy6*vy6+vy7*vy7+vy8*vy8
391 4 +vz1*vz1+vz2*vz2+vz3*vz3+vz4*vz4
392 5 +vz5*vz5+vz6*vz6+vz7*vz7+vz8*vz8
393
394
395 ehourt=ehourt+half*dm*vi2-ek
396 END IF
397 END IF
398 ENDDO
399 END IF
400 END DO
402
403 200 CONTINUE
404 END DO
405
406
407 END IF
408
409#include "lockon.inc"
410 ehour=ehour+ehourt
411#include "lockoff.inc"
412
413 RETURN