diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp index ff9005b3fcb2dca8c5ba3ac4ea62f1b354a188e2..71bb65fb6f38fb4ec35d786f786ccb75c667e5a3 100644 --- a/Geo/GFaceCompound.cpp +++ b/Geo/GFaceCompound.cpp @@ -902,10 +902,9 @@ bool GFaceCompound::parametrize() const Msg::Info("Parametrizing surface %d with 'FE conformal map'", tag()); parametrize_conformal(0, NULL, NULL); } - printStuff(55); - oriented = false; //checkOrientation(0); - if (!oriented) oriented = checkOrientation(0, true); - printStuff(77); + //printStuff(55); + oriented = checkOrientation(0, true); + //printStuff(77); if (_type==SPECTRAL && (!oriented || checkOverlap(vert)) ){ Msg::Warning("!!! parametrization switched to 'FE conformal' map"); parametrize_conformal(0, NULL, NULL); diff --git a/Mesh/CenterlineField.cpp b/Mesh/CenterlineField.cpp index 63ccf471370d0d9c5ac9fae78e50994a3285ed7b..b12a9968cc5fd8e07855b39541ede513507dc4a6 100644 --- a/Mesh/CenterlineField.cpp +++ b/Mesh/CenterlineField.cpp @@ -648,82 +648,6 @@ void Centerline::createSplitCompounds() } } -void Centerline::cleanMesh() -{ - return; // does not work yet ! - //////////////////////////////// - - if (!is_cut || !is_closed) return; - - for (int i=0; i < NF; i++){ - std::ostringstream oss; - oss << "new" << NF+i+1 ; - std::string name = oss.str(); - current->setPhysicalName(name, 2, i+1); - } - Msg::Info("Writing new splitted mesh mySPLITMESH.msh"); - current->writeMSH("mySPLITMESH.msh", 2.2, false, false); - - std::set<MVertex*> allNod; - discreteFace * mySplitMesh; - std::vector<std::set<MVertex*> > inOutNod; - std::vector<discreteFace* > inOutMesh; - - mySplitMesh= new discreteFace(current, 2*NF+1); - mySplitMesh->addPhysicalEntity(2*NF+1); - current->setPhysicalName("surface mesh", 2, 2*NF+1); - current->add(mySplitMesh); - for (unsigned int i=0; i < discFaces.size(); i++){ - GFace *gfc = current->getFaceByTag(NF+i+1); - for(unsigned int j = 0; j < gfc->triangles.size(); ++j){ - MTriangle *t = gfc->triangles[j]; - std::vector<MVertex *> v(3); - for(int k = 0; k < 3; k++){ - v[k] = t->getVertex(k); - allNod.insert(v[k]); - } - mySplitMesh->triangles.push_back(new MTriangle(v[0], v[1], v[2])); - } - for(unsigned int j = 0; j < gfc->quadrangles.size(); ++j){ - MQuadrangle *q = gfc->quadrangles[j]; - std::vector<MVertex *> v(4); - for(int k = 0; k < 4; k++){ - v[k] = q->getVertex(k); - allNod.insert(v[k]); - } - mySplitMesh->quadrangles.push_back(new MQuadrangle(v[0], v[1], v[2], v[3])); - } - } - - //Removing discrete Vertices - Edges - Faces - for (int i=0; i < NV; i++){ - GVertex *gv = current->getVertexByTag(i+1); - current->remove(gv); - } - for (int i=0; i < NE; i++){ - GEdge *ge = current->getEdgeByTag(i+1); - GEdge *gec = current->getEdgeByTag(NE+i+1); - current->remove(ge); - current->remove(gec); - } - for (int i=0; i < NF; i++){ - GFace *gf = current->getFaceByTag(i+1); - current->remove(gf); - } - for (unsigned int i=0; i < discFaces.size(); i++){ - GFace *gfc = current->getFaceByTag(NF+i+1); - current->remove(gfc); - } - - //Put new mesh in a new discreteFace - for(std::set<MVertex*>::iterator it = allNod.begin(); it != allNod.end(); ++it) - mySplitMesh->mesh_vertices.push_back(*it); - mySplitMesh->meshStatistics.status = GFace::DONE; - - current->createTopologyFromMesh(); - -} - void Centerline::createFaces() { std::vector<std::vector<MTriangle*> > faces; @@ -1262,10 +1186,6 @@ void Centerline::operator() (double x, double y, double z, SMetric3 &metr, GEnt return; - // double lc_a_curv = sqrt(1./dot(dir_a,curvMetric,dir_a)); - // if (ds < thickness) lc_a = std::min(lc_a, lc_a_curv); - // return; - } SMetric3 Centerline::metricBasedOnSurfaceCurvature(SVector3 dirMin, SVector3 dirMax, diff --git a/Mesh/CenterlineField.h b/Mesh/CenterlineField.h index d89c3d4f4a107ac5e1c613e083eabf6c870d47b0..ae0429b364f8db67ff0b727b8c10fd6570dbe2ec 100644 --- a/Mesh/CenterlineField.h +++ b/Mesh/CenterlineField.h @@ -113,8 +113,6 @@ class Centerline : public Field{ " using the following script:\n\n" "vmtk vmtkcenterlines -seedselector openprofiles -ifile mysurface.stl -ofile centerlines.vtp --pipe vmtksurfacewriter -ifile centerlines.vtp -ofile centerlines.vtk\n"; } - - void cleanMesh(); //isotropic operator for mesh size field function of distance to centerline double operator() (double x, double y, double z, GEntity *ge=0); @@ -186,8 +184,6 @@ class Centerline : public Field{ " using the following script:\n\n" "vmtk vmtkcenterlines -seedselector openprofiles -ifile mysurface.stl -ofile centerlines.vtp --pipe vmtksurfacewriter -ifile centerlines.vtp -ofile centerlines.vtk\n"; } - - void cleanMesh(); //isotropic operator for mesh size field function of distance to centerline double operator() (double x, double y, double z, GEntity *ge=0); diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 8d2379699af0fd01516c99d2c824b3da0f366a91..302e9b2e787d69cbded6d27a33dd88b0e0fd4f54 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -506,17 +506,6 @@ static void Mesh2D(GModel *m) // collapseSmallEdges(*m); -#if defined(HAVE_ANN) - //For centerline field, clean the cut parts - Centerline *center = 0; - FieldManager *fields = GModel::current()->getFields(); - if (fields->getBackgroundField() > 0 ){ - Field *myField = fields->get(fields->getBackgroundField()); - center = dynamic_cast<Centerline*> (myField); - } - if (center) center->cleanMesh(); -#endif - double t2 = Cpu(); CTX::instance()->meshTimer[1] = t2 - t1; Msg::StatusBar(2, true, "Done meshing 2D (%g s)", CTX::instance()->meshTimer[1]); diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index 4f8698d1a15b8e2372f4a4dbe75c6e9ed9389007..f1f96f1a89b587ed5e01eafd6a6b4da393ba2b75 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -24,6 +24,7 @@ #include "MLine.h" #include "MTriangle.h" #include "MQuadrangle.h" +#include "CenterlineField.h" #include "Context.h" #include "GPoint.h" #include "GmshMessage.h" @@ -1420,6 +1421,32 @@ static bool buildConsecutiveListOfVertices(GFace *gf, GEdgeLoop &gel, return true; } +static bool meshGeneratorElliptic(GFace *gf, bool debug = true) +{ + +#if defined(HAVE_ANN) + Centerline *center = 0; + FieldManager *fields = GModel::current()->getFields(); + if (fields->getBackgroundField() > 0 ){ + Field *myField = fields->get(fields->getBackgroundField()); + center = dynamic_cast<Centerline*> (myField); + } + + bool recombine = (CTX::instance()->mesh.recombineAll); + int nbBoundaries = gf->edges().size(); + //printf(" nbBounds = %d (face %d) \n", nbBoundaries, gf->tag()); + + if (center && recombine && nbBoundaries == 2) { + printf("need for elliptic grid generator \n"); + //createRegularParamGrid(); + //solveElliptic(); + return true; + } + else return false; + +#endif + +} static bool meshGeneratorPeriodic(GFace *gf, bool debug = true) { @@ -1857,6 +1884,11 @@ void meshGFace::operator() (GFace *gf, bool print) Msg::Debug("Computing edge loops"); Msg::Debug("Generating the mesh"); + + if(meshGeneratorElliptic(gf)){ + printf("elliptic grid generator for face %d \n", gf->tag()); + } + //else if if ((gf->getNativeType() != GEntity::AcisModel || (!gf->periodic(0) && !gf->periodic(1))) && (noSeam(gf) || gf->getNativeType() == GEntity::GmshModel || diff --git a/benchmarks/centerlines/aorta_centerlines.geo b/benchmarks/centerlines/aorta_centerlines.geo index 5b7a814ab7e3d385bcc2a9b4a9dd45b7320d949f..e95e6cb2bf5e04ab9a2abce5f5a2a8b87ee88a8f 100644 --- a/benchmarks/centerlines/aorta_centerlines.geo +++ b/benchmarks/centerlines/aorta_centerlines.geo @@ -1,9 +1,9 @@ -Mesh.Algorithm = 7; //(1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=bamg, 8=delquad) +Mesh.Algorithm = 8; //(1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=bamg, 8=delquad) Mesh.Algorithm3D = 7; //(1=tetgen, 4=netgen, 5=FrontalDel, 6=FrontalHex, 7=MMG3D, 9=R-tree Mesh.LcIntegrationPrecision = 1.e-2; -//Mesh.RecombineAll = 1; +Mesh.RecombineAll = 1; //Mesh.Bunin = 120; Merge "aorta2.stl";