]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gsrotm.F
Minor corrections after big transformer changes
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gsrotm.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:56 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 02/07/94 18.24.47 by S.Giani
11*-- Author :
12 SUBROUTINE GSROTM(NMAT,THETA1,PHI1,THETA2,PHI2,THETA3,PHI3)
13C.
14C. ******************************************************************
15C. * *
16C. * STORE ROTATION MATRICES *
17C. * *
18C. * ==>Called by : <USER> *
19C. * Author R.Brun ********* *
20C. * *
21C. ******************************************************************
22C.
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)
28 SAVE SINMIN
29#if defined(CERNLIB_SINGLE)
30 DIMENSION ROTMAT(9)
31 PARAMETER (ONE=1.0,ZERO=0.0)
32 DATA SINMIN/1.00E-5/
33#endif
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)
38 DATA SINMIN/1.00D-5/
39#endif
40C.
41C. ------------------------------------------------------------------
42C.
43 IF(NMAT.LE.0)GO TO 999
44 IF(JROTM.LE.0)CALL MZBOOK(IXCONS,JROTM,JROTM,1,'ROTM',NROTM,NROTM,
45 +0,3,0)
46 IF(NMAT.GT.IQ(JROTM-2)) THEN
47 NPUSH=NMAT-IQ(JROTM-2)+50
48 CALL MZPUSH(IXCONS,JROTM,NPUSH,0,'I')
49 NROTM=IQ(JROTM-2)
50 JR1=0
51 ELSE
52 JR1=LQ(JROTM-NMAT)
53 IF(JR1.GT.0)THEN
54 WRITE(CHMAIL,1000)
55 CALL GMAIL(1,0)
56 CALL GPROTM(NMAT)
57 CALL MZDROP(IXCONS,LQ(JROTM-NMAT),' ')
58 ENDIF
59 ENDIF
60 CALL MZBOOK(IXCONS,JR,JROTM,-NMAT,'ROTM',0,0,16,3,0)
61C
62 Q(JR + 11) = THETA1
63 Q(JR + 12) = PHI1
64 Q(JR + 13) = THETA2
65 Q(JR + 14) = PHI2
66 Q(JR + 15) = THETA3
67 Q(JR + 16) = PHI3
68C
69 DO 10 N = 1,3
70 THERAD = Q(JR+ 9+2*N)*DEGRAD
71 PHIRAD = Q(JR+10+2*N)*DEGRAD
72 SINTHE = SIN(THERAD)
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)
77 10 CONTINUE
78C.
79C.--- Test orthonormality
80 DO 20 J=1,9
81 ROTMAT(J)=Q(JR+J)
82 20 CONTINUE
83 PROD2=ZERO
84C.
85C. X - Y
86 PROD1=
87 +ROTMAT(1)*ROTMAT(4)+ROTMAT(2)*ROTMAT(5)+ROTMAT(3)*ROTMAT(6)
88 IF(ABS(PROD1).GT.SINMIN) GO TO 30
89C.
90C. X - Z
91 PROD2=
92 +ROTMAT(1)*ROTMAT(7)+ROTMAT(2)*ROTMAT(8)+ROTMAT(3)*ROTMAT(9)
93 IF(ABS(PROD2).GT.SINMIN) GO TO 30
94C.
95C. Y - Z
96 PROD3=
97 +ROTMAT(7)*ROTMAT(4)+ROTMAT(8)*ROTMAT(5)+ROTMAT(9)*ROTMAT(6)
98 IF(ABS(PROD3).LE.SINMIN) GO TO 110
99 30 CONTINUE
100C.
101C.--- Orthonormalization needed
102C.
103C. Assume X correct
104 HMOD=ZERO
105 DO 40 J=4,6
106 ROTMAT(J)=ROTMAT(J)-ROTMAT(J-3)*PROD1
107 HMOD=HMOD+ROTMAT(J)*ROTMAT(J)
108 40 CONTINUE
109 HMOD=ONE/SQRT(HMOD)
110 DO 50 J=4,6
111 ROTMAT(J)=ROTMAT(J)*HMOD
112 50 CONTINUE
113C.
114C. Y done, do Z
115C.
116* IF(PROD2.EQ.ZERO) THEN
117* PROD2=
118* + ROTMAT(1)*ROTMAT(7)+ROTMAT(2)*ROTMAT(8)+ROTMAT(3)*ROTMAT(9)
119* ENDIF
120* PROD3=
121* +ROTMAT(4)*ROTMAT(7)+ROTMAT(5)*ROTMAT(8)+ROTMAT(6)*ROTMAT(9)
122* HMOD = ZERO
123* DO 60 J=1,3
124* ROTMAT(J+6)=ROTMAT(J+6)-ROTMAT(J+3)*PROD3-ROTMAT(J)*PROD2
125* HMOD = HMOD+ROTMAT(J)*ROTMAT(J)
126* 60 CONTINUE
127* == AV ==
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)
133* == AV ==
134 HMOD = ONE/SQRT(HMOD)
135 DO 70 J=7,9
136 ROTMAT(J) = ROTMAT(J)*HMOD
137 70 CONTINUE
138C.
139C. Put back the matrix in place
140 DO 80 J=1,9
141 Q(JR+J)=ROTMAT(J)
142 80 CONTINUE
143C.
144C. Now recompute the angles
145 DO 90 J=1,3
146 ANGLES(J*2-1) = ACOS(MAX(-ONE,MIN(ONE,ROTMAT(J*3))))*RADDEG
147 ANGLES(J*2) = ZERO
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
151 ENDIF
152 90 CONTINUE
153 WRITE(CHMAIL,2000) NMAT
154 CALL GMAIL(1,2)
155 WRITE(CHMAIL,2001) (Q(JR+10+J),J=1,6)
156 CALL GMAIL(0,0)
157 WRITE(CHMAIL,2002) ANGLES
158 CALL GMAIL(0,1)
159C.
160C. Put back the angles in place
161 DO 100 J=1,6
162 Q(JR+10+J) = ANGLES(J)
163 100 CONTINUE
164C.
165C.--- Orthonormalization ended
166 110 CONTINUE
167C
168 DO 130 J = 1,3
169 IP(J) = 3
170 JJR=JR+J*3-3
171C
172 DO 120 I = 1,3
173 IF(ABS(Q(JJR+I)).LT.0.99999) GO TO 120
174C
175 IP(J) = I + 3
176 IF(Q(JJR+I).GE.0.) GO TO 130
177C
178 IP(J) = 3 - I
179 GO TO 130
180C
181 120 CONTINUE
182 130 CONTINUE
183C
184 Q(JR + 10) = IP(1) + 10* IP(2) + 100* IP(3)
185C
186 IF(JR1.GT.0) THEN
187 CALL GPROTM(-NMAT)
188 ENDIF
189C
1901000 FORMAT(' *** GSROTM ***: Warning, rotation matrix redefinition:')
1912000 FORMAT(' *** GSROTM ***: ',
192 + 'Parameters of matrix no. ',I4,' changed:')
1932001 FORMAT(' Old values: ',6(F14.7,3X))
1942002 FORMAT(' New values: ',6(F14.7,3X))
195 999 RETURN
196 END