12 EngeCoefs_entry_m(nullptr),
13 EngeCoefs_exit_m(nullptr),
17 cosExitRotation_m(1.0),
18 sinExitRotation_m(0.0) {
20 std::string tmpString;
28 bool parsing_passed = interpretLine<std::string, int, int, double>(
32 && interpretLine<double, double, double, int>(
34 parsing_passed = parsing_passed
35 && interpretLine<double, double, double, int>(
37 for (
int i = 0; (i < num_gridpz + 1) && parsing_passed; ++i) {
38 parsing_passed = parsing_passed && interpretLine<double>(file, tmpDouble);
46 if (!parsing_passed) {
80 double tolerance = 1
e-8;
85 std::string tmpString;
88 double minValue = 99999999.99, maxValue = -99999999.99;
90 int num_gridp_fringe_entry, num_gridp_fringe_exit;
91 int num_gridp_before_fringe_entry, num_gridp_before_fringe_exit;
93 double* rightHandSide;
94 double* leastSquareMatrix;
97 interpretLine<std::string, int, int, double>(in, tmpString, tmpInt, tmpInt, tmpDouble);
98 interpretLine<double, double, double, int>(in, tmpDouble, tmpDouble, tmpDouble, num_gridpz);
99 interpretLine<double, double, double, int>(in, tmpDouble, tmpDouble, tmpDouble, tmpInt);
106 RealValues =
new double[num_gridpz + 1];
108 for (
int i = 0; i < num_gridpz + 1; ++i) {
109 interpretLine<double>(in, RealValues[i]);
110 if (RealValues[i] > maxValue)
111 maxValue = RealValues[i];
112 else if (RealValues[i] < minValue)
113 minValue = RealValues[i];
118 for (
int i = 0; i < num_gridpz + 1; ++i)
119 RealValues[i] = (RealValues[i] - minValue) / (maxValue - minValue);
123 while (i < num_gridpz + 1 && RealValues[i] < tolerance)
125 num_gridp_before_fringe_entry = i - 1;
128 while (i < num_gridpz + 1 && RealValues[i] < 1. - tolerance)
130 num_gridp_fringe_entry = i - 1 - num_gridp_before_fringe_entry;
133 while (i < num_gridpz + 1 && RealValues[i] >= 1. - tolerance)
135 num_gridp_before_fringe_exit = i - 1;
137 while (i < num_gridpz + 1 && RealValues[i] > tolerance)
139 num_gridp_fringe_exit = i - 1 - num_gridp_before_fringe_exit;
143 int num_gridp_fringe =
std::max(num_gridp_fringe_entry, num_gridp_fringe_exit);
145 leastSquareMatrix =
new double[(polynomialOrder + 1) * num_gridp_fringe];
146 rightHandSide =
new double[num_gridp_fringe];
150 for (
int i = 0; i < num_gridp_fringe_entry; ++i) {
151 double powerOfZ = 1.;
153 rightHandSide[i] = log(1. / RealValues[num_gridp_before_fringe_entry + i + 1] - 1.);
165 for (
int i = 0; i < num_gridp_fringe_exit; ++i) {
166 double powerOfZ = 1.;
168 rightHandSide[i] = log(1. / RealValues[num_gridp_before_fringe_exit + i + 1] - 1.);
184 delete[] leastSquareMatrix;
185 delete[] rightHandSide;
239 double S = EngeCoefs[polynomialOrder] * z;
240 S += EngeCoefs[polynomialOrder - 1];
241 double dSdz = polynomialOrder * EngeCoefs[polynomialOrder];
243 for (
int i = polynomialOrder - 2; i >= 0; i--) {
244 S = S * z + EngeCoefs[i];
245 dSdz = dSdz * z + (i + 1) * EngeCoefs[i + 1];
246 d2Sdz2 = d2Sdz2 * z + (i + 2) * (i + 1) * EngeCoefs[i + 2];
248 double expS = std::exp(S);
249 double f = 1.0 / (1.0 + expS);
252 double dfdz = -f * ((f * expS) * dSdz);
255 double d2fdz2 = ((-d2Sdz2 - dSdz * dSdz * (1. - 2. * (expS * f))) * (f * expS) * f)
260 strength(2) = d2fdz2;
335 double& ,
double& ,
double& ,
double& ,
double& ,
359 const double& bendAngle,
const double& entranceAngle,
const double& exitAngle) {
363 xExit_m = -deltaZ * std::sin(bendAngle / 2.0);
371 double* Matrix,
double* Solution,
double* rightHandSide,
const int& M,
const int& N) {
376 double* R =
new double[M * N];
377 double* tempVector =
new double[M];
378 double* residuum =
new double[M];
380 for (
int i = 0; i < M; ++i) {
381 for (
int j = 0; j < N; ++j)
382 R[i * N + j] = Matrix[i * N + j];
383 tempVector[i] = rightHandSide[i];
387 for (
int i = 0; i < N; ++i) {
388 for (
int j = i + 1; j < M; ++j) {
389 len = std::sqrt(R[j * N + i] * R[j * N + i] + R[i * (N + 1)] * R[i * (N + 1)]);
390 sinphi = -R[j * N + i] / len;
391 cosphi = R[i * (N + 1)] / len;
393 for (
int k = 0; k < N; ++k) {
394 tempValue = cosphi * R[i * N + k] - sinphi * R[j * N + k];
395 R[j * N + k] = sinphi * R[i * N + k] + cosphi * R[j * N + k];
396 R[i * N + k] = tempValue;
404 for (
int i = 0; i < N; ++i) {
406 for (
int j = 0; j < M; ++j) {
407 tempValue += Matrix[j * N + i] * rightHandSide[j];
409 Solution[i] = tempValue;
412 for (
int i = 0; i < N; ++i) {
414 for (
int j = 0; j < i; ++j)
415 tempValue += R[j * N + i] * residuum[j];
416 residuum[i] = (Solution[i] - tempValue) / R[i * (N + 1)];
419 for (
int i = N - 1; i >= 0; --i) {
421 for (
int j = N - 1; j > i; --j)
422 tempValue += R[i * N + j] * Solution[j];
423 Solution[i] = (residuum[i] - tempValue) / R[i * (N + 1)];
426 for (
int i = 0; i < M; ++i) {
428 for (
int j = 0; j < N; ++j)
429 tempValue += Matrix[i * N + j] * Solution[j];
430 residuum[i] = rightHandSide[i] - tempValue;
433 for (
int i = 0; i < N; ++i) {
435 for (
int j = 0; j < M; ++j)
436 tempValue += Matrix[j * N + i] * residuum[j];
437 tempVector[i] = tempValue;
440 for (
int i = 0; i < N; ++i) {
442 for (
int j = 0; j < i; ++j)
443 tempValue += R[j * N + i] * residuum[j];
444 residuum[i] = (tempVector[i] - tempValue) / R[i * (N + 1)];
447 for (
int i = N - 1; i >= 0; --i) {
449 for (
int j = N - 1; j > i; --j)
450 tempValue += R[i * N + j] * tempVector[j];
451 tempVector[i] = (residuum[i] - tempValue) / R[i * (N + 1)];
452 Solution[i] += tempVector[i];
constexpr KOKKOS_INLINE_FUNCTION auto first()
Inform & endl(Inform &inf)
Inform & level3(Inform &inf)
void solve(double *Matrix, double *Solution, double *rightHandSide, const int &M, const int &N)
constexpr double e
The value of.
std::unique_ptr< Inform > Info
KOKKOS_INLINE_FUNCTION Vector< T, Dim > max(const Vector< T, Dim > &a, const Vector< T, Dim > &b)
bool interpreteEOF(std::ifstream &in)
void disableFieldmapWarning()
static std::string typeset_msg(const std::string &msg, const std::string &title)
double cosExitRotation_m
Cos and sin of the exit edge rotation with respect to the local coordinates.
double polynomialOrigin_entry_m
virtual bool getFieldstrength(const Vector_t< double, 3 > &X, Vector_t< double, 3 > &strength, Vector_t< double, 3 > &info) const
virtual bool getFieldDerivative(const Vector_t< double, 3 > &X, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B, const DiffDirection &dir) const
double * EngeCoefs_entry_m
virtual double getFrequency() const
double polynomialOrigin_exit_m
FM1DProfile2(std::string aFilename)
int polynomialOrder_entry_m
virtual void setFrequency(double freq)
double * EngeCoefs_exit_m
int polynomialOrder_exit_m
double xExit_m
x position in local coordinate system where central trajectory intersects the exit edge.
virtual void setEdgeConstants(const double &bendAngle, const double &entranceAngle, const double &exitAngle)
virtual void getFieldDimensions(double &zBegin, double &zEnd) const
virtual void setExitFaceSlope(const double &)
double zExit_m
z position in local coordinate system where central trajectory intersects the exit edge.
virtual void getInfo(Inform *)