From a2ea0c407a368508cb1fcc6b209ab847f8fb519b Mon Sep 17 00:00:00 2001 From: Joachim Schoeberl Date: Sun, 29 Dec 2024 15:42:21 +0100 Subject: [PATCH] more general ClosedHashTable, e.g. hash for tuples --- libsrc/core/bitarray.hpp | 3 +- libsrc/core/hashtable.hpp | 32 ++++++++++-- libsrc/csg/singularref.cpp | 6 +-- libsrc/general/template.hpp | 17 +++++- libsrc/geom2d/genmesh2d.cpp | 7 +-- libsrc/meshing/boundarylayer_interpolate.cpp | 6 ++- libsrc/meshing/classifyhpel.hpp | 44 +++++++++------- libsrc/meshing/hprefinement.cpp | 24 +++++---- libsrc/meshing/meshclass.cpp | 4 +- libsrc/meshing/meshfunc.cpp | 4 +- libsrc/meshing/meshing2.cpp | 3 +- libsrc/meshing/meshtype.cpp | 8 +-- libsrc/meshing/meshtype.hpp | 54 ++++++++++++++++---- libsrc/meshing/ruler3.cpp | 8 +-- libsrc/meshing/smoothing2.cpp | 2 +- libsrc/meshing/specials.cpp | 3 +- 16 files changed, 156 insertions(+), 69 deletions(-) diff --git a/libsrc/core/bitarray.hpp b/libsrc/core/bitarray.hpp index 0587595b..caa8345c 100644 --- a/libsrc/core/bitarray.hpp +++ b/libsrc/core/bitarray.hpp @@ -223,8 +223,9 @@ private: void Clear (IndexType i) { BitArray::Clear(i-IndexBASE()); } void SetBitAtomic (IndexType i) { BitArray::SetBitAtomic(i-IndexBASE()); } bool Test (IndexType i) const { return BitArray::Test(i-IndexBASE()); } + bool operator[] (IndexType i) const { return Test(i); } - + T_Range Range() const { return { IndexBASE(), IndexBASE()+Size() }; } NGCORE_API TBitArray & Or (const TBitArray & ba2) { BitArray::Or(ba2); diff --git a/libsrc/core/hashtable.hpp b/libsrc/core/hashtable.hpp index c7aa0b93..0add45f0 100644 --- a/libsrc/core/hashtable.hpp +++ b/libsrc/core/hashtable.hpp @@ -591,10 +591,28 @@ namespace ngcore return res; } - template constexpr inline T InvalidHash() { return T(-1); } + template + struct CHT_trait + { + constexpr static inline T_HASH Invalid() { return InvalidHash(); } + constexpr static inline size_t HashValue (const T_HASH & hash, size_t mask) { return HashValue2(hash, mask); } + }; + + template + struct CHT_trait> + { + constexpr static inline std::tuple Invalid() { return { CHT_trait::Invalid(), CHT_trait::Invalid() } ; } + constexpr static inline size_t HashValue (const std::tuple & hash, size_t mask) + { + return (CHT_trait::HashValue(std::get<0>(hash), mask) + CHT_trait::HashValue(std::get<1>(hash),mask)) & mask; + } + }; + + + /** A closed hash-table. All information is stored in one fixed array. @@ -615,7 +633,8 @@ namespace ngcore Array cont; /// // T_HASH invalid = -1; - static constexpr T_HASH invalid = InvalidHash(); + // static constexpr T_HASH invalid = InvalidHash(); + static constexpr T_HASH invalid = CHT_trait::Invalid(); public: /// ClosedHashTable (size_t asize = 128) @@ -623,7 +642,8 @@ namespace ngcore { mask = size-1; // hash = T_HASH(invalid); - hash = InvalidHash(); + // hash = InvalidHash(); + hash = CHT_trait::Invalid(); } ClosedHashTable (ClosedHashTable && ht2) = default; @@ -658,7 +678,8 @@ namespace ngcore size_t Position (const T_HASH ind) const { - size_t i = HashValue2(ind, mask); + // size_t i = HashValue2(ind, mask); + size_t i = CHT_trait::HashValue(ind, mask); while (true) { if (hash[i] == ind) return i; @@ -680,7 +701,8 @@ namespace ngcore { if (UsedElements()*2 > Size()) DoubleSize(); - size_t i = HashValue2 (ind, mask); + // size_t i = HashValue2 (ind, mask); + size_t i = CHT_trait::HashValue (ind, mask); while (true) { diff --git a/libsrc/csg/singularref.cpp b/libsrc/csg/singularref.cpp index e58957d7..dea9c1cc 100644 --- a/libsrc/csg/singularref.cpp +++ b/libsrc/csg/singularref.cpp @@ -53,7 +53,7 @@ void SingularEdge :: FindPointsOnEdge (class Mesh & mesh) for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++) { - INDEX_2 i2 (mesh[si][0], mesh[si][1]); + PointIndices<2> i2 (mesh[si][0], mesh[si][1]); /* bool onedge = 1; @@ -93,8 +93,8 @@ void SingularEdge :: FindPointsOnEdge (class Mesh & mesh) { segms.Append (i2); // PrintMessage (5, "sing segment ", i2.I1(), " - ", i2.I2()); - points.Append (mesh[ PointIndex (i2.I1())]); - points.Append (mesh[ PointIndex (i2.I2())]); + points.Append (mesh[i2.I1()]); + points.Append (mesh[i2.I2()]); mesh[si].singedge_left = factor; mesh[si].singedge_right = factor; } diff --git a/libsrc/general/template.hpp b/libsrc/general/template.hpp index 89103ea4..a006a5c2 100644 --- a/libsrc/general/template.hpp +++ b/libsrc/general/template.hpp @@ -476,17 +476,30 @@ void MergeSort (int size, T * data, T * help); namespace ngcore { + // template <> + // constexpr inline netgen::INDEX_2 InvalidHash () { return netgen::INDEX_2{-1,-1}; } + + template <> - constexpr inline netgen::INDEX_2 InvalidHash () { return netgen::INDEX_2{-1,-1}; } + struct CHT_trait + { + constexpr static inline netgen::INDEX_2 Invalid() { return { -1, -1 } ; } + constexpr static inline size_t HashValue (const netgen::INDEX_2 & hash, size_t mask) + { return HashValue2(IVec<2,netgen::INDEX>(hash[0], hash[1]), mask); } + }; + + } namespace netgen { + /* inline size_t HashValue2 (const netgen::INDEX_2 & ind, size_t mask) { return HashValue2(IVec<2,netgen::INDEX>(ind[0], ind[1]), mask); } - + */ + inline size_t HashValue2 (const netgen::INDEX_3 & ind, size_t mask) { return HashValue2(IVec<3,netgen::INDEX>(ind[0], ind[1], ind[2]), mask); diff --git a/libsrc/geom2d/genmesh2d.cpp b/libsrc/geom2d/genmesh2d.cpp index 1b0f3a3a..747c6b39 100644 --- a/libsrc/geom2d/genmesh2d.cpp +++ b/libsrc/geom2d/genmesh2d.cpp @@ -523,8 +523,8 @@ namespace netgen { // tensor product mesh RegionTimer rt(t_tensor); - NgArray nextpi(bnp); - NgArray si1(bnp), si2(bnp); + Array nextpi(bnp); + Array si1(bnp), si2(bnp); // PointIndex firstpi; nextpi = -1; @@ -553,7 +553,8 @@ namespace netgen PointIndex c1(0), c2, c3, c4; // 4 corner points int nex = 1, ney = 1; - for (PointIndex pi = 1; pi <= si2.Size(); pi++) + // for (PointIndex pi = 1; pi <= si2.Size(); pi++) + for (PointIndex pi : si2.Range()) if (si2[pi] != -1) { c1 = pi; break; } diff --git a/libsrc/meshing/boundarylayer_interpolate.cpp b/libsrc/meshing/boundarylayer_interpolate.cpp index a7940115..00992cd5 100644 --- a/libsrc/meshing/boundarylayer_interpolate.cpp +++ b/libsrc/meshing/boundarylayer_interpolate.cpp @@ -131,7 +131,8 @@ void BoundaryLayerTool ::InterpolateGrowthVectors() { auto& seg = *p_seg; faces.SetSize(0); - if (seg[0] <= p2sel.Size()) + // if (seg[0] <= p2sel.Size()) + if (seg[0] < IndexBASE()+p2sel.Size()) { for (auto sei : p2sel[seg[0]]) if (moved_surfaces.Test(mesh[sei].GetIndex()) && p2sel[seg[1]].Contains(sei)) @@ -154,7 +155,8 @@ void BoundaryLayerTool ::InterpolateGrowthVectors() { for (auto* p_seg : edgenr2seg[edgenr]) for (auto pi : p_seg->PNums()) - if (pi <= np && point_types[pi] == EDGEPOINT) + // if (pi <= np && point_types[pi] == EDGEPOINT) + if (pi < npi && point_types[pi] == EDGEPOINT) point_types[pi] = SURFACEPOINT; continue; } diff --git a/libsrc/meshing/classifyhpel.hpp b/libsrc/meshing/classifyhpel.hpp index d4f86f69..9fab7d7d 100644 --- a/libsrc/meshing/classifyhpel.hpp +++ b/libsrc/meshing/classifyhpel.hpp @@ -1,4 +1,8 @@ -HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +// typename INDEX_2_HASHTABLE HT_EDGEPOINT_DOM; +typedef ClosedHashTable, int> HT_EDGEPOINT_DOM; + + +HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) { @@ -586,7 +590,7 @@ HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE & edges -HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) { @@ -823,8 +827,10 @@ HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE & edg } -// #ifdef SABINE -HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +// #ifdef SABINE + + +HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint, int dim, const FaceDescriptor & fd) @@ -930,10 +936,10 @@ HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE & edge if(edges.Used(i2)) { - if(edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep1-1])) || - edgepoint_dom.Used(INDEX_2(-1,pnums[ep1-1])) || - edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep2-1])) || - edgepoint_dom.Used(INDEX_2(-1,pnums[ep2-1]))) + if(edgepoint_dom.Used( { fd.SurfNr(),pnums[ep1-1] } ) || + edgepoint_dom.Used( { -1,pnums[ep1-1] } ) || + edgepoint_dom.Used( { fd.SurfNr(), pnums[ep2-1]} ) || + edgepoint_dom.Used( { -1,pnums[ep2-1] } )) { edge_sing[k]=2; point_sing[ep1-1] = 2; @@ -948,7 +954,7 @@ HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE & edge for (int k=0;k<3;k++) if (edgepoint.Test(pnums[k]) && - (dim==3 || edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[k])) || edgepoint_dom.Used(INDEX_2(-1,pnums[k])))) + (dim==3 || edgepoint_dom.Used( { fd.SurfNr(),pnums[k] } ) || edgepoint_dom.Used( { -1,pnums[k] } ))) //edgepoint, but not member of sing_edge on trig -> cp { PointIndices<2> i2a = PointIndices<2>::Sort(el.PNum(p[k]), el.PNum(p[(k+1)%3])); @@ -1301,7 +1307,7 @@ HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE & edge return(type); } #endif -HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint, int dim, const FaceDescriptor & fd) { @@ -1321,10 +1327,10 @@ HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE & edge if (dim == 2) { - ep1 = edgepoint_dom.Used (PointIndices<2>(el.GetIndex(), el.PNumMod(j))); - ep2 = edgepoint_dom.Used (PointIndices<2>(el.GetIndex(), el.PNumMod(j+1))); - ep3 = edgepoint_dom.Used (PointIndices<2>(el.GetIndex(), el.PNumMod(j+2))); - ep4 = edgepoint_dom.Used (PointIndices<2>(el.GetIndex(), el.PNumMod(j+3))); + ep1 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j) } ); + ep2 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+1) } ); + ep3 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+2) }); + ep4 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+3) }); } cp1 = cornerpoint.Test (el.PNumMod (j)); @@ -1337,7 +1343,7 @@ HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE & edge ep3 |= cp3; ep4 |= cp4; - int p[4] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2), el.PNumMod(j+4)}; + PointIndex p[4] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2), el.PNumMod(j+4)}; //int epp[4] = { ep1, ep2, ep3, ep4}; int cpp[4] = { cp1, cp2, cp3, cp4}; for(int k=0;k<0;k++) @@ -1650,7 +1656,7 @@ HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE & edge } -HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) { @@ -1755,7 +1761,7 @@ HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE & edges -HPREF_ELEMENT_TYPE ClassifyHex7 (HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifyHex7 (HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) @@ -1795,7 +1801,7 @@ HPREF_ELEMENT_TYPE ClassifyHex7 (HPRefElement & el, INDEX_2_HASHTABLE & edg -HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) @@ -1839,7 +1845,7 @@ HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE & ed } -HPREF_ELEMENT_TYPE ClassifyPyramid(HPRefElement & el, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, +HPREF_ELEMENT_TYPE ClassifyPyramid(HPRefElement & el, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint) diff --git a/libsrc/meshing/hprefinement.cpp b/libsrc/meshing/hprefinement.cpp index d66b1598..3872bd27 100644 --- a/libsrc/meshing/hprefinement.cpp +++ b/libsrc/meshing/hprefinement.cpp @@ -603,7 +603,8 @@ namespace netgen return hps; } - bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoiclt_dom, + template + bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoiclt_dom, NgBitArray & cornerpoint, NgBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint, int & levels, int & act_ref); @@ -1632,7 +1633,8 @@ namespace netgen } } - bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE & edges, INDEX_2_HASHTABLE & edgepoint_dom, + template + bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE & edges, HT_EDGEPOINT_DOM & edgepoint_dom, TBitArray & cornerpoint, TBitArray & edgepoint, INDEX_3_HASHTABLE & faces, INDEX_2_HASHTABLE & face_edges, INDEX_2_HASHTABLE & surf_edges, Array & facepoint, int & levels, int & act_ref) { @@ -1808,16 +1810,16 @@ namespace netgen *testout << " singleft " << endl; *testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl; *testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl; - edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I1()), 1); - edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I2()), 1); + edgepoint_dom.Set ( { mesh.LineSegment(i).domin, i2.I1() }, 1); + edgepoint_dom.Set ( { mesh.LineSegment(i).domin, i2.I2() }, 1); sing = 1; } if (seg.singedge_right * levels >= act_ref) { - INDEX_2 i2 = INDEX_2::Sort(mesh.LineSegment(i)[1], - mesh.LineSegment(i)[0]); + PointIndices<2> i2 = INDEX_2::Sort(mesh.LineSegment(i)[1], + mesh.LineSegment(i)[0]); edges.Set (i2, 1); edgepoint.SetBit(i2.I1()); edgepoint.SetBit(i2.I2()); @@ -1826,8 +1828,8 @@ namespace netgen *testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl; *testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl; - edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I1()), 1); - edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I2()), 1); + edgepoint_dom.Set ( { mesh.LineSegment(i).domout, i2.I1() }, 1); + edgepoint_dom.Set ( { mesh.LineSegment(i).domout, i2.I2() }, 1); sing = 1; } @@ -1891,8 +1893,10 @@ namespace netgen { INDEX_2_HASHTABLE edges(mesh.GetNSeg()+1); TBitArray edgepoint(mesh.GetNP()); - INDEX_2_HASHTABLE edgepoint_dom(mesh.GetNSeg()+1); + // INDEX_2_HASHTABLE edgepoint_dom(mesh.GetNSeg()+1); + HT_EDGEPOINT_DOM edgepoint_dom; + edgepoint.Clear(); TBitArray cornerpoint(mesh.GetNP()); cornerpoint.Clear(); @@ -1918,7 +1922,7 @@ namespace netgen NgArray misses(10000); misses = 0; - (*testout) << "edgepoint_dom = " << endl << edgepoint_dom << endl; + // (*testout) << "edgepoint_dom = " << endl << edgepoint_dom << endl; for( int i = 0; i i2(seg[0], seg[1]); i2.Sort(); bedges.Set (i2, 1); } for (i = 1; i <= GetNSE(); i++) { const Element2d & sel = SurfaceElement(i); - if (!sel.PNum(1)) + if (!sel.PNum(1).IsValid()) continue; for (j = 1; j <= 3; j++) { diff --git a/libsrc/meshing/meshfunc.cpp b/libsrc/meshing/meshfunc.cpp index 20eaa6a0..0341131f 100644 --- a/libsrc/meshing/meshfunc.cpp +++ b/libsrc/meshing/meshfunc.cpp @@ -217,7 +217,7 @@ namespace netgen return; idmap_type map; - std::set> hex_faces; + std::set> hex_faces; for(auto identnr : Range(1,nmax+1)) { if(identifications.GetType(identnr) != Identifications::CLOSESURFACES) @@ -248,7 +248,7 @@ namespace netgen // insert prism/hex auto np = sel.GetNP(); Element el(2*np); - std::set pis; + std::set pis; for(auto i : Range(np)) { el[i] = sel[i]; diff --git a/libsrc/meshing/meshing2.cpp b/libsrc/meshing/meshing2.cpp index c830ff28..69aeffac 100644 --- a/libsrc/meshing/meshing2.cpp +++ b/libsrc/meshing/meshing2.cpp @@ -858,7 +858,8 @@ namespace netgen const Element2d & el = locelements.Get(i); for (int j = 1; j <= el.GetNP(); j++) - if (el.PNum(j) <= oldnp && pindex.Get(el.PNum(j)) == -1) + // if (el.PNum(j) <= oldnp && pindex.Get(el.PNum(j)) == -1) + if (el.PNum(j) < IndexBASE()+oldnp && pindex.Get(el.PNum(j)) == -1) { found = 0; PrintSysError ("meshing2, index missing"); diff --git a/libsrc/meshing/meshtype.cpp b/libsrc/meshing/meshtype.cpp index 5ba984ba..24e9f398 100644 --- a/libsrc/meshing/meshtype.cpp +++ b/libsrc/meshing/meshtype.cpp @@ -237,7 +237,7 @@ namespace netgen { for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++) { - pnum[i] = 0; + pnum[i].Invalidate(); geominfo[i].trignum = 0; } np = 3; @@ -331,8 +331,8 @@ namespace netgen np = 4; typ = QUAD; - pnum[4] = 0; - pnum[5] = 0; + pnum[4].Invalidate(); + pnum[5].Invalidate(); for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++) geominfo[i].trignum = 0; @@ -1038,7 +1038,7 @@ namespace netgen { s << "np = " << el.GetNP(); for (int j = 0; j < el.GetNP(); j++) - s << " " << int(el[j]); + s << " " << el[j]; return s; } diff --git a/libsrc/meshing/meshtype.hpp b/libsrc/meshing/meshtype.hpp index 49a17725..335315ef 100644 --- a/libsrc/meshing/meshtype.hpp +++ b/libsrc/meshing/meshtype.hpp @@ -232,6 +232,7 @@ namespace netgen friend bool operator< (PointIndex a, PointIndex b); friend bool operator> (PointIndex a, PointIndex b); friend bool operator>= (PointIndex a, PointIndex b); + friend bool operator<= (PointIndex a, PointIndex b); friend constexpr bool operator== (PointIndex a, PointIndex b); friend constexpr bool operator!= (PointIndex a, PointIndex b); @@ -268,6 +269,7 @@ namespace netgen inline bool operator< (PointIndex a, PointIndex b) { return a.i-b.i < 0; } inline bool operator> (PointIndex a, PointIndex b) { return a.i-b.i > 0; } inline bool operator>= (PointIndex a, PointIndex b) { return a.i-b.i >= 0; } + inline bool operator<= (PointIndex a, PointIndex b) { return a.i-b.i <= 0; } inline constexpr bool operator== (PointIndex a, PointIndex b) { return a.i == b.i; } inline constexpr bool operator!= (PointIndex a, PointIndex b) { return a.i != b.i; } } @@ -387,32 +389,66 @@ namespace netgen { Sort(); } }; - constexpr inline size_t HashValue2 (const PointIndex & ind, size_t mask) - { return (ind-IndexBASE()) & mask; } + // constexpr inline size_t HashValue2 (const PointIndex & ind, size_t mask) + // { return (ind-IndexBASE()) & mask; } } namespace ngcore { - template constexpr inline T InvalidHash(); + + template <> + struct CHT_trait + { + constexpr static inline netgen::PointIndex Invalid() { return netgen::PointIndex::INVALID; } + constexpr static inline size_t HashValue (const netgen::PointIndex & hash, size_t mask) + { return (hash-IndexBASE()) & mask; } + }; template <> - constexpr inline netgen::PointIndex InvalidHash () - { return netgen::PointIndex::INVALID; } + struct CHT_trait> + { + constexpr static inline netgen::PointIndices<2> Invalid() { return { netgen::PointIndex::INVALID, netgen::PointIndex::INVALID} ; } + constexpr static inline size_t HashValue (const netgen::PointIndices<2> & hash, size_t mask) + { return HashValue2(IVec<2>(hash[0]-IndexBASE(), + hash[1]-IndexBASE()), mask); } + }; + template <> - constexpr inline netgen::PointIndices<2> InvalidHash> () - { return netgen::PointIndices<2>{netgen::PointIndex::INVALID, netgen::PointIndex::INVALID}; } + struct CHT_trait> + { + constexpr static inline netgen::SortedPointIndices<2> Invalid() { return { netgen::PointIndex::INVALID, netgen::PointIndex::INVALID} ; } + constexpr static inline size_t HashValue (const netgen::SortedPointIndices<2> & hash, size_t mask) + // { return HashValue2(IVec<2,netgen::INDEX>(hash[0], hash[1]), mask); } + { return CHT_trait>::HashValue (hash, mask); } + }; + + + + + // template constexpr inline T InvalidHash(); + + + // template <> + // constexpr inline netgen::PointIndex InvalidHash () + // { return netgen::PointIndex::INVALID; } + + // template <> + // constexpr inline netgen::PointIndices<2> InvalidHash> () + // { return netgen::PointIndices<2>{netgen::PointIndex::INVALID, netgen::PointIndex::INVALID}; } template <> constexpr inline netgen::PointIndices<3> InvalidHash> () { return netgen::PointIndices<3>{netgen::PointIndex::INVALID, netgen::PointIndex::INVALID, netgen::PointIndex::INVALID}; } + /* template <> constexpr inline netgen::SortedPointIndices<2> InvalidHash> () - { return InvalidHash>(); } - + // { return InvalidHash>(); } + { return CHT_trait>::Invalid(); } + */ } diff --git a/libsrc/meshing/ruler3.cpp b/libsrc/meshing/ruler3.cpp index b8d08f5b..73e3009e 100644 --- a/libsrc/meshing/ruler3.cpp +++ b/libsrc/meshing/ruler3.cpp @@ -376,7 +376,7 @@ int Meshing3 :: ApplyRules { PointIndex locpi = locface->PNumMod(j+locfr); - if (rule->GetPointNr (nfok, j) <= 3 && + if (rule->GetPointNr (nfok, j) < IndexBASE()+3 && pmap.Get(rule->GetPointNr(nfok, j)) != locpi) (*testout) << "change face1 point, mark1" << endl; @@ -797,9 +797,9 @@ int Meshing3 :: ApplyRules hc = 0; for (int k = rule->GetNOldF() + 1; k <= rule->GetNF(); k++) { - if (rule->GetPointNr(k, 1) <= rule->GetNOldP() && - rule->GetPointNr(k, 2) <= rule->GetNOldP() && - rule->GetPointNr(k, 3) <= rule->GetNOldP()) + if (rule->GetPointNr(k, 1) < IndexBASE()+rule->GetNOldP() && + rule->GetPointNr(k, 2) < IndexBASE()+rule->GetNOldP() && + rule->GetPointNr(k, 3) < IndexBASE()+rule->GetNOldP()) { for (int j = 1; j <= 3; j++) if (lfaces[i-1].PNumMod(j ) == pmap.Get(rule->GetPointNr(k, 1)) && diff --git a/libsrc/meshing/smoothing2.cpp b/libsrc/meshing/smoothing2.cpp index b5d001c8..25de92f5 100644 --- a/libsrc/meshing/smoothing2.cpp +++ b/libsrc/meshing/smoothing2.cpp @@ -584,7 +584,7 @@ namespace netgen // meshthis -> ProjectPoint (surfi, pp1); // meshthis -> GetNormalVector (surfi, pp1, n); - static NgArray> pts2d; + static NgArray> pts2d; // better: use hashtable pts2d.SetSize(mesh.GetNP()); grad = 0; diff --git a/libsrc/meshing/specials.cpp b/libsrc/meshing/specials.cpp index 574c748c..edeb2481 100644 --- a/libsrc/meshing/specials.cpp +++ b/libsrc/meshing/specials.cpp @@ -126,7 +126,8 @@ void CutOffAndCombine (Mesh & mesh, const Mesh & othermesh) for (j = 1; j <= 3; j++) locked.Clear (mesh.OpenElement(i).PNum(j)); - for (PointIndex i (1); i <= locked.Size(); i++) + // for (PointIndex i (1); i <= locked.Size(); i++) + for (PointIndex i : locked.Range()) if (locked.Test(i)) { mesh.AddLockedPoint (i);