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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by pam-fi, Wed Nov 8 16:42:28 2006 UTC revision 1.10 by mayorov, Wed Aug 22 12:38:20 2018 UTC
# Line 1  Line 1 
1  **********************************************************************  **********************************************************************
2  *  *
3  *  *
4  *     routine per tracciare la particella di uno STEP  *     routine per tracciare la particella di uno STEP
5  *  *
6        SUBROUTINE GRKUTA (CHARGE,STEP,VECT,VOUT)        SUBROUTINE GRKUTA (CHARGE,STEP,VECT,VOUT)
7  C.  C.
# Line 28  C.    *                                 Line 28  C.    *                                
28  C.    ******************************************************************  C.    ******************************************************************
29  C.  C.
30        IMPLICIT DOUBLE PRECISION(A-H,O-Z)        IMPLICIT DOUBLE PRECISION(A-H,O-Z)
31          COMMON/DELTAB/DELTA0,DELTA1,DLT
32  *  *
33        REAL VVV(3),FFF(3)        REAL VVV(3),FFF(3)
34        REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)        REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)
# Line 37  C. Line 38  C.
38       +            (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))       +            (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))
39  *  *
40        PARAMETER (MAXIT = 1992, MAXCUT = 11)        PARAMETER (MAXIT = 1992, MAXCUT = 11)
41        PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)  cPP      PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)
42        PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)        PARAMETER (EC=2.99792458D-4)
43    cPP      PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)
44          PARAMETER (ZERO=0.D0, ONE=1.D0, TWO=2.D0, THREE=3.D0)
45        PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)        PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)
46        PARAMETER (PISQUA=.986960440109D+01)        PARAMETER (PISQUA=.986960440109D+01)
47        PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)        PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)
48    
49          REAL*8 DELTAB(3)
50          REAL*8 DLT32
51          DLT=1D-8
52          DLT32=DLT/32.
53    
54  *.  *.
55  *.    ------------------------------------------------------------------  *.    ------------------------------------------------------------------
56  *.  *.
57  *             This constant is for units CM,GEV/C and KGAUSS  *             This constant is for units CM,GEV/C and KGAUSS
58  *  *
59    
60        ITER = 0        ITER = 0
61        NCUT = 0        NCUT = 0
62        DO 10 J=1,7        DO 10 J=1,7
# Line 63  C. Line 72  C.
72        DO I=1,3        DO I=1,3
73         VVV(I)=SNGL(VOUT(I))         VVV(I)=SNGL(VOUT(I))
74        ENDDO        ENDDO
75          
76        CALL GUFLD(VVV,FFF)        CALL GUFLD(VVV,FFF)
77  *      print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)  *      print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)
78        DO I=1,3        DO I=1,3
79         F(I)=DBLE(FFF(I))         F(I)=DBLE(FFF(I))
80        ENDDO        ENDDO
81          DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
82          F(2) = F(2)+DELTAB(2)
83    cPP   -----------------
84  *  *
85  *             Start of integration  *             Start of integration
86  *  *
# Line 106  C. Line 118  C.
118        CALL GUFLD(VVV,FFF)        CALL GUFLD(VVV,FFF)
119        DO I=1,3        DO I=1,3
120         F(I)=DBLE(FFF(I))         F(I)=DBLE(FFF(I))
121        ENDDO            ENDDO
122          DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
123          F(2) = F(2)+DELTAB(2)
124    cPP   -----------------
125  C      CALL GUFLD(XYZT,F)  C      CALL GUFLD(XYZT,F)
126        AT     = A + SECXS(1)        AT     = A + SECXS(1)
127        BT     = B + SECYS(1)        BT     = B + SECYS(1)
# Line 141  C      CALL GUFLD(XYZT,F) Line 156  C      CALL GUFLD(XYZT,F)
156        DO I=1,3        DO I=1,3
157         F(I)=DBLE(FFF(I))         F(I)=DBLE(FFF(I))
158        ENDDO        ENDDO
159          DELTAB(2) = -F(2)*VECT(7)*CHARGE*(DELTA0+DELTA1*VVV(2))
160          F(2) = F(2)+DELTAB(2)
161    cPP   -----------------
162  C      CALL GUFLD(XYZT,F)  C      CALL GUFLD(XYZT,F)
163  *  *
164        Z      = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H        Z      = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H
# Line 234  C      CALL GUFLD(XYZT,F) Line 252  C      CALL GUFLD(XYZT,F)
252        ENDIF        ENDIF
253  *  *
254    999 END    999 END
 *      
 *      
   
 **********************************************************************  
 *  
 *  
 *     routine per tracciare la particella di uno STEP  
 *     *** extended version ***  
 *     it return also the track-length  
 *  
       SUBROUTINE GRKUTA2 (CHARGE,STEP,VECT,VOUT)  
 C.  
 C.    ******************************************************************  
 C.    *                                                                *  
 C.    *  Runge-Kutta method for tracking a particle through a magnetic *  
 C.    *  field. Uses Nystroem algorithm (See Handbook Nat. Bur. of     *  
 C.    *  Standards, procedure 25.5.20)                                 *  
 C.    *                                                                *  
 C.    *  Input parameters                                              *  
 C.    *       CHARGE    Particle charge                                *  
 C.    *       STEP      Step size                                      *  
 C.    *       VECT      Initial co-ords,direction cosines,momentum     *  
 C.    *  Output parameters                                             *  
 C.    *       VOUT      Output co-ords,direction cosines,momentum      *  
 C.    *  User routine called                                           *  
 C.    *       CALL GUFLD(X,F)                                          *  
 C.    *                                                                *  
 C.    *    ==>Called by : <USER>, GUSWIM                               *  
 C.    *       Authors    R.Brun, M.Hansroul  *********                 *  
 C.    *                  V.Perevoztchikov (CUT STEP implementation)    *  
 C.    *                                                                *  
 C.    *                                                                *  
 C.    ******************************************************************  
 C.  
       IMPLICIT DOUBLE PRECISION(A-H,O-Z)  
 *  
       REAL VVV(3),FFF(3)  
       REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)  
       REAL*8 XYZT(3), XYZ(3), X, Y, Z, XT, YT, ZT  
       DIMENSION SECXS(4),SECYS(4),SECZS(4),HXP(3)  
       EQUIVALENCE (X,XYZ(1)),(Y,XYZ(2)),(Z,XYZ(3)),  
      +            (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))  
 *  
       PARAMETER (MAXIT = 1992, MAXCUT = 11)  
       PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)  
       PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)  
       PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)  
       PARAMETER (PISQUA=.986960440109D+01)  
       PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)  
   
 *     track length  
       REAL*8 DL  
   
 *.  
 *.    ------------------------------------------------------------------  
 *.  
 *             This constant is for units CM,GEV/C and KGAUSS  
 *  
       ITER = 0  
       NCUT = 0  
       DO 10 J=1,8  
          VOUT(J)=VECT(J)  
    10 CONTINUE  
       PINV   = EC * CHARGE / VECT(7)  
       TL = 0.  
       H      = STEP  
         
 c      print*,'===================== START GRKUTA2'  
         
 *  
