OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
ConstantEFieldCavity.cpp
Go to the documentation of this file.
4
6
8 : Component(right),
9 Ex_m(right.Ex_m),
10 Ey_m(right.Ey_m),
11 Ez_m(right.Ez_m),
12 startField_m(right.startField_m) {}
13
15 : Component(name), Ex_m(0.0), Ey_m(0.0), Ez_m(0.0), startField_m(0.0) {}
16
18
20 visitor.visitConstantEFieldCavity(*this);
21}
22
23void ConstantEFieldCavity::initialise(PartBunch_t* bunch, double& startField, double& endField) {
24 RefPartBunch_m = bunch;
25 startField_m = startField;
26 endField = startField + getElementLength();
27}
28
30
31bool ConstantEFieldCavity::bends() const { return false; }
32
34
35void ConstantEFieldCavity::getFieldExtend(double& zBegin, double& zEnd) const {
36 zBegin = startField_m;
38}
39
40double ConstantEFieldCavity::getEx() const { return Ex_m; }
41
42double ConstantEFieldCavity::getEy() const { return Ey_m; }
43
44double ConstantEFieldCavity::getEz() const { return Ez_m; }
45
46void ConstantEFieldCavity::setEx(double ex) { Ex_m = ex; }
47
48void ConstantEFieldCavity::setEy(double ey) { Ey_m = ey; }
49
50void ConstantEFieldCavity::setEz(double ez) { Ez_m = ez; }
51
52bool ConstantEFieldCavity::apply(const std::shared_ptr<ParticleContainer_t>& pc) {
53 auto Rview = pc->R.getView();
54 auto Eview = pc->E.getView();
55 const size_t nLocal = pc->getLocalNum();
56
57 const double elemLength = getElementLength();
58 const double Ex = Ex_m;
59 const double Ey = Ey_m;
60 const double Ez = Ez_m;
61
62 Kokkos::parallel_for(
63 "ConstantEFieldCavity::apply()", nLocal, KOKKOS_LAMBDA(const size_t i) {
64 if (Rview(i)[2] > 0.0 && Rview(i)[2] <= elemLength) {
65 Eview(i)[0] += Ex;
66 Eview(i)[1] += Ey;
67 Eview(i)[2] += Ez;
68 }
69 });
70 return false;
71}
72
74 const size_t& i, const double& /*t*/, Vector_t<double, 3>& E, Vector_t<double, 3>& /*B*/) {
75 std::shared_ptr<ParticleContainer_t> pc = RefPartBunch_m->getParticleContainer();
76 auto Rview = pc->R.getView();
77 const Vector_t<double, 3> R = Rview(i);
78
79 if (R(2) < 0.0 || R(2) > getElementLength()) return false;
81
82 E(0) += Ex_m;
83 E(1) += Ey_m;
84 E(2) += Ez_m;
85 return false;
86}
87
89 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double& /*t*/,
91 if (R(2) < 0.0 || R(2) > getElementLength()) return false;
93
94 E(0) += Ex_m;
95 E(1) += Ey_m;
96 E(2) += Ez_m;
97 return false;
98}
99
101 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double& /*t*/,
103 if (R(2) < 0.0 || R(2) > getElementLength()) return false;
104 if (!isInsideTransverse(R)) return true;
105
106 E(0) += Ex_m;
107 E(1) += Ey_m;
108 E(2) += Ez_m;
109 return false;
110}
ippl::Vector< T, Dim > Vector_t
ElementType
Definition ElementBase.h:94
@ CONSTANTEFIELDCAVITY
Template PIC bunch: IPPL PicManager, shared field mesh/solver, and multiple particle containers.
virtual void visitConstantEFieldCavity(const ConstantEFieldCavity &)=0
Apply the algorithm to a constant E-field cavity element.
PartBunch_t * RefPartBunch_m
Definition Component.h:225
Component applying a constant accelerating electric field (Ex,Ey,Ez).
virtual void setEx(double ex)
virtual bool bends() const override
virtual bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
Apply to all particles. Kernel launch moved inside the function.
virtual void accept(BeamlineVisitor &visitor) const override
Apply visitor.
virtual void finalise() override
virtual void setEy(double ey)
virtual void setEz(double ez)
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
Apply to reference particle with position R and momemtum P.
virtual void getFieldExtend(double &zBegin, double &zEnd) const override
Return the field-support extent of the component.
virtual ElementType getType() const override
Get element type std::string.
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
bool getFlagDeleteOnTransverseExit() const
virtual double getElementLength() const
Get design length.
bool isInsideTransverse(const Vector_t< double, 3 > &r) const
Vector_t< double, Dim > R(size_t)
Do not use; throws (access positions via ParticleContainer::R).
Definition PartBunch.h:611