示例#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
# 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)

    print('mesh.number_of_cells() = ', mesh.number_of_cells())
    # bc1 = mesh.cell_barycenter()
    # NC1 = mesh.number_of_cells()
示例#3
0
pde = CosCosData()
maxit = 5
h = 0.2
box = [0, 1, 0, 1]
pfix = np.array([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]],
                dtype=np.float)
fd = lambda p: drectangle(p, box)

pmesh = distmesh2d(fd, h, box, pfix, meshtype='polygon')
area = pmesh.entity_measure('cell')

node = pmesh.entity('node')
t = Delaunay(node)
tmesh = TriangleMesh(node, t.simplices.copy())

area = tmesh.entity_measure('cell')
tmesh.delete_cell(area < 1e-8)
area = tmesh.entity_measure('cell')
print(len(tmesh.node))
pmesh = PolygonMesh.from_mesh(tmesh)
print(pmesh.ds.cell)
fig = plt.figure()
axes = fig.gca()
pmesh.add_plot(axes)
#mesh.find_node(axes, showindex=True)
plt.show()

Ndof = np.zeros((maxit, ), dtype=np.int)
errorType = [
    '$|| u - \Pi^\\nabla u_h||_0$ with p=1',
    '$||\\nabla u - \\nabla \Pi^\\nabla u_h||_0$ with p=1',