Python实现vtkLagrangianParticleTracker的粒子数据输入问题求助
vtkLagrangianParticleTracker粒子输入配置方法
LPT的粒子源需要携带积分模型要求的属性数组,你可以按照以下步骤生成带随机属性的粒子并接入LPT:
1. 粒子属性要求
你使用的vtkLagrangianMatidaIntegrationModel默认要求粒子源携带以下属性:
Diameter:粒子直径,单位mDensity:粒子密度,单位kg/m³- 可选配置
InitialVelocity:粒子初始速度矢量,不配置则默认继承流场初始位置的速度
2. 完整实现代码示例
import vtk import random # ----- 原有代码保留:流场读取部分和kitchen示例一致 ----- # reader = ... 你的kitchen流场读取代码保持不变 # ----- 新增:生成带随机属性的粒子源 ----- # 生成初始位置随机分布的粒子点 particle_source = vtk.vtkPointSource() particle_source.SetNumberOfPoints(100) # 自定义粒子数量 particle_source.SetCenter(0.05, 0.05, 0) # 初始位置中心,根据你的流场入口调整 particle_source.SetRadius(0.02) # 初始位置的分布半径 particle_source.Update() particle_dataset = particle_source.GetOutput() # 生成粒子直径随机数组:1μm~10μm diameter_arr = vtk.vtkDoubleArray() diameter_arr.SetName("Diameter") # 生成粒子密度随机数组:900kg/m³~1100kg/m³ density_arr = vtk.vtkDoubleArray() density_arr.SetName("Density") # 生成初始速度随机数组:0~0.2m/s各方向随机 init_vel_arr = vtk.vtkDoubleArray() init_vel_arr.SetName("InitialVelocity") init_vel_arr.SetNumberOfComponents(3) point_num = particle_dataset.GetNumberOfPoints() for i in range(point_num): diameter_arr.InsertNextValue(random.uniform(1e-6, 1e-5)) density_arr.InsertNextValue(random.uniform(900, 1100)) init_vel_arr.InsertNextTuple3( random.uniform(0, 0.2), random.uniform(-0.05, 0.05), random.uniform(-0.05, 0.05) ) # 将属性数组写入粒子数据集 particle_dataset.GetPointData().AddArray(diameter_arr) particle_dataset.GetPointData().AddArray(density_arr) particle_dataset.GetPointData().AddArray(init_vel_arr) # ----- LPT配置 ----- paths = vtk.vtkLagrangianParticleTracker() paths.SetInputConnection(reader.GetOutputPort()) # 流场输入 paths.SetSourceData(particle_dataset) # 接入带属性的粒子源 matida = vtk.vtkLagrangianMatidaIntegrationModel() # 配置流场介质属性,示例为常温空气参数 matida.SetFlowDensity(1.204) matida.SetFlowViscosity(1.81e-5) paths.SetIntegrationModel(matida) # 可选:配置积分步长、最大跟踪时间等参数 paths.SetStepFactor(0.5) paths.SetMaximumIntegrationTime(10) paths.Update()
3. 常见配置说明
- 如果你需要适配其他积分模型,只需要按照模型要求的属性名添加对应的数组即可,属性名必须和模型定义的完全一致
- 如果你的流场速度数组名不是默认的
Velocity,可以调用paths.SetInputArrayToProcess(0, 0, 0, vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, "你的速度数组名")指定 - 随机属性的取值范围可以根据你的实际仿真场景调整,比如水雾粒子、粉尘粒子的直径密度范围差异很大
内容的提问来源于stack exchange,提问作者kal
相关产品推荐
相关产品推荐

