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)
streamlines 2D

複数のストリームラインを生成するには,ラインソースを 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 2D

シリンダーのすぐ下流の挙動は,入口の流線ではまだわかりません.

もう一つの方法は, 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)
streamlines 2D

この流線はほぼ等間隔に配置されており, start_position を適切に選択することで,円柱の下流にある渦のペアを捉えることができます.

Total running time of the script: (0 minutes 3.876 seconds)

Sphinx-Galleryによるギャラリー