8 #ifndef DUNE_GRIDGLUE_MERGING_STANDARDMERGE_HH
9 #define DUNE_GRIDGLUE_MERGING_STANDARDMERGE_HH
22 #include <dune/common/fvector.hh>
23 #include <dune/common/bitsetvector.hh>
24 #include <dune/common/stdstreams.hh>
25 #include <dune/common/timer.hh>
26 #include <dune/common/version.hh>
28 #include <dune/geometry/referenceelements.hh>
29 #include <dune/grid/common/grid.hh>
51 template<
class T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
53 :
public Merger<T,grid1Dim,grid2Dim,dimworld>
125 const std::vector<Dune::FieldVector<T,dimworld> >& grid1ElementCorners,
126 std::bitset<(1<<grid1Dim)>& neighborIntersects1,
127 unsigned int grid1Index,
128 const Dune::GeometryType& grid2ElementType,
129 const std::vector<Dune::FieldVector<T,dimworld> >& grid2ElementCorners,
130 std::bitset<(1<<grid2Dim)>& neighborIntersects2,
131 unsigned int grid2Index,
132 std::vector<RemoteSimplicialIntersection>&
intersections) = 0;
138 const std::vector<Dune::FieldVector<T,dimworld> >& grid1Coords,
139 const std::vector<Dune::GeometryType>& grid1_element_types,
140 std::bitset<(1<<grid1Dim)>& neighborIntersects1,
141 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
142 const std::vector<Dune::GeometryType>& grid2_element_types,
143 std::bitset<(1<<grid2Dim)>& neighborIntersects2,
165 virtual void build(
const std::vector<Dune::FieldVector<T,dimworld> >& grid1_Coords,
166 const std::vector<unsigned int>& grid1_elements,
167 const std::vector<Dune::GeometryType>& grid1_element_types,
168 const std::vector<Dune::FieldVector<T,dimworld> >& grid2_coords,
169 const std::vector<unsigned int>& grid2_elements,
170 const std::vector<Dune::GeometryType>& grid2_element_types
183 purge(intersections_);
184 purge(grid1ElementCorners_);
185 purge(grid2ElementCorners_);
194 static void purge(V & v)
208 unsigned int grid1Parents(
unsigned int idx)
const;
215 unsigned int grid2Parents(
unsigned int idx)
const;
222 unsigned int grid1Parent(
unsigned int idx,
unsigned int parId = 0)
const;
229 unsigned int grid2Parent(
unsigned int idx,
unsigned int parId = 0)
const;
241 Grid1Coords grid1ParentLocal(
unsigned int idx,
unsigned int corner,
unsigned int parId = 0)
const;
250 Grid2Coords grid2ParentLocal(
unsigned int idx,
unsigned int corner,
unsigned int parId = 0)
const;
256 void generateSeed(std::vector<int>& seeds,
257 Dune::BitSetVector<1>& isHandled2,
258 std::stack<unsigned>& candidates2,
259 const std::vector<Dune::FieldVector<T, dimworld> >& grid1Coords,
260 const std::vector<Dune::GeometryType>& grid1_element_types,
261 const std::vector<Dune::FieldVector<T, dimworld> >& grid2Coords,
262 const std::vector<Dune::GeometryType>& grid2_element_types);
267 int insertIntersections(
unsigned int candidate1,
unsigned int candidate2,std::vector<RemoteSimplicialIntersection>&
intersections);
272 int bruteForceSearch(
int candidate1,
273 const std::vector<Dune::FieldVector<T,dimworld> >& grid1Coords,
274 const std::vector<Dune::GeometryType>& grid1_element_types,
275 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
276 const std::vector<Dune::GeometryType>& grid2_element_types);
281 std::pair<bool, unsigned int>
282 intersectionIndex(
unsigned int grid1Index,
unsigned int grid2Index,
288 template <
int gr
idDim>
289 void computeNeighborsPerElement(
const std::vector<Dune::GeometryType>& gridElementTypes,
290 const std::vector<std::vector<unsigned int> >& gridElementCorners,
291 std::vector<std::vector<int> >& elementNeighbors);
297 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
299 const std::vector<Dune::FieldVector<T,dimworld> >& grid1Coords,
300 const std::vector<Dune::GeometryType>& grid1_element_types,
301 std::bitset<(1<<grid1Dim)>& neighborIntersects1,
302 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
303 const std::vector<Dune::GeometryType>& grid2_element_types,
304 std::bitset<(1<<grid2Dim)>& neighborIntersects2,
308 int grid1NumVertices = grid1ElementCorners_[candidate0].size();
309 std::vector<Dune::FieldVector<T,dimworld> > grid1ElementCorners(grid1NumVertices);
310 for (
int i=0; i<grid1NumVertices; i++)
311 grid1ElementCorners[i] = grid1Coords[grid1ElementCorners_[candidate0][i]];
314 int grid2NumVertices = grid2ElementCorners_[candidate1].size();
315 std::vector<Dune::FieldVector<T,dimworld> > grid2ElementCorners(grid2NumVertices);
316 for (
int i=0; i<grid2NumVertices; i++)
317 grid2ElementCorners[i] = grid2Coords[grid2ElementCorners_[candidate1][i]];
327 neighborIntersects1, candidate0,
328 grid2_element_types[candidate1], grid2ElementCorners,
329 neighborIntersects2, candidate1,
333 if(insert && intersections.size() > 0)
334 insertIntersections(candidate0,candidate1,intersections);
337 return (intersections.size() > 0 || neighborIntersects1.any() || neighborIntersects2.any());
341 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
343 const std::vector<Dune::FieldVector<T,dimworld> >& grid1Coords,
344 const std::vector<Dune::GeometryType>& grid1_element_types,
345 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
346 const std::vector<Dune::GeometryType>& grid2_element_types)
348 std::bitset<(1<<grid1Dim)> neighborIntersects1;
349 std::bitset<(1<<grid2Dim)> neighborIntersects2;
350 for (std::size_t i=0; i<grid1_element_types.size(); i++) {
353 grid1Coords, grid1_element_types, neighborIntersects1,
354 grid2Coords, grid2_element_types, neighborIntersects2,
358 if (intersectionFound)
367 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
368 template<
int gr
idDim>
371 const std::vector<std::vector<unsigned int> >& gridElementCorners,
372 std::vector<std::vector<int> >& elementNeighbors)
374 typedef std::vector<unsigned int> FaceType;
375 typedef std::map<FaceType, std::pair<unsigned int, unsigned int> > FaceSetType;
381 elementNeighbors.resize(gridElementTypes.size());
383 for (
size_t i=0; i<gridElementTypes.size(); i++)
384 #
if DUNE_VERSION_NEWER(DUNE_GEOMETRY,2,3)
385 elementNeighbors[i].resize(Dune::ReferenceElements<T,gridDim>::general(gridElementTypes[i]).size(1), -1);
387 elementNeighbors[i].resize(Dune::GenericReferenceElements<T,gridDim>::general(gridElementTypes[i]).size(1), -1);
390 for (
size_t i=0; i<gridElementTypes.size(); i++) {
392 #if DUNE_VERSION_NEWER(DUNE_GEOMETRY,2,3)
393 const Dune::ReferenceElement<T,gridDim>& refElement = Dune::ReferenceElements<T,gridDim>::general(gridElementTypes[i]);
395 const Dune::GenericReferenceElement<T,gridDim>& refElement = Dune::GenericReferenceElements<T,gridDim>::general(gridElementTypes[i]);
398 for (
size_t j=0; j<(size_t)refElement.size(1); j++) {
402 for (
size_t k=0; k<(size_t)refElement.size(j,1,gridDim); k++)
403 face.push_back(gridElementCorners[i][refElement.subEntity(j,1,k,gridDim)]);
406 std::sort(face.begin(), face.end());
408 typename FaceSetType::iterator faceHandle = faces.find(face);
410 if (faceHandle == faces.end()) {
413 faces.insert(std::make_pair(face, std::make_pair(i,j)));
418 elementNeighbors[i][j] = faceHandle->second.first;
419 elementNeighbors[faceHandle->second.first][faceHandle->second.second] = i;
421 faces.erase(faceHandle);
435 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
437 const std::vector<unsigned int>& grid1_elements,
438 const std::vector<Dune::GeometryType>& grid1_element_types,
439 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
440 const std::vector<unsigned int>& grid2_elements,
441 const std::vector<Dune::GeometryType>& grid2_element_types
445 std::cout <<
"StandardMerge building merged grid..." << std::endl;
450 intersections_.clear();
460 grid1ElementCorners_.resize(grid1_element_types.size());
462 unsigned int grid1CornerCounter = 0;
464 for (std::size_t i=0; i<grid1_element_types.size(); i++) {
467 #if DUNE_VERSION_NEWER(DUNE_GEOMETRY,2,3)
468 int numVertices = Dune::ReferenceElements<T,grid1Dim>::general(grid1_element_types[i]).size(grid1Dim);
470 int numVertices = Dune::GenericReferenceElements<T,grid1Dim>::general(grid1_element_types[i]).size(grid1Dim);
472 grid1ElementCorners_[i].resize(numVertices);
473 for (
int j=0; j<numVertices; j++)
474 grid1ElementCorners_[i][j] = grid1_elements[grid1CornerCounter++];
479 grid2ElementCorners_.resize(grid2_element_types.size());
481 unsigned int grid2CornerCounter = 0;
483 for (std::size_t i=0; i<grid2_element_types.size(); i++) {
486 #if DUNE_VERSION_NEWER(DUNE_GEOMETRY,2,3)
487 int numVertices = Dune::ReferenceElements<T,grid2Dim>::general(grid2_element_types[i]).size(grid2Dim);
489 int numVertices = Dune::GenericReferenceElements<T,grid2Dim>::general(grid2_element_types[i]).size(grid2Dim);
491 grid2ElementCorners_[i].resize(numVertices);
492 for (
int j=0; j<numVertices; j++)
493 grid2ElementCorners_[i][j] = grid2_elements[grid2CornerCounter++];
504 std::cout <<
"setup took " << watch.elapsed() <<
" seconds." << std::endl;
510 std::stack<unsigned int> candidates1;
511 std::stack<unsigned int> candidates2;
513 std::vector<int> seeds(grid2_element_types.size(), -1);
521 Dune::BitSetVector<1> isHandled2(grid2_element_types.size());
524 Dune::BitSetVector<1> isCandidate2(grid2_element_types.size());
526 generateSeed(seeds, isHandled2, candidates2, grid1Coords, grid1_element_types, grid2Coords, grid2_element_types);
532 std::set<unsigned int> isHandled1;
534 std::set<unsigned int> isCandidate1;
536 while (!candidates2.empty()) {
539 unsigned int currentCandidate2 = candidates2.top();
540 int seed = seeds[currentCandidate2];
544 isHandled2[currentCandidate2] =
true;
548 candidates1.push(seed);
551 isCandidate1.clear();
553 while (!candidates1.empty()) {
555 unsigned int currentCandidate1 = candidates1.top();
557 isHandled1.insert(currentCandidate1);
560 std::bitset<(1<<grid1Dim)> neighborIntersects1;
561 std::bitset<(1<<grid2Dim)> neighborIntersects2;
563 grid1Coords,grid1_element_types, neighborIntersects1,
564 grid2Coords,grid2_element_types, neighborIntersects2);
566 for (
size_t i=0; i<neighborIntersects2.size(); i++)
567 if (neighborIntersects2[i] && elementNeighbors2_[currentCandidate2][i] != -1)
568 seeds[elementNeighbors2_[currentCandidate2][i]] = currentCandidate1;
571 if (intersectionFound) {
573 for (
size_t i=0; i<elementNeighbors1_[currentCandidate1].size(); i++) {
575 int neighbor = elementNeighbors1_[currentCandidate1][i];
580 if (isHandled1.find(neighbor) == isHandled1.end()
581 && isCandidate1.find(neighbor) == isCandidate1.end()) {
582 candidates1.push(neighbor);
583 isCandidate1.insert(neighbor);
597 bool seedFound = !candidates2.empty();
598 for (
size_t i=0; i<elementNeighbors2_[currentCandidate2].size(); i++) {
600 int neighbor = elementNeighbors2_[currentCandidate2][i];
606 if (!isHandled2[neighbor][0] && !isCandidate2[neighbor][0] && seeds[neighbor]>-1) {
608 isCandidate2[neighbor][0] =
true;
609 candidates2.push(neighbor);
619 for (
size_t i=0; i<elementNeighbors2_[currentCandidate2].size(); i++) {
621 int neighbor = elementNeighbors2_[currentCandidate2][i];
626 if (!isHandled2[neighbor][0] && !isCandidate2[neighbor][0]) {
633 for (
typename std::set<unsigned int>::iterator seedIt = isHandled1.begin();
634 seedIt != isHandled1.end(); ++seedIt) {
636 std::bitset<(1<<grid1Dim)> neighborIntersects1;
637 std::bitset<(1<<grid2Dim)> neighborIntersects2;
639 grid1Coords, grid1_element_types, neighborIntersects1,
640 grid2Coords, grid2_element_types, neighborIntersects2,
644 if (intersectionFound) {
646 Dune::dwarn <<
"Algorithm entered first fallback method and found a new seed in the build algorithm." <<
647 "Probably, the neighborIntersects bitsets computed in computeIntersection specialization is wrong." << std::endl;
656 seed = bruteForceSearch(neighbor,
657 grid1Coords,grid1_element_types,
658 grid2Coords,grid2_element_types);
659 Dune::dwarn <<
"Algorithm entered second fallback method. This probably should not happen." << std::endl;
664 isCandidate2[neighbor] =
true;
671 candidates2.push(neighbor);
672 seeds[neighbor] = seed;
682 if (!seedFound && candidates2.empty()) {
683 generateSeed(seeds, isHandled2, candidates2, grid1Coords, grid1_element_types, grid2Coords, grid2_element_types);
688 std::cout <<
"intersection construction took " << watch.elapsed() <<
" seconds." << std::endl;
692 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
696 return intersections_.size();
699 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
703 return (intersections_[idx].grid1Entities_).size();
706 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
710 return (intersections_[idx].grid2Entities_).size();
714 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
718 return intersections_[idx].grid1Entities_[parId];
722 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
726 return intersections_[idx].grid2Entities_[parId];
730 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
734 return intersections_[idx].grid1Local_[parId][corner];
738 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
742 return intersections_[idx].grid2Local_[parId][corner];
745 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
746 void StandardMerge<T,grid1Dim,grid2Dim,dimworld>::generateSeed(std::vector<int>& seeds, Dune::BitSetVector<1>& isHandled2, std::stack<unsigned>& candidates2,
const std::vector<Dune::FieldVector<T, dimworld> >& grid1Coords,
const std::vector<Dune::GeometryType>& grid1_element_types,
const std::vector<Dune::FieldVector<T, dimworld> >& grid2Coords,
const std::vector<Dune::GeometryType>& grid2_element_types)
748 for (std::size_t j=0; j<grid2_element_types.size(); j++) {
750 if (seeds[j] > 0 || isHandled2[j][0])
753 int seed = bruteForceSearch(j,grid1Coords,grid1_element_types,grid2Coords,grid2_element_types);
760 isHandled2[j] =
true;
764 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
768 typedef typename std::vector<RemoteSimplicialIntersection>::size_type size_t;
771 for (
size_t i = 0; i < intersections.size(); ++i) {
775 std::tie(found, index) = intersectionIndex(candidate1,candidate2,intersections[i]);
777 if (found && index >= this->intersections_.size()) {
778 this->intersections_.push_back(intersections[i]);
783 for (
size_t j = 0; j < intersections[i].grid1Entities_.size(); ++j) {
784 this->intersections_[index].grid1Entities_.push_back(candidate1);
785 this->intersections_[index].grid1Local_.push_back(intersections[i].grid1Local_[j]);
789 for (
size_t j = 0; j < intersections[i].grid2Entities_.size(); ++j) {
790 this->intersections_[index].grid2Entities_.push_back(candidate2);
791 this->intersections_[index].grid2Local_.push_back(intersections[i].grid2Local_[j]);
796 Dune::dwarn <<
"Computed the same intersection twice!" << std::endl;
802 template<
typename T,
int gr
id1Dim,
int gr
id2Dim,
int dimworld>
803 std::pair<bool, unsigned int>
805 RemoteSimplicialIntersection& intersection) {
811 std::size_t n_intersections = this->intersections_.size();
812 if (grid1Dim == grid2Dim)
813 return {
true, n_intersections};
817 for (std::size_t i = 0; i < n_intersections; ++i) {
820 for (std::size_t ei = 0; ei < this->intersections_[i].grid1Entities_.size(); ++ei)
822 if (this->intersections_[i].grid1Entities_[ei] == grid1Index)
824 for (std::size_t er = 0; er < intersection.grid1Entities_.size(); ++er)
826 bool found_all =
true;
828 for (std::size_t ci = 0; ci < this->intersections_[i].grid1Local_[ei].size(); ++ci)
830 Dune::FieldVector<T,grid1Dim> ni = this->intersections_[i].grid1Local_[ei][ci];
831 bool found_ni =
false;
832 for (std::size_t cr = 0; cr < intersection.grid1Local_[er].size(); ++cr)
834 Dune::FieldVector<T,grid1Dim> nr = intersection.grid1Local_[er][cr];
836 found_ni = found_ni || ((ni-nr).infinity_norm() < eps);
840 found_all = found_all && found_ni;
846 if (found_all && (this->intersections_[i].grid2Entities_[ei] != grid2Index))
855 for (std::size_t ei = 0; ei < this->intersections_[i].grid2Entities_.size(); ++ei)
857 if (this->intersections_[i].grid2Entities_[ei] == grid2Index)
859 for (std::size_t er = 0; er < intersection.grid2Entities_.size(); ++er)
861 bool found_all =
true;
863 for (std::size_t ci = 0; ci < this->intersections_[i].grid2Local_[ei].size(); ++ci)
865 Dune::FieldVector<T,grid2Dim> ni = this->intersections_[i].grid2Local_[ei][ci];
866 bool found_ni =
false;
867 for (std::size_t cr = 0; cr < intersection.grid2Local_[er].size(); ++cr)
869 Dune::FieldVector<T,grid2Dim> nr = intersection.grid2Local_[er][cr];
870 found_ni = found_ni || ((ni-nr).infinity_norm() < eps);
875 found_all = found_all && found_ni;
881 if (found_all && (this->intersections_[i].grid1Entities_[ei] != grid1Index))
890 return {
true, n_intersections};
894 #define STANDARD_MERGE_INSTANTIATE(T,A,B,C) \
896 void StandardMerge<T,A,B,C>::build(const std::vector<Dune::FieldVector<T,C> >& grid1Coords, \
897 const std::vector<unsigned int>& grid1_elements, \
898 const std::vector<Dune::GeometryType>& grid1_element_types, \
899 const std::vector<Dune::FieldVector<T,C> >& grid2Coords, \
900 const std::vector<unsigned int>& grid2_elements, \
901 const std::vector<Dune::GeometryType>& grid2_element_types \
907 #undef STANDARD_MERGE_INSTANTIATE
910 #endif // DUNE_GRIDGLUE_MERGING_STANDARDMERGE_HH
Dune::FieldVector< T, dimworld > WorldCoords
the coordinate type used in this interface
Definition: standardmerge.hh:70
unsigned int nSimplices() const
get the number of simplices in the merged grid The indices are then in 0..nSimplices()-1 ...
Definition: standardmerge.hh:693
std::vector< std::vector< unsigned int > > grid1ElementCorners_
Temporary internal data.
Definition: standardmerge.hh:152
RemoteSimplicialIntersection(int grid1Entity, int grid2Entity)
Constructor for two given entity indices.
Definition: standardmerge.hh:96
#define STANDARD_MERGE_INSTANTIATE(T, A, B, C)
Definition: standardmerge.hh:894
Definition: standardmerge.hh:81
bool computeIntersection(unsigned int candidate0, unsigned int candidate1, const std::vector< Dune::FieldVector< T, dimworld > > &grid1Coords, const std::vector< Dune::GeometryType > &grid1_element_types, std::bitset<(1<< grid1Dim)> &neighborIntersects1, const std::vector< Dune::FieldVector< T, dimworld > > &grid2Coords, const std::vector< Dune::GeometryType > &grid2_element_types, std::bitset<(1<< grid2Dim)> &neighborIntersects2, bool insert=true)
Compute the intersection between two overlapping elements.
Definition: standardmerge.hh:298
IteratorRange<...> intersections(const GridGlue<...> &glue, const Reverse<...> &reverse=!reversed)
Iterate over all intersections of a GridGlue.
Common base class for many merger implementations: produce pairs of entities that may intersect...
Definition: standardmerge.hh:52
std::vector< std::array< Dune::FieldVector< T, grid2Dim >, nVertices > > grid2Local_
Definition: standardmerge.hh:111
std::vector< std::vector< unsigned int > > grid2ElementCorners_
Definition: standardmerge.hh:153
void clear()
Definition: standardmerge.hh:180
Definition: standardmerge.hh:78
std::vector< std::vector< int > > elementNeighbors1_
Definition: standardmerge.hh:155
Abstract base for all classes that take extracted grids and build sets of intersections.
Definition: merger.hh:13
Merger< T, grid1Dim, grid2Dim, dimworld >::Grid2Coords Grid2Coords
Type used for local coordinates on the grid2 side.
Definition: standardmerge.hh:67
unsigned int counter
Counts the number of times the computeIntersection method has been called.
Definition: merger.hh:192
std::vector< std::array< Dune::FieldVector< T, grid1Dim >, nVertices > > grid1Local_
Definition: standardmerge.hh:108
std::vector< RemoteSimplicialIntersection > intersections_
The computed intersections.
Definition: standardmerge.hh:149
T ctype
the numeric type used in this interface
Definition: standardmerge.hh:61
Merger< T, grid1Dim, grid2Dim, dimworld >::Grid1Coords Grid1Coords
Type used for local coordinates on the grid1 side.
Definition: standardmerge.hh:64
std::vector< std::vector< int > > elementNeighbors2_
Definition: standardmerge.hh:156
StandardMerge()
Definition: standardmerge.hh:76
RemoteSimplicialIntersection()
Default constructor.
Definition: standardmerge.hh:87
virtual void build(const std::vector< Dune::FieldVector< T, dimworld > > &grid1_Coords, const std::vector< unsigned int > &grid1_elements, const std::vector< Dune::GeometryType > &grid1_element_types, const std::vector< Dune::FieldVector< T, dimworld > > &grid2_coords, const std::vector< unsigned int > &grid2_elements, const std::vector< Dune::GeometryType > &grid2_element_types)
builds the merged grid
Definition: standardmerge.hh:436
virtual void computeIntersections(const Dune::GeometryType &grid1ElementType, const std::vector< Dune::FieldVector< T, dimworld > > &grid1ElementCorners, std::bitset<(1<< grid1Dim)> &neighborIntersects1, unsigned int grid1Index, const Dune::GeometryType &grid2ElementType, const std::vector< Dune::FieldVector< T, dimworld > > &grid2ElementCorners, std::bitset<(1<< grid2Dim)> &neighborIntersects2, unsigned int grid2Index, std::vector< RemoteSimplicialIntersection > &intersections)=0
Compute the intersection between two overlapping elements.
Definition: standardmerge.hh:84
std::vector< unsigned int > grid1Entities_
Definition: standardmerge.hh:114
bool valid
Definition: standardmerge.hh:74
std::vector< unsigned int > grid2Entities_
Definition: standardmerge.hh:116