35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 USE spmd_mod
52
53
54
55#include "implicit_f.inc"
56
57
58
59 INTEGER, INTENT(in) :: N_JOINT,ITASK
60
62 . a(3,*), ar(3,*), v(3,*), vr(3,*), x(3,*), fs(*), ms(*),
63 . in(*)
64
65
66
67#include "com08_c.inc"
68#include "task_c.inc"
69#include "com01_c.inc"
70#include "comlock.inc"
71
72
73
74 INTEGER NSN, NA, , I, N
75
76 my_real :: n1,n2,n3,s,xx, yy, zz, rr,a0
81
82 INTEGER :: NUMBER_NODE,NUMBER_NODE_WEIGHT
83 INTEGER :: FIRST,LAST
84
85 REAL(kind=8), dimension(:), ALLOCATABLE :: buf_s,buf_r
86
87 number_node =
cyl_join(n_joint)%NUMBER_NODE
88 number_node_weight =
cyl_join(n_joint)%NUMBER_NODE_WEIGHT
89
90
91
92
93
96
97 n1=x(1,nb)-x(1,na)
98 n2=x(2,nb)-x(2,na)
99 n3=x(3,nb)-x(3,na)
100 s=sqrt(n1**2+n2**2+n3**2)
101
102 n1=n1/s
103 n2=n2/s
104 n3=n3/s
105
106 masse=zero
107 iner=zero
108
109 ax= zero
110 ay= zero
111 az= zero
112
113 axx= zero
114 ayy= zero
115 azz= zero
116
117 vx= zero
118 vy= zero
119 vz= zero
120
121 vxx= zero
122 vyy= zero
123 vzz= zero
124
125 xcdg=zero
126 ycdg=zero
127 zcdg=zero
128
129
130
131
132 IF(itask==0) THEN
133 ALLOCATE( mass(number_node_weight) )
134 ALLOCATE( x_ms(number_node_weight),y_ms(number_node_weight),z_ms(number_node_weight) )
135
136 ALLOCATE( iner_vec(number_node_weight) )
137 ALLOCATE(ax_ms(number_node_weight),ay_ms(number_node_weight),az_ms(number_node_weight))
138 ALLOCATE(axx_vec(number_node_weight),ayy_vec(number_node_weight),azz_vec(number_node_weight))
139 ALLOCATE(vx_ms(number_node_weight),vy_ms(number_node_weight),vz_ms(number_node_weight))
140 ALLOCATE(vxx_vec(number_node_weight),vyy_vec(number_node_weight),vzz_vec(number_node_weight))
141
142 ALLOCATE(
mass_6(6,nthread) )
144 ALLOCATE(
iner_6(6,nthread) )
149
150 masse_global=zero
151 iner_global=zero
152
153 ax_global= zero
154 ay_global= zero
155 az_global= zero
156
157 axx_global= zero
158 ayy_global= zero
159 azz_global= zero
160
161 vx_global= zero
162 vy_global= zero
163 vz_global= zero
164
165 vxx_global= zero
166 vyy_global= zero
167 vzz_global= zero
168
169 xcdg_global=zero
170 ycdg_global=zero
171 zcdg_global=zero
172 ENDIF
173
174
176
177 mass_6(1:6,itask+1) = zero
178 x_ms_6(1:6,itask+1) = zero
179 y_ms_6(1:6,itask+1) = zero
180 z_ms_6(1:6,itask+1) = zero
181
182 iner_6(1:6,itask+1) = zero
183
187
188 axx_6(1:6,itask+1) = zero
189 ayy_6(1:6,itask+1) = zero
190 azz_6(1:6,itask+1) = zero
191
195
196 vxx_6(1:6,itask+1) = zero
197 vyy_6(1:6,itask+1) = zero
198 vzz_6(1:6,itask+1) = zero
199
200
201
202
203
204
205
206 IF(number_node_weight>0) THEN
207
208
209 first = 1 + itask * number_node_weight / nthread
210 last = (itask+1) * number_node_weight / nthread
211 DO i=first,last
212 n =
cyl_join(n_joint)%NODE_WEIGHT(i)
213 mass(i) = ms(n)
214 x_ms(i) = x(1,n)*ms(n)
215 y_ms(i) = x(2,n)*ms(n)
216 z_ms(i) = x(3,n)*ms(n)
217 ENDDO
218
219
224
225 ENDIF
226
228
229
230
231 IF(itask==0) THEN
232 ALLOCATE( buf_s(13*6) )
233 ALLOCATE( buf_r(13*6) )
234 buf_s(1:6) =
mass_6(1:6,1)
235 buf_s(7:12) =
x_ms_6(1:6,1)
236 buf_s(13:18) =
y_ms_6(1:6,1)
237 buf_s(19:24) =
z_ms_6(1:6,1)
238 IF(nthread>1) THEN
239 DO i=2,nthread
240 buf_s(1:6) = buf_s(1:6) +
mass_6(1:6,i)
241 buf_s(7:12) = buf_s(7:12) +
x_ms_6(1:6,i)
242 buf_s(13:18) = buf_s(13:18) +
y_ms_6(1:6,i)
243 buf_s(19:24) = buf_s(19:24) +
z_ms_6(1:6,i)
244 ENDDO
245 ENDIF
246 buf_r(1:24) = zero
247 IF(nspmd>1) THEN
248 CALL spmd_allreduce(buf_s,buf_r,24,spmd_sum,
cyl_join(n_joint)%COMM_MPI%COMM)
249 ELSE
250 buf_r(1:24) = buf_s(1:24)
251 ENDIF
252
253 DO i=1,6
254 masse_global = masse_global + buf_r(i)
255 xcdg_global = xcdg_global + buf_r(6+i)
256 ycdg_global = ycdg_global + buf_r(12+i)
257 zcdg_global = zcdg_global + buf_r(18+i)
258 ENDDO
259 ENDIF
260
262
263
264 masse = masse_global
265 xcdg = xcdg_global
266 ycdg = ycdg_global
267 zcdg = zcdg_global
268
269 IF (masse>zero) THEN
270 xcdg=xcdg/masse
271 ycdg=ycdg/masse
272 zcdg=zcdg/masse
273 ENDIF
274
275
276
277
278
279
280
281
282 IF(number_node_weight>0) THEN
283
284
285 first = 1 + itask * number_node_weight / nthread
286 last = (itask+1) * number_node_weight / nthread
287 DO i=first,last
288 n =
cyl_join(n_joint)%NODE_WEIGHT(i)
289
290 xx=x(1,n)-xcdg
291 yy=x(2,n)-ycdg
292 zz=x(3,n)-zcdg
293
294 rr=n1*xx+n2*yy+n3*zz
295 xx=n1*rr
296 yy=n2*rr
297 zz=n3*rr
298
299 iner_vec(i) = rr**2*ms(n)+in(n)
300
301 ax_ms(i) = a(1,n)*ms(n)
302 ay_ms(i) = a(2,n)*ms(n)
303 az_ms(i) = a(3,n)*ms(n)
304
305 axx_vec(i) = ar(1,n)*in(n)+yy*a(3,n)*ms(n)-zz*a(2,n)*ms(n)
306 ayy_vec(i) = ar(2,n)*in(n)+zz*a(1,n)*ms(n)-xx*a(3,n)*ms(n)
307 azz_vec(i) = ar(3,n)*in(n)+xx*a(2,n)*ms(n)-yy*a(1,n)*ms(n)
308
309 vx_ms(i) = v(1,n)*ms(n)
310 vy_ms(i) = v(2,n)*ms(n)
311 vz_ms(i) = v(3,n)*ms(n)
312
313 vxx_vec(i) = vr(1,n)*in(n)+yy*v(3,n)*ms(n)-zz*v(2,n)*ms(n)
314 vyy_vec(i) = vr(2,n)*in(n)+zz*v(1,n)*ms(n)-xx*v(3,n)*ms(n)
315 vzz_vec(i) = vr(3,n)*in(n)+xx*v(2,n)*ms(n)-yy*v(1,n)*ms(n)
316 ENDDO
317
318
332
333 ENDIF
334
336
337
338 IF(itask==0) THEN
339 buf_s(1:6) =
iner_6(1:6,itask+1)
340 buf_s(7:12) =
ax_ms_6(1:6,itask+1)
341 buf_s(13:18) =
ay_ms_6(1:6,itask+1)
342 buf_s(19:24) =
az_ms_6(1:6,itask+1)
343
344 buf_s(25:30) =
axx_6(1:6,itask+1)
345 buf_s(31:36) =
ayy_6(1:6,itask+1)
346 buf_s(37:42) =
azz_6(1:6,itask+1)
347
348 buf_s(43:48) =
vx_ms_6(1:6,itask+1)
349 buf_s(49:54) =
vy_ms_6(1:6,itask+1)
350 buf_s(55:60) =
vz_ms_6(1:6,itask+1)
351
352 buf_s(61:66) =
vxx_6(1:6,itask+1)
353 buf_s(67:72) =
vyy_6(1:6,itask+1)
354 buf_s(73:78) =
vzz_6(1:6,itask+1)
355
356 buf_r(1:78) = zero
357
358 IF(nthread>1) THEN
359 DO i=2,nthread
360 buf_s(1:6) = buf_s(1:6) +
iner_6(1:6,i)
361 buf_s(7:12) = buf_s(7:12) +
ax_ms_6(1:6,i)
362 buf_s(13:18) = buf_s(13:18) +
ay_ms_6(1:6,i)
363 buf_s(19:24) = buf_s(19:24) +
az_ms_6(1:6,i)
364
365 buf_s(25:30) = buf_s(25:30) +
axx_6(1:6,i)
366 buf_s(31:36) = buf_s(31:36) +
ayy_6(1:6,i)
367 buf_s(37:42) = buf_s(37:42) +
azz_6(1:6,i)
368
369 buf_s(43:48) = buf_s(43:48) +
vx_ms_6(1:6,i)
370 buf_s(49:54) = buf_s(49:54) +
vy_ms_6(1:6,i)
371 buf_s(55:60) = buf_s(55:60) +
vz_ms_6(1:6,i)
372
373 buf_s(61:66) = buf_s(61:66) +
vxx_6(1:6,i)
374 buf_s(67:72) = buf_s(67:72) +
vyy_6(1:6,i)
375 buf_s(73:78) = buf_s(73:78) +
vzz_6(1:6,i)
376 ENDDO
377 ENDIF
378
379 IF(nspmd>1) THEN
380 CALL spmd_allreduce(buf_s,buf_r,13*6,spmd_sum,
cyl_join(n_joint)%COMM_MPI%COMM)
381 ELSE
382 buf_r(1:78) = buf_s(1:78)
383 ENDIF
384
385 DO i=1,6
386 iner_global = iner_global + buf_r(i)
387 ax_global = ax_global + buf_r(6+i)
388 ay_global = ay_global + buf_r(12+i)
389 az_global = az_global + buf_r(18+i)
390
391 axx_global = axx_global + buf_r(24+i)
392 ayy_global = ayy_global + buf_r(30+i)
393 azz_global = azz_global + buf_r(36+i)
394
395 vx_global = vx_global + buf_r(42+i)
396 vy_global = vy_global + buf_r(48+i)
397 vz_global = vz_global + buf_r(54+i)
398
399 vxx_global = vxx_global + buf_r(60+i)
400 vyy_global = vyy_global + buf_r(66+i)
401 vzz_global = vzz_global + buf_r(72+i)
402 ENDDO
403 ENDIF
404
405
407
408
409 iner = iner_global
410 ax = ax_global
411 ay = ay_global
412 az = az_global
413
414 axx = axx_global
415 ayy = ayy_global
416 azz = azz_global
417
418 vx = vx_global
419 vy = vy_global
420 vz = vz_global
421
422 vxx = vxx_global
423 vyy = vyy_global
424 vzz = vzz_global
425
426 a0=n1*ax+n2*ay+n3*az
427 ax=ax-n1*a0
428 ay=ay-n2*a0
429 az=az-n3*a0
430 a0=n1*axx+n2*ayy+n3*azz
431 axx=axx-n1*a0
432 ayy=ayy-n2*a0
433 azz=azz-n3*a0
434
435 a0=n1*vx+n2*vy+n3*vz
436 vx=vx-n1*a0
437 vy=vy-n2*a0
438 vz=vz-n3*a0
439 a0=n1*vxx+n2*vyy+n3*vzz
440 vxx=vxx-n1*a0
441 vyy=vyy-n2*a0
442 vzz=vzz-n3*a0
443
444
445 IF(
cyl_join(n_joint)%PROC_MAIN==ispmd+1)
THEN
446#include "lockon.inc"
447 fs(1)=fs(1)+ax*dt12
448 fs(2)=fs(2)+ay*dt12
449 fs(3)=fs(3)+az*dt12
450 fs(4)=fs(4)+axx*dt12
451 fs(5)=fs(5)+ayy*dt12
452 fs(6)=fs(6)+azz*dt12
453#include "lockoff.inc"
454 ENDIF
455
456 IF (masse>zero) THEN
457 ax=ax/masse
458 ay=ay/masse
459 az=az/masse
460 ENDIF
461 IF (iner>zero) THEN
462 axx=axx/iner
463 ayy=ayy/iner
464 azz=azz/iner
465 ENDIF
466 IF (masse>zero) THEN
467 vx=vx/masse
468 vy=vy/masse
469 vz=vz/masse
470 ENDIF
471 IF (iner>zero) THEN
472 vxx=vxx/iner
473 vyy=vyy/iner
474 vzz=vzz/iner
475 ENDIF
476
477
478
479
480
481
482 first = 1 + itask * number_node / nthread
483 last = (itask+1) * number_node / nthread
484 DO i=first,last
486
487 xx=x(1,n)-xcdg
488 yy=x(2,n)-ycdg
489 zz=x(3,n)-zcdg
490
491 rr=n1*xx+n2*yy+n3*zz
492 xx=n1*rr
493 yy=n2*rr
494 zz=n3*rr
495
496 a0=n1*a(1,n)+n2*a(2,n)+n3*a(3,n)
497 a(1,n)=ax-yy*azz+zz*ayy+n1*a0
498 a(2,n)=ay-zz*axx+xx*azz+n2*a0
499 a(3,n)=az-xx*ayy+yy*axx+n3*a0
500
501 a0=n1*ar(1,n)+n2*ar(2,n)+n3*ar(3,n)
502 ar(1,n)=axx+n1*a0
503 ar(2,n)=ayy+n2*a0
504 ar(3,n)=azz+n3*a0
505
506 a0=n1*v(1,n)+n2*v(2,n)+n3*v(3,n)
507 v(1,n)=vx-yy*vzz+zz*vyy+n1*a0
508 v(2,n)=vy-zz*vxx+xx*vzz+n2*a0
509 v(3,n)=vz-xx*vyy+yy*vxx+n3*a0
510
511 a0=n1*vr(1,n)+n2*vr(2,n)+n3*vr(3,n)
512 vr(1,n)=vxx+n1*a0
513 vr(2,n)=vyy+n2*a0
514 vr(3,n)=vzz+n3*a0
515 ENDDO
516
517
519
520
521
522 IF(itask==0) THEN
523 DEALLOCATE( mass )
524 DEALLOCATE( x_ms,y_ms,z_ms )
525
526 DEALLOCATE( iner_vec )
527 DEALLOCATE(ax_ms,ay_ms,az_ms)
528 DEALLOCATE(axx_vec,ayy_vec,azz_vec)
529 DEALLOCATE(vx_ms,vy_ms,vz_ms)
530 DEALLOCATE(vxx_vec,vyy_vec,vzz_vec)
531
539
540 DEALLOCATE( buf_s,buf_r)
541 ENDIF
542
543
545
546 RETURN
real(kind=8), dimension(:,:), allocatable, save azz_6
real(kind=8), dimension(:,:), allocatable, save vyy_6
real(kind=8), dimension(:,:), allocatable, save mass_6
real(kind=8), dimension(:,:), allocatable, save vy_ms_6
real(kind=8), dimension(:,:), allocatable, save az_ms_6
real(kind=8), dimension(:,:), allocatable, save ayy_6
real(kind=8), dimension(:,:), allocatable, save vzz_6
real(kind=8), dimension(:,:), allocatable, save ax_ms_6
real(kind=8), dimension(:,:), allocatable, save y_ms_6
real(kind=8), dimension(:,:), allocatable, save vz_ms_6
real(kind=8), dimension(:,:), allocatable, save ay_ms_6
type(joint_type), dimension(:), allocatable cyl_join
real(kind=8), dimension(:,:), allocatable, save vx_ms_6
real(kind=8), dimension(:,:), allocatable, save vxx_6
real(kind=8), dimension(:,:), allocatable, save iner_6
real(kind=8), dimension(:,:), allocatable, save x_ms_6
real(kind=8), dimension(:,:), allocatable, save axx_6
real(kind=8), dimension(:,:), allocatable, save z_ms_6
subroutine sum_6_float(jft, jlt, f, f6, n)