40 SUBROUTINE lecsubmod(ISUBMOD,X,UNITAB,ITABM1,RTRANS,ITAB,LSUBMODEL,IS_DYNA)
52#include "implicit_f.inc"
60 TYPE (),
INTENT(IN) ::UNITAB
61 INTEGER ITABM1(*),ISUBMOD(*),ITAB(*)
63 . x(3,*),rtrans(ntransf,*)
69 INTEGER I,J,ID,IDU,ISU,NTRANS,UID,
70 . ITRANSSUB,IDSUBOK(NSUBMOD),ISUBOK,IGU,I0,
71 . I1,N0,N1,IFLAGUNIT,IDNOD,NTAG,CTAG,INUM,SIDTRANS,
73 . CUR_SUBMOD,SUB_LEVEL,NUMNUSR,NUMNUSR2
74 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGNODSUB
75 INTEGER :: WORK(70000)
76 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INDEX,INDEX1,TAGNODSUB_TMP,IDNODSUB
77 CHARACTER(LEN=NCHARKEY) :: KEY
78 CHARACTER(LEN=NCHARLINE) ::CART,MESS
79 CHARACTER(LEN=NCHARTITLE) :: TITR
80 CHARACTER(LEN=NCHARFIELD) ::VERS_IN,STRING
84 . tx,ty,tz,angle,fac_l,x0(3),x1(3),rot(9),s,xp,yp,zp,
85 . xcold(3), xcnew(3), sx, sy, sz
86 DATA mess/
'SUBMODEL DEFINITION '/
94 ALLOCATE(tagnodsub(numnod))
96 is_available = .false.
102 CALL cpp_nodes_count(numnusr,numnusr2)
103 ALLOCATE( index(2*numnusr))
107 ALLOCATE( index1(2*numnod) )
111 ALLOCATE( tagnodsub_tmp(numnusr) )
115 ALLOCATE( idnodsub(numnusr) )
124 CALL cpp_node_sub_tag_dyna(tagnodsub_tmp,idnodsub)
129 CALL my_orders( 0, work, idnodsub, index, numnusr , 1)
130 CALL my_orders( 0, work, itab, index1, numnod , 1)
134 DO WHILE(j <= numnusr .AND. i <= numnod)
136 IF(itab(index1(i)) == idnodsub(index(j)))
THEN
137 tagnodsub(index1(i)) = tagnodsub_tmp(index(j))
140 ELSE IF(itab(index1(i)) < idnodsub(index(j)))
THEN
150 CALL cpp_node_sub_tag(tagnodsub)
166 . option_titr = titr)
168 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
170 IF (itranssub /= 0)
THEN
173 IF (lsubmodel(j)%NOSUBMOD == itranssub)
THEN
174 lsubmodel(j)%NBTRANS = lsubmodel(j)%NBTRANS + 1
181 sidtrans = lsubmodel(i)%NBTRANS
182 ALLOCATE(lsubmodel(i)%IDTRANS(sidtrans))
196 . option_titr = titr)
198 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
199 IF (itranssub /= 0)
THEN
202 IF (lsubmodel(j)%NOSUBMOD == itranssub)
THEN
203 idsubok(j) = idsubok(j)+1
204 lsubmodel(j)%IDTRANS(idsubok(j)) = i
210 IF (itranssub /= 0 .AND. isubok == 0)
THEN
225 sub_level = lsubmodel(i)%LEVEL
226 DO WHILE (sub_level /= 0)
227 IF (lsubmodel(cur_submod)%NBTRANS /= 0)
THEN
228 DO j = 1,lsubmodel(cur_submod)%NBTRANS
229 ity = rtrans(lsubmodel(cur_submod)%IDTRANS(j),2)
231 tx=rtrans(lsubmodel(cur_submod)%IDTRANS(j),15)
232 ty=rtrans(lsubmodel(cur_submod)%IDTRANS(j),16)
233 tz=rtrans(lsubmodel(cur_submod)%IDTRANS(j),17)
235 IF(tagnodsub(k) == i)
THEN
243 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
246 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
250 IF(tagnodsub(k) == i)
CALL euler_vrot(x0,x(1,k),rot)
253 tx = rtrans(lsubmodel(cur_submod)%IDTRANS(j),15)
254 ty = rtrans(lsubmodel(cur_submod)%IDTRANS(j),16)
255 tz = rtrans(lsubmodel(cur_submod)%IDTRANS(j),17)
257 rot(k) = rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
260 IF(tagnodsub(k) == i)
THEN
261 xp = rot(1)*x(1,k) + rot(4)*x(2,k) + rot(7)*x(3,k) + tx
262 yp = rot(2)*x(1,k) + rot(5)*x(2,k) + rot(8)*x(3,k) + ty
263 zp = rot(3)*x(1,k) + rot(6)*x(2,k) + rot(9)*x(3,k) + tz
271 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
274 xcold(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
277 xcnew(k) = rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+14)
280 IF(tagnodsub(k) == i)
THEN
281 xp = x(1,k) - xcold(1)
282 yp = x(2,k) - xcold(2)
283 zp = x(3,k) - xcold(3)
284 x(1,k) = xcnew(1) + rot(1)*xp + rot(4)*yp + rot(7)*zp
285 x(2,k) = xcnew(2) + rot(2)*xp + rot(5)*yp + rot(8)*zp
286 x(3,k) = xcnew(3) + rot(3)*xp + rot(6)*yp + rot(9)*zp
291 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
294 x1(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+14)
299 s = one/
max(sqrt(tx*tx + ty*ty + tz*tz),em20)
304 IF(tagnodsub(k) == i)
THEN
308 s = sx*tx + sy*ty + sz*tz
309 x(1,k) = x(1,k) - two*tx*s
310 x(2,k) = x(2,k) - two*ty*s
311 x(3,k) = x(3,k) - two*tz*s
315 sx = rtrans(lsubmodel(cur_submod)%IDTRANS(j),20)
316 sy = rtrans(lsubmodel(cur_submod)%IDTRANS(j),21)
317 sz = rtrans(lsubmodel(cur_submod)%IDTRANS(j),22)
319 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
322 IF(tagnodsub(k) == i)
THEN
323 x(1,k) = x0(1) + x(1,k) * sx
324 x(2,k) = x0(2) + x(2,k) * sy
325 x(3,k) = x0(3) + x(3,k) * sz
331 sub_level = sub_level - 1
332 cur_submod = lsubmodel(cur_submod)%IFATHER
337 IF (
ALLOCATED(index))
DEALLOCATE(index)
338 IF (
ALLOCATED(index1))
DEALLOCATE(index1)
339 IF (
ALLOCATED(tagnodsub_tmp))
DEALLOCATE(tagnodsub_tmp)
340 IF (
ALLOCATED(idnodsub))
DEALLOCATE(idnodsub)
342 DEALLOCATE(tagnodsub)
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)