diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 207266daca779070057a12316c6cf814f5f2e465..634023b92a6ad144f554dad1fc2f8474ca912e40 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -567,6 +567,22 @@ void AdaptMesh(GModel *m) Msg::StatusBar(2, true, "Done adaptating 3D mesh (%g s)", t2 - t1); } +void RecombineMesh(GModel *m) +{ + Msg::StatusBar(2, true, "Recombining 2D mesh..."); + double t1 = Cpu(); + + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){ + GFace *gf = *it; + recombineIntoQuads(gf); + } + + CTX::instance()->mesh.changed = ENT_ALL; + + double t2 = Cpu(); + Msg::StatusBar(2, true, "Done recombining 2D mesh (%g s)", t2 - t1); +} + void GenerateMesh(GModel *m, int ask) { if(CTX::instance()->lock) { diff --git a/Mesh/Generator.h b/Mesh/Generator.h index 135b70c229d4e273d447416f889b58d171879672..40f808322d930aa04768b0bc874e6ad645f99ac3 100644 --- a/Mesh/Generator.h +++ b/Mesh/Generator.h @@ -15,5 +15,6 @@ void OptimizeMesh(GModel *m); void OptimizeMeshNetgen(GModel *m); void RefineMesh(GModel *m, bool linear, bool splitIntoQuads=false, bool splitIntoHexas=false); +void RecombineMesh(GModel *m); #endif diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index a860fe5c74d72ee1d5ac77a2e862f525d1a3399d..f0503c57a43cd7e1dbeac32415fea1de20d270b4 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -1842,57 +1842,66 @@ void recombineIntoQuads(GFace *gf, bool topologicalOpti, bool nodeRepositioning) { - double t1 = Cpu(); + bool haveParam = true; + if(gf->geomType() == GEntity::DiscreteSurface && !gf->getCompound()) + haveParam = false; + gf->model()->writeMSH("before.msh"); - if (topologicalOpti)removeFourTrianglesNodes(gf, false); - int success = _recombineIntoQuads(gf,0); - // gf->addLayersOfQuads(1, 0); + if(haveParam && topologicalOpti) + removeFourTrianglesNodes(gf, false); + + int success = _recombineIntoQuads(gf, 0); + + // gf->addLayersOfQuads(1, 0); + gf->model()->writeMSH("raw.msh"); - if (nodeRepositioning) - laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing); + if(haveParam && nodeRepositioning) + laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing); - //blossom-quad algo + // blossom-quad algo if(success && CTX::instance()->mesh.algoRecombine == 1){ - if (topologicalOpti){ - gf->model()->writeMSH("smoothed.msh"); - int COUNT = 0; - char NAME[256]; - while(1){ - int x = removeTwoQuadsNodes(gf); - if(x){ sprintf(NAME,"iter%dTQ.msh",COUNT++); gf->model()->writeMSH(NAME);} - int y= removeDiamonds(gf); - if(y){ sprintf(NAME,"iter%dD.msh",COUNT++); gf->model()->writeMSH(NAME); } - laplaceSmoothing(gf); - int z = 0 ;//edgeSwapQuadsForBetterQuality ( gf ); - if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); } - if (!(x+y+z))break; + if(topologicalOpti){ + if(haveParam){ + gf->model()->writeMSH("smoothed.msh"); + int COUNT = 0; + char NAME[256]; + while(1){ + int x = removeTwoQuadsNodes(gf); + if(x){ sprintf(NAME,"iter%dTQ.msh",COUNT++); gf->model()->writeMSH(NAME);} + int y = removeDiamonds(gf); + if(y){ sprintf(NAME,"iter%dD.msh",COUNT++); gf->model()->writeMSH(NAME); } + laplaceSmoothing(gf); + int z = 0; //edgeSwapQuadsForBetterQuality(gf); + if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); } + if (!(x+y+z)) break; + } } - edgeSwapQuadsForBetterQuality ( gf ); + edgeSwapQuadsForBetterQuality(gf); //if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); } - laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing); + if(haveParam) laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing); } double t2 = Cpu(); Msg::Info("Blossom recombination algorithm completed (%g s)", t2 - t1); return; } - //simple recombination algo - _recombineIntoQuads(gf,0); - laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing); - _recombineIntoQuads(gf,0); - laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing); + // simple recombination algo + _recombineIntoQuads(gf, 0); + if(haveParam) laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing); + _recombineIntoQuads(gf, 0); + if(haveParam) laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing); + // gf->model()->writeMSH("after.msh"); double t2 = Cpu(); Msg::Info("Simple recombination algorithm completed (%g s)", t2 - t1); - } - // give it a try : add one quad layer on the -void addOneLayerOnContour(GFace *gf, GVertex *gv){ +void addOneLayerOnContour(GFace *gf, GVertex *gv) +{ /* , int nbLayers, double hplus, double factor){ // for each vertex @@ -1985,7 +1994,8 @@ void addOneLayerOnContour(GFace *gf, GVertex *gv){ */ } -void quadsToTriangles(GFace *gf, double minqual = -10000.){ +void quadsToTriangles(GFace *gf, double minqual = -10000.) +{ std::vector<MQuadrangle*> qds; for (int i=0;i<gf->quadrangles.size();i++){ MQuadrangle *q = gf->quadrangles[i]; @@ -2023,8 +2033,8 @@ void quadsToTriangles(GFace *gf, double minqual = -10000.){ gf->quadrangles = qds; } -void recombineIntoQuadsIterative(GFace *gf){ - +void recombineIntoQuadsIterative(GFace *gf) +{ recombineIntoQuads(gf); quadsToTriangles(gf,0.03); return;