OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_frm.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!|| hm_read_frm ../starter/source/tools/skew/hm_read_frm.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| anodset ../starter/source/output/analyse/analyse_node.c
30!|| fretitl ../starter/source/starter/freform.F
31!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
32!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
33!|| hm_get_string ../starter/source/devtools/hm_reader/hm_get_string.F
34!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
35!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
36!|| ifrontplus ../starter/source/spmd/node/frontplus.F
37!|| origin ../starter/source/model/remesh/build_admesh.F
38!|| subrotpoint ../starter/source/model/submodel/subrot.F
39!|| subrotvect ../starter/source/model/submodel/subrot.F
40!|| udouble ../starter/source/system/sysfus.F
41!|| usr2sys ../starter/source/system/sysfus.F
42!||--- uses -----------------------------------------------------
43!|| format_mod ../starter/share/modules1/format_mod.F90
44!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
45!|| message_mod ../starter/share/message_module/message_mod.F
46!|| submodel_mod ../starter/share/modules1/submodel_mod.F
47!||====================================================================
48 SUBROUTINE hm_read_frm(ISKN ,X ,ITAB ,ITABM1 ,
49 . XFRAME ,LSUBMODEL,RTRANS ,NOM_OPT ,UNITAB)
50C-----------------------------------------------
51C M o d u l e s
52C-----------------------------------------------
53 USE unitab_mod
54 USE submodel_mod
55 USE message_mod
58 USE format_mod , ONLY : lfield
59C-----------------------------------------------
60C I m p l i c i t T y p e s
61C-----------------------------------------------
62#include "implicit_f.inc"
63C-----------------------------------------------
64C A n a l y s e M o d u l e
65C-----------------------------------------------
66#include "analyse_name.inc"
67C-----------------------------------------------
68C C o m m o n B l o c k s
69C-----------------------------------------------
70#include "scr17_c.inc"
71#include "com01_c.inc"
72#include "com04_c.inc"
73#include "sphcom.inc"
74#include "units_c.inc"
75#include "param_c.inc"
76C-----------------------------------------------
77C D u m m y A r g u m e n t s
78C-----------------------------------------------
79 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
80 INTEGER ISKN(LISKN,*), ITAB(*), ITABM1(*)
81 my_real x(3,*), xframe(nxframe,*),rtrans(ntransf,*)
82 TYPE(submodel_data) LSUBMODEL(*)
83 INTEGER NOM_OPT(LNOPT1,*)
84C-----------------------------------------------
85C L o c a l V a r i a b l e s
86C-----------------------------------------------
87 INTEGER I, IMOV, INOD, J, N1, N2, N3, K, NSK,
88 . iun, jj, sub_id,
89 . idir,iflagunit,id,uid,cpt
90 my_real p(12), pnor1, pnor2, pnorm1, det1, det2, det3, det, pp,bid
91 CHARACTER(LEN=NCHARTITLE) :: NOMFG
92 CHARACTER(LEN=NCHARTITLE) :: TITR
93 CHARACTER :: MESS*40,MESSF*40
94 CHARACTER(LEN=NCHARKEY) :: KEY
95 CHARACTER(LEN=NCHARFIELD) :: DIR
96 LOGICAL IS_AVAILABLE
97C-----------------------------------------------
98C E x t e r n a l F u n c t i o n s
99C-----------------------------------------------
100 INTEGER USR2SYS
101 DATA iun/1/
102 DATA messf/'MOVING FRAME '/
103 DATA nomfg/'global reference frame '/
104C=======================================================================
105C
106 DO i=1,9
107 xframe(i,1) =zero
108 ENDDO
109 xframe(1,1) =one
110 xframe(5,1) =one
111 xframe(9,1) =one
112 DO i=1,9
113 xframe(18+i,1) =zero
114 ENDDO
115 xframe(18+1,1) =one
116 xframe(18+5,1) =one
117 xframe(18+9,1) =one
118C
119 jj=(numskw+1)+min(iun,nspcond)*numsph+1+nsubmod
120 iskn(1,jj)=0
121 iskn(2,jj)=0
122 iskn(3,jj)=0
123 iskn(5,jj)=0
124C Global Frame ID is set to -1
125 iskn(4,jj)=-1
126 nom_opt(1,numskw+2)=-1
127 CALL fretitl(nomfg,nom_opt(lnopt1-ltitr+1,numskw+2),ltitr)
128C
129 IF(numfram==0)GOTO 900
130C--------------------------------------------------
131C START BROWSING MODEL PROPERTIES
132C--------------------------------------------------
133 CALL hm_option_start('/FRAME')
134 i = 0
135C--------------------------------------------------
136C BROWSING MODEL PROPERTIES 1->HM_NUMGEO
137C--------------------------------------------------
138 DO cpt=1,numfram
139 i = i + 1
140 jj=(numskw+1)+min(iun,nspcond)*numsph+i+1+nsubmod
141C--------------------------------------------------
142C EXTRACT DATAS OF /FRAME/... LINE
143C--------------------------------------------------
144 CALL hm_option_read_key(lsubmodel,
145 . option_id = id,
146 . unit_id = uid,
147 . submodel_id = sub_id,
148 . option_titr = titr,
149 . keyword2 = key)
150C
151 nom_opt(1,numskw+2+i)=id
152 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,
153 . numskw+2+i),ltitr)
154C
155 iflagunit = 0
156 DO j=1,unitab%NUNITS
157 IF (unitab%UNIT_ID(j) == uid) THEN
158 iflagunit = 1
159 EXIT
160 ENDIF
161 ENDDO
162 IF (uid/=0.AND.iflagunit==0) THEN
163 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
164 . i2=uid,i1=id,c1='REFERENCE FRAME',
165 . c2='REFERENCE FRAME',
166 . c3=titr)
167 ENDIF
168C
169 inod =0
170 imov =0
171C
172 IF (key(1:3)=='FIX') THEN
173C--------------------------------------------------
174C EXTRACT DATAS (REAL VALUES)
175C--------------------------------------------------
176 CALL hm_get_floatv('globaloriginx',p(10),is_available,lsubmodel,unitab)
177 CALL hm_get_floatv('globaloriginy',p(11),is_available,lsubmodel,unitab)
178 CALL hm_get_floatv('globaloriginz',p(12),is_available,lsubmodel,unitab)
179
180 CALL hm_get_floatv('globalyaxisx',p(4),is_available,lsubmodel,unitab)
181 CALL hm_get_floatv('globalyaxisy',p(5),is_available,lsubmodel,unitab)
182 CALL hm_get_floatv('globalyaxisz',p(6),is_available,lsubmodel,unitab)
183
184 CALL hm_get_floatv('globalzaxisx',p(7),is_available,lsubmodel,unitab)
185 CALL hm_get_floatv('globalzaxisy',p(8),is_available,lsubmodel,unitab)
186 CALL hm_get_floatv('globalzaxisz',p(9),is_available,lsubmodel,unitab)
187C
188 ELSEIF (key(1:4)=='MOV2') THEN
189 imov=2
190C--------------------------------------------------
191C EXTRACT DATAS (INTEGER VALUES)
192C--------------------------------------------------
193 CALL hm_get_intv('originnodeid',n1,is_available,lsubmodel)
194 CALL hm_get_intv('axisnodeid',n2,is_available,lsubmodel)
195 CALL hm_get_intv('planenodeid',n3,is_available,lsubmodel)
196C
197 ELSEIF (key(1:3)=='MOV') THEN
198 imov=1
199 idir = 1
200C--------------------------------------------------
201C EXTRACT DATAS (INTEGER VALUES)
202C--------------------------------------------------
203 CALL hm_get_intv('originnodeid',n1,is_available,lsubmodel)
204 CALL hm_get_intv('axisnodeid',n2,is_available,lsubmodel)
205 CALL hm_get_intv('planenodeid',n3,is_available,lsubmodel)
206C--------------------------------------------------
207C EXTRACT DATAS (STRING)
208C--------------------------------------------------
209 CALL hm_get_string('DIR',dir,ncharfield,is_available)
210 DO k = 1,lfield
211 IF(dir(k:k) == 'X'.OR.dir(k:k) == 'x')idir = 1
212 IF(dir(k:k) == 'Y'.OR.dir(k:k) == 'y')idir = 2
213 IF(dir(k:k) == 'z.OR.'DIR(K:K) == 'z')IDIR = 3
214 ENDDO
215 ISKN(6,JJ)=IDIR
216C
217 ELSEIF (KEY(1:3)=='nod') THEN
218C Node defined moving frame
219 INOD=1
220C--------------------------------------------------
221C EXTRACT DATAS (INTEGER VALUES)
222C--------------------------------------------------
223 CALL HM_GET_INTV('originnodeid',N1,IS_AVAILABLE,LSUBMODEL)
224 CALL HM_GET_INTV('axisnodeid',N2,IS_AVAILABLE,LSUBMODEL)
225 CALL HM_GET_INTV('planenodeid',N3,IS_AVAILABLE,LSUBMODEL)
226.OR. IF (N2==0 N3==0) THEN
227 INOD=2
228C--------------------------------------------------
229C EXTRACT DATAS (REAL VALUES)
230C--------------------------------------------------
231 CALL HM_GET_FLOATV('globalyaxisx',P(4),IS_AVAILABLE,LSUBMODEL,UNITAB)
232 CALL HM_GET_FLOATV('globalyaxisy',P(5),IS_AVAILABLE,LSUBMODEL,UNITAB)
233 CALL HM_GET_FLOATV('globalyaxisz',P(6),IS_AVAILABLE,LSUBMODEL,UNITAB)
234C
235 CALL HM_GET_FLOATV('globalzaxisx',P(7),IS_AVAILABLE,LSUBMODEL,UNITAB)
236 CALL HM_GET_FLOATV('globalzaxisy',P(8),IS_AVAILABLE,LSUBMODEL,UNITAB)
237 CALL HM_GET_FLOATV('globalzaxisz',P(9),IS_AVAILABLE,LSUBMODEL,UNITAB)
238C
239 IF(SUB_ID /= 0)
240 . CALL SUBROTVECT(P(4),P(5),P(6),RTRANS,SUB_ID,LSUBMODEL)
241 IF(SUB_ID /= 0)
242 . CALL SUBROTVECT(P(7),P(8),P(9),RTRANS,SUB_ID,LSUBMODEL)
243 ENDIF
244 ENDIF
245 ISKN(4,JJ)=ID
246C----------------
247C FRAME MOBILE (CALCUL DE LA POSITION INITIALE)
248C----------------
249 IF(IMOV==1)THEN
250 N1=USR2SYS(N1,ITABM1,MESSF,ID)
251 N2=USR2SYS(N2,ITABM1,MESSF,ID)
252 CALL ANODSET(N1, CHECK_USED)
253 CALL ANODSET(N2, CHECK_USED)
254 CALL IFRONTPLUS(N1,1)
255 CALL IFRONTPLUS(N2,1)
256 ISKN(1,JJ)=N1
257 ISKN(2,JJ)=N2
258 ISKN(5,JJ)=IMOV
259C-----------------
260C CALCUL DE X' et Y0'
261C-----------------
262 IF(N2D==0)THEN
263c
264 IF (IDIR == 1) THEN
265 P(1)=X(1,N2)-X(1,N1)
266 P(2)=X(2,N2)-X(2,N1)
267 P(3)=X(3,N2)-X(3,N1)
268 ELSEIF(IDIR == 2) THEN
269 P(4)=X(1,N2)-X(1,N1)
270 P(5)=X(2,N2)-X(2,N1)
271 P(6)=X(3,N2)-X(3,N1)
272 ELSEIF(IDIR == 3) THEN
273 P(7)=X(1,N2)-X(1,N1)
274 P(8)=X(2,N2)-X(2,N1)
275 P(9)=X(3,N2)-X(3,N1)
276 ENDIF
277c
278 N3=USR2SYS(N3,ITABM1,MESSF,ID)
279 CALL ANODSET(N3, CHECK_USED)
280 CALL IFRONTPLUS(N3,1)
281 ISKN(3,JJ)=N3
282C
283 IF (IDIR == 1) THEN
284 P(4)=X(1,N3)-X(1,N1)
285 P(5)=X(2,N3)-X(2,N1)
286 P(6)=X(3,N3)-X(3,N1)
287 ELSEIF (IDIR == 2) THEN
288 P(7)=X(1,N3)-X(1,N1)
289 P(8)=X(2,N3)-X(2,N1)
290 P(9)=X(3,N3)-X(3,N1)
291 ELSEIF (IDIR == 3) THEN
292 P(1)=X(1,N3)-X(1,N1)
293 P(2)=X(2,N3)-X(2,N1)
294 P(3)=X(3,N3)-X(3,N1)
295 ENDIF
296C
297 P(10)=X(1,N1)
298 P(11)=X(2,N1)
299 P(12)=X(3,N1)
300 ELSE
301 P(1)=ONE
302 P(2)=ZERO
303 P(3)=ZERO
304C
305 P(4)=X(1,N2)-X(1,N1)
306 P(5)=X(2,N2)-X(2,N1)
307 P(6)=X(3,N2)-X(3,N1)
308C
309 P(10)=X(1,N1)
310 P(11)=X(2,N1)
311 P(12)=X(3,N1)
312 ENDIF
313C----------------
314C TESTS DE CONSISTANCE
315C----------------
316 IF (IDIR == 1) PNOR1=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
317 IF (IDIR == 2) PNOR1=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
318 IF (IDIR == 3) PNOR1=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
319 IF(PNOR1<1.E-20) THEN
320 CALL ANCMSG(MSGID=162,
321 . MSGTYPE=MSGERROR,
322 . ANMODE=ANINFO_BLIND_1,
323 . I2=ITAB(N1),
324 . I1=ID,C1=TITR,
325 . I3=ITAB(N2))
326 RETURN
327 ENDIF
328C CALCUL DE COLINEARITE DES VECTEURS N1N2 ET N1N3
329 IF (IDIR == 1) THEN
330 PNOR2=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
331 IF(PNOR2>EM20) THEN
332 PNORM1=ONE/(PNOR1*PNOR2)
333 DET1=ABS((P(1)*P(5)-P(2)*P(4))*PNORM1)
334 DET2=ABS((P(1)*P(6)-P(3)*P(4))*PNORM1)
335 DET3=ABS((P(2)*P(6)-P(3)*P(5))*PNORM1)
336 DET= MAX(DET1,DET2,DET3)
337 ELSE
338 DET=ZERO
339 ENDIF
340 IF(DET<EM5) THEN
341 CALL ANCMSG(MSGID=163,
342 . MSGTYPE=MSGWARNING,
343 . ANMODE=ANINFO_BLIND_1,
344 . I1=ID,C1=TITR)
345 IF(ABS(P(2))>EM5) THEN
346 P(4)=ABS(P(1))+TEN
347 ELSE
348 P(5)=TEN
349 ENDIF
350 ENDIF
351 ELSEIF (IDIR == 2) THEN
352 PNOR2=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
353 IF(PNOR2>EM20) THEN
354 PNORM1=ONE/(PNOR1*PNOR2)
355 DET1=ABS((P(4)*P(8)-P(5)*P(7))*PNORM1)
356 DET2=ABS((P(4)*P(9)-P(6)*P(7))*PNORM1)
357 DET3=ABS((P(5)*P(9)-P(6)*P(8))*PNORM1)
358 DET= MAX(DET1,DET2,DET3)
359 ELSE
360 DET=ZERO
361 ENDIF
362 IF(DET<EM5) THEN
363 CALL ANCMSG(MSGID=163,
364 . MSGTYPE=MSGWARNING,
365 . ANMODE=ANINFO_BLIND_1,
366 . I1=ID,C1=TITR)
367 IF(ABS(P(5))>EM5) THEN
368 P(7)=ABS(P(4))+TEN
369 ELSE
370 P(8)=TEN
371 ENDIF
372 ENDIF
373 ELSEIF (IDIR == 3) THEN
374 PNOR2=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
375 IF(PNOR2>EM20) THEN
376 PNORM1=ONE/(PNOR1*PNOR2)
377 DET1=ABS((P(7)*P(2)-P(8)*P(1))*PNORM1)
378 DET2=ABS((P(7)*P(3)-P(9)*P(1))*PNORM1)
379 DET3=ABS((P(8)*P(3)-P(9)*P(2))*PNORM1)
380 DET= MAX(DET1,DET2,DET3)
381 ELSE
382 DET=ZERO
383 ENDIF
384 IF(DET<EM5) THEN
385 CALL ANCMSG(MSGID=163,
386 . MSGTYPE=MSGWARNING,
387 . ANMODE=ANINFO_BLIND_1,
388 . I1=ID,C1=TITR)
389 IF(ABS(P(5))>EM5) THEN
390 P(1)=ABS(P(7))+TEN
391 ELSE
392 P(2)=TEN
393 ENDIF
394 ENDIF
395 ENDIF
396C-----------------
397C CALCUL DE Z'
398C-----------------
399 IF (IDIR == 1) THEN
400 P(7)=P(2)*P(6)-P(3)*P(5)
401 P(8)=P(3)*P(4)-P(1)*P(6)
402 P(9)=P(1)*P(5)-P(2)*P(4)
403 ELSEIF (IDIR == 2) THEN
404 P(1)=P(5)*P(9)-P(6)*P(8)
405 P(2)=P(6)*P(7)-P(4)*P(9)
406 P(3)=P(4)*P(8)-P(5)*P(7)
407 ELSEIF (IDIR == 3) THEN
408 P(4)=P(8)*P(3)-P(9)*P(2)
409 P(5)=P(9)*P(1)-P(7)*P(3)
410 P(6)=P(7)*P(2)-P(8)*P(1)
411 ENDIF
412C-----------------
413C CALCUL DE Y'
414C-----------------
415 IF (IDIR == 1) THEN
416 P(4)=P(8)*P(3)-P(9)*P(2)
417 P(5)=P(9)*P(1)-P(7)*P(3)
418 P(6)=P(7)*P(2)-P(8)*P(1)
419 ELSEIF (IDIR == 2) THEN
420 P(7)=P(2)*P(6)-P(3)*P(5)
421 P(8)=P(3)*P(4)-P(1)*P(6)
422 P(9)=P(1)*P(5)-P(2)*P(4)
423 ELSEIF (IDIR == 3) THEN
424 P(1)=P(5)*P(9)-P(6)*P(8)
425 P(2)=P(6)*P(7)-P(4)*P(9)
426 P(3)=P(4)*P(8)-P(5)*P(7)
427 ENDIF
428C----------------
429C FRAME MOV2
430C----------------
431 ELSEIF (IMOV == 2) THEN
432 N1=USR2SYS(N1,ITABM1,MESS,ID)
433 N2=USR2SYS(N2,ITABM1,MESS,ID)
434 N3=USR2SYS(N3,ITABM1,MESS,ID)
435 CALL ANODSET(N1, CHECK_USED)
436 CALL ANODSET(N2, CHECK_USED)
437 CALL ANODSET(N3, CHECK_USED)
438 CALL IFRONTPLUS(N1,1)
439 CALL IFRONTPLUS(N2,1)
440 CALL IFRONTPLUS(N3,1)
441 ISKN(1,JJ)=N1
442 ISKN(2,JJ)=N2
443 ISKN(3,JJ)=N3
444 ISKN(5,JJ)=IMOV
445 P(7)=X(1,N2)-X(1,N1)
446 P(8)=X(2,N2)-X(2,N1)
447 P(9)=X(3,N2)-X(3,N1)
448 P(1)=X(1,N3)-X(1,N1)
449 P(2)=X(2,N3)-X(2,N1)
450 P(3)=X(3,N3)-X(3,N1)
451C-----------------
452C CALCUL DE Y = Z x X'
453C-----------------
454 P(4)=P(8)*P(3)-P(9)*P(2)
455 P(5)=P(9)*P(1)-P(7)*P(3)
456 P(6)=P(7)*P(2)-P(8)*P(1)
457C-----------------
458C CALCUL DE X = Y x Z
459C-----------------
460 P(1)=P(5)*P(9)-P(6)*P(8)
461 P(2)=P(6)*P(7)-P(4)*P(9)
462 P(3)=P(4)*P(8)-P(5)*P(7)
463C-----------------
464C ORIGINE
465C-----------------
466 P(10)=X(1,N1)
467 P(11)=X(2,N1)
468 P(12)=X(3,N1)
469C----------------
470C TESTS DE CONSISTANCE
471C----------------
472 PNOR1=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
473 IF (PNOR1 < EM20) THEN
474 CALL ANCMSG(MSGID=162,
475 . MSGTYPE=MSGERROR,
476 . ANMODE=ANINFO_BLIND_1,
477 . I2=ITAB(N1),
478 . I1=ID,C1=TITR,
479 . I3=ITAB(N2))
480 ENDIF
481C CALCUL DE COLINEARITE DES VECTEURS N1N2 ET N1N3
482 PNOR2=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
483 IF (PNOR2 > EM20) THEN
484 PNORM1=ONE/(PNOR1*PNOR2)
485 DET1=ABS((P(8)*P(3)-P(9)*P(2))*PNORM1)
486 DET2=ABS((P(9)*P(1)-P(7)*P(3))*PNORM1)
487 DET3=ABS((P(7)*P(2)-P(8)*P(1))*PNORM1)
488 DET= MAX(DET1,DET2,DET3)
489 ELSE
490 DET=ZERO
491 ENDIF
492 IF (DET < EM5) THEN
493 CALL ANCMSG(MSGID=163,
494 . MSGTYPE=MSGWARNING,
495 . ANMODE=ANINFO_BLIND_1,
496 . I1=ID,C1=TITR)
497 IF(ABS(P(2)) < EM5) THEN
498 P(4)=ABS(P(1))+TEN
499 ELSE
500 P(5)=TEN
501 ENDIF
502 ENDIF
503C----------------
504C MOVING FRAME ATTACHED TO A NODE
505C----------------
506 ELSEIF (INOD>=1) THEN
507 IF (N1<=0) THEN
508 CALL ANCMSG(MSGID=900,
509 . MSGTYPE=MSGERROR,
510 . ANMODE=ANINFO_BLIND_1,
511 . I1=SUB_ID,
512 . C1=TITR,
513 . I2=N1)
514 ENDIF
515 IF (N1/=0) THEN
516 N1=USR2SYS(N1,ITABM1,MESSF,ID)
517 CALL ANODSET(N1, CHECK_USED)
518 CALL IFRONTPLUS(N1,1)
519 ENDIF
520 IF (N2/=0) THEN
521 N2=USR2SYS(N2,ITABM1,MESSF,ID)
522 CALL ANODSET(N2, CHECK_USED)
523 CALL IFRONTPLUS(N2,1)
524 ENDIF
525 ISKN(1,JJ)=N1
526 ISKN(2,JJ)=0
527 ISKN(3,JJ)=0
528 IF (INOD==1) THEN
529C defined with 3 nodes
530C--- CALCUL DE X' et Y0'
531 IF(N2D==0)THEN
532 P(1)=X(1,N2)-X(1,N1)
533 P(2)=X(2,N2)-X(2,N1)
534 P(3)=X(3,N2)-X(3,N1)
535 IF (N3/=0) THEN
536 N3=USR2SYS(N3,ITABM1,MESSF,ID)
537 CALL ANODSET(N3, CHECK_USED)
538 CALL IFRONTPLUS(N3,1)
539 ENDIF
540 P(4)=X(1,N3)-X(1,N1)
541 P(5)=X(2,N3)-X(2,N1)
542 P(6)=X(3,N3)-X(3,N1)
543 P(10)=X(1,N1)
544 P(11)=X(2,N1)
545 P(12)=X(3,N1)
546 ELSE
547 P(1)=ONE
548 P(2)=ZERO
549 P(3)=ZERO
550 P(4)=X(1,N2)-X(1,N1)
551 P(5)=X(2,N2)-X(2,N1)
552 P(6)=X(3,N2)-X(3,N1)
553 P(10)=X(1,N1)
554 P(11)=X(2,N1)
555 P(12)=X(3,N1)
556 ENDIF
557C--- TESTS DE CONSISTANCE
558 PNOR1=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
559 IF(PNOR1<EM20) THEN
560 CALL ANCMSG(MSGID=162,
561 . MSGTYPE=MSGERROR,
562 . ANMODE=ANINFO_BLIND_1,
563 . I2=ITAB(N1),
564 . I1=ID,C1=TITR,
565 . I3=ITAB(N2))
566 RETURN
567 ENDIF
568C--- CALCUL DE COLINEARITE DES VECTEURS N1N2 ET N1N3
569 PNOR2=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
570 IF(PNOR2>EM20) THEN
571 PNORM1=1./(PNOR1*PNOR2)
572 DET1=ABS((P(1)*P(5)-P(2)*P(4))*PNORM1)
573 DET2=ABS((P(1)*P(6)-P(3)*P(4))*PNORM1)
574 DET3=ABS((P(2)*P(6)-P(3)*P(5))*PNORM1)
575 DET= MAX(DET1,DET2,DET3)
576 ELSE
577 DET=ZERO
578 ENDIF
579 IF(DET<EM5) THEN
580 CALL ANCMSG(MSGID=163,
581 . MSGTYPE=MSGWARNING,
582 . ANMODE=ANINFO_BLIND_1,
583 . I1=ID,C1=TITR)
584 IF(ABS(P(2))>EM5) THEN
585 P(4)=ABS(P(1))+TEN
586 ELSE
587 P(5)=TEN
588 ENDIF
589 ENDIF
590C--- CALCUL DE Z'
591 P(7)=P(2)*P(6)-P(3)*P(5)
592 P(8)=P(3)*P(4)-P(1)*P(6)
593 P(9)=P(1)*P(5)-P(2)*P(4)
594C--- CALCUL DE Y'
595 P(4)=P(8)*P(3)-P(9)*P(2)
596 P(5)=P(9)*P(1)-P(7)*P(3)
597 P(6)=P(7)*P(2)-P(8)*P(1)
598 ELSE
599C defined with 1 node and 2 vectors
600C--- CALCUL DE X'
601 P(10)=X(1,N1)
602 P(11)=X(2,N1)
603 P(12)=X(3,N1)
604 P(1)=P(5)*P(9)-P(6)*P(8)
605 P(2)=P(6)*P(7)-P(4)*P(9)
606 P(3)=P(4)*P(8)-P(5)*P(7)
607C--- CALCUL DE Y'
608 P(4)=P(8)*P(3)-P(9)*P(2)
609 P(5)=P(9)*P(1)-P(7)*P(3)
610 P(6)=P(7)*P(2)-P(8)*P(1)
611 ENDIF
612 ELSE
613C----------------
614C FRAME FIXE
615C----------------
616 ISKN(1,JJ)=0
617 ISKN(2,JJ)=0
618 ISKN(3,JJ)=0
619 ISKN(5,JJ)=0
620C-----------------
621C CALCUL DE X'
622C-----------------
623 P(1)=P(5)*P(9)-P(6)*P(8)
624 P(2)=P(6)*P(7)-P(4)*P(9)
625 P(3)=P(4)*P(8)-P(5)*P(7)
626C-----------------
627C CALCUL DE Y'
628C-----------------
629 P(4)=P(8)*P(3)-P(9)*P(2)
630 P(5)=P(9)*P(1)-P(7)*P(3)
631 P(6)=P(7)*P(2)-P(8)*P(1)
632 IF(SUB_ID /= 0)
633 . CALL SUBROTPOINT(P(10),P(11),P(12),RTRANS,SUB_ID,LSUBMODEL)
634 IF(SUB_ID /= 0)
635 . CALL SUBROTVECT(P(1),P(2),P(3),RTRANS,SUB_ID,LSUBMODEL)
636 IF(SUB_ID /= 0)
637 . CALL SUBROTVECT(P(4),P(5),P(6),RTRANS,SUB_ID,LSUBMODEL)
638 IF(SUB_ID /= 0)
639 . CALL SUBROTVECT(P(7),P(8),P(9),RTRANS,SUB_ID,LSUBMODEL)
640 ENDIF
641C-----------
642C NORME
643C-----------
644 PP=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
645 IF(PP/=ZERO)THEN
646 P(1)=P(1)/PP
647 P(2)=P(2)/PP
648 P(3)=P(3)/PP
649 ENDIF
650 PP=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
651 IF(PP/=ZERO)THEN
652 P(4)=P(4)/PP
653 P(5)=P(5)/PP
654 P(6)=P(6)/PP
655 ENDIF
656 PP=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
657 IF(PP/=ZERO)THEN
658 P(7)=P(7)/PP
659 P(8)=P(8)/PP
660 P(9)=P(9)/PP
661 ENDIF
662C
663C-----------
664 DO K=1,12
665 XFRAME(K,I+1)=P(K)
666 ENDDO
667 DO K=1,9
668 XFRAME(18+K,I+1)=P(K)
669 ENDDO
670C-----------
671 ENDDO
672C------------------------------------------------
673 WRITE (IOUT,'(a)')' reference frame sets '
674 WRITE (IOUT,'(a)')' -------------------- '
675 DO I=1,NUMFRAM
676 J=I+1
677 JJ=(NUMSKW+1)+MIN(IUN,NSPCOND)*NUMSPH+I+NSUBMOD+1
678 NSK = ISKN(4,JJ)
679C
680 N1=ISKN(1,JJ)
681 N2=ISKN(2,JJ)
682 N3=ISKN(3,JJ)
683 IF(N1/=0)N1=ITAB(N1)
684 IF(N2/=0)N2=ITAB(N2)
685 IF(N3/=0)N3=ITAB(N3)
686 WRITE(IOUT,1000)
687 WRITE(IOUT,'(1x,4i10,1x,3f16.7,3f16.7)')NSK,N1,N2,N3,
688 & (XFRAME(K,J),K=1,3),(XFRAME(K,J),K=10,12)
689 WRITE(IOUT,'(2(42x,3f16.7/))') (XFRAME(K,J),K=4,9)
690 ENDDO
691C-----
692 900 CONTINUE
693C-------------------------------------
694C Recherche des ID doubles
695C-------------------------------------
696 IF (NUMFRAM+NUMSKW/=0)
697 . CALL UDOUBLE(ISKN(4,1),LISKN,
698 . NUMSKW+1+MIN(IUN,NSPCOND)*NUMSPH+NUMFRAM+1+NSUBMOD,
699 . MESS,0,BID)
700C-----
701 RETURN
702
703 1000 FORMAT(5X,'number',8X,'n1',8X,'n2',8X,'n3',10X,'vectors',42X,
704 . 'origin')
705! 1001 FORMAT(5X,'number',10X,'vectors',42X,'origin')
706 RETURN
707 END
708
integer function origin(nn, ixc, ipartc, ipart)
#define my_real
Definition cppsort.cpp:32
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_get_string(name, sval, size, is_available)
subroutine hm_option_start(entity_type)
subroutine hm_read_frm(iskn, x, itab, itabm1, xframe, lsubmodel, rtrans, nom_opt, unitab)
Definition hm_read_frm.F:50
#define min(a, b)
Definition macros.h:20
initmumps id
integer, parameter nchartitle
integer, parameter ncharkey
integer, parameter ncharfield
integer nsubmod
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
subroutine fretitl(titr, iasc, l)
Definition freform.F:620