void CopySubsetIndicesToSides(ISubsetHandler& sh, TIterator elemsBegin, TIterator elemsEnd, bool toUnassignedOnly) { typedef typename PtrToValueType<typename TIterator::value_type>::base_type TElem; typedef typename TElem::side TSide; if(!TElem::HAS_SIDES) return; UG_ASSERT(sh.grid(), "No grid assigned to subset-handler"); Grid& grid = *sh.grid(); typename Grid::traits<TSide>::secure_container sides; for(TIterator iter = elemsBegin; iter != elemsEnd; ++iter){ TElem* e = *iter; int si = sh.get_subset_index(e); grid.associated_elements(sides, e); for(size_t i = 0; i < sides.size(); ++i){ TSide* s = sides[i]; if(toUnassignedOnly){ if(sh.get_subset_index(s) == -1) sh.assign_subset(s, si); } else sh.assign_subset(s, si); } } }
void CopyGridLevel(MultiGrid& srcMG, Grid& destGrid, ISubsetHandler& srcSH, ISubsetHandler& destSH, int lvl, TAPos aPos) { Grid::VertexAttachmentAccessor<TAPos> aaPos(destGrid, aPos); Grid::VertexAttachmentAccessor<TAPos> aaSrcPos(srcMG, aPos); GridObjectCollection goc = srcMG.get_grid_objects(); AVertex aNewVrt; srcMG.attach_to_vertices(aNewVrt); Grid::VertexAttachmentAccessor<AVertex> aaNewVrt(srcMG, aNewVrt); for(int si = destSH.num_subsets(); si < srcSH.num_subsets(); ++si) { destSH.subset_info(si) = srcSH.subset_info(si); } for(VertexIterator vrtIter = goc.begin<Vertex>(lvl); vrtIter != goc.end<Vertex>(lvl); ++vrtIter) { Vertex* srcVrt = *vrtIter; Vertex* destVrt = *destGrid.create_by_cloning(srcVrt); aaNewVrt[srcVrt] = destVrt; aaPos[destVrt] = aaSrcPos[srcVrt]; destSH.assign_subset(destVrt, srcSH.get_subset_index(srcVrt)); } CopyGridLevelElements<Edge>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); CopyGridLevelElements<Face>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); CopyGridLevelElements<Volume>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); srcMG.detach_from_vertices(aNewVrt); }
void AssignAssociatedVerticesToSubset(ISubsetHandler& sh, TIterator elemsBegin, TIterator elemsEnd, int subsetIndex) { // iterate through the elements for(;elemsBegin != elemsEnd; elemsBegin++) { typename TIterator::value_type elem = *elemsBegin; uint numVrts = elem->num_vertices(); // iterate through the vertices of elem and assign them for(uint i = 0; i < numVrts; ++i) sh.assign_subset(elem->vertex(i), subsetIndex); } }
void CopyGridLevelElements(MultiGrid& srcMG, Grid& destGrid, ISubsetHandler& srcSH, ISubsetHandler& destSH, int lvl, AVertex& aNewVrt) { Grid::VertexAttachmentAccessor<AVertex> aaNewVrt(srcMG, aNewVrt); GridObjectCollection goc = srcMG.get_grid_objects(); CustomVertexGroup vrts; typedef typename Grid::traits<TElem>::iterator iter_t; for(iter_t eIter = goc.begin<TElem>(lvl); eIter != goc.end<TElem>(lvl); ++eIter) { TElem* e = *eIter; vrts.resize(e->num_vertices()); for(size_t iv = 0; iv < e->num_vertices(); ++iv) { vrts.set_vertex(iv, aaNewVrt[e->vertex(iv)]); } TElem* ne = *destGrid.create_by_cloning(e, vrts); destSH.assign_subset(ne, srcSH.get_subset_index(e)); } }