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