CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   ParaView (http://www.cfd-online.com/Forums/paraview/)
-   -   Extracting ParaView Data into Python Arrays (http://www.cfd-online.com/Forums/paraview/96308-extracting-paraview-data-into-python-arrays.html)

Jeffzda January 19, 2012 02:01

Extracting ParaView Data into Python Arrays
 
Hi all,

When scripting paraview using python, how do I extract raw tuple data from a 'slice' proxy without first exporting to CSV? I used paraview.servermanager.Fetch() function to retrieve the raw data and it looks like the resulting vtk object contains it but I just can't seem to get the actual DATA! Does anyone know what I can do?

Here's what I've done so far:


>>> from paraview.simple import *
>>> File = OpenFOAMReader('file.OpenFOAM')
>>> SliceFile = Slice(File)
>>> DataSliceFile = paraview.servermanager.Fetch(SliceFile)

getting appended
use composite data append
vtkPOpenFOAMReader : [ ...........]
vtkCutter : [ ...........]
vtkReductionFilter : [ ...........]
vtkClientServerMoveData : [ ...........]

>>> print(DataSliceFile)

...
...

Cell Data:
Debug: Off
Modified Time: 113008
Reference Count: 1
Registered Events: (none)
Number Of Arrays: 11
Array 0 name = R
Array 1 name = T
Array 2 name = U
Array 3 name = alphat
Array 4 name = epsilon
Array 5 name = k
Array 6 name = kappat
Array 7 name = magT
Array 8 name = nut
Array 9 name = p
Array 10 name = p_rgh
Number Of Components: 18
Number Of Tuples: 400
Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 )
Interpolate Flags: ( 1 1 1 1 1 0 0 1 )
Pass Through Flags: ( 1 1 1 1 1 1 1 1 )

...
...

Above is only part of the output to the 'print' command but as you can see there are tuples there for the taking! 400 of them. Can anyone help me get to them?

Thanks is advance,

Jeff

linnemann January 19, 2012 02:44

Hi

Try this

Code:

numCells = DataSliceFile.GetNumberOfCells()

data=[]
for x in range(numCells):
    data.append(DataSliceFile.GetCellData().GetArray('p').GetValue(x))

print data

or this

Code:

numCells = DataSliceFile.GetNumberOfCells()
new=DataSliceFile.CellData['p']

data=[]
for x in range(numCells):
    data.append(new[x])

print data

It depends on how the data is stored, if its a vtkMultiBlockDataSet or vtkDataSet. This is at least how I get my data.

if DataSliceFile is vtkMultiBlockDataSet then you might need to do some GetBlock(0) thing http://www.vtk.org/doc/nightly/html/...ckDataSet.html

This can also give some inspiration.

http://www.vtk.org/doc/nightly/html/...loatArray.html

http://www.vtk.org/Wiki/Python_Programmable_Filter

http://paraview.org/Wiki/ParaView/Python_Scripting

eelcovv January 23, 2012 06:02

accessing vtk data array example in pvbatch
 
1 Attachment(s)
Hy,
I don't know if the post above already answers your question, but here a script I wrote a while ago which I used to obtain the mimumum Uz value plus the position of this minimum over a plane per time step and export these values. Those pvbatch commands to access the data arrays are not very well documented, so perhaps you can get some inspiration by it.

Regards
Eelco

eric_albin December 5, 2012 13:05

1 Attachment(s)
I must be very ignorant but I still do not succeed to do a simple script to access to some points of a data stored in a vts file!
Here is what I try to do :
Code:

r = OpenDataFile("THI2D_0000.vts")
r.UpdatePipeline()
pdi = r.PointData
print 'len(pdi):', len(pdi)
ai = pdi[2]
print "Range:", pdi[1].Name
for n in range(pdi.GetNumberOfArrays()):
  print pdi.GetArray(n).GetName(), ' ',
  pdi.GetArray(n).GetRange()
for n in range(pdi.NumberOfArrays):
  print pdi[n].Name, ' ', pdi[n].GetRange()
for k, v in pdi.iteritems():
  print k, v.GetRange()

This just gives me access to the "names" and the "ranges" of the arrays :
p, li { white-space: pre-wrap; } len(pdi): 3
Range: U2
U1 U2 Vort U1 (-0.27383780094, 0.24077918789)
U2 (-0.227040989, 0.28179814685)
Vort (0.00085531204979, 9.2079403574)
U1 (-0.27383780094, 0.24077918789)
U2 (-0.227040989, 0.28179814685)
Vort (0.00085531204979, 9.2079403574)

How can I access to the number of points and to the 10th value of U1 for instance?
Please...

linnemann December 6, 2012 02:02

Hi

Did this on a windows machine with the python programmable filter inside paraview.

Code
Code:

pdi = self.GetInput()
inn=pdi.GetPointData()
numPoints=pdi.GetNumberOfPoints()
print numPoints
U10=inn.GetArray("U1").GetValue(10)
print U10

Output
Code:

1600
-0.053845824021

You should be able to change this to fit your script.

Also extensive use of python object inspector
Code:

print dir(pdi)
will print all the calls available to the object pdi.

Hope this helps

eric_albin December 6, 2012 03:49

Dear Linnemann,

Thank you so much for your post.
This really helps me a lot.

In fact, the script you gave works perfectly inside the programmable filter but do not work inside the python shell :

Traceback (most recent call last):
File "<string>", line 33, in <module>
NameError: name 'self' is not defined

This is a normal issue according to these links :
http://www.paraview.org/Wiki/ParaVie...Python_Filters
http://comments.gmane.org/gmane.comp...iew.user/11839

In fact, if I use your command "" inside a python shell, I have only these classes available for pdi :

['FieldData', 'GetArray', 'GetFieldData', 'GetNumberOfArrays', 'NumberOfArrays', 'OutputPort', 'Proxy', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'has_key', 'items', 'iteritems', 'keys', 'values']


I will then try to do the job I have to do inside the programmable filter...
Thanks a lot, Eric

linnemann December 6, 2012 06:10

Hi

Here is some code that works in the pvPython script environment.

Code:

from paraview.simple import *

r = OpenDataFile("THI2D_0000.vts")
r.SMProxy.UpdatePipeline(0) # If dealing with multiple times
r.UpdatePipelineInformation()

data = servermanager.Fetch(r) #I think this was the only one missing in your original to get the actual data.

numPoints=data.GetNumberOfPoints()
print numPoints

U10=data.GetPointData().GetArray("U1").GetValue(10)
print U10

Output
Code:

1600
-0.053845824021


eric_albin December 6, 2012 09:10

Thank you very much again.
This works perfectly in a python shell. With your indications, I can now compute anything I want like the rms fluctuation of velocities both in the programmable filter or directly in the python shell.

I hope this will be useful for other users on the web because this is not straightforward for beginners in python.
a nice day,
Eric


All times are GMT -4. The time now is 15:58.