OPAL (Object Oriented Parallel Accelerator Library) 2022.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
30
31#include <string>
32#include <vector>
33
34class Fieldmap;
35class LossDataSink;
36class TrimCoil;
37
38struct 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
68struct BPositions {
69 // these 4 parameters are need to be read from field file.
70 double rmin_m, delr_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
80class Cyclotron: public Component {
81
82public:
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();
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
218
219private:
221 void applyTrimCoil (const double r, const double z, const double tet_rad, double& br, double& bz);
223 void applyTrimCoil_m(const double r, const double z, const double tet_rad, double* br, double* bz);
224
225
226protected:
227 void getdiffs();
228 double gutdf5d(double* f, double dx, const int kor, const int krl, const int lpr);
229
230 void initR(double rmin, double dr, int nrad);
231
232 void getFieldFromFile_Ring(const double& scaleFactor);
233 void getFieldFromFile_Carbon(const double& scaleFactor);
234 void getFieldFromFile_CYCIAE(const double& scaleFactor);
235 void getFieldFromFile_AVFEQ(const double& scaleFactor);
236 void getFieldFromFile_FFA(const double& scaleFactor);
237 void getFieldFromFile_BandRF(const double& scaleFactor);
238 void getFieldFromFile_Synchrocyclotron(const double& scaleFactor);
239
240 inline int idx(int irad, int ktet) {return (ktet + Bfield_m.ntetS_m * irad);}
241
242
243private:
245
246 std::string fmapfn_m;
247 std::vector<double> rffrequ_m;
248 std::vector< std::vector<double> > rffc_m;
249 std::vector<double> rfvrequ_m;
250 std::vector< std::vector<double> > rfvc_m;
251 std::vector<double> rfphi_m;
252 std::vector<double> escale_m;
253 std::vector<bool> superpose_m;
256
257 double rinit_m;
258 double prinit_m;
259 double phiinit_m;
260 double zinit_m;
261 double pzinit_m;
262
266 std::string typeName_m;
268 double harm_m;
269
270 double bscale_m;
272 std::vector<TrimCoil*> trimcoils_m;
274 double minr_m;
275 double maxr_m;
276 double minz_m;
277 double maxz_m;
278
279 double fmLowE_m;
280 double fmHighE_m;
281
282 // Not implemented.
283 void operator=(const Cyclotron &) = delete;
284
285 // RF field map handler
286 // Fieldmap *RFfield;
287 std::vector<Fieldmap*> RFfields_m;
288 std::vector<std::string> RFfilename_m;
289 std::vector<std::string> RFFCoeff_fn_m;
290 std::vector<std::string> RFVCoeff_fn_m;
291
292 std::unique_ptr<LossDataSink> lossDs_m;
294 // Necessary for quick and dirty phase output -DW
296
297protected:
298 // object of Matrices including magnetic field map and its derivates
300
301 // object of parameters about the map grid
303};
304
305#endif // CLASSIC_Cyclotron_HH
ElementType
Definition: ElementBase.h:88
const std::string name
constexpr double e
The value of.
Definition: Physics.h:39
T rad(T x)
Convert degrees to radians.
Definition: matheval.hpp:78
boost::function< boost::tuple< double, bool >(arguments_t)> type
Definition: function.hpp:21
Interface for a single beam element.
Definition: Component.h:50
double bacc_m
Definition: Cyclotron.h:65
std::vector< double > dbrrt_m
Definition: Cyclotron.h:51
std::vector< double > g3_m
Definition: Cyclotron.h:57
std::vector< double > dbtt_m
Definition: Cyclotron.h:42
int ntot_m
Definition: Cyclotron.h:62
std::vector< double > dbrtt_m
Definition: Cyclotron.h:52
std::vector< double > f3_m
Definition: Cyclotron.h:56
std::vector< double > dbrr_m
Definition: Cyclotron.h:47
std::vector< double > dbrrr_m
Definition: Cyclotron.h:48
std::vector< double > dbttt_m
Definition: Cyclotron.h:43
double dbtmx_m
Definition: Cyclotron.h:65
std::vector< double > dbrt_m
Definition: Cyclotron.h:50
std::vector< double > dbr_m
Definition: Cyclotron.h:46
std::vector< double > dbt_m
Definition: Cyclotron.h:41
int ntetS_m
Definition: Cyclotron.h:61
int ntet_m
Definition: Cyclotron.h:60
std::vector< double > bfld_m
Definition: Cyclotron.h:40
double dbtttmx_m
Definition: Cyclotron.h:65
std::vector< double > f2_m
Definition: Cyclotron.h:55
double dbttmx_m
Definition: Cyclotron.h:65
int nrad_m
Definition: Cyclotron.h:60
double delr_m
Definition: Cyclotron.h:70
double rmin_m
Definition: Cyclotron.h:70
double dtet_m
Definition: Cyclotron.h:71
double Bfact_m
Definition: Cyclotron.h:77
std::vector< double > rarr_m
Definition: Cyclotron.h:74
double tetmin_m
Definition: Cyclotron.h:71
virtual std::vector< double > getEScale() const
Definition: Cyclotron.cpp:284
void setTrimCoilThreshold(double)
Definition: Cyclotron.cpp:163
void setZinit(double zinit)
Definition: Cyclotron.cpp:147
virtual double getStepsize() const =0
Get stepsize.
double minr_m
Definition: Cyclotron.h:274
virtual double getCyclHarm() const
Definition: Cyclotron.cpp:297
double rinit_m
Definition: Cyclotron.h:257
void setBFieldType()
Definition: Cyclotron.cpp:369
virtual void getDimensions(double &zBegin, double &zEnd) const
Definition: Cyclotron.cpp:1493
std::vector< std::string > RFfilename_m
Definition: Cyclotron.h:288
virtual bool getSpiralFlag() const
Definition: Cyclotron.cpp:175
virtual bool bends() const
Definition: Cyclotron.cpp:573
void getFieldFromFile_CYCIAE(const double &scaleFactor)
Definition: Cyclotron.cpp:1330
void setSpiralFlag(bool spiral_flag)
Definition: Cyclotron.cpp:171
virtual ElementType getType() const
Get element type std::string.
Definition: Cyclotron.cpp:264
virtual double getPRinit() const
Definition: Cyclotron.cpp:135
void getFieldFromFile_BandRF(const double &scaleFactor)
Definition: Cyclotron.cpp:1403
double harm_m
Definition: Cyclotron.h:268
void setSuperpose(std::vector< bool > flag)
Definition: Cyclotron.cpp:235
double fmHighE_m
Definition: Cyclotron.h:280
void setMinR(double r)
Definition: Cyclotron.cpp:309
virtual double getTrimCoilThreshold() const
Definition: Cyclotron.cpp:167
double prinit_m
Definition: Cyclotron.h:258
void setRfPhi(std::vector< double > f)
Definition: Cyclotron.cpp:209
void setRFVCoeffFN(std::vector< std::string > rfv_coeff_fn)
Definition: Cyclotron.cpp:205
bool spiralFlag_m
Definition: Cyclotron.h:263
void setPZinit(double zinit)
Definition: Cyclotron.cpp:155
void setCyclotronType(const std::string &type)
Definition: Cyclotron.cpp:256
virtual void accept(BeamlineVisitor &) const
Apply visitor to Cyclotron.
Definition: Cyclotron.cpp:119
virtual double getPZinit() const
Definition: Cyclotron.cpp:159
double symmetry_m
Definition: Cyclotron.h:255
std::string typeName_m
Definition: Cyclotron.h:266
virtual std::string getFieldMapFN() const
Definition: Cyclotron.cpp:183
virtual double getRmin() const
Definition: Cyclotron.cpp:301
void read(const double &scaleFactor)
Definition: Cyclotron.cpp:773
int idx(int irad, int ktet)
Definition: Cyclotron.h:240
double phiinit_m
Definition: Cyclotron.h:259
virtual double getMaxR() const
Definition: Cyclotron.cpp:325
void setEScale(std::vector< double > bs)
Definition: Cyclotron.cpp:280
double zinit_m
Definition: Cyclotron.h:260
void setSymmetry(double symmetry)
Definition: Cyclotron.cpp:248
std::vector< bool > superpose_m
Definition: Cyclotron.h:253
virtual void finalise()
Definition: Cyclotron.cpp:567
virtual std::vector< double > getRfFrequ() const
Definition: Cyclotron.cpp:226
std::vector< double > escale_m
Definition: Cyclotron.h:252
std::vector< std::string > RFVCoeff_fn_m
Definition: Cyclotron.h:290
std::vector< double > rffrequ_m
Definition: Cyclotron.h:247
double maxz_m
Definition: Cyclotron.h:277
void getFieldFromFile_AVFEQ(const double &scaleFactor)
Definition: Cyclotron.cpp:1173
void setMaxR(double r)
Definition: Cyclotron.cpp:315
virtual double getRmax() const
Definition: Cyclotron.cpp:305
virtual double getFMHighE() const
Definition: Cyclotron.cpp:365
double gutdf5d(double *f, double dx, const int kor, const int krl, const int lpr)
Definition: Cyclotron.cpp:578
void setFieldMapFN(const std::string &fmapfn)
Definition: Cyclotron.cpp:179
double trimCoilThreshold_m
Definition: Cyclotron.h:264
virtual double getMaxZ() const
Definition: Cyclotron.cpp:345
void getdiffs()
Definition: Cyclotron.cpp:824
void setMaxZ(double z)
Definition: Cyclotron.cpp:339
virtual double getBScale() const
Definition: Cyclotron.cpp:276
void operator=(const Cyclotron &)=delete
virtual double getZinit() const
Definition: Cyclotron.cpp:151
void getFieldFromFile_Carbon(const double &scaleFactor)
Definition: Cyclotron.cpp:1263
void writeOutputFieldFiles()
Definition: Cyclotron.cpp:1497
virtual double getPHIinit() const
Definition: Cyclotron.cpp:143
std::vector< TrimCoil * > trimcoils_m
Definition: Cyclotron.h:272
std::vector< std::string > RFFCoeff_fn_m
Definition: Cyclotron.h:289
void setTrimCoils(const std::vector< TrimCoil * > &trimcoils)
Definition: Cyclotron.cpp:349
virtual double getSymmetry() const
Definition: Cyclotron.cpp:252
void setCyclHarm(double h)
Definition: Cyclotron.cpp:268
virtual double getMinZ() const
Definition: Cyclotron.cpp:335
void getFieldFromFile_Synchrocyclotron(const double &scaleFactor)
Definition: Cyclotron.cpp:1417
virtual std::vector< double > getRfPhi() const
Definition: Cyclotron.cpp:213
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
virtual ~Cyclotron()
Definition: Cyclotron.cpp:93
BFieldType getBFieldType() const
Definition: Cyclotron.cpp:389
double minz_m
Definition: Cyclotron.h:276
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
Definition: Cyclotron.cpp:941
double fmLowE_m
Definition: Cyclotron.h:279
void getFieldFromFile_FFA(const double &scaleFactor)
Definition: Cyclotron.cpp:1066
std::string fmapfn_m
Definition: Cyclotron.h:246
void initR(double rmin, double dr, int nrad)
Definition: Cyclotron.cpp:933
void setPHIinit(double phiinit)
Definition: Cyclotron.cpp:139
void setRfFrequ(std::vector< double > f)
Definition: Cyclotron.cpp:222
void setPRinit(double prinit)
Definition: Cyclotron.cpp:131
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
BFieldType fieldType_m
Definition: Cyclotron.h:244
double bscale_m
Definition: Cyclotron.h:270
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B)
Definition: Cyclotron.cpp:393
void setRfFieldMapFN(std::vector< std::string > rffmapfn)
Definition: Cyclotron.cpp:197
bool interpolate(const double &rad, const double &tet_rad, double &br, double &bt, double &bz)
Definition: Cyclotron.cpp:690
void setFMHighE(double e)
Definition: Cyclotron.cpp:361
std::vector< Fieldmap * > RFfields_m
Definition: Cyclotron.h:287
std::vector< double > rfphi_m
Definition: Cyclotron.h:251
std::vector< double > rfvrequ_m
Definition: Cyclotron.h:249
void setMinZ(double z)
Definition: Cyclotron.cpp:329
void setRinit(double rinit)
Definition: Cyclotron.cpp:123
int waitingGap_m
Definition: Cyclotron.h:295
double pzinit_m
Definition: Cyclotron.h:261
virtual std::vector< bool > getSuperpose() const
Definition: Cyclotron.cpp:239
double maxr_m
Definition: Cyclotron.h:275
BfieldData Bfield_m
Definition: Cyclotron.h:299
std::vector< std::vector< double > > rfvc_m
Definition: Cyclotron.h:250
std::vector< std::vector< double > > rffc_m
Definition: Cyclotron.h:248
BPositions BP_m
Definition: Cyclotron.h:302
virtual double getFMLowE() const
Definition: Cyclotron.cpp:357
std::unique_ptr< LossDataSink > lossDs_m
Definition: Cyclotron.h:292
unsigned int getNumberOfTrimcoils() const
Definition: Cyclotron.cpp:293
virtual double getRinit() const
Definition: Cyclotron.cpp:127
void getFieldFromFile_Ring(const double &scaleFactor)
Definition: Cyclotron.cpp:955
virtual double getMinR() const
Definition: Cyclotron.cpp:321
const std::string & getCyclotronType() const
Definition: Cyclotron.cpp:260
void setRFFCoeffFN(std::vector< std::string > rff_coeff_fn)
Definition: Cyclotron.cpp:201
void setFMLowE(double e)
Definition: Cyclotron.cpp:353
void setBScale(double bs)
Definition: Cyclotron.cpp:272
virtual double getSlices() const =0
Get number of slices.