OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
Astra1DElectroStatic_fast.cpp
Go to the documentation of this file.
3 #include "Utilities/Util.h"
4 #include "Physics/Physics.h"
5 #include "Physics/Units.h"
6 
7 #include <fstream>
8 #include <ios>
9 
11  _Astra1D_fast(filename) {
12  numHeaderLines_m = 2;
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;
33  throw GeneralClassicException("_Astra1DElectroStatic_fast::_Astra1DElectroStatic_fast",
34  "An error occured when reading the fieldmap '" + Filename_m + "'");
35  }
36  hz_m = (zend_m - zbegin_m) / (num_gridpz_m - 1);
37  length_m = 2.0 * num_gridpz_m * hz_m;
38 }
39 
41  freeMap();
42 }
43 
45 {
47 }
48 
50  if(onAxisField_m == nullptr) {
51  // declare variables and allocate memory
52 
53  onAxisField_m = new double[num_gridpz_m];
54  zvals_m = new double[num_gridpz_m];
55 
56  std::ifstream file(Filename_m.c_str());
57  int accuracy = stripFileHeader(file);
58  double maxEz = readFieldData(file);
59  file.close();
60 
62 
63  std::vector<double> zvals = getEvenlyDistributedSamplingPoints();
64  std::vector<double> evenFieldSampling = interpolateFieldData(zvals);
65  std::vector<double> fourierCoefs = computeFourierCoefficients(accuracy, evenFieldSampling);
66 
67  computeFieldDerivatives(fourierCoefs, accuracy);
68 
69  checkMap(accuracy,
70  length_m,
71  zvals,
72  fourierCoefs,
74  onAxisAccel_m[0]);
75 
76 
77  INFOMSG(level3 << typeset_msg("read in fieldmap '" + Filename_m + "'", "info") << endl);
78  }
79 }
80 
82  // do fourier interpolation in z-direction
83  const double RR2 = R(0) * R(0) + R(1) * R(1);
84 
85  double ez = gsl_spline_eval(onAxisInterpolants_m[0], R(2) - zbegin_m, onAxisAccel_m[0]);
86  double ezp = gsl_spline_eval(onAxisInterpolants_m[1], R(2) - zbegin_m, onAxisAccel_m[1]);
87  double ezpp = gsl_spline_eval(onAxisInterpolants_m[2], R(2) - zbegin_m, onAxisAccel_m[2]);
88  double ezppp = gsl_spline_eval(onAxisInterpolants_m[3], R(2) - zbegin_m, onAxisAccel_m[3]);
89 
90  // expand to off-axis
91  const double EfieldR = -ezp / 2. + ezppp / 16. * RR2;
92 
93  E(0) += EfieldR * R(0);
94  E(1) += EfieldR * R(1);
95  E(2) += ez - ezpp * RR2 / 4.;
96  return false;
97 }
98 
99 bool _Astra1DElectroStatic_fast::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
100  return false;
101 }
102 
103 void _Astra1DElectroStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
104  zBegin = zbegin_m;
105  zEnd = zend_m;
106 }
107 void _Astra1DElectroStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
108 
110 { }
111 
113  (*msg) << Filename_m << " (1D electrostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
114 }
115 
117  return 0.0;
118 }
119 
121 { }
122 
124  std::string tmpString;
125  int tmpInt;
126 
127  bool passed;
128  try {
129  passed = interpretLine<std::string, int>(file, tmpString, tmpInt);
130  } catch (GeneralClassicException &e) {
131  passed = interpretLine<std::string, int, std::string>(file, tmpString, tmpInt, tmpString);
132 
133  tmpString = Util::toUpper(tmpString);
134  if (tmpString != "TRUE" &&
135  tmpString != "FALSE")
136  throw GeneralClassicException("Astra1DDynamic_fast::readFileHeader",
137  "The third string on the first line of 1D field "
138  "maps has to be either TRUE or FALSE");
139 
140  normalize_m = (tmpString == "TRUE");
141  }
142 
143  return passed;
144 }
145 
147  std::string tmpString;
148  int accuracy;
149 
150  try {
151  interpretLine<std::string, int>(file, tmpString, accuracy);
152  } catch (GeneralClassicException &e) {
153  interpretLine<std::string, int, std::string>(file, tmpString, accuracy, tmpString);
154  }
155 
156  return accuracy;
157 }
MapType Type
Definition: Fieldmap.h:115
int numHeaderLines_m
Definition: Astra1D_fast.h:49
DiffDirection
Definition: Fieldmap.h:55
void noFieldmapWarning()
Definition: Fieldmap.cpp:618
static Astra1DElectroStatic_fast create(const std::string &filename)
double length_m
Definition: Astra1D_fast.h:46
double zbegin_m
Definition: Astra1D_fast.h:44
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
static std::string typeset_msg(const std::string &msg, const std::string &title)
Definition: Fieldmap.cpp:649
gsl_spline * onAxisInterpolants_m[4]
Definition: Astra1D_fast.h:39
std::string toUpper(const std::string &str)
Definition: Util.cpp:147
constexpr double Vpm2MVpm
Definition: Units.h:125
#define INFOMSG(msg)
Definition: IpplInfo.h:348
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
std::vector< double > interpolateFieldData(std::vector< double > &samplingPoints)
double * onAxisField_m
Definition: Astra1D_fast.h:37
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const
bool readFileHeader(std::ifstream &file)
int stripFileHeader(std::ifstream &file)
virtual void freeMap()
void normalizeFieldData(double maxEz)
double readFieldData(std::ifstream &file)
bool normalize_m
Definition: Fieldmap.h:121
_Astra1DElectroStatic_fast(const std::string &filename)
virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const
Definition: Inform.h:42
virtual void setFrequency(double freq)
std::vector< double > getEvenlyDistributedSamplingPoints()
void disableFieldmapWarning()
Definition: Fieldmap.cpp:610
gsl_interp_accel * onAxisAccel_m[4]
Definition: Astra1D_fast.h:40
Inform & level3(Inform &inf)
Definition: Inform.cpp:47
constexpr double e
The value of .
Definition: Physics.h:39
std::string Filename_m
Definition: Fieldmap.h:118
void computeFieldDerivatives(std::vector< double > &fourierComponents, int accuracy)
std::vector< double > computeFourierCoefficients(int accuracy, std::vector< double > &evenSampling)
double * zvals_m
Definition: Astra1D_fast.h:38
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:448
bool determineNumSamplingPoints(std::ifstream &file)
std::shared_ptr< _Astra1DElectroStatic_fast > Astra1DElectroStatic_fast