/[PAMELA software]/DarthVader/TrackerLevel2/src/F77/grkuta.f
ViewVC logotype

Contents of /DarthVader/TrackerLevel2/src/F77/grkuta.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (show annotations) (download)
Tue Nov 27 11:43:51 2007 UTC (17 years, 2 months ago) by pam-fi
Branch: MAIN
Changes since 1.5: +14 -1 lines
implemented m.field deformation, for alignment purpouse

1 **********************************************************************
2 *
3 *
4 * routine per tracciare la particella di uno STEP
5 *
6 SUBROUTINE GRKUTA (CHARGE,STEP,VECT,VOUT)
7 C.
8 C. ******************************************************************
9 C. * *
10 C. * Runge-Kutta method for tracking a particle through a magnetic *
11 C. * field. Uses Nystroem algorithm (See Handbook Nat. Bur. of *
12 C. * Standards, procedure 25.5.20) *
13 C. * *
14 C. * Input parameters *
15 C. * CHARGE Particle charge *
16 C. * STEP Step size *
17 C. * VECT Initial co-ords,direction cosines,momentum *
18 C. * Output parameters *
19 C. * VOUT Output co-ords,direction cosines,momentum *
20 C. * User routine called *
21 C. * CALL GUFLD(X,F) *
22 C. * *
23 C. * ==>Called by : <USER>, GUSWIM *
24 C. * Authors R.Brun, M.Hansroul ********* *
25 C. * V.Perevoztchikov (CUT STEP implementation) *
26 C. * *
27 C. * *
28 C. ******************************************************************
29 C.
30 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
31 COMMON/DELTAB/DELTA0,DELTA1
32 *
33 REAL VVV(3),FFF(3)
34 REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)
35 REAL*8 XYZT(3), XYZ(3), X, Y, Z, XT, YT, ZT
36 DIMENSION SECXS(4),SECYS(4),SECZS(4),HXP(3)
37 EQUIVALENCE (X,XYZ(1)),(Y,XYZ(2)),(Z,XYZ(3)),
38 + (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))
39 *
40 PARAMETER (MAXIT = 1992, MAXCUT = 11)
41 PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)
42 PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)
43 PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)
44 PARAMETER (PISQUA=.986960440109D+01)
45 PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)
46
47 REAL*8 DELTAB(3)
48
49 *.
50 *. ------------------------------------------------------------------
51 *.
52 * This constant is for units CM,GEV/C and KGAUSS
53 *
54
55 ITER = 0
56 NCUT = 0
57 DO 10 J=1,7
58 VOUT(J)=VECT(J)
59 10 CONTINUE
60 PINV = EC * CHARGE / VECT(7)
61 TL = 0.
62 H = STEP
63 *
64 *
65 20 REST = STEP-TL
66 IF (DABS(H).GT.DABS(REST)) H = REST
67 DO I=1,3
68 VVV(I)=SNGL(VOUT(I))
69 ENDDO
70
71 CALL GUFLD(VVV,FFF)
72 * print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)
73 DO I=1,3
74 F(I)=DBLE(FFF(I))
75 ENDDO
76 DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
77 F(2) = F(2)+DELTAB(2)
78 cPP -----------------
79 *
80 * Start of integration
81 *
82 X = VOUT(1)
83 Y = VOUT(2)
84 Z = VOUT(3)
85 A = VOUT(4)
86 B = VOUT(5)
87 C = VOUT(6)
88 *
89 H2 = HALF * H
90 H4 = HALF * H2
91 PH = PINV * H
92 PH2 = HALF * PH
93 SECXS(1) = (B * F(3) - C * F(2)) * PH2
94 SECYS(1) = (C * F(1) - A * F(3)) * PH2
95 SECZS(1) = (A * F(2) - B * F(1)) * PH2
96 ANG2 = (SECXS(1)**2 + SECYS(1)**2 + SECZS(1)**2)
97 IF (ANG2.GT.PISQUA) GO TO 40
98 DXT = H2 * A + H4 * SECXS(1)
99 DYT = H2 * B + H4 * SECYS(1)
100 DZT = H2 * C + H4 * SECZS(1)
101 XT = X + DXT
102 YT = Y + DYT
103 ZT = Z + DZT
104 *
105 * Second intermediate point
106 *
107 EST = DABS(DXT)+DABS(DYT)+DABS(DZT)
108 IF (EST.GT.H) GO TO 30
109
110 DO I=1,3
111 VVV(I)=SNGL(XYZT(I))
112 ENDDO
113 CALL GUFLD(VVV,FFF)
114 DO I=1,3
115 F(I)=DBLE(FFF(I))
116 ENDDO
117 DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
118 F(2) = F(2)+DELTAB(2)
119 cPP -----------------
120 C CALL GUFLD(XYZT,F)
121 AT = A + SECXS(1)
122 BT = B + SECYS(1)
123 CT = C + SECZS(1)
124 *
125 SECXS(2) = (BT * F(3) - CT * F(2)) * PH2
126 SECYS(2) = (CT * F(1) - AT * F(3)) * PH2
127 SECZS(2) = (AT * F(2) - BT * F(1)) * PH2
128 AT = A + SECXS(2)
129 BT = B + SECYS(2)
130 CT = C + SECZS(2)
131 SECXS(3) = (BT * F(3) - CT * F(2)) * PH2
132 SECYS(3) = (CT * F(1) - AT * F(3)) * PH2
133 SECZS(3) = (AT * F(2) - BT * F(1)) * PH2
134 DXT = H * (A + SECXS(3))
135 DYT = H * (B + SECYS(3))
136 DZT = H * (C + SECZS(3))
137 XT = X + DXT
138 YT = Y + DYT
139 ZT = Z + DZT
140 AT = A + TWO*SECXS(3)
141 BT = B + TWO*SECYS(3)
142 CT = C + TWO*SECZS(3)
143 *
144 EST = ABS(DXT)+ABS(DYT)+ABS(DZT)
145 IF (EST.GT.2.*ABS(H)) GO TO 30
146
147 DO I=1,3
148 VVV(I)=SNGL(XYZT(I))
149 ENDDO
150 CALL GUFLD(VVV,FFF)
151 DO I=1,3
152 F(I)=DBLE(FFF(I))
153 ENDDO
154 DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
155 F(2) = F(2)+DELTAB(2)
156 cPP -----------------
157 C CALL GUFLD(XYZT,F)
158 *
159 Z = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H
160 Y = Y + (B + (SECYS(1) + SECYS(2) + SECYS(3)) * THIRD) * H
161 X = X + (A + (SECXS(1) + SECXS(2) + SECXS(3)) * THIRD) * H
162 *
163 SECXS(4) = (BT*F(3) - CT*F(2))* PH2
164 SECYS(4) = (CT*F(1) - AT*F(3))* PH2
165 SECZS(4) = (AT*F(2) - BT*F(1))* PH2
166 A = A+(SECXS(1)+SECXS(4)+TWO * (SECXS(2)+SECXS(3))) * THIRD
167 B = B+(SECYS(1)+SECYS(4)+TWO * (SECYS(2)+SECYS(3))) * THIRD
168 C = C+(SECZS(1)+SECZS(4)+TWO * (SECZS(2)+SECZS(3))) * THIRD
169 *
170 EST = ABS(SECXS(1)+SECXS(4) - (SECXS(2)+SECXS(3)))
171 ++ ABS(SECYS(1)+SECYS(4) - (SECYS(2)+SECYS(3)))
172 ++ ABS(SECZS(1)+SECZS(4) - (SECZS(2)+SECZS(3)))
173 *
174 IF (EST.GT.DLT .AND. ABS(H).GT.1.E-4) GO TO 30
175 ITER = ITER + 1
176 NCUT = 0
177 * If too many iterations, go to HELIX
178 IF (ITER.GT.MAXIT) GO TO 40
179 *
180 TL = TL + H
181 IF (EST.LT.(DLT32)) THEN
182 H = H*TWO
183 ENDIF
184 CBA = ONE/ SQRT(A*A + B*B + C*C)
185 VOUT(1) = X
186 VOUT(2) = Y
187 VOUT(3) = Z
188 VOUT(4) = CBA*A
189 VOUT(5) = CBA*B
190 VOUT(6) = CBA*C
191 REST = STEP - TL
192 IF (STEP.LT.0.) REST = -REST
193 IF (REST .GT. 1.E-5*DABS(STEP)) GO TO 20
194 *
195 GO TO 999
196 *
197 ** CUT STEP
198 30 NCUT = NCUT + 1
199 * If too many cuts , go to HELIX
200 IF (NCUT.GT.MAXCUT) GO TO 40
201 H = H*HALF
202 GO TO 20
203 *
204 ** ANGLE TOO BIG, USE HELIX
205 40 F1 = F(1)
206 F2 = F(2)
207 F3 = F(3)
208 F4 = DSQRT(F1**2+F2**2+F3**2)
209 RHO = -F4*PINV
210 TET = RHO * STEP
211 IF(TET.NE.0.) THEN
212 HNORM = ONE/F4
213 F1 = F1*HNORM
214 F2 = F2*HNORM
215 F3 = F3*HNORM
216 *
217 HXP(1) = F2*VECT(IPZ) - F3*VECT(IPY)
218 HXP(2) = F3*VECT(IPX) - F1*VECT(IPZ)
219 HXP(3) = F1*VECT(IPY) - F2*VECT(IPX)
220
221 HP = F1*VECT(IPX) + F2*VECT(IPY) + F3*VECT(IPZ)
222 *
223 RHO1 = ONE/RHO
224 SINT = DSIN(TET)
225 COST = TWO*DSIN(HALF*TET)**2
226 *
227 G1 = SINT*RHO1
228 G2 = COST*RHO1
229 G3 = (TET-SINT) * HP*RHO1
230 G4 = -COST
231 G5 = SINT
232 G6 = COST * HP
233
234 VOUT(IX) = VECT(IX) + (G1*VECT(IPX) + G2*HXP(1) + G3*F1)
235 VOUT(IY) = VECT(IY) + (G1*VECT(IPY) + G2*HXP(2) + G3*F2)
236 VOUT(IZ) = VECT(IZ) + (G1*VECT(IPZ) + G2*HXP(3) + G3*F3)
237
238 VOUT(IPX) = VECT(IPX) + (G4*VECT(IPX) + G5*HXP(1) + G6*F1)
239 VOUT(IPY) = VECT(IPY) + (G4*VECT(IPY) + G5*HXP(2) + G6*F2)
240 VOUT(IPZ) = VECT(IPZ) + (G4*VECT(IPZ) + G5*HXP(3) + G6*F3)
241 *
242 ELSE
243 VOUT(IX) = VECT(IX) + STEP*VECT(IPX)
244 VOUT(IY) = VECT(IY) + STEP*VECT(IPY)
245 VOUT(IZ) = VECT(IZ) + STEP*VECT(IPZ)
246 *
247 ENDIF
248 *
249 999 END
250 *
251 *
252
253 **********************************************************************
254 *
255 *
256 * routine per tracciare la particella di uno STEP
257 * *** extended version ***
258 * it return also the track-length
259 *
260 SUBROUTINE GRKUTA2 (CHARGE,STEP,VECT,VOUT)
261 C.
262 C. ******************************************************************
263 C. * *
264 C. * Runge-Kutta method for tracking a particle through a magnetic *
265 C. * field. Uses Nystroem algorithm (See Handbook Nat. Bur. of *
266 C. * Standards, procedure 25.5.20) *
267 C. * *
268 C. * Input parameters *
269 C. * CHARGE Particle charge *
270 C. * STEP Step size *
271 C. * VECT Initial co-ords,direction cosines,momentum *
272 C. * Output parameters *
273 C. * VOUT Output co-ords,direction cosines,momentum *
274 C. * User routine called *
275 C. * CALL GUFLD(X,F) *
276 C. * *
277 C. * ==>Called by : <USER>, GUSWIM *
278 C. * Authors R.Brun, M.Hansroul ********* *
279 C. * V.Perevoztchikov (CUT STEP implementation) *
280 C. * *
281 C. * *
282 C. ******************************************************************
283 C.
284 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
285 *
286 REAL VVV(3),FFF(3)
287 REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)
288 REAL*8 XYZT(3), XYZ(3), X, Y, Z, XT, YT, ZT
289 DIMENSION SECXS(4),SECYS(4),SECZS(4),HXP(3)
290 EQUIVALENCE (X,XYZ(1)),(Y,XYZ(2)),(Z,XYZ(3)),
291 + (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))
292 *
293 PARAMETER (MAXIT = 1992, MAXCUT = 11)
294 PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)
295 PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)
296 PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)
297 PARAMETER (PISQUA=.986960440109D+01)
298 PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)
299
300 * track length
301 REAL*8 DL
302
303 *.
304 *. ------------------------------------------------------------------
305 *.
306 * This constant is for units CM,GEV/C and KGAUSS
307 *
308 ITER = 0
309 NCUT = 0
310 DO 10 J=1,8
311 VOUT(J)=VECT(J)
312 10 CONTINUE
313 PINV = EC * CHARGE / VECT(7)
314 TL = 0.
315 H = STEP
316
317 c print*,'===================== START GRKUTA2'
318
319 *
320 *
321 20 REST = STEP-TL
322 IF (DABS(H).GT.DABS(REST)) H = REST
323 DO I=1,3
324 VVV(I)=SNGL(VOUT(I))
325 ENDDO
326
327 CALL GUFLD(VVV,FFF)
328 * print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)
329 DO I=1,3
330 F(I)=DBLE(FFF(I))
331 ENDDO
332 *
333 * Start of integration
334 *
335 X = VOUT(1)
336 Y = VOUT(2)
337 Z = VOUT(3)
338 A = VOUT(4)
339 B = VOUT(5)
340 C = VOUT(6)
341
342 DL = VOUT(8)
343
344 *
345 H2 = HALF * H
346 H4 = HALF * H2
347 PH = PINV * H
348 PH2 = HALF * PH
349 SECXS(1) = (B * F(3) - C * F(2)) * PH2
350 SECYS(1) = (C * F(1) - A * F(3)) * PH2
351 SECZS(1) = (A * F(2) - B * F(1)) * PH2
352 ANG2 = (SECXS(1)**2 + SECYS(1)**2 + SECZS(1)**2)
353 IF (ANG2.GT.PISQUA) GO TO 40
354 DXT = H2 * A + H4 * SECXS(1)
355 DYT = H2 * B + H4 * SECYS(1)
356 DZT = H2 * C + H4 * SECZS(1)
357 XT = X + DXT
358 YT = Y + DYT
359 ZT = Z + DZT
360 *
361 * Second intermediate point
362 *
363 EST = DABS(DXT)+DABS(DYT)+DABS(DZT)
364 IF (EST.GT.H) GO TO 30
365
366 DO I=1,3
367 VVV(I)=SNGL(XYZT(I))
368 ENDDO
369 CALL GUFLD(VVV,FFF)
370 DO I=1,3
371 F(I)=DBLE(FFF(I))
372 ENDDO
373 C CALL GUFLD(XYZT,F)
374 AT = A + SECXS(1)
375 BT = B + SECYS(1)
376 CT = C + SECZS(1)
377 *
378 SECXS(2) = (BT * F(3) - CT * F(2)) * PH2
379 SECYS(2) = (CT * F(1) - AT * F(3)) * PH2
380 SECZS(2) = (AT * F(2) - BT * F(1)) * PH2
381 AT = A + SECXS(2)
382 BT = B + SECYS(2)
383 CT = C + SECZS(2)
384 SECXS(3) = (BT * F(3) - CT * F(2)) * PH2
385 SECYS(3) = (CT * F(1) - AT * F(3)) * PH2
386 SECZS(3) = (AT * F(2) - BT * F(1)) * PH2
387 DXT = H * (A + SECXS(3))
388 DYT = H * (B + SECYS(3))
389 DZT = H * (C + SECZS(3))
390 XT = X + DXT
391 YT = Y + DYT
392 ZT = Z + DZT
393 AT = A + TWO*SECXS(3)
394 BT = B + TWO*SECYS(3)
395 CT = C + TWO*SECZS(3)
396 *
397 EST = ABS(DXT)+ABS(DYT)+ABS(DZT)
398 IF (EST.GT.2.*ABS(H)) GO TO 30
399
400 DO I=1,3
401 VVV(I)=SNGL(XYZT(I))
402 ENDDO
403 CALL GUFLD(VVV,FFF)
404 DO I=1,3
405 F(I)=DBLE(FFF(I))
406 ENDDO
407 C CALL GUFLD(XYZT,F)
408 *
409 Z = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H
410 Y = Y + (B + (SECYS(1) + SECYS(2) + SECYS(3)) * THIRD) * H
411 X = X + (A + (SECXS(1) + SECXS(2) + SECXS(3)) * THIRD) * H
412 *
413 SECXS(4) = (BT*F(3) - CT*F(2))* PH2
414 SECYS(4) = (CT*F(1) - AT*F(3))* PH2
415 SECZS(4) = (AT*F(2) - BT*F(1))* PH2
416 A = A+(SECXS(1)+SECXS(4)+TWO * (SECXS(2)+SECXS(3))) * THIRD
417 B = B+(SECYS(1)+SECYS(4)+TWO * (SECYS(2)+SECYS(3))) * THIRD
418 C = C+(SECZS(1)+SECZS(4)+TWO * (SECZS(2)+SECZS(3))) * THIRD
419 *
420 EST = ABS(SECXS(1)+SECXS(4) - (SECXS(2)+SECXS(3)))
421 ++ ABS(SECYS(1)+SECYS(4) - (SECYS(2)+SECYS(3)))
422 ++ ABS(SECZS(1)+SECZS(4) - (SECZS(2)+SECZS(3)))
423 *
424 IF (EST.GT.DLT .AND. ABS(H).GT.1.E-4) GO TO 30
425
426 ITER = ITER + 1
427 NCUT = 0
428 * If too many iterations, go to HELIX
429 IF (ITER.GT.MAXIT) GO TO 40
430 *
431 DL = VOUT(8) +
432 $ DSQRT( 0
433 $ + (X-VOUT(1))**2
434 $ + (Y-VOUT(2))**2
435 $ + (Z-VOUT(3))**2
436 $ )
437 c print*,'- ',VOUT(3),z,VOUT(1),x,VOUT(2),y,DL
438 *
439 TL = TL + H
440 IF (EST.LT.(DLT32)) THEN
441 H = H*TWO
442 ENDIF
443 CBA = ONE/ SQRT(A*A + B*B + C*C)
444 VOUT(1) = X
445 VOUT(2) = Y
446 VOUT(3) = Z
447 VOUT(4) = CBA*A
448 VOUT(5) = CBA*B
449 VOUT(6) = CBA*C
450 VOUT(8) = DL
451 REST = STEP - TL
452 IF (STEP.LT.0.) REST = -REST
453 IF (REST .GT. 1.E-5*DABS(STEP)) GO TO 20
454 *
455 GO TO 999
456 *
457 ** CUT STEP
458 30 NCUT = NCUT + 1
459 * If too many cuts , go to HELIX
460 IF (NCUT.GT.MAXCUT) GO TO 40
461 H = H*HALF
462 GO TO 20
463 *
464 ** ANGLE TOO BIG, USE HELIX
465 40 F1 = F(1)
466 F2 = F(2)
467 F3 = F(3)
468 F4 = DSQRT(F1**2+F2**2+F3**2)
469 RHO = -F4*PINV
470 TET = RHO * STEP
471 IF(TET.NE.0.) THEN
472 HNORM = ONE/F4
473 F1 = F1*HNORM
474 F2 = F2*HNORM
475 F3 = F3*HNORM
476 *
477 HXP(1) = F2*VECT(IPZ) - F3*VECT(IPY)
478 HXP(2) = F3*VECT(IPX) - F1*VECT(IPZ)
479 HXP(3) = F1*VECT(IPY) - F2*VECT(IPX)
480
481 HP = F1*VECT(IPX) + F2*VECT(IPY) + F3*VECT(IPZ)
482 *
483 RHO1 = ONE/RHO
484 SINT = DSIN(TET)
485 COST = TWO*DSIN(HALF*TET)**2
486 *
487 G1 = SINT*RHO1
488 G2 = COST*RHO1
489 G3 = (TET-SINT) * HP*RHO1
490 G4 = -COST
491 G5 = SINT
492 G6 = COST * HP
493
494 VOUT(IX) = VECT(IX) + (G1*VECT(IPX) + G2*HXP(1) + G3*F1)
495 VOUT(IY) = VECT(IY) + (G1*VECT(IPY) + G2*HXP(2) + G3*F2)
496 VOUT(IZ) = VECT(IZ) + (G1*VECT(IPZ) + G2*HXP(3) + G3*F3)
497
498 VOUT(IPX) = VECT(IPX) + (G4*VECT(IPX) + G5*HXP(1) + G6*F1)
499 VOUT(IPY) = VECT(IPY) + (G4*VECT(IPY) + G5*HXP(2) + G6*F2)
500 VOUT(IPZ) = VECT(IPZ) + (G4*VECT(IPZ) + G5*HXP(3) + G6*F3)
501 *
502 ELSE
503 VOUT(IX) = VECT(IX) + STEP*VECT(IPX)
504 VOUT(IY) = VECT(IY) + STEP*VECT(IPY)
505 VOUT(IZ) = VECT(IZ) + STEP*VECT(IPZ)
506 *
507 ENDIF
508 * TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!!
509 * devo mettere la lunghezza dell'elica!!!!!!!!!!!!!!
510 * ma non mi riesce :-(
511 VOUT(8) = DSQRT( 0
512 $ +(VOUT(IX)-VECT(IX))**2
513 $ +(VOUT(IY)-VECT(IY))**2
514 $ +(VOUT(IZ)-VECT(IZ))**2
515 $ )
516 c print*,'WARNING: GRKUTA2 --> '
517 c $ ,'helix :-( ... length evaluated with straight line'
518
519 *
520 999 END
521 *
522 *
523
524 **********************************************************************
525 *
526 * gives the value of the magnetic field in the tracking point
527 *
528 **********************************************************************
529
530 subroutine gufld(v,f) !coordinates in cm, B field in kGauss
531
532 real v(3),f(3) !coordinates in cm, B field in kGauss, error in kGauss
533
534 real*8 vv(3),ff(3) !inter_B.f works in double precision
535
536
537 do i=1,3
538 vv(i)=v(i)/100. !inter_B.f works in meters
539 enddo
540 c inter_B: coordinates in m, B field in Tesla
541 c$$$ print*,'GUFLD: v ',v
542 call inter_B(vv(1),vv(2),vv(3),ff)
543 do i=1,3 !change back the field in kGauss
544 f(i)=ff(i)*10.
545 enddo
546 c$$$ print*,'GUFLD: b ',f
547
548 return
549 end
550

  ViewVC Help
Powered by ViewVC 1.1.23