データの積分#

pyvista.DataSetFilters.integrate_data() フィルタを使用して,データを表面上で積分します.

import pyvista
from pyvista import examples

この例では,血管内の総流量と平均流速を計算します. 境界オブジェクトは,データセット形状のプロットにのみ使用されます. 流入面は,領域をスライスして生成します.領域内に流入する流体は負の z 方向に流れるので,新しい配列 normal_velocity が作成されます.

dataset = examples.download_blood_vessels()
boundary = dataset.decimate_boundary().extract_all_edges()
inlet_surface = dataset.slice('z', origin=(0, 0, 182))
inlet_surface["normal_velocity"] = -1 * inlet_surface["velocity"][:, 2]

入口の流速を示します.

plotter = pyvista.Plotter()
plotter.add_mesh(boundary, color="grey", opacity=0.25)
plotter.add_mesh(
    inlet_surface,
    scalars="normal_velocity",
    component=2,
    scalar_bar_args=dict(vertical=True, title_font_size=16),
    lighting=False,
)
plotter.add_axes()
plotter.camera_position = [(10, 9.5, -43), (87.0, 73.5, 123.0), (-0.5, -0.7, 0.5)]
plotter.show()
integrate data

pyvista.DataSetFilters.integrate_data() フィルターを使用して,総流量が計算されます. データは pyvista.UnstructuredGrid オブジェクトで,1 つのポイントと 1 つのセルのみであることに注意してください.

integrated_data = inlet_surface.integrate_data()
integrated_data
HeaderData Arrays
UnstructuredGridInformation
N Cells1
N Points1
X Bounds8.095e+01, 8.095e+01
Y Bounds6.007e+01, 6.007e+01
Z Bounds1.820e+02, 1.820e+02
N Arrays7
NameFieldTypeN CompMinMax
node_valuePointsfloat6410.000e+000.000e+00
simerr_typePointsfloat6411.672e+021.672e+02
densityCellsfloat6411.369e+021.369e+02
normal_velocityCellsfloat6412.580e+012.580e+01
shearstressCellsfloat6419.470e-019.470e-01
velocityCellsfloat643-2.580e+011.285e+00
AreaCellsfloat6412.650e+022.650e+02


積分データ integrated_data の各配列には,積分データが格納されます.

integrated_data["normal_velocity"]
pyvista_ndarray([25.79937191])

AreaVolume の配列が追加されます.

print(f"Original arrays: {inlet_surface.array_names}")
new_arrays = [name for name in integrated_data.array_names if name not in inlet_surface.array_names]
print(f"New arrays      : {new_arrays}")
Original arrays: ['normal_velocity', 'node_value', 'simerr_type', 'density', 'velocity', 'shearstress']
New arrays      : ['Area']

総流量,吸込面面積,平均流速を表示します.

total_flow_rate = integrated_data["normal_velocity"][0]
area = integrated_data["Area"][0]
average_velocity = total_flow_rate / area
print(f"Total flow rate : {total_flow_rate:.1f}")
print(f"Area            : {area:.0f}")
print(f"Average velocity: {average_velocity:.3f}")
Total flow rate : 25.8
Area            : 265
Average velocity: 0.097

体積積分#

また,体積を積分することもできます.ここでは,セルと点のデータを体積全体で効果的に合計します.データセットの体積で割ることで,平均値を計算するのに使うことができます.

計算された体積は pyvista.DataSet.volume と同じであることに注意してください.

また,データセットの中心は積算量の "point" であることに注意してください.

integrated_volume = dataset.integrate_data()
center = integrated_volume.points[0]
volume = integrated_volume['Volume'][0]
mean_density = integrated_volume['density'][0] / volume
mean_velocity = integrated_volume['velocity'][0] / volume

print(f"Center          : {center}")
print(f"Volume          : {volume:.0f}")
print(f"Mean density    : {mean_density:.4f}")
print(f"Mean velocity   : {mean_velocity}")
Center          : [ 90.54132  78.15124 116.79401]
Volume          : 39353
Mean density    : 0.3361
Mean velocity   : [-0.00754452  0.012869   -0.11734917]

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

Sphinx-Galleryによるギャラリー