def coarsen_poly(self, plot=True): node = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [2, 0], [2, 1]], dtype=np.float) cell = np.array([[0, 1, 2], [0, 2, 3], [1, 4, 5], [2, 1, 5]], dtype=np.int) mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh) mesh.init_level_info() isMarkedCell = np.array([0, 0, 0, 1, 0], dtype=np.bool_) mesh.refine_poly(isMarkedCell) NC = mesh.number_of_all_cells() isMarkedCell = np.zeros(NC, dtype=np.bool_) isMarkedCell[[1, 2, 3, 4, 5, 6]] = True mesh.coarsen_poly(isMarkedCell) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) mesh.add_halfedge_plot(axes, showindex=True) plt.show()
def coarsen_tri(self, maxit=2, method='rg', plot=True, rb=True): cell = np.array([[0, 1, 2], [0, 2, 3], [1, 4, 5], [2, 1, 5]], dtype=np.int) node = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [2, 0], [2, 1]], dtype=np.float) if True: mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh) mesh.init_level_info() isMarkedCell = np.array([0, 1, 0, 0, 1], dtype=np.bool_) NE = mesh.ds.NE color = np.zeros(NE * 2, dtype=np.int_) mesh.hedgecolor = color mesh.refine_triangle_rg(isMarkedCell) NE = mesh.ds.NE color = np.zeros(NE * 2, dtype=np.int_) if 0: fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.add_halfedge_plot(axes, showindex=True) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) plt.show() if method == 'rg': if 1: NC = mesh.number_of_all_cells() isMarkedCell = np.zeros(NC, dtype=np.bool_) isMarkedCell[[1, 2, 5, 6, 7, 9]] = True print('*************lll*********') mesh.coarsen_triangle_rg(isMarkedCell) if 1: NC = mesh.number_of_all_cells() isMarkedCell = np.zeros(NC, dtype=np.bool_) isMarkedCell[[0, 1, 2, 3, 4, 5, 6, 7]] = True print('*************lll*********') mesh.coarsen_triangle_rg(isMarkedCell) NC = mesh.number_of_all_cells() isMarkedCell = np.ones(NC, dtype=np.bool_) print('*************lll*********') mesh.refine_triangle_rg(isMarkedCell) else: color[[2, 3, 10, 11]] = 1 mesh.hedgecolor = color isMarkedCell = np.array([0, 1, 1, 0, 0], dtype=np.bool_) #isMarkedCell = np.array([0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ,0], # dtype=np.bool_) mesh.refine_triangle_nvb(isMarkedCell) mesh.print() if plot: fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.add_halfedge_plot(axes, showindex=True) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) plt.show()
def uniform_refine_test(self): node = np.array([[0,0],[1,0],[1,1],[0,1],[2,0],[2,1]], dtype = np.float) cell = np.array([[0,1,2],[0,2,3],[1,4,5],[2,1,5]],dtype = np.int) mesh = TriangleMesh(node, cell) N,C = mesh.uniform_refine(n=2,returnim = True) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_cell(axes) plt.show() print(N) print(C.toarray())
def lineTest(self): node = np.array([[0,0],[1,0],[1,1],[0,1],[2,0],[2,1]], dtype = np.float) cell = np.array([[0,1,2],[0,2,3],[1,4,5],[2,1,5]],dtype = np.int) mesh = TriangleMesh(node, cell) mesh.uniform_refine(n=5) point = np.array([[0.2, 0.5], [0.5, 0.8], [1.6, 0.5], [1.2, 0.2]]) segment = np.array([[0, 2], [1, 3]]) fig = plt.figure() axes = fig.gca() for i in range(len(segment)): a = segment[i, 0] b = segment[i, 1] axes.plot(point[[a, b], 0], point[[a, b], 1], 'r') mesh.add_plot(axes) #mesh.find_cell(axes) plt.show()
def coarsen_poly(self, plot=True): node = np.array([[0,0],[1,0],[1,1],[0,1],[2,0],[2,1]], dtype = np.float) cell = np.array([[0,1,2],[0,2,3],[1,4,5],[2,1,5]],dtype = np.int) mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh) isMarkedCell = np.array([0,0,0,1,0], dtype=np.bool_) mesh.refine_poly(isMarkedCell) isMarkedCell = np.array([0,0,0,0,1,1,1], dtype=np.bool_) mesh.coarsen_poly(isMarkedCell) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) plt.show()
edge = totalEdge[i0] # 最终的边数组 print('edge:\n', edge) E = 3 # 每个三角形有 3 条边 NE = edge.shape[0] # 获得网格中边的个数, 即 `edge` 的行数 i1 = np.zeros(NE, dtype=np.int32) # 分配空间 i1[j] = range(3 * NC) # totalEdge0 的行数是 3*NC, j 的长度也是 3*NC print('i0:\n', i0) print('i1:\n', i1) edge2cell = np.zeros((NE, 4), dtype=np.int32) edge2cell[:, 0] = i0 // E # 得到每条边的左边单元 edge2cell[:, 1] = i1 // E # 得到每条边的右边单元 edge2cell[:, 2] = i0 % E # 得到每条边的在左边单元中的局部编号 edge2cell[:, 3] = i1 % E # 得到每条边在其右边单元中的局部编号 print('edge2cell:\n', edge2cell) mesh = TriangleMesh(node, cell) mesh.print() fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) mesh.find_edge(axes, showindex=True) plt.savefig('numpy-mesh-edge.png') plt.show()
node = mesh.entity('node') cell = mesh.entity('cell') print('cell', cell.shape) bc = mesh.entity_barycenter('cell') integrator = mesh.integrator(p + 2) cellmeasure = mesh.entity_measure('cell') space = LagrangeFiniteElementSpace(mesh, p, spacetype='C') integralalg = FEMeshIntegralAlg(integrator, mesh) uI = space.interpolation(lambda x: pde.solution(x, t)) #uI = pde.solution(node,p=node, t=t) gu = pde.gradient #uI = space.function() guI = uI.grad_value eta = integralalg.L2_error(gu, guI, celltype=True) # size = (cell.shape[0], 2) eta = np.sum(eta, axis=-1) print('eta', eta.shape) tmesh = TriangleMesh(node, cell) mark = mark(eta, 0.75) options = tmesh.adaptive_options(method='mean', maxrefine=10, maxcoarsen=0, theta=0.5) adaptmesh = tmesh.adaptive(eta, options) #node = adaptmesh.node fig = plt.figure() axes = fig.gca() tmesh.add_plot(axes) plt.show()
def refine_triangle_rbTest(self, l, plot=True, rb=True): cell = np.array([[0, 1, 2], [0, 2, 3], [1, 4, 5], [2, 1, 5]], dtype=np.int) node = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [2, 0], [2, 1]], dtype=np.float) mesh = TriangleMesh(node, cell) #mesh.uniform_refine() mesh = HalfEdgeMesh.from_mesh(mesh) mesh.ds.cell2hedge = np.array([0, 3, 2, 11, 10]) c = np.array([0.2, 0.2]) r = 1.2 h = 1e-2 k = 0 NB = 0 start = time.time() while k < l: halfedge = mesh.ds.halfedge halfedge1 = halfedge[:, 3] node = mesh.node flag = node - c flag = flag[:, 0]**2 + flag[:, 1]**2 flag = flag <= r**2 flag1 = flag[halfedge[:, 0]].astype(int) flag2 = flag[halfedge[halfedge1, 0]].astype(int) markedge = flag1 + flag2 == 1 markedcell = halfedge[markedge, 1] markedcell = np.unique(markedcell) cell = np.unique(halfedge[:, 1]) nc = cell.shape[0] markedcell1 = np.zeros(nc) markedcell1[markedcell] = 1 if rb: mesh.refine_triangle_rb(markedcell1) else: mesh.refine_triangle_rbg(markedcell1) k += 1 print('循环', k, '次***************************') #print('node', node) #print('cell',cell) end = time.time() print(end - start) if plot: fig = plt.figure() axes = fig.gca() nindex = mesh.nodedata['level'] mesh.add_plot(axes) #mesh.add_halfedge_plot(axes, showindex=True) #mesh.find_node(axes, showindex=True, multiindex=nindex) plt.show() if 0: fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) cindex = np.arange(mesh.number_of_cells() - 1) + 1 fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True, multiindex=cindex) NN = mesh.number_of_nodes() nindex = np.zeros(NN, dtype=np.int) halfedge = mesh.ds.halfedge nindex = mesh.nodedata['level'] cindex = mesh.get_data('cell', 'level') fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, showindex=True, multiindex=nindex) mesh.find_cell(axes, showindex=True, multiindex=cindex) plt.show()
def refine_tri(self, maxit=2, method='rg', plot=True, rb=True): cell = np.array([[0, 1, 2], [0, 2, 3], [1, 4, 5], [2, 1, 5]], dtype=np.int) node = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [2, 0], [2, 1]], dtype=np.float) if False: mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh.from_mesh(mesh) mesh.ds.cell2hedge = np.array([0, 3, 2, 11, 10]) isMarkedCell = np.array([0, 1, 0, 0, 1], dtype=np.bool_) #mesh.refine_triangle_rbg(isMarkedCell) mesh.ds.NV = 3 cell = mesh.ds.cell_to_node() node = mesh.entity('node') mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh) mesh.init_level_info() if False: fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.add_halfedge_plot(axes, showindex=True) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) plt.show() NE = mesh.ds.NE color = np.zeros(NE * 2, dtype=np.int_) if method == 'rg': color[[4, 13, 17, 28]] = 1 color[[23, 27]] = 2 color[[22, 26]] = 3 mesh.hedgecolor = color isMarkedCell = np.array( [0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], dtype=np.bool_) mesh.refine_triangle_rg(isMarkedCell) else: color[[2, 3, 10, 11]] = 1 mesh.hedgecolor = color isMarkedCell = np.array([0, 1, 1, 0, 0], dtype=np.bool_) #isMarkedCell = np.array([0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ,0], # dtype=np.bool_) mesh.refine_triangle_nvb(isMarkedCell) mesh.print() if plot: fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.add_halfedge_plot(axes, showindex=True) mesh.find_node(axes, showindex=True) mesh.find_cell(axes, showindex=True) plt.show() if True: mesh = TriangleMesh(node, cell) mesh = HalfEdgeMesh2d.from_mesh(mesh) mesh.init_level_info() NE = mesh.ds.NE color = np.zeros(NE * 2, dtype=np.int_) if method == 'nvb': color[[2, 3, 10, 11]] = 1 mesh.hedgecolor = color c = np.array([0.8, 0.8]) r = 0.9 h = 1e-2 k = 0 NB = 0 start = time.time() while k < maxit: halfedge = mesh.ds.halfedge halfedge1 = halfedge[:, 3] node = mesh.node flag = node - c flag = flag[:, 0]**2 + flag[:, 1]**2 flag = flag <= r**2 flag1 = flag[halfedge[:, 0]].astype(int) flag2 = flag[halfedge[halfedge1, 0]].astype(int) markedge = flag1 + flag2 == 1 markedcell = halfedge[markedge, 1] markedcell = np.unique(markedcell) cell = np.unique(halfedge[:, 1]) nc = cell.shape[0] markedcell1 = np.zeros(nc) markedcell1[markedcell] = 1 if method == 'rg': mesh.refine_triangle_rg(markedcell1.astype(np.bool_)) else: mesh.refine_triangle_nvb(markedcell1.astype(np.bool_)) k += 1 print('循环', k, '次***************************') end = time.time() print('用时', end - start) if plot: fig = plt.figure() axes = fig.gca() nindex = mesh.nodedata['level'] mesh.add_plot(axes) #mesh.add_halfedge_plot(axes, showindex=True) #mesh.find_node(axes, showindex=True, multiindex=nindex) #mesh.find_cell(axes, showindex=True) #print(np.c_[np.arange(len(mesh.hedgecolor)), mesh.hedgecolor]) plt.show()
def test_interpolation_plane(self): def u(p): x = p[..., 0] y = p[..., 1] return x * y 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) mesh = TriangleMesh(node, cell) node = mesh.entity('node') cell = mesh.entity('cell') tritree = Tritree(node, cell) mesh = tritree.to_conformmesh() space = LagrangeFiniteElementSpace(mesh, p=2) uI = space.interpolation(u) error0 = space.integralalg.L2_error(u, uI) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, node=space.interpolation_points(), showindex=True) data = tritree.interpolation(uI) options = tritree.adaptive_options(method='numrefine', data={"q": data}, maxrefine=1, p=2) if 1: #eta = space.integralalg.integral(lambda x : uI.grad_value(x)**2, celltype=True, barycenter=True) #eta = eta.sum(axis=-1) eta = np.array([1, 0], dtype=np.int) tritree.adaptive(eta, options) else: tritree.uniform_refine(options=options) fig = plt.figure() axes = fig.gca() tritree.add_plot(axes) tritree.find_node(axes, showindex=True) mesh = tritree.to_conformmesh(options) space = LagrangeFiniteElementSpace(mesh, p=2) data = options['data']['q'] uh = space.to_function(data) error1 = space.integralalg.L2_error(u, uh) data = tritree.interpolation(uh) isLeafCell = tritree.is_leaf_cell() fig = plt.figure() axes = fig.gca() tritree.add_plot(axes) tritree.find_node(axes, node=space.interpolation_points(), showindex=True) tritree.find_cell(axes, index=isLeafCell, showindex=True) options = tritree.adaptive_options(method='numrefine', data={"q": data}, maxrefine=1, maxcoarsen=1, p=2) if 1: #eta = space.integralalg.integral(lambda x : uI.grad_value(x)**2, celltype=True, barycenter=True) #eta = eta.sum(axis=-1) eta = np.array([-1, -1, -1, -1, 0, 1], dtype=np.int) tritree.adaptive(eta, options) else: tritree.uniform_refine(options=options) mesh = tritree.to_conformmesh(options) space = LagrangeFiniteElementSpace(mesh, p=2) data = options['data']['q'] uh = space.to_function(data) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, node=space.interpolation_points(), showindex=True) mesh.find_cell(axes, showindex=True) error2 = space.integralalg.L2_error(u, uh) print(error0) print(error1) print(error2) plt.show()
cell = np.array([ (0, 1, 2), (0, 2, 3), (0, 3, 4), (0, 4, 5), (0, 5, 6), (0, 6, 1) ], dtype=np.int32) surface = Sphere(c, r) circle = Circle(radius=rc) mesh = TriangleMesh(node, cell) for i in range(8): mesh.uniform_refine() isBdNode = mesh.ds.boundary_node_flag() r0 = np.sqrt(np.sum(mesh.node[isBdNode, 0:2]**2, axis=1)) mesh.node[isBdNode, 0:2] *=rc/r0.reshape(-1, 1) mesh.node, _ = surface.project(mesh.node) mesh0 = TriangleMesh(mesh.node.copy(), mesh.ds.cell.copy()) mesh0.node *=(r+0.03)/r mesh1 = TriangleMesh(mesh.node.copy(), mesh.ds.cell.copy()) mesh1.node *=(r-0.03)/r fig = plt.figure() axes = fig.add_subplot(111, projection='3d') #mesh.add_plot(axes) mesh0.add_plot(axes) mesh1.add_plot(axes) plt.show()
dtype=np.float) cell = np.array([[0, 1, 2, 6], [0, 5, 1, 6], [0, 4, 5, 6], [0, 7, 4, 6], [0, 3, 7, 6], [0, 2, 3, 6]], dtype=np.int) mesh = TetrahedronMesh(point, cell) mesh.uniform_refine(3) face = mesh.entity('face') isBdFace = mesh.ds.boundary_face_flag() cell = face[isBdFace] node = mesh.entity('node') NN = mesh.number_of_nodes() isBDNode = mesh.ds.boundary_node_flag() NB = np.sum(isBDNode) idxmap = np.zeros(NN, dtype=np.int32) idxmap[isBDNode] = range(NB) cell = idxmap[cell] node = node[isBDNode] trimesh = TriangleMesh(node, cell) data = {'node': trimesh.node, 'elem': trimesh.ds.cell + 1} sio.matlab.savemat('trimesh', data) ax0 = a3.Axes3D(pl.figure()) trimesh.add_plot(ax0) pl.show()
h = 0.05 mesh_info = MeshInfo() # Set the vertices of the domain [0, 1]^2 mesh_info.set_points([(0, 0), (1, 0), (1, 1), (0, 1)]) # Set the facets of the domain [0, 1]^2 mesh_info.set_facets([[0, 1], [1, 2], [2, 3], [3, 0]]) # Generate the tet mesh mesh = build(mesh_info, max_volume=(h)**2) node = np.array(mesh.points, dtype=np.float) cell = np.array(mesh.elements, dtype=np.int) tmesh = TriangleMesh(node, cell) quality = TriRadiusRatioQuality(tmesh) x0 = quality.get_init_value() R = minimize(quality, x0, method='Powell', callback=quality.callback) print(R) fig = plt.figure() axes = fig.gca() tmesh.add_plot(axes, cellcolor='w') quality.update_mesh_node(R.x) fig = plt.figure() axes = fig.gca() tmesh.add_plot(axes, cellcolor='w') plt.show()
ps = mesh.bc_to_point(bcs).reshape(-1, 2) val = space.basis(bcs) # (NQ, 1, ldof) val = space.grad_basis(bcs) # (NQ, NC, ldof, GD) val = val[:, 0, 0] fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, node=ps, markersize=20) fig = plt.figure() axes = fig.add_subplot(projection='3d') axes.plot_trisurf(ps[:, 0], ps[:, 1], val, linewidth=0.2, antialiased=True, cmap='rainbow') NN = mesh.number_of_nodes() node = np.zeros((NN, 3), dtype=np.float64) node[:, 0:2] = mesh.entity('node') cell = mesh.entity('cell') mesh3 = TriangleMesh(node, cell) mesh3.add_plot(axes, box=[0, 1, 0, 1, -1, 1], showaxis=True) plt.show()
(1, 2, 0), (3, 0, 2)], dtype=np.int) mesh = TriangleMesh(node, cell) mesh.uniform_refine(4) node = mesh.entity('node') cell = mesh.entity('cell') tmesh = Tritree(node, cell) femspace = LagrangeFiniteElementSpace(mesh, p=1) uI = femspace.interpolation(f1) estimator = Estimator(uI[:], mesh, 0.3, 0.5) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes, cellcolor=estimator.eta, showcolorbar=True) tmesh.adaptive_refine(estimator) mesh = estimator.mesh fig = plt.figure() axes = fig.gca() mesh.add_plot(axes, cellcolor=estimator.eta, showcolorbar=True) femspace = LagrangeFiniteElementSpace(mesh, p=1) uI = femspace.interpolation(f2) estimator = Estimator(uI[:], mesh, 0.3, 0.5) tmesh.adaptive_coarsen(estimator) mesh = estimator.mesh fig = plt.figure()