From 5c7924a5e09553c46ba53fd28829fbf4a8069419 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Tue, 13 Dec 2011 18:40:26 +0100
Subject: [PATCH] Provide gradient implementation

---
 dune/tectonic/globalnonlinearity.hh | 7 +++++++
 dune/tectonic/localnonlinearity.hh  | 6 ++++++
 2 files changed, 13 insertions(+)

diff --git a/dune/tectonic/globalnonlinearity.hh b/dune/tectonic/globalnonlinearity.hh
index 73042d74..a580e81f 100644
--- a/dune/tectonic/globalnonlinearity.hh
+++ b/dune/tectonic/globalnonlinearity.hh
@@ -26,6 +26,13 @@ class GlobalNonlinearity {
       res->addHessian(v[i], hessian[i][i]);
     }
   }
+
+  virtual void addGradient(const VectorType& v, VectorType& gradient) const {
+    for (size_t i = 0; i < v.size(); ++i) {
+      auto res = restriction(i);
+      res->addGradient(v[i], gradient[i]);
+    }
+  }
 };
 }
 #endif
diff --git a/dune/tectonic/localnonlinearity.hh b/dune/tectonic/localnonlinearity.hh
index 3dc5e53b..285f309e 100644
--- a/dune/tectonic/localnonlinearity.hh
+++ b/dune/tectonic/localnonlinearity.hh
@@ -78,6 +78,12 @@ template <int dimension> class LocalNonlinearity {
       A[k][k] += (h2 - h1ox) * x[k] * x[k] / normX2 + h1ox;
   }
 
+  void addGradient(VectorType const &x, VectorType &y) const {
+    VectorType tmp;
+    upperGradient(x, tmp); // TODO
+    y += tmp;
+  }
+
   void upperGradient(VectorType const &x, VectorType &ret) const {
     ret = x;
     ret *= func_->rightDifferential(x.two_norm()) / x.two_norm();
-- 
GitLab