使用 python 脚本从 paraview 为所有时间步写入 plotOverline csv 数据

writing plotOverline csv data from paraview for all time steps with python script

我正在尝试使用 Paraview 中的 PlotOverLine 过滤器从所有时间步长的一行中提取数据(作为 csv)。在 GUI 中,我加载泡沫文件,使用 PlotOverLine 过滤器并将传播 sheet 视图保存为 csv 文件,然后单击动画面板中的下一步按钮以加载下一个时间步长并在剩余时间内重复上述操作步骤在线源的相同位置。(由于它的瞬态数据,我需要在固定位置的所有时间步骤的数据。)我使用了以下脚本。

try: paraview.simple    
except: from paraview.simple import *
paraview.simple._DisableFirstRenderCameraReset()

my_foam = FindSource("case.foam") #loading my case file
SetActiveSource(my_foam)
tsteps = my_foam.TimestepValues # trying to read all time step directories
for TimeStepNum in range(0,len(tsteps)): # the loop?
  view = GetActiveView()
  view.ViewTime = tsteps[TimeStepNum]
  Render()

  PlotOverLine1 = PlotOverLine( Source="High Resolution Line Source" )
  DataRepresentation7 = Show()

  PlotOverLine1.Source.Point1 = [-0.052, 0.0, 0.0] #my fixed location
  PlotOverLine1.Source.Point2 = [0.0, 0.0, 0.0]
  source = PlotOverLine1
  writer = CreateWriter("file_%d.csv" %(TimeStepNum), source)
  writer.FieldAssociation = "Points"
  writer.UpdatePipeline()
  Render()
  del writer

说如果我有 5 个时间步长,当 运行 作为 Paraview 上的宏时,脚本会生成 file_0 到 file_5.csv 然而,file_1 到 file_4 将 'nan' 作为数据而不是实际值。其中,file_0 和 file_5 具有应有的值。我是一个新手,不知道哪里出错了!在绘制下一行数据之前不确定时间步长是否得到更新。任何帮助将不胜感激!应该有一种更简单的方法来更新时间步长,然后在我猜的相同位置使用相同的过滤器。

我没有尝试查看您的脚本会发生什么,但是如果您不需要在时间步长之间更改任何内容,您可以只设置一次管道,然后添加 writer.WriteAllTimeSteps = 1 。编写器将自行更新时间步长并保存结果(您不再需要 for 循环)。

不管怎样,你确定这不是数据的问题吗?如果您将时间步长更新为 2,然后从 GUI 打开电子表格布局,是否存在预期数据或 nan?

我终于成功了。因此,上一个脚本的问题在于,虽然它在 PlotOverLine 完成后继续进入下一个时间步,但它试图在该线内选择一条线。我只是调整了时间循环发生的方式,首先创建一条固定线,然后循环剩余的时间步长(这是应该如何完成的!)。 工作脚本:

try: paraview.simple
except: from paraview.simple import *
paraview.simple._DisableFirstRenderCameraReset()

my_foam = FindSource("case.foam")
SetActiveSource(my_foam)

tsteps = my_foam.TimestepValues
PlotOverLine1 = PlotOverLine( Source="High Resolution Line Source" )
DataRepresentation7 = Show()

PlotOverLine1.Source.Point1 = [-0.052, 0.0, 0.0]
PlotOverLine1.Source.Point2 = [0.0, 0.0, 0.0]

source = PlotOverLine1

for TimeStepNum in range(0,len(tsteps)):
    view = GetActiveView()
    view.ViewTime = tsteps[TimeStepNum]
    Render()
    writer = CreateWriter("file_%d.csv" %(TimeStepNum), source)
    writer.FieldAssociation = "Points"
    writer.UpdatePipeline()
    Render()
    del writer

这非常有效!

我想将输出数据作为单个 csv 文件,并且我想获得速度“U”的单个分量。这需要做更多的工作才能以数组格式获取数据,因此我将代码包含在此处以防它对任何人有用

from paraview.simple import *
import csv

paraview.simple._DisableFirstRenderCameraReset()

my_foam = FindSource("airFoil2D.OpenFOAM")
SetActiveSource(my_foam)

tsteps = my_foam.TimestepValues
line = PlotOverLine( Source="High Resolution Line Source" )
DataRepresentation7 = Show()

line.Source.Point1 = [5, 4., 0.025]
line.Source.Point2 = [18., 4.0, 0.025]
line.Source.Resolution = 50
component = 0

with open('file.csv', 'w') as f:
    writer = csv.writer(f)
    for TimeStepNum in range(0,len(tsteps)):
        view = GetActiveView()
        view.ViewTime = tsteps[TimeStepNum]
        Render()
        fetchData = paraview.servermanager.Fetch(line)
        pointData = fetchData.GetPointData()
        fieldData = pointData.GetArray("U")
        U = [fieldData.GetComponent(i,component) for i in range(fieldData.GetSize()/3)]
        writer.writerow(U)