diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index ddec9f76ac1364280afe718ee1c45d0152db61ae..68295e6da7e23aab51aec931325452a8c26c34bc 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -18,6 +18,7 @@ #include "GaussLegendre1D.h" #include "Context.h" #include "OS.h" +#include "discreteFace.h" #if defined(HAVE_MESH) #include "meshGFace.h" @@ -1376,26 +1377,65 @@ bool GFace::fillPointCloud(double maxDist, return true; } + +#if defined(HAVE_MESH) +static void meshCompound (GFace* gf, bool verbose) { + + discreteFace *df = new discreteFace (gf->model(), gf->tag() + 100000); + + std::set<int> ec; + for (unsigned int i=0;i<gf->_compound.size();i++){ + GFace *c = (GFace*)gf->_compound[i]; + std::list<GEdge*> edges = c->edges(); + for (std::list<GEdge*> :: iterator it = edges.begin() ; it != edges.end(); ++it){ + std::set<int>::iterator found = ec.find((*it)->tag()); + if (found == ec.end())ec.insert((*it)->tag()); + else ec.erase(found); + } + df->triangles.insert(df->triangles.begin(), c->triangles.begin(),c->triangles.end()); + df->mesh_vertices.insert(df->mesh_vertices.begin(), c->mesh_vertices.begin(),c->mesh_vertices.end()); + c->triangles.clear(); + c->mesh_vertices.clear(); + } + std::vector<int> cedges; + cedges.insert(cedges.begin(), ec.begin(), ec.end()); + df->setBoundEdges(gf->model(), cedges); + df->createGeometry(); + df->mesh(verbose); + gf->triangles = df->triangles; + for (unsigned int i=0;i<df->mesh_vertices.size();i++){ + MVertex *v = df->mesh_vertices[i]; + v->setEntity(gf); + gf->mesh_vertices.push_back(v); + } + df->triangles.clear(); + df->mesh_vertices.clear(); + + delete df; +} +#endif + void GFace::mesh(bool verbose) { #if defined(HAVE_MESH) meshGFace mesher; mesher(this, verbose); - - /* if (!_compound.empty()){ // Some faces are meshed together if (_compound[0] == this){ // I'm the one that makes the compound job bool ok = true; - for (unsigned int i=0;i<_compound.size();i++) - ok &= (_compound[i]->meshStatistics.status == GFace::PENDING); + for (unsigned int i=0;i<_compound.size();i++){ + GFace *gf = (GFace*)_compound[i]; + ok &= (gf->meshStatistics.status == GFace::DONE); + } if (!ok)meshStatistics.status = GFace::PENDING; else { + meshCompound(this, verbose); return; } } } - */ + #endif } diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp index 95632f6046b3f733d3b2d885fbc0f471fc195473..11693baf264644ded75773dbc0672d3901628ada 100644 --- a/Geo/discreteDiskFace.cpp +++ b/Geo/discreteDiskFace.cpp @@ -226,20 +226,6 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int _order = p; _N = (p+1)*(p+2)/2; - int tagElementOrder; - switch (_order){ - case 1: - tagElementOrder = MSH_TRI_3; - break; - case 2: - tagElementOrder = MSH_TRI_6; - break; - default: - tagElementOrder = -1; - Msg::Error("discreteDiskFace:: only p=1 or p=2 allowed"); - } - //mynodalbasis = BasisFactory::getNodalBasis(tagElementOrder); - std::map<MVertex*,MVertex*> v2v;// mesh vertex |-> face vertex std::map<MEdge,MVertex*,Less_Edge> ed2nodes; // edge to interior node(s) for (unsigned int i=0;i<mesh.size();i++){ // triangle by triangle @@ -248,10 +234,10 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int for (unsigned int j=0; j<3; j++){ // loop over vertices AND edges of the current triangle MVertex *v = mesh[i]->getVertex(j);// firstly, edge vertices - if (v->onWhat() == gf) { + if (v->onWhat()->dim() == 2) { std::map<MVertex*,MVertex*> :: iterator it = v2v.find(v); if (it == v2v.end()){ - MFaceVertex *vv = new MFaceVertex ( v->x(), v->y(), v->z(), this, 0, 0); + MFaceVertex *vv = new MFaceVertex ( v->x(), v->y(), v->z(), v->onWhat(), 0, 0); v2v[v] = vv; discrete_vertices.push_back(vv); vs.push_back(vv); @@ -263,7 +249,7 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int discreteEdge *de = dynamic_cast<discreteEdge*> (v->onWhat()); vs.push_back(de->getGeometricalVertex(v)); } - else Msg::Fatal("fatality"); + else vs.push_back(v); } else vs.push_back(v); } @@ -311,8 +297,6 @@ discreteDiskFace::~discreteDiskFace() if (oct)Octree_Delete(oct); } - - void discreteDiskFace::getBoundingEdges() { @@ -383,7 +367,7 @@ void discreteDiskFace::getBoundingEdges() if (!(current->getVertex(k!=2 ?k+1 : 0 ) == neigs[i]->getVertex(j!=0 ? j-1 : 2) || current->getVertex(k!=0 ?k-1 : 2 ) == neigs[i]->getVertex(j!=2 ? j+1 : 0))){ neigs[i]->reverse(); - std::cout << "discreteDiskFace: triangle " << neigs[i]->getNum() << " has been reoriented." << std::endl; + // std::cout << "discreteDiskFace: triangle " << neigs[i]->getNum() << " has been reoriented." << std::endl; } break; } diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 82920af3822511dc5c178099d4acdcd4ce139d62..b2564396b8de1dc53df34c79254ae4234533944f 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -784,6 +784,9 @@ static void Mesh3D(GModel *m) opt(gr); } double a = Cpu(); + + CTX::instance()->mesh.recombine3DLevel = 2; + if (CTX::instance()->mesh.recombine3DLevel >= 0){ Recombinator rec; rec.execute(gr); @@ -793,8 +796,8 @@ static void Mesh3D(GModel *m) sup.execute(gr); } PostOp post; - post.execute(gr,CTX::instance()->mesh.recombine3DLevel, - CTX::instance()->mesh.recombine3DConformity); + post.execute(gr,CTX::instance()->mesh.recombine3DLevel,3); + // CTX::instance()->mesh.recombine3DConformity); // 0: no pyramid, 1: single-step, 2: two-steps (conforming), // true: fill non-conformities with trihedra // while(LaplaceSmoothing (gr)){