20#include "BDSFieldMagMultipole.hh"
21#include "BDSMagnetStrength.hh"
22#include "BDSUtilities.hh"
25#include "G4ThreeVector.hh"
34 maximumNonZeroOrder(0),
35 normalComponents(strength->NormalComponents()),
36 skewComponents(strength->SkewComponents())
41 for (G4int i = 0; i < (G4int)normalComponents.size(); i++)
43 normalComponents[i] *= (brho / std::pow(CLHEP::m, i+2));
44 G4double kn = normalComponents[i];
46 finiteStrength = nonZeroKN || finiteStrength;
48 {maximumNonZeroOrder = std::max(maximumNonZeroOrder, i);}
50 for (G4int i = 0; i < (G4int)skewComponents.size(); i++)
52 skewComponents[i] *= (brho / std::pow(CLHEP::m, i+2));
53 G4double ks = skewComponents[i];
55 finiteStrength = nonZeroKS || finiteStrength;
57 {maximumNonZeroOrder = std::max(maximumNonZeroOrder, i);}
59 maximumNonZeroOrder += 1;
63 if (std::abs(order) > (G4int)normalComponents.size())
64 {order = (G4int)normalComponents.size();}
68 const G4double )
const
71 G4double r = std::hypot(position.x(),position.y());
74 {phi = atan2(position.y(),position.x());}
94 G4double o = (G4double)i+2;
96 br -=
skewComponents[i] * std::pow(r, o - 1) * std::cos(o * phi) / ffact;
98 bphi +=
normalComponents[i] * std::pow(r, o - 1) * std::cos(o * phi) / ffact;
99 bphi +=
skewComponents[i] * std::pow(r, o - 1) * std::sin(o * phi) / ffact;
108 G4ThreeVector cartesianField;
109 cartesianField[0] = (br * std::cos(phi) - bphi * std::sin(phi));
110 cartesianField[1] = (br * std::sin(phi) + bphi * std::cos(phi));
111 cartesianField[2] = 0;
113 return cartesianField;
std::vector< G4double > normalComponents
Normal field components (normal - ie not skew) = kn * brho.
BDSFieldMagMultipole()
Private default constructor to force use of supplied constructor.
std::vector< G4double > skewComponents
Skew field components = kns * brho.
virtual G4ThreeVector GetField(const G4ThreeVector &position, const G4double t=0) const
Access the field value.
G4int maximumNonZeroOrder
Efficient storage of magnet strengths.
G4bool IsFiniteStrength(G4double variable)