|
| 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