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 const auto& iterCtx = simulator.problem().iterationContext();
77 std::ostringstream oss;
78 oss <<
"prob_" << simulator.episodeIndex()
79 <<
"_time_" << std::setprecision(15) << std::setw(12) << std::setfill(
'0') << simulator.time()
80 <<
"_nit_" << iterCtx.iteration()
81 <<
'_' << objName <<
"_istl";
83 const auto filename = (output_dir / oss.str()).generic_string();
86 if (comm !=
nullptr) {
87 Dune::storeMatrixMarket(linalgObject, filename, *comm);
92 Dune::storeMatrixMarket(linalgObject, filename +
".mm");
121 template <
class SimulatorType,
class VectorType,
class Communicator>
122 void writeVector(
const SimulatorType& simulator,
123 const VectorType& rhs,
124 const std::string& sysName,
125 const Communicator* comm)
127 detail::writeMatrixMarketObject(simulator, rhs, sysName +
"_vector", comm);
154 template <
class SimulatorType,
class MatrixType,
class Communicator>
155 void writeMatrix(
const SimulatorType& simulator,
156 const MatrixType& matrix,
157 const std::string& sysName,
158 const Communicator* comm)
160 detail::writeMatrixMarketObject(simulator, matrix, sysName +
"_matrix", comm);
196 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
197 void writeSystem(
const SimulatorType& simulator,
198 const MatrixType& matrix,
199 const VectorType& rhs,
200 const std::string& sysName,
201 const Communicator* comm)
203 writeMatrix(simulator, matrix, sysName, comm);
204 writeVector(simulator, rhs, sysName, comm);
238 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
239 void writeSystem(
const SimulatorType& simulator,
240 const MatrixType& matrix,
241 const VectorType& rhs,
242 const Communicator* comm)
244 writeSystem(simulator, matrix, rhs,
"flow_", comm);
278 template <
class SimulatorType,
class MatrixType,
class VectorType,
class Communicator>
279 void writeMechSystem(
const SimulatorType& simulator,
280 const MatrixType& matrix,
281 const VectorType& rhs,
282 const Communicator* comm)
284 writeSystem(simulator, matrix, rhs,
"mech_", comm);