1#ifndef DUNE_GRIDGLUE_MERGING_INTERSECTIONLIST_HH
2#define DUNE_GRIDGLUE_MERGING_INTERSECTIONLIST_HH 1
9#include <dune/common/fvector.hh>
18template<
typename L0,
typename L1>
41 virtual std::size_t
size()
const = 0;
94template<
typename P,
int I>
95struct IntersectionListLocal
99struct IntersectionListLocal<P, 0>
101 static std::size_t parents(
const P& p,
typename P::Index intersection)
102 {
return p.parents0(intersection); }
104 static typename P::Index parent(
const P& p,
typename P::Index intersection,
unsigned index)
105 {
return p.parent0(intersection, index); }
107 static typename P::Local0
corner(
const P& p,
typename P::Index intersection,
unsigned corner,
unsigned index)
108 {
return p.corner0(intersection,
corner, index); }
112struct IntersectionListLocal<P, 1>
114 static std::size_t parents(
const P& p,
typename P::Index intersection)
115 {
return p.parents1(intersection); }
117 static typename P::Index parent(
const P& p,
typename P::Index intersection,
unsigned index)
118 {
return p.parent1(intersection, index); }
120 static typename P::Local1
corner(
const P& p,
typename P::Index intersection,
unsigned corner,
unsigned index)
121 {
return p.corner1(intersection,
corner, index); }
130template<
typename Local0,
typename Local1>
145 {
return impl_->size(); }
156 static_assert(I == 0 or I == 1,
"I must be 0 or 1");
158 return Impl::IntersectionListLocal<Provider, I>::parents(*impl_, intersection);
171 static_assert(I == 0 or I == 1,
"I must be 0 or 1");
173 return Impl::IntersectionListLocal<Provider, I>::parent(*impl_, intersection, index);
187 static_assert(I == 0 or I == 1,
"I must be 0 or 1");
193 std::shared_ptr<Provider> impl_;
202template<
int dim0,
int dim1>
210 using Local0 = FieldVector<double, dim0>;
211 using Local1 = FieldVector<double, dim1>;
214 using Local = std::conditional_t< I == 0, Local0, Local1 >;
222 static constexpr int intersectionDim = dim0 < dim1 ? dim0 : dim1;
223 static constexpr int nVertices = intersectionDim + 1;
236 using Corners = std::array<Local<I>, nVertices>;
241 std::vector< Corners<0> >
corners0 = std::vector< Corners<0> >(1);
246 std::vector< Index >
parents0 = std::vector< Index >(1);
251 std::vector< Corners<1> >
corners1 = std::vector< Corners<1> >(1);
256 std::vector< Index >
parents1 = std::vector< Index >(1);
265 {
return intersections_; }
267 std::size_t
size()
const override
268 {
return intersections_.size(); }
271 {
return intersections_[intersection].parents0.size(); }
274 {
return intersections_[intersection].parents1.size(); }
277 {
return intersections_[intersection].parents0[index]; }
280 {
return intersections_[intersection].parents1[index]; }
283 {
return intersections_[intersection].corners0[index][
corner]; }
286 {
return intersections_[intersection].corners1[index][
corner]; }
290 intersections_.clear();
294 std::vector<SimplicialIntersection> intersections_;
Definition: gridglue.hh:35
Coordinate corner(unsigned c)
Definition: projection_impl.hh:22
Definition: intersectionlist.hh:20
virtual std::size_t parents0(Index intersection) const =0
virtual Local1 corner1(Index intersection, unsigned corner, unsigned index) const =0
unsigned int Index
Definition: intersectionlist.hh:36
virtual std::size_t size() const =0
L0 Local0
Definition: intersectionlist.hh:26
virtual Local0 corner0(Index intersection, unsigned corner, unsigned index) const =0
L1 Local1
Definition: intersectionlist.hh:31
virtual Index parent1(Index intersection, unsigned index) const =0
virtual std::size_t parents1(Index intersection) const =0
virtual Index parent0(Index intersection, unsigned index) const =0
Definition: intersectionlist.hh:132
Index parent(Index intersection, unsigned index=0) const
Definition: intersectionlist.hh:169
auto corner(Index intersection, unsigned corner, unsigned index=0) const
Definition: intersectionlist.hh:185
typename Provider::Index Index
Definition: intersectionlist.hh:135
IntersectionList(const std::shared_ptr< Provider > &provider)
Definition: intersectionlist.hh:137
std::size_t parents(Index intersection) const
Definition: intersectionlist.hh:154
std::size_t size() const
Definition: intersectionlist.hh:144
Definition: intersectionlist.hh:205
FieldVector< double, dim0 > Local0
Definition: intersectionlist.hh:210
auto & intersections()
Definition: intersectionlist.hh:264
SimplicialIntersectionListProvider(std::vector< SimplicialIntersection > &&intersections)
Definition: intersectionlist.hh:260
Local1 corner1(Index intersection, unsigned corner, unsigned index) const override
Definition: intersectionlist.hh:285
Local0 corner0(Index intersection, unsigned corner, unsigned index) const override
Definition: intersectionlist.hh:282
Index parent1(Index intersection, unsigned index) const override
Definition: intersectionlist.hh:279
typename Base::Index Index
Definition: intersectionlist.hh:209
std::conditional_t< I==0, Local0, Local1 > Local
Definition: intersectionlist.hh:214
SimplicialIntersectionListProvider()=default
void clear()
Definition: intersectionlist.hh:288
std::size_t size() const override
Definition: intersectionlist.hh:267
FieldVector< double, dim1 > Local1
Definition: intersectionlist.hh:211
std::size_t parents1(Index intersection) const override
Definition: intersectionlist.hh:273
Index parent0(Index intersection, unsigned index) const override
Definition: intersectionlist.hh:276
std::size_t parents0(Index intersection) const override
Definition: intersectionlist.hh:270
Definition: intersectionlist.hh:220
SimplicialIntersection(Index parent0, Index parent1)
Definition: intersectionlist.hh:227
std::array< Local< I >, nVertices > Corners
Definition: intersectionlist.hh:236
std::vector< Index > parents1
Definition: intersectionlist.hh:256
std::vector< Index > parents0
Definition: intersectionlist.hh:246
std::vector< Corners< 1 > > corners1
Definition: intersectionlist.hh:251
SimplicialIntersection()=default
std::vector< Corners< 0 > > corners0
Definition: intersectionlist.hh:241