Skip to content
Snippets Groups Projects
Commit f238962c authored by Kevin Höllring's avatar Kevin Höllring
Browse files

Make Polynomials Coordinate compliant

parent 2758e34d
No related branches found
No related tags found
No related merge requests found
...@@ -3,12 +3,13 @@ ...@@ -3,12 +3,13 @@
#include "function.h" #include "function.h"
#include "matrix.h" #include "matrix.h"
#include <cmath>
namespace numerics { namespace numerics {
class Parabola_2D class Parabola_2D
: public numerics::Function<numerics::Coordinate<double>, double> { : public numerics::Function<numerics::Coordinate<double>, double> {
virtual double operator()(numerics::Coordinate<double> x) const override { double operator()(numerics::Coordinate<double> x) const override {
assert(x.dimension() == input_dimension()); assert(x.dimension() == input_dimension());
double a = x[0]; double a = x[0];
double b = x[1]; double b = x[1];
...@@ -16,30 +17,88 @@ class Parabola_2D ...@@ -16,30 +17,88 @@ class Parabola_2D
return a * a + b * b; return a * a + b * b;
} }
virtual size_t input_dimension() const override { return 2; } size_t input_dimension() const override { return 2; }
virtual size_t output_dimension() const override { return 1; } size_t output_dimension() const override { return 1; }
}; };
class Periodic_Wave_2D class Periodic_Wave_2D
: public numerics::Function<numerics::Coordinate<double>, double> { : public numerics::Function<numerics::Coordinate<double>, double> {
virtual double operator()(numerics::Coordinate<double> x) const override { double operator()(numerics::Coordinate<double> x) const override {
assert(x.dimension() == input_dimension()); assert(x.dimension() == input_dimension());
return sin(x[0]) + cos(x[1]); return sin(x[0]) + cos(x[1]);
} }
virtual size_t input_dimension() const override { return 2; } size_t input_dimension() const override { return 2; }
virtual size_t output_dimension() const override { return 1; } size_t output_dimension() const override { return 1; }
};
class LennardJones
: public numerics::Function<numerics::Coordinate<double>, double> {
public:
LennardJones(double _epsilon, double _sigma)
: epsilon(_epsilon), sigma(_sigma) {}
double operator()(numerics::Coordinate<double> x) const override {
assert(x.dimension() == input_dimension());
double r = x[0];
double rel = sigma / r;
double rel2 = rel * rel;
double rel4 = rel2 * rel2;
double rel8 = rel4 * rel4;
return 4 * epsilon * (rel8 * rel4 - rel4 * rel2);
}
size_t input_dimension() const override { return 1; }
size_t output_dimension() const override { return 1; }
double get_rm() { return pow(2, 1.0 / 6.0) * sigma; }
protected:
double epsilon, sigma;
};
class PolyWrapper
: public numerics::Function<numerics::Coordinate<double>, double>,
public Polynomial {
public:
PolyWrapper(std::vector<double> _coeff) : Polynomial(_coeff) {}
double operator()(numerics::Coordinate<double> x) const override {
assert(x.dimension() == Polynomial::input_dimension());
return Polynomial::operator()(x[0]);
}
size_t input_dimension() const override {
return Polynomial::input_dimension();
}
size_t output_dimension() const override {
return Polynomial::output_dimension();
}
}; };
struct functions { struct functions {
public: public:
// 2D test functions
static Parabola_2D parabola_2d; static Parabola_2D parabola_2d;
static Periodic_Wave_2D periodic_wave_2d; static Periodic_Wave_2D periodic_wave_2d;
static Polynomial ref_polynomial_1d;
static Polynomial parabola_1d; // 1D test functions
static Polynomial higher_parabola_1d; // 1D Lennard Jones potentials
static LennardJones wide_LJ;
static LennardJones narrow_LJ;
// 1D polynomials
static PolyWrapper parabola_1d;
static PolyWrapper higher_parabola_1d;
static PolyWrapper ref_polynomial_1d;
}; };
}; // namespace numerics }; // namespace numerics
......
...@@ -19,10 +19,9 @@ numerics::Parabola_2D numerics::functions::parabola_2d = ...@@ -19,10 +19,9 @@ numerics::Parabola_2D numerics::functions::parabola_2d =
numerics::Periodic_Wave_2D numerics::functions::periodic_wave_2d = numerics::Periodic_Wave_2D numerics::functions::periodic_wave_2d =
numerics::Periodic_Wave_2D(); numerics::Periodic_Wave_2D();
numerics::Polynomial numerics::functions::ref_polynomial_1d = numerics::PolyWrapper numerics::functions::parabola_1d =
numerics::Polynomial({1., -3., -1., 11., -17., 16., -4.}); numerics::PolyWrapper({1., 0., -1.4});
numerics::PolyWrapper numerics::functions::higher_parabola_1d =
numerics::Polynomial numerics::functions::parabola_1d = numerics::PolyWrapper({1., 0.0, -2.3, 0., -1.4});
numerics::Polynomial({1., 0., -1.4}); numerics::PolyWrapper numerics::functions::ref_polynomial_1d =
numerics::Polynomial numerics::functions::higher_parabola_1d = numerics::PolyWrapper({1., -3., -1., 11., -17., 16., -4.});
numerics::Polynomial({1., 0.0, -2.3, 0., -1.4});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment