示例#1
0
    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
示例#2
0
#                  [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)
# # fig = plt.figure()
# # axes = fig.gca()
# # mesh.add_plot(axes)
# # # mesh.find_cell(axes, showindex=True)
# # plt.show()
# # plt.close()

toRefineDomain = [0.03, 0.03]
Nrefine = len(toRefineDomain)
for k in range(Nrefine):
    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)