13#ifndef DUMUX_NEWTON_CONVERGENCE_WRITER_HH
14#define DUMUX_NEWTON_CONVERGENCE_WRITER_HH
18#include <dune/grid/io/file/vtk/vtksequencewriter.hh>
25template <
class SolutionVector,
class Res
idualVector>
30 virtual void write(
const SolutionVector &uLastIter,
const ResidualVector &deltaU,
const ResidualVector &residual) {}
41template <
class Gr
idGeometry,
class SolutionVector,
class Res
idualVector>
44 using GridView =
typename GridGeometry::GridView;
45 static constexpr auto numEq = SolutionVector::block_type::dimension;
46 using Scalar =
typename SolutionVector::block_type::value_type;
49 "This convergence writer does not work for the staggered method, use the StaggeredNewtonConvergenceWriter instead");
57 const std::string& name =
"newton_convergence")
58 : gridGeometry_(gridGeometry)
59 , writer_(gridGeometry.gridView(), name,
"",
"")
65 for (
int eqIdx = 0; eqIdx < numEq; ++eqIdx)
67 writer_.addVertexData(x_[eqIdx],
"x_" + std::to_string(eqIdx));
68 writer_.addVertexData(delta_[eqIdx],
"delta_" + std::to_string(eqIdx));
69 writer_.addVertexData(def_[eqIdx],
"defect_" + std::to_string(eqIdx));
74 for (
int eqIdx = 0; eqIdx < numEq; ++eqIdx)
76 writer_.addCellData(x_[eqIdx],
"x_" + std::to_string(eqIdx));
77 writer_.addCellData(delta_[eqIdx],
"delta_" + std::to_string(eqIdx));
78 writer_.addCellData(def_[eqIdx],
"defect_" + std::to_string(eqIdx));
86 const auto numDofs = gridGeometry_.numDofs();
89 for (
int eqIdx = 0; eqIdx < numEq; ++eqIdx)
91 def_[eqIdx].resize(numDofs);
92 delta_[eqIdx].resize(numDofs);
93 x_[eqIdx].resize(numDofs);
99 void reset(std::size_t newId = 0UL)
100 { id_ = newId; iteration_ = 0UL; }
102 void write(
const SolutionVector& uLastIter,
103 const ResidualVector& deltaU,
104 const ResidualVector& residual)
override
106 assert(uLastIter.size() == deltaU.size() && uLastIter.size() == residual.size());
108 for (std::size_t dofIdxGlobal = 0; dofIdxGlobal < deltaU.size(); ++dofIdxGlobal)
110 for (
int eqIdx = 0; eqIdx < numEq; ++eqIdx)
112 x_[eqIdx][dofIdxGlobal] = uLastIter[dofIdxGlobal][eqIdx];
113 delta_[eqIdx][dofIdxGlobal] = - deltaU[dofIdxGlobal][eqIdx];
114 def_[eqIdx][dofIdxGlobal] = residual[dofIdxGlobal][eqIdx];
118 writer_.write(
static_cast<double>(id_) +
static_cast<double>(iteration_)/1000);
123 std::size_t id_ = 0UL;
124 std::size_t iteration_ = 0UL;
126 const GridGeometry& gridGeometry_;
128 Dune::VTKSequenceWriter<GridView> writer_;
130 std::array<std::vector<Scalar>, numEq> def_;
131 std::array<std::vector<Scalar>, numEq> delta_;
132 std::array<std::vector<Scalar>, numEq> x_;
Writes the intermediate solutions for every Newton iteration.
Definition: nonlinear/newtonconvergencewriter.hh:43
void resize()
Resizes the output fields. This has to be called whenever the grid changes.
Definition: nonlinear/newtonconvergencewriter.hh:84
void reset(std::size_t newId=0UL)
Definition: nonlinear/newtonconvergencewriter.hh:99
void write(const SolutionVector &uLastIter, const ResidualVector &deltaU, const ResidualVector &residual) override
Definition: nonlinear/newtonconvergencewriter.hh:102
NewtonConvergenceWriter(const GridGeometry &gridGeometry, const std::string &name="newton_convergence")
Constructor.
Definition: nonlinear/newtonconvergencewriter.hh:56
The available discretization methods in Dumux.
constexpr Box box
Definition: method.hh:147
constexpr Staggered staggered
Definition: method.hh:149
Definition: nonlinear/newtonconvergencewriter.hh:27
virtual void write(const SolutionVector &uLastIter, const ResidualVector &deltaU, const ResidualVector &residual)
Definition: nonlinear/newtonconvergencewriter.hh:30
virtual ~ConvergenceWriterInterface()=default