20#include "BDSIntegratorSolenoid.hh"
21#include "BDSMagnetStrength.hh"
23#include "BDSUtilities.hh"
26#include "G4Mag_EqRhs.hh"
27#include "G4ThreeVector.hh"
34 G4Mag_EqRhs* eqOfMIn):
37 bField = brho * (*strength)[
"ks"];
40 G4cout << __METHOD_NAME__ <<
"B (local) = " << bField << G4endl;
45 const G4double dydx[],
51 const G4double fcof =
eqOfM->FCof();
59 G4ThreeVector mom = G4ThreeVector(yIn[3], yIn[4], yIn[5]);
60 G4double momMag = mom.mag();
63 G4double kappa = 0.5*fcof*
bField/momMag / CLHEP::m;
66 if (std::abs(kappa)<1e-20)
73 G4ThreeVector pos = G4ThreeVector(yIn[0], yIn[1], yIn[2]);
74 G4ThreeVector momUnit = mom.unit();
79 G4ThreeVector localMomUnit = localMom.unit();
82 G4double x0 = localPos.x();
83 G4double y0 = localPos.y();
84 G4double z0 = localPos.z();
85 G4double xp0 = localMomUnit.x();
86 G4double yp0 = localMomUnit.y();
87 G4double zp0 = localMomUnit.z();
100 localA.setX(-zp0*x0);
101 localA.setY( zp0*y0);
102 localA.setZ( x0*xp0 - y0*yp0);
106 G4double localAMag = localA.mag();
109 if (localAMag < 1e-15)
116 G4double radiusOfCurvature = std::numeric_limits<double>::max();
118 {radiusOfCurvature = 1./localAMag;}
121 G4double dc = h2/(8*radiusOfCurvature);
139 G4double C = std::cos(2 * kappa * h);
140 G4double S = std::sin(2 * kappa * h);
141 G4double S2oK = S / kappa;
142 G4double OmC2oK = (1.0 - C) / kappa;
144 G4double X11 = 1, X12 = 0.5*S2oK, X13 = 0, X14 = 0.5*OmC2oK;
145 G4double X21 = 0, X22 = C, X23 = 0, X24 = S;
146 G4double X31 = 0, X32 = -0.5*OmC2oK, X33 = 1, X34 = 0.5*S2oK;
147 G4double X41 = 0, X42 = -S, X43 = 0, X44 = C ;
149 G4double x1 = x0*X11 + xp0*X12 + y0*X13 + yp0*X14;
150 G4double xp1 = x0*X21 + xp0*X22 + y0*X23 + yp0*X24;
151 G4double y1 = x0*X31 + xp0*X32 + y0*X33 + yp0*X34;
152 G4double yp1 = x0*X41 + xp0*X42 + y0*X43 + yp0*X44;
154 G4double z1 = z0 + h;
156 G4double zp1 = std::sqrt(1 - xp1*xp1 - yp1*yp1);
163 localMomUnit.setX(xp1);
164 localMomUnit.setY(yp1);
165 localMomUnit.setZ(zp1);
168 G4ThreeVector localMomOut = localMomUnit * momMag;
171 BDSStep globalPosMom = CurvilinearToGlobal(localPos, localMomOut,
true);
172 G4ThreeVector globalPosOut = globalPosMom.
PreStepPoint();
176 G4ThreeVector globalMomOutU = globalMomOut.unit();
177 globalMomOutU *= 1e-8;
180 for (G4int i = 0; i < 3; i++)
182 yOut[i] = globalPosOut[i];
183 yOut[i+3] = globalMomOut[i];
184 yErr[i] = globalMomOutU[i]*1e-10;
BDSStep GlobalToCurvilinear(const G4double fieldArcLength, const G4ThreeVector &unitField, const G4double angle, const G4ThreeVector &position, const G4ThreeVector &unitMomentum, const G4double h, const G4bool useCurvilinearWorld, const G4double FCof, const G4double tilt=0)
void AdvanceDriftMag(const G4double yIn[], const G4double h, G4double yOut[], G4double yErr[]) const
Error array [6] all 0.
Common functionality to BDSIM integrators.
G4double backupStepperMomLimit
void SetDistChord(G4double distChordIn)
Setter for distChord to private member.
G4MagIntegratorStepper * backupStepper
virtual void Stepper(const G4double y[], const G4double dydx[], const G4double h, G4double yOut[], G4double yErr[])
Calculate the particle motion along step length l in the paraxial approximation.
BDSIntegratorSolenoid()
Private default constructor to enforce use of supplied constructor.
G4double bField
The field strength.
Efficient storage of magnet strengths.
A simple class to represent the positions of a step.
G4ThreeVector PostStepPoint() const
Accessor.
G4ThreeVector PreStepPoint() const
Accessor.
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())
G4bool IsFiniteStrength(G4double variable)