AMDiS  0.1
The Adaptive Multi-Dimensional Simulation Toolbox
DataTransfer.hpp
1 #pragma once
2 
3 #include <map>
4 #include <memory>
5 
6 #include <dune/grid/common/mcmgmapper.hh>
7 
8 #include <amdis/Output.hpp>
9 #include <amdis/typetree/TreeContainer.hpp>
10 
11 namespace AMDiS
12 {
18  enum class DataTransferOperation {
19  NO_OPERATION = 0,
20  INTERPOLATE = 1
21  };
22 
23 
25  template <class Container>
27  {
28  public:
30  virtual ~DataTransferInterface() = default;
31 
33  virtual std::unique_ptr<DataTransferInterface> clone() const = 0;
34 
36  virtual void preAdapt(Container const& container, bool mightCoarsen) = 0;
37 
39  virtual void adapt(Container& container) = 0;
40 
42  virtual void postAdapt(Container& container) = 0;
43  };
44 
45 
50  template <class Container>
52  : public DataTransferInterface<Container>
53  {
55 
56  public:
57  std::unique_ptr<Interface> clone() const override
58  {
59  return std::make_unique<NoDataTransfer>();
60  }
61 
62  void preAdapt(Container const&, bool) override {}
63 
64  void adapt(Container& container) override
65  {
66  container.resize();
67  }
68 
69  void postAdapt(Container&) override {}
70  };
71 
72 
73  template <class Node, class Container, class Basis>
75 
76 
81  template <class Container, class Basis>
83  : public DataTransferInterface<Container>
84  {
85  using LocalView = typename Basis::LocalView;
86  using Tree = typename LocalView::Tree;
87  using GridView = typename Basis::GridView;
88  using Grid = typename GridView::Grid;
89 
90  using Element = typename GridView::template Codim<0>::Entity;
91  using Geometry = typename Element::Geometry;
92  using LocalCoordinate = typename Geometry::LocalCoordinate;
93  using IdType = typename Grid::LocalIdSet::IdType;
94 
95  template <class Node>
96  using NodeElementData = typename NodeDataTransfer<Node, Container, Basis>::NodeElementData;
97  using ElementData = TreeContainer<NodeElementData,Tree,true>;
98 
100 
101  public:
102  DataTransfer(std::shared_ptr<Basis const> basis);
103 
104  std::unique_ptr<Interface> clone() const override
105  {
106  return std::make_unique<DataTransfer<Container, Basis>>(basis_);
107  }
108 
112  void preAdapt(Container const& coeff, bool mightCoarsen) override;
113 
117  // [[expects: basis is updated in gridView]]
118  // [[expects: comm is updated in basis]]
119  void adapt(Container& coeff) override;
120 
124  void postAdapt(Container& coeff) override;
125 
126  private:
128  std::shared_ptr<Basis const> basis_;
129 
131  using PersistentContainer = std::map<IdType, ElementData>;
132  PersistentContainer persistentContainer_;
133 
135  using Mapper = Dune::LeafMultipleCodimMultipleGeomTypeMapper<Grid>;
136  Mapper mapper_;
137 
139  template <class Node>
141  using NodeDataTransferContainer = TreeContainer<NDT,Tree,true>;
142  NodeDataTransferContainer nodeDataTransfer_;
143  };
144 
145 
147  template <class Container>
149  {
151 
152  public:
153  template <class Basis>
154  static std::unique_ptr<Interface> create(DataTransferOperation op, std::shared_ptr<Basis> basis)
155  {
156  switch (op)
157  {
158  case DataTransferOperation::NO_OPERATION:
159  return std::make_unique<NoDataTransfer<Container>>();
160  case DataTransferOperation::INTERPOLATE:
161  return std::make_unique<DataTransfer<Container, Basis>>(std::move(basis));
162  default:
163  error_exit("Invalid data transfer\n");
164  return nullptr; // avoid warnings
165  }
166  }
167  };
168 
169 
176  template <class Container>
178  {
182 
183  public:
184  template <class Basis>
185  DataTransferWrapper(DataTransferOperation op, std::shared_ptr<Basis> basis)
186  : impl_(std::move(Factory::create(op, basis)))
187  {}
188 
189  DataTransferWrapper(Self const& that)
190  : impl_(std::move(that.impl_->clone()))
191  {}
192 
193  DataTransferWrapper(Self&& that) = default;
194 
195  Self& operator=(Self const& that)
196  {
197  impl_ = std::move(that.impl_->clone());
198  return *this;
199  }
200 
201  Self& operator=(Self&& that) = default;
202 
203  void preAdapt(Container const& c, bool b) { impl_->preAdapt(c, b); }
204 
205  void adapt(Container& c) { impl_->adapt(c); }
206 
207  void postAdapt(Container& c) { impl_->postAdapt(c); }
208 
209  private:
210  std::unique_ptr<Interface> impl_;
211  };
212 
214 
215 } // end namespace AMDiS
216 
217 #include "DataTransfer.inc.hpp"
std::unique_ptr< Interface > clone() const override
Clone method.
Definition: DataTransfer.hpp:57
void adapt(Container &container) override
Interpolate data to new grid after grid adaption.
Definition: DataTransfer.hpp:64
void error_exit(std::string const &str, Args &&... args)
print a message and exit
Definition: Output.hpp:142
void preAdapt(Container const &, bool) override
Collect data that is needed before grid adaption.
Definition: DataTransfer.hpp:62
Definition: DataTransfer.hpp:74
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
constexpr bool LocalView
A Dune::Functions::LocalView type.
Definition: Concepts.hpp:182
Node_t< typename GlobalBasis::PreBasis, PrefixPath > Tree
Tree of local finite elements / local shape function sets.
Definition: LocalView.hpp:40
Interface for Containers allowing data transfer between grid changes.
Definition: DataTransfer.hpp:26
std::unique_ptr< Interface > clone() const override
Clone method.
Definition: DataTransfer.hpp:104
Factory to create DataTransfer objects based on the DataTransferOperation.
Definition: DataTransfer.hpp:148
Definition: DataTransfer.hpp:177
Definition: DataTransfer.hpp:82
Implementation of DataTransferInterface that does not interpolate, but just resizes the containers to...
Definition: DataTransfer.hpp:51
TYPEOF(makeTreeContainer< NodeData, leafOnly >(std::declval< const Tree & >())) TreeContainer
Definition: TreeContainer.hpp:354
void postAdapt(Container &) override
Perform cleanup after grid adaption.
Definition: DataTransfer.hpp:69