OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
SpecificElementVisitor.h
Go to the documentation of this file.
1//
2// Class SpecificElementVisitor
3// :FIXME: Add file 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 SPECIFICELEMENTVISITOR_H
19#define SPECIFICELEMENTVISITOR_H
20
21#include <list>
22
24#include "AbsBeamline/CCollimator.h"
27#include "AbsBeamline/Cyclotron.h"
28#include "AbsBeamline/Degrader.h"
29#include "AbsBeamline/Drift.h"
31#include "AbsBeamline/FlexibleCollimator.h"
32#include "AbsBeamline/Laser.h"
33#include "AbsBeamline/Marker.h"
34#include "AbsBeamline/Monitor.h"
38#include "AbsBeamline/MultipoleTCurvedVarRadius.h"
40#include "AbsBeamline/Probe.h"
41#include "AbsBeamline/RBend.h"
43#include "AbsBeamline/Ring.h"
44#include "AbsBeamline/SBend.h"
45#include "AbsBeamline/SBend3D.h"
47#include "AbsBeamline/Septum.h"
49#include "AbsBeamline/Source.h"
50#include "AbsBeamline/Stripper.h"
52#include "AbsBeamline/Vacuum.h"
54#include "AbsBeamline/VariableRFCavityFringeField.h"
56
57#ifdef ENABLE_OPAL_FEL
58#include "AbsBeamline/Undulator.h"
59#endif
60
61#include "Beamlines/Beamline.h"
63
64template <class ELEM1, class ELEM2>
65struct CastsTrait {
66 typedef std::list<const ELEM1*> ElementList_t;
67
68 static void apply(ElementList_t&, const ELEM2&) {}
69};
70
71template <class ELEM>
72struct CastsTrait<ELEM, ELEM> {
73 typedef std::list<const ELEM*> ElementList_t;
74
75 static void apply(ElementList_t& allElements, const ELEM& element) {
76 allElements.push_back(dynamic_cast<const ELEM*>(&element));
77 }
78};
79
80template <class ELEM>
82public:
83 SpecificElementVisitor(const Beamline& beamline);
84
85 virtual void execute();
86
88 virtual void visitBeamline(const Beamline&);
89
91 virtual void visitCCollimator(const CCollimator&);
92
94 virtual void visitComponent(const Component&);
95
97 virtual void visitCorrector(const Corrector&);
98
100 virtual void visitCyclotron(const Cyclotron&);
101
103 virtual void visitDegrader(const Degrader&);
104
107
109 virtual void visitDrift(const Drift&);
110
112 virtual void visitLaser(const Laser&);
113
115 virtual void visitFlaggedElmPtr(const FlaggedElmPtr&);
116
118 virtual void visitFlexibleCollimator(const FlexibleCollimator&);
119
121 virtual void visitMarker(const Marker&);
122
124 virtual void visitMonitor(const Monitor&);
125
127 virtual void visitMultipole(const Multipole&);
128
130 virtual void visitMultipoleT(const MultipoleT&);
131
133 virtual void visitMultipoleTStraight(const MultipoleTStraight&);
134
137
139 virtual void visitMultipoleTCurvedVarRadius(const MultipoleTCurvedVarRadius&);
140
142 virtual void visitProbe(const Probe& prob);
143
145 virtual void visitRBend(const RBend&);
146
148 virtual void visitRBend3D(const RBend3D&);
149
151 virtual void visitRFCavity(const RFCavity&);
152
154 virtual void visitRing(const Ring&);
155
157 virtual void visitSBend(const SBend&);
158
160 virtual void visitSBend3D(const SBend3D&);
161
163 virtual void visitScalingFFAMagnet(const ScalingFFAMagnet&);
164
166 virtual void visitSeptum(const Septum&);
167
169 virtual void visitSolenoid(const Solenoid&);
170
172 virtual void visitSource(const Source&);
173
175 virtual void visitStripper(const Stripper&);
176
178 virtual void visitTravelingWave(const TravelingWave&);
179
180#ifdef ENABLE_OPAL_FEL
182 virtual void visitUndulator(const Undulator&);
183#endif
184
186 virtual void visitVacuum(const Vacuum&);
187
189 virtual void visitVariableRFCavity(const VariableRFCavity& vcav);
190
192 virtual void visitVariableRFCavityFringeField(const VariableRFCavityFringeField& vcav);
193
195 virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet&);
196
197 size_t size() const;
198
199 typedef std::list<const ELEM*> ElementList_t;
200 typedef typename ElementList_t::iterator iterator_t;
201 typedef typename ElementList_t::const_iterator const_iterator_t;
202
203 typedef typename ElementList_t::reference reference_t;
204 typedef typename ElementList_t::const_reference const_reference_t;
205
207 const_iterator_t begin() const;
208
209 iterator_t end();
210 const_iterator_t end() const;
211
213 const_reference_t front() const;
214
215private:
217};
218
219template <class ELEM>
221 : BeamlineVisitor(), allElementsOfTypeE() {
222 beamline.iterate(*this, false);
223}
224
225template <class ELEM>
227
228template <class ELEM>
230 element.iterate(*this, false);
231}
232
233template <class ELEM>
234void SpecificElementVisitor<ELEM>::visitCCollimator(const CCollimator& element) {
235 CastsTrait<ELEM, CCollimator>::apply(allElementsOfTypeE, element);
236}
237
238template <class ELEM>
240 CastsTrait<ELEM, Component>::apply(allElementsOfTypeE, element);
241}
242
243template <class ELEM>
245 CastsTrait<ELEM, Corrector>::apply(allElementsOfTypeE, element);
246}
247
248template <class ELEM>
249void SpecificElementVisitor<ELEM>::visitCyclotron(const Cyclotron& element) {
250 CastsTrait<ELEM, Cyclotron>::apply(allElementsOfTypeE, element);
251}
252
253template <class ELEM>
254void SpecificElementVisitor<ELEM>::visitDegrader(const Degrader& element) {
255 CastsTrait<ELEM, Degrader>::apply(allElementsOfTypeE, element);
256}
257
258template <class ELEM>
262
263template <class ELEM>
265 CastsTrait<ELEM, Drift>::apply(allElementsOfTypeE, element);
266}
267
268template <class ELEM>
270 CastsTrait<ELEM, Laser>::apply(allElementsOfTypeE, element);
271}
272
273template <class ELEM>
275 const ElementBase* wrappedElement = element.getElement();
276 wrappedElement->accept(*this);
277}
278
279template <class ELEM>
280void SpecificElementVisitor<ELEM>::visitFlexibleCollimator(const FlexibleCollimator& element) {
281 CastsTrait<ELEM, FlexibleCollimator>::apply(allElementsOfTypeE, element);
282}
283
284template <class ELEM>
286 CastsTrait<ELEM, Marker>::apply(allElementsOfTypeE, element);
287}
288
289template <class ELEM>
291 CastsTrait<ELEM, Monitor>::apply(allElementsOfTypeE, element);
292}
293
294template <class ELEM>
296 CastsTrait<ELEM, Multipole>::apply(allElementsOfTypeE, element);
297}
298
299template <class ELEM>
301 CastsTrait<ELEM, MultipoleT>::apply(allElementsOfTypeE, element);
302}
303
304template <class ELEM>
308
309template <class ELEM>
314
315template <class ELEM>
317 const MultipoleTCurvedVarRadius& element) {
318 CastsTrait<ELEM, MultipoleTCurvedVarRadius>::apply(allElementsOfTypeE, element);
319}
320
321template <class ELEM>
323 CastsTrait<ELEM, Probe>::apply(allElementsOfTypeE, element);
324}
325
326template <class ELEM>
328 CastsTrait<ELEM, RBend>::apply(allElementsOfTypeE, element);
329}
330
331template <class ELEM>
332void SpecificElementVisitor<ELEM>::visitRBend3D(const RBend3D& element) {
333 CastsTrait<ELEM, RBend3D>::apply(allElementsOfTypeE, element);
334}
335
336template <class ELEM>
338 CastsTrait<ELEM, RFCavity>::apply(allElementsOfTypeE, element);
339}
340
341template <class ELEM>
343 CastsTrait<ELEM, Ring>::apply(allElementsOfTypeE, element);
344}
345
346template <class ELEM>
348 CastsTrait<ELEM, SBend>::apply(allElementsOfTypeE, element);
349}
350
351template <class ELEM>
352void SpecificElementVisitor<ELEM>::visitSBend3D(const SBend3D& element) {
353 CastsTrait<ELEM, SBend3D>::apply(allElementsOfTypeE, element);
354}
355
356template <class ELEM>
360
361template <class ELEM>
362void SpecificElementVisitor<ELEM>::visitSeptum(const Septum& element) {
363 CastsTrait<ELEM, Septum>::apply(allElementsOfTypeE, element);
364}
365
366template <class ELEM>
368 CastsTrait<ELEM, Solenoid>::apply(allElementsOfTypeE, element);
369}
370
371template <class ELEM>
372void SpecificElementVisitor<ELEM>::visitSource(const Source& element) {
373 CastsTrait<ELEM, Source>::apply(allElementsOfTypeE, element);
374}
375
376template <class ELEM>
377void SpecificElementVisitor<ELEM>::visitStripper(const Stripper& element) {
378 CastsTrait<ELEM, Stripper>::apply(allElementsOfTypeE, element);
379}
380
381template <class ELEM>
385
386#ifdef ENABLE_OPAL_FEL
387template <class ELEM>
388void SpecificElementVisitor<ELEM>::visitUndulator(const Undulator& element) {
389 CastsTrait<ELEM, Undulator>::apply(allElementsOfTypeE, element);
390}
391#endif
392
393template <class ELEM>
394void SpecificElementVisitor<ELEM>::visitVacuum(const Vacuum& element) {
395 CastsTrait<ELEM, Vacuum>::apply(allElementsOfTypeE, element);
396}
397
398template <class ELEM>
402
403template <class ELEM>
405 const VariableRFCavityFringeField& element) {
406 CastsTrait<ELEM, VariableRFCavityFringeField>::apply(allElementsOfTypeE, element);
407}
408
409template <class ELEM>
413
414template <class ELEM>
416 return allElementsOfTypeE.size();
417}
418
419template <class ELEM>
421 return allElementsOfTypeE.begin();
422}
423
424template <class ELEM>
426 const {
427 return allElementsOfTypeE.begin();
428}
429
430template <class ELEM>
432 return allElementsOfTypeE.end();
433}
434
435template <class ELEM>
437 return allElementsOfTypeE.end();
438}
439
440template <class ELEM>
442 return allElementsOfTypeE.front();
443}
444
445template <class ELEM>
447 const {
448 return allElementsOfTypeE.front();
449}
450
451#endif
An abstract sequence of beam line components.
Definition Beamline.h:34
virtual void iterate(BeamlineVisitor &, bool reverse) const =0
Apply visitor to all elements of the line.
Component applying a constant accelerating electric field (Ex,Ey,Ez).
Interface for general corrector.
Definition Corrector.h:35
Interface for drift space.
Definition Drift.h:31
virtual void accept(BeamlineVisitor &visitor) const =0
Apply visitor.
ElementBase * getElement() const
Get the element pointer.
Definition ElmPtr.h:56
A section of a beam line.
Passive OPALX laser element.
Definition Laser.h:25
Interface for a marker.
Definition Marker.h:31
Interface for general multipole.
Definition Multipole.h:30
Definition Probe.h:28
Abstract rectangular bend with straight body and curved reference path.
Definition RBend.h:16
Interface for standing wave cavities.
Definition RFCavity.h:34
Ring describes a ring type geometry for tracking.
Definition Ring.h:62
Abstract sector bend with planar-arc body geometry.
Definition SBend.h:15
Abstract class for a solenoid magnet.
Definition Solenoid.h:33
virtual void execute()
Execute the algorithm on the attached beam line.
virtual void visitRing(const Ring &)
Apply the algorithm to a ring.
virtual void visitBeamline(const Beamline &)
Apply the algorithm to a beam line.
virtual void visitStripper(const Stripper &)
Apply the algorithm to a particle stripper.
virtual void visitVariableRFCavity(const VariableRFCavity &vcav)
Apply the algorithm to a variable RF cavity.
virtual void visitFlaggedElmPtr(const FlaggedElmPtr &)
Apply the algorithm to a FlaggedElmPtr.
virtual void visitLaser(const Laser &)
Apply the algorithm to a laser.
virtual void visitMarker(const Marker &)
Apply the algorithm to a marker.
virtual void visitRFCavity(const RFCavity &)
Apply the algorithm to a RF cavity.
virtual void visitVacuum(const Vacuum &)
Apply the algorithm to a vacuum space.
ElementList_t::reference reference_t
virtual void visitVariableRFCavityFringeField(const VariableRFCavityFringeField &vcav)
Apply the algorithm to a variable RF cavity with Fringe Field..
virtual void visitMultipoleTCurvedConstRadius(const MultipoleTCurvedConstRadius &)
Apply the algorithm to an arbitrary curved multipole of constant radius.
virtual void visitSource(const Source &)
Apply the algorithm to a source.
virtual void visitMultipole(const Multipole &)
Apply the algorithm to a multipole.
SpecificElementVisitor(const Beamline &beamline)
virtual void visitMultipoleT(const MultipoleT &)
Apply the algorithm to an arbitrary multipole.
virtual void visitTravelingWave(const TravelingWave &)
Apply the algorithm to a traveling wave.
virtual void visitMultipoleTCurvedVarRadius(const MultipoleTCurvedVarRadius &)
Apply the algorithm to an arbitrary curved multipole of variable radius.
ElementList_t::const_iterator const_iterator_t
virtual void visitDegrader(const Degrader &)
Apply the algorithm to a degrader.
virtual void visitSolenoid(const Solenoid &)
Apply the algorithm to a solenoid.
virtual void visitCorrector(const Corrector &)
Apply the algorithm to a closed orbit corrector.
virtual void visitConstantEFieldCavity(const ConstantEFieldCavity &)
Apply the algorithm to a constant E-field cavity element.
virtual void visitRBend(const RBend &)
Apply the algorithm to a rectangular bend.
ElementList_t::const_reference const_reference_t
virtual void visitCCollimator(const CCollimator &)
Apply the algorithm to a collimator.
virtual void visitMultipoleTStraight(const MultipoleTStraight &)
Apply the algorithm to an arbitrary straight multipole.
virtual void visitSeptum(const Septum &)
Apply the algorithm to a septum.
virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &)
Apply the algorithm to a scaling FFA magnet.
virtual void visitCyclotron(const Cyclotron &)
Apply the algorithm to an cyclotron.
virtual void visitRBend3D(const RBend3D &)
Apply the algorithm to a rectangular bend.
virtual void visitProbe(const Probe &prob)
Apply the algorithm to a probe.
virtual void visitSBend3D(const SBend3D &)
Apply the algorithm to a sector bend with 3D field map.
ElementList_t::iterator iterator_t
virtual void visitFlexibleCollimator(const FlexibleCollimator &)
Apply the algorithm to a flexible collimator.
virtual void visitMonitor(const Monitor &)
Apply the algorithm to a beam position monitor.
virtual void visitSBend(const SBend &)
Apply the algorithm to a sector bend.
virtual void visitDrift(const Drift &)
Apply the algorithm to a drift.
std::list< const ELEM * > ElementList_t
virtual void visitComponent(const Component &)
Apply the algorithm to an arbitrary component.
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)
Apply the algorithm to a vertical FFA magnet.
Interface for traveling wave cavities.
std::list< const ELEM * > ElementList_t
static void apply(ElementList_t &allElements, const ELEM &element)
std::list< const ELEM1 * > ElementList_t
static void apply(ElementList_t &, const ELEM2 &)