dune-pdelab  2.7-git
leafgridviewordering.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 
4 #ifndef DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
5 #define DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
6 
9 
10 namespace Dune {
11  namespace PDELab {
12 
15 
17  template<typename LocalOrdering>
19  : public LeafOrderingBase<LocalOrdering>
20  {
21  public:
22  typedef typename LocalOrdering::Traits Traits;
23 
24  private:
25 
26  using ES = typename Traits::EntitySet;
27 
29  typedef typename BaseT::NodeT NodeT;
30 
31  public:
32 
33  LeafGridViewOrdering(const typename NodeT::NodeStorage& local_ordering, bool container_blocked, typename BaseT::GFSData* gfs_data)
34  : BaseT(local_ordering, container_blocked, gfs_data)
35  , _es(this->template child<0>().entitySet())
36  {}
37 
38 #ifndef DOXYGEN
39 
40 // we need to override the default copy / move ctor to fix the delegate pointer, but that is
41 // hardly interesting to our users...
42 
44  : BaseT(r)
45  , _es(r._es)
46  {}
47 
49  : BaseT(std::move(r))
50  , _es(r._es)
51  {}
52 
53 #endif // DOXYGEN
54 
55  virtual ~LeafGridViewOrdering() override = default;
56 
57  virtual void update() override
58  {
59  LocalOrdering& lo = this->localOrdering();
60  lo.update_a_priori_fixed_size();
61 
62  const std::size_t dim = ES::dimension;
63 
64  typename ES::CodimMask codims;
65  codims.set(0); // always need cells
66  lo.collect_used_codims(codims);
67 
68  for (typename ES::dim_type codim = 0; codim <= ES::dimension; ++codim)
69  if (codims.test(codim))
70  _es.addCodim(codim);
71 
72  _es.update();
73 
74  typedef typename Traits::SizeType size_type;
75  auto geom_types = _es.indexSet().types();
76 
77  if (lo._fixed_size)
78  {
79  lo.update_fixed_size(geom_types.begin(),geom_types.end());
80  }
81  else
82  {
83  lo.pre_collect_used_geometry_types_from_cell();
84 
85  for (const auto& element : elements(_es))
86  {
87  lo.collect_used_geometry_types_from_cell(element);
88  }
89 
90  lo.allocate_entity_offset_vector(geom_types.begin(),geom_types.end());
91 
92  for (const auto& element : elements(_es))
93  {
94  lo.extract_per_entity_sizes_from_cell(element);
95  }
96 
97  // FIXME: handling of blocked containers!
98  lo.finalize_non_fixed_size_update();
99  }
100 
101  // we need to re-test here, as the local ordering could have detected a fixed size ordering
102  // and switched its implementation
103  if (lo._fixed_size)
104  {
105  _gt_dof_offsets.assign(GlobalGeometryTypeIndex::size(dim) + 1,0);
106  _size = 0;
107 
108  for (auto gt : geom_types)
109  {
110  const size_type gt_index = GlobalGeometryTypeIndex::index(gt);
111  size_type gt_size = lo.size(gt_index,0);
112  size_type entity_count = _es.indexSet().size(gt);
113  _size += gt_size * entity_count;
114  if (_container_blocked)
115  gt_size = gt_size > 0;
116  _gt_dof_offsets[gt_index + 1] = gt_size * entity_count;
117  }
118  std::partial_sum(_gt_dof_offsets.begin(),_gt_dof_offsets.end(),_gt_dof_offsets.begin());
119  _block_count = _gt_dof_offsets.back();
120  _codim_fixed_size.set();
121  }
122  else
123  {
124  _block_count = _size = lo._entity_dof_offsets.back();
125  _codim_fixed_size.reset();
126  }
127 
128  _fixed_size = lo._fixed_size;
129  _max_local_size = lo.maxLocalSize();
130 
131  _codim_used = lo._codim_used;
132  _codim_fixed_size = lo._codim_fixed_size;
133 
134  }
135 
136  using BaseT::fixedSize;
137 
138  private:
139 
141  using BaseT::_size;
142  using BaseT::_block_count;
144  using BaseT::_fixed_size;
145  using BaseT::_codim_used;
148 
149  typename Traits::EntitySet _es;
150  };
151 
152 
153  template<typename GFS, typename Transformation>
155  {
156 
157  static const bool recursive = false;
158 
159  typedef DirectLeafLocalOrdering<typename GFS::Traits::OrderingTag,
160  typename GFS::Traits::FiniteElementMap,
161  typename GFS::Traits::EntitySet,
162  typename Transformation::DOFIndex,
163  typename Transformation::ContainerIndex
165 
167 
169  typedef std::shared_ptr<transformed_type> transformed_storage_type;
170 
171  static transformed_type transform(const GFS& gfs, const Transformation& t)
172  {
173  return transformed_type(make_tuple(std::make_shared<LocalOrdering>(gfs.finiteElementMapStorage(),gfs.entitySet())),gfs.backend().blocked(gfs),const_cast<GFS*>(&gfs));
174  }
175 
176  static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t)
177  {
178  return std::make_shared<transformed_type>(make_tuple(std::make_shared<LocalOrdering>(gfs->finiteElementMapStorage(),gfs->entitySet())),gfs->backend().blocked(*gfs),const_cast<GFS*>(gfs.get()));
179  }
180 
181  };
182 
183 
184  template<typename GFS, typename Transformation, typename Params>
185  direct_leaf_gfs_to_gridview_ordering_descriptor<GFS,Transformation>
187 
189  } // namespace PDELab
190 } // namespace Dune
191 
192 #endif // DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
static const int dim
Definition: adaptivity.hh:84
std::size_t index
Definition: interpolate.hh:97
direct_leaf_gfs_to_gridview_ordering_descriptor< GFS, Transformation > register_leaf_gfs_to_ordering_descriptor(GFS *, Transformation *, LeafOrderingTag< Params > *)
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Tag indicating a standard ordering for a leaf GridfunctionSpace.
Definition: gridfunctionspace/tags.hh:185
Definition: directleaflocalordering.hh:27
Gridview ordering for leaf spaces.
Definition: leafgridviewordering.hh:20
virtual ~LeafGridViewOrdering() override=default
virtual void update() override
Definition: leafgridviewordering.hh:57
LeafGridViewOrdering(const typename NodeT::NodeStorage &local_ordering, bool container_blocked, typename BaseT::GFSData *gfs_data)
Definition: leafgridviewordering.hh:33
LocalOrdering::Traits Traits
Definition: leafgridviewordering.hh:22
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: leafgridviewordering.hh:171
static const bool recursive
Definition: leafgridviewordering.hh:157
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t)
Definition: leafgridviewordering.hh:176
GridViewOrdering transformed_type
Definition: leafgridviewordering.hh:168
std::shared_ptr< transformed_type > transformed_storage_type
Definition: leafgridviewordering.hh:169
DirectLeafLocalOrdering< typename GFS::Traits::OrderingTag, typename GFS::Traits::FiniteElementMap, typename GFS::Traits::EntitySet, typename Transformation::DOFIndex, typename Transformation::ContainerIndex > LocalOrdering
Definition: leafgridviewordering.hh:164
LeafGridViewOrdering< LocalOrdering > GridViewOrdering
Definition: leafgridviewordering.hh:166
Generic infrastructure for orderings for leaf spaces.
Definition: leaforderingbase.hh:27
Traits::CodimFlag _codim_fixed_size
Definition: orderingbase.hh:285
bool fixedSize() const
Definition: orderingbase.hh:209
Traits::CodimFlag _codim_used
Definition: orderingbase.hh:284
std::size_t _size
Definition: orderingbase.hh:288
std::size_t _max_local_size
Definition: orderingbase.hh:287
std::size_t _block_count
Definition: orderingbase.hh:289
std::vector< typename Traits::SizeType > _gt_dof_offsets
Definition: leaforderingbase.hh:281
TypeTree::CompositeNode< LocalOrdering > NodeT
Definition: leaforderingbase.hh:37
LocalOrdering & localOrdering()
Definition: leaforderingbase.hh:44
bool _fixed_size
Definition: orderingbase.hh:274
const bool _container_blocked
Definition: orderingbase.hh:275
Dune::PDELab::impl::GridFunctionSpaceOrderingData< typename Traits::SizeType > GFSData
Definition: orderingbase.hh:32