version 3.11-dev
linearsolvertraits.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-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_LINEAR_SOLVER_TRAITS_HH
13#define DUMUX_LINEAR_SOLVER_TRAITS_HH
14
15#include <bitset>
16
17#include <dune/istl/schwarz.hh>
18#include <dune/istl/novlpschwarz.hh>
19#include <dune/istl/owneroverlapcopy.hh>
20#include <dune/istl/paamg/pinfo.hh>
21#include <dune/istl/preconditioners.hh>
22#include <dune/grid/common/capabilities.hh>
23
26
27namespace Dumux {
28
30template<class GridGeometry, class DiscretizationMethod>
32
36template<class GridGeometry>
38
40template<class MType, class VType>
42{
43 using Matrix = MType;
44 using Vector = VType;
45 using LinearOperator = Dune::MatrixAdapter<MType, VType, VType>;
46 using ScalarProduct = Dune::SeqScalarProduct<VType>;
47
48 template<class SeqPreconditioner>
49 using Preconditioner = SeqPreconditioner;
50};
51
53{
54 template<class Matrix, class Vector>
56
57 static constexpr bool canCommunicate = false;
58};
59
60#if HAVE_MPI
61template <class MType, class VType>
63{
64public:
65 using Matrix = MType;
66 using Vector = VType;
67 using Comm = Dune::OwnerOverlapCopyCommunication<Dune::bigunsignedint<96>, int>;
68 using LinearOperator = Dune::NonoverlappingSchwarzOperator<MType, VType, VType, Comm>;
69 using ScalarProduct = Dune::NonoverlappingSchwarzScalarProduct<VType, Comm>;
70 static constexpr bool isNonOverlapping = true;
71
72 template<class SeqPreconditioner>
73 using Preconditioner = Dune::NonoverlappingBlockPreconditioner<Comm, SeqPreconditioner>;
74};
75
76template <class MType, class VType>
78{
79public:
80 using Matrix = MType;
81 using Vector = VType;
82 using Comm = Dune::OwnerOverlapCopyCommunication<Dune::bigunsignedint<96>, int>;
83 using LinearOperator = Dune::OverlappingSchwarzOperator<MType, VType, VType, Comm>;
84 using ScalarProduct = Dune::OverlappingSchwarzScalarProduct<VType, Comm>;
85 static constexpr bool isNonOverlapping = false;
86
87 template<class SeqPreconditioner>
88 using Preconditioner = Dune::BlockPreconditioner<VType, VType, Comm, SeqPreconditioner>;
89};
90#endif
91
92template<class GridGeometry>
94{
95 using GridView = typename GridGeometry::GridView;
96 using Grid = typename GridGeometry::GridView::Traits::Grid;
97
98 template<class Matrix, class Vector>
100
101#if HAVE_MPI
102 template<class Matrix, class Vector>
104
105 template<class Matrix, class Vector>
107#endif
108};
109
111template<class GridGeometry>
112struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Box>
113: public LinearSolverTraitsBase<GridGeometry>
114{
115 using DofMapper = typename GridGeometry::VertexMapper;
116 using Grid = typename GridGeometry::GridView::Traits::Grid;
117 static constexpr int dofCodim = Grid::dimension;
118 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
119
120 template<class GridView>
121 static bool isNonOverlapping(const GridView& gridView)
122 { return gridView.overlapSize(0) == 0; }
123};
124
125template<class GridGeometry>
126struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::PQ1Bubble>
127: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Box>
128{
129 using Grid = typename GridGeometry::GridView::Traits::Grid;
130 using DofMapper = typename GridGeometry::DofMapper;
131
132 static constexpr int dofCodim = Grid::dimension;
133 static constexpr std::bitset<Grid::dimension+1> dofCodims{ (1UL << Grid::dimension) + 1UL };
134
135 static const DofMapper& dofMapper(const GridGeometry& gg)
136 { return { gg.dofMapper() }; }
137};
138
139template<class GridGeometry>
140struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::PQ2>
141: public LinearSolverTraitsBase<GridGeometry>
142{
143 using DofMapper = typename GridGeometry::DofMapper;
144 using Grid = typename GridGeometry::GridView::Traits::Grid;
145
146 static constexpr int dofCodim = Grid::dimension;
147 static constexpr std::bitset<Grid::dimension+1> dofCodims{ (1UL << Grid::dimension) + (1UL << (Grid::dimension-1)) };
148
149 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, Grid::dimension>::v
150 && Dune::Capabilities::canCommunicate<Grid, Grid::dimension-1>::v;
151
152 template<class GridView>
153 static bool isNonOverlapping(const GridView& gridView)
154 { return gridView.overlapSize(0) == 0; }
155
156 static const DofMapper& dofMapper(const GridGeometry& gg)
157 { return { gg.dofMapper() }; }
158};
159
161template<class GridGeometry>
162struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa>
163: public LinearSolverTraitsBase<GridGeometry>
164{
165 using DofMapper = typename GridGeometry::ElementMapper;
166 using Grid = typename GridGeometry::GridView::Traits::Grid;
167 static constexpr int dofCodim = 0;
168 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
169
170 template<class GridView>
171 static bool isNonOverlapping(const GridView& gridView)
172 { return false; }
173};
174
176template<class GridGeometry>
177struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
178: public LinearSolverTraitsBase<GridGeometry>
179{
180 class DofMapper
181 {
182 public:
183 DofMapper(const typename GridGeometry::GridView& gridView)
184 : gridView_(gridView) {}
185
186 template<class Entity>
187 auto index(const Entity& e) const
188 { return gridView_.indexSet().index(e); }
189
190 auto size() const
191 { return gridView_.size(1); }
192
193 private:
194 typename GridGeometry::GridView gridView_;
195 };
196
197 static DofMapper dofMapper(const GridGeometry& gg)
198 { return { gg.gridView() }; }
199
200 using Grid = typename GridGeometry::GridView::Traits::Grid;
201 static constexpr int dofCodim = 1;
202
203 static constexpr bool canCommunicate =
204 Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
205
206 template<class GridView>
207 static bool isNonOverlapping(const GridView& gridView)
208 {
209 assert(gridView.overlapSize(0) > 0);
210 return false;
211 }
212};
213
215template<class GridGeometry>
216struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCDiamond>
217: public LinearSolverTraitsBase<GridGeometry>
218{
219 using DofMapper = typename GridGeometry::DofMapper;
220 using Grid = typename GridGeometry::GridView::Traits::Grid;
221 static constexpr int dofCodim = 1;
222 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
223
224 static const DofMapper& dofMapper(const GridGeometry& gg)
225 { return { gg.dofMapper() }; }
226
227 template<class GridView>
228 static bool isNonOverlapping(const GridView& gridView)
229 { return gridView.overlapSize(0) == 0; }
230};
231
233template<class GridGeometry>
234struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCMpfa>
235: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
236
238template<class GridGeometry>
239struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Staggered>
240: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
241
242} // end namespace Dumux
243
244#endif
DofMapper(const typename GridGeometry::GridView &gridView)
Definition: linearsolvertraits.hh:183
auto index(const Entity &e) const
Definition: linearsolvertraits.hh:187
dune-grid capabilities compatibility layer
The available discretization methods in Dumux.
CVFE< CVFEMethods::CR_RT > FCDiamond
Definition: method.hh:105
CVFE< CVFEMethods::PQ1 > Box
Definition: method.hh:98
CVFE< CVFEMethods::PQ2 > PQ2
Definition: method.hh:118
CVFE< CVFEMethods::PQ1Bubble > PQ1Bubble
Definition: method.hh:112
Definition: adapt.hh:17
Definition: linearsolvertraits.hh:94
typename GridGeometry::GridView::Traits::Grid Grid
Definition: linearsolvertraits.hh:96
typename GridGeometry::GridView GridView
Definition: linearsolvertraits.hh:95
static bool isNonOverlapping(const GridView &gridView)
Definition: linearsolvertraits.hh:121
typename GridGeometry::VertexMapper DofMapper
Definition: linearsolvertraits.hh:115
typename GridGeometry::ElementMapper DofMapper
Definition: linearsolvertraits.hh:165
static bool isNonOverlapping(const GridView &gridView)
Definition: linearsolvertraits.hh:171
typename GridGeometry::DofMapper DofMapper
Definition: linearsolvertraits.hh:219
static bool isNonOverlapping(const GridView &gridView)
Definition: linearsolvertraits.hh:228
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition: linearsolvertraits.hh:224
static bool isNonOverlapping(const GridView &gridView)
Definition: linearsolvertraits.hh:207
static DofMapper dofMapper(const GridGeometry &gg)
Definition: linearsolvertraits.hh:197
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition: linearsolvertraits.hh:135
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition: linearsolvertraits.hh:156
typename GridGeometry::DofMapper DofMapper
Definition: linearsolvertraits.hh:143
static bool isNonOverlapping(const GridView &gridView)
Definition: linearsolvertraits.hh:153
The implementation is specialized for the different discretizations.
Definition: linearsolvertraits.hh:31
Definition: linearsolvertraits.hh:63
Dune::NonoverlappingSchwarzOperator< MType, VType, VType, Comm > LinearOperator
Definition: linearsolvertraits.hh:68
MType Matrix
Definition: linearsolvertraits.hh:65
Dune::NonoverlappingBlockPreconditioner< Comm, SeqPreconditioner > Preconditioner
Definition: linearsolvertraits.hh:73
Dune::NonoverlappingSchwarzScalarProduct< VType, Comm > ScalarProduct
Definition: linearsolvertraits.hh:69
VType Vector
Definition: linearsolvertraits.hh:66
Dune::OwnerOverlapCopyCommunication< Dune::bigunsignedint< 96 >, int > Comm
Definition: linearsolvertraits.hh:67
static constexpr bool isNonOverlapping
Definition: linearsolvertraits.hh:70
Definition: linearsolvertraits.hh:78
static constexpr bool isNonOverlapping
Definition: linearsolvertraits.hh:85
Dune::OverlappingSchwarzOperator< MType, VType, VType, Comm > LinearOperator
Definition: linearsolvertraits.hh:83
MType Matrix
Definition: linearsolvertraits.hh:80
Dune::BlockPreconditioner< VType, VType, Comm, SeqPreconditioner > Preconditioner
Definition: linearsolvertraits.hh:88
VType Vector
Definition: linearsolvertraits.hh:81
Dune::OwnerOverlapCopyCommunication< Dune::bigunsignedint< 96 >, int > Comm
Definition: linearsolvertraits.hh:82
Dune::OverlappingSchwarzScalarProduct< VType, Comm > ScalarProduct
Definition: linearsolvertraits.hh:84
Definition: linearsolvertraits.hh:53
static constexpr bool canCommunicate
Definition: linearsolvertraits.hh:57
sequential solver traits
Definition: linearsolvertraits.hh:42
MType Matrix
Definition: linearsolvertraits.hh:43
VType Vector
Definition: linearsolvertraits.hh:44
Dune::MatrixAdapter< MType, VType, VType > LinearOperator
Definition: linearsolvertraits.hh:45
SeqPreconditioner Preconditioner
Definition: linearsolvertraits.hh:49
Dune::SeqScalarProduct< VType > ScalarProduct
Definition: linearsolvertraits.hh:46