Skip to content
Snippets Groups Projects
Commit 2df4856e authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

fix recombine with embedded edges
parent e74094b6
Branches
Tags
No related merge requests found
...@@ -65,7 +65,7 @@ void buidMeshGenerationDataStructures(GFace *gf, std::set<MTri3*, compareTri3Ptr ...@@ -65,7 +65,7 @@ void buidMeshGenerationDataStructures(GFace *gf, std::set<MTri3*, compareTri3Ptr
std::list<GVertex*>::iterator itvx = emb_vertx.begin(); std::list<GVertex*>::iterator itvx = emb_vertx.begin();
while(itvx != emb_vertx.end()){ while(itvx != emb_vertx.end()){
MVertex *v = *((*itvx)->mesh_vertices.begin()); MVertex *v = *((*itvx)->mesh_vertices.begin());
vSizesMap[v] = std::min(vSizesMap[v],(*itvx)->prescribedMeshSizeAtVertex()); vSizesMap[v] = std::min(vSizesMap[v], (*itvx)->prescribedMeshSizeAtVertex());
++itvx; ++itvx;
} }
} }
...@@ -132,10 +132,10 @@ void buildVertexToTriangle(std::vector<MTriangle*> &eles, v2t_cont &adj) ...@@ -132,10 +132,10 @@ void buildVertexToTriangle(std::vector<MTriangle*> &eles, v2t_cont &adj)
} }
template <class T> template <class T>
void buildEdgeToElement(std::vector<T*> &triangles, e2t_cont &adj) void buildEdgeToElement(std::vector<T*> &elements, e2t_cont &adj)
{ {
for (unsigned int i = 0; i < triangles.size(); i++){ for (unsigned int i = 0; i < elements.size(); i++){
T *t = triangles[i]; T *t = elements[i];
for (int j = 0; j < t->getNumEdges(); j++){ for (int j = 0; j < t->getNumEdges(); j++){
MEdge e = t->getEdge(j); MEdge e = t->getEdge(j);
e2t_cont::iterator it = adj.find(e); e2t_cont::iterator it = adj.find(e);
...@@ -143,10 +143,9 @@ void buildEdgeToElement(std::vector<T*> &triangles, e2t_cont &adj) ...@@ -143,10 +143,9 @@ void buildEdgeToElement(std::vector<T*> &triangles, e2t_cont &adj)
std::pair<MElement*, MElement*> one = std::make_pair(t, (MElement*)0); std::pair<MElement*, MElement*> one = std::make_pair(t, (MElement*)0);
adj[e] = one; adj[e] = one;
} }
else else{
{ it->second.second = t;
it->second.second = t; }
}
} }
} }
} }
...@@ -807,19 +806,39 @@ struct recombine_triangle ...@@ -807,19 +806,39 @@ struct recombine_triangle
static void _gmshRecombineIntoQuads(GFace *gf) static void _gmshRecombineIntoQuads(GFace *gf)
{ {
std::set<MVertex*> emb_edgeverts;
{
std::list<GEdge*> emb_edges = gf->embeddedEdges();
std::list<GEdge*>::iterator ite = emb_edges.begin();
while(ite != emb_edges.end()){
if(!(*ite)->isMeshDegenerated()){
emb_edgeverts.insert((*ite)->mesh_vertices.begin(),
(*ite)->mesh_vertices.end() );
emb_edgeverts.insert((*ite)->getBeginVertex()->mesh_vertices.begin(),
(*ite)->getBeginVertex()->mesh_vertices.end());
emb_edgeverts.insert((*ite)->getEndVertex()->mesh_vertices.begin(),
(*ite)->getEndVertex()->mesh_vertices.end());
}
++ite;
}
}
e2t_cont adj; e2t_cont adj;
std::set<MElement*> touched;
std::set<recombine_triangle> pairs;
buildEdgeToElement(gf->triangles, adj); buildEdgeToElement(gf->triangles, adj);
e2t_cont::iterator it = adj.begin();
for ( ; it!= adj.end(); ++it){ std::set<recombine_triangle> pairs;
if (it->second.second && it->second.first->getNumVertices() == 3 && for (e2t_cont::iterator it = adj.begin(); it!= adj.end(); ++it){
it->second.second->getNumVertices() == 3) if (it->second.second &&
it->second.first->getNumVertices() == 3 &&
it->second.second->getNumVertices() == 3 &&
(emb_edgeverts.find(it->first.getVertex(0)) == emb_edgeverts.end() ||
emb_edgeverts.find(it->first.getVertex(1)) == emb_edgeverts.end()))
pairs.insert(recombine_triangle(it->first, pairs.insert(recombine_triangle(it->first,
it->second.first, it->second.first,
it->second.second)); it->second.second));
} }
std::set<MElement*> touched;
std::set<recombine_triangle>::iterator itp = pairs.begin(); std::set<recombine_triangle>::iterator itp = pairs.begin();
while(itp != pairs.end()){ while(itp != pairs.end()){
// recombine if difference between max quad angle and right // recombine if difference between max quad angle and right
...@@ -868,9 +887,9 @@ static void _gmshRecombineIntoQuads(GFace *gf) ...@@ -868,9 +887,9 @@ static void _gmshRecombineIntoQuads(GFace *gf)
void gmshRecombineIntoQuads(GFace *gf) void gmshRecombineIntoQuads(GFace *gf)
{ {
_gmshRecombineIntoQuads(gf); _gmshRecombineIntoQuads(gf);
laplaceSmoothing(gf); laplaceSmoothing(gf);
_gmshRecombineIntoQuads(gf); _gmshRecombineIntoQuads(gf);
laplaceSmoothing(gf); laplaceSmoothing(gf);
_gmshRecombineIntoQuads(gf); _gmshRecombineIntoQuads(gf);
laplaceSmoothing(gf); laplaceSmoothing(gf);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment