AMDiS  0.1
The Adaptive Multi-Dimensional Simulation Toolbox
PeriodicBC.hpp
1 #pragma once
2 
3 #include <map>
4 #include <optional>
5 #include <utility>
6 #include <vector>
7 
8 #include <dune/common/concept.hh>
9 #include <dune/functions/functionspacebases/concepts.hh>
10 #include <dune/functions/functionspacebases/subspacebasis.hh>
11 
12 #include <amdis/BoundaryCondition.hpp>
13 #include <amdis/BoundarySubset.hpp>
14 #include <amdis/common/ConceptsBase.hpp>
15 #include <amdis/common/FieldMatVec.hpp>
16 #include <amdis/common/TypeTraits.hpp>
17 #include <amdis/typetree/TreePath.hpp>
18 
19 
20 namespace AMDiS
21 {
23  template <class ct, int dow>
25  {
26  using WorldMatrix = FieldMatrix<ct, dow, dow>;
27  using WorldVector = FieldVector<ct, dow>;
28 
30  WorldMatrix matrix_;
31 
33  WorldVector shift_;
34 
35  WorldVector evaluate(WorldVector const& x) const
36  {
37  WorldVector y = shift_;
38  matrix_.umv(x, y);
39  return y;
40  }
41 
42  WorldVector evaluateInverse(WorldVector const& y) const
43  {
44  WorldVector ys = y - shift_;
45  WorldVector x;
46  matrix_.mtv(ys, x);
47  return x;
48  }
49  };
50 
51 
53 
60  template <class Mat, class Sol, class Rhs, class Basis, class TP>
61  class PeriodicBC
62  : public BoundaryCondition<Mat, Sol, Rhs>
63  {
65  using SubspaceBasis = Dune::Functions::SubspaceBasis<Basis, TP>;
66 
67  public:
68  using Domain = typename SubspaceBasis::GridView::template Codim<0>::Geometry::GlobalCoordinate;
69  using MultiIndex = typename SubspaceBasis::MultiIndex;
71  using Intersection = typename SubspaceBasis::GridView::Intersection;
72 
73  public:
75  PeriodicBC(SubspaceBasis basis, BoundarySubset<Intersection> boundarySubset,
76  FaceTrafo faceTrafo)
77  : basis_(std::move(basis))
78  , boundarySubset_(std::move(boundarySubset))
79  , faceTrafo_(std::move(faceTrafo))
80  {}
81 
83 
88  void init() override;
89 
91 
96  void apply(Mat& matrix, Sol& solution, Rhs& rhs) override;
97 
99  auto const& associations() const
100  {
101  return associations_;
102  }
103 
105  auto const& periodicNodes() const
106  {
107  return periodicNodes_;
108  }
109 
110  protected:
111  void initAssociations();
112  void initAssociations2();
113 
114  // Get the coordinates of the DOFs
115  template <class Node>
116  auto coords(Node const& node, std::vector<std::size_t> const& localIndices) const;
117 
118  private:
119  SubspaceBasis basis_;
120  BoundarySubset<Intersection> boundarySubset_;
121  FaceTrafo faceTrafo_;
122 
123  std::vector<bool> periodicNodes_;
124  std::map<std::size_t, std::size_t> associations_;
125  std::optional<bool> hasConnectedIntersections_;
126  };
127 
128  namespace Impl {
129  template <class Basis>
131  typename Basis::GridView::template Codim<0>::Geometry::GlobalCoordinate::field_type,
132  Basis::GridView::template Codim<0>::Geometry::GlobalCoordinate::dimension>;
133  }
134 
135 
137  template <class Mat, class Sol, class Rhs, class B, class TP>
138  auto makePeriodicBC(Dune::Functions::SubspaceBasis<B, TP> basis,
140  Impl::FaceTrafo<B> trafo)
141  {
142  using BcType = PeriodicBC<Mat, Sol, Rhs, B, TP>;
143  return BcType(std::move(basis), std::move(boundarySubset), std::move(trafo));
144  }
145 
147  template <class Mat, class Sol, class Rhs, class B, class TP,
148  REQUIRES(Concepts::GlobalBasis<B>)>
149  auto makePeriodicBC(B const& basis, TP const& tp,
151  Impl::FaceTrafo<B> trafo)
152  {
153  return makePeriodicBC<Mat, Sol, Rhs>(Dune::Functions::subspaceBasis(basis, tp),
154  std::move(boundarySubset), std::move(trafo));
155  }
156 
158  template <class Mat, class Sol, class Rhs, class B,
159  REQUIRES(Concepts::GlobalBasis<B>)>
160  auto makePeriodicBC(B const& basis,
162  Impl::FaceTrafo<B> trafo)
163  {
164  return makePeriodicBC<Mat, Sol, Rhs>(basis, makeTreePath(), std::move(boundarySubset),
165  std::move(trafo));
166  }
167 
168 } // end namespace AMDiS
169 
170 #include "PeriodicBC.inc.hpp"
constexpr bool MultiIndex
A multi-index type.
Definition: Concepts.hpp:150
auto const & periodicNodes() const
Return the boolean boundary indicator.
Definition: PeriodicBC.hpp:105
Definition: FieldMatVec.hpp:12
WorldMatrix matrix_
orthogonal (rotation) matrix
Definition: PeriodicBC.hpp:30
WorldVector shift_
Shift vector.
Definition: PeriodicBC.hpp:33
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
Implements a periodic boundary condition.
Definition: PeriodicBC.hpp:61
PeriodicBC(SubspaceBasis basis, BoundarySubset< Intersection > boundarySubset, FaceTrafo faceTrafo)
Create the BoundaryCondition and store the face transformation in a local variable.
Definition: PeriodicBC.hpp:75
auto makePeriodicBC(Dune::Functions::SubspaceBasis< B, TP > basis, BoundarySubset< typename B::GridView::Intersection > boundarySubset, Impl::FaceTrafo< B > trafo)
Make a PeriodicBC from a subspacebasis.
Definition: PeriodicBC.hpp:138
void init(int &argc, char **&argv, std::string const &initFileName="")
Initialized the Environment for MPI.
Definition: AMDiS.hpp:29
Affine transformation x := A*x + b.
Definition: PeriodicBC.hpp:24
Interface class for boundary conditions.
Definition: BoundaryCondition.hpp:20
auto const & associations() const
Return the map of DOF associations.
Definition: PeriodicBC.hpp:99