edge/face topology

This commit is contained in:
Joachim Schoeberl 2014-01-07 10:42:39 +00:00
parent 3d8e1d407f
commit ed51959493
7 changed files with 745 additions and 426 deletions

View File

@ -15,11 +15,16 @@
namespace netgen
{
struct T_EDGE2
{
int orient:1;
int nr:31; // 0-based
};
struct T_FACE2
{
int orient:3;
int nr:29; // 0-based
};
class Ng_Element
{
@ -49,20 +54,22 @@ namespace netgen
{
public:
int num;
const int * ptr;
const T_EDGE2 * ptr;
int Size() const { return num; }
int operator[] (int i) const { return abs (ptr[i])-1; }
// int operator[] (int i) const { return abs (ptr[i])-1; }
int operator[] (int i) const { return ptr[i].nr; }
};
class Ng_Faces
{
public:
int num;
const int * ptr;
const T_FACE2 * ptr;
int Size() const { return num; }
int operator[] (int i) const { return (ptr[i]-1) / 8; }
// int operator[] (int i) const { return (ptr[i]-1) / 8; }
int operator[] (int i) const { return ptr[i].nr; }
};
public:
@ -78,10 +85,12 @@ namespace netgen
class Ng_Point
{
public:
double * pt;
public:
Ng_Point (double * apt) : pt(apt) { ; }
double operator[] (int i)
{ return pt[i]; }
operator const double * () { return pt; }
};
@ -152,9 +161,14 @@ namespace netgen
class Mesh * mesh;
public:
Ngx_Mesh(class Mesh * amesh);
Ngx_Mesh () { ; }
Ngx_Mesh(class Mesh * amesh) : mesh(amesh) { ; }
void LoadMesh (const string & filename);
virtual ~Ngx_Mesh();
bool Valid () { return mesh != NULL; }
int GetDimension() const;
int GetNLevels() const;
@ -197,7 +211,7 @@ namespace netgen
template <int DIM>
Ng_Node<DIM> GetNode (int nr);
Ng_Node<DIM> GetNode (int nr) const;
template <int DIM>
@ -208,16 +222,27 @@ namespace netgen
int FindElementOfPoint
(double * p, double * lami,
bool build_searchtrees = false,
int * const indices = NULL, int numind = 0);
int * const indices = NULL, int numind = 0) const;
};
DLL_HEADER Ngx_Mesh * LoadMesh (const string & filename);
}
#ifdef HAVE_NETGEN_SOURCES
#include <meshing.hpp>
namespace netgen
{
#define NGX_INLINE inline
#include <nginterface_v2_impl.hpp>
}
#endif
#endif

View File

@ -0,0 +1,91 @@
NGX_INLINE DLL_HEADER Ng_Point Ngx_Mesh :: GetPoint (int nr) const
{
return Ng_Point (&mesh->Point(nr + PointIndex::BASE)(0));
}
template <>
NGX_INLINE DLL_HEADER int Ngx_Mesh :: GetElementIndex<1> (int nr) const
{
return (*mesh)[SegmentIndex(nr)].si;
}
template <>
NGX_INLINE DLL_HEADER int Ngx_Mesh :: GetElementIndex<2> (int nr) const
{
int ind = (*mesh)[SurfaceElementIndex(nr)].GetIndex();
return mesh->GetFaceDescriptor(ind).BCProperty();
}
template <>
NGX_INLINE DLL_HEADER int Ngx_Mesh :: GetElementIndex<3> (int nr) const
{
return (*mesh)[ElementIndex(nr)].GetIndex();
}
template <>
NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<1> (int nr) const
{
const Segment & el = mesh->LineSegment (SegmentIndex(nr));
Ng_Element ret;
ret.type = NG_ELEMENT_TYPE(el.GetType());
ret.points.num = el.GetNP();
ret.points.ptr = (int*)&(el[0]);
ret.vertices.num = 2;
ret.vertices.ptr = (int*)&(el[0]);
ret.edges.num = 1;
ret.edges.ptr = (T_EDGE2*)mesh->GetTopology().GetSegmentElementEdgesPtr (nr);
ret.faces.num = 0;
ret.faces.ptr = NULL;
return ret;
}
template <>
NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<2> (int nr) const
{
const Element2d & el = mesh->SurfaceElement (SurfaceElementIndex (nr));
Ng_Element ret;
ret.type = NG_ELEMENT_TYPE(el.GetType());
ret.points.num = el.GetNP();
ret.points.ptr = (int*)&el[0];
ret.vertices.num = el.GetNV();
ret.vertices.ptr = (int*)&(el[0]);
ret.edges.num = MeshTopology::GetNEdges (el.GetType());
ret.edges.ptr = (T_EDGE2*)mesh->GetTopology().GetSurfaceElementEdgesPtr (nr);
ret.faces.num = MeshTopology::GetNFaces (el.GetType());
ret.faces.ptr = (T_FACE2*)mesh->GetTopology().GetSurfaceElementFacesPtr (nr);
return ret;
}
template <>
NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<3> (int nr) const
{
const Element & el = mesh->VolumeElement (ElementIndex (nr));
Ng_Element ret;
ret.type = NG_ELEMENT_TYPE(el.GetType());
ret.points.num = el.GetNP();
ret.points.ptr = (int*)&el[0];
ret.vertices.num = el.GetNV();
ret.vertices.ptr = (int*)&(el[0]);
ret.edges.num = MeshTopology::GetNEdges (el.GetType());
ret.edges.ptr = (T_EDGE2*)mesh->GetTopology().GetElementEdgesPtr (nr);
ret.faces.num = MeshTopology::GetNFaces (el.GetType());
ret.faces.ptr = (T_FACE2*)mesh->GetTopology().GetElementFacesPtr (nr);
return ret;
}

View File

