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
# 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()
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',