42 SUBROUTINE lecsubmod(ISUBMOD,X,UNITAB,ITABM1,RTRANS,
43 . ITAB,LSUBMODEL,IS_DYNA,ISKWN,LISKN,
44 . SKEW,LSKEW,SISKWN,SSKEW)
53 USE transform_translate_in_local_skew_mod,
ONLY : transform_translate_in_local_skew
57#include "implicit_f.inc"
65 TYPE (UNIT_TYPE_),
INTENT(IN) ::UNITAB
66 INTEGER ITABM1(*),ISUBMOD(*),ITAB(*)
68 . x(3,*),rtrans(ntransf,*)
71 INTEGER,
INTENT(IN) :: LISKN,LSKEW,SISKWN,SSKEW
72 INTEGER,
INTENT(IN) :: ISKWN(LISKN,SISKWN/LISKN)
73 my_real,
INTENT(IN) :: skew(lskew,sskew/lskew)
77 INTEGER I,J,ID,IDU,ISU,NTRANS,UID,
81 . cur_submod,sub_level,numnusr,numnusr2,isk,cnt
82 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGNODSUB,NODESSUB
83 INTEGER :: WORK(70000)
84 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INDEX,INDEX1,TAGNODSUB_TMP,IDNODSUB
85 CHARACTER(LEN=NCHARKEY) :: KEY
86 CHARACTER(LEN=NCHARLINE) ::CART,MESS
87 CHARACTER(LEN=NCHARTITLE) :: TITR
88 CHARACTER(LEN=NCHARFIELD) ::VERS_IN,STRING
92 . tx,ty,tz,angle,fac_l,x0(3),x1(3),rot(9),s,xp,yp,zp,
93 . xcold(3), xcnew(3), sx, sy, sz
94 DATA mess/
'SUBMODEL DEFINITION '/
102 ALLOCATE(tagnodsub(numnod))
104 is_available = .false.
109 ALLOCATE(nodessub(numnod))
113 CALL cpp_nodes_count(numnusr,numnusr2)
114 ALLOCATE( index(2*numnusr))
118 ALLOCATE( index1(2*numnod) )
122 ALLOCATE( tagnodsub_tmp(numnusr) )
126 ALLOCATE( idnodsub(numnusr) )
135 CALL cpp_node_sub_tag_dyna(tagnodsub_tmp,idnodsub)
140 CALL my_orders( 0, work, idnodsub, index, numnusr , 1)
141 CALL my_orders( 0, work, itab, index1, numnod , 1)
145 DO WHILE(j <= numnusr .AND. i <= numnod)
147 IF(itab(index1(i)) == idnodsub(index(j)))
THEN
148 tagnodsub(index1(i)) = tagnodsub_tmp(index(j))
151 ELSE IF(itab(index1(i)) < idnodsub(index(j)))
THEN
161 CALL cpp_node_sub_tag(tagnodsub)
177 . option_titr = titr)
179 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
181 IF (itranssub /= 0)
THEN
184 IF (lsubmodel(j)%NOSUBMOD == itranssub)
THEN
185 lsubmodel(j)%NBTRANS = lsubmodel(j)%NBTRANS + 1
192 sidtrans = lsubmodel(i)%NBTRANS
193 ALLOCATE(lsubmodel(i)%IDTRANS(sidtrans))
194 lsubmodel(i)%IDTRANS = 0
207 . option_titr = titr)
209 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
210 IF (itranssub /= 0)
THEN
213 IF (lsubmodel(j)%NOSUBMOD == itranssub)
THEN
214 idsubok(j) = idsubok(j)+1
215 lsubmodel(j)%IDTRANS(idsubok(j)) = i
221 IF (itranssub /= 0 .AND. isubok == 0)
THEN
236 sub_level = lsubmodel(i)%LEVEL
237 DO WHILE (sub_level /= 0)
238 IF (lsubmodel(cur_submod)%NBTRANS /= 0)
THEN
239 DO j = 1,lsubmodel(cur_submod)%NBTRANS
240 ity = rtrans(lsubmodel(cur_submod)%IDTRANS(j),2)
242 tx=rtrans(lsubmodel(cur_submod)%IDTRANS(j),15)
243 ty=rtrans(lsubmodel(cur_submod)%IDTRANS(j),16)
244 tz=rtrans(lsubmodel(cur_submod)%IDTRANS(j),17)
245 isk = int(rtrans(lsubmodel(cur_submod)%IDTRANS(j),23))
255 IF(tagnodsub(k) == i)
THEN
260 CALL transform_translate_in_local_skew(
261 . nodessub ,cnt ,x ,numnod , isk ,
262 . tx ,ty ,tz ,skew , lskew,
266 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
269 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
273 IF(tagnodsub(k) == i)
CALL euler_vrot(x0,x(1,k),rot)
276 tx = rtrans(lsubmodel(cur_submod)%IDTRANS(j),15)
277 ty = rtrans(lsubmodel(cur_submod)%IDTRANS(j),16)
278 tz = rtrans(lsubmodel(cur_submod)%IDTRANS(j),17)
280 rot(k) = rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
283 IF(tagnodsub(k) == i)
THEN
284 xp = rot(1)*x(1,k) + rot(4)*x(2,k) + rot(7)*x(3,k) + tx
285 yp = rot(2)*x(1,k) + rot(5)*x(2,k) + rot(8)*x(3,k) + ty
286 zp = rot(3)*x(1,k) + rot(6)*x(2,k) + rot(9)*x(3,k) + tz
294 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
297 xcold(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j
300 xcnew(k) = rtrans(lsubmodel(cur_submod
303 IF(tagnodsub(k) == i)
THEN
304 xp = x(1,k) - xcold(1)
305 yp = x(2,k) - xcold(2)
306 zp = x(3,k) - xcold(3)
307 x(1,k) = xcnew(1) + rot(1)*xp + rot(4)*yp + rot(7)*zp
308 x(2,k) = xcnew(2) + rot(2)*xp + rot(5)*yp + rot(8)*zp
309 x(3,k) = xcnew(3) + rot(3)*xp + rot(6)*yp + rot(9)*zp
314 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
317 x1(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+14)
322 s = one/
max(sqrt(tx*tx + ty*ty + tz*tz),em20)
327 IF(tagnodsub(k) == i)
THEN
331 s = sx*tx + sy*ty + sz*tz
332 x(1,k) = x(1,k) - two*tx*s
333 x(2,k) = x(2,k) - two*ty*s
334 x(3,k) = x(3,k) - two*tz*s
338 sx = rtrans(lsubmodel(cur_submod)%IDTRANS(j),20)
339 sy = rtrans(lsubmodel(cur_submod)%IDTRANS(j),21)
340 sz = rtrans(lsubmodel(cur_submod)%IDTRANS(j),22)
342 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
345 IF(tagnodsub(k) == i)
THEN
346 x(1,k) = x0(1) + x(1,k) * sx
347 x(2,k) = x0(2) + x(2,k) * sy
348 x(3,k) = x0(3) + x(3,k) * sz
354 sub_level = sub_level - 1
355 cur_submod = lsubmodel(cur_submod)%IFATHER
360 IF (
ALLOCATED(index))
DEALLOCATE(index)
361 IF (
ALLOCATED(index1))
DEALLOCATE(index1)
362 IF (
ALLOCATED(tagnodsub_tmp))
DEALLOCATE(tagnodsub_tmp)
363 IF (
ALLOCATED(idnodsub))
DEALLOCATE(idnodsub)
365 DEALLOCATE(tagnodsub)
366 IF(
ALLOCATED(nodessub))
DEALLOCATE(nodessub)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)