AMDiS  0.1
The Adaptive Multi-Dimensional Simulation Toolbox
LocalToGlobalAdapter.hpp
1 #pragma once
2 
3 #include <cstddef>
4 #include <vector>
5 
6 #include <dune/common/fmatrix.hh>
7 #include <dune/common/fvector.hh>
8 #include <dune/common/typetraits.hh>
9 #include <dune/geometry/type.hh>
10 
11 #include <amdis/common/DerivativeTraits.hpp>
12 #include <amdis/common/FieldMatVec.hpp>
13 
14 namespace AMDiS
15 {
17 
25  template <class LocalBasisTraits, std::size_t dimGlobal>
27  {
28  static const std::size_t dimDomainLocal = LocalBasisTraits::dimDomain;
29  static const std::size_t dimDomainGlobal = dimGlobal;
30  static const std::size_t dimRange = LocalBasisTraits::dimRange;
31 
32  using DomainField = typename LocalBasisTraits::DomainFieldType;
33  using DomainLocal = typename LocalBasisTraits::DomainType;
34  using DomainGlobal = FieldVector<DomainField, dimDomainGlobal>;
35 
36  using RangeField = typename LocalBasisTraits::RangeFieldType;
37  using Range = typename LocalBasisTraits::RangeType;
38 
41  };
42 
44 
63  template <class BasisCache, class Geometry>
65  {
66  using LocalBasis = typename BasisCache::LocalBasis;
67 
68  static_assert(std::is_same_v<typename LocalBasis::Traits::DomainFieldType, typename Geometry::ctype>,
69  "LocalToGlobalBasisAdapter: LocalBasis must use the same ctype as Geometry");
70 
71  static_assert(std::size_t(LocalBasis::Traits::dimDomain) == std::size_t(Geometry::mydimension),
72  "LocalToGlobalBasisAdapter: LocalBasis domain dimension must match local dimension of Geometry");
73 
74  public:
75  using Cache = BasisCache;
77 
79 
88  LocalToGlobalBasisAdapter(Cache const& cache, Geometry const& geometry)
89  : localBasis_(cache.finiteElement().localBasis())
90  , cache_(cache)
91  , geometry_(geometry)
92  , size_(localBasis_.size())
93  {}
94 
96  std::size_t size() const { return size_; }
97 
99 
106  std::size_t order() const
107  {
108  if (geometry_.affine())
109  // affine linear
110  return localBasis_.order();
111  else
112  // assume at most order dim
113  return localBasis_.order() + Traits::dimDomainGlobal - 1;
114  }
115 
117  void evaluateFunction(typename Traits::DomainLocal const& x,
118  std::vector<typename Traits::Range>& out) const
119  {
120  out = cache_.localBasisValuesAt(x);
121  }
122 
125  auto const& valuesAt(typename Traits::DomainLocal const& x) const
126  {
127  return cache_.localBasisValuesAt(x);
128  }
129 
132  void evaluateGradient(typename Traits::DomainLocal const& x,
133  std::vector<typename Traits::GradientRange>& out) const
134  {
135  auto const& localJacobian = cache_.localBasisJacobiansAt(x);
136  auto const& geoJacobian = geometry_.jacobianInverseTransposed(x);
137 
138  out.resize(size_);
139  for (std::size_t i = 0; i < size_; ++i)
140  geoJacobian.mv(Dune::MatVec::as_vector(localJacobian[i]),
141  Dune::MatVec::as_vector(out[i]));
142  }
143 
147  auto const& gradientsAt(typename Traits::DomainLocal const& x) const
148  {
149  thread_local std::vector<typename Traits::GradientRange> grad;
150  evaluateGradient(x, grad);
151  return grad;
152  }
153 
156  void evaluatePartial(typename Traits::DomainLocal const& x,
157  std::size_t comp,
158  std::vector<typename Traits::PartialRange>& out) const
159  {
160  auto const& localJacobian = cache_.localBasisJacobiansAt(x);
161  // NOTE: geoJacobian might be a Dune::DiagonalMatrix with limited interface!
162  auto const& geoJacobian = geometry_.jacobianInverseTransposed(x);
163 
164  out.resize(size_);
165  typename Traits::GradientRange grad;
166  auto&& grad_ = Dune::MatVec::as_vector(grad);
167  for (std::size_t i = 0; i < size_; ++i) {
168  geoJacobian.mv(Dune::MatVec::as_vector(localJacobian[i]), grad_);
169  out[i] = grad_[comp];
170  }
171  }
172 
176  auto const& partialsAt(typename Traits::DomainLocal const& x, std::size_t comp) const
177  {
178  thread_local std::vector<typename Traits::PartialRange> d_comp;
179  evaluatePartial(x, comp, d_comp);
180  return d_comp;
181  }
182 
183  private:
185  LocalBasis const& localBasis_;
186 
188  Cache const& cache_;
189 
191  Geometry const& geometry_;
192 
194  std::size_t size_;
195  };
196 
197 } // namespace AMDiS
auto const & valuesAt(typename Traits::DomainLocal const &x) const
Definition: LocalToGlobalAdapter.hpp:125
void evaluatePartial(typename Traits::DomainLocal const &x, std::size_t comp, std::vector< typename Traits::PartialRange > &out) const
Definition: LocalToGlobalAdapter.hpp:156
Convert a simple (scalar) local basis into a global basis.
Definition: LocalToGlobalAdapter.hpp:64
LocalToGlobalBasisAdapter(Cache const &cache, Geometry const &geometry)
Construct a LocalToGlobalBasisAdapter.
Definition: LocalToGlobalAdapter.hpp:88
void evaluateGradient(typename Traits::DomainLocal const &x, std::vector< typename Traits::GradientRange > &out) const
Definition: LocalToGlobalAdapter.hpp:132
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
std::size_t size() const
Return the number of local basis functions.
Definition: LocalToGlobalAdapter.hpp:96
auto const & partialsAt(typename Traits::DomainLocal const &x, std::size_t comp) const
Definition: LocalToGlobalAdapter.hpp:176
Traits class for local-to-global basis adaptors.
Definition: LocalToGlobalAdapter.hpp:26
Definition: DerivativeTraits.hpp:28
void evaluateFunction(typename Traits::DomainLocal const &x, std::vector< typename Traits::Range > &out) const
Evaluate the local basis functions in the local coordinate x
Definition: LocalToGlobalAdapter.hpp:117
std::size_t order() const
Return maximum polynomial order of the base function.
Definition: LocalToGlobalAdapter.hpp:106
auto const & gradientsAt(typename Traits::DomainLocal const &x) const
Definition: LocalToGlobalAdapter.hpp:147