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