我正在使用 getfem 的 python 绑定,为此我按照他们的教程编写了这个脚本:
import getfem as gf
import numpy as np
import math
center = [0.0, 0.0]
dir = [0.0, 1.0]
radius = 1.0
angle = 0.2 * math.pi
mo = gf.MesherObject("cone", center, dir, radius, angle)
h = 0.1
K = 2
mesh = gf.Mesh("generate", mo, h, K)
outer_faces = mesh.outer_faces()
OUTER_BOUND = 1
mesh.set_region(OUTER_BOUND, outer_faces)
sl = gf.Slice(("none",), mesh, 1)
mfu = gf.MeshFem(mesh, 1)
elements_degree = 2
mfu.set_classical_fem(elements_degree)
mim = gf.MeshIm(mesh, pow(elements_degree, 2))
md = gf.Model("real")
md.add_fem_variable("u", mfu)
md.add_Laplacian_brick(mim, "u")
F = 1.0
md.add_fem_data("F", mfu)
md.set_variable("F", np.repeat(F, mfu.nbdof()))
md.add_source_term_brick(mim, "u", "F")
md.add_Dirichlet_condition_with_multipliers(mim, "u", elements_degree - 1, OUTER_BOUND)
md.solve()
U = md.variable("u")
sl.export_to_vtk("u.vtk", "ascii", mfu, U, "U")
这将导出一个 vtk 文件。在某个地方,我找到了一种在 Jupyter 笔记本上显示它的方法:
import pyvista as pv
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1280, 1024))
display.start()
p = pv.Plotter()
m = pv.read("u.vtk")
contours = m.contour()
p.add_mesh(m, show_edges=False)
p.add_mesh(contours, color="black", line_width=1)
p.add_mesh(m.contour(8).extract_largest(), opacity=0.1)
pts = m.points
p.show(window_size=[384, 384], cpos="xy")
display.stop()
由于某种原因,它看起来非常压缩。我正在尝试将其另存为 PNG。
有谁知道如何将vtk转换成png? Paraview 在现代系统中出于所有意图和目的已经被弃用,所以这是不可能的。
您可以生成屏幕截图而不显示它:
import pyvista as pv
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1280, 1024))
display.start()
p = pv.Plotter(off_screen=True)
m = pv.read("u.vtk")
contours = m.contour()
p.add_mesh(m, show_edges=False)
p.add_mesh(contours, color="black", line_width=1)
p.add_mesh(m.contour(8).extract_largest(), opacity=0.1)
pts = m.points
p.show(cpos="xy", screenshot='screenshot.png')
display.stop()