AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
DirichletBC.hpp
1 #pragma once
2 
3 #include <functional>
4 #include <utility>
5 #include <vector>
6 
7 #include <dune/common/concept.hh>
8 #include <dune/functions/functionspacebases/concepts.hh>
9 #include <dune/functions/functionspacebases/subspacebasis.hh>
10 
11 #include <amdis/Boundary.hpp>
12 #include <amdis/BoundaryCondition.hpp>
13 #include <amdis/BoundarySubset.hpp>
14 #include <amdis/common/Concepts.hpp>
15 #include <amdis/common/TypeTraits.hpp>
16 #include <amdis/typetree/RangeType.hpp>
17 #include <amdis/typetree/TreePath.hpp>
18 
19 namespace AMDiS
20 {
22 
38  template <class SubBasis, class ValueGridFct>
40  {
41  // We assume CB's GridView to be the same as RB's
42  using GridView = typename SubBasis::GridView;
43  using Intersection = typename GridView::Intersection;
44 
45  using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
46  using Range = TYPEOF(std::declval<ValueGridFct>()(std::declval<Domain>()));
47 
48  public:
50  template <class Values,
51  REQUIRES(Concepts::Functor<Values, Range(Domain)>)>
52  DirichletBC(SubBasis basis, BoundarySubset<Intersection> boundarySubset, Values&& values)
53  : basis_(std::move(basis))
54  , boundarySubset_(std::move(boundarySubset))
55  , values_(FWD(values))
56  {}
57 
59  template <class Basis, class TP, class Values,
60  REQUIRES(Concepts::GlobalBasis<Basis>)>
61  DirichletBC(Basis const& basis, TP const& treePath,
62  BoundarySubset<Intersection> boundarySubset, Values&& values)
63  : DirichletBC(Dune::Functions::subspaceBasis(basis, treePath),
64  std::move(boundarySubset), FWD(values))
65  {}
66 
68  template <class Basis, class Values,
69  REQUIRES(Concepts::GlobalBasis<Basis>)>
70  DirichletBC(Basis const& basis, BoundarySubset<Intersection> boundarySubset, Values&& values)
71  : DirichletBC(Dune::Functions::subspaceBasis(basis, makeTreePath()),
72  std::move(boundarySubset), FWD(values))
73  {}
74 
75 
78 
81  void init();
82 
84 
88  template <class Mat, class Sol, class Rhs>
89  void apply(Mat& matrix, Sol& solution, Rhs& rhs);
90 
91  private:
92  SubBasis basis_;
93  BoundarySubset<Intersection> boundarySubset_;
94  ValueGridFct values_;
95 
96  std::vector<bool> dirichletNodes_;
97  };
98 
99  // deduction guides
100 
101  // Make a DirichletBC from subspacebases
102  template <class B, class TP, class Values>
103  DirichletBC(Dune::Functions::SubspaceBasis<B, TP>,
105  -> DirichletBC<Dune::Functions::SubspaceBasis<B,TP>, Underlying_t<Values>>;
106 
107  // Make a DirichletBC from a basis with treepath arguments
108  template <class B, class TP, class Values,
109  REQUIRES(Concepts::GlobalBasis<B>)>
110  DirichletBC(B const&, TP const&, BoundarySubset<typename B::GridView::Intersection>, Values const&)
111  -> DirichletBC<Dune::Functions::SubspaceBasis<B, TP>, Underlying_t<Values>>;
112 
113  // Make a DirichletBC from a global basis
114  template <class B, class Values,
115  REQUIRES(Concepts::GlobalBasis<B>)>
118 
119 } // end namespace AMDiS
120 
121 #include "DirichletBC.inc.hpp"
DirichletBC(SubBasis basis, BoundarySubset< Intersection > boundarySubset, Values &&values)
Constructor accepting subspacebases.
Definition: DirichletBC.hpp:52
constexpr bool Functor
A Functor is a function F with signature Signature.
Definition: Concepts.hpp:134
Definition: AdaptiveGrid.hpp:373
Definition: FieldMatVec.hpp:12
Implements a boundary condition of Dirichlet-type.
Definition: DirichletBC.hpp:39
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
DirichletBC(Basis const &basis, TP const &treePath, BoundarySubset< Intersection > boundarySubset, Values &&values)
Make a DirichletBC from a basis with treepath arguments.
Definition: DirichletBC.hpp:61
void init()
Definition: DirichletBC.inc.hpp:14
void apply(Mat &matrix, Sol &solution, Rhs &rhs)
Apply dirichlet BC to matrix and vector.
Definition: DirichletBC.inc.hpp:38
DirichletBC(Basis const &basis, BoundarySubset< Intersection > boundarySubset, Values &&values)
Make a DirichletBC from a global basis.
Definition: DirichletBC.hpp:70