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) {
97 double tolerance = 1e-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.);
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.);
191 delete[] leastSquareMatrix;
192 delete[] rightHandSide;
223 strength =
Vector_t({1.0, 0.0, 0.0});
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];
252 double expS = std::exp(S);
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;