39BDSFieldMagSolenoidSheet::BDSFieldMagSolenoidSheet(G4double strength,
40 G4bool strengthIsCurrent,
43 G4double toleranceIn):
45 halfLength(0.5*fullLength),
48 spatialLimit(
std::min(1e-5*sheetRadius, 1e-5*fullLength)),
50 coilTolerance(toleranceIn)
54 if (strengthIsCurrent)
57 B0 = CLHEP::mu0 * strength / (CLHEP::pi*2* halfLength);
62 I = B0 *(CLHEP::pi*2* halfLength) / CLHEP::mu0;
73 const G4double )
const
75 G4double z = position.z();
76 G4double rho = position.perp();
77 G4double phi = position.phi();
81 if (std::abs(rho - a) < spatialLimit && (std::abs(z) < halfLength+2*spatialLimit))
82 {
return G4ThreeVector();}
83 G4double zp = z + halfLength;
84 G4double zm = z - halfLength;
90 if (std::abs(
OnAxisBz(zp, zm))< coilTolerance)
95 else if (std::abs(rho) < spatialLimit)
99 G4double zpSq = zp*zp;
100 G4double zmSq = zm*zm;
102 G4double rhoPlusA = rho + a;
103 G4double rhoPlusASq = rhoPlusA * rhoPlusA;
104 G4double aMinusRho = a - rho;
105 G4double aMinusRhoSq = aMinusRho*aMinusRho;
107 G4double denominatorP = std::sqrt(zpSq + rhoPlusASq);
108 G4double denominatorM = std::sqrt(zmSq + rhoPlusASq);
110 G4double alphap = a / denominatorP;
111 G4double alpham = a / denominatorM;
113 G4double betap = zp / denominatorP;
114 G4double betam = zm / denominatorM;
116 G4double gamma = (a - rho) / (rhoPlusA);
117 G4double gammaSq = gamma * gamma;
119 G4double kp = std::sqrt(zpSq + aMinusRhoSq) / denominatorP;
120 G4double km = std::sqrt(zmSq + aMinusRhoSq) / denominatorM;
122 Brho = B0 * (alphap *
BDS::CEL(kp, 1, 1, -1) - alpham *
BDS::CEL(km, 1, 1, -1));
123 Bz = ((B0 * a) / (rhoPlusA)) * (betap *
BDS::CEL(kp, gammaSq, 1, gamma) - betam *
BDS::CEL(km, gammaSq, 1, gamma));
125 if (std::isnan(Brho))
132 G4ThreeVector result = G4ThreeVector(Brho,0,Bz)* normalisation;
133 result = result.rotateZ(phi);