24#ifndef DUMUX_PARTIAL_REASSEMBLER_HH
25#define DUMUX_PARTIAL_REASSEMBLER_HH
30#include <dune/grid/common/gridenums.hh>
31#include <dune/istl/multitypeblockvector.hh>
46 template<
typename... Args>
48 { DUNE_THROW(Dune::InvalidStateException,
"DefaultPartialReassembler should be never constructed!"); }
50 template<
typename... Args>
53 template<
typename... Args>
56 template<
typename... Args>
59 template<
typename... Args>
73template<
class Assembler,
class DiscretizationMethod>
78 { DUNE_THROW(Dune::NotImplemented,
"PartialReassembler for this discretization method!"); }
86 template<
typename... Args>
89 template<
typename... Args>
92 template<
typename... Args>
100template<
class Assembler>
103 using Scalar =
typename Assembler::Scalar;
104 using GridGeometry =
typename Assembler::GridGeometry;
105 using JacobianMatrix =
typename Assembler::JacobianMatrix;
106 using VertexMapper =
typename GridGeometry::VertexMapper;
107 static constexpr int dim = GridGeometry::GridView::dimension;
111 : elementColor_(assembler.gridGeometry().elementMapper().size(),
EntityColor::
red)
112 , vertexColor_(assembler.gridGeometry().vertexMapper().size(),
EntityColor::
red)
117 const std::vector<Scalar>& distanceFromLastLinearization,
120 const auto& gridGeometry = assembler.gridGeometry();
121 const auto& gridView = gridGeometry.gridView();
122 const auto& elementMapper = gridGeometry.elementMapper();
123 const auto& vertexMapper = gridGeometry.vertexMapper();
129 for (
unsigned int i = 0; i < vertexColor_.size(); ++i)
132 if (distanceFromLastLinearization[i] > threshold)
139 for (
const auto& element : elements(gridView))
144 int numVertices = element.subEntities(dim);
146 for (
int i = 0; i < numVertices; ++i) {
147 int globalI = vertexMapper.subIndex(element, i, dim);
155 int eIdx = elementMapper.index(element);
164 for (
const auto& element : elements(gridView))
166 int eIdx = elementMapper.index(element);
171 int numVertices = element.subEntities(dim);
173 for (
int i = 0; i < numVertices; ++i) {
174 int globalI = vertexMapper.subIndex(element, i, dim);
187 minHandle(vertexMapper, vertexColor_);
189 gridView.communicate(minHandle,
190 Dune::InteriorBorder_InteriorBorder_Interface,
191 Dune::ForwardCommunication);
193 DUNE_THROW(Dune::InvalidStateException,
"Cannot call computeColors on multiple processes for a grid that cannot communicate codim-" << dim <<
"-entities.");
196 for (
const auto& element : elements(gridView))
198 int eIdx = elementMapper.index(element);
204 bool isOrange =
false;
205 int numVertices = element.subEntities(dim);
207 for (
int i = 0; i < numVertices; ++i) {
208 int globalI = vertexMapper.subIndex(element, i, dim);
223 for (
const auto& element : elements(gridView))
225 int eIdx = elementMapper.index(element);
230 int numVertices = element.subEntities(dim);
232 for (
int i = 0; i < numVertices; ++i) {
233 int globalI = vertexMapper.subIndex(element, i, dim);
244 maxHandle(vertexMapper, vertexColor_);
246 gridView.communicate(maxHandle,
247 Dune::InteriorBorder_InteriorBorder_Interface,
248 Dune::ForwardCommunication);
250 DUNE_THROW(Dune::InvalidStateException,
"Cannot call computeColors on multiple processes for a grid that cannot communicate codim-" << dim <<
"-entities.");
253 for (
unsigned int i=0; i < vertexColor_.size(); ++i) {
263 return std::count_if(elementColor_.begin(), elementColor_.end(),
264 [](
EntityColor c){ return c == EntityColor::green; });
269 auto& jacobian = assembler.jacobian();
272 for (
unsigned int rowIdx = 0; rowIdx < jacobian.N(); ++rowIdx)
278 auto colIt = jacobian[rowIdx].begin();
279 const auto& colEndIt = jacobian[rowIdx].end();
280 for (; colIt != colEndIt; ++colIt) {
294 {
return elementColor_[idx]; }
297 {
return vertexColor_[idx]; }
300 {
return vertexColor_[idx]; }
304 std::vector<EntityColor> elementColor_;
305 std::vector<EntityColor> vertexColor_;
312template<
class Assembler>
315 using Scalar =
typename Assembler::Scalar;
316 using GridGeometry =
typename Assembler::GridGeometry;
317 using JacobianMatrix =
typename Assembler::JacobianMatrix;
321 : elementColor_(assembler.gridGeometry().elementMapper().size(),
EntityColor::
red)
326 const std::vector<Scalar>& distanceFromLastLinearization,
329 const auto& gridGeometry = assembler.gridGeometry();
330 const auto& gridView = gridGeometry.gridView();
331 const auto& elementMapper = gridGeometry.elementMapper();
334 for (
const auto& element : elements(gridView))
336 int eIdx = elementMapper.index(element);
338 if (distanceFromLastLinearization[eIdx] > threshold)
351 const auto& connectivityMap = gridGeometry.connectivityMap();
352 for (
unsigned eIdx = 0; eIdx < elementColor_.size(); ++eIdx)
357 if (distanceFromLastLinearization[eIdx] > threshold)
359 for (
const auto& connectedDof : connectivityMap[eIdx])
365 return std::count_if(elementColor_.begin(), elementColor_.end(),
366 [](
EntityColor c){return c == EntityColor::green;});
372 auto& jacobian = assembler.jacobian();
373 const auto& connectivityMap = assembler.gridGeometry().connectivityMap();
376 for (
unsigned int colIdx = 0; colIdx < jacobian.M(); ++colIdx)
382 jacobian[colIdx][colIdx] = 0;
383 for (
const auto& dataJ : connectivityMap[colIdx])
384 jacobian[dataJ.globalJ][colIdx] = 0;
395 {
return elementColor_[idx]; }
398 {
return elementColor_[idx]; }
402 std::vector<EntityColor> elementColor_;
409template<
class Assembler>
415 using ParentType::ParentType;
421 template<
class Engine>
430template<
class Assembler>
433 using Scalar =
typename Assembler::Scalar;
434 using GridGeometry =
typename Assembler::GridGeometry;
435 using JacobianMatrix =
typename Assembler::JacobianMatrix;
436 using VertexMapper =
typename GridGeometry::VertexMapper;
438 using DiscretizationMethod =
typename GridGeometry::DiscretizationMethod;
451 const auto& gridGeometry = assembler.gridGeometry();
452 totalElems_ = gridGeometry.elementMapper().size();
453 totalElems_ = gridGeometry.gridView().comm().sum(totalElems_);
472 const std::vector<Scalar>& distanceFromLastLinearization,
475 greenElems_ = engine_.computeColors(assembler, distanceFromLastLinearization, threshold);
480 engine_.resetColors();
485 engine_.resetJacobian(assembler);
491 template <
class Communication>
492 void report(
const Communication& comm, std::ostream& outStream)
495 greenElems_ = comm.sum(greenElems_);
497 const auto reassembledElems = totalElems_ - greenElems_;
498 const auto width = Fmt::formatted_size(
"{}", totalElems_);
499 outStream << Fmt::format(
", reassembled {:{}} ({:3}%) elements",
500 reassembledElems, width, 100*reassembledElems/totalElems_);
504 {
return engine_.elementColor(idx); }
507 {
return engine_.dofColor(idx); }
510 typename std::enable_if_t<enable, int> = 0>
512 {
return engine_.vertexColor(idx); }
Formatting based on the fmt-library which implements std::format of C++20.
dune-grid capabilities compatibility layer
A helper function for class member function introspection.
Contains a class to exchange entries of a vector.
An enum class to define the colors of elements and vertices required for partial Jacobian reassembly.
The available discretization methods in Dumux.
EntityColor
The colors of elements and vertices required for partial Jacobian reassembly.
Definition entitycolor.hh:35
@ green
does not need to be reassembled
Definition entitycolor.hh:52
@ red
distance from last linearization is above the tolerance
Definition entitycolor.hh:37
@ yellow
neighboring entity is red
Definition entitycolor.hh:40
@ orange
Definition entitycolor.hh:49
VectorCommDataHandle< Mapper, Vector, codim, Detail::Min, DataType > VectorCommDataHandleMin
Definition vectorcommdatahandle.hh:132
constexpr auto isValid(const Expression &t)
A function that creates a test functor to do class member introspection at compile time.
Definition isvalid.hh:93
VectorCommDataHandle< Mapper, Vector, codim, Detail::Max, DataType > VectorCommDataHandleMax
Definition vectorcommdatahandle.hh:135
static constexpr bool canCommunicate
Definition gridcapabilities.hh:63
Definition cellcentered/mpfa/elementvolumevariables.hh:36
EntityColor dofColor(size_t idx) const
Definition partialreassembler.hh:62
void resetJacobian(Args &&... args) const
Definition partialreassembler.hh:54
void computeColors(Args &&... args)
Definition partialreassembler.hh:57
EntityColor vertexColor(size_t idx) const
Definition partialreassembler.hh:68
void report(Args &&... args)
Definition partialreassembler.hh:51
DefaultPartialReassembler(Args &&... args)
Definition partialreassembler.hh:47
void resetColors(Args &&... args)
Definition partialreassembler.hh:60
EntityColor elementColor(size_t idx) const
Definition partialreassembler.hh:65
the partial reassembler engine specialized for discretization methods
Definition partialreassembler.hh:75
void resetJacobian(Args &&... args) const
Definition partialreassembler.hh:90
EntityColor elementColor(size_t idx) const
Definition partialreassembler.hh:80
PartialReassemblerEngine(const Assembler &)
Definition partialreassembler.hh:77
EntityColor dofColor(size_t idx) const
Definition partialreassembler.hh:83
void resetColors(Args &&... args)
Definition partialreassembler.hh:93
std::size_t computeColors(Args &&... args)
Definition partialreassembler.hh:87
EntityColor dofColor(size_t idx) const
Definition partialreassembler.hh:299
std::size_t computeColors(const Assembler &assembler, const std::vector< Scalar > &distanceFromLastLinearization, Scalar threshold)
Definition partialreassembler.hh:116
PartialReassemblerEngine(const Assembler &assembler)
Definition partialreassembler.hh:110
void resetColors()
Definition partialreassembler.hh:287
void resetJacobian(Assembler &assembler) const
Definition partialreassembler.hh:267
EntityColor vertexColor(size_t idx) const
Definition partialreassembler.hh:296
EntityColor elementColor(size_t idx) const
Definition partialreassembler.hh:293
void resetJacobian(Assembler &assembler) const
Definition partialreassembler.hh:370
std::size_t computeColors(const Assembler &assembler, const std::vector< Scalar > &distanceFromLastLinearization, Scalar threshold)
Definition partialreassembler.hh:325
EntityColor dofColor(size_t idx) const
Definition partialreassembler.hh:397
PartialReassemblerEngine(const Assembler &assembler)
Definition partialreassembler.hh:320
void resetColors()
Definition partialreassembler.hh:389
EntityColor elementColor(size_t idx) const
Definition partialreassembler.hh:394
helper struct to determine whether the an engine class has vertex colors
Definition partialreassembler.hh:420
auto operator()(Engine &&e) -> decltype(e.vertexColor(0))
Definition partialreassembler.hh:422
PartialReassembler(const Assembler &assembler)
constructor
Definition partialreassembler.hh:447
EntityColor vertexColor(size_t idx) const
Definition partialreassembler.hh:511
void resetJacobian(Assembler &assembler) const
Definition partialreassembler.hh:483
void resetColors()
Definition partialreassembler.hh:478
void computeColors(const Assembler &assembler, const std::vector< Scalar > &distanceFromLastLinearization, Scalar threshold)
Determine the colors of entities for partial reassembly.
Definition partialreassembler.hh:471
void report(const Communication &comm, std::ostream &outStream)
called by the assembler after successful assembly
Definition partialreassembler.hh:492
EntityColor dofColor(size_t idx) const
Definition partialreassembler.hh:506
EntityColor elementColor(size_t idx) const
Definition partialreassembler.hh:503