dune-pdelab  2.4-dev
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  typedef typename Traits::GridView GV;
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  , _gv(this->template child<0>().gridView())
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  , _gv(r._gv)
46  {}
47 
49  : BaseT(std::move(r))
50  , _gv(r._gv)
51  {}
52 
53 #endif // DOXYGEN
54 
55  virtual void update()
56  {
57  LocalOrdering& lo = this->localOrdering();
58  lo.update_a_priori_fixed_size();
59 
60  const std::size_t dim = GV::dimension;
61 
62  typedef typename Traits::SizeType size_type;
63  typedef std::vector<GeometryType> GTVector;
64  GTVector geom_types;
65 
66  for (size_type cc = 0; cc <= dim; ++cc)
67  {
68  auto per_codim_geom_types = _gv.indexSet().types(cc);
69  std::copy(per_codim_geom_types.begin(),per_codim_geom_types.end(),std::back_inserter(geom_types));
70  }
71 
72  if (lo._fixed_size)
73  {
74  lo.update_fixed_size(geom_types.begin(),geom_types.end());
75  }
76  else
77  {
78  lo.pre_collect_used_geometry_types_from_cell();
79 
80  typedef typename GV::template Codim<0>::Iterator CellIterator;
81 
82  const CellIterator end_it = _gv.template end<0>();
83  for (CellIterator it = _gv.template begin<0>(); it != end_it; ++it)
84  {
85  lo.collect_used_geometry_types_from_cell(*it);
86  }
87 
88  lo.allocate_entity_offset_vector(geom_types.begin(),geom_types.end());
89 
90  for (CellIterator it = _gv.template begin<0>(); it != end_it; ++it)
91  {
92  lo.extract_per_entity_sizes_from_cell(*it);
93  }
94 
95  // FIXME: handling of blocked containers!
96  lo.finalize_non_fixed_size_update();
97  }
98 
99  // we need to re-test here, as the local ordering could have detected a fixed size ordering
100  // and switched its implementation
101  if (lo._fixed_size)
102  {
103  _gt_dof_offsets.assign(GlobalGeometryTypeIndex::size(dim) + 1,0);
104  _size = 0;
105 
106  const GTVector::const_iterator end_it = geom_types.end();
107  for (GTVector::const_iterator it = geom_types.begin(); it != end_it; ++it)
108  {
109  const size_type gt_index = GlobalGeometryTypeIndex::index(*it);
110  size_type gt_size = lo.size(gt_index,0);
111  size_type entity_count = _gv.indexSet().size(*it);
112  _size += gt_size * entity_count;
113  if (_container_blocked)
114  gt_size = gt_size > 0;
115  _gt_dof_offsets[gt_index + 1] = gt_size * entity_count;
116  }
117  std::partial_sum(_gt_dof_offsets.begin(),_gt_dof_offsets.end(),_gt_dof_offsets.begin());
118  _block_count = _gt_dof_offsets.back();
119  _codim_fixed_size.set();
120  }
121  else
122  {
123  _block_count = _size = lo._entity_dof_offsets.back();
124  _codim_fixed_size.reset();
125  }
126 
127  _fixed_size = lo._fixed_size;
128  _max_local_size = lo.maxLocalSize();
129 
130  _codim_used = lo._codim_used;
131  _codim_fixed_size = lo._codim_fixed_size;
132 
133  }
134 
135  using BaseT::fixedSize;
136 
137  private:
138 
140  using BaseT::_size;
141  using BaseT::_block_count;
143  using BaseT::_fixed_size;
144  using BaseT::_codim_used;
147 
148  typename Traits::GridView _gv;
149  };
150 
151 
152  template<typename GFS, typename Transformation>
154  {
155 
156  static const bool recursive = false;
157 
158  typedef DirectLeafLocalOrdering<typename GFS::Traits::OrderingTag,
159  typename GFS::Traits::FiniteElementMap,
160  typename GFS::Traits::GridView,
161  typename Transformation::DOFIndex,
162  typename Transformation::ContainerIndex
164 
166 
167  typedef GridViewOrdering transformed_type;
168  typedef std::shared_ptr<transformed_type> transformed_storage_type;
169 
170  static transformed_type transform(const GFS& gfs, const Transformation& t)
171  {
172  return transformed_type(make_tuple(std::make_shared<LocalOrdering>(gfs.finiteElementMapStorage(),gfs.gridView())),gfs.backend().blocked(gfs),const_cast<GFS*>(&gfs));
173  }
174 
175  static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t)
176  {
177  return std::make_shared<transformed_type>(make_tuple(std::make_shared<LocalOrdering>(gfs->finiteElementMapStorage(),gfs->gridView())),gfs->backend().blocked(*gfs),const_cast<GFS*>(gfs.get()));
178  }
179 
180  };
181 
182 
183  template<typename GFS, typename Transformation, typename Params>
184  direct_leaf_gfs_to_gridview_ordering_descriptor<GFS,Transformation>
185  register_leaf_gfs_to_ordering_descriptor(GFS*,Transformation*,LeafOrderingTag<Params>*);
186 
188  } // namespace PDELab
189 } // namespace Dune
190 
191 #endif // DUNE_PDELAB_ORDERING_LEAFORDERING_HH
Generic infrastructure for orderings for leaf spaces.
Definition: leaforderingbase.hh:21
TypeTree::CompositeNode< LocalOrdering > NodeT
Definition: leaforderingbase.hh:37
bool fixedSize(typename Traits::SizeType codim) const
Definition: orderingbase.hh:215
LocalOrdering & localOrdering()
Definition: leaforderingbase.hh:44
static const bool recursive
Definition: leafgridviewordering.hh:156
GridViewOrdering transformed_type
Definition: leafgridviewordering.hh:167
STL namespace.
direct_leaf_gfs_to_gridview_ordering_descriptor< GFS, Transformation > register_leaf_gfs_to_ordering_descriptor(GFS *, Transformation *, LeafOrderingTag< Params > *)
Definition: directleaflocalordering.hh:27
std::vector< typename Traits::SizeType > _gt_dof_offsets
Definition: leaforderingbase.hh:282
Gridview ordering for leaf spaces.
Definition: leafgridviewordering.hh:18
LeafGridViewOrdering< LocalOrdering > GridViewOrdering
Definition: leafgridviewordering.hh:165
virtual void update()
Definition: leafgridviewordering.hh:55
DirectLeafLocalOrdering< typename GFS::Traits::OrderingTag, typename GFS::Traits::FiniteElementMap, typename GFS::Traits::GridView, typename Transformation::DOFIndex, typename Transformation::ContainerIndex > LocalOrdering
Definition: leafgridviewordering.hh:163
Definition: adaptivity.hh:27
LocalOrdering::Traits Traits
Definition: leafgridviewordering.hh:22
Dune::PDELab::impl::GridFunctionSpaceOrderingData< typename Traits::SizeType > GFSData
Definition: orderingbase.hh:34
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t)
Definition: leafgridviewordering.hh:175
static const int dim
Definition: adaptivity.hh:83
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: leafgridviewordering.hh:170
std::shared_ptr< transformed_type > transformed_storage_type
Definition: leafgridviewordering.hh:168
LeafGridViewOrdering(const typename NodeT::NodeStorage &local_ordering, bool container_blocked, typename BaseT::GFSData *gfs_data)
Definition: leafgridviewordering.hh:33