18 #ifndef DUNE_GRIDGLUE_EXTRACTORS_CODIM0EXTRACTOR_HH
19 #define DUNE_GRIDGLUE_EXTRACTORS_CODIM0EXTRACTOR_HH
23 #include <dune/grid/common/mcmgmapper.hh>
45 typedef typename GV::Traits::template Codim<dim>::EntityPointer
VertexPtr;
46 typedef typename GV::Traits::template Codim<0>::EntityPointer
ElementPtr;
48 static const Dune::PartitionIteratorType
PType = Dune::Interior_Partition;
49 typedef typename GV::Traits::template Codim<0>::template Partition<PType>::Iterator
ElementIter;
66 std::cout <<
"This is Codim0Extractor on a <"
67 << GV::dimension <<
"," << GV::dimensionworld <<
"> grid!" << std::endl;
92 size_t element_index = 0;
93 size_t vertex_index = 0;
97 std::deque<SubEntityInfo> temp_faces;
100 for (ElementIter elit = this->gv_.template begin<0, PType>();
101 elit != this->gv_.template end<0, PType>(); ++elit)
103 ElementPtr eptr(elit);
104 IndexType eindex = this->cellMapper_.map(*elit);
111 this->elmtInfo_[eindex] =
new ElementInfo(element_index, eptr, 1);
113 int numCorners = elit->template count<dim>();
114 unsigned int vertex_indices[numCorners];
115 unsigned int vertex_numbers[numCorners];
118 for (
int i = 0; i < numCorners; ++i)
120 vertex_numbers[i] = i;
123 VertexPtr vptr(elit->template subEntity<dim>(vertex_numbers[i]));
124 IndexType vindex = this->gv_.indexSet().template index<dim>(*vptr);
128 typename VertexInfoMap::iterator vimit = this->vtxInfo_.find(vindex);
129 if (vimit == this->vtxInfo_.end())
132 this->vtxInfo_[vindex] =
new VertexInfo(vertex_index, vptr);
134 vertex_indices[i] = vertex_index;
141 vertex_indices[i] = vimit->second->idx;
157 bool elementNormalDirection =
158 (elit->geometry().corner(1)[0] < elit->geometry().corner(0)[0]);
159 if ( positiveNormalDirection_ != elementNormalDirection )
161 std::swap(vertex_indices[0], vertex_indices[1]);
162 std::swap(vertex_numbers[0], vertex_numbers[1]);
168 Dune::FieldVector<ctype, dimworld>
169 v0 = elit->geometry().corner(1),
170 v1 = elit->geometry().corner(2);
171 v0 -= elit->geometry().corner(0);
172 v1 -= elit->geometry().corner(0);
173 ctype normal_sign = v0[0]*v1[1] - v0[1]*v1[0];
174 bool elementNormalDirection = (normal_sign < 0);
175 if ( positiveNormalDirection_ != elementNormalDirection )
177 std::cout <<
"swap\n";
178 if (elit->type().isCube())
180 for (
int i = 0; i < (1<<dim); i+=2)
183 std::swap(vertex_indices[i], vertex_indices[i+1]);
184 std::swap(vertex_numbers[i], vertex_numbers[i+1]);
186 }
else if (elit->type().isSimplex()) {
187 std::swap(vertex_indices[0], vertex_indices[1]);
188 std::swap(vertex_numbers[0], vertex_numbers[1]);
190 DUNE_THROW(Dune::Exception,
"Unexpected Geometrytype");
199 temp_faces.push_back(SubEntityInfo(eindex,0,elit->type()));
201 for (
int i=0; i<numCorners; i++) {
202 temp_faces.back().corners[i].idx = vertex_indices[i];
204 temp_faces.back().corners[i].num = vertex_numbers[i];
211 this->subEntities_.resize(element_index);
213 copy(temp_faces.begin(), temp_faces.end(), this->subEntities_.begin());
216 this->coords_.resize(this->vtxInfo_.size());
217 typename VertexInfoMap::const_iterator it1 = this->vtxInfo_.begin();
218 for (; it1 != this->vtxInfo_.end(); ++it1)
221 CoordinateInfo* current = &this->coords_[it1->second->idx];
223 current->index = it1->second->idx;
225 current->vtxindex = it1->first;
228 current->coord = it1->second->p->geometry().corner(0);
237 #endif // DUNE_GRIDGLUE_EXTRACTORS_CODIM0EXTRACTOR_HH
GV::Traits::template Codim< dim >::EntityPointer VertexPtr
Definition: codim0extractor.hh:45
static const Dune::PartitionIteratorType PType
Definition: codim0extractor.hh:48
Codim0Extractor(const GV &gv, const ExtractorPredicate< GV, 0 > &descr)
Constructor.
Definition: codim0extractor.hh:63
Extractor< GV, 0 >::VertexInfo VertexInfo
Definition: codim0extractor.hh:54
Definition: codim0extractor.hh:33
const bool & positiveNormalDirection() const
Definition: codim0extractor.hh:72
bool & positiveNormalDirection()
Definition: codim0extractor.hh:71
Definition: gridglue.hh:34
Extractor< GV, 0 >::CoordinateInfo CoordinateInfo
Definition: codim0extractor.hh:55
Extractor< GV, 0 >::ctype ctype
Definition: codim0extractor.hh:40
Extractor< GV, 0 >::SubEntityInfo SubEntityInfo
Definition: codim0extractor.hh:52
Extractor< GV, 0 >::IndexType IndexType
Definition: codim0extractor.hh:43
Base class for subentity-selecting predicates.
Definition: extractorpredicate.hh:30
Extractor< GV, 0 >::ElementInfo ElementInfo
Definition: codim0extractor.hh:53
GV::Traits::template Codim< 0 >::EntityPointer ElementPtr
Definition: codim0extractor.hh:46
GV::Traits::template Codim< 0 >::template Partition< PType >::Iterator ElementIter
Definition: codim0extractor.hh:49
Extractor< GV, 0 >::VertexInfoMap VertexInfoMap
Definition: codim0extractor.hh:56
Provides codimension-independent methods for grid extraction.
Definition: extractor.hh:48
virtual bool contains(const typename GV::Traits::template Codim< 0 >::EntityPointer &element, unsigned int subentity) const =0
Return true if a subentity should be extracted.
Base class for predicates selecting the part of a grid to be extracted.
bool positiveNormalDirection_
Definition: codim0extractor.hh:75