57 G4double incomingFaceAngle,
58 G4double outgoingFaceAngle,
59 G4bool buildFringeFields,
64 const G4String baseName = elementName;
67 const G4double arcLength = element->
l * CLHEP::m;
68 const G4double angle = (*st)[
"angle"];
69 G4double fint = element->
fint;
70 G4double fintx = element->
fintx;
71 G4double hgap = element->
hgap * CLHEP::m;
77 G4bool buildFringeIncoming = buildFringeFields;
78 G4bool buildFringeOutgoing = buildFringeFields;
81 BDSFieldType dipoleFieldType = finiteK1 ? BDSFieldType::dipolequadrupole : BDSFieldType::dipole;
83 if (buildFringeFields)
88 {buildFringeIncoming =
false;}
90 {buildFringeOutgoing =
false;}
101 {buildFringeIncoming =
true;}
103 {buildFringeOutgoing =
true;}
112 {buildFringeIncoming =
false;}
114 {buildFringeOutgoing =
false;}
121 if (prevElement->
type == ElementType::_SBEND)
123 buildFringeIncoming =
false;
125 {
throw BDSException( __METHOD_NAME__, prevElement->name +
" e2 clashes with " + elementName +
" e1");}
130 if (nextElement->
type == ElementType::_SBEND)
131 {buildFringeOutgoing =
false;}
137 buildFringeIncoming =
false;
138 buildFringeOutgoing =
false;
149 buildFringeIncoming =
false;
150 buildFringeOutgoing =
false;
178 vacuumField->SetModulatorInfo(fieldModulator);
180 BDSFieldType::dipole,
204 G4double centralArcLength = arcLength;
205 G4double centralAngle = angle;
206 G4double oneFringeAngle = 0;
208 {oneFringeAngle = (thinElementArcLength / arcLength) * angle;}
210 if (buildFringeIncoming)
212 centralArcLength -= thinElementArcLength;
213 centralAngle -= oneFringeAngle;
215 if (buildFringeOutgoing)
217 centralArcLength -= thinElementArcLength;
218 centralAngle -= oneFringeAngle;
222 G4double semiAngle = centralAngle / (G4double) nSBends;
223 G4double semiArcLength = centralArcLength / (G4double) nSBends;
226 (*semiStrength)[
"angle"] = semiAngle;
227 (*semiStrength)[
"length"] = semiArcLength;
229 G4double zExtentIn = 0;
230 G4double zExtentOut = 0;
231 G4bool fadeIn =
true;
232 G4bool fadeOut =
true;
240 if (incomingFaceAngle > 0)
241 {zExtentIn = 0.5*horizontalWidth*std::tan(incomingFaceAngle - 0.5*std::abs(semiAngle));}
242 else if (incomingFaceAngle < 0)
243 {zExtentIn = 0.5*horizontalWidth*std::tan(0.5*std::abs(semiAngle) + incomingFaceAngle);}
244 if (outgoingFaceAngle > 0)
245 {zExtentOut = 0.5*horizontalWidth*std::tan(outgoingFaceAngle - 0.5*std::abs(semiAngle));}
246 else if (outgoingFaceAngle < 0)
247 {zExtentOut = 0.5*horizontalWidth*std::tan(0.5*std::abs(semiAngle) + outgoingFaceAngle);}
250 if (std::abs(zExtentIn) < semiArcLength/4.0)
252 if (std::abs(zExtentOut) < semiArcLength/4.0)
256 G4String centralName = baseName +
"_even_ang";
262 0.5*semiAngle, 0.5*semiAngle, bpInfo,
272 semiVacuumField->SetModulatorInfo(fieldModulator);
274 BDSFieldType::dipole,
283 mgInfo->name = centralName;
299 G4double minimalRadius = 2*magnetOuterInfoCheck->MinimumIntersectionRadiusRequired();
301 if (!magnetOuterInfoCheck->hStyle)
303 switch (magnetOuterInfoCheck->geometryType.underlying())
305 case BDSMagnetGeometryType::polescircular:
306 case BDSMagnetGeometryType::polesfacet:
307 case BDSMagnetGeometryType::polesfacetcrop:
308 case BDSMagnetGeometryType::polessquare:
310 minimalRadius *= element->yokeOnInside ? 2.0 : 0.5;
318 delete magnetOuterInfoCheck;
321 if (buildFringeIncoming)
323 G4double e1 = element->
e1;
332 BDSMagnetStrength* fringeStIn = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
333 e1, element->
e2, fintx,
true);
334 G4String segmentName = baseName +
"_e1_fringe";
335 G4double fringeAngleIn = 0.5*oneFringeAngle - incomingFaceAngle;
336 G4double fringeAngleOut = 0.5*oneFringeAngle + incomingFaceAngle;
338 segmentName, fringeStIn, brho,
339 integratorSet, dipoleFieldType, fieldModulator);
349 G4double segmentAngleIn = 0;
350 G4double segmentAngleOut = 0;
351 G4int numberOfUniqueComponents = 1;
353 G4bool centralWedgeUsed =
false;
354 const G4int numSegmentsEitherSide = (nSBends - 1) / 2;
355 for (G4int i = 0; i < nSBends; ++i)
357 G4String name = baseName;
358 if (i < numSegmentsEitherSide)
361 {oneBend = centralWedge;}
364 name +=
"_"+std::to_string(numberOfUniqueComponents);
365 numberOfUniqueComponents++;
366 BDS::UpdateSegmentAngles(i,nSBends,semiAngle,incomingFaceAngle,outgoingFaceAngle,segmentAngleIn,segmentAngleOut);
368 segmentAngleIn, segmentAngleOut, semiStrength,
369 brho, integratorSet, yokeOnLeft, semiOuterField);
375 name +=
"_"+std::to_string(numberOfUniqueComponents);
376 numberOfUniqueComponents++;
377 segmentAngleIn = 0.5*semiAngle - incomingFaceAngle;
378 segmentAngleOut = 0.5*semiAngle;
380 segmentAngleIn, segmentAngleOut, semiStrength,
381 brho, integratorSet, yokeOnLeft, semiOuterField);
384 {oneBend = centralWedge;}
387 else if (i > numSegmentsEitherSide)
390 {oneBend = centralWedge;}
393 name +=
"_"+std::to_string(numberOfUniqueComponents);
394 numberOfUniqueComponents++;
395 BDS::UpdateSegmentAngles(i,nSBends,semiAngle,incomingFaceAngle,outgoingFaceAngle,segmentAngleIn,segmentAngleOut);
397 segmentAngleIn, segmentAngleOut, semiStrength,
398 brho, integratorSet, yokeOnLeft, semiOuterField);
402 if (i == (nSBends-1))
404 name +=
"_"+std::to_string(numberOfUniqueComponents);
405 numberOfUniqueComponents++;
406 segmentAngleIn = 0.5*semiAngle;
407 segmentAngleOut = 0.5*semiAngle - outgoingFaceAngle;
409 segmentAngleIn, segmentAngleOut, semiStrength,
410 brho, integratorSet, yokeOnLeft, semiOuterField);
413 {oneBend = centralWedge;}
417 {oneBend = centralWedge;}
422 centralWedgeUsed = centralWedgeUsed || (oneBend == centralWedge);
425 if (!centralWedgeUsed)
426 {
delete centralWedge;}
429 if (buildFringeOutgoing)
431 G4double e2 = element->
e2;
439 BDSMagnetStrength* fringeStOut = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
440 element->
e1, e2, fintx,
false);
441 G4double fringeAngleIn = 0.5*oneFringeAngle + outgoingFaceAngle;
442 G4double fringeAngleOut = 0.5*oneFringeAngle - outgoingFaceAngle;
443 G4String segmentName = baseName +
"_e2_fringe";
446 segmentName, fringeStOut, brho,
447 integratorSet, dipoleFieldType);
554 G4double incomingFaceAngle,
555 G4double outgoingFaceAngle,
556 G4bool buildFringeFields,
559 const G4String name = elementName;
564 G4bool buildFringeIncoming = buildFringeFields;
565 G4bool buildFringeOutgoing = buildFringeFields;
566 G4double fint = element->
fint;
567 G4double fintx = element->
fintx;
568 G4double hgap = element->
hgap * CLHEP::m;
571 const G4double angle = (*st)[
"angle"];
572 const G4double arcLength = (*st)[
"length"];
579 BDSFieldType dipoleFieldType = finiteK1 ? BDSFieldType::dipolequadrupole : BDSFieldType::dipole;
583 G4double incomingFaceAngleWRTSBend = incomingFaceAngle + angle*0.5;
584 G4double outgoingFaceangleWRTSBend = outgoingFaceAngle + angle*0.5;
586 {buildFringeIncoming =
false;}
588 {buildFringeOutgoing =
false;}
599 {buildFringeIncoming =
true;}
601 {buildFringeOutgoing =
true;}
604 G4double trackingPolefaceAngleIn = element->
e1;
605 G4double trackingPolefaceAngleOut = element->
e2;
608 trackingPolefaceAngleIn += angle*0.5;
609 trackingPolefaceAngleOut += angle*0.5;
612 G4double e1 = -incomingFaceAngle;
613 G4double e2 = -outgoingFaceAngle;
619 throw BDSException(__METHOD_NAME__, prevElement->name +
" has finite e2!\n Clashes with " + elementName +
" with finite e1");
621 if (prevElement->
type == ElementType::_RBEND)
623 buildFringeIncoming =
false;
631 throw BDSException(__METHOD_NAME__ + nextElement->name +
" has finite e1!\n Clashes with " + elementName +
" with finite e2");
633 if (nextElement->
type == ElementType::_RBEND)
635 buildFringeOutgoing =
false;
642 buildFringeIncoming =
false;
643 buildFringeOutgoing =
false;
657 G4double angleIn = incomingFaceAngle;
658 G4double angleOut = outgoingFaceAngle;
659 G4double fringeInOutputAngle = 0;
660 G4double centralInputFaceAngle = angleIn;
661 G4double centralOutputFaceAngle = angleOut;
662 G4double fringeOutInputAngle = 0;
663 G4double centralArcLength = arcLength;
664 G4double centralAngle = angle;
665 G4double oneFringeAngle = 0;
667 {oneFringeAngle = (thinElementArcLength / arcLength) * angle;}
669 if (buildFringeIncoming && buildFringeOutgoing)
671 centralArcLength -= 2*thinElementArcLength;
672 centralAngle -= 2*oneFringeAngle;
673 angleIn = e1 + (0.5*oneFringeAngle - 0.5*angle);
674 fringeInOutputAngle = -angleIn;
675 centralInputFaceAngle = e1;
676 centralOutputFaceAngle = e2;
677 fringeOutInputAngle = - (e2 + (0.5*oneFringeAngle - 0.5*angle));
678 angleOut = -fringeOutInputAngle;
680 else if (buildFringeIncoming)
682 centralArcLength -= thinElementArcLength;
683 centralAngle -= oneFringeAngle;
684 angleIn = e1 + (0.5*oneFringeAngle - 0.5*angle);
685 fringeInOutputAngle = -angleIn;
686 centralInputFaceAngle = e1 + 0.5*oneFringeAngle;
687 centralOutputFaceAngle = e2 - 0.5*oneFringeAngle;
689 else if (buildFringeOutgoing)
691 centralArcLength -= thinElementArcLength;
692 centralAngle -= oneFringeAngle;
693 centralInputFaceAngle = e1 - 0.5*oneFringeAngle;
694 centralOutputFaceAngle = e2 + 0.5*oneFringeAngle;
695 fringeOutInputAngle = - (e2 + (0.5*oneFringeAngle - 0.5*angle));;
696 angleOut = e2 + (0.5*oneFringeAngle - 0.5*angle);;
702 centralInputFaceAngle = e1;
703 centralOutputFaceAngle = e2;
706 if (buildFringeIncoming)
708 G4double trackingPolefaceAngle = trackingPolefaceAngleIn;
714 {trackingPolefaceAngle -= element->
e1;}
716 BDSMagnetStrength* fringeStIn = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
717 trackingPolefaceAngle, trackingPolefaceAngleOut,
719 G4String fringeName = name +
"_e1_fringe";
725 integratorSet, dipoleFieldType, fieldModulator);
730 (*st)[
"length"] = centralArcLength;
731 (*st)[
"angle"] = centralAngle;
738 mgInfo->name = elementName;
747 vacuumField->SetModulatorInfo(fieldModulator);
749 BDSFieldType::dipole,
763 elementName+
"_centre",
774 if (buildFringeOutgoing)
776 G4double trackingPolefaceAngle = trackingPolefaceAngleOut;
782 {trackingPolefaceAngle -= element->
e2;}
783 BDSMagnetStrength* fringeStOut = BDS::GetFringeMagnetStrength(element, st, oneFringeAngle,
784 trackingPolefaceAngleIn, trackingPolefaceAngle,
786 G4String fringeName = name +
"_e2_fringe";
791 integratorSet, dipoleFieldType);