OPAL (Object Oriented Parallel Accelerator Library) 2022.1
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
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
40class MeshData;
41
42/*
43 * Class Bend2D
44 *
45 * Interface for general bend magnet.
46 *
47 * ------------------------------------------------------------------------
48 *
49 */
50
51class Bend2D: public BendBase {
52
53public:
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 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;
133protected:
134 void setMessageHeader(const std::string & header);
135 double getStartField() const;
136
137private:
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);
185 void setFieldBoundaries(double startField, double endField);
187 bool isFieldZero();
188
193
194 std::string messageHeader_m;
195
198
200
201 double exitAngle_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
260
265
267 CoordinateSystemTrafo beginToEnd_lcs_m; // local coordinate system
270
273
274 std::size_t nSlices_m;
275};
276
277
278inline
280 online_m = false;
281}
282
283inline
284void Bend2D::getDimensions(double &sBegin, double &sEnd) const {
285 sBegin = startField_m;
286 sEnd = endField_m;
287}
288
289inline
290double Bend2D::getBendRadius() const {
291 return designRadius_m;
292}
293
294inline
296 return elementEdge_m + designRadius_m * angle_m / 2.0;
297}
298
299inline
301 return designRadius_m * angle_m;
302}
303
304inline
305void 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
313inline
314void Bend2D::setMessageHeader(const std::string & header)
315{
316 messageHeader_m = header;
317}
318
319inline
321{
322 return startField_m;
323}
324
325inline
327{
328 return exitAngle_m;
329}
330
331inline
332void Bend2D::setEntranceAngle(double angle)
333{
338}
339
340inline
341void Bend2D::setExitAngle(double angle)
342{
343 exitAngle_m = angle;
345}
346
347inline
349{
350 return beginToEnd_m;
351}
352
353inline
355{
356 return beginToEnd_lcs_m;
357}
358
359inline
361 toEntranceRegion_m = trafo;
362}
363
364inline
366 toExitRegion_m = trafo;
367}
368
369inline
372}
373
374inline
377}
378
379#endif // CLASSIC_BEND_H
ElementType
Definition: ElementBase.h:88
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:148
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 ElementType getType() const override=0
Get element type std::string.
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:191
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
Bend2D()
Definition: Bend2D.cpp:41
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:187
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:124
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
BoundingBox getBoundingBoxInLabCoords() const override
Definition: Bend2D.cpp:1685
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
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:179
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:192
double elementEdge_m
Definition: ElementBase.h:370
Vector_t transformTo(const Vector_t &r) const
Definition: Inform.h:42