def init_mesh(self, n=0, p=None): t = self.CircleCurve.radius c = np.sqrt(3.0) / 2.0 node = np.array( [[0.0, 0.0], [t, 0.0], [t / 2.0, c * t], [-t / 2.0, c * t], [-t, 0.0], [-t / 2.0, -c * t], [t / 2.0, -c * t]], dtype=np.float64) cell = np.array( [[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 6], [0, 6, 1]], dtype=np.int_) mesh = TriangleMesh(node, cell) for i in range(n): NN = mesh.number_of_nodes() mesh.uniform_refine() node = mesh.entity('node') self.CircleCurve.project(node[NN:]) node = mesh.entity('node') cell = mesh.entity('cell') mesh = LagrangeTriangleMesh(node, cell, p=p) isBdNode = mesh.ds.boundary_node_flag() node = mesh.entity('node') bdnode = node[isBdNode] self.CircleCurve.project(bdnode) node[isBdNode] = bdnode return mesh
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 init_mesh(self, n=4, meshtype='tri'): node = np.array([(-1, -1), (0, -1), (-1, 0), (0, 0), (1, 0), (-1, 1), (0, 1), (1, 1)], dtype=np.float64) if meshtype == 'tri': cell = np.array([(1, 3, 0), (2, 0, 3), (3, 6, 2), (5, 2, 6), (4, 7, 3), (6, 3, 7)], dtype=np.int_) mesh = TriangleMesh(node, cell) mesh.uniform_refine(n) return mesh elif meshtype == 'quadtree': cell = np.array([(0, 1, 3, 2), (2, 3, 6, 5), (3, 4, 7, 6)], dtype=np.int_) mesh = Quadtree(node, cell) mesh.uniform_refine(n) return mesh elif meshtype == 'tritree': cell = np.array([(1, 3, 0), (2, 0, 3), (3, 6, 2), (5, 2, 6), (4, 7, 3), (6, 3, 7)], dtype=np.int_) mesh = TriangleMesh(node, cell) mesh.uniform_refine(n) node = mesh.entity('node') cell = mesh.entity('cell') mesh = Tritree(node, cell) return mesh else: raise ValueError("I don't know the meshtype %s".format(meshtype))
flag = (np.sum(cell == 0, axis=1) == 1) & isLeafCell idx, = np.where(flag) return idx def coarsen_marker(self, qtmesh): pass node = np.array([(0, 0.5), (0.865, 0), (1.73, 0.5), (0.865, 1)], dtype=np.float) cell = np.array([(1, 2, 3), (3, 0, 1)], dtype=np.int) tmesh = TriangleMesh(node, cell) tmesh.uniform_refine(0) node = tmesh.entity('node') cell = tmesh.entity('cell') tritree = Tritree(node, cell, irule=1) marker = AdaptiveMarker() for i in range(1): tritree.refine(marker) a = np.array([2, 4], dtype=np.int) fig = plt.figure() axes = fig.gca() tritree.add_plot(axes) #tritree.find_node(axes, showindex=True) tritree.find_cell(axes, index=a) #tritree.find_edge(axes, showindex=True) plt.show()
from fealpy.mesh.Tritree import Tritree 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) mesh.uniform_refine(1) node = mesh.entity('node') cell = mesh.entity('cell') tmesh = Tritree(node, cell) isLeafCell = tmesh.is_leaf_cell() flag = (np.sum(cell == 0, axis=1) == 5) & isLeafCell idx, = np.where(flag) for i in range(2): tmesh.refine(idx) tmesh.coarsen(idx) fig = plt.figure() axes = fig.gca() tmesh.add_plot(axes) #tmesh.find_node(axes, showindex=True) #tmesh.find_edge(axes, showindex=True) #tmesh.find_cell(axes, showindex=True) plt.show()
import sys import numpy as np import matplotlib.pyplot as plt from fealpy.mesh.TriangleMesh import TriangleMesh, TriangleMeshDataStructure 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) tmesh = TriangleMesh(node, cell) tmesh.uniform_refine(1) node = tmesh.node cell = tmesh.entity('cell') print(tmesh.ds.node_to_cell()) N = node.shape[0] tmeshstrcture = TriangleMeshDataStructure(N, cell) fig = plt.figure() axes = fig.gca() tmesh.add_plot(axes) tmesh.find_node(axes, showindex=True) tmesh.find_edge(axes, showindex=True) tmesh.find_cell(axes, showindex=True) plt.show()