OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
RBend.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: RBend.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.1.1.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: RBend
10 // Defines the abstract interface for a rectangular bend magnet.
11 //
12 // ------------------------------------------------------------------------
13 // Class category: AbsBeamline
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2000/03/27 09:32:31 $
17 // $Author: fci $
18 //
19 // ------------------------------------------------------------------------
20 
21 #include "AbsBeamline/RBend.h"
24 #include "Utilities/Options.h"
25 #include "Fields/Fieldmap.h"
27 #include <iostream>
28 #include <fstream>
29 
30 extern Inform *gmsg;
31 
32 // Class RBend
33 // ------------------------------------------------------------------------
34 
36  RBend("")
37 {}
38 
39 RBend::RBend(const RBend &right):
40  Bend2D(right)
41 {
42  setMessageHeader("RBend ");
43 }
44 
45 RBend::RBend(const std::string &name):
46  Bend2D(name)
47 {
48  setMessageHeader("RBend ");
49 }
50 
52 }
53 
54 void RBend::accept(BeamlineVisitor &visitor) const {
55  visitor.visitRBend(*this);
56 }
57 
58 /*
59  * OPAL-MAP methods
60  * ================
61  */
62 double RBend::getNormalComponent(int n) const {
63  return getField().getNormalComponent(n);
64 }
65 
66 double RBend::getSkewComponent(int n) const {
67  return getField().getSkewComponent(n);
68 }
69 
70 void RBend::setNormalComponent(int n, double v) {
72 }
73 
74 void RBend::setSkewComponent(int n, double v) {
75  getField().setSkewComponent(n, v);
76 }
77 
78 /*
79  * BET methods.
80  */
81 void RBend::addKR(int i, double t, Vector_t &K) {
82  Inform msg("RBend::addK()");
83 
84  Vector_t tmpE(0.0, 0.0, 0.0);
85  Vector_t tmpB(0.0, 0.0, 0.0);
86  Vector_t tmpE_diff(0.0, 0.0, 0.0);
87  Vector_t tmpB_diff(0.0, 0.0, 0.0);
88  double pz = RefPartBunch_m->getZ(i) - getStartField();
89  const Vector_t tmpA(RefPartBunch_m->getX(i), RefPartBunch_m->getY(i), pz);
90 
91  DiffDirection zdir(DZ);
92  getFieldmap()->getFieldstrength(tmpA, tmpE, tmpB);
93  getFieldmap()->getFieldDerivative(tmpA, tmpE_diff, tmpB_diff, zdir);
94 
95  double g = RefPartBunch_m->getGamma(i);
96 
97  if(std::abs(getFieldAmplitude() * tmpB_diff(2)) > 0.1) {
98  double cf = Physics::q_e * tmpB(2) / (g * Physics::EMASS);
99  K += Vector_t(-pow(cf * getFieldAmplitude() * tmpB(0), 2) / 3.0, -pow(cf * getFieldAmplitude() * tmpB(1), 2) / 3.0, 0.0);
100  }
101 }
102 
103 void RBend::addKT(int i, double t, Vector_t &K) {
104  Inform msg("RBend::addK()");
105 
106  Vector_t tmpE(0.0, 0.0, 0.0);
107  Vector_t tmpB(0.0, 0.0, 0.0);
108  double pz = RefPartBunch_m->getZ(i) - getStartField();
109  const Vector_t tmpA(RefPartBunch_m->getX(i), RefPartBunch_m->getY(i), pz);
110  getFieldmap()->getFieldstrength(tmpA, tmpE, tmpB);
111 
112  double b = RefPartBunch_m->getBeta(i);
113  double g = 1 / sqrt(1 - b * b);
114 
115  double cf = -Physics::q_e * Physics::c * b * tmpB(2) * getFieldAmplitude() / (g * Physics::EMASS);
116  Vector_t temp(cf * tmpB(1), cf * tmpB(0), 0.0);
117 
118  //FIXME: K += ??
119 }
120 
121 
122 /*
123  * OPAL-T Methods.
124  * ===============
125  */
126 
127 /*
128  * This function merely repackages the field arrays as type Vector_t and calls
129  * the equivalent method but with the Vector_t data types.
130  */
131 
133  return RBEND;
134 }
135 
136 void RBend::setBendAngle(double angle) {
137  Bend2D::setBendAngle(angle);
138  setExitAngle(angle - getEntranceAngle());
139 }
140 
141 void RBend::setEntranceAngle(double entranceAngle) {
142  Bend2D::setEntranceAngle(entranceAngle);
143  setExitAngle(getBendAngle() - entranceAngle);
144 }
145 
147  double &chordLength) {
148 
149  /*
150  * Find bend chord length. If this was not set by the user using the
151  * L (length) attribute, infer it from the field map.
152  */
153  const double angle = getBendAngle();
154  if (std::abs(angle) > 0.0) {
155  double E1 = std::copysign(1.0, angle) * getEntranceAngle();
156  chordLength = 2 * getLength() * sin(0.5 * std::abs(angle)) /
157  (sin(E1) + sin(std::abs(angle) - E1));
158  } else {
159  double refMass = RefPartBunch_m->getM();
160  double refGamma = designEnergy_m / refMass + 1.0;
161  double refBetaGamma = sqrt(pow(refGamma, 2.0) - 1.0);
162  double refCharge = RefPartBunch_m->getQ();
163  double amplitude = (std::abs(bY_m) > 0.0? bY_m: bX_m);
164  double fieldAmplitude = refCharge * std::abs(amplitude / refCharge);
165  double designRadius = std::abs(refBetaGamma * refMass / (Physics::c * fieldAmplitude));
166  chordLength = sin(0.5 * (asin(getLength() / designRadius - sin(getEntranceAngle())) + getEntranceAngle())) * 2 * designRadius;
167  }
168 
169  return true;
170 }
virtual void setEntranceAngle(double entranceAngle) override
Definition: RBend.cpp:141
virtual bool findChordLength(Inform &msg, double &chordLength) override
Definition: RBend.cpp:146
virtual BMultipoleField & getField() override=0
Get multipole expansion of field.
double getNormalComponent(int) const
Get normal component.
Definition: RBend.cpp:62
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
virtual ElementBase::ElementType getType() const override
Get element type std::string.
Definition: RBend.cpp:132
DiffDirection
Definition: Fieldmap.h:54
void setNormalComponent(int n, double Bn)
Set component.
Tps< T > sin(const Tps< T > &x)
Sine.
Definition: TpsMath.h:111
PETE_TBTree< FnCopysign, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > copysign(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
double getStartField() const
Definition: Bend2D.h:345
virtual void setBendAngle(double angle) override
Definition: RBend.cpp:136
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RBend.
Definition: RBend.cpp:54
Inform * gmsg
Definition: Main.cpp:21
double getM() const
Definition: RBend.h:73
double bX_m
Definition: BendBase.h:52
double getSkewComponent(int n) const
Get component.
virtual double getY(int i)
void setSkewComponent(int n, double Bn)
Set component.
void setSkewComponent(int, double)
Set skew component.
Definition: RBend.cpp:74
virtual void setEntranceAngle(double entranceAngle)
Definition: BendBase.h:91
double getBendAngle() const
Definition: BendBase.h:86
void setExitAngle(double exitAngle)
Definition: Bend2D.h:363
virtual void setBendAngle(double angle)
Definition: BendBase.h:81
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const =0
virtual void addKR(int i, double t, Vector_t &K) override
Definition: RBend.cpp:81
virtual double getGamma(int i)
virtual void addKT(int i, double t, Vector_t &K) override
Definition: RBend.cpp:103
virtual double getBeta(int i)
double getNormalComponent(int n) const
Get component.
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
Definition: Bend2D.h:51
PartBunchBase< double, 3 > * RefPartBunch_m
Definition: Component.h:200
virtual void visitRBend(const RBend &)=0
Apply the algorithm to a rectangular bend.
double getFieldAmplitude() const
Definition: BendBase.h:131
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Definition: TpsMath.h:76
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
Definition: Fieldmap.h:57
double getSkewComponent(int) const
Get skew component.
Definition: RBend.cpp:66
double getLength() const
Definition: BendBase.h:70
constexpr double q_e
The elementary charge in As.
Definition: Physics.h:76
double getQ() const
Access to reference data.
const std::string name
double designEnergy_m
Definition: BendBase.h:47
virtual double getZ(int i)
PETE_TUTree< FnArcSin, typename T::PETE_Expr_t > asin(const PETE_Expr< T > &l)
Definition: PETE.h:809
constexpr double EMASS
Definition: Physics.h:140
RBend()
Definition: RBend.cpp:35
void setNormalComponent(int, double)
Set normal component.
Definition: RBend.cpp:70
double getEntranceAngle() const
Definition: BendBase.h:97
virtual double getX(int i)
#define K
Definition: integrate.cpp:118
Abstract algorithm.
Definition: Inform.h:41
Fieldmap * getFieldmap()
Definition: Bend2D.h:351
virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const =0
double bY_m
Definition: BendBase.h:53
void setMessageHeader(const std::string &header)
Definition: Bend2D.h:339
virtual ~RBend()
Definition: RBend.cpp:51