20#ifndef OPM_WRITESYSTEMMATRIXHELPER_HEADER_INCLUDED
21#define OPM_WRITESYSTEMMATRIXHELPER_HEADER_INCLUDED
23#include <dune/istl/matrixmarket.hh>
25#include <opm/simulators/linalg/MatrixMarketSpecializations.hpp>
32namespace Opm::Helper {
62 template <
class SimulatorType,
class LinalgObjectType,
class Communicator>
63 void writeMatrixMarketObject(
const SimulatorType& simulator,
64 const LinalgObjectType& linalgObject,
65 const std::string& objName,
66 [[maybe_unused]]
const Communicator* comm)
68 namespace fs = std::filesystem;
70 const auto output_dir = fs::path {simulator.problem().outputDir()} /
"reports";
71 if (! fs::exists(output_dir)) {
72 fs::create_directory(output_dir);
76 std::ostringstream oss;
77 oss <<
"prob_" << simulator.episodeIndex()
78 <<
"_time_" << std::setprecision(15) << std::setw(12) << std::setfill(
'0') << simulator.time()
79 <<
"_nit_" << simulator.model().newtonMethod().numIterations()
80 <<
'_' << objName <<
"_istl";
82 const auto filename = (output_dir / oss.str()).generic_string();
85 if (comm !=
nullptr) {
86 Dune::storeMatrixMarket(linalgObject, filename, *comm);
91 Dune::storeMatrixMarket(linalgObject, filename +
".mm");
120 template <
class SimulatorType,
class VectorType,
class Communicator>
121 void writeVector(
const SimulatorType& simulator,
122 const VectorType& rhs,
123 const std::string& sysName,
124 const Communicator* comm)
126 detail::writeMatrixMarketObject(simulator, rhs, sysName +
"_vector", comm);
153 template <
class SimulatorType,
class MatrixType,
class Communicator>
154 void writeMatrix(
const SimulatorType& simulator,
155 const MatrixType& matrix,
156 const std::string& sysName,
157 const Communicator* comm)
159 detail::writeMatrixMarketObject(simulator, matrix, sysName +
"_matrix", comm);
195 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
196 void writeSystem(
const SimulatorType& simulator,
197 const MatrixType& matrix,
198 const VectorType& rhs,
199 const std::string& sysName,
200 const Communicator* comm)
202 writeMatrix(simulator, matrix, sysName, comm);
203 writeVector(simulator, rhs, sysName, comm);
237 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
238 void writeSystem(
const SimulatorType& simulator,
239 const MatrixType& matrix,
240 const VectorType& rhs,
241 const Communicator* comm)
243 writeSystem(simulator, matrix, rhs,
"flow_", comm);
277 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
278 void writeMechSystem(
const SimulatorType& simulator,
279 const MatrixType& matrix,
280 const VectorType& rhs,
281 const Communicator* comm)
283 writeSystem(simulator, matrix, rhs,
"mech_", comm);