12 EngeCoefs_entry_m(nullptr),
13 EngeCoefs_exit_m(nullptr),
17 cosExitRotation_m(1.0),
18 sinExitRotation_m(0.0) {
21 std::string tmpString;
29 bool parsing_passed = \
30 interpretLine<std::string, int, int, double>(file,
35 parsing_passed = parsing_passed &&
36 interpretLine<double, double, double, int>(file,
41 parsing_passed = parsing_passed &&
42 interpretLine<double, double, double, int>(file,
47 for (
int i = 0; (i < num_gridpz + 1) && parsing_passed; ++ i) {
48 parsing_passed = parsing_passed &&
49 interpretLine<double>(file, tmpDouble);
52 parsing_passed = parsing_passed &&
58 if (!parsing_passed) {
60 zend_exit_m = zbegin_entry_m - 1
e-3;
61 zend_entry_m = zbegin_entry_m - 1e-3;
62 zbegin_exit_m = zbegin_entry_m - 1e-3;
97 double tolerance = 1
e-8;
102 std::string tmpString;
105 double minValue = 99999999.99, maxValue = -99999999.99;
107 int num_gridp_fringe_entry, num_gridp_fringe_exit;
108 int num_gridp_before_fringe_entry, num_gridp_before_fringe_exit;
110 double *rightHandSide;
111 double *leastSquareMatrix;
114 interpretLine<std::string, int, int, double>(in, tmpString, tmpInt, tmpInt, tmpDouble);
115 interpretLine<double, double, double, int>(in, tmpDouble, tmpDouble, tmpDouble, num_gridpz);
116 interpretLine<double, double, double, int>(in, tmpDouble, tmpDouble, tmpDouble, tmpInt);
123 RealValues =
new double[num_gridpz + 1];
125 for (
int i = 0; i < num_gridpz + 1; ++i) {
126 interpretLine<double>(in, RealValues[i]);
127 if (RealValues[i] > maxValue) maxValue = RealValues[i];
128 else if (RealValues[i] < minValue) minValue = RealValues[i];
133 for (
int i = 0; i < num_gridpz + 1; ++i)
134 RealValues[i] = (RealValues[i] - minValue) / (maxValue - minValue);
138 while(i < num_gridpz + 1 && RealValues[i] < tolerance) ++i;
139 num_gridp_before_fringe_entry = i - 1;
142 while(i < num_gridpz + 1 && RealValues[i] < 1. - tolerance) ++i;
143 num_gridp_fringe_entry = i - 1 - num_gridp_before_fringe_entry;
146 while(i < num_gridpz + 1 && RealValues[i] >= 1. - tolerance) ++i;
147 num_gridp_before_fringe_exit = i - 1;
149 while(i < num_gridpz + 1 && RealValues[i] > tolerance) ++i;
150 num_gridp_fringe_exit = i - 1 - num_gridp_before_fringe_exit;
154 int num_gridp_fringe =
std::max(num_gridp_fringe_entry, num_gridp_fringe_exit);
156 leastSquareMatrix =
new double[(polynomialOrder + 1) * num_gridp_fringe];
157 rightHandSide =
new double[num_gridp_fringe];
161 for (
int i = 0; i < num_gridp_fringe_entry; ++i) {
162 double powerOfZ = 1.;
164 rightHandSide[i] =
log(1. / RealValues[num_gridp_before_fringe_entry + i + 1] - 1.);
166 leastSquareMatrix[i * (polynomialOrder_entry_m + 1) + j] = powerOfZ;
174 for (
int i = 0; i < num_gridp_fringe_exit; ++i) {
175 double powerOfZ = 1.;
177 rightHandSide[i] =
log(1. / RealValues[num_gridp_before_fringe_exit + i + 1] - 1.);
179 leastSquareMatrix[i * (polynomialOrder_exit_m + 1) + j] = powerOfZ;
191 delete[] leastSquareMatrix;
192 delete[] rightHandSide;
243 double S = EngeCoefs[polynomialOrder] * z;
244 S += EngeCoefs[polynomialOrder - 1];
245 double dSdz = polynomialOrder * EngeCoefs[polynomialOrder];
247 for (
int i = polynomialOrder - 2; i >= 0; i--) {
248 S = S * z + EngeCoefs[i];
249 dSdz = dSdz * z + (i + 1) * EngeCoefs[i + 1];
250 d2Sdz2 = d2Sdz2 * z + (i + 2) * (i + 1) * EngeCoefs[i + 2];
253 double f = 1.0 / (1.0 + expS);
256 double dfdz = - f * ((f * expS) * dSdz);
259 double d2fdz2 = ((-d2Sdz2 - dSdz * dSdz * (1. - 2. * (expS * f))) * (f * expS) * f) / (
gapHeight_m *
gapHeight_m);
263 strength(2) = d2fdz2;
359 zExit_m = polynomialOrigin_entry_m + deltaZ *
std::cos(bendAngle / 2.0);
366 namespace QRDecomposition {
367 void solve(
double *
Matrix,
double *Solution,
double *rightHandSide,
const int &M,
const int &N) {
372 double *
R =
new double[M * N];
373 double *tempVector =
new double[M];
374 double *residuum =
new double[M];
376 for (
int i = 0; i < M; ++i) {
377 for (
int j = 0; j < N; ++j)
378 R[i * N + j] = Matrix[i * N + j];
379 tempVector[i] = rightHandSide[i];
383 for (
int i = 0; i < N; ++i) {
384 for (
int j = i + 1; j < M; ++j) {
385 len =
std::sqrt(R[j * N + i] * R[j * N + i] + R[i * (N + 1)] * R[i * (N + 1)]);
386 sinphi = -R[j * N + i] / len;
387 cosphi = R[i * (N + 1)] / len;
389 for (
int k = 0; k < N; ++k) {
390 tempValue = cosphi * R[ i * N + k] - sinphi * R[ j * N + k];
391 R[j * N + k] = sinphi * R[ i * N + k] + cosphi * R[ j * N + k];
392 R[i * N + k] = tempValue;
400 for (
int i = 0; i < N; ++i) {
402 for (
int j = 0; j < M; ++j) {
403 tempValue += Matrix[j * N + i] * rightHandSide[j];
405 Solution[i] = tempValue;
408 for (
int i = 0; i < N; ++i) {
410 for (
int j = 0; j < i; ++j)
411 tempValue += R[j * N + i] * residuum[j];
412 residuum[i] = (Solution[i] - tempValue) / R[i * (N + 1)];
415 for (
int i = N - 1; i >= 0; --i) {
417 for (
int j = N - 1; j > i; --j)
418 tempValue += R[i * N + j] * Solution[j];
419 Solution[i] = (residuum[i] - tempValue) / R[i * (N + 1)];
422 for (
int i = 0; i < M; ++i) {
424 for (
int j = 0; j < N; ++j)
425 tempValue += Matrix[i * N + j] * Solution[j];
426 residuum[i] = rightHandSide[i] - tempValue;
429 for (
int i = 0; i < N; ++i) {
431 for (
int j = 0; j < M; ++j)
432 tempValue += Matrix[j * N + i] * residuum[j];
433 tempVector[i] = tempValue;
436 for (
int i = 0; i < N; ++i) {
438 for (
int j = 0; j < i; ++j)
439 tempValue += R[j * N + i] * residuum[j];
440 residuum[i] = (tempVector[i] - tempValue) / R[i * (N + 1)];
443 for (
int i = N - 1; i >= 0; --i) {
445 for (
int j = N - 1; j > i; --j)
446 tempValue += R[i * N + j] * tempVector[j];
447 tempVector[i] = (residuum[i] - tempValue) / R[i * (N + 1)];
448 Solution[i] += tempVector[i];
double * EngeCoefs_entry_m
virtual void setFrequency(double freq)
Tps< T > sqrt(const Tps< T > &x)
Square root.
void solve(double *Matrix, double *Solution, double *rightHandSide, const int &M, const int &N)
virtual double getFrequency() const
virtual void getInfo(Inform *)
double cosExitRotation_m
Cos and sin of the exit edge rotation with respect to the local coordinates.
virtual void setExitFaceSlope(const double &)
double * EngeCoefs_exit_m
Vektor< double, 3 > Vector_t
double polynomialOrigin_entry_m
static std::string typeset_msg(const std::string &msg, const std::string &title)
Tps< T > exp(const Tps< T > &x)
Exponential.
Inform & endl(Inform &inf)
bool interpreteEOF(std::ifstream &in)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
static FM1DProfile2 create(const std::string &filename)
int polynomialOrder_exit_m
int polynomialOrder_entry_m
std::shared_ptr< _FM1DProfile2 > FM1DProfile2
void disableFieldmapWarning()
double polynomialOrigin_exit_m
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > log(const Tps< T > &x)
Natural logarithm.
_FM1DProfile2(const std::string &filename)
Inform & level3(Inform &inf)
virtual bool getFieldDerivative(const Vector_t &X, Vector_t &E, Vector_t &B, const DiffDirection &dir) const
constexpr double e
The value of .
virtual void setEdgeConstants(const double &bendAngle, const double &entranceAngle, const double &exitAngle)
Tps< T > sin(const Tps< T > &x)
Sine.
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
virtual bool getFieldstrength(const Vector_t &X, Vector_t &strength, Vector_t &info) const