1 *CMZ : 24/11/95 16.28.16 by S.Ravndal
2 *CMZ : 3.21/02 29/03/94 15.41.49 by S.Giani
6 C. ******************************************************************
8 C. * Average charged track is extrapolated by one step *
10 C. * ==>Called by : ERTRGO *
11 C. * Original routine : GTHADR *
12 C. * Authors M.Maire, E.Nagy ********* *
14 C. ******************************************************************
16 #include "geant321/gcbank.inc"
17 #include "geant321/gconst.inc"
18 #include "geant321/gccuts.inc"
19 #include "geant321/gcphys.inc"
20 #include "geant321/gcjloc.inc"
21 #include "geant321/gckine.inc"
22 #include "geant321/gcmate.inc"
23 #include "geant321/gcmulo.inc"
24 #include "geant321/gctmed.inc"
25 #include "geant321/gctrak.inc"
26 #include "geant321/gcunit.inc"
27 #include "geant321/ertrio.inc"
28 #include "geant321/erwork.inc"
30 #if defined(CERNLIB_SINGLE)
31 PARAMETER (EPSMAC=1.E-11)
33 #if !defined(CERNLIB_SINGLE)&&!defined(CERNLIB_IBM)
34 PARAMETER (EPSMAC=5.E-6)
36 #if !defined(CERNLIB_SINGLE)&&defined(CERNLIB_IBM)
37 PARAMETER (EPSMAC=5.E-5)
39 #if !defined(CERNLIB_SINGLE)
40 DOUBLE PRECISION GKR,DEMEAN,STOPP1,STOPP2,STOPMX,STOPRG,STOPC
41 DOUBLE PRECISION EKIPR
44 SAVE CFLD,CHARG2,RMASS,CUTPRO,IKCUT,STOPC
46 C. ------------------------------------------------------------------
49 * *** Update local pointers if medium has changed
53 CHARG2 = CHARGE*CHARGE
58 ELSE IF (IPART.LE.6) THEN
65 JRANG = LQ(JMA-16) + NEK1
67 CUTPRO = MAX(CUTEK*RMASS,ELOW(1))
68 IKCUT = GEKA*LOG10(CUTPRO) + GEKB
69 GKR = (CUTPRO - ELOW(IKCUT))/(ELOW(IKCUT+1) - ELOW(IKCUT))
70 STOPC = (1.-GKR)*Q(JRANG+IKCUT) + GKR*Q(JRANG+IKCUT+1)
72 IF (FIELDM.NE.0.) CFLD = 3333.*DEGRAD*TMAXFD/ABS(FIELDM*CHARGE)
75 * *** Compute current step size
80 * *** Step limitation due to energy loss (stopping range) ?
82 IF (ILOSS*DEEMAX.GT.0.) THEN
83 STOPP1 = GEKRT1*Q(JRANG+IEKBIN) + GEKRAT*Q(JRANG+IEKBIN+1)
84 STOPMX = (STOPP1 - STOPC)/(RMASS*CHARG2)
85 EKF = (1. - BACKTR*DEEMAX)*GEKIN*RMASS
86 IF (EKF.LT.ELOW(1)) EKF = ELOW(1)
87 IF (EKF.GE.ELOW(NEK1)) EKF = ELOW(NEK1)*0.99
88 IKF=GEKA*LOG10(EKF)+GEKB
89 GKR=(EKF-ELOW(IKF))/(ELOW(IKF+1)-ELOW(IKF))
90 STOPP2 = (1.-GKR)*Q(JRANG+IKF) + GKR*Q(JRANG+IKF+1)
91 SLOSP = ABS (STOPP1 - STOPP2)
92 STEP = SLOSP/(RMASS*CHARG2)
95 * *** Step limitation due to energy loss in magnetic field ?
97 IF (IFIELD*FIELDM.NE.0.) THEN
99 IF (SFIELD.LT.STEP) STEP = SFIELD
102 * *** Compute point where to store error matrix
109 IF (LELENG) STEPE = ERLENG(IPR) - SLENG
114 SCAL1 = SCAL1 + ERPLO(I,4,IPR)*(ERPLO(I,3,IPR)-VECT(I))
115 SCAL2 = SCAL2 + ERPLO(I,4,IPR)*VECT(I+3)
119 IF (STEPE.LE.PREC) STEPE = BIG
120 IF (STEPE.LT.STEPER) THEN
123 IF (LEPLAN) ASCL1 = ABS (SCAL1)
126 IF (STEPER.LE.STEP) THEN
131 * *** Step limitation due to geometry ?
134 IF (STEP.GE.0.95*SAFETY) THEN
136 IF (IGNEXT.NE.0) THEN
139 IF ((STEPER-SNEXT).GT.(2*PREC)) LERST = 0
143 * *** Linear transport when no field or very short step
145 IF (IFIELD.EQ.0.OR.STEP.LE.2*PREC) THEN
146 IF (IGNEXT.NE.0) THEN
148 VECTMP = VECT(I) +STEP*VECT(I+3)
149 IF(VECTMP.EQ.VECT(I)) THEN
151 * *** Correct for machine precision
153 IF(VECT(I+3).NE.0.) THEN
155 + VECT(I)+ABS(VECT(I))*SIGN(1.,VECT(I+3))*EPSMAC
159 WRITE(CHMAIL, 10100) GEKIN, NUMED, STEP, SNEXT
161 10000 FORMAT(' Boundary correction in ERTRCH: ',
162 + ' GEKIN NUMED STEP SNEXT')
163 10100 FORMAT(31X,E10.3,1X,I10,1X,E10.3,1X,E10.3,1X)
174 VOUT(I) = VECT(I) +STEP*VECT(I+3)
183 * *** otherwise, swim particle in magnetic field
190 CALL GUSWIM (CHTR , STEP, VECT, VOUT)
192 * When near to boundary, take proper action (cut-step,crossing...)
193 IF (STEP.GE.SAFETY) THEN
195 IF (IGNEXT.NE.0) THEN
197 VNEXT(I+3) = VECT(I+3)
198 VNEXT(I) = VECT(I) +SNEXT*VECT(I+3)
201 IF (ABS(VOUT(I)-VNEXT(I)).GT.EPSIL) GO TO 55
206 55 CALL GINVOL (VOUT,ISAME)
208 IF ((INEAR.NE.0).OR.(STEP.LT.EPSIL)) THEN
216 IF (LMEC(NMEC).NE.24) THEN
226 * preset plane reached ?
228 IF ((LEPLAN).AND.(STEP.GE.ASCL1)) THEN
231 SCAL3=SCAL3+ERPLO(I,4,INLIST)*(ERPLO(I,3,INLIST)-VOUT(I))
235 IF (SCAL3*SSCL1.LT. -PREC) THEN
237 STEP = STEP*(ASCL1/(ASCL1+ASCL3))
242 IF(ASCL3.LE.PREC) LERST = 1
250 IF (LELENG.AND.(STEP.GE.STEPER)) LERST = 1
254 * *** Now apply selected mechanisms
262 * *** apply energy loss : find the kinetic energy corresponding
263 * to the new stopping range = stopmx -/+ step
264 * (take care of the back tracking !)
266 IF (ILOSS*DEEMAX.GT.0) THEN
269 CALL ERLAND (STEP,Z,A,DENS,VECT(7),GETOT,AMASS,DEDX2)
270 DEDX2 = DEDX2*CHARG2*CHARG2
271 STOPRG = STOPP1 - BACKTR*STEP*RMASS*CHARG2
273 IF (BACKTR.LE.0.) THEN
274 95 IF (STOPRG.LT.Q(JRANG+IKF)) THEN
276 IF (IKF.GT.1) GO TO 95
279 96 IF (STOPRG.GE.Q(JRANG+IKF+1)) THEN
281 IF (IKF.LT.NEK1) GO TO 96
284 GKR = (STOPRG - Q(JRANG+IKF)) / (Q(JRANG+IKF+1) - Q(JRANG+IKF))
285 EKIPR = (1. -GKR)*ELOW(IKF) + GKR*ELOW(IKF+1)
287 IF (GEKINT.GT.CUTEK) THEN
288 DESTEP = ABS (GEKIN - GEKINT)
290 GETOT = GEKIN + AMASS
291 VECT(7)= SQRT((GETOT+AMASS)*GEKIN)
305 * *** Propagate error matrix
307 IF (.NOT. LEONLY) CALL ERPROP
309 * *** Store informations