std::vector<int> dfs(const int triangles[][3], int triangles_count, int start_tri, int end_tri) { std::vector<int> triangles_list; bool *visited = new bool[triangles_count]; int *parent = new int[triangles_count]; memset(visited, false, triangles_count * sizeof(bool)); memset(parent, -1, triangles_count * sizeof(int)); std::stack<int> s; s.push(start_tri); while (!s.empty()) { int v = s.top(); s.pop(); if (!visited[v]) { visited[v] = true; for (int u = 0; u < triangles_count; u++) if (neighbor_triangles(triangles, triangles_count, v, u) && !visited[u]) { s.push(u); parent[u] = v; } } if (parent[end_tri] != -1) break; } int p = end_tri; while (parent[p] != -1) { triangles_list.push_back(p); p = parent[p]; } triangles_list.push_back(start_tri); std::reverse(triangles_list.begin(), triangles_list.end()); delete[] visited; delete[] parent; return triangles_list; }
void fill_triangle_contacts(MeshT const & mesh) { typedef typename viennagrid::result_of::element<MeshT>::type ElementType; typedef typename viennagrid::result_of::region<MeshT>::type RegionType; typedef typename viennagrid::result_of::id<RegionType>::type RegionIDType; typedef typename viennagrid::result_of::region_range<MeshT>::type RegionRangeType; typedef typename viennagrid::result_of::iterator<RegionRangeType>::type RegionRangeIterator; RegionRangeType regions(mesh); std::vector<RegionIDType> region_contacts; for (RegionRangeIterator rit = regions.begin(); rit != regions.end(); ++rit) { if ( (*rit).get_name().find("_contact") != std::string::npos ) region_contacts.push_back( (*rit).id() ); } typedef typename viennagrid::result_of::element_range<RegionType>::type ElementRangeType; typedef typename viennagrid::result_of::iterator<ElementRangeType>::type ElementRangeIterator; for (std::size_t i = 0; i != region_contacts.size(); ++i) { RegionType region = mesh.get_region( region_contacts[i] ); ElementRangeType triangles(region, 2); std::set< std::vector<ElementType> > new_triangles; for (ElementRangeIterator tit = triangles.begin(); tit != triangles.end(); ++tit) { typedef typename viennagrid::result_of::neighbor_range<RegionType>::type NeighborElementRangeType; typedef typename viennagrid::result_of::iterator<NeighborElementRangeType>::type NeighborElementRangeIterator; NeighborElementRangeType neighbor_triangles(region, *tit, 0, 2); for (NeighborElementRangeIterator ntit = neighbor_triangles.begin(); ntit != neighbor_triangles.end(); ++ntit) { std::vector<ElementType> triangle(3); ElementType shared_vertex; for (int i = 0; i != 3; ++i) for (int j = 0; j != 3; ++j) { if ( viennagrid::vertices(*tit)[i] == viennagrid::vertices(*ntit)[j] ) triangle[0] = viennagrid::vertices(*tit)[i]; } // ElementType vertex_t; for (int i = 0; i != 3; ++i) { if (viennagrid::regions(viennagrid::vertices(*tit)[i]).size() == 1) triangle[1] = viennagrid::vertices(*tit)[i]; } // ElementType vertex_nt; for (int i = 0; i != 3; ++i) { if (viennagrid::regions(viennagrid::vertices(*ntit)[i]).size() == 1) triangle[2] = viennagrid::vertices(*ntit)[i]; } std::sort( triangle.begin(), triangle.end() ); new_triangles.insert(triangle); // ElementType triangle = viennagrid::make_triangle( region, shared_vertex, vertex_t, vertex_nt ); } } for (typename std::set< std::vector<ElementType> >::iterator it = new_triangles.begin(); it != new_triangles.end(); ++it) viennagrid::make_triangle( region, (*it)[0], (*it)[1], (*it)[2] ); } }