OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
FM3DDynamic.cpp
Go to the documentation of this file.
2
4#include "Fields/Fieldmap.hpp"
5#include "Physics/Physics.h"
6#include "Physics/Units.h"
8#include "Utilities/Options.h"
9#include "Utilities/Util.h"
10
11#include <fstream>
12#include <ios>
13
14FM3DDynamic::FM3DDynamic(std::string aFilename)
15 : Fieldmap(aFilename),
16 FieldstrengthEz_m(nullptr),
17 FieldstrengthEx_m(nullptr),
18 FieldstrengthEy_m(nullptr),
19 FieldstrengthBz_m(nullptr),
20 FieldstrengthBx_m(nullptr),
21 FieldstrengthBy_m(nullptr) {
22 std::string tmpString;
23 double tmpDouble;
24
26 std::ifstream file(Filename_m.c_str());
27
28 if (file.good()) {
29 bool parsing_passed = true;
30 try {
31 parsing_passed = interpretLine<std::string>(file, tmpString);
32 } catch (GeneralClassicException& e) {
33 parsing_passed = interpretLine<std::string, std::string>(file, tmpString, tmpString);
34
35 tmpString = Util::toUpper(tmpString);
36 if (tmpString != "TRUE" && tmpString != "FALSE")
38 "FM3DDynamic::FM3DDynamic",
39 "The second string on the first line of 3D field "
40 "maps has to be either TRUE or FALSE");
41
42 normalize_m = (tmpString == "TRUE");
43 }
44
45 parsing_passed = parsing_passed && interpretLine<double>(file, frequency_m);
46 parsing_passed =
47 parsing_passed
49 parsing_passed =
50 parsing_passed
52 parsing_passed =
53 parsing_passed
55
56 for (unsigned long i = 0;
57 (i < (num_gridpz_m + 1) * (num_gridpx_m + 1) * (num_gridpy_m + 1)) && parsing_passed;
58 ++i) {
59 parsing_passed =
60 parsing_passed
62 file, tmpDouble, tmpDouble, tmpDouble, tmpDouble, tmpDouble, tmpDouble);
63 }
64
65 parsing_passed = parsing_passed && interpreteEOF(file);
66
67 file.close();
68
69 if (!parsing_passed) {
71 zend_m = zbegin_m - 1e-3;
73 "FM3DDynamic::FM3DDynamic",
74 "An error occured when reading the fieldmap '" + Filename_m + "'");
75 } else {
77
84
88
92 }
93 } else {
95 zbegin_m = 0.0;
96 zend_m = -1e-3;
97 }
98}
99
103
105 if (FieldstrengthEz_m == nullptr) {
106 std::ifstream in(Filename_m.c_str());
107 std::string tmpString;
108 const size_t totalSize = num_gridpx_m * num_gridpy_m * num_gridpz_m;
109
110 getLine(in, tmpString);
111 getLine(in, tmpString);
112 getLine(in, tmpString);
113 getLine(in, tmpString);
114 getLine(in, tmpString);
115
116 FieldstrengthEz_m = new double[totalSize];
117 FieldstrengthEx_m = new double[totalSize];
118 FieldstrengthEy_m = new double[totalSize];
119 FieldstrengthBz_m = new double[totalSize];
120 FieldstrengthBx_m = new double[totalSize];
121 FieldstrengthBy_m = new double[totalSize];
122
123 long ii = 0;
124 for (unsigned int i = 0; i < num_gridpx_m; ++i) {
125 for (unsigned int j = 0; j < num_gridpy_m; ++j) {
126 for (unsigned int k = 0; k < num_gridpz_m; ++k) {
130 ++ii;
131 }
132 }
133 }
134 in.close();
135
136 const unsigned int deltaX = num_gridpy_m * num_gridpz_m;
137 const unsigned int deltaY = num_gridpz_m;
138 double Ezmax = 0.0;
139
140 if (normalize_m) {
141 int index_x = static_cast<int>(ceil(-xbegin_m / hx_m));
142 double lever_x = index_x * hx_m + xbegin_m;
143 if (lever_x > 0.5) {
144 --index_x;
145 }
146
147 int index_y = static_cast<int>(ceil(-ybegin_m / hy_m));
148 double lever_y = index_y * hy_m + ybegin_m;
149 if (lever_y > 0.5) {
150 --index_y;
151 }
152
153 ii = index_x * deltaX + index_y * deltaY;
154 for (unsigned int i = 0; i < num_gridpz_m; i++) {
155 if (std::abs(FieldstrengthEz_m[ii]) > Ezmax) {
156 Ezmax = std::abs(FieldstrengthEz_m[ii]);
157 }
158 ++ii;
159 }
160 } else {
161 Ezmax = 1.0;
162 }
163
164 for (unsigned long i = 0; i < totalSize; ++i) {
168 FieldstrengthBx_m[i] *= Physics::mu_0 / Ezmax;
169 FieldstrengthBy_m[i] *= Physics::mu_0 / Ezmax;
170 FieldstrengthBz_m[i] *= Physics::mu_0 / Ezmax;
171 }
172
173 *ippl::Info << level3 << typeset_msg("read in fieldmap '" + Filename_m + "'", "info")
174 << "\n"
175 << endl;
176
177 if (Options::ebDump) {
178 std::vector<Vector_t<double, 3>> ef(num_gridpz_m * num_gridpy_m * num_gridpx_m, 0.0);
179 std::vector<Vector_t<double, 3>> bf(ef);
180 unsigned long l = 0;
181 for (unsigned long k = 0; k < num_gridpz_m; ++k) {
182 const unsigned long index_z = k;
183 for (unsigned long j = 0; j < num_gridpy_m; ++j) {
184 const unsigned long index_y = j * deltaY;
185 for (unsigned long i = 0; i < num_gridpx_m; ++i) {
186 const unsigned long index = i * deltaX + index_y + index_z;
187 ef[l] = Vector_t<double, 3>(
189 FieldstrengthEz_m[index]);
190 bf[l] = Vector_t<double, 3>(
192 FieldstrengthBz_m[index]);
193 ++l;
194 }
195 }
196 }
199 std::make_pair(ybegin_m, yend_m), std::make_pair(zbegin_m, zend_m), ef, bf);
200 }
201 }
202}
203
205 if (FieldstrengthEz_m != nullptr) {
206 delete[] FieldstrengthEz_m;
207 delete[] FieldstrengthEx_m;
208 delete[] FieldstrengthEy_m;
209 delete[] FieldstrengthBz_m;
210 delete[] FieldstrengthBx_m;
211 delete[] FieldstrengthBy_m;
212
213 FieldstrengthEz_m = nullptr;
214 FieldstrengthEx_m = nullptr;
215 FieldstrengthEy_m = nullptr;
216 FieldstrengthBz_m = nullptr;
217 FieldstrengthBx_m = nullptr;
218 FieldstrengthBy_m = nullptr;
219
220 *ippl::Info << level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info") << "\n"
221 << endl;
222 }
223}
224
227 const unsigned int index_x = static_cast<int>(std::floor((R(0) - xbegin_m) / hx_m));
228 const double lever_x = (R(0) - xbegin_m) / hx_m - index_x;
229
230 const unsigned int index_y = static_cast<int>(std::floor((R(1) - ybegin_m) / hy_m));
231 const double lever_y = (R(1) - ybegin_m) / hy_m - index_y;
232
233 const unsigned int index_z = (int)std::floor((R(2) - zbegin_m) / hz_m);
234 const double lever_z = (R(2) - zbegin_m) / hz_m - index_z;
235
236 if (index_z >= num_gridpz_m - 2) {
237 return false;
238 }
239
240 if (index_x >= num_gridpx_m - 2 || index_y >= num_gridpy_m - 2) {
241 return true;
242 }
243 const unsigned int deltaX = num_gridpy_m * num_gridpz_m;
244 const unsigned int deltaY = num_gridpz_m;
245 const unsigned int deltaZ = 1;
246
247 const unsigned long index1 = index_x * deltaX + index_y * deltaY + index_z * deltaZ;
248
249 E(0) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEx_m[index1]
250 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEx_m[index1 + deltaX]
251 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthEx_m[index1 + deltaY]
252 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthEx_m[index1 + deltaX + deltaY]
253 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthEx_m[index1 + deltaZ]
254 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthEx_m[index1 + deltaX + deltaZ]
255 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthEx_m[index1 + deltaY + deltaZ]
256 + lever_x * lever_y * lever_z * FieldstrengthEx_m[index1 + deltaX + deltaY + deltaZ];
257
258 E(1) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEy_m[index1]
259 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEy_m[index1 + deltaX]
260 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthEy_m[index1 + deltaY]
261 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthEy_m[index1 + deltaX + deltaY]
262 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthEy_m[index1 + deltaZ]
263 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthEy_m[index1 + deltaX + deltaZ]
264 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthEy_m[index1 + deltaY + deltaZ]
265 + lever_x * lever_y * lever_z * FieldstrengthEy_m[index1 + deltaX + deltaY + deltaZ];
266
267 E(2) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEz_m[index1]
268 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthEz_m[index1 + deltaX]
269 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthEz_m[index1 + deltaY]
270 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthEz_m[index1 + deltaX + deltaY]
271 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthEz_m[index1 + deltaZ]
272 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthEz_m[index1 + deltaX + deltaZ]
273 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthEz_m[index1 + deltaY + deltaZ]
274 + lever_x * lever_y * lever_z * FieldstrengthEz_m[index1 + deltaX + deltaY + deltaZ];
275
276 B(0) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBx_m[index1]
277 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBx_m[index1 + deltaX]
278 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthBx_m[index1 + deltaY]
279 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthBx_m[index1 + deltaX + deltaY]
280 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthBx_m[index1 + deltaZ]
281 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthBx_m[index1 + deltaX + deltaZ]
282 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthBx_m[index1 + deltaY + deltaZ]
283 + lever_x * lever_y * lever_z * FieldstrengthBx_m[index1 + deltaX + deltaY + deltaZ];
284
285 B(1) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBy_m[index1]
286 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBy_m[index1 + deltaX]
287 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthBy_m[index1 + deltaY]
288 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthBy_m[index1 + deltaX + deltaY]
289 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthBy_m[index1 + deltaZ]
290 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthBy_m[index1 + deltaX + deltaZ]
291 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthBy_m[index1 + deltaY + deltaZ]
292 + lever_x * lever_y * lever_z * FieldstrengthBy_m[index1 + deltaX + deltaY + deltaZ];
293
294 B(2) += (1.0 - lever_x) * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBz_m[index1]
295 + lever_x * (1.0 - lever_y) * (1.0 - lever_z) * FieldstrengthBz_m[index1 + deltaX]
296 + (1.0 - lever_x) * lever_y * (1.0 - lever_z) * FieldstrengthBz_m[index1 + deltaY]
297 + lever_x * lever_y * (1.0 - lever_z) * FieldstrengthBz_m[index1 + deltaX + deltaY]
298 + (1.0 - lever_x) * (1.0 - lever_y) * lever_z * FieldstrengthBz_m[index1 + deltaZ]
299 + lever_x * (1.0 - lever_y) * lever_z * FieldstrengthBz_m[index1 + deltaX + deltaZ]
300 + (1.0 - lever_x) * lever_y * lever_z * FieldstrengthBz_m[index1 + deltaY + deltaZ]
301 + lever_x * lever_y * lever_z * FieldstrengthBz_m[index1 + deltaX + deltaY + deltaZ];
302
303 return false;
304}
305
308 const DiffDirection& /*dir*/) const {
309 return false;
310}
311
312void FM3DDynamic::getFieldDimensions(double& zBegin, double& zEnd) const {
313 zBegin = zbegin_m;
314 zEnd = zend_m;
315}
317 double& /*xIni*/, double& /*xFinal*/, double& /*yIni*/, double& /*yFinal*/, double& /*zIni*/,
318 double& /*zFinal*/) const {
319}
320
322}
323
324void FM3DDynamic::getInfo(Inform* msg) {
325 (*msg) << Filename_m << " (3D dynamic) "
326 << " xini= " << xbegin_m << " xfinal= " << xend_m << " yini= " << ybegin_m
327 << " yfinal= " << yend_m << " zini= " << zbegin_m << " zfinal= " << zend_m << " (m) "
328 << endl;
329}
330
332 return frequency_m;
333}
334
335void FM3DDynamic::setFrequency(double freq) {
336 frequency_m = freq;
337}
338
339void FM3DDynamic::getOnaxisEz(std::vector<std::pair<double, double>>& F) {
340 F.resize(num_gridpz_m);
341
342 int index_x = static_cast<int>(ceil(-xbegin_m / hx_m));
343 double lever_x = index_x * hx_m + xbegin_m;
344 if (lever_x > 0.5) {
345 --index_x;
346 }
347
348 int index_y = static_cast<int>(ceil(-ybegin_m / hy_m));
349 double lever_y = index_y * hy_m + ybegin_m;
350 if (lever_y > 0.5) {
351 --index_y;
352 }
353
354 unsigned int ii = (index_y + index_x * num_gridpy_m) * num_gridpz_m;
355 for (unsigned int i = 0; i < num_gridpz_m; ++i) {
356 F[i].first = hz_m * i;
357 F[i].second = FieldstrengthEz_m[ii++] / 1e6;
358 }
359
360 auto opal = OpalData::getInstance();
361 if (opal->isOptimizerRun())
362 return;
363
364 std::string fname = Util::combineFilePath({opal->getAuxiliaryOutputDirectory(), Filename_m});
365 std::ofstream out(fname);
366 for (unsigned int i = 0; i < num_gridpz_m; ++i) {
367 Vector_t<double, 3> R(0, 0, zbegin_m + F[i].first), B(0.0), E(0.0);
368 getFieldstrength(R, E, B);
369 out << std::setw(16) << std::setprecision(8) << F[i].first << std::setw(16)
370 << std::setprecision(8) << E(0) << std::setw(16) << std::setprecision(8) << E(1)
371 << std::setw(16) << std::setprecision(8) << E(2) << std::setw(16)
372 << std::setprecision(8) << B(0) << std::setw(16) << std::setprecision(8) << B(1)
373 << std::setw(16) << std::setprecision(8) << B(2) << "\n";
374 }
375 out.close();
376}
ippl::Vector< T, Dim > Vector_t
@ T3DDynamic
Definition Fieldmap.h:31
DiffDirection
Definition Fieldmap.h:55
constexpr double two_pi
The value of.
Definition Physics.h:33
constexpr double mu_0
The permeability of vacuum in Vs/Am.
Definition Physics.h:48
constexpr double MHz2Hz
Definition Units.h:113
constexpr double cm2m
Definition Units.h:35
constexpr double MVpm2Vpm
Definition Units.h:128
bool ebDump
Definition Options.cpp:65
std::string combineFilePath(std::initializer_list< std::string > ilist)
Definition Util.cpp:197
std::string toUpper(const std::string &str)
Definition Util.cpp:145
static OpalData * getInstance()
Definition OpalData.cpp:195
MapType Type
Definition Fieldmap.h:118
bool interpreteEOF(std::ifstream &in)
Definition Fieldmap.cpp:516
void disableFieldmapWarning()
Definition Fieldmap.cpp:569
static std::string typeset_msg(const std::string &msg, const std::string &title)
Definition Fieldmap.cpp:607
std::string Filename_m
Definition Fieldmap.h:120
bool interpretLine(std::ifstream &in, S &value, const bool &file_length_known=true)
void getLine(std::ifstream &in, std::string &buffer)
Definition Fieldmap.h:124
void noFieldmapWarning()
Definition Fieldmap.cpp:576
void write3DField(unsigned int nx, unsigned int ny, unsigned int nz, const std::pair< double, double > &xrange, const std::pair< double, double > &yrange, const std::pair< double, double > &zrange, const std::vector< Vector_t< double, 3 > > &ef, const std::vector< Vector_t< double, 3 > > &bf)
Definition Fieldmap.cpp:691
virtual void getInfo(Inform *msg)
double * FieldstrengthEx_m
Definition FM3DDynamic.h:28
double hy_m
Definition FM3DDynamic.h:46
double * FieldstrengthBx_m
Definition FM3DDynamic.h:31
double xend_m
Definition FM3DDynamic.h:37
unsigned int num_gridpz_m
Definition FM3DDynamic.h:50
double zbegin_m
Definition FM3DDynamic.h:42
unsigned int num_gridpy_m
Definition FM3DDynamic.h:49
double frequency_m
Definition FM3DDynamic.h:34
double * FieldstrengthEz_m
Definition FM3DDynamic.h:27
double ybegin_m
Definition FM3DDynamic.h:39
friend class Fieldmap
Definition FM3DDynamic.h:53
unsigned int num_gridpx_m
Definition FM3DDynamic.h:48
virtual bool getFieldstrength(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) const
double zend_m
Definition FM3DDynamic.h:43
bool normalize_m
Definition FM3DDynamic.h:52
virtual void swap()
virtual void getOnaxisEz(std::vector< std::pair< double, double > > &F)
virtual void freeMap()
double * FieldstrengthBy_m
Definition FM3DDynamic.h:32
virtual void setFrequency(double freq)
FM3DDynamic(std::string aFilename)
virtual void readMap()
double hx_m
Definition FM3DDynamic.h:45
double xbegin_m
Definition FM3DDynamic.h:36
double * FieldstrengthBz_m
Definition FM3DDynamic.h:30
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
virtual bool getFieldDerivative(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B, const DiffDirection &dir) const
double yend_m
Definition FM3DDynamic.h:40
virtual double getFrequency() const
double hz_m
Definition FM3DDynamic.h:47
double * FieldstrengthEy_m
Definition FM3DDynamic.h:29