dune-functions  2.5.1
discretescalarglobalbasisfunction.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETESCALARGLOBALBASISFUNCTIONS_HH
4 #define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETESCALARGLOBALBASISFUNCTIONS_HH
5 
6 #include <memory>
7 
8 #include <dune/common/shared_ptr.hh>
9 #include <dune/common/deprecated.hh>
10 
13 
14 namespace Dune {
15 namespace Functions {
16 
24 template<typename Basis, typename V>
25 class DUNE_DEPRECATED_MSG("Use DiscreteGlobalBasisFunction instead!") DiscreteScalarGlobalBasisFunction
26 {
27 public:
28  using GridView = typename Basis::GridView;
30 
32  using Range = typename V::value_type;
33  using LocalBasisRange = typename Basis::LocalView::Tree::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
34 
36  using Element = typename EntitySet::Element;
37 
39 
41  {
42  using LocalBasisView = typename Basis::LocalView;
43  using LocalIndexSet = typename Basis::LocalIndexSet;
44  using size_type = typename LocalBasisView::Tree::size_type;
45 
46  public:
47 
52 
54  : globalFunction_(&globalFunction)
55  , localBasisView_(globalFunction.basis().localView())
56  , localIndexSet_(globalFunction.basis().localIndexSet())
57  {
58  localDoFs_.reserve(localBasisView_.maxSize());
59  shapeFunctionValues_.reserve(localBasisView_.maxSize());
60  }
61 
68  void bind(const Element& element)
69  {
70  localBasisView_.bind(element);
71  localIndexSet_.bind(localBasisView_);
72 
73  // Read dofs associated to bound element
74  localDoFs_.resize(localIndexSet_.size());
75  for (size_type i = 0; i < localIndexSet_.size(); ++i)
76  localDoFs_[i] = globalFunction_->dofs()[localIndexSet_.index(i)[0]];
77 
78  // Prepare result vector for shape function
79  shapeFunctionValues_.resize(localIndexSet_.size());
80  }
81 
82  void unbind()
83  {
84  localIndexSet_.unbind();
85  localBasisView_.unbind();
86  }
87 
97  Range operator()(const Domain& x) const
98  {
99  auto y = Range(0);
100  auto& basis = localBasisView_.tree().finiteElement().localBasis();
101  basis.evaluateFunction(x, shapeFunctionValues_);
102  for (size_type i = 0; i < basis.size(); ++i)
103  {
104  // Here we essentially want to do
105  //
106  // y += localDoFs_[i] * shapeFunctionValues_[i];
107  //
108  // Currently we support vector valued coefficients and scalar
109  // local basis functions only. In order to generalize this we
110  // have to use a more general product implementation here.
111  // Maybe we want do adopt the framework of dune-fufem.
112  auto yy = localDoFs_[i];
113  yy *= shapeFunctionValues_[i];
114  y += yy;
115  }
116  return y;
117  }
118 
119  const Element& localContext() const
120  {
121  return localBasisView_.element();
122  }
123 
125  {
126  DUNE_THROW(NotImplemented,"not implemented");
127  }
128 
129  private:
130 
131  const DiscreteScalarGlobalBasisFunction* globalFunction_;
132  LocalBasisView localBasisView_;
133  LocalIndexSet localIndexSet_;
134  std::vector<typename V::value_type> localDoFs_;
135  mutable std::vector<LocalBasisRange> shapeFunctionValues_;
136  };
137 
138  DiscreteScalarGlobalBasisFunction(const Basis & basis, const V & dofs)
139  : entitySet_(basis.gridView())
140  , basis_(stackobject_to_shared_ptr(basis))
141  , dofs_(stackobject_to_shared_ptr(dofs))
142  {}
143 
144  DiscreteScalarGlobalBasisFunction(std::shared_ptr<Basis> basis, std::shared_ptr<V> dofs)
145  : entitySet_(basis.gridView())
146  , basis_(basis)
147  , dofs_(dofs)
148  {}
149 
150  const Basis& basis() const
151  {
152  return *basis_;
153  }
154 
155  const V& dofs() const
156  {
157  return *dofs_;
158  }
159 
160  // TODO: Implement this using hierarchic search
161  Range operator() (const Domain& x) const
162  {
163  DUNE_THROW(NotImplemented,"not implemented");
164  }
165 
167  {
168  DUNE_THROW(NotImplemented,"not implemented");
169  }
170 
172  {
173  return LocalFunction(t);
174  }
175 
179  const EntitySet& entitySet() const
180  {
181  return entitySet_;
182  }
183 
184 private:
185 
186  EntitySet entitySet_;
187  std::shared_ptr<const Basis> basis_;
188  std::shared_ptr<const V> dofs_;
189 };
190 
191 } // namespace Functions
192 } // namespace Dune
193 
194 #endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETESCALARGLOBALBASISFUNCTIONS_HH
const Element & localContext() const
Definition: discretescalarglobalbasisfunction.hh:119
typename Basis::GridView GridView
Definition: discretescalarglobalbasisfunction.hh:28
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discretescalarglobalbasisfunction.hh:68
const Basis & basis() const
Definition: discretescalarglobalbasisfunction.hh:150
const EntitySet & entitySet() const
Get associated EntitySet.
Definition: discretescalarglobalbasisfunction.hh:179
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &t)
Definition: discretescalarglobalbasisfunction.hh:124
typename Basis::LocalView::Tree::FiniteElement::Traits::LocalBasisType::Traits::RangeType LocalBasisRange
Definition: discretescalarglobalbasisfunction.hh:33
typename V::value_type Range
Definition: discretescalarglobalbasisfunction.hh:32
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
Definition: discretescalarglobalbasisfunction.hh:40
Definition: polynomial.hh:7
void unbind()
Definition: discretescalarglobalbasisfunction.hh:82
Traits class providing type information for DifferentiableFunction.
Definition: gridfunction.hh:41
A grid function induced by a global basis and a coefficient vector.
Definition: discretescalarglobalbasisfunction.hh:25
DiscreteScalarGlobalBasisFunction(std::shared_ptr< Basis > basis, std::shared_ptr< V > dofs)
Definition: discretescalarglobalbasisfunction.hh:144
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
typename EntitySet::LocalCoordinate LocalDomain
Definition: discretescalarglobalbasisfunction.hh:35
typename EntitySet::Element Element
Definition: discretescalarglobalbasisfunction.hh:36
typename EntitySet::GlobalCoordinate Domain
Definition: discretescalarglobalbasisfunction.hh:31
friend LocalFunction localFunction(const DiscreteScalarGlobalBasisFunction &t)
Definition: discretescalarglobalbasisfunction.hh:171
friend Traits::DerivativeInterface derivative(const DiscreteScalarGlobalBasisFunction &t)
Definition: discretescalarglobalbasisfunction.hh:166
const V & dofs() const
Definition: discretescalarglobalbasisfunction.hh:155
LocalFunction(const DiscreteScalarGlobalBasisFunction &globalFunction)
Definition: discretescalarglobalbasisfunction.hh:53
GlobalFunction::Element Element
Definition: discretescalarglobalbasisfunction.hh:51
Range operator()(const Domain &x) const
Evaluate LocalFunction at bound element.
Definition: discretescalarglobalbasisfunction.hh:97
GlobalFunction::Range Range
Definition: discretescalarglobalbasisfunction.hh:50
DiscreteScalarGlobalBasisFunction(const Basis &basis, const V &dofs)
Definition: discretescalarglobalbasisfunction.hh:138
A grid function induced by a global basis and a coefficient vector.
Definition: discreteglobalbasisfunction.hh:69
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
Definition: gridfunction.hh:31
LocalDomain Domain
Definition: discretescalarglobalbasisfunction.hh:49