запись данных plotOverline csv из paraview для всех временных шагов с помощью скрипта python

Я пытаюсь извлечь данные (как csv) из строки для всех временных шагов с помощью фильтра PlotOverLine в Paraview. В графическом интерфейсе я загружаю файл пены, использую фильтр PlotOverLine и сохраняю представление электронной таблицы как файл 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 создает файл_0 в файл_5.csv, однако в файлах от file_1 до file_4 в качестве данных вместо фактических значений используется «nan». Где as, у file_0 и file_5 есть значения, которые должны быть. Я новичок, не знаю, где я ошибаюсь! Не уверен, обновляется ли временной шаг перед построением данных следующей строки. Любая помощь будет принята с благодарностью! Должен быть более простой способ обновить временные интервалы, а затем использовать тот же фильтр в том же месте, я думаю.


person Thangam    schedule 12.03.2015    source источник


Ответы (3)


Я не пытался увидеть, что происходит с вашим скриптом, но если вам не нужно ничего менять между шагами по времени, вы можете просто установить конвейер один раз, а затем добавить writer.WriteAllTimeSteps = 1. Писатель сам обновит временные шаги и сохранит результаты (цикл for больше не нужен).

В любом случае, вы убедились, что это не проблема с данными? Если вы обновите временной шаг до 2, а затем из графического интерфейса откройте макет электронной таблицы, там ожидаемые данные или nan?

person lib    schedule 12.03.2015
comment
Да, проблема содержит данные для промежуточных временных шагов. Я вижу их, когда делаю то же самое через графический интерфейс и экспортирую csv. Кроме того, я не уверен, где вставить writer.WriteAllTimeSteps = 1 в свой код. - person Thangam; 13.03.2015

Наконец-то мне удалось это исправить. Итак, проблема с предыдущим сценарием заключается в том, что хотя он переходил к следующему временному шагу после завершения 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

Это прекрасно работает!

person Thangam    schedule 13.03.2015

Мне нужны выходные данные в виде одного файла 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)
person Ed Smith    schedule 15.07.2021