From cfdb083aa5077f6a6980fd8ce7115a84de12e15a Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Mon, 14 Nov 2011 14:39:53 +0100
Subject: [PATCH] Bug fix: We're computation increments here!

Also, time-independent neumann conditions
---
 src/one-body-sample.cc | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 984eb1bc..4b04b4dd 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -96,8 +96,8 @@ void assemble_neumann(GridView const &gridView, FEBasis const &feBasis,
                       int run) { // constant sample function on neumann boundary
   BoundaryPatch<GridView> neumannBoundary(gridView, neumannNodes);
   LocalVectorType SampleVector(0);
-  // FIXME: random values
-  SampleVector[0] = 1 + run / 200;
+  // FIXME: random values (time-independent)
+  SampleVector[0] = 1;
   SampleVector[1] = 0;
   ConstantFunction<LocalVectorType, LocalVectorType> fNeumann(SampleVector);
   NeumannBoundaryAssembler<GridType, LocalVectorType> neumannBoundaryAssembler(
@@ -194,6 +194,15 @@ int main(int argc, char *argv[]) {
     VectorType u1(grid.size(grid.maxLevel(), dim));
     u1 = 0;
     VectorType u3 = u1;
+
+    VectorType u1_diff_old(grid.size(grid.maxLevel(), dim));
+    u1_diff_old = 0;
+    VectorType u3_diff_old = u1_diff_old;
+
+    VectorType u1_diff_new(grid.size(grid.maxLevel(), dim));
+    u1_diff_new = 0;
+    VectorType u3_diff_new = u1_diff_new;
+
     CellVectorType vonMisesStress;
 
     VectorType b1;
@@ -213,8 +222,8 @@ int main(int argc, char *argv[]) {
       b3 = b1;
 
       // b += linear update
-      stiffnessMatrix.umv(u1, b1);
-      stiffnessMatrix.umv(u3, b3);
+      stiffnessMatrix.umv(u1_diff_old, b1);
+      stiffnessMatrix.umv(u3_diff_old, b3);
 
       // {{{ Assemble terms for the nonlinearity
 
@@ -258,10 +267,10 @@ int main(int argc, char *argv[]) {
       // }}}
 
       {
-        MyConvexProblemType myConvexProblem(stiffnessMatrix,
-                                            *myGlobalNonlinearity, b1, u1);
+        MyConvexProblemType myConvexProblem(
+            stiffnessMatrix, *myGlobalNonlinearity, b1, u1_diff_new);
         MyBlockProblemType myBlockProblem(parset, myConvexProblem);
-        nonlinearGSStep.setProblem(u1, myBlockProblem);
+        nonlinearGSStep.setProblem(u1_diff_new, myBlockProblem);
 
         LoopSolver<VectorType> solver(&nonlinearGSStep, solver_maxIterations,
                                       solver_tolerance, &energyNorm,
@@ -269,6 +278,9 @@ int main(int argc, char *argv[]) {
         solver.solve();
       }
 
+      u1 += u1_diff_new;
+      u1_diff_old = u1_diff_new;
+
       auto *displacement =
           new BasisGridFunction<P1Basis, VectorType>(p1Basis, u1);
       VonMisesStressAssembler<GridType> localStressAssembler(E, nu,
@@ -294,7 +306,7 @@ int main(int argc, char *argv[]) {
       // same results if phi vanishes (e.g. because the normalstress is zero)
       {
         TruncatedBlockGSStep<OperatorType, VectorType> blockGSStep(
-            stiffnessMatrix, u3, b3);
+            stiffnessMatrix, u3_diff_new, b3);
         blockGSStep.ignoreNodes_ = &ignoreNodes;
 
         LoopSolver<VectorType> solver(&blockGSStep, solver_maxIterations,
@@ -302,6 +314,9 @@ int main(int argc, char *argv[]) {
                                       Solver::QUIET);
         solver.solve();
       }
+
+      u3 += u3_diff_new;
+      u3_diff_old = u3_diff_new;
     }
     std::cout << std::endl;
 
-- 
GitLab