@ -18,6 +18,8 @@ namespace netgen
namespace netgen
{
#define NGX_INLINE
#include "nginterface_v2_impl.hpp"
Ngx_Mesh * LoadMesh (const string & filename)
{
@ -26,9 +28,18 @@ namespace netgen
return new Ngx_Mesh (netgen::mesh.Ptr());
}
void Ngx_Mesh :: LoadMesh (const string & filename)
{
netgen::mesh.Ptr() = NULL;
Ng_LoadMesh (filename.c_str());
mesh = netgen::mesh.Ptr();
}
/*
Ngx_Mesh :: Ngx_Mesh (Mesh * amesh)
: mesh(amesh)
{ ; }
*/
Ngx_Mesh :: ~Ngx_Mesh ()
{
@ -71,13 +82,12 @@ namespace netgen
return -1;
}
/*
Ng_Point Ngx_Mesh :: GetPoint (int nr) const
{
Ng_Point ret;
ret.pt = &mesh->Point(nr + PointIndex::BASE)(0);
return ret;
return Ng_Point (&mesh->Point(nr + PointIndex::BASE)(0));
}
*/
template <> DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<0> (int nr) const
{
@ -86,6 +96,7 @@ namespace netgen
return ret;
}
/*
template <> DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<1> (int nr) const
{
const Segment & el = mesh->LineSegment (SegmentIndex(nr));
@ -149,7 +160,7 @@ namespace netgen
return ret;
}
*/
template <>
DLL_HEADER int Ngx_Mesh :: GetElementIndex<0> (int nr) const
@ -157,6 +168,7 @@ namespace netgen
return 0;
}
/*
template <>
DLL_HEADER int Ngx_Mesh :: GetElementIndex<1> (int nr) const
{
@ -175,7 +187,7 @@ namespace netgen
{
return (*mesh)[ElementIndex(nr)].GetIndex();
}
*/
@ -521,14 +533,14 @@ namespace netgen
return mesh->GetTopology().GetNFaces();
}
template <> DLL_HEADER Ng_Node<1> Ngx_Mesh :: GetNode<1> (int nr)
template <> DLL_HEADER Ng_Node<1> Ngx_Mesh :: GetNode<1> (int nr) const
{
Ng_Node<1> node;
node.vertices.ptr = mesh->GetTopology().GetEdgeVerticesPtr(nr);
return node;
}
template <> DLL_HEADER Ng_Node<2> Ngx_Mesh :: GetNode<2> (int nr)
template <> DLL_HEADER Ng_Node<2> Ngx_Mesh :: GetNode<2> (int nr) const
{
Ng_Node<2> node;
node.vertices.ptr = mesh->GetTopology().GetFaceVerticesPtr(nr);
@ -541,7 +553,7 @@ namespace netgen
DLL_HEADER int Ngx_Mesh :: FindElementOfPoint <2>
(double * p, double * lami,
bool build_searchtree,
int * const indices, int numind)
int * const indices, int numind) const
{
Array<int> dummy(numind);
@ -573,7 +585,7 @@ namespace netgen
DLL_HEADER int Ngx_Mesh :: FindElementOfPoint <3>
(double * p, double * lami,
bool build_searchtree,
int * const indices, int numind)
int * const indices, int numind) const
{
Array<int> dummy(numind);

View File

@ -239,6 +239,24 @@ namespace netgen
values[i+1] = p1;
}
}
template <class S, class T>
void EvaluateScaled (int n, S x, S y, T * values)
{
S p1 = 1.0, p2 = 0.0, p3;
if (n >= 0)
p2 = values[0] = 1.0;
if (n >= 1)
p1 = values[1] = a[0]*y+b[0]*x;
for (int i = 1; i < n; i++)
{
p3 = p2; p2=p1;
p1 = (a[i]*y+b[i]*x)*p2-c[i]*y*y*p3;
values[i+1] = p1;
}
}
};
class JacobiRecPol : public RecPol
@ -331,8 +349,18 @@ namespace netgen
if (n < 3) return;
Tx hx[50], hy[50*50];
ScaledJacobiPolynomial (n-3, x, 1-y, 2, 2, hx);
// ScaledJacobiPolynomial (n-3, x, 1-y, 2, 2, hx);
/*
cout << "scaled jacobi, old: " << endl;
for (int i = 0; i <= n-3; i++)
cout << i << ": " << hx[i] << endl;
*/
jacpols2[2] -> EvaluateScaled (n-3, x, 1-y, hx);
/*
cout << "scaled jacobi, new: " << endl;
for (int i = 0; i <= n-3; i++)
cout << i << ": " << hx[i] << endl;
*/
// for (int ix = 0; ix <= n-3; ix++)
// JacobiPolynomial (n-3, 2*y-1, 2*ix+5, 2, hy+50*ix);
@ -351,7 +379,6 @@ namespace netgen
}
static void CalcTrigShapeDxDy (int n, double x, double y, double * dshape)
{
if (n < 3) return;
@ -366,35 +393,9 @@ namespace netgen
dshape[2*i] = res[i].DValue(0);
dshape[2*i+1] = res[i].DValue(1);
}
/*
if (n < 3) return;
int ndof = (n-1)*(n-2)/2;
double h1[1000], h2[1000];
double eps = 1e-4;
CalcTrigShape (n, x+eps, y, h1);
CalcTrigShape (n, x-eps, y, h2);
for (int i = 0; i < ndof; i++)
dshape[2*i] = (h1[i]-h2[i])/(2*eps);
CalcTrigShape (n, x, y+eps, h1);
CalcTrigShape (n, x, y-eps, h2);
for (int i = 0; i < ndof; i++)
dshape[2*i+1] = (h1[i]-h2[i])/(2*eps);
*/
}
// compute face bubbles up to order n, 0 < y, y-x < 1, x+y < 1
template <class Tx, class Ty, class Tt, class Tr>
static void CalcScaledTrigShape (int n, Tx x, Ty y, Tt t, Tr * shape)
@ -407,7 +408,8 @@ namespace netgen
// ScaledLegendrePolynomial (n-3, (2*y-1), t, hy);
for (int ix = 0; ix <= n-3; ix++)
ScaledJacobiPolynomial (n-3, 2*y-1, t, 2*ix+5, 2, hy+50*ix);
jacpols2[2*ix+5] -> EvaluateScaled (n-3, 2*y-1, t, hy+50*ix);
// ScaledJacobiPolynomial (n-3, 2*y-1, t, 2*ix+5, 2, hy+50*ix);
int ii = 0;
@ -434,42 +436,7 @@ namespace netgen
dshape[3*i+1] = res[i].DValue(1);
dshape[3*i+2] = res[i].DValue(2);
}
/*
double dshape1[6000];
if (n < 3) return;
double hvl[1000], hvr[1000];
int nd = (n-1)*(n-2)/2;
double eps = 1e-6;
CalcScaledTrigShape (n, x-eps, y, t, hvl);
CalcScaledTrigShape (n, x+eps, y, t, hvr);
for (int i = 0; i < nd; i++)
dshape[3*i] = (hvr[i]-hvl[i])/(2*eps);
CalcScaledTrigShape (n, x, y-eps, t, hvl);
CalcScaledTrigShape (n, x, y+eps, t, hvr);
for (int i = 0; i < nd; i++)
dshape[3*i+1] = (hvr[i]-hvl[i])/(2*eps);
CalcScaledTrigShape (n, x, y, t-eps, hvl);
CalcScaledTrigShape (n, x, y, t+eps, hvr);
for (int i = 0; i < nd; i++)
dshape[3*i+2] = (hvr[i]-hvl[i])/(2*eps);
*/
/*
for (int i = 0; i < 3*nd; i++)
if (fabs (dshape[i]-dshape1[i]) > 1e-8 * fabs(dshape[i]) + 1e-6)
{
cerr
cerr << "big difference: " << dshape1[i] << " != " << dshape[i] << endl;
}
*/
}
@ -2168,6 +2135,8 @@ namespace netgen
bool CurvedElements :: IsElementCurved (ElementIndex elnr) const
{
if (mesh[elnr].GetType() != TET) return true;
if (mesh.coarsemesh)
{
const HPRefElement & hpref_el =
@ -2225,6 +2194,42 @@ namespace netgen
}
bool CurvedElements :: IsElementHighOrder (ElementIndex elnr) const
{
if (mesh.coarsemesh)
{
const HPRefElement & hpref_el =
(*mesh.hpelements) [mesh[elnr].hp_elnr];
return mesh.coarsemesh->GetCurvedElements().IsElementHighOrder (hpref_el.coarse_elnr);
}
const Element & el = mesh[elnr];
ELEMENT_TYPE type = el.GetType();
ElementInfo info;
info.elnr = elnr;
info.order = order;
info.ndof = info.nv = MeshTopology::GetNPoints (type);
if (info.order > 1)
{
const MeshTopology & top = mesh.GetTopology();
info.nedges = top.GetElementEdges (elnr+1, info.edgenrs, 0);
for (int i = 0; i < info.nedges; i++) info.edgenrs[i]--;
info.nfaces = top.GetElementFaces (elnr+1, info.facenrs, 0);
for (int i = 0; i < info.nfaces; i++) info.facenrs[i]--;
for (int i = 0; i < info.nedges; i++)
if (edgecoeffsindex[info.edgenrs[i]+1] > edgecoeffsindex[info.edgenrs[i]]) return true;
for (int i = 0; i < info.nfaces; i++)
if (facecoeffsindex[info.facenrs[i]+1] > facecoeffsindex[info.facenrs[i]]) return true;
}
return false;
}
@ -3589,6 +3594,8 @@ namespace netgen
double * x, size_t sx,
double * dxdxi, size_t sdxdxi)
{
// static int timer = NgProfiler::CreateTimer ("calcmultipointtrafo, calcshape");
if (mesh.coarsemesh)
{
const HPRefElement & hpref_el =
@ -3675,6 +3682,7 @@ namespace netgen
const Element & el = mesh[elnr];
ELEMENT_TYPE type = el.GetType();
ElementInfo info;
info.elnr = elnr;
info.order = order;

View File

@ -52,6 +52,7 @@ public:
bool IsSegmentCurved (SegmentIndex segnr) const;
bool IsSurfaceElementCurved (SurfaceElementIndex sei) const;
bool IsElementCurved (ElementIndex ei) const;
bool IsElementHighOrder (ElementIndex ei) const;
void CalcSegmentTransformation (double xi, SegmentIndex segnr,

View File

@ -164,10 +164,10 @@ namespace netgen
for (int i = 0; i < ne; i++)
for (int j = 0; j < 12; j++)
edges[i][j] = 0;
edges[i][j].nr = -1;
for (int i = 0; i < nse; i++)
for (int j = 0; j < 4; j++)
surfedges[i][j] = 0;
surfedges[i][j].nr = -1;
// keep existing edges
cnt = 0;
@ -305,8 +305,12 @@ namespace netgen
if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()];
/*
if (edgedir) edgenum *= -1;
edges[elnr][k] = edgenum;
*/
edges[elnr][k].nr = edgenum-1;
edges[elnr][k].orient = edgedir;
}
}
@ -328,8 +332,11 @@ namespace netgen
if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()];
if (edgedir) edgenum *= -1;
surfedges.Elem(elnr)[k] = edgenum;
// if (edgedir) edgenum *= -1;
// surfedges.Elem(elnr)[k] = edgenum;
surfedges.Elem(elnr)[k].nr = edgenum-1;
surfedges.Elem(elnr)[k].orient = edgedir;
}
}
@ -346,8 +353,12 @@ namespace netgen
if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()];
/*
if (edgedir) edgenum *= -1;
segedges.Elem(elnr) = edgenum;
*/
segedges.Elem(elnr).nr = edgenum-1;
segedges.Elem(elnr).orient = edgedir;
}
}
}
@ -358,13 +369,16 @@ namespace netgen
if (buildfaces)
{
static int timer2 = NgProfiler::CreateTimer ("topology::buildfaces");
static int timer2a = NgProfiler::CreateTimer ("topology::buildfacesa");
static int timer2b = NgProfiler::CreateTimer ("topology::buildfacesb");
static int timer2c = NgProfiler::CreateTimer ("topology::buildfacesc");
static int timer2d = NgProfiler::CreateTimer ("topology::buildfacesd");
NgProfiler::RegionTimer reg2 (timer2);
if (id == 0)
PrintMessage (5, "Update faces ");
NgProfiler::StartTimer (timer2a);
faces.SetSize(ne);
surffaces.SetSize(nse);
@ -381,7 +395,7 @@ namespace netgen
for (int elnr = 0; elnr < ne; elnr++)
for (int j = 0; j < 6; j++)
faces[elnr][j] = 0;
faces[elnr][j].fnr = -1;
int max_face_on_vertex = 0;
@ -392,245 +406,16 @@ namespace netgen
}
NgProfiler::StopTimer (timer2a);
NgProfiler::StartTimer (timer2b);
/*
for (int pass = 1; pass <= 2; pass++)
{
nfa = oldnfa;
for (int v = PointIndex::BASE; v < nv+PointIndex::BASE; v++)
{
INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10);
for (int j = 0; j < vert2oldface[v].Size(); j++)
{
int fnr = vert2oldface[v][j];
INDEX_3 face (face2vert[fnr].I1(),
face2vert[fnr].I2(),
face2vert[fnr].I3());
vert2face.Set (face, fnr+1);
}
// cout << "inherited faces: " << endl << vert2face << endl;
for (int j = 0; j < (*vert2element)[v].Size(); j++)
{
int elnr = (*vert2element)[v][j];
const Element & el = mesh.VolumeElement (elnr);
int nelfaces = GetNFaces (el.GetType());
const ELEMENT_FACE * elfaces = GetFaces1 (el.GetType());
for (int j = 0; j < nelfaces; j++)
if (elfaces[j][3] == 0)
{ // triangle
int facenum, facedir;
INDEX_3 face(el.PNum(elfaces[j][0]),
el.PNum(elfaces[j][1]),
el.PNum(elfaces[j][2]));
facedir = 0;
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 1; }
if (face.I2() > face.I3())
{ swap (face.I2(), face.I3()); facedir += 2; }
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 4; }
if (face.I1() != v) continue;
if (vert2face.Used (face))
facenum = vert2face.Get(face);
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face.I1(),face.I2(),face.I3(),0);
if (pass == 2) face2vert.Append (hface);
}
faces.Elem(elnr)[j] = 8*(facenum-1)+facedir+1;
}
else
{
// quad
int facenum, facedir;
INDEX_4Q face4(el.PNum(elfaces[j][0]),
el.PNum(elfaces[j][1]),
el.PNum(elfaces[j][2]),
el.PNum(elfaces[j][3]));
facedir = 0;
if (min2 (face4.I1(), face4.I2()) >
min2 (face4.I4(), face4.I3()))
{ // z - flip
facedir += 1;
swap (face4.I1(), face4.I4());
swap (face4.I2(), face4.I3());
}
if (min2 (face4.I1(), face4.I4()) >
min2 (face4.I2(), face4.I3()))
{ // x - flip
facedir += 2;
swap (face4.I1(), face4.I2());
swap (face4.I3(), face4.I4());
}
if (face4.I2() > face4.I4())
{ // diagonal flip
facedir += 4;
swap (face4.I2(), face4.I4());
}
INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
if (face.I1() != v) continue;
if (vert2face.Used (face))
{
facenum = vert2face.Get(face);
}
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face4.I1(),face4.I2(),face4.I3(),face4.I4());
if (pass == 2) face2vert.Append (hface);
}
faces.Elem(elnr)[j] = 8*(facenum-1)+facedir+1;
}
}
for (int j = 0; j < (*vert2surfelement)[v].Size(); j++)
{
int elnr = (*vert2surfelement)[v][j];
// cout << "surfelnr = " << elnr << endl;
const Element2d & el = mesh.SurfaceElement (elnr);
const ELEMENT_FACE * elfaces = GetFaces1 (el.GetType());
if (elfaces[0][3] == 0)
{ // triangle
int facenum;
int facedir;
INDEX_3 face(el.PNum(elfaces[0][0]),
el.PNum(elfaces[0][1]),
el.PNum(elfaces[0][2]));
// cout << "face = " << face << endl;
facedir = 0;
if (face.I1() > face.I2())
{
swap (face.I1(), face.I2());
facedir += 1;
}
if (face.I2() > face.I3())
{
swap (face.I2(), face.I3());
facedir += 2;
}
if (face.I1() > face.I2())
{
swap (face.I1(), face.I2());
facedir += 4;
}
if (face.I1() != v) continue;
if (vert2face.Used (face))
facenum = vert2face.Get(face);
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face.I1(),face.I2(),face.I3(),0);
if (pass == 2) face2vert.Append (hface);
}
// cout << "face = " << face << " selnr = " << elnr << endl;
surffaces.Elem(elnr) = 8*(facenum-1)+facedir+1;
// face2surfel.Elem(facenum) = elnr;
}
else
{
// quad
int facenum;
int facedir;
INDEX_4Q face4(el.PNum(elfaces[0][0]),
el.PNum(elfaces[0][1]),
el.PNum(elfaces[0][2]),
el.PNum(elfaces[0][3]));
facedir = 0;
if (min2 (face4.I1(), face4.I2()) >
min2 (face4.I4(), face4.I3()))
{ // z - orientation
facedir += 1;
swap (face4.I1(), face4.I4());
swap (face4.I2(), face4.I3());
}
if (min2 (face4.I1(), face4.I4()) >
min2 (face4.I2(), face4.I3()))
{ // x - orientation
facedir += 2;
swap (face4.I1(), face4.I2());
swap (face4.I3(), face4.I4());
}
if (face4.I2() > face4.I4())
{
facedir += 4;
swap (face4.I2(), face4.I4());
}
INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
if (face.I1() != v) continue;
if (vert2face.Used (face))
facenum = vert2face.Get(face);
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face4.I1(),face4.I2(),face4.I3(),face4.I3());
if (pass == 2) face2vert.Append (hface);
}
surffaces.Elem(elnr) = 8*(facenum-1)+facedir+1;
}
}
}
face2vert.SetAllocSize (nfa);
}
*/
for (int pass = 1; pass <= 2; pass++)
{
cout << "pass = " << pass << endl;
nfa = oldnfa;
for (int v = PointIndex::BASE; v < nv+PointIndex::BASE; v++)
{
@ -649,6 +434,8 @@ namespace netgen
if (pass == 2)
{
// *testout << "pass 2, nfa = " << nfa << "; face2vert.Size() = " << face2vert.Size() << endl;
for (int j = nfa; j < face2vert.Size(); j++)
{
if (face2vert[j][0] == v)
@ -662,27 +449,28 @@ namespace netgen
else
break;
}
}
// cout << "inherited faces: " << endl << vert2face << endl;
for (int j = 0; j < (*vert2element)[v].Size(); j++)
{
// NgProfiler::RegionTimer reg3 (timer2d);
ElementIndex elnr = (*vert2element)[v][j];
const Element & el = mesh[elnr];
int nelfaces = GetNFaces (el.GetType());
const ELEMENT_FACE * elfaces = GetFaces1 (el.GetType());
const ELEMENT_FACE * elfaces = GetFaces0 (el.GetType());
for (int j = 0; j < nelfaces; j++)
if (elfaces[j][3] == 0)
if (elfaces[j][3] < 0)
{ // triangle
int facenum, facedir;
INDEX_3 face(el.PNum(elfaces[j][0]),
el.PNum(elfaces[j][1]),
el.PNum(elfaces[j][2]));
INDEX_3 face(el[elfaces[j][0]], el[elfaces[j][1]],
el[elfaces[j][2]]);
facedir = 0;
if (face.I1() > face.I2())
@ -698,6 +486,7 @@ namespace netgen
facenum = vert2face.Get(face);
else
{
if (pass == 2) cout << "hier in pass 2" << endl;
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
@ -713,10 +502,8 @@ namespace netgen
{
// quad
int facenum, facedir;
INDEX_4Q face4(el.PNum(elfaces[j][0]),
el.PNum(elfaces[j][1]),
el.PNum(elfaces[j][2]),
el.PNum(elfaces[j][3]));
INDEX_4Q face4(el[elfaces[j][0]], el[elfaces[j][1]],
el[elfaces[j][2]], el[elfaces[j][3]]);
facedir = 0;
if (min2 (face4.I1(), face4.I2()) >
@ -750,6 +537,7 @@ namespace netgen
}
else
{
if (pass == 2) cout << "hier in pass 2" << endl;
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
@ -873,7 +661,7 @@ namespace netgen
// *testout << "faces = " << face2vert << endl;
if (pass == 1)
{
// *testout << "sort from " << first_fa << " to " << nfa << endl;
// *testout << "pass1, sort from " << first_fa << " to " << nfa << endl;
for (int i = first_fa; i < nfa; i++)
for (int j = first_fa+1; j < nfa; j++)
if (face2vert[j] < face2vert[j-1])
@ -884,14 +672,343 @@ namespace netgen
face2vert.SetAllocSize (nfa);
}
*/
/*
// timing tests
static int timer_touch = NgProfiler::CreateTimer ("topology::buildfaces - touch els");
static int timer_touch2 = NgProfiler::CreateTimer ("topology::buildfaces - touch els vert");
NgProfiler::StartTimer (timer_touch);
int sum = 0;
for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
{
const Element & el = mesh[ei];
for (int j = 0; j < el.GetNP(); j++)
sum += el[j];
}
NgProfiler::StopTimer (timer_touch);
NgProfiler::StartTimer (timer_touch2);
for (int v = PointIndex::BASE; v < nv+PointIndex::BASE; v++)
{
INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10);
for (int pass = 1; pass <= 2; pass++)
for (int j = 0; j < (*vert2element)[v].Size(); j++)
{
// NgProfiler::RegionTimer reg3 (timer2d);
ElementIndex elnr = (*vert2element)[v][j];
const Element & el = mesh[elnr];
int nelfaces = GetNFaces (el.GetType());
const ELEMENT_FACE * elfaces = GetFaces0 (TET);
for (int j = 0; j < 4; j++)
{ // triangle
INDEX_3 face(el[elfaces[j][0]], el[elfaces[j][1]],
el[elfaces[j][2]]);
int facedir = 0;
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 1; }
if (face.I2() > face.I3())
{ swap (face.I2(), face.I3()); facedir += 2; }
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 4; }
sum += face.I1();
sum += face.I1() < face.I2();
}
}
}
NgProfiler::StopTimer (timer_touch2);
*testout << "sum" << sum << endl;
*/
nfa = oldnfa;
for (int v = PointIndex::BASE; v < nv+PointIndex::BASE; v++)
{
int first_fa = nfa;
INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10);
for (int j = 0; j < vert2oldface[v].Size(); j++)
{
int fnr = vert2oldface[v][j];
INDEX_3 face (face2vert[fnr].I1(),
face2vert[fnr].I2(),
face2vert[fnr].I3());
vert2face.Set (face, fnr+1);
}
for (int pass = 1; pass <= 2; pass++)
{
if (pass == 2)
{
for (int j = first_fa; j < face2vert.Size(); j++)
{
if (face2vert[j][0] == v)
{
INDEX_3 face (face2vert[j].I1(),
face2vert[j].I2(),
face2vert[j].I3());
vert2face.Set (face, j+1);
}
else
break;
}
}
for (int j = 0; j < (*vert2element)[v].Size(); j++)
{
// NgProfiler::RegionTimer reg3 (timer2d);
ElementIndex elnr = (*vert2element)[v][j];
const Element & el = mesh[elnr];
int nelfaces = GetNFaces (el.GetType());
const ELEMENT_FACE * elfaces = GetFaces0 (el.GetType());
for (int j = 0; j < nelfaces; j++)
if (elfaces[j][3] < 0)
{ // triangle
INDEX_3 face(el[elfaces[j][0]], el[elfaces[j][1]],
el[elfaces[j][2]]);
int facedir = 0;
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 1; }
if (face.I2() > face.I3())
{ swap (face.I2(), face.I3()); facedir += 2; }
if (face.I1() > face.I2())
{ swap (face.I1(), face.I2()); facedir += 4; }
if (face.I1() != v) continue;
if (pass == 1)
{
if (!vert2face.Used (face))
{
nfa++;
vert2face.Set (face, nfa);
INDEX_4 hface(face.I1(),face.I2(),face.I3(),0);
face2vert.Append (hface);
}
}
else
{
int facenum = vert2face.Get(face);
// faces[elnr][j] = 8*(facenum-1)+facedir+1;
faces[elnr][j].fnr = facenum-1;
faces[elnr][j].forient = facedir;
}
}
else
{
// quad
int facenum;
INDEX_4Q face4(el[elfaces[j][0]], el[elfaces[j][1]],
el[elfaces[j][2]], el[elfaces[j][3]]);
int facedir = 0;
if (min2 (face4.I1(), face4.I2()) >
min2 (face4.I4(), face4.I3()))
{ // z - flip
facedir += 1;
swap (face4.I1(), face4.I4());
swap (face4.I2(), face4.I3());
}
if (min2 (face4.I1(), face4.I4()) >
min2 (face4.I2(), face4.I3()))
{ // x - flip
facedir += 2;
swap (face4.I1(), face4.I2());
swap (face4.I3(), face4.I4());
}
if (face4.I2() > face4.I4())
{ // diagonal flip
facedir += 4;
swap (face4.I2(), face4.I4());
}
INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
if (face.I1() != v) continue;
if (vert2face.Used (face))
{
facenum = vert2face.Get(face);
}
else
{
if (pass == 2) cout << "hier in pass 2" << endl;
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face4.I1(),face4.I2(),face4.I3(),face4.I4());
face2vert.Append (hface);
}
// faces[elnr][j] = 8*(facenum-1)+facedir+1;
faces[elnr][j].fnr = facenum-1;
faces[elnr][j].forient = facedir;
}
}
for (int j = 0; j < (*vert2surfelement)[v].Size(); j++)
{
int elnr = (*vert2surfelement)[v][j];
// cout << "surfelnr = " << elnr << endl;
const Element2d & el = mesh.SurfaceElement (elnr);
const ELEMENT_FACE * elfaces = GetFaces1 (el.GetType());
if (elfaces[0][3] == 0)
{ // triangle
int facenum;
int facedir;
INDEX_3 face(el.PNum(elfaces[0][0]),
el.PNum(elfaces[0][1]),
el.PNum(elfaces[0][2]));
// cout << "face = " << face << endl;
facedir = 0;
if (face.I1() > face.I2())
{
swap (face.I1(), face.I2());
facedir += 1;
}
if (face.I2() > face.I3())
{
swap (face.I2(), face.I3());
facedir += 2;
}
if (face.I1() > face.I2())
{
swap (face.I1(), face.I2());
facedir += 4;
}
if (face.I1() != v) continue;
if (vert2face.Used (face))
facenum = vert2face.Get(face);
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face.I1(),face.I2(),face.I3(),0);
face2vert.Append (hface);
}
// surffaces.Elem(elnr) = 8*(facenum-1)+facedir+1;
surffaces.Elem(elnr).fnr = facenum-1;
surffaces.Elem(elnr).forient = facedir;
}
else
{
// quad
int facenum;
int facedir;
INDEX_4Q face4(el.PNum(elfaces[0][0]),
el.PNum(elfaces[0][1]),
el.PNum(elfaces[0][2]),
el.PNum(elfaces[0][3]));
facedir = 0;
if (min2 (face4.I1(), face4.I2()) >
min2 (face4.I4(), face4.I3()))
{ // z - orientation
facedir += 1;
swap (face4.I1(), face4.I4());
swap (face4.I2(), face4.I3());
}
if (min2 (face4.I1(), face4.I4()) >
min2 (face4.I2(), face4.I3()))
{ // x - orientation
facedir += 2;
swap (face4.I1(), face4.I2());
swap (face4.I3(), face4.I4());
}
if (face4.I2() > face4.I4())
{
facedir += 4;
swap (face4.I2(), face4.I4());
}
INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
if (face.I1() != v) continue;
if (vert2face.Used (face))
facenum = vert2face.Get(face);
else
{
nfa++;
vert2face.Set (face, nfa);
facenum = nfa;
INDEX_4 hface(face4.I1(),face4.I2(),face4.I3(),face4.I3());
face2vert.Append (hface);
}
// surffaces.Elem(elnr) = 8*(facenum-1)+facedir+1;
surffaces.Elem(elnr).fnr = facenum-1;
surffaces.Elem(elnr).forient = facedir;
}
}
// sort faces
if (pass == 1)
{
for (int i = 0; i < nfa-first_fa; i++)
for (int j = first_fa+1; j < nfa-i; j++)
if (face2vert[j] < face2vert[j-1])
Swap (face2vert[j-1], face2vert[j]);
}
}
}
face2vert.SetAllocSize (nfa);
// *testout << "face2vert = " << endl << face2vert << endl;
NgProfiler::StopTimer (timer2b);
NgProfiler::StartTimer (timer2c);
@ -922,7 +1039,8 @@ namespace netgen
for (int i = 1; i <= ne; i++)
for (int j = 0; j < 6; j++)
{
int fnum = (faces.Get(i)[j]+7) / 8;
// int fnum = (faces.Get(i)[j]+7) / 8;
int fnum = faces.Get(i)[j].fnr+1;
if (fnum > 0 && face2surfel.Elem(fnum))
{
int sel = face2surfel.Elem(fnum);
@ -1012,6 +1130,7 @@ namespace netgen
if (cnt_err && ntasks == 1)
cout << cnt_err << " elements are not matching !!!" << endl;
}
NgProfiler::StopTimer (timer2c);
}
@ -1155,7 +1274,8 @@ namespace netgen
int ned = GetNEdges (mesh.VolumeElement(elnr).GetType());
eledges.SetSize (ned);
for (int i = 0; i < ned; i++)
eledges[i] = abs (edges.Get(elnr)[i]);
eledges[i] = edges.Get(elnr)[i].nr+1;
// eledges[i] = abs (edges.Get(elnr)[i]);
}
void MeshTopology :: GetElementFaces (int elnr, Array<int> & elfaces, bool withorientation) const
{
@ -1166,11 +1286,14 @@ namespace netgen
for (int i = 1; i <= nfa; i++)
{
elfaces.Elem(i) = (faces.Get(elnr)[i-1]-1) / 8 + 1;
// elfaces.Elem(i) = (faces.Get(elnr)[i-1]-1) / 8 + 1;
elfaces.Elem(i) = faces.Get(elnr)[i-1].fnr+1;
}
else
{
cerr << "GetElementFaces with orientation currently not supported" << endl;
/*
for (int i = 1; i <= nfa; i++)
{
elfaces.Elem(i) = (faces.Get(elnr)[i-1]-1) / 8 + 1;
@ -1178,6 +1301,8 @@ namespace netgen
if(orient == 1 || orient == 2 || orient == 4 || orient == 7)
elfaces.Elem(i) *= -1;
}
*/
}
}
void MeshTopology :: GetElementEdgeOrientations (int elnr, Array<int> & eorient) const
@ -1185,7 +1310,8 @@ namespace netgen
int ned = GetNEdges (mesh.VolumeElement(elnr).GetType());
eorient.SetSize (ned);
for (int i = 1; i <= ned; i++)
eorient.Elem(i) = (edges.Get(elnr)[i-1] > 0) ? 1 : -1;
// eorient.Elem(i) = (edges.Get(elnr)[i-1] > 0) ? 1 : -1;
eorient.Elem(i) = (edges.Get(elnr)[i-1].orient) ? -1 : 1;
}
void MeshTopology :: GetElementFaceOrientations (int elnr, Array<int> & forient) const
@ -1193,7 +1319,8 @@ namespace netgen
int nfa = GetNFaces (mesh.VolumeElement(elnr).GetType());
forient.SetSize (nfa);
for (int i = 1; i <= nfa; i++)
forient.Elem(i) = (faces.Get(elnr)[i-1]-1) % 8;
forient.Elem(i) = faces.Get(elnr)[i-1].forient;
// forient.Elem(i) = (faces.Get(elnr)[i-1]-1) % 8;
}
@ -1208,17 +1335,25 @@ namespace netgen
{
for (int i = 0; i < 12; i++)
{
/*
if (!edges.Get(elnr)[i]) return i;
eledges[i] = abs (edges.Get(elnr)[i]);
orient[i] = (edges.Get(elnr)[i] > 0 ) ? 1 : -1;
*/
if (edges.Get(elnr)[i].nr == -1) return i;
eledges[i] = edges.Get(elnr)[i].nr+1;
orient[i] = edges.Get(elnr)[i].orient ? -1 : 1;
}
}
else
{
for (int i = 0; i < 12; i++)
{
if (!edges.Get(elnr)[i]) return i;
eledges[i] = abs (edges.Get(elnr)[i]);
// if (!edges.Get(elnr)[i]) return i;
// eledges[i] = abs (edges.Get(elnr)[i]);
if (edges.Get(elnr)[i].nr == -1) return i;
eledges[i] = edges.Get(elnr)[i].nr+1;
}
}
return 12;
@ -1255,17 +1390,24 @@ namespace netgen
{
for (int i = 0; i < 6; i++)
{
/*
if (!faces.Get(elnr)[i]) return i;
elfaces[i] = (faces.Get(elnr)[i]-1) / 8 + 1;
orient[i] = (faces.Get(elnr)[i]-1) % 8;
*/
if (faces.Get(elnr)[i].fnr == -1) return i;
elfaces[i] = faces.Get(elnr)[i].fnr+1;
orient[i] = faces.Get(elnr)[i].forient;
}
}
else
{
for (int i = 0; i < 6; i++)
{
if (!faces.Get(elnr)[i]) return i;
elfaces[i] = (faces.Get(elnr)[i]-1) / 8 + 1;
// if (!faces.Get(elnr)[i]) return i;
// elfaces[i] = (faces.Get(elnr)[i]-1) / 8 + 1;
if (faces.Get(elnr)[i].fnr == -1) return i;
elfaces[i] = faces.Get(elnr)[i].fnr+1;
}
}
return 6;
@ -1276,7 +1418,8 @@ namespace netgen
int ned = GetNEdges (mesh.SurfaceElement(elnr).GetType());
eledges.SetSize (ned);
for (int i = 0; i < ned; i++)
eledges[i] = abs (surfedges.Get(elnr)[i]);
// eledges[i] = abs (surfedges.Get(elnr)[i]);
eledges[i] = surfedges.Get(elnr)[i].nr+1;
}
void MeshTopology :: GetEdges (SurfaceElementIndex elnr, Array<int> & eledges) const
@ -1284,17 +1427,20 @@ namespace netgen
int ned = GetNEdges (mesh[elnr].GetType());
eledges.SetSize (ned);
for (int i = 0; i < ned; i++)
eledges[i] = abs (surfedges[elnr][i])-1;
// eledges[i] = abs (surfedges[elnr][i])-1;
eledges[i] = surfedges[elnr][i].nr;
}
int MeshTopology :: GetSurfaceElementFace (int elnr) const
{
return (surffaces.Get(elnr)-1) / 8 + 1;
// return (surffaces.Get(elnr)-1) / 8 + 1;
return surffaces.Get(elnr).fnr+1;
}
int MeshTopology :: GetFace (SurfaceElementIndex elnr) const
{
return (surffaces[elnr]-1) / 8;
// return (surffaces[elnr]-1) / 8;
return surffaces[elnr].fnr;
}
@ -1304,12 +1450,14 @@ namespace netgen
int ned = GetNEdges (mesh.SurfaceElement(elnr).GetType());
eorient.SetSize (ned);
for (int i = 0; i < ned; i++)
eorient[i] = (surfedges.Get(elnr)[i] > 0) ? 1 : -1;
// eorient[i] = (surfedges.Get(elnr)[i] > 0) ? 1 : -1;
eorient[i] = (surfedges.Get(elnr)[i].orient) ? -1 : 1;
}
int MeshTopology :: GetSurfaceElementFaceOrientation (int elnr) const
{
return (surffaces.Get(elnr)-1) % 8;
// return (surffaces.Get(elnr)-1) % 8;
return surffaces.Get(elnr).forient;
}
int MeshTopology :: GetSurfaceElementEdges (int elnr, int * eledges, int * orient) const
@ -1321,26 +1469,41 @@ namespace netgen
{
for (i = 0; i < 4; i++)
{
/*
if (!surfedges.Get(elnr)[i]) return i;
eledges[i] = abs (surfedges.Get(elnr)[i]);
orient[i] = (surfedges.Get(elnr)[i] > 0 ) ? 1 : -1;
*/
if (surfedges.Get(elnr)[i].nr == -1) return i;
eledges[i] = surfedges.Get(elnr)[i].nr+1;
orient[i] = (surfedges.Get(elnr)[i].orient) ? -1 : 1;
}
}
else
{
for (i = 0; i < 4; i++)
{
/*
if (!surfedges.Get(elnr)[i]) return i;
eledges[i] = abs (surfedges.Get(elnr)[i]);
*/
if (surfedges.Get(elnr)[i].nr == -1) return i;
eledges[i] = surfedges.Get(elnr)[i].nr+1;
}
}
return 4;
}
else
{
/*
eledges[0] = abs (segedges.Get(elnr));
if (orient)
orient[0] = segedges.Get(elnr) > 0 ? 1 : -1;
*/
eledges[0] = segedges.Get(elnr).nr+1;
if (orient)
orient[0] = segedges.Get(elnr).orient ? -1 : 1;
}
return 1;
}

