OPAL (Object Oriented Parallel Accelerator Library) 2024.2
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#include "Fields/Definitions.h"
31
32#include <string>
33#include <vector>
34
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:
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(const 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 void setCyclotronType(const std::string& type);
121 const std::string& getCyclotronType() const;
122
123 void setBFieldType();
125
126 virtual ElementType getType() const;
127
128 virtual void getDimensions(double& zBegin, double& zEnd) const;
129
130 unsigned int getNumberOfTrimcoils() const;
131
132 void setCyclHarm(double h);
133 virtual double getCyclHarm() const;
134
135 void setRfPhi(std::vector<double> f);
136 virtual std::vector<double> getRfPhi() const;
137
138 void setRfFrequ(std::vector<double> f);
139 virtual std::vector<double> getRfFrequ() const;
140
141 void setSymmetry(double symmetry);
142 virtual double getSymmetry() const;
143
144 void setRinit(double rinit);
145 virtual double getRinit() const;
146
147 void setPRinit(double prinit);
148 virtual double getPRinit() const;
149
150 void setPHIinit(double phiinit);
151 virtual double getPHIinit() const;
152
153 void setZinit(double zinit);
154 virtual double getZinit() const;
155
156 void setPZinit(double zinit);
157 virtual double getPZinit() const;
158
159 void setBScale(double bs);
160 virtual double getBScale() const;
161
162 void setEScale(std::vector<double> bs);
163 virtual std::vector<double> getEScale() const;
164
165 void setTrimCoils(const std::vector<TrimCoil*>& trimcoils);
166
167 void setSuperpose(std::vector<bool> flag);
168 virtual std::vector<bool> getSuperpose() const;
169
170 void setMinR(double r);
171 virtual double getMinR() const;
172 void setMaxR(double r);
173 virtual double getMaxR() const;
174
175 void setMinZ(double z);
176 virtual double getMinZ() const;
177 void setMaxZ(double z);
178 virtual double getMaxZ() const;
179
180 void setFMLowE(double e);
181 virtual double getFMLowE() const;
182 void setFMHighE(double e);
183 virtual double getFMHighE() const;
184
185 void setTrimCoilThreshold(double);
186 virtual double getTrimCoilThreshold() const;
187
188 void setSpiralFlag(bool spiral_flag);
189 virtual bool getSpiralFlag() const;
190
191 virtual bool apply(const size_t& id, const double& t, Vector_t& E, Vector_t& B);
192
193 virtual bool apply(const Vector_t& R, const Vector_t& P, const double& t, Vector_t& E, Vector_t& B);
194
195 virtual void apply(const double& rad, const double& z,
196 const double& tet_rad, double& br,
197 double& bt, double& bz);
198
199 virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField);
200
201 virtual void initialise(PartBunchBase<double, 3>* bunch, const double& scaleFactor);
202
203 virtual void finalise();
204
205 virtual bool bends() const;
206
207 virtual double getRmax() const;
208 virtual double getRmin() const;
209
210 bool interpolate(const double& rad,
211 const double& tet_rad,
212 double& br,
213 double& bt,
214 double& bz);
215
216 void read(const double& scaleFactor);
217
219
220 void checkInitialReferenceParticle(double refR, double refTheta, double refZ);
221
222private:
224 void applyTrimCoil (const double r, const double z, const double tet_rad, double& br, double& bz);
226 void applyTrimCoil_m(const double r, const double z, const double tet_rad, double* br, double* bz);
227
228
229protected:
230 void getdiffs();
231 double gutdf5d(double* f, double dx, const int kor, const int krl, const int lpr);
232
233 void initR(double rmin, double dr, int nrad);
234
235 void getFieldFromFile_Ring(const double& scaleFactor);
236 void getFieldFromFile_Carbon(const double& scaleFactor);
237 void getFieldFromFile_CYCIAE(const double& scaleFactor);
238 void getFieldFromFile_AVFEQ(const double& scaleFactor);
239 void getFieldFromFile_FFA(const double& scaleFactor);
240 void getFieldFromFile_BandRF(const double& scaleFactor);
241 void getFieldFromFile_Synchrocyclotron(const double& scaleFactor);
242
243 inline int idx(int irad, int ktet) {return (ktet + Bfield_m.ntetS_m * irad);}
244
245
246private:
248
249 std::string fmapfn_m;
250 std::vector<double> rffrequ_m;
251 std::vector< std::vector<double> > rffc_m;
252 std::vector<double> rfvrequ_m;
253 std::vector< std::vector<double> > rfvc_m;
254 std::vector<double> rfphi_m;
255 std::vector<double> escale_m;
256 std::vector<bool> superpose_m;
257
259
260 double rinit_m;
261 double prinit_m;
262 double phiinit_m;
263 double zinit_m;
264 double pzinit_m;
265
268
269 std::string typeName_m;
270
271 double harm_m;
272
273 double bscale_m;
274
275 std::vector<TrimCoil*> trimcoils_m;
276
277 double minr_m;
278 double maxr_m;
279 double minz_m;
280 double maxz_m;
281
282 double fmLowE_m;
283 double fmHighE_m;
284
285 // Not implemented.
286 void operator=(const Cyclotron &) = delete;
287
288 // RF field map handler
289 // Fieldmap RFfield;
290 std::vector<Fieldmap> RFfields_m;
291 std::vector<std::string> RFfilename_m;
292 std::vector<std::string> RFFCoeff_fn_m;
293 std::vector<std::string> RFVCoeff_fn_m;
294
295 std::unique_ptr<LossDataSink> lossDs_m;
296
297 // Necessary for quick and dirty phase output -DW
299
300protected:
301 // object of Matrices including magnetic field map and its derivates
303
304 // object of parameters about the map grid
306};
307
308#endif // CLASSIC_Cyclotron_HH
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
double delr_m
Definition Cyclotron.h:70
std::vector< double > dbtt_m
Definition Cyclotron.h:42
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
double rmin_m
Definition Cyclotron.h:70
std::vector< double > dbttt_m
Definition Cyclotron.h:43
double dtet_m
Definition Cyclotron.h:71
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
double Bfact_m
Definition Cyclotron.h:77
std::vector< double > dbt_m
Definition Cyclotron.h:41
int ntetS_m
Definition Cyclotron.h:61
std::vector< double > bfld_m
Definition Cyclotron.h:40
std::vector< double > rarr_m
Definition Cyclotron.h:74
double dbtttmx_m
Definition Cyclotron.h:65
std::vector< double > f2_m
Definition Cyclotron.h:55
double dbttmx_m
Definition Cyclotron.h:65
double tetmin_m
Definition Cyclotron.h:71
ElementType
Definition ElementBase.h:88
const std::string name
Component(const std::string &name)
Constructor with given name.
Definition Component.cpp:53
virtual std::vector< double > getEScale() const
void setTrimCoilThreshold(double)
void setZinit(double zinit)
virtual double getStepsize() const =0
Get stepsize.
double minr_m
Definition Cyclotron.h:277
virtual double getCyclHarm() const
double rinit_m
Definition Cyclotron.h:260
void setBFieldType()
virtual void getDimensions(double &zBegin, double &zEnd) const
std::vector< std::string > RFfilename_m
Definition Cyclotron.h:291
virtual bool getSpiralFlag() const
virtual bool bends() const
void getFieldFromFile_CYCIAE(const double &scaleFactor)
void setSpiralFlag(bool spiral_flag)
virtual ElementType getType() const
Get element type std::string.
virtual double getPRinit() const
void getFieldFromFile_BandRF(const double &scaleFactor)
double harm_m
Definition Cyclotron.h:271
void setSuperpose(std::vector< bool > flag)
double fmHighE_m
Definition Cyclotron.h:283
void setMinR(double r)
virtual double getTrimCoilThreshold() const
double prinit_m
Definition Cyclotron.h:261
void checkInitialReferenceParticle(double refR, double refTheta, double refZ)
void setRfPhi(std::vector< double > f)
void setRFVCoeffFN(std::vector< std::string > rfv_coeff_fn)
bool spiralFlag_m
Definition Cyclotron.h:266
void setPZinit(double zinit)
void setCyclotronType(const std::string &type)
virtual void accept(BeamlineVisitor &) const
Apply visitor to Cyclotron.
virtual double getPZinit() const
double symmetry_m
Definition Cyclotron.h:258
std::string typeName_m
Definition Cyclotron.h:269
virtual std::string getFieldMapFN() const
virtual double getRmin() const
void read(const double &scaleFactor)
int idx(int irad, int ktet)
Definition Cyclotron.h:243
double phiinit_m
Definition Cyclotron.h:262
virtual double getMaxR() const
void setEScale(std::vector< double > bs)
double zinit_m
Definition Cyclotron.h:263
void setSymmetry(double symmetry)
std::vector< bool > superpose_m
Definition Cyclotron.h:256
virtual void finalise()
virtual std::vector< double > getRfFrequ() const
std::vector< double > escale_m
Definition Cyclotron.h:255
std::vector< std::string > RFVCoeff_fn_m
Definition Cyclotron.h:293
std::vector< double > rffrequ_m
Definition Cyclotron.h:250
double maxz_m
Definition Cyclotron.h:280
void getFieldFromFile_AVFEQ(const double &scaleFactor)
void setMaxR(double r)
virtual double getRmax() const
virtual double getFMHighE() const
double gutdf5d(double *f, double dx, const int kor, const int krl, const int lpr)
void setFieldMapFN(const std::string &fmapfn)
double trimCoilThreshold_m
Definition Cyclotron.h:267
virtual double getMaxZ() const
void getdiffs()
void setMaxZ(double z)
virtual double getBScale() const
void operator=(const Cyclotron &)=delete
virtual double getZinit() const
void getFieldFromFile_Carbon(const double &scaleFactor)
void writeOutputFieldFiles()
virtual double getPHIinit() const
std::vector< TrimCoil * > trimcoils_m
Definition Cyclotron.h:275
std::vector< std::string > RFFCoeff_fn_m
Definition Cyclotron.h:292
void setTrimCoils(const std::vector< TrimCoil * > &trimcoils)
virtual double getSymmetry() const
void setCyclHarm(double h)
virtual double getMinZ() const
void getFieldFromFile_Synchrocyclotron(const double &scaleFactor)
virtual std::vector< double > getRfPhi() const
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
double minz_m
Definition Cyclotron.h:279
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
Cyclotron(const std::string &name)
Constructor with given name.
Definition Cyclotron.cpp:89
double fmLowE_m
Definition Cyclotron.h:282
void getFieldFromFile_FFA(const double &scaleFactor)
std::string fmapfn_m
Definition Cyclotron.h:249
void initR(double rmin, double dr, int nrad)
void setPHIinit(double phiinit)
void setRfFrequ(std::vector< double > f)
void setPRinit(double prinit)
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.
BFieldType fieldType_m
Definition Cyclotron.h:247
double bscale_m
Definition Cyclotron.h:273
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B)
void setRfFieldMapFN(std::vector< std::string > rffmapfn)
bool interpolate(const double &rad, const double &tet_rad, double &br, double &bt, double &bz)
void setFMHighE(double e)
std::vector< double > rfphi_m
Definition Cyclotron.h:254
std::vector< double > rfvrequ_m
Definition Cyclotron.h:252
void setMinZ(double z)
void setRinit(double rinit)
int waitingGap_m
Definition Cyclotron.h:298
double pzinit_m
Definition Cyclotron.h:264
virtual std::vector< bool > getSuperpose() const
double maxr_m
Definition Cyclotron.h:278
BfieldData Bfield_m
Definition Cyclotron.h:302
std::vector< std::vector< double > > rfvc_m
Definition Cyclotron.h:253
std::vector< std::vector< double > > rffc_m
Definition Cyclotron.h:251
BPositions BP_m
Definition Cyclotron.h:305
std::vector< Fieldmap > RFfields_m
Definition Cyclotron.h:290
virtual double getFMLowE() const
std::unique_ptr< LossDataSink > lossDs_m
Definition Cyclotron.h:295
unsigned int getNumberOfTrimcoils() const
virtual double getRinit() const
void getFieldFromFile_Ring(const double &scaleFactor)
virtual double getMinR() const
const std::string & getCyclotronType() const
void setRFFCoeffFN(std::vector< std::string > rff_coeff_fn)
void setFMLowE(double e)
void setBScale(double bs)
virtual double getSlices() const =0
Get number of slices.
Vektor< double, 3 > Vector_t