OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
Solenoid.cpp
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2// $RCSfile: Solenoid.cpp,v $
3// ------------------------------------------------------------------------
4// $Revision: 1.1.1.1 $
5// ------------------------------------------------------------------------
6// Copyright: see Copyright.readme
7// ------------------------------------------------------------------------
8//
9// Class: Solenoid
10// Defines the abstract interface for a solenoid magnet.
11//
12// ------------------------------------------------------------------------
13// Class category: AbsBeamline
14// ------------------------------------------------------------------------
15//
16// $Date: 2000/03/27 09:32:32 $
17// $Author: fci $
18//
19// ------------------------------------------------------------------------
20
23#include "Fields/Fieldmap.h"
24#include "PartBunch/PartBunch.h"
25#include "Physics/Physics.h"
26
27#include <fstream>
28#include <iostream>
29
30extern Inform* gmsg;
31
32// Class Solenoid
33// ------------------------------------------------------------------------
34
37
39 : Component(right),
42 scale_m(right.scale_m),
45 fast_m(right.fast_m) {
46}
47
48Solenoid::Solenoid(const std::string& name)
49 : Component(name),
50 filename_m(""),
51 fieldmap_m(nullptr),
52 scale_m(1.0),
53 scaleError_m(0.0),
54 startField_m(0.0),
55 fast_m(true) {
56}
57
59 // _Fieldmap::deleteFieldmap(filename_m);
60}
61
62void Solenoid::accept(BeamlineVisitor& visitor) const {
63 visitor.visitSolenoid(*this);
64}
65
66void Solenoid::setFieldMapFN(std::string fn) {
67 filename_m = fn;
68}
69
70void Solenoid::setFast(bool fast) {
71 fast_m = fast;
72}
73
74bool Solenoid::getFast() const {
75 return fast_m;
76}
77
79 const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B) {
80 std::shared_ptr<ParticleContainer_t> pc = RefPartBunch_m->getParticleContainer();
81 auto Rview = pc->R.getView();
82 auto Pview = pc->P.getView();
83
84 const Vector_t<double, 3> R = Rview(i);
85 const Vector_t<double, 3> P = Pview(i);
86 return apply(R, P, t, E, B);
87}
88
90 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double& /*t*/,
92 if (R(2) >= startField_m && R(2) < startField_m + getElementLength()) {
93 Vector_t<double, 3> tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
94
95 const bool outOfBounds = fieldmap_m->getFieldstrength(R, tmpE, tmpB);
96 if (outOfBounds) {
98 }
99
100 B += (scale_m + scaleError_m) * tmpB;
101 }
102
103 return false;
104}
105
107 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double& /*t*/,
109 if (R(2) >= startField_m && R(2) < startField_m + getElementLength()) {
110 Vector_t<double, 3> tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
111
112 const bool outOfBounds = fieldmap_m->getFieldstrength(R, tmpE, tmpB);
113 if (outOfBounds)
114 return true;
115
116 B += scale_m * tmpB;
117 }
118
119 return false;
120}
121
122void Solenoid::initialise(PartBunch_t* bunch, double& startField, double& endField) {
123 Inform msg("Solenoid ", *gmsg);
124
125 RefPartBunch_m = bunch;
126
127 fieldmap_m = Fieldmap::getFieldmap(filename_m, fast_m);
128
129 if (fieldmap_m != nullptr) {
130 msg << level2 << getName() << " using file ";
131 fieldmap_m->getInfo(&msg);
132
133 double zBegin = 0.0, zEnd = 0.0;
134 fieldmap_m->getFieldDimensions(zBegin, zEnd);
135
136 startField_m = zBegin;
137 setElementLength(zEnd - zBegin);
138 endField = startField + getElementLength();
139 } else {
140 endField = startField;
141 }
142}
143
145}
146
147bool Solenoid::bends() const {
148 return false;
149}
150
151void Solenoid::goOnline(const double&) {
152 Fieldmap::readMap(filename_m);
153 online_m = true;
154}
155
157 Fieldmap::freeMap(filename_m);
158 online_m = false;
159}
160
161void Solenoid::setKS(double ks) {
162 scale_m = ks;
163}
164
165void Solenoid::setDKS(double ks) {
166 scaleError_m = ks;
167}
168
169void Solenoid::getDimensions(double& zBegin, double& zEnd) const {
170 zBegin = startField_m;
172}
173
177
179 return isInsideTransverse(r) && fieldmap_m->isInside(r);
180}
181
182void Solenoid::getElementDimensions(double& begin, double& end) const {
185}
Inform * gmsg
Definition changes.cpp:7
ElementType
Definition ElementBase.h:88
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
PartBunch< T, Dim >::ConstIterator end(PartBunch< T, Dim > const &bunch)
PartBunch< T, Dim >::ConstIterator begin(PartBunch< T, Dim > const &bunch)
virtual void visitSolenoid(const Solenoid &)=0
Apply the algorithm to a Solenoid element.
bool online_m
Definition Component.h:186
Component(const std::string &name)
Constructor with given name.
Definition Component.cpp:44
PartBunch_t * RefPartBunch_m
Definition Component.h:185
virtual const std::string & getName() const
Get element name.
bool getFlagDeleteOnTransverseExit() const
virtual double getElementLength() const
Get design length.
virtual void setElementLength(double length)
Set design length.
bool isInsideTransverse(const Vector_t< double, 3 > &r) const
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition Solenoid.cpp:169
double scaleError_m
Definition Solenoid.h:98
void setFast(bool fast)
Definition Solenoid.cpp:70
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
Definition Solenoid.cpp:122
virtual void getElementDimensions(double &zBegin, double &zEnd) const override
Definition Solenoid.cpp:182
double startField_m
Definition Solenoid.h:100
virtual void goOffline() override
Definition Solenoid.cpp:156
virtual ~Solenoid()
Definition Solenoid.cpp:58
virtual void goOnline(const double &kineticEnergy) override
Definition Solenoid.cpp:151
virtual void finalise() override
Definition Solenoid.cpp:144
virtual bool apply(const size_t &i, const double &t, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) override
Definition Solenoid.cpp:78
bool fast_m
Definition Solenoid.h:102
bool getFast() const
Definition Solenoid.cpp:74
virtual bool bends() const override
Definition Solenoid.cpp:147
void setDKS(double ks)
Definition Solenoid.cpp:165
Fieldmap * fieldmap_m
Definition Solenoid.h:95
virtual ElementType getType() const override
Get element type std::string.
Definition Solenoid.cpp:174
std::string filename_m
Definition Solenoid.h:93
virtual bool isInside(const Vector_t< double, 3 > &r) const override
Definition Solenoid.cpp:178
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
Definition Solenoid.cpp:106
void setKS(double ks)
Definition Solenoid.cpp:161
Solenoid(const std::string &name)
Constructor with given name.
Definition Solenoid.cpp:48
void setFieldMapFN(std::string fn)
Definition Solenoid.cpp:66
virtual void accept(BeamlineVisitor &) const override
Apply visitor to Solenoid.
Definition Solenoid.cpp:62
double scale_m
Definition Solenoid.h:97