Hi everybody,
I have temporal and spacial data saved from a simulation in vtk files. The dataset consists of almost a million points in the domain, and temporal results of about 1000 timesteps.
I can do the analysis that I will explain below in the Paraview GUI very easily within a couple of minutes, but due to the large number of timesteps I need to automate the process.
To briefly explain the problem, I have cfd results of a flame, which I need to split in 2 pieces based on some criteria and compute the integrals of the heat release for the 2 separate domains separated by the straight line split. I used 2 methods so far but I ran accross some problems.
Method A: Converted the vtk datasets into csv files within Paraview, one csv file for each timestep. Through a python script outside paraview I could do all the computations as explained above, with the only problem that I had to manually set the size of each cell when computing the integrals. My data are Point Data by the way. This is a simple task, if the cells are made by a structured fixed size mesh, but unfortunately this is not the case. So this could be resolved if there was a straightforward method to export the cell size when converting the vtk to csv.
Method B: Tried to complete the whole task within a Paraview python script, which is my preferred method. But since I’m not very comfortable with the different Paraview pathways to go about this, I am a little confused whether I should use a python calculator, a programmable filter, paraview.simple, other libraries of paraview, or any other method. My first problem was how to transform the vtk data into a format that can be easily understood and manipulated with a python script. With some difficulty I could extract some datasets of interest, but not the full matrix of data including the coordinates, so I could do the subsequent calculations. The code is attached below, which stops at the point where I can get the datasets. If I manage to get this part, the remaining calculations are easy for me within python.
from paraview.simple import *
from paraview.vtk.numpy_interface import dataset_adapter as dsa
from paraview.numpy_support import vtk_to_numpy
import numpy as np
#### disable automatic camera reset on 'Show'
paraview.simple._DisableFirstRenderCameraReset()
# INPUT FILES
fileIn = './vtk/file.pvd'
variableName = ['HRR ', 'TEMPE']
# create a new 'PVD Reader'
objectCase = PVDReader(registrationName='file.pvd', FileName=fileIn)
objectCase.PointArrays = variableName
# get animation scene
animationScene1 = GetAnimationScene()
timesteps = objectCase.TimestepValues
d = []
for x in range(0, len(timesteps)):
UpdatePipeline(objectCase.TimestepValues[x])
hrr_range = objectCase.PointData['HRR '].GetRange(0)
vtk_data = servermanager.Fetch(objectCase)
numofvalues = vtk_data.GetPointData().GetArray('HRR ').GetNumberOfValues()
vtk_data = dsa.WrapDataObject(vtk_data)
data = vtk_data.PointData[1]
d.append(data)
data_np = np.vstack(data)
d_np = np.vstack(d)
# OUTPUT FILE
np.savetxt('out.txt', d_np, delimiter='\t', header='Header', comments='#')
Up to the part shown above, I’m trying to retrieve the full dataset. The computations will also be performed within the for loop, so for each pass in the loop I should retain a single row of results, which would represent the results of a single timestep. Am I going in the right direction, or should I use another method?
Any help would be appreciated.