OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
BMultipoleField.cpp
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2// $RCSfile: BMultipoleField.cpp,v $
3// ------------------------------------------------------------------------
4// $Revision: 1.1.1.1 $
5// ------------------------------------------------------------------------
6// Copyright: see Copyright.readme
7// ------------------------------------------------------------------------
8//
9// Class: BMultipoleField
10// The static magnetic field of a multipole.
11//
12// ------------------------------------------------------------------------
13// Class category: Fields
14// ------------------------------------------------------------------------
15//
16// $Date: 2000/03/27 09:32:35 $
17// $Author: fci $
18//
19// ------------------------------------------------------------------------
20
22#include <complex>
24
25// Class BMultipoleField::Pair, inline functions.
26// ------------------------------------------------------------------------
27// These functions are used only within member functions of BMultipoleField
28// and can be safely inlined.
29
30inline BMultipoleField::Pair::Pair() { B = A = 0.0; }
31
32inline BMultipoleField::Pair::Pair(double normal, double skewed) {
33 B = normal;
34 A = skewed;
35}
36
38 B = rhs.B;
39 A = rhs.A;
40}
41
43
44inline void BMultipoleField::Pair::operator=(const Pair& rhs) {
45 B = rhs.B;
46 A = rhs.A;
47}
48
50 return Pair(B + rhs.B, A + rhs.A);
51}
52
54 return Pair(B - rhs.B, A - rhs.A);
55}
56
58 return Pair(B * scale, A * scale);
59}
60
61inline void BMultipoleField::Pair::operator+=(const Pair& rhs) {
62 B += rhs.B;
63 A += rhs.A;
64}
65
66inline void BMultipoleField::Pair::operator-=(const Pair& rhs) {
67 B -= rhs.B;
68 A -= rhs.A;
69}
70
72 B *= scale;
73 A *= scale;
74}
75
77
78// Class BMultipoleField
79// ------------------------------------------------------------------------
80
82
84 : pairs(nullptr), itsOrder(rhs.itsOrder) {
85 if (itsOrder > 0) pairs = new Pair[itsOrder];
86
87 for (int i = 0; i < itsOrder; i++) {
88 pairs[i] = rhs.pairs[i];
89 }
90}
91
93
95 if (&rhs != this) {
96 delete[] pairs;
97
98 if (rhs.itsOrder > 0) pairs = new Pair[rhs.itsOrder];
99 itsOrder = rhs.itsOrder;
100
101 for (int i = 0; i < itsOrder; i++) {
102 pairs[i] = rhs.pairs[i];
103 }
104 }
105
106 return *this;
107}
108
110 std::complex<double> X(point.getX(), point.getY());
111 int i = itsOrder - 1;
112 std::complex<double> B(pairs[i].B, pairs[i].A);
113
114 while (i-- >= 0) {
115 B = X * B / double(i + 1) + std::complex<double>(pairs[i].B, pairs[i].A);
116 }
117
118 return BVector(std::imag(B), std::real(B), 0.0);
119}
120
121BVector BMultipoleField::Bfield(const Point3D& point, double) const { return Bfield(point); }
122
124 // if(n <= 0) {
125 // throw LogicalError("BMultipoleField::setNormalComponent()",
126 // "Field order should be > 0.");
127 // }
128 if (n < 0) {
129 throw LogicalError("BMultipoleField::setNormalComponent()", "Field order should be > 0.");
130 }
131
132 // if(n > itsOrder) reserve(n);
133 // pairs[n-1].B = b;
134 if (n >= itsOrder) reserve(n + 1);
135 pairs[n].B = b;
136}
137
139 if (n < 0) {
140 throw LogicalError("BMultipoleField::setSkewComponent()", "Field order should be > 0.");
141 }
142
143 // if(n > itsOrder) reserve(n);
144 // pairs[n-1].A = a;
145 if (n >= itsOrder) reserve(n + 1);
146 pairs[n].A = a;
147}
148
150 if (field.itsOrder > itsOrder) reserve(field.itsOrder);
151 for (int i = 0; i < field.itsOrder; ++i)
152 pairs[i] += field.pairs[i];
153 return *this;
154}
155
157 if (field.itsOrder > itsOrder) reserve(field.itsOrder);
158 for (int i = 0; i < field.itsOrder; ++i)
159 pairs[i] -= field.pairs[i];
160 return *this;
161}
162
163void BMultipoleField::scale(double scalar) {
164 for (int i = 0; i < itsOrder; ++i) {
165 pairs[i] *= scalar;
166 }
167}
168
170 if (n >= itsOrder) {
171 Pair* temp = new Pair[n];
172 for (int i = 0; i < itsOrder; i++)
173 temp[i] = pairs[i];
174 delete[] pairs;
175 itsOrder = n;
176 pairs = temp;
177 }
178}
The magnetic field of a multipole.
BMultipoleField & addField(const BMultipoleField &field)
Add to field.
virtual BVector Bfield(const Point3D &P) const
Get field.
BMultipoleField & operator=(const BMultipoleField &)
BMultipoleField & subtractField(const BMultipoleField &field)
Subtract from field.
BMultipoleField()
Default constructor.
void scale(double scalar)
Scale the field.
virtual ~BMultipoleField()
void setNormalComponent(int n, double Bn)
Set component.
void setSkewComponent(int n, double Bn)
Set component.
double normal(int) const
Get component.
A magnetic field vector.
Definition EMField.h:88
Logical error exception.
A point in 3 dimensions.
Definition EMField.h:32
double getX() const
Return coordinate.
Definition EMField.cpp:36
double getY() const
Return coordinate.
Definition EMField.cpp:38
Pair operator+(const Pair &) const
void operator*=(double scale)
void operator-=(const Pair &)
void operator=(const Pair &)
void operator+=(const Pair &)
Pair operator*(double scale) const