PointIndex::BASE = 0 working for CSG

This commit is contained in:
Joachim Schöberl 2016-12-11 20:17:07 +01:00
parent 59dc0b6c6a
commit be1e6e160b
12 changed files with 143 additions and 177 deletions

View File

@ -656,9 +656,10 @@ namespace netgen
} }
for (int i = 1; i <= nseg; i++) // for (int i = 1; i <= nseg; i++)
for (Segment & seg : mesh.LineSegments())
{ {
Segment & seg = mesh.LineSegment (i); // Segment & seg = mesh.LineSegment (i);
if (seg.edgenr >= 1 && seg.edgenr <= cntedge) if (seg.edgenr >= 1 && seg.edgenr <= cntedge)
{ {
if (osedges.Get(seg.edgenr) != -1) if (osedges.Get(seg.edgenr) != -1)

View File

@ -96,7 +96,7 @@ namespace netgen
nnums.SetSize(elnv+elned+elnfa+1); nnums.SetSize(elnv+elned+elnfa+1);
for (int j = 1; j <= elnv; j++) for (int j = 1; j <= elnv; j++)
nnums.Elem(j) = el.PNum(j); nnums.Elem(j) = el.PNum(j)+1-PointIndex::BASE;
for (int j = 1; j <= elned; j++) for (int j = 1; j <= elned; j++)
nnums.Elem(elnv+j) = nv+ednums.Elem(j); nnums.Elem(elnv+j) = nv+ednums.Elem(j);
for (int j = 1; j <= elnfa; j++) for (int j = 1; j <= elnfa; j++)
@ -108,7 +108,6 @@ namespace netgen
} }
}); });
NgProfiler::StopTimer(timer1); NgProfiler::StopTimer(timer1);
NgProfiler::StartTimer(timer2); NgProfiler::StartTimer(timer2);
@ -125,7 +124,7 @@ namespace netgen
nnums.SetSize(elnv+elned+1); nnums.SetSize(elnv+elned+1);
for (int j = 1; j <= elnv; j++) for (int j = 1; j <= elnv; j++)
nnums.Elem(j) = el.PNum(j); nnums.Elem(j) = el.PNum(j)+1-PointIndex::BASE;
for (int j = 1; j <= elned; j++) for (int j = 1; j <= elned; j++)
nnums.Elem(elnv+j) = nv+ednums.Elem(j); nnums.Elem(elnv+j) = nv+ednums.Elem(j);
nnums.Elem(elnv+elned+1) = fanum; nnums.Elem(elnv+elned+1) = fanum;
@ -197,7 +196,7 @@ namespace netgen
nnums.SetSize(elnv+elned+elnfa+1); nnums.SetSize(elnv+elned+elnfa+1);
for (int j = 1; j <= elnv; j++) for (int j = 1; j <= elnv; j++)
nnums.Elem(j) = el.PNum(j); nnums.Elem(j) = el.PNum(j)+1-PointIndex::BASE;
for (int j = 1; j <= elned; j++) for (int j = 1; j <= elned; j++)
nnums.Elem(elnv+j) = nv+ednums.Elem(j); nnums.Elem(elnv+j) = nv+ednums.Elem(j);
for (int j = 1; j <= elnfa; j++) for (int j = 1; j <= elnfa; j++)
@ -220,23 +219,23 @@ namespace netgen
break; break;
case TET: case TET:
case TET10: case TET10:
if (cluster_reps.Get(el.PNum(1)) == if (cluster_reps.Get(el.PNum(1)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(2))) cluster_reps.Get(el.PNum(2)+1-PointIndex::BASE))
clustertab = tet_cluster12; clustertab = tet_cluster12;
else if (cluster_reps.Get(el.PNum(1)) == else if (cluster_reps.Get(el.PNum(1)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(3))) cluster_reps.Get(el.PNum(3)+1-PointIndex::BASE))
clustertab = tet_cluster13; clustertab = tet_cluster13;
else if (cluster_reps.Get(el.PNum(1)) == else if (cluster_reps.Get(el.PNum(1)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(4))) cluster_reps.Get(el.PNum(4)+1-PointIndex::BASE))
clustertab = tet_cluster14; clustertab = tet_cluster14;
else if (cluster_reps.Get(el.PNum(2)) == else if (cluster_reps.Get(el.PNum(2)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(3))) cluster_reps.Get(el.PNum(3)+1-PointIndex::BASE))
clustertab = tet_cluster23; clustertab = tet_cluster23;
else if (cluster_reps.Get(el.PNum(2)) == else if (cluster_reps.Get(el.PNum(2)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(4))) cluster_reps.Get(el.PNum(4)+1-PointIndex::BASE))
clustertab = tet_cluster24; clustertab = tet_cluster24;
else if (cluster_reps.Get(el.PNum(3)) == else if (cluster_reps.Get(el.PNum(3)+1-PointIndex::BASE) ==
cluster_reps.Get(el.PNum(4))) cluster_reps.Get(el.PNum(4)+1-PointIndex::BASE))
clustertab = tet_cluster34; clustertab = tet_cluster34;
else else

