void AssignAssociatedVerticesToSubsets(TSubsetHandler& sh, const ISubsetHandler& srcIndHandler) { typedef typename geometry_traits<TElem>::const_iterator iterator; for(size_t l = 0; l < sh.num_levels(); ++l){ for(int si = 0; si < sh.num_subsets(); ++si){ for(iterator iter = sh.template begin<TElem>(si, l); iter != sh.template end<TElem>(si, l); ++iter) { TElem* e = *iter; for(size_t i = 0; i < e->num_vertices(); ++i) { Vertex* vrt = e->vertex(i); sh.assign_subset(vrt, srcIndHandler.get_subset_index(vrt)); } } } } }
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)); } }
void SeparateSubsetsByLowerDimSeparators(Grid& grid, SubsetHandler& sh, bool appendAtEnd, boost::function<bool (typename TElem::lower_dim_base_object*)> cbIsSeparator) { using namespace std; // the element type of separating elements typedef typename TElem::lower_dim_base_object TSide; // assign all elements to subset -1 sh.assign_subset(grid.begin<TElem>(), grid.end<TElem>(), -1); // we'll keep all unassigned volumes in a selector. Selector sel(grid); sel.select(grid.begin<TElem>(), grid.end<TElem>()); // those vectors will be used to gather element neighbours. vector<TSide*> vSides; vector<TElem*> vElems; // this stack contains all volumes that we still have to check for neighbours. stack<TElem*> stkElems; // now - while there are unassigned elements. int subsetIndex = 0; if(appendAtEnd) subsetIndex = sh.num_subsets(); while(!sel.empty()) { // choose the element with which we want to start // TODO: if material-points are supplied, this should be the // the element that contains the i-th material point. stkElems.push(*sel.begin<TElem>()); while(!stkElems.empty()) { TElem* elem = stkElems.top(); stkElems.pop(); // if the volume is unselected it has already been processed. if(!sel.is_selected(elem)) continue; sel.deselect(elem); // assign elem to its new subset sh.assign_subset(elem, subsetIndex); // check neighbour-elements, whether they belong to the same subset. // iterate through the sides of the element for(uint i = 0; i < elem->num_sides(); ++i) { // get the i-th side TSide* side = grid.get_side(elem, i); // check whether the side is regarded as a separator. // If not, we'll add all associated elements. if(!cbIsSeparator(side)) { CollectAssociated(vElems, grid, side); // add all elements that are still selected (elem is not selected anymore). for(uint j = 0; j < vElems.size(); ++j) { if(sel.is_selected(vElems[j])) stkElems.push(vElems[j]); } } } } // the stack is empty. increase subset index. subsetIndex++; } }