Geant4-11
Public Member Functions | Protected Member Functions | Private Attributes | Static Private Attributes
G4HelixExplicitEuler Class Reference

#include <G4HelixExplicitEuler.hh>

Inheritance diagram for G4HelixExplicitEuler:
G4MagHelicalStepper G4MagIntegratorStepper

Public Member Functions

G4double DistChord () const
 
void DumbStepper (const G4double y[], G4ThreeVector Bfld, G4double h, G4double yout[])
 
 G4HelixExplicitEuler (G4Mag_EqRhs *EqRhs)
 
G4EquationOfMotion * GetEquationOfMotion ()
 
const G4EquationOfMotion * GetEquationOfMotion () const
 
unsigned long GetfNoRHSCalls ()
 
G4int GetNumberOfStateVariables () const
 
G4int GetNumberOfVariables () const
 
G4int IntegrationOrder ()
 
G4int IntegratorOrder () const
 
G4bool IsFSAL () const
 
void NormalisePolarizationVector (G4double vec[12])
 
void NormaliseTangentVector (G4double vec[6])
 
void ResetfNORHSCalls ()
 
void RightHandSide (const G4double y[], G4double dydx[]) const
 
void RightHandSide (const G4double y[], G4double dydx[], G4double field[]) const
 
void SetEquationOfMotion (G4EquationOfMotion *newEquation)
 
void Stepper (const G4double y[], const G4double *, G4double h, G4double yout[], G4double yerr[])
 
virtual void Stepper (const G4double y[], const G4double dydx[], G4double h, G4double yout[], G4double yerr[])
 
 ~G4HelixExplicitEuler ()
 

Protected Member Functions

void AdvanceHelix (const G4double yIn[], G4ThreeVector Bfld, G4double h, G4double yHelix[], G4double yHelix2[]=0)
 
G4double GetAngCurve () const
 
G4double GetCurve () const
 
G4double GetInverseCurve (const G4double Momentum, const G4double Bmag)
 
G4double GetRadHelix () const
 
void LinearStep (const G4double yIn[], G4double h, G4double yHelix[]) const
 
void MagFieldEvaluate (const G4double y[], G4ThreeVector &Bfield)
 
void SetAngCurve (const G4double Ang)
 
void SetCurve (const G4double Curve)
 
void SetFSAL (G4bool flag=true)
 
void SetIntegrationOrder (G4int order)
 
void SetRadHelix (const G4double Rad)
 

Private Attributes

G4double fAngCurve = 0.0
 
G4EquationOfMotion * fEquation_Rhs = nullptr
 
G4int fIntegrationOrder = -1
 
G4bool fIsFSAL = false
 
const G4int fNoIntegrationVariables = 0
 
unsigned long fNoRHSCalls = 0UL
 
const G4int fNoStateVariables = 0
 
G4Mag_EqRhs * fPtrMagEqOfMot = nullptr
 
G4double frCurve = 0.0
 
G4double frHelix = 0.0
 
G4ThreeVector yFinal
 
G4ThreeVector yInitial
 
G4ThreeVector yMidPoint
 

Static Private Attributes

static const G4double fUnitConstant = 0.299792458*(GeV/(tesla*m))
 

Detailed Description

Definition at line 42 of file G4HelixExplicitEuler.hh.

Constructor & Destructor Documentation

◆ G4HelixExplicitEuler()

G4HelixExplicitEuler::G4HelixExplicitEuler ( G4Mag_EqRhs *  EqRhs)

Definition at line 40 of file G4HelixExplicitEuler.cc.

41 : G4MagHelicalStepper(EqRhs)
42{
43}
G4MagHelicalStepper(G4Mag_EqRhs *EqRhs)

◆ ~G4HelixExplicitEuler()

G4HelixExplicitEuler::~G4HelixExplicitEuler ( )

Definition at line 45 of file G4HelixExplicitEuler.cc.

46{
47}

Member Function Documentation

◆ AdvanceHelix()

void G4MagHelicalStepper::AdvanceHelix ( const G4double  yIn[],
G4ThreeVector  Bfld,
G4double  h,
G4double  yHelix[],
G4double  yHelix2[] = 0 
)
protectedinherited

Definition at line 57 of file G4MagHelicalStepper.cc.

