Skip to content

Commit 4d3117f

Browse files
committed
add 3D example of cutting of vtk meshes
1 parent 5ee36f5 commit 4d3117f

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

python/demo/cut_mesh_2D/cut_mesh_2D.py python/demo/cut_vtk_mesh/cut_mesh_2D.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def create_rectangle_mesh(x0,y0,x1,y1,Nx,Ny):
2626
def mark_cells(mesh):
2727
cells = mesh.cells
2828
points = mesh.points
29-
ls_values = np.zeros(3)
29+
ls_values = np.zeros(len(points))
3030
inside_cells = np.empty(0, dtype=int)
3131
intersected_cells = np.empty(0, dtype=int)
3232

@@ -53,7 +53,7 @@ def mark_cells(mesh):
5353
def create_cut_mesh(mesh,inner_mesh, intersected_cells):
5454
cell_type = cutcells.CellType.triangle
5555
triangulate = True
56-
gdim = 3
56+
gdim = 3 #vtk assumes 3 dimensions and for 2d sets third dimension to 0
5757

5858
for cell_id in intersected_cells:
5959
c = mesh.get_cell(cell_id)
+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import cutcells
2+
import numpy as np
3+
import pyvista as pv
4+
5+
def level_set(x):
6+
r = 0.6
7+
c = np.array([0,0,0])
8+
value = 0
9+
for i in range(0,3):
10+
value = value + (x[i]-c[i])**2
11+
value = np.sqrt(value)-r
12+
return value
13+
14+
def create_box_mesh(x0,y0,z0,x1,y1,z1,Nx,Ny,Nz):
15+
x = np.linspace(x0, x1, num=Nx)
16+
y = np.linspace(y0,y1, num=Ny)
17+
z = np.linspace(z0,z1, num=Nz)
18+
#produce grid of points by tensor product
19+
xx, yy, zz = np.meshgrid(x, y, z)
20+
points = np.c_[xx.reshape(-1), yy.reshape(-1), zz.reshape(-1)]
21+
poly_points = pv.PolyData(points)
22+
poly_mesh = poly_points.delaunay_3d()
23+
grid = pv.UnstructuredGrid(poly_mesh)
24+
25+
return grid
26+
27+
def mark_cells(mesh):
28+
cells = mesh.cells
29+
points = mesh.points
30+
ls_values = np.zeros(len(points))
31+
inside_cells = np.empty(0, dtype=int)
32+
intersected_cells = np.empty(0, dtype=int)
33+
34+
id = 0
35+
36+
for i in range(mesh.n_cells):
37+
num_points = cells[id]
38+
id = id + 1
39+
40+
for j in range(num_points):
41+
point = points[cells[id]]
42+
ls_values[j] = level_set(point)
43+
id = id + 1
44+
45+
domain_str = cutcells.classify_cell_domain(ls_values)
46+
if domain_str=="inside":
47+
inside_cells=np.append(inside_cells,i)
48+
49+
if domain_str=="intersected":
50+
intersected_cells=np.append(intersected_cells,i)
51+
52+
return inside_cells, intersected_cells
53+
54+
def create_cut_mesh(mesh,inner_mesh, intersected_cells):
55+
cell_type = cutcells.CellType.tetrahedron
56+
triangulate = True
57+
gdim = 3
58+
59+
for cell_id in intersected_cells:
60+
c = mesh.get_cell(cell_id)
61+
vertex_coordinates = c.points.flatten()
62+
points = c.points
63+
j = 0
64+
ls_values = np.zeros(len(points))
65+
for point in points:
66+
ls_values[j] = level_set(point)
67+
j = j+1
68+
cut_cell_int = cutcells.cut(cell_type, vertex_coordinates, gdim, ls_values, "phi<0", triangulate)
69+
grid_cell = pv.UnstructuredGrid(cut_cell_int.connectivity, cut_cell_int.types, cut_cell_int.vertex_coords)
70+
inner_mesh = inner_mesh.merge(grid_cell)
71+
72+
return inner_mesh
73+
74+
75+
N = 10
76+
grid = create_box_mesh(-1,-1,-1, 1,1,1, N,N,N)
77+
78+
inside_cells, intersected_cells = mark_cells(grid)
79+
80+
extract = grid.extract_cells(inside_cells)
81+
82+
mesh = create_cut_mesh(grid,extract,intersected_cells)
83+
84+
mesh.plot(cpos="xy", show_edges=True)
85+
86+

0 commit comments

Comments
 (0)