From 4f0b15ef5553096bd768a9d70598d21d7d1cef80 Mon Sep 17 00:00:00 2001 From: Joachim Schoeberl Date: Wed, 21 Feb 2024 08:41:17 +0100 Subject: [PATCH] use FlatArray for edges and faces in mesh interface V2 --- libsrc/include/nginterface_v2.hpp | 8 +++- libsrc/include/nginterface_v2_impl.hpp | 51 ++++++++++++++++++-------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/libsrc/include/nginterface_v2.hpp b/libsrc/include/nginterface_v2.hpp index 1b624b9d..788f7395 100644 --- a/libsrc/include/nginterface_v2.hpp +++ b/libsrc/include/nginterface_v2.hpp @@ -111,6 +111,7 @@ namespace netgen int operator[] (size_t i) const { return ptr[i]-POINTINDEX_BASE; } }; + /* class Ng_Edges { public: @@ -130,6 +131,7 @@ namespace netgen size_t Size() const { return num; } int operator[] (size_t i) const { return ptr[i]; } }; + */ class Ng_Facets { @@ -151,8 +153,10 @@ namespace netgen int GetIndex() const { return index-1; } Ng_Points points; // all points Ng_Vertices vertices; - Ng_Edges edges; - Ng_Faces faces; + // Ng_Edges edges; + FlatArray edges; + // Ng_Faces faces; + FlatArray faces; Ng_Facets facets; bool is_curved; }; diff --git a/libsrc/include/nginterface_v2_impl.hpp b/libsrc/include/nginterface_v2_impl.hpp index 69278f22..a6f56df8 100644 --- a/libsrc/include/nginterface_v2_impl.hpp +++ b/libsrc/include/nginterface_v2_impl.hpp @@ -56,15 +56,20 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<0> (size_t nr) const ret.vertices.num = 1; ret.vertices.ptr = (int*)&el.pnum; - + + /* ret.edges.num = 0; ret.edges.ptr = NULL; - + */ + ret.edges.Assign ( FlatArray (0, nullptr) ); + /* ret.faces.num = 0; ret.faces.ptr = NULL; - + */ + ret.faces.Assign ( { 0, nullptr } ); + ret.facets.num = 1; - ret.facets.base = 1; + ret.facets.base = POINTINDEX_BASE; ret.facets.ptr = (int*)&el.pnum; if (mesh->GetDimension() == 1) @@ -107,12 +112,18 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<1> (size_t nr) const ret.vertices.num = 2; ret.vertices.ptr = (int*)&(el[0]); + /* ret.edges.num = 1; ret.edges.ptr = mesh->GetTopology().GetSegmentElementEdgesPtr (nr); + */ + ret.edges.Assign ( FlatArray (1, const_cast( mesh->GetTopology().GetSegmentElementEdgesPtr (nr)))); + /* ret.faces.num = 0; ret.faces.ptr = NULL; - + */ + ret.faces.Assign ( { 0, nullptr }); + if (mesh->GetDimension() == 3) { ret.facets.num = 0; @@ -123,7 +134,7 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<1> (size_t nr) const { ret.facets.num = 1; ret.facets.base = 0; - ret.facets.ptr = ret.edges.ptr; + ret.facets.ptr = ret.edges.Data(); } else { @@ -157,23 +168,27 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<2> (size_t nr) const ret.vertices.num = el.GetNV(); ret.vertices.ptr = (int*)&(el[0]); + /* ret.edges.num = MeshTopology::GetNEdges (el.GetType()); ret.edges.ptr = mesh->GetTopology().GetSurfaceElementEdgesPtr (nr); - + */ + ret.edges.Assign (mesh->GetTopology().GetEdges (SurfaceElementIndex(nr))); + /* ret.faces.num = MeshTopology::GetNFaces (el.GetType()); ret.faces.ptr = mesh->GetTopology().GetSurfaceElementFacesPtr (nr); - + */ + ret.faces.Assign ( { 1, const_cast(mesh->GetTopology().GetSurfaceElementFacesPtr (nr)) }); if (mesh->GetDimension() == 3) { - ret.facets.num = ret.faces.num; + ret.facets.num = ret.faces.Size(); ret.facets.base = 0; - ret.facets.ptr = ret.faces.ptr; + ret.facets.ptr = ret.faces.Data(); } else { - ret.facets.num = ret.edges.num; + ret.facets.num = ret.edges.Size(); ret.facets.base = 0; - ret.facets.ptr = ret.edges.ptr; + ret.facets.ptr = ret.edges.Data(); } ret.is_curved = el.IsCurved(); return ret; @@ -194,15 +209,21 @@ NGX_INLINE DLL_HEADER Ng_Element Ngx_Mesh :: GetElement<3> (size_t nr) const ret.vertices.num = el.GetNV(); ret.vertices.ptr = (int*)&(el[0]); + /* ret.edges.num = MeshTopology::GetNEdges (el.GetType()); ret.edges.ptr = mesh->GetTopology().GetElementEdgesPtr (nr); + */ + ret.edges.Assign (mesh->GetTopology().GetEdges (ElementIndex(nr))); + /* ret.faces.num = MeshTopology::GetNFaces (el.GetType()); ret.faces.ptr = mesh->GetTopology().GetElementFacesPtr (nr); - - ret.facets.num = ret.faces.num; + */ + ret.faces.Assign (mesh->GetTopology().GetFaces (ElementIndex(nr))); + + ret.facets.num = ret.faces.Size(); ret.facets.base = 0; - ret.facets.ptr = ret.faces.ptr; + ret.facets.ptr = ret.faces.Data(); ret.is_curved = el.IsCurved(); return ret;