From 7b4790fd1824276d2f7920115d0263a6d23e218a Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Mon, 17 Oct 2011 13:46:12 +0200 Subject: [PATCH] Add identity function --- src/nicefunction.hh | 9 +++++++++ src/test-gradient-method.cc | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/nicefunction.hh b/src/nicefunction.hh index 449e2f63..03047144 100644 --- a/src/nicefunction.hh +++ b/src/nicefunction.hh @@ -12,6 +12,15 @@ class NiceFunction : public VirtualFunction<double, double> { virtual double rightDifferential(const double s) const = 0; }; +class Identity : public NiceFunction { +public: + void virtual evaluate(const double& x, double& y) const { y = x; } + + double virtual leftDifferential(const double s) const { return 1; } + + double virtual rightDifferential(const double s) const { return 1; } +}; + class SampleFunction : public NiceFunction { public: void virtual evaluate(const double& x, double& y) const { diff --git a/src/test-gradient-method.cc b/src/test-gradient-method.cc index 1b93f391..141600ed 100644 --- a/src/test-gradient-method.cc +++ b/src/test-gradient-method.cc @@ -28,6 +28,41 @@ double functionTester(Dune::SampleFunctional<dim> J, return final; } +void testIdentity() { + int const dim = 2; + typedef Dune::SampleFunctional<dim> Functional; + + Functional::SmallMatrix A; + A[0][0] = 3; + A[0][1] = 1.5; + A[1][0] = 1.5; + A[1][1] = 4; + Functional::SmallVector b; + b[0] = 1; + b[1] = 2; + + Dune::Identity f; + Functional J(A, b, Dune::MyNonlinearity<dim>(f)); + + Functional::SmallVector start = b; + start *= 17; + + double const ret1 = functionTester(J, start, 6); + + // Something random + start[0] = 279; + start[1] = -96; + + double const ret2 = functionTester(J, start, 10); + assert(std::abs(ret1 - ret2) < 1e-5); + + start[0] = 0; + start[1] = 0; + + double const ret3 = functionTester(J, start, 3); + assert(std::abs(ret1 - ret3) < 1e-5); +} + void testSampleFunction() { int const dim = 2; typedef Dune::SampleFunctional<dim> Functional; @@ -331,6 +366,8 @@ void testSampleFunction2() { int main() { try { + testIdentity(); + std::cout << std::endl << std::endl << std::endl; testSampleFunction(); std::cout << std::endl << std::endl << std::endl; testSampleFunctionNonsmooth(); -- GitLab