255  *  *
    20 REST  = STEP-TL  
       IF (DABS(H).GT.DABS(REST)) H = REST  
       DO I=1,3  
        VVV(I)=SNGL(VOUT(I))  
       ENDDO  
         
       CALL GUFLD(VVV,FFF)  
 *      print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)  
       DO I=1,3  
        F(I)=DBLE(FFF(I))  
       ENDDO  
 *  
 *             Start of integration  
256  *  *
       X      = VOUT(1)  
       Y      = VOUT(2)  
       Z      = VOUT(3)  
       A      = VOUT(4)  
       B      = VOUT(5)  
       C      = VOUT(6)  
   
       DL     = VOUT(8)  
257    
258  *  c$$$**********************************************************************
259        H2     = HALF * H  c$$$*
260        H4     = HALF * H2  c$$$*
261        PH     = PINV * H  c$$$*     routine per tracciare la particella di uno STEP
262        PH2    = HALF * PH  c$$$*     *** extended version ***
263        SECXS(1) = (B * F(3) - C * F(2)) * PH2  c$$$*     it return also the track-length
264        SECYS(1) = (C * F(1) - A * F(3)) * PH2  c$$$*
265        SECZS(1) = (A * F(2) - B * F(1)) * PH2  c$$$      SUBROUTINE GRKUTA2 (CHARGE,STEP,VECT,VOUT)
266        ANG2 = (SECXS(1)**2 + SECYS(1)**2 + SECZS(1)**2)  c$$$C.
267        IF (ANG2.GT.PISQUA) GO TO 40  c$$$C.    ******************************************************************
268        DXT    = H2 * A + H4 * SECXS(1)  c$$$C.    *                                                                *
269        DYT    = H2 * B + H4 * SECYS(1)  c$$$C.    *  Runge-Kutta method for tracking a particle through a magnetic *
270        DZT    = H2 * C + H4 * SECZS(1)  c$$$C.    *  field. Uses Nystroem algorithm (See Handbook Nat. Bur. of     *
271        XT     = X + DXT  c$$$C.    *  Standards, procedure 25.5.20)                                 *
272        YT     = Y + DYT  c$$$C.    *                                                                *
273        ZT     = Z + DZT  c$$$C.    *  Input parameters                                              *
274  *  c$$$C.    *       CHARGE    Particle charge                                *
275  *              Second intermediate point  c$$$C.    *       STEP      Step size                                      *
276  *  c$$$C.    *       VECT      Initial co-ords,direction cosines,momentum     *
277        EST = DABS(DXT)+DABS(DYT)+DABS(DZT)  c$$$C.    *  Output parameters                                             *
278        IF (EST.GT.H) GO TO 30  c$$$C.    *       VOUT      Output co-ords,direction cosines,momentum      *
279    c$$$C.    *  User routine called                                           *
280        DO I=1,3  c$$$C.    *       CALL GUFLD(X,F)                                          *
281         VVV(I)=SNGL(XYZT(I))  c$$$C.    *                                                                *
282        ENDDO  c$$$C.    *    ==>Called by : <USER>, GUSWIM                               *
283        CALL GUFLD(VVV,FFF)  c$$$C.    *       Authors    R.Brun, M.Hansroul  *********                 *
284        DO I=1,3  c$$$C.    *                  V.Perevoztchikov (CUT STEP implementation)    *
285         F(I)=DBLE(FFF(I))  c$$$C.    *                                                                *
286        ENDDO      c$$$C.    *                                                                *
287  C      CALL GUFLD(XYZT,F)  c$$$C.    ******************************************************************
288        AT     = A + SECXS(1)  c$$$C.
289        BT     = B + SECYS(1)  c$$$      IMPLICIT DOUBLE PRECISION(A-H,O-Z)
290        CT     = C + SECZS(1)  c$$$*
291  *  c$$$      REAL VVV(3),FFF(3)
292        SECXS(2) = (BT * F(3) - CT * F(2)) * PH2  c$$$      REAL*8 CHARGE, STEP, VECT(*), VOUT(*), F(4)
293        SECYS(2) = (CT * F(1) - AT * F(3)) * PH2  c$$$      REAL*8 XYZT(3), XYZ(3), X, Y, Z, XT, YT, ZT
294        SECZS(2) = (AT * F(2) - BT * F(1)) * PH2  c$$$      DIMENSION SECXS(4),SECYS(4),SECZS(4),HXP(3)
295        AT     = A + SECXS(2)  c$$$      EQUIVALENCE (X,XYZ(1)),(Y,XYZ(2)),(Z,XYZ(3)),
296        BT     = B + SECYS(2)  c$$$     +            (XT,XYZT(1)),(YT,XYZT(2)),(ZT,XYZT(3))
297        CT     = C + SECZS(2)  c$$$*
298        SECXS(3) = (BT * F(3) - CT * F(2)) * PH2  c$$$      PARAMETER (MAXIT = 1992, MAXCUT = 11)
299        SECYS(3) = (CT * F(1) - AT * F(3)) * PH2  c$$$      PARAMETER (EC=2.9979251D-4,DLT=1D-4,DLT32=DLT/32)
300        SECZS(3) = (AT * F(2) - BT * F(1)) * PH2  c$$$      PARAMETER (ZERO=0, ONE=1, TWO=2, THREE=3)
301        DXT    = H * (A + SECXS(3))  c$$$      PARAMETER (THIRD=ONE/THREE, HALF=ONE/TWO)
302        DYT    = H * (B + SECYS(3))  c$$$      PARAMETER (PISQUA=.986960440109D+01)
303        DZT    = H * (C + SECZS(3))  c$$$      PARAMETER (IX=1,IY=2,IZ=3,IPX=4,IPY=5,IPZ=6)
304        XT     = X + DXT  c$$$
305        YT     = Y + DYT  c$$$*     track length
306        ZT     = Z + DZT  c$$$      REAL*8 DL
307        AT     = A + TWO*SECXS(3)  c$$$
308        BT     = B + TWO*SECYS(3)  c$$$*.
309        CT     = C + TWO*SECZS(3)  c$$$*.    ------------------------------------------------------------------
310  *  c$$$*.
311        EST = ABS(DXT)+ABS(DYT)+ABS(DZT)  c$$$*             This constant is for units CM,GEV/C and KGAUSS
312        IF (EST.GT.2.*ABS(H)) GO TO 30  c$$$*
313    c$$$      ITER = 0
314        DO I=1,3  c$$$      NCUT = 0
315         VVV(I)=SNGL(XYZT(I))  c$$$      DO 10 J=1,8
316        ENDDO  c$$$         VOUT(J)=VECT(J)
317        CALL GUFLD(VVV,FFF)  c$$$   10 CONTINUE
318        DO I=1,3  c$$$      PINV   = EC * CHARGE / VECT(7)
319         F(I)=DBLE(FFF(I))  c$$$      TL = 0.
320        ENDDO  c$$$      H      = STEP
321  C      CALL GUFLD(XYZT,F)  c$$$
322  *        c$$$c      print*,'===================== START GRKUTA2'
323        Z      = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H  c$$$
324        Y      = Y + (B + (SECYS(1) + SECYS(2) + SECYS(3)) * THIRD) * H  c$$$*
325        X      = X + (A + (SECXS(1) + SECXS(2) + SECXS(3)) * THIRD) * H  c$$$*
326  *  c$$$   20 REST  = STEP-TL
327        SECXS(4) = (BT*F(3) - CT*F(2))* PH2  c$$$      IF (DABS(H).GT.DABS(REST)) H = REST
328        SECYS(4) = (CT*F(1) - AT*F(3))* PH2  c$$$      DO I=1,3
329        SECZS(4) = (AT*F(2) - BT*F(1))* PH2  c$$$       VVV(I)=SNGL(VOUT(I))
330        A      = A+(SECXS(1)+SECXS(4)+TWO * (SECXS(2)+SECXS(3))) * THIRD  c$$$      ENDDO
331        B      = B+(SECYS(1)+SECYS(4)+TWO * (SECYS(2)+SECYS(3))) * THIRD  c$$$
332        C      = C+(SECZS(1)+SECZS(4)+TWO * (SECZS(2)+SECZS(3))) * THIRD  c$$$      CALL GUFLD(VVV,FFF)
333  *  c$$$*      print*,'GRKUTA Bx,By,Bz: ',(FFF(i),i=1,3)
334        EST    = ABS(SECXS(1)+SECXS(4) - (SECXS(2)+SECXS(3)))  c$$$      DO I=1,3
335       ++        ABS(SECYS(1)+SECYS(4) - (SECYS(2)+SECYS(3)))  c$$$       F(I)=DBLE(FFF(I))
336       ++        ABS(SECZS(1)+SECZS(4) - (SECZS(2)+SECZS(3)))  c$$$      ENDDO
337  *  c$$$*
338        IF (EST.GT.DLT .AND. ABS(H).GT.1.E-4) GO TO 30  c$$$*             Start of integration
339    c$$$*
340        ITER = ITER + 1  c$$$      X      = VOUT(1)
341        NCUT = 0  c$$$      Y      = VOUT(2)
342  *               If too many iterations, go to HELIX  c$$$      Z      = VOUT(3)
343        IF (ITER.GT.MAXIT) GO TO 40  c$$$      A      = VOUT(4)
344  *  c$$$      B      = VOUT(5)
345        DL     = VOUT(8) +  c$$$      C      = VOUT(6)
346       $     DSQRT( 0  c$$$
347       $     + (X-VOUT(1))**2  c$$$      DL     = VOUT(8)
348       $     + (Y-VOUT(2))**2  c$$$
349       $     + (Z-VOUT(3))**2  c$$$*
350       $     )  c$$$      H2     = HALF * H
351  c      print*,'- ',VOUT(3),z,VOUT(1),x,VOUT(2),y,DL  c$$$      H4     = HALF * H2
352  *  c$$$      PH     = PINV * H
353        TL = TL + H  c$$$      PH2    = HALF * PH
354        IF (EST.LT.(DLT32)) THEN  c$$$      SECXS(1) = (B * F(3) - C * F(2)) * PH2
355           H = H*TWO  c$$$      SECYS(1) = (C * F(1) - A * F(3)) * PH2
356        ENDIF  c$$$      SECZS(1) = (A * F(2) - B * F(1)) * PH2
357        CBA    = ONE/ SQRT(A*A + B*B + C*C)  c$$$      ANG2 = (SECXS(1)**2 + SECYS(1)**2 + SECZS(1)**2)
358        VOUT(1) = X  c$$$      IF (ANG2.GT.PISQUA) GO TO 40
359        VOUT(2) = Y  c$$$      DXT    = H2 * A + H4 * SECXS(1)
360        VOUT(3) = Z  c$$$      DYT    = H2 * B + H4 * SECYS(1)
361        VOUT(4) = CBA*A  c$$$      DZT    = H2 * C + H4 * SECZS(1)
362        VOUT(5) = CBA*B  c$$$      XT     = X + DXT
363        VOUT(6) = CBA*C  c$$$      YT     = Y + DYT
364        VOUT(8) = DL  c$$$      ZT     = Z + DZT
365        REST = STEP - TL  c$$$*
366        IF (STEP.LT.0.) REST = -REST  c$$$*              Second intermediate point
367        IF (REST .GT. 1.E-5*DABS(STEP)) GO TO 20  c$$$*
368  *  c$$$      EST = DABS(DXT)+DABS(DYT)+DABS(DZT)
369        GO TO 999  c$$$      IF (EST.GT.H) GO TO 30
370  *  c$$$
371  **              CUT STEP  c$$$      DO I=1,3
372     30 NCUT = NCUT + 1  c$$$       VVV(I)=SNGL(XYZT(I))
373  *               If too many cuts , go to HELIX  c$$$      ENDDO
374        IF (NCUT.GT.MAXCUT)       GO TO 40  c$$$      CALL GUFLD(VVV,FFF)
375        H = H*HALF  c$$$      DO I=1,3
376        GO TO 20  c$$$       F(I)=DBLE(FFF(I))
377  *  c$$$      ENDDO
378  **              ANGLE TOO BIG, USE HELIX  c$$$C      CALL GUFLD(XYZT,F)
379     40 F1  = F(1)  c$$$      AT     = A + SECXS(1)
380        F2  = F(2)  c$$$      BT     = B + SECYS(1)
381        F3  = F(3)  c$$$      CT     = C + SECZS(1)
382        F4  = DSQRT(F1**2+F2**2+F3**2)  c$$$*
383        RHO = -F4*PINV  c$$$      SECXS(2) = (BT * F(3) - CT * F(2)) * PH2
384        TET = RHO * STEP  c$$$      SECYS(2) = (CT * F(1) - AT * F(3)) * PH2
385        IF(TET.NE.0.) THEN  c$$$      SECZS(2) = (AT * F(2) - BT * F(1)) * PH2
386           HNORM = ONE/F4  c$$$      AT     = A + SECXS(2)
387           F1 = F1*HNORM  c$$$      BT     = B + SECYS(2)
388           F2 = F2*HNORM  c$$$      CT     = C + SECZS(2)
389           F3 = F3*HNORM  c$$$      SECXS(3) = (BT * F(3) - CT * F(2)) * PH2
390  *  c$$$      SECYS(3) = (CT * F(1) - AT * F(3)) * PH2
391           HXP(1) = F2*VECT(IPZ) - F3*VECT(IPY)  c$$$      SECZS(3) = (AT * F(2) - BT * F(1)) * PH2
392           HXP(2) = F3*VECT(IPX) - F1*VECT(IPZ)  c$$$      DXT    = H * (A + SECXS(3))
393           HXP(3) = F1*VECT(IPY) - F2*VECT(IPX)  c$$$      DYT    = H * (B + SECYS(3))
394    c$$$      DZT    = H * (C + SECZS(3))
395           HP = F1*VECT(IPX) + F2*VECT(IPY) + F3*VECT(IPZ)  c$$$      XT     = X + DXT
396  *  c$$$      YT     = Y + DYT
397           RHO1 = ONE/RHO  c$$$      ZT     = Z + DZT
398           SINT = DSIN(TET)  c$$$      AT     = A + TWO*SECXS(3)
399           COST = TWO*DSIN(HALF*TET)**2  c$$$      BT     = B + TWO*SECYS(3)
400  *  c$$$      CT     = C + TWO*SECZS(3)
401           G1 = SINT*RHO1  c$$$*
402           G2 = COST*RHO1  c$$$      EST = ABS(DXT)+ABS(DYT)+ABS(DZT)
403           G3 = (TET-SINT) * HP*RHO1  c$$$      IF (EST.GT.2.*ABS(H)) GO TO 30
404           G4 = -COST  c$$$
405           G5 = SINT  c$$$      DO I=1,3
406           G6 = COST * HP  c$$$       VVV(I)=SNGL(XYZT(I))
407    c$$$      ENDDO
408           VOUT(IX) = VECT(IX) + (G1*VECT(IPX) + G2*HXP(1) + G3*F1)  c$$$      CALL GUFLD(VVV,FFF)
409           VOUT(IY) = VECT(IY) + (G1*VECT(IPY) + G2*HXP(2) + G3*F2)  c$$$      DO I=1,3
410           VOUT(IZ) = VECT(IZ) + (G1*VECT(IPZ) + G2*HXP(3) + G3*F3)  c$$$       F(I)=DBLE(FFF(I))
411    c$$$      ENDDO
412           VOUT(IPX) = VECT(IPX) + (G4*VECT(IPX) + G5*HXP(1) + G6*F1)  c$$$C      CALL GUFLD(XYZT,F)
413           VOUT(IPY) = VECT(IPY) + (G4*VECT(IPY) + G5*HXP(2) + G6*F2)  c$$$*
414           VOUT(IPZ) = VECT(IPZ) + (G4*VECT(IPZ) + G5*HXP(3) + G6*F3)  c$$$      Z      = Z + (C + (SECZS(1) + SECZS(2) + SECZS(3)) * THIRD) * H
415  *  c$$$      Y      = Y + (B + (SECYS(1) + SECYS(2) + SECYS(3)) * THIRD) * H
416        ELSE  c$$$      X      = X + (A + (SECXS(1) + SECXS(2) + SECXS(3)) * THIRD) * H
417           VOUT(IX) = VECT(IX) + STEP*VECT(IPX)  c$$$*
418           VOUT(IY) = VECT(IY) + STEP*VECT(IPY)  c$$$      SECXS(4) = (BT*F(3) - CT*F(2))* PH2
419           VOUT(IZ) = VECT(IZ) + STEP*VECT(IPZ)  c$$$      SECYS(4) = (CT*F(1) - AT*F(3))* PH2
420  *  c$$$      SECZS(4) = (AT*F(2) - BT*F(1))* PH2
421        ENDIF  c$$$      A      = A+(SECXS(1)+SECXS(4)+TWO * (SECXS(2)+SECXS(3))) * THIRD
422  *     TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!!  c$$$      B      = B+(SECYS(1)+SECYS(4)+TWO * (SECYS(2)+SECYS(3))) * THIRD
423  *     devo mettere la lunghezza dell'elica!!!!!!!!!!!!!!  c$$$      C      = C+(SECZS(1)+SECZS(4)+TWO * (SECZS(2)+SECZS(3))) * THIRD
424  *     ma non mi riesce :-(  c$$$*
425        VOUT(8) = DSQRT( 0  c$$$      EST    = ABS(SECXS(1)+SECXS(4) - (SECXS(2)+SECXS(3)))
426       $     +(VOUT(IX)-VECT(IX))**2  c$$$     ++        ABS(SECYS(1)+SECYS(4) - (SECYS(2)+SECYS(3)))
427       $     +(VOUT(IY)-VECT(IY))**2  c$$$     ++        ABS(SECZS(1)+SECZS(4) - (SECZS(2)+SECZS(3)))
428       $     +(VOUT(IZ)-VECT(IZ))**2  c$$$*
429       $     )  c$$$      IF (EST.GT.DLT .AND. ABS(H).GT.1.E-4) GO TO 30
430        print*,'WARNING: GRKUTA2 --> '  c$$$
431       $     ,'helix :-( ... length evaluated with straight line'  c$$$      ITER = ITER + 1
432    c$$$      NCUT = 0
433  *  c$$$*               If too many iterations, go to HELIX
434    999 END  c$$$      IF (ITER.GT.MAXIT) GO TO 40
435  *      c$$$*
436  *      c$$$      DL     = VOUT(8) +
437    c$$$     $     DSQRT( 0
438    c$$$     $     + (X-VOUT(1))**2
439    c$$$     $     + (Y-VOUT(2))**2
440    c$$$     $     + (Z-VOUT(3))**2
441    c$$$     $     )
442    c$$$c      print*,'- ',VOUT(3),z,VOUT(1),x,VOUT(2),y,DL
443    c$$$*
444    c$$$      TL = TL + H
445    c$$$      IF (EST.LT.(DLT32)) THEN
446    c$$$         H = H*TWO
447    c$$$      ENDIF
448    c$$$      CBA    = ONE/ SQRT(A*A + B*B + C*C)
449    c$$$      VOUT(1) = X
450    c$$$      VOUT(2) = Y
451    c$$$      VOUT(3) = Z
452    c$$$      VOUT(4) = CBA*A
453    c$$$      VOUT(5) = CBA*B
454    c$$$      VOUT(6) = CBA*C
455    c$$$      VOUT(8) = DL
456    c$$$      REST = STEP - TL
457    c$$$      IF (STEP.LT.0.) REST = -REST
458    c$$$      IF (REST .GT. 1.E-5*DABS(STEP)) GO TO 20
459    c$$$*
460    c$$$      GO TO 999
461    c$$$*
462    c$$$**              CUT STEP
463    c$$$   30 NCUT = NCUT + 1
464    c$$$*               If too many cuts , go to HELIX
465    c$$$      IF (NCUT.GT.MAXCUT)       GO TO 40
466    c$$$      H = H*HALF
467    c$$$      GO TO 20
468    c$$$*
469    c$$$**              ANGLE TOO BIG, USE HELIX
470    c$$$   40 F1  = F(1)
471    c$$$      F2  = F(2)
472    c$$$      F3  = F(3)
473    c$$$      F4  = DSQRT(F1**2+F2**2+F3**2)
474    c$$$      RHO = -F4*PINV
475    c$$$      TET = RHO * STEP
476    c$$$      IF(TET.NE.0.) THEN
477    c$$$         HNORM = ONE/F4
478    c$$$         F1 = F1*HNORM
479    c$$$         F2 = F2*HNORM
480    c$$$         F3 = F3*HNORM
481    c$$$*
482    c$$$         HXP(1) = F2*VECT(IPZ) - F3*VECT(IPY)
483    c$$$         HXP(2) = F3*VECT(IPX) - F1*VECT(IPZ)
484    c$$$         HXP(3) = F1*VECT(IPY) - F2*VECT(IPX)
485    c$$$
486    c$$$         HP = F1*VECT(IPX) + F2*VECT(IPY) + F3*VECT(IPZ)
487    c$$$*
488    c$$$         RHO1 = ONE/RHO
489    c$$$         SINT = DSIN(TET)
490    c$$$         COST = TWO*DSIN(HALF*TET)**2
491    c$$$*
492    c$$$         G1 = SINT*RHO1
493    c$$$         G2 = COST*RHO1
494    c$$$         G3 = (TET-SINT) * HP*RHO1
495    c$$$         G4 = -COST
496    c$$$         G5 = SINT
497    c$$$         G6 = COST * HP
498    c$$$
499    c$$$         VOUT(IX) = VECT(IX) + (G1*VECT(IPX) + G2*HXP(1) + G3*F1)
500    c$$$         VOUT(IY) = VECT(IY) + (G1*VECT(IPY) + G2*HXP(2) + G3*F2)
501    c$$$         VOUT(IZ) = VECT(IZ) + (G1*VECT(IPZ) + G2*HXP(3) + G3*F3)
502    c$$$
503    c$$$         VOUT(IPX) = VECT(IPX) + (G4*VECT(IPX) + G5*HXP(1) + G6*F1)
504    c$$$         VOUT(IPY) = VECT(IPY) + (G4*VECT(IPY) + G5*HXP(2) + G6*F2)
505    c$$$         VOUT(IPZ) = VECT(IPZ) + (G4*VECT(IPZ) + G5*HXP(3) + G6*F3)
506    c$$$*
507    c$$$      ELSE
508    c$$$         VOUT(IX) = VECT(IX) + STEP*VECT(IPX)
509    c$$$         VOUT(IY) = VECT(IY) + STEP*VECT(IPY)
510    c$$$         VOUT(IZ) = VECT(IZ) + STEP*VECT(IPZ)
511    c$$$*
512    c$$$      ENDIF
513    c$$$*     TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!! TEMP !!!
514    c$$$*     devo mettere la lunghezza dell'elica!!!!!!!!!!!!!!
515    c$$$*     ma non mi riesce :-(
516    c$$$      VOUT(8) = DSQRT( 0
517    c$$$     $     +(VOUT(IX)-VECT(IX))**2
518    c$$$     $     +(VOUT(IY)-VECT(IY))**2
519    c$$$     $     +(VOUT(IZ)-VECT(IZ))**2
520    c$$$     $     )
521    c$$$c      print*,'WARNING: GRKUTA2 --> '
522    c$$$c     $     ,'helix :-( ... length evaluated with straight line'
523    c$$$
524    c$$$*
525    c$$$  999 END
526    c$$$*
527    c$$$*
528    
529  **********************************************************************  **********************************************************************
530  *      *
531  *     gives the value of the magnetic field in the tracking point  *     gives the value of the magnetic field in the tracking point
532  *      *
533  **********************************************************************  **********************************************************************
534    
535        subroutine  gufld(v,f)    !coordinates in cm, B field in kGauss        subroutine  gufld(v,f)    !coordinates in cm, B field in kGauss
# Line 521  c      print*,'- ',VOUT(3),z,VOUT(1),x,V Line 539  c      print*,'- ',VOUT(3),z,VOUT(1),x,V
539        real*8 vv(3),ff(3)        !inter_B.f works in double precision        real*8 vv(3),ff(3)        !inter_B.f works in double precision
540    
541    
542          do i=1,3        do i=1,3
543            vv(i)=v(i)/100.       !inter_B.f works in meters           vv(i)=v(i)/100.        !inter_B.f works in meters
544          enddo        enddo
545  c       inter_B: coordinates in m, B field in Tesla  c     inter_B: coordinates in m, B field in Tesla
546  c        print*,'GUFLD: v ',v  c$$$      print*,'GUFLD: v ',v
547          call inter_B(vv(1),vv(2),vv(3),ff)        call inter_B(vv(1),vv(2),vv(3),ff)
548          do i=1,3                !change back the field in kGauss        do i=1,3                  !change back the field in kGauss
549            f(i)=ff(i)*10.           f(i)=REAL(ff(i)*10.) ! EM GCC4.7
550          enddo        enddo
551  c        print*,'GUFLD: b ',f  c$$$      print*,'GUFLD: b ',f
 c        print*,vv,ff  
552    
553        return        return
554        end        end
   

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.10

  ViewVC Help
Powered by ViewVC 1.1.23