diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp index 718f08216d19d8cd4df9ad3e994e6fd9640e2e55..08d36913f440444f040f07f45f117f92d80c695d 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp @@ -772,7 +772,8 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p) par.dim = p.dim; par.onlyVisible = p.onlyVisible; par.fixBndNodes = p.fixBndNodes; - par.useGeom = false; + par.useGeomForPatches = false; + par.useGeomForOpt = false; HOPatchDefParameters patchDef(p); par.patchDef = &patchDef; par.optDisplay = 30; diff --git a/contrib/MeshOptimizer/MeshOptCommon.h b/contrib/MeshOptimizer/MeshOptCommon.h index dbb81abf1918c777a480453cee5e9a1bea6c8779..594f895bce68bfbc6ff013ae421839f9dda27961 100644 --- a/contrib/MeshOptimizer/MeshOptCommon.h +++ b/contrib/MeshOptimizer/MeshOptCommon.h @@ -77,7 +77,7 @@ struct MeshOptParameters { // Parameters controllin int dim ; // Which dimension to optimize bool onlyVisible ; // Apply optimization to visible entities ONLY bool fixBndNodes; // If points can move on boundaries - bool useGeom; // Compute and use info from geometric (CAD model) entities where helpful + bool useGeomForPatches, useGeomForOpt; // Whether to use info from CAD for creation of patches and for optimization MeshOptPatchDef *patchDef; std::vector<MeshOptPass> pass; int optDisplay; // Sampling rate in opt. iterations for display diff --git a/contrib/MeshOptimizer/MeshOptimizer.cpp b/contrib/MeshOptimizer/MeshOptimizer.cpp index 5ddd0848f88e5c60b4f32cb018c06f56af5e1125..f0a49eaef0c89f2ba797d341f17a90559e39aed2 100644 --- a/contrib/MeshOptimizer/MeshOptimizer.cpp +++ b/contrib/MeshOptimizer/MeshOptimizer.cpp @@ -259,9 +259,11 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements, { par.success = 1; + const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap(); + const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap(); + std::vector<elSetVertSetPair> toOptimize = getConnectedPatches(vertex2elements, - element2entity, - badasses, par); + e2ePatch, badasses, par); for (int iPatch = 0; iPatch < toOptimize.size(); ++iPatch) { @@ -269,7 +271,7 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements, if (par.verbose > 1) Msg::Info("Optimizing patch %i/%i composed of %i elements", iPatch, toOptimize.size()-1, toOptimize[iPatch].first.size()); - MeshOpt opt(element2entity, toOptimize[iPatch].first, toOptimize[iPatch].second, par); + MeshOpt opt(e2eOpt, toOptimize[iPatch].first, toOptimize[iPatch].second, par); if (par.verbose > 3) { std::ostringstream ossI1; ossI1 << "initial_patch-" << iPatch << ".msh"; @@ -329,6 +331,9 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, { par.success = 1; + const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap(); + const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap(); + const int initNumBadElts = badElts.size(); if (par.verbose > 0) Msg::Info("%d bad elements, starting to iterate...", initNumBadElts); @@ -340,7 +345,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, if (badElts.empty()) break; // Create patch around worst element and remove it from badElts - MElement *worstEl = getWorstElement(badElts, element2entity, par); + MElement *worstEl = getWorstElement(badElts, e2ePatch, par); badElts.erase(worstEl); // Initialize patch size to be adapted @@ -355,7 +360,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, const double limDist = par.patchDef->maxDistance(worstEl); elSet toOptimizePrim = getSurroundingPatch(worstEl, par.patchDef, limDist, maxLayers, vertex2elements, - element2elements, element2entity); + element2elements, e2ePatch); vertSet toFix = getAllBndVertices(toOptimizePrim, vertex2elements); elSet toOptimize; std::set_difference(toOptimizePrim.begin(),toOptimizePrim.end(), @@ -366,7 +371,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, if (par.verbose > 1) Msg::Info("Optimizing patch %i (max. %i remaining) composed of %4d elements", iBadEl, badElts.size(), toOptimize.size()); - MeshOpt opt(element2entity, toOptimize, toFix, par); + MeshOpt opt(e2eOpt, toOptimize, toFix, par); if (par.verbose > 3) { std::ostringstream ossI1; ossI1 << "initial_patch-" << iBadEl << ".msh"; @@ -446,7 +451,8 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par) Msg::Info("Computing connectivity and bad elements for entity %d...", entity->tag()); calcVertex2Elements(par.dim, entity, vertex2elements); - if (par.useGeom) calcElement2Entity(entity, element2entity); + if ((par.useGeomForPatches) || (par.useGeomForOpt)) + calcElement2Entity(entity, element2entity); for (int iEl = 0; iEl < entity->getNumMeshElements();iEl++) { // Detect bad elements double jmin, jmax; MElement *el = entity->getMeshElement(iEl); diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp index 86c5b578667839bb936e227b9e022f0776d9e8cf..90794527f877e2b76248f6a3dceafa474ca95abf 100644 --- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp +++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp @@ -118,7 +118,8 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p) par.dim = p.dim; par.onlyVisible = p.onlyVisible; par.fixBndNodes = p.fixBndNodes; - par.useGeom = p.excludeBL; + par.useGeomForPatches = p.excludeBL; + par.useGeomForOpt = false; QualPatchDefParameters patchDef(p); par.patchDef = &patchDef; par.optDisplay = 20;