OPAL (Object Oriented Parallel Accelerator Library)  2021.1.99
OPAL
DumpFields.cpp
Go to the documentation of this file.
1 //
2 // Class DumpFields
3 // DumpFields dumps the static magnetic field of a Ring in a user-defined grid
4 //
5 // Copyright (c) 2016, Chris Rogers
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 //
19 
21 #include "AbsBeamline/Component.h"
22 #include "Attributes/Attributes.h"
25 #include "Utilities/Util.h"
26 
27 #include <boost/filesystem.hpp>
28 
29 #include <fstream>
30 
31 extern Inform* gmsg;
32 
33 std::unordered_set<DumpFields*> DumpFields::dumpsSet_m;
34 
36  Action(SIZE, "DUMPFIELDS",
37  "The \"DUMPFIELDS\" statement dumps a field map to a user-defined "
38  "field file, for checking that fields are read in correctly "
39  "from disk. The fields are written out on a Cartesian grid.") {
40  // would be nice if "steps" could be integer
42  ("FILE_NAME", "Name of the file to which field data is dumped");
43 
45  ("X_START", "Start point in the grid in x [m]");
46 
48  ("DX", "Grid step size in x [m]");
49 
51  ("X_STEPS", "Number of steps in x");
52 
54  ("Y_START", "Start point in the grid in y [m]");
55 
57  ("DY", "Grid step size in y [m]");
58 
60  ("Y_STEPS", "Number of steps in y");
61 
63  ("Z_START", "Start point in the grid in z [m]");
64 
66  ("DZ", "Grid step size in z [m]");
67 
69  ("Z_STEPS", "Number of steps in z");
70 
72 }
73 
74 DumpFields::DumpFields(const std::string& name, DumpFields* parent):
75  Action(name, parent)
76 {}
77 
79  delete grid_m;
80  dumpsSet_m.erase(this);
81 }
82 
83 DumpFields* DumpFields::clone(const std::string& name) {
84  DumpFields* dumper = new DumpFields(name, this);
85  if (grid_m != NULL) {
86  dumper->grid_m = grid_m->clone();
87  }
88  dumper->filename_m = filename_m;
89  if (dumpsSet_m.find(this) != dumpsSet_m.end()) {
90  dumpsSet_m.insert(dumper);
91  }
92  return dumper;
93 }
94 
96  buildGrid();
97  // the routine for action (OpalParser/OpalParser) calls execute and then
98  // deletes 'this'; so we must build a copy that lasts until the field maps
99  // are constructed and we are ready for tracking (which is when the field
100  // maps are written). Hence the clone call below.
101  dumpsSet_m.insert(this->clone(""));
102 }
103 
105  double x0 = Attributes::getReal(itsAttr[X_START]);
106  double dx = Attributes::getReal(itsAttr[DX]);
107  double nx = Attributes::getReal(itsAttr[X_STEPS]);
108 
109  double y0 = Attributes::getReal(itsAttr[Y_START]);
110  double dy = Attributes::getReal(itsAttr[DY]);
111  double ny = Attributes::getReal(itsAttr[Y_STEPS]);
112 
113  double z0 = Attributes::getReal(itsAttr[Z_START]);
114  double dz = Attributes::getReal(itsAttr[DZ]);
115  double nz = Attributes::getReal(itsAttr[Z_STEPS]);
116 
117  checkInt(nx, "X_STEPS");
118  checkInt(ny, "Y_STEPS");
119  checkInt(nz, "Z_STEPS");
120  delete grid_m;
121 
122  grid_m = new interpolation::ThreeDGrid(dx, dy, dz,
123  x0, y0, z0,
124  nx, ny, nz);
125 
127 }
128 
131  for (dump_iter it = dumpsSet_m.begin(); it != dumpsSet_m.end(); ++it) {
132  (*it)->writeFieldThis(field);
133  }
134 }
135 
136 void DumpFields::checkInt(double real, std::string name, double tolerance) {
137  if (std::abs(std::floor(real) - real) > tolerance) {
138  throw OpalException("DumpFields::checkInt",
139  "Value for " + name +
140  " should be an integer but a real value was found");
141  }
142  if (std::floor(real) < 0.5) {
143  throw OpalException("DumpFields::checkInt",
144  "Value for " + name + " should be 1 or more");
145  }
146 }
147 
149  if (grid_m == NULL) {
150  throw OpalException("DumpFields::writeFieldThis",
151  "The grid was NULL; there was a problem with the DumpFields initialisation.");
152  }
153  if (field == NULL) {
154  throw OpalException("DumpFields::writeFieldThis",
155  "The field to be written was NULL.");
156  }
157 
158  *gmsg << *this << endl;
159 
160  std::string fname;
161  if (boost::filesystem::path(filename_m).is_absolute() == true) {
162  fname = filename_m;
163  } else {
164  fname = Util::combineFilePath({
166  filename_m
167  });
168  }
169 
170  double time = 0.;
171  Vector_t point(0., 0., 0.);
172  Vector_t centroid(0., 0., 0.);
173  std::ofstream fout(fname.c_str(), std::ofstream::out);
174  if (!fout.good()) {
175  throw OpalException("DumpFields::writeFieldThis",
176  "Failed to open DumpFields file " + filename_m);
177  }
178  // set precision
179  fout << grid_m->end().toInteger() << "\n";
180  fout << 1 << " x [m]\n";
181  fout << 2 << " y [m]\n";
182  fout << 3 << " z [m]\n";
183  fout << 4 << " Bx [kGauss]\n";
184  fout << 5 << " By [kGauss]\n";
185  fout << 6 << " Bz [kGauss]\n";
186  fout << 0 << std::endl;
188  it < grid_m->end();
189  ++it) {
190  Vector_t E(0., 0., 0.);
191  Vector_t B(0., 0., 0.);
192  it.getPosition(&point[0]);
193  field->apply(point, centroid, time, E, B);
194  fout << point[0] << " " << point[1] << " " << point[2] << " ";
195  fout << B[0] << " " << B[1] << " " << B[2] << "\n";
196  }
197  if (!fout.good()) {
198  throw OpalException("DumpFields::writeFieldThis",
199  "Something went wrong during writing " + filename_m);
200  }
201  fout.close();
202 }
203 
204 void DumpFields::print(std::ostream& os) const {
205  os << "* ************* D U M P F I E L D S *********************************************** " << std::endl;
206  os << "* File name: " << filename_m << '\n'
207  << "* X_START = " << Attributes::getReal(itsAttr[X_START]) << " [m]\n"
208  << "* DX = " << Attributes::getReal(itsAttr[DX]) << " [m]\n"
209  << "* X_STEPS = " << Attributes::getReal(itsAttr[X_STEPS]) << '\n'
210  << "* Y_START = " << Attributes::getReal(itsAttr[Y_START]) << " [m]\n"
211  << "* DY = " << Attributes::getReal(itsAttr[DY]) << " [m]\n"
212  << "* Y_STEPS = " << Attributes::getReal(itsAttr[Y_STEPS]) << '\n'
213  << "* Z_START = " << Attributes::getReal(itsAttr[Z_START]) << " [m]\n"
214  << "* DZ = " << Attributes::getReal(itsAttr[DZ]) << " [m]\n"
215  << "* Z_STEPS = " << Attributes::getReal(itsAttr[Z_STEPS]) << '\n';
216  os << "* ********************************************************************************** " << std::endl;
217 }
@ SIZE
Definition: IndexMap.cpp:174
Inform * gmsg
Definition: Main.cpp:62
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:733
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
const std::string name
double getReal(const Attribute &attr)
Return real value.
Definition: Attributes.cpp:252
Attribute makeReal(const std::string &name, const std::string &help)
Make real attribute.
Definition: Attributes.cpp:240
std::string getString(const Attribute &attr)
Get string value.
Definition: Attributes.cpp:343
Attribute makeString(const std::string &name, const std::string &help)
Make string attribute.
Definition: Attributes.cpp:332
std::string::iterator iterator
Definition: MSLang.h:16
std::string combineFilePath(std::initializer_list< std::string > ilist)
Definition: Util.cpp:139
The base class for all OPAL actions.
Definition: Action.h:30
void registerOwnership(const AttributeHandler::OwnerType &itsClass) const
Definition: Object.cpp:191
std::vector< Attribute > itsAttr
The object attributes.
Definition: Object.h:216
static OpalData * getInstance()
Definition: OpalData.cpp:195
std::string getAuxiliaryOutputDirectory() const
get the name of the the additional data directory
Definition: OpalData.cpp:650
static void checkInt(double value, std::string name, double tolerance=1e-9)
Definition: DumpFields.cpp:136
virtual void writeFieldThis(Component *field)
Definition: DumpFields.cpp:148
std::string filename_m
Definition: DumpFields.h:123
void print(std::ostream &os) const
Definition: DumpFields.cpp:204
virtual void buildGrid()
Definition: DumpFields.cpp:104
static void writeFields(Component *field)
Definition: DumpFields.cpp:129
static std::unordered_set< DumpFields * > dumpsSet_m
Definition: DumpFields.h:125
interpolation::ThreeDGrid * grid_m
Definition: DumpFields.h:121
virtual void execute()
Definition: DumpFields.cpp:95
virtual DumpFields * clone(const std::string &name)
Definition: DumpFields.cpp:83
virtual ~DumpFields()
Definition: DumpFields.cpp:78
Interface for a single beam element.
Definition: Component.h:50
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B)
Definition: Component.cpp:99
Mesh::Iterator begin() const
Definition: ThreeDGrid.cpp:91
Mesh::Iterator end() const
Definition: ThreeDGrid.cpp:95
ThreeDGrid * clone()
Definition: ThreeDGrid.h:62
The base class for all OPAL exceptions.
Definition: OpalException.h:28
Definition: Inform.h:42