OPAL (Object Oriented Parallel Accelerator Library) 2024.2
OPAL
OpalTravelingWave.cpp
Go to the documentation of this file.
1//
2// Class OpalTravelingWave
3// The TRAVELINGWAVE element.
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//
22#include "Structure/OpalWake.h"
23#include "Physics/Physics.h"
24#include "Physics/Units.h"
25
27 OpalElement(SIZE, "TRAVELINGWAVE",
28 "The \"TRAVELINGWAVE\" element defines a traveling wave structure."),
29 owk_m(nullptr) {
31 ("VOLT", "RF voltage in MV/m");
33 ("DVOLT", "RF voltage error in MV/m");
35 ("FREQ", "RF frequency in MHz");
37 ("LAG", "Phase lag in rad");
39 ("DLAG", "Phase lag error in rad");
41 ("FMAPFN", "Filename for the fieldmap");
43 ("FAST", "Faster but less accurate", true);
45 ("APVETO", "Do not use this cavity in the Autophase procedure", false);
47 ("NUMCELLS", "Number of cells in a TW structure");
49 ("DESIGNENERGY", "the mean energy of the particles at exit", -1.0);
51 ("MODE", "The phase shift between neighboring cells in 2*pi", 1.0/3.0);
52
54
55 setElement(new TravelingWaveRep("TRAVELINGWAVE"));
56}
57
58
60 OpalElement(name, parent),
61 owk_m(nullptr) {
63}
64
65
69
70
72 return new OpalTravelingWave(name, this);
73}
74
75
78
79 TravelingWaveRep *rfc =
80 dynamic_cast<TravelingWaveRep *>(getElement());
81
82 double length = Attributes::getReal(itsAttr[LENGTH]);
83 double vPeak = Attributes::getReal(itsAttr[VOLT]);
84 double vPeakError = Attributes::getReal(itsAttr[DVOLT]);
85 double phase = Attributes::getReal(itsAttr[LAG]);
86 double phaseError = Attributes::getReal(itsAttr[DLAG]);
88 std::string fmapfm = Attributes::getString(itsAttr[FMAPFN]);
89 bool fast = Attributes::getBool(itsAttr[FAST]);
90 bool apVeto = Attributes::getBool(itsAttr[APVETO]);
91
92 // std::string type = Attributes::getString(itsAttr[TYPE]);
93 double kineticEnergy = Attributes::getReal(itsAttr[DESIGNENERGY]);
94
95 rfc->setElementLength(length);
96 rfc->setAmplitude(Units::MVpm2Vpm * vPeak);
97 rfc->setFrequency(freq);
98 rfc->setPhase(phase);
99
100 rfc->setFieldMapFN(fmapfm);
101 rfc->setFast(fast);
102 rfc->setAutophaseVeto(apVeto);
103 rfc->setAmplitudem(vPeak);
104 rfc->setAmplitudeError(vPeakError);
105 rfc->setFrequencym(freq);
106 rfc->setPhasem(phase);
107 rfc->setPhaseError(phaseError);
110 rfc->setDesignEnergy(kineticEnergy);
111
112 if(itsAttr[WAKEF] && owk_m == nullptr) {
113 owk_m = (OpalWake::find(Attributes::getString(itsAttr[WAKEF])))->clone(getOpalName() + std::string("_wake"));
114 owk_m->initWakefunction(*rfc);
115 rfc->setWake(owk_m->wf_m);
116 }
117
118 // Transmit "unknown" attributes.
120}
const std::string name
Attribute makeBool(const std::string &name, const std::string &help)
Make logical attribute.
double getReal(const Attribute &attr)
Return real value.
Attribute makeReal(const std::string &name, const std::string &help)
Make real attribute.
bool getBool(const Attribute &attr)
Return logical value.
std::string getString(const Attribute &attr)
Get string value.
Attribute makeString(const std::string &name, const std::string &help)
Make string attribute.
constexpr double two_pi
The value of.
Definition Physics.h:33
constexpr double MHz2Hz
Definition Units.h:113
constexpr double MVpm2Vpm
Definition Units.h:128
ElementBase * getElement() const
Return the embedded CLASSIC element.
Definition Element.h:120
void setElement(ElementBase *)
Assign new CLASSIC element.
Definition Element.h:125
const std::string & getOpalName() const
Return object name.
Definition Object.cpp:310
std::vector< Attribute > itsAttr
The object attributes.
Definition Object.h:216
virtual void setElementLength(double length)
Set design length.
virtual void setWake(WakeFunction *wf)
attach a wake field to the element
virtual void setAmplitudeError(double vPeakError)
Definition RFCavity.h:364
virtual void setAmplitudem(double vPeak)
Definition RFCavity.h:354
virtual void setPhaseError(double phaseError)
Definition RFCavity.h:404
virtual void setFrequencym(double freq)
Definition RFCavity.h:379
virtual void setFieldMapFN(const std::string &fmapfn)
Set the name of the field map.
Definition RFCavity.h:349
virtual void setAutophaseVeto(bool veto=true)
Definition RFCavity.h:429
virtual void setDesignEnergy(const double &ekin, bool changeable=true) override
Definition RFCavity.h:334
virtual void setFast(bool fast)
Definition RFCavity.h:419
void setNumCells(int NumCells)
void setMode(double mode)
virtual void setPhasem(double phase) override
virtual void setPhase(double phi)
Set phase.
virtual void setFrequency(double f)
Set frequency.
virtual void setAmplitude(double V)
Set amplitude.
virtual void updateUnknown(ElementBase *)
Transmit the ``unknown'' (not known to OPAL) attributes to CLASSIC.
virtual void update()
Update the embedded CLASSIC element.
OpalElement(int size, const char *name, const char *help)
Exemplar constructor.
void registerOwnership() const
virtual void update()
Update the embedded CLASSIC cavity.
OpalTravelingWave()
Exemplar constructor.
virtual OpalTravelingWave * clone(const std::string &name)
Make clone.
static OpalWake * find(const std::string &name)
Find named WAKE.
Definition OpalWake.cpp:127