3 #ifndef DUNE_PDELAB_INTERSECTIONINDEXSET_HH
4 #define DUNE_PDELAB_INTERSECTIONINDEXSET_HH
16 #include<dune/common/exceptions.hh>
28 typedef typename GV::Traits::template Codim<0>::Entity
Element;
31 : gv(gv_), is(gv.indexSet())
33 typedef typename GV::Traits::template Codim<0>::Iterator ElementIterator;
36 for (ElementIterator it = gv.template begin<0>();
37 it!=gv.template end<0>(); ++it)
48 return intersection_counter;
54 return number_of_intersections[is.index(element)];
61 if (intersection.boundary() && (!intersection.neighbor()))
62 return codim1index_to_intersectionindex[is.subIndex(*(intersection.inside()),intersection.indexInInside(),1)];
65 if (intersection.neighbor())
67 if (intersection.inside()->level()>=intersection.outside()->level())
68 return codim1index_to_intersectionindex[is.subIndex(*(intersection.inside()),intersection.indexInInside(),1)];
70 return codim1index_to_intersectionindex[is.subIndex(*(intersection.outside()),intersection.indexInOutside(),1)];
74 DUNE_THROW(Dune::Exception,
"intersection index at processor boundary requested");
81 return element_intersection_subindex[entry[is.index(element)]+i];
89 codim1index_to_intersectionindex.resize(gv.size(1));
90 invalidIndex = gv.size(1)+1;
91 for (
size_t i=0; i<codim1index_to_intersectionindex.size(); ++i)
92 codim1index_to_intersectionindex[i] = invalidIndex;
93 number_of_intersections.resize(gv.size(0));
94 entry.resize(gv.size(0));
95 element_intersection_subindex.resize(2*gv.size(1));
96 intersection_counter = 0;
97 oriented_intersection_counter = 0;
98 std::cout <<
"number of codim 1 entities is " << gv.size(1) << std::endl;
102 void visit (
const Element& element)
104 typedef typename GV::IntersectionIterator IntersectionIterator;
106 entry[is.index(element)] = oriented_intersection_counter;
107 IntersectionIterator endit = gv.iend(element);
108 for (IntersectionIterator iit = gv.ibegin(element); iit!=endit; ++iit)
113 if (iit->inside()->level()>=iit->outside()->level())
114 c1index = is.subIndex(*(iit->inside()),iit->indexInInside(),1);
116 c1index = is.subIndex(*(iit->outside()),iit->indexInOutside(),1);
117 if (codim1index_to_intersectionindex[c1index]==invalidIndex)
118 codim1index_to_intersectionindex[c1index]=intersection_counter++;
119 element_intersection_subindex[oriented_intersection_counter] = codim1index_to_intersectionindex[c1index];
121 else if (iit->boundary())
123 IndexType c1index = is.subIndex(*(iit->inside()),iit->indexInInside(),1);
124 if (codim1index_to_intersectionindex[c1index]==invalidIndex)
125 codim1index_to_intersectionindex[c1index]=intersection_counter++;
126 element_intersection_subindex[oriented_intersection_counter] = codim1index_to_intersectionindex[c1index];
129 oriented_intersection_counter++;
131 number_of_intersections[is.index(element)] =
static_cast<unsigned char>(count);
137 std::cout <<
"number of oriented intersections " << oriented_intersection_counter << std::endl;
138 std::cout <<
"number of intersections " << intersection_counter << std::endl;
147 std::vector<IndexType> codim1index_to_intersectionindex;
150 std::vector<unsigned char> number_of_intersections;
153 std::vector<IndexType> element_intersection_subindex;
156 std::vector<size_t> entry;
158 size_t intersection_counter;
159 size_t oriented_intersection_counter;
IndexType subIndex(const Element &element, int i) const
Definition: intersectionindexset.hh:79
IndexSet::IndexType IndexType
Definition: intersectionindexset.hh:26
IndexType size(const Element &element) const
Definition: intersectionindexset.hh:52
IndexType size() const
Definition: intersectionindexset.hh:46
GV::Traits::template Codim< 0 >::Entity Element
Definition: intersectionindexset.hh:28
Definition: intersectionindexset.hh:22
IndexType index(const Intersection &intersection) const
Definition: intersectionindexset.hh:58
IntersectionIndexSet(const GV &gv_)
Definition: intersectionindexset.hh:30
GV::IndexSet IndexSet
Definition: intersectionindexset.hh:25
GV::Intersection Intersection
Definition: intersectionindexset.hh:27