7 #include "gsl/gsl_fft_real.h" 
   21     if (fieldFile.good()) {
 
   57         std::vector<double> fourierCoefs
 
   65                                 onAxisFieldPP, onAxisFieldPPP);
 
   71         delete [] onAxisFieldP;
 
   72         delete [] onAxisFieldPP;
 
   73         delete [] onAxisFieldPPP;
 
  102     std::vector<double> fieldComponents;
 
  128                                                 double &, 
double &)
 const {}
 
  135            << 
" (1D electrotostatic); zini= " 
  148                                            bool parsingPassed) {
 
  152         parsingPassed = parsingPassed
 
  153             && interpretLine<double>(fieldFile, tempDouble);
 
  160                                                      double onAxisFieldP[],
 
  161                                                      double onAxisFieldPP[],
 
  162                                                      double onAxisFieldPPP[]) {
 
  168         onAxisFieldP[zStepIndex] = 0.0;
 
  169         onAxisFieldPP[zStepIndex] = 0.0;
 
  170         onAxisFieldPPP[zStepIndex] = 0.0;
 
  176             double coskzn = 
cos(kz * 
n);
 
  177             double sinkzn = 
sin(kz * 
n);
 
  179             onAxisFieldP[zStepIndex] += kn * (-fourierCoefs.at(coefIndex) * sinkzn
 
  180                                               - fourierCoefs.at(coefIndex + 1) * coskzn);
 
  182             double derivCoeff = 
pow(kn, 2.0);
 
  183             onAxisFieldPP[zStepIndex] += derivCoeff * (-fourierCoefs.at(coefIndex) * coskzn
 
  184                                                        + fourierCoefs.at(coefIndex + 1) * sinkzn);
 
  186             onAxisFieldPPP[zStepIndex] += derivCoeff * (fourierCoefs.at(coefIndex) * sinkzn
 
  187                                                         + fourierCoefs.at(coefIndex + 1) * coskzn);
 
  195                                                  std::vector<double> fieldComponents)
 const {
 
  197     double radiusSq = 
pow(
R(0), 2.0) + 
pow(
R(1), 2.0);
 
  198     double transverseEFactor = -fieldComponents.at(1) / 2.0
 
  199         + radiusSq * fieldComponents.at(3) / 16.0;
 
  201     E(0) += 
R(0) * transverseEFactor;
 
  202     E(1) += 
R(1) * transverseEFactor;
 
  203     E(2) += fieldComponents.at(0) - fieldComponents.at(2) * radiusSq / 4.0;
 
  208                                                 std::vector<double> &fieldComponents)
 const {
 
  223     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
 
  224     gsl_fft_real_workspace *workSpace = gsl_fft_real_workspace_alloc(totalSize);
 
  227     double *fieldDataReflected = 
new double[totalSize];
 
  230             fieldData[dataIndex];
 
  232             fieldData[dataIndex];
 
  235     gsl_fft_real_transform(fieldDataReflected, 1,
 
  237                            waveTable, workSpace);
 
  239     std::vector<double> fourierCoefs;
 
  240     fourierCoefs.push_back(fieldDataReflected[0] / totalSize);
 
  241     for (
unsigned int coefIndex = 1; coefIndex + 1 < 2 * 
accuracy_m; ++ coefIndex)
 
  242         fourierCoefs.push_back(2.0 * fieldDataReflected[coefIndex] / totalSize);
 
  244     delete [] fieldDataReflected;
 
  245     gsl_fft_real_workspace_free(workSpace);
 
  246     gsl_fft_real_wavetable_free(waveTable);
 
  253                                                          double onAxisFieldPP[],
 
  254                                                          double onAxisFieldPPP[]) {
 
  267         z[zStepIndex] = 
deltaZ_m * zStepIndex;
 
  301     for (
auto fourierIt = fourierCoefs.begin(); fourierIt < fourierCoefs.end(); ++ fourierIt)
 
  302         *fourierIt *= 1.0e6 / maxEz;
 
  307                                             double fieldData[]) {
 
  311         interpretLine<double>(fieldFile, fieldData[dataIndex]);
 
  312         if (
std::abs(fieldData[dataIndex]) > maxEz)
 
  313             maxEz = 
std::abs(fieldData[dataIndex]);
 
  324     std::string tempString;
 
  327     bool parsingPassed = 
true;
 
  329         parsingPassed = interpretLine<std::string, unsigned int>(fieldFile,
 
  333         parsingPassed = interpretLine<std::string, unsigned int, std::string>(fieldFile,
 
  339         if (tempString != 
"TRUE" &&
 
  340             tempString != 
"FALSE")
 
  342                                           "The third string on the first line of 1D field " 
  343                                           "maps has to be either TRUE or FALSE");
 
  347     parsingPassed = parsingPassed &&
 
  348         interpretLine<double, double, unsigned int>(fieldFile,
 
  352     parsingPassed = parsingPassed &&
 
  353         interpretLine<double, double, int>(fieldFile,
 
  362     return parsingPassed;
 
  367     std::string tempString;
 
  369     getLine(fieldFile, tempString);
 
  370     getLine(fieldFile, tempString);
 
  371     getLine(fieldFile, tempString);
 
  377         zSampling[zStepIndex] = 
deltaZ_m * zStepIndex;
 
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Inform & endl(Inform &inf)
Inform & level3(Inform &inf)
constexpr double two_pi
The value of.
constexpr double e
The value of.
constexpr double pi
The value of.
std::string toUpper(const std::string &str)
bool interpreteEOF(std::ifstream &in)
void checkMap(unsigned int accuracy, std::pair< double, double > fieldDimensions, double deltaZ, const std::vector< double > &fourierCoefficients, gsl_spline *splineCoefficients, gsl_interp_accel *splineAccelerator)
void disableFieldmapWarning()
static std::string typeset_msg(const std::string &msg, const std::string &title)
void getLine(std::ifstream &in, std::string &buffer)
gsl_spline * onAxisFieldPInterpolants_m
On axis field interpolation structure.
std::vector< double > computeFourierCoefficients(double fieldData[])
void computeFieldDerivatives(std::vector< double > fourierCoefs, double onAxisFieldP[], double onAxisFieldPP[], double onAxisFieldPPP[])
void normalizeField(double maxEz, std::vector< double > &fourierCoefs)
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const
gsl_interp_accel * onAxisFieldPAccel_m
void computeFieldOnAxis(double z, std::vector< double > &fieldComponents) const
void stripFileHeader(std::ifstream &fieldFile)
unsigned int numberOfGridPoints_m
Field length.
virtual void getInfo(Inform *)
unsigned int accuracy_m
Field grid point spacing.
FM1DElectroStatic_fast(std::string aFilename)
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
double zEnd_m
Longitudinal start of field.
gsl_spline * onAxisFieldInterpolants_m
On axis field data.
virtual double getFrequency() const
double readFileData(std::ifstream &fieldFile, double fieldData[])
gsl_interp_accel * onAxisFieldPPPAccel_m
gsl_spline * onAxisFieldPPInterpolants_m
On axis field first derivative interpolation structure.
gsl_interp_accel * onAxisFieldAccel_m
On axis field third derivative interpolation structure.
double rEnd_m
Minimum radius of field.
virtual void setFrequency(double freq)
~FM1DElectroStatic_fast()
bool readFileHeader(std::ifstream &fieldFile)
double length_m
Longitudinal end of field.
double zBegin_m
Maximum radius of field.
void computeFieldOffAxis(const Vector_t &R, Vector_t &E, Vector_t &B, std::vector< double > fieldComponents) const
bool checkFileData(std::ifstream &fieldFile, bool parsingPassed)
double deltaZ_m
Number of grid points in field input file.
virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const
gsl_spline * onAxisFieldPPPInterpolants_m
On axis field second derivative interpolation structure.
void computeInterpolationVectors(double onAxisFieldP[], double onAxisFieldPP[], double onAxisFieldPPP[])
gsl_interp_accel * onAxisFieldPPAccel_m
void prepareForMapCheck(std::vector< double > &fourierCoefs)