From d1c5bbce8a76c8cc88c16ff5ad2303ab03092ff8 Mon Sep 17 00:00:00 2001 From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be> Date: Thu, 11 Oct 2007 13:42:12 +0000 Subject: [PATCH] *** empty log message *** --- Geo/gmshVertex.cpp | 9 +++++ Mesh/meshGFace.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/Geo/gmshVertex.cpp b/Geo/gmshVertex.cpp index 5f137208bb..8d5e7f59df 100644 --- a/Geo/gmshVertex.cpp +++ b/Geo/gmshVertex.cpp @@ -1,4 +1,5 @@ #include "GFace.h" +#include "GEdge.h" #include "gmshVertex.h" #include "Geo.h" #include "GeoInterpolation.h" @@ -10,6 +11,14 @@ SPoint2 gmshVertex::reparamOnFace(GFace *face, int dir) const Surface *s = (Surface*) face->getNativePtr(); if (s->geometry) { + // It is not always right if it is periodic. + if (l_edges.size() == 1 && + (*l_edges.begin())->getBeginVertex() == + (*l_edges.begin())->getEndVertex() ) + { + Range<double> bb = (*l_edges.begin())->parBounds(0); + return (*l_edges.begin())->reparamOnFace ( face, bb.low(), dir); + } return v -> pntOnGeometry; } if (s->Typ == MSH_SURF_REGL){ diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index cb57703bb5..09dd5b2621 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -1,4 +1,4 @@ -// $Id: meshGFace.cpp,v 1.92 2007-10-11 08:59:22 remacle Exp $ +// $Id: meshGFace.cpp,v 1.93 2007-10-11 13:42:12 remacle Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -39,6 +39,91 @@ extern Context_T CTX; static double SCALINGU=1,SCALINGV=1; +void remeshUnrecoveredEdges ( std::set<EdgeToRecover> & edgesNotRecovered, std::list<GFace *> &facesToRemesh) +{ + facesToRemesh.clear(); + deMeshGFace dem; + + std::set<EdgeToRecover>::iterator itr = edgesNotRecovered.begin(); + for ( ; itr != edgesNotRecovered.end() ; ++itr) + { + std::list<GFace*> l_faces = itr->ge->faces(); + // Un-mesh model faces adjacent to the model edge + for ( std::list<GFace*>::iterator it = l_faces.begin() ;it != l_faces.end();++it) + { + if ((*it)->triangles.size() ||(*it)->quadrangles.size()) + { + facesToRemesh.push_back(*it); + dem(*it); + } + } + //----------------------------------------------------- + + + // add a new point in the middle of the intersecting segment + int p1 = itr->p1; + int p2 = itr->p2; + int index = 0; + int N = itr->ge->lines.size(); + GVertex * g1 = itr->ge->getBeginVertex(); + GVertex * g2 = itr->ge->getEndVertex(); + Range<double> bb = itr->ge->parBounds(0); + + std::vector<MLine*> newLines; + + for (int i=0;i<N;i++){ + MVertex *v1 = itr->ge->lines[i]->getVertex(0); + MVertex *v2 = itr->ge->lines[i]->getVertex(1); + if (v1->getNum() == p1 && v2->getNum() == p2 || + v1->getNum() == p2 && v2->getNum() == p1 ) + { + double t1; + double lc1 = -1; + if (v1->onWhat() == g1)t1 = bb.low(); + else if (v1->onWhat() == g2)t1 = bb.high(); + else { + MEdgeVertex * ev1 = (MEdgeVertex*) v1; + lc1 = ev1->getLc(); + v1->getParameter(0,t1); + } + + double t2; + double lc2= -1; + if (v2->onWhat() == g1)t2 = bb.low(); + else if (v2->onWhat() == g2)t2 = bb.high(); + else { + MEdgeVertex * ev2 = (MEdgeVertex*) v2; + lc2 = ev2->getLc(); + v2->getParameter(0,t2); + } + + if (lc1 == -1) + lc1 = BGM_MeshSize(v1->onWhat(),0,0,v1->x(),v1->y(),v1->z()); + if (lc2 == -1) + lc2 = BGM_MeshSize(v2->onWhat(),0,0,v2->x(),v2->y(),v2->z()); + // should be better, i.e. equidistant + double t = 0.5*(t2+t1); + double lc = 0.5*(lc1+lc2); + GPoint V = itr->ge->point(t); + MEdgeVertex * newv = new MEdgeVertex(V.x(), V.y(), V.z(), itr->ge, t, lc); + newLines.push_back(new MLine(v1, newv)); + newLines.push_back(new MLine(newv, v2)); + delete itr->ge->lines[i]; + } + else { + newLines.push_back(itr->ge->lines[i]); + } + } + itr->ge->lines = newLines; + itr->ge->mesh_vertices.clear(); + N = itr->ge->lines.size(); + for (int i=1;i<N;i++){ + itr->ge->mesh_vertices.push_back(itr->ge->lines[i]->getVertex(0)); + } + } +} + + bool AlgoDelaunay2D ( GFace *gf ) { if ( gf->getNativeType() == GEntity::GmshModel && CTX.mesh.algo2d == ALGO_2D_DELAUNAY && gf->geomType() == GEntity::Plane) @@ -834,7 +919,7 @@ bool gmsh2DMeshGenerator ( GFace *gf , bool debug = true) it = emb_edges.begin(); while(it != emb_edges.end()) { - recover_medge ( m, *it, &edgesToRecover, &edgesNotRecovered, 1); + recover_medge ( m, *it, &edgesToRecover, &edgesNotRecovered, 1); ++it; } @@ -854,6 +939,13 @@ bool gmsh2DMeshGenerator ( GFace *gf , bool debug = true) if (edgesNotRecovered.size()) { Msg(GERROR,"%d edges were not recovered on model face %d, gmsh goes back and refines the 1d mesh",edgesNotRecovered.size(),gf->tag()); + // std::list<GFace *> facesToRemesh; + // remeshUnrecoveredEdges ( edgesNotRecovered, facesToRemesh); + delete m; + delete [] U_; + delete [] V_; + // if (facesToRemesh.size() == 0) + // return gmsh2DMeshGenerator (gf,debug); return false; } -- GitLab