5 * Revision 1.1.1.1 1995/10/24 10:20:56 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 02/07/94 18.24.47 by S.Giani
12 SUBROUTINE GSROTM(NMAT,THETA1,PHI1,THETA2,PHI2,THETA3,PHI3)
14 C. ******************************************************************
16 C. * STORE ROTATION MATRICES *
18 C. * ==>Called by : <USER> *
19 C. * Author R.Brun ********* *
21 C. ******************************************************************
23 #include "geant321/gcbank.inc"
24 #include "geant321/gcunit.inc"
25 #include "geant321/gconsp.inc"
26 #include "geant321/gcnum.inc"
27 DIMENSION ANGLES(6),IP(3)
29 #if defined(CERNLIB_SINGLE)
31 PARAMETER (ONE=1.0,ZERO=0.0)
34 #if !defined(CERNLIB_SINGLE)
35 DOUBLE PRECISION ROTMAT(9),ONE,ZERO
36 DOUBLE PRECISION PROD1,PROD2,PROD3,HMOD,SINMIN
37 PARAMETER (ONE=1.D0,ZERO=0.D0)
41 C. ------------------------------------------------------------------
43 IF(NMAT.LE.0)GO TO 999
44 IF(JROTM.LE.0)CALL MZBOOK(IXCONS,JROTM,JROTM,1,'ROTM',NROTM,NROTM,
46 IF(NMAT.GT.IQ(JROTM-2)) THEN
47 NPUSH=NMAT-IQ(JROTM-2)+50
48 CALL MZPUSH(IXCONS,JROTM,NPUSH,0,'I')
57 CALL MZDROP(IXCONS,LQ(JROTM-NMAT),' ')
60 CALL MZBOOK(IXCONS,JR,JROTM,-NMAT,'ROTM',0,0,16,3,0)
70 THERAD = Q(JR+ 9+2*N)*DEGRAD
71 PHIRAD = Q(JR+10+2*N)*DEGRAD
73 Q(JR+3*N-2) = SINTHE * COS(PHIRAD)
74 Q(JR+3*N-1) = SINTHE * SIN(PHIRAD)
75 Q(JR+3*N ) = COS(THERAD)
76 CALL VUNIT (Q(JR+3*N-2),Q(JR+3*N-2),3)
79 C.--- Test orthonormality
87 +ROTMAT(1)*ROTMAT(4)+ROTMAT(2)*ROTMAT(5)+ROTMAT(3)*ROTMAT(6)
88 IF(ABS(PROD1).GT.SINMIN) GO TO 30
92 +ROTMAT(1)*ROTMAT(7)+ROTMAT(2)*ROTMAT(8)+ROTMAT(3)*ROTMAT(9)
93 IF(ABS(PROD2).GT.SINMIN) GO TO 30
97 +ROTMAT(7)*ROTMAT(4)+ROTMAT(8)*ROTMAT(5)+ROTMAT(9)*ROTMAT(6)
98 IF(ABS(PROD3).LE.SINMIN) GO TO 110
101 C.--- Orthonormalization needed
106 ROTMAT(J)=ROTMAT(J)-ROTMAT(J-3)*PROD1
107 HMOD=HMOD+ROTMAT(J)*ROTMAT(J)
111 ROTMAT(J)=ROTMAT(J)*HMOD
116 * IF(PROD2.EQ.ZERO) THEN
118 * + ROTMAT(1)*ROTMAT(7)+ROTMAT(2)*ROTMAT(8)+ROTMAT(3)*ROTMAT(9)
121 * +ROTMAT(4)*ROTMAT(7)+ROTMAT(5)*ROTMAT(8)+ROTMAT(6)*ROTMAT(9)
124 * ROTMAT(J+6)=ROTMAT(J+6)-ROTMAT(J+3)*PROD3-ROTMAT(J)*PROD2
125 * HMOD = HMOD+ROTMAT(J)*ROTMAT(J)
128 ROTMAT(7) = ROTMAT(2)*ROTMAT(6) - ROTMAT(3)*ROTMAT(5)
129 ROTMAT(8) = ROTMAT(3)*ROTMAT(4) - ROTMAT(1)*ROTMAT(6)
130 ROTMAT(9) = ROTMAT(1)*ROTMAT(5) - ROTMAT(2)*ROTMAT(4)
131 HMOD = ZERO + ROTMAT(7)*ROTMAT(7) + ROTMAT(8)*ROTMAT(8)
132 & + ROTMAT(9)*ROTMAT(9)
134 HMOD = ONE/SQRT(HMOD)
136 ROTMAT(J) = ROTMAT(J)*HMOD
139 C. Put back the matrix in place
144 C. Now recompute the angles
146 ANGLES(J*2-1) = ACOS(MAX(-ONE,MIN(ONE,ROTMAT(J*3))))*RADDEG
148 IF(ROTMAT(J*3-1).NE.ZERO) THEN
149 ANGLES(J*2) = ATAN2(ROTMAT(J*3-1),ROTMAT(J*3-2))*RADDEG
150 IF(ANGLES(2*J).LT.0.0) ANGLES(2*J) = ANGLES(2*J)+360.0
153 WRITE(CHMAIL,2000) NMAT
155 WRITE(CHMAIL,2001) (Q(JR+10+J),J=1,6)
157 WRITE(CHMAIL,2002) ANGLES
160 C. Put back the angles in place
162 Q(JR+10+J) = ANGLES(J)
165 C.--- Orthonormalization ended
173 IF(ABS(Q(JJR+I)).LT.0.99999) GO TO 120
176 IF(Q(JJR+I).GE.0.) GO TO 130
184 Q(JR + 10) = IP(1) + 10* IP(2) + 100* IP(3)
190 1000 FORMAT(' *** GSROTM ***: Warning, rotation matrix redefinition:')
191 2000 FORMAT(' *** GSROTM ***: ',
192 + 'Parameters of matrix no. ',I4,' changed:')
193 2001 FORMAT(' Old values: ',6(F14.7,3X))
194 2002 FORMAT(' New values: ',6(F14.7,3X))