Skip to content

Commit d1f524c

Browse files
committed
elements bitarray, draw tet10 as tet4
1 parent c0a6f3b commit d1f524c

1 file changed

Lines changed: 16 additions & 5 deletions

File tree

ngsolve_webgpu/mesh.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)