OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
lectranssub.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| lectranssub ../starter/source/model/submodel/lectranssub.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| euler_mrot ../starter/source/model/submodel/euler_mrot.F
30!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
31!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
32!|| hm_option_count ../starter/source/devtools/hm_reader/hm_option_count.F
33!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
34!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
35!|| ngr2usr ../starter/source/system/nintrr.F
36!|| points_to_frame ../starter/source/model/submodel/3points_to_frame.F
37!|| rtranspos ../starter/source/model/submodel/rtranspos.F
38!|| usrtos ../starter/source/system/sysfus.F
39!||--- uses -----------------------------------------------------
40!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
41!|| message_mod ../starter/share/message_module/message_mod.F
42!|| submodel_mod ../starter/share/modules1/submodel_mod.F
43!||====================================================================
44 SUBROUTINE lectranssub(X ,IGRNOD,ITAB,ITABM1,UNITAB,
45 . RTRANS ,LSUBMODEL,IS_DYNA)
46C-----------------------------------------------
47C M o d u l e s
48C-----------------------------------------------
49 USE unitab_mod
50 USE message_mod
51 USE groupdef_mod
52 USE submodel_mod
55C-----------------------------------------------
56C I m p l i c i t T y p e s
57C-----------------------------------------------
58#include "implicit_f.inc"
59C-----------------------------------------------
60C C o m m o n B l o c k s
61C-----------------------------------------------
62#include "com04_c.inc"
63#include "units_c.inc"
64C-----------------------------------------------
65C D u m m y A r g u m e n t s
66C-----------------------------------------------
67 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
68 INTEGER ITAB(*),ITABM1(*)
70 . x(3,*),rtrans(ntransf,*)
71 TYPE(submodel_data) LSUBMODEL(*)
72 INTEGER IS_DYNA
73C-----------------------------------------------
74 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
75C-----------------------------------------------
76C L o c a l V a r i a b l e s
77C-----------------------------------------------
78 INTEGER I,I0,I1,I2,I3,I4,I5,I6,
79 . n0,n1,n2,n3,n4,n5,n6,ierror,
80 . j,is,id,uid,igu,igs,nn,ntrans,stat,itranssub,ibid,
81 . ntag,ctag,isu,idu,idnod,
82 . inum,k,cpt,id_transsub,numnusr
83 INTEGER, DIMENSION(:), ALLOCATABLE :: TAGNODSUB !NUMNOD
84 INTEGER :: WORK(70000)
85 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX,INDEX1,TAGNODSUB_TMP,IDNODSUB
86!! INTEGER, ALLOCATABLE, DIMENSION(:) :: ITG
88 . lx,ly,lz,tx,ty,tz,r,s,rx,ry,rz,sx,sy,sz,angle,at,fac_l
90 . vr(3),x0(3),x1(3),x2(3),x3(3),x4(3),x5(3),x6(3),
91 . rot(9),pp(3,3),qq(3,3),p(3),norm1, norm2, norm3, scal1,
92 . scal2, scal3, eps,xc(3)
93 CHARACTER KEY*10
94 CHARACTER(LEN=NCHARLINE) ::CART,SOLVERKEYWORD
95 CHARACTER(LEN=NCHARTITLE) :: TITR
96 CHARACTER(LEN=NCHARFIELD) ::VERS_IN,STRING
97!
98 INTEGER, DIMENSION(:), POINTER :: INGR2USR
99 LOGICAL IS_AVAILABLE
100C-----------------------------------------------
101C E x t e r n a l F u n c t i o n s
102C-----------------------------------------------
103 INTEGER NGR2USR,USRTOS
104 EXTERNAL ngr2usr,usrtos
105C=======================================================================
106 ALLOCATE(tagnodsub(numnod))
107 isu = 0
108 tagnodsub = 0
109 numnusr = 0
110
111 IF(is_dyna /= 0)THEN
112 CALL cpp_node_count(numnusr)
113 ALLOCATE( index(2*numnusr) )
114 DO i=1,2*numnusr
115 index(i)=i
116 ENDDO
117 ALLOCATE( index1(2*numnod) )
118 DO i=1,2*numnod
119 index1(i)=i
120 ENDDO
121 ALLOCATE( tagnodsub_tmp(numnusr) )
122 DO i=1,numnusr
123 tagnodsub_tmp(i)=i
124 ENDDO
125 ALLOCATE( idnodsub(numnusr) )
126 DO i=1,numnusr
127 idnodsub(i)=i
128 ENDDO
129 ENDIF
130
131 fac_l = one
132 is_available = .false.
133C--------------------------------------------------
134C TAG SUBMODEL NODES DYNA
135C--------------------------------------------------
136 IF(is_dyna /= 0)THEN
137 CALL cpp_node_sub_tag_dyna(tagnodsub_tmp,idnodsub)
138
139 CALL my_orders( 0, work, idnodsub, index, numnusr , 1)
140 CALL my_orders( 0, work, itab, index1, numnod , 1)
141
142 DO i=1,numnusr
143 tagnodsub(index1(i)) = tagnodsub_tmp(index(i))
144 ENDDO
145C--------------------------------------------------
146C TAG SUBMODEL NODES RADIOSS
147C--------------------------------------------------
148 ELSE
149 CALL cpp_node_sub_tag(tagnodsub)
150 ENDIF
151C--------------------------------------------------
152C COUNT NUMBER TRANSFORM OPTIONS
153C--------------------------------------------------
154 CALL hm_option_count('TRANSFORM',ntrans)
155C--------------------------------------------------
156 IF (ntrans > 0) WRITE (iout,100)
157C--------------------------------------------------
158C START READING TRANSFORM OPTIONS
159C--------------------------------------------------
160 CALL hm_option_start('TRANSFORM')
161C--------------------------------------------------
162C BROWSING MODEL TRANSFORM 1->NTRANS
163C--------------------------------------------------
164 DO i=1,ntrans
165C--------------------------------------------------
166C EXTRACT DATAS OF /TRANSFORM/... LINE
167C--------------------------------------------------
168 CALL hm_option_read_key(lsubmodel,
169 . option_id = id,
170 . unit_id = uid,
171 . option_titr = titr,
172 . keyword2 = key)
173 rtrans(i,19) = id
174C--------------------------------------------------
175 CALL hm_get_intv('GR_NODE',igu,is_available,lsubmodel)
176 CALL hm_get_intv('SUBMODEL',id_transsub,is_available,lsubmodel)
177c---------------------
178 itranssub = 0
179 IF(id_transsub/=0)THEN
180 DO j=1,nsubmod
181 IF (lsubmodel(j)%NOSUBMOD == id_transsub) THEN
182 itranssub = j
183 EXIT
184 ENDIF
185 ENDDO
186 IF(itranssub==0)THEN
187 CALL ancmsg(msgid=1824,
188 . msgtype=msgerror,
189 . anmode=aninfo,
190 . i1=id,
191 . c1=titr)
192 END IF
193 END IF
194 rtrans(i,1) = itranssub
195c---------------------
196 IF(igu /= 0 .AND. id_transsub /= 0) THEN
197 CALL ancmsg(msgid=914,
198 . msgtype=msgerror,
199 . anmode=aninfo,
200 . i1=id,
201 . c1=titr)
202 ENDIF
203c---------------------
204 IF (itranssub == 0) cycle
205c---------------------
206 rtrans(i,1) = itranssub
207 IF (key(1:3) == 'TRA') THEN
208C
209 rtrans(i,2) = 1
210C
211 CALL hm_get_intv('node1',n0,is_available,lsubmodel)
212 CALL hm_get_intv('node2',n1,is_available,lsubmodel)
213C
214 CALL hm_get_floatv('translation_x',tx,is_available,lsubmodel,unitab)
215 CALL hm_get_floatv('translation_y',ty,is_available,lsubmodel,unitab)
216 CALL hm_get_floatv('translation_z',tz,is_available,lsubmodel,unitab)
217c
218 IF (n0 > 0 .OR. n1 > 0) THEN
219 i0 = usrtos(n0,itabm1)
220 i1 = usrtos(n1,itabm1)
221 IF (i0 == 0) THEN
222 CALL ancmsg(msgid=694,
223 . msgtype=msgerror,
224 . anmode=aninfo,
225 . i1=id,
226 . c1=titr,
227 . i2=n0)
228 END IF
229 IF (i1 == 0) THEN
230 CALL ancmsg(msgid=694,
231 . msgtype=msgerror,
232 . anmode=aninfo,
233 . i1=id,
234 . c1=titr,
235 . i2=n1)
236 END IF
237C
238C TRANSFORMATION OF COORDS OF NODES N0 & N1
239 IF(tagnodsub(i0) == itranssub) THEN
240 DO j=1,i-1
241 IF(rtrans(j,1) == itranssub) CALL rtranspos(x0,j,rtrans)
242 END DO
243 END IF
244 IF(tagnodsub(i1) == itranssub) THEN
245 DO j=1,i-1
246 IF(rtrans(j,1) == itranssub) CALL rtranspos(x1,j,rtrans)
247 END DO
248 END IF
249 tx = x1(1) - x0(1)
250 ty = x1(2) - x0(2)
251 tz = x1(3) - x0(3)
252 ELSE
253 tx = tx * fac_l
254 ty = ty * fac_l
255 tz = tz * fac_l
256 ENDIF
257 rtrans(i,15) = tx
258 rtrans(i,16) = ty
259 rtrans(i,17) = tz
260 s = sqrt(tx*tx + ty*ty + tz*tz)
261C
262 rot(1:9)=zero
263 rot(1) = one
264 rot(5) = one
265 rot(9) = one
266C
267 WRITE(iout,500) id,id_transsub
268 IF (n0 > 0 .AND. n1 > 0) WRITE(iout,200) n0,n1
269 WRITE(iout,510) s,tx,ty,tz
270C----
271 ELSEIF (key(1:3) == 'ROT') THEN
272C
273 rtrans(i,2) = 2
274C
275 CALL hm_get_intv('node1',n0,is_available,lsubmodel)
276 CALL hm_get_intv('node2',n1,is_available,lsubmodel)
277C
278 CALL hm_get_floatv('rotation_point1_x',x0(1),is_available,lsubmodel,unitab)
279 CALL hm_get_floatv('rotation_point1_y',x0(2),is_available,lsubmodel,unitab)
280 CALL hm_get_floatv('rotation_point1_z',x0(3),is_available,lsubmodel,unitab)
281 CALL hm_get_floatv('rotation_point2_x',x1(1),is_available,lsubmodel,unitab)
282 CALL hm_get_floatv('rotation_point2_y',x1(2),is_available,lsubmodel,unitab)
283 CALL hm_get_floatv('rotation_point2_z',x1(3),is_available,lsubmodel,unitab)
284 CALL hm_get_floatv('rotation_angle',angle,is_available,lsubmodel,unitab)
285c---------------------
286 IF (n0 > 0 .OR. n1 > 0) THEN
287 i0 = usrtos(n0,itabm1)
288 i1 = usrtos(n1,itabm1)
289 IF (i0 == 0) THEN
290 CALL ancmsg(msgid=694,
291 . msgtype=msgerror,
292 . anmode=aninfo,
293 . i1=id,
294 . c1=titr,
295 . i2=n0)
296 END IF
297 IF (i1 == 0) THEN
298 CALL ancmsg(msgid=694,
299 . msgtype=msgerror,
300 . anmode=aninfo,
301 . i1=id,
302 . c1=titr,
303 . i2=n1)
304 END IF
305 x0(1) = x(1,i0)
306 x0(2) = x(2,i0)
307 x0(3) = x(3,i0)
308 x1(1) = x(1,i1)
309 x1(2) = x(2,i1)
310 x1(3) = x(3,i1)
311C
312C TRANSFORMATION OF COORDS OF NODES N0 & N1
313 IF(tagnodsub(i0) == itranssub) THEN
314 DO j=1,i-1
315 IF(rtrans(j,1) == itranssub) CALL rtranspos(x0,j,rtrans)
316 END DO
317 END IF
318 IF(tagnodsub(i1) == itranssub) THEN
319 DO j=1,i-1
320 IF(rtrans(j,1) == itranssub) CALL rtranspos(x1,j,rtrans)
321 END DO
322 END IF
323c
324 ELSE
325 x0(1) = x0(1) * fac_l
326 x0(2) = x0(2) * fac_l
327 x0(3) = x0(3) * fac_l
328 x1(1) = x1(1) * fac_l
329 x1(2) = x1(2) * fac_l
330 x1(3) = x1(3) * fac_l
331 ENDIF
332 tx = x1(1) - x0(1)
333 ty = x1(2) - x0(2)
334 tz = x1(3) - x0(3)
335 s = sqrt(tx*tx + ty*ty + tz*tz)
336 at = angle * pi/hundred80 /max(em20,s)
337 tx = tx * at
338 ty = ty * at
339 tz = tz * at
340 CALL euler_mrot (tx,ty,tz,rot)
341 DO j=1,9
342 rtrans(i,j+2) = rot(j)
343 ENDDO
344 DO j=1,3
345 rtrans(i,j+11) = x0(j)
346 ENDDO
347 DO j=1,3
348 rtrans(i,j+14) = x0(j)
349 ENDDO
350C
351 WRITE(iout,600) id,id_transsub
352 IF (n0 > 0 .AND. n1 > 0) WRITE(iout,200) n0,n1
353 WRITE(iout,610) x0(1),x0(2),x0(3),tx,ty,tz,angle
354C----
355 ELSEIF (key(1:6) == 'MATRIX') THEN
356C
357 rtrans(i,2) = 3
358C
359 CALL hm_get_floatv('vector_1_x',rtrans(i,3),is_available,lsubmodel,unitab)
360 CALL hm_get_floatv('vector_1_y',rtrans(i,6),is_available,lsubmodel,unitab)
361 CALL hm_get_floatv('vector_1_z',rtrans(i,9),is_available,lsubmodel,unitab)
362 CALL hm_get_floatv('vector_2_x',rtrans(i,4),is_available,lsubmodel,unitab)
363 CALL hm_get_floatv('vector_2_y',rtrans(i,7),is_available,lsubmodel,unitab)
364 CALL hm_get_floatv('vector_2_z',rtrans(i,10),is_available,lsubmodel,unitab)
365 CALL hm_get_floatv('vector_3_x',rtrans(i,5),is_available,lsubmodel,unitab)
366 CALL hm_get_floatv('vector_3_y',rtrans(i,8),is_available,lsubmodel,unitab)
367 CALL hm_get_floatv('vector_3_z',rtrans(i,11),is_available,lsubmodel,unitab)
368 CALL hm_get_floatv('position_x',rtrans(i,15),is_available,lsubmodel,unitab)
369 CALL hm_get_floatv('position_y',rtrans(i,16),is_available,lsubmodel,unitab)
370 CALL hm_get_floatv('position_z',rtrans(i,17),is_available,lsubmodel,unitab)
371C
372 eps = em3
373 norm1 = sqrt(rtrans(i,3)**2+rtrans(i,6)**2+rtrans(i,9)**2)
374 norm2 = sqrt(rtrans(i,4)**2+rtrans(i,7)**2+rtrans(i,10)**2)
375 norm3 = sqrt(rtrans(i,5)**2+rtrans(i,8)**2+rtrans(i,11)**2)
376 scal1 = rtrans(i,3)*rtrans(i,4)+rtrans(i,6)*rtrans(i,7)+
377 . rtrans(i,9)*rtrans(i,10)
378 scal2 = rtrans(i,3)*rtrans(i,5)+rtrans(i,6)*rtrans(i,8)+
379 . rtrans(i,9)*rtrans(i,11)
380 scal3 = rtrans(i,4)*rtrans(i,5)+rtrans(i,7)*rtrans(i,8)+
381 . rtrans(i,10)*rtrans(i,11)
382 IF(abs(one-norm1) > eps .OR. abs(one-norm2) > eps .OR.
383 . abs(one-norm3) > eps .OR.
384 . scal1 > (eps * norm1*norm2) .OR. scal2 > (eps * norm1*norm3)
385 . .OR. scal3 > (eps * norm2*norm3))THEN
386 CALL ancmsg(msgid=986,
387 . msgtype=msgerror,
388 . anmode=aninfo)
389 ENDIF
390c
391 WRITE(iout,700) id,id_transsub
392c
393 WRITE(iout,710)
394 . rtrans(i,3),rtrans(i,6),rtrans(i,9),rtrans(i,15),
395 . rtrans(i,4),rtrans(i,7),rtrans(i,10),rtrans(i,16),
396 . rtrans(i,5),rtrans(i,8),rtrans(i,11),rtrans(i,17)
397C----
398 ELSEIF (key(1:8) == 'POSITION') THEN
399C
400 rtrans(i,2) = 4
401C
402 CALL hm_get_intv('node1',n1,is_available,lsubmodel)
403 CALL hm_get_intv('node2',n2,is_available,lsubmodel)
404 CALL hm_get_intv('node3',n3,is_available,lsubmodel)
405 CALL hm_get_intv('node4',n4,is_available,lsubmodel)
406 CALL hm_get_intv('node5',n5,is_available,lsubmodel)
407 CALL hm_get_intv('node6',n6,is_available,lsubmodel)
408C
409 CALL hm_get_floatv('x_point_1',X1(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
410 CALL HM_GET_FLOATV('y_point_1',X1(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
411 CALL HM_GET_FLOATV('z_point_1',X1(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
412 CALL HM_GET_FLOATV('x_point_2',X2(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
413 CALL HM_GET_FLOATV('y_point_2',X2(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
414 CALL HM_GET_FLOATV('z_point_2',X2(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
415 CALL HM_GET_FLOATV('x_point_3',X3(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
416 CALL HM_GET_FLOATV('y_point_3',X3(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
417 CALL HM_GET_FLOATV('z_point_3',X3(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
418 CALL HM_GET_FLOATV('x_point_4',X4(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
419 CALL HM_GET_FLOATV('y_point_4',X4(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
420 CALL HM_GET_FLOATV('z_point_4',X4(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
421 CALL HM_GET_FLOATV('x_point_5',X5(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
422 CALL HM_GET_FLOATV('y_point_5',X5(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
423 CALL HM_GET_FLOATV('z_point_5',X5(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
424 CALL HM_GET_FLOATV('x_point_6',X6(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
425 CALL HM_GET_FLOATV('y_point_6',X6(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
426 CALL HM_GET_FLOATV('z_point_6',X6(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
427C
428.OR..OR..OR. IF (N1 > 0 N2 > 0 N3 > 0
429.OR..OR. . N4 > 0 N5 > 0 N6 > 0) THEN
430 I1 = USRTOS(N1,ITABM1)
431 I2 = USRTOS(N2,ITABM1)
432 I3 = USRTOS(N3,ITABM1)
433 I4 = USRTOS(N4,ITABM1)
434 I5 = USRTOS(N5,ITABM1)
435 I6 = USRTOS(N6,ITABM1)
436 IF (I1 == 0) THEN
437 CALL ANCMSG(MSGID=694,
438 . MSGTYPE=MSGERROR,
439 . ANMODE=ANSTOP,
440 . I1=ID,
441 . C1=TITR,
442 . I2=N1)
443 END IF
444 X1(1) = X(1,I1)
445 X1(2) = X(2,I1)
446 X1(3) = X(3,I1)
447 IF (I2 == 0) THEN
448 CALL ANCMSG(MSGID=694,
449 . MSGTYPE=MSGERROR,
450 . ANMODE=ANSTOP,
451 . I1=ID,
452 . C1=TITR,
453 . I2=N2)
454 END IF
455 X2(1) = X(1,I2)
456 X2(2) = X(2,I2)
457 X2(3) = X(3,I2)
458 IF (I3 == 0) THEN
459 CALL ANCMSG(MSGID=694,
460 . MSGTYPE=MSGERROR,
461 . ANMODE=ANSTOP,
462 . I1=ID,
463 . C1=TITR,
464 . I2=N3)
465 END IF
466 X3(1) = X(1,I3)
467 X3(2) = X(2,I3)
468 X3(3) = X(3,I3)
469 IF (I4 == 0) THEN
470 CALL ANCMSG(MSGID=694,
471 . MSGTYPE=MSGERROR,
472 . ANMODE=ANSTOP,
473 . I1=ID,
474 . C1=TITR,
475 . I2=N4)
476 END IF
477 X4(1) = X(1,I4)
478 X4(2) = X(2,I4)
479 X4(3) = X(3,I4)
480 IF (I5 == 0) THEN
481 CALL ANCMSG(MSGID=694,
482 . MSGTYPE=MSGERROR,
483 . ANMODE=ANSTOP,
484 . I1=ID,
485 . C1=TITR,
486 . I2=N5)
487 END IF
488 X5(1) = X(1,I5)
489 X5(2) = X(2,I5)
490 X5(3) = X(3,I5)
491 IF (I6 == 0) THEN
492 CALL ANCMSG(MSGID=694,
493 . MSGTYPE=MSGERROR,
494 . ANMODE=ANSTOP,
495 . I1=ID,
496 . C1=TITR,
497 . I2=N6)
498 END IF
499 X6(1) = X(1,I6)
500 X6(2) = X(2,I6)
501 X6(3) = X(3,I6)
502C
503C TRANSFORMATION OF COORDS OF NODES N0 & N1
504 IF(TAGNODSUB(I1) == ITRANSSUB) THEN
505 DO J=1,I-1
506 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X1,J,RTRANS)
507 END DO
508 END IF
509 IF(TAGNODSUB(I2) == ITRANSSUB) THEN
510 DO J=1,I-1
511 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X2,J,RTRANS)
512 END DO
513 END IF
514 IF(TAGNODSUB(I3) == ITRANSSUB) THEN
515 DO J=1,I-1
516 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X3,J,RTRANS)
517 END DO
518 END IF
519 IF(TAGNODSUB(I4) == ITRANSSUB) THEN
520 DO J=1,I-1
521 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X4,J,RTRANS)
522 END DO
523 END IF
524 IF(TAGNODSUB(I5) == ITRANSSUB) THEN
525 DO J=1,I-1
526 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X5,J,RTRANS)
527 END DO
528 END IF
529 IF(TAGNODSUB(I6) == ITRANSSUB) THEN
530 DO J=1,I-1
531 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X6,J,RTRANS)
532 END DO
533 END IF
534 ELSE
535 X1(1) = X1(1) * FAC_L
536 X1(2) = X1(2) * FAC_L
537 X1(3) = X1(3) * FAC_L
538 X2(1) = X2(1) * FAC_L
539 X2(2) = X2(2) * FAC_L
540 X2(3) = X2(3) * FAC_L
541 X3(1) = X3(1) * FAC_L
542 X3(2) = X3(2) * FAC_L
543 X3(3) = X3(3) * FAC_L
544 X4(1) = X4(1) * FAC_L
545 X4(2) = X4(2) * FAC_L
546 X4(3) = X4(3) * FAC_L
547 X5(1) = X5(1) * FAC_L
548 X5(2) = X5(2) * FAC_L
549 X5(3) = X5(3) * FAC_L
550 X6(1) = X6(1) * FAC_L
551 X6(2) = X6(2) * FAC_L
552 X6(3) = X6(3) * FAC_L
553 ENDIF
554C
555 CALL POINTS_TO_FRAME(X1,X2,X3,PP,IERROR)
556.OR. IF(IERROR==1IERROR==3)THEN
557 CALL ANCMSG(MSGID=1866,
558 . MSGTYPE=MSGERROR,
559 . ANMODE=ANINFO_BLIND_1,
560 . I1=ID,C1=TITR)
561 END IF
562 IF(IERROR >= 2)THEN
563 CALL ANCMSG(MSGID=1867,
564 . MSGTYPE=MSGWARNING,
565 . ANMODE=ANINFO_BLIND_1,
566 . I1=ID,C1=TITR)
567 END IF
568 CALL POINTS_TO_FRAME(X4,X5,X6,QQ,IERROR)
569 IF(IERROR == 1)THEN
570 CALL ANCMSG(MSGID=1868,
571 . MSGTYPE=MSGERROR,
572 . ANMODE=ANINFO_BLIND_1,
573 . I1=ID,C1=TITR)
574C
575 ROT(1:9)=ZERO
576 ROT(1) = ONE
577 ROT(5) = ONE
578 ROT(9) = ONE
579 DO J=1,9
580 RTRANS(I,J+2) = ROT(J)
581 ENDDO
582 RTRANS(I,12:14) = ZERO
583 RTRANS(I,15:17) = ZERO
584C
585 ELSE
586C
587 IF(IERROR == 2)THEN
588 CALL ANCMSG(MSGID=1869,
589 . MSGTYPE=MSGWARNING,
590 . ANMODE=ANINFO_BLIND_1,
591 . I1=ID,C1=TITR)
592 END IF
593C
594 ROT(1)=QQ(1,1)*PP(1,1)+QQ(1,2)*PP(1,2)+QQ(1,3)*PP(1,3) ! QQ . Transpose(PP)
595 ROT(4)=QQ(1,1)*PP(2,1)+QQ(1,2)*PP(2,2)+QQ(1,3)*PP(2,3)
596 ROT(7)=QQ(1,1)*PP(3,1)+QQ(1,2)*PP(3,2)+QQ(1,3)*PP(3,3)
597 ROT(2)=QQ(2,1)*PP(1,1)+QQ(2,2)*PP(1,2)+QQ(2,3)*PP(1,3)
598 ROT(5)=QQ(2,1)*PP(2,1)+QQ(2,2)*PP(2,2)+QQ(2,3)*PP(2,3)
599 ROT(8)=QQ(2,1)*PP(3,1)+QQ(2,2)*PP(3,2)+QQ(2,3)*PP(3,3)
600 ROT(3)=QQ(3,1)*PP(1,1)+QQ(3,2)*PP(1,2)+QQ(3,3)*PP(1,3)
601 ROT(6)=QQ(3,1)*PP(2,1)+QQ(3,2)*PP(2,2)+QQ(3,3)*PP(2,3)
602 ROT(9)=QQ(3,1)*PP(3,1)+QQ(3,2)*PP(3,2)+QQ(3,3)*PP(3,3)
603C
604 DO J=1,9
605 RTRANS(I,J+2) = ROT(J)
606 ENDDO
607 DO J=1,3
608 RTRANS(I,J+11) = X1(J)
609 ENDDO
610 DO J=1,3
611 RTRANS(I,J+14) = X4(J) ! Xnew = X4 + ROT(Xold-X1)
612 ENDDO
613C
614 END IF
615C
616 WRITE(IOUT,800) ID,ID_TRANSSUB
617c
618 WRITE(IOUT,810)
619 . (RTRANS(I,K+11) , K=1,3),
620 . (RTRANS(I,K+14) , K=1,3),
621 . RTRANS(I,3),RTRANS(I,6), RTRANS(I,9),
622 . RTRANS(I,4),RTRANS(I,7),RTRANS(I,10),
623 . RTRANS(I,5),RTRANS(I,8),RTRANS(I,11)
624
625 ELSE IF (KEY(1:3) == 'sym') THEN
626C
627 RTRANS(I,2) = 5
628
629 CALL HM_GET_INTV('gr_node',IGU,IS_AVAILABLE,LSUBMODEL)
630 CALL HM_GET_INTV('node1',N0,IS_AVAILABLE,LSUBMODEL)
631 CALL HM_GET_INTV('node2',N1,IS_AVAILABLE,LSUBMODEL)
632 CALL HM_GET_INTV('submodel',ITRANSSUB,IS_AVAILABLE,LSUBMODEL)
633C
634 CALL HM_GET_FLOATV('reflect_point1_x',X0(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
635 CALL HM_GET_FLOATV('reflect_point1_y',X0(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
636 CALL HM_GET_FLOATV('reflect_point1_z',X0(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
637 CALL HM_GET_FLOATV('reflect_point2_x',X1(1),IS_AVAILABLE,LSUBMODEL,UNITAB)
638 CALL HM_GET_FLOATV('reflect_point2_y',X1(2),IS_AVAILABLE,LSUBMODEL,UNITAB)
639 CALL HM_GET_FLOATV('reflect_point2_z',X1(3),IS_AVAILABLE,LSUBMODEL,UNITAB)
640C--------------------------------------------------
641 INGR2USR => IGRNOD(1:NGRNOD)%ID
642 IGS = NGR2USR(IGU,INGR2USR,NGRNOD)
643
644.OR. IF (N0 > 0 N1 > 0) THEN
645 I0 = USRTOS(N0,ITABM1)
646 I1 = USRTOS(N1,ITABM1)
647 IF (I0 == 0) THEN
648 CALL ANCMSG(MSGID=694,
649 . MSGTYPE=MSGERROR,
650 . ANMODE=ANINFO,
651 . I1=ID,
652 . C1=TITR,
653 . I2=N0)
654 END IF
655 IF (I1 == 0) THEN
656 CALL ANCMSG(MSGID=694,
657 . MSGTYPE=MSGERROR,
658 . ANMODE=ANINFO,
659 . I1=ID,
660 . C1=TITR,
661 . I2=N1)
662 END IF
663 X0(1) = X(1,I0)
664 X0(2) = X(2,I0)
665 X0(3) = X(3,I0)
666 X1(1) = X(1,I1)
667 X1(2) = X(2,I1)
668 X1(3) = X(3,I1)
669 ELSE
670 X0(1) = X0(1) * FAC_L
671 X0(2) = X0(2) * FAC_L
672 X0(3) = X0(3) * FAC_L
673 X1(1) = X1(1) * FAC_L
674 X1(2) = X1(2) * FAC_L
675 X1(3) = X1(3) * FAC_L
676 ENDIF
677C
678 IF(TAGNODSUB(I0) == ITRANSSUB) THEN
679 DO J=1,I-1
680 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X0,J,RTRANS)
681 END DO
682 END IF
683C
684 IF(TAGNODSUB(I1) == ITRANSSUB) THEN
685 DO J=1,I-1
686 IF(RTRANS(J,1) == ITRANSSUB) CALL RTRANSPOS(X1,J,RTRANS)
687 END DO
688 END IF
689C
690 DO J=1,3
691 RTRANS(I,J+11) = X0(J)
692 ENDDO
693C
694 DO J=1,3
695 RTRANS(I,J+14) = X1(J)
696 ENDDO
697C
698 WRITE(IOUT,900) ID,IGU
699.AND. IF (N0 > 0 N1 > 0) WRITE(IOUT,200) N0,N1
700 WRITE(IOUT,910) X0(1),X0(2),X0(3),TX,TY,TZ
701
702 ELSE IF (KEY(1:3) == 'sca') THEN
703C
704 RTRANS(I,2) = 6
705C
706 CALL HM_GET_INTV('node1',n0,is_available,lsubmodel)
707C
708 CALL hm_get_floatv('scalefactor_x',rtrans(i,20),is_available,lsubmodel,unitab)
709 CALL hm_get_floatv('scalefactor_y',rtrans(i,21),is_available,lsubmodel,unitab)
710 CALL hm_get_floatv('scalefactor_z',rtrans(i,22),is_available,lsubmodel,unitab)
711c
712 IF (n0 > 0) THEN
713 i0 = usrtos(n0,itabm1)
714 IF (i0 == 0) THEN
715 CALL ancmsg(msgid=694,
716 . msgtype=msgerror,
717 . anmode=aninfo,
718 . i1=id,
719 . c1=titr,
720 . i2=n1)
721 x0(1) = zero
722 x0(2) = zero
723 x0(3) = zero
724 ELSE
725 x0(1) = x(1,i0)
726 x0(2) = x(2,i0)
727 x0(3) = x(3,i0)
728 ENDIF
729 ENDIF
730C
731 DO j=1,3
732 rtrans(i,j+11) = x0(j)
733 ENDDO
734C
735 IF(tagnodsub(i0) == itranssub) THEN
736 DO j=1,i-1
737 IF(rtrans(j,1) == itranssub) CALL rtranspos(x0,j,rtrans)
738 END DO
739 END IF
740C
741 WRITE(iout,1000) id,id_transsub
742 WRITE(iout,1010) rtrans(i,12),rtrans(i,13),rtrans(i,14),rtrans(i,20),rtrans(i,21),rtrans(i,22)
743C----
744 ENDIF
745 ENDDO
746C-------------------------
747 IF(is_dyna /= 0)THEN
748 IF (ALLOCATED(index)) DEALLOCATE(index)
749 IF (ALLOCATED(index1)) DEALLOCATE(index1)
750 IF (ALLOCATED(tagnodsub_tmp)) DEALLOCATE(tagnodsub_tmp)
751 IF (ALLOCATED(idnodsub)) DEALLOCATE(idnodsub)
752 ENDIF
753C-----------------------
754 DEALLOCATE(tagnodsub)
755 RETURN
756C-----------------------
757 100 FORMAT(//
758 .' NODAL TRANSFORMATIONS '/,
759 .' ---------------------- ')
760 200 FORMAT(10x,' NODES N0 . . . . .= ',i10/,
761 . 10x,' N1 . . . . .= ',i10)
762 300 FORMAT(10x,' CENTER NODE N0 . . . . .= ',i10)
763 500 FORMAT(/
764 . ' SUBMODEL TRANSLATION, TRANSFORMATION ID = ',i10/,
765 . ' SUBMODEL ID. . . . . . . . . . . .= ',i10/,
766 . ' TRANSLATION VECTOR :')
767 510 FORMAT(10x,' VALUE. . . . . . . . . . . . .= ',e20.13/,
768 . ' COORDINATES X. . . . . . .= ',e20.13/,
769 . ' Y. . . . . . .= ',e20.13/,
770 . ' Z. . . . . . .= ',e20.13)
771 600 FORMAT(/
772 . ' SUBMODEL ROTATION, TRANSFORMATION ID. = ',i10/,
773 . ' SUBMODEL ID. . . . . . . . . . . .= ',i10/,
774 . ' ROTATION VECTOR: ')
775 610 FORMAT(10x,' CENTER X. . . . . . .= ',e20.13/,
776 . ' Y. . . . . . .= ',e20.13/,
777 . ' Z. . . . . . .= ',e20.13/,
778 . ' DIRECTION X. . . . . . .= ',e20.13/,
779 . ' Y. . . . . . .= ',e20.13/,
780 . ' Z. . . . . . .= ',e20.13/,
781 . ' ANGLE . . . . . . .= ',e20.13)
782 700 FORMAT(/
783 . ' submodel matrix transformation, transformation id.= ',I10/,
784 . ' submodel id. . . . . . . . . . . .= ',I10/)
785 710 FORMAT(4X,'matrix '/,
786 .' '/,
787 . 17X,'m11',17X,'m12',17X,'m13',18X,'tx' /,
788 . 4E20.13/,
789 . 17X,'m21',17X,'m22',17X,'m23',18X,'ty' /,
790 . 4E20.13/,
791 . 17X,'m31',17X,'m32',17X,'m33',18X,'tz' /,
792 . 4E20.13/)
793 800 FORMAT(/
794 . ' submodel transformation wrt 6 positions',/,
795 . ' transformation id. . . . . . . . . . . = ',I10/,
796 . ' submodel id. . . . . . . . . . . . . . = ',I10/)
797 810 FORMAT(
798 . ' center n1 x1 . . . . . .= ',E20.13/,
799 . ' y1 . . . . . .= ',E20.13/,
800 . ' z1 . . . . . .= ',E20.13/,
801 . ' center n4 x4 . . . . . .= ',E20.13/,
802 . ' y4 . . . . . .= ',E20.13/,
803 . ' z4 . . . . . .= ',E20.13/,
804 . ' rotation matrix . . . . . . . = ',/,
805 . ' . . . . . . . . m11 . . . . . . . . m12 . . . . . . . . m13',/,
806 . 3E20.13/,
807 . ' . . . . . . . . m21 . . . . . . . . m22 . . . . . . . . m23',/,
808 . 3E20.13/,
809 . ' . . . . . . . . m31 . . . . . . . . m32 . . . . . . . . m33',/,
810 . 3E20.13/)
811 900 FORMAT(/
812 . ' submodel transformation plane symmetry',/,
813 . ' transformation id. . . . . . . . . . . = ',I10/,
814 . ' submodel id. . . . . . . . . . . . . . = ',I10/)
815 910 FORMAT(10X,' center x. . . . . . .= ',E20.13/,
816 . ' y. . . . . . .= ',E20.13/,
817 . ' z. . . . . . .= ',E20.13/,
818 . ' direction x. . . . . . .= ',E20.13/,
819 . ' y. . . . . . .= ',E20.13/,
820 . ' z. . . . . . .= ',E20.13)
821
822 1000 FORMAT(/
823 . ' submodel scale',/,
824 . ' transformation id. . . . . . . . . . . = ',I10/,
825 . ' submodel id. . . . . . . . . . . . . . = ',I10/)
826 1010 FORMAT(10X,' center x. . . . . . .= ',E20.13/,
827 . ' y. . . . . . .= ',E20.13/,
828 . ' z. . . . . . .= ',E20.13/,
829 . ' scale x . . . . . .= ',E20.13/,
830 . ' y . . . . . .= ',E20.13/,
831 . ' z . . . . . .= ',E20.13)
832
833 3000 FORMAT(/10X,'new node coordinates',14X,'x',24X,'y',24X,'z')
834 3500 FORMAT( 17X,I10,3(5X,E20.13))
835C-----------------------
836 RETURN
837 END SUBROUTINE LECTRANSSUB
#define my_real
Definition cppsort.cpp:32
subroutine euler_mrot(rx, ry, rz, rot)
Definition euler_mrot.F:34
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_count(entity_type, hm_option_number)
subroutine hm_option_start(entity_type)
subroutine lectranssub(x, igrnod, itab, itabm1, unitab, rtrans, lsubmodel, is_dyna)
Definition lectranssub.F:46
#define max(a, b)
Definition macros.h:21
initmumps id
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
Definition my_orders.c:82
integer, parameter nchartitle
integer, parameter ncharfield
integer, parameter ncharline
integer nsubmod
subroutine rtranspos(point, mytrans, rtrans)
Definition rtranspos.F:29
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)
Definition message.F:889