version 3.11-dev
Loading...
Searching...
No Matches
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#include <dune/grid/common/mcmgmapper.hh>
24#include <dune/geometry/type.hh>
25
28
29namespace Dumux {
30
32template<class GridGeometry, class DiscretizationMethod>
34
38template<class GridGeometry>
40
42template<class MType, class VType>
44{
45 using Matrix = MType;
46 using Vector = VType;
47 using LinearOperator = Dune::MatrixAdapter<MType, VType, VType>;
48 using ScalarProduct = Dune::SeqScalarProduct<VType>;
49
50 template<class SeqPreconditioner>
51 using Preconditioner = SeqPreconditioner;
52};
53
55{
56 template<class Matrix, class Vector>
58
59 static constexpr bool canCommunicate = false;
60};
61
62#if HAVE_MPI
63template <class MType, class VType>
65{
66public:
67 using Matrix = MType;
68 using Vector = VType;
69 using Comm = Dune::OwnerOverlapCopyCommunication<Dune::bigunsignedint<96>, int>;
70 using LinearOperator = Dune::NonoverlappingSchwarzOperator<MType, VType, VType, Comm>;
71 using ScalarProduct = Dune::NonoverlappingSchwarzScalarProduct<VType, Comm>;
72 static constexpr bool isNonOverlapping = true;
73
74 template<class SeqPreconditioner>
75 using Preconditioner = Dune::NonoverlappingBlockPreconditioner<Comm, SeqPreconditioner>;
76};
77
78template <class MType, class VType>
80{
81public:
82 using Matrix = MType;
83 using Vector = VType;
84 using Comm = Dune::OwnerOverlapCopyCommunication<Dune::bigunsignedint<96>, int>;
85 using LinearOperator = Dune::OverlappingSchwarzOperator<MType, VType, VType, Comm>;
86 using ScalarProduct = Dune::OverlappingSchwarzScalarProduct<VType, Comm>;
87 static constexpr bool isNonOverlapping = false;
88
89 template<class SeqPreconditioner>
90 using Preconditioner = Dune::BlockPreconditioner<VType, VType, Comm, SeqPreconditioner>;
91};
92#endif
93
94template<class GridGeometry>
96{
97 using GridView = typename GridGeometry::GridView;
98 using Grid = typename GridGeometry::GridView::Traits::Grid;
99
100 template<class Matrix, class Vector>
102
103#if HAVE_MPI
104 template<class Matrix, class Vector>
106
107 template<class Matrix, class Vector>
109#endif
110};
111
113template<class GridGeometry>
115: public LinearSolverTraitsBase<GridGeometry>
116{
117 using DofMapper = typename GridGeometry::VertexMapper;
118 using Grid = typename GridGeometry::GridView::Traits::Grid;
119 static constexpr int dofCodim = Grid::dimension;
120 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
121
122 template<class GridView>
123 static bool isNonOverlapping(const GridView& gridView)
124 { return gridView.overlapSize(0) == 0; }
125
126 static const DofMapper& dofMapper(const GridGeometry& gg)
127 { return { gg.dofMapper() }; }
128};
129
130template<class GridGeometry>
131struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::PQ1Bubble>
132: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Box>
133{
134 using Grid = typename GridGeometry::GridView::Traits::Grid;
135 using DofMapper = typename GridGeometry::DofMapper;
136
137 static constexpr std::bitset<Grid::dimension+1> dofCodims{ (1UL << Grid::dimension) + 1UL };
138
139 static const DofMapper& dofMapper(const GridGeometry& gg)
140 { return { gg.dofMapper() }; }
141};
142
143template<class GridGeometry>
145: public LinearSolverTraitsBase<GridGeometry>
146{
147 using DofMapper = typename GridGeometry::DofMapper;
148 using Grid = typename GridGeometry::GridView::Traits::Grid;
149
150 // Q2 on cube elements also has an interior (codim-0) DOF at the element center
151 static constexpr bool hasElementDofs =
152 Dune::Capabilities::hasSingleGeometryType<Grid>::v &&
153 (Dune::Capabilities::hasSingleGeometryType<Grid>::topologyId ==
154 Dune::GeometryTypes::cube(Grid::dimension).id());
155
156 // In 3D a cube carries one DOF per face as well (PQ2MapperTraits::layout())
157 static constexpr bool hasFaceDofs = hasElementDofs && Grid::dimension == 3;
158
159 static constexpr std::bitset<Grid::dimension+1> dofCodims{
160 (1UL << Grid::dimension) // vertices
161 + (1UL << (Grid::dimension-1)) // edges
162 + (hasFaceDofs ? (1UL << 1) : 0UL) // faces
163 + (hasElementDofs ? 1UL : 0UL) // element centres
164 };
165
166 // A codimension that carries DOFs and is not exchanged is silent: the ranks
167 // agree with each other and disagree with serial.
168 static constexpr bool canCommunicate
169 = Dune::Capabilities::canCommunicate<Grid, Grid::dimension>::v
170 && Dune::Capabilities::canCommunicate<Grid, Grid::dimension-1>::v
171 && (!hasFaceDofs || Dune::Capabilities::canCommunicate<Grid, 1>::v);
172
173 template<class GridView>
174 static bool isNonOverlapping(const GridView& gridView)
175 { return gridView.overlapSize(0) == 0; }
176
177 static const DofMapper& dofMapper(const GridGeometry& gg)
178 { return { gg.dofMapper() }; }
179};
180
181template<class GridGeometry>
183: public LinearSolverTraitsBase<GridGeometry>
184{
185 using DofMapper = typename GridGeometry::DofMapper;
186 using Grid = typename GridGeometry::GridView::Traits::Grid;
187
188 // PQ3 has DOFs on all mesh entities: vertices, edges, faces (3D), and element interiors
189 // (P3 triangles: 1 interior DOF; Q3 quads: 4; P3 tets: 0; Q3 hexes: 8)
190 // We set bits for all codimensions to ensure correct parallel communication setup
191 static constexpr std::bitset<Grid::dimension+1> dofCodims{
192 (1UL << (Grid::dimension+1)) - 1UL // bits 0..dim all set
193 };
194
195 static constexpr bool canCommunicate
196 = Dune::Capabilities::canCommunicate<Grid, Grid::dimension>::v
197 && Dune::Capabilities::canCommunicate<Grid, Grid::dimension-1>::v
198 && (Grid::dimension < 3 || Dune::Capabilities::canCommunicate<Grid, 1>::v)
199 && Dune::Capabilities::canCommunicate<Grid, 0>::v;
200
201 template<class GridView>
202 static bool isNonOverlapping(const GridView& gridView)
203 { return gridView.overlapSize(0) == 0; }
204
205 static const DofMapper& dofMapper(const GridGeometry& gg)
206 { return gg.dofMapper(); }
207};
208
210template<class GridGeometry>
212: public LinearSolverTraitsBase<GridGeometry>
213{
214 using DofMapper = typename GridGeometry::ElementMapper;
215 using Grid = typename GridGeometry::GridView::Traits::Grid;
216 static constexpr int dofCodim = 0;
217 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
218
219 static const DofMapper& dofMapper(const GridGeometry& gg)
220 { return gg.elementMapper(); }
221
222 template<class GridView>
223 static bool isNonOverlapping(const GridView& gridView)
224 { return false; }
225};
226
228template<class GridGeometry>
229struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
230: public LinearSolverTraitsBase<GridGeometry>
231{
232 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<typename GridGeometry::GridView>;
233
234 static DofMapper dofMapper(const GridGeometry& gg)
235 {
236 return DofMapper(gg.gridView(), Dune::mcmgLayout(Dune::Codim<1>{}));
237 }
238
239 using Grid = typename GridGeometry::GridView::Traits::Grid;
240 static constexpr int dofCodim = 1;
241
242 static constexpr bool canCommunicate =
243 Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
244
245 template<class GridView>
246 static bool isNonOverlapping(const GridView& gridView)
247 {
248 assert(gridView.overlapSize(0) > 0);
249 return false;
250 }
251};
252
254template<class GridGeometry>
255struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCDiamond>
256: public LinearSolverTraitsBase<GridGeometry>
257{
258 using DofMapper = typename GridGeometry::DofMapper;
259 using Grid = typename GridGeometry::GridView::Traits::Grid;
260 static constexpr int dofCodim = 1;
261 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
262
263 static const DofMapper& dofMapper(const GridGeometry& gg)
264 { return { gg.dofMapper() }; }
265
266 template<class GridView>
267 static bool isNonOverlapping(const GridView& gridView)
268 { return gridView.overlapSize(0) == 0; }
269};
270
272template<class GridGeometry>
274: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
275
277template<class GridGeometry>
278struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Staggered>
279: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
280
281} // end namespace Dumux
282
283#endif
dune-grid capabilities compatibility layer
The available discretization methods in Dumux.
Definition cellcentered/mpfa/elementvolumevariables.hh:24
Definition method.hh:20
Definition adapt.hh:17
LinearSolverTraitsImpl< GridGeometry, typename GridGeometry::DiscretizationMethod > LinearSolverTraits
The type traits required for using the IstlFactoryBackend.
Definition linearsolvertraits.hh:39
Definition linearsolvertraits.hh:96
NonoverlappingSolverTraits< Matrix, Vector > ParallelNonoverlapping
Definition linearsolvertraits.hh:108
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:98
typename GridGeometry::GridView GridView
Definition linearsolvertraits.hh:97
OverlappingSolverTraits< Matrix, Vector > ParallelOverlapping
Definition linearsolvertraits.hh:105
SequentialSolverTraits< Matrix, Vector > Sequential
Definition linearsolvertraits.hh:101
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:126
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:118
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:120
static constexpr int dofCodim
Definition linearsolvertraits.hh:119
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:123
typename GridGeometry::VertexMapper DofMapper
Definition linearsolvertraits.hh:117
static constexpr int dofCodim
Definition linearsolvertraits.hh:216
typename GridGeometry::ElementMapper DofMapper
Definition linearsolvertraits.hh:214
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:215
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:219
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:223
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:217
static constexpr int dofCodim
Definition linearsolvertraits.hh:260
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:258
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:267
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:261
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:259
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:263
static constexpr int dofCodim
Definition linearsolvertraits.hh:240
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:246
static DofMapper dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:234
Dune::MultipleCodimMultipleGeomTypeMapper< typename GridGeometry::GridView > DofMapper
Definition linearsolvertraits.hh:232
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:242
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:239
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:134
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:139
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:135
static constexpr std::bitset< Grid::dimension+1 > dofCodims
Definition linearsolvertraits.hh:137
static constexpr bool hasElementDofs
Definition linearsolvertraits.hh:151
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:177
static constexpr bool hasFaceDofs
Definition linearsolvertraits.hh:157
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:147
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:169
static constexpr std::bitset< Grid::dimension+1 > dofCodims
Definition linearsolvertraits.hh:159
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:174
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:148
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:196
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:186
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:205
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:202
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:185
static constexpr std::bitset< Grid::dimension+1 > dofCodims
Definition linearsolvertraits.hh:191
The implementation is specialized for the different discretizations.
Definition linearsolvertraits.hh:33
Definition linearsolvertraits.hh:65
Dune::NonoverlappingSchwarzOperator< MType, VType, VType, Comm > LinearOperator
Definition linearsolvertraits.hh:70
MType Matrix
Definition linearsolvertraits.hh:67
Dune::NonoverlappingBlockPreconditioner< Comm, SeqPreconditioner > Preconditioner
Definition linearsolvertraits.hh:75
Dune::NonoverlappingSchwarzScalarProduct< VType, Comm > ScalarProduct
Definition linearsolvertraits.hh:71
VType Vector
Definition linearsolvertraits.hh:68
Dune::OwnerOverlapCopyCommunication< Dune::bigunsignedint< 96 >, int > Comm
Definition linearsolvertraits.hh:69
static constexpr bool isNonOverlapping
Definition linearsolvertraits.hh:72
Definition linearsolvertraits.hh:80
static constexpr bool isNonOverlapping
Definition linearsolvertraits.hh:87
Dune::OverlappingSchwarzOperator< MType, VType, VType, Comm > LinearOperator
Definition linearsolvertraits.hh:85
MType Matrix
Definition linearsolvertraits.hh:82
Dune::BlockPreconditioner< VType, VType, Comm, SeqPreconditioner > Preconditioner
Definition linearsolvertraits.hh:90
VType Vector
Definition linearsolvertraits.hh:83
Dune::OwnerOverlapCopyCommunication< Dune::bigunsignedint< 96 >, int > Comm
Definition linearsolvertraits.hh:84
Dune::OverlappingSchwarzScalarProduct< VType, Comm > ScalarProduct
Definition linearsolvertraits.hh:86
Definition linearsolvertraits.hh:55
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:59
SequentialSolverTraits< Matrix, Vector > Sequential
Definition linearsolvertraits.hh:57
sequential solver traits
Definition linearsolvertraits.hh:44
MType Matrix
Definition linearsolvertraits.hh:45
VType Vector
Definition linearsolvertraits.hh:46
Dune::MatrixAdapter< MType, VType, VType > LinearOperator
Definition linearsolvertraits.hh:47
SeqPreconditioner Preconditioner
Definition linearsolvertraits.hh:51
Dune::SeqScalarProduct< VType > ScalarProduct
Definition linearsolvertraits.hh:48