3 #ifndef DUNE_PDELAB_FUNCTION_DISCRETEGRIDVIEWFUNCTION_HH 4 #define DUNE_PDELAB_FUNCTION_DISCRETEGRIDVIEWFUNCTION_HH 11 #include <dune/common/exceptions.hh> 12 #include <dune/common/fvector.hh> 14 #include <dune/localfunctions/common/interfaceswitch.hh> 21 #include <dune/functions/gridfunctions/gridviewfunction.hh> 25 template<
typename T,
int N,
typename R2>
26 struct common_type<
Dune::FieldVector<T,N>, R2>
28 using type = Dune::FieldVector<typename std::common_type<T,R2>::type,N>;
31 template<
typename T,
int N,
typename R2>
32 struct common_type<
Dune::FieldVector<T,N>, Dune::FieldVector<R2,N>>
34 using type = Dune::FieldVector<typename std::common_type<T,R2>::type,N>;
41 template<
typename Signature,
typename E,
template<
class>
class D,
int B,
44 Functions::Imp::GridFunctionTraits<
45 typename DiscreteGridViewFunctionTraits<Signature,E,D,B,diffOrder-1>::DerivativeSignature
49 template<
typename Signature,
typename E,
template<
class>
class D,
int B>
51 Functions::Imp::GridFunctionTraits<Signature,E,D,B>
68 template<
typename GFS,
typename V,
int diffOrder = 0>
72 using GridView =
typename GFS::Traits::GridView;
73 using EntitySet = Functions::GridViewEntitySet<GridView, 0>;
75 using Domain =
typename EntitySet::GlobalCoordinate;
76 using LocalBasisTraits =
typename GFS::Traits::FiniteElementMap::Traits::FiniteElement::Traits::LocalBasisType::Traits;
79 using ElementaryRange =
typename std::common_type<LocalBasisRange, VectorRange>::type;
82 using Element =
typename EntitySet::Element;
86 Functions::DefaultDerivativeTraits, 16, diffOrder>;
88 using Range =
typename Traits::Range;
93 enum { maxDiffOrder = LocalBasisTraits::diffOrder - diffOrder };
99 using XView =
typename Vector::template ConstLocalView<LFSCache>;
109 enum { maxDiffOrder = LocalBasisTraits::diffOrder - diffOrder };
111 LocalFunction(
const shared_ptr<const GridFunctionSpace> gfs,
const shared_ptr<const Vector> v)
117 , xl_(pgfs_->maxLocalSize())
118 , yb_(pgfs_->maxLocalSize())
133 x_view_.bind(lfs_cache_);
147 DUNE_THROW(InvalidStateException,
"can't call localContext on unbound DiscreteGridViewFunction::LocalFunction");
188 return evaluate<LocalBasisTraits::diffOrder, diffOrder>(coord);
192 template<
int maxDiffOrder,
int dOrder>
193 typename std::enable_if<(dOrder > 2 or dOrder > maxDiffOrder),
195 evaluate(
const Domain& coord)
const 197 if (diffOrder > 2) DUNE_THROW(NotImplemented,
198 "Derivatives are only implemented up to degree 2");
199 if (diffOrder > maxDiffOrder) DUNE_THROW(NotImplemented,
200 "Derivative of degree " << diffOrder <<
" is not provided by the local basis");
203 template<
int maxDiffOrder,
int dOrder>
204 typename std::enable_if<dOrder == 0,
206 evaluate(
const Domain& coord)
const 209 auto& basis = lfs_.finiteElement().localBasis();
210 basis.evaluateFunction(coord,yb_);
211 for (
size_type i = 0; i < yb_.size(); ++i)
213 r.axpy(xl_[i],yb_[i]);
218 template<
int maxDiffOrder,
int dOrder>
219 typename std::enable_if<maxDiffOrder >= 1 and dOrder == 1,
221 evaluate(
const Domain& coord)
const 225 const typename Element::Geometry::JacobianInverseTransposed
226 JgeoIT = element_->geometry().jacobianInverseTransposed(coord);
229 lfs_.finiteElement().localBasis().evaluateJacobian(coord,yb_);
233 for(std::size_t i = 0; i < yb_.size(); ++i) {
234 assert(gradphi.size() == yb_[i].size());
235 for(std::size_t j = 0; j < gradphi.size(); ++j) {
238 JgeoIT.mv(yb_[i][j], gradphi[j]);
243 r[j].axpy(xl_[i], gradphi[j]);
249 template<
int maxDiffOrder,
int dOrder>
250 typename std::enable_if<maxDiffOrder >= 2 and dOrder == 2,
252 evaluate(
const Domain& coord)
const 256 if (! element_->geometry().affine())
257 DUNE_THROW(NotImplemented,
"Due to missing features in the Geometry interface, " 258 "the computation of higher derivatives (>=2) works only for affine transformations.");
260 const typename Element::Geometry::JacobianInverseTransposed
261 JgeoIT = element_->geometry().jacobianInverseTransposed(coord);
265 static const unsigned int dim = GridView::dimensionworld;
271 array<std::size_t, dim> directions;
272 for(std::size_t i = 0; i <
dim; ++i) {
277 for(std::size_t j = i+1; j <
dim; ++j) {
279 lfs_.finiteElement().localBasis().partial(directions,coord,yb_);
280 assert( yb_.size() == 1);
281 for(std::size_t n = 0; n < yb_.size(); ++n) {
283 r[i][j] += xl_[i] * yb_[j];
292 for(std::size_t i = 0; i <
dim; ++i)
293 for(std::size_t j = i; j <
dim; ++j)
294 r[i][j] *= JgeoIT[i][j] * JgeoIT[i][j];
300 const shared_ptr<const GridFunctionSpace>
pgfs_;
301 const shared_ptr<const Vector>
v_;
305 mutable std::vector<ElementaryRange>
xl_;
306 mutable std::vector<Range>
yb_;
311 : pgfs_(stackobject_to_shared_ptr(gfs)),v_(stackobject_to_shared_ptr(v))
336 DUNE_THROW(NotImplemented,
"not implemented");
363 return pgfs_->gridView();
368 const shared_ptr<const GridFunctionSpace> pgfs_;
369 const shared_ptr<const Vector> v_;
376 #endif // DUNE_PDELAB_FUNCTION_DISCRETEGRIDVIEWFUNCTION_HH
static const int dim
Definition: adaptivity.hh:83
LFS lfs_
Definition: discretegridviewfunction.hh:302
GlobalFunction::Element Element
Definition: discretegridviewfunction.hh:106
GFS GridFunctionSpace
Definition: discretegridviewfunction.hh:91
typename EntitySet::LocalCoordinate LocalDomain
Definition: discretegridviewfunction.hh:81
typename std::common_type< LocalBasisRange, VectorRange >::type ElementaryRange
Definition: discretegridviewfunction.hh:79
const Element * element_
Definition: discretegridviewfunction.hh:307
std::size_t size_type
Definition: discretegridviewfunction.hh:107
const V & dofs() const
Definition: discretegridviewfunction.hh:328
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discretegridviewfunction.hh:128
friend LocalFunction localFunction(const DiscreteGridViewFunction &t)
Get local function of wrapped function.
Definition: discretegridviewfunction.hh:353
LocalFunction(const shared_ptr< const GridFunctionSpace > gfs, const shared_ptr< const Vector > v)
Definition: discretegridviewfunction.hh:111
typename Traits::Range Range
Definition: discretegridviewfunction.hh:88
std::vector< ElementaryRange > xl_
Definition: discretegridviewfunction.hh:305
const GridFunctionSpace & gridFunctionSpace() const
Definition: discretegridviewfunction.hh:323
DiscreteGridViewFunction(std::shared_ptr< const GridFunctionSpace > pgfs, std::shared_ptr< const Vector > v)
Definition: discretegridviewfunction.hh:314
GlobalFunction::Range Range
Definition: discretegridviewfunction.hh:105
const Basis & basis() const
Definition: discretegridviewfunction.hh:319
Range operator()(const Domain &coord)
Evaluate LocalFunction at bound element.
Definition: discretegridviewfunction.hh:186
LFSCache lfs_cache_
Definition: discretegridviewfunction.hh:303
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
typename GFS::Traits::GridView GridView
Definition: discretegridviewfunction.hh:72
EntitySet entitySet() const
Get associated EntitySet.
Definition: discretegridviewfunction.hh:361
V Vector
Definition: discretegridviewfunction.hh:92
Dune::FieldVector< typename std::common_type< T, R2 >::type, N > type
Definition: discretegridviewfunction.hh:28
friend DiscreteGridViewFunction< GFS, V, diffOrder+1 >::LocalFunction derivative(const LocalFunction &t)
free function to obtain the derivative of a LocalFunction
Definition: discretegridviewfunction.hh:167
typename EntitySet::GlobalCoordinate Domain
Definition: discretegridviewfunction.hh:75
Dune::FieldVector< typename std::common_type< T, R2 >::type, N > type
Definition: discretegridviewfunction.hh:34
XView x_view_
Definition: discretegridviewfunction.hh:304
DiscreteGridViewFunction(const GridFunctionSpace &gfs, const Vector &v)
Definition: discretegridviewfunction.hh:310
void unbind()
Definition: discretegridviewfunction.hh:138
LocalDomain Domain
Definition: discretegridviewfunction.hh:104
const shared_ptr< const GridFunctionSpace > pgfs_
Definition: discretegridviewfunction.hh:300
Definition: discretegridviewfunction.hh:95
typename V::ElementType VectorRange
Definition: discretegridviewfunction.hh:78
Definition: discretegridviewfunction.hh:43
const shared_ptr< const Vector > v_
Definition: discretegridviewfunction.hh:301
typename EntitySet::Element Element
Definition: discretegridviewfunction.hh:82
typename LocalBasisTraits::RangeType LocalBasisRange
Definition: discretegridviewfunction.hh:77
const Element & localContext() const
Definition: discretegridviewfunction.hh:143
typename GFS::Traits::FiniteElementMap::Traits::FiniteElement::Traits::LocalBasisType::Traits LocalBasisTraits
Definition: discretegridviewfunction.hh:76
std::vector< Range > yb_
Definition: discretegridviewfunction.hh:306
A discrete function defined over a GridFunctionSpace.
Definition: discretegridviewfunction.hh:69
Functions::GridViewEntitySet< GridView, 0 > EntitySet
Definition: discretegridviewfunction.hh:73
GFS Basis
Definition: discretegridviewfunction.hh:90
friend DiscreteGridViewFunction< GFS, V, diffOrder+1 > derivative(const DiscreteGridViewFunction &t)
Definition: discretegridviewfunction.hh:339