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读取网格文件后绘制的网格图形如下