OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
Cyclotron.h
Go to the documentation of this file.
1 //
2 // Class Cyclotron
3 // Defines the abstract interface for a cyclotron.
4 //
5 // Copyright (c) 2007 - 2012, Jianjun Yang and Andreas Adelmann, Paul Scherrer Institut, Villigen PSI, Switzerland
6 // Copyright (c) 2013 - 2021, Paul Scherrer Institut, Villigen PSI, Switzerland
7 // All rights reserved
8 //
9 // Implemented as part of the PhD thesis
10 // "Beam dynamics in high intensity cyclotrons including neighboring bunch effects"
11 // and the paper
12 // "Beam dynamics in high intensity cyclotrons including neighboring bunch effects:
13 // Model, implementation, and application"
14 // (https://journals.aps.org/prab/pdf/10.1103/PhysRevSTAB.13.064201)
15 //
16 // This file is part of OPAL.
17 //
18 // OPAL is free software: you can redistribute it and/or modify
19 // it under the terms of the GNU General Public License as published by
20 // the Free Software Foundation, either version 3 of the License, or
21 // (at your option) any later version.
22 //
23 // You should have received a copy of the GNU General Public License
24 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
25 //
26 #ifndef CLASSIC_Cyclotron_HH
27 #define CLASSIC_Cyclotron_HH
28 
29 #include "AbsBeamline/Component.h"
30 #include "Fields/Definitions.h"
31 
32 #include <string>
33 #include <vector>
34 
35 class LossDataSink;
36 class TrimCoil;
37 
38 struct BfieldData {
39  // known from file: field and three theta derivatives
40  std::vector<double> bfld_m; //Bz
41  std::vector<double> dbt_m; //dBz/dtheta
42  std::vector<double> dbtt_m; //d2Bz/dtheta2
43  std::vector<double> dbttt_m; //d3Bz/dtheta3
44 
45  // to be calculated in getdiffs: all other derivatives:
46  std::vector<double> dbr_m; // dBz/dr
47  std::vector<double> dbrr_m; // ...
48  std::vector<double> dbrrr_m;
49 
50  std::vector<double> dbrt_m;
51  std::vector<double> dbrrt_m;
52  std::vector<double> dbrtt_m;
53 
54  // used to get (Br,Btheta,Bz) at any off-plane point
55  std::vector<double> f2_m; // for Bz
56  std::vector<double> f3_m; // for Br
57  std::vector<double> g3_m; // for Btheta
58 
59  // Grid-Size
60  int nrad_m, ntet_m; // need to be read from inputfile.
61  int ntetS_m; // one more grid line is stored in azimuthal direction
62  int ntot_m; // total grid points number.
63 
64  // Mean and Maximas
66 };
67 
68 struct BPositions {
69  // these 4 parameters are need to be read from field file.
70  double rmin_m, delr_m;
71  double tetmin_m, dtet_m;
72 
73  // Radii and step width of initial Grid
74  std::vector<double> rarr_m;
75 
76  // Multiplication factor for magnetic field
77  double Bfact_m;
78 };
79 
80 class Cyclotron: public Component {
81 
82 public:
83  enum class BFieldType: unsigned short {
84  PSIBF,
85  CARBONBF,
86  ANSYSBF,
87  AVFEQBF,
88  FFABF,
89  BANDRF,
90  SYNCHRO
91  };
92 
94  explicit Cyclotron(const std::string& name);
95 
96  Cyclotron();
97  Cyclotron(const Cyclotron&);
98 
99  virtual ~Cyclotron();
100 
102  virtual void accept(BeamlineVisitor&) const;
103 
105  // Slices and stepsize used to determine integration step.
106  virtual double getSlices() const = 0;
107 
109  // Slices and stepsize used to determine integration step.
110  virtual double getStepsize() const = 0;
111 
112  void setFieldMapFN(const std::string& fmapfn);
113  virtual std::string getFieldMapFN() const;
114 
115  void setRfFieldMapFN(std::vector<std::string> rffmapfn);
116  void setRFFCoeffFN(std::vector<std::string> rff_coeff_fn);
117  void setRFVCoeffFN(std::vector<std::string> rfv_coeff_fn);
118 
119  void setCyclotronType(const std::string& type);
120  const std::string& getCyclotronType() const;
121 
122  void setBFieldType();
123  BFieldType getBFieldType() const;
124 
125  virtual ElementType getType() const;
126 
127  virtual void getDimensions(double& zBegin, double& zEnd) const;
128 
129  unsigned int getNumberOfTrimcoils() const;
130 
131  void setCyclHarm(double h);
132  virtual double getCyclHarm() const;
133 
134  void setRfPhi(std::vector<double> f);
135  virtual std::vector<double> getRfPhi() const;
136 
137  void setRfFrequ(std::vector<double> f);
138  virtual std::vector<double> getRfFrequ() const;
139 
140  void setSymmetry(double symmetry);
141  virtual double getSymmetry() const;
142 
143  void setRinit(double rinit);
144  virtual double getRinit() const;
145 
146  void setPRinit(double prinit);
147  virtual double getPRinit() const;
148 
149  void setPHIinit(double phiinit);
150  virtual double getPHIinit() const;
151 
152  void setZinit(double zinit);
153  virtual double getZinit() const;
154 
155  void setPZinit(double zinit);
156  virtual double getPZinit() const;
157 
158  void setBScale(double bs);
159  virtual double getBScale() const;
160 
161  void setEScale(std::vector<double> bs);
162  virtual std::vector<double> getEScale() const;
163 
164  void setTrimCoils(const std::vector<TrimCoil*>& trimcoils);
165 
166  void setSuperpose(std::vector<bool> flag);
167  virtual std::vector<bool> getSuperpose() const;
168 
169  void setMinR(double r);
170  virtual double getMinR() const;
171  void setMaxR(double r);
172  virtual double getMaxR() const;
173 
174  void setMinZ(double z);
175  virtual double getMinZ() const;
176  void setMaxZ(double z);
177  virtual double getMaxZ() const;
178 
179  void setFMLowE(double e);
180  virtual double getFMLowE() const;
181  void setFMHighE(double e);
182  virtual double getFMHighE() const;
183 
184  void setTrimCoilThreshold(double);
185  virtual double getTrimCoilThreshold() const;
186 
187  void setSpiralFlag(bool spiral_flag);
188  virtual bool getSpiralFlag() const;
189 
190  virtual bool apply(const size_t& id, const double& t, Vector_t& E, Vector_t& B);
191 
192  virtual bool apply(const Vector_t& R, const Vector_t& P, const double& t, Vector_t& E, Vector_t& B);
193 
194  virtual void apply(const double& rad, const double& z,
195  const double& tet_rad, double& br,
196  double& bt, double& bz);
197 
198  virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField);
199 
200  virtual void initialise(PartBunchBase<double, 3>* bunch, const double& scaleFactor);
201 
202  virtual void finalise();
203 
204  virtual bool bends() const;
205 
206  virtual double getRmax() const;
207  virtual double getRmin() const;
208 
209  bool interpolate(const double& rad,
210  const double& tet_rad,
211  double& br,
212  double& bt,
213  double& bz);
214 
215  void read(const double& scaleFactor);
216 
217  void writeOutputFieldFiles();
218 
219  void checkInitialReferenceParticle(double refR, double refTheta, double refZ);
220 
221 private:
223  void applyTrimCoil (const double r, const double z, const double tet_rad, double& br, double& bz);
225  void applyTrimCoil_m(const double r, const double z, const double tet_rad, double* br, double* bz);
226 
227 
228 protected:
229  void getdiffs();
230  double gutdf5d(double* f, double dx, const int kor, const int krl, const int lpr);
231 
232  void initR(double rmin, double dr, int nrad);
233 
234  void getFieldFromFile_Ring(const double& scaleFactor);
235  void getFieldFromFile_Carbon(const double& scaleFactor);
236  void getFieldFromFile_CYCIAE(const double& scaleFactor);
237  void getFieldFromFile_AVFEQ(const double& scaleFactor);
238  void getFieldFromFile_FFA(const double& scaleFactor);
239  void getFieldFromFile_BandRF(const double& scaleFactor);
240  void getFieldFromFile_Synchrocyclotron(const double& scaleFactor);
241 
242  inline int idx(int irad, int ktet) {return (ktet + Bfield_m.ntetS_m * irad);}
243 
244 
245 private:
247 
248  std::string fmapfn_m;
249  std::vector<double> rffrequ_m;
250  std::vector< std::vector<double> > rffc_m;
251  std::vector<double> rfvrequ_m;
252  std::vector< std::vector<double> > rfvc_m;
253  std::vector<double> rfphi_m;
254  std::vector<double> escale_m;
255  std::vector<bool> superpose_m;
257  double symmetry_m;
258 
259  double rinit_m;
260  double prinit_m;
261  double phiinit_m;
262  double zinit_m;
263  double pzinit_m;
264 
268  std::string typeName_m;
270  double harm_m;
271 
272  double bscale_m;
274  std::vector<TrimCoil*> trimcoils_m;
276  double minr_m;
277  double maxr_m;
278  double minz_m;
279  double maxz_m;
280 
281  double fmLowE_m;
282  double fmHighE_m;
283 
284  // Not implemented.
285  void operator=(const Cyclotron &) = delete;
286 
287  // RF field map handler
288  // Fieldmap RFfield;
289  std::vector<Fieldmap> RFfields_m;
290  std::vector<std::string> RFfilename_m;
291  std::vector<std::string> RFFCoeff_fn_m;
292  std::vector<std::string> RFVCoeff_fn_m;
293 
294  std::unique_ptr<LossDataSink> lossDs_m;
296  // Necessary for quick and dirty phase output -DW
297  int waitingGap_m = 1;
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
std::vector< double > dbr_m
Definition: Cyclotron.h:46
void setPHIinit(double phiinit)
Definition: Cyclotron.cpp:139
std::vector< double > rffrequ_m
Definition: Cyclotron.h:249
virtual double getFMHighE() const
Definition: Cyclotron.cpp:372
void setFieldMapFN(const std::string &fmapfn)
Definition: Cyclotron.cpp:179
void setCyclHarm(double h)
Definition: Cyclotron.cpp:268
void getFieldFromFile_Carbon(const double &scaleFactor)
Definition: Cyclotron.cpp:1286
int nrad_m
Definition: Cyclotron.h:60
int ntot_m
Definition: Cyclotron.h:62
void setPZinit(double zinit)
Definition: Cyclotron.cpp:155
double Bfact_m
Definition: Cyclotron.h:77
T rad(T x)
Convert degrees to radians.
Definition: matheval.hpp:79
std::vector< TrimCoil * > trimcoils_m
Definition: Cyclotron.h:274
int idx(int irad, int ktet)
Definition: Cyclotron.h:242
void setEScale(std::vector< double > bs)
Definition: Cyclotron.cpp:280
void read(const double &scaleFactor)
Definition: Cyclotron.cpp:797
void setMaxZ(double z)
Definition: Cyclotron.cpp:343
void setPRinit(double prinit)
Definition: Cyclotron.cpp:131
double pzinit_m
Definition: Cyclotron.h:263
std::vector< Fieldmap > RFfields_m
Definition: Cyclotron.h:289
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
Definition: Cyclotron.cpp:965
int ntet_m
Definition: Cyclotron.h:60
std::vector< double > dbrtt_m
Definition: Cyclotron.h:52
double tetmin_m
Definition: Cyclotron.h:71
void getFieldFromFile_Ring(const double &scaleFactor)
Definition: Cyclotron.cpp:979
void setRfPhi(std::vector< double > f)
Definition: Cyclotron.cpp:209
double dbtttmx_m
Definition: Cyclotron.h:65
void setSymmetry(double symmetry)
Definition: Cyclotron.cpp:248
void setRfFrequ(std::vector< double > f)
Definition: Cyclotron.cpp:222
virtual std::string getFieldMapFN() const
Definition: Cyclotron.cpp:183
double minz_m
Definition: Cyclotron.h:278
std::vector< double > dbrrr_m
Definition: Cyclotron.h:48
std::vector< double > g3_m
Definition: Cyclotron.h:57
unsigned int getNumberOfTrimcoils() const
Definition: Cyclotron.cpp:293
int ntetS_m
Definition: Cyclotron.h:61
void setTrimCoilThreshold(double)
Definition: Cyclotron.cpp:163
Definition: TSVMeta.h:24
virtual double getPRinit() const
Definition: Cyclotron.cpp:135
std::unique_ptr< LossDataSink > lossDs_m
Definition: Cyclotron.h:294
std::vector< bool > superpose_m
Definition: Cyclotron.h:255
double dtet_m
Definition: Cyclotron.h:71
double maxr_m
Definition: Cyclotron.h:277
BPositions BP_m
Definition: Cyclotron.h:304
virtual bool bends() const
Definition: Cyclotron.cpp:597
virtual double getSlices() const =0
Get number of slices.
void setZinit(double zinit)
Definition: Cyclotron.cpp:147
virtual double getRmax() const
Definition: Cyclotron.cpp:305
void getFieldFromFile_Synchrocyclotron(const double &scaleFactor)
Definition: Cyclotron.cpp:1440
void setRFVCoeffFN(std::vector< std::string > rfv_coeff_fn)
Definition: Cyclotron.cpp:205
BFieldType getBFieldType() const
Definition: Cyclotron.cpp:396
virtual std::vector< bool > getSuperpose() const
Definition: Cyclotron.cpp:239
std::vector< double > escale_m
Definition: Cyclotron.h:254
virtual double getRmin() const
Definition: Cyclotron.cpp:301
virtual double getRinit() const
Definition: Cyclotron.cpp:127
std::vector< std::string > RFfilename_m
Definition: Cyclotron.h:290
std::vector< double > dbrr_m
Definition: Cyclotron.h:47
bool interpolate(const double &rad, const double &tet_rad, double &br, double &bt, double &bz)
Definition: Cyclotron.cpp:714
std::vector< double > dbttt_m
Definition: Cyclotron.h:43
double dbttmx_m
Definition: Cyclotron.h:65
void setCyclotronType(const std::string &type)
Definition: Cyclotron.cpp:256
double gutdf5d(double *f, double dx, const int kor, const int krl, const int lpr)
Definition: Cyclotron.cpp:602
std::vector< double > f3_m
Definition: Cyclotron.h:56
void setBScale(double bs)
Definition: Cyclotron.cpp:272
double harm_m
Definition: Cyclotron.h:270
virtual bool getSpiralFlag() const
Definition: Cyclotron.cpp:175
void setFMHighE(double e)
Definition: Cyclotron.cpp:368
std::vector< double > f2_m
Definition: Cyclotron.h:55
std::string fmapfn_m
Definition: Cyclotron.h:248
virtual double getZinit() const
Definition: Cyclotron.cpp:151
virtual double getMaxZ() const
Definition: Cyclotron.cpp:347
BfieldData Bfield_m
Definition: Cyclotron.h:301
std::vector< std::vector< double > > rfvc_m
Definition: Cyclotron.h:252
ElementType
Definition: ElementBase.h:88
double fmHighE_m
Definition: Cyclotron.h:282
void setSpiralFlag(bool spiral_flag)
Definition: Cyclotron.cpp:171
void setTrimCoils(const std::vector< TrimCoil * > &trimcoils)
Definition: Cyclotron.cpp:356
void writeOutputFieldFiles()
Definition: Cyclotron.cpp:1520
double rmin_m
Definition: Cyclotron.h:70
void setSuperpose(std::vector< bool > flag)
Definition: Cyclotron.cpp:235
virtual double getSymmetry() const
Definition: Cyclotron.cpp:252
void getdiffs()
Definition: Cyclotron.cpp:848
virtual double getStepsize() const =0
Get stepsize.
int waitingGap_m
Definition: Cyclotron.h:297
void operator=(const Cyclotron &)=delete
void initR(double rmin, double dr, int nrad)
Definition: Cyclotron.cpp:957
const std::string & getCyclotronType() const
Definition: Cyclotron.cpp:260
double prinit_m
Definition: Cyclotron.h:260
std::vector< double > rarr_m
Definition: Cyclotron.h:74
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:105
virtual double getMaxR() const
Definition: Cyclotron.cpp:326
virtual void finalise()
Definition: Cyclotron.cpp:591
double minr_m
Definition: Cyclotron.h:276
void setFMLowE(double e)
Definition: Cyclotron.cpp:360
virtual double getTrimCoilThreshold() const
Definition: Cyclotron.cpp:167
double symmetry_m
Definition: Cyclotron.h:257
double trimCoilThreshold_m
Definition: Cyclotron.h:266
std::vector< std::vector< double > > rffc_m
Definition: Cyclotron.h:250
double zinit_m
Definition: Cyclotron.h:262
std::vector< std::string > RFVCoeff_fn_m
Definition: Cyclotron.h:292
const std::string name
std::vector< double > dbt_m
Definition: Cyclotron.h:41
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B)
Definition: Cyclotron.cpp:417
virtual std::vector< double > getEScale() const
Definition: Cyclotron.cpp:284
void setRfFieldMapFN(std::vector< std::string > rffmapfn)
Definition: Cyclotron.cpp:197
void setRinit(double rinit)
Definition: Cyclotron.cpp:123
virtual std::vector< double > getRfPhi() const
Definition: Cyclotron.cpp:213
double dbtmx_m
Definition: Cyclotron.h:65
std::vector< double > bfld_m
Definition: Cyclotron.h:40
virtual double getCyclHarm() const
Definition: Cyclotron.cpp:297
std::vector< double > rfvrequ_m
Definition: Cyclotron.h:251
virtual double getMinR() const
Definition: Cyclotron.cpp:317
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:97
void setBFieldType()
Definition: Cyclotron.cpp:376
virtual void getDimensions(double &zBegin, double &zEnd) const
Definition: Cyclotron.cpp:1516
std::vector< double > dbrrt_m
Definition: Cyclotron.h:51
void setMinZ(double z)
Definition: Cyclotron.cpp:335
virtual double getPHIinit() const
Definition: Cyclotron.cpp:143
constexpr double e
The value of .
Definition: Physics.h:39
std::vector< double > dbrt_m
Definition: Cyclotron.h:50
virtual double getBScale() const
Definition: Cyclotron.cpp:276
std::vector< double > rfphi_m
Definition: Cyclotron.h:253
void getFieldFromFile_AVFEQ(const double &scaleFactor)
Definition: Cyclotron.cpp:1196
virtual ElementType getType() const
Get element type std::string.
Definition: Cyclotron.cpp:264
virtual ~Cyclotron()
Definition: Cyclotron.cpp:93
void setRFFCoeffFN(std::vector< std::string > rff_coeff_fn)
Definition: Cyclotron.cpp:201
Interface for a single beam element.
Definition: Component.h:50
std::vector< double > dbtt_m
Definition: Cyclotron.h:42
double delr_m
Definition: Cyclotron.h:70
void checkInitialReferenceParticle(double refR, double refTheta, double refZ)
Definition: Cyclotron.cpp:400
double bacc_m
Definition: Cyclotron.h:65
void setMinR(double r)
Definition: Cyclotron.cpp:309
double phiinit_m
Definition: Cyclotron.h:261
void setMaxR(double r)
Definition: Cyclotron.cpp:313
double fmLowE_m
Definition: Cyclotron.h:281
void getFieldFromFile_CYCIAE(const double &scaleFactor)
Definition: Cyclotron.cpp:1353
std::string typeName_m
Definition: Cyclotron.h:268
void getFieldFromFile_BandRF(const double &scaleFactor)
Definition: Cyclotron.cpp:1426
double maxz_m
Definition: Cyclotron.h:279
virtual std::vector< double > getRfFrequ() const
Definition: Cyclotron.cpp:226
double rinit_m
Definition: Cyclotron.h:259
BFieldType fieldType_m
Definition: Cyclotron.h:246
virtual double getPZinit() const
Definition: Cyclotron.cpp:159
std::vector< std::string > RFFCoeff_fn_m
Definition: Cyclotron.h:291
SDDS1 &description type
Definition: test.stat:4
bool spiralFlag_m
Definition: Cyclotron.h:265
double bscale_m
Definition: Cyclotron.h:272
void getFieldFromFile_FFA(const double &scaleFactor)
Definition: Cyclotron.cpp:1090
virtual double getFMLowE() const
Definition: Cyclotron.cpp:364
virtual void accept(BeamlineVisitor &) const
Apply visitor to Cyclotron.
Definition: Cyclotron.cpp:119
virtual double getMinZ() const
Definition: Cyclotron.cpp:339