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

Changer handling of results in general optimizer, added CAD distance to high order optimizer.

parent e0d450f7
No related branches found
No related tags found
No related merge requests found
Showing
with 104 additions and 114 deletions
...@@ -20,7 +20,6 @@ public: ...@@ -20,7 +20,6 @@ public:
virtual bool targetReached() { return FuncType::targetReached(_min, _max); } virtual bool targetReached() { return FuncType::targetReached(_min, _max); }
virtual bool stagnated() { return FuncType::stagnated(_min, _max); } virtual bool stagnated() { return FuncType::stagnated(_min, _max); }
virtual void updateMinMax(); virtual void updateMinMax();
virtual void updateResults(MeshOptResults &res) const;
protected: protected:
Patch *_mesh; Patch *_mesh;
...@@ -94,12 +93,4 @@ void ObjContribCADDist<FuncType>::updateMinMax() ...@@ -94,12 +93,4 @@ void ObjContribCADDist<FuncType>::updateMinMax()
} }
template<class FuncType>
void ObjContribCADDist<FuncType>::updateResults(MeshOptResults &res) const
{
res.minCADDist = std::min(_min, res.minCADDist);
res.maxCADDist = std::max(_max, res.maxCADDist);
}
#endif /* _OPTHOMOBJCONTRIBCADDIST_H_ */ #endif /* _OPTHOMOBJCONTRIBCADDIST_H_ */
...@@ -21,7 +21,6 @@ public: ...@@ -21,7 +21,6 @@ public:
virtual bool targetReached() { return FuncType::targetReached(_min, _max); } virtual bool targetReached() { return FuncType::targetReached(_min, _max); }
virtual bool stagnated() { return FuncType::stagnated(_min, _max); } virtual bool stagnated() { return FuncType::stagnated(_min, _max); }
virtual void updateMinMax(); virtual void updateMinMax();
virtual void updateResults(MeshOptResults &res) const;
protected: protected:
Patch *_mesh; Patch *_mesh;
...@@ -96,12 +95,4 @@ void ObjContribMetricMin<FuncType>::updateMinMax() ...@@ -96,12 +95,4 @@ void ObjContribMetricMin<FuncType>::updateMinMax()
} }
template<class FuncType>
void ObjContribMetricMin<FuncType>::updateResults(MeshOptResults &res) const
{
res.minMetricMin = std::min(_min, res.minMetricMin);
res.maxMetricMin = std::max(_max, res.maxMetricMin);
}
#endif /* _OPTHOMOBJCONTRIBMETRICMIN_H_ */ #endif /* _OPTHOMOBJCONTRIBMETRICMIN_H_ */
...@@ -21,7 +21,6 @@ public: ...@@ -21,7 +21,6 @@ public:
virtual bool targetReached() { return FuncType::targetReached(_min, _max); } virtual bool targetReached() { return FuncType::targetReached(_min, _max); }
virtual bool stagnated() { return FuncType::stagnated(_min, _max); } virtual bool stagnated() { return FuncType::stagnated(_min, _max); }
virtual void updateMinMax(); virtual void updateMinMax();
virtual void updateResults(MeshOptResults &res) const;
protected: protected:
Patch *_mesh; Patch *_mesh;
...@@ -96,12 +95,4 @@ void ObjContribScaledJac<FuncType>::updateMinMax() ...@@ -96,12 +95,4 @@ void ObjContribScaledJac<FuncType>::updateMinMax()
} }
template<class FuncType>
void ObjContribScaledJac<FuncType>::updateResults(MeshOptResults &res) const
{
res.minScaledJac = std::min(_min, res.minScaledJac);
res.maxScaledJac = std::max(_max, res.maxScaledJac);
}
#endif /* _OPTHOMOBJCONTRIBSCALEDJAC_H_ */ #endif /* _OPTHOMOBJCONTRIBSCALEDJAC_H_ */
...@@ -757,11 +757,13 @@ struct HOPatchDefParameters : public MeshOptParameters::PatchDefParameters ...@@ -757,11 +757,13 @@ struct HOPatchDefParameters : public MeshOptParameters::PatchDefParameters
{ {
HOPatchDefParameters(const OptHomParameters &p); HOPatchDefParameters(const OptHomParameters &p);
virtual ~HOPatchDefParameters() {} virtual ~HOPatchDefParameters() {}
virtual double elBadness(const MElement *el); virtual double elBadness(MElement *el);
virtual double maxDistance(const MElement *el); virtual double maxDistance(const MElement *el);
private: private:
double jacMin, jacMax; double jacMin, jacMax;
double distanceFactor; double distanceFactor;
bool optCAD;
double optCADDistMax, optCADWeight, discrTolerance;
}; };
...@@ -781,13 +783,22 @@ HOPatchDefParameters::HOPatchDefParameters(const OptHomParameters &p) ...@@ -781,13 +783,22 @@ HOPatchDefParameters::HOPatchDefParameters(const OptHomParameters &p)
maxLayersAdaptFact = p.adaptBlobLayerFact; maxLayersAdaptFact = p.adaptBlobLayerFact;
distanceAdaptFact = p.adaptBlobDistFact; distanceAdaptFact = p.adaptBlobDistFact;
} }
optCAD = p.optCAD;
optCADDistMax = p.optCADDistMax;
optCADWeight = p.optCADWeight;
discrTolerance = p.discrTolerance;
} }
double HOPatchDefParameters::elBadness(const MElement *el) { double HOPatchDefParameters::elBadness(MElement *el) {
double jmin, jmax; double jmin, jmax;
el->scaledJacRange(jmin, jmax); el->scaledJacRange(jmin, jmax);
return std::min(jmin-jacMin, 0.) + std::min(jacMax-jmax, 0.); double badness = std::min(jmin-jacMin, 0.) + std::min(jacMax-jmax, 0.);
if (optCAD) {
const double dist = computeBndDist(el, 2, fabs(discrTolerance));
badness += optCADWeight*std::min(optCADDistMax-dist, 0.);
}
return badness;
} }
...@@ -814,37 +825,32 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p) ...@@ -814,37 +825,32 @@ void HighOrderMeshOptimizerNew(GModel *gm, OptHomParameters &p)
minJacBarFunc.setTarget(p.BARRIER_MIN, 1.); minJacBarFunc.setTarget(p.BARRIER_MIN, 1.);
ObjContribScaledJac<ObjContribFuncBarrierFixMinMovMax> minMaxJacBarFunc(1.); ObjContribScaledJac<ObjContribFuncBarrierFixMinMovMax> minMaxJacBarFunc(1.);
minMaxJacBarFunc.setTarget(p.BARRIER_MAX, 1.); minMaxJacBarFunc.setTarget(p.BARRIER_MAX, 1.);
ObjContribCADDist<ObjContribFuncSimple> CADDistFunc(p.optCADWeight, p.discrTolerance); ObjContribCADDist<ObjContribFuncSimpleTargetMin> CADDistFunc(p.optCADWeight, p.discrTolerance);
CADDistFunc.setTarget(p.optCADDistMax);
MeshOptParameters::PassParameters minJacPass; MeshOptParameters::PassParameters minJacPass;
minJacPass.barrierIterMax = p.optPassMax; minJacPass.barrierIterMax = p.optPassMax;
minJacPass.optIterMax = p.itMax; minJacPass.optIterMax = p.itMax;
minJacPass.contrib.resize(2); minJacPass.contrib.push_back(&nodeDistFunc);
minJacPass.contrib[0] = &nodeDistFunc; minJacPass.contrib.push_back(&minJacBarFunc);
minJacPass.contrib[1] = &minJacBarFunc; if (p.optCAD) minJacPass.contrib.push_back(&CADDistFunc);
par.pass.push_back(minJacPass); par.pass.push_back(minJacPass);
if (p.BARRIER_MAX > 0.) { if (p.BARRIER_MAX > 0.) {
MeshOptParameters::PassParameters minMaxJacPass; MeshOptParameters::PassParameters minMaxJacPass;
minMaxJacPass.barrierIterMax = p.optPassMax; minMaxJacPass.barrierIterMax = p.optPassMax;
minMaxJacPass.optIterMax = p.itMax; minMaxJacPass.optIterMax = p.itMax;
minMaxJacPass.contrib.resize(2); minMaxJacPass.contrib.push_back(&nodeDistFunc);
minMaxJacPass.contrib[0] = &nodeDistFunc; minMaxJacPass.contrib.push_back(&minMaxJacBarFunc);
minMaxJacPass.contrib[1] = &minMaxJacBarFunc; if (p.optCAD) minJacPass.contrib.push_back(&CADDistFunc);
par.pass.push_back(minMaxJacPass); par.pass.push_back(minMaxJacPass);
} }
if (p.optCAD) { meshOptimizer(gm, par);
}
MeshOptResults res;
meshOptimizer(gm, par, res);
p.CPU = res.CPU; p.CPU = par.CPU;
p.minJac = res.minScaledJac; p.minJac = minMaxJacBarFunc.getMin();
p.maxJac = res.maxScaledJac; p.maxJac = minMaxJacBarFunc.getMax();
Msg::StatusBar(true, "Done optimizing high order mesh (%g s)", p.CPU); Msg::StatusBar(true, "Done optimizing high order mesh (%g s)", p.CPU);
} }
...@@ -11,7 +11,6 @@ set(SRC ...@@ -11,7 +11,6 @@ set(SRC
MeshOptObjContrib.cpp MeshOptObjContrib.cpp
MeshOptObjContribFunc.cpp MeshOptObjContribFunc.cpp
MeshOptVertexCoord.cpp MeshOptVertexCoord.cpp
MeshOptCommon.cpp
) )
file(GLOB_RECURSE HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.hpp) file(GLOB_RECURSE HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.hpp)
......
...@@ -123,9 +123,9 @@ void MeshOpt::calcScale(alglib::real_1d_array &scale) ...@@ -123,9 +123,9 @@ void MeshOpt::calcScale(alglib::real_1d_array &scale)
} }
void MeshOpt::updateResults(MeshOptResults &res) void MeshOpt::updateResults()
{ {
_objFunc->updateResults(res); _objFunc->updateResults();
} }
......
...@@ -53,7 +53,7 @@ public: ...@@ -53,7 +53,7 @@ public:
~MeshOpt(); ~MeshOpt();
int optimize(const MeshOptParameters &par); int optimize(const MeshOptParameters &par);
void updateMesh(const alglib::real_1d_array &x); void updateMesh(const alglib::real_1d_array &x);
void updateResults(MeshOptResults &res); void updateResults();
void evalObjGrad(const alglib::real_1d_array &x, void evalObjGrad(const alglib::real_1d_array &x,
double &Obj, alglib::real_1d_array &gradObj); double &Obj, alglib::real_1d_array &gradObj);
void printProgress(const alglib::real_1d_array &x, double Obj); void printProgress(const alglib::real_1d_array &x, double Obj);
......
// TODO: Copyright
#include "MeshOptCommon.h"
const double MeshOptResults::BIGVAL = 1.e300;
MeshOptResults::MeshOptResults() :
success(-1), CPU(0.), minNodeDisp(BIGVAL), maxNodeDisp(-BIGVAL),
minScaledJac(BIGVAL), maxScaledJac(-BIGVAL), minMetricMin(BIGVAL),
maxMetricMin(-BIGVAL)
{
}
...@@ -37,19 +37,6 @@ class MElement; ...@@ -37,19 +37,6 @@ class MElement;
class ObjContrib; class ObjContrib;
struct MeshOptResults { // Output of mesh optimization
int success; // Success flag: -1 = fail, 0 = partial fail (target not reached), 1 = success
double CPU; // Time for optimization
double minNodeDisp, maxNodeDisp; // Range of node displacement
double minScaledJac, maxScaledJac; // Range of Scaled Jacobians
double minMetricMin, maxMetricMin; // Range of min. of metric
double minCADDist, maxCADDist; // Range of distance to CAD
MeshOptResults();
private:
static const double BIGVAL;
};
struct MeshOptParameters { // Parameters controlling the strategy struct MeshOptParameters { // Parameters controlling the strategy
enum { STRAT_CONNECTED, STRAT_ONEBYONE }; enum { STRAT_CONNECTED, STRAT_ONEBYONE };
struct PassParameters { // Parameters controlling the optimization procedure in each pass struct PassParameters { // Parameters controlling the optimization procedure in each pass
...@@ -68,7 +55,7 @@ struct MeshOptParameters { // Parameters controlling ...@@ -68,7 +55,7 @@ struct MeshOptParameters { // Parameters controlling
}; };
bool weakMerge; // If connected strategy: weak or strong merging of patches bool weakMerge; // If connected strategy: weak or strong merging of patches
}; };
virtual double elBadness(const MElement *el) = 0; // Pointer to function returning "badness" of element (for patch creation) virtual double elBadness(MElement *el) = 0; // Pointer to function returning "badness" of element (for patch creation)
virtual double maxDistance(const MElement *el) = 0; // Pointer to function checking the patch distance criterion for a given bad element virtual double maxDistance(const MElement *el) = 0; // Pointer to function checking the patch distance criterion for a given bad element
}; };
int dim ; // Which dimension to optimize int dim ; // Which dimension to optimize
...@@ -78,6 +65,8 @@ struct MeshOptParameters { // Parameters controlling ...@@ -78,6 +65,8 @@ struct MeshOptParameters { // Parameters controlling
std::vector<PassParameters> pass; std::vector<PassParameters> pass;
int optDisplay; // Sampling rate in opt. iterations for display int optDisplay; // Sampling rate in opt. iterations for display
int verbose; // Level of information displayed and written to disk int verbose; // Level of information displayed and written to disk
int success; // Success flag: -1 = fail, 0 = partial fail (target not reached), 1 = success
double CPU; // Time for optimization
}; };
......
...@@ -7,6 +7,13 @@ const double ObjContrib::BIGVAL = 1.e300; ...@@ -7,6 +7,13 @@ const double ObjContrib::BIGVAL = 1.e300;
ObjContrib::ObjContrib(std::string mesName, std::string name) : ObjContrib::ObjContrib(std::string mesName, std::string name) :
_min(0.), _max(0.), _measureName(mesName), _name(name) _parent(this), _min(BIGVAL), _max(-BIGVAL), _measureName(mesName), _name(name)
{ {
} }
void ObjContrib::updateResults()
{
_parent->_min = std::min(_parent->_min, _min);
_parent->_max = std::max(_parent->_max, _max);
}
...@@ -28,10 +28,11 @@ public: ...@@ -28,10 +28,11 @@ public:
virtual bool targetReached() = 0; virtual bool targetReached() = 0;
virtual bool stagnated() = 0; virtual bool stagnated() = 0;
virtual void updateMinMax() = 0; virtual void updateMinMax() = 0;
virtual void updateResults(MeshOptResults &res) const = 0; void updateResults();
protected: protected:
static const double BIGVAL; static const double BIGVAL;
ObjContrib *_parent;
std::string _measureName, _name; std::string _measureName, _name;
double _min, _max; double _min, _max;
}; };
......
...@@ -4,6 +4,33 @@ ...@@ -4,6 +4,33 @@
#include "MeshOptObjContribFunc.h" #include "MeshOptObjContribFunc.h"
const double ObjContribFuncSimpleTargetMin::STAGTHRESHOLD = 0.01;
ObjContribFuncSimpleTargetMin::ObjContribFuncSimpleTargetMin() :
_target(0.), _init(0.)
{
}
void ObjContribFuncSimpleTargetMin::setTarget(double target)
{
_target = target;
}
void ObjContribFuncSimpleTargetMin::updateParameters(double vMin, double vMax)
{
_init = vMin;
}
bool ObjContribFuncSimpleTargetMin::stagnated(double vMin, double vMax)
{
return (fabs((vMin-_init)/_init) < STAGTHRESHOLD);
}
const double ObjContribFuncBarrier::LOWMARGINMULT = 0.9; const double ObjContribFuncBarrier::LOWMARGINMULT = 0.9;
const double ObjContribFuncBarrier::UPMARGINMULT = 1.1; const double ObjContribFuncBarrier::UPMARGINMULT = 1.1;
const double ObjContribFuncBarrier::STAGTHRESHOLD = 0.01; const double ObjContribFuncBarrier::STAGTHRESHOLD = 0.01;
......
...@@ -19,6 +19,21 @@ protected: ...@@ -19,6 +19,21 @@ protected:
}; };
class ObjContribFuncSimpleTargetMin : public ObjContribFuncSimple
{
public:
ObjContribFuncSimpleTargetMin();
void setTarget(double target);
protected:
static const double STAGTHRESHOLD; // Threshold to consider that measures stagnates
double _target, _init;
void updateParameters(double vMin, double vMax);
bool targetReached(double vMin, double vMax) { return (vMin >= _target); }
bool stagnated(double vMin, double vMax);
};
class ObjContribFuncBarrier class ObjContribFuncBarrier
{ {
public: public:
......
...@@ -21,7 +21,6 @@ public: ...@@ -21,7 +21,6 @@ public:
virtual bool targetReached() { return FuncType::targetReached(_min, _max); } virtual bool targetReached() { return FuncType::targetReached(_min, _max); }
virtual bool stagnated() { return FuncType::stagnated(_min, _max); } virtual bool stagnated() { return FuncType::stagnated(_min, _max); }
virtual void updateMinMax(); virtual void updateMinMax();
virtual void updateResults(MeshOptResults &res) const;
protected: protected:
Patch *_mesh; Patch *_mesh;
...@@ -94,13 +93,4 @@ void ObjContribScaledNodeDispSq<FuncType>::updateMinMax() ...@@ -94,13 +93,4 @@ void ObjContribScaledNodeDispSq<FuncType>::updateMinMax()
} }
template<class FuncType>
void ObjContribScaledNodeDispSq<FuncType>::updateResults(MeshOptResults &res) const
{
const double scaleSq = 1./_mesh->invLengthScaleSq();
res.minNodeDisp = std::min(sqrt(_min*scaleSq), res.minNodeDisp);
res.maxNodeDisp = std::max(sqrt(_max*scaleSq), res.maxNodeDisp);
}
#endif /* _MESHOPTOBJCONTRIBSCALEDNODEDISPSQ_H_ */ #endif /* _MESHOPTOBJCONTRIBSCALEDNODEDISPSQ_H_ */
...@@ -48,10 +48,10 @@ void ObjectiveFunction::updateParameters() ...@@ -48,10 +48,10 @@ void ObjectiveFunction::updateParameters()
} }
void ObjectiveFunction::updateResults(MeshOptResults &res) void ObjectiveFunction::updateResults()
{ {
for (std::vector<ObjContrib*>::iterator it=begin(); it!=end(); it++) for (std::vector<ObjContrib*>::iterator it=begin(); it!=end(); it++)
(*it)->updateResults(res); (*it)->updateResults();
} }
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "ap.h" #include "ap.h"
class ObjContrib; class ObjContrib;
class MeshOptResults;
class Patch; class Patch;
...@@ -20,7 +19,7 @@ public: ...@@ -20,7 +19,7 @@ public:
std::string minMaxStr(); std::string minMaxStr();
void updateMinMax(); void updateMinMax();
void updateParameters(); void updateParameters();
void updateResults(MeshOptResults &res); void updateResults();
bool stagnated(); bool stagnated();
bool targetReached(); bool targetReached();
std::string failMeasures(); std::string failMeasures();
......
...@@ -252,10 +252,9 @@ static std::vector<std::pair<std::set<MElement*>, std::set<MVertex*> > > getConn ...@@ -252,10 +252,9 @@ static std::vector<std::pair<std::set<MElement*>, std::set<MVertex*> > > getConn
static void optimizeConnectedPatches static void optimizeConnectedPatches
(const std::map<MVertex*, std::vector<MElement *> > &vertex2elements, (const std::map<MVertex*, std::vector<MElement *> > &vertex2elements,
const std::map<MElement*,GEntity*> &element2entity, const std::map<MElement*,GEntity*> &element2entity,
std::set<MElement*> &badasses, std::set<MElement*> &badasses, MeshOptParameters &par)
MeshOptParameters &par, MeshOptResults &res)
{ {
res.success = 1; par.success = 1;
std::vector<std::pair<std::set<MElement*>, std::set<MVertex*> > > toOptimize = std::vector<std::pair<std::set<MElement*>, std::set<MVertex*> > > toOptimize =
getConnectedPatches(vertex2elements, badasses, par); getConnectedPatches(vertex2elements, badasses, par);
...@@ -288,11 +287,11 @@ static void optimizeConnectedPatches ...@@ -288,11 +287,11 @@ static void optimizeConnectedPatches
} }
// Evaluate mesh and update it if (partial) success // Evaluate mesh and update it if (partial) success
opt.updateResults(res); opt.updateResults();
if (success >= 0) opt.patch.updateGEntityPositions(); if (success >= 0) opt.patch.updateGEntityPositions();
//#pragma omp critical //#pragma omp critical
res.success = std::min(res.success, success); par.success = std::min(par.success, success);
} }
} }
...@@ -318,9 +317,9 @@ static MElement *getWorstElement(std::set<MElement*> &badElts, const MeshOptPara ...@@ -318,9 +317,9 @@ static MElement *getWorstElement(std::set<MElement*> &badElts, const MeshOptPara
static void optimizeOneByOne static void optimizeOneByOne
(const std::map<MVertex*, std::vector<MElement *> > &vertex2elements, (const std::map<MVertex*, std::vector<MElement *> > &vertex2elements,
const std::map<MElement*,GEntity*> &element2entity, const std::map<MElement*,GEntity*> &element2entity,
std::set<MElement*> badElts, MeshOptParameters &par, MeshOptResults &res) std::set<MElement*> badElts, MeshOptParameters &par)
{ {
res.success = 1; par.success = 1;
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);
...@@ -380,7 +379,7 @@ static void optimizeOneByOne ...@@ -380,7 +379,7 @@ static void optimizeOneByOne
// If (partial) success, update mesh and break adaptation loop, otherwise adapt // If (partial) success, update mesh and break adaptation loop, otherwise adapt
if ((success > 0) || (iAdapt == par.patchDef->maxAdaptPatch-1)) { if ((success > 0) || (iAdapt == par.patchDef->maxAdaptPatch-1)) {
opt.updateResults(res); opt.updateResults();
if (success >= 0) { if (success >= 0) {
opt.patch.updateGEntityPositions(); opt.patch.updateGEntityPositions();
break; break;
...@@ -405,7 +404,7 @@ static void optimizeOneByOne ...@@ -405,7 +404,7 @@ static void optimizeOneByOne
case -1: Msg::Info("Patch %i failed", iBadEl); break; case -1: Msg::Info("Patch %i failed", iBadEl); break;
} }
res.success = std::min(res.success, success); par.success = std::min(par.success, success);
} }
} }
...@@ -413,7 +412,7 @@ static void optimizeOneByOne ...@@ -413,7 +412,7 @@ static void optimizeOneByOne
#endif #endif
void meshOptimizer(GModel *gm, MeshOptParameters &par, MeshOptResults &res) void meshOptimizer(GModel *gm, MeshOptParameters &par)
{ {
#if defined(HAVE_BFGS) #if defined(HAVE_BFGS)
...@@ -447,22 +446,22 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par, MeshOptResults &res) ...@@ -447,22 +446,22 @@ void meshOptimizer(GModel *gm, MeshOptParameters &par, MeshOptResults &res)
} }
if (par.patchDef->strategy == MeshOptParameters::STRAT_CONNECTED) if (par.patchDef->strategy == MeshOptParameters::STRAT_CONNECTED)
optimizeConnectedPatches(vertex2elements, element2entity, badElts, par, res); optimizeConnectedPatches(vertex2elements, element2entity, badElts, par);
else if (par.patchDef->strategy == MeshOptParameters::STRAT_ONEBYONE) else if (par.patchDef->strategy == MeshOptParameters::STRAT_ONEBYONE)
optimizeOneByOne(vertex2elements, element2entity, badElts, par, res); optimizeOneByOne(vertex2elements, element2entity, badElts, par);
else else
Msg::Error("Unknown strategy %d for mesh optimization", par.patchDef->strategy); Msg::Error("Unknown strategy %d for mesh optimization", par.patchDef->strategy);
if (par.verbose > 0) { if (par.verbose > 0) {
if (res.success == 1) if (par.success == 1)
Msg::Info("Optimization succeeded"); Msg::Info("Optimization succeeded");
else if (res.success == 0) else if (par.success == 0)
Msg::Warning("Optimization partially failed (all measures above critical " Msg::Warning("Optimization partially failed (all measures above critical "
"value, but some below target)"); "value, but some below target)");
else if (res.success == -1) else if (par.success == -1)
Msg::Error("Optimization failed (some measures below critical value)"); Msg::Error("Optimization failed (some measures below critical value)");
res.CPU = Cpu()-startTime; par.CPU = Cpu()-startTime;
Msg::StatusBar(true, "Done optimizing mesh (%g s)", res.CPU); Msg::StatusBar(true, "Done optimizing mesh (%g s)", par.CPU);
} }
......
...@@ -33,10 +33,9 @@ ...@@ -33,10 +33,9 @@
class GModel; class GModel;
class MeshOptParameters; class MeshOptParameters;
class MeshOptResults;
void meshOptimizer(GModel *gm, MeshOptParameters &par, MeshOptResults &res); void meshOptimizer(GModel *gm, MeshOptParameters &par);
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment