From 6325ca66a4d301f0c241ce65f0116cf7bc5ba7d6 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Sun, 5 Dec 2010 11:03:25 +0000 Subject: [PATCH] recombine & blossom without parametrization --- Mesh/Generator.cpp | 16 ++++++++ Mesh/Generator.h | 1 + Mesh/meshGFaceOptimize.cpp | 76 +++++++++++++++++++++----------------- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 207266daca..634023b92a 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 135b70c229..40f808322d 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 a860fe5c74..f0503c57a4 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; -- GitLab