vector/matrix access, small optimization in CalcTetBadness

This commit is contained in:
Joachim Schoeberl 2009-06-06 19:33:32 +00:00
parent 35bc5819db
commit 611a53801d
34 changed files with 4191 additions and 4314 deletions

View File

@ -1,4 +1,4 @@
AC_INIT([netgen],[4.9.9],[],[])
AC_INIT([netgen],[4.9.10-dev],[],[])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_MACRO_DIR([m4])

View File

@ -587,8 +587,6 @@ Vec<D> SplineSeg3<D> :: GetTangent (const double t) const
template<int D>
void SplineSeg3<D> :: GetCoeff (Vector & u) const
{
double t;
int i;
Point<D> p;
DenseMatrix a(6, 6);
DenseMatrix ata(6, 6);
@ -598,23 +596,23 @@ void SplineSeg3<D> :: GetCoeff (Vector & u) const
// ata.SetSymmetric(1);
t = 0;
for (i = 1; i <= 5; i++, t += 0.25)
double t = 0;
for (int i = 0; i < 5; i++, t += 0.25)
{
p = GetPoint (t);
a.Elem(i, 1) = p(0) * p(0);
a.Elem(i, 2) = p(1) * p(1);
a.Elem(i, 3) = p(0) * p(1);
a.Elem(i, 4) = p(0);
a.Elem(i, 5) = p(1);
a.Elem(i, 6) = 1;
a(i, 0) = p(0) * p(0);
a(i, 1) = p(1) * p(1);
a(i, 2) = p(0) * p(1);
a(i, 3) = p(0);
a(i, 4) = p(1);
a(i, 5) = 1;
}
a.Elem(6, 1) = 1;
a(5, 0) = 1;
CalcAtA (a, ata);
u = 0;
u.Elem(6) = 1;
u(5) = 1;
a.MultTrans (u, f);
ata.Solve (f, u);
}

View File

