(一)、Fealpy 创建各种各样的网格

2023-10-24 20:00

本文主要是介绍(一)、Fealpy 创建各种各样的网格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Fealpy 库中实现了一个类 mesh 用于网格生成, 我们先介绍规则的网格(默认大家已经完成 fealpy 的安装, 见前言)
首先引入一些库:

import numpy as np
import matplotlib.pyplot as plt
from fealpy.mesh import QuadrangleMesh
from fealpy.mesh import HalfEdgeMesh2d, PolygonMesh
from fealpy.mesh import TriangleMesh
from mpl_toolkits.mplot3d import Axes3D

构造性方法

三角形网格

# 创建一个三角形网格
node = np.array([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)], dtype=np.float64)  # 结点, 容易知道我们的区域是[0,1]^2
cell = np.array([(1, 2, 0), (3, 0, 2)], dtype=np.int_)  # 单元, 我们可以画个图看一下代表的意思
mesh = TriangleMesh(node, cell)  #创建三角形网格

我们已经创建了一个三角形网格,为了更好地看到节点,网格的实际含义, 我们便画出图观察一下。 首先拿出网格的所有实体(网格,单元,边)。

node = mesh.entity('node')
edge = mesh.entity('edge')
cell = mesh.entity('cell')

然后利用 mesh 类中的函数 add_plot 画出相应的图

fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)mesh.find_node(axes, showindex=True)
mesh.find_edge(axes, showindex=True)
mesh.find_cell(axes, showindex=True)

在这里插入图片描述
从图中我们可以看到黄色的点为 cell 的编号, 0号三角形的编号是1->2->0, 1号三角形的编号是 0->3->2。
注意:cell 局部编号是逆时针排列, 对于边界边排列,我们要求左手边是边界的内部。
Fealpy 中的几种接口为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Fealpy 中构造了一个网格加密的函数 mesh.uniform_refine(n) , 其核心想法便是把边的中点连接起来, n 指的是加密的次数, 比如:

mesh.uniform_refine(n=5)
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

我们可以在此基础上得到如下网格:
在这里插入图片描述

正方形网格

类似地, 我们可以利用QuadrangleMesh 来创建正方形网格:

node = np.array([(0, 0), (1, 0), (1, 1), (0, 1)], dtype=np.float64)
cell = np.array([(0, 1, 2, 3)], dtype=np.int_)mesh =QuadrangleMesh(node, cell)
mesh.uniform_refine(2)
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

结果如下图:
在这里插入图片描述
注意到上面的网格是正方形的,那么我们能否创建长方形网格呢? 答案是肯定的,我们不在使用原始的构造加密方式, 我们采用 mesh 的一个类来完成这件事情 :Factory

利用 Mesh Factory 生成网格

from fealpy.mesh import MeshFactory
from matplotlib import pyplot as pltmf = MeshFactory()# 生成三角形网格
box = [0, 1, 0, 1]
mesh = mf.boxmesh2d(box, nx=4, ny=5, meshtype='tri')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

结果为
在这里插入图片描述

矩形网格

# 生成四边形网格
box = [0, 2, 0, 2]
mesh = mf.boxmesh2d(box, nx=4, ny=10, meshtype='quad')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

多项式网格

# 生成多项式网格box = [0, 1, 0, 1]
mesh = mf.boxmesh2d(box, nx=4, ny=4, meshtype='poly')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

非结构三角网格

# 生成非结构的网格
box = [0, 1, 0, 1]
mesh = mf.triangle(box, h=0.1, meshtype='tri')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

非结构多项式网格

box = [0, 1, 0, 1]
mesh = mf.triangle(box, h=0.1, meshtype='poly')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

鱼骨型网格

# 鱼骨型
box = [0, 1, 0, 1]
mesh = mf.special_boxmesh2d(box, n=10, meshtype='fishbone')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

米字型网格

# 米字型
box = [0, 1, 0, 1]
mesh = mf.special_boxmesh2d(box, n=10, meshtype='rice')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

交叉型网格

# 交叉型
box = [0, 1, 0, 1]
mesh = mf.special_boxmesh2d(box, n=10, meshtype='cross')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

非一致网格

# 非一致型
box = [0, 1, 0, 1]
mesh = mf.special_boxmesh2d(box, n=10, meshtype='nonuniform')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

圆上的网格

# 圆上的网格
mesh = mf.unitcirclemesh(h=0.1, meshtype='tri')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

mesh = mf.unitcirclemesh(h=0.1, meshtype='poly')
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

L-shape 网格

# L-shape
mesh = mf.lshape_mesh(n=2)
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

Polygon 网格

mesh = mf.polygon_mesh()
mesh.uniform_refine(n=3)  # 网格加密次数
NC = mesh.number_of_cells()
print('Number of cells:', NC)
fig = plt.figure()
axes = fig.gca()
mesh.add_plot(axes)

在这里插入图片描述

四面体网格

# 四面体网格
box = [0, 1, 0, 1, 0, 1]
mesh = mf.boxmesh3d(box, nx=4, ny=4, nz=4, meshtype='tet')
fig = plt.figure()
axes = fig.gca(projection='3d')
mesh.add_plot(axes)

在这里插入图片描述

六面体网格

# 六面体网格
box = [0, 1, 0, 1, 0, 1]
mesh = mf.boxmesh3d(box, nx=4, ny=4, nz=4, meshtype='hex')
fig = plt.figure()
axes = fig.gca(projection='3d')
mesh.add_plot(axes)

在这里插入图片描述

利用Threshold构造你想要的网格

我们之前给出过L-shape的网格,但是有些时候想要变换 L-shape的方向,这时候便要借助 Threshold 函数来完成。

    # mesh = mf.boxmesh2d([-1, 1, -1, 1], nx=10, ny=10, meshtype='tri',#                    threshold=lambda p: (p[..., 0] > 0.0) & (p[..., 1] < 0.0))mesh = mf.boxmesh2d([-1, 1, -1, 1], nx=10, ny=10, meshtype='tri', threshold=lambda p: (p[..., 0]<0.0) & (p[..., 1]<0.0))mesh.add_plot(plt)

与之前的L-shape形状不同

    mesh = mf.boxmesh2d([-1, 1, -1, 1], nx=100, ny=100, meshtype='tri', threshold=lambda p: p[..., 0] ** 2 + p[..., 1] ** 2 <0.5)mesh.add_plot(plt)

在这里插入图片描述
上图我们本意是想挖掉一个圆之后再离散,但这种写法显然是先离散,再将 threshold 中的区域去掉。 先挖掉一个圆再离散的话显然是自适应网格,怎么做我还不清楚。但是在内部挖掉一个正方形还是没有什么问题的。

总结

由上述例子我们可以看出, Fealpy 还是很强大的, 并且还在不断完善中。希望有更多的人使用Fealpy。下一节我们将介绍拉格朗日函数有限元空间的构造。

这篇关于(一)、Fealpy 创建各种各样的网格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277463

相关文章

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal