void ConcreteGridView<DuneGridView>::getRawElementDataImpl( arma::Mat<CoordinateType>& vertices, arma::Mat<int>& elementCorners, arma::Mat<char>& auxData) const { typedef typename DuneGridView::Grid DuneGrid; typedef typename DuneGridView::IndexSet DuneIndexSet; const int dimGrid = DuneGrid::dimension; const int dimWorld = DuneGrid::dimensionworld; const int codimVertex = dimGrid; const int codimElement = 0; typedef Dune::LeafMultipleCodimMultipleGeomTypeMapper<DuneGrid, Dune::MCMGElementLayout> DuneElementMapper; typedef typename DuneGridView::template Codim<codimVertex>::Iterator DuneVertexIterator; typedef typename DuneGridView::template Codim<codimElement>::Iterator DuneElementIterator; typedef typename DuneGridView::template Codim<codimVertex>::Geometry DuneVertexGeometry; typedef typename DuneGridView::template Codim<codimElement>::Geometry DuneElementGeometry; typedef typename DuneGrid::ctype ctype; const DuneIndexSet& indexSet = m_dune_gv.indexSet(); vertices.set_size(dimWorld, indexSet.size(codimVertex)); for (DuneVertexIterator it = m_dune_gv.template begin<codimVertex>(); it != m_dune_gv.template end<codimVertex>(); ++it) { size_t index = indexSet.index(*it); const DuneVertexGeometry& geom = it->geometry(); Dune::FieldVector<ctype, dimWorld> vertex = geom.corner(0); for (int i = 0; i < dimWorld; ++i) vertices(i, index) = vertex[i]; } const int MAX_CORNER_COUNT = dimWorld == 2 ? 2 : 4; DuneElementMapper elementMapper(m_dune_gv.grid()); elementCorners.set_size(MAX_CORNER_COUNT, elementMapper.size()); for (DuneElementIterator it = m_dune_gv.template begin<codimElement>(); it != m_dune_gv.template end<codimElement>(); ++it) { size_t index = elementMapper.map(*it); const Dune::GenericReferenceElement<ctype, dimGrid>& refElement = Dune::GenericReferenceElements<ctype, dimGrid>::general(it->type()); const int cornerCount = refElement.size(codimVertex); assert(cornerCount <= MAX_CORNER_COUNT); for (int i = 0; i < cornerCount; ++i) elementCorners(i, index) = indexSet.subIndex(*it, i, codimVertex); for (int i = cornerCount; i < MAX_CORNER_COUNT; ++i) elementCorners(i, index) = -1; } auxData.set_size(0, elementCorners.n_cols); }
int main(int argc, char** argv) { // try { Dune::MPIHelper::instance(argc, argv); typedef Dune::CpGrid Grid; #if 0 std::string dgfString( "DGF\n\nInterval\n0 0 0\n1 1 1\n2 2 2\n#\n" ); std::stringstream dgfStream( dgfString ); Dune::GridPtr< Grid > gridPtr( dgfStream ); Grid &grid = *gridPtr; #else int refinement = 1; Grid grid; std::array<int , 3> dims; std::fill(dims.begin(), dims.end(), 1 << refinement); std::array<double, 3> cell_sz; std::fill(cell_sz.begin(), cell_sz.end(), 1.0 / (1 << refinement)); grid.createCartesian(dims, cell_sz); #endif typedef Grid::LeafGridView GridView; GridView gridView(grid.leafView()); typedef Dune::MultipleCodimMultipleGeomTypeMapper<GridView,ElementLayout> ElementMapper; ElementMapper elementMapper(gridView); typedef GridView::IndexSet IndexSet; const IndexSet& indexSet(gridView.indexSet()); typedef GridView::Codim<0>::Iterator ElementIterator; ElementIterator endEIt = gridView.end<0>(); for (ElementIterator eIt = gridView.begin<0>(); eIt != endEIt; ++eIt) { int mapperIdx = elementMapper.map(*eIt); int indexSetIdx = indexSet.index(*eIt); if (mapperIdx != indexSetIdx) { std::cerr << "Mismatched mapper and indexset indices: " << mapperIdx << " vs. " << indexSetIdx << '\n'; return EXIT_FAILURE; } // std::cout << "mapperIdx = " << mapperIdx << ", indexSetIdx = " << indexSetIdx << std::endl; } return EXIT_SUCCESS; // } // catch (Dune::Exception &e){ // std::cerr << "Dune reported error: " << e << std::endl; // } // catch (...){ // std::cerr << "Unknown exception thrown!" << std::endl; // } return EXIT_FAILURE; }
void ConcreteGridView<DuneGridView>::getRawElementDataImpl( arma::Mat<CoordinateType> &vertices, arma::Mat<int> &elementCorners, arma::Mat<char> &auxData, std::vector<int> *domainIndices) const { typedef typename DuneGridView::Grid DuneGrid; typedef typename DuneGridView::IndexSet DuneIndexSet; const int dimGrid = DuneGrid::dimension; const int dimWorld = DuneGrid::dimensionworld; const int codimVertex = dimGrid; const int codimElement = 0; typedef Dune::LeafMultipleCodimMultipleGeomTypeMapper< DuneGrid, Dune::MCMGElementLayout> DuneElementMapper; typedef typename DuneGridView::template Codim<codimVertex>::Iterator DuneVertexIterator; typedef typename DuneGridView::template Codim<codimElement>::Iterator DuneElementIterator; typedef typename DuneGridView::template Codim<codimVertex>::Geometry DuneVertexGeometry; typedef typename DuneGridView::template Codim<codimElement>::Geometry DuneElementGeometry; typedef typename DuneGrid::ctype ctype; const DuneIndexSet &indexSet = m_dune_gv.indexSet(); vertices.set_size(dimWorld, indexSet.size(codimVertex)); for (DuneVertexIterator it = m_dune_gv.template begin<codimVertex>(); it != m_dune_gv.template end<codimVertex>(); ++it) { size_t index = indexSet.index(*it); const DuneVertexGeometry &geom = it->geometry(); Dune::FieldVector<ctype, dimWorld> vertex = geom.corner(0); for (int i = 0; i < dimWorld; ++i) vertices(i, index) = vertex[i]; } const int MAX_CORNER_COUNT = dimWorld == 2 ? 2 : 4; DuneElementMapper elementMapper(m_dune_gv.grid()); const int elementCount = elementMapper.size(); elementCorners.set_size(MAX_CORNER_COUNT, elementCount); for (DuneElementIterator it = m_dune_gv.template begin<codimElement>(); it != m_dune_gv.template end<codimElement>(); ++it) { size_t index = indexSet.index(*it); const Dune::GenericReferenceElement<ctype, dimGrid> &refElement = Dune::GenericReferenceElements<ctype, dimGrid>::general(it->type()); const int cornerCount = refElement.size(codimVertex); assert(cornerCount <= MAX_CORNER_COUNT); for (int i = 0; i < cornerCount; ++i) elementCorners(i, index) = indexSet.subIndex(*it, i, codimVertex); for (int i = cornerCount; i < MAX_CORNER_COUNT; ++i) elementCorners(i, index) = -1; } auxData.set_size(0, elementCorners.n_cols); if (domainIndices) { // Somewhat inelegant: we perform a second iteration over elements, // this time using the BEM++ interface to Dune. domainIndices->resize(elementCount); std::unique_ptr<EntityIterator<0>> it = this->entityIterator<0>(); const IndexSet &indexSet = this->indexSet(); while (!it->finished()) { const Entity<0> &entity = it->entity(); const int index = indexSet.entityIndex(entity); const int domain = entity.domain(); acc(*domainIndices, index) = domain; it->next(); } } }