31
32
33
34#include "implicit_f.inc"
35
36
37
38#include "com01_c.inc"
39#include "com04_c.inc"
40#include "com08_c.inc"
41#include "param_c.inc"
42#include "task_c.inc"
43
44
45
46 INTEGER, intent(IN) :: IFRAME(LISKN,NUMFRAM+1)
47 my_real,
intent(INOUT) :: xframe(nxframe,numfram+1)
48 my_real,
intent(IN) :: x(3,numnod), v(3,numnod), a(3,numnod), ar(3,numnod)
49
50
51
52 INTEGER N, N1, N2, N3, K, IMOV, IDIR
53 my_real o(3), p(9), pp1, pp3, pp2, pold(9),
54 . dr11, dr12, dr13,
55 . dr21, dr22, dr23,
56 . dr31, dr32, dr33,
57 . xpi, cs, r, sn, rs2, drx, dry, drz, vrx, vry, vrz, dtinv
58
59
60
61 pp1 = zero
62 pp2 = zero
63 pp3 = zero
64 p(1:9) = zero
65 IF(ispmd == 0) THEN
66 xpi=pi
67 DO n=1,numfram
68 n1=iframe(1,n+1)
69 n2=iframe(2,n+1)
70 n3=iframe(3,n+1)
71 imov=iframe(5,n+1)
72 IF(n1+n2+n3 == 0) THEN
73
74 ELSEIF (n2+n3 == 0) THEN
75
76 xframe(16,n+1)=ar(1,n1)
77 xframe(17,n+1)=ar(2,n1)
78 xframe(18,n+1)=ar(3,n1)
79 IF(nxframe >= 36)THEN
80 xframe(28,n+1)=a(1,n1)
81 xframe(29,n+1)=a(2,n1)
82 xframe(30,n+1)=a(3,n1)
83 ENDIF
84 ELSE
85
86
87 pold(1)=xframe(1,n+1)
88 pold(2)=xframe(2,n+1)
89 pold(3)=xframe(3,n+1)
90 pold(4)=xframe(4,n+1)
91 pold(5)=xframe(5,n+1)
92 pold(6)=xframe(6,n+1)
93 pold(7)=xframe(7,n+1)
94 pold(8)=xframe(8,n+1)
95 pold(9)=xframe(9,n+1)
96
97 o(1)=x(1,n1)+dt2*(v(1,n1)+dt12*a(1,n1))
98 o(2)=x(2,n1)+dt2*(v(2,n1)+dt12*a(2,n1))
99 o(3)=x(3,n1)+dt2*(v(3,n1)+dt12*a(3,n1))
100 IF (imov == 1) THEN
101 idir = iframe(6,n+1)
102
103 IF (idir == 1) THEN
104 p(1)=x(1,n2)+dt2*(v(1,n2)+dt12*a(1,n2))-o(1)
105 p(2)=x(2,n2)+dt2*(v(2,n2)+dt12*a(2,n2))-o(2)
106 p(3)=x(3,n2)+dt2*(v(3,n2)+dt12*a(3,n2))-o(3)
107 ELSEIF (idir == 2) THEN
108 p(4)=x(1,n2)+dt2*(v(1,n2)+dt12*a(1,n2))-o(1)
109 p(5)=x(2,n2)+dt2*(v(2,n2)+dt12*a(2,n2))-o(2)
110 p(6)=x(3,n2)+dt2*(v(3,n2)+dt12*a(3,n2))-o(3)
111 ELSEIF (idir == 3) THEN
112 p(7)=x(1,n2)+dt2*(v(1,n2)+dt12*a(1,n2))-o(1)
113 p(8)=x(2,n2)+dt2*(v(2,n2)+dt12*a(2,n2))-o(2)
114 p(9)=x(3,n2)+dt2*(v(3,n2)+dt12*a(3,n2))-o(3)
115 ENDIF
116
117 IF (idir == 1) THEN
118 p(4)=x(1,n3)+dt2*(v(1,n3)+dt12*a(1,n3))-o(1)
119 p(5)=x(2,n3)+dt2*(v(2,n3)+dt12*a(2,n3))-o(2)
120 p(6)=x(3,n3)+dt2*(v(3,n3)+dt12*a(3,n3))-o(3)
121 ELSEIF (idir == 2) THEN
122 p(7)=x(1,n3)+dt2*(v(1,n3)+dt12*a(1,n3))-o(1)
123 p(8)=x(2,n3)+dt2*(v(2,n3)+dt12*a(2,n3))-o(2)
124 p(9)=x(3,n3)+dt2*(v(3,n3)+dt12*a(3,n3))-o(3)
125 ELSEIF (idir == 3) THEN
126 p(1)=x(1,n3)+dt2*(v(1,n3)+dt12*a(1,n3))-o(1)
127 p(2)=x(2,n3)+dt2*(v(2,n3)+dt12*a(2,n3))-o(2)
128 p(3)=x(3,n3)+dt2*(v(3,n3)+dt12*a(3,n3))-o(3)
129 ENDIF
130
131
132
133 IF (idir == 1) THEN
134 pp1=sqrt(p(1)*p(1)+p(2)*p(2)+p(3)*p(3))
135 IF(pp1 == zero)THEN
136 p(1)=one
137 p(2)=zero
138 p(3)=zero
139 pp1 =one
140 ENDIF
141 ELSEIF (idir == 2) THEN
142 pp1=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
143 IF(pp1 == zero)THEN
144 p(4)=one
145 p(5)=zero
146 p(6)=zero
147 pp1 =one
148 ENDIF
149 ELSEIF (idir == 3) THEN
150 pp1=sqrt(p(7)*p(7)+p(8)*p(8)+p(9)*p(9))
151 IF(pp1==zero)THEN
152 p(7)=one
153 p(8)=zero
154 p(9)=zero
155 pp1 =one
156 ENDIF
157 ENDIF
158
159 IF (idir == 1) THEN
160 p(7)=p(2)*p(6)-p(3)*p(5)
161 p(8)=p(3)*p(4)-p(1)*p(6)
162 p(9)=p(1)*p(5)-p(2)*p(4)
163 pp3=sqrt(p(7)*p(7)+p(8)*p(8)+p(9)*p(9))
164 ELSEIF (idir == 2) THEN
165 p(1)=p(5)*p(9)-p(6)*p(8)
166 p(2)=p(6)*p(7)-p(4)*p(9)
167 p(3)=p(4)*p(8)-p(5)*p(7)
168 pp3=sqrt(p(1)*p(1)+p(2)*p(2)+p(3)*p(3))
169 ELSEIF (idir == 3) THEN
170 p(4)=p(8)*p(3)-p(9)*p(2)
171 p(5)=p(9)*p(1)-p(7)*p(3)
172 p(6)=p(7)*p(2)-p(8)*p(1)
173 pp3=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
174 ENDIF
175
176
177
178 IF (idir == 1) THEN
179 IF(pp3 == zero)THEN
180 IF(p(1) == zero)THEN
181 p(4)=pp1
182 p(5)=p(2)
183 ELSE
184 p(4)=p(1)
185 p(5)=abs(p(2))+pp1
186 ENDIF
187 p(6)=p(3)
188 p(7)=p(2)*p(6)-p(3)*p(5)
189 p(8)=p(3)*p(4)-p(1)*p(6)
190 p(9)=p(1)*p(5)-p(2)*p(4)
191 pp3=sqrt(p(7)*p(7)+p(8)*p(8)+p(9)*p(9))
192 ENDIF
193 ELSEIF (idir == 2) THEN
194 IF(pp3 == zero)THEN
195 IF(p(4) == zero)THEN
196 p(7)=pp1
197 p(8)=p(5)
198 ELSE
199 p(7)=p(4)
200 p(8)=abs(p(5))+pp1
201 ENDIF
202 p(9)=p(6)
203 p(1)=p(5)*p(9)-p(6)*p(8)
204 p(2)=p(6)*p(7)-p(4)*p(9)
205 p(3)=p(4)*p(8)-p(5)*p(7)
206 pp3=sqrt(p(1)*p(1)+p(2)*p(2)+p(3)*p(3))
207 ENDIF
208 ELSEIF (idir == 3) THEN
209 IF(pp3 == zero)THEN
210 IF(p(7) == zero)THEN
211 p(1)=pp1
212 p(2)=p(8)
213 ELSE
214 p(1)=p(7)
215 p(2)=abs(p(8))+pp1
216 ENDIF
217 p(3)=p(9)
218 p(4)=p(8)*p(3)-p(9)*p(2)
219 p(5)=p(9)*p(1)-p(7)*p(3)
220 p(6)=p(7)*p(2)-p(8)*p(1)
221 pp3=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
222 ENDIF
223 ENDIF
224
225 IF (idir == 1) THEN
226 p(4)=p(8)*p(3)-p(9)*p(2)
227 p(5)=p(9)*p(1)-p(7)*p(3)
228 p(6)=p(7)*p(2)-p(8)*p(1)
229 pp2=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
230 ELSEIF (idir == 2) THEN
231 p(7)=p(2)*p(6)-p(3)*p(5)
232 p(8)=p(3)*p(4)-p(1)*p(6)
233 p(9)=p(1)*p(5)-p(2)*p(4)
234 pp2=sqrt(p(7)*p(7)+p(8)*p(8)+p(9)*p(9))
235 ELSEIF (idir == 3) THEN
236 p(1)=p(5)*p(9)-p(6)*p(8)
237 p(2)=p(6)*p(7)-p(4)*p(9)
238 p(3)=p(4)*p(8)-p(5)*p(7)
239 pp2=sqrt(p(1)*p(1)+p(2)*p(2)+p(3)*p(3))
240 ENDIF
241
242 ELSEIF (imov == 2) THEN
243
244 p(1)=x(1,n3)+dt2*(v(1,n3)+dt12*a(1,n3))-o(1)
245 p(2)=x(2,n3)+dt2*(v(2,n3)+dt12*a(2,n3))-o(2)
246 p(3)=x(3,n3)+dt2*(v(3,n3)+dt12*a(3,n3))-o(3)
247
248 p(7)=x(1,n2)+dt2*(v(1,n2)+dt12*a(1,n2))-o(1)
249 p(8)=x(2,n2)+dt2*(v(2,n2)+dt12*a(2,n2))-o(2)
250 p(9)=x(3,n2)+dt2*(v(3,n2)+dt12*a(3,n2))-o(3)
251
252 pp3=sqrt(p(7)*p(7)+p(8)*p(8)+p(9)*p(9))
253 IF(pp3 == zero)THEN
254 p(7)=zero
255 p(8)=zero
256 p(9)=one
257 pp3 =one
258 ENDIF
259
260 p(4)=p(8)*p(3)-p(9)*p(2)
261 p(5)=p(9)*p(1)-p(7)*p(3)
262 p(6)=p(7)*p(2)-p(8)*p(1)
263 pp2=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
264
265 IF(pp2 == zero)THEN
266 IF(p(7) == zero)THEN
267 p(1)=pp3
268 p(2)=p(8)
269 ELSE
270 p(1)=p(7)
271 p(2)=abs(p(8))+pp3
272 ENDIF
273 p(3)=p(9)
274 p(4)=p(8)*p(3)-p(9)*p(2)
275 p(5)=p(9)*p(1)-p(7)*p(3)
276 p(6)=p(7)*p(2)-p(8)*p(1)
277 pp2=sqrt(p(4)*p(4)+p(5)*p(5)+p(6)*p(6))
278 ENDIF
279 ! calculation of x' = Y' x z'
280 P(1)=P(5)*P(9)-P(6)*P(8)
281 P(2)=P(6)*P(7)-P(4)*P(9)
282 P(3)=P(4)*P(8)-P(5)*P(7)
283 PP1=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
284 ENDIF
285 ! norm
286 P(1)=P(1)/PP1
287 P(2)=P(2)/PP1
288 P(3)=P(3)/PP1
289 P(4)=P(4)/PP2
290 P(5)=P(5)/PP2
291 P(6)=P(6)/PP2
292 P(7)=P(7)/PP3
293 P(8)=P(8)/PP3
294 P(9)=P(9)/PP3
295 ! ANGULAR VELOCITY at TIME T+1/2
296 ! rotation increment DR=Transpose( P Transpose(POLD) )
297 DR11=P(1)*POLD(1)+P(4)*POLD(4)+P(7)*POLD(7)
298 DR21=P(1)*POLD(2)+P(4)*POLD(5)+P(7)*POLD(8)
299 DR31=P(1)*POLD(3)+P(4)*POLD(6)+P(7)*POLD(9)
300 DR12=P(2)*POLD(1)+P(5)*POLD(4)+P(8)*POLD(7)
301 DR22=P(2)*POLD(2)+P(5)*POLD(5)+P(8)*POLD(8)
302 DR32=P(2)*POLD(3)+P(5)*POLD(6)+P(8)*POLD(9)
303 DR13=P(3)*POLD(1)+P(6)*POLD(4)+P(9)*POLD(7)
304 DR23=P(3)*POLD(2)+P(6)*POLD(5)+P(9)*POLD(8)
305 DR33=P(3)*POLD(3)+P(6)*POLD(6)+P(9)*POLD(9)
306 ! rotation increment vector.
307 CS=(DR11+DR22+DR33-ONE)*HALF
308 IF (CS >= ONE) THEN
309 DRX=(DR23-DR32)*HALF
310 DRY=(DR31-DR13)*HALF
311 DRZ=(DR12-DR21)*HALF
312 ELSEIF (CS <= -ONE) THEN
313 DRX=XPI*SQRT((DR11+ONE)*HALF)
314 DRY=XPI*SQRT((DR22+ONE)*HALF)
315 DRZ=XPI*SQRT((DR33+ONE)*HALF)
316.AND. IF (DR12 < ZERO DR23 < ZERO) THEN
317 DRY=-DRY
318.AND. ELSEIF (DR23 < ZERO DR31 < ZERO) THEN
319 DRZ=-DRZ
320.AND. ELSEIF (DR31 < ZERO DR12 < ZERO) THEN
321 DRX=-DRX
322 ELSEIF (DR12 < ZERO) THEN
323 DRZ=-DRZ
324 ELSEIF (DR23 < ZERO) THEN
325 DRX=-DRX
326 ELSEIF (DR31 < ZERO) THEN
327 DRY=-DRY
328 ENDIF
329 ELSE
330 R=ACOS(CS)
331 SN=SIN(R)
332 RS2=R/(TWO*SN)
333 DRX=(DR23-DR32)*RS2
334 DRY=(DR31-DR13)*RS2
335 DRZ=(DR12-DR21)*RS2
336 ENDIF
337 VRX=DRX/MAX(EM20,DT2)
338 VRY=DRY/MAX(EM20,DT2)
339 VRZ=DRZ/MAX(EM20,DT2)
340 ! RETRIEVE ANGULAR ACCELERATION AT TIME T
341 DTINV=ONE/DT12
342 XFRAME(16,N+1)=(VRX-XFRAME(13,N+1))*DTINV
343 XFRAME(17,N+1)=(VRY-XFRAME(14,N+1))*DTINV
344 XFRAME(18,N+1)=(VRZ-XFRAME(15,N+1))*DTINV
345 IF(NXFRAME >= 36)THEN
346 XFRAME(28,N+1)=A(1,N1)
347 XFRAME(29,N+1)=A(2,N1)
348 XFRAME(30,N+1)=A(3,N1)
349 ENDIF
350 ENDIF
351
352 ENDDO !next N=1,NUMFRAM
353 ENDIF
354
355 ! SPMD : domain P0 sends data to other domains
356 IF(NSPMD > 1) CALL SPMD_RBCAST(XFRAME,XFRAME,NXFRAME,NUMFRAM+1,0,2)
357
358 RETURN