OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
VerticalFFAMagnet.h
Go to the documentation of this file.
1//
2// Header file for VerticalFFAMagnet Component
3//
4// Copyright (c) 2019 Chris Rogers
5// All rights reserved.
6//
7// OPAL is licensed under GNU GPL version 3.
8//
9
13#include "PartBunch/PartBunch.h"
14
15#ifndef ABSBEAMLINE_VerticalFFAMagnet_H
16#define ABSBEAMLINE_VerticalFFAMagnet_H
17
18namespace endfieldmodel {
19 class EndFieldModel;
20}
21
29public:
34 explicit VerticalFFAMagnet(const std::string& name);
35
38
40 ElementBase* clone() const;
41
51 inline bool apply(const std::shared_ptr<ParticleContainer_t>& pc);
52
53 inline bool apply(
54 const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B);
55
65 inline bool apply(
66 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
68
77
84 void initialise(PartBunch_t* bunch, double& startField, double& endField);
85
91 void initialise();
92
94 void finalise();
95
101 inline bool bends() const { return false; }
102
104 void getFieldExtend(double& /*zBegin*/, double& /*zEnd*/) const {}
105
108
110 const BGeometryBase& getGeometry() const;
111
113 EMField& getField();
114
116 const EMField& getField() const;
117
119 void accept(BeamlineVisitor& visitor) const;
120
127
134
137 size_t getMaxOrder() const { return maxOrder_m; }
138
141 void setMaxOrder(size_t maxOrder);
142
144 double getB0() const { return Bz_m / Tesla; }
145
147 void setB0(double Bz) { Bz_m = Bz * Tesla; }
148
150 double getFieldIndex() const { return k_m * mm; } // units are [m^{-1}]
151
153 void setFieldIndex(double index) { k_m = index / mm; }
154
156 double getNegativeVerticalExtent() const { return zNegExtent_m / mm; }
157
159 inline void setNegativeVerticalExtent(double negativeExtent);
160
162 double getPositiveVerticalExtent() const { return zPosExtent_m / mm; }
163
165 inline void setPositiveVerticalExtent(double positiveExtent);
166
168 double getBBLength() const { return bbLength_m / mm; }
169
171 void setBBLength(double bbLength) { bbLength_m = bbLength * mm; }
172
174 double getWidth() const { return halfWidth_m / mm * 2.; }
175
177 void setWidth(double width) { halfWidth_m = width / 2 * mm; }
178
189 inline std::vector<std::vector<double> > getDfCoefficients() const;
190
191private:
193
196
200
201 size_t maxOrder_m = 0;
202 double k_m = 0.;
203 double Bz_m = 0.;
204 double zNegExtent_m = 0.; // extent downwards from the midplane
205 double zPosExtent_m = 0.; // extent upwards from the midplane
206 double halfWidth_m = 0.; // extent in either +x or -x
207 double bbLength_m = 0.;
208 std::unique_ptr<endfieldmodel::EndFieldModel> endField_m;
209 std::vector<std::vector<double> > dfCoefficients_m;
210
211 const double mm = 1000.;
212 const double Tesla = 10.;
213};
214
216 zNegExtent_m = negativeExtent * mm;
217}
218
220 zPosExtent_m = positiveExtent * mm;
221}
222
223bool VerticalFFAMagnet::apply(const std::shared_ptr<ParticleContainer_t>& /*pc*/) { return false; }
224
226 const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B) {
227 std::shared_ptr<ParticleContainer_t> pc = RefPartBunch_m->getParticleContainer();
228 auto Rview = pc->R.getView();
229 auto Pview = pc->P.getView();
230 const Vector_t<double, 3> R = Rview(i);
231 const Vector_t<double, 3> P = Pview(i);
232 return apply(R, P, t, E, B);
233}
234
236 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double&,
238 return getFieldValue(R, B);
239}
240
241std::vector<std::vector<double> > VerticalFFAMagnet::getDfCoefficients() const {
242 return dfCoefficients_m;
243}
244
245#endif
Defines the abstract interface for a single beamline component in the accelerator model.
ippl::Vector< T, Dim > Vector_t
Template PIC bunch: IPPL PicManager, shared field mesh/solver, and multiple particle containers.
Abstract base class for accelerator geometry classes.
Definition Geometry.h:42
The magnetic field of a multipole.
PartBunch_t * RefPartBunch_m
Definition Component.h:225
Abstract base class for electromagnetic fields.
Definition EMField.h:171
Vector_t< double, Dim > R(size_t)
Do not use; throws (access positions via ParticleContainer::R).
Definition PartBunch.h:611
A geometry representing a straight line.
void setBBLength(double bbLength)
ElementBase * clone() const
endfieldmodel::EndFieldModel * getEndField() const
void accept(BeamlineVisitor &visitor) const
VerticalFFAMagnet & operator=(const VerticalFFAMagnet &rhs)
void setWidth(double width)
double getFieldIndex() const
size_t getMaxOrder() const
std::vector< std::vector< double > > getDfCoefficients() const
std::unique_ptr< endfieldmodel::EndFieldModel > endField_m
BGeometryBase & getGeometry()
BMultipoleField dummy
void setMaxOrder(size_t maxOrder)
std::vector< std::vector< double > > dfCoefficients_m
double getPositiveVerticalExtent() const
double getNegativeVerticalExtent() const
StraightGeometry straightGeometry_m
void setB0(double Bz)
double getBBLength() const
void getFieldExtend(double &, double &) const
void setNegativeVerticalExtent(double negativeExtent)
void setFieldIndex(double index)
bool getFieldValue(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B) const
double getWidth() const
void setEndField(endfieldmodel::EndFieldModel *endField)
void setPositiveVerticalExtent(double positiveExtent)
bool apply(const std::shared_ptr< ParticleContainer_t > &pc)