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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

【Qt6.3 基础教程 17】 Qt布局管理详解:创建直观和响应式UI界面

文章目录 前言布局管理的基础为什么需要布局管理器? 盒布局:水平和垂直排列小部件示例:创建水平盒布局 栅格布局:在网格中对齐小部件示例:创建栅格布局 表单布局:为表单创建标签和字段示例:创建表单布局 调整空间和伸缩性示例:增加弹性空间 总结 前言 当您开始使用Qt设计用户界面(UI)时,理解布局管理是至关重要的。布局管理不仅关系到UI的外观,更直接影响用户交互的体验。本篇博

3_创建Tab控件

1,新建MFC 对话框项目,为对话框添加Tab控件,选中Tab控件,新建控件变量m_tab_ctrl 2,为Tab控件添加tab项 m_tab_ctrl.InsertItem(0, L”000”),参数1,哪个位置;参数2,item的名称 3,为Tab控件添加监听事件, void C测试Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESUL

Bootstrap 5 网格系统

Bootstrap 5 网格系统 Bootstrap 5 是目前最流行的前端框架之一,它提供了一套强大的网格系统,帮助开发者快速构建响应式布局。本文将详细介绍 Bootstrap 5 的网格系统,包括其工作原理、使用方法以及最佳实践。 什么是 Bootstrap 网格系统? Bootstrap 网格系统是一种基于 Flexbox 的布局方法,它允许开发者将页面内容分为多列,并且可以轻松地控制

Java NIO 创建/复制缓冲区

创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1、调用allocate方法 2、调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义; allocate方法创建缓冲区 调用allocate方法实际上会返回new HeapCharBuffer(capacity, capacity)对象; 缓存空间存储在CharBuffer类的成员属性char[] h

spring mvc完整项目创建步骤记录

快速创建一个spring mvc项目(只有页面调用→到controller→到页面) 1、首先创建Dynamic Web Project 2、创建jsp页面index.jsp以及成功(/WEB-INF/view/success.jsp)和失败页面(/WEB-INF/view/error.jsp) index.jsp <%@ page language="java" contentType=

在Qt5中创建、读取和写入JSON文件的完整指南

Qt5 提供了一个非常方便的JSON解析器,使得在C++中处理JSON数据变得非常简单。本文将详细介绍如何在Qt5中创建、读取和写入JSON文件。 读取JSON文件的示例 假设我们有一个名为test.json的JSON文件,内容如下: {"appDesc": {"description": "SomeDescription","message": "SomeMessage"},"appNam

client-go入门之1:创建连接Kubernetes集群的客户端

文章目录 简介使用 简介 我们可以使用Dashboard或kubectl来访问k8s的API,也可以使用编程语言,如Go,Java,Python作为客户端来访问k8s。client-go是一个使用go语言编写的库,用来连接k8s集群并对集群资源进行操作。 使用 以下代码使用go连上k8s集群,并查询集群的节点信息: package mainimport ("fmt"meta

新建帐套提示“无法创建数据库!请检查目录…是否存在,以及系统空间是否充足.

1、在K/3安装路径下K3ERP文件夹下,找到DBFILE文件夹;2、右击单击“DBFILE”文件夹,选择“属性”→【安全】→【添加】,选择【高级】→【立即查找】→找到everyone用户;3、把该用户添加到【用户和组】中,并赋予“完全控制权限”。