OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
OpalBeamline.h
Go to the documentation of this file.
1//
2// Class OpalBeamline
3// :FIXME: add class description
4//
5// Copyright (c) 200x - 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
6// All rights reserved
7//
8// This file is part of OPAL.
9//
10// OPAL is free software: you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// You should have received a copy of the GNU General Public License
16// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17//
18#ifndef OPAL_BEAMLINE_H
19#define OPAL_BEAMLINE_H
20
21#include <set>
22#include <string>
23
25#include "PartBunch/PartBunch.h"
26
27#include "AbsBeamline/Marker.h"
28#include "Beamlines/Beamline.h"
30
32
33#include "OPALTypes.h"
34
35class ParticleMatterInteractionHandler;
37
39public:
41 OpalBeamline(const Vector_t<double, 3>& origin, const Quaternion& rotation);
43
44 void activateElements();
45 std::set<std::shared_ptr<Component>> getElements(const Vector_t<double, 3>& x);
50
52 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const;
54 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const;
56 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const;
58 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const;
59 CoordinateSystemTrafo getCSTrafoLab2Local(const std::shared_ptr<Component>& comp) const;
61 CoordinateSystemTrafo getMisalignment(const std::shared_ptr<Component>& comp) const;
62
63 double getStart(const Vector_t<double, 3>&) const;
64 double getEnd(const Vector_t<double, 3>&) const;
65
66 void switchElements(
67 const double&, const double&, const double& kineticEnergy, const bool& nomonitors = false);
68 void switchElementsOff();
69
70 ParticleMatterInteractionHandler* getParticleMatterInteractionHandler(const unsigned int&);
71
73
74 unsigned long getFieldAt(
75 const unsigned int&, const Vector_t<double, 3>&, const long&, const double&,
77 unsigned long getFieldAt(
78 const Vector_t<double, 3>&, const Vector_t<double, 3>&, const double&, Vector_t<double, 3>&,
80
81 template <class T>
82 void visit(const T&, BeamlineVisitor&, PartBunch_t*);
83
84 void prepareSections();
85 void positionElementRelative(std::shared_ptr<ElementBase>);
86 void compute3DLattice();
87 void save3DLattice();
88 void save3DInput();
89 void print(Inform&) const;
90
92
93 void swap(OpalBeamline& rhs);
94 void merge(OpalBeamline& rhs);
95
96private:
99
101};
102
103template <class T>
104inline void OpalBeamline::visit(const T& element, BeamlineVisitor&, PartBunch_t* bunch) {
105 Inform msg("OPAL ");
106 double startField = 0.0;
107 double endField = 0.0;
108 std::shared_ptr<T> elptr(dynamic_cast<T*>(element.clone()));
109
111
112 if (elptr->isElementPositionSet())
113 startField = elptr->getElementPosition();
114
115 elptr->initialise(bunch, startField, endField);
116 elements_m.push_back(ClassicField(elptr, startField, endField));
117}
118
119template <>
121}
122
124 return coordTransformationTo_m.transformTo(r);
125}
126
128 return coordTransformationTo_m.transformFrom(r);
129}
130
132 return coordTransformationTo_m.rotateTo(r);
133}
134
136 return coordTransformationTo_m.rotateFrom(r);
137}
138
140 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const {
141 return comp->getCSTrafoGlobal2Local().transformTo(r);
142}
143
145 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const {
146 return comp->getCSTrafoGlobal2Local().transformFrom(r);
147}
148
150 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const {
151 return comp->getCSTrafoGlobal2Local().rotateTo(r);
152}
153
155 const std::shared_ptr<Component>& comp, const Vector_t<double, 3>& r) const {
156 return comp->getCSTrafoGlobal2Local().rotateFrom(r);
157}
158
160 const std::shared_ptr<Component>& comp) const {
161 return comp->getCSTrafoGlobal2Local();
162}
163
167
169 const std::shared_ptr<Component>& comp) const {
170 return comp->getMisalignment();
171}
172
173#endif // OPAL_BEAMLINE_H
ElementType
Definition ElementBase.h:88
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
std::list< ClassicField > FieldList
double T
Definition datatypes.h:7
Interface for a marker.
Definition Marker.h:32
FieldList getElementByType(ElementType)
Vector_t< double, 3 > rotateToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
void positionElementRelative(std::shared_ptr< ElementBase >)
CoordinateSystemTrafo getMisalignment(const std::shared_ptr< Component > &comp) const
void merge(OpalBeamline &rhs)
ParticleMatterInteractionHandler * getParticleMatterInteractionHandler(const unsigned int &)
unsigned long getFieldAt(const unsigned int &, const Vector_t< double, 3 > &, const long &, const double &, Vector_t< double, 3 > &, Vector_t< double, 3 > &)
Vector_t< double, 3 > transformTo(const Vector_t< double, 3 > &r) const
Vector_t< double, 3 > transformFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
CoordinateSystemTrafo coordTransformationTo_m
double getEnd(const Vector_t< double, 3 > &) const
Vector_t< double, 3 > rotateTo(const Vector_t< double, 3 > &r) const
void prepareSections()
void print(Inform &) const
void compute3DLattice()
Vector_t< double, 3 > transformToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
std::set< std::shared_ptr< Component > > getElements(const Vector_t< double, 3 > &x)
void switchElements(const double &, const double &, const double &kineticEnergy, const bool &nomonitors=false)
void switchElementsOff()
Vector_t< double, 3 > transformFrom(const Vector_t< double, 3 > &r) const
void visit(const T &, BeamlineVisitor &, PartBunch_t *)
FieldList elements_m
double getStart(const Vector_t< double, 3 > &) const
CoordinateSystemTrafo getCSTrafoLab2Local() const
BoundaryGeometry * getBoundaryGeometry(const unsigned int &)
Vector_t< double, 3 > rotateFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
Vector_t< double, 3 > rotateFrom(const Vector_t< double, 3 > &r) const
void activateElements()
void swap(OpalBeamline &rhs)