Libraries

Pyvista与VTK可视化

代码片段分享1

import pyvista as pv
from process_VTK import *

# pv.set_plot_theme('paraview')
def visualize_html(suffix, mpi_x, mpi_y, mpi_z, var, norm, point):
    # 定义VTK文件列表
    path_prefix = f"E:/almgsi3d_cp64/{suffix}"
    file = f"result_{suffix}.vtk"
    file_list = generate_filename(path_prefix, file, mpi_x, mpi_y, mpi_z)

    # var = ["phi_FCC", "c_overall_Mg", "c_overall_Si"]

    color_bar = {
                'n_labels': 5, 
                'shadow': True, 
                'italic': False, 
                'fmt': '%.3f', 
                'interactive': True,
                'position_x': 0.9,
                'position_y': 0.1, 
                'vertical': True,
                'width': 0.01, 
                'height': 0.4
                }

    pv.global_theme.allow_empty_mesh = True
    p1 = pv.Plotter()
    p2 = pv.Plotter()
    p3 = pv.Plotter()

    for index, file in enumerate(file_list):
        grid = pv.read(file)
        xy_slice = grid.slice(normal=norm, origin=point)
        if (xy_slice.n_points != 0):
            p1.add_mesh(xy_slice, cmap = "coolwarm", scalars=var, line_width = 1, point_size = 2, show_scalar_bar=False, style="surface", flip_scalars=True, diffuse = 1.0, specular_power = 100)
        print(f"Processing {index + 1}/{len(file_list)} task...")

    p1.zoom_camera("tight")
    p1.show(interactive=False, screenshot = f"topview_slice_{var}_{suffix}.png", full_screen = True)

if __name__ == "__main__":
    mpi_x, mpi_y, mpi_z = 1, 1, 1
    var, norm, point = "phi_FCC", [0, 0, 1], [64e-6, 64e-6, 64e-6]
    # for suffix in ["000000", "000001", "000002", "000003", "000004"]:
    # for suffix in ["000012", "000011", "000010", "000009", "000008", "000007", "000006", "000005", "000004", "000003", "000002", "000001", "000000"]:
    for suffix in ["000012"]:
        visualize_html(suffix, mpi_x, mpi_y, mpi_z, var, norm, point)

代码片段分享2(读取OpenPhase的结果文件)

import pyvista as pv
import matplotlib.pyplot as plt
from matplotlib import cm, ticker

# set tick label font size
plt.rcParams.update({"font.size": 14})

vtsfile = "VTK/Stresses_00001000.vts"

grid = pv.read(vtsfile)

vmin, vmax = None, None
var, norm, point = "Sigma_xx", [0, 0, 1], [16, 32, 32]
xy_slice = grid.slice(normal=norm, origin=point)

# print(dir(xy_slice))
# print(xy_slice.array_names)
# print(xy_slice[var].shape)

mat = xy_slice[var].reshape(64, 64)
print(mat.shape)

if vmin is None or vmax is None:
    vmin, vmax = mat.min(), mat.max()

fig = plt.figure(figsize=(6, 4))

im = plt.imshow(mat, cmap="coolwarm", interpolation="bilinear", origin="lower", vmin=vmin, vmax=vmax)

# show colorbar
bar = plt.colorbar(im, shrink=0.5, aspect=20, pad=0.1)
bar.set_label(var, fontsize=16)
# ticker.ScalarFormatter(useMathText=True)
# xaxis.set_major_locator(ticker.ScalarFormatter(useMathText=True)) for colorbar
bar.ax.yaxis.set_major_formatter(ticker.ScalarFormatter(useMathText=True))

plt.show()