netgen/libsrc/meshing/improve3.hpp

100 lines
2.6 KiB
C++
Raw Normal View History

2009-01-13 04:40:13 +05:00
#ifndef FILE_IMPROVE3
#define FILE_IMPROVE3
///
class MeshOptimize3d
{
public:
void CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY,
const BitArray * working_elements = NULL);
void SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY,
const BitArray * working_elements = NULL,
2009-01-25 17:35:25 +05:00
const Array< Array<int,PointIndex::BASE>* > * idmaps = NULL);
2009-01-13 04:40:13 +05:00
void SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
};
extern double CalcBad (const Mesh::T_POINTS & points, const Element & elem,
double h);
extern double CalcTotalBad (const Mesh::T_POINTS & points,
const Mesh::T_VOLELEMENTS & elements);
extern int WrongOrientation (const Mesh::T_POINTS & points, const Element & el);
/* Functional depending of inner point inside triangular surface */
class MinFunctionSum : public MinFunction
{
protected:
2009-01-25 17:35:25 +05:00
Array<MinFunction*> functions;
2009-01-13 04:40:13 +05:00
public:
virtual double Func (const Vector & x) const;
virtual void Grad (const Vector & x, Vector & g) const;
virtual double FuncGrad (const Vector & x, Vector & g) const;
virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
virtual double GradStopping (const Vector & x) const;
void AddFunction(MinFunction & fun);
const MinFunction & Function(int i) const;
MinFunction & Function(int i);
};
class PointFunction1 : public MinFunction
{
Mesh::T_POINTS & points;
2009-01-25 17:35:25 +05:00
const Array<INDEX_3> & faces;
2009-01-13 04:40:13 +05:00
double h;
public:
PointFunction1 (Mesh::T_POINTS & apoints,
2009-01-25 17:35:25 +05:00
const Array<INDEX_3> & afaces,
2009-01-13 04:40:13 +05:00
double ah);
virtual double Func (const Vector & x) const;
virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
virtual double FuncGrad (const Vector & x, Vector & g) const;
virtual double GradStopping (const Vector & x) const;
};
class JacobianPointFunction : public MinFunction
{
public:
Mesh::T_POINTS & points;
const Mesh::T_VOLELEMENTS & elements;
TABLE<INDEX> elementsonpoint;
PointIndex actpind;
bool onplane;
Vec<3> nv;
public:
JacobianPointFunction (Mesh::T_POINTS & apoints,
const Mesh::T_VOLELEMENTS & aelements);
virtual void SetPointIndex (PointIndex aactpind);
virtual double Func (const Vector & x) const;
virtual double FuncGrad (const Vector & x, Vector & g) const;
virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
inline void SetNV(const Vec<3> & anv) {nv = anv; onplane = true;}
inline void UnSetNV(void) {onplane = false;}
};
#endif