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()