OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
OrbitThreader.h
Go to the documentation of this file.
1//
2// Class OrbitThreader
3//
4// This class determines the design path by tracking the reference particle through
5// the 3D lattice.
6//
7// Copyright (c) 2016, Christof Metzger-Kraus, Helmholtz-Zentrum Berlin, Germany
8// 2017 - 2020 Christof Metzger-Kraus
9//
10// All rights reserved
11//
12// This file is part of OPAL.
13//
14// OPAL is free software: you can redistribute it and/or modify
15// it under the terms of the GNU General Public License as published by
16// the Free Software Foundation, either version 3 of the License, or
17// (at your option) any later version.
18//
19// You should have received a copy of the GNU General Public License
20// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
21//
22#ifndef OPAL_ORBITTHREADER_H
23#define OPAL_ORBITTHREADER_H
24
25#include "Algorithms/IndexMap.h"
28
29#include <fstream>
30#include <map>
31#include <memory>
32#include <string>
37
39public:
41 const PartData& ref, const Vector_t<double, 3>& r, const Vector_t<double, 3>& p,
42 double s, double maxDiffZBunch, double t, double dT, StepSizeConfig stepSizes,
43 OpalBeamline& bl);
44
45 void execute();
46
48
49 IndexMap::key_t getRange(const IndexMap::value_t::value_type& element, double position) const;
51
53
64
74
75private:
86 double time_m;
88 double dt_m;
91
94 const double zstop_m;
96
99
100 unsigned int errorFlag_m;
101
104
105 std::ofstream logger_m;
107
109
114 };
115
117 bool operator()(const elementPosition& a, const elementPosition& b) const {
118 return a.elementEdge_m < b.elementEdge_m;
119 }
120 };
121
122 std::multimap<
123 std::shared_ptr<Component>, elementPosition,
124 std::owner_less<std::shared_ptr<Component>>>
127
128 void trackBack();
129 void integrate(const IndexMap::value_t& activeSet, double maxDrift = 10.0);
130 bool containsCavity(const IndexMap::value_t& activeSet);
132 const IndexMap::value_t& activeSet, const std::set<std::string>& visitedElements);
133 double getMaxDesignEnergy(const IndexMap::value_t& elementSet) const;
134
135 void registerElement(
136 const IndexMap::value_t& elementSet, double, const Vector_t<double, 3>& r,
137 const Vector_t<double, 3>& p);
139 void setDesignEnergy(FieldList& allElements, const std::set<std::string>& visitedElements);
140 void computeBoundingBox();
143 const std::set<std::shared_ptr<Component>>& elements,
144 const Vector_t<double, 3>& position, const Vector_t<double, 3>& direction) const;
145
146 void checkElementLengths(const std::set<std::shared_ptr<Component>>& elements);
147};
148
151 return imap_m.query(pathLength, length);
152}
153
155 const IndexMap::value_t::value_type& element, double position) const {
156 return imap_m.getRange(element, position);
157}
158
162
164
168
172#endif
std::list< BeamlineFieldElement > FieldList
ippl::Vector< T, Dim > Vector_t
elements
Definition IndexMap.cpp:168
std::set< std::shared_ptr< Component > > value_t
Definition IndexMap.h:46
value_t getTouchingElements(const key_t &range) const
Definition IndexMap.cpp:376
key_t getRange(const IndexMap::value_t::value_type &element, double position) const
Definition IndexMap.cpp:354
double first_type
Definition IndexMap.h:40
const ReferencePathModel & getReferencePathModel() const
Definition IndexMap.h:107
double second_type
Definition IndexMap.h:41
value_t query(key_t::first_type s, key_t::second_type ds)
Definition IndexMap.cpp:74
void processElementRegister()
Vector_t< double, 3 > r_m
position of reference particle in lab coordinates
const ReferencePathModel & getReferencePathModel() const
Return the threader-owned reference-path model.
Vector_t< double, 3 > p_m
momentum of reference particle
void updateBoundingBoxWithCurrentPosition()
void checkElementLengths(const std::set< std::shared_ptr< Component > > &elements)
void registerElement(const IndexMap::value_t &elementSet, double, const Vector_t< double, 3 > &r, const Vector_t< double, 3 > &p)
double distTrackBack_m
double computeDriftLengthToBoundingBox(const std::set< std::shared_ptr< Component > > &elements, const Vector_t< double, 3 > &position, const Vector_t< double, 3 > &direction) const
void setDesignEnergy(FieldList &allElements, const std::set< std::string > &visitedElements)
IndexMap::value_t query(IndexMap::key_t::first_type step, IndexMap::key_t::second_type length)
BorisPusher integrator_m
ValueRange< double > pathLengthRange_m
IndexMap imap_m
BoundingBox getBoundingBox() const
ValueRange< long > stepRange_m
std::multimap< std::shared_ptr< Component >, elementPosition, std::owner_less< std::shared_ptr< Component > > > elementRegistry_m
unsigned int errorFlag_m
double dt_m
the time step
double time_m
the simulated time
OpalBeamline & itsOpalBeamline_m
const PartData & reference_m
const ReferencePathModel & getActionRangeRegistrationModel() const
Return the action-range registration model.
std::ofstream logger_m
BoundingBox globalBoundingBox_m
bool containsCavity(const IndexMap::value_t &activeSet)
void integrate(const IndexMap::value_t &activeSet, double maxDrift=10.0)
StepSizeConfig stepSizes_m
final position in path length
double getMaxDesignEnergy(const IndexMap::value_t &elementSet) const
IndexMap::value_t getTouchingElements(const IndexMap::key_t &range) const
IndexMap::key_t getRange(const IndexMap::value_t::value_type &element, double position) const
ReferencePathModel actionRangeRegistrationModel_m
double pathLength_m
position of reference particle in path length
void autophaseCavities(const IndexMap::value_t &activeSet, const std::set< std::string > &visitedElements)
void computeBoundingBox()
size_t loggingFrequency_m
const double zstop_m
Particle reference data.
Definition PartData.h:37
Ordered collection of reference-path segments.
bool operator()(const elementPosition &a, const elementPosition &b) const