(一)、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

相关文章

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in