From baae6ebd5e7e20fd006928ea42e5bc3766ae2b3b Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Wed, 17 Jul 2013 23:24:04 +0200
Subject: [PATCH] [Problem] Damping

---
 src/one-body-sample.cc      | 10 ++++++++--
 src/timestepping/newmark.cc | 18 +++++++++++-------
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 153f5d3c..b78b4bfb 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -399,16 +399,22 @@ int main(int argc, char *argv[]) {
     VectorType a_initial(finestSize);
     a_initial = 0.0;
     {
-      // We solve Au + Ma + Psi(v) = ell, thus Ma = - (Au + Psi(v) - ell)
+      /* We solve Au + Cv + Ma + Psi(v) = ell, thus
+                                     Ma = - (Au + Cv + Psi(v) - ell)
+      */
+      MatrixType const &C = A;
+      double const wc = 0.0; // watch out -- do not choose 1.0 here!
       VectorType problem_rhs_initial(finestSize);
       {
         problem_rhs_initial = 0.0;
         Arithmetic::addProduct(problem_rhs_initial, A, u_initial);
+        Arithmetic::addProduct(problem_rhs_initial, wc, C, v_initial);
         myGlobalNonlinearity->updateState(alpha_initial);
         // NOTE: We assume differentiability of Psi at v0 here!
         myGlobalNonlinearity->addGradient(v_initial, problem_rhs_initial);
         problem_rhs_initial -= ell;
-        problem_rhs_initial *= -1.0;
+        // instead of multiplying M by (1.0 - wc), we divide the RHS
+        problem_rhs_initial *= -1.0 / (1.0 - wc);
       }
       LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
                                             refinements, 1e-12, // FIXME,
diff --git a/src/timestepping/newmark.cc b/src/timestepping/newmark.cc
index 22d8dcdc..aa1fad7b 100644
--- a/src/timestepping/newmark.cc
+++ b/src/timestepping/newmark.cc
@@ -27,9 +27,11 @@ void Newmark<VectorType, MatrixType, FunctionType, dim>::setup(
 
   tau = _tau;
 
+  MatrixType const &C = A;
+  double const wc = 0.0;
   /* We start out with the formulation
 
-       M a + A u = ell
+       M a + C v + A u = ell
 
      Newmark means
 
@@ -38,13 +40,13 @@ void Newmark<VectorType, MatrixType, FunctionType, dim>::setup(
 
      in summary, we get at time t=1
 
-       M [2/tau ( u1 - u0 ) - a0]
+       M [2/tau ( u1 - u0 ) - a0] + C v1
        + A [tau/2 ( v1 + v0 ) + u0] = ell
 
      or
 
-       2/tau M v1 + tau/2 A v1
-       = [2/tau M + tau/2 A] v1
+       2/tau M v1 + C v1 + tau/2 A v1
+       = [2/tau M + C + tau/2 A] v1
        = ell + 2/tau M v0 + M a0
        - tau/2 A v0 - A u0
   */
@@ -54,17 +56,19 @@ void Newmark<VectorType, MatrixType, FunctionType, dim>::setup(
     Dune::MatrixIndexSet indices(A.N(), A.M());
     indices.import(A);
     indices.import(M);
+    indices.import(C);
     indices.exportIdx(problem_AM);
   }
   problem_AM = 0.0;
-  Arithmetic::addProduct(problem_AM, 2.0 / tau, M);
+  Arithmetic::addProduct(problem_AM, (1.0 - wc) * 2.0 / tau, M);
+  Arithmetic::addProduct(problem_AM, wc, C);
   Arithmetic::addProduct(problem_AM, tau / 2.0, A);
 
   // set up RHS
   {
     problem_rhs = ell;
-    Arithmetic::addProduct(problem_rhs, 2.0 / tau, M, v_o);
-    Arithmetic::addProduct(problem_rhs, M, a_o);
+    Arithmetic::addProduct(problem_rhs, (1.0 - wc) * 2.0 / tau, M, v_o);
+    Arithmetic::addProduct(problem_rhs, 1.0 - wc, M, a_o);
     Arithmetic::subtractProduct(problem_rhs, tau / 2.0, A, v_o);
     Arithmetic::subtractProduct(problem_rhs, A, u_o);
   }
-- 
GitLab