OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Monitor.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: Monitor.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.1.1.1 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: Monitor
10 // Defines the abstract interface for a beam position monitor.
11 //
12 // ------------------------------------------------------------------------
13 // Class category: AbsBeamline
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2000/03/27 09:32:31 $
17 // $Author: fci $
18 //
19 // ------------------------------------------------------------------------
20 #include "AbsBeamline/Monitor.h"
21 #include "Physics/Physics.h"
24 #include "Fields/Fieldmap.h"
25 #include "Structure/LossDataSink.h"
26 #include "Utilities/Options.h"
27 #include "Utilities/Util.h"
28 #include <boost/filesystem.hpp>
31 
32 #include <fstream>
33 #include <memory>
34 
35 using namespace std;
36 
37 // Class Monitor
38 // ------------------------------------------------------------------------
39 
40 std::map<double, SetStatistics> Monitor::statFileEntries_sm;
41 const double Monitor::halfLength_s = 0.005;
42 
44  Monitor("")
45 {}
46 
47 
48 Monitor::Monitor(const Monitor &right):
49  Component(right),
50  filename_m(right.filename_m),
51  plane_m(right.plane_m),
52  type_m(right.type_m),
53  numPassages_m(0)
54 {}
55 
56 
57 Monitor::Monitor(const std::string &name):
58  Component(name),
59  filename_m(""),
60  plane_m(OFF),
61  type_m(SPATIAL),
62  numPassages_m(0)
63 {}
64 
65 
67 {}
68 
69 
70 void Monitor::accept(BeamlineVisitor &visitor) const {
71  visitor.visitMonitor(*this);
72 }
73 
74 bool Monitor::apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) {
75  const Vector_t &R = RefPartBunch_m->R[i];
76  const Vector_t &P = RefPartBunch_m->P[i];
77  const double &dt = RefPartBunch_m->dt[i];
78  const double recpgamma = Physics::c * dt / Util::getGamma(P);
79  const double middle = 0.5 * getElementLength();
80  if (online_m && type_m == SPATIAL) {
81  if (dt * R(2) < dt * middle && // multiply with dt to allow back tracking
82  dt * (R(2) + P(2) * recpgamma) > dt * middle) {
83  double frac = (middle - R(2)) / (P(2) * recpgamma);
84 
85  lossDs_m->addParticle(R + frac * recpgamma * P,
86  P, RefPartBunch_m->ID[i], t + frac * dt, 0);
87  }
88  }
89 
90  return false;
91 }
92 
94  const Vector_t &P,
95  const double &t,
96  Vector_t &,
97  Vector_t &) {
98  if (!OpalData::getInstance()->isInPrepState()) {
99  const double dt = RefPartBunch_m->getdT();
100  const double recpgamma = Physics::c * dt / Util::getGamma(P);
101  const double middle = 0.5 * getElementLength();
102 
103  if (dt * R(2) < dt * middle && // multiply with dt to allow back tracking
104  dt * (R(2) + P(2) * recpgamma) > dt * middle) {
105  double frac = (middle - R(2)) / (P(2) * recpgamma);
106  double time = t + frac * dt;
107  Vector_t dR = (0.5 + frac) * P * recpgamma;
108  double ds = euclidean_norm(dR);
109  lossDs_m->addReferenceParticle(csTrafoGlobal2Local_m.transformFrom(R + dR),
111  time,
112  RefPartBunch_m->get_sPos() + ds,
114 
115  if (type_m == TEMPORAL) {
116  const unsigned int localNum = RefPartBunch_m->getLocalNum();
117 
118  for (unsigned int i = 0; i < localNum; ++ i) {
119  const double recpgamma = Physics::c * dt / Util::getGamma(RefPartBunch_m->P[i]);
120  lossDs_m->addParticle(RefPartBunch_m->R[i] + frac * RefPartBunch_m->P[i] * recpgamma - halfLength_s,
122  time, 0);
123  }
124  OpalData::OPENMODE openMode;
125  if (numPassages_m > 0) {
126  openMode = OpalData::OPENMODE::APPEND;
127  } else {
128  openMode = OpalData::getInstance()->getOpenMode();
129  }
130  lossDs_m->save(1, openMode);
131  }
132 
133  ++ numPassages_m;
134  }
135  }
136  return false;
137 }
138 
139 void Monitor::initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField) {
140  RefPartBunch_m = bunch;
141  endField = startField + halfLength_s;
142  startField -= halfLength_s;
143 
144  if (filename_m == std::string(""))
145  filename_m = getName();
146  else
147  filename_m = filename_m.substr(0, filename_m.rfind("."));
148 
149  const size_t totalNum = bunch->getTotalNum();
150  double currentPosition = endField;
151  if (totalNum > 0) {
152  currentPosition = bunch->get_sPos();
153  }
154 
155  if (OpalData::getInstance()->getOpenMode() == OpalData::OPENMODE::WRITE ||
156  currentPosition < startField) {
157  namespace fs = boost::filesystem;
158 
159  fs::path lossFileName = fs::path(filename_m + ".h5");
160  if (fs::exists(lossFileName)) {
161  Ippl::Comm->barrier();
162  if (Ippl::myNode() == 0)
163  fs::remove(lossFileName);
164 
165  Ippl::Comm->barrier();
166  }
167  }
168 
169  lossDs_m = std::unique_ptr<LossDataSink>(new LossDataSink(filename_m, !Options::asciidump, getType()));
170 }
171 
173 
174 }
175 
176 void Monitor::goOnline(const double &) {
177  online_m = true;
178 }
179 
181  auto stats = lossDs_m->computeStatistics(numPassages_m);
182  for (auto &stat: stats) {
183  statFileEntries_sm.insert(std::make_pair(stat.spos_m, stat));
184  }
185 
186  if (type_m != TEMPORAL) {
187  lossDs_m->save(numPassages_m);
188  }
189 }
190 
191 bool Monitor::bends() const {
192  return false;
193 }
194 
195 void Monitor::setOutputFN(std::string fn) {
196  filename_m = fn;
197 }
198 
199 void Monitor::getDimensions(double &zBegin, double &zEnd) const {
200  zBegin = -halfLength_s;
201  zEnd = halfLength_s;
202 }
203 
204 
206  return MONITOR;
207 }
208 
210  if (statFileEntries_sm.size() == 0) return;
211 
212  std::string fileName = OpalData::getInstance()->getInputBasename() + std::string("_Monitors.stat");
213  auto instance = OpalData::getInstance();
214  bool hasPriorTrack = instance->hasPriorTrack();
215  bool inRestartRun = instance->inRestartRun();
216 
217  auto it = statFileEntries_sm.begin();
218  double spos = it->first;
219  Util::rewindLinesSDDS(fileName, spos, false);
220 
221  MonitorStatisticsWriter writer(fileName, hasPriorTrack || inRestartRun);
222 
223  for (const auto &entry: statFileEntries_sm) {
224  writer.addRow(entry.second);
225  }
226 
227  statFileEntries_sm.clear();
228 }
ParticleAttrib< Vector_t > P
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition: Monitor.cpp:139
virtual void accept(BeamlineVisitor &) const override
Apply visitor to Monitor.
Definition: Monitor.cpp:70
Type type_m
Definition: Monitor.h:114
Interface for beam position monitors.
Definition: Monitor.h:41
double getdT() const
std::string filename_m
Definition: Monitor.h:112
bool online_m
Definition: Component.h:201
static std::map< double, SetStatistics > statFileEntries_sm
Definition: Monitor.h:119
CoordinateSystemTrafo csTrafoGlobal2Local_m
Definition: ElementBase.h:466
std::unique_ptr< LossDataSink > lossDs_m
Definition: Monitor.h:117
void barrier(void)
static int myNode()
Definition: IpplInfo.cpp:794
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
FRONT * fs
Definition: hypervolume.cpp:59
unsigned int numPassages_m
Definition: Monitor.h:115
virtual void goOffline() override
Definition: Monitor.cpp:180
size_t getTotalNum() const
virtual void finalise() override
Definition: Monitor.cpp:172
static OpalData * getInstance()
Definition: OpalData.cpp:209
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition: Monitor.cpp:199
static const double halfLength_s
Definition: Monitor.h:120
double getGamma(Vector_t p)
Definition: Util.h:24
ParticleIndex_t & ID
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Definition: Monitor.cpp:74
OPENMODE
Enum for writing to files.
Definition: OpalData.h:69
virtual double getElementLength() const
Get design length.
Definition: ElementBase.h:511
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
PartBunchBase< double, 3 > * RefPartBunch_m
Definition: Component.h:200
OPENMODE getOpenMode() const
Definition: OpalData.cpp:381
virtual ElementBase::ElementType getType() const override
Get element type std::string.
Definition: Monitor.cpp:205
size_t getLocalNum() const
virtual ~Monitor()
Definition: Monitor.cpp:66
ParticleAttrib< double > dt
bool asciidump
Definition: Options.cpp:18
static void writeStatistics()
Definition: Monitor.cpp:209
void addRow(const SetStatistics &set)
Monitor()
Definition: Monitor.cpp:43
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Definition: Monitor.cpp:93
T euclidean_norm(const Vector< T > &)
Euclidean norm.
Definition: Vector.h:243
Vector_t rotateFrom(const Vector_t &r) const
const std::string name
ParticlePos_t & R
virtual void visitMonitor(const Monitor &)=0
Apply the algorithm to a beam position monitor.
Interface for a single beam element.
Definition: Component.h:51
virtual bool bends() const override
Definition: Monitor.cpp:191
unsigned int rewindLinesSDDS(const std::string &fileName, double maxSPos, bool checkForTime)
rewind the SDDS file such that the spos of the last step is less or equal to maxSPos ...
Definition: Util.cpp:154
std::string getInputBasename()
get input file name without extension
Definition: OpalData.cpp:717
Abstract algorithm.
static Communicate * Comm
Definition: IpplInfo.h:93
virtual void goOnline(const double &kineticEnergy) override
Definition: Monitor.cpp:176
void setOutputFN(std::string fn)
Definition: Monitor.cpp:195
long long getGlobalTrackStep() const
Vector_t transformFrom(const Vector_t &r) const