FEniCS学习笔记08:从Gmsh中导入网格

fenicsx0.7.3从gmsh导入网格分为两种形式:

一是从model格式导入,官网有demo:demo_gmsh.py

二是从'.msh'文件格式导入,本文主要介绍该方法

1.旧版本用meshio导入

fenics官方论坛有大量使用meshio导入'.msh'的帖子,但是其中有很多代码使用到的函数不是fenicsx0.7.3版本的,下面提供一个适用于0.7.3版本的代码

需额外下载meshio包

原贴:https://fenicsproject.discourse.group/t/problem-with-xdmf-read-mesh/12189/11

from mpi4py import MPI
from dolfinx import mesh, fem, io, nls, log, geometry, plot
import pyvista
import meshio
from pathlib import Path

def create_mesh(mesh, cell_type, prune_z=False):
    cells = mesh.get_cells_type(cell_type)
    cell_data = mesh.get_cell_data("gmsh:physical", cell_type)
    points = mesh.points[:,:2] if prune_z else mesh.points
    out_mesh = meshio.Mesh(points=points, cells={cell_type: cells}, cell_data={"name_to_read":[cell_data]})
    return out_mesh


path_msh = Path("t1.msh")
msh = meshio.read(path_msh)

# create mesh from '.msh'
# mesh_interior = create_mesh(msh, "tetra")
mesh_facets = create_mesh(msh, "triangle")

# store temporary meshes in XDMF format
# path_tmp_tetra = path_msh.with_name(path_msh.stem + "_tetra.xdmf")
path_tmp_tri = path_msh.with_name(path_msh.stem + "_triangle.xdmf")
# meshio.write(path_tmp_tetra, mesh_interior, file_format="xdmf")
meshio.write(path_tmp_tri, mesh_facets, file_format="xdmf")

# read back in with dolfinx to obtain the mesh in the correct format
with io.XDMFFile(MPI.COMM_WORLD, path_tmp_tri, "r") as xdmf:
    print("test1")
    domain = xdmf.read_mesh(name="Grid")
    print("test2")

#绘图
# 创建一个有限元函数空间V,使用fem.FunctionSpace函数,并提供域对象domain和元素类型和阶数(这里是拉格朗日元素和一阶)作为参数
V = fem.FunctionSpace(domain, ("Lagrange", 1))
# 在网格上绘制计算结果
# pyvista创建无结构网格u_grid,其中传入的参数是拓扑信息、单元类型和几何信息
u_topology, u_cell_types, u_geometry = plot.vtk_mesh(V)
u_grid = pyvista.UnstructuredGrid(u_topology, u_cell_types, u_geometry)
# 创建可视化Plotter窗口,并对窗口进行设置
u_plotter = pyvista.Plotter()
u_plotter.add_mesh(u_grid, show_edges=True, cmap="jet") # 将网格对象u_grid添加到可视化对象u_plotter中,并设置不显示网格线,设置颜色循环类别
u_plotter.view_xy() # 设置可视化对象u_plotter的视图为XY平面(可以根据需求设置不同的视图)
# 检查pyvista库是否在无图形界面环境下运行
if not pyvista.OFF_SCREEN:
    u_plotter.show()

2.新版本用read_from_msh导入

新版本的dolfinx.io.gmshio.read_from_msh函数能直接读取'.msh'文件,无需再转换成'.xdmf'后读取

from mpi4py import MPI
from dolfinx import mesh, fem, io, nls, log, geometry, plot
import pyvista

domain, cell_tags, facet_tags = io.gmshio.read_from_msh("t1.msh", MPI.COMM_WORLD, gdim=2)

3.结果展示

用gmsh官方给的‘t1.geo’为例,fenics读取网格文件后绘制的网格图形如下

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值