1 #ifndef DUNE_GRIDGLUE_MERGING_INTERSECTIONLIST_HH 2 #define DUNE_GRIDGLUE_MERGING_INTERSECTIONLIST_HH 1 9 #include <dune/common/fvector.hh> 18 template<
typename L0,
typename L1>
41 virtual std::size_t
size()
const = 0;
94 template<
typename P,
int I>
95 struct IntersectionListLocal
99 struct 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); }
112 struct 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); }
130 template<
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_;
202 template<
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_;
std::conditional_t< I==0, Local0, Local1 > Local
Definition: intersectionlist.hh:214
SimplicialIntersectionListProvider(std::vector< SimplicialIntersection > &&intersections)
Definition: intersectionlist.hh:260
Definition: intersectionlist.hh:219
Coordinate corner(unsigned c)
Definition: projection_impl.hh:22
Definition: intersectionlist.hh:19
std::size_t parents0(Index intersection) const override
Definition: intersectionlist.hh:270
SimplicialIntersection(Index parent0, Index parent1)
Definition: intersectionlist.hh:227
virtual std::size_t parents0(Index intersection) const =0
virtual Index parent1(Index intersection, unsigned index) const =0
FieldVector< double, dim1 > Local1
Definition: intersectionlist.hh:211
Definition: intersectionlist.hh:203
typename Provider::Index Index
Definition: intersectionlist.hh:135
auto corner(Index intersection, unsigned corner, unsigned index=0) const
Definition: intersectionlist.hh:185
IteratorRange<... > intersections(const GridGlue<... > &glue, const Reverse<... > &reverse=!reversed)
Iterate over all intersections of a GridGlue.
Local0 corner0(Index intersection, unsigned corner, unsigned index) const override
Definition: intersectionlist.hh:282
Local1 corner1(Index intersection, unsigned corner, unsigned index) const override
Definition: intersectionlist.hh:285
std::array< Local< I >, nVertices > Corners
Definition: intersectionlist.hh:236
typename Base::Index Index
Definition: intersectionlist.hh:209
Index parent(Index intersection, unsigned index=0) const
Definition: intersectionlist.hh:169
std::size_t parents1(Index intersection) const override
Definition: intersectionlist.hh:273
virtual Local1 corner1(Index intersection, unsigned corner, unsigned index) const =0
IntersectionList(const std::shared_ptr< Provider > &provider)
Definition: intersectionlist.hh:137
virtual Index parent0(Index intersection, unsigned index) const =0
virtual std::size_t parents1(Index intersection) const =0
Index parent1(Index intersection, unsigned index) const override
Definition: intersectionlist.hh:279
unsigned int Index
Definition: intersectionlist.hh:36
FieldVector< double, dim0 > Local0
Definition: intersectionlist.hh:210
FieldVector< double, dim0 > Local0
Definition: intersectionlist.hh:26
auto & intersections()
Definition: intersectionlist.hh:264
Definition: intersectionlist.hh:131
virtual std::size_t size() const =0
Index parent0(Index intersection, unsigned index) const override
Definition: intersectionlist.hh:276
std::size_t parents(Index intersection) const
Definition: intersectionlist.hh:154
std::size_t size() const
Definition: intersectionlist.hh:144
std::size_t size() const override
Definition: intersectionlist.hh:267
FieldVector< double, dim1 > Local1
Definition: intersectionlist.hh:31
void clear()
Definition: intersectionlist.hh:288
Definition: gridglue.hh:35
virtual Local0 corner0(Index intersection, unsigned corner, unsigned index) const =0