From 29b934cacf5f29a855e43c72d358536596b09fd6 Mon Sep 17 00:00:00 2001
From: Klaus <klaus.boehnlein@tu-dresden.de>
Date: Fri, 19 Jan 2024 13:17:58 +0100
Subject: [PATCH] Update instrumented path for Riemannian TR and PN solvers.

---
 dune/gfe/riemannianpnsolver.cc | 17 ++++++++++++++---
 dune/gfe/riemannianpnsolver.hh |  3 +++
 dune/gfe/riemanniantrsolver.cc | 17 ++++++++++++++---
 dune/gfe/riemanniantrsolver.hh |  3 +++
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc
index 70452c056..81a7b3ef5 100644
--- a/dune/gfe/riemannianpnsolver.cc
+++ b/dune/gfe/riemannianpnsolver.cc
@@ -1,3 +1,4 @@
+#include <filesystem>
 #include <dune/common/bitsetvector.hh>
 #include <dune/common/timer.hh>
 
@@ -42,6 +43,15 @@ setup(const GridType& grid,
   else
     DUNE_THROW(Dune::Exception, "Unknown norm type for stopping criterion!");
 
+  instrumentedPath_ = parameterSet.get("instrumentedPath", "/tmp");
+
+  // create 'intrumented' folder and 'mgHistory' subfolder if it does not exist.
+  if (!(std::filesystem::exists(instrumentedPath_)))
+  {
+    std::filesystem::create_directory(instrumentedPath_);
+    std::filesystem::create_directory(instrumentedPath_ + "/mgHistory");
+  }
+
   setup(grid,
         assembler,
         x,
@@ -151,7 +161,7 @@ setup(const GridType& grid,
   // Write all intermediate solutions, if requested
   if (instrumented_
       && dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get()))
-    dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get())->historyBuffer_ = "tmp/mgHistory";
+    dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get())->historyBuffer_ = instrumentedPath_ + "/mgHistory";
 
   // ////////////////////////////////////////////////////////////
   //    Create Hessian matrix and its occupation structure
@@ -526,8 +536,9 @@ void RiemannianProximalNewtonSolver<Basis,TargetSpace,Assembler>::solve()
 
     if (instrumented_) {
 
-      char iFilename[100];
-      sprintf(iFilename, "tmp/intermediateSolution_%04ld", i);
+      char iFilename[200];
+      sprintf(iFilename, (instrumentedPath_ + "/mgHistory/intermediatesolution_%04d").c_str(), i);
+
 
       FILE* fpIterate = fopen(iFilename, "wb");
       if (!fpIterate)
diff --git a/dune/gfe/riemannianpnsolver.hh b/dune/gfe/riemannianpnsolver.hh
index 26fd4f504..d5a3a8559 100644
--- a/dune/gfe/riemannianpnsolver.hh
+++ b/dune/gfe/riemannianpnsolver.hh
@@ -161,6 +161,9 @@ protected:
   /** \brief If set to true we log convergence speed and other stuff */
   bool instrumented_;
 
+  /** \brief Output path for instrumented log */
+  std::string instrumentedPath_ = "/tmp";
+
   /** \brief Norm type used for stopping criterion (default is infinity norm) */
   enum class ErrorNormType {infinity, H1semi} normType_ = ErrorNormType::infinity;
 
diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc
index 39df3eb70..2ef2df685 100644
--- a/dune/gfe/riemanniantrsolver.cc
+++ b/dune/gfe/riemanniantrsolver.cc
@@ -1,3 +1,4 @@
+#include <filesystem>
 #include <dune/common/bitsetvector.hh>
 #include <dune/common/timer.hh>
 
@@ -43,6 +44,15 @@ setup(const GridType& grid,
   else
     DUNE_THROW(Dune::Exception, "Unknown norm type for stopping criterion!");
 
+  instrumentedPath_ = parameterSet.get("instrumentedPath", "/tmp");
+
+  // create 'intrumented' folder and 'mgHistory' subfolder if it does not exist.
+  if (!(std::filesystem::exists(instrumentedPath_)))
+  {
+    std::filesystem::create_directory(instrumentedPath_);
+    std::filesystem::create_directory(instrumentedPath_ + "/mgHistory");
+  }
+
   setup(grid,
         assembler,
         x,
@@ -201,7 +211,7 @@ setup(const GridType& grid,
   // Write all intermediate solutions, if requested
   if (instrumented_
       && dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get()))
-    dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get())->historyBuffer_ = "tmp/mgHistory";
+    dynamic_cast<IterativeSolver<CorrectionType>*>(innerSolver_.get())->historyBuffer_ = instrumentedPath_ + "/mgHistory";
 
   // ////////////////////////////////////////////////////////////
   //    Create Hessian matrix and its occupation structure
@@ -549,8 +559,9 @@ void RiemannianTrustRegionSolver<Basis,TargetSpace,Assembler>::solve()
         // read iteration from file
         CorrectionType intermediateSol(grid_->size(gridDim));
         intermediateSol = 0;
-        char iSolFilename[100];
-        sprintf(iSolFilename, "tmp/mgHistory/intermediatesolution_%04d", j);
+        char iSolFilename[200];
+        sprintf(iSolFilename, (instrumentedPath_ + "/mgHistory/intermediatesolution_%04d").c_str(), j);
+
 
         FILE* fpInt = fopen(iSolFilename, "rb");
         if (!fpInt)
diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh
index 1d892f33c..5893dc357 100644
--- a/dune/gfe/riemanniantrsolver.hh
+++ b/dune/gfe/riemanniantrsolver.hh
@@ -206,6 +206,9 @@ protected:
   /** \brief If set to true we log convergence speed and other stuff */
   bool instrumented_;
 
+  /** \brief Output path for instrumented log */
+  std::string instrumentedPath_ = "/tmp";
+
   /** \brief Norm type used for stopping criterion (default is infinity norm) */
   enum class ErrorNormType {infinity, H1semi} normType_ = ErrorNormType::infinity;
 
-- 
GitLab