void meshOptimizer(GModel *gm, MeshOptParameters &par) { #if defined(HAVE_BFGS) if (par.nCurses) mvinit(); redirectMessage _logWriter(par.logFileName, !par.nCurses); if (par.logFileName.compare("") != 0 || par.nCurses) Msg::SetCallback(&_logWriter); double startTime = Cpu(); if (par.nCurses) { mvbold(true); mvprintCenter(0, "OPTIMIZING MESH"); mvfillRow(1,'-'); mvfillRow(10,'-'); mvfillRow(20,'-'); mvfillRow(27,'-'); mvbold(false); } if (par.verbose > 0) Msg::StatusBar(true, "Optimizing mesh..."); std::vector<GEntity*> entities; gm->getEntities(entities); vertElVecMap vertex2elements; elEntMap element2entity, bndEl2Ent; elElMap el2BndEl; elSet badElts; for (int iEnt = 0; iEnt < entities.size(); ++iEnt) { GEntity* &entity = entities[iEnt]; if (entity->dim() != par.dim || (par.onlyVisible && !entity->getVisibility())) continue; if (par.nCurses) { mvprintCenter(15, "Computing connectivity and bad elements for entity %3d...", entity->tag()); } Msg::Info("Computing connectivity and bad elements for entity %d...", entity->tag()); calcVertex2Elements(par.dim, entity, vertex2elements); if ((par.useGeomForPatches) || (par.useGeomForOpt)) calcElement2Entity(entity, element2entity); if (par.useBoundaries) calcBndInfo(entity, el2BndEl, bndEl2Ent); for (int iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { // Detect bad elements MElement *el = entity->getMeshElement(iEl); if (el->getDim() == par.dim) { if (par.patchDef->elBadness(el, entity) < 0.) badElts.insert(el); else if (par.useBoundaries) { elElMap::iterator bndElIt = el2BndEl.find(el); if (bndElIt != el2BndEl.end()) { MElement* &bndEl = bndElIt->second; if (par.patchDef->bndElBadness(bndEl, bndEl2Ent[bndEl]) < 0.) badElts.insert(el); } } } } } if (par.patchDef->strategy == MeshOptPatchDef::STRAT_DISJOINT) optimizeDisjointPatches(vertex2elements, element2entity, el2BndEl, bndEl2Ent, badElts, par); else if (par.patchDef->strategy == MeshOptPatchDef::STRAT_ONEBYONE) optimizeOneByOne(vertex2elements, element2entity, el2BndEl, bndEl2Ent, badElts, par); else { if (par.nCurses){ mvcolor(2,true); mvbold(true); mvprintCenter(-2, " ERROR: Unknown strategy %d for mesh optimization ", par.patchDef->strategy); mvcolor(2,false); mvbold(false); } else Msg::Error("Unknown strategy %d for mesh optimization", par.patchDef->strategy); } if (par.verbose > 0) { if (par.success == 1){ if (par.nCurses){ mvcolor(4,true); mvbold(true); mvprintCenter(-2, " Optimization succeeded "); mvcolor(4,false); mvbold(false); } else Msg::Info("Optimization succeeded"); } else if (par.success == 0){ if (par.nCurses){ mvcolor(5,true); mvbold(true); mvprintCenter(-2, " Optimization partially failed (all measures above critical value, but some below target) "); mvcolor(5,false); mvbold(false); } else Msg::Warning("Optimization partially failed (all measures above critical " "value, but some below target)"); } else if (par.success == -1){ if (par.nCurses){ mvcolor(3,true); mvbold(true); mvprintCenter(-2, "Optimization Failed"); mvcolor(3,false); mvbold(false); } else Msg::Error("Optimization failed (some measures below critical value)"); } par.CPU = Cpu()-startTime; Msg::StatusBar(true, "Done optimizing mesh (%g s)", par.CPU); } if (par.nCurses){ mvpause(); mvterminate(); } if (par.logFileName.compare("") != 0 || par.nCurses) Msg::SetCallback(NULL); #else Msg::Error("Mesh optimizer requires BFGS"); #endif }
void meshOptimizer(GModel *gm, MeshOptParameters &par) { #if defined(HAVE_BFGS) double startTime = Cpu(); if (par.verbose > 0) Msg::StatusBar(true, "Optimizing mesh..."); std::vector<GEntity*> entities; gm->getEntities(entities); vertElVecMap vertex2elements; elEntMap element2entity, bndEl2Ent; elElMap el2BndEl; elSet badElts; for (int iEnt = 0; iEnt < entities.size(); ++iEnt) { GEntity* &entity = entities[iEnt]; if (entity->dim() != par.dim || (par.onlyVisible && !entity->getVisibility())) continue; Msg::Info("Computing connectivity and bad elements for entity %d...", entity->tag()); calcVertex2Elements(par.dim, entity, vertex2elements); if ((par.useGeomForPatches) || (par.useGeomForOpt)) calcElement2Entity(entity, element2entity); if (par.useBoundaries) calcBndInfo(entity, el2BndEl, bndEl2Ent); for (int iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { // Detect bad elements MElement *el = entity->getMeshElement(iEl); if (el->getDim() == par.dim) { if (par.patchDef->elBadness(el, entity) < 0.) badElts.insert(el); else if (par.useBoundaries) { elElMap::iterator bndElIt = el2BndEl.find(el); if (bndElIt != el2BndEl.end()) { MElement* &bndEl = bndElIt->second; if (par.patchDef->bndElBadness(bndEl, bndEl2Ent[bndEl]) < 0.) badElts.insert(el); } } } } } if (par.patchDef->strategy == MeshOptPatchDef::STRAT_DISJOINT) optimizeDisjointPatches(vertex2elements, element2entity, el2BndEl, bndEl2Ent, badElts, par); else if (par.patchDef->strategy == MeshOptPatchDef::STRAT_ONEBYONE) optimizeOneByOne(vertex2elements, element2entity, el2BndEl, bndEl2Ent, badElts, par); else Msg::Error("Unknown strategy %d for mesh optimization", par.patchDef->strategy); if (par.verbose > 0) { if (par.success == 1) Msg::Info("Optimization succeeded"); else if (par.success == 0) Msg::Warning("Optimization partially failed (all measures above critical " "value, but some below target)"); else if (par.success == -1) Msg::Error("Optimization failed (some measures below critical value)"); par.CPU = Cpu()-startTime; Msg::StatusBar(true, "Done optimizing mesh (%g s)", par.CPU); } #else Msg::Error("Mesh optimizer requires BFGS"); #endif }