37 using CellCenterSolutionVector =
typename std::decay_t<decltype(std::declval<SolutionVector>()[GridGeometry::cellCenterIdx()])>;
57 const std::string& name =
"newton_convergence")
58 : gridGeometry_(gridGeometry)
59 , ccWriter_(gridGeometry.gridView(), name,
"",
"")
61 , faceSequenceWriter_(faceWriter_, name +
"-face",
"",
"",
62 gridGeometry.gridView().comm().rank(),
63 gridGeometry.gridView().comm().size())
67 for (
int eqIdx = 0; eqIdx < numEqCellCenter; ++eqIdx)
69 ccWriter_.addCellData(xCellCenter_[eqIdx],
"x_" + std::to_string(eqIdx));
70 ccWriter_.addCellData(deltaCellCenter_[eqIdx],
"delta_" + std::to_string(eqIdx));
71 ccWriter_.addCellData(defCellCenter_[eqIdx],
"defect_" + std::to_string(eqIdx));
78 const auto numCellCenterDofs = gridGeometry_.numCellCenterDofs();
79 const auto numFaceDofs = gridGeometry_.numFaceDofs();
82 for (
int eqIdx = 0; eqIdx < numEqCellCenter; ++eqIdx)
84 defCellCenter_[eqIdx].resize(numCellCenterDofs);
85 deltaCellCenter_[eqIdx].resize(numCellCenterDofs);
86 xCellCenter_[eqIdx].resize(numCellCenterDofs);
90 for (
int eqIdx = 0; eqIdx < numEqFace; ++eqIdx)
92 defFace_[eqIdx].resize(numFaceDofs);
93 deltaFace_[eqIdx].resize(numFaceDofs);
94 xFace_[eqIdx].resize(numFaceDofs);
97 coordinates_.resize(numFaceDofs);
98 for (
auto&& facet : facets(gridGeometry_.gridView()))
100 const auto dofIdxGlobal = gridGeometry_.gridView().indexSet().index(facet);
101 coordinates_[dofIdxGlobal] = facet.geometry().center();
110 void write(
const SolutionVector& uLastIter,
111 const ResidualVector& deltaU,
112 const ResidualVector& residual)
override
114 assert(uLastIter.size() == deltaU.size() && uLastIter.size() == residual.size());
116 for (std::size_t dofIdxGlobal = 0; dofIdxGlobal < deltaU[GridGeometry::cellCenterIdx()].size(); ++dofIdxGlobal)
118 for (
int eqIdx = 0; eqIdx < numEqCellCenter; ++eqIdx)
120 xCellCenter_[eqIdx][dofIdxGlobal] = uLastIter[GridGeometry::cellCenterIdx()][dofIdxGlobal][eqIdx];
121 deltaCellCenter_[eqIdx][dofIdxGlobal] = - deltaU[GridGeometry::cellCenterIdx()][dofIdxGlobal][eqIdx];
122 defCellCenter_[eqIdx][dofIdxGlobal] = residual[GridGeometry::cellCenterIdx()][dofIdxGlobal][eqIdx];
126 for (
int eqIdx = 0; eqIdx < numEqFace; ++eqIdx)
128 faceWriter_->addPointData(xFace_[eqIdx],
"x_" + std::to_string(eqIdx));
129 faceWriter_->addPointData(deltaFace_[eqIdx],
"delta_" + std::to_string(eqIdx));
130 faceWriter_->addPointData(defFace_[eqIdx],
"defect_" + std::to_string(eqIdx));
133 for (std::size_t dofIdxGlobal = 0; dofIdxGlobal < deltaU[GridGeometry::faceIdx()].size(); ++dofIdxGlobal)
135 for (
int eqIdx = 0; eqIdx < numEqFace; ++eqIdx)
137 xFace_[eqIdx][dofIdxGlobal] = uLastIter[GridGeometry::faceIdx()][dofIdxGlobal][eqIdx];
138 deltaFace_[eqIdx][dofIdxGlobal] = - deltaU[GridGeometry::faceIdx()][dofIdxGlobal][eqIdx];
139 defFace_[eqIdx][dofIdxGlobal] = residual[GridGeometry::faceIdx()][dofIdxGlobal][eqIdx];
143 ccWriter_.write(
static_cast<double>(id_) +
static_cast<double>(iteration_)/1000);
144 faceSequenceWriter_.write(
static_cast<double>(id_) +
static_cast<double>(iteration_)/1000);