version 3.8
nonlinear/newtonconvergencewriter.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
13#ifndef DUMUX_NEWTON_CONVERGENCE_WRITER_HH
14#define DUMUX_NEWTON_CONVERGENCE_WRITER_HH
15
16#include <string>
17
18#include <dune/grid/io/file/vtk/vtksequencewriter.hh>
20
21namespace Dumux {
22
25template <class SolutionVector, class ResidualVector>
27{
28 virtual ~ConvergenceWriterInterface() = default;
29
30 virtual void write(const SolutionVector &uLastIter, const ResidualVector &deltaU, const ResidualVector &residual) {}
31};
32
41template <class GridGeometry, class SolutionVector, class ResidualVector>
42class NewtonConvergenceWriter : public ConvergenceWriterInterface<SolutionVector, ResidualVector>
43{
44 using GridView = typename GridGeometry::GridView;
45 static constexpr auto numEq = SolutionVector::block_type::dimension;
46 using Scalar = typename SolutionVector::block_type::value_type;
47
48 static_assert(GridGeometry::discMethod != DiscretizationMethods::staggered,
49 "This convergence writer does not work for the staggered method, use the StaggeredNewtonConvergenceWriter instead");
50public:
56 NewtonConvergenceWriter(const GridGeometry& gridGeometry,
57 const std::string& name = "newton_convergence")
58 : gridGeometry_(gridGeometry)
59 , writer_(gridGeometry.gridView(), name, "", "")
60 {
61 resize();
62
63 if (GridGeometry::discMethod == DiscretizationMethods::box)
64 {
65 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
66 {
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));
70 }
71 }
72 else
73 {
74 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
75 {
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));
79 }
80 }
81 }
82
84 void resize()
85 {
86 const auto numDofs = gridGeometry_.numDofs();
87
88 // resize the output fields
89 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
90 {
91 def_[eqIdx].resize(numDofs);
92 delta_[eqIdx].resize(numDofs);
93 x_[eqIdx].resize(numDofs);
94 }
95 }
96
99 void reset(std::size_t newId = 0UL)
100 { id_ = newId; iteration_ = 0UL; }
101
102 void write(const SolutionVector& uLastIter,
103 const ResidualVector& deltaU,
104 const ResidualVector& residual) override
105 {
106 assert(uLastIter.size() == deltaU.size() && uLastIter.size() == residual.size());
107
108 for (std::size_t dofIdxGlobal = 0; dofIdxGlobal < deltaU.size(); ++dofIdxGlobal)
109 {
110 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
111 {
112 x_[eqIdx][dofIdxGlobal] = uLastIter[dofIdxGlobal][eqIdx];
113 delta_[eqIdx][dofIdxGlobal] = - deltaU[dofIdxGlobal][eqIdx];
114 def_[eqIdx][dofIdxGlobal] = residual[dofIdxGlobal][eqIdx];
115 }
116 }
117
118 writer_.write(static_cast<double>(id_) + static_cast<double>(iteration_)/1000);
119 ++iteration_;
120 }
121
122private:
123 std::size_t id_ = 0UL;
124 std::size_t iteration_ = 0UL;
125
126 const GridGeometry& gridGeometry_;
127
128 Dune::VTKSequenceWriter<GridView> writer_;
129
130 std::array<std::vector<Scalar>, numEq> def_;
131 std::array<std::vector<Scalar>, numEq> delta_;
132 std::array<std::vector<Scalar>, numEq> x_;
133};
134
135} // end namespace Dumux
136
137#endif
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: adapt.hh:17
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