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 static constexpr std::bitset<Grid::dimension+1> dofCodims{
157 (1UL << Grid::dimension) + (1UL << (Grid::dimension-1)) + (hasElementDofs ? 1UL : 0UL)
158 };
159
160 static constexpr bool canCommunicate
161 = Dune::Capabilities::canCommunicate<Grid, Grid::dimension>::v
162 && Dune::Capabilities::canCommunicate<Grid, Grid::dimension-1>::v;
163
164 template<class GridView>
165 static bool isNonOverlapping(const GridView& gridView)
166 { return gridView.overlapSize(0) == 0; }
167
168 static const DofMapper& dofMapper(const GridGeometry& gg)
169 { return { gg.dofMapper() }; }
170};
171
172template<class GridGeometry>
174: public LinearSolverTraitsBase<GridGeometry>
175{
176 using DofMapper = typename GridGeometry::DofMapper;
177 using Grid = typename GridGeometry::GridView::Traits::Grid;
178
179 // PQ3 has DOFs on all mesh entities: vertices, edges, faces (3D), and element interiors
180 // (P3 triangles: 1 interior DOF; Q3 quads: 4; P3 tets: 0; Q3 hexes: 8)
181 // We set bits for all codimensions to ensure correct parallel communication setup
182 static constexpr std::bitset<Grid::dimension+1> dofCodims{
183 (1UL << (Grid::dimension+1)) - 1UL // bits 0..dim all set
184 };
185
186 static constexpr bool canCommunicate
187 = Dune::Capabilities::canCommunicate<Grid, Grid::dimension>::v
188 && Dune::Capabilities::canCommunicate<Grid, Grid::dimension-1>::v
189 && (Grid::dimension < 3 || Dune::Capabilities::canCommunicate<Grid, 1>::v)
190 && Dune::Capabilities::canCommunicate<Grid, 0>::v;
191
192 template<class GridView>
193 static bool isNonOverlapping(const GridView& gridView)
194 { return gridView.overlapSize(0) == 0; }
195
196 static const DofMapper& dofMapper(const GridGeometry& gg)
197 { return gg.dofMapper(); }
198};
199
201template<class GridGeometry>
203: public LinearSolverTraitsBase<GridGeometry>
204{
205 using DofMapper = typename GridGeometry::ElementMapper;
206 using Grid = typename GridGeometry::GridView::Traits::Grid;
207 static constexpr int dofCodim = 0;
208 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
209
210 template<class GridView>
211 static bool isNonOverlapping(const GridView& gridView)
212 { return false; }
213};
214
216template<class GridGeometry>
217struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
218: public LinearSolverTraitsBase<GridGeometry>
219{
220 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<typename GridGeometry::GridView>;
221
222 static DofMapper dofMapper(const GridGeometry& gg)
223 {
224 return DofMapper(gg.gridView(), Dune::mcmgLayout(Dune::Codim<1>{}));
225 }
226
227 using Grid = typename GridGeometry::GridView::Traits::Grid;
228 static constexpr int dofCodim = 1;
229
230 static constexpr bool canCommunicate =
231 Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
232
233 template<class GridView>
234 static bool isNonOverlapping(const GridView& gridView)
235 {
236 assert(gridView.overlapSize(0) > 0);
237 return false;
238 }
239};
240
242template<class GridGeometry>
243struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCDiamond>
244: public LinearSolverTraitsBase<GridGeometry>
245{
246 using DofMapper = typename GridGeometry::DofMapper;
247 using Grid = typename GridGeometry::GridView::Traits::Grid;
248 static constexpr int dofCodim = 1;
249 static constexpr bool canCommunicate = Dune::Capabilities::canCommunicate<Grid, dofCodim>::v;
250
251 static const DofMapper& dofMapper(const GridGeometry& gg)
252 { return { gg.dofMapper() }; }
253
254 template<class GridView>
255 static bool isNonOverlapping(const GridView& gridView)
256 { return gridView.overlapSize(0) == 0; }
257};
258
260template<class GridGeometry>
262: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
263
265template<class GridGeometry>
266struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::Staggered>
267: public LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCTpfa> {};
268
269} // end namespace Dumux
270
271#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:207
typename GridGeometry::ElementMapper DofMapper
Definition linearsolvertraits.hh:205
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:206
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:211
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:208
static constexpr int dofCodim
Definition linearsolvertraits.hh:248
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:246
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:255
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:249
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:247
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:251
static constexpr int dofCodim
Definition linearsolvertraits.hh:228
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:234
static DofMapper dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:222
Dune::MultipleCodimMultipleGeomTypeMapper< typename GridGeometry::GridView > DofMapper
Definition linearsolvertraits.hh:220
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:230
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:227
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:168
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:147
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:161
static constexpr std::bitset< Grid::dimension+1 > dofCodims
Definition linearsolvertraits.hh:156
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:165
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:148
static constexpr bool canCommunicate
Definition linearsolvertraits.hh:187
typename GridGeometry::GridView::Traits::Grid Grid
Definition linearsolvertraits.hh:177
static const DofMapper & dofMapper(const GridGeometry &gg)
Definition linearsolvertraits.hh:196
static bool isNonOverlapping(const GridView &gridView)
Definition linearsolvertraits.hh:193
typename GridGeometry::DofMapper DofMapper
Definition linearsolvertraits.hh:176
static constexpr std::bitset< Grid::dimension+1 > dofCodims
Definition linearsolvertraits.hh:182
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