180
181
182
184
185
186
187#include "implicit_f.inc"
188
189
190
191#include "com04_c.inc"
192
193
194
195 INTEGER SUB_ID
196 TYPE(SUBMODEL_DATA) LSUBMODEL(*)
198 . x,y,z, rtrans(ntransf,*)
199
200
201
202 INTEGER I,L,K,IDSUBMODEL,ITY,SUB_LEVEL,CUR_SUBMOD
204 . rot(9),p(3),x0(3),x1(3),tx,ty,tz,xp,yp,zp,xcold(3),xcnew(3),
205 . sx,sy,sz,s
206
207 idsubmodel = 0
208 IF(sub_id /= 0) THEN
210 IF(lsubmodel(k)%NOSUBMOD == sub_id) THEN
211 idsubmodel = k
212 EXIT
213 ENDIF
214 ENDDO
215 ENDIF
216 cur_submod = idsubmodel
217 sub_level = lsubmodel(idsubmodel)%LEVEL
218 DO WHILE (sub_level /= 0)
219 DO i=1,lsubmodel(cur_submod)%NBTRANS
220 IF (lsubmodel(cur_submod)%IDTRANS(i) /= 0) THEN
221 ity = rtrans(lsubmodel(cur_submod)%IDTRANS(i),2)
222 IF (ity ==1 )THEN
223 tx = rtrans(lsubmodel(cur_submod)%IDTRANS(i),15)
224 ty = rtrans(lsubmodel(cur_submod)%IDTRANS(i),16)
225 tz = rtrans(lsubmodel(cur_submod)%IDTRANS(i),17)
226 x = x + tx
227 y = y + ty
228 z = z + tz
229 ELSEIF(ity ==2 )THEN
230 DO l=1,3
231 x0(l) = rtrans(lsubmodel(cur_submod)%IDTRANS(i),l+11)
232 ENDDO
233 DO l=1,9
234 rot(l) = rtrans(lsubmodel(cur_submod)%IDTRANS(i),l+2)
235 ENDDO
236 p(1) = x
237 p(2) = y
238 p(3) = z
240 x = p(1)
241 y = p(2)
242 z = p(3)
243 ELSEIF(ity ==3 )THEN
244 tx = rtrans(lsubmodel(cur_submod)%IDTRANS(i),15)
245 ty = rtrans(lsubmodel(cur_submod)%IDTRANS(i),16)
246 tz = rtrans(lsubmodel(cur_submod)%IDTRANS(i),17)
247 DO l=1,9
248 rot(l) = rtrans(lsubmodel(cur_submod)%IDTRANS(i),l+2)
249 ENDDO
250 xp = rot(1)*x + rot(4)*y + rot(7)*z + tx
251 yp = rot(2)*x + rot(5)*y + rot(8)*z + ty
252 zp = rot(3)*x + rot(6)*y + rot(9)*z + tz
253 x = xp
254 y = yp
255 z = zp
256 ELSEIF(ity ==4 )THEN
257 DO k=1,3
258 xcold(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(i),k+11)
259 ENDDO
260 DO k=1,3
261 xcnew(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(i),k+14)
262 ENDDO
263 DO k=1,9
264 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(i),k+2)
265 ENDDO
266 xp = x - xcold(1)
267 yp = y - xcold(2)
268 zp = z - xcold(3)
269 x = xcnew(1) + rot(1)*xp + rot(4)*yp + rot(7)*zp
270 y = xcnew(2) + rot(2)*xp + rot(5)*yp + rot(8)*zp
271 z = xcnew(3) + rot(3)*xp + rot(6)*yp + rot(9)*zp
272 ELSEIF (ity == 5)THEN
273 DO k=1,3
274 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(i),k+11)
275 ENDDO
276 DO k=1,3
277 x1(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(i),k+14)
278 ENDDO
279 tx = x1(1) - x0(1)
280 ty = x1(2) - x0(2)
281 tz = x1(3) - x0(3)
282 s = one/
max(sqrt(tx*tx + ty*ty + tz*tz),em20)
283 tx = tx*s
284 ty = ty*s
285 tz = tz*s
286 sx = x - x0(1)
287 sy = y - x0(2)
288 sz = z - x0(3)
289 s = sx*tx + sy*ty + sz*tz
290 x = x - two*tx*s
291 y = y - two*ty*s
292 z = z - two*tz*s
293 ELSEIF (ity == 6)THEN
294 DO l=1,3
295 x0(l) = rtrans(lsubmodel(cur_submod)%IDTRANS(i),l+11)
296 ENDDO
297 sx = rtrans(lsubmodel(cur_submod)%IDTRANS(i),20)
298 sy = rtrans(lsubmodel(cur_submod)%IDTRANS(i),21)
299 sz = rtrans(lsubmodel(cur_submod)%IDTRANS(i),22)
300 x = x0(1) + x * sx
301 y = x0(2) + y * sy
302 z = x0(3) + z * sz
303 ENDIF
304 ENDIF
305 ENDDO
306 sub_level = sub_level - 1
307 cur_submod = lsubmodel(cur_submod)%IFATHER
308 ENDDO
309
310
311 RETURN
subroutine euler_vrot(x0, x, rot)