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;