OPAL (Object Oriented Parallel Accelerator Library)  2021.1.99
OPAL
Bend2D.h
Go to the documentation of this file.
1 #ifndef CLASSIC_BEND_H
2 #define CLASSIC_BEND_H
3 
4 // ------------------------------------------------------------------------
5 // $RCSfile: SBend.h,v $
6 // ------------------------------------------------------------------------
7 // $Revision: 1.1.1.1.2.1 $
8 // ------------------------------------------------------------------------
9 // Copyright: see Copyright.readme
10 // ------------------------------------------------------------------------
11 //
12 // Definitions for class: Bend2D
13 // Defines the abstract interface for a general bend magnet.
14 //
15 // ------------------------------------------------------------------------
16 // Class category: AbsBeamline
17 // ------------------------------------------------------------------------
18 //
19 // $Date: 2004/11/12 18:57:53 $
20 // $Author: adelmann $
21 //
22 // ------------------------------------------------------------------------
23 
24 #include "AbsBeamline/BendBase.h"
25 #include "Steppers/BorisPusher.h"
27 
28 #include "gsl/gsl_spline.h"
29 #include "gsl/gsl_interp.h"
30 
31 #ifdef WITH_UNIT_TESTS
32 #include <gtest/gtest_prod.h>
33 #endif
34 
35 #include <array>
36 #include <cmath>
37 #include <string>
38 #include <vector>
39 
40 class MeshData;
41 
42 /*
43  * Class Bend2D
44  *
45  * Interface for general bend magnet.
46  *
47  * ------------------------------------------------------------------------
48  *
49  */
50 
51 class Bend2D: public BendBase {
52 
53 public:
54 
56  explicit Bend2D(const std::string &name);
57 
58  Bend2D();
59  Bend2D(const Bend2D &);
60  virtual ~Bend2D();
61 
63  virtual void accept(BeamlineVisitor &) const override = 0;
64 
65  /*
66  * Methods for OPAL-T.
67  * ===================
68  */
69 
71  virtual bool apply(const size_t &i,
72  const double &t,
73  Vector_t &E,
74  Vector_t &B) override;
75 
77  virtual bool apply(const Vector_t &R,
78  const Vector_t &P,
79  const double &t,
80  Vector_t &E,
81  Vector_t &B) override;
82 
83  virtual bool applyToReferenceParticle(const Vector_t &R,
84  const Vector_t &P,
85  const double &t,
86  Vector_t &E,
87  Vector_t &B) override;
88 
89  virtual void goOnline(const double &kineticEnergy) override;
90 
91  virtual void finalise() override;
92  virtual void getDimensions(double &sBegin, double &sEnd) const override;
93  virtual ElementBase::ElementType getType() const override = 0;
94  virtual void initialise(PartBunchBase<double, 3> *bunch,
95  double &startField,
96  double &endField) override;
97 
98  double getBendRadius() const;
99  double getEffectiveCenter() const;
100  double getEffectiveLength() const;
101 
103  void setK1(double k1);
104 
105  virtual void setEntranceAngle(double entranceAngle) override;
106  void setExitAngle(double exitAngle);
107  virtual double getExitAngle() const override;
108 
109  std::vector<Vector_t> getOutline() const;
110  MeshData getSurfaceMesh() const;
111 
112  virtual CoordinateSystemTrafo getEdgeToEnd() const override;
114 
115  virtual bool isInside(const Vector_t &r) const override;
116 
117 
118  //set number of slices for map tracking
119  void setNSlices(const std::size_t& nSlices);
120 
121  //set number of slices for map tracking
122  std::size_t getNSlices() const;
123 
125  // Used to create fringe fields in ThickTracker, (before edge[m], after edge[m])
126  std::array<double,2> getEntranceFringeFieldLength() const;
127 
129  // Used to create fringe fields in ThickTracker, (before edge[m], after edge[m])
130  std::array<double,2> getExitFringeFieldLength() const;
131 
132  BoundingBox getBoundingBoxInLabCoords() const override;
133 protected:
134  void setMessageHeader(const std::string & header);
135  double getStartField() const;
136 
137 private:
138 
139 #ifdef WITH_UNIT_TESTS
140  FRIEND_TEST(Maxwell, Zeros);
141 #endif
142  // Not implemented.
143  void operator=(const Bend2D &);
144 
145  void adjustFringeFields(double ratio);
146  double calculateBendAngle();
147  void calcEngeFunction(double zNormalized,
148  const std::vector<double> &engeCoeff,
149  int polyOrder,
150  double &engeFunc,
151  double &engeFuncDeriv,
152  double &engeFuncSecDerivNorm);
154  double deltaX);
156  double deltaX);
158  double deltaX);
159  void setupFringeWidths();
160  bool calculateMapField(const Vector_t &R,
161  Vector_t &B);
162  void calculateRefTrajectory(double &angleX,
163  double &angleY);
164  double estimateFieldAdjustmentStep(double actualBendAngle);
165  void findBendEffectiveLength(double startField,
166  double endField);
167  void findBendStrength();
168  virtual bool findChordLength(double &chordLength) = 0;
169  bool findIdealBendParameters(double chordLength);
170  bool initializeFieldMap();
171  bool inMagnetCentralRegion(const Vector_t &R) const;
172  bool inMagnetEntranceRegion(const Vector_t &R) const;
173  bool inMagnetExitRegion(const Vector_t &R) const;
174  bool isPositionInEntranceField(const Vector_t &R) const;
175  bool isPositionInExitField(const Vector_t &R) const;
176  void print(Inform &msg, double bendAngleX, double bendAngle);
177  void readFieldMap(Inform &msg);
178  void setBendEffectiveLength(double startField, double endField);
179  void setBendStrength();
180  void setEngeOriginDelta(double delta);
181  void setFieldCalcParam();
182  void setGapFromFieldMap();
183  bool setupBendGeometry(double &startField, double &endField);
184  bool setupDefaultFieldMap();
185  void setFieldBoundaries(double startField, double endField);
187  bool isFieldZero();
188 
193 
194  std::string messageHeader_m;
195 
198 
199  double designRadius_m;
200 
201  double exitAngle_m;
203  double fieldIndex_m;
204  double startField_m;
205  double endField_m;
206 
209 
210  /*
211  * Flag to reinitialize the bend the first time the magnet
212  * is called. This redefines the design energy of the bend
213  * to the current average beam energy, keeping the bend angle
214  * constant.
215  */
217 
218  /*
219  * Enge function field map members.
220  */
221 
222  /*
223  * Entrance and exit position parameters. Ultimately they are used to
224  * determine the origins of the entrance and exit edge Enge functions and
225  * the extent of the field map. However, how they are used to do this
226  * depends on how the bend using the map is setup in the OPAL input file.
227  * So, we use generic terms to start.
228  */
235 
237  std::vector<double> engeCoeffsEntry_m;
238  std::vector<double> engeCoeffsExit_m;
239 
240  gsl_spline** entryFieldValues_m;
241  gsl_spline** exitFieldValues_m;
242  gsl_interp_accel *entryFieldAccel_m;
243  gsl_interp_accel *exitFieldAccel_m;
244 
245  /*
246  * All coordinates are with respect to (x, z) = (0, 0). It is
247  * assumed the ideal reference trajectory passes through this point.
248  */
254 
257  double deltaEndExit_m;
260 
265 
267  CoordinateSystemTrafo beginToEnd_lcs_m; // local coordinate system
270 
272  double maxAngle_m;
273 
274  std::size_t nSlices_m;
275 };
276 
277 
278 inline
280  online_m = false;
281 }
282 
283 inline
284 void Bend2D::getDimensions(double &sBegin, double &sEnd) const {
285  sBegin = startField_m;
286  sEnd = endField_m;
287 }
288 
289 inline
290 double Bend2D::getBendRadius() const {
291  return designRadius_m;
292 }
293 
294 inline
296  return elementEdge_m + designRadius_m * angle_m / 2.0;
297 }
298 
299 inline
301  return designRadius_m * angle_m;
302 }
303 
304 inline
305 void Bend2D::setK1(double k1) {
306  if (std::abs(k1) > 0.0) {
307  throw GeneralClassicException("Bend2D::setK1",
308  "Quadrupole field temporarily not supported");
309  }
310  fieldIndex_m = k1;
311 }
312 
313 inline
314 void Bend2D::setMessageHeader(const std::string & header)
315 {
316  messageHeader_m = header;
317 }
318 
319 inline
320 double Bend2D::getStartField() const
321 {
322  return startField_m;
323 }
324 
325 inline
326 double Bend2D::getExitAngle() const
327 {
328  return exitAngle_m;
329 }
330 
331 inline
332 void Bend2D::setEntranceAngle(double angle)
333 {
338 }
339 
340 inline
341 void Bend2D::setExitAngle(double angle)
342 {
343  exitAngle_m = angle;
345 }
346 
347 inline
349 {
350  return beginToEnd_m;
351 }
352 
353 inline
355 {
356  return beginToEnd_lcs_m;
357 }
358 
359 inline
361  toEntranceRegion_m = trafo;
362 }
363 
364 inline
366  toExitRegion_m = trafo;
367 }
368 
369 inline
372 }
373 
374 inline
376  return toExitRegion_m.transformTo(R);
377 }
378 
379 #endif // CLASSIC_BEND_H
Tps< T > cos(const Tps< T > &x)
Cosine.
Definition: TpsMath.h:129
Tps< T > tan(const Tps< T > &x)
Tangent.
Definition: TpsMath.h:147
Tps< T > sin(const Tps< T > &x)
Sine.
Definition: TpsMath.h:111
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
const std::string name
Definition: Bend2D.h:51
void calculateRefTrajectory(double &angleX, double &angleY)
Definition: Bend2D.cpp:509
virtual void getDimensions(double &sBegin, double &sEnd) const override
Definition: Bend2D.h:284
double exitParameter3_m
Definition: Bend2D.h:234
double widthExitFringe_m
Definition: Bend2D.h:208
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Apply field to particles with coordinates in magnet frame.
Definition: Bend2D.cpp:147
void setupFringeWidths()
Definition: Bend2D.cpp:1629
Vector_t transformToExitRegion(const Vector_t &R) const
Definition: Bend2D.h:375
void readFieldMap(Inform &msg)
Definition: Bend2D.cpp:946
bool reinitialize_m
Definition: Bend2D.h:216
int polyOrderExit_m
function origin that Enge function ends.
Definition: Bend2D.h:259
double exitParameter1_m
Definition: Bend2D.h:232
Vector_t calcExitFringeField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:410
virtual bool findChordLength(double &chordLength)=0
gsl_interp_accel * entryFieldAccel_m
Definition: Bend2D.h:242
bool inMagnetCentralRegion(const Vector_t &R) const
Definition: Bend2D.cpp:797
std::vector< double > engeCoeffsEntry_m
Enge coefficients for map entry and exit regions.
Definition: Bend2D.h:237
std::array< double, 2 > getEntranceFringeFieldLength() const
Get entrance fringe field length.
Definition: Bend2D.cpp:1647
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition: Bend2D.cpp:190
double deltaEndEntry_m
function origin where Enge function starts.
Definition: Bend2D.h:251
double deltaBeginEntry_m
Definition: Bend2D.h:249
double getEffectiveLength() const
Definition: Bend2D.h:300
virtual double getExitAngle() const override
Definition: Bend2D.h:326
void setExitAngle(double exitAngle)
Definition: Bend2D.h:341
double maxAngle_m
Definition: Bend2D.h:272
bool inMagnetExitRegion(const Vector_t &R) const
Definition: Bend2D.cpp:822
CoordinateSystemTrafo beginToEnd_m
Definition: Bend2D.h:266
void setK1(double k1)
Set quadrupole field component.
Definition: Bend2D.h:305
CoordinateSystemTrafo getBeginToEnd_local() const
Definition: Bend2D.h:354
double deltaBeginExit_m
Enge function order for entry region.
Definition: Bend2D.h:255
void setCSTrafoToEntranceRegion(const CoordinateSystemTrafo &trafo)
Definition: Bend2D.h:360
Vector_t calcCentralField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:355
void setEngeOriginDelta(double delta)
Definition: Bend2D.cpp:1047
double entranceParameter3_m
Definition: Bend2D.h:231
bool calculateMapField(const Vector_t &R, Vector_t &B)
Definition: Bend2D.cpp:446
double getStartField() const
Definition: Bend2D.h:320
void setBendStrength()
Definition: Bend2D.cpp:1038
void findBendStrength()
Definition: Bend2D.cpp:682
double widthEntranceFringe_m
End of magnet field map in s coordinates (m).
Definition: Bend2D.h:207
gsl_spline ** exitFieldValues_m
Definition: Bend2D.h:241
std::vector< double > engeCoeffsExit_m
Definition: Bend2D.h:238
double entranceParameter1_m
Definition: Bend2D.h:229
double designRadius_m
through the bend.
Definition: Bend2D.h:199
void setFieldCalcParam()
Definition: Bend2D.cpp:1069
double getEffectiveCenter() const
Definition: Bend2D.h:295
double sinEntranceAngle_m
Definition: Bend2D.h:262
BorisPusher pusher_m
Definition: Bend2D.h:196
void setBendEffectiveLength(double startField, double endField)
Definition: Bend2D.cpp:1026
void setNSlices(const std::size_t &nSlices)
Definition: Bend2D.cpp:1636
Vector_t calcEntranceFringeField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:373
bool setupBendGeometry(double &startField, double &endField)
Definition: Bend2D.cpp:1166
bool findIdealBendParameters(double chordLength)
Definition: Bend2D.cpp:750
BoundingBox getBoundingBoxInLabCoords() const override
Definition: Bend2D.cpp:1685
Bend2D()
Definition: Bend2D.cpp:40
std::string messageHeader_m
Definition: Bend2D.h:194
double tanEntranceAngle_m
Definition: Bend2D.h:263
virtual void setEntranceAngle(double entranceAngle) override
Definition: Bend2D.h:332
double startField_m
Dipole field index.
Definition: Bend2D.h:204
virtual void goOnline(const double &kineticEnergy) override
Definition: Bend2D.cpp:186
std::size_t nSlices_m
Definition: Bend2D.h:274
double exitParameter2_m
Definition: Bend2D.h:233
double endField_m
Start of magnet field map in s coordinates (m).
Definition: Bend2D.h:205
CoordinateSystemTrafo toEntranceRegion_m
Definition: Bend2D.h:268
bool isPositionInExitField(const Vector_t &R) const
Definition: Bend2D.cpp:838
void setFieldBoundaries(double startField, double endField)
Definition: Bend2D.cpp:1234
gsl_interp_accel * exitFieldAccel_m
Definition: Bend2D.h:243
double deltaEndExit_m
function origin that Enge function starts.
Definition: Bend2D.h:257
Vector_t transformToEntranceRegion(const Vector_t &R) const
Definition: Bend2D.h:370
bool inMagnetEntranceRegion(const Vector_t &R) const
Definition: Bend2D.cpp:815
void adjustFringeFields(double ratio)
Definition: Bend2D.cpp:233
double exitAngle_m
Bend design radius (m).
Definition: Bend2D.h:201
double fieldIndex_m
and the exit face of the magnet (radians).
Definition: Bend2D.h:203
virtual ~Bend2D()
Definition: Bend2D.cpp:123
MeshData getSurfaceMesh() const
Definition: Bend2D.cpp:1387
bool isFieldZero()
Definition: Bend2D.cpp:1248
void setMessageHeader(const std::string &header)
Definition: Bend2D.h:314
std::array< double, 2 > getExitFringeFieldLength() const
Get exit fringe field length.
Definition: Bend2D.cpp:1667
CoordinateSystemTrafo beginToEnd_lcs_m
Definition: Bend2D.h:267
void operator=(const Bend2D &)
double entranceParameter2_m
Definition: Bend2D.h:230
virtual void finalise() override
Definition: Bend2D.h:279
virtual void accept(BeamlineVisitor &) const override=0
Apply visitor to Bend2D.
int polyOrderEntry_m
function origin that Enge function ends.
Definition: Bend2D.h:253
double estimateFieldAdjustmentStep(double actualBendAngle)
Definition: Bend2D.cpp:576
virtual bool isInside(const Vector_t &r) const override
Definition: Bend2D.cpp:1615
virtual CoordinateSystemTrafo getEdgeToEnd() const override
Definition: Bend2D.h:348
bool setupDefaultFieldMap()
Definition: Bend2D.cpp:1218
std::vector< Vector_t > getOutline() const
Definition: Bend2D.cpp:1280
CoordinateSystemTrafo toExitRegion_m
Definition: Bend2D.h:269
gsl_spline ** entryFieldValues_m
Definition: Bend2D.h:240
bool initializeFieldMap()
Definition: Bend2D.cpp:782
CoordinateSystemTrafo computeAngleTrafo_m
Definition: Bend2D.h:271
void calcEngeFunction(double zNormalized, const std::vector< double > &engeCoeff, int polyOrder, double &engeFunc, double &engeFuncDeriv, double &engeFuncSecDerivNorm)
Definition: Bend2D.cpp:290
std::size_t getNSlices() const
Definition: Bend2D.cpp:1641
double getBendRadius() const
Definition: Bend2D.h:290
virtual ElementBase::ElementType getType() const override=0
Get element type std::string.
void setupPusher(PartBunchBase< double, 3 > *bunch)
Definition: Bend2D.cpp:1241
double tanExitAngle_m
Definition: Bend2D.h:264
void print(Inform &msg, double bendAngleX, double bendAngle)
Definition: Bend2D.cpp:846
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Definition: Bend2D.cpp:178
void findBendEffectiveLength(double startField, double endField)
Definition: Bend2D.cpp:592
void setGapFromFieldMap()
Definition: Bend2D.cpp:1157
bool isPositionInEntranceField(const Vector_t &R) const
Definition: Bend2D.cpp:831
void setCSTrafoToExitRegion(const CoordinateSystemTrafo &trafo)
Definition: Bend2D.h:365
double cosEntranceAngle_m
Enge function order for entry region.
Definition: Bend2D.h:261
double calculateBendAngle()
Definition: Bend2D.cpp:251
virtual void setEntranceAngle(double entranceAngle)
Definition: BendBase.h:97
double entranceAngle_m
Definition: BendBase.h:54
double angle_m
Bend angle.
Definition: BendBase.h:53
bool online_m
Definition: Component.h:195
double elementEdge_m
Definition: ElementBase.h:392
Vector_t transformTo(const Vector_t &r) const
Definition: Inform.h:42