dune-vtk  0.2
lagrangegridfunction.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <optional>
4 #include <vector>
5 
6 #include <dune/common/dynvector.hh>
7 #include <dune/localfunctions/lagrange.hh>
12 
13 namespace Dune
14 {
15  namespace Vtk
16  {
17  template <class GridType>
18  class LagrangeGridCreator;
19 
22  template <class GridType, class FieldType, class Context>
24  {
25  using Grid = GridType;
26  using Field = FieldType;
27 
28  using Factory = GridFactory<Grid>;
30 
31  public:
32  struct EntitySet
33  {
34  using Grid = GridType;
35  using Element = typename GridType::template Codim<0>::Entity;
36  using LocalCoordinate = typename Element::Geometry::LocalCoordinate;
37  using GlobalCoordinate = typename Element::Geometry::GlobalCoordinate;
38  };
39 
41  using Range = DynamicVector<Field>;
43 
44  private:
45  template <class LC>
46  class PointDataLocalFunction
47  {
48  using LFE = LagrangeLocalFiniteElement<LagrangePointSet, LC::dimension, FieldType, FieldType>;
49  using LB = typename LFE::Traits::LocalBasisType;
50 
51  public:
52  using LocalContext = LC;
53  using Domain = typename LC::Geometry::LocalCoordinate;
54  using Range = DynamicVector<Field>;
55  using Signature = Range(Domain);
56 
57  public:
59  PointDataLocalFunction (GridCreator const& creator, std::vector<Field> const& values, unsigned int comp,
60  std::vector<std::uint8_t> const& types,
61  std::vector<std::int64_t> const& offsets,
62  std::vector<std::int64_t> const& connectivity)
63  : creator_(creator)
64  , values_(values)
65  , comp_(comp)
66  , types_(types)
67  , offsets_(offsets)
68  , connectivity_(connectivity)
69  {}
70 
72 
78  void bind (LocalContext const& element)
79  {
80  unsigned int insertionIndex = creator_.factory().insertionIndex(element);
81 
82  std::int64_t shift = (insertionIndex == 0 ? 0 : offsets_[insertionIndex-1]);
83  std::int64_t numNodes = offsets_[insertionIndex] - shift;
84  [[maybe_unused]] std::int64_t maxNumNodes = numLagrangePoints(element.type().id(), element.type().dim(), 20);
85  VTK_ASSERT(numNodes > 0 && numNodes < maxNumNodes);
86 
87  int order = creator_.order(element.type(), numNodes);
88  VTK_ASSERT(order > 0 && order < 20);
89 
90  // construct a local finite-element with the corresponding order and Lagrange points
91  // as stored in the file
92  lfe_.emplace(LFE{element.type(), (unsigned int)(order)});
93  lgeo_.emplace(creator_.localGeometry(element));
94 
95  // collect values on lagrange nodes
96  localValues_.resize(numNodes);
97  for (std::int64_t i = shift, i0 = 0; i < offsets_[insertionIndex]; ++i, ++i0) {
98  std::int64_t idx = connectivity_[i];
99  DynamicVector<Field>& v = localValues_[i0];
100  v.resize(comp_);
101  for (unsigned int j = 0; j < comp_; ++j)
102  v[j] = values_[comp_*idx + j];
103  }
104  }
105 
107  void unbind ()
108  {
109  lfe_.reset();
110  lgeo_.reset();
111  }
112 
115  // NOTE: do we need to transform the local coordinates?
116  Range operator() (Domain const& local) const
117  {
118  assert(!!lfe_);
119  auto const& lb = lfe_->localBasis();
120  lb.evaluateFunction(lgeo_->global(local), shapeValues_);
121  assert(shapeValues_.size() == localValues_.size());
122 
123  Range y(comp_, Field(0));
124  for (std::size_t i = 0; i < shapeValues_.size(); ++i)
125  y.axpy(shapeValues_[i], localValues_[i]);
126 
127  return y;
128  }
129 
130  private:
131  GridCreator const& creator_;
132  std::vector<Field> const& values_;
133  unsigned int comp_;
134  std::vector<std::uint8_t> const& types_;
135  std::vector<std::int64_t> const& offsets_;
136  std::vector<std::int64_t> const& connectivity_;
137 
138  // Local Finite-Element
139  std::optional<LFE> lfe_ = std::nullopt;
140  std::optional<typename GridCreator::LocalGeometry> lgeo_ = std::nullopt;
141 
142  // cache of local values
143  std::vector<DynamicVector<Field>> localValues_;
144  mutable std::vector<typename LB::Traits::RangeType> shapeValues_;
145  };
146 
148  template <class LC>
149  class CellDataLocalFunction
150  {
151  public:
152  using LocalContext = LC;
153  using Domain = typename LC::Geometry::LocalCoordinate;
154  using Range = DynamicVector<Field>;
155  using Signature = Range(Domain);
156 
157  public:
159  CellDataLocalFunction (GridCreator const& creator, std::vector<Field> const& values, unsigned int comp,
160  std::vector<std::uint8_t> const& /*types*/,
161  std::vector<std::int64_t> const& /*offsets*/,
162  std::vector<std::int64_t> const& /*connectivity*/)
163  : factory_(creator.factory())
164  , values_(values)
165  , comp_(comp)
166  {}
167 
170  void bind (LocalContext const& element)
171  {
172  unsigned int idx = factory_.insertionIndex(element);
173 
174  // collect values on cells
175  DynamicVector<Field>& v = localValue_;
176  v.resize(comp_);
177 
178  for (unsigned int j = 0; j < comp_; ++j)
179  v[j] = values_[comp_*idx + j];
180  }
181 
183  void unbind ()
184  {}
185 
188  Range operator() (Domain const& local) const
189  {
190  return localValue_;
191  }
192 
193  private:
194  Factory const& factory_;
195  std::vector<Field> const& values_;
196  unsigned int comp_;
197 
198  // cache of local values
199  DynamicVector<Field> localValue_;
200  };
201 
203  template <class LC>
204  using LocalFunction = std::conditional_t< std::is_same_v<Context,PointContext>,
205  PointDataLocalFunction<LC>,
206  CellDataLocalFunction<LC>>;
207 
208  public:
211  LagrangeGridFunction (GridCreator const& creator, std::vector<Field> const& values, unsigned int comp,
212  std::vector<std::uint8_t> const& types,
213  std::vector<std::int64_t> const& offsets,
214  std::vector<std::int64_t> const& connectivity)
215  : creator_(creator)
216  , values_(values)
217  , comp_(comp)
218  , types_(types)
219  , offsets_(offsets)
220  , connectivity_(connectivity)
221  {}
222 
224  Range operator() (Domain const& global) const
225  {
226  DUNE_THROW(Dune::NotImplemented, "Evaluation in global coordinates not implemented.");
227  return Range(comp_, 0);
228  }
229 
231  EntitySet const& entitySet () const
232  {
233  return entitySet_;
234  }
235 
238  friend LocalFunction<typename EntitySet::Element> localFunction (LagrangeGridFunction const& gf)
239  {
240  return {gf.creator_, gf.values_, gf.comp_, gf.types_, gf.offsets_, gf.connectivity_};
241  }
242 
243  private:
244  GridCreator const& creator_;
245  std::vector<Field> const& values_;
246  unsigned int comp_;
247  std::vector<std::uint8_t> const& types_;
248  std::vector<std::int64_t> const& offsets_;
249  std::vector<std::int64_t> const& connectivity_;
250 
251  EntitySet entitySet_;
252  };
253 
254  } // end namespace Vtk
255 } // end namespace Dune
Macro for wrapping error checks and throwing exceptions.
#define VTK_ASSERT(cond)
check if condition cond holds; otherwise, throw a VtkError.
Definition: errors.hh:29
Definition: datacollectorinterface.hh:9
LagrangeGridCreator(GridFactory< Grid > &) -> LagrangeGridCreator< Grid >
Definition: lagrangegridcreator.hh:40
Grid-function representing values from a VTK file with local Lagrange interpolation of the values sto...
Definition: lagrangegridfunction.hh:24
DynamicVector< Field > Range
Definition: lagrangegridfunction.hh:41
friend LocalFunction< typename EntitySet::Element > localFunction(LagrangeGridFunction const &gf)
Definition: lagrangegridfunction.hh:238
LagrangeGridFunction(GridCreator const &creator, std::vector< Field > const &values, unsigned int comp, std::vector< std::uint8_t > const &types, std::vector< std::int64_t > const &offsets, std::vector< std::int64_t > const &connectivity)
Definition: lagrangegridfunction.hh:211
Range(Domain) Signature
Definition: lagrangegridfunction.hh:42
typename EntitySet::GlobalCoordinate Domain
Definition: lagrangegridfunction.hh:40
Range operator()(Domain const &global) const
Global evaluation. Not supported!
Definition: lagrangegridfunction.hh:224
EntitySet const & entitySet() const
Return a type that defines the element that can be iterated.
Definition: lagrangegridfunction.hh:231
Definition: lagrangegridfunction.hh:33
typename Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: lagrangegridfunction.hh:37
typename Element::Geometry::LocalCoordinate LocalCoordinate
Definition: lagrangegridfunction.hh:36
GridType Grid
Definition: lagrangegridfunction.hh:34
typename GridType::template Codim< 0 >::Entity Element
Definition: lagrangegridfunction.hh:35