dune-pdelab  2.5-dev
oldinterfaceadapter.hh
Go to the documentation of this file.
1 //-*- tab-width: 4; c-basic-offset: 2; indent-tabs-mode: nil -*-
2 #ifndef DUNE_PDELAB_FUNCTION_OLDINTERFACEADAPTER_HH
3 #define DUNE_PDELAB_FUNCTION_OLDINTERFACEADAPTER_HH
4 
7 #include <dune/functions/common/signature.hh>
8 #include <dune/functions/common/defaultderivativetraits.hh>
9 #include <dune/functions/gridfunctions/gridviewfunction.hh>
10 
11 namespace Dune {
12 namespace PDELab {
13 namespace Imp {
14 
15  template<class F, template<class> class DerivativeTraits = Functions::DefaultDerivativeTraits>
17  : public TypeTree::LeafNode
18  {
19  public:
20  using Range = typename F::Traits::RangeType;
21  using LocalDomain = typename F::Traits::DomainType;
22  using GridView = typename F::Traits::GridViewType;
23 
25  using RawSignature =
26  typename Functions::SignatureTraits<Signature>::RawSignature;
27  using DerivativeSignature =
28  typename DerivativeTraits<RawSignature>::Range(LocalDomain);
29 
30  using EntitySet = Functions::GridViewEntitySet<GridView, 0>;
31  using Element = typename EntitySet::Element;
32  using Geometry = typename std::decay<typename Element::Geometry>::type;
33 
35 
36  // // Use the inderiction via derivativeIfImplemented to also support
37  // // function types F that do not implement derivative. In this case
38  // // the interface type DifferentiableFunction is used a dummy for
39  // // the derivative type
40  // using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
41  // using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
42  // using Derivative = AnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
43 
44  void bind(const Element& element)
45  {
46  element_ = element;
47  }
48 
49  void unbind()
50  {}
51 
52  Range operator()(const LocalDomain& x) const
53  {
54  Range v;
55  f_->evaluate(element_, x, v);
56  return v;
57  }
58 
59  const Element& localContext() const
60  {
61  return element_;
62  }
63 
64  // friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
65  // {
66  // return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_));
67  // }
68 
69  LocalGridViewFunctionAdapter(const F & f) : f_(stackobject_to_shared_ptr(f)) {};
70 
71  // transforming constructor
72  template<typename Transformation>
73  LocalGridViewFunctionAdapter(shared_ptr<const F> f, const Transformation & t) : f_(f) {};
74 
75  // transforming constructor
76  template<typename Transformation>
77  LocalGridViewFunctionAdapter(const F & f, const Transformation & t) : f_(stackobject_to_shared_ptr(f)) {};
78 
79  private:
80  Element element_;
81  shared_ptr<const F> f_;
82  };
83 
84  template<class F, template<class> class DerivativeTraits = Functions::DefaultDerivativeTraits>
86  {
87  public:
88  using Range = typename F::Traits::RangeFieldType;
89  using Domain = typename F::Traits::DomainFieldType;
90  using GridView = typename F::Traits::GridViewType;
91 
93  using RawSignature =
94  typename Functions::SignatureTraits<Signature>::RawSignature;
95  using DerivativeSignature =
96  typename DerivativeTraits<RawSignature>::Range(Domain);
97 
98  using EntitySet = Functions::GridViewEntitySet<GridView, 0>;
99  using Element = typename EntitySet::Element;
100  using Geometry = typename Element::Geometry;
101 
102  // // Use the inderiction via derivativeIfImplemented to also support
103  // // function types F that do not implement derivative. In this case
104  // // the interface type DifferentiableFunction is used a dummy for
105  // // the derivative type
106  // using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
107  // using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
108  // using Derivative = AnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
109 
110  using LocalDomain = typename EntitySet::LocalCoordinate;
111  using LocalFunction = LocalGridViewFunctionAdapter<F>; // , LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
112 
113  template<class FT>
115  f_(std::forward<FT>(f))
116  {}
117 
118  Range operator()(const Domain& x) const
119  {
120  Range v;
121  f_.evaluate(x,v);
122  return v;
123  }
124 
125  // friend Derivative derivative(const AnalyticGridViewFunction& t)
126  // {
127  // }
128 
129  friend LocalFunction localFunction(const F& f)
130  {
131  return LocalFunction(f.f_);
132  }
133 
134  const EntitySet& entitySet() const
135  {
136  return EntitySet(f_.getGridView());
137  }
138 
139  private:
140  F f_;
141  };
142 
143 } // end namespace Imp
144 } // end namespace PDELab
145 } // end namespace Dune
146 
147 #endif // DUNE_PDELAB_FUNCTION_OLDINTERFACEADAPTER_HH
typename EntitySet::LocalCoordinate LocalDomain
Definition: oldinterfaceadapter.hh:110
typename EntitySet::Element Element
Definition: oldinterfaceadapter.hh:99
typename Element::Geometry Geometry
Definition: oldinterfaceadapter.hh:100
Range(LocalDomain) Signature
Definition: oldinterfaceadapter.hh:24
Definition: oldinterfaceadapter.hh:85
void bind(const Element &element)
Definition: oldinterfaceadapter.hh:44
friend LocalFunction localFunction(const F &f)
Definition: oldinterfaceadapter.hh:129
typename F::Traits::RangeFieldType Range
Definition: oldinterfaceadapter.hh:88
typename F::Traits::DomainType LocalDomain
Definition: oldinterfaceadapter.hh:21
LocalGridViewFunctionAdapter(const F &f, const Transformation &t)
Definition: oldinterfaceadapter.hh:77
DifferentiableFunctionLocalViewTag ImplementationTag
Definition: oldinterfaceadapter.hh:34
Range operator()(const Domain &x) const
Definition: oldinterfaceadapter.hh:118
typename F::Traits::DomainFieldType Domain
Definition: oldinterfaceadapter.hh:89
typename DerivativeTraits< RawSignature >::Range(LocalDomain) DerivativeSignature
Definition: oldinterfaceadapter.hh:28
typename F::Traits::GridViewType GridView
Definition: oldinterfaceadapter.hh:90
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
typename Functions::SignatureTraits< Signature >::RawSignature RawSignature
Definition: oldinterfaceadapter.hh:94
typename F::Traits::GridViewType GridView
Definition: oldinterfaceadapter.hh:22
LocalGridViewFunctionAdapter(shared_ptr< const F > f, const Transformation &t)
Definition: oldinterfaceadapter.hh:73
const Element & localContext() const
Definition: oldinterfaceadapter.hh:59
typename F::Traits::RangeType Range
Definition: oldinterfaceadapter.hh:20
STL namespace.
typename Functions::SignatureTraits< Signature >::RawSignature RawSignature
Definition: oldinterfaceadapter.hh:26
Functions::GridViewEntitySet< GridView, 0 > EntitySet
Definition: oldinterfaceadapter.hh:30
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition: oldinterfaceadapter.hh:96
Functions::GridViewEntitySet< GridView, 0 > EntitySet
Definition: oldinterfaceadapter.hh:98
LocalGridViewFunctionAdapter(const F &f)
Definition: oldinterfaceadapter.hh:69
typename std::decay< typename Element::Geometry >::type Geometry
Definition: oldinterfaceadapter.hh:32
typename EntitySet::Element Element
Definition: oldinterfaceadapter.hh:31
const EntitySet & entitySet() const
Definition: oldinterfaceadapter.hh:134
Range operator()(const LocalDomain &x) const
Definition: oldinterfaceadapter.hh:52
Definition: oldinterfaceadapter.hh:16
GridViewFunctionAdapter(FT &&f)
Definition: oldinterfaceadapter.hh:114
void unbind()
Definition: oldinterfaceadapter.hh:49
Range(Domain) Signature
Definition: oldinterfaceadapter.hh:92