OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Cyclotron.h
Go to the documentation of this file.
1 #ifndef CLASSIC_Cyclotron_HH
2 #define CLASSIC_Cyclotron_HH
3 
4 // ------------------------------------------------------------------------
5 // $RCSfile: Cyclotron.h,v $
6 // ------------------------------------------------------------------------
7 // $Revision: 1.1.1.1.2.1 $
8 // ------------------------------------------------------------------------
9 // Copyright: see Copyright.readme
10 // ------------------------------------------------------------------------
11 //
12 // Definitions for class: Cyclotron
13 // Defines the abstract interface for a cyclotron.
14 //
15 // ------------------------------------------------------------------------
16 // Class category: AbsBeamline
17 // ------------------------------------------------------------------------
18 //
19 // $Date: 2007/08/01 $
20 // $Author: Yang, Adelmann $
21 //
22 // ------------------------------------------------------------------------
23 
24 #include "AbsBeamline/Component.h"
25 
26 #include <string>
27 #include <vector>
28 
29 class Fieldmap;
30 class LossDataSink;
31 class TrimCoil;
32 
34 
35 struct BfieldData {
36  std::string filename;
37  // known from file: field and three theta derivatives
38  std::vector<double> bfld; //Bz
39  std::vector<double> dbt; //dBz/dtheta
40  std::vector<double> dbtt; //d2Bz/dtheta2
41  std::vector<double> dbttt; //d3Bz/dtheta3
42 
43  // to be calculated in getdiffs: all other derivatives:
44  std::vector<double> dbr; // dBz/dr
45  std::vector<double> dbrr; // ...
46  std::vector<double> dbrrr;
47 
48  std::vector<double> dbrt;
49  std::vector<double> dbrrt;
50  std::vector<double> dbrtt;
51 
52  // used to get (Br,Btheta,Bz) at any off-plane point
53  std::vector<double> f2; // for Bz
54  std::vector<double> f3; // for Br
55  std::vector<double> g3; // for Btheta
56 
57  // Grid-Size
58  //need to be read from inputfile.
59  int nrad, ntet;
60 
61  // one more grid line is stored in azimuthal direction:
62  int ntetS;
63 
64  // total grid points number.
65  int ntot;
66 
67  // Mean and Maximas
68  double bacc, dbtmx, dbttmx, dbtttmx;
69 
70 
71 };
72 
73 struct BPositions {
74  // these 4 parameters are need to be read from field file.
75  double rmin, delr;
76  double tetmin, dtet;
77 
78  // Radii and step width of initial Grid
79  std::vector<double> rarr;
80 
81  // int ThetaPeriodicity; // Periodicity of Magnetic field
82  double Bfact; // MULTIPLICATION FACTOR FOR MAGNETIC FIELD
83 };
84 
85 
86 // Class Cyclotron
87 // ------------------------------------------------------------------------
89 // This class defines the abstract interface for a Cyclotron.
90 
91 class Cyclotron: public Component {
92 public:
93 
95  explicit Cyclotron(const std::string &name);
96 
97  Cyclotron();
98  Cyclotron(const Cyclotron &);
99 
100  virtual ~Cyclotron();
101 
103  virtual void accept(BeamlineVisitor &) const;
104 
106  // Slices and stepsize used to determine integration step.
107  virtual double getSlices() const = 0;
108 
110  // Slices and stepsize used to determine integration step.
111  virtual double getStepsize() const = 0;
112 
113  void setFieldMapFN(std::string fmapfn);
114  virtual std::string getFieldMapFN() const;
115 
116  void setRfFieldMapFN(std::vector<std::string> rffmapfn);
117  void setRFFCoeffFN(std::vector<std::string> rff_coeff_fn);
118  void setRFVCoeffFN(std::vector<std::string> rfv_coeff_fn);
119 
120  int getFieldFlag(const std::string& type) const;
121 
122  void setType(std::string t);
123  const std::string &getCyclotronType() const;
124  virtual ElementBase::ElementType getType() const;
125 
126  virtual void getDimensions(double &zBegin, double &zEnd) const;
127 
128  unsigned int getNumberOfTrimcoils() const;
129 
130  void setCyclHarm(double h);
131  virtual double getCyclHarm() const;
132 
133  void setRfPhi(std::vector<double> f);
134 
135  void setRfFrequ(std::vector<double> f);
136  double getRfFrequ() const;
137 
138  void setSymmetry(double symmetry);
139  virtual double getSymmetry() const;
140 
141  void setRinit(double rinit);
142  virtual double getRinit() const;
143 
144  void setPRinit(double prinit);
145  virtual double getPRinit() const;
146 
147  void setPHIinit(double phiinit);
148  virtual double getPHIinit() const;
149 
150  void setZinit(double zinit);
151  virtual double getZinit() const;
152 
153  void setPZinit(double zinit);
154  virtual double getPZinit() const;
155 
156  void setBScale(double bs);
157  virtual double getBScale() const;
158 
159  void setEScale(std::vector<double> bs);
160 
161  void setTrimCoils(const std::vector<TrimCoil*> &trimcoils);
162 
163  void setSuperpose(std::vector<bool> flag);
164  // virtual bool getSuperpose() const;
165 
166  void setMinR(double r);
167  virtual double getMinR() const;
168  void setMaxR(double r);
169  virtual double getMaxR() const;
170 
171  void setMinZ(double z);
172  virtual double getMinZ() const;
173  void setMaxZ(double z);
174  virtual double getMaxZ() const;
175 
176  void setFMLowE(double e);
177  virtual double getFMLowE() const;
178  void setFMHighE(double e);
179  virtual double getFMHighE() const;
180 
181  void setTrimCoilThreshold(double);
182  virtual double getTrimCoilThreshold() const;
183 
184  void setSpiralFlag(bool spiral_flag);
185  virtual bool getSpiralFlag() const;
186 
187  virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B);
188 
189  virtual bool apply(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B);
190 
191  virtual void apply(const double& rad, const double& z,
192  const double& tet_rad, double& br,
193  double& bt, double& bz);
194 
195  virtual void initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField);
196 
197  virtual void initialise(PartBunchBase<double, 3> *bunch, const int &fieldflag, const double &scaleFactor);
198 
199  virtual void finalise();
200 
201  virtual bool bends() const;
202 
203  virtual double getRmax() const;
204 
205  virtual double getRmin() const;
206 
207  bool interpolate(const double& rad,
208  const double& tet_rad,
209  double& br,
210  double& bt,
211  double& bz);
212 
213  void read(const int &fieldflag, const double &scaleFactor);
214 
215 private:
217  void applyTrimCoil (const double r, const double z, const double tet_rad, double& br, double& bz);
219  void applyTrimCoil_m(const double r, const double z, const double tet_rad, double *br, double *bz);
220 
221 protected:
222 
223 
224  void getdiffs();
225 
226  double gutdf5d(double *f, double dx, const int kor, const int krl, const int lpr);
227 
228  void initR(double rmin, double dr, int nrad);
229 
230  void getFieldFromFile(const double &scaleFactor);
231  void getFieldFromFile_Carbon(const double &scaleFactor);
232  void getFieldFromFile_CYCIAE(const double &scaleFactor);
233  void getFieldFromFile_AVFEQ(const double &scaleFactor);
234  void getFieldFromFile_FFA(const double &scaleFactor);
235  void getFieldFromFile_BandRF(const double &scaleFactor);
236  void getFieldFromFile_Synchrocyclotron(const double &scaleFactor);
237 
238  inline int idx(int irad, int ktet) {return (ktet + Bfield.ntetS * irad);}
239 
240 
241 private:
242 
243  std::string fmapfn_m; /* stores the filename of the fieldmap */
244  std::vector<double> rffrequ_m;
245  std::vector< std::vector<double> > rffc_m;
246  std::vector<double> rfvrequ_m;
247  std::vector< std::vector<double> > rfvc_m;
248  std::vector<double> rfphi_m;
249  std::vector<double> escale_m; // a scale factor for the E-field
250  std::vector<bool> superpose_m; // electric fields are superposed or not
251 
252  double symmetry_m;
253 
254  double rinit_m;
255  double prinit_m;
256  double phiinit_m;
257  double zinit_m;
258  double pzinit_m;
259 
262 
263  std::string type_m; /* what type of field we use */
264  double harm_m;
265 
266  double bscale_m; // a scale factor for the B-field
267 
269  std::vector<TrimCoil*> trimcoils_m;
270 
271  double minr_m;
272  double maxr_m;
273 
274  double minz_m;
275  double maxz_m;
276 
277  double fmLowE_m;
278  double fmHighE_m;
279 
280  // Not implemented.
281  void operator=(const Cyclotron &) = delete;
282 
283 
285 
286  // RF field map handler
287  // Fieldmap *RFfield;
288  std::vector<Fieldmap *> RFfields_m;
289  std::vector<std::string> RFfilename_m;
290  std::vector<std::string> RFFCoeff_fn_m;
291  std::vector<std::string> RFVCoeff_fn_m;
292 
293  // handling for store the particle out of region
294  std::unique_ptr<LossDataSink> lossDs_m;
295 
296  // Necessary for quick and dirty phase output -DW
298 
299 protected:
300  // object of Matrices including magnetic field map and its derivates
302 
303  // object of parameters about the map grid
305 };
306 
307 #endif // CLASSIC_Cyclotron_HH
virtual double getMaxR() const
Definition: Cyclotron.cpp:310
int nrad
Definition: Cyclotron.h:59
virtual void finalise()
Definition: Cyclotron.cpp:520
virtual double getRmin() const
Definition: Cyclotron.cpp:285
double dbttmx
Definition: Cyclotron.h:68
void setFMLowE(double e)
Definition: Cyclotron.cpp:335
std::vector< std::string > RFfilename_m
Definition: Cyclotron.h:289
bool interpolate(const double &rad, const double &tet_rad, double &br, double &bt, double &bz)
Definition: Cyclotron.cpp:646
virtual double getTrimCoilThreshold() const
Definition: Cyclotron.cpp:152
double trimCoilThreshold_m
B-field threshold for applying trim coil.
Definition: Cyclotron.h:261
double zinit_m
Definition: Cyclotron.h:257
double gutdf5d(double *f, double dx, const int kor, const int krl, const int lpr)
Definition: Cyclotron.cpp:533
double harm_m
Definition: Cyclotron.h:264
constexpr double e
The value of .
Definition: Physics.h:40
void setRinit(double rinit)
Definition: Cyclotron.cpp:108
BFieldType
Definition: Cyclotron.h:33
virtual bool getSpiralFlag() const
Definition: Cyclotron.cpp:160
std::string filename
Definition: Cyclotron.h:36
void setFMHighE(double e)
Definition: Cyclotron.cpp:338
std::string fmapfn_m
Definition: Cyclotron.h:243
std::vector< double > g3
Definition: Cyclotron.h:55
BPositions BP
Definition: Cyclotron.h:304
virtual double getZinit() const
Definition: Cyclotron.cpp:136
std::vector< double > rfvrequ_m
Definition: Cyclotron.h:246
void applyTrimCoil_m(const double r, const double z, const double tet_rad, double *br, double *bz)
Apply trim coils (calculate field contributions)
Definition: Cyclotron.cpp:81
Interface for a Cyclotron.
Definition: Cyclotron.h:91
std::vector< Fieldmap * > RFfields_m
Definition: Cyclotron.h:288
virtual double getPHIinit() const
Definition: Cyclotron.cpp:128
std::vector< std::vector< double > > rfvc_m
Definition: Cyclotron.h:247
double fmHighE_m
Definition: Cyclotron.h:278
int ntot
Definition: Cyclotron.h:65
double dtet
Definition: Cyclotron.h:76
void getFieldFromFile_AVFEQ(const double &scaleFactor)
Definition: Cyclotron.cpp:1147
void setTrimCoils(const std::vector< TrimCoil * > &trimcoils)
Definition: Cyclotron.cpp:331
virtual ~Cyclotron()
Definition: Cyclotron.cpp:77
void setFieldMapFN(std::string fmapfn)
Definition: Cyclotron.cpp:164
void setRFFCoeffFN(std::vector< std::string > rff_coeff_fn)
Definition: Cyclotron.cpp:176
void setSuperpose(std::vector< bool > flag)
Definition: Cyclotron.cpp:232
virtual double getSymmetry() const
Definition: Cyclotron.cpp:244
void setMaxR(double r)
Definition: Cyclotron.cpp:301
std::vector< double > f3
Definition: Cyclotron.h:54
virtual double getStepsize() const =0
Get stepsize.
double fmLowE_m
Definition: Cyclotron.h:277
void getFieldFromFile_CYCIAE(const double &scaleFactor)
Definition: Cyclotron.cpp:1342
void operator=(const Cyclotron &)=delete
double maxz_m
Definition: Cyclotron.h:275
const std::string & getCyclotronType() const
Definition: Cyclotron.cpp:253
double tetmin
Definition: Cyclotron.h:76
double rmin
Definition: Cyclotron.h:75
std::vector< double > dbt
Definition: Cyclotron.h:39
void applyTrimCoil(const double r, const double z, const double tet_rad, double &br, double &bz)
Apply trim coils (calculate field contributions) with smooth field transition.
Definition: Cyclotron.cpp:89
double rinit_m
Definition: Cyclotron.h:254
std::vector< double > dbtt
Definition: Cyclotron.h:40
double delr
Definition: Cyclotron.h:75
std::vector< double > f2
Definition: Cyclotron.h:53
double minr_m
Definition: Cyclotron.h:271
int waiting_for_gap
Definition: Cyclotron.h:297
double symmetry_m
Definition: Cyclotron.h:252
std::vector< std::vector< double > > rffc_m
Definition: Cyclotron.h:245
void getFieldFromFile_FFA(const double &scaleFactor)
Definition: Cyclotron.cpp:1036
std::vector< double > bfld
Definition: Cyclotron.h:38
std::vector< std::string > RFVCoeff_fn_m
Definition: Cyclotron.h:291
std::vector< double > dbrt
Definition: Cyclotron.h:48
virtual double getMinZ() const
Definition: Cyclotron.cpp:319
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B)
Definition: Cyclotron.cpp:342
void setRfFieldMapFN(std::vector< std::string > rffmapfn)
Definition: Cyclotron.cpp:172
std::vector< double > dbrr
Definition: Cyclotron.h:45
virtual double getFMHighE() const
Definition: Cyclotron.cpp:339
virtual double getCyclHarm() const
Definition: Cyclotron.cpp:281
virtual double getMinR() const
Definition: Cyclotron.cpp:306
bool spiral_flag_m
Definition: Cyclotron.h:260
std::string type_m
Definition: Cyclotron.h:263
void setCyclHarm(double h)
Definition: Cyclotron.cpp:261
virtual void getDimensions(double &zBegin, double &zEnd) const
Definition: Cyclotron.cpp:1523
void getFieldFromFile_Carbon(const double &scaleFactor)
Definition: Cyclotron.cpp:1247
void setMinZ(double z)
Definition: Cyclotron.cpp:314
void setPZinit(double zinit)
Definition: Cyclotron.cpp:140
std::vector< double > rarr
Definition: Cyclotron.h:79
virtual double getBScale() const
Definition: Cyclotron.cpp:269
std::vector< double > rfphi_m
Definition: Cyclotron.h:248
void setEScale(std::vector< double > bs)
Definition: Cyclotron.cpp:273
void setPRinit(double prinit)
Definition: Cyclotron.cpp:116
void setMinR(double r)
Definition: Cyclotron.cpp:295
double phiinit_m
Definition: Cyclotron.h:256
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
Definition: Cyclotron.cpp:1023
void setRfPhi(std::vector< double > f)
Definition: Cyclotron.cpp:215
void getFieldFromFile_BandRF(const double &scaleFactor)
Definition: Cyclotron.cpp:1420
void setType(std::string t)
Definition: Cyclotron.cpp:249
virtual double getPZinit() const
Definition: Cyclotron.cpp:144
std::vector< std::string > RFFCoeff_fn_m
Definition: Cyclotron.h:290
void setRfFrequ(std::vector< double > f)
Definition: Cyclotron.cpp:219
virtual std::string getFieldMapFN() const
Definition: Cyclotron.cpp:168
double minz_m
Definition: Cyclotron.h:274
Abstract TrimCoil class.
Definition: TrimCoil.h:8
unsigned int getNumberOfTrimcoils() const
Definition: Cyclotron.cpp:277
double bscale_m
Definition: Cyclotron.h:266
virtual double getPRinit() const
Definition: Cyclotron.cpp:120
void getFieldFromFile(const double &scaleFactor)
Definition: Cyclotron.cpp:896
virtual double getFMLowE() const
Definition: Cyclotron.cpp:336
std::vector< double > dbr
Definition: Cyclotron.h:44
virtual void accept(BeamlineVisitor &) const
Apply visitor to Cyclotron.
Definition: Cyclotron.cpp:104
int getFieldFlag(const std::string &type) const
Definition: Cyclotron.cpp:184
std::unique_ptr< LossDataSink > lossDs_m
Definition: Cyclotron.h:294
double maxr_m
Definition: Cyclotron.h:272
void setPHIinit(double phiinit)
Definition: Cyclotron.cpp:124
BFieldType myBFieldType_m
Definition: Cyclotron.h:284
std::vector< double > rffrequ_m
Definition: Cyclotron.h:244
T rad(T x)
Convert degrees to radians.
Definition: matheval.hpp:86
void setZinit(double zinit)
Definition: Cyclotron.cpp:132
virtual double getRmax() const
Definition: Cyclotron.cpp:290
void setRFVCoeffFN(std::vector< std::string > rfv_coeff_fn)
Definition: Cyclotron.cpp:180
std::vector< double > escale_m
Definition: Cyclotron.h:249
std::vector< TrimCoil * > trimcoils_m
Trim coils.
Definition: Cyclotron.h:269
virtual double getRinit() const
Definition: Cyclotron.cpp:112
int idx(int irad, int ktet)
Definition: Cyclotron.h:238
int ntet
Definition: Cyclotron.h:59
void setMaxZ(double z)
Definition: Cyclotron.cpp:322
double getRfFrequ() const
Definition: Cyclotron.cpp:223
std::vector< double > dbttt
Definition: Cyclotron.h:41
double dbtmx
Definition: Cyclotron.h:68
const std::string name
double pzinit_m
Definition: Cyclotron.h:258
int ntetS
Definition: Cyclotron.h:62
void setBScale(double bs)
Definition: Cyclotron.cpp:265
void setSymmetry(double symmetry)
Definition: Cyclotron.cpp:240
double dbtttmx
Definition: Cyclotron.h:68
double Bfact
Definition: Cyclotron.h:82
void setTrimCoilThreshold(double)
Definition: Cyclotron.cpp:148
virtual double getMaxZ() const
Definition: Cyclotron.cpp:327
Interface for a single beam element.
Definition: Component.h:51
double bacc
Definition: Cyclotron.h:68
Abstract algorithm.
std::vector< bool > superpose_m
Definition: Cyclotron.h:250
void setSpiralFlag(bool spiral_flag)
Definition: Cyclotron.cpp:156
virtual bool bends() const
Definition: Cyclotron.cpp:528
virtual double getSlices() const =0
Get number of slices.
std::vector< double > dbrrr
Definition: Cyclotron.h:46
void getdiffs()
Definition: Cyclotron.cpp:783
void initR(double rmin, double dr, int nrad)
Definition: Cyclotron.cpp:1015
void getFieldFromFile_Synchrocyclotron(const double &scaleFactor)
Definition: Cyclotron.cpp:1440
void read(const int &fieldflag, const double &scaleFactor)
Definition: Cyclotron.cpp:733
BfieldData Bfield
Definition: Cyclotron.h:301
std::vector< double > dbrtt
Definition: Cyclotron.h:50
double prinit_m
Definition: Cyclotron.h:255
virtual ElementBase::ElementType getType() const
Get element type std::string.
Definition: Cyclotron.cpp:257
std::vector< double > dbrrt
Definition: Cyclotron.h:49