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;
123 RealValues =
new double[num_gridpz + 1];
125 for (
int i = 0; i < num_gridpz + 1; ++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;
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;