@@ -85,6 +85,8 @@ def from_dim_np(dim: int, np: int):
8585 return ElType .PRISM
8686 if np == 5 :
8787 return ElType .PYRAMID
88+ if np == 10 :
89+ return ElType .TET
8890 raise ValueError (f"Unsupported element type dim={ dim } np={ np } " )
8991
9092
@@ -100,16 +102,20 @@ class MeshData:
100102 subdivision : int
101103
102104 mesh : netgen .meshing .Mesh
105+ el2d_bitarray = None
106+ el3d_bitarray = None
103107 curvature_data = None
104108 deformation_data = None
105109 _ngs_mesh = None
106110 _last_mesh_timestamp : int = - 1
107111 _timestamp : float = - 1
108112 _needs_update : bool = True
109113
110- def __init__ (self , mesh ):
114+ def __init__ (self , mesh , el2d_bitarray = None , el3d_bitarray = None ):
111115 self .on_region = False
112116 self .need_3d = False
117+ self .el2d_bitarray = el2d_bitarray
118+ self .el3d_bitarray = el3d_bitarray
113119 if isinstance (mesh , netgen .meshing .Mesh ):
114120 self .mesh = mesh
115121 else :
@@ -196,6 +202,8 @@ def _create_data(self):
196202
197203 # Trigs TODO: Quads
198204 trigs = mesh .Elements2D ().NumPy ()
205+ if self .el2d_bitarray is not None :
206+ trigs = trigs [np .array (self .el2d_bitarray , dtype = bool )]
199207 if self .on_region :
200208 region = self .ngs_mesh
201209 import ngsolve as ngs
@@ -213,15 +221,18 @@ def _create_data(self):
213221 # 3d Elements
214222 if self .need_3d :
215223 els = mesh .Elements3D ().NumPy ()
216- for num_pts in (4 , 5 , 6 , 8 ):
224+ if self .el3d_bitarray is not None :
225+ els = els [np .array (self .el3d_bitarray , dtype = bool )]
226+ for num_pts in (4 , 5 , 6 , 8 , 10 ):
217227 eltype = ElType .from_dim_np (3 , num_pts )
218228 filtered = els [els ["np" ] == num_pts ]
219229 nels = len (filtered )
220230 if nels == 0 :
221231 continue
222- u32array = np .empty ((nels , num_pts + 2 ), dtype = np .uint32 )
223- u32array [:, :num_pts ] = filtered ["nodes" ][:, :num_pts ] - 1
224- u32array [:, num_pts ] = filtered ["index" ] - 1
232+ lo_num_pts = 4 if num_pts == 10 else num_pts
233+ u32array = np .empty ((nels , lo_num_pts + 2 ), dtype = np .uint32 )
234+ u32array [:, :lo_num_pts ] = filtered ["nodes" ][:, :lo_num_pts ] - 1
235+ u32array [:, lo_num_pts ] = filtered ["index" ] - 1
225236 self .elements [eltype ] = u32array
226237 self .num_elements [eltype ] = len (filtered )
227238
0 commit comments