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