OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
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 <string>
37 #include <vector>
38 
39 class Fieldmap;
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 = 0;
64 
65  /*
66  * Methods for OPAL-SLICE.
67  */
68  virtual void addKR(int i, double t, Vector_t &K) { };
69  virtual void addKT(int i, double t, Vector_t &K) { };
70 
71 
72  /*
73  * Methods for OPAL-T.
74  * ===================
75  */
76 
78  virtual bool apply(const size_t &i,
79  const double &t,
80  Vector_t &E,
81  Vector_t &B);
82 
84  virtual bool apply(const Vector_t &R,
85  const Vector_t &P,
86  const double &t,
87  Vector_t &E,
88  Vector_t &B);
89 
90  virtual bool applyToReferenceParticle(const Vector_t &R,
91  const Vector_t &P,
92  const double &t,
93  Vector_t &E,
94  Vector_t &B);
95 
96  virtual void goOnline(const double &kineticEnergy);
97 
98  virtual void finalise();
99  virtual void getDimensions(double &sBegin, double &sEnd) const;
100  virtual ElementBase::ElementType getType() const = 0;
101  virtual void initialise(PartBunchBase<double, 3> *bunch,
102  double &startField,
103  double &endField);
104 
105  double getBendRadius() const;
106  double getEffectiveCenter() const;
107  double getEffectiveLength() const;
108 
109  double getStartElement() const;
110 
112  void setK1(double k1);
113 
114  void setExitAngle(double exitAngle);
115  virtual double getExitAngle() const;
116 
117  double getMapLength() const;
118 
119  std::vector<Vector_t> getOutline() const;
120  MeshData getSurfaceMesh() const;
121 
122  virtual CoordinateSystemTrafo getEdgeToEnd() const;
124 
125  virtual bool isInside(const Vector_t &r) const;
126 
127 
128  //set number of slices for map tracking
129  void setNSlices(const std::size_t& nSlices);
130 
131  //set number of slices for map tracking
132  std::size_t getNSlices() const;
133 
135  // Used to create fringe fields in ThickTracker, (before edge[m], after edge[m])
136  std::array<double,2> getEntranceFringeFieldLength() const;
137 
139  // Used to create fringe fields in ThickTracker, (before edge[m], after edge[m])
140  std::array<double,2> getExitFringeFieldLength() const;
141 
142 protected:
143  void setMessageHeader(const std::string & header);
144  double getStartField() const;
146 
147 private:
148 
149 #ifdef WITH_UNIT_TESTS
150  FRIEND_TEST(Maxwell, Zeros);
151 #endif
152  // Not implemented.
153  void operator=(const Bend2D &);
154 
155  void adjustFringeFields(double ratio);
156  double calculateBendAngle();
157  void calcEngeFunction(double zNormalized,
158  const std::vector<double> &engeCoeff,
159  int polyOrder,
160  double &engeFunc,
161  double &engeFuncDeriv,
162  double &engeFuncSecDerivNorm);
164  double deltaX);
166  double deltaX);
168  double deltaX);
169  void setupFringeWidths();
170  bool calculateMapField(const Vector_t &R,
171  Vector_t &B);
172  void calculateRefTrajectory(double &angleX,
173  double &angleY);
174  double estimateFieldAdjustmentStep(double actualBendAngle,
175  double mass,
176  double betaGamma);
177  void findBendEffectiveLength(double startField,
178  double endField);
179  void findBendStrength(double mass,
180  double gamma,
181  double betaGamma,
182  double charge);
183  virtual bool findChordLength(Inform &msg,
184  double &chordLength) = 0;
185  bool findIdealBendParameters(double chordLength);
186  bool initializeFieldMap(Inform &msg);
187  bool inMagnetCentralRegion(const Vector_t &R) const;
188  bool inMagnetEntranceRegion(const Vector_t &R) const;
189  bool inMagnetExitRegion(const Vector_t &R) const;
190  bool isPositionInEntranceField(const Vector_t &R) const;
191  bool isPositionInExitField(const Vector_t &R) const;
192  void print(Inform &msg, double bendAngleX, double bendAngle);
193  void readFieldMap(Inform &msg);
194  void setBendEffectiveLength(double startField, double endField);
195  void setBendStrength();
196  void setEngeOriginDelta(double delta);
197  void setFieldCalcParam();
198  void setGapFromFieldMap();
199  bool setupBendGeometry(Inform &msg, double &startField, double &endField);
200  bool setupDefaultFieldMap(Inform &msg);
201  void setFieldBoundaries(double startField, double endField);
203  bool treatAsDrift(Inform &msg, double chordlength);
204 
209 
210  std::string messageHeader_m;
211 
213 
216  const bool fast_m = false;
217 
218  double designRadius_m;
219 
221  double exitAngle_m;
222  double fieldIndex_m;
224  double startField_m;
225  double endField_m;
226 
229 
230  /*
231  * Flag to reinitialize the bend the first time the magnet
232  * is called. This redefines the design energy of the bend
233  * to the current average beam energy, keeping the bend angle
234  * constant.
235  */
237 
238  /*
239  * Enge function field map members.
240  */
241 
242  /*
243  * Entrance and exit position parameters. Ultimately they are used to
244  * determine the origins of the entrance and exit edge Enge functions and
245  * the extent of the field map. However, how they are used to do this
246  * depends on how the bend using the map is setup in the OPAL input file.
247  * So, we use generic terms to start.
248  */
255 
257  std::vector<double> engeCoeffsEntry_m;
258  std::vector<double> engeCoeffsExit_m;
259 
260  gsl_spline** entryFieldValues_m;
261  gsl_spline** exitFieldValues_m;
262  gsl_interp_accel *entryFieldAccel_m;
263  gsl_interp_accel *exitFieldAccel_m;
264 
265  /*
266  * All coordinates are with respect to (x, z) = (0, 0). It is
267  * assumed the ideal reference trajectory passes through this point.
268  */
270  double deltaEndEntry_m;
272  int polyOrderEntry_m;
274 
276  double deltaEndExit_m;
278  int polyOrderExit_m;
280 
285 
287  CoordinateSystemTrafo beginToEnd_lcs_m; // local coordinate system
290 
292  double maxAngle_m;
293 
294  std::size_t nSlices_m;
295 };
296 
297 
298 inline
300  online_m = false;
301 }
302 
303 inline
304 void Bend2D::getDimensions(double &sBegin, double &sEnd) const {
305  sBegin = startField_m;
306  sEnd = endField_m;
307 }
308 
309 inline
310 double Bend2D::getBendRadius() const {
311  return designRadius_m;
312 }
313 
314 inline
316  return elementEdge_m + designRadius_m * angle_m / 2.0;
317 }
318 
319 inline
321  return designRadius_m * angle_m;
322 }
323 
324 inline
325 double Bend2D::getStartElement() const {
326  return elementEdge_m;
327 }
328 
329 inline
330 void Bend2D::setK1(double k1) {
331  if (std::abs(k1) > 0.0) {
332  throw GeneralClassicException("Bend2D::setK1",
333  "Quadrupole field temporarily not supported");
334  }
335  fieldIndex_m = k1;
336 }
337 
338 inline
339 void Bend2D::setMessageHeader(const std::string & header)
340 {
341  messageHeader_m = header;
342 }
343 
344 inline
345 double Bend2D::getStartField() const
346 {
347  return startField_m;
348 }
349 
350 inline
352 {
353  return fieldmap_m;
354 }
355 
356 inline
357 double Bend2D::getExitAngle() const
358 {
359  return exitAngle_m;
360 }
361 
362 inline
363 void Bend2D::setExitAngle(double angle)
364 {
365  exitAngle_m = angle;
367 }
368 
369 inline
370 double Bend2D::getMapLength() const
371 {
373 }
374 
375 inline
377 {
378  return beginToEnd_m;
379 }
380 
381 inline
383 {
384  return beginToEnd_lcs_m;
385 }
386 
387 inline
389  toEntranceRegion_m = trafo;
390 }
391 
392 inline
394  toExitRegion_m = trafo;
395 }
396 
397 inline
400 }
401 
402 inline
404  return toExitRegion_m.transformTo(R);
405 }
406 
407 #endif // CLASSIC_BEND_H
std::vector< double > engeCoeffsEntry_m
Enge coefficients for map entry and exit regions.
Definition: Bend2D.h:257
double entranceParameter3_m
Definition: Bend2D.h:251
void setBendEffectiveLength(double startField, double endField)
Definition: Bend2D.cpp:1062
double entranceParameter2_m
Definition: Bend2D.h:250
virtual ~Bend2D()
Definition: Bend2D.cpp:131
virtual ElementBase::ElementType getType() const =0
Get element type std::string.
void findBendEffectiveLength(double startField, double endField)
Definition: Bend2D.cpp:605
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
bool isPositionInEntranceField(const Vector_t &R) const
Definition: Bend2D.cpp:867
double sinEntranceAngle_m
Definition: Bend2D.h:282
double deltaBeginEntry_m
Definition: Bend2D.h:269
virtual void addKR(int i, double t, Vector_t &K)
Definition: Bend2D.h:68
virtual void getDimensions(double &sBegin, double &sEnd) const
Definition: Bend2D.h:304
void setupFringeWidths()
Definition: Bend2D.cpp:1677
BorisPusher pusher_m
Definition: Bend2D.h:212
virtual void addKT(int i, double t, Vector_t &K)
Definition: Bend2D.h:69
double tanExitAngle_m
Definition: Bend2D.h:284
bool initializeFieldMap(Inform &msg)
Definition: Bend2D.cpp:818
double getStartElement() const
Definition: Bend2D.h:325
void setBendStrength()
Definition: Bend2D.cpp:1074
double tanEntranceAngle_m
Definition: Bend2D.h:283
void setCSTrafoToExitRegion(const CoordinateSystemTrafo &trafo)
Definition: Bend2D.h:393
bool setupBendGeometry(Inform &msg, double &startField, double &endField)
Definition: Bend2D.cpp:1213
void readFieldMap(Inform &msg)
Definition: Bend2D.cpp:982
bool treatAsDrift(Inform &msg, double chordlength)
Definition: Bend2D.cpp:1295
void setCSTrafoToEntranceRegion(const CoordinateSystemTrafo &trafo)
Definition: Bend2D.h:388
double getStartField() const
Definition: Bend2D.h:345
void setK1(double k1)
Set quadrupole field component.
Definition: Bend2D.h:330
gsl_spline ** entryFieldValues_m
Definition: Bend2D.h:260
double exitParameter1_m
Definition: Bend2D.h:252
bool online_m
Definition: Component.h:201
double startField_m
Dipole field index.
Definition: Bend2D.h:224
double getBendRadius() const
Definition: Bend2D.h:310
double exitParameter2_m
Definition: Bend2D.h:253
bool reinitialize_m
Definition: Bend2D.h:236
Vector_t transformTo(const Vector_t &r) const
Tps< T > tan(const Tps< T > &x)
Tangent.
Definition: TpsMath.h:147
double getMapLength() const
Definition: Bend2D.h:370
gsl_interp_accel * exitFieldAccel_m
Definition: Bend2D.h:263
Bend2D()
Definition: Bend2D.cpp:40
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
Definition: Bend2D.cpp:198
bool inMagnetEntranceRegion(const Vector_t &R) const
Definition: Bend2D.cpp:851
bool setupDefaultFieldMap(Inform &msg)
Definition: Bend2D.cpp:1264
void setNSlices(const std::size_t &nSlices)
Definition: Bend2D.cpp:1684
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B)
Apply field to particles with coordinates in magnet frame.
Definition: Bend2D.cpp:155
gsl_spline ** exitFieldValues_m
Definition: Bend2D.h:261
CoordinateSystemTrafo toEntranceRegion_m
Definition: Bend2D.h:288
double getEffectiveLength() const
Definition: Bend2D.h:320
void setExitAngle(double exitAngle)
Definition: Bend2D.h:363
double designRadius_m
Flag to turn on fast field calculation.
Definition: Bend2D.h:218
std::string messageHeader_m
Definition: Bend2D.h:210
CoordinateSystemTrafo beginToEnd_lcs_m
Definition: Bend2D.h:287
MeshData getSurfaceMesh() const
Definition: Bend2D.cpp:1435
double maxAngle_m
Definition: Bend2D.h:292
double elementEdge_m
Definition: ElementBase.h:471
double fieldIndex_m
and the exit face of the magnet (radians).
Definition: Bend2D.h:223
void setFieldCalcParam()
Definition: Bend2D.cpp:1112
Vector_t calcExitFringeField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:421
double exitParameter3_m
Definition: Bend2D.h:254
virtual CoordinateSystemTrafo getEdgeToEnd() const
Definition: Bend2D.h:376
std::array< double, 2 > getExitFringeFieldLength() const
Get exit fringe field length.
Definition: Bend2D.cpp:1715
virtual void finalise()
Definition: Bend2D.h:299
int polyOrderEntry_m
function origin that Enge function ends.
Definition: Bend2D.h:273
double widthExitFringe_m
Definition: Bend2D.h:228
Definition: Bend2D.h:51
double calculateBendAngle()
Definition: Bend2D.cpp:259
void setEngeOriginDelta(double delta)
Definition: Bend2D.cpp:1090
Vector_t transformToExitRegion(const Vector_t &R) const
Definition: Bend2D.h:403
virtual bool isInside(const Vector_t &r) const
Definition: Bend2D.cpp:1663
double entranceParameter1_m
Definition: Bend2D.h:249
CoordinateSystemTrafo toExitRegion_m
Definition: Bend2D.h:289
bool inMagnetCentralRegion(const Vector_t &R) const
Definition: Bend2D.cpp:833
std::size_t nSlices_m
Definition: Bend2D.h:294
bool calculateMapField(const Vector_t &R, Vector_t &B)
Definition: Bend2D.cpp:457
void findBendStrength(double mass, double gamma, double betaGamma, double charge)
Definition: Bend2D.cpp:695
std::size_t getNSlices() const
Definition: Bend2D.cpp:1689
double deltaBeginExit_m
Enge function order for entry region.
Definition: Bend2D.h:275
Vector_t calcEntranceFringeField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:384
bool inMagnetExitRegion(const Vector_t &R) const
Definition: Bend2D.cpp:858
virtual double getExitAngle() const
Definition: Bend2D.h:357
bool findIdealBendParameters(double chordLength)
Definition: Bend2D.cpp:776
virtual bool findChordLength(Inform &msg, double &chordLength)=0
Vector_t calcCentralField(const Vector_t &R, double deltaX)
Definition: Bend2D.cpp:365
CoordinateSystemTrafo beginToEnd_m
Definition: Bend2D.h:286
const bool fast_m
Magnet field map.
Definition: Bend2D.h:216
void operator=(const Bend2D &)
gsl_interp_accel * entryFieldAccel_m
Definition: Bend2D.h:262
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B)
Definition: Bend2D.cpp:186
double deltaEndEntry_m
function origin where Enge function starts.
Definition: Bend2D.h:271
virtual void goOnline(const double &kineticEnergy)
Definition: Bend2D.cpp:194
void calculateRefTrajectory(double &angleX, double &angleY)
Definition: Bend2D.cpp:520
double estimateFieldAdjustmentStep(double actualBendAngle, double mass, double betaGamma)
Definition: Bend2D.cpp:587
const std::string name
void setGapFromFieldMap()
Definition: Bend2D.cpp:1204
void adjustFringeFields(double ratio)
Definition: Bend2D.cpp:241
CoordinateSystemTrafo getBeginToEnd_local() const
Definition: Bend2D.h:382
void setupPusher(PartBunchBase< double, 3 > *bunch)
Definition: Bend2D.cpp:1288
std::array< double, 2 > getEntranceFringeFieldLength() const
Get entrance fringe field length.
Definition: Bend2D.cpp:1695
double widthEntranceFringe_m
End of magnet field map in s coordinates (m).
Definition: Bend2D.h:227
double getEffectiveCenter() const
Definition: Bend2D.h:315
void calcEngeFunction(double zNormalized, const std::vector< double > &engeCoeff, int polyOrder, double &engeFunc, double &engeFuncDeriv, double &engeFuncSecDerivNorm)
Definition: Bend2D.cpp:301
CoordinateSystemTrafo computeAngleTrafo_m
Definition: Bend2D.h:291
std::vector< Vector_t > getOutline() const
Definition: Bend2D.cpp:1332
double deltaEndExit_m
function origin that Enge function starts.
Definition: Bend2D.h:277
void print(Inform &msg, double bendAngleX, double bendAngle)
Definition: Bend2D.cpp:882
#define K
Definition: integrate.cpp:118
Fieldmap * fieldmap_m
through the bend.
Definition: Bend2D.h:215
Abstract algorithm.
std::vector< double > engeCoeffsExit_m
Definition: Bend2D.h:258
double angle_m
Definition: BendBase.h:42
Definition: Inform.h:41
Fieldmap * getFieldmap()
Definition: Bend2D.h:351
double exitAngle_m
Bend design radius (m).
Definition: Bend2D.h:221
int polyOrderExit_m
function origin that Enge function ends.
Definition: Bend2D.h:279
virtual void accept(BeamlineVisitor &) const =0
Apply visitor to Bend2D.
double endField_m
Start of magnet field map in s coordinates (m).
Definition: Bend2D.h:225
Vector_t transformToEntranceRegion(const Vector_t &R) const
Definition: Bend2D.h:398
void setFieldBoundaries(double startField, double endField)
Definition: Bend2D.cpp:1280
bool isPositionInExitField(const Vector_t &R) const
Definition: Bend2D.cpp:874
void setMessageHeader(const std::string &header)
Definition: Bend2D.h:339
double cosEntranceAngle_m
Enge function order for entry region.
Definition: Bend2D.h:281