FEniCS绘图是依赖于第3方软件包——VTK的python库“pyvista”,
因此,具体函数操作可参照pyvista的官网:https://docs.pyvista.org/version/stable/
1.绘制云图基本操作
step1:生成pyvista格式的网格
假设已用fenics内置的mesh.create_xxx()函数生成一网格domain,该网格不能直接被pyvista操作
需用fenics的plot.vtk_mesh()函数获取网格的拓扑信息、单元类型和几何信息
然后用pyvista.UnstructuredGrid(拓扑信息, 单元类型, 几何信息)函数生成pyvista格式的非结构化网格
# pyvista创建非结构网格u_grid,其中传入的参数是拓扑信息、单元类型和几何信息
u_topology, u_cell_types, u_geometry = plot.vtk_mesh(V) #V是基于FEniCS网格创建的函数空间
u_grid = pyvista.UnstructuredGrid(u_topology, u_cell_types, u_geometry)
step2:对网格进行赋值
pyvista支持对网格节点、网格单元进行赋值,函数分别是mesh.point_data[]和mesh.cell_data[]
考虑有限元方法的结果储存在节点上,所以采用mesh.point_data[‘自定义节点值的名称’]=array
# 给非结构网格u_grid的顶点数据"u",赋值数值解uh的实部(uh.x.array.real)
u_grid.point_data["u"] = uh.x.array.real
u_grid.set_active_scalars("u") # 把‘u’设置为活动标量,绘图函数pyvista.Plotter.add_mesh()不设置scalar值时默认用活动标量绘图
step3:创建可视化窗口,并进行绘图设置
# 创建可视化Plotter窗口,并对窗口进行设置
u_plotter = pyvista.Plotter()
u_plotter.add_mesh(u_grid, show_edges=False, cmap="jet") # 将网格对象u_grid添加到可视化对象u_plotter中,并设置显示网格线,设置颜色循环类别
u_plotter.add_text("uh", position="upper_edge", font_size=14, color="black") # 设置图像标题
u_plotter.view_xy() # 设置可视化对象u_plotter的视图为XY平面(可以根据需求设置不同的视图)
step4:窗口显示
# 检查pyvista库是否在无图形界面环境下运行,有图形界面则直接展示
if not pyvista.OFF_SCREEN:
u_plotter.show()
2.云图颜色设置
云图的各种参数设置可参见函数pyvista.Plotter.add_mesh()的官方文档:pyvista.Plotter.add_mesh()
其中云图的颜色设置为cmap,可选参数见matplotlib官网:matplotlib_colormap
一些常用cmap:
3.等值线绘制
必须先给网格赋值,才能使用mesh.contour()函数
contours=u_grid.contour(isosurfaces=20) # 创建19条等值线,可以不设置参数,默认isosurfaces=10
u_plotter.add_mesh(contours,color="black", line_width=2) # 将等值线添加到可视化对象中,并设置颜色和粗细
4.结果展示
用以上画图代码,对一个uh计算结果的展示