58 G4double incomingFaceAngle,
59 G4double outgoingFaceAngle,
60 G4bool buildFringeFields,
65 const G4String baseName = elementName;
68 const G4double arcLength = element->
l * CLHEP::m;
69 const G4double angle = (*st)[
"angle"];
70 G4double fint = element->
fint;
71 G4double fintx = element->
fintx;
72 G4double hgap = element->
hgap * CLHEP::m;
78 G4bool buildFringeIncoming = buildFringeFields;
79 G4bool buildFringeOutgoing = buildFringeFields;
82 BDSFieldType dipoleFieldType = finiteK1 ? BDSFieldType::dipolequadrupole : BDSFieldType::dipole;
84 if (buildFringeFields)
89 {buildFringeIncoming =
false;}
91 {buildFringeOutgoing =
false;}
102 {buildFringeIncoming =
true;}
104 {buildFringeOutgoing =
true;}
113 {buildFringeIncoming =
false;}
115 {buildFringeOutgoing =
false;}
122 if (prevElement->
type == ElementType::_SBEND)
124 buildFringeIncoming =
false;
126 {
throw BDSException( __METHOD_NAME__, prevElement->name +
" e2 clashes with " + elementName +
" e1");}
131 if (nextElement->
type == ElementType::_SBEND)
132 {buildFringeOutgoing =
false;}
138 buildFringeIncoming =
false;
139 buildFringeOutgoing =
false;
150 buildFringeIncoming =
false;
151 buildFringeOutgoing =
false;
179 vacuumField->SetModulatorInfo(fieldModulator);
181 BDSFieldType::dipole,
205 G4double centralArcLength = arcLength;
206 G4double centralAngle = angle;
207 G4double oneFringeAngle = 0;
209 {oneFringeAngle = (thinElementArcLength / arcLength) * angle;}
211 if (buildFringeIncoming)
213 centralArcLength -= thinElementArcLength;
214 centralAngle -= oneFringeAngle;
216 if (buildFringeOutgoing)
218 centralArcLength -= thinElementArcLength;
219 centralAngle -= oneFringeAngle;
223 G4double semiAngle = centralAngle / (G4double) nSBends;
224 G4double semiArcLength = centralArcLength / (G4double) nSBends;
227 (*semiStrength)[
"angle"] = semiAngle;
228 (*semiStrength)[
"length"] = semiArcLength;
230 G4double zExtentIn = 0;
231 G4double zExtentOut = 0;
232 G4bool fadeIn =
true;
233 G4bool fadeOut =
true;
241 if (incomingFaceAngle > 0)
242 {zExtentIn = 0.5*horizontalWidth*std::tan(incomingFaceAngle - 0.5*std::abs(semiAngle));}
243 else if (incomingFaceAngle < 0)
244 {zExtentIn = 0.5*horizontalWidth*std::tan(0.5*std::abs(semiAngle) + incomingFaceAngle);}
245 if (outgoingFaceAngle > 0)
246 {zExtentOut = 0.5*horizontalWidth*std::tan(outgoingFaceAngle - 0.5*std::abs(semiAngle));}
247 else if (outgoingFaceAngle < 0)
248 {zExtentOut = 0.5*horizontalWidth*std::tan(0.5*std::abs(semiAngle) + outgoingFaceAngle);}
251 if (std::abs(zExtentIn) < semiArcLength/4.0)
253 if (std::abs(zExtentOut) < semiArcLength/4.0)
257 G4String centralName = baseName +
"_even_ang";
263 0.5*semiAngle, 0.5*semiAngle, bpInfo,
273 semiVacuumField->SetModulatorInfo(fieldModulator);
275 BDSFieldType::dipole,
284 mgInfo->name = centralName;
300 G4double minimalRadius = 2*magnetOuterInfoCheck->MinimumIntersectionRadiusRequired();
302 if (!magnetOuterInfoCheck->hStyle)
304 switch (magnetOuterInfoCheck->geometryType.underlying())
306 case BDSMagnetGeometryType::polescircular:
307 case BDSMagnetGeometryType::polesfacet:
308 case BDSMagnetGeometryType::polesfacetcrop:
309 case BDSMagnetGeometryType::polessquare:
311 minimalRadius *= element->yokeOnInside ? 2.0 : 0.5;
319 delete magnetOuterInfoCheck;
322 if (buildFringeIncoming)
324 G4double e1 = element->
e1;
333 BDSMagnetStrength* fringeStIn = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
334 e1, element->
e2, fintx,
true);
335 G4String segmentName = baseName +
"_e1_fringe";
336 G4double fringeAngleIn = 0.5*oneFringeAngle - incomingFaceAngle;
337 G4double fringeAngleOut = 0.5*oneFringeAngle + incomingFaceAngle;
339 segmentName, fringeStIn, brho,
340 integratorSet, dipoleFieldType, fieldModulator);
350 G4double segmentAngleIn = 0;
351 G4double segmentAngleOut = 0;
352 G4int numberOfUniqueComponents = 1;
354 G4bool centralWedgeUsed =
false;
355 const G4int numSegmentsEitherSide = (nSBends - 1) / 2;
356 for (G4int i = 0; i < nSBends; ++i)
358 G4String name = baseName;
359 if (i < numSegmentsEitherSide)
362 {oneBend = centralWedge;}
365 name +=
"_"+std::to_string(numberOfUniqueComponents);
366 numberOfUniqueComponents++;
367 BDS::UpdateSegmentAngles(i,nSBends,semiAngle,incomingFaceAngle,outgoingFaceAngle,segmentAngleIn,segmentAngleOut);
369 segmentAngleIn, segmentAngleOut, semiStrength,
370 brho, integratorSet, yokeOnLeft, semiOuterField);
376 name +=
"_"+std::to_string(numberOfUniqueComponents);
377 numberOfUniqueComponents++;
378 segmentAngleIn = 0.5*semiAngle - incomingFaceAngle;
379 segmentAngleOut = 0.5*semiAngle;
381 segmentAngleIn, segmentAngleOut, semiStrength,
382 brho, integratorSet, yokeOnLeft, semiOuterField);
385 {oneBend = centralWedge;}
388 else if (i > numSegmentsEitherSide)
391 {oneBend = centralWedge;}
394 name +=
"_"+std::to_string(numberOfUniqueComponents);
395 numberOfUniqueComponents++;
396 BDS::UpdateSegmentAngles(i,nSBends,semiAngle,incomingFaceAngle,outgoingFaceAngle,segmentAngleIn,segmentAngleOut);
398 segmentAngleIn, segmentAngleOut, semiStrength,
399 brho, integratorSet, yokeOnLeft, semiOuterField);
403 if (i == (nSBends-1))
405 name +=
"_"+std::to_string(numberOfUniqueComponents);
406 numberOfUniqueComponents++;
407 segmentAngleIn = 0.5*semiAngle;
408 segmentAngleOut = 0.5*semiAngle - outgoingFaceAngle;
410 segmentAngleIn, segmentAngleOut, semiStrength,
411 brho, integratorSet, yokeOnLeft, semiOuterField);
414 {oneBend = centralWedge;}
418 {oneBend = centralWedge;}
423 centralWedgeUsed = centralWedgeUsed || (oneBend == centralWedge);
426 if (!centralWedgeUsed)
427 {
delete centralWedge;}
430 if (buildFringeOutgoing)
432 G4double e2 = element->
e2;
440 BDSMagnetStrength* fringeStOut = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
441 element->
e1, e2, fintx,
false);
442 G4double fringeAngleIn = 0.5*oneFringeAngle + outgoingFaceAngle;
443 G4double fringeAngleOut = 0.5*oneFringeAngle - outgoingFaceAngle;
444 G4String segmentName = baseName +
"_e2_fringe";
447 segmentName, fringeStOut, brho,
448 integratorSet, dipoleFieldType);
555 G4double incomingFaceAngle,
556 G4double outgoingFaceAngle,
557 G4bool buildFringeFields,
560 const G4String name = elementName;
565 G4bool buildFringeIncoming = buildFringeFields;
566 G4bool buildFringeOutgoing = buildFringeFields;
567 G4double fint = element->
fint;
568 G4double fintx = element->
fintx;
569 G4double hgap = element->
hgap * CLHEP::m;
572 const G4double angle = (*st)[
"angle"];
573 const G4double arcLength = (*st)[
"length"];
580 BDSFieldType dipoleFieldType = finiteK1 ? BDSFieldType::dipolequadrupole : BDSFieldType::dipole;
584 G4double incomingFaceAngleWRTSBend = incomingFaceAngle + angle*0.5;
585 G4double outgoingFaceangleWRTSBend = outgoingFaceAngle + angle*0.5;
587 {buildFringeIncoming =
false;}
589 {buildFringeOutgoing =
false;}
600 {buildFringeIncoming =
true;}
602 {buildFringeOutgoing =
true;}
605 G4double trackingPolefaceAngleIn = element->
e1;
606 G4double trackingPolefaceAngleOut = element->
e2;
609 trackingPolefaceAngleIn += angle*0.5;
610 trackingPolefaceAngleOut += angle*0.5;
613 G4double e1 = -incomingFaceAngle;
614 G4double e2 = -outgoingFaceAngle;
620 throw BDSException(__METHOD_NAME__, prevElement->name +
" has finite e2!\n Clashes with " + elementName +
" with finite e1");
622 if (prevElement->
type == ElementType::_RBEND)
624 buildFringeIncoming =
false;
632 throw BDSException(__METHOD_NAME__ + nextElement->name +
" has finite e1!\n Clashes with " + elementName +
" with finite e2");
634 if (nextElement->
type == ElementType::_RBEND)
636 buildFringeOutgoing =
false;
643 buildFringeIncoming =
false;
644 buildFringeOutgoing =
false;
658 G4double angleIn = incomingFaceAngle;
659 G4double angleOut = outgoingFaceAngle;
660 G4double fringeInOutputAngle = 0;
661 G4double centralInputFaceAngle = angleIn;
662 G4double centralOutputFaceAngle = angleOut;
663 G4double fringeOutInputAngle = 0;
664 G4double centralArcLength = arcLength;
665 G4double centralAngle = angle;
666 G4double oneFringeAngle = 0;
668 {oneFringeAngle = (thinElementArcLength / arcLength) * angle;}
670 if (buildFringeIncoming && buildFringeOutgoing)
672 centralArcLength -= 2*thinElementArcLength;
673 centralAngle -= 2*oneFringeAngle;
674 angleIn = e1 + (0.5*oneFringeAngle - 0.5*angle);
675 fringeInOutputAngle = -angleIn;
676 centralInputFaceAngle = e1;
677 centralOutputFaceAngle = e2;
678 fringeOutInputAngle = - (e2 + (0.5*oneFringeAngle - 0.5*angle));
679 angleOut = -fringeOutInputAngle;
681 else if (buildFringeIncoming)
683 centralArcLength -= thinElementArcLength;
684 centralAngle -= oneFringeAngle;
685 angleIn = e1 + (0.5*oneFringeAngle - 0.5*angle);
686 fringeInOutputAngle = -angleIn;
687 centralInputFaceAngle = e1 + 0.5*oneFringeAngle;
688 centralOutputFaceAngle = e2 - 0.5*oneFringeAngle;
690 else if (buildFringeOutgoing)
692 centralArcLength -= thinElementArcLength;
693 centralAngle -= oneFringeAngle;
694 centralInputFaceAngle = e1 - 0.5*oneFringeAngle;
695 centralOutputFaceAngle = e2 + 0.5*oneFringeAngle;
696 fringeOutInputAngle = - (e2 + (0.5*oneFringeAngle - 0.5*angle));;
697 angleOut = e2 + (0.5*oneFringeAngle - 0.5*angle);;
703 centralInputFaceAngle = e1;
704 centralOutputFaceAngle = e2;
707 if (buildFringeIncoming)
709 G4double trackingPolefaceAngle = trackingPolefaceAngleIn;
715 {trackingPolefaceAngle -= element->
e1;}
717 BDSMagnetStrength* fringeStIn = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
718 trackingPolefaceAngle, trackingPolefaceAngleOut,
720 G4String fringeName = name +
"_e1_fringe";
726 integratorSet, dipoleFieldType, fieldModulator);
731 (*st)[
"length"] = centralArcLength;
732 (*st)[
"angle"] = centralAngle;
739 mgInfo->name = elementName;
748 vacuumField->SetModulatorInfo(fieldModulator);
750 BDSFieldType::dipole,
764 elementName+
"_centre",
775 if (buildFringeOutgoing)
777 G4double trackingPolefaceAngle = trackingPolefaceAngleOut;
783 {trackingPolefaceAngle -= element->
e2;}
784 BDSMagnetStrength* fringeStOut = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
785 trackingPolefaceAngleIn, trackingPolefaceAngle,
787 G4String fringeName = name +
"_e2_fringe";
792 integratorSet, dipoleFieldType);