mirror of
https://github.com/NGSolve/netgen.git
synced 2025-01-11 21:50:34 +05:00
EdgeIndex and FaceIndex
This commit is contained in:
parent
5642d435e1
commit
0a1fd5a2e2
@ -116,7 +116,7 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<1> (size_t nr) const
|
||||
ret.edges.num = 1;
|
||||
ret.edges.ptr = mesh->GetTopology().GetSegmentElementEdgesPtr (nr);
|
||||
*/
|
||||
ret.edges.Assign ( FlatArray<T_EDGE2> (1, const_cast<T_EDGE2*>( mesh->GetTopology().GetSegmentElementEdgesPtr (nr))));
|
||||
ret.edges.Assign ( FlatArray<T_EDGE2> (1, const_cast<T_EDGE2*>((const int*) mesh->GetTopology().GetSegmentElementEdgesPtr (nr))));
|
||||
|
||||
/*
|
||||
ret.faces.num = 0;
|
||||
@ -172,12 +172,19 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<2> (size_t nr) const
|
||||
ret.edges.num = MeshTopology::GetNEdges (el.GetType());
|
||||
ret.edges.ptr = mesh->GetTopology().GetSurfaceElementEdgesPtr (nr);
|
||||
*/
|
||||
ret.edges.Assign (mesh->GetTopology().GetEdges (SurfaceElementIndex(nr)));
|
||||
|
||||
// ret.edges.Assign (mesh->GetTopology().GetEdges (SurfaceElementIndex(nr)));
|
||||
auto hedges = mesh->GetTopology().GetEdges (SurfaceElementIndex(nr));
|
||||
ret.edges.Assign ( { hedges.Size(), (int*)hedges.Data() } );
|
||||
|
||||
/*
|
||||
ret.faces.num = MeshTopology::GetNFaces (el.GetType());
|
||||
ret.faces.ptr = mesh->GetTopology().GetSurfaceElementFacesPtr (nr);
|
||||
*/
|
||||
ret.faces.Assign ( { 1, const_cast<int*>(mesh->GetTopology().GetSurfaceElementFacesPtr (nr)) });
|
||||
|
||||
// ret.faces.Assign ( { 1, const_cast<int*>(mesh->GetTopology().GetSurfaceElementFacesPtr (nr)) });
|
||||
ret.faces.Assign ( { 1, (int*)(mesh->GetTopology().GetSurfaceElementFacesPtr (nr)) });
|
||||
|
||||
if (mesh->GetDimension() == 3)
|
||||
{
|
||||
ret.facets.num = ret.faces.Size();
|
||||
@ -214,13 +221,18 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<3> (size_t nr) const
|
||||
ret.edges.num = MeshTopology::GetNEdges (el.GetType());
|
||||
ret.edges.ptr = mesh->GetTopology().GetElementEdgesPtr (nr);
|
||||
*/
|
||||
ret.edges.Assign (mesh->GetTopology().GetEdges (ElementIndex(nr)));
|
||||
// ret.edges.Assign (mesh->GetTopology().GetEdges (ElementIndex(nr)));
|
||||
auto hedges = mesh->GetTopology().GetEdges (ElementIndex(nr));
|
||||
ret.edges.Assign ( { hedges.Size(), (int*)hedges.Data() } );
|
||||
|
||||
|
||||
/*
|
||||
ret.faces.num = MeshTopology::GetNFaces (el.GetType());
|
||||
ret.faces.ptr = mesh->GetTopology().GetElementFacesPtr (nr);
|
||||
*/
|
||||
ret.faces.Assign (mesh->GetTopology().GetFaces (ElementIndex(nr)));
|
||||
// ret.faces.Assign (mesh->GetTopology().GetFaces (ElementIndex(nr)));
|
||||
auto hfaces = mesh->GetTopology().GetFaces (ElementIndex(nr));
|
||||
ret.faces.Assign ( { hfaces.Size(), (int*)hfaces.Data() } );
|
||||
|
||||
ret.facets.num = ret.faces.Size();
|
||||
ret.facets.base = 0;
|
||||
|
@ -2148,9 +2148,13 @@ namespace netgen
|
||||
}
|
||||
|
||||
// for (int i = 1; i <= nse; i++)
|
||||
/*
|
||||
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
||||
{
|
||||
const Element2d & el = mesh[sei];
|
||||
*/
|
||||
for (const Element2d & el : mesh.SurfaceElements())
|
||||
{
|
||||
if (el.GetType() == TRIG ||
|
||||
el.GetType() == TRIG6)
|
||||
{
|
||||
@ -2175,9 +2179,13 @@ namespace netgen
|
||||
}
|
||||
if(mesh.GetDimension() == 2)
|
||||
{
|
||||
/*
|
||||
for (SegmentIndex j=0; j<mesh.GetNSeg(); j++)
|
||||
{
|
||||
auto seg = mesh[j];
|
||||
*/
|
||||
for (const Segment & seg : mesh.LineSegments())
|
||||
{
|
||||
for (auto map : idmaps)
|
||||
{
|
||||
if (seg[0].IsValid() && seg[1].IsValid() && (*map)[seg[0]].IsValid() && (*map)[seg[1]].IsValid())
|
||||
@ -2574,11 +2582,14 @@ namespace netgen
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
for (auto ei : mesh.VolumeElements().Range())
|
||||
{
|
||||
const Element & el = mesh[ei];
|
||||
|
||||
*/
|
||||
|
||||
for (const Element & el : mesh.VolumeElements())
|
||||
{
|
||||
//int pos = elements_before[el[0]]->Pos(el);
|
||||
//int elnum = (pos >= 0) ? (*markedelts_num[el[0]])[pos] : -1;
|
||||
|
||||
@ -2622,12 +2633,14 @@ namespace netgen
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
for(SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
|
||||
/*
|
||||
for(SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
|
||||
{
|
||||
const Element2d & el = mesh[sei];
|
||||
*/
|
||||
|
||||
for (const Element2d & el : mesh.SurfaceElements())
|
||||
{
|
||||
/*
|
||||
for(int k=0; k<3; k++)
|
||||
auxind3[k] = el[k];
|
||||
|
@ -210,7 +210,7 @@ private:
|
||||
Mat<3> hdxdxi;
|
||||
Vec<3> hcoefs[10]; // enough for second order tets
|
||||
|
||||
void SetEdges (FlatArray<int> edges)
|
||||
void SetEdges (FlatArray<T_EDGE> edges)
|
||||
{
|
||||
nedges = edges.Size();
|
||||
for (int i = 0; i < edges.Size(); i++)
|
||||
@ -220,7 +220,7 @@ private:
|
||||
auto GetEdges() const
|
||||
{ return FlatArray(nedges, edgenrs); }
|
||||
|
||||
void SetFaces (FlatArray<int> faces)
|
||||
void SetFaces (FlatArray<T_FACE> faces)
|
||||
{
|
||||
nfaces = faces.Size();
|
||||
for (int i = 0; i < faces.Size(); i++)
|
||||
@ -250,7 +250,7 @@ private:
|
||||
NgArrayMem<int,4> edgenrs;
|
||||
int facenr;
|
||||
|
||||
void SetEdges (FlatArray<int> edges)
|
||||
void SetEdges (FlatArray<T_EDGE> edges)
|
||||
{
|
||||
edgenrs.SetSize(edges.Size());
|
||||
for (int i = 0; i < edges.Size(); i++)
|
||||
|
@ -174,7 +174,7 @@ namespace netgen
|
||||
|
||||
public:
|
||||
constexpr Index (t_invalid inv) : i(long(BASE)-1) { ; }
|
||||
// private:
|
||||
// protected:
|
||||
constexpr operator T () const { return i; }
|
||||
explicit constexpr operator T& () { return i; }
|
||||
public:
|
||||
@ -200,16 +200,16 @@ namespace netgen
|
||||
|
||||
|
||||
template <typename T, typename TIndex, int Base>
|
||||
constexpr auto operator+ (Index<T,TIndex,Base> ind, int i) { TIndex res(ind); res += i; return res; }
|
||||
constexpr auto operator+ (Index<T,TIndex,Base> ind, int i) { Index<T,TIndex,Base> res(ind); return res += i; }
|
||||
template <typename T, typename TIndex, int Base>
|
||||
constexpr auto operator+ (Index<T,TIndex,Base> ind, size_t i) { TIndex res(ind); res += i; return res; }
|
||||
constexpr auto operator+ (Index<T,TIndex,Base> ind, size_t i) { Index<T,TIndex,Base> res(ind); return res += i; }
|
||||
template <typename T, typename TIndex, int Base>
|
||||
constexpr TIndex operator+ (int i, Index<T,TIndex,Base> ind) { TIndex res(ind); res += i; return res; }
|
||||
constexpr TIndex operator+ (int i, Index<T,TIndex,Base> ind) { return ind+i; } // Indexx<T,TIndex,Base> res(ind); return res += i;
|
||||
template <typename T, typename TIndex, int Base>
|
||||
inline TIndex operator+ (size_t i, Index<T,TIndex,Base> ind) { TIndex res(ind); res += i; return res; }
|
||||
inline TIndex operator+ (size_t i, Index<T,TIndex,Base> ind) { return ind+i; } // TIndex res(ind); res += i; return res; }
|
||||
|
||||
template <typename T, typename TIndex, int Base>
|
||||
constexpr inline auto operator- (Index<T,TIndex,Base> ind, int i) { TIndex res(ind); res -= i; return res; }
|
||||
constexpr inline auto operator- (Index<T,TIndex,Base> ind, int i) { Index<T,TIndex,Base> res(ind); return res -= i; }
|
||||
// template <typename T, typename TIndex, int Base>
|
||||
// constexpr inline auto operator- (Index<T,TIndex,Base> pa, Index<T,TIndex,Base> pb) { return pa.i-pb.i; }
|
||||
|
||||
@ -228,10 +228,18 @@ namespace netgen
|
||||
inline bool operator!= (Index<T,TIndex,Base> a, Index<T,TIndex,Base> b) { return a.i != b.i; }
|
||||
|
||||
|
||||
template <typename T, typename TIndex, int Base>
|
||||
inline void SetInvalid (Index<T,TIndex,Base> & id) { id.Invalidate(); }
|
||||
template <typename T, typename TIndex, int Base>
|
||||
inline bool IsInvalid (const Index<T,TIndex,Base> & id) { return !id.IsValid(); }
|
||||
|
||||
|
||||
|
||||
class PointIndex : public Index<int,PointIndex,1>
|
||||
{
|
||||
public:
|
||||
using Index::Index;
|
||||
template <int N> friend class PointIndices;
|
||||
};
|
||||
|
||||
}
|
||||
@ -473,17 +481,17 @@ namespace netgen
|
||||
inline bool operator>= (Index<int, SurfaceElementIndex,0> ei1, int s) { return int(ei1) >= int(s); };
|
||||
*/
|
||||
|
||||
inline void SetInvalid (SurfaceElementIndex & id) { id = -1; }
|
||||
inline bool IsInvalid (SurfaceElementIndex & id) { return id == -1; }
|
||||
// inline void SetInvalid (SurfaceElementIndex & id) { id.Invalidate(); }
|
||||
// inline bool IsInvalid (SurfaceElementIndex & id) { return !id.IsValid(); }
|
||||
|
||||
inline istream & operator>> (istream & ist, SurfaceElementIndex & pi)
|
||||
{
|
||||
int i; ist >> i; pi = i; return ist;
|
||||
}
|
||||
|
||||
inline ostream & operator<< (ostream & ost, const SurfaceElementIndex & pi)
|
||||
inline ostream & operator<< (ostream & ost, const SurfaceElementIndex & si)
|
||||
{
|
||||
return (ost << int(pi));
|
||||
return ost << (si-IndexBASE(si));
|
||||
}
|
||||
|
||||
|
||||
@ -501,8 +509,8 @@ namespace netgen
|
||||
inline bool operator< (Index<int, SegmentIndex,0> ei1, int s) { return int(ei1) < int(s); };
|
||||
*/
|
||||
|
||||
inline void SetInvalid (SegmentIndex & id) { id = -1; }
|
||||
inline bool IsInvalid (SegmentIndex & id) { return id == -1; }
|
||||
// inline void SetInvalid (SegmentIndex & id) { id = -1; }
|
||||
// inline bool IsInvalid (SegmentIndex & id) { return id == -1; }
|
||||
|
||||
|
||||
inline istream & operator>> (istream & ist, SegmentIndex & pi)
|
||||
@ -510,10 +518,10 @@ namespace netgen
|
||||
int i; ist >> i; pi = i; return ist;
|
||||
}
|
||||
|
||||
inline ostream & operator<< (ostream & ost, const SegmentIndex & pi)
|
||||
inline ostream & operator<< (ostream & ost, const SegmentIndex & si)
|
||||
{
|
||||
return (ost << int(pi));
|
||||
}
|
||||
return ost << (si - IndexBASE(si));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -16,9 +16,23 @@
|
||||
|
||||
namespace netgen
|
||||
{
|
||||
typedef int T_EDGE;
|
||||
typedef int T_FACE;
|
||||
// typedef int T_EDGE;
|
||||
// typedef int T_FACE;
|
||||
|
||||
class EdgeIndex : public Index<int,EdgeIndex,0>
|
||||
{
|
||||
public:
|
||||
using Index::Index;
|
||||
};
|
||||
|
||||
class FaceIndex : public Index<int,FaceIndex,0>
|
||||
{
|
||||
public:
|
||||
using Index::Index;
|
||||
};
|
||||
|
||||
typedef EdgeIndex T_EDGE;
|
||||
typedef FaceIndex T_FACE;
|
||||
|
||||
class MeshTopology
|
||||
{
|
||||
@ -33,12 +47,12 @@ class MeshTopology
|
||||
Array<std::array<PointIndex,2>> edge2vert;
|
||||
Array<std::array<PointIndex,4>> face2vert;
|
||||
|
||||
Array<std::array<T_EDGE,12>, ElementIndex> edges;
|
||||
Array<std::array<T_FACE,6>, ElementIndex> faces;
|
||||
Array<std::array<T_EDGE,4>, SurfaceElementIndex> surfedges;
|
||||
Array<std::array<EdgeIndex,12>, ElementIndex> edges;
|
||||
Array<std::array<FaceIndex,6>, ElementIndex> faces;
|
||||
Array<std::array<EdgeIndex,4>, SurfaceElementIndex> surfedges;
|
||||
|
||||
Array<T_EDGE> segedges;
|
||||
Array<T_FACE> surffaces;
|
||||
Array<EdgeIndex,SegmentIndex> segedges;
|
||||
Array<FaceIndex,SurfaceElementIndex> surffaces;
|
||||
// Array<INDEX_2, SurfaceElementIndex> surf2volelement;
|
||||
Array<std::array<ElementIndex,2>, SurfaceElementIndex> surf2volelement;
|
||||
Array<SurfaceElementIndex> face2surfel;
|
||||
@ -89,9 +103,9 @@ public:
|
||||
inline static const ELEMENT_FACE * GetFaces0 (ELEMENT_TYPE et);
|
||||
|
||||
[[deprecated("use GetEdge(SegmentIndex) instead")]]
|
||||
T_EDGE GetSegmentEdge (int segnr) const { return segedges[segnr-1]+1; }
|
||||
EdgeIndex GetSegmentEdge (int segnr) const { return segedges[segnr-1]+1; }
|
||||
|
||||
T_EDGE GetEdge (SegmentIndex segnr) const { return segedges[segnr]; }
|
||||
EdgeIndex GetEdge (SegmentIndex segnr) const { return segedges[segnr]; }
|
||||
|
||||
[[deprecated("use GetEdge(SegmentIndex) instead")]]
|
||||
void GetSegmentEdge (int segnr, int & enr, int & orient) const;
|
||||
@ -103,8 +117,8 @@ public:
|
||||
void GetElementFaces (int elnr, NgArray<int> & faces, bool withorientation) const;
|
||||
|
||||
// definition in meshclass.hpp
|
||||
inline FlatArray<T_EDGE> GetEdges (ElementIndex elnr) const;
|
||||
inline FlatArray<T_FACE> GetFaces (ElementIndex elnr) const;
|
||||
inline FlatArray<EdgeIndex> GetEdges (ElementIndex elnr) const;
|
||||
inline FlatArray<FaceIndex> GetFaces (ElementIndex elnr) const;
|
||||
|
||||
|
||||
// [[deprecated("use GetElementEdge instead")]]
|
||||
@ -157,8 +171,8 @@ public:
|
||||
[[deprecated("use GetEdge -> FlatArray instead")]]
|
||||
void GetEdges (SurfaceElementIndex elnr, NgArray<int> & edges) const;
|
||||
|
||||
inline FlatArray<T_EDGE> GetEdges (SurfaceElementIndex elnr) const;
|
||||
// { return FlatArray<T_EDGE>(GetNEdges ( (*mesh)[elnr].GetType()), &surfedges[elnr][0]); }
|
||||
inline FlatArray<EdgeIndex> GetEdges (SurfaceElementIndex elnr) const;
|
||||
// { return FlatArray<EdgeIndex>(GetNEdges ( (*mesh)[elnr].GetType()), &surfedges[elnr][0]); }
|
||||
|
||||
int GetFace (SurfaceElementIndex elnr) const
|
||||
{ return surffaces[elnr]; }
|
||||
@ -167,31 +181,27 @@ public:
|
||||
|
||||
int GetNSurfedges() const {return surfedges.Size();}
|
||||
[[deprecated("use GetEdges(ElementIndex) instead")]]
|
||||
const T_EDGE * GetElementEdgesPtr (int elnr) const { return &edges[IndexBASE<ElementIndex>()+elnr][0]; }
|
||||
const T_EDGE * GetSurfaceElementEdgesPtr (int selnr) const { return &surfedges[selnr][0]; }
|
||||
const T_EDGE * GetSegmentElementEdgesPtr (int selnr) const { return &segedges[selnr]; }
|
||||
const EdgeIndex * GetElementEdgesPtr (int elnr) const { return &edges[IndexBASE<ElementIndex>()+elnr][0]; }
|
||||
const EdgeIndex * GetSurfaceElementEdgesPtr (int selnr) const { return &surfedges[selnr][0]; }
|
||||
const EdgeIndex * GetSegmentElementEdgesPtr (int selnr) const { return &segedges[selnr]; }
|
||||
|
||||
const T_FACE * GetElementFacesPtr (int elnr) const { return &faces[IndexBASE<ElementIndex>()+elnr][0]; }
|
||||
const T_FACE * GetSurfaceElementFacesPtr (int selnr) const { return &surffaces[selnr]; }
|
||||
const FaceIndex * GetElementFacesPtr (int elnr) const { return &faces[IndexBASE<ElementIndex>()+elnr][0]; }
|
||||
const FaceIndex * GetSurfaceElementFacesPtr (int selnr) const { return &surffaces[selnr]; }
|
||||
|
||||
|
||||
void GetSurface2VolumeElement (int selnr, int & elnr1, int & elnr2) const
|
||||
{
|
||||
elnr1 = surf2volelement[selnr-1][0]+1;
|
||||
elnr2 = surf2volelement[selnr-1][1]+1;
|
||||
elnr1 = surf2volelement[SurfaceElementIndex::Base() + selnr-1][0]+1 - ElementIndex::Base();
|
||||
elnr2 = surf2volelement[SurfaceElementIndex::Base() + selnr-1][1]+1 - ElementIndex::Base();
|
||||
}
|
||||
|
||||
std::array<ElementIndex,2> GetSurface2VolumeElement (SurfaceElementIndex sei)
|
||||
{
|
||||
return surf2volelement[sei];
|
||||
/*
|
||||
return { ElementIndex( surf2volelement[sei][0] - 1),
|
||||
ElementIndex( surf2volelement[sei][1] - 1) };
|
||||
*/
|
||||
}
|
||||
|
||||
[[deprecated("use GetSurfaceEleement -> SurfaceElementIndex")]]
|
||||
int GetFace2SurfaceElement1 (int fnr) const { return face2surfel[fnr-1]+1; }
|
||||
int GetFace2SurfaceElement1 (int fnr) const { return face2surfel[fnr-1]+1 - SurfaceElementIndex::Base(); }
|
||||
SurfaceElementIndex GetFace2SurfaceElement (int fnr) const { return face2surfel[fnr]; }
|
||||
|
||||
SegmentIndex GetSegmentOfEdge(int edgenr) const { return edge2segment[edgenr-1]; }
|
||||
|
Loading…
Reference in New Issue
Block a user