AMDiS  0.1
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 
42  template <class Mat, class Sol, class Rhs, class RowSubBasis, class ColSubBasis,
43  class ValueGridFct>
45  : public BoundaryCondition<Mat, Sol, Rhs>
46  {
48 
49  // We assume CB's GridView to be the same as RB's
50  using GridView = typename RowSubBasis::GridView;
51  using Intersection = typename GridView::Intersection;
52 
53  using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
54  using Range = TYPEOF(std::declval<ValueGridFct>()(std::declval<Domain>()));
55 
56  public:
58  template <class Values,
59  REQUIRES(Concepts::Functor<Values, Range(Domain)>)>
60  DirichletBC(RowSubBasis rowBasis, ColSubBasis colBasis,
61  BoundarySubset<Intersection> boundarySubset, Values&& values)
62  : rowBasis_(std::move(rowBasis))
63  , colBasis_(std::move(colBasis))
64  , boundarySubset_(std::move(boundarySubset))
65  , values_(FWD(values))
66  {}
67 
70 
73  void init() override;
74 
76 
80  void apply(Mat& matrix, Sol& solution, Rhs& rhs) override;
81 
82  private:
83  RowSubBasis rowBasis_;
84  ColSubBasis colBasis_;
85  BoundarySubset<Intersection> boundarySubset_;
86  ValueGridFct values_;
87 
88  std::vector<bool> dirichletNodes_;
89  };
90 
91 
93  template <class Mat, class Sol, class Rhs, class RB, class RTP, class CB, class CTP, class Values>
94  auto makeDirichletBC(Dune::Functions::SubspaceBasis<RB, RTP> rowBasis,
95  Dune::Functions::SubspaceBasis<CB, CTP> colBasis,
97  Values&& values)
98  {
99  using RowSubBasis = Dune::Functions::SubspaceBasis<RB, RTP>;
100  using ColSubBasis = Dune::Functions::SubspaceBasis<CB, CTP>;
102  return BcType(std::move(rowBasis), std::move(colBasis), std::move(boundarySubset), FWD(values));
103  }
104 
106  template <class Mat, class Sol, class Rhs, class RB, class RTP, class CB, class CTP, class Values,
107  REQUIRES(Concepts::GlobalBasis<RB>),
108  REQUIRES(Concepts::GlobalBasis<CB>)>
109  auto makeDirichletBC(RB const& rowBasis, RTP const& rowTreePath,
110  CB const& colBasis, CTP const& colTreePath,
112  Values&& values)
113  {
114  return makeDirichletBC<Mat,Sol,Rhs>(
115  Dune::Functions::subspaceBasis(rowBasis, rowTreePath),
116  Dune::Functions::subspaceBasis(colBasis, colTreePath),
117  std::move(boundarySubset), FWD(values));
118  }
119 
121  template <class Mat, class Sol, class Rhs, class RB, class CB, class Values,
122  REQUIRES(Concepts::GlobalBasis<RB>),
123  REQUIRES(Concepts::GlobalBasis<CB>)>
124  auto makeDirichletBC(RB const& rowBasis, CB const& colBasis,
126  Values&& values)
127  {
128  return makeDirichletBC<Mat, Sol, Rhs>(
129  rowBasis, makeTreePath(), colBasis, makeTreePath(),
130  std::move(boundarySubset), FWD(values));
131  }
132 
133 } // end namespace AMDiS
134 
135 #include "DirichletBC.inc.hpp"
void init() override
Definition: DirichletBC.inc.hpp:38
constexpr bool Functor
A Functor is a function F with signature Signature.
Definition: Concepts.hpp:134
Definition: FieldMatVec.hpp:12
Implements a boundary condition of Dirichlet-type.
Definition: DirichletBC.hpp:44
auto makeDirichletBC(Dune::Functions::SubspaceBasis< RB, RTP > rowBasis, Dune::Functions::SubspaceBasis< CB, CTP > colBasis, BoundarySubset< typename RB::GridView::Intersection > boundarySubset, Values &&values)
Make a DirichletBC from subspacebases.
Definition: DirichletBC.hpp:94
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
void apply(Mat &matrix, Sol &solution, Rhs &rhs) override
Apply dirichlet BC to matrix and vector.
Definition: DirichletBC.inc.hpp:52
DirichletBC(RowSubBasis rowBasis, ColSubBasis colBasis, BoundarySubset< Intersection > boundarySubset, Values &&values)
Constructor accepting subspacebases.
Definition: DirichletBC.hpp:60
Interface class for boundary conditions.
Definition: BoundaryCondition.hpp:20