245
246
247
248#include "implicit_f.inc"
249
250
251
252 INTEGER NOD(0:*), IFLAG
253
255 . a(3,*), ar(3,*), v(3,*), vr(3,*), x(3,*), fs(*), ms(*),
256 . in(*), cjwork(*), diag_sms(*)
257
258
259
260
261#include "com08_c.inc"
262
263
264
265 INTEGER NSN, NA, NB, I, N
266
268 . masse, iner, n1, n2, n3, s, ax, ay, az, axx, ayy, azz, vx,
269 . vy, vz, vxx, vyy, vzz, xcdg, ycdg, zcdg, xx, yy, zz, rr, a0,
270 . dmasse, vg(3), usdt, v0, dt05
271
272 nsn =nod(0)
273
274
275
276 na=nod(1)
277 nb=nod(2)
278 n1=x(1,nb)-x(1,na)
279 n2=x(2,nb)-x(2,na)
280 n3=x(3,nb)-x(3,na)
281 s=sqrt(n1**2+n2**2+n3**2)
282 n1=n1/s
283 n2=n2/s
284 n3=n3/s
285
286 masse=zero
287 iner=zero
288
289 ax= zero
290 ay= zero
291 az= zero
292
293 axx= zero
294 ayy= zero
295 azz= zero
296
297 xcdg=zero
298 ycdg=zero
299 zcdg=zero
300
301
302
303 DO 100 i=1,nsn
304 n = nod(i)
305 masse= masse+ms(n)
306 xcdg=xcdg+x(1,n)*ms(n)
307 ycdg=ycdg+x(2,n)*ms(n)
308 zcdg=zcdg+x(3,n)*ms(n)
309 100 CONTINUE
310
311 IF (masse>zero) THEN
312 xcdg=xcdg/masse
313 ycdg=ycdg/masse
314 zcdg=zcdg/masse
315 ENDIF
316
317
318
319 DO i=1,nsn
320 n = nod(i)
321
322 xx=x(1,n)-xcdg
323 yy=x(2,n)-ycdg
324 zz=x(3,n)-zcdg
325
326 rr=n1*xx+n2*yy+n3*zz
327 xx=n1*rr
328 yy=n2*rr
329 zz=n3*rr
330
331 iner=iner+rr**2*diag_sms(n)+in(n)
332
333
334
335 ax= ax+a(1,n)
336 ay= ay+a(2,n)
337 az= az+a(3,n)
338
339
340 axx= axx+ar(1,n)+yy*a(3,n)-zz*a(2,n)
341 ayy= ayy+ar(2,n)+zz*a(1,n)-xx*a(3,n)
342 azz= azz+ar(3,n)+xx*a(2,n)-yy*a(1,n)
343
344 END DO
345
346 a0=n1*ax+n2*ay+n3*az
347 ax=ax-n1*a0
348 ay=ay-n2*a0
349 az=az-n3*a0
350 a0=n1*axx+n2*ayy+n3*azz
351 axx=axx-n1*a0
352 ayy=ayy-n2*a0
353 azz=azz-n3*a0
354
355 fs(1)=fs(1)+ax*dt12
356 fs(2)=fs(2)+ay*dt12
357 fs(3)=fs(3)+az*dt12
358 fs(4)=fs(4)+axx*dt12
359 fs(5)=fs(5)+ayy*dt12
360 fs(6)=fs(6)+azz*dt12
361
362 IF (iner>zero) THEN
363 axx=axx/iner
364 ayy=ayy/iner
365 azz=azz/iner
366 ENDIF
367
368 cjwork(1)=n1
369 cjwork(2)=n2
370 cjwork(3)=n3
371
372 cjwork(4)=axx
373 cjwork(5)=ayy
374 cjwork(6)=azz
375
376 cjwork(7)=xcdg
377 cjwork(8)=ycdg
378 cjwork(9)=zcdg
379
380 cjwork(10)=masse
381 cjwork(11)=iner
382
383
384
385
386 vx= zero
387 vy= zero
388 vz= zero
389
390 vxx= zero
391 vyy= zero
392 vzz= zero
393
394 DO i=1,nsn
395 n = nod(i)
396
397 vx= vx+v(1,n)*ms(n)
398 vy= vy+v(2,n)*ms(n)
399 vz= vz+v(3,n)*ms(n)
400
401 END DO
402
403 a0=n1*vx+n2*vy+n3*vz
404 vx=vx-n1*a0
405 vy=vy-n2*a0
406 vz=vz-n3*a0
407
408 IF (masse>zero) THEN
409 vx=vx/masse
410 vy=vy/masse
411 vz=vz/masse
412 ENDIF
413
414 dt05=half*dt1
415 DO i=1,nsn
416 n = nod(i)
417
418 xx=x(1,n)-xcdg-(v(1,n)-vx)*dt05
419 yy=x(2,n)-ycdg-(v(2,n)-vy)*dt05
420 zz=x(3,n)-zcdg-(v(3,n)-vz)*dt05
421
422 rr=n1*xx+n2*yy+n3*zz
423 xx=n1*rr
424 yy=n2*rr
425 zz=n3*rr
426
427 vxx= vxx+vr(1,n)*in(n)+yy*v(3,n)*ms(n)-zz*v(2,n)*ms(n)
428 vyy= vyy+vr(2,n)*in(n)+zz*v(1,n)*ms(n)-xx*v(3,n)*ms(n)
429 vzz= vzz+vr(3,n)*in(n)+xx*v(2,n)*ms(n)-yy*v(1,n)*ms(n)
430
431 END DO
432
433 a0=n1*vxx+n2*vyy+n3*vzz
434 vxx=vxx-n1*a0
435 vyy=vyy-n2*a0
436 vzz=vzz-n3*a0
437
438 IF (iner>zero) THEN
439 vxx=vxx/iner
440 vyy=vyy/iner
441 vzz=vzz/iner
442 ENDIF
443
444
445 dmasse=zero
446 DO i=1,nsn
447 n = nod(i)
448 dmasse= dmasse+diag_sms(n)
449 END DO
450
451 cjwork(12)=vx
452 cjwork(13)=vy
453 cjwork(14)=vz
454
455 cjwork(15)=vxx
456 cjwork(16)=vyy
457 cjwork(17)=vzz
458
459 cjwork(18)=dmasse
460
461
462
463 vg(1)=vxx+axx*dt12
464 vg(2)=vyy+ayy*dt12
465 vg(3)=vzz+azz*dt12
466
467 usdt = one/dt12
468
469 DO i=1,nsn
470 n = nod(i)
471
472 a0=n1*ar(1,n)+n2*ar(2,n)+n3*ar(3,n)
473 v0=n1*vr(1,n)+n2*vr(2,n)+n3*vr(3,n)
474 ar(1,n)= in(n)*(vg(1)-(vr(1,n)-n1*v0)) * usdt + n1*a0
475 ar(2,n)= in(n)*(vg(2)-(vr(2,n)-n2*v0)) * usdt + n2*a0
476 ar(3,n)= in(n)*(vg(3)-(vr(3,n)-n3*v0)) * usdt + n3*a0
477
478 END DO
479
480 RETURN