31 unsigned int factorial(
unsigned int n) {
32 static int fact[] = {1, 1, 2, 6, 24, 120, 720,
33 5040, 40320, 362880, 3628800, 39916800, 479001600};
36 "Multipole::factorial",
"Factorial can't be larger than 12");
167 B(0) += 4 *
NormalComponents[i] * (Rn[3](0) * Rn[1](1) - Rn[1](0) * Rn[3](1));
168 B(1) +=
NormalComponents[i] * (Rn[4](0) - 6 * Rn[2](0) * Rn[2](1) + Rn[4](1));
172 double powMinusOne = 1;
173 double Bx = 0.0, By = 0.0;
174 for (
int j = 1; j <= (i + 1) / 2; ++j) {
176 * (Rn[i - 2 * j + 1](0) * fact[i - 2 * j + 1] * Rn[2 * j - 1](1)
179 * (Rn[i - 2 * j + 2](0) * fact[i - 2 * j + 2] * Rn[2 * j - 2](1)
184 if ((i + 1) / 2 == i / 2) {
187 * (Rn[i - 2 * j + 2](0) * fact[i - 2 * j + 2] * Rn[2 * j - 2](1)
195 Rn[i + 1](0) = Rn[i](0) * R(0);
196 Rn[i + 1](1) = Rn[i](1) * R(1);
197 fact[i + 1] = fact[i] / (i + 1);
228 B(0) -=
SkewComponents[i] * (Rn[4](0) - 6 * Rn[2](0) * Rn[2](1) + Rn[4](1));
229 B(1) += 4 *
SkewComponents[i] * (Rn[3](0) * Rn[1](1) - Rn[1](0) * Rn[3](1));
233 double powMinusOne = 1;
234 double Bx = 0, By = 0;
235 for (
int j = 1; j <= (i + 1) / 2; ++j) {
237 * (Rn[i - 2 * j + 2](0) * fact[i - 2 * j + 2] * Rn[2 * j - 2](1)
240 * (Rn[i - 2 * j + 1](0) * fact[i - 2 * j + 1] * Rn[2 * j - 1](1)
245 if ((i + 1) / 2 == i / 2) {
248 * (Rn[i - 2 * j + 2](0) * fact[i - 2 * j + 2] * Rn[2 * j - 2](1)
257 Rn[i + 1](0) = Rn[i](0) * R(0);
258 Rn[i + 1](1) = Rn[i](1) * R(1);
259 fact[i + 1] = fact[i] / (i + 1);
268 std::shared_ptr<ParticleContainer_t> pc =
RefPartBunch_m->getParticleContainer();
269 auto Rview = pc->R.getView();
280 for (
unsigned int d = 0; d < 3; ++d) {
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
virtual void visitMultipole(const Multipole &)=0
Apply the algorithm to a multipole.
Component(const std::string &name)
Constructor with given name.
PartBunch_t * RefPartBunch_m
bool getFlagDeleteOnTransverseExit() const
virtual double getElementLength() const
Get design length.
bool isInsideTransverse(const Vector_t< double, 3 > &r) const
std::vector< double > SkewComponents
virtual void accept(BeamlineVisitor &) const override
Apply visitor to Multipole.
int max_NormalComponent_m
virtual void getDimensions(double &zBegin, double &zEnd) const override
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
virtual bool apply(const size_t &i, const double &t, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) override
std::vector< double > SkewComponentErrors
virtual bool applyToReferenceParticle(const Vector_t< double, 3 > &R, const Vector_t< double, 3 > &P, const double &t, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) override
virtual void finalise() override
void setNSlices(const std::size_t &nSlices)
virtual bool bends() const override
bool isFocusing(unsigned int component) const
virtual ElementType getType() const override
Get element type std::string.
virtual bool isInside(const Vector_t< double, 3 > &r) const override
std::vector< double > NormalComponents
void computeField(Vector_t< double, 3 > R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B)
void setNormalComponent(int, double)
Set normal component.
Multipole(const std::string &name)
Constructor with given name.
double getSkewComponent(int n) const
Get skew component.
std::size_t getNSlices() const
void setSkewComponent(int, double)
Set skew component.
std::vector< double > NormalComponentErrors
double getNormalComponent(int n) const
Get normal component.