OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Septum.cpp
Go to the documentation of this file.
1 #include "AbsBeamline/Septum.h"
2 
5 #include "Physics/Physics.h"
7 
8 extern Inform *gmsg;
9 
10 // Class Septum
11 // ------------------------------------------------------------------------
12 
14 {}
15 
16 Septum::Septum(const std::string &name):
17  PluginElement(name),
18  width_m(0.0) {
19 }
20 
21 Septum::Septum(const Septum &right):
22  PluginElement(right),
23  width_m(right.width_m) {
25 }
26 
28 
29 void Septum::accept(BeamlineVisitor &visitor) const {
30  visitor.visitSeptum(*this);
31 }
32 
33 void Septum::initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField) {
34  position_m = startField;
35  startField -= 0.005;
36  endField = position_m + 0.005;
37  initialise(bunch);
38 }
39 
41  *gmsg << "Septum initialise" << endl;
42 }
43 
44 double Septum::getWidth() const {
45  return width_m;
46 }
47 
48 void Septum::setWidth(double width) {
49  width_m = width;
51 }
52 
54  Vector_t rmin;
55  Vector_t rmax;
56  bunch->get_bounds(rmin, rmax);
57  // interested in absolute maximum
58  double xmax = std::max(std::abs(rmin(0)), std::abs(rmax(0)));
59  double ymax = std::max(std::abs(rmin(1)), std::abs(rmax(1)));
60  double rbunch_max = std::hypot(xmax, ymax);
61 
62  if(rbunch_max > rstart_m - 100) {
63  return true;
64  }
65  return false;
66 }
67 
68 bool Septum::doCheck(PartBunchBase<double, 3> *bunch, const int /*turnnumber*/, const double /*t*/, const double /*tstep*/) {
69 
70  bool flag = false;
71  const double slope = (yend_m - ystart_m) / (xend_m - xstart_m);
72  const double halfLength = width_m / 2.0 * std::hypot(slope, 1);
73  const double intcept = ystart_m - slope * xstart_m;
74  const double intcept1 = intcept - halfLength;
75  const double intcept2 = intcept + halfLength;
76 
77  for(unsigned int i = 0; i < bunch->getLocalNum(); ++i) {
78  const Vector_t& R = bunch->R[i];
79 
80  double line1 = fabs(slope * R(0) + intcept1);
81  double line2 = fabs(slope * R(0) + intcept2);
82 
83  if(fabs(R(1)) > line2 &&
84  fabs(R(1)) < line1 &&
85  R(0) > xstart_m &&
86  R(0) < xend_m &&
87  R(1) > ystart_m &&
88  R(1) < yend_m) {
89 
90  bunch->lossDs_m->addParticle(R, bunch->P[i], bunch->ID[i]);
91  bunch->Bin[i] = -1;
92  flag = true;
93  }
94  }
95  return flag;
96 }
97 
99  return SEPTUM;
100 }
ParticleAttrib< Vector_t > P
Septum()
Definition: Septum.cpp:13
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Interface for septum magnet.
Definition: Septum.h:11
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
Definition: PETE.h:815
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:123
virtual void visitSeptum(const Septum &)=0
Apply the algorithm to a septum magnet.
double width_m
input geometry positions
Definition: Septum.h:45
Inform * gmsg
Definition: Main.cpp:21
virtual bool doCheck(PartBunchBase< double, 3 > *bunch, const int turnnumber, const double t, const double tstep) override
Record hits when bunch particles pass.
Definition: Septum.cpp:68
virtual ElementBase::ElementType getType() const override
Override implementation of PluginElement.
Definition: Septum.cpp:98
double getWidth() const
Definition: Septum.cpp:44
ParticleIndex_t & ID
double xstart_m
input geometry positions
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Pure virtual implementation of Component.
Definition: Septum.cpp:33
void setGeom(const double dist)
Sets geometry geom_m with element width dist.
size_t getLocalNum() const
virtual void doInitialise(PartBunchBase< double, 3 > *bunch) override
Hook for initialise.
Definition: Septum.cpp:40
void setWidth(double width)
Member variable access.
Definition: Septum.cpp:48
const std::string name
std::unique_ptr< LossDataSink > lossDs_m
ParticleAttrib< int > Bin
ParticlePos_t & R
virtual bool doPreCheck(PartBunchBase< double, 3 > *) override
Virtual hook for preCheck.
Definition: Septum.cpp:53
virtual void accept(BeamlineVisitor &) const override
Apply visitor to Septum.
Definition: Septum.cpp:29
void get_bounds(Vector_t &rmin, Vector_t &rmax)
Abstract algorithm.
Definition: Inform.h:41
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
virtual ~Septum()
Definition: Septum.cpp:27