Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4ExactHelixStepper implementation << 27 // 26 // 28 // Author: J.Apostolakis, 28.01.2005. << 27 // $Id: G4ExactHelixStepper.cc,v 1.9 2008/10/29 14:34:35 gcosmo Exp $ 29 // Implementation adapted from Explici << 28 // GEANT4 tag $Name: geant4-09-02-patch-04 $ >> 29 // >> 30 // Helix a-la-Explicity Euler: x_1 = x_0 + helix(h) >> 31 // with helix(h) being a helix piece of length h >> 32 // simplest approach for solving linear differential equations. >> 33 // Take the current derivative and add it to the current position. >> 34 // >> 35 // As the field is assumed constant, an error is not calculated. >> 36 // >> 37 // Author: J. Apostolakis, 28 Jan 2005 >> 38 // Implementation adapted from ExplicitEuler of W.Wander 30 // ------------------------------------------- 39 // ------------------------------------------------------------------- 31 40 32 #include "G4ExactHelixStepper.hh" 41 #include "G4ExactHelixStepper.hh" 33 #include "G4PhysicalConstants.hh" << 34 #include "G4ThreeVector.hh" 42 #include "G4ThreeVector.hh" 35 #include "G4LineSection.hh" 43 #include "G4LineSection.hh" 36 44 37 G4ExactHelixStepper::G4ExactHelixStepper(G4Mag << 45 >> 46 G4ExactHelixStepper::G4ExactHelixStepper(G4Mag_EqRhs *EqRhs) 38 : G4MagHelicalStepper(EqRhs), 47 : G4MagHelicalStepper(EqRhs), 39 fBfieldValue(DBL_MAX, DBL_MAX, DBL_MAX) << 48 fBfieldValue(DBL_MAX, DBL_MAX, DBL_MAX), yInitialEHS(DBL_MAX), yFinalEHS(-DBL_MAX) >> 49 40 { 50 { >> 51 const G4int nvar = 6 ; >> 52 G4int i; >> 53 for(i=0;i<nvar;i++) { >> 54 fYInSav[i]= DBL_MAX; >> 55 } >> 56 fPtrMagEqOfMot=EqRhs; 41 } 57 } 42 58 43 G4ExactHelixStepper::~G4ExactHelixStepper() = << 59 G4ExactHelixStepper::~G4ExactHelixStepper() {} 44 << 45 // ------------------------------------------- << 46 60 47 void 61 void 48 G4ExactHelixStepper::Stepper( const G4double y 62 G4ExactHelixStepper::Stepper( const G4double yInput[], 49 const G4double*, << 63 const G4double*, 50 G4double h << 64 G4double hstep, 51 G4double y << 65 G4double yOut[], 52 G4double y << 66 G4double yErr[] ) 53 { 67 { 54 const G4int nvar = 6; << 68 const G4int nvar = 6 ; 55 << 56 G4int i; << 57 G4ThreeVector Bfld_value; << 58 << 59 MagFieldEvaluate(yInput, Bfld_value); << 60 AdvanceHelix(yInput, Bfld_value, hstep, yOut << 61 << 62 // We are assuming a constant field: helix i << 63 // << 64 for(i=0; i<nvar; ++i) << 65 { << 66 yErr[i] = 0.0 ; << 67 } << 68 69 69 fBfieldValue = Bfld_value; << 70 G4int i; >> 71 // G4double yTemp[7], yIn[7] ; >> 72 G4ThreeVector Bfld_value; >> 73 >> 74 for(i=0;i<nvar;i++) { >> 75 // yIn[i]= yInput[i]; >> 76 fYInSav[i]= yInput[i]; >> 77 } >> 78 >> 79 MagFieldEvaluate(yInput, Bfld_value) ; >> 80 >> 81 // DumbStepper(yIn, Bfld_value, hstep, yTemp); >> 82 AdvanceHelix(yInput, Bfld_value, hstep, yOut); >> 83 >> 84 // We are assuming a constant field: helix is exact. >> 85 for(i=0;i<nvar;i++) { >> 86 yErr[i] = 0.0 ; >> 87 } >> 88 >> 89 yInitialEHS = G4ThreeVector( yInput[0], yInput[1], yInput[2]); >> 90 yFinalEHS = G4ThreeVector( yOut[0], yOut[1], yOut[2]); >> 91 fBfieldValue=Bfld_value; >> 92 70 } 93 } 71 94 72 // ------------------------------------------- << 73 << 74 void 95 void 75 G4ExactHelixStepper::DumbStepper( const G4doub << 96 G4ExactHelixStepper::DumbStepper( const G4double yIn[], 76 G4Thre << 97 G4ThreeVector Bfld, 77 G4doub << 98 G4double h, 78 G4doub << 99 G4double yOut[]) 79 { 100 { 80 // Assuming a constant field: solution is a 101 // Assuming a constant field: solution is a helix 81 << 82 AdvanceHelix(yIn, Bfld, h, yOut); 102 AdvanceHelix(yIn, Bfld, h, yOut); 83 103 84 G4Exception("G4ExactHelixStepper::DumbSteppe << 104 G4Exception("G4ExactHelixStepper::DumbStepper should not be called.", 85 "GeomField0002", FatalException, << 105 "EHS:NoDumbStepper", FatalException, "Stepper must do all the work." ); 86 "Should not be called. Stepper m << 87 } 106 } 88 107 89 108 90 // ------------------------------------------- 109 // --------------------------------------------------------------------------- 91 110 92 G4double << 111 G4double G4ExactHelixStepper::DistChord() const 93 G4ExactHelixStepper::DistChord() const << 94 { 112 { 95 // Implementation : must check whether h/R > 113 // Implementation : must check whether h/R > pi !! 96 // If( h/R < pi) DistChord=h/2*std::tan 114 // If( h/R < pi) DistChord=h/2*std::tan(Ang_curve/4) 97 // Else DistChord=R_helix 115 // Else DistChord=R_helix 98 << 116 // 99 G4double distChord; 117 G4double distChord; 100 G4double Ang_curve=GetAngCurve(); 118 G4double Ang_curve=GetAngCurve(); 101 119 102 if (Ang_curve<=pi) << 120 103 { << 121 if(Ang_curve<=pi){ 104 distChord=GetRadHelix()*(1-std::cos(0.5*An << 122 distChord=GetRadHelix()*(1-std::cos(0.5*Ang_curve)); 105 } << 123 } 106 else if(Ang_curve<twopi) << 124 else 107 { << 125 if(Ang_curve<twopi){ 108 distChord=GetRadHelix()*(1+std::cos(0.5*(t << 126 distChord=GetRadHelix()*(1+std::cos(0.5*(twopi-Ang_curve))); 109 } << 127 } 110 else << 128 else{ 111 { << 129 distChord=2.*GetRadHelix(); 112 distChord=2.*GetRadHelix(); << 130 } 113 } << 131 >> 132 114 133 115 return distChord; 134 return distChord; >> 135 116 } 136 } 117 << 118 // ------------------------------------------- << 119 137 120 G4int 138 G4int 121 G4ExactHelixStepper::IntegratorOrder() const 139 G4ExactHelixStepper::IntegratorOrder() const 122 { 140 { 123 return 1; 141 return 1; 124 } 142 } 125 143