OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
CyclotronValley.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: CyclotronValley.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.1.1.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: CyclotronValley
10 // Defines the abstract interface for an accelerating structure.
11 //
12 // ------------------------------------------------------------------------
13 // Class category: AbsBeamline
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2000/03/27 09:32:31 $
17 // $Author: fci $
18 //
19 // ------------------------------------------------------------------------
20 
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 CyclotronValley
33 // ------------------------------------------------------------------------
34 
36  CyclotronValley("")
37 {}
38 
39 
41  Component(right),
42  filename_m(right.filename_m),
43  fieldmap_m(right.fieldmap_m),
44  scale_m(right.scale_m),
45  ElementEdge_m(right.ElementEdge_m),
46  startField_m(right.startField_m),
47  endField_m(right.endField_m),
48  fast_m(right.fast_m) {
49  setElType(isRF);
50 }
51 
52 
54  Component(name),
55  filename_m(""),
56  fieldmap_m(NULL),
57  scale_m(1.0),
58  ElementEdge_m(0.0),
59  startField_m(0.0),
60  endField_m(0.0),
61  fast_m(false) {
62  setElType(isRF);
63 }
64 
65 
67  // Fieldmap::deleteFieldmap(filename_m);
68  /*if(RNormal_m) {
69  delete[] RNormal_m;
70  delete[] VrNormal_m;
71  delete[] DvDr_m;
72  }*/
73 }
74 
75 
77  visitor.visitCyclotronValley(*this);
78 }
79 
80 void CyclotronValley::setFieldMapFN(std::string fn) {
81  filename_m = fn;
82 }
83 
84 std::string CyclotronValley::getFieldMapFN() const {
85  return filename_m;
86 }
87 
88 void CyclotronValley::setFast(bool fast) {
89  fast_m = fast;
90 }
91 
92 
94  return fast_m;
95 }
96 
97 bool CyclotronValley::apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) {
98 
99  const Vector_t tmpR = RefPartBunch_m->R[i];
100  return applyToReferenceParticle(tmpR, RefPartBunch_m->P[i], t, E, B);
101 }
102 
103 bool CyclotronValley::apply(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) {
104 
105  const Vector_t tmpR = R;
106  return applyToReferenceParticle(tmpR, P, t, E, B);
107 }
108 
109 bool CyclotronValley::applyToReferenceParticle(const Vector_t &tmpR, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) {
110  Vector_t tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
111 
112  if(!fieldmap_m->getFieldstrength(tmpR, tmpE, tmpB)) {
113  B +=scale_m * tmpB;
114  return false;
115  }
116  return true;
117 }
118 
119 void CyclotronValley::initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField) {// called by ParallelTTracker::visitCyclotronValley --> OpalBeamline::visit
120  Inform msg("CyclotronValley ");
121  RefPartBunch_m = bunch;
122 
124  if(fieldmap_m != NULL) {
125  double zBegin = 0.0, zEnd = 0.0, rBegin = 0.0, rEnd = 0.0;
126  fieldmap_m->getFieldDimensions(zBegin, zEnd, rBegin, rEnd);
127  if(zEnd > zBegin) {
128  msg << getName() << " using file: " << " ";
129  fieldmap_m->getInfo(&msg);
130 
131  ElementEdge_m = startField;
132  startField_m = startField = ElementEdge_m + zBegin;
133  endField_m = endField = ElementEdge_m + zEnd;
134 
135  } else {
136  endField = startField - 1e-3;
137  }
138  } else {
139  endField = startField - 1e-3;
140  }
141 }
142 
143 
145 {}
146 
148  return false;
149 }
150 
151 
152 void CyclotronValley::goOnline(const double &) {
154  online_m = true;
155 }
156 
159  online_m = false;
160 }
161 
162 
163 
164 
165 
166 void CyclotronValley::getDimensions(double &zBegin, double &zEnd) const {
167  zBegin = startField_m;
168  zEnd = endField_m;
169 }
170 
171 
173  return CYCLOTRONVALLEY;
174 }
ParticleAttrib< Vector_t > P
void setFast(bool fast)
virtual void getInfo(Inform *msg)=0
virtual void freeMap()=0
bool getFast() const
virtual void goOffline()
constexpr double e
The value of .
Definition: Physics.h:40
std::string getFieldMapFN() const
virtual void readMap()=0
std::string filename_m
virtual void finalise()
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
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
virtual void getDimensions(double &zBegin, double &zEnd) const
static Fieldmap * getFieldmap(std::string Filename, bool fast=false)
Definition: Fieldmap.cpp:46
virtual ~CyclotronValley()
ElementBase::ElementType getType() const
Get element type std::string.
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const =0
virtual bool bends() const
virtual void accept(BeamlineVisitor &) const
Apply visitor to CyclotronValley.
virtual void visitCyclotronValley(const CyclotronValley &)=0
Apply the algorithm to a CyclotronValley.
void setElType(ElemType elt)
set the element type as enumeration needed in the envelope tracker
Definition: ElementBase.h:591
PartBunchBase< double, 3 > * RefPartBunch_m
Definition: Component.h:200
Interface for cyclotron valley.
void setFieldMapFN(std::string fmapfn)
Set the name of the field map.
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
const std::string name
Fieldmap * fieldmap_m
ParticlePos_t & R
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B)
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B)
Interface for a single beam element.
Definition: Component.h:51
Abstract algorithm.
Definition: Inform.h:41
virtual void goOnline(const double &kineticEnergy)