38BDSFieldMagSolenoidSheet::BDSFieldMagSolenoidSheet(G4double strength,
39 G4bool strengthIsCurrent,
42 G4double toleranceIn):
44 halfLength(0.5*fullLength),
47 spatialLimit(
std::min(1e-5*sheetRadius, 1e-5*fullLength)),
49 coilTolerance(toleranceIn)
53 if (strengthIsCurrent)
56 B0 = CLHEP::mu0 * strength / (CLHEP::pi*2* halfLength);
61 I = B0 *(CLHEP::pi*2* halfLength) / CLHEP::mu0;
72 const G4double )
const
74 G4double z = position.z();
75 G4double rho = position.perp();
76 G4double phi = position.phi();
80 if (std::abs(rho - a) < spatialLimit && (std::abs(z) < halfLength+2*spatialLimit))
81 {
return G4ThreeVector();}
82 G4double zp = z + halfLength;
83 G4double zm = z - halfLength;
89 if (std::abs(
OnAxisBz(zp, zm))< coilTolerance)
94 else if (std::abs(rho) < spatialLimit)
98 G4double zpSq = zp*zp;
99 G4double zmSq = zm*zm;
101 G4double rhoPlusA = rho + a;
102 G4double rhoPlusASq = rhoPlusA * rhoPlusA;
103 G4double aMinusRho = a - rho;
104 G4double aMinusRhoSq = aMinusRho*aMinusRho;
106 G4double denominatorP = std::sqrt(zpSq + rhoPlusASq);
107 G4double denominatorM = std::sqrt(zmSq + rhoPlusASq);
109 G4double alphap = a / denominatorP;
110 G4double alpham = a / denominatorM;
112 G4double betap = zp / denominatorP;
113 G4double betam = zm / denominatorM;
115 G4double gamma = (a - rho) / (rhoPlusA);
116 G4double gammaSq = gamma * gamma;
118 G4double kp = std::sqrt(zpSq + aMinusRhoSq) / denominatorP;
119 G4double km = std::sqrt(zmSq + aMinusRhoSq) / denominatorM;
121 Brho = B0 * (alphap *
BDS::CEL(kp, 1, 1, -1) - alpham *
BDS::CEL(km, 1, 1, -1));
122 Bz = ((B0 * a) / (rhoPlusA)) * (betap *
BDS::CEL(kp, gammaSq, 1, gamma) - betam *
BDS::CEL(km, gammaSq, 1, gamma));
124 if (std::isnan(Brho))
131 G4ThreeVector result = G4ThreeVector(Brho,0,Bz)* normalisation;
132 result = result.rotateZ(phi);