OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
Astra1DElectroStatic_fast.cpp
Go to the documentation of this file.
2#include "Physics/Physics.h"
3#include "Physics/Units.h"
5#include "Utilities/Util.h"
6
7#include <fstream>
8#include <ios>
9
11 : Astra1D_fast(aFilename) {
13
14 onAxisField_m = nullptr;
15
17
18 // open field map, parse it and disable element on error
19 std::ifstream file(Filename_m.c_str());
20 if (!file.good()) {
22 zbegin_m = 0.0;
23 zend_m = -1e-3;
24 }
25
26 bool parsing_passed = readFileHeader(file);
27 parsing_passed = parsing_passed && determineNumSamplingPoints(file);
28 file.close();
29
30 if (!parsing_passed && !file.eof()) {
32 zend_m = zbegin_m - 1e-3;
34 "Astra1DElectroStatic_fast::Astra1DElectroStatic_fast",
35 "An error occured when reading the fieldmap '" + Filename_m + "'");
36 }
37 hz_m = (zend_m - zbegin_m) / (num_gridpz_m - 1);
38 length_m = 2.0 * num_gridpz_m * hz_m;
39}
40
44
46 if (onAxisField_m == nullptr) {
47 // declare variables and allocate memory
48
49 onAxisField_m = new double[num_gridpz_m];
50 zvals_m = new double[num_gridpz_m];
51
52 std::ifstream file(Filename_m.c_str());
53 int accuracy = stripFileHeader(file);
54 double maxEz = readFieldData(file);
55 file.close();
56
58
59 std::vector<double> zvals = getEvenlyDistributedSamplingPoints();
60 std::vector<double> evenFieldSampling = interpolateFieldData(zvals);
61 std::vector<double> fourierCoefs = computeFourierCoefficients(accuracy, evenFieldSampling);
62
63 computeFieldDerivatives(fourierCoefs, accuracy);
64
66 accuracy, length_m, zvals, fourierCoefs, onAxisInterpolants_m[0], onAxisAccel_m[0]);
67
68 *ippl::Info << level3 << typeset_msg("read in fieldmap '" + Filename_m + "'", "info")
69 << endl;
70 }
71}
72
75 // do fourier interpolation in z-direction
76 const double RR2 = R(0) * R(0) + R(1) * R(1);
77
78 double ez = gsl_spline_eval(onAxisInterpolants_m[0], R(2) - zbegin_m, onAxisAccel_m[0]);
79 double ezp = gsl_spline_eval(onAxisInterpolants_m[1], R(2) - zbegin_m, onAxisAccel_m[1]);
80 double ezpp = gsl_spline_eval(onAxisInterpolants_m[2], R(2) - zbegin_m, onAxisAccel_m[2]);
81 double ezppp = gsl_spline_eval(onAxisInterpolants_m[3], R(2) - zbegin_m, onAxisAccel_m[3]);
82
83 // expand to off-axis
84 const double EfieldR = -ezp / 2. + ezppp / 16. * RR2;
85
86 E(0) += EfieldR * R(0);
87 E(1) += EfieldR * R(1);
88 E(2) += ez - ezpp * RR2 / 4.;
89 return false;
90}
91
94 const DiffDirection& /*dir*/) const {
95 return false;
96}
97
98void Astra1DElectroStatic_fast::getFieldDimensions(double& zBegin, double& zEnd) const {
99 zBegin = zbegin_m;
100 zEnd = zend_m;
101}
103 double& /*xIni*/, double& /*xFinal*/, double& /*yIni*/, double& /*yFinal*/, double& /*zIni*/,
104 double& /*zFinal*/) const {
105}
106
109
111 (*msg) << Filename_m << " (1D electrostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m
112 << " m;" << endl;
113}
114
116 return 0.0;
117}
118
120}
121
123 std::string tmpString;
124 int tmpInt;
125
126 bool passed;
127 try {
128 passed = interpretLine<std::string, int>(file, tmpString, tmpInt);
129 } catch (GeneralClassicException& e) {
130 passed = interpretLine<std::string, int, std::string>(file, tmpString, tmpInt, tmpString);
131
132 tmpString = Util::toUpper(tmpString);
133 if (tmpString != "TRUE" && tmpString != "FALSE")
135 "Astra1DDynamic_fast::readFileHeader",
136 "The third string on the first line of 1D field "
137 "maps has to be either TRUE or FALSE");
138
139 normalize_m = (tmpString == "TRUE");
140 }
141
142 return passed;
143}
144
146 std::string tmpString;
147 int accuracy;
148
149 try {
150 interpretLine<std::string, int>(file, tmpString, accuracy);
151 } catch (GeneralClassicException& e) {
152 interpretLine<std::string, int, std::string>(file, tmpString, accuracy, tmpString);
153 }
154
155 return accuracy;
156}
ippl::Vector< T, Dim > Vector_t
@ TAstraElectroStatic
Definition Fieldmap.h:20
DiffDirection
Definition Fieldmap.h:55
constexpr double Vpm2MVpm
Definition Units.h:125
std::string toUpper(const std::string &str)
Definition Util.cpp:145
bool determineNumSamplingPoints(std::ifstream &file)
Astra1D_fast(std::string aFilename)
virtual void freeMap()
double readFieldData(std::ifstream &file)
void computeFieldDerivatives(std::vector< double > &fourierComponents, int accuracy)
gsl_spline * onAxisInterpolants_m[4]
double length_m
std::vector< double > getEvenlyDistributedSamplingPoints()
double * onAxisField_m
void normalizeFieldData(double maxEz)
double zbegin_m
double * zvals_m
std::vector< double > computeFourierCoefficients(int accuracy, std::vector< double > &evenSampling)
gsl_interp_accel * onAxisAccel_m[4]
std::vector< double > interpolateFieldData(std::vector< double > &samplingPoints)
virtual bool getFieldDerivative(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B, const DiffDirection &dir) const
Astra1DElectroStatic_fast(std::string aFilename)
bool readFileHeader(std::ifstream &file)
virtual bool getFieldstrength(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) const
virtual void setFrequency(double freq)
int stripFileHeader(std::ifstream &file)
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
MapType Type
Definition Fieldmap.h:118
void checkMap(unsigned int accuracy, std::pair< double, double > fieldDimensions, double deltaZ, const std::vector< double > &fourierCoefficients, gsl_spline *splineCoefficients, gsl_interp_accel *splineAccelerator)
Definition Fieldmap.cpp:413
void disableFieldmapWarning()
Definition Fieldmap.cpp:569
bool normalize_m
Definition Fieldmap.h:123
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 noFieldmapWarning()
Definition Fieldmap.cpp:576