OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
OpalSextupole.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: OpalSextupole.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.2.4.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: OpalSextupole
10 // The class of OPAL Sextupoles.
11 //
12 // ------------------------------------------------------------------------
13 //
14 // $Date: 2002/12/09 15:06:08 $
15 // $Author: jsberg $
16 //
17 // ------------------------------------------------------------------------
18 
19 #include "Elements/OpalSextupole.h"
21 #include "Attributes/Attributes.h"
24 #include "Fields/BMultipoleField.h"
25 #include "Physics/Physics.h"
26 #include "Utilities/Options.h"
27 #include <cmath>
28 #include <iostream>
29 #include <sstream>
30 
31 
32 // Class OpalSextupole
33 // ------------------------------------------------------------------------
34 
36  OpalElement(SIZE, "SEXTUPOLE",
37  "The \"SEXTUPOLE\" element defines a Sextupole.") {
39  ("K2", "Normalised upright sextupole coefficient in m^(-3)");
41  ("DK2", "Normalised upright sextupole coefficient error in m^(-3)");
43  ("K2S", "Normalised skew sextupole coefficient in m^(-3)");
45  ("DK2S", "Normalised skew sextupole coefficient error in m^(-3)");
46 
48 
49  setElement((new MultipoleRep("SEXTUPOLE"))->makeWrappers());
50 }
51 
52 
53 OpalSextupole::OpalSextupole(const std::string &name, OpalSextupole *parent):
54  OpalElement(name, parent) {
55  setElement((new MultipoleRep(name))->makeWrappers());
56 }
57 
58 
60 {}
61 
62 
63 OpalSextupole *OpalSextupole::clone(const std::string &name) {
64  return new OpalSextupole(name, this);
65 }
66 
67 
68 
69 void OpalSextupole::print(std::ostream &os) const {
71 }
72 
73 
74 void OpalSextupole::
77 
78  // Get the desired field.
79  const MultipoleWrapper *mult =
80  dynamic_cast<const MultipoleWrapper *>(base.removeAlignWrapper());
81  BMultipoleField field;
82 
83  // Get the desired field.
84  if(flag == ERROR_FLAG) {
85  field = mult->errorField();
86  } else if(flag == ACTUAL_FLAG) {
87  field = mult->getField();
88  } else if(flag == IDEAL_FLAG) {
89  field = mult->getDesign().getField();
90  }
91 
92  double length = getLength();
93  double scale = Physics::c / OpalData::getInstance()->getP0();
94  if(length != 0.0) scale *= length;
95 
96  for(int order = 1; order <= field.order(); ++order) {
97  std::ostringstream ss;
98  ss << (order - 1) << std::ends;
99  std::string orderString = ss.str();
100 
101  std::string normName = "K" + orderString + "L";
102  registerRealAttribute(normName)->setReal(scale * field.normal(order));
103 
104  std::string skewName = "K" + orderString + "SL";
105  registerRealAttribute(skewName)->setReal(scale * field.skew(order));
106 
107  scale *= double(order);
108  }
109 }
110 
111 
114 
115  MultipoleRep *sext =
116  dynamic_cast<MultipoleRep *>(getElement()->removeWrappers());
118  double factor = OpalData::getInstance()->getP0() / (Physics::c * 2.0);
119  BMultipoleField field;
120  field.setNormalComponent(3, factor * Attributes::getReal(itsAttr[K2]));
121  field.setSkewComponent(3, factor * Attributes::getReal(itsAttr[K2S]));
122  sext->setField(field);
125 
126  // Transmit "unknown" attributes.
128 }
virtual ElementBase * removeAlignWrapper()
Remove align wrapper.
virtual ~OpalSextupole()
virtual const Multipole & getDesign() const
Get design corrector.
void setSkewComponent(int, double)
Set skew component.
Definition: Multipole.h:155
Interface for basic beam line object.
Definition: ElementBase.h:128
virtual void fillRegisteredAttributes(const ElementBase &, ValueFlag)
Fill in all registered attributes.
double normal(int) const
Get component.
virtual void setField(const BMultipoleField &field)
Set mulitpole field.
double getP0() const
Return value of global reference momentum.
Definition: OpalData.cpp:623
Representation for a general multipole.
Definition: MultipoleRep.h:31
virtual BMultipoleField & getField() override=0
Get multipole field.
ValueFlag
Switch for value desired on ATTLIST command.
Definition: OpalElement.h:71
void setNormalComponent(int n, double Bn)
Set component.
virtual BMultipoleField & getField()
Get field.
virtual ElementBase * removeWrappers()
Return the design element.
void setNormalComponent(int, double)
Set normal component.
Definition: Multipole.h:150
virtual void setElementLength(double length)
Set design length.
Definition: ElementBase.h:515
virtual double getLength() const
Return element length.
Representation of a perturbed multipole.
std::vector< Attribute > itsAttr
The object attributes (see Attribute.hh).
Definition: Object.h:214
virtual void print(std::ostream &) const
Print the sextupole.
The SEXTUPOLE element.
Definition: OpalSextupole.h:28
void setSkewComponent(int n, double Bn)
Set component.
static OpalData * getInstance()
Definition: OpalData.cpp:209
double skew(int) const
Get component.
OpalSextupole()
Exemplar constructor.
virtual void fillRegisteredAttributes(const ElementBase &, ValueFlag)
Fill in all registered attributes.
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
Base class for all beam line elements.
Definition: OpalElement.h:41
void setElement(ElementBase *)
Assign new CLASSIC element.
Definition: Element.h:133
void registerOwnership() const
virtual void update()
Update the embedded CLASSIC element.
virtual void updateUnknown(ElementBase *)
Transmit the ``unknown&#39;&#39; (not known to OPAL) attributes to CLASSIC.
ElementBase * getElement() const
Return the embedded CLASSIC element.
Definition: Element.h:128
virtual void update()
Update the embedded CLASSIC multipole.
The magnetic field of a multipole.
const std::string name
virtual OpalSextupole * clone(const std::string &name)
Make clone.
virtual BMultipoleField & errorField() const
Get multipole field error.
double getReal(const Attribute &attr)
Return real value.
Definition: Attributes.cpp:217
Attribute makeReal(const std::string &name, const std::string &help)
Make real attribute.
Definition: Attributes.cpp:205
static AttCell * registerRealAttribute(const std::string &name)
Register a ``real&#39;&#39; element attribute.
int order() const
Return order.
virtual void print(std::ostream &) const
Print the object.
virtual void setReal(double)
Store the value.
Definition: AttCell.cpp:34