diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc
index 70452c0562254ac6ecea9ccd28cc65fd3aa45569..81a7b3ef5d599f5233051ac7a2309c05cb0e5166 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 26fd4f5042fbc5c80554a9e2bf8299f9b22183da..d5a3a8559c18edda56e1792425559624742b4277 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 39df3eb70428ea1e307cda23c67a98d83a0cfe41..2ef2df68517ccd6366d99303c51a62a4b488614d 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 1d892f33cddf95e7e8d901f9047c1c200c6c5e80..5893dc357148ace6e59a4f17417f0005bfa52bd7 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;