From e91e4e3c9c77aa92d262b4c8ed1dd58fc1568962 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Fri, 11 Jul 2014 15:55:50 +0200
Subject: [PATCH] [Extend ] Write out fixed point iterations

---
 src/sand-wedge.cc | 48 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index 392f046a..04ed6790 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -119,10 +119,10 @@ class FixedPointIterator {
         velocityTolerance_(parset.get<double>("v.solver.tolerance")),
         verbosity_(parset.get<Solver::VerbosityMode>("v.solver.verbosity")) {}
 
-  void run(std::shared_ptr<StateUpdater> stateUpdater,
-           std::shared_ptr<VelocityUpdater> velocityUpdater,
-           Matrix const &velocityMatrix, Norm<Vector> const &velocityMatrixNorm,
-           Vector const &velocityRHS, Vector &velocityIterate) {
+  int run(std::shared_ptr<StateUpdater> stateUpdater,
+          std::shared_ptr<VelocityUpdater> velocityUpdater,
+          Matrix const &velocityMatrix, Norm<Vector> const &velocityMatrixNorm,
+          Vector const &velocityRHS, Vector &velocityIterate) {
     auto multigridStep = factory_.getSolver();
 
     LoopSolver<Vector> velocityProblemSolver(
@@ -165,6 +165,8 @@ class FixedPointIterator {
 
     velocityUpdater->postProcess(velocityIterate);
     velocityUpdater->postProcessRelativeQuantities();
+
+    return fixedPointIteration;
   }
 
 private:
@@ -202,7 +204,7 @@ class CoupledTimeStepper {
         velocityUpdater_(velocityUpdater),
         externalForces_(externalForces) {}
 
-  void step(double relativeTime, double relativeTau) {
+  int step(double relativeTime, double relativeTau) {
     stateUpdater_->nextTimeStep();
     velocityUpdater_->nextTimeStep();
 
@@ -222,8 +224,10 @@ class CoupledTimeStepper {
 
     FixedPointIterator<Factory, StateUpdater, VelocityUpdater>
     fixedPointIterator(factory_, parset_, globalFriction_);
-    fixedPointIterator.run(stateUpdater_, velocityUpdater_, velocityMatrix,
-                           velocityMatrixNorm, velocityRHS, velocityIterate);
+    auto const iterations = fixedPointIterator.run(
+        stateUpdater_, velocityUpdater_, velocityMatrix, velocityMatrixNorm,
+        velocityRHS, velocityIterate);
+    return iterations;
   }
 
 private:
@@ -508,6 +512,8 @@ int main(int argc, char *argv[]) {
 
     size_t timeStep = 1;
 
+    std::fstream iterationWriter("iterations", std::fstream::out);
+
     auto stateUpdaterR1 = stateUpdater->clone();
     auto velocityUpdaterR1 = velocityUpdater->clone();
     {
@@ -515,7 +521,10 @@ int main(int argc, char *argv[]) {
       coupledTimeStepper(finalTime, factory, parset, myGlobalFriction,
                          stateUpdaterR1, velocityUpdaterR1,
                          computeExternalForces);
-      coupledTimeStepper.step(relativeTime, relativeTau);
+      iterationWriter << "R1 ";
+      auto const iterations =
+          coupledTimeStepper.step(relativeTime, relativeTau);
+      iterationWriter << iterations << std::endl;
     }
 
     std::shared_ptr<MyStateUpdater> stateUpdaterR2 = nullptr;
@@ -534,7 +543,10 @@ int main(int argc, char *argv[]) {
           coupledTimeStepper(finalTime, factory, parset, myGlobalFriction,
                              stateUpdaterR2, velocityUpdaterR2,
                              computeExternalForces);
-          coupledTimeStepper.step(relativeTime + relativeTau, relativeTau);
+          iterationWriter << "R2 ";
+          auto const iterations =
+              coupledTimeStepper.step(relativeTime + relativeTau, relativeTau);
+          iterationWriter << iterations << " " << std::flush;
         }
         stateUpdaterR2->extractAlpha(alphaR2);
 
@@ -547,7 +559,10 @@ int main(int argc, char *argv[]) {
           coupledTimeStepper(finalTime, factory, parset, myGlobalFriction,
                              stateUpdaterC, velocityUpdaterC,
                              computeExternalForces);
-          coupledTimeStepper.step(relativeTime, 2.0 * relativeTau);
+          iterationWriter << "C ";
+          auto const iterations =
+              coupledTimeStepper.step(relativeTime, 2.0 * relativeTau);
+          iterationWriter << iterations << " " << std::flush;
         }
         stateUpdaterC->extractAlpha(alphaC);
 
@@ -581,13 +596,18 @@ int main(int argc, char *argv[]) {
             coupledTimeStepper(finalTime, factory, parset, myGlobalFriction,
                                stateUpdaterF2, velocityUpdaterF2,
                                computeExternalForces);
-            coupledTimeStepper.step(relativeTime, relativeTau / 2.0);
+            iterationWriter << "F1 ";
+            auto const iterationsF1 =
+                coupledTimeStepper.step(relativeTime, relativeTau / 2.0);
+            iterationWriter << iterationsF1 << " " << std::flush;
 
             stateUpdaterF1 = stateUpdaterF2->clone();
             velocityUpdaterF1 = velocityUpdaterF2->clone();
 
-            coupledTimeStepper.step(relativeTime + relativeTau / 2.0,
-                                    relativeTau / 2.0);
+            iterationWriter << "F2 ";
+            auto const iterationsF2 = coupledTimeStepper.step(
+                relativeTime + relativeTau / 2.0, relativeTau / 2.0);
+            iterationWriter << iterationsF2 << " " << std::flush;
           }
           stateUpdaterF2->extractAlpha(alphaF2);
           stateUpdaterR1->extractAlpha(alphaR1);
@@ -604,6 +624,7 @@ int main(int argc, char *argv[]) {
           }
         }
       }
+      iterationWriter << std::endl;
 
       reportTimeStep(relativeTime, relativeTau);
 
@@ -639,6 +660,7 @@ int main(int argc, char *argv[]) {
       timeStep++;
     }
     timeStepWriter.close();
+    iterationWriter.close();
     Python::stop();
   }
   catch (Dune::Exception &e) {
-- 
GitLab