OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Solenoid.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: Solenoid.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.1.1.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: Solenoid
10 // Defines the abstract interface for a solenoid magnet.
11 //
12 // ------------------------------------------------------------------------
13 // Class category: AbsBeamline
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2000/03/27 09:32:32 $
17 // $Author: fci $
18 //
19 // ------------------------------------------------------------------------
20 
21 #include "AbsBeamline/Solenoid.h"
24 #include "Fields/Fieldmap.h"
25 #include "Physics/Physics.h"
26 
27 #include <iostream>
28 #include <fstream>
29 
30 extern Inform *gmsg;
31 
32 // Class Solenoid
33 // ------------------------------------------------------------------------
34 
36  Solenoid("")
37 {}
38 
39 
41  Component(right),
42  filename_m(right.filename_m),
43  myFieldmap_m(right.myFieldmap_m),
44  scale_m(right.scale_m),
45  scaleError_m(right.scaleError_m),
46  startField_m(right.startField_m),
47  length_m(right.length_m),
48  fast_m(right.fast_m) {
50 }
51 
52 
53 Solenoid::Solenoid(const std::string &name):
54  Component(name),
55  filename_m(""),
56  myFieldmap_m(NULL),
57  scale_m(1.0),
58  scaleError_m(0.0),
59  startField_m(0.0),
60  length_m(0.0),
61  fast_m(true) {
63 }
64 
65 
67  // Fieldmap::deleteFieldmap(filename_m);
68 }
69 
70 
71 void Solenoid::accept(BeamlineVisitor &visitor) const {
72  visitor.visitSolenoid(*this);
73 }
74 
75 void Solenoid::setFieldMapFN(std::string fn) {
76  filename_m = fn;
77 }
78 
79 void Solenoid::setFast(bool fast) {
80  fast_m = fast;
81 }
82 
83 
84 bool Solenoid::getFast() const {
85  return fast_m;
86 }
87 
93 void Solenoid::addKR(int i, double t, Vector_t &K) {
94  Inform msg("Solenoid::addKR()");
95 
96  double pz = RefPartBunch_m->getZ(i) - startField_m;
97  if (pz < 0.0 ||
98  pz >= length_m) return;
99 
100  Vector_t tmpE(0.0, 0.0, 0.0);
101  Vector_t tmpB(0.0, 0.0, 0.0);
102  const Vector_t tmpA(RefPartBunch_m->getX(i), RefPartBunch_m->getY(i), pz);
103 
104  myFieldmap_m->getFieldstrength(tmpA, tmpE, tmpB);
105  double k = Physics::q_e * scale_m * tmpB(2) / (2.0 * Physics::EMASS * RefPartBunch_m->getGamma(i));
106  k *= k;
107  K += Vector_t(k, k, 0.0);
108 }
109 
115 void Solenoid::addKT(int i, double t, Vector_t &K) {
116  Inform msg("Solenoid::addKT()");
117  double dbdz, emg;
118 
119  double pz = RefPartBunch_m->getZ(i) - startField_m;
120  if (pz < 0.0 ||
121  pz >= length_m) return;
122 
123  Vector_t tmpE(0.0, 0.0, 0.0);
124  Vector_t tmpB(0.0, 0.0, 0.0);
125  Vector_t tmpE_diff(0.0, 0.0, 0.0);
126  Vector_t tmpB_diff(0.0, 0.0, 0.0);
127  const Vector_t tmpA(RefPartBunch_m->getX(i), RefPartBunch_m->getY(i), pz);
128 
129  // define z direction:
130  DiffDirection zdir(DZ);
131 
132  myFieldmap_m->getFieldstrength(tmpA, tmpE, tmpB);
133 
134  // get derivation of B in z-direction
135  myFieldmap_m->getFieldDerivative(tmpA, tmpE_diff, tmpB_diff, zdir);
136 
137  double bz = scale_m * tmpB(2);
138  double g = RefPartBunch_m->getGamma(i);
139 
140  //FIXME?: BET: dz = z - z0,
141  dbdz = scale_m * tmpB_diff(2) * RefPartBunch_m->getBeta(i) * Physics::c;
142  emg = Physics::q_e / (g * Physics::EMASS);
143 
150  double dx = RefPartBunch_m->getX0(i);
151  double dy = RefPartBunch_m->getY0(i);
152 
153  //FIXME: Py0, Px0?
154  Vector_t temp(emg * (bz * (RefPartBunch_m->getPy0(i)) + dbdz * dy),
155  -emg * (bz * (RefPartBunch_m->getPx0(i)) + dbdz * dx),
156  0.0);
157 
158  K += temp;
159 }
160 
161 bool Solenoid::apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) {
162  return apply(RefPartBunch_m->R[i], RefPartBunch_m->P[i], t, E, B);
163 }
164 
165 bool Solenoid::apply(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) {
166  const Vector_t tmpR(R(0), R(1), R(2) - startField_m);
167  Vector_t tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
168 
169  if (tmpR(2) >= 0.0 && tmpR(2) < length_m) {
170  const bool out_of_bounds = myFieldmap_m->getFieldstrength(tmpR, tmpE, tmpB);
171  if (out_of_bounds) return true;
172 
173  B += (scale_m + scaleError_m) * tmpB;
174  }
175 
176  return false;
177 }
178 
179 bool Solenoid::applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) {
180  const Vector_t tmpR(R(0), R(1), R(2) - startField_m);
181  Vector_t tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
182 
183  if (tmpR(2) >= 0.0 && tmpR(2) < length_m) {
184  const bool out_of_bounds = myFieldmap_m->getFieldstrength(tmpR, tmpE, tmpB);
185  if (out_of_bounds) return true;
186 
187  B += scale_m * tmpB;
188  }
189 
190  return false;
191 }
192 
193 void Solenoid::initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField) {
194  Inform msg("Solenoid ", *gmsg);
195 
196  RefPartBunch_m = bunch;
197 
199 
200  if(myFieldmap_m != NULL) {
201  msg << level2 << getName() << " using file ";
202  myFieldmap_m->getInfo(&msg);
203 
204  double zBegin = 0.0, zEnd = 0.0, rBegin = 0.0, rEnd = 0.0;
205  myFieldmap_m->getFieldDimensions(zBegin, zEnd, rBegin, rEnd);
206 
207  startField_m = zBegin;
208  length_m = zEnd - zBegin;
209  endField = startField + length_m;
210  } else {
211  endField = startField;
212  }
213 }
214 
216 {}
217 
218 bool Solenoid::bends() const {
219  return false;
220 }
221 
222 
223 void Solenoid::goOnline(const double &) {
225  online_m = true;
226 }
227 
230  online_m = false;
231 }
232 
233 void Solenoid::setKS(double ks) {
234  scale_m = ks;
235 }
236 
237 void Solenoid::setDKS(double ks) {
238  scaleError_m = ks;
239 }
240 
241 void Solenoid::getDimensions(double &zBegin, double &zEnd) const {
242  zBegin = startField_m;
243  zEnd = startField_m + length_m;
244 }
245 
246 
248  return SOLENOID;
249 }
250 
251 bool Solenoid::isInside(const Vector_t &r) const {
252  return (r(2) >= startField_m && r(2) < startField_m + length_m && isInsideTransverse(r) && myFieldmap_m->isInside(r));
253 }
254 
255 
257  return length_m;
258 }
259 
261  double &end) const {
262  begin = startField_m;
263  end = begin + length_m;
264 }
virtual double getPy0(int i)
ParticleAttrib< Vector_t > P
virtual void getInfo(Inform *msg)=0
virtual void freeMap()=0
virtual bool isInside(const Vector_t &r) const override
Definition: Solenoid.cpp:251
double scaleError_m
Definition: Solenoid.h:102
virtual void readMap()=0
virtual bool bends() const override
Definition: Solenoid.cpp:218
DiffDirection
Definition: Fieldmap.h:54
virtual bool isInside(const Vector_t &r) const
Definition: Fieldmap.h:203
bool getFast() const
Definition: Solenoid.cpp:84
Inform * gmsg
Definition: Main.cpp:21
bool online_m
Definition: Component.h:201
virtual void getFieldDimensions(double &zBegin, double &zEnd, double &rBegin, double &rEnd) const =0
double length_m
Definition: Solenoid.h:105
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
virtual void visitSolenoid(const Solenoid &)=0
Apply the algorithm to a solenoid.
void setKS(double ks)
Definition: Solenoid.cpp:233
static Fieldmap * getFieldmap(std::string Filename, bool fast=false)
Definition: Fieldmap.cpp:46
virtual double getY(int i)
virtual double getElementLength() const override
Get design length.
Definition: Solenoid.cpp:256
Inform & level2(Inform &inf)
Definition: Inform.cpp:46
Solenoid()
Definition: Solenoid.cpp:35
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const =0
virtual double getGamma(int i)
virtual void finalise() override
Definition: Solenoid.cpp:215
bool fast_m
Definition: Solenoid.h:107
void setElType(ElemType elt)
set the element type as enumeration needed in the envelope tracker
Definition: ElementBase.h:591
void setFast(bool fast)
Definition: Solenoid.cpp:79
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition: Solenoid.cpp:241
virtual double getBeta(int i)
double scale_m
Definition: Solenoid.h:101
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
virtual double getY0(int i)
virtual void addKR(int i, double t, Vector_t &K) override
ENVELOPE COMPONENT for radial focussing of the beam Calculates the transverse envelope component for ...
Definition: Solenoid.cpp:93
PartBunchBase< double, 3 > * RefPartBunch_m
Definition: Component.h:200
virtual void goOnline(const double &kineticEnergy) override
Definition: Solenoid.cpp:223
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
Interface for solenoids.
Definition: Solenoid.h:36
void setFieldMapFN(std::string fn)
Definition: Solenoid.cpp:75
virtual void goOffline() override
Definition: Solenoid.cpp:228
virtual double getPx0(int i)
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Definition: Solenoid.cpp:179
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Definition: Solenoid.cpp:161
virtual void getElementDimensions(double &zBegin, double &zEnd) const override
Definition: Solenoid.cpp:260
Definition: Fieldmap.h:57
void setDKS(double ks)
Definition: Solenoid.cpp:237
virtual double getX0(int i)
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition: Solenoid.cpp:193
constexpr double q_e
The elementary charge in As.
Definition: Physics.h:76
const std::string name
Fieldmap * myFieldmap_m
Definition: Solenoid.h:100
virtual void accept(BeamlineVisitor &) const override
Apply visitor to Solenoid.
Definition: Solenoid.cpp:71
virtual double getZ(int i)
ParticlePos_t & R
constexpr double EMASS
Definition: Physics.h:140
bool isInsideTransverse(const Vector_t &r, double f=1) const
Definition: ElementBase.h:645
Interface for a single beam element.
Definition: Component.h:51
virtual double getX(int i)
#define K
Definition: integrate.cpp:118
Abstract algorithm.
Definition: Inform.h:41
double startField_m
Definition: Solenoid.h:104
virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const =0
virtual ~Solenoid()
Definition: Solenoid.cpp:66
std::string filename_m
Definition: Solenoid.h:99
virtual void addKT(int i, double t, Vector_t &K) override
Definition: Solenoid.cpp:115
virtual ElementBase::ElementType getType() const override
Get element type std::string.
Definition: Solenoid.cpp:247