5 * Revision 1.2 1996/02/27 10:30:56 ravndal
6 * Correct interaction length for heavy ions
8 * Revision 1.1.1.1 1995/10/24 10:21:43 cernlib
12 #include "geant321/pilot.h"
13 *CMZ : 3.21/04 13/12/94 15.23.45 by S.Giani
17 C. ******************************************************************
21 C. * Stores in stack JTRACK the information for current track *
22 C. * segment at exit of current Volume/Medium. *
24 C. * Called by : GTRACK *
25 C. * Authors : S.Banerjee, F.Bruyant *
27 C. ******************************************************************
29 #include "geant321/gcbank.inc"
30 #include "geant321/gckine.inc"
31 #include "geant321/gcnum.inc"
32 #include "geant321/gcphys.inc"
33 #include "geant321/gcstak.inc"
34 #include "geant321/gctrak.inc"
35 #include "geant321/gcunit.inc"
36 #include "geant321/gcvolu.inc"
39 C. ------------------------------------------------------------------
41 * *** Find where in the tracking skeleton to enter the current track
43 IF (NLEVIN.EQ.NLEVEL) THEN
44 * (case when GINVOL has not been called)
45 JVO = LQ(JVOLUM-LVOLUM(NLEVIN))
48 * ** Point is in content predicted by GTNEXT, go one level down
55 LINDEX(NLEVIN) = INGOTO
56 LINMX (NLEVIN) = Q(JVO+3)
58 * ** Prepare the translation and rotation matrices if necessary
60 JSKL = LQ(JSKLT-NLEVIN)
63 DO 29 ILEV = 1, NLEVEL
64 IF (IQ(JSKL+IOFF+ILEV).NE.LINDEX(ILEV)) GO TO 30
68 IF (IQ(JSK+1).GT.0) GO TO 100
70 CALL GTRMUL (GTRAN(1,NLEVEL), GRMAT(1,NLEVEL), Q(JIN+5),
71 + IROTT, GTRAN(1,NLEVIN), GRMAT(1,NLEVIN))
75 * ** otherwise, go one level up
81 ELSE IF (NLEVIN.GT.NLEVEL) THEN
85 ELSE IF (NLEVIN.LT.0) THEN
86 * (case when entering a dominant overlaping volume)
88 INFROM = LINDEX(NLEVIN+1)
92 * ** Track has left current volume, check levels up
94 80 IF (NLEVIN.EQ.0) GO TO 999
96 IF (GRMAT(10,NLEVIN).EQ.0.) THEN
98 XC(I) = VECT(I) -GTRAN(I,NLEVIN)
101 C (later, code in line)
102 CALL GTRNSF (VECT, GTRAN(1,NLEVIN), GRMAT(1,NLEVIN), XC)
105 JVO = LQ(JVOLUM-LVOLUM(NLEVIN))
106 JPAR = LQ(JGPAR-NLEVIN)
107 CALL GINME (XC, Q(JVO+2), Q(JPAR+1), IYES)
109 INFROM = LINDEX(NLEVIN+1)
115 * *** Allocate last 'garbaged' area if any, otherwise first 'free' one
117 100 IF (NJGARB.NE.0) THEN
119 LCUR = JTRACK +(NCUR-1)*NWTRAC
123 LCUR = JTRACK +(NCUR-1)*NWTRAC
127 * *** Link allocated area to relevant chain in JSKLT structure
129 JSKL = LQ(JSKLT-NLEVIN)
130 IQ(LCUR+1) = IQ(JSKL+LINDEX(NLEVIN))
131 IQ(JSKL+LINDEX(NLEVIN)) = NCUR
133 * *** Store information for current track segment in stack JTRACK
141 *free IQ(LCUR+8) = IDECAD
156 IPCUR = IPCUR +NWREAL
157 IF (ITRTYP.EQ.1) THEN
164 ELSE IF (ITRTYP.EQ.2) THEN
169 ELSE IF (ITRTYP.EQ.3) THEN
173 ELSE IF (ITRTYP.EQ.4) THEN
178 ELSE IF (ITRTYP.EQ.5) THEN
185 ELSE IF (ITRTYP.EQ.7) THEN
188 ELSE IF (ITRTYP.EQ.8) THEN
194 * *** Take care of the skeleton
196 IF (NLEVIN.GT.NLDOWN) THEN
198 JSKL = LQ(JSKLT-NLDOWN)
200 * ** Clear skeleton at lowest level if necessary
202 JOFF = JSKL + IQ(JSKL-3)
203 DO 229 ILEV = 1, NLDOWN-1
204 IF (IQ(JOFF+ILEV).EQ.LINDEX(ILEV)) GO TO 229
205 NINSK = LINMX(NLDOWN)
210 DO 219 I = ILEV, NLDOWN-1
211 IQ(JOFF+I) = LINDEX(I)
217 * ** Fill up the skeleton at NLDOWN
219 230 IF (NLEVIN.GT.NLEVEL) THEN
220 JSKL = LQ(JSKLT-NLDOWN)
221 JSK = LQ(JSKL-LINDEX(NLDOWN))
222 IF (IQ(JSK+1).LE.0) THEN
223 LQ(JSK-1) = LQ(JGPAR-NLDOWN)
224 IQ(JSK+1) = IQ(JGPAR+NLDOWN)
225 IQ(JSK+2) = LVOLUM(NLDOWN)
227 Q(JSK+2+I) = GTRAN(I,NLDOWN)
230 Q(JSK+5+I) = GRMAT(I,NLDOWN)
236 * *** Update NALIVE and test if tracking stack is full
239 IF (NALIVE-IQ(JSTAK+1).GE.NJTMAX) THEN
245 LINSAV(I) = LINDEX(I)
250 1001 FORMAT (' GSTRAC : Stack JTRACK full. Inhibit parallel tracking')