OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
MultipoleTBase.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017, Titus Dascalu
3 * Copyright (c) 2018, Martin Duy Tat
4 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * 3. Neither the name of STFC nor the names of its contributors may be used to
13 * endorse or promote products derived from this software without specific
14 * prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef CLASSIC_MULTIPOLETBASE_H
30#define CLASSIC_MULTIPOLETBASE_H
31
76
77#include <vector>
81
83
84class MultipoleTBase : public Component {
85public:
91 explicit MultipoleTBase(const std::string& name);
93 MultipoleTBase(const MultipoleTBase& right);
99 const EMField& getField() const;
109 bool apply(
110 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
121 bool apply(const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B);
127 void initialise(PartBunch_t*, double& startField, double& endField);
129 void finalise();
131 bool bends() const;
133 double getDipoleConstant() const;
135 void setDipoleConstant(const double& B0);
137 std::size_t getMaxOrder() const;
142 virtual void setMaxOrder(const std::size_t& maxOrder);
144 std::size_t getTransMaxOrder() const;
148 void setTransMaxOrder(const std::size_t& transMaxOrder);
154 void setTransProfile(const std::size_t& n, const double& Bn);
158 double getTransProfile(const std::size_t& n) const;
160 std::vector<double> getTransProfile() const;
169 bool setFringeField(const double& s0, const double& lambda_left, const double& lambda_right);
173 std::vector<double> getFringeLength() const;
177 void setEntranceAngle(const double& entranceAngle);
179 virtual void setBendAngle(const double& angle);
181 virtual double getBendAngle() const;
183 double getEntranceAngle() const;
188 void setLength(const double& length);
190 double getLength() const;
196 void setAperture(const double& vertAp, const double& horizAp);
200 std::vector<double> getAperture() const;
205 void setRotation(const double& rot);
207 double getRotation() const;
209 double getBoundingBoxLength() const;
213 void setBoundingBoxLength(const double& boundingBoxLength);
215 virtual void getDimensions(double& zBegin, double& zEnd) const;
216
217protected:
222 double getFringeDeriv(const std::size_t& n, const double& s);
229 double getTransDeriv(const std::size_t& n, const double& x);
230
231private:
232 // MultipoleTBase operator=(const MultipoleTBase &rhs);
233 // End fields
237 std::size_t maxOrder_m;
239 std::size_t transMaxOrder_m = 0;
241 std::vector<double> transProfile_m;
258 double length_m;
267 virtual double getBx(const Vector_t<double, 3>& R);
272 double getBz(const Vector_t<double, 3>& R);
277 virtual double getBs(const Vector_t<double, 3>& R);
286 bool insideAperture(const Vector_t<double, 3>& R);
290 virtual double getRadius(const double& s) = 0;
295 virtual double getScaleFactor(const double& x, const double& s) = 0;
303 double getFnDerivX(const std::size_t& n, const double& x, const double& s);
311 double getFnDerivS(const std::size_t& n, const double& x, const double& s);
318 virtual double getFn(const std::size_t& n, const double& x, const double& s) = 0;
319};
320
322 RefPartBunch_m = nullptr;
323}
325 const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B) {
326 std::shared_ptr<ParticleContainer_t> pc = RefPartBunch_m->getParticleContainer();
327 auto Rview = pc->R.getView();
328 auto Pview = pc->P.getView();
329
330 const Vector_t<double, 3> R = Rview(i);
331 const Vector_t<double, 3> P = Pview(i);
332
333 return apply(R(i), P(i), t, E, B);
334}
335inline void MultipoleTBase::setBendAngle(const double& /*angle*/) {
336}
337inline double MultipoleTBase::getBendAngle() const {
338 return 0.0;
339}
340inline void MultipoleTBase::setEntranceAngle(const double& entranceAngle) {
341 entranceAngle_m = entranceAngle;
342}
344 return (
345 std::abs(R[1]) <= (verticalApert_m / 2.0) && std::abs(R[0]) <= (horizontalApert_m / 2.0));
346}
347inline double MultipoleTBase::getEntranceAngle() const {
348 return entranceAngle_m;
349}
350inline double MultipoleTBase::getTransProfile(const std::size_t& n) const {
351 return transProfile_m[n];
352}
353inline std::vector<double> MultipoleTBase::getTransProfile() const {
354 return transProfile_m;
355}
357 return transProfile_m[0];
358}
359inline void MultipoleTBase::setMaxOrder(const std::size_t& maxOrder) {
360 maxOrder_m = maxOrder;
361}
362inline std::size_t MultipoleTBase::getMaxOrder() const {
363 return maxOrder_m;
364}
365inline std::size_t MultipoleTBase::getTransMaxOrder() const {
366 return transMaxOrder_m;
367}
368inline void MultipoleTBase::setTransMaxOrder(const std::size_t& transMaxOrder) {
369 transMaxOrder_m = transMaxOrder;
370 transProfile_m.resize(transMaxOrder + 1, 0.);
371}
372inline double MultipoleTBase::getRotation() const {
373 return rotation_m;
374}
375inline void MultipoleTBase::setRotation(const double& rot) {
376 rotation_m = rot;
377}
378inline void MultipoleTBase::setLength(const double& length) {
379 length_m = std::abs(length);
380}
381inline double MultipoleTBase::getLength() const {
382 return length_m;
383}
385 return boundingBoxLength_m;
386}
387inline void MultipoleTBase::setBoundingBoxLength(const double& boundingBoxLength) {
388 boundingBoxLength_m = boundingBoxLength;
389}
390inline void MultipoleTBase::setTransProfile(const std::size_t& n, const double& dTn) {
391 if (n > transMaxOrder_m) {
392 transMaxOrder_m = n;
393 transProfile_m.resize(n + 1, 0.0);
394 }
395 transProfile_m[n] = dTn;
396}
397inline void MultipoleTBase::setDipoleConstant(const double& B0) {
398 if (transMaxOrder_m < 1) {
399 transProfile_m.resize(1, 0.);
400 }
401 transProfile_m[0] = B0;
402}
403inline void MultipoleTBase::setAperture(const double& vertAp, const double& horizAp) {
404 verticalApert_m = vertAp;
405 horizontalApert_m = horizAp;
406}
407inline std::vector<double> MultipoleTBase::getAperture() const {
408 std::vector<double> temp(2, 0.0);
409 temp[0] = verticalApert_m;
410 temp[1] = horizontalApert_m;
411 return temp;
412}
413inline std::vector<double> MultipoleTBase::getFringeLength() const {
414 std::vector<double> temp(2, 0.0);
415 temp[0] = fringeField_l.getLambda();
416 temp[1] = fringeField_r.getLambda();
417 return temp;
418}
420 PartBunch_t* /*bunch*/, double& /*startField*/, double& /*endField*/) {
421}
422inline bool MultipoleTBase::bends() const {
423 return transProfile_m[0] != 0;
424}
426 return dummy;
427}
428inline const EMField& MultipoleTBase::getField() const {
429 return dummy;
430}
431inline void MultipoleTBase::getDimensions(double& /*zBegin*/, double& /*zEnd*/) const {
432}
433
434#endif
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
Component(const std::string &name)
Constructor with given name.
Definition Component.cpp:44
PartBunch_t * RefPartBunch_m
Definition Component.h:185
virtual double getRadius(const double &s)=0
BMultipoleField dummy
double getBoundingBoxLength() const
std::size_t getTransMaxOrder() const
virtual void setBendAngle(const double &angle)
bool insideAperture(const Vector_t< double, 3 > &R)
virtual double getFn(const std::size_t &n, const double &x, const double &s)=0
double boundingBoxLength_m
std::vector< double > getFringeLength() const
virtual void transformCoords(Vector_t< double, 3 > &R)=0
void setRotation(const double &rot)
virtual void transformBField(Vector_t< double, 3 > &B, const Vector_t< double, 3 > &R)=0
void setLength(const double &length)
double getDipoleConstant() const
endfieldmodel::Tanh fringeField_l
virtual void setMaxOrder(const std::size_t &maxOrder)
double getRotation() const
std::vector< double > getAperture() const
double getLength() const
bool bends() const
std::vector< double > transProfile_m
std::size_t maxOrder_m
double getEntranceAngle() const
virtual double getBx(const Vector_t< double, 3 > &R)
std::size_t getMaxOrder() const
void initialise(PartBunch_t *, double &startField, double &endField)
virtual double getBs(const Vector_t< double, 3 > &R)
endfieldmodel::Tanh fringeField_r
std::vector< double > getTransProfile() const
Vector_t< double, 3 > rotateFrame(const Vector_t< double, 3 > &R)
double getTransDeriv(const std::size_t &n, const double &x)
double getBz(const Vector_t< double, 3 > &R)
bool apply(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)
virtual double getScaleFactor(const double &x, const double &s)=0
void setEntranceAngle(const double &entranceAngle)
std::size_t transMaxOrder_m
void setTransProfile(const std::size_t &n, const double &Bn)
double getFnDerivX(const std::size_t &n, const double &x, const double &s)
EMField & getField()
bool setFringeField(const double &s0, const double &lambda_left, const double &lambda_right)
void setDipoleConstant(const double &B0)
double getFringeDeriv(const std::size_t &n, const double &s)
virtual void getDimensions(double &zBegin, double &zEnd) const
void setBoundingBoxLength(const double &boundingBoxLength)
Vector_t< double, 3 > rotateFrameInverse(Vector_t< double, 3 > &B)
double getFnDerivS(const std::size_t &n, const double &x, const double &s)
void setAperture(const double &vertAp, const double &horizAp)
void setTransMaxOrder(const std::size_t &transMaxOrder)
virtual double getBendAngle() const
The magnetic field of a multipole.
Abstract base class for electromagnetic fields.
Definition EMField.h:188