19#include "BDSIntegratorDipoleRodrigues2.hh"
20#include "BDSMagnetStrength.hh"
21#include "BDSUtilities.hh"
24#include "G4ClassicalRK4.hh"
25#include "G4Mag_EqRhs.hh"
26#include "G4ThreeVector.hh"
28#include "CLHEP/Units/SystemOfUnits.h"
33 G4double minimumRadiusOfCurvatureIn):
34 G4MagHelicalStepper(eqOfMIn),
36 minimumRadiusOfCurvature(minimumRadiusOfCurvatureIn)
44 AdvanceHelix(yIn, field, stepLength, yOut);
52 eqOfM->GetFieldValue(yIn, bO);
53 G4ThreeVector bOriginal = G4ThreeVector(bO[0],bO[1],bO[2]);
56 AdvanceHelix(yIn, bOriginal, h, yOut);
78 eqOfM->GetFieldValue(yIn, bO);
79 G4ThreeVector bOriginal = G4ThreeVector(bO[0],bO[1],bO[2]);
90 AdvanceHelix(yIn, bOriginal, h, yOut);
93 G4double ang = GetAngCurve();
94 G4double rad = GetRadHelix();
107 const G4double radiusOfCurvature = rad;
123 for (G4int i = 0; i < 3; i++)
136 AdvanceHelix(yIn, bOriginal, h*0.5, yTemp);
141 GetEquationOfMotion()->GetFieldValue(yTemp, bM);
142 G4ThreeVector bMid = G4ThreeVector(bM[0],bM[1],bM[2]);
145 AdvanceHelix(yTemp, bMid, h*0.5, yTemp2);
148 for (G4int i = 0; i < 6; i++)
149 {yErr[i] = std::abs(yOut[i] - yTemp2[i]);}
157 const G4ThreeVector& field,
162 G4ThreeVector fieldUnit = field.unit();
172 G4double momMag = G4ThreeVector(yIn[3], yIn[4], yIn[5]).mag();
175 G4ThreeVector momNew = fieldUnit*momMag;
178 G4double yModified[7];
179 for (G4int i = 0; i < 3; i++)
181 yModified[i] = yIn[i];
182 yModified[i + 3] = momNew[i];
189 for (G4int i = 0; i < 3; i++)
void AdvanceHelixForSpiralling(const G4double yIn[6], const G4ThreeVector &field, const G4double &h, G4double yOut[6], G4double yErr[6])
G4Mag_EqRhs * eqOfM
Cache of equation of motion. This class does not own it.
void SingleStep(const G4double yIn[6], const G4double &h, G4double yOut[6])
G4double minimumRadiusOfCurvature
virtual void DumbStepper(const G4double yIn[6], G4ThreeVector field, G4double stepLength, G4double yOut[6])
virtual void Stepper(const G4double yIn[6], const G4double dydx[], G4double h, G4double yOut[6], G4double yErr[6])
Output error array.
BDSIntegratorDipoleRodrigues2()=delete
Private default constructor to force use of provided one.
void FudgeDistChordToZero()
void AdvanceDriftMag(const G4double yIn[], const G4double h, G4double yOut[], G4double yErr[]) const
Error array [6] all 0.
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())
G4bool IsFiniteStrength(G4double variable)