36BDSFieldMagSolenoidLoop::BDSFieldMagSolenoidLoop(G4double strength,
37 G4bool strengthIsCurrent,
42 spatialLimit(1e-6*radiusIn),
43 mu0OverPiTimesITimesA(1)
49 if (strengthIsCurrent)
52 B0 = CLHEP::mu0 * strength / (2*a);
57 I = B0 * 2 * a / CLHEP::mu0;
60 mu0OverPiTimesITimesA = CLHEP::mu0 * I * a / CLHEP::pi;
64 const G4double )
const
66 G4double z = position.z();
67 G4double rho = position.perp();
68 G4double phi = position.phi();
72 if (std::abs(z) < spatialLimit && (std::abs(rho - a) < spatialLimit))
73 {
return G4ThreeVector();}
77 G4double aPlusRho = a + rho;
78 G4double aPlusRhoSq = aPlusRho * aPlusRho;
79 G4double aMinusRho = a - rho;
80 G4double aMinusRhoSq = aMinusRho*aMinusRho;
82 G4double gamma = aMinusRho / aPlusRho;
84 G4double zSqPlusAPlusRhoSq = zSq + aPlusRhoSq;
85 G4double zSqPlusAMinusRhoSq = zSq + aMinusRhoSq;
87 G4double k1Sq = zSqPlusAMinusRhoSq / zSqPlusAPlusRhoSq;
88 G4double k1 = std::sqrt(k1Sq);
90 G4double zSqPlusAPlusRhoSqFactor3o2 = std::pow(zSqPlusAPlusRhoSq, 1.5);
92 G4double commonFactor = mu0OverPiTimesITimesA / zSqPlusAPlusRhoSqFactor3o2;
94 G4double Brho = commonFactor * z *
BDS::CEL(k1, k1Sq, -1, 1);
95 G4double Bz = commonFactor * aPlusRho *
BDS::CEL(k1, k1Sq, 1, gamma);
105 G4ThreeVector result = G4ThreeVector(Brho,0,Bz);
106 result = result.rotateZ(phi);