OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
SBendRep.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: SBendRep.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.2.2.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: SBendRep
10 // Defines a concrete representation for a sector (curved) bend.
11 //
12 // ------------------------------------------------------------------------
13 // Class category: BeamlineCore
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2004/11/12 18:57:53 $
17 // $Author: adelmann $
18 //
19 // ------------------------------------------------------------------------
20 
21 #include "BeamlineCore/SBendRep.h"
26 #include <cctype>
27 
28 // Attribute access table.
29 // ------------------------------------------------------------------------
30 
31 namespace {
32  struct Entry {
33  const char *name;
34  double(SBendRep::*get)() const;
35  void (SBendRep::*set)(double);
36  };
37 
38  static const Entry entries[] = {
39  {
40  "L",
43  },
44  {
45  "BY",
48  },
49  {
50  "E1",
53  },
54  {
55  "E2",
58  },
59  {
60  "H1",
63  },
64  {
65  "H2",
68  },
69  { 0, 0, 0 }
70  };
71 }
72 
73 
74 // Class SBendRep
75 // ------------------------------------------------------------------------
76 
78  SBend(),
79  geometry(0.0, 0.0),
80  field() {
81  rEntry = rExit = hEntry = hExit = 0.0;
82 }
83 
84 
86  SBend(rhs),
87  geometry(rhs.geometry),
88  field(rhs.field) {
89  rEntry = rhs.rEntry;
90  rExit = rhs.hExit;
91  hEntry = rhs.rEntry;
92  hExit = rhs.hExit;
93 }
94 
95 
96 SBendRep::SBendRep(const std::string &name):
97  SBend(name),
98  geometry(0.0, 0.0),
99  field() {
100  rEntry = rExit = hEntry = hExit = 0.0;
101 }
102 
103 
105 {}
106 
107 
109  return new SBendRep(*this);
110 }
111 
112 
113 Channel *SBendRep::getChannel(const std::string &aKey, bool create) {
114  if(aKey[0] == 'a' || aKey[0] == 'b') {
115  int n = 0;
116 
117  for(std::string::size_type k = 1; k < aKey.length(); k++) {
118  if(isdigit(aKey[k])) {
119  n = 10 * n + aKey[k] - '0';
120  } else {
121  return 0;
122  }
123  }
124 
125  if(aKey[0] == 'b') {
126  return new IndexedChannel<SBendRep>
129  } else {
130  return new IndexedChannel<SBendRep>
133  }
134  } else {
135  for(const Entry *table = entries; table->name != 0; ++table) {
136  if(aKey == table->name) {
137  return new IndirectChannel<SBendRep>(*this, table->get, table->set);
138  }
139  }
140 
141  return ElementBase::getChannel(aKey, create);
142  }
143 }
144 
145 
147  return field;
148 }
149 
151  return field;
152 }
153 
154 
156  return geometry;
157 }
158 
160  return geometry;
161 }
162 
163 
166 
167  for(const Entry *table = entries; table->name != 0; ++table) {
168  image->setAttribute(table->name, (this->*(table->get))());
169  }
170 
171  for(int n = 1; n <= field.order(); n++) {
172  char buffer[20];
173  char *p = buffer;
174  int k = n;
175 
176  while(k != 0) {
177  *p++ = k % 10 + '0';
178  k /= 10;
179  }
180 
181  std::string name(" ");
182  while(p > buffer) name += *--p;
183 
184  double b = field.getNormalComponent(n);
185  if(b != 0.0) {
186  name[0] = 'b';
187  image->setAttribute(name, b);
188  }
189 
190  double a = field.getSkewComponent(n);
191  if(a != 0.0) {
192  name[0] = 'a';
193  image->setAttribute(name, a);
194  }
195  }
196 
197  return image;
198 }
199 
200 
201 double SBendRep::getB() const {
202  return field.getNormalComponent(1);
203 }
204 
205 void SBendRep::setB(double B) {
207 }
208 
209 
211  return rEntry;
212 }
213 
214 
216  return rExit;
217 }
218 
220  rEntry = e1;
221 }
222 
224  rExit = e2;
225 }
226 
228  return hEntry;
229 }
230 
232  return hExit;
233 }
234 
236  hEntry = h1;
237 }
238 
240  hExit = h2;
241 }
242 
243 
244 double SBendRep::getSlices() const {
245  return slices;
246 }
247 
248 double SBendRep::getStepsize() const {
249  return stepsize;
250 }
251 
252 void SBendRep::setSlices(double sl) {
253  slices = sl;
254 }
255 
256 void SBendRep::setStepsize(double ds) {
257  stepsize = ds;
258 }
259 
260 
262  field = f;
263 }
264 
265 
267  ElementBase *wrap = new SBendWrapper(this);
268  wrap->setName(getName());
269  return wrap;
270 }
double slices
Definition: SBendRep.h:167
Interface for basic beam line object.
Definition: ElementBase.h:128
virtual double getEntryFaceRotation() const
Get pole entry face rotation.
Definition: SBendRep.cpp:210
virtual double getSlices() const
Get number of slices.
Definition: SBendRep.cpp:244
virtual BMultipoleField & getField()
Get field.
Definition: SBendRep.cpp:146
virtual ElementImage * getImage() const
Construct an image.
Definition: SBendRep.cpp:164
void setNormalComponent(int n, double Bn)
Set component.
virtual ElementBase * clone() const
Return clone.
Definition: SBendRep.cpp:108
virtual void setExitFaceCurvature(double h2)
Set exit pole face curvature.
Definition: SBendRep.cpp:239
A simple arc in the XZ plane.
virtual void setName(const std::string &name)
Set element name.
virtual void setElementLength(double length)
Set design length.
Definition: ElementBase.h:515
virtual Channel * getChannel(const std::string &aKey, bool create=false)
Construct a read/write channel.
BMultipoleField field
The multipole expansion.
Definition: SBendRep.h:158
double getSkewComponent(int n) const
Get component.
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
double rEntry
Definition: SBendRep.h:161
double hEntry
Definition: SBendRep.h:163
void setNormalComponent(int, double)
Set normal component.
Definition: SBend.cpp:70
virtual double getStepsize() const
Get stepsize.
Definition: SBendRep.cpp:248
Access to an indexed [b]double[/b] data member.
virtual void setField(const BMultipoleField &field)
Set field.
Definition: SBendRep.cpp:261
virtual double getExitFaceCurvature() const
Get exit pole face curvature.
Definition: SBendRep.cpp:231
virtual Channel * getChannel(const std::string &aKey, bool=false)
Construct a read/write channel.
Definition: SBendRep.cpp:113
virtual PlanarArcGeometry & getGeometry()
Get geometry.
Definition: SBendRep.cpp:155
void setSkewComponent(int, double)
Set skew component.
Definition: SBend.cpp:74
virtual void setSlices(double sl)
Set number of slices.
Definition: SBendRep.cpp:252
virtual double getElementLength() const
Get design length.
Definition: ElementBase.h:511
double getNormalComponent(int n) const
Get component.
An image of an element.
Definition: ElementImage.h:35
virtual ElementImage * getImage() const
Construct an image.
void setAttribute(const std::string &aKey, double val)
Set value of an attribute.
virtual void setEntryFaceCurvature(double h1)
Set entry pole face curvature.
Definition: SBendRep.cpp:235
virtual ElementBase * makeFieldWrapper()
Allow field errors.
Definition: SBendRep.cpp:266
Definition: SBend.h:68
SBendRep()
Definition: SBendRep.cpp:77
virtual ~SBendRep()
Definition: SBendRep.cpp:104
Representation of a perturbed sector bend.
Definition: SBendWrapper.h:37
Abstract interface for read/write access to variable.
Definition: Channel.h:32
virtual double getExitFaceRotation() const
Get exit pole face rotation.
Definition: SBendRep.cpp:215
The magnetic field of a multipole.
virtual void setStepsize(double ds)
Set stepsize.
Definition: SBendRep.cpp:256
virtual double getEntryFaceCurvature() const
Get entry pole face curvature.
Definition: SBendRep.cpp:227
virtual void setExitFaceRotation(double e2)
Set exit pole face rotation.
Definition: SBendRep.cpp:223
double getNormalComponent(int) const
Get normal component.
Definition: SBend.cpp:62
const std::string name
PlanarArcGeometry geometry
The bend geometry.
Definition: SBendRep.h:155
virtual void setB(double By)
Set vertical component.
Definition: SBendRep.cpp:205
double hExit
Definition: SBendRep.h:164
double rExit
Definition: SBendRep.h:162
virtual double getB() const
Get field.
Definition: SBendRep.cpp:201
double stepsize
Definition: SBendRep.h:168
int order() const
Return order.
virtual void setEntryFaceRotation(double e1)
Set pole entry face rotation.
Definition: SBendRep.cpp:219
Access to a [b]double[/b] data member.
Representation for a sector bend magnet.
Definition: SBendRep.h:34
double getSkewComponent(int) const
Get skew component.
Definition: SBend.cpp:66