38 for (
unsigned int i = 0; i < num_coeff; i++)
49 if (fabs(volume - 1.0) > 1e-12)
50 std::cout <<
"Warning: Polynomial has to be normalized by " << volume << std::endl;
58 std::stringstream sstr;
61 std::cout <<
"p=" << *
this << std::endl;
71 for (
unsigned int i = 0; i < N; i++)
77 std::cerr <<
"dim=2 is not working yet" << std::endl;
85 std::cerr <<
"dim=1 is not working yet" << std::endl;
93 std::cerr <<
"Error in get_volume: dim=" <<
dim << std::endl;
102 std::cout <<
"set_average" << std::endl;
108 std::cout <<
"set_average_1D" << std::endl;
111 for (
unsigned int i = 0; i < N + 2; i++)
115 for (
unsigned int i = 0; i < N; i++)
134 for (
unsigned int i = 1; i < N; i++)
146 for (
unsigned int i = 1; i < N - 1; i++)
156 for (
unsigned int i = 1; i < N; i++)
167 for (
unsigned int i = 1; i < N - 1; i++)
170 value2 += coefficients[i];
193 value1 +=
coefficients[N - 7] * 2. / 35. * (5. + r2 * (6. + r2 * (8 * r2 + 16)));
196 value1 +=
coefficients[N - 6] * (8. + (10. + 15. * r2) * r2) / 24.;
197 value2 +=
coefficients[N - 6] * (15. * r2 * r2 * r2) / 24.;
200 value1 +=
coefficients[N - 5] * .4 * (1. + r2 * (4. / 3. + r2 * 8. / 3.));
207 value1 +=
coefficients[N - 3] * 2. / 3. * (1. + r2 * 2.);
216 std::cerr <<
"Error: no rules set for high-order polynomials" << std::endl;
219 double root = sqrt(1 - r2);
220 double invz = root / r;
221 double arccsch = log(sqrt(1. + invz * invz) + invz);
222 return value1 * root + value2 * arccsch;
234 double roota = sqrt(a * a + t2);
235 double rootb = sqrt(b * b + t2);
239 value1 +=
coefficients[N - 7] * (b * (b2 * b2 * b2 / 7.0 + 0.6 * b2 * b2 * t2 + b2 * t2 * t2 + t2 * t2 * t2) - a * (a2 * a2 * a2 / 7.0 + 0.6 * a2 * a2 * t2 + a2 * t2 * t2 + t2 * t2 * t2));
242 value1 +=
coefficients[N - 6] * (b * rootb * (8. * b2 * b2 + 26. * b2 * t2 + 33. * t2 * t2) - a * roota * (8. * a2 * a2 + 26. * a2 * t2 + 33. * t2 * t2)) / 48.;
243 value2 +=
coefficients[N - 6] * 15. / 48. * t2 * t2 * t2;
246 value1 +=
coefficients[N - 5] * (b * (b2 * b2 / 5. + 2. / 3. * b2 * t2 + t2 * t2) - a * (a2 * a2 / 5. + 2. / 3. * a2 * t2 + t2 * t2));
249 value1 +=
coefficients[N - 4] * (b * rootb * (2. * b2 + 5. * t2) - a * roota * (2. * a2 + 5. * t2)) / 8.;
253 value1 +=
coefficients[N - 3] * (b * (b2 / 3. + t2) - a * (a2 / 3. + t2));
256 value1 +=
coefficients[N - 2] * (b * rootb - a * roota) / 2.;
262 std::cerr <<
"Error: no rules set for high-order polynomials" << std::endl;
267 double arcsinh = t < 1e-12 ? 0.0 : log(B + sqrt(1. + B * B)) - log(A + sqrt(1. + A * A));
275 return value1 + value2 * arcsinh;
279 template <StatType T>
282 std::cerr <<
"evaluateIntegral_2D is not implemented yet" << std::endl;
295 double roota = sqrt(a * a + t2);
296 double rootb = sqrt(b * b + t2);
300 value1 +=
averaged_coefficients[N - 7] * (b * (b2 * b2 * b2 / 7.0 + 0.6 * b2 * b2 * t2 + b2 * t2 * t2 + t2 * t2 * t2) - a * (a2 * a2 * a2 / 7.0 + 0.6 * a2 * a2 * t2 + a2 * t2 * t2 + t2 * t2 * t2));
303 value1 +=
averaged_coefficients[N - 6] * (b * rootb * (8. * b2 * b2 + 26. * b2 * t2 + 33. * t2 * t2) - a * roota * (8. * a2 * a2 + 26. * a2 * t2 + 33. * t2 * t2)) / 48.;
307 value1 +=
averaged_coefficients[N - 5] * (b * (b2 * b2 / 5. + 2. / 3. * b2 * t2 + t2 * t2) - a * (a2 * a2 / 5. + 2. / 3. * a2 * t2 + t2 * t2));
310 value1 +=
averaged_coefficients[N - 4] * (b * rootb * (2. * b2 + 5. * t2) - a * roota * (2. * a2 + 5. * t2)) / 8.;
323 std::cerr <<
"Error: no rules set for high-order polynomials" << std::endl;
328 double arcsinh = t < 1e-12 ? 0.0 : log(B + sqrt(1. + B * B)) - log(A + sqrt(1. + A * A));
329 return value1 + value2 * arcsinh;
367 return evaluate_1D(r);
371 return evaluate_1D(r);
375 return evaluate_1D(r);
379 return evaluate_2D(r);
383 return evaluate_2D(r);
387 return evaluate_2D(r);
392 return evaluateGradient_1D(r);
396 return evaluateGradient_1D(r);
400 return evaluateGradient_1D(r);
404 return evaluateGradient_2D(r);
408 return evaluateGradient_2D(r);
412 return evaluateGradient_2D(r);
417 return evaluateIntegral_1D(a, b, t);
421 return evaluateIntegral_1D(a, b, t);
425 return evaluateIntegral_1D(a, b, t);
429 return evaluateIntegral_2D(a, b, t);
433 return evaluateIntegral_2D(a, b, t);
437 return evaluateIntegral_2D(a, b, t);
void setName(const char *new_name)
Use this function to change the name of the polynomial.
Mdouble evaluate_2D(Mdouble r)
Returns the value of the polynomial averaged over 1 dimension. For StatType=XY, . ...
Mdouble evaluateGradient_1D(Mdouble r)
Returns the value of the gradient averaged over 2 dimensions.
Mdouble evaluateIntegral(Mdouble a, Mdouble b, Mdouble t)
Returns the value of the line integral along the normal P1P2 "from a to b" over the axisymmetric func...
Mdouble evaluateGradient_2D(Mdouble r)
Returns the value of the gradient averaged over 1 dimensions.
unsigned int dim
The system dimension.
void set_average()
Sets averaged_coefficients.
void finish_set_polynomial()
Normalizes the polynomial coefficients such that the integral over the unit sphere of the axisymmetr...
void set_polynomial(std::vector< Mdouble > new_coefficients, unsigned int new_dim)
Use this function to set the polynomial coefficients . This function calls finish_set_polynomial to n...
void set_average_1D()
Sets averaged_coefficients for StatType=X,Y,Z such that . See evaluate_1D.
void set_average_2D()
For StatType=XY,XZ,XZ, averaged_coefficients is not used since can be evaluated as a function of ...
std::vector< Mdouble > averaged_coefficients
Stores some coefficients used in evaluate and evaluateIntegral for StatTypes different from XYZ...
Mdouble evaluateIntegral_1D(Mdouble a, Mdouble b, Mdouble t)
Returns the value of the line integral along the normal P1P2 "from a to b" over the axisymmetric func...
Mdouble evaluate_1D(Mdouble r)
Returns the value of the polynomial averaged over 2 dimensions. For StatType=X, . See also set_averag...
Mdouble evaluateGradient(Mdouble r)
Returns the gradient of the polynomial, .
std::vector< Mdouble > coefficients
Stores the coefficients .
Mdouble get_volume()
Returns the integral over the unit sphere of the axisymmetric function .
Mdouble evaluate(Mdouble r)
Returns the value of the polynomial, .
Mdouble evaluateIntegral_2D(Mdouble a, Mdouble b, Mdouble t)
Returns the value of the line integral along the normal P1P2 "from a to b" over the axisymmetric func...