3.1-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
common/boundarytypes.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 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
24#ifndef DUMUX_BOUNDARY_TYPES_HH
25#define DUMUX_BOUNDARY_TYPES_HH
26
27#include <algorithm>
28#include <array>
29
30namespace Dumux {
31
36template <int numEq>
38{
39public:
41 { reset(); }
42
44 static constexpr int size()
45 { return numEq; }
46
54 void reset()
55 {
56 for (int eqIdx=0; eqIdx < numEq; ++eqIdx)
57 resetEq(eqIdx);
58 }
59
63 void resetEq(int eqIdx)
64 {
65 boundaryInfo_[eqIdx].visited = false;
66
67 boundaryInfo_[eqIdx].isDirichlet = false;
68 boundaryInfo_[eqIdx].isNeumann = false;
69 boundaryInfo_[eqIdx].isOutflow = false;
70 boundaryInfo_[eqIdx].isCouplingDirichlet = false;
71 boundaryInfo_[eqIdx].isCouplingNeumann = false;
72
73 eq2pvIdx_[eqIdx] = eqIdx;
74 pv2eqIdx_[eqIdx] = eqIdx;
75 }
76
83 bool isSet(int eqIdx) const
84 { return boundaryInfo_[eqIdx].visited; }
85
92 void checkWellPosed() const
93 {
94 // if this fails, at least one condition is missing.
95 for (int i=0; i < numEq; ++i)
96 assert(boundaryInfo_[i].visited);
97 }
98
103 {
104 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
105 setNeumann(eqIdx);
106 }
107
112 {
113 for (int eqIdx = 0; eqIdx < numEq; ++ eqIdx)
114 setDirichlet(eqIdx);
115 }
116
121 {
122 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
123 setOutflow(eqIdx);
124 }
125
130 {
131 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
133 }
134
139 {
140 for (int eqIdx = 0; eqIdx < numEq; ++eqIdx)
141 setCouplingNeumann(eqIdx);
142 }
143
150 void setNeumann(int eqIdx)
151 {
152 resetEq(eqIdx);
153 boundaryInfo_[eqIdx].visited = true;
154 boundaryInfo_[eqIdx].isNeumann = true;
155 }
156
166 void setDirichlet(int pvIdx, int eqIdx)
167 {
168 resetEq(eqIdx);
169 boundaryInfo_[eqIdx].visited = true;
170 boundaryInfo_[eqIdx].isDirichlet = true;
171
172 // update the equation <-> primary variable mapping
173 eq2pvIdx_[eqIdx] = pvIdx;
174 pv2eqIdx_[pvIdx] = eqIdx;
175 }
176
184 void setOutflow(int eqIdx)
185 {
186 resetEq(eqIdx);
187 boundaryInfo_[eqIdx].visited = true;
188 boundaryInfo_[eqIdx].isOutflow = true;
189 }
190
195 void setCouplingDirichlet(int eqIdx)
196 {
197 resetEq(eqIdx);
198 boundaryInfo_[eqIdx].visited = true;
199 boundaryInfo_[eqIdx].isCouplingDirichlet = true;
200 boundaryInfo_[eqIdx].isDirichlet = true;
201 }
202
207 void setCouplingNeumann(int eqIdx)
208 {
209 resetEq(eqIdx);
210 boundaryInfo_[eqIdx].visited = true;
211 boundaryInfo_[eqIdx].isCouplingNeumann = true;
212 boundaryInfo_[eqIdx].isNeumann = true;
213 }
214
225 void setDirichlet(int pvIdx)
226 {
227 setDirichlet(pvIdx, pvIdx);
228 }
229
236 bool isDirichlet(unsigned eqIdx) const
237 { return boundaryInfo_[eqIdx].isDirichlet; }
238
243 bool hasOnlyDirichlet() const
244 {
245 return std::all_of(boundaryInfo_.begin(),
246 boundaryInfo_.end(),
247 [](const BoundaryInfo& b){ return b.isDirichlet; }
248 );
249 }
250
255 bool hasDirichlet() const
256 {
257 for (int i = 0; i < numEq; ++i)
259 return true;
260 return false;
261 }
262
269 bool isNeumann(unsigned eqIdx) const
270 { return boundaryInfo_[eqIdx].isNeumann; }
271
276 bool hasOnlyNeumann() const
277 {
278 return std::all_of(boundaryInfo_.begin(),
279 boundaryInfo_.end(),
280 [](const BoundaryInfo& b){ return b.isNeumann; }
281 );
282 }
283
288 bool hasNeumann() const
289 {
290 for (int i = 0; i < numEq; ++i)
292 return true;
293 return false;
294 }
295
302 bool isOutflow(unsigned eqIdx) const
303 { return boundaryInfo_[eqIdx].isOutflow; }
304
309 bool hasOutflow() const
310 {
311 for (int i = 0; i < numEq; ++i)
313 return true;
314 return false;
315 }
316
323 bool isCouplingDirichlet(unsigned eqIdx) const
324 { return boundaryInfo_[eqIdx].isCouplingDirichlet; }
325
331 {
332 for (int i = 0; i < numEq; ++i)
334 return true;
335 return false;
336 }
337
344 bool isCouplingNeumann(unsigned eqIdx) const
345 { return boundaryInfo_[eqIdx].isCouplingNeumann; }
346
352 {
353 for (int i = 0; i < numEq; ++i)
355 return true;
356 return false;
357 }
358
365 bool isCoupling(unsigned eqIdx) const
366 {
367 return boundaryInfo_[eqIdx].isCouplingDirichlet
368 || boundaryInfo_[eqIdx].isCouplingNeumann;
369 }
370
375 bool hasCoupling() const
376 {
377 for (int i = 0; i < numEq; ++i)
378 if (isCoupling(i))
379 return true;
380 return false;
381 }
382
391 unsigned dirichletToEqIndex(unsigned pvIdx) const
392 { return pv2eqIdx_[pvIdx]; }
393
402 unsigned eqToDirichletIndex(unsigned eqIdx) const
403 { return eq2pvIdx_[eqIdx]; }
404
405protected:
408 bool visited : 1;
409 bool isDirichlet : 1;
410 bool isNeumann : 1;
411 bool isOutflow : 1;
414 };
415
416 std::array<BoundaryInfo, numEq> boundaryInfo_;
417 std::array<unsigned int, numEq> eq2pvIdx_, pv2eqIdx_;
418};
419
420} // end namespace Dumux
421
422#endif
make the local view function available whenever we use the grid geometry
Definition: adapt.hh:29
Class to specify the type of a boundary.
Definition: common/boundarytypes.hh:38
void setAllCouplingDirichlet()
Set all boundary conditions to Dirichlet-like coupling.
Definition: common/boundarytypes.hh:129
void setAllNeumann()
Set all boundary conditions to Neumann.
Definition: common/boundarytypes.hh:102
bool isOutflow(unsigned eqIdx) const
Returns true if an equation is used to specify an outflow condition.
Definition: common/boundarytypes.hh:302
bool isNeumann(unsigned eqIdx) const
Returns true if an equation is used to specify a Neumann condition.
Definition: common/boundarytypes.hh:269
void setAllDirichlet()
Set all boundary conditions to Dirichlet.
Definition: common/boundarytypes.hh:111
void reset()
Reset the boundary types for all equations.
Definition: common/boundarytypes.hh:54
bool hasOnlyDirichlet() const
Returns true if all equations are used to specify a Dirichlet condition.
Definition: common/boundarytypes.hh:243
BoundaryTypes()
Definition: common/boundarytypes.hh:40
bool isSet(int eqIdx) const
Returns true if the boundary types for a given equation has been specified.
Definition: common/boundarytypes.hh:83
bool isDirichlet(unsigned eqIdx) const
Returns true if an equation is used to specify a Dirichlet condition.
Definition: common/boundarytypes.hh:236
void resetEq(int eqIdx)
Reset the boundary types for one equation.
Definition: common/boundarytypes.hh:63
bool hasNeumann() const
Returns true if some equation is used to specify a Neumann condition.
Definition: common/boundarytypes.hh:288
void setDirichlet(int pvIdx)
Set a Dirichlet boundary condition for a single primary variable.
Definition: common/boundarytypes.hh:225
unsigned eqToDirichletIndex(unsigned eqIdx) const
Returns the index of the primary variable which should be used for the Dirichlet condition given an e...
Definition: common/boundarytypes.hh:402
void checkWellPosed() const
Make sure the boundary conditions are well-posed.
Definition: common/boundarytypes.hh:92
bool isCouplingNeumann(unsigned eqIdx) const
Returns true if an equation is used to specify an Neumann coupling condition.
Definition: common/boundarytypes.hh:344
bool hasCoupling() const
Returns true if some equation is used to specify a coupling condition.
Definition: common/boundarytypes.hh:375
bool hasOnlyNeumann() const
Returns true if all equations are used to specify a Neumann condition.
Definition: common/boundarytypes.hh:276
void setDirichlet(int pvIdx, int eqIdx)
Set a Dirichlet boundary condition for a single primary variable.
Definition: common/boundarytypes.hh:166
std::array< BoundaryInfo, numEq > boundaryInfo_
Definition: common/boundarytypes.hh:416
std::array< unsigned int, numEq > eq2pvIdx_
Definition: common/boundarytypes.hh:417
void setCouplingNeumann(int eqIdx)
Set a boundary condition for a single equation to a Neumann-like coupling condition.
Definition: common/boundarytypes.hh:207
unsigned dirichletToEqIndex(unsigned pvIdx) const
Returns the index of the equation which should be used for the Dirichlet condition of the pvIdx's pri...
Definition: common/boundarytypes.hh:391
void setAllOutflow()
Set all boundary conditions to Neumann.
Definition: common/boundarytypes.hh:120
bool isCouplingDirichlet(unsigned eqIdx) const
Returns true if an equation is used to specify an Dirichlet coupling condition.
Definition: common/boundarytypes.hh:323
void setOutflow(int eqIdx)
Set a Neumann boundary condition for a single a single equation.
Definition: common/boundarytypes.hh:184
bool hasDirichlet() const
Returns true if some equation is used to specify a Dirichlet condition.
Definition: common/boundarytypes.hh:255
void setCouplingDirichlet(int eqIdx)
Set a boundary condition for a single equation to a Dirichlet-like coupling condition.
Definition: common/boundarytypes.hh:195
bool hasOutflow() const
Returns true if some equation is used to specify an outflow condition.
Definition: common/boundarytypes.hh:309
bool isCoupling(unsigned eqIdx) const
Returns true if an equation is used to specify a coupling condition.
Definition: common/boundarytypes.hh:365
void setAllCouplingNeumann()
Set all boundary conditions to Neumann-like coupling.
Definition: common/boundarytypes.hh:138
bool hasCouplingDirichlet() const
Returns true if some equation is used to specify an Dirichlet coupling condition.
Definition: common/boundarytypes.hh:330
bool hasCouplingNeumann() const
Returns true if some equation is used to specify an Neumann coupling condition.
Definition: common/boundarytypes.hh:351
std::array< unsigned int, numEq > pv2eqIdx_
Definition: common/boundarytypes.hh:417
static constexpr int size()
we have a boundary condition for each equation
Definition: common/boundarytypes.hh:44
void setNeumann(int eqIdx)
Set a Neumann boundary condition for a single a single equation.
Definition: common/boundarytypes.hh:150
use bitfields to minimize the size
Definition: common/boundarytypes.hh:407
bool isNeumann
Definition: common/boundarytypes.hh:410
bool isOutflow
Definition: common/boundarytypes.hh:411
bool isDirichlet
Definition: common/boundarytypes.hh:409
bool visited
Definition: common/boundarytypes.hh:408
bool isCouplingDirichlet
Definition: common/boundarytypes.hh:412
bool isCouplingNeumann
Definition: common/boundarytypes.hh:413