[Paraview] Python scripting/Grid geometry transformation
Felipe Bordeu
felipe.bordeu at ec-nantes.fr
Mon Apr 8 03:30:44 EDT 2013
Look in Google some presentations about vtk to understand how vtk handle
the different types of datasets (Uniform Rectilinear Grids, Unstructured
Grid...).
Some filters in Paraview change the type of the dataset, this implies
sometimes some memory penalty.
One way to see this phenomena is to create a Wavelet (Sources menu),
look the information panel (type: Uniform Rectilinear Grid), type and
memory.
And then apply a CleanToGrid to generate a Unstructured Grid (so we can
move the points).
Felipe
Le 05/04/2013 19:36, Nikolaos Beratlis a écrit :
> So I have done the following test. I have created a xmf file of a grid
> in cylindrical coordinates "grid3d_cyl.xmf" specified as Topology Type
> 3DSMesh and Geometry Type XYZ. That is a full 3D array is written:
>
> <?xml version="1.0" ?>
> <!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
> <Xdmf Version="2.2">
> <Domain>
> <Grid GridType="Uniform">
> <Topology TopologyType="3DSMesh" Dimensions=" 30 70 40"/>
> <Geometry GeometryType="XYZ">
> <DataItem Dimensions="84000 3" NumberType="Float" Precision="4"
> Format="XML">
> ....
> ....
> ....
> </DataItem>
> </Geometry>
> </Grid>
> </Domain>
> </Xdmf>
>
> The grid is 30x70x40 and the file "grid3d_cyl.xmf" is 15.8 MB large.
> When I read this into Paraview the information windows shows it uses
> 0.98MB of memory.
>
> I then create a grid in cartesian coordinates "grid3d_car" specified
> as Topology Type 3DRectMesh and Geometry Type VXVYVZ. Here instead of
> the full 3D array I write thee 1D arrays, one for each coordinates.
> The file looks like:
>
> <?xml version="1.0" ?>
> <!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
> <Xdmf Version="2.2">
> <Domain>
> <Grid GridType="Uniform">
> <Topology TopologyType="3DRectMesh" Dimensions=" 30 70 40"/>
> <Geometry GeometryType="VXVYVZ">
> <DataItem Dimensions=" 40" NumberType="Float" Precision="4"
> Format="XML">
> 0.0000 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000
> 8.0000 9.0000 10.0000 11.0000 12.0000 13.0000 14.0000
> 15.0000 16.0000 17.0000 18.0000 19.0000 20.0000 21.0000
> 22.0000 23.0000 24.0000 25.0000 26.0000 27.0000 28.0000
> 29.0000 30.0000 31.0000 32.0000 33.0000 34.0000 35.0000
> 36.0000 37.0000 38.0000 39.0000
> </DataItem>
> <DataItem Dimensions=" 70" NumberType="Float" Precision="4"
> Format="XML">
> 0.0000 0.0911 0.1821 0.2732 0.3642 0.4553 0.5464 0.6374
> 0.7285 0.8195 0.9106 1.0017 1.0927 1.1838 1.2748
> 1.3659 1.4570 1.5480 1.6391 1.7302 1.8212 1.9123 2.0033
> 2.0944 2.1855 2.2765 2.3676 2.4586 2.5497 2.6408 2.7318
> 2.8229 2.9139 3.0050 3.0961 3.1871 3.2782 3.3692 3.4603
> 3.5514 3.6424 3.7335 3.8245 3.9156 4.0067 4.0977 4.1888
> 4.2799 4.3709 4.4620 4.5530 4.6441 4.7352 4.8262
> 4.9173 5.0083 5.0994 5.1905 5.2815 5.3726 5.4636 5.5547
> 5.6458 5.7368 5.8279 5.9189 6.0100 6.1011 6.1921 6.2832
> </DataItem>
> <DataItem Dimensions=" 30" NumberType="Float" Precision="4"
> Format="XML">
> 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000
> 9.0000 10.0000 11.0000 12.0000 13.0000 14.0000 15.0000
> 16.0000 17.0000 18.0000 19.0000 20.0000 21.0000 22.0000
> 23.0000 24.0000 25.0000 26.0000 27.0000 28.0000 29.0000 30.0000
> </DataItem>
> </Geometry>
> </Grid>
> </Domain>
> </Xdmf>
>
> The gris is still 30x70x40 but the file "grid3d_car.xmf" is more
> compact, it is only 2.2 KB in size. When I read it into Paraview the
> information windows shows it uses only 0.003MB. So far so good, I end
> up saving space both on the hard drive and in memory.
>
> I then convert the cartesian grid to cylindrical coordinates using the
> CleantoGrid Filter and also a programmable Filter:
>
> pdi = self.GetInput()
>
> pdo = self.GetOutput()
>
> newPoints = vtk.vtkPoints()
>
> numPoints = pdi.GetNumberOfPoints()
>
> for i in range(0, numPoints):
>
> coord = pdi.GetPoint(i)
>
> x, y, z = coord[:3]
>
> r = x * cos(y)
>
> t = x * sin(y)
>
> newPoints.InsertPoint(i, r, t, z)
>
> pdo.SetPoints(newPoints)
>
>
> The information window in Paraview shows that The CleanToGrid Filter
> uses 7.2 MB and the ProgrammableFilter another 7.1MB so in total the
> cartesian to cylindrical conversion uses 14.3 MB. That's a huge memory
> penalty. Here's a summary:
>
>
> File Size Memory
>
> grid3d_cyl.xmf 15.8MB 0.98MB
>
> grid3d_car.xmf 2.2KB 0.003MB
> CleanToGrid - 7.2MB
> Programmable - 7.1MB
>
> Since both grids contain the exact same coordinate information I would
> expect the approach of converting the grid from cartesian to
> cylindrical to not take more than 0.98MB of memory, instead it takes
> 14.3MB. Does it make any sense? Am I doing sth wrong? Can I avoid the
> memory penalty?
>
> Thank you,
>
> Nikos
>
>
> On Fri, Apr 5, 2013 at 3:48 AM, Felipe Bordeu
> <felipe.bordeu at ec-nantes.fr <mailto:felipe.bordeu at ec-nantes.fr>> wrote:
>
> By "pipelines", I think you want to say "filters". I do not know
> how to delete intermediary results.
> One way is to apply a filter and then save the result ("File"->
> "Save Data"). So you can open it later without the deed to
> recreate the hole pipeline.
>
> Felipe
>
> Le 04/04/2013 19:51, Nikolaos Beratlis a écrit :
>> Hi Felipe,
>>
>> When I try this script to transform from cartesian to cylindrical
>> coordinates after I have applied the CleantoGrid Filter:
>>
>> pdi = self.GetInput()
>> pdo = self.GetOutput()
>> newPoints = vtk.vtkPoints()
>> numPoints = pdi.GetNumberOfPoints()
>> for i in range(0, numPoints):
>> coord = pdi.GetPoint(i)
>> x, y, z = coord[:3]
>> r = x * cos(y)
>> t = x * sin(y)
>> newPoints.InsertPoint(i, r, t, z)
>> pdo.SetPoints(newPoints)
>> pdo.GetPointData().AddArray(pdi.GetPointData().GetArray(0))
>> pdo.GetPointData().AddArray(pdi.GetPointData().GetArray(1))
>> pdo.GetPointData().AddArray(pdi.GetPointData().GetArray(2))
>>
>> it creates two more pipelines, one for CleantoGrid and one for
>> Programmable Filter. Both pipelines are linked to the original
>> pipeline and both pipelines require the same memory as the
>> original pipeline. Is there a way to to delete the previous two
>> pipelines (original with cartesian coordinates and cleantoGrid)
>> so that I only use one memory amount and not three?
>>
>> Nikos
>>
>>
>> On Wed, Apr 3, 2013 at 12:05 PM, Felipe Bordeu
>> <felipe.bordeu at ec-nantes.fr <mailto:felipe.bordeu at ec-nantes.fr>>
>> wrote:
>>
>> you need to copy the point data: add this line to the end of
>> your script:
>>
>> pdo.GetPointData().AddArray(pdi.GetPointData().GetArray(0))
>>
>>
>> this will work only for one field, you can put this line
>> inside a loop to add all the pointdata.
>>
>> Felipe
>>
>> Le 03/04/2013 17:59, Nikolaos Beratlis a écrit :
>>> I did and it shows me the transformed grid, but the
>>> ProgrammableFilter doesn't contain the variable var. I
>>> cannot plot contours. Should I change the script?
>>>
>>>
>>> On Wed, Apr 3, 2013 at 11:48 AM, Felipe Bordeu
>>> <felipe.bordeu at ec-nantes.fr
>>> <mailto:felipe.bordeu at ec-nantes.fr>> wrote:
>>>
>>> You must apply the programmablefilter to the cleantoGrid
>>> not to the var3d.xmf.
>>>
>>> look at the screenshot.
>>>
>>> Felipe
>>>
>>>
>>>
>>> Le 03/04/2013 17:43, Nikolaos Beratlis a écrit :
>>>> Hi Felipe,
>>>>
>>>> I applied the CleanToGrid Filter first and then applied
>>>> the following script:
>>>>
>>>>
>>>> pdi = self.GetInput()
>>>>
>>>> pdo = self.GetOutput()
>>>>
>>>> newPoints = vtk.vtkPoints()
>>>>
>>>> numPoints = pdi.GetNumberOfPoints()
>>>>
>>>> for i in range(0, numPoints):
>>>>
>>>> coord = pdi.GetPoint(i)
>>>>
>>>> x, y, z = coord[:3]
>>>>
>>>> r = x * cos(y)
>>>>
>>>> t = x * sin(y)
>>>>
>>>> newPoints.InsertPoint(i, r, t, z)
>>>>
>>>> pdo.SetPoints(newPoints)
>>>>
>>>>
>>>> Notice the indentation and also the change of the
>>>> cos(y) and sin(y) assignments.
>>>>
>>>> but I got this error:
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>> File "<string>", line 26, in <module>
>>>>
>>>> File "<string>", line 12, in RequestData
>>>>
>>>> AttributeError: SetPoints
>>>>
>>>>
>>>> What am I doing wrong?
>>>>
>>>>
>>>> On Wed, Apr 3, 2013 at 11:13 AM, Felipe Bordeu
>>>> <felipe.bordeu at ec-nantes.fr
>>>> <mailto:felipe.bordeu at ec-nantes.fr>> wrote:
>>>>
>>>> apply a CleanToGrid filter before the python
>>>> programmable filter and this is a corrected version
>>>> of your script:
>>>>
>>>> pdi = self.GetInput()
>>>>
>>>> pdo = self.GetOutput()
>>>>
>>>> newPoints = vtk.vtkPoints()
>>>>
>>>> numPoints = pdi.GetNumberOfPoints()
>>>>
>>>> for i in range(0, numPoints):
>>>>
>>>> coord = pdi.GetPoint(i)
>>>>
>>>> x, y, z = coord[:3]
>>>>
>>>> r = x * sin(y)
>>>>
>>>> t = x * cos(y)
>>>>
>>>> newPoints.InsertPoint(i, r, t, z)
>>>>
>>>> pdo.SetPoints(newPoints)
>>>>
>>>>
>>>>
>>>> Felipe
>>>>
>>>> Le 03/04/2013 04:55, Nikolaos Beratlis a écrit :
>>>>> Hi,
>>>>>
>>>>> I am reading the following xmf file (attached as
>>>>> var3d.xmf) into Paraview:
>>>>>
>>>>> <?xml version="1.0" ?>
>>>>> <!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
>>>>> <Xdmf Version="2.2">
>>>>> <Domain>
>>>>> <Grid GridType="Uniform">
>>>>> <Topology TopologyType="3DRectMesh" Dimensions="
>>>>> 2 4 3"/>
>>>>> <Geometry GeometryType="VXVYVZ">
>>>>> <DataItem Dimensions=" 3" NumberType="Float"
>>>>> Precision="4" Format="XML">
>>>>> 0.0000 1.0000 2.0000
>>>>> </DataItem>
>>>>> <DataItem Dimensions=" 4" NumberType="Float"
>>>>> Precision="4" Format="XML">
>>>>> 0.0000 2.0944 4.1888
>>>>> <tel:2.0944%20%C2%A0%204.1888> 6.2832
>>>>> </DataItem>
>>>>> <DataItem Dimensions=" 2" NumberType="Float"
>>>>> Precision="4" Format="XML">
>>>>> 1.0000 2.0000
>>>>> </DataItem>
>>>>> </Geometry>
>>>>> <Attribute Name="var" AttributeType="Scalar"
>>>>> Center="Node">
>>>>> <DataItem Dimensions="24" NumberType="Float"
>>>>> Precision="4" Format="XML">
>>>>> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
>>>>> 20 21 22 23
>>>>> </DataItem>
>>>>> </Attribute>
>>>>> </Grid>
>>>>> </Domain>
>>>>> </Xdmf>
>>>>>
>>>>> The grid is a 3D orthogonal grid read in cartesian
>>>>> coordinates (see attached image showing grid and
>>>>> contours of variable). I then want to transform
>>>>> the grid from cartesian to cylindrical
>>>>> coordinates. I tried using the following Python
>>>>> script:
>>>>>
>>>>> pdi = self.GetPolyDataInput()
>>>>>
>>>>> pdo = self.GetPolyDataOutput()
>>>>>
>>>>> newPoints = vtk.vtkPoints()
>>>>>
>>>>> numPoints = pdi.GetNumberOfPoints()
>>>>>
>>>>> for i in range(0, numPoints):
>>>>>
>>>>> coord = pdi.GetPoint(i)
>>>>>
>>>>> x, y, z = coord[:3]
>>>>>
>>>>> r = x * sin(y)
>>>>>
>>>>> t = x * cos(y)
>>>>>
>>>>> newPoints.InsertPoint(i, r, t, z)
>>>>>
>>>>> pdo.SetPoints(newPoints)
>>>>>
>>>>>
>>>>> with Output Data Set Type chosen to be the Same as
>>>>> Input, but I get this error:
>>>>>
>>>>>
>>>>> Traceback (most recent call last):
>>>>> File "<string>", line 26, in <module>
>>>>> File "<string>", line 12, in RequestData
>>>>> AttributeError: 'NoneType' object has no attribute
>>>>> 'SetPoints'
>>>>>
>>>>> I have no experience with Python scripting. What
>>>>> am I doing wrong?
>>>>>
>>>>> Thank you,
>>>>>
>>>>> Nikos
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Powered bywww.kitware.com <http://www.kitware.com>
>>>>>
>>>>> Visit other Kitware open-source projects athttp://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Please keep messages on-topic and check the ParaView Wiki at:http://paraview.org/Wiki/ParaView
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://www.paraview.org/mailman/listinfo/paraview
>>>>
>>>>
>>>> --
>>>> Felipe Bordeu Weldt
>>>> Ingénieur de Recherche
>>>> -------------------------------------
>>>> Tél. :33 (0)2 40 37 16 <tel:33%20%280%292%2040%2037%2016> 57
>>>> Fax. :33 (0)2 40 74 74 <tel:33%20%280%292%2040%2074%2074> 06
>>>> Felipe.Bordeu at ec-nantes.fr <mailto:Felipe.Bordeu at ec-nantes.fr>
>>>> Institut GeM - UMR CNRS 6183
>>>> École Centrale Nantes
>>>> 1 Rue de La Noë, 44321 Nantes, FRANCE
>>>> -------------------------------------
>>>>
>>>>
>>>> _______________________________________________
>>>> Powered by www.kitware.com <http://www.kitware.com>
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Please keep messages on-topic and check the
>>>> ParaView Wiki at: http://paraview.org/Wiki/ParaView
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.paraview.org/mailman/listinfo/paraview
>>>>
>>>>
>>>
>>>
>>> --
>>> Felipe Bordeu Weldt
>>> Ingénieur de Recherche
>>> -------------------------------------
>>> Tél. :33 (0)2 40 37 16 <tel:33%20%280%292%2040%2037%2016> 57
>>> Fax. :33 (0)2 40 74 74 <tel:33%20%280%292%2040%2074%2074> 06
>>> Felipe.Bordeu at ec-nantes.fr <mailto:Felipe.Bordeu at ec-nantes.fr>
>>> Institut GeM - UMR CNRS 6183
>>> École Centrale Nantes
>>> 1 Rue de La Noë, 44321 Nantes, FRANCE
>>> -------------------------------------
>>>
>>>
>>> _______________________________________________
>>> Powered by www.kitware.com <http://www.kitware.com>
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the ParaView
>>> Wiki at: http://paraview.org/Wiki/ParaView
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.paraview.org/mailman/listinfo/paraview
>>>
>>>
>>
>>
>> --
>> Felipe Bordeu Weldt
>> Ingénieur de Recherche
>> -------------------------------------
>> Tél. :33 (0)2 40 37 16 <tel:33%20%280%292%2040%2037%2016> 57
>> Fax. :33 (0)2 40 74 74 <tel:33%20%280%292%2040%2074%2074> 06
>> Felipe.Bordeu at ec-nantes.fr <mailto:Felipe.Bordeu at ec-nantes.fr>
>> Institut GeM - UMR CNRS 6183
>> École Centrale Nantes
>> 1 Rue de La Noë, 44321 Nantes, FRANCE
>> -------------------------------------
>>
>>
>> _______________________________________________
>> Powered by www.kitware.com <http://www.kitware.com>
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the ParaView Wiki at:
>> http://paraview.org/Wiki/ParaView
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.paraview.org/mailman/listinfo/paraview
>>
>>
>
>
> --
> Felipe Bordeu Weldt
> Ingénieur de Recherche
> -------------------------------------
> Tél. :33 (0)2 40 37 16 <tel:33%20%280%292%2040%2037%2016> 57
> Fax. :33 (0)2 40 74 74 <tel:33%20%280%292%2040%2074%2074> 06
> Felipe.Bordeu at ec-nantes.fr <mailto:Felipe.Bordeu at ec-nantes.fr>
> Institut GeM - UMR CNRS 6183
> École Centrale Nantes
> 1 Rue de La Noë, 44321 Nantes, FRANCE
> -------------------------------------
>
>
> _______________________________________________
> Powered by www.kitware.com <http://www.kitware.com>
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ParaView Wiki at:
> http://paraview.org/Wiki/ParaView
>
> Follow this link to subscribe/unsubscribe:
> http://www.paraview.org/mailman/listinfo/paraview
>
>
--
Felipe Bordeu Weldt
Ingénieur de Recherche
-------------------------------------
Tél. : 33 (0)2 40 37 16 57
Fax. : 33 (0)2 40 74 74 06
Felipe.Bordeu at ec-nantes.fr
Institut GeM - UMR CNRS 6183
École Centrale Nantes
1 Rue de La Noë, 44321 Nantes, FRANCE
-------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.paraview.org/pipermail/paraview/attachments/20130408/4422b09c/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/png
Size: 112018 bytes
Desc: not available
URL: <http://www.paraview.org/pipermail/paraview/attachments/20130408/4422b09c/attachment-0001.png>
More information about the ParaView
mailing list