View File

@ -13,6 +13,19 @@
*/
struct T_EDGE
{
int orient:1;
int nr:31; // 0-based
};
struct T_FACE
{
int forient:3;
int fnr:29; // 0-based
};
class MeshTopology
{
const Mesh & mesh;
@ -21,11 +34,11 @@ class MeshTopology
Array<INDEX_2> edge2vert;
Array<INDEX_4> face2vert;
Array<int[12]> edges;
Array<int[6]> faces;
Array<int[4]> surfedges;
Array<int> segedges;
Array<int> surffaces;
Array<T_EDGE[12]> edges;
Array<T_FACE[6]> faces;
Array<T_EDGE[4]> surfedges;
Array<T_EDGE> segedges;
Array<T_FACE> surffaces;
Array<INDEX_2> surf2volelement;
Array<int> face2surfel;
TABLE<ElementIndex,PointIndex::BASE> *vert2element;
@ -66,14 +79,20 @@ public:
inline static const ELEMENT_FACE * GetFaces0 (ELEMENT_TYPE et);
int GetSegmentEdge (int segnr) const { return abs(segedges[segnr-1]); }
int GetSegmentEdgeOrientation (int segnr) const { return sgn(segedges[segnr-1]); }
int GetEdge (SegmentIndex segnr) const { return abs(segedges[segnr])-1; }
// int GetSegmentEdge (int segnr) const { return abs(segedges[segnr-1]); }
// int GetSegmentEdgeOrientation (int segnr) const { return sgn(segedges[segnr-1]); }
// int GetEdge (SegmentIndex segnr) const { return abs(segedges[segnr])-1; }
int GetSegmentEdge (int segnr) const { return segedges[segnr-1].nr+1; }
int GetEdge (SegmentIndex segnr) const { return segedges[segnr].nr; }
void GetSegmentEdge (int segnr, int & enr, int & orient) const
{
/*
enr = abs(segedges.Get(segnr));
orient = segedges.Get(segnr) > 0 ? 1 : -1;
*/
enr = segedges.Get(segnr).nr+1;
orient = segedges.Get(segnr).orient;
}
void GetElementEdges (int elnr, Array<int> & edges) const;
@ -103,12 +122,12 @@ public:
int GetSurfaceElementEdges (int elnr, int * edges, int * orient) const;
const int * GetElementEdgesPtr (int elnr) const { return &edges[elnr][0]; }
const int * GetSurfaceElementEdgesPtr (int selnr) const { return &surfedges[selnr][0]; }
const int * GetSegmentElementEdgesPtr (int selnr) const { return &segedges[selnr]; }
const T_EDGE * GetElementEdgesPtr (int elnr) const { return &edges[elnr][0]; }
const T_EDGE * GetSurfaceElementEdgesPtr (int selnr) const { return &surfedges[selnr][0]; }
const T_EDGE * GetSegmentElementEdgesPtr (int selnr) const { return &segedges[selnr]; }
const int * GetElementFacesPtr (int elnr) const { return &faces[elnr][0]; }
const int * GetSurfaceElementFacesPtr (int selnr) const { return &surffaces[selnr]; }
const T_FACE * GetElementFacesPtr (int elnr) const { return &faces[elnr][0]; }
const T_FACE * GetSurfaceElementFacesPtr (int selnr) const { return &surffaces[selnr]; }
void GetSurface2VolumeElement (int selnr, int & elnr1, int & elnr2) const
@ -141,7 +160,7 @@ public:
int MeshTopology :: GetNVertices (ELEMENT_TYPE et)
inline int MeshTopology :: GetNVertices (ELEMENT_TYPE et)
{
switch (et)
{
@ -172,14 +191,14 @@ int MeshTopology :: GetNVertices (ELEMENT_TYPE et)
case HEX:
return 8;
default:
cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
}
return 0;
}
int MeshTopology :: GetNPoints (ELEMENT_TYPE et)
inline int MeshTopology :: GetNPoints (ELEMENT_TYPE et)
{
switch (et)
{
@ -213,15 +232,15 @@ int MeshTopology :: GetNPoints (ELEMENT_TYPE et)
case HEX:
return 8;
default:
cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
}
return 0;
}
int MeshTopology :: GetNEdges (ELEMENT_TYPE et)
inline int MeshTopology :: GetNEdges (ELEMENT_TYPE et)
{
switch (et)
{
@ -252,14 +271,14 @@ int MeshTopology :: GetNEdges (ELEMENT_TYPE et)
case HEX:
return 12;
default:
cerr << "Ng_ME_GetNEdges, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetNEdges, illegal element type " << et << endl;
}
return 0;
}
int MeshTopology :: GetNFaces (ELEMENT_TYPE et)
inline int MeshTopology :: GetNFaces (ELEMENT_TYPE et)
{
switch (et)
{
@ -290,8 +309,8 @@ int MeshTopology :: GetNFaces (ELEMENT_TYPE et)
case HEX:
return 6;
default:
cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
}
return 0;
}
@ -391,8 +410,8 @@ const ELEMENT_EDGE * MeshTopology :: GetEdges1 (ELEMENT_TYPE et)
case HEX:
return hex_edges;
default:
cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
}
return 0;
}
@ -489,8 +508,8 @@ const ELEMENT_EDGE * MeshTopology :: GetEdges0 (ELEMENT_TYPE et)
case HEX:
return hex_edges;
default:
cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
}
return 0;
}
@ -504,7 +523,7 @@ const ELEMENT_EDGE * MeshTopology :: GetEdges0 (ELEMENT_TYPE et)
const ELEMENT_FACE * MeshTopology :: GetFaces1 (ELEMENT_TYPE et)
inline const ELEMENT_FACE * MeshTopology :: GetFaces1 (ELEMENT_TYPE et)
{
static const int trig_faces[1][4] =
{ { 1, 2, 3, 0 } };
@ -576,8 +595,8 @@ const ELEMENT_FACE * MeshTopology :: GetFaces1 (ELEMENT_TYPE et)
case HEX:
return hex_faces;
default:
cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
}
return 0;
}
@ -586,7 +605,7 @@ const ELEMENT_FACE * MeshTopology :: GetFaces1 (ELEMENT_TYPE et)
const ELEMENT_FACE * MeshTopology :: GetFaces0 (ELEMENT_TYPE et)
inline const ELEMENT_FACE * MeshTopology :: GetFaces0 (ELEMENT_TYPE et)
{
static const int trig_faces[1][4] =
{ { 0, 1, 2, -1 } };
@ -658,8 +677,8 @@ const ELEMENT_FACE * MeshTopology :: GetFaces0 (ELEMENT_TYPE et)
case HEX:
return hex_faces;
default:
cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
// default:
// cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
}
return 0;
}