80 double tolerance = 1e-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;
106 RealValues =
new double[num_gridpz + 1];
108 for (
int i = 0; i < num_gridpz + 1; ++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;
virtual bool getFieldDerivative(const Vector_t< double, 3 > &X, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B, const DiffDirection &dir) const