45
46
47
53 USE transform_translate_in_local_skew_mod, ONLY : transform_translate_in_local_skew
54
55
56
57#include "implicit_f.inc"
58
59
60
61#include "com04_c.inc"
62
63
64
65 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
66 INTEGER ITABM1(*),ISUBMOD(*),ITAB(*)
68 . x(3,*),rtrans(ntransf,*)
69 TYPE(SUBMODEL_DATA) LSUBMODEL(*)
70 INTEGER IS_DYNA
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)
74
75
76
77 INTEGER I,J,ID,IDU,ISU,NTRANS,UID,
78 . ITRANSSUB,IDSUBOK(NSUBMOD),ISUBOK,IGU,I0,
79 . I1,N0,N1,IFLAGUNIT,IDNOD,NTAG,CTAG,INUM,SIDTRANS,
80 . IDSUB,ITY,K,
81 . CUR_SUBMOD,SUB_LEVEL,NUMNUSR,NUMNUSR2,,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
90 . bid
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 '/
95 LOGICAL IS_AVAILABLE
96
97
98
99 INTEGER USRTOS
101
102 ALLOCATE(tagnodsub(numnod))
103 isu = 0
104 is_available = .false.
105 uid = 0
106 tagnodsub = 0
107 numnusr = 0
108
109 ALLOCATE(nodessub(numnod))
110 nodessub = 0
111
112 IF(is_dyna /= 0)THEN
113 CALL cpp_nodes_count(numnusr,numnusr2)
114 ALLOCATE( index(2*numnusr))
115 DO i=1,2*numnusr
116 index(i)=i
117 ENDDO
118 ALLOCATE( index1(2*numnod) )
119 DO i=1,2*numnod
120 index1(i)=i
121 ENDDO
122 ALLOCATE( tagnodsub_tmp(numnusr) )
123 DO i=1,numnusr
124 tagnodsub_tmp(i)=i
125 ENDDO
126 ALLOCATE( idnodsub(numnusr) )
127 DO i=1,numnusr
128 idnodsub(i)=i
129 ENDDO
130 ENDIF
131
132
133
134 IF(is_dyna /= 0)THEN
135 CALL cpp_node_sub_tag_dyna(tagnodsub_tmp,idnodsub)
136
137
138
139
140 CALL my_orders( 0, work, idnodsub, index, numnusr , 1)
141 CALL my_orders( 0, work, itab, index1, numnod , 1)
142
143 i = 1
144 j = 1
145 DO WHILE(j <= numnusr .AND. i <= numnod)
146
147 IF(itab(index1(i)) == idnodsub(index(j))) THEN
148 tagnodsub(index1(i)) = tagnodsub_tmp(index(j))
149 i = i + 1
150 j = j + 1
151 ELSE IF(itab(index1(i)) < idnodsub(index(j))) THEN
152 i = i + 1
153 ELSE
154 j = j + 1
155 ENDIF
156 ENDDO
157
158
159
160 ELSE
161 CALL cpp_node_sub_tag(tagnodsub)
162 ENDIF
163
164
165
166
167
168
169
172 DO i=1,ntrans
173 titr = ''
176 . unit_id = uid,
177 . option_titr = titr)
178
179 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
180
181 IF (itranssub /= 0) THEN
182 isubok = 0
184 IF (lsubmodel(j)%NOSUBMOD == itranssub) THEN
185 lsubmodel(j)%NBTRANS = lsubmodel(j)%NBTRANS + 1
186 EXIT
187 ENDIF
188 ENDDO
189 ENDIF
190 ENDDO
192 sidtrans = lsubmodel(i)%NBTRANS
193 ALLOCATE(lsubmodel(i)%IDTRANS(sidtrans))
194 lsubmodel(i)%IDTRANS = 0
195 ENDDO
196
197
198
199
200 idsubok = 0
202 DO i=1,ntrans
203 titr = ''
206 . unit_id = uid,
207 . option_titr = titr)
208
209 CALL hm_get_intv(
'SUBMODEL',itranssub,is_available,lsubmodel)
210 IF (itranssub /= 0) THEN
211 isubok = 0
213 IF (lsubmodel(j)%NOSUBMOD == itranssub) THEN
214 idsubok(j) = idsubok(j)+1
215 lsubmodel(j)%IDTRANS(idsubok(j)) = i
216 isubok = 1
217 EXIT
218 ENDIF
219 ENDDO
220 ENDIF
221 IF (itranssub /= 0 .AND. isubok == 0) THEN
223 . msgtype=msgerror,
224 . anmode=aninfo,
226 . c1=titr,
227 . i2=itranssub)
228 ENDIF
229
230 ENDDO
231
232
233
235 cur_submod = i
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)
241 IF(ity == 1)THEN
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))
246
247
248
249
250
251
252
253 cnt = 0
254 DO k=1,numnod
255 IF(tagnodsub(k) == i) THEN
256 cnt = cnt + 1
257 nodessub(cnt) = k
258 ENDIF
259 ENDDO
260 CALL transform_translate_in_local_skew(
261 . nodessub ,cnt ,x ,numnod , isk ,
262 . tx ,ty ,tz ,skew , lskew,
263 . sskew )
264 ELSEIF(ity == 2)THEN
265 DO k=1,9
266 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
267 ENDDO
268 DO k=1,3
269 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
270 ENDDO
271
272 DO k=1,numnod
273 IF(tagnodsub(k) == i)
CALL euler_vrot(x0,x(1,k),rot)
274 ENDDO
275 ELSEIF(ity == 3)THEN
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)
279 DO k=1,9
280 rot(k) = rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
281 ENDDO
282 DO k=1,numnod
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
287 x(1,k) = xp
288 x(2,k) = yp
289 x(3,k) = zp
290 ENDIF
291 ENDDO
292 ELSEIF(ity == 4)THEN
293 DO k=1,9
294 rot(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+2)
295 ENDDO
296 DO k=1,3
297 xcold(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
298 ENDDO
299 DO k=1,3
300 xcnew(k) = rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+14)
301 ENDDO
302 DO k=1,numnod
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
310 END IF
311 ENDDO
312 ELSEIF(ity == 5)THEN
313 DO k=1,3
314 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
315 ENDDO
316 DO k=1,3
317 x1(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+14)
318 ENDDO
319 tx = x1(1) - x0(1)
320 ty = x1(2) - x0(2)
321 tz = x1(3) - x0(3)
322 s = one/
max(sqrt(tx*tx + ty*ty + tz*tz),em20)
323 tx = tx*s
324 ty = ty*s
325 tz = tz*s
326 DO k=1,numnod
327 IF(tagnodsub(k) == i) THEN
328 sx = x(1,k) - x0(1)
329 sy = x(2,k) - x0(2)
330 sz = x(3,k) - x0(3)
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
335 ENDIF
336 ENDDO
337 ELSEIF(ity == 6)THEN
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)
341 DO k=1,3
342 x0(k)=rtrans(lsubmodel(cur_submod)%IDTRANS(j),k+11)
343 ENDDO
344 DO k=1,numnod
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
349 ENDIF
350 ENDDO
351 ENDIF
352 ENDDO
353 ENDIF
354 sub_level = sub_level - 1
355 cur_submod = lsubmodel(cur_submod)%IFATHER
356 ENDDO
357 ENDDO
358
359 IF(is_dyna /= 0)THEN
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)
364 ENDIF
365 DEALLOCATE(tagnodsub)
366 IF(ALLOCATED(nodessub)) DEALLOCATE(nodessub)
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 RETURN
subroutine euler_vrot(x0, x, rot)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_count(entity_type, hm_option_number)
subroutine hm_option_start(entity_type)
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
integer, parameter nchartitle
integer, parameter ncharkey
integer, parameter ncharfield
integer, parameter ncharline
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)
integer function usrtos(iu, itabm1)