示例#1
0
    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()
示例#2
0
    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()
示例#3
0
    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())
示例#4
0
    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()
示例#5
0
    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()
示例#7
0
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()
示例#8
0
    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()
示例#9
0
    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()
示例#10
0
    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()
示例#11
0
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()

示例#12
0
                 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()
示例#13
0
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()
示例#14
0
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()
示例#15
0
    (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()