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, 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(
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
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
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
296
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
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 IF (dr12 < zero .AND. dr23 < zero) THEN
317 dry=-dry
318 ELSEIF (dr23 < zero .AND. dr31 < zero) THEN
319 drz=-drz
320 ELSEIF (dr31 < zero .AND. 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
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
353 ENDIF
354
355
356 IF(nspmd > 1)
CALL spmd_rbcast(xframe,xframe,nxframe,numfram+1,0,2)
357
358 RETURN
subroutine spmd_rbcast(tabi, tabr, n1, n2, from, add)