注釈
Go to the end to download the full example code
2D流線#
2次元表面上のベクトルフィールドを積分して,流線を生成します.
この例では,クロスフローにおけるシリンダー周りの流れの流線を生成します.
import pyvista as pv
from pyvista import examples
データはマルチブロックで,流体データが最初のブロックとなっています.データは xy 平面上,つまり z=0 で, z 方向の速度はありません.
mesh = examples.download_cylinder_crossflow()
fluid_mesh = mesh[0]
print(fluid_mesh)
UnstructuredGrid (0x7f222b1aafe0)
N Cells: 14594
N Points: 14831
X Bounds: 0.000e+00, 1.500e+01
Y Bounds: -3.750e+00, 3.750e+00
Z Bounds: 0.000e+00, 0.000e+00
N Arrays: 3
streamlines()
フィルタのデフォルトの動作は,3Dの球体ソースを種点として使用することです.これは多くの場合,対象となる2D平面上にシードポイントを生成しません. 代わりに, start_position
の引数を使って,単一のストリームラインを生成することができます. surface_streamlines=True
という引数も,データセットが非ゼロの法線速度成分を持っている場合に必要です. このデータセットではそのようなことはありません.
one_streamline = fluid_mesh.streamlines(
start_position=(0.0, 0.4, 0.0),
max_time=100.0,
compute_vorticity=False, # vorticity already exists in dataset
)
clim = [0, 20]
camera_position = [(7, 0, 20.0), (7, 0.0, 0.0), (0.0, 1.0, 0.0)]
p = pv.Plotter()
for i in range(1, len(mesh)):
p.add_mesh(mesh[i], color='k')
p.add_mesh(one_streamline.tube(radius=0.05), scalars="vorticity_mag", clim=clim)
p.view_xy()
p.show(cpos=camera_position)
複数のストリームラインを生成するには,ラインソースを pointa
および pointb
パラメータとともに使用します.
line_streamlines = fluid_mesh.streamlines(
pointa=(0, -5, 0),
pointb=(0, 5, 0),
n_points=25,
max_time=100.0,
compute_vorticity=False, # vorticity already exists in dataset
)
p = pv.Plotter()
for i in range(1, len(mesh)):
p.add_mesh(mesh[i], color='k')
p.add_mesh(line_streamlines.tube(radius=0.05), scalars="vorticity_mag", clim=clim)
p.view_xy()
p.show(cpos=camera_position)
シリンダーのすぐ下流の挙動は,入口の流線ではまだわかりません.
もう一つの方法は, streamlines_evenly_spaced_2D()
を使うことです.このフィルタは,xy平面上にある2Dデータに対してのみ動作します.このメソッドはすぐにメモリ不足になってしまうので,入力パラメータには特に注意を払う必要があります. デフォルトではセルの長さ単位で表示されます.
line_streamlines = fluid_mesh.streamlines_evenly_spaced_2D(
start_position=(4, 0.1, 0.0),
separating_distance=3,
separating_distance_ratio=0.2,
compute_vorticity=False, # vorticity already exists in dataset
)
p = pv.Plotter()
for i in range(1, len(mesh)):
p.add_mesh(mesh[i], color='k')
p.add_mesh(line_streamlines.tube(radius=0.02), scalars="vorticity_mag", clim=clim)
p.view_xy()
p.show(cpos=camera_position)
この流線はほぼ等間隔に配置されており, start_position
を適切に選択することで,円柱の下流にある渦のペアを捉えることができます.
Total running time of the script: (0 minutes 3.876 seconds)