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); }
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(); } } }