24 #include "../Atomicrex.h" 37 template<
typename DifferentialForm>
38 double integrate(
double a,
double b, DifferentialForm diffForm) {
40 throw std::runtime_error(boost::str(boost::format(
"Left boundary larger than right boundary in NumericalIntegration::integrate(): %1% > %2%.") % a % b));
41 return simpson(a, b, diffForm);
47 return integrate(a, b, differentialFormDefault);
53 return integrate(a, b, differentialFormSpherical);
65 static double differentialFormDefault(
double r,
double f) {
70 static double differentialFormSpherical(
double r,
double f) {
82 template<
typename DifferentialForm>
83 double simpson(
double a,
double b, DifferentialForm diffForm,
double eps = FLOATTYPE_EPSILON,
int jmax = 20)
85 double s, s2, st, ost = 0.0, os = 0.0;
86 for(
int j = 1; j <= jmax; j++) {
87 st = trapezoid(a, b, j, s2, diffForm);
88 s = (4.0 * st - ost) / 3.0;
90 if(fabs(s - os) < eps*fabs(os) || (s == 0.0 && os == 0.0))
return s;
94 throw std::runtime_error(
"Exceeded maximum number of iterations in routine NumericalIntegration::simpson().");
106 template<
typename DifferentialForm>
107 double trapezoid(
double a,
double b,
int n,
double& s, DifferentialForm diffForm)
114 for(
int j = 1; j < n-1; j++) it <<= 1;
116 double del = (b-a)/tnm;
117 double x = a + 0.5 * del;
119 for(
int j = 1; j <= it; j++, x+=del) sum += diffForm(x,
evaluateInternal(x));
120 s = 0.5 * (s + (b-a) * sum / tnm);
double integrate(double a, double b, DifferentialForm diffForm)
Definition: NumericalIntegration.h:38
T square(const T &f)
Computes the square of a number.
Definition: FloatType.h:43
virtual double evaluateInternal(double x)=0
virtual double integrate(double a, double b)
Definition: NumericalIntegration.h:46
This file collects the definition of classes that define various simple crystal structures.
Definition: Atomicrex.h:67
virtual double integrateSpherical(double a, double b)
Definition: NumericalIntegration.h:52
Definition: NumericalIntegration.h:31