View File

@ -274,16 +274,8 @@ void MeshOptimize3d :: CombineImprove (Mesh & mesh,
void MeshOptimize3d :: SplitImprove (Mesh & mesh, void MeshOptimize3d :: SplitImprove (Mesh & mesh,
OPTIMIZEGOAL goal) OPTIMIZEGOAL goal)
{ {
int j, k, l;
Point3d p1, p2, pnew;
ElementIndex ei;
SurfaceElementIndex sei;
PointIndex pi1, pi2;
double bad1, bad2, badmax, badlimit; double bad1, bad2, badmax, badlimit;
int cnt = 0; int cnt = 0;
int np = mesh.GetNP(); int np = mesh.GetNP();
int ne = mesh.GetNE(); int ne = mesh.GetNE();
@ -291,7 +283,7 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np); TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np);
Array<ElementIndex> hasbothpoints; Array<ElementIndex> hasbothpoints;
BitArray origpoint(np), boundp(np); BitArray origpoint(np+1), boundp(np+1); // big enough for 0 and 1-based
origpoint.Set(); origpoint.Set();
Array<double> elerrs(ne); Array<double> elerrs(ne);
@ -301,7 +293,6 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
const char * savetask = multithread.task; const char * savetask = multithread.task;
multithread.task = "Split Improve"; multithread.task = "Split Improve";
PrintMessage (3, "SplitImprove"); PrintMessage (3, "SplitImprove");
(*testout) << "start SplitImprove" << "\n"; (*testout) << "start SplitImprove" << "\n";
@ -311,10 +302,11 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
bad1 = 0; bad1 = 0;
badmax = 0; badmax = 0;
for (ei = 0; ei < ne; ei++) for (ElementIndex ei = 0; ei < ne; ei++)
{ {
if(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) if(mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex())
continue; continue;
elerrs[ei] = CalcBad (mesh.Points(), mesh[ei], 0); elerrs[ei] = CalcBad (mesh.Points(), mesh[ei], 0);
bad1 += elerrs[ei]; bad1 += elerrs[ei];
if (elerrs[ei] > badmax) badmax = elerrs[ei]; if (elerrs[ei] > badmax) badmax = elerrs[ei];
@ -325,41 +317,40 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
boundp.Clear(); boundp.Clear();
for (sei = 0; sei < mesh.GetNSE(); sei++) for (auto & el : mesh.SurfaceElements())
for (j = 0; j < 3; j++) for (PointIndex pi : el.PNums())
boundp.Set (mesh[sei][j]); boundp.Set (pi);
if (goal == OPT_QUALITY) if (goal == OPT_QUALITY)
{ {
bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements()); bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
(*testout) << "Total badness = " << bad1 << endl; (*testout) << "Total badness = " << bad1 << endl;
} }
for (ei = 0; ei < ne; ei++) for (ElementIndex ei : mesh.VolumeElements().Range())
for (j = 0; j < mesh[ei].GetNP(); j++) for (PointIndex pi : mesh[ei].PNums())
elementsonnode.Add (mesh[ei][j], ei); elementsonnode.Add (pi, ei);
mesh.MarkIllegalElements(); mesh.MarkIllegalElements();
if (goal == OPT_QUALITY || goal == OPT_LEGAL) if (goal == OPT_QUALITY || goal == OPT_LEGAL)
{ {
int cntill = 0; int cntill = 0;
for (ei = 0; ei < ne; ei++) for (ElementIndex ei = 0; ei < ne; ei++)
{ {
// if (!LegalTet (volelements.Get(i))) // if (!LegalTet (volelements.Get(i)))
if (mesh[ei].flags.illegal) if (mesh[ei].flags.illegal)
{ {
cntill++; cntill++;
illegaltet.Set (ei+1); illegaltet.Set (ei);
} }
} }
// (*mycout) << cntill << " illegal tets" << endl;
} }
for (ElementIndex ei : mesh.VolumeElements().Range())
for (ei = 0; ei < ne; ei++)
{ {
if(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) Element & elem = mesh[ei];
if(mp.only3D_domain_nr && mp.only3D_domain_nr != elem.GetIndex())
continue; continue;
if (multithread.terminate) if (multithread.terminate)
break; break;
@ -368,82 +359,74 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
bool ltestmode = 0; bool ltestmode = 0;
if (elerrs[ei] < badlimit && !illegaltet.Test(ei)) continue;
if (elerrs[ei] < badlimit && !illegaltet.Test(ei+1)) continue;
if ((goal == OPT_LEGAL) && if ((goal == OPT_LEGAL) &&
!illegaltet.Test(ei+1) && !illegaltet.Test(ei) &&
CalcBad (mesh.Points(), mesh[ei], 0) < 1e3) CalcBad (mesh.Points(), elem, 0) < 1e3)
continue; continue;
Element & elem = mesh[ei];
if (ltestmode) if (ltestmode)
{ {
(*testout) << "test el " << ei << endl; (*testout) << "test el " << ei << endl;
for (j = 0; j < 4; j++) for (int j = 0; j < 4; j++)
(*testout) << elem[j] << " "; (*testout) << elem[j] << " ";
(*testout) << endl; (*testout) << endl;
} }
for (int j = 0; j < 6; j++)
for (j = 0; j < 6; j++)
{ {
static const int tetedges[6][2] = static const int tetedges[6][2] =
{ { 0, 1 }, { 0, 2 }, { 0, 3 }, { { 0, 1 }, { 0, 2 }, { 0, 3 },
{ 1, 2 }, { 1, 3 }, { 2, 3 } }; { 1, 2 }, { 1, 3 }, { 2, 3 } };
pi1 = elem[tetedges[j][0]]; PointIndex pi1 = elem[tetedges[j][0]];
pi2 = elem[tetedges[j][1]]; PointIndex pi2 = elem[tetedges[j][1]];
if (pi2 < pi1) Swap (pi1, pi2); if (pi2 < pi1) Swap (pi1, pi2);
if (pi2 > elementsonnode.Size()) continue; if (pi2 >= elementsonnode.Size()+PointIndex::BASE) continue; // old number of points
if (!origpoint.Test(pi1) || !origpoint.Test(pi2)) if (!origpoint.Test(pi1) || !origpoint.Test(pi2))
continue; continue;
INDEX_2 i2(pi1, pi2); INDEX_2 i2(pi1, pi2);
i2.Sort(); i2.Sort();
if (mesh.BoundaryEdge (pi1, pi2)) continue; if (mesh.BoundaryEdge (pi1, pi2)) continue;
if (edgetested.Used (i2) && !illegaltet.Test(ei+1)) continue; if (edgetested.Used (i2) && !illegaltet.Test(ei)) continue;
edgetested.Set (i2, 1); edgetested.Set (i2, 1);
hasbothpoints.SetSize (0); hasbothpoints.SetSize (0);
for (k = 1; k <= elementsonnode.EntrySize(pi1); k++) /*
for (int k = 1; k <= elementsonnode.EntrySize(pi1); k++)
{ {
bool has1 = 0, has2 = 0;
ElementIndex elnr = elementsonnode.Get(pi1, k); ElementIndex elnr = elementsonnode.Get(pi1, k);
Element & el = mesh[elnr]; */
for (ElementIndex ei : elementsonnode[pi1])
{
Element & el = mesh[ei];
bool has1 = el.PNums().Contains(pi1);
bool has2 = el.PNums().Contains(pi2);
for (l = 0; l < el.GetNP(); l++)
{
if (el[l] == pi1) has1 = 1;
if (el[l] == pi2) has2 = 1;
}
if (has1 && has2) if (has1 && has2)
if (!hasbothpoints.Contains (elnr)) if (!hasbothpoints.Contains (ei))
hasbothpoints.Append (elnr); hasbothpoints.Append (ei);
} }
bad1 = 0; bad1 = 0;
for (k = 0; k < hasbothpoints.Size(); k++)
bad1 += CalcBad (mesh.Points(), mesh[hasbothpoints[k]], 0);
for (ElementIndex ei : hasbothpoints)
bad1 += CalcBad (mesh.Points(), mesh[ei], 0);
bool puretet = 1; bool puretet = 1;
for (k = 0; k < hasbothpoints.Size(); k++) for (ElementIndex ei : hasbothpoints)
if (mesh[hasbothpoints[k]].GetType() != TET) if (mesh[ei].GetType() != TET)
puretet = 0; puretet = 0;
if (!puretet) continue; if (!puretet) continue;
p1 = mesh[pi1]; Point3d p1 = mesh[pi1];
p2 = mesh[pi2]; Point3d p2 = mesh[pi2];
/* /*
pnew = Center (p1, p2); pnew = Center (p1, p2);
@ -463,13 +446,12 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
points.Elem(pi2) = p2; points.Elem(pi2) = p2;
*/ */
locfaces.SetSize (0); locfaces.SetSize (0);
for (k = 0; k < hasbothpoints.Size(); k++) for (ElementIndex ei : hasbothpoints)
{ {
const Element & el = mesh[hasbothpoints[k]]; const Element & el = mesh[ei];
for (l = 0; l < 4; l++) for (int l = 0; l < 4; l++)
if (el[l] == pi1 || el[l] == pi2) if (el[l] == pi1 || el[l] == pi2)
{ {
INDEX_3 i3; INDEX_3 i3;
@ -486,7 +468,7 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
par.maxit_linsearch = 50; par.maxit_linsearch = 50;
par.maxit_bfgs = 20; par.maxit_bfgs = 20;
pnew = Center (p1, p2); Point3d pnew = Center (p1, p2);
Vector px(3); Vector px(3);
px(0) = pnew.X(); px(0) = pnew.X();
px(1) = pnew.Y(); px(1) = pnew.Y();
@ -501,11 +483,10 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
pnew.Y() = px(1); pnew.Y() = px(1);
pnew.Z() = px(2); pnew.Z() = px(2);
PointIndex hpinew = mesh.AddPoint (pnew);
int hpinew = mesh.AddPoint (pnew);
// ptyps.Append (INNERPOINT); // ptyps.Append (INNERPOINT);
for (k = 0; k < hasbothpoints.Size(); k++) for (int k = 0; k < hasbothpoints.Size(); k++)
{ {
Element & oldel = mesh[hasbothpoints[k]]; Element & oldel = mesh[hasbothpoints[k]];
Element newel1 = oldel; Element newel1 = oldel;
@ -515,7 +496,7 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
newel1.flags.illegal_valid = 0; newel1.flags.illegal_valid = 0;
newel2.flags.illegal_valid = 0; newel2.flags.illegal_valid = 0;
for (l = 0; l < 4; l++) for (int l = 0; l < 4; l++)
{ {
if (newel1[l] == pi2) newel1[l] = hpinew; if (newel1[l] == pi2) newel1[l] = hpinew;
if (newel2[l] == pi1) newel2[l] = hpinew; if (newel2[l] == pi1) newel2[l] = hpinew;
@ -536,15 +517,15 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
PointIndex pinew = mesh.AddPoint (pnew); PointIndex pinew = mesh.AddPoint (pnew);
for (k = 0; k < hasbothpoints.Size(); k++) for (ElementIndex ei : hasbothpoints)
{ {
Element & oldel = mesh[hasbothpoints[k]]; Element & oldel = mesh[ei];
Element newel = oldel; Element newel = oldel;
newel.flags.illegal_valid = 0; newel.flags.illegal_valid = 0;
oldel.flags.illegal_valid = 0; oldel.flags.illegal_valid = 0;
for (l = 0; l < 4; l++) for (int l = 0; l < 4; l++)
{ {
origpoint.Clear (oldel[l]); origpoint.Clear (oldel[l]);
@ -554,7 +535,7 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
mesh.AddVolumeElement (newel); mesh.AddVolumeElement (newel);
} }
j = 10; j = 10; // end j-loop
} }
} }
} }
@ -572,11 +553,9 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh,
int cntill = 0; int cntill = 0;
ne = mesh.GetNE(); ne = mesh.GetNE();
for (ei = 0; ei < ne; ei++) for (ElementIndex ei = 0; ei < ne; ei++)
{ if (!mesh.LegalTet (mesh[ei]))
if (!mesh.LegalTet (mesh[ei])) cntill++;
cntill++;
}
// cout << cntill << " illegal tets" << endl; // cout << cntill << " illegal tets" << endl;
} }

View File

@ -5367,30 +5367,9 @@ namespace netgen
int Mesh :: MarkIllegalElements () int Mesh :: MarkIllegalElements ()
{ {
int cnt = 0; int cnt = 0;
int i; for (auto & el : VolumeElements())
if (!LegalTet (el))
for (i = 1; i <= GetNE(); i++) cnt++;
{
LegalTet (VolumeElement(i));
/*
Element & el = VolumeElement(i);
int leg1 = LegalTet (el);
el.flags.illegal_valid = 0;
int leg2 = LegalTet (el);
if (leg1 != leg2)
{
cerr << "legal differs!!" << endl;
(*testout) << "legal differs" << endl;
(*testout) << "elnr = " << i << ", el = " << el
<< " leg1 = " << leg1 << ", leg2 = " << leg2 << endl;
}
// el.flags.illegal = !LegalTet (el);
*/
cnt += VolumeElement(i).Illegal();
}
return cnt; return cnt;
} }

View File

@ -24,8 +24,8 @@ namespace netgen
{ {
public: public:
typedef ::netgen::T_POINTS T_POINTS; typedef ::netgen::T_POINTS T_POINTS;
typedef Array<Element> T_VOLELEMENTS; typedef Array<Element, 0, ElementIndex> T_VOLELEMENTS;
typedef Array<Element2d> T_SURFELEMENTS; typedef Array<Element2d, 0, SurfaceElementIndex> T_SURFELEMENTS;
private: private:
/// point coordinates /// point coordinates
@ -192,24 +192,24 @@ namespace netgen
void ClearSurfaceElements(); void ClearSurfaceElements();
/// ///
DLL_HEADER void ClearVolumeElements() DLL_HEADER void ClearVolumeElements()
{ {
volelements.SetSize(0); volelements.SetSize(0);
timestamp = NextTimeStamp(); timestamp = NextTimeStamp();
} }
/// ///
DLL_HEADER void ClearSegments() DLL_HEADER void ClearSegments()
{ {
segments.SetSize(0); segments.SetSize(0);
timestamp = NextTimeStamp(); timestamp = NextTimeStamp();
} }
/// ///
bool TestOk () const; bool TestOk () const;
void SetAllocSize(int nnodes, int nsegs, int nsel, int nel); void SetAllocSize(int nnodes, int nsegs, int nsel, int nel);
DLL_HEADER PointIndex AddPoint (const Point3d & p, int layer = 1); DLL_HEADER PointIndex AddPoint (const Point3d & p, int layer = 1);
DLL_HEADER PointIndex AddPoint (const Point3d & p, int layer, POINTTYPE type); DLL_HEADER PointIndex AddPoint (const Point3d & p, int layer, POINTTYPE type);
@ -236,13 +236,17 @@ namespace netgen
segments.Elem(segnr)[0].Invalidate(); segments.Elem(segnr)[0].Invalidate();
segments.Elem(segnr)[1].Invalidate(); segments.Elem(segnr)[1].Invalidate();
} }
/*
void FullDeleteSegment (int segnr) // von wem ist das ??? void FullDeleteSegment (int segnr) // von wem ist das ???
{ {
segments.Delete(segnr-PointIndex::BASE); segments.Delete(segnr-PointIndex::BASE);
} }
*/
int GetNSeg () const { return segments.Size(); } int GetNSeg () const { return segments.Size(); }
[[deprecated("Use LineSegment(SegmentIndex) instead of int !")]]
Segment & LineSegment(int i) { return segments.Elem(i); } Segment & LineSegment(int i) { return segments.Elem(i); }
[[deprecated("Use LineSegment(SegmentIndex) instead of int !")]]
const Segment & LineSegment(int i) const { return segments.Get(i); } const Segment & LineSegment(int i) const { return segments.Get(i); }
Segment & LineSegment(SegmentIndex si) { return segments[si]; } Segment & LineSegment(SegmentIndex si) { return segments[si]; }
@ -256,6 +260,8 @@ namespace netgen
Array<Element0d> pointelements; // only via python interface Array<Element0d> pointelements; // only via python interface
DLL_HEADER SurfaceElementIndex AddSurfaceElement (const Element2d & el); DLL_HEADER SurfaceElementIndex AddSurfaceElement (const Element2d & el);
[[deprecated("Use DeleteSurfaceElement(SurfaceElementIndex) instead of int !")]]
void DeleteSurfaceElement (int eli) void DeleteSurfaceElement (int eli)
{ {
surfelements.Elem(eli).Delete(); surfelements.Elem(eli).Delete();
@ -267,11 +273,16 @@ namespace netgen
void DeleteSurfaceElement (SurfaceElementIndex eli) void DeleteSurfaceElement (SurfaceElementIndex eli)
{ {
DeleteSurfaceElement (int(eli)+1); for (auto & p : surfelements[eli].PNums()) p.Invalidate();
surfelements[eli].Delete();
timestamp = NextTimeStamp();
} }
int GetNSE () const { return surfelements.Size(); } int GetNSE () const { return surfelements.Size(); }
[[deprecated("Use SurfaceElement(SurfaceElementIndex) instead of int !")]]
Element2d & SurfaceElement(int i) { return surfelements.Elem(i); } Element2d & SurfaceElement(int i) { return surfelements.Elem(i); }
[[deprecated("Use SurfaceElement(SurfaceElementIndex) instead of int !")]]
const Element2d & SurfaceElement(int i) const { return surfelements.Get(i); } const Element2d & SurfaceElement(int i) const { return surfelements.Get(i); }
Element2d & SurfaceElement(SurfaceElementIndex i) { return surfelements[i]; } Element2d & SurfaceElement(SurfaceElementIndex i) { return surfelements[i]; }
const Element2d & SurfaceElement(SurfaceElementIndex i) const { return surfelements[i]; } const Element2d & SurfaceElement(SurfaceElementIndex i) const { return surfelements[i]; }
@ -309,9 +320,8 @@ namespace netgen
ELEMENTTYPE ElementType (ElementIndex i) const ELEMENTTYPE ElementType (ElementIndex i) const
{ return (volelements[i].flags.fixed) ? FIXEDELEMENT : FREEELEMENT; } { return (volelements[i].flags.fixed) ? FIXEDELEMENT : FREEELEMENT; }
const T_VOLELEMENTS & VolumeElements() const { return volelements; } const auto & VolumeElements() const { return volelements; }
T_VOLELEMENTS & VolumeElements() { return volelements; } auto & VolumeElements() { return volelements; }
/// ///
DLL_HEADER double ElementError (int eli, const MeshingParameters & mp) const; DLL_HEADER double ElementError (int eli, const MeshingParameters & mp) const;
@ -321,17 +331,13 @@ namespace netgen
/// ///
void ClearLockedPoints (); void ClearLockedPoints ();
const Array<PointIndex> & LockedPoints() const const auto & LockedPoints() const { return lockedpoints; }
{ return lockedpoints; }
/// Returns number of domains /// Returns number of domains
int GetNDomains() const; int GetNDomains() const;
/// ///
int GetDimension() const int GetDimension() const { return dimension; }
{ return dimension; } void SetDimension (int dim) { dimension = dim; }
void SetDimension(int dim)
{ dimension = dim; }
/// sets internal tables /// sets internal tables
void CalcSurfacesOfNode (); void CalcSurfacesOfNode ();

View File

@ -708,7 +708,7 @@ namespace netgen
break; break;
PrintMessage (5, nillegal, " illegal tets"); PrintMessage (5, nillegal, " illegal tets");
optmesh.SplitImprove (mesh3d, OPT_LEGAL); optmesh.SplitImprove (mesh3d, OPT_LEGAL);
mesh3d.MarkIllegalElements(); // test mesh3d.MarkIllegalElements(); // test
optmesh.SwapImprove (mesh3d, OPT_LEGAL); optmesh.SwapImprove (mesh3d, OPT_LEGAL);

View File

@ -658,8 +658,6 @@ GenerateMesh (Mesh & mesh, const MeshingParameters & mp)
pindex.Elem(i) = adfront -> AddPoint (locpoints.Get(i), globind); pindex.Elem(i) = adfront -> AddPoint (locpoints.Get(i), globind);
} }
cout << "bbb121212" << endl;
for (int i = 1; i <= locelements.Size(); i++) for (int i = 1; i <= locelements.Size(); i++)
{ {
Point3d * hp1, * hp2, * hp3, * hp4; Point3d * hp1, * hp2, * hp3, * hp4;

View File

@ -156,8 +156,10 @@ namespace netgen
ElementIndex & operator= (const ElementIndex & ai) { i = ai.i; return *this; } ElementIndex & operator= (const ElementIndex & ai) { i = ai.i; return *this; }
ElementIndex & operator= (int ai) { i = ai; return *this; } ElementIndex & operator= (int ai) { i = ai; return *this; }
operator int () const { return i; } operator int () const { return i; }
ElementIndex & operator++ (int) { i++; return *this; } ElementIndex operator++ (int) { return ElementIndex(i++); }
ElementIndex & operator-- (int) { i--; return *this; } ElementIndex operator-- (int) { return ElementIndex(i--); }
ElementIndex & operator++ () { ++i; return *this; }
ElementIndex & operator-- () { --i; return *this; }
}; };
inline istream & operator>> (istream & ist, ElementIndex & pi) inline istream & operator>> (istream & ist, ElementIndex & pi)
@ -181,9 +183,11 @@ namespace netgen
{ i = ai.i; return *this; } { i = ai.i; return *this; }
SurfaceElementIndex & operator= (int ai) { i = ai; return *this; } SurfaceElementIndex & operator= (int ai) { i = ai; return *this; }
operator int () const { return i; } operator int () const { return i; }
SurfaceElementIndex & operator++ (int) { i++; return *this; } SurfaceElementIndex operator++ (int) { SurfaceElementIndex hi(*this); i++; return hi; }
SurfaceElementIndex operator-- (int) { SurfaceElementIndex hi(*this); i--; return hi; }
SurfaceElementIndex & operator++ () { ++i; return *this; }
SurfaceElementIndex & operator-- () { --i; return *this; }
SurfaceElementIndex & operator+= (int inc) { i+=inc; return *this; } SurfaceElementIndex & operator+= (int inc) { i+=inc; return *this; }
SurfaceElementIndex & operator-- (int) { i--; return *this; }
}; };
inline istream & operator>> (istream & ist, SurfaceElementIndex & pi) inline istream & operator>> (istream & ist, SurfaceElementIndex & pi)
@ -389,6 +393,8 @@ namespace netgen
FlatArray<const PointIndex> PNums () const FlatArray<const PointIndex> PNums () const
{ return FlatArray<const PointIndex> (np, &pnum[0]); } { return FlatArray<const PointIndex> (np, &pnum[0]); }
FlatArray<PointIndex> PNums ()
{ return FlatArray<PointIndex> (np, &pnum[0]); }
/// ///
PointIndex & PNum (int i) { return pnum[i-1]; } PointIndex & PNum (int i) { return pnum[i-1]; }
@ -477,8 +483,7 @@ namespace netgen
void Delete () void Delete ()
{ {
deleted = 1; deleted = 1;
for (PointIndex & p : pnum) for (PointIndex & p : pnum) p.Invalidate();
p.Invalidate();
} }
bool IsDeleted () const bool IsDeleted () const

View File

@ -304,8 +304,8 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
ExportArray<Element>(m); ExportArray<Element,0,ElementIndex>(m);
ExportArray<Element2d>(m); ExportArray<Element2d,0,SurfaceElementIndex>(m);
ExportArray<Segment>(m); ExportArray<Segment>(m);
ExportArray<Element0d>(m); ExportArray<Element0d>(m);
ExportArray<MeshPoint,PointIndex::BASE,PointIndex>(m); ExportArray<MeshPoint,PointIndex::BASE,PointIndex>(m);
@ -384,11 +384,11 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
.def_property("dim", &Mesh::GetDimension, &Mesh::SetDimension) .def_property("dim", &Mesh::GetDimension, &Mesh::SetDimension)
.def("Elements3D", .def("Elements3D",
static_cast<Array<Element>&(Mesh::*)()> (&Mesh::VolumeElements), static_cast<Array<Element,0,ElementIndex>&(Mesh::*)()> (&Mesh::VolumeElements),
py::return_value_policy::reference) py::return_value_policy::reference)
.def("Elements2D", .def("Elements2D",
static_cast<Array<Element2d>&(Mesh::*)()> (&Mesh::SurfaceElements), static_cast<Array<Element2d,0,SurfaceElementIndex>&(Mesh::*)()> (&Mesh::SurfaceElements),
py::return_value_policy::reference) py::return_value_policy::reference)
.def("Elements1D", .def("Elements1D",

View File

@ -383,11 +383,11 @@ namespace netgen
swap (pnums.Elem(3), pnums.Elem(4)); swap (pnums.Elem(3), pnums.Elem(4));
for (int j = 0; j < 6; j++) for (int j = 0; j < 6; j++)
{ {
INDEX_2 i2; PointIndex pi1 = pnums.Get(betw[j][0]);
i2.I1() = pnums.Get(betw[j][0]); PointIndex pi2 = pnums.Get(betw[j][1]);
i2.I2() = pnums.Get(betw[j][1]); INDEX_2 i2 (pi1, pi2);
i2.Sort(); i2.Sort();
/* /*
if (between.Used(i2)) if (between.Used(i2))
@ -405,8 +405,8 @@ namespace netgen
if (!pointset[pinew]) if (!pointset[pinew])
{ {
pointset[pinew] = true; pointset[pinew] = true;
mesh.Point(pinew) = Center(mesh.Point(i2.I1()), mesh.Point(pinew) = Center(mesh.Point(pi1),
mesh.Point(i2.I2())); mesh.Point(pi2));
} }
} }

View File

@ -76,7 +76,7 @@ public:
int drawcurveprojedge; int drawcurveprojedge;
int centerpoint; PointIndex centerpoint;
int drawelement; int drawelement;
// stl: // stl:

View File

@ -440,12 +440,12 @@ namespace netgen
char buf[30]; char buf[30];
if (vispar.drawpointnumbers) if (vispar.drawpointnumbers)
for (int i = 1; i <= mesh->GetNP(); i++) for (PointIndex pi : mesh->Points().Range())
{ {
const Point3d & p = mesh->Point(i); const Point3d & p = mesh->Point(pi);
glRasterPos3d (p.X(), p.Y(), p.Z()); glRasterPos3d (p.X(), p.Y(), p.Z());
sprintf (buf, "%d", i); sprintf (buf, "%d", int(pi));
// glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf); // glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
MyOpenGLText (buf); MyOpenGLText (buf);
@ -663,12 +663,12 @@ namespace netgen
for (int i = 1; i <= mesh->GetNE(); i++) for (ElementIndex ei : mesh->VolumeElements().Range())
{ {
if (mesh->VolumeElement(i).flags.badel) if (mesh->VolumeElement(ei).flags.badel)
{ {
// copy to be thread-safe // copy to be thread-safe
Element el = mesh->VolumeElement (i); Element el = mesh->VolumeElement (ei);
if ( (el.GetNP() == 4) || (el.GetNP() == 10)) if ( (el.GetNP() == 4) || (el.GetNP() == 10))
{ {
glBegin (GL_LINES); glBegin (GL_LINES);
@ -747,17 +747,16 @@ namespace netgen
} }
} }
for (SurfaceElementIndex sei : mesh->SurfaceElements().Range())
for (int i = 1; i <= mesh->GetNSE(); i++)
{ {
Element2d el = mesh->SurfaceElement(i); Element2d el = mesh->SurfaceElement(sei); // copy to be thread-safe
if (!el.BadElement()) if (!el.BadElement())
continue; continue;
int drawel = 1; bool drawel = true;
for (int j = 1; j <= el.GetNP(); j++) for (int j = 1; j <= el.GetNP(); j++)
if (!el.PNum(j)) if (!el.PNum(j).IsValid())
drawel = 0; drawel = false;
if (!drawel) if (!drawel)
continue; continue;