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
def customized_mesh(self): # node = np.load('WaveMeshNode1.npy') # cell = np.load('WaveMeshCell1.npy') print('\n') print( '# --------------------- in CapillaryWaveData code --------------------- #' ) nodename = 'WaveMeshNode1.npy' cellname = 'WaveMeshCell1.npy' # nodename = 'WaveMeshNode_mat2.npy' # cellname = 'WaveMeshCell_mat2.npy' node = np.load('./CapillaryWaveMesh/' + nodename) # WaveMeshNode_mat1 是新构造的网格 cell = np.load('./CapillaryWaveMesh/' + cellname) mesh = TriangleMesh(node, cell) print('Mesh-cell-name = %s, || Number-of-mesh-cells = %d' % (cellname, mesh.number_of_cells())) print( '# --------------------------------------------------------------------- #' ) return mesh
# [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)
val = np.zeros(m.shape, dtype=np.float) val[..., 0] = 3 * np.exp(x**2 + y**2) val[..., 1] = 3 * np.exp(x**2 + y**2) return val node = np.array([(0, 0), (1, 0), (1, 1), (0, 1)], dtype=np.float) cell = np.array([(1, 2, 0), (3, 0, 2)], dtype=np.int) p = 0 mesh = TriangleMesh(node, cell) mesh.uniform_refine() node = mesh.entity('node') cell = mesh.entity('cell') NC = mesh.number_of_cells() bc = mesh.entity_barycenter('cell') if p == 0: integrator = mesh.integrator(1) else: integrator = mesh.integrator(p + 2) cellmeasure = mesh.entity_measure('cell') V = VectorLagrangeFiniteElementSpace(mesh, p, spacetype='D') b = V.source_vector(f2, integrator, cellmeasure) c = V.scalarspace.source_vector(f1, integrator, cellmeasure) print(b) print(c) print(V.number_of_global_dofs())