def customized_mesh(self): # box = self.box # mesh = MF.boxmesh2d(box, nx=10, ny=20, meshtype='tri') # mesh = HalfEdgeMesh2d.from_mesh(mesh, NV=3) # 三角形网格的单边数据结构 cell = np.array( [[0, 1, 3], [4, 3, 1], [4, 1, 5], [2, 5, 1], [6, 3, 7], [4, 7, 3], [4, 5, 7], [8, 7, 5], [6, 7, 9], [10, 9, 7], [10, 7, 11], [8, 11, 7], [12, 9, 13], [10, 13, 9], [10, 11, 13], [14, 13, 11]], dtype=np.int) node = np.array([[0, -1], [0.5, -1], [1, -1], [0, -0.5], [0.5, -0.5], [1, -0.5], [0, 0], [0.5, 0], [1, 0], [0, 0.5], [0.5, 0.5], [1, 0.5], [0, 1], [0.5, 1], [1, 1]], dtype=np.float) mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh, NV=3) mesh.uniform_refine(2) cm = 1. tt = 0.2 while cm > 0.01 / 2: bc = mesh.cell_barycenter() NC = mesh.number_of_cells() cellstart = mesh.ds.cellstart isMarkedCell = np.zeros(NC + cellstart, dtype=np.bool_) isMarkedCell[cellstart:] = abs(bc[:, 1] - 0.) < tt mesh.refine_triangle_rg(isMarkedCell) cm = np.sqrt(np.min(mesh.entity_measure('cell'))) if tt > 0.025: tt = tt / 2. # |--- 下面做一下网格结构的转换, 因为目前 HalfEdgeMesh2d 对 p>1 时有 bug mesh = TriangleMesh(mesh.node, mesh.entity('cell')) return mesh
bc = mesh.cell_barycenter() NC = mesh.number_of_cells() cellstart = mesh.ds.cellstart isMarkedCell = np.zeros(NC + cellstart, dtype=np.bool_) cellmeasure = mesh.entity_measure('cell') if k == 0: current_cell = find_special_refined_cell(mesh, 1. / 24, 0.03) isMarkedCell[current_cell + 1] = True mesh.refine_triangle_nvb(isMarkedCell) node = np.array(mesh.node) cell = mesh.ds.cell_to_node() mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh, NV=3) else: isMarkedCell[cellstart:] = abs(bc[:, 1] - 0.) <= toRefineDomain[k] mesh.refine_triangle_rg(isMarkedCell) print('mesh.number_of_cells() = ', mesh.number_of_cells()) # bc1 = mesh.cell_barycenter() # NC1 = mesh.number_of_cells() # cc, = np.nonzero(abs(bc[:, 1] - 0.) < 0.015) node = mesh.node cell = mesh.ds.cell_to_node() np.save('./WaveMeshNode_mat5', node) np.save('./WaveMeshCell_mat5', cell) # fig = plt.figure() # axes = fig.gca() # mesh.add_plot(axes) # # mesh.find_cell(axes, showindex=True)