@ -23,12 +23,12 @@ IntersectTriangleLine (const Point<3> ** tri, const Point<3> ** line)
<< "tri = " << *tri[0] << ", " << *tri[1] << ", " << *tri[2] << endl
<< "line = " << *line[0] << ", " << *line[1] << endl;
*/
for (i = 1; i <= 3; i++)
for (i = 0; i < 3; i++)
{
a.Elem(i, 1) = -vl.X(i);
a.Elem(i, 2) = vt1.X(i);
a.Elem(i, 3) = vt2.X(i);
rs.Elem(i) = vrs.X(i);
a(i, 0) = -vl.X(i+1);
a(i, 1) = vt1.X(i+1);
a(i, 2) = vt2.X(i+1);
rs(i) = vrs.X(i+1);
}
double det = a.Det();
@ -70,12 +70,12 @@ IntersectTriangleLine (const Point<3> ** tri, const Point<3> ** line)
double eps = 1e-6;
if (
(lami.Get(1) >= -eps && lami.Get(1) <= 1+eps &&
lami.Get(2) >= -eps && lami.Get(3) >= -eps &&
lami.Get(2) + lami.Get(3) <= 1+eps) && !
(lami.Get(1) >= eps && lami.Get(1) <= 1-eps &&
lami.Get(2) >= eps && lami.Get(3) >= eps &&
lami.Get(2) + lami.Get(3) <= 1-eps) )
(lami(0) >= -eps && lami(0) <= 1+eps &&
lami(1) >= -eps && lami(2) >= -eps &&
lami(1) + lami(2) <= 1+eps) && !
(lami(0) >= eps && lami(0) <= 1-eps &&
lami(1) >= eps && lami(2) >= eps &&
lami(1) + lami(2) <= 1-eps) )
{
@ -97,8 +97,8 @@ IntersectTriangleLine (const Point<3> ** tri, const Point<3> ** line)
}
if (lami.Get(1) >= 0 && lami.Get(1) <= 1 &&
lami.Get(2) >= 0 && lami.Get(3) >= 0 && lami.Get(2) + lami.Get(3) <= 1)
if (lami(0) >= 0 && lami(0) <= 1 &&
lami(1) >= 0 && lami(2) >= 0 && lami(1) + lami(2) <= 1)
{
return 1;
@ -860,12 +860,12 @@ int CalcTriangleCenter (const Point3d ** pts, Point3d & c)
Vec3d v1(*pts[0], *pts[1]);
Vec3d v2(*pts[0], *pts[2]);
rs.Elem(1) = v1 * v1;
rs.Elem(2) = v2 * v2;
rs(0) = v1 * v1;
rs(1) = v2 * v2;
a.Elem(1,1) = 2 * rs.Get(1);
a.Elem(1,2) = a.Elem(2,1) = 2 * (v1 * v2);
a.Elem(2,2) = 2 * rs.Get(2);
a(0,0) = 2 * rs(0);
a(0,1) = a(1,0) = 2 * (v1 * v2);
a(1,1) = 2 * rs(1);
if (fabs (a.Det()) <= 1e-12 * h * h)
{
@ -877,8 +877,8 @@ int CalcTriangleCenter (const Point3d ** pts, Point3d & c)
inva.Mult (rs, sol);
c = *pts[0];
v1 *= sol.Get(1);
v2 *= sol.Get(2);
v1 *= sol(0);
v2 *= sol(1);
c += v1;
c += v2;

View File

@ -90,21 +90,21 @@ void Transformation3d :: CalcInverse (Transformation3d & inv) const
static Vector b(3), sol(3);
int i, j;
for (i = 1; i <= 3; i++)
for (int i = 0; i < 3; i++)
{
b.Elem(i) = offset[i-1];
for (j = 1; j <= 3; j++)
a.Elem(i, j) = lin[i-1][j-1];
b(i) = offset[i];
for (j = 0; j < 3; j++)
a(i, j) = lin[i][j];
}
::netgen::CalcInverse (a, inva);
inva.Mult (b, sol);
for (i = 1; i <= 3; i++)
for (int i = 0; i < 3; i++)
{
inv.offset[i-1] = -sol.Get(i);
for (j = 1; j <= 3; j++)
inv.lin[i-1][j-1] = inva.Elem(i, j);
inv.offset[i] = -sol(i);
for (j = 0; j < 3; j++)
inv.lin[i][j] = inva(i, j);
}
}

View File

@ -2,6 +2,8 @@ noinst_HEADERS = densemat.hpp linalg.hpp polynomial.hpp vector.hpp opti.hpp
AM_CPPFLAGS = -I$(top_srcdir)/libsrc/include
METASOURCES = AUTO
noinst_LTLIBRARIES = libla.la
libla_la_SOURCES = densemat.cpp polynomial.cpp vector.cpp bfgs.cpp linopt.cpp linsearch.cpp
libla_la_SOURCES = densemat.cpp polynomial.cpp bfgs.cpp linopt.cpp linsearch.cpp
# vector.cpp
libla_la_LDFLAGS = -rdynamic

View File

@ -1,9 +1,9 @@
/***************************************************************************/
/* */
/* Vorlesung Optimierung I, Gfrerer, WS94/95 */
/* BFGS-Verfahren zur Lösung freier nichtlinearer Optimierungsprobleme */
/* BFGS-Verfahren zur Lösung freier nichtlinearer Optimierungsprobleme */
/* */
/* Programmautor: Joachim Schöberl */
/* Programmautor: Joachim Schöberl */
/* Matrikelnummer: 9155284 */
/* */
/***************************************************************************/
@ -25,37 +25,36 @@ void Cholesky (const DenseMatrix & a,
double x;
int i, j, k;
int n = a.Height();
// (*testout) << "a = " << a << endl;
l = a;
for (i = 1; i <= n; i++)
for (int i = 1; i <= n; i++)
{
for (j = i; j <= n; j++)
for (int j = i; j <= n; j++)
{
x = l.Get(i, j);
for (k = 1; k < i; k++)
x -= l.Get(i, k) * l.Get(j, k) * d.Get(k);
for (int k = 1; k < i; k++)
x -= l.Get(i, k) * l.Get(j, k) * d(k-1);
if (i == j)
{
d.Elem(i) = x;
d(i-1) = x;
}
else
{
l.Elem(j, i) = x / d.Get(k);
l.Elem(j, i) = x / d(i-1);
}
}
}
for (i = 1; i <= n; i++)
for (int i = 1; i <= n; i++)
{
l.Elem(i, i) = 1;
for (j = i+1; j <= n; j++)
for (int j = i+1; j <= n; j++)
l.Elem(i, j) = 0;
}
@ -162,9 +161,7 @@ int LDLtUpdate (DenseMatrix & l, Vector & d, double a, const Vector & u)
// Rueckgabewert: 0 .. D bleibt positiv definit
// 1 .. sonst
int i, j, n;
n = l.Height();
int n = l.Height();
Vector v(n);
double t, told, xi;
@ -172,9 +169,9 @@ int LDLtUpdate (DenseMatrix & l, Vector & d, double a, const Vector & u)
told = 1;
v = u;
for (j = 1; j <= n; j++)
for (int j = 1; j <= n; j++)
{
t = told + a * sqr (v.Elem(j)) / d.Get(j);
t = told + a * sqr (v(j-1)) / d(j-1);
if (t <= 0)
{
@ -182,14 +179,14 @@ int LDLtUpdate (DenseMatrix & l, Vector & d, double a, const Vector & u)
return 1;
}
xi = a * v.Elem(j) / (d.Get(j) * t);
xi = a * v(j-1) / (d(j-1) * t);
d.Elem(j) *= t / told;
d(j-1) *= t / told;
for (i = j + 1; i <= n; i++)
for (int i = j + 1; i <= n; i++)
{
v.Elem(i) -= v.Elem(j) * l.Elem(i, j);
l.Elem(i, j) += xi * v.Elem(i);
v(i-1) -= v(j-1) * l.Elem(i, j);
l.Elem(i, j) += xi * v(i-1);
}
told = t;
@ -209,7 +206,7 @@ double BFGS (
{
int i, j, n = x.Size();
int n = x.Size();
long it;
char a1crit, a3acrit;
@ -233,14 +230,14 @@ double BFGS (
int ifail; // o: 0 .. Erfolg
// -1 .. Unterschreitung von fmin
// 1 .. kein Erfolg bei Liniensuche
// 2 .. Überschreitung von itmax
// 2 .. Überschreitung von itmax
typx = par.typx;
typf = par.typf;
l = 0;
for (i = 1; i <= n; i++)
for (int i = 1; i <= n; i++)
l.Elem(i, i) = 1;
f = fun.FuncGrad (x, g);
@ -255,10 +252,10 @@ double BFGS (
if (it % (5 * n) == 0)
{
for (i = 1; i <= n; i++)
d.Elem(i) = typf/ sqr (typx.Get(i)); // 1;
for (i = 2; i <= n; i++)
for (j = 1; j < i; j++)
for (int i = 1; i <= n; i++)
d(i-1) = typf/ sqr (typx(i-1)); // 1;
for (int i = 2; i <= n; i++)
for (int j = 1; j < i; j++)
l.Elem(i, j) = 0;
/*
@ -357,8 +354,8 @@ double BFGS (
hd = eps * max2 (typf, fabs (f));
a1crit = 1;
for (i = 1; i <= n; i++)
if ( fabs (g.Elem(i)) * max2 (typx.Elem(i), fabs (x.Elem(i))) > hd)
for (int i = 1; i <= n; i++)
if ( fabs (g(i-1)) * max2 (typx(i-1), fabs (x(i-1))) > hd)
a1crit = 0;

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
#define FILE_DENSEMAT
/**************************************************************************/
/* File: densemat.hh */
/* File: densemat.hpp */
/* Author: Joachim Schoeberl */
/* Date: 01. Oct. 94 */
/**************************************************************************/
@ -12,11 +12,6 @@
*/
#include <assert.h>
class DenseMatrix
{
protected:
@ -67,12 +62,8 @@ public:
#ifdef DEBUG
if (prod.Size() != height)
{
cerr << "Mult: wrong vector size " << endl;
assert (1);
// prod.SetSize (height);
(*myerr) << "Mult: wrong vector size " << endl;
}
if (!height)
{
cout << "DenseMatrix::Mult height = 0" << endl;
@ -94,13 +85,13 @@ public:
#endif
{
mp = data;
dp = &prod.Elem(1);
for (int i = 1; i <= height; i++)
dp = &prod(0);
for (int i = 0; i < height; i++)
{
sum = 0;
sp = &v.Get(1);
sp = &v(0);
for (int j = 1; j <= width; j++)
for (int j = 0; j < width; j++)
{
// sum += Get(i,j) * v.Get(j);
sum += *mp * *sp;

View File

@ -10,7 +10,6 @@
/*
Data types for basic linear algebra
more data types are found in linalgl.hpp
The basic concepts include the data types

View File

@ -37,9 +37,9 @@ void LinearOptimize (const DenseMatrix & a, const Vector & b,
m.Elem(3, j) = a.Get(i3, j);
}
rs.Elem(1) = b.Get(i1);
rs.Elem(2) = b.Get(i2);
rs.Elem(3) = b.Get(i3);
rs(0) = b(i1-1);
rs(1) = b(i2-1);
rs(2) = b(i3-1);
if (fabs (m.Det()) < 1e-12) continue;
@ -59,9 +59,9 @@ void LinearOptimize (const DenseMatrix & a, const Vector & b,
*/
double rmin = res.Elem(1);
for (int hi = 2; hi <= res.Size(); hi++)
if (res.Elem(hi) < rmin) rmin = res.Elem(hi);
double rmin = res(0);
for (int hi = 1; hi < res.Size(); hi++)
if (res(hi) < rmin) rmin = res(hi);
if ( (f < fmin) && rmin >= -1e-8)
{

View File

@ -2,7 +2,7 @@
/* */
/* Problem: Liniensuche */
/* */
/* Programmautor: Joachim Schöberl */
/* Programmautor: Joachim Schöberl */
/* Matrikelnummer: 9155284 */
/* */
/* Algorithmus nach: */
@ -98,36 +98,36 @@ void MinFunction :: ApproximateHesse (const Vector & x,
double eps = 1e-6;
double f, f11, f12, f21, f22;
for (i = 1; i <= n; i++)
for (i = 0; i < n; i++)
{
for (j = 1; j < i; j++)
for (j = 0; j < i; j++)
{
hx = x;
hx.Elem(i) = x.Get(i) + eps;
hx.Elem(j) = x.Get(j) + eps;
hx(i) = x(i) + eps;
hx(j) = x(j) + eps;
f11 = Func(hx);
hx.Elem(i) = x.Get(i) + eps;
hx.Elem(j) = x.Get(j) - eps;
hx(i) = x(i) + eps;
hx(j) = x(j) - eps;
f12 = Func(hx);
hx.Elem(i) = x.Get(i) - eps;
hx.Elem(j) = x.Get(j) + eps;
hx(i) = x(i) - eps;
hx(j) = x(j) + eps;
f21 = Func(hx);
hx.Elem(i) = x.Get(i) - eps;
hx.Elem(j) = x.Get(j) - eps;
hx(i) = x(i) - eps;
hx(j) = x(j) - eps;
f22 = Func(hx);
hesse.Elem(i, j) = hesse.Elem(j, i) =
hesse(i, j) = hesse(j, i) =
(f11 + f22 - f12 - f21) / (2 * eps * eps);
}
hx = x;
f = Func(x);
hx.Elem(i) = x.Get(i) + eps;
hx(i) = x(i) + eps;
f11 = Func(hx);
hx.Elem(i) = x.Get(i) - eps;
hx(i) = x(i) - eps;
f22 = Func(hx);
hesse.Elem(i, i) = (f11 + f22 - 2 * f) / (eps * eps);
hesse(i, i) = (f11 + f22 - 2 * f) / (eps * eps);
}
// (*testout) << "hesse = " << hesse << endl;
}

View File

@ -152,24 +152,6 @@ MaxUnitSquare ()
if (hv > maxv) maxv = hv;
return maxv;
// (*testout) << "maxv = " << maxv << " =~= ";
/*
double x, y;
maxv = -1e8;
double val;
for (x = 0; x <= 1.01; x += 0.1)
for (y = 0; y <= 1.01; y += 0.1)
{
val = Value (x, y);
if (val > maxv)
maxv = val;
}
// (*testout) << maxv << endl;
return maxv;
*/
};

File diff suppressed because it is too large Load Diff

View File

@ -35,9 +35,9 @@ public:
double & operator() (int i) { return data[i]; }
const double & operator() (int i) const { return data[i]; }
double & Elem (int i) { return data[i-1]; }
const double & Get (int i) const { return data[i-1]; }
void Set (int i, double val) { data[i-1] = val; }
// double & Elem (int i) { return data[i-1]; }
// const double & Get (int i) const { return data[i-1]; }
// void Set (int i, double val) { data[i-1] = val; }
FlatVector & operator*= (double scal)
{
@ -92,7 +92,7 @@ public:
{ delete [] data; }
Vector & operator= (const FlatVector & v)
{ memcpy (data, &v.Get(1), s*sizeof(double)); return *this; }
{ memcpy (data, &v(0), s*sizeof(double)); return *this; }
Vector & operator= (double scal)
{

View File

@ -793,25 +793,25 @@ bool AdFront3 :: Inside (const Point<3> & p) const
v1 = p2 - p1;
v2 = p3 - p1;
a.Elem(1, 1) = v1.X();
a.Elem(2, 1) = v1.Y();
a.Elem(3, 1) = v1.Z();
a.Elem(1, 2) = v2.X();
a.Elem(2, 2) = v2.Y();
a.Elem(3, 2) = v2.Z();
a.Elem(1, 3) = -n.X();
a.Elem(2, 3) = -n.Y();
a.Elem(3, 3) = -n.Z();
a(0, 0) = v1.X();
a(1, 0) = v1.Y();
a(2, 0) = v1.Z();
a(0, 1) = v2.X();
a(1, 1) = v2.Y();
a(2, 1) = v2.Z();
a(0, 2) = -n.X();
a(1, 2) = -n.Y();
a(2, 2) = -n.Z();
b.Elem(1) = p(0) - p1(0);
b.Elem(2) = p(1) - p1(1);
b.Elem(3) = p(2) - p1(2);
b(0) = p(0) - p1(0);
b(1) = p(1) - p1(1);
b(2) = p(2) - p1(2);
CalcInverse (a, ainv);
ainv.Mult (b, u);
if (u.Elem(1) >= 0 && u.Elem(2) >= 0 && u.Elem(1)+u.Elem(2) <= 1 &&
u.Elem(3) > 0)
if (u(0) >= 0 && u(1) >= 0 && u(0)+u(1) <= 1 &&
u(2) > 0)
{
cnt++;
}

View File

@ -1091,26 +1091,23 @@ namespace netgen
T_MPRISMS & mprisms,
const Mesh & mesh)
{
int i, j, k;
int step;
int marked = 0;
int np = mesh.GetNP();
Vector hv(np);
for (i = 1; i <= np; i++)
hv.Elem(i) = mesh.GetH (mesh.Point(i));
for (int i = 0; i < np; i++)
hv(i) = mesh.GetH (mesh.Point(i+1));
double hfac = 1;
for (step = 1; step <= 2; step++)
for (int step = 1; step <= 2; step++)
{
for (i = 1; i <= mtets.Size(); i++)
for (int i = 1; i <= mtets.Size(); i++)
{
double h = 0;
for (j = 0; j < 3; j++)
for (k = j+1; k < 4; k++)
for (int j = 0; j < 3; j++)
for (int k = j+1; k < 4; k++)
{
const Point<3> & p1 = mesh.Point (mtets.Get(i).pnums[j]);
const Point<3> & p2 = mesh.Point (mtets.Get(i).pnums[k]);
@ -1120,9 +1117,9 @@ namespace netgen
h = sqrt (h);
double hshould = 1e10;
for (j = 0; j < 4; j++)
for (int j = 0; j < 4; j++)
{
double hi = hv.Get (mtets.Get(i).pnums[j]);
double hi = hv (mtets.Get(i).pnums[j]-1);
if (hi < hshould)
hshould = hi;
}
@ -1145,12 +1142,12 @@ namespace netgen
}
}
for (i = 1; i <= mprisms.Size(); i++)
for (int i = 1; i <= mprisms.Size(); i++)
{
double h = 0;
for (j = 0; j < 2; j++)
for (k = j+1; k < 3; k++)
for (int j = 0; j < 2; j++)
for (int k = j+1; k < 3; k++)
{
const Point<3> & p1 = mesh.Point (mprisms.Get(i).pnums[j]);
const Point<3> & p2 = mesh.Point (mprisms.Get(i).pnums[k]);
@ -1160,9 +1157,9 @@ namespace netgen
h = sqrt (h);
double hshould = 1e10;
for (j = 0; j < 6; j++)
for (int j = 0; j < 6; j++)
{
double hi = hv.Get (mprisms.Get(i).pnums[j]);
double hi = hv (mprisms.Get(i).pnums[j]-1);
if (hi < hshould)
hshould = hi;
}

View File

@ -117,7 +117,7 @@ namespace netgen
}
void HPRefElement :: SetType( HPREF_ELEMENT_TYPE t)
void HPRefElement :: SetType (HPREF_ELEMENT_TYPE t)
{
type = t;
switch(type)
@ -129,11 +129,17 @@ namespace netgen
case HP_PRISM: np=6; break;
case HP_PYRAMID: np=5; break;
case HP_HEX: np=8; break;
default:
cerr << "HPRefElement: illegal type " << type << endl;
throw NgException ("HPRefElement::SetType: illegal type");
}
for(int k=0;k<8;k++)
for(int k = 0; k < 8;k++)
{
pnums[k]=0;
for(int l=0;l<3;l++) param[k][l]=0.;
for(int l = 0; l < 3; l++)
param[k][l]=0.;
}
}
@ -587,6 +593,11 @@ namespace netgen
case PYRAMID:
hpel.type = HP_PYRAMID;
break;
default:
cerr << "HPRefElement: illegal elementtype (1) " << mesh[i].GetType() << endl;
throw NgException ("HPRefElement: illegal elementtype (1)");
}
elements.Append(hpel);
}
@ -700,7 +711,7 @@ namespace netgen
HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
int newlevel = el.levelx + 1;
int oldnp(0);
int oldnp = 0;
switch (hprs->geom)
{
case HP_SEGM: oldnp = 2; break;
@ -710,6 +721,10 @@ namespace netgen
case HP_PYRAMID: oldnp = 5; break;
case HP_PRISM: oldnp = 6; break;
case HP_HEX: oldnp = 8; break;
default:
cerr << "HPRefElement: illegal type (3) " << hprs->geom << endl;
throw NgException ("HPRefElement::SetType: illegal type (3)");
}
@ -830,6 +845,8 @@ namespace netgen
case HP_PRISM: newel.np=6; break;
case HP_TET: newel.np=4; break;
case HP_PYRAMID: newel.np=5; break;
default:
throw NgException (string("hprefinement.cpp: illegal type"));
}
for (int k = 0; k < newel.np; k++)
@ -915,6 +932,11 @@ namespace netgen
case HP_PRISM: newel.np=6; break;
case HP_TET: newel.np=4; break;
case HP_PYRAMID: newel.np=5; break;
default:
cerr << "HPRefElement: illegal type (4) " << hprsnew->geom << endl;
throw NgException ("HPRefElement: illegal type (4)");
}
newel.type = hprs->neweltypes[j];
for (int k = 0; k < 8; k++)
@ -1477,6 +1499,12 @@ namespace netgen
ord_dir[2] = 2;
ned = 8;
break;
default:
cerr << "HPRefElement: illegal elementtype (2) " << mesh[i].GetType() << endl;
throw NgException ("HPRefElement: illegal elementtype (2)");
}
for (int j=0;j<ned;j++)

View File

@ -482,18 +482,18 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
pnew = Center (p1, p2);
Vector px(3);
px.Elem(1) = pnew.X();
px.Elem(2) = pnew.Y();
px.Elem(3) = pnew.Z();
px(0) = pnew.X();
px(1) = pnew.Y();
px(2) = pnew.Z();
if (elerrs[ei] > 0.1 * badmax)
BFGS (px, pf, par);
bad2 = pf.Func (px);
pnew.X() = px.Get(1);
pnew.Y() = px.Get(2);
pnew.Z() = px.Get(3);
pnew.X() = px(0);
pnew.Y() = px(1);
pnew.Z() = px(2);
int hpinew = mesh.AddPoint (pnew);
@ -584,11 +584,6 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
const BitArray * working_elements)
{
int j, k, l;
ElementIndex ei;
SurfaceElementIndex sei;
PointIndex pi1(0), pi2(0), pi3(0), pi4(0), pi5(0), pi6(0);
int cnt = 0;
@ -600,7 +595,6 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
int np = mesh.GetNP();
int ne = mesh.GetNE();
//int nse = mesh.GetNSE();
// contains at least all elements at node
TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np);
@ -614,16 +608,6 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
multithread.task = "Swap Improve";
// mesh.CalcSurfacesOfNode ();
/*
for (i = 1; i <= GetNE(); i++)
if (volelements.Get(i).PNum(1))
if (!LegalTet (volelements.Get(i)))
{
cout << "detected illegal tet, 1" << endl;
(*testout) << "detected illegal tet1: " << i << endl;
}
*/
INDEX_3_HASHTABLE<int> faces(mesh.GetNOpenElements()/3 + 2);
if (goal == OPT_CONFORM)
@ -645,32 +629,15 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
}
// find elements on node
for (ei = 0; ei < ne; ei++)
for (j = 0; j < mesh[ei].GetNP(); j++)
for (ElementIndex ei = 0; ei < ne; ei++)
for (int j = 0; j < mesh[ei].GetNP(); j++)
elementsonnode.Add (mesh[ei][j], ei);
/*
BitArray illegaltet(GetNE());
MarkIllegalElements();
if (goal == OPT_QUALITY || goal == OPT_LEGAL)
{
int cntill = 0;
for (i = 1; i <= GetNE(); i++)
{
// if (!LegalTet (volelements.Get(i)))
if (VolumeElement(i).flags.illegal)
{
cntill++;
illegaltet.Set (i);
}
}
// (*mycout) << cntill << " illegal tets" << endl;
}
*/
INDEX_2_HASHTABLE<int> edgeused(2 * ne + 5);
for (ei = 0; ei < ne; ei++)
// INDEX_2_HASHTABLE<int> edgeused(2 * ne + 5);
INDEX_2_CLOSED_HASHTABLE<int> edgeused(12 * ne + 5);
for (ElementIndex ei = 0; ei < ne; ei++)
{
if (multithread.terminate)
break;
@ -695,7 +662,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
// int onlybedges = 1;
for (j = 0; j < 6; j++)
for (int j = 0; j < 6; j++)
{
// loop over edges
@ -726,7 +693,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
edgeused.Set (i2, 1);
hasbothpoints.SetSize (0);
for (k = 0; k < elementsonnode[pi1].Size(); k++)
for (int k = 0; k < elementsonnode[pi1].Size(); k++)
{
bool has1 = 0, has2 = 0;
ElementIndex elnr = elementsonnode[pi1][k];
@ -734,7 +701,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
if (elem.IsDeleted()) continue;
for (l = 0; l < elem.GetNP(); l++)
for (int l = 0; l < elem.GetNP(); l++)
{
if (elem[l] == pi1) has1 = 1;
if (elem[l] == pi2) has2 = 1;
@ -742,7 +709,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
if (has1 && has2)
{ // only once
for (l = 0; l < hasbothpoints.Size(); l++)
for (int l = 0; l < hasbothpoints.Size(); l++)
if (hasbothpoints[l] == elnr)
has1 = 0;
@ -752,7 +719,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
}
bool puretet = 1;
for (k = 0; k < hasbothpoints.Size(); k++)
for (int k = 0; k < hasbothpoints.Size(); k++)
if (mesh[hasbothpoints[k]].GetType () != TET)
puretet = 0;
if (!puretet)
@ -763,7 +730,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
if ( nsuround == 3 )
{
Element & elem = mesh[hasbothpoints[0]];
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] != pi1 && elem[l] != pi2)
{
pi4 = pi3;
@ -784,16 +751,16 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
}
pi5 = 0;
for (k = 1; k < 3; k++)
for (int k = 1; k < 3; k++)
{
const Element & elemk = mesh[hasbothpoints[k]];
bool has1 = 0;
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elemk[l] == pi4)
has1 = 1;
if (has1)
{
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elemk[l] != pi1 && elemk[l] != pi2 && elemk[l] != pi4)
pi5 = elemk[l];
}
@ -905,21 +872,20 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
el22.flags.illegal_valid = 0;
mesh[hasbothpoints[0]] = el21;
mesh[hasbothpoints[1]] = el22;
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
mesh[hasbothpoints[2]][l] = 0;
mesh[hasbothpoints[2]].Delete();
for (k = 0; k < 2; k++)
for (l = 0; l < 4; l++)
for (int k = 0; k < 2; k++)
for (int l = 0; l < 4; l++)
elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
}
}
}
if (nsuround == 4)
{
const Element & elem1 = mesh[hasbothpoints[0]];
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem1[l] != pi1 && elem1[l] != pi2)
{
pi4 = pi3;
@ -938,32 +904,32 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
}
pi5 = 0;
for (k = 1; k < 4; k++)
for (int k = 1; k < 4; k++)
{
const Element & elem = mesh[hasbothpoints[k]];
bool has1 = 0;
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] == pi4)
has1 = 1;
if (has1)
{
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi4)
pi5 = elem[l];
}
}
pi6 = 0;
for (k = 1; k < 4; k++)
for (int k = 1; k < 4; k++)
{
const Element & elem = mesh[hasbothpoints[k]];
bool has1 = 0;
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] == pi3)
has1 = 1;
if (has1)
{
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi3)
pi6 = elem[l];
}
@ -1183,8 +1149,8 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
mesh[hasbothpoints[2]] = el3;
mesh[hasbothpoints[3]] = el4;
for (k = 0; k < 4; k++)
for (l = 0; l < 4; l++)
for (int k = 0; k < 4; k++)
for (int l = 0; l < 4; l++)
elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
}
else if (swap3)
@ -1216,8 +1182,8 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
mesh[hasbothpoints[3]] = el4b;
for (k = 0; k < 4; k++)
for (l = 0; l < 4; l++)
for (int k = 0; k < 4; k++)
for (int l = 0; l < 4; l++)
elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
}
}
@ -1231,7 +1197,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
Element & elem = mesh[hasbothpoints[0]];
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
if (elem[l] != pi1 && elem[l] != pi2)
{
pi4 = pi3;
@ -1259,12 +1225,12 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
tetused = 0;
tetused[0] = 1;
for (l = 2; l < nsuround; l++)
for (int l = 2; l < nsuround; l++)
{
int oldpi = suroundpts[l-1];
int newpi = 0;
for (k = 0; k < nsuround && !newpi; k++)
for (int k = 0; k < nsuround && !newpi; k++)
if (!tetused[k])
{
const Element & nel = mesh[hasbothpoints[k]];
@ -1284,7 +1250,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
bad1 = 0;
for (k = 0; k < nsuround; k++)
for (int k = 0; k < nsuround; k++)
{
hel[0] = pi1;
hel[1] = pi2;
@ -1303,11 +1269,11 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
int confedge = -1;
double badopt = bad1;
for (l = 0; l < nsuround; l++)
for (int l = 0; l < nsuround; l++)
{
bad2 = 0;
for (k = l+1; k <= nsuround + l - 2; k++)
for (int k = l+1; k <= nsuround + l - 2; k++)
{
hel[0] = suroundpts[l];
hel[1] = suroundpts[k % nsuround];
@ -1344,7 +1310,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
(bad2 <= 100 * bad1 && bad2 <= 1e18) ||
(bad2 <= 1e8);
for (k = l+1; k <= nsuround + l - 2; k++)
for (int k = l+1; k <= nsuround + l - 2; k++)
{
INDEX_3 hi3(suroundpts[l],
suroundpts[k % nsuround],
@ -1359,7 +1325,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
}
}
for (k = l+2; k <= nsuround+l-2; k++)
for (int k = l+2; k <= nsuround+l-2; k++)
{
if (mesh.BoundaryEdge (suroundpts[l],
suroundpts[k % nsuround]))
@ -1385,7 +1351,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
// (*mycout) << nsuround << "->" << 2 * (nsuround-2) << " " << flush;
cnt++;
for (k = bestl+1; k <= nsuround + bestl - 2; k++)
for (int k = bestl+1; k <= nsuround + bestl - 2; k++)
{
int k1;
@ -1420,7 +1386,7 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal,
elementsonnode.Add (hel[k1], mesh.GetNE()-1);
}
for (k = 0; k < nsuround; k++)
for (int k = 0; k < nsuround; k++)
{
Element & rel = mesh[hasbothpoints[k]];
/*
@ -1513,8 +1479,6 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal,
}
}
ElementIndex ei;
SurfaceElementIndex sei;
PointIndex pi1, pi2, pi3, pi4, pi5, pi6;
PointIndex pi1other, pi2other;
@ -1548,11 +1512,11 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal,
// find elements on node
for (ei = 0; ei < ne; ei++)
for (ElementIndex ei = 0; ei < ne; ei++)
for (int j = 0; j < mesh[ei].GetNP(); j++)
elementsonnode.Add (mesh[ei][j], ei);
for (sei = 0; sei < nse; sei++)
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
for(int j=0; j<mesh[sei].GetNP(); j++)
{
surfaceelementsonnode.Add(mesh[sei][j], sei);
@ -1563,9 +1527,10 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal,
bool periodic;
int idnum(-1);
INDEX_2_HASHTABLE<int> edgeused(2 * ne + 5);
// INDEX_2_HASHTABLE<int> edgeused(2 * ne + 5);
INDEX_2_CLOSED_HASHTABLE<int> edgeused(12 * ne + 5);
for (ei = 0; ei < ne; ei++)
for (ElementIndex ei = 0; ei < ne; ei++)
{
if (multithread.terminate)
break;
@ -2354,18 +2319,12 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal,
*/
void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
{
int j, k, l;
ElementIndex ei, eli1, eli2, elnr;
SurfaceElementIndex sei;
PointIndex pi1(0), pi2(0), pi3(0), pi4(0), pi5(0);
int cnt = 0;
Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET);
int cnt = 0;
double bad1, bad2;
int np = mesh.GetNP();
@ -2383,7 +2342,6 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
// TestOk();
/*
CalcSurfacesOfNode ();
for (i = 1; i <= GetNE(); i++)
@ -2404,15 +2362,15 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
// find elements on node
for (ei = 0; ei < ne; ei++)
for (j = 0; j < mesh[ei].GetNP(); j++)
for (ElementIndex ei = 0; ei < ne; ei++)
for (int j = 0; j < mesh[ei].GetNP(); j++)
elementsonnode.Add (mesh[ei][j], ei);
for (sei = 0; sei < nse; sei++)
for (j = 0; j < 3; j++)
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
for (int j = 0; j < 3; j++)
belementsonnode.Add (mesh[sei][j], sei);
for (eli1 = 0; eli1 < ne; eli1++)
for (ElementIndex eli1 = 0; eli1 < ne; eli1++)
{
if (multithread.terminate)
break;
@ -2431,7 +2389,7 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
// cout << "eli = " << eli1 << endl;
// (*testout) << "swapimp2, eli = " << eli1 << "; el = " << mesh[eli1] << endl;
for (j = 0; j < 4; j++)
for (int j = 0; j < 4; j++)
{
// loop over faces
@ -2463,13 +2421,13 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
bool bface = 0;
for (k = 0; k < belementsonnode[pi1].Size(); k++)
for (int k = 0; k < belementsonnode[pi1].Size(); k++)
{
const Element2d & bel =
mesh[belementsonnode[pi1][k]];
bool bface1 = 1;
for (l = 0; l < 3; l++)
for (int l = 0; l < 3; l++)
if (bel[l] != pi1 && bel[l] != pi2 && bel[l] != pi3)
{
bface1 = 0;
@ -2487,9 +2445,9 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
FlatArray<ElementIndex> row = elementsonnode[pi1];
for (k = 0; k < row.Size(); k++)
for (int k = 0; k < row.Size(); k++)
{
eli2 = row[k];
ElementIndex eli2 = row[k];
// cout << "\rei1 = " << eli1 << ", pi1 = " << pi1 << ", k = " << k << ", ei2 = " << eli2
// << ", getne = " << mesh.GetNE();
@ -2502,7 +2460,7 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
continue;
int comnodes=0;
for (l = 1; l <= 4; l++)
for (int l = 1; l <= 4; l++)
if (elem2.PNum(l) == pi1 || elem2.PNum(l) == pi2 ||
elem2.PNum(l) == pi3)
{
@ -2586,7 +2544,7 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
}
*/
// cout << "neli = " << neli << endl;
for (l = 0; l < 4; l++)
for (int l = 0; l < 4; l++)
{
elementsonnode.Add (el31[l], eli1);
elementsonnode.Add (el32[l], eli2);

View File

@ -20,8 +20,18 @@ public:
extern double CalcBad (const Mesh::T_POINTS & points, const Element & elem,
double h);
inline 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);
return 0;
}
extern double CalcTotalBad (const Mesh::T_POINTS & points,
const Mesh::T_VOLELEMENTS & elements);

View File

@ -202,7 +202,7 @@ namespace netgen
Vec3d v2 (p1, p3);
Vec3d v3 (p1, p4);
vol = -Determinant (v1, v2, v3) / 6;
vol = Determinant (v1, v2, v3) * (-0.166666666666666);
ll1 = v1.Length2();
ll2 = v2.Length2();
@ -276,7 +276,7 @@ namespace netgen
Vec3d v5 (*pp2, *pp4);
Vec3d v6 (*pp3, *pp4);
vol = -Determinant (v1, v2, v3) / 6;
vol = Determinant (v1, v2, v3) * (-0.166666666666666);
Vec3d gradvol;
Cross (v5, v4, gradvol);
@ -344,10 +344,8 @@ namespace netgen
graderr += (1/(h*h) - h*h/(ll1*ll1)) * gradll1;
graderr += (1/(h*h) - h*h/(ll2*ll2)) * gradll2;
graderr += (1/(h*h) - h*h/(ll3*ll3)) * gradll3;
cout << "?";
}
double errpow;
if (teterrpow == 2)
{

File diff suppressed because it is too large Load Diff

View File

@ -128,10 +128,10 @@ int netrule :: IsLineInFreeZone2 (const Point2d & p1, const Point2d & p2) const
{
int left, right, allleft, allright;
if (p1.X() > fzmaxx && p2.X() > fzmaxx ||
p1.X() < fzminx && p2.X() < fzminx ||
p1.Y() > fzmaxy && p2.Y() > fzmaxy ||
p1.Y() < fzminy && p2.Y() < fzminy) return 0;
if ( (p1.X() > fzmaxx && p2.X() > fzmaxx) ||
(p1.X() < fzminx && p2.X() < fzminx) ||
(p1.Y() > fzmaxy && p2.Y() > fzmaxy) ||
(p1.Y() < fzminy && p2.Y() < fzminy) ) return 0;
for (int i = 1; i <= transfreezone.Size(); i++)
{

View File

@ -61,7 +61,7 @@ void vnetrule :: SetFreeZoneTransformation (const Vector & allp, int tolclass)
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= np; j++)
vp.Elem(j) = allp.Get(i+3*j-3);
vp(j-1) = allp(i+3*j-3-1);
oldutofreezone->Mult (vp, vfp1);
oldutofreezonelimit->Mult (vp, vfp2);
@ -70,7 +70,7 @@ void vnetrule :: SetFreeZoneTransformation (const Vector & allp, int tolclass)
vfp1.Add (lam2, vfp2);
for (j = 1; j <= nfp; j++)
transfreezone.Elem(j).X(i) = vfp1.Elem(j);
transfreezone.Elem(j).X(i) = vfp1(j-1);
}
// MARK(setfz2);
@ -709,7 +709,7 @@ int vnetrule :: IsTriangleInFreeSet (const Point3d & p1, const Point3d & p2,
minit = 1000;
fold = 1E10;
while (1)
{
@ -814,7 +814,7 @@ int vnetrule :: IsTriangleInFreeSet (const Point3d & p1, const Point3d & p2,
if (it > minit)
(*testout) << "act1,2,3 = " << act1 << act2 << act3 << endl;
if (act1 && act2 || act1 && act3 || act2 && act3) return 0;
if ( (act1 && act2) || (act1 && act3) || (act2 && act3) ) return 0;
if (act1)
{

View File

@ -706,13 +706,13 @@ void vnetrule :: LoadRule (istream & ist)
if (quality < 100)
{
for (i = 1; i <= 3; i++)
for (int i = 1; i <= 3; i++)
{
for (j = 1; j <= points.Size(); j++)
vp.Elem(j) = points.Get(j).X(i);
for (int j = 1; j <= points.Size(); j++)
vp(j-1) = points.Get(j).X(i);
oldutofreezone->Mult(vp, vfp);
for (j = 1; j <= freezone.Size(); j++)
freezone.Elem(j).X(i) = vfp.Get(j);
for (int j = 1; j <= freezone.Size(); j++)
freezone.Elem(j).X(i) = vfp(j-1);
}
// for (i = 1; i <= freezone.Size(); i++)
// (*testout) << "freepoint: " << freezone.Get(i) << endl;

View File

@ -397,11 +397,11 @@ int Meshing2 ::ApplyRules (Array<Point2d> & lpoints,
{
oldu.SetSize (2 * rule->GetNOldP());
for (i = 1; i <= rule->GetNOldP(); i++)
for (int i = 1; i <= rule->GetNOldP(); i++)
{
Vec2d ui(rule->GetPoint(i), lpoints.Get(pmap.Get(i)));
oldu.Set (2*i-1, ui.X());
oldu.Set (2*i , ui.Y());
oldu (2*i-2) = ui.X();
oldu (2*i-1) = ui.Y();
}
rule -> SetFreeZoneTransformation (oldu, tolerance);
@ -513,8 +513,8 @@ int Meshing2 ::ApplyRules (Array<Point2d> & lpoints,
for (i = oldnp + 1; i <= rule->GetNP(); i++)
{
np = rule->GetPoint(i);
np.X() += newu.Elem (2 * (i-oldnp) - 1);
np.Y() += newu.Elem (2 * (i-oldnp));
np.X() += newu (2 * (i-oldnp) - 2);
np.Y() += newu (2 * (i-oldnp) - 1);
pmap.Elem(i) = lpoints.Append (np);
}

View File

@ -603,13 +603,13 @@ int Meshing3 :: ApplyRules
{
const Point3d & lp = lpoints.Get(pmap.Get(i));
const Point3d & rp = rule->GetPoint(i);
oldu.Set (3*i-2, lp.X()-rp.X());
oldu.Set (3*i-1, lp.Y()-rp.Y());
oldu.Set (3*i , lp.Z()-rp.Z());
oldu (3*i-3) = lp.X()-rp.X();
oldu (3*i-2) = lp.Y()-rp.Y();
oldu (3*i-1) = lp.Z()-rp.Z();
allp.Set (3*i-2, lp.X());
allp.Set (3*i-1, lp.Y());
allp.Set (3*i , lp.Z());
allp (3*i-3) = lp.X();
allp (3*i-2) = lp.Y();
allp (3*i-1) = lp.Z();
}
if (rule->GetNP() > rule->GetNOldP())
@ -623,9 +623,9 @@ int Meshing3 :: ApplyRules
for (i = rule->GetNOldP()+1; i <= rule->GetNP(); i++)
{
const Point3d & rp = rule->GetPoint(i);
allp.Set (3*i-2, rp.X() + newu.Get(3*i-2 - idiff));
allp.Set (3*i-1, rp.Y() + newu.Get(3*i-1 - idiff));
allp.Set (3*i , rp.Z() + newu.Get(3*i - idiff));
allp (3*i-3) = rp.X() + newu(3*i-3 - idiff);
allp (3*i-2) = rp.Y() + newu(3*i-2 - idiff);
allp (3*i-1) = rp.Z() + newu(3*i-1 - idiff);
}
rule->SetFreeZoneTransformation (allp,
@ -865,9 +865,9 @@ int Meshing3 :: ApplyRules
for (i = oldnp + 1; i <= rule->GetNP(); i++)
{
np = rule->GetPoint(i);
np.X() += newu.Elem (3 * (i-oldnp) - 2);
np.Y() += newu.Elem (3 * (i-oldnp) - 1);
np.Z() += newu.Elem (3 * (i-oldnp));
np.X() += newu (3 * (i-oldnp) - 3);
np.Y() += newu (3 * (i-oldnp) - 2);
np.Z() += newu (3 * (i-oldnp) - 1);
pmap.Elem(i) = lpoints.Append (np);
}

View File

@ -219,9 +219,9 @@ namespace netgen
while (loci <= 5 && !moveisok)
{
loci ++;
mesh[pi](0) = origp(0) + x.Get(1)*fact;
mesh[pi](1) = origp(1) + x.Get(2)*fact;
mesh[pi](2) = origp(2) + x.Get(3)*fact;
mesh[pi](0) = origp(0) + x(0)*fact;
mesh[pi](1) = origp(1) + x(1)*fact;
mesh[pi](2) = origp(2) + x(2)*fact;
fact = fact/2.;

View File

@ -441,7 +441,7 @@ namespace netgen
vgrad = 0.0;
badness = 0;
pp1 = sp1 + x.Get(1) * t1;
pp1 = sp1 + x(0) * t1;
meshthis -> ProjectPoint2 (surfi, surfi2, pp1);
for (j = 0; j < locelements.Size(); j++)
@ -540,7 +540,7 @@ namespace netgen
pts2d.Elem(pi) = Point2d (t1 * (mesh.Point(pi) - sp1),
t2 * (mesh.Point(pi) - sp1));
}
pts2d.Elem(gpi) = Point2d (x.Get(1), x.Get(2));
pts2d.Elem(gpi) = Point2d (x(0), x(1));
for (int k = 1; k <= 2; k++)
@ -552,8 +552,8 @@ namespace netgen
hbad = bel.
CalcJacobianBadnessDirDeriv (pts2d, lpi, vdir, hderiv);
grad.Elem(k) += hderiv;
grad(k-1) += hderiv;
if (k == 1)
badness += hbad;
}
@ -590,7 +590,7 @@ namespace netgen
// pp1 = sp1;
// pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
pp1 = sp1 + x.Get(1) * t1 + x.Get(2) * t2;
pp1 = sp1 + x(0) * t1 + x(1) * t2;
static Array<Point2d> pts2d;
pts2d.SetSize(mesh.GetNP());
@ -611,7 +611,7 @@ namespace netgen
pts2d.Elem(pi) = Point2d (t1 * (mesh.Point(pi) - sp1),
t2 * (mesh.Point(pi) - sp1));
}
pts2d.Elem(gpi) = Point2d (x.Get(1), x.Get(2));
pts2d.Elem(gpi) = Point2d (x(0), x(1));
vdir = Vec2d (dir(0), dir(1));

View File

@ -149,15 +149,15 @@ namespace netgen
static double eps = 1e-6;
hx = x;
for (int i = 1; i <= 3; i++)
for (int i = 0; i < 3; i++)
{
hx.Elem(i) = x.Get(i) + eps * h;
hx(i) = x(i) + eps * h;
double fr = Func (hx);
hx.Elem(i) = x.Get(i) - eps * h;
hx(i) = x(i) - eps * h;
double fl = Func (hx);
hx.Elem(i) = x.Get(i);
hx(i) = x(i);
g.Elem(i) = (fr - fl) / (2 * eps * h);
g(i) = (fr - fl) / (2 * eps * h);
}
return Func(x);
@ -246,17 +246,17 @@ namespace netgen
static Vector res;
res.SetSize (m.Height());
for (i = 1;i <= 3; i++)
hv.Elem(i) = vp.Get(i);
hv.Elem(4) = 1;
for (i = 0;i < 3; i++)
hv(i) = vp(i);
hv(3) = 1;
m.Mult (hv, res);
for (i = 1; i <= res.Size(); i++)
{
if (res.Get(i) < 1e-10)
if (res(i-1) < 1e-10)
badness += 1e24;
else
badness += 1 / res.Get(i);
badness += 1 / res(i-1);
}
return badness;
@ -269,15 +269,15 @@ namespace netgen
static double eps = 1e-6;
hx = x;
for (int i = 1; i <= 3; i++)
for (int i = 0; i < 3; i++)
{
hx.Elem(i) = x.Get(i) + eps * h;
hx(i) = x(i) + eps * h;
double fr = Func (hx);
hx.Elem(i) = x.Get(i) - eps * h;
hx(i) = x(i) - eps * h;
double fl = Func (hx);
hx.Elem(i) = x.Get(i);
hx(i) = x(i);
g.Elem(i) = (fr - fl) / (2 * eps * h);
g(i) = (fr - fl) / (2 * eps * h);
}
return Func(x);
@ -374,42 +374,12 @@ namespace netgen
double PointFunction :: PointFunctionValueGrad (const Point<3> & pp, Vec<3> & grad) const
{
double f;//, delta = h * 1e-6;
// Point<3> hpp;
double f = 0;
// f = PointFunctionValue (pp);
f = PointFunctionValue (pp);
/*
hpp = pp;
hpp.X() = pp.X() + delta;
fr = PointFunctionValue (hpp);
hpp.X() = pp.X() - delta;
fl = PointFunctionValue (hpp);
grad.Elem(1) = (fr - fl) / (2 * delta);
hpp = pp;
hpp.Y() = pp.Y() + delta;
fr = PointFunctionValue (hpp);
hpp.Y() = pp.Y() - delta;
fl = PointFunctionValue (hpp);
grad.Elem(2) = (fr - fl) / (2 * delta);
hpp = pp;
hpp.Z() = pp.Z() + delta;
fr = PointFunctionValue (hpp);
hpp.Z() = pp.Z() - delta;
fl = PointFunctionValue (hpp);
grad.Elem(3) = (fr - fl) / (2 * delta);
*/
// new gradient calculation
// double badness;
Point<3> hp;
Vec<3> vgradi, vgrad(0,0,0);
// badness = 0;
hp = points[actpind];
points[actpind] = Point<3> (pp);
@ -421,10 +391,10 @@ namespace netgen
for (int k = 1; k <= 4; k++)
if (el.PNum(k) == actpind)
{
CalcTetBadnessGrad (points[el.PNum(1)],
points[el.PNum(2)],
points[el.PNum(3)],
points[el.PNum(4)], -1, k, vgradi);
f += CalcTetBadnessGrad (points[el.PNum(1)],
points[el.PNum(2)],
points[el.PNum(3)],
points[el.PNum(4)], -1, k, vgradi);
vgrad += vgradi;
}
@ -606,19 +576,19 @@ namespace netgen
static Vector di;
int n = m.Height();
p4.Elem(1) = pp(0);
p4.Elem(2) = pp(1);
p4.Elem(3) = pp(2);
p4.Elem(4) = 1;
p4(0) = pp(0);
p4(1) = pp(1);
p4(2) = pp(2);
p4(3) = 1;
di.SetSize (n);
m.Mult (p4, di);
double sum = 0;
for (int i = 1; i <= n; i++)
for (int i = 0; i < n; i++)
{
if (di.Get(i) > 0)
sum += 1 / di.Get(i);
if (di(i) > 0)
sum += 1 / di(i);
else
return 1e16;
}
@ -635,25 +605,25 @@ namespace netgen
int n = m.Height();
p4.Elem(1) = pp(0);
p4.Elem(2) = pp(1);
p4.Elem(3) = pp(2);
p4.Elem(4) = 1;
p4(0) = pp(0);
p4(1) = pp(1);
p4(2) = pp(2);
p4(3) = 1;
di.SetSize (n);
m.Mult (p4, di);
double sum = 0;
grad = 0;
for (int i = 1; i <= n; i++)
for (int i = 0; i < n; i++)
{
if (di.Get(i) > 0)
if (di(i) > 0)
{
double idi = 1 / di.Get(i);
double idi = 1 / di(i);
sum += idi;
grad(0) -= idi * idi * m.Get(i, 1);
grad(1) -= idi * idi * m.Get(i, 2);
grad(2) -= idi * idi * m.Get(i, 3);
grad(0) -= idi * idi * m(i, 0);
grad(1) -= idi * idi * m(i, 1);
grad(2) -= idi * idi * m(i, 2);
}
else
{
@ -774,9 +744,9 @@ namespace netgen
}
hx = x;
hx.Elem(i) = x.Get(i) + eps;
hx(i-1) = x(i-1) + eps;
f11 = Func(hx);
hx.Elem(i) = x.Get(i) - eps;
hx(i-1) = x(i-1) - eps;
f22 = Func(hx);
hesse.Elem(i, i) = (f11 + f22 - 2 * f) / (eps * eps) + 1e-12;
@ -978,17 +948,6 @@ double Opti3EdgeMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
double CalcBad (const Mesh::T_POINTS & points, const Element & elem,
double h)
{
if (elem.GetType() == TET)
return CalcTetBadness (points[elem.PNum(1)],
points[elem.PNum(2)],
points[elem.PNum(3)],
points[elem.PNum(4)], h);
return 0;
}
extern double teterrpow;
double CalcTotalBad (const Mesh::T_POINTS & points,
@ -1100,10 +1059,10 @@ double JacobianPointFunction :: Func (const Vector & v) const
Point<3> hp = points.Elem(actpind);
points.Elem(actpind) = hp + Vec<3> (v.Get(1), v.Get(2), v.Get(3));
points.Elem(actpind) = hp + Vec<3> (v(0), v(1), v(2));
if(onplane)
points.Elem(actpind) -= (v.Get(1)*nv(0)+v.Get(2)*nv(1)+v.Get(3)*nv(2)) * nv;
points.Elem(actpind) -= (v(0)*nv(0)+v(1)*nv(1)+v(2)*nv(2)) * nv;
for (j = 1; j <= elementsonpoint.EntrySize(actpind); j++)
@ -1129,10 +1088,10 @@ FuncGrad (const Vector & x, Vector & g) const
double badness = 0;//, hbad;
Point<3> hp = points.Elem(actpind);
points.Elem(actpind) = hp + Vec<3> (x.Get(1), x.Get(2), x.Get(3));
points.Elem(actpind) = hp + Vec<3> (x(0), x(1), x(2));
if(onplane)
points.Elem(actpind) -= (x.Get(1)*nv(0)+x.Get(2)*nv(1)+x.Get(3)*nv(2)) * nv;
points.Elem(actpind) -= (x(0)*nv(0)+x(1)*nv(1)+x(2)*nv(2)) * nv;
Vec<3> hderiv;
//Vec3d vdir;
@ -1154,7 +1113,7 @@ FuncGrad (const Vector & x, Vector & g) const
CalcJacobianBadnessGradient (points, lpi, hderiv);
for(k=0; k<3; k++)
g.Elem(k+1) += hderiv(k);
g(k) += hderiv(k);
/*
for (k = 1; k <= 3; k++)
@ -1174,10 +1133,10 @@ FuncGrad (const Vector & x, Vector & g) const
if(onplane)
{
double scal = nv(0)*g.Get(1) + nv(1)*g.Get(2) + nv(2)*g.Get(3);
g.Elem(1) -= scal*nv(0);
g.Elem(2) -= scal*nv(1);
g.Elem(3) -= scal*nv(2);
double scal = nv(0)*g(0) + nv(1)*g(1) + nv(2)*g(2);
g(0) -= scal*nv(0);
g(1) -= scal*nv(1);
g(2) -= scal*nv(2);
}
//(*testout) << "g = " << g << endl;
@ -1197,14 +1156,14 @@ FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
double badness = 0;
Point<3> hp = points.Elem(actpind);
points.Elem(actpind) = Point<3> (hp + Vec3d (x.Get(1), x.Get(2), x.Get(3)));
points.Elem(actpind) = Point<3> (hp + Vec3d (x(0), x(1), x(2)));
if(onplane)
points.Elem(actpind) -= (Vec3d (x.Get(1), x.Get(2), x.Get(3))*nv) * nv;
points.Elem(actpind) -= (Vec3d (x(0), x(1), x(2))*nv) * nv;
double hderiv;
deriv = 0;
Vec<3> vdir(dir.Get(1), dir.Get(2), dir.Get(3));
Vec<3> vdir(dir(0), dir(1), dir(2));
if(onplane)
{
@ -1569,9 +1528,9 @@ void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
//*testout << "start BFGS, pok" << endl;
BFGS (x, freeminf, par);
//*testout << "BFGS complete, pok" << endl;
points[i](0) += x.Get(1);
points[i](1) += x.Get(2);
points[i](2) += x.Get(3);
points[i](0) += x(0);
points[i](1) += x(1);
points[i](2) += x(2);
}
}
PrintDot ('\n');
@ -1694,9 +1653,9 @@ void Mesh :: ImproveMeshJacobian (OPTIMIZEGOAL goal, const BitArray * usepoint)
//*testout << "start BFGS, Jacobian" << endl;
BFGS (x, pf, par);
//*testout << "end BFGS, Jacobian" << endl;
points.Elem(i)(0) += x.Get(1);
points.Elem(i)(1) += x.Get(2);
points.Elem(i)(2) += x.Get(3);
points.Elem(i)(0) += x(0);
points.Elem(i)(1) += x(1);
points.Elem(i)(2) += x(2);
}
else
{
@ -1873,12 +1832,12 @@ void Mesh :: ImproveMeshJacobianOnSurface (const BitArray & usepoint,
BFGS (x, pf_sum, par);
for(j=1; j<=3; j++)
points.Elem(i)(j-1) += x.Get(j);// - scal*nv[i-1].X(j);
for(j=0; j<3; j++)
points.Elem(i)(j) += x(j);// - scal*nv[i-1].X(j);
if(brother != -1)
for(j=1; j<=3; j++)
points.Elem(brother)(j-1) += x.Get(j);// - scal*nv[brother-1].X(j);
for(j=0; j<3; j++)
points.Elem(brother)(j) += x(j);// - scal*nv[brother-1].X(j);
}

View File

@ -183,7 +183,7 @@ void STLGeometry :: SmoothNormals()
for (k = 0; k < 3; k++)
hv.Elem(k+1) = ngeom(k);
hv(k) = ngeom(k);
hm.Mult (hv, hv2);
/*
@ -230,7 +230,7 @@ void STLGeometry :: SmoothNormals()
}
for (k = 0; k < 3; k++)
hv.Elem(k+1) = nnb(k);
hv(k) = nnb(k);
hm.Mult (hv, hv2);
/*
@ -245,7 +245,7 @@ void STLGeometry :: SmoothNormals()
}
m.Solve (rhs, sol);
Vec3d newn(sol.Get(1), sol.Get(2), sol.Get(3));
Vec3d newn(sol(0), sol(1), sol(2));
newn /= (newn.Length() + 1e-24);
GetTriangle(i).SetNormal(newn);
@ -1562,9 +1562,9 @@ void STLGeometry :: NeighbourAnglesOfSelectedTrig()
for (i = 1; i <= NONeighbourTrigs(st); i++)
{
PrintMessage(1," triangle ", NeighbourTrig(st,i), ": angle = ",
180./M_PI*GetAngle(st, NeighbourTrig(st,i)), "°",
180./M_PI*GetAngle(st, NeighbourTrig(st,i)), "°",
", calculated = ", 180./M_PI*Angle(GetTriangle(st).GeomNormal(points),
GetTriangle(NeighbourTrig(st,i)).GeomNormal(points)), "°");
GetTriangle(NeighbourTrig(st,i)).GeomNormal(points)), "°");
}
}
}
@ -2601,7 +2601,7 @@ void STLGeometry :: AddFaceEdges()
{
PrintFnStart("Add starting edges for faces");
//für Kugel eine STLLine hinzufügen (Vorteil: verfeinerbar, unabhängig von Auflösung der Geometrie!!!):
//für Kugel eine STLLine hinzufügen (Vorteil: verfeinerbar, unabhängig von Auflösung der Geometrie!!!):
//Grenze von 1. gefundener chart
Array<int> edgecnt;
@ -2676,7 +2676,7 @@ void STLGeometry :: LinkEdges()
//worked edges
Array<int> we(GetNE());
//setlineendpoints; wenn 180°, dann keine endpunkte
//setlineendpoints; wenn 180°, dann keine endpunkte
//nur punkte mit 2 edges kommen in frage, da bei mehr oder weniger punkten ohnehin ein meshpoint hinkommt
Vec3d v1,v2;

View File

@ -3,7 +3,6 @@
#include <mystdlib.h>
#include <myadt.hpp>
#include <meshing.hpp>
#include <csg.hpp>
@ -983,9 +982,9 @@ namespace netgen
for (int i = 1; i <= locms.Size(); i++)
{
Point3d p = mesh->Point(i);
locms.Elem(i) = mesh->GetH (p);
if (locms.Elem(i) > maxh) maxh = locms.Elem(i);
if (locms.Elem(i) < minh) minh = locms.Elem(i);
locms(i-1) = mesh->GetH (p);
if (locms(i-1) > maxh) maxh = locms(i-1);
if (locms(i-1) < minh) minh = locms(i-1);
}
if (!locms.Size())
{ minh = 1; maxh = 10; }
@ -1145,11 +1144,11 @@ namespace netgen
if (vispar.colormeshsize)
{
SetOpenGlColor (locms.Get(el[0]), minh, maxh, 1);
SetOpenGlColor (locms(el[0]-1), minh, maxh, 1);
glVertex3dv (lp0);
SetOpenGlColor (locms.Get(el[1]), minh, maxh, 1);
SetOpenGlColor (locms(el[1]-1), minh, maxh, 1);
glVertex3dv (lp1);
SetOpenGlColor (locms.Get(el[2]), minh, maxh, 1);
SetOpenGlColor (locms(el[2]-1), minh, maxh, 1);
glVertex3dv (lp2);
}
else

View File

@ -149,10 +149,8 @@ using namespace netgen;
void Ng_LoadGeometry (const char * filename)
{
if (printmessage_importance>0)
cout << "CALLED NG LOAD GEOMETRY" << endl;
// if (printmessage_importance>0)
// cout << "CALLED NG LOAD GEOMETRY" << endl;
geometry.Reset (new CSGeometry ());
geometry2d.Reset ();
@ -171,6 +169,8 @@ void Ng_LoadGeometry (const char * filename)
if (strcmp(filename,"")==0)
return;
PrintMessage (1, "Load geometry from file ", filename);
ifstream infile (filename);
if ((strcmp (&filename[strlen(filename)-3], "geo") == 0) ||
@ -1936,8 +1936,6 @@ void Ng_SetSolutionData (Ng_SolutionData * soldata)
// vssolution.ClearSolutionData ();
VisualSceneSolution::SolData * vss = new VisualSceneSolution::SolData;
cout << "Add solution " << soldata->name << ", type = " << soldata->soltype << endl;
vss->name = new char[strlen (soldata->name)+1];
strcpy (vss->name, soldata->name);

View File

@ -1,5 +1,7 @@
include_HEADERS = nglib.h
dist_pkgdata_DATA = cube.surf
AM_CPPFLAGS = -I$(top_srcdir)/libsrc/include $(OCCFLAGS) $(MPI_INCLUDES)
lib_LTLIBRARIES = libnglib.la

22
nglib/cube.surf Normal file
View File

@ -0,0 +1,22 @@
8
0 0 0
1 0 0
1 1 1
1 0 1
0 1 1
0 0 1
0 1 0
1 1 0
12
2 1 7
8 2 7
6 1 2
4 6 2
4 3 5
5 6 4
8 3 4
8 4 2
5 3 8
7 5 8
1 6 5
7 1 5