19#include "BDSFieldMagMultipole.hh"
20#include "BDSMagnetStrength.hh"
21#include "BDSUtilities.hh"
24#include "G4ThreeVector.hh"
33 maximumNonZeroOrder(0),
34 normalComponents(strength->NormalComponents()),
35 skewComponents(strength->SkewComponents())
40 for (G4int i = 0; i < (G4int)normalComponents.size(); i++)
42 normalComponents[i] *= (brho / std::pow(CLHEP::m, i+2));
43 G4double kn = normalComponents[i];
45 finiteStrength = nonZeroKN || finiteStrength;
47 {maximumNonZeroOrder = std::max(maximumNonZeroOrder, i);}
49 for (G4int i = 0; i < (G4int)skewComponents.size(); i++)
51 skewComponents[i] *= (brho / std::pow(CLHEP::m, i+2));
52 G4double ks = skewComponents[i];
54 finiteStrength = nonZeroKS || finiteStrength;
56 {maximumNonZeroOrder = std::max(maximumNonZeroOrder, i);}
58 maximumNonZeroOrder += 1;
62 if (std::abs(order) > (G4int)normalComponents.size())
63 {order = (G4int)normalComponents.size();}
67 const G4double )
const
70 G4double r = std::hypot(position.x(),position.y());
73 {phi = atan2(position.y(),position.x());}
93 G4double o = (G4double)i+2;
95 br -=
skewComponents[i] * std::pow(r, o - 1) * std::cos(o * phi) / ffact;
97 bphi +=
normalComponents[i] * std::pow(r, o - 1) * std::cos(o * phi) / ffact;
98 bphi +=
skewComponents[i] * std::pow(r, o - 1) * std::sin(o * phi) / ffact;
107 G4ThreeVector cartesianField;
108 cartesianField[0] = (br * std::cos(phi) - bphi * std::sin(phi));
109 cartesianField[1] = (br * std::sin(phi) + bphi * std::cos(phi));
110 cartesianField[2] = 0;
112 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)