diff --git a/src/nicefunction.hh b/src/nicefunction.hh index 449e2f63c95c24c29e7e594a74df3d8b5385e950..0304714434a98ff4b7da59b1bd647e6c3fdbf036 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 1b93f391c4deed911c3dee9a95c8aec7c350e75e..141600ed24f8b214962aedf143366efa12b2fb3f 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();