62{
63 // const G4int nvar = 6;
64
65 // OLD const G4double approc_limit = 0.05;
66 // OLD approc_limit = 0.05 gives max.error=x^5/5!=(0.05)^5/5!=2.6*e-9
67 // NEW approc_limit = 0.005 gives max.error=x^5/5!=2.6*e-14
68
69 const G4double approc_limit = 0.005;
70 G4ThreeVector Bnorm, B_x_P, vperp, vpar;
71
72 G4double B_d_P;
73 G4double B_v_P;
74 G4double Theta;
75 G4double R_1;
76 G4double R_Helix;
77 G4double CosT2, SinT2, CosT, SinT;
78 G4ThreeVector positionMove, endTangent;
79
80 G4double Bmag = Bfld.mag();
81 const G4double* pIn = yIn+3;
82 G4ThreeVector initVelocity = G4ThreeVector( pIn[0], pIn[1], pIn[2]);
83 G4double velocityVal = initVelocity.mag();
84 G4ThreeVector initTangent = (1.0/velocityVal) * initVelocity;
85
86 R_1 = GetInverseCurve(velocityVal,Bmag);
87
88 // for too small magnetic fields there is no curvature
89 // (include momentum here) FIXME
90
91 if( (std::fabs(R_1) < 1e-10)||(Bmag<1e-12) )
92 {
93 LinearStep( yIn, h, yHelix );
94
95 // Store and/or calculate parameters for chord distance
96
97 SetAngCurve(1.);
98 SetCurve(h);
99 SetRadHelix(0.);
100 }
101 else
102 {
103 Bnorm = (1.0/Bmag)*Bfld;
104
105 // calculate the direction of the force
106
107 B_x_P = Bnorm.cross(initTangent);
108
109 // parallel and perp vectors
110
111 B_d_P = Bnorm.dot(initTangent); // this is the fraction of P parallel to B
112
113 vpar = B_d_P * Bnorm; // the component parallel to B
114 vperp= initTangent - vpar; // the component perpendicular to B
115
116 B_v_P = std::sqrt( 1 - B_d_P * B_d_P); // Fraction of P perp to B
117
118 // calculate the stepping angle
119
120 Theta = R_1 * h; // * B_v_P;
121
122 // Trigonometrix
123
124 if( std::fabs(Theta) > approc_limit )
125 {
126 SinT = std::sin(Theta);
127 CosT = std::cos(Theta);
128 }
129 else
130 {
131 G4double Theta2 = Theta*Theta;
132 G4double Theta3 = Theta2 * Theta;
133 G4double Theta4 = Theta2 * Theta2;
134 SinT = Theta - 1.0/6.0 * Theta3;
135 CosT = 1 - 0.5 * Theta2 + 1.0/24.0 * Theta4;
136 }
137
138 // the actual "rotation"
139
140 G4double R = 1.0 / R_1;
141
142 positionMove = R * ( SinT * vperp + (1-CosT) * B_x_P) + h * vpar;
143 endTangent = CosT * vperp + SinT * B_x_P + vpar;
144
145 // Store the resulting position and tangent
146
147 yHelix[0] = yIn[0] + positionMove.x();
148 yHelix[1] = yIn[1] + positionMove.y();
149 yHelix[2] = yIn[2] + positionMove.z();
150 yHelix[3] = velocityVal * endTangent.x();
151 yHelix[4] = velocityVal * endTangent.y();
152 yHelix[5] = velocityVal * endTangent.z();
153
154 // Store 2*h step Helix if exist
155
156 if(yHelix2)
157 {
158 SinT2 = 2.0 * SinT * CosT;
159 CosT2 = 1.0 - 2.0 * SinT * SinT;
160 endTangent = (CosT2 * vperp + SinT2 * B_x_P + vpar);
161 positionMove = R * ( SinT2 * vperp + (1-CosT2) * B_x_P) + h*2 * vpar;
162
163 yHelix2[0] = yIn[0] + positionMove.x();
164 yHelix2[1] = yIn[1] + positionMove.y();
165 yHelix2[2] = yIn[2] + positionMove.z();
166 yHelix2[3] = velocityVal * endTangent.x();
167 yHelix2[4] = velocityVal * endTangent.y();
168 yHelix2[5] = velocityVal * endTangent.z();
169 }
170
171 // Store and/or calculate parameters for chord distance
172
173 G4double ptan=velocityVal*B_v_P;
174
175 G4double particleCharge = fPtrMagEqOfMot->FCof() / (eplus*c_light);
176 R_Helix =std::abs( ptan/(fUnitConstant * particleCharge*Bmag));
177
178 SetAngCurve(std::abs(Theta));
179 SetCurve(std::abs(R));
180 SetRadHelix(R_Helix);
181 }
182}
static constexpr double eplus
Definition: G4SIunits.hh:184
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
double z() const
double x() const
double y() const
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
double mag() const
static const G4double fUnitConstant
void SetCurve(const G4double Curve)
void SetRadHelix(const G4double Rad)
G4double GetInverseCurve(const G4double Momentum, const G4double Bmag)
void LinearStep(const G4double yIn[], G4double h, G4double yHelix[]) const
void SetAngCurve(const G4double Ang)
G4double FCof() const
Definition: G4Mag_EqRhs.hh:62
float c_light
Definition: hepunit.py:256

