49 . XFRAME ,LSUBMODEL,RTRANS ,NOM_OPT ,UNITAB)
58 USE format_mod ,
ONLY : lfield
62#include "implicit_f.inc"
66#include "analyse_name.inc"
79 TYPE (UNIT_TYPE_),
INTENT(IN) ::UNITAB
80 INTEGER ISKN(LISKN,*), ITAB(*), ITABM1(*)
81 my_real x(3,*), xframe(nxframe,*),rtrans(ntransf,*)
87 INTEGER I, IMOV, INOD, J, N1, N2, N3, K, NSK,
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
102 DATA messf/
'MOVING FRAME '/
103 DATA nomfg/
'global reference frame '/
119 jj=(numskw+1)+
min(iun,nspcond)*numsph+1+
nsubmod
126 nom_opt(1,numskw+2)=-1
127 CALL fretitl(nomfg,nom_opt(lnopt1-ltitr+1,numskw+2),ltitr)
129 IF(numfram==0)
GOTO 900
140 jj=(numskw+1)+
min(iun,nspcond)*numsph+i+1+
nsubmod
147 . submodel_id = sub_id,
148 . option_titr = titr,
151 nom_opt(1,numskw+2+i)=
id
152 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,
157 IF (unitab%UNIT_ID(j) == uid)
THEN
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',
172 IF (key(1:3)==
'FIX')
THEN
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)
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)
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)
188 ELSEIF (key(1:4)==
'MOV2')
THEN
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)
197 ELSEIF (key(1:3)==
'MOV')
THEN
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)
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
217 ELSEIF (KEY(1:3)=='nod
') THEN
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
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)
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)
240 . CALL SUBROTVECT(P(4),P(5),P(6),RTRANS,SUB_ID,LSUBMODEL)
242 . CALL SUBROTVECT(P(7),P(8),P(9),RTRANS,SUB_ID,LSUBMODEL)
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)
268 ELSEIF(IDIR == 2) THEN
272 ELSEIF(IDIR == 3) THEN
278 N3=USR2SYS(N3,ITABM1,MESSF,ID)
279 CALL ANODSET(N3, CHECK_USED)
280 CALL IFRONTPLUS(N3,1)
287 ELSEIF (IDIR == 2) THEN
291 ELSEIF (IDIR == 3) THEN
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,
322 . ANMODE=ANINFO_BLIND_1,
330 PNOR2=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
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)
341 CALL ANCMSG(MSGID=163,
342 . MSGTYPE=MSGWARNING,
343 . ANMODE=ANINFO_BLIND_1,
345 IF(ABS(P(2))>EM5) THEN
351 ELSEIF (IDIR == 2) THEN
352 PNOR2=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
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)
363 CALL ANCMSG(MSGID=163,
364 . MSGTYPE=MSGWARNING,
365 . ANMODE=ANINFO_BLIND_1,
367 IF(ABS(P(5))>EM5) THEN
373 ELSEIF (IDIR == 3) THEN
374 PNOR2=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
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)
385 CALL ANCMSG(MSGID=163,
386 . MSGTYPE=MSGWARNING,
387 . ANMODE=ANINFO_BLIND_1,
389 IF(ABS(P(5))>EM5) 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)
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)
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)
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)
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)
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,
476 . ANMODE=ANINFO_BLIND_1,
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)
493 CALL ANCMSG(MSGID=163,
494 . MSGTYPE=MSGWARNING,
495 . ANMODE=ANINFO_BLIND_1,
497 IF(ABS(P(2)) < EM5) THEN
506 ELSEIF (INOD>=1) THEN
508 CALL ANCMSG(MSGID=900,
510 . ANMODE=ANINFO_BLIND_1,
516 N1=USR2SYS(N1,ITABM1,MESSF,ID)
517 CALL ANODSET(N1, CHECK_USED)
518 CALL IFRONTPLUS(N1,1)
521 N2=USR2SYS(N2,ITABM1,MESSF,ID)
522 CALL ANODSET(N2, CHECK_USED)
523 CALL IFRONTPLUS(N2,1)
536 N3=USR2SYS(N3,ITABM1,MESSF,ID)
537 CALL ANODSET(N3, CHECK_USED)
538 CALL IFRONTPLUS(N3,1)
558 PNOR1=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
560 CALL ANCMSG(MSGID=162,
562 . ANMODE=ANINFO_BLIND_1,
569 PNOR2=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
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)
580 CALL ANCMSG(MSGID=163,
581 . MSGTYPE=MSGWARNING,
582 . ANMODE=ANINFO_BLIND_1,
584 IF(ABS(P(2))>EM5) THEN
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)
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)
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)
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)
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)
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)
633 . CALL SUBROTPOINT(P(10),P(11),P(12),RTRANS,SUB_ID,LSUBMODEL)
635 . CALL SUBROTVECT(P(1),P(2),P(3),RTRANS,SUB_ID,LSUBMODEL)
637 . CALL SUBROTVECT(P(4),P(5),P(6),RTRANS,SUB_ID,LSUBMODEL)
639 . CALL SUBROTVECT(P(7),P(8),P(9),RTRANS,SUB_ID,LSUBMODEL)
644 PP=SQRT(P(1)*P(1)+P(2)*P(2)+P(3)*P(3))
650 PP=SQRT(P(4)*P(4)+P(5)*P(5)+P(6)*P(6))
656 PP=SQRT(P(7)*P(7)+P(8)*P(8)+P(9)*P(9))
668 XFRAME(18+K,I+1)=P(K)
673 WRITE (IOUT,'(a)
')' reference frame sets
'
674 WRITE (IOUT,'(a)
')' --------------------
'
677 JJ=(NUMSKW+1)+MIN(IUN,NSPCOND)*NUMSPH+I+NSUBMOD+1
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)
696 IF (NUMFRAM+NUMSKW/=0)
697 . CALL UDOUBLE(ISKN(4,1),LISKN,
698 . NUMSKW+1+MIN(IUN,NSPCOND)*NUMSPH+NUMFRAM+1+NSUBMOD,
703 1000 FORMAT(5X,'number
',8X,'n1
',8X,'n2
',8X,'n3
',10X,'vectors
',42X,
705! 1001 FORMAT(5X,'number
',10X,'vectors
',42X,'origin')
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)