You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2 Ubuntu环境下Fenicsx调用PyVista绘图失败求助

解决WSL2 Ubuntu22.04下Fenicsx PyVista无法打开绘图窗口的问题

问题背景

在WSL2 Ubuntu22.04环境中,已安装Fenicsx、Paraview并启动Xming,Paraview可正常打开图形界面,但运行Fenicsx官方教程代码时,PyVista出现trame相关错误无法打开绘图窗口,调整后仍有新报错。


解决方案

1. 确保X11转发环境配置正确

  • 启动Xming时添加**-ac参数**(关闭访问控制,允许WSL进程连接)
  • 在WSL终端中设置正确的DISPLAY变量:
    export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
    
    可将上述命令添加到~/.bashrc或~/.zshrc中,实现永久生效
  • 验证配置:执行echo $DISPLAY,应输出类似192.168.x.x:0的IP地址

2. 强制PyVista使用VTK原生后端(避开trame兼容性问题)

PyVista默认使用trame作为GUI框架,在WSL2 Xming环境下易出现兼容性问题,可强制切换到VTK原生X11后端:

  • 方法一:在代码开头添加配置
    import pyvista as pv
    # 禁用jupyter后端,强制使用VTK原生窗口
    pv.set_jupyter_backend('none')
    pv.global_theme.jupyter_backend = 'none'
    
  • 方法二:通过环境变量设置(运行脚本前执行)
    export PYVISTA_BACKEND=vtk
    

3. 处理MPI多进程渲染冲突

Fenicsx默认使用多进程MPI,可能导致PyVista渲染异常,可尝试:

  • 运行脚本时指定单进程:
    mpiexec -n 1 python3 your_script.py
    
  • 或修改代码中mesh创建的通信器为单进程:
    msh = mesh.create_rectangle(comm=MPI.COMM_SELF,  # 替换原MPI.COMM_WORLD
                                points=((0.0, 0.0), (2.0, 1.0)), n=(32, 16),
                                cell_type=mesh.CellType.triangle,)
    

4. 补充依赖包

确保VTK和PyVista相关组件完整:

# 安装VTK的X11和QT支持
sudo apt install libvtk9-qt-dev
# 更新PyVista及相关依赖
pip install --upgrade pyvista trame trame-vtk trame-client trame-server

修改后的示例代码

import numpy as np
import pyvista as pv
# 提前配置PyVista后端
pv.set_jupyter_backend('none')
pv.global_theme.jupyter_backend = 'none'

import ufl
from dolfinx import fem, io, mesh, plot
from ufl import ds, dx, grad, inner

from mpi4py import MPI
from petsc4py.PETSc import ScalarType

# 使用单进程通信器避免MPI渲染冲突
msh = mesh.create_rectangle(comm=MPI.COMM_SELF,
                            points=((0.0, 0.0), (2.0, 1.0)), n=(32, 16),
                            cell_type=mesh.CellType.triangle,)
V = fem.FunctionSpace(msh, ("Lagrange", 1))

facets = mesh.locate_entities_boundary(msh, dim=(msh.topology.dim - 1),
                                       marker=lambda x: np.logical_or(np.isclose(x[0], 0.0),
                                                                      np.isclose(x[0], 2.0)))

dofs = fem.locate_dofs_topological(V=V, entity_dim=1, entities=facets)

bc = fem.dirichletbc(value=ScalarType(0), dofs=dofs, V=V)

u = ufl.TrialFunction(V)
v = ufl.TestFunction(V)
x = ufl.SpatialCoordinate(msh)
f = 10 * ufl.exp(-((x[0] - 0.5) ** 2 + (x[1] - 0.5) ** 2) / 0.02)
g = ufl.sin(5 * x[0])
a = inner(grad(u), grad(v)) * dx
L = inner(f, v) * dx + inner(g, v) * ds

problem = fem.petsc.LinearProblem(a, L, bcs=[bc], petsc_options={"ksp_type": "preonly", "pc_type": "lu"})
uh = problem.solve()

with io.XDMFFile(msh.comm, "out_poisson/poisson.xdmf", "w") as file:
    file.write_mesh(msh)
    file.write_function(uh)

try:
    cells, types, x = plot.create_vtk_mesh(V)
    grid = pv.UnstructuredGrid(cells, types, x)
    grid.point_data["u"] = uh.x.array.real
    grid.set_active_scalars("u")
    plotter = pv.Plotter()
    plotter.add_mesh(grid, show_edges=True)
    warped = grid.warp_by_scalar()
    plotter.add_mesh(warped)
    if pv.OFF_SCREEN:
        pv.start_xvfb(wait=0.1)
        plotter.screenshot("uh_poisson.png")
    else:
        plotter.show()

except ModuleNotFoundError:
    print("'pyvista' is required to visualise the solution")
    print("Install 'pyvista' with pip: 'python3 -m pip install pyvista'")

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:37:18