References source.hepunit::c_light, CLHEP::Hep3Vector::cross(), CLHEP::Hep3Vector::dot(), eplus, G4Mag_EqRhs::FCof(), G4MagHelicalStepper::fPtrMagEqOfMot, G4MagHelicalStepper::fUnitConstant, G4MagHelicalStepper::GetInverseCurve(), G4MagHelicalStepper::LinearStep(), CLHEP::Hep3Vector::mag(), G4MagHelicalStepper::SetAngCurve(), G4MagHelicalStepper::SetCurve(), G4MagHelicalStepper::SetRadHelix(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

Referenced by G4ExactHelixStepper::DumbStepper(), DumbStepper(), G4HelixHeum::DumbStepper(), G4HelixImplicitEuler::DumbStepper(), G4HelixMixedStepper::DumbStepper(), G4HelixSimpleRunge::DumbStepper(), Stepper(), G4ExactHelixStepper::Stepper(), and G4HelixMixedStepper::Stepper().

◆ DistChord()

G4double G4HelixExplicitEuler::DistChord ( ) const
virtual

Implements G4MagIntegratorStepper.

Definition at line 89 of file G4HelixExplicitEuler.cc.

90{
91 // Implementation : must check whether h/R > 2 pi !!
92 // If( h/R < pi) use G4LineSection::DistLine
93 // Else DistChord=R_helix
94 //
95 G4double distChord;
96 G4double Ang_curve=GetAngCurve();
97
98
99 if(Ang_curve<=pi)
100 {
101 distChord=GetRadHelix()*(1-std::cos(0.5*Ang_curve));
102 }
103 else if(Ang_curve<twopi)
104 {
105 distChord=GetRadHelix()*(1+std::cos(0.5*(twopi-Ang_curve)));
106 }
107 else
108 {
109 distChord=2.*GetRadHelix();
110 }
111
112 return distChord;
113}
static constexpr double twopi
Definition: G4SIunits.hh:56
static constexpr double pi
Definition: G4SIunits.hh:55
G4double GetRadHelix() const
G4double GetAngCurve() const

References G4MagHelicalStepper::GetAngCurve(), G4MagHelicalStepper::GetRadHelix(), pi, and twopi.

◆ DumbStepper()

void G4HelixExplicitEuler::DumbStepper ( const G4double  y[],
G4ThreeVector  Bfld,
G4double  h,
G4double  yout[] 
)
virtual

Implements G4MagHelicalStepper.

Definition at line 115 of file G4HelixExplicitEuler.cc.

119{
120 AdvanceHelix(yIn, Bfld, h, yOut);
121}
void AdvanceHelix(const G4double yIn[], G4ThreeVector Bfld, G4double h, G4double yHelix[], G4double yHelix2[]=0)

References G4MagHelicalStepper::AdvanceHelix().

◆ GetAngCurve()

G4double G4MagHelicalStepper::GetAngCurve ( ) const
inlineprotectedinherited

◆ GetCurve()

G4double G4MagHelicalStepper::GetCurve ( ) const
inlineprotectedinherited

◆ GetEquationOfMotion() [1/2]

G4EquationOfMotion * G4MagIntegratorStepper::GetEquationOfMotion ( )
inlineinherited

◆ GetEquationOfMotion() [2/2]

const G4EquationOfMotion * G4MagIntegratorStepper::GetEquationOfMotion ( ) const
inlineinherited

◆ GetfNoRHSCalls()

unsigned long G4MagIntegratorStepper::GetfNoRHSCalls ( )
inlineinherited

◆ GetInverseCurve()

G4double G4MagHelicalStepper::GetInverseCurve ( const G4double  Momentum,
const G4double  Bmag 
)
inlineprotectedinherited

◆ GetNumberOfStateVariables()

G4int G4MagIntegratorStepper::GetNumberOfStateVariables ( ) const
inlineinherited

◆ GetNumberOfVariables()

G4int G4MagIntegratorStepper::GetNumberOfVariables ( ) const
inlineinherited

◆ GetRadHelix()

G4double G4MagHelicalStepper::GetRadHelix ( ) const
inlineprotectedinherited

◆ IntegrationOrder()

G4int G4MagIntegratorStepper::IntegrationOrder ( )
inlineinherited

◆ IntegratorOrder()

G4int G4HelixExplicitEuler::IntegratorOrder ( ) const
inlinevirtual

Implements G4MagIntegratorStepper.

Definition at line 64 of file G4HelixExplicitEuler.hh.

64{ return 1; }

◆ IsFSAL()

G4bool G4MagIntegratorStepper::IsFSAL ( ) const
inlineinherited

◆ LinearStep()

void G4MagHelicalStepper::LinearStep ( const G4double  yIn[],
G4double  h,
G4double  yHelix[] 
) const
inlineprotectedinherited

◆ MagFieldEvaluate()

void G4MagHelicalStepper::MagFieldEvaluate ( const G4double  y[],
G4ThreeVector &  Bfield 
)
inlineprotectedinherited

◆ NormalisePolarizationVector()

void G4MagIntegratorStepper::NormalisePolarizationVector ( G4double  vec[12])
inlineinherited

◆ NormaliseTangentVector()

void G4MagIntegratorStepper::NormaliseTangentVector ( G4double  vec[6])
inlineinherited

◆ ResetfNORHSCalls()

void G4MagIntegratorStepper::ResetfNORHSCalls ( )
inlineinherited

◆ RightHandSide() [1/2]

void G4MagIntegratorStepper::RightHandSide ( const G4double  y[],
G4double  dydx[] 
) const
inlineinherited

◆ RightHandSide() [2/2]

void G4MagIntegratorStepper::RightHandSide ( const G4double  y[],
G4double  dydx[],
G4double  field[] 
) const
inlineinherited

◆ SetAngCurve()

void G4MagHelicalStepper::SetAngCurve ( const G4double  Ang)
inlineprotectedinherited

◆ SetCurve()

void G4MagHelicalStepper::SetCurve ( const G4double  Curve)
inlineprotectedinherited

◆ SetEquationOfMotion()

void G4MagIntegratorStepper::SetEquationOfMotion ( G4EquationOfMotion *  newEquation)
inlineinherited

◆ SetFSAL()

void G4MagIntegratorStepper::SetFSAL ( G4bool  flag = true)
inlineprotectedinherited

◆ SetIntegrationOrder()

void G4MagIntegratorStepper::SetIntegrationOrder ( G4int  order)
inlineprotectedinherited

◆ SetRadHelix()

void G4MagHelicalStepper::SetRadHelix ( const G4double  Rad)
inlineprotectedinherited

◆ Stepper() [1/2]

void G4HelixExplicitEuler::Stepper ( const G4double  y[],
const G4double *  ,
G4double  h,
G4double  yout[],
G4double  yerr[] 
)

Definition at line 49 of file G4HelixExplicitEuler.cc.

54{
55 // Estimation of the Stepping Angle
56 //
57 G4ThreeVector Bfld;
58 MagFieldEvaluate(yInput, Bfld);
59
60 const G4int nvar = 6 ;
61 G4double yTemp[8], yIn[8] ;
62 G4ThreeVector Bfld_midpoint;
63
64 // Saving yInput because yInput and yOut can be aliases for same array
65 //
66 for(G4int i=0; i<nvar; ++i)
67 {
68 yIn[i] = yInput[i];
69 }
70
71 G4double h = Step * 0.5;
72
73 // Do full step and two half steps
74 //
75 G4double yTemp2[7];
76 AdvanceHelix(yIn, Bfld, h, yTemp2,yTemp);
77 MagFieldEvaluate(yTemp2, Bfld_midpoint) ;
78 AdvanceHelix(yTemp2, Bfld_midpoint, h, yOut);
80
81 // Error estimation
82 //
83 for(G4int i=0; i<nvar; ++i)
84 {
85 yErr[i] = yOut[i] - yTemp[i];
86 }
87}
int G4int
Definition: G4Types.hh:85
void MagFieldEvaluate(const G4double y[], G4ThreeVector &Bfield)

References G4MagHelicalStepper::AdvanceHelix(), G4MagHelicalStepper::GetAngCurve(), G4MagHelicalStepper::MagFieldEvaluate(), and G4MagHelicalStepper::SetAngCurve().

◆ Stepper() [2/2]

void G4MagHelicalStepper::Stepper ( const G4double  y[],
const G4double  dydx[],
G4double  h,
G4double  yout[],
G4double  yerr[] 
)
virtualinherited

Implements G4MagIntegratorStepper.

Reimplemented in G4ExactHelixStepper, and G4HelixMixedStepper.

Definition at line 188 of file G4MagHelicalStepper.cc.

193{
194 const G4int nvar = 6;
195
196 // correction for Richardson Extrapolation.
197 // G4double correction = 1. / ( (1 << IntegratorOrder()) -1 );
198
199 G4double yTemp[8], yIn[8] ;
200 G4ThreeVector Bfld_initial, Bfld_midpoint;
201
202 // Saving yInput because yInput and yOut can be aliases for same array
203 //
204 for(G4int i=0; i<nvar; ++i)
205 {
206 yIn[i]=yInput[i];
207 }
208
209 G4double h = hstep * 0.5;
210
211 MagFieldEvaluate(yIn, Bfld_initial) ;
212
213 // Do two half steps
214 //
215 DumbStepper(yIn, Bfld_initial, h, yTemp);
216 MagFieldEvaluate(yTemp, Bfld_midpoint) ;
217 DumbStepper(yTemp, Bfld_midpoint, h, yOut);
218
219 // Do a full Step
220 //
221 h = hstep ;
222 DumbStepper(yIn, Bfld_initial, h, yTemp);
223
224 // Error estimation
225 //
226 for(G4int i=0; i<nvar; ++i)
227 {
228 yErr[i] = yOut[i] - yTemp[i] ;
229 }
230
231 return;
232}
virtual void DumbStepper(const G4double y[], G4ThreeVector Bfld, G4double h, G4double yout[])=0

References G4MagHelicalStepper::DumbStepper(), and G4MagHelicalStepper::MagFieldEvaluate().

Field Documentation

◆ fAngCurve

G4double G4MagHelicalStepper::fAngCurve = 0.0
privateinherited

Definition at line 120 of file G4MagHelicalStepper.hh.

◆ fEquation_Rhs

G4EquationOfMotion* G4MagIntegratorStepper::fEquation_Rhs = nullptr
privateinherited

Definition at line 124 of file G4MagIntegratorStepper.hh.

◆ fIntegrationOrder

G4int G4MagIntegratorStepper::fIntegrationOrder = -1
privateinherited

Definition at line 134 of file G4MagIntegratorStepper.hh.

◆ fIsFSAL

G4bool G4MagIntegratorStepper::fIsFSAL = false
privateinherited

Definition at line 136 of file G4MagIntegratorStepper.hh.

◆ fNoIntegrationVariables

const G4int G4MagIntegratorStepper::fNoIntegrationVariables = 0
privateinherited

Definition at line 125 of file G4MagIntegratorStepper.hh.

◆ fNoRHSCalls

unsigned long G4MagIntegratorStepper::fNoRHSCalls = 0UL
mutableprivateinherited

Definition at line 128 of file G4MagIntegratorStepper.hh.

◆ fNoStateVariables

const G4int G4MagIntegratorStepper::fNoStateVariables = 0
privateinherited

Definition at line 126 of file G4MagIntegratorStepper.hh.

◆ fPtrMagEqOfMot

G4Mag_EqRhs* G4MagHelicalStepper::fPtrMagEqOfMot = nullptr
privateinherited

Definition at line 116 of file G4MagHelicalStepper.hh.

Referenced by G4MagHelicalStepper::AdvanceHelix().

◆ frCurve

G4double G4MagHelicalStepper::frCurve = 0.0
privateinherited

Definition at line 121 of file G4MagHelicalStepper.hh.

◆ frHelix

G4double G4MagHelicalStepper::frHelix = 0.0
privateinherited

Definition at line 122 of file G4MagHelicalStepper.hh.

◆ fUnitConstant

const G4double G4MagHelicalStepper::fUnitConstant = 0.299792458*(GeV/(tesla*m))
staticprivateinherited

Definition at line 113 of file G4MagHelicalStepper.hh.

Referenced by G4MagHelicalStepper::AdvanceHelix().

◆ yFinal

G4ThreeVector G4MagHelicalStepper::yFinal
privateinherited

Definition at line 123 of file G4MagHelicalStepper.hh.

◆ yInitial

G4ThreeVector G4MagHelicalStepper::yInitial
privateinherited

Definition at line 123 of file G4MagHelicalStepper.hh.

◆ yMidPoint

G4ThreeVector G4MagHelicalStepper::yMidPoint
privateinherited

Definition at line 123 of file G4MagHelicalStepper.hh.


The documentation for this class was generated from the following files: