version 3.11-dev
Loading...
Searching...
No Matches
dirichletconstraints.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_DIRICHLET_CONSTRAINTS_HH
13#define DUMUX_DIRICHLET_CONSTRAINTS_HH
14
15#include <concepts>
16#include <cstddef>
17#include <limits>
18#include <unordered_map>
19#include <vector>
20
21#include <dune/grid/common/rangegenerators.hh>
22
24
25namespace Dumux {
26
27template<class Info, class Values>
29{
30 using ConstraintInfo = Info;
31 using ConstraintValues = Values;
32
34 { return info_; }
35
36 const ConstraintValues& values() const
37 { return values_; }
38
41};
42
43template<class DirichletConstraintInfo, class DirichletValues, class IndexType>
44struct DirichletConstraintData : public ConstraintData<DirichletConstraintInfo, DirichletValues>
45{
46 using GridIndexType = IndexType;
47
49 { return dofIdx_; }
50
52};
53
69template<class Constraint, class GridDiscretization, class ConstraintInfoFunc, class ValuesFunc>
70void appendBoundaryDirichletConstraints(std::vector<Constraint>& constraints,
71 const GridDiscretization& gridDiscretization,
72 const ConstraintInfoFunc& constraintInfo,
73 const ValuesFunc& values)
74{
75 using ConstraintInfo = typename Constraint::ConstraintInfo;
76 using ConstraintValues = typename Constraint::ConstraintValues;
77 using GridIndexType = typename Constraint::GridIndexType;
78 static constexpr auto noConstraint = std::numeric_limits<std::size_t>::max();
79
80 std::vector<std::size_t> constraintIndex(gridDiscretization.numDofs(), noConstraint);
81
82 auto elemDisc = localView(gridDiscretization);
83 for (const auto& element : elements(gridDiscretization.gridView()))
84 {
85 elemDisc.bindElement(element);
86 for (const auto& boundaryFace : boundaryFaces(elemDisc))
87 {
88 for (const auto& localDof : localDofs(elemDisc, boundaryFace))
89 {
90 const ConstraintInfo info = constraintInfo(elemDisc, boundaryFace, localDof);
91 auto& index = constraintIndex[localDof.dofIndex()];
92 for (int eqIdx = 0; eqIdx < ConstraintInfo::size(); ++eqIdx)
93 {
94 if (!info.isConstraintEquation(eqIdx))
95 continue;
96
97 if (index == noConstraint)
98 {
99 index = constraints.size();
100 constraints.push_back(Constraint{ConstraintInfo{},
101 ConstraintValues(values(elemDisc, localDof)),
102 static_cast<GridIndexType>(localDof.dofIndex())});
103 }
104
105 auto& mergedInfo = constraints[index].info_;
106 if (!mergedInfo.isConstraintEquation(eqIdx))
107 mergedInfo.set(info.eqToPriVarIndex(eqIdx), eqIdx);
108 }
109 }
110 }
111 }
112}
113
114} // end namespace Dumux
115
116#endif
Class to specify information related to constraints.
Definition constraintinfo.hh:26
static constexpr int size()
we might have a constraint for each equation
Definition constraintinfo.hh:32
bool isConstraintEquation(int eqIdx) const
Returns true if an equation is used to specify a constraint condition.
Definition constraintinfo.hh:73
void appendBoundaryDirichletConstraints(std::vector< Constraint > &constraints, const GridDiscretization &gridDiscretization, const ConstraintInfoFunc &constraintInfo, const ValuesFunc &values)
Append the Dirichlet constraints of the local dofs on the boundary faces of a grid discretization.
Definition dirichletconstraints.hh:70
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition localview.hh:26
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
Defines the index types used for grid and local indices.
Definition adapt.hh:17
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50
Definition dirichletconstraints.hh:29
Info ConstraintInfo
Definition dirichletconstraints.hh:30
const ConstraintValues & values() const
Definition dirichletconstraints.hh:36
ConstraintValues values_
Definition dirichletconstraints.hh:40
ConstraintInfo info_
Definition dirichletconstraints.hh:39
Values ConstraintValues
Definition dirichletconstraints.hh:31
const ConstraintInfo & constraintInfo() const
Definition dirichletconstraints.hh:33
Definition dirichletconstraints.hh:45
IndexType GridIndexType
Definition dirichletconstraints.hh:46
GridIndexType dofIndex() const
Definition dirichletconstraints.hh:48
GridIndexType dofIdx_
Definition dirichletconstraints.hh:51