3 #ifndef DUNE_PDELAB_GRIDFUNCTIONSPACE_DUNEFUNCTIONSGRIDFUNCTIONSPACE_HH
4 #define DUNE_PDELAB_GRIDFUNCTIONSPACE_DUNEFUNCTIONSGRIDFUNCTIONSPACE_HH
10 #include <dune/common/exceptions.hh>
11 #include <dune/common/typetraits.hh>
13 #include <dune/typetree/leafnode.hh>
14 #include <dune/typetree/compositenode.hh>
30 namespace Experimental {
35 template<
typename VBE>
38 template<std::
size_t block_size>
41 template<
typename VBE>
56 template<
typename DFBasis,
typename VBE,
typename CE>
58 :
public TypeTree::LeafNode
62 using GV =
typename DFBasis::GridView;
64 template<
typename,
typename>
72 using GridView = Dune::PDELab::impl::GridView<typename DFBasis::GridView>;
74 using EntitySet = Dune::PDELab::impl::EntitySet<typename DFBasis::GridView>;
114 auto type = element.type();
115 auto mapEntry = geometryTypeToLocalView_.find(type);
116 if (mapEntry == geometryTypeToLocalView_.end())
118 auto newLocalView = std::make_shared<typename DFBasis::LocalView>(_basis->localView());
119 newLocalView->bind(element);
120 auto insertedLocalView = geometryTypeToLocalView_.insert(std::make_pair(type, newLocalView));
121 return insertedLocalView.first->second->tree().finiteElement();
125 return mapEntry->second->tree().finiteElement();
131 geometryTypeToLocalView_.clear();
135 const std::shared_ptr<DFBasis> _basis;
137 mutable std::map<GeometryType, std::shared_ptr<typename DFBasis::LocalView> > geometryTypeToLocalView_;
155 :
public TypeTree::LeafNode
188 return _gfs.
basis().size();
194 return _containerIndices[entity[0]][entity[1]].size();
199 return _gfs.
basis().localView().maxSize();
206 return _contains[codim];
213 return _fixedSize[codim];
217 template<
typename CIOutIterator,
typename DIOutIterator = DummyDOFIndexIterator>
221 CIOutIterator ci_out,
const CIOutIterator ci_end,
222 DIOutIterator dummy)
const
224 for (
size_type i=0; i<_containerIndices[entityIndex[0]][entityIndex[1]].size(); i++)
226 *ci_out = _containerIndices[entityIndex[0]][entityIndex[1]][i];
230 return _containerIndices[entityIndex[0]][entityIndex[1]].size();
235 return _containerIndices[i.entityIndex()[0]][i.entityIndex()[1]][i.treeIndex()[0]];
240 _containerIndices.clear();
242 constexpr
auto dim = GV::dimension;
244 const auto& indexSet =
gridView.indexSet();
247 std::vector<std::vector<size_type> > dofsPerEntity(GlobalGeometryTypeIndex::size(
dim));
249 for (
auto&& type : indexSet.types(codim))
256 typename DFBasis::LocalView localView = _gfs.
basis().localView();
257 for (
auto&& element : elements(
gridView))
259 localView.bind(element);
260 const auto refElement = ReferenceElements<typename GV::ctype,dim>::general(element.type());
262 const auto& localFiniteElement = localView.tree().finiteElement();
264 for (
size_type i=0; i<localFiniteElement.size(); i++)
266 const auto& localKey = localFiniteElement.localCoefficients().localKey(i);
272 auto subentityIndex = indexSet.subIndex(element, localKey.subEntity(), localKey.codim());
274 dofsPerEntity[subentityTypeIndex][subentityIndex]
275 = std::max(dofsPerEntity[subentityTypeIndex][subentityIndex], (
size_type)localKey.index()+1);
280 _containerIndices.resize(GlobalGeometryTypeIndex::size(
dim));
283 for (
auto&& type : indexSet.types(codim))
291 for (
auto&& element : elements(
gridView))
293 localView.bind(element);
294 const auto refElement = ReferenceElements<typename GV::ctype,dim>::general(element.type());
296 const auto& localFiniteElement = localView.tree().finiteElement();
298 for (
size_type i=0; i<localFiniteElement.size(); i++)
300 const auto& localKey = localFiniteElement.localCoefficients().localKey(i);
303 GeometryType subentityType = refElement.type(localKey.subEntity(), localKey.codim());
306 auto subentityIndex = indexSet.subIndex(element, localKey.subEntity(), localKey.codim());
317 _contains[codim] =
false;
318 _fixedSize[codim] =
true;
319 for (
auto&& type : indexSet.types(codim))
324 _contains[codim] =
true;
329 _contains[codim] =
true;
331 if (dofs[i-1] != dofs[i])
332 _fixedSize[codim] =
false;
343 std::vector<std::vector<std::vector<ContainerIndex> > > _containerIndices;
348 std::bitset<GV::dimension+1> _contains;
352 std::bitset<GV::dimension+1> _fixedSize;
362 :
public TypeTree::CompositeNode<LeafOrdering>
383 return this->child(Indices::_0).size();
390 return this->child(Indices::_0).size();
395 return this->child(Indices::_0).maxLocalSize();
403 return this->child(Indices::_0).contains(codim);
410 return this->child(Indices::_0).fixedSize(codim);
413 template<
typename CIOutIterator,
typename DIOutIterator = DummyDOFIndexIterator>
417 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
424 this->child(Indices::_0).update();
431 return this->child(Indices::_0).containerIndex(i);
443 using Type = std::conditional_t<
463 , _df_basis(std::move(df_basis))
464 , _finiteElementMap(_df_basis)
465 , _pce(std::move(ce))
471 , _df_basis(std::move(df_basis))
472 , _finiteElementMap(_df_basis)
473 , _pce(std::make_shared<CE>())
480 return _es.gridView();
492 return _finiteElementMap;
515 return _ordering.
size();
525 return _ordering.
size();
541 _df_basis->update(_es.gridView());
542 _finiteElementMap.
update();
547 const std::string&
name()
const
570 std::shared_ptr<DFBasis> _df_basis;
572 std::shared_ptr<CE const> _pce;
static const int dim
Definition: adaptivity.hh:84
std::size_t index
Definition: interpolate.hh:97
PDELab::MultiIndex< std::size_t, 1 > ContainerIndex
The index to access containers with.
Definition: dunefunctionsgridfunctionspace.hh:169
size_type blockCount() const
Same as size(), because block size is always 1.
Definition: dunefunctionsgridfunctionspace.hh:388
const Traits::EntitySet & entitySet() const
get EntitySet
Definition: dunefunctionsgridfunctionspace.hh:484
LeafOrdering(const GridFunctionSpace &gfs)
Definition: dunefunctionsgridfunctionspace.hh:180
size_type size() const
Definition: dunefunctionsgridfunctionspace.hh:381
size_type size(const typename DOFIndex::EntityIndex &entity) const
Number of degrees of freedom per entity.
Definition: dunefunctionsgridfunctionspace.hh:192
Ordering(const GridFunctionSpace &gfs)
Definition: dunefunctionsgridfunctionspace.hh:377
typename Traits::DOFIndex DOFIndex
Definition: dunefunctionsgridfunctionspace.hh:370
bool fixedSize(typename Traits::SizeType codim) const
True if for all entities of the given codim the same number of data items has to be communicated.
Definition: dunefunctionsgridfunctionspace.hh:408
void update()
Definition: dunefunctionsgridfunctionspace.hh:422
const auto & finiteElementMap() const
get finite element map
Definition: dunefunctionsgridfunctionspace.hh:490
FiniteElement FiniteElementType
Definition: dunefunctionsgridfunctionspace.hh:95
GridView GridViewType
Definition: dunefunctionsgridfunctionspace.hh:73
typename Traits::DOFIndex DOFIndex
Definition: dunefunctionsgridfunctionspace.hh:176
typename DFBasis::LocalView::Tree::FiniteElement FiniteElementType
Definition: dunefunctionsgridfunctionspace.hh:80
bool fixedSize(typename Traits::SizeType codim) const
True if all entities of the given codimension have the same number of dofs.
Definition: dunefunctionsgridfunctionspace.hh:211
static const bool consume_tree_index
Definition: dunefunctionsgridfunctionspace.hh:368
Traits::SizeType size() const
Definition: dunefunctionsgridfunctionspace.hh:513
typename Traits::ContainerIndex ContainerIndex
Definition: dunefunctionsgridfunctionspace.hh:177
const Basis & basis() const
Definition: dunefunctionsgridfunctionspace.hh:562
typename LeafOrdering::Traits Traits
Definition: dunefunctionsgridfunctionspace.hh:366
size_type SizeType
Definition: dunefunctionsgridfunctionspace.hh:171
std::shared_ptr< const CE > constraintsStorage() const
return storage of constraints engine
Definition: dunefunctionsgridfunctionspace.hh:502
size_type maxLocalSize() const
Definition: dunefunctionsgridfunctionspace.hh:393
size_type size() const
Definition: dunefunctionsgridfunctionspace.hh:186
Traits::SizeType globalSize() const
Definition: dunefunctionsgridfunctionspace.hh:523
DFBasis Basis
Definition: dunefunctionsgridfunctionspace.hh:82
void name(const std::string &name)
Definition: dunefunctionsgridfunctionspace.hh:552
void update()
Definition: dunefunctionsgridfunctionspace.hh:238
void update()
Definition: dunefunctionsgridfunctionspace.hh:129
FEM FiniteElementMap
Definition: dunefunctionsgridfunctionspace.hh:140
bool contains(typename Traits::SizeType codim) const
Returns true if there is at least one entity of the given codim for which data needs to be communicat...
Definition: dunefunctionsgridfunctionspace.hh:401
typename Traits::ContainerIndex ContainerIndex
Definition: dunefunctionsgridfunctionspace.hh:371
std::decay_t< decltype(*registerDuneFunctionsCompatibleVBE(std::declval< VBE * >()))> DuneFunctionsCompatibleVBE
Definition: dunefunctionsgridfunctionspace.hh:42
Dune::PDELab::impl::GridView< typename DFBasis::GridView > GridView
Definition: dunefunctionsgridfunctionspace.hh:72
CE ConstraintsType
Definition: dunefunctionsgridfunctionspace.hh:78
Traits::SizeType extract_entity_indices(const typename Traits::DOFIndex::EntityIndex &entityIndex, typename Traits::SizeType child_index, CIOutIterator ci_out, const CIOutIterator ci_end, DIOutIterator dummy) const
Definition: dunefunctionsgridfunctionspace.hh:219
GridFunctionSpace(std::shared_ptr< DFBasis > df_basis, std::shared_ptr< CE > ce)
constructor
Definition: dunefunctionsgridfunctionspace.hh:461
std::conditional_t< std::is_same< CE, NoConstraints >::value, EmptyTransformation, ConstraintsTransformation< typename Ordering::Traits::DOFIndex, typename Ordering::Traits::ContainerIndex, E > > Type
define Type as the Type of a container of E's
Definition: dunefunctionsgridfunctionspace.hh:450
std::size_t size_type
Definition: dunefunctionsgridfunctionspace.hh:178
const Traits::ConstraintsType & constraints() const
return constraints engine
Definition: dunefunctionsgridfunctionspace.hh:496
void update(bool force=false)
Update the indexing information of the GridFunctionSpace.
Definition: dunefunctionsgridfunctionspace.hh:538
Traits::SizeType maxLocalSize() const
Definition: dunefunctionsgridfunctionspace.hh:528
size_type maxLocalSize() const
Definition: dunefunctionsgridfunctionspace.hh:197
PDELab::DOFIndex< std::size_t, 1, 2 > DOFIndex
A DOF index that is independent of any ordering.
Definition: dunefunctionsgridfunctionspace.hh:161
const Traits::GridView & gridView() const
get grid view
Definition: dunefunctionsgridfunctionspace.hh:478
DuneFunctionsCompatibleVBE< VBE > Backend
Definition: dunefunctionsgridfunctionspace.hh:87
std::size_t size_type
Definition: dunefunctionsgridfunctionspace.hh:372
Traits::SizeType blockCount() const
Definition: dunefunctionsgridfunctionspace.hh:518
size_type SizeType
Definition: dunefunctionsgridfunctionspace.hh:77
bool contains(typename Traits::SizeType codim) const
True if there is at least one entity of the given codim that has a dof.
Definition: dunefunctionsgridfunctionspace.hh:204
Dune::PDELab::impl::EntitySet< typename DFBasis::GridView > EntitySet
Definition: dunefunctionsgridfunctionspace.hh:74
DFBasis Basis
Definition: dunefunctionsgridfunctionspace.hh:145
const Traits::FiniteElementType & find(const typename GridView::template Codim< 0 >::Entity &element) const
Get local basis functions for entity.
Definition: dunefunctionsgridfunctionspace.hh:112
ContainerIndex containerIndex(const DOFIndex &i) const
Definition: dunefunctionsgridfunctionspace.hh:233
std::size_t size_type
Definition: dunefunctionsgridfunctionspace.hh:170
VBE * registerDuneFunctionsCompatibleVBE(VBE *)
typename DFBasis::LocalView::Tree::FiniteElement FiniteElement
Definition: dunefunctionsgridfunctionspace.hh:94
const Ordering & ordering() const
Direct access to the DOF ordering.
Definition: dunefunctionsgridfunctionspace.hh:508
bool isRootSpace() const
Definition: dunefunctionsgridfunctionspace.hh:557
std::size_t size_type
Definition: dunefunctionsgridfunctionspace.hh:76
FEM(const std::shared_ptr< DFBasis > &basis)
Definition: dunefunctionsgridfunctionspace.hh:98
GridFunctionSpace(std::shared_ptr< DFBasis > df_basis)
Definition: dunefunctionsgridfunctionspace.hh:469
const std::string & name() const
Definition: dunefunctionsgridfunctionspace.hh:547
Traits::SizeType extract_entity_indices(const typename Traits::DOFIndex::EntityIndex &ei, typename Traits::SizeType child_index, CIOutIterator ci_out, const CIOutIterator ci_end) const
Definition: dunefunctionsgridfunctionspace.hh:415
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Definition: istl/descriptors.hh:48
Definition: dunefunctions.hh:14
A multi-index representing a degree of freedom in a GridFunctionSpace.
Definition: dofindex.hh:148
std::array< T, entity_capacity > EntityIndex
Definition: dofindex.hh:158
Mixin base class for specifying output hints to I/O routines like VTK.
Definition: function.hh:126
A class for representing multi-indices.
Definition: multiindex.hh:29
a class holding transformation for constrained spaces
Definition: constraintstransformation.hh:20
Definition: constraintstransformation.hh:112
Definition: noconstraints.hh:20
Definition: datahandleprovider.hh:189
const GridFunctionSpace< DFBasis, VBE, CE > & gfs() const
Definition: datahandleprovider.hh:338
A pdelab grid function space implemented by a dune-functions function space basis.
Definition: dunefunctionsgridfunctionspace.hh:61
export Traits class
Definition: dunefunctionsgridfunctionspace.hh:70
Rudimentary internal implementation of a FiniteElementMap.
Definition: dunefunctionsgridfunctionspace.hh:91
Definition: dunefunctionsgridfunctionspace.hh:93
The actual Ordering object of the grid function space.
Definition: dunefunctionsgridfunctionspace.hh:156
Definition: dunefunctionsgridfunctionspace.hh:158
Root of the ordering tree.
Definition: dunefunctionsgridfunctionspace.hh:363
extract type for storing constraints
Definition: dunefunctionsgridfunctionspace.hh:440
Definition: dunefunctionslocalfunctionspace.hh:51
Definition: gridfunctionspacebase.hh:136
Definition: gridfunctionspace/tags.hh:208
Definition: gridfunctionspace/tags.hh:220
Definition: ordering/utility.hh:55
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139