non-global variable mparam

This commit is contained in:
Joachim Schoeberl 2011-07-25 11:33:19 +00:00
parent 3a43cec5d7
commit 9c4f4221ec
26 changed files with 117 additions and 73 deletions

View File

@ -42,7 +42,7 @@ AC_ARG_WITH([occ],
if test a$occon = atrue ; then
AC_SUBST([OCCFLAGS], ["-DOCCGEOMETRY -I$occdir/inc"])
AC_SUBST([OCCFLAGS], ["-DOCCGEOMETRY -I$occdir/inc -I/usr/include/opencascade"])
AC_SUBST([OCCLIBS], ["-L$occdir/lib -lTKernel -lTKGeomBase -lTKMath -lTKG2d -lTKG3d -lTKXSBase -lTKOffset -lTKFillet -lTKShHealing -lTKMesh -lTKMeshVS -lTKTopAlgo -lTKGeomAlgo -lTKBool -lTKPrim -lTKBO -lTKIGES -lTKBRep -lTKSTEPBase -lTKSTEP -lTKSTL -lTKSTEPAttr -lTKSTEP209 -lTKXDESTEP -lTKXDEIGES -lTKXCAF -lTKLCAF -lFWOSPlugin"])
# -lTKDCAF

View File

@ -11,6 +11,8 @@
namespace netgen
{
extern DLL_HEADER MeshingParameters mparam;
/*
Special Point Calculation

View File

@ -3,6 +3,7 @@
namespace netgen
{
extern DLL_HEADER MeshingParameters mparam;
extern void Optimize2d (Mesh & mesh, MeshingParameters & mp);

View File

@ -15,8 +15,6 @@
#include "nginterface.h"
#ifdef _MSC_VER
// Philippose - 30/01/2009
// MSVC Express Edition Support
@ -104,6 +102,7 @@ namespace netgen
{
#include "writeuser.hpp"
MeshingParameters mparam;
// global variable mesh (should not be used in libraries)
AutoPtr<Mesh> mesh;

View File

@ -562,7 +562,7 @@ namespace netgen
for(j = 1; j <= vertelems.Size(); j++)
{
double sfact = 0.9;
// double sfact = 0.9;
Element volel = mesh.VolumeElement(vertelems.Elem(j));
if(((volel.GetType() == TET) || (volel.GetType() == TET10)) && (!volel.IsDeleted()))
{

View File

@ -890,7 +890,7 @@ namespace netgen
tempmesh.FreeOpenElementsEnvironment (1);
MeshOptimize3d meshopt;
MeshOptimize3d meshopt(mp);
// tempmesh.CalcSurfacesOfNode();
meshopt.SwapImprove(tempmesh, OPT_CONFORM);
}

View File

@ -160,7 +160,7 @@ namespace netgen
{
cout << "2D Delaunay meshing (in progress)" << endl;
int oldnp = mesh.GetNP();
// int oldnp = mesh.GetNP();
cout << "np, old = " << mesh.GetNP() << endl;

View File

@ -23,7 +23,6 @@ namespace netgen
int silentflag = 0;
int testmode = 0;
MeshingParameters mparam;
volatile multithreadt multithread;
string ngdir = ".";

View File

@ -25,7 +25,7 @@ namespace netgen
/// calling parameters
// extern Flags parameters;
extern DLL_HEADER MeshingParameters mparam;
// extern DLL_HEADER MeshingParameters mparam;
extern Array<int> tets_in_qualclass;

View File

@ -160,8 +160,9 @@ void MeshOptimize3d :: CombineImprove (Mesh & mesh,
for (int k = 0; k < hasonepi.Size(); k++)
{
const Element & elem = mesh[hasonepi[k]];
double err = CalcTetBadness (mesh[elem[0]], mesh[elem[1]],
mesh[elem[2]], mesh[elem[3]], 0, mparam);
double err = CalcBad (mesh.Points(), elem, 0);
// CalcTetBadness (mesh[elem[0]], mesh[elem[1]],
// mesh[elem[2]], mesh[elem[3]], 0, mparam);
bad2 += err;
oneperr[k] = err;
}
@ -475,7 +476,7 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
}
}
PointFunction1 pf (mesh.Points(), locfaces, -1);
PointFunction1 pf (mesh.Points(), locfaces, mp, -1);
OptiParameters par;
par.maxit_linsearch = 50;
par.maxit_bfgs = 20;

View File

@ -2,12 +2,17 @@
#define FILE_IMPROVE3
extern double CalcTotalBad (const Mesh::T_POINTS & points,
const Mesh::T_VOLELEMENTS & elements,
const MeshingParameters & mp);
///
class MeshOptimize3d
{
const MeshingParameters & mp;
public:
MeshOptimize3d (const MeshingParameters & amp) : mp(amp) { ; }
void CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY,
@ -16,13 +21,28 @@ public:
const BitArray * working_elements = NULL,
const Array< Array<int,PointIndex::BASE>* > * idmaps = NULL);
void SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
double
CalcBad (const Mesh::T_POINTS & points, const Element & elem, double h)
{
if (elem.GetType() == TET)
return CalcTetBadness (points[elem[0]], points[elem[1]],
points[elem[2]], points[elem[3]], h, mp);
return 0;
}
double CalcTotalBad (const Mesh::T_POINTS & points,
const Mesh::T_VOLELEMENTS & elements)
{
return netgen::CalcTotalBad (points, elements, mp);
}
};
inline double
CalcBad (const Mesh::T_POINTS & points, const Element & elem,
double h, const MeshingParameters & mp = mparam)
CalcBad (const Mesh::T_POINTS & points, const Element & elem, double h, const MeshingParameters & mp)
{
if (elem.GetType() == TET)
return CalcTetBadness (points[elem[0]], points[elem[1]],
@ -32,11 +52,6 @@ CalcBad (const Mesh::T_POINTS & points, const Element & elem,
extern double CalcTotalBad (const Mesh::T_POINTS & points,
const Mesh::T_VOLELEMENTS & elements,
const MeshingParameters & mp = mparam);
extern int WrongOrientation (const Mesh::T_POINTS & points, const Element & el);
@ -63,15 +78,16 @@ public:
};
class PointFunction1 : public MinFunction
{
Mesh::T_POINTS & points;
const Array<INDEX_3> & faces;
const MeshingParameters & mp;
double h;
public:
PointFunction1 (Mesh::T_POINTS & apoints,
const Array<INDEX_3> & afaces,
const MeshingParameters & amp,
double ah);
virtual double Func (const Vector & x) const;
@ -80,7 +96,6 @@ public:
virtual double GradStopping (const Vector & x) const;
};
class JacobianPointFunction : public MinFunction
{
public:

View File

@ -5461,15 +5461,21 @@ namespace netgen
bool Mesh :: PureTrigMesh (int faceindex) const
{
if (!faceindex)
return !mparam.quad;
// if (!faceindex) return !mparam.quad;
int i;
for (i = 1; i <= GetNSE(); i++)
if (!faceindex)
{
for (int i = 1; i <= GetNSE(); i++)
if (SurfaceElement(i).GetNP() != 3)
return false;
return true;
}
for (int i = 1; i <= GetNSE(); i++)
if (SurfaceElement(i).GetIndex() == faceindex &&
SurfaceElement(i).GetNP() != 3)
return 0;
return 1;
return false;
return true;
}
bool Mesh :: PureTetMesh () const

View File

@ -487,12 +487,13 @@ namespace netgen
///
void ImproveMesh (OPTIMIZEGOAL goal = OPT_QUALITY);
void ImproveMesh (const MeshingParameters & mp, OPTIMIZEGOAL goal = OPT_QUALITY);
///
void ImproveMeshJacobian (OPTIMIZEGOAL goal = OPT_QUALITY, const BitArray * usepoint = NULL);
void ImproveMeshJacobian (const MeshingParameters & mp, OPTIMIZEGOAL goal = OPT_QUALITY, const BitArray * usepoint = NULL);
///
void ImproveMeshJacobianOnSurface (const BitArray & usepoint,
void ImproveMeshJacobianOnSurface (const MeshingParameters & mp,
const BitArray & usepoint,
const Array< Vec<3>* > & nv,
OPTIMIZEGOAL goal = OPT_QUALITY,
const Array< Array<int,PointIndex::BASE>* > * idmaps = NULL);

View File

@ -258,7 +258,7 @@ namespace netgen
// mesh3d.Save ("tmp.vol");
MeshOptimize3d optmesh;
MeshOptimize3d optmesh(mp);
const char * optstr = "mcmstmcmstmcmstmcm";
size_t j;
@ -274,7 +274,7 @@ namespace netgen
case 'd': optmesh.SplitImprove(mesh3d, OPT_REST); break;
case 's': optmesh.SwapImprove(mesh3d, OPT_REST); break;
case 't': optmesh.SwapImprove2(mesh3d, OPT_REST); break;
case 'm': mesh3d.ImproveMesh(OPT_REST); break;
case 'm': mesh3d.ImproveMesh(mp, OPT_REST); break;
}
}
@ -648,7 +648,7 @@ namespace netgen
if (multithread.terminate)
break;
MeshOptimize3d optmesh;
MeshOptimize3d optmesh(mp);
// teterrpow = mp.opterrpow;
for (size_t j = 1; j <= strlen(mp.optimize3d); j++)
@ -667,10 +667,10 @@ namespace netgen
case 'm': mesh3d.ImproveMesh(*geometry); break;
case 'M': mesh3d.ImproveMesh(*geometry); break;
#else
case 'm': mesh3d.ImproveMesh(); break;
case 'M': mesh3d.ImproveMesh(); break;
case 'm': mesh3d.ImproveMesh(mp); break;
case 'M': mesh3d.ImproveMesh(mp); break;
#endif
case 'j': mesh3d.ImproveMeshJacobian(); break;
case 'j': mesh3d.ImproveMeshJacobian(mp); break;
}
}
mesh3d.mglevels = 1;
@ -698,7 +698,8 @@ namespace netgen
nillegal = mesh3d.MarkIllegalElements();
MeshOptimize3d optmesh;
MeshingParameters dummymp;
MeshOptimize3d optmesh(dummymp);
while (nillegal && (it--) > 0)
{
if (multithread.terminate)

View File

@ -751,7 +751,7 @@ namespace netgen
{
rulenr = ApplyRules (plainpoints, legalpoints, maxlegalpoint,
loclines, maxlegalline, locelements,
dellines, qualclass);
dellines, qualclass, mp);
// (*testout) << "Rule Nr = " << rulenr << endl;
if (!rulenr)
{

View File

@ -141,7 +141,8 @@ protected:
Array<INDEX_2> & llines,
int maxlegelline,
Array<Element2d> & elements, Array<INDEX> & dellines,
int tolerance);
int tolerance,
const MeshingParameters & mp);
};

View File

@ -49,13 +49,13 @@ extern int CheckCode ();
extern double CalcTetBadness (const Point3d & p1, const Point3d & p2,
const Point3d & p3, const Point3d & p4,
double h,
const MeshingParameters & mp = mparam);
const MeshingParameters & mp);
///
extern double CalcTetBadnessGrad (const Point3d & p1, const Point3d & p2,
const Point3d & p3, const Point3d & p4,
double h, int pi,
Vec<3> & grad,
const MeshingParameters & mp = mparam);
const MeshingParameters & mp);
/** Calculates volume of an element.

View File

@ -1535,6 +1535,7 @@ namespace netgen
{
cout << "GetNodesLocal not impelemented for element " << GetType() << endl;
np = 0;
pp = NULL;
}
}

View File

@ -719,7 +719,8 @@ namespace netgen
mesh.CalcSurfacesOfNode();
free.Invert();
mesh.FixPoints (free);
mesh.ImproveMesh (OPT_REST);
MeshingParameters dummymp;
mesh.ImproveMesh (dummymp, OPT_REST);
wrongels = 0;

View File

@ -51,7 +51,8 @@ namespace netgen
Array<INDEX_2> & llines1,
int maxlegalline,
Array<Element2d> & elements,
Array<INDEX> & dellines, int tolerance)
Array<INDEX> & dellines, int tolerance,
const MeshingParameters & mp)
{
static int timer = NgProfiler::CreateTimer ("meshing2::ApplyRules");
NgProfiler::RegionTimer reg (timer);
@ -627,7 +628,7 @@ namespace netgen
for (int i = 1; i <= elements.Size(); i++)
{
double hf;
if (!mparam.quad)
if (!mp.quad)
hf = CalcElementBadness (lpoints, elements.Get(i));
else
hf = elements.Get(i).CalcJacobianBadness (lpoints) * 5;

View File

@ -457,7 +457,8 @@ namespace netgen
while (wrongels && cnttrials > 0);
mesh.CalcSurfacesOfNode();
mesh.ImproveMeshJacobian (OPT_WORSTCASE);
MeshingParameters dummymp;
mesh.ImproveMeshJacobian (dummymp, OPT_WORSTCASE);
facok = factry;
for (int i = 1; i <= np; i++)

View File

@ -87,11 +87,11 @@ namespace netgen
return *functions[i];
}
PointFunction1 :: PointFunction1 (Mesh::T_POINTS & apoints,
const Array<INDEX_3> & afaces,
const MeshingParameters & amp,
double ah)
: points(apoints), faces(afaces)
: points(apoints), faces(afaces), mp(amp)
{
h = ah;
}
@ -109,7 +109,7 @@ namespace netgen
double bad = CalcTetBadness (points[el.I1()],
points[el.I3()],
points[el.I2()],
pp, 0);
pp, 0, mp);
badness += bad;
}
@ -170,8 +170,6 @@ namespace netgen
}
/* Cheap Functional depending of inner point inside triangular surface */
// is it used ????
@ -304,12 +302,14 @@ namespace netgen
Mesh::T_POINTS & points;
const Mesh::T_VOLELEMENTS & elements;
TABLE<int,PointIndex::BASE> elementsonpoint;
const MeshingParameters & mp;
PointIndex actpind;
double h;
public:
PointFunction (Mesh::T_POINTS & apoints,
const Mesh::T_VOLELEMENTS & aelements);
const Mesh::T_VOLELEMENTS & aelements,
const MeshingParameters & amp);
virtual void SetPointIndex (PointIndex aactpind);
void SetLocalH (double ah) { h = ah; }
@ -323,8 +323,9 @@ namespace netgen
PointFunction :: PointFunction (Mesh::T_POINTS & apoints,
const Mesh::T_VOLELEMENTS & aelements)
: points(apoints), elements(aelements), elementsonpoint(apoints.Size())
const Mesh::T_VOLELEMENTS & aelements,
const MeshingParameters & amp)
: points(apoints), elements(aelements), elementsonpoint(apoints.Size()), mp(amp)
{
for (int i = 0; i < elements.Size(); i++)
if (elements[i].NP() == 4)
@ -351,7 +352,7 @@ namespace netgen
{
const Element & el = elements[elementsonpoint[actpind][j]];
badness += CalcTetBadness (points[el[0]], points[el[1]],
points[el[2]], points[el[3]], -1);
points[el[2]], points[el[3]], -1, mp);
}
points[actpind] = Point<3> (hp);
@ -375,7 +376,7 @@ namespace netgen
{
f += CalcTetBadnessGrad (points[el[0]], points[el[1]],
points[el[2]], points[el[3]],
-1, k+1, vgradi);
-1, k+1, vgradi, mp);
vgrad += vgradi;
}
@ -407,7 +408,7 @@ namespace netgen
f += CalcTetBadnessGrad (points[el.PNum(1)],
points[el.PNum(2)],
points[el.PNum(3)],
points[el.PNum(4)], -1, k, vgradi);
points[el.PNum(4)], -1, k, vgradi, mp);
vgrad += vgradi;
}
@ -476,7 +477,8 @@ namespace netgen
DenseMatrix m;
public:
CheapPointFunction (Mesh::T_POINTS & apoints,
const Mesh::T_VOLELEMENTS & aelements);
const Mesh::T_VOLELEMENTS & aelements,
const MeshingParameters & amp);
virtual void SetPointIndex (PointIndex aactpind);
virtual double PointFunctionValue (const Point<3> & pp) const;
virtual double PointFunctionValueGrad (const Point<3> & pp, Vec<3> & grad) const;
@ -484,8 +486,9 @@ namespace netgen
CheapPointFunction :: CheapPointFunction (Mesh::T_POINTS & apoints,
const Mesh::T_VOLELEMENTS & aelements)
: PointFunction (apoints, aelements)
const Mesh::T_VOLELEMENTS & aelements,
const MeshingParameters & amp)
: PointFunction (apoints, aelements, amp)
{
;
}
@ -930,7 +933,7 @@ double CalcTotalBad (const Mesh::T_POINTS & points,
for (int i = 1; i <= elements.Size(); i++)
{
elbad = pow (max2(CalcBad (points, elements.Get(i), 0),1e-10),
elbad = pow (max2(CalcBad (points, elements.Get(i), 0, mp),1e-10),
1/teterrpow);
int qualclass = int (20 / elbad + 1);
@ -1348,7 +1351,7 @@ void Mesh :: ImproveMesh (const CSGeometry & geometry, OPTIMIZEGOAL goal)
void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
void Mesh :: ImproveMesh (const MeshingParameters & mp, OPTIMIZEGOAL goal)
{
int typ = 1;
@ -1373,7 +1376,7 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
if (el.GetType() != TET)
continue;
double hbad = CalcBad (points, el, 0);
double hbad = CalcBad (points, el, 0, mp);
for (int j = 0; j < 4; j++)
perrs[el[j]] += hbad;
@ -1388,7 +1391,7 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
if (goal == OPT_QUALITY)
{
bad1 = CalcTotalBad (points, volelements);
bad1 = CalcTotalBad (points, volelements, mp);
(*testout) << "Total badness = " << bad1 << endl;
PrintMessage (5, "Total badness = ", bad1);
}
@ -1403,9 +1406,9 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
PointFunction * pf;
if (typ == 1)
pf = new PointFunction(points, volelements);
pf = new PointFunction(points, volelements, mp);
else
pf = new CheapPointFunction(points, volelements);
pf = new CheapPointFunction(points, volelements, mp);
// pf->SetLocalH (h);
@ -1508,7 +1511,7 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
if (goal == OPT_QUALITY)
{
bad1 = CalcTotalBad (points, volelements);
bad1 = CalcTotalBad (points, volelements, mp);
(*testout) << "Total badness = " << bad1 << endl;
PrintMessage (5, "Total badness = ", bad1);
}
@ -1518,7 +1521,8 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
// Improve Condition number of Jacobian, any elements
void Mesh :: ImproveMeshJacobian (OPTIMIZEGOAL goal, const BitArray * usepoint)
void Mesh :: ImproveMeshJacobian (const MeshingParameters & mp,
OPTIMIZEGOAL goal, const BitArray * usepoint)
{
int i, j;
@ -1638,7 +1642,8 @@ void Mesh :: ImproveMeshJacobian (OPTIMIZEGOAL goal, const BitArray * usepoint)
// Improve Condition number of Jacobian, any elements
void Mesh :: ImproveMeshJacobianOnSurface (const BitArray & usepoint,
void Mesh :: ImproveMeshJacobianOnSurface (const MeshingParameters & mp,
const BitArray & usepoint,
const Array< Vec<3>* > & nv,
OPTIMIZEGOAL goal,
const Array< Array<int,PointIndex::BASE>* > * idmaps)

View File

@ -156,7 +156,7 @@ void CutOffAndCombine (Mesh & mesh, const Mesh & othermesh)
mesh.AddLockedPoint (pmat.Elem(i));
mesh.CalcSurfacesOfNode();
mesh.CalcLocalH(mparam.grading);
mesh.CalcLocalH(0.3);
}

View File

@ -376,7 +376,8 @@ namespace netgen
// smooth faces
mesh.CalcSurfacesOfNode();
mesh.ImproveMeshJacobianOnSurface(isworkingboundary,nv,OPT_QUALITY,&idmaps);
MeshingParameters dummymp;
mesh.ImproveMeshJacobianOnSurface(dummymp,isworkingboundary,nv,OPT_QUALITY, &idmaps);
for (int i = 1; i <= np; i++)
*can.Elem(i) = mesh.Point(i);
@ -447,7 +448,8 @@ namespace netgen
mesh.CalcSurfacesOfNode();
mesh.ImproveMeshJacobian (OPT_QUALITY,&working_points);
MeshingParameters dummymp;
mesh.ImproveMeshJacobian (dummymp, OPT_QUALITY,&working_points);
//mesh.ImproveMeshJacobian (OPT_WORSTCASE,&working_points);
@ -460,7 +462,8 @@ namespace netgen
cnttrials < maxtrials &&
multithread.terminate != 1)
{
MeshOptimize3d optmesh;
MeshingParameters dummymp;
MeshOptimize3d optmesh(dummymp);
for(int i=0; i<numtopimprove; i++)
{
optmesh.SwapImproveSurface(mesh,OPT_QUALITY,&working_elements,&idmaps);
@ -507,7 +510,8 @@ namespace netgen
}
MeshOptimize3d optmesh;
MeshingParameters dummymp;
MeshOptimize3d optmesh(dummymp);
for(int i=0; i<numtopimprove && multithread.terminate != 1; i++)
{
optmesh.SwapImproveSurface(mesh,OPT_QUALITY,NULL,&idmaps);

View File

@ -114,6 +114,8 @@ namespace netgen
{
#include "occmeshsurf.hpp"
extern DLL_HEADER MeshingParameters mparam;
#define PROJECTION_TOLERANCE 1e-10
#define ENTITYISVISIBLE 1
@ -301,7 +303,7 @@ namespace netgen
{
if((facenr> 0) && (facenr <= fmap.Extent()))
{
face_maxh[facenr-1] = min(mparam.maxh,faceh);
face_maxh[facenr-1] = min(mparam.maxh,faceh);
// Philippose - 14/01/2010
// If the face maxh is greater than or equal to the

View File

@ -29,6 +29,9 @@ namespace netgen
extern int IsInArray(int n, const Array<int>& ia);
extern int AddIfNotExists(Array<int>& list, int x);
extern DLL_HEADER MeshingParameters mparam;
#include "stltopology.hpp"
#include "stltool.hpp"