Skip to content
Snippets Groups Projects
Commit 06e03271 authored by Thomas Toulorge's avatar Thomas Toulorge
Browse files

Changed use of CAD information in mesh optimizer

parent f7d893be
No related branches found
No related tags found
No related merge requests found
...@@ -772,7 +772,8 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p) ...@@ -772,7 +772,8 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
par.dim = p.dim; par.dim = p.dim;
par.onlyVisible = p.onlyVisible; par.onlyVisible = p.onlyVisible;
par.fixBndNodes = p.fixBndNodes; par.fixBndNodes = p.fixBndNodes;
par.useGeom = false; par.useGeomForPatches = false;
par.useGeomForOpt = false;
HOPatchDefParameters patchDef(p); HOPatchDefParameters patchDef(p);
par.patchDef = &patchDef; par.patchDef = &patchDef;
par.optDisplay = 30; par.optDisplay = 30;
......
...@@ -77,7 +77,7 @@ struct MeshOptParameters { // Parameters controllin ...@@ -77,7 +77,7 @@ struct MeshOptParameters { // Parameters controllin
int dim ; // Which dimension to optimize int dim ; // Which dimension to optimize
bool onlyVisible ; // Apply optimization to visible entities ONLY bool onlyVisible ; // Apply optimization to visible entities ONLY
bool fixBndNodes; // If points can move on boundaries 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; MeshOptPatchDef *patchDef;
std::vector<MeshOptPass> pass; std::vector<MeshOptPass> pass;
int optDisplay; // Sampling rate in opt. iterations for display int optDisplay; // Sampling rate in opt. iterations for display
......
...@@ -259,9 +259,11 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements, ...@@ -259,9 +259,11 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements,
{ {
par.success = 1; par.success = 1;
const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap();
const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap();
std::vector<elSetVertSetPair> toOptimize = getConnectedPatches(vertex2elements, std::vector<elSetVertSetPair> toOptimize = getConnectedPatches(vertex2elements,
element2entity, e2ePatch, badasses, par);
badasses, par);
for (int iPatch = 0; iPatch < toOptimize.size(); ++iPatch) { for (int iPatch = 0; iPatch < toOptimize.size(); ++iPatch) {
...@@ -269,7 +271,7 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements, ...@@ -269,7 +271,7 @@ void optimizeConnectedPatches(const vertElVecMap &vertex2elements,
if (par.verbose > 1) if (par.verbose > 1)
Msg::Info("Optimizing patch %i/%i composed of %i elements", iPatch, Msg::Info("Optimizing patch %i/%i composed of %i elements", iPatch,
toOptimize.size()-1, toOptimize[iPatch].first.size()); 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) { if (par.verbose > 3) {
std::ostringstream ossI1; std::ostringstream ossI1;
ossI1 << "initial_patch-" << iPatch << ".msh"; ossI1 << "initial_patch-" << iPatch << ".msh";
...@@ -329,6 +331,9 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, ...@@ -329,6 +331,9 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
{ {
par.success = 1; par.success = 1;
const elEntMap &e2ePatch = par.useGeomForPatches ? element2entity : elEntMap();
const elEntMap &e2eOpt = par.useGeomForOpt ? element2entity : elEntMap();
const int initNumBadElts = badElts.size(); const int initNumBadElts = badElts.size();
if (par.verbose > 0) Msg::Info("%d bad elements, starting to iterate...", initNumBadElts); if (par.verbose > 0) Msg::Info("%d bad elements, starting to iterate...", initNumBadElts);
...@@ -340,7 +345,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, ...@@ -340,7 +345,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
if (badElts.empty()) break; if (badElts.empty()) break;
// Create patch around worst element and remove it from badElts // 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); badElts.erase(worstEl);
// Initialize patch size to be adapted // Initialize patch size to be adapted
...@@ -355,7 +360,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, ...@@ -355,7 +360,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
const double limDist = par.patchDef->maxDistance(worstEl); const double limDist = par.patchDef->maxDistance(worstEl);
elSet toOptimizePrim = getSurroundingPatch(worstEl, par.patchDef, limDist, elSet toOptimizePrim = getSurroundingPatch(worstEl, par.patchDef, limDist,
maxLayers, vertex2elements, maxLayers, vertex2elements,
element2elements, element2entity); element2elements, e2ePatch);
vertSet toFix = getAllBndVertices(toOptimizePrim, vertex2elements); vertSet toFix = getAllBndVertices(toOptimizePrim, vertex2elements);
elSet toOptimize; elSet toOptimize;
std::set_difference(toOptimizePrim.begin(),toOptimizePrim.end(), std::set_difference(toOptimizePrim.begin(),toOptimizePrim.end(),
...@@ -366,7 +371,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements, ...@@ -366,7 +371,7 @@ void optimizeOneByOne(const vertElVecMap &vertex2elements,
if (par.verbose > 1) if (par.verbose > 1)
Msg::Info("Optimizing patch %i (max. %i remaining) composed of %4d elements", Msg::Info("Optimizing patch %i (max. %i remaining) composed of %4d elements",
iBadEl, badElts.size(), toOptimize.size()); iBadEl, badElts.size(), toOptimize.size());
MeshOpt opt(element2entity, toOptimize, toFix, par); MeshOpt opt(e2eOpt, toOptimize, toFix, par);
if (par.verbose > 3) { if (par.verbose > 3) {
std::ostringstream ossI1; std::ostringstream ossI1;
ossI1 << "initial_patch-" << iBadEl << ".msh"; ossI1 << "initial_patch-" << iBadEl << ".msh";
...@@ -446,7 +451,8 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par) ...@@ -446,7 +451,8 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par)
Msg::Info("Computing connectivity and bad elements for entity %d...", Msg::Info("Computing connectivity and bad elements for entity %d...",
entity->tag()); entity->tag());
calcVertex2Elements(par.dim, entity, vertex2elements); 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 for (int iEl = 0; iEl < entity->getNumMeshElements();iEl++) { // Detect bad elements
double jmin, jmax; double jmin, jmax;
MElement *el = entity->getMeshElement(iEl); MElement *el = entity->getMeshElement(iEl);
......
...@@ -118,7 +118,8 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p) ...@@ -118,7 +118,8 @@ void MeshQualityOptimizer(GModel *gm, MeshQualOptParameters &p)
par.dim = p.dim; par.dim = p.dim;
par.onlyVisible = p.onlyVisible; par.onlyVisible = p.onlyVisible;
par.fixBndNodes = p.fixBndNodes; par.fixBndNodes = p.fixBndNodes;
par.useGeom = p.excludeBL; par.useGeomForPatches = p.excludeBL;
par.useGeomForOpt = false;
QualPatchDefParameters patchDef(p); QualPatchDefParameters patchDef(p);
par.patchDef = &patchDef; par.patchDef = &patchDef;
par.optDisplay = 20; par.optDisplay = 20;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment