私は*.pvd
フォーマットに巨大なグリッドを持っています。上記のグリッドを構築する際に、いくつかのセルサイズの仕様が尊重されていることを確認したいと思います。そのためには、(dx、dy、dz)を使用してセルデータ配列を取得する必要があります。
私は最初にParaviewでこれをチェックしようとしましたが、ほとんど成功しませんでした。次にvtk
、以下のコードのように、メッシュをさまざまな形式(vtk、vtu、ex2)でエクスポートし、モジュールを使用してPythonにインポートすることを解決しました。残念ながら、メッシュのサイズはそれを禁止しており、「サイズxのn個のセルを割り当てることができません」というさまざまなエラーメッセージが表示されます。
import vtk
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName("my_mesh.vtu")
reader.Update()
最後に、Paraviewには、グリッドファイルを次のいずれpvd
かのvtk
形式で開くことができるpython-shellがあります。
>>> from paraview.simple import *
>>> my_vtk = OpenDataFile("my_mesh.vtk")
>>> print dir(my_vtk)
このリーダーオブジェクトのメソッドと属性を参照しているにもかかわらず、グリッド上のジオメトリ情報をどこで取得するかについてはわかりません。また、simple
モジュールのドキュメントを閲覧しましたが、頭を悩ませることはできません。
では、paraview.servermanager.LegacyVTKReader
オブジェクトからセルのジオメトリに関する情報を取得するにはどうすればよいでしょうか。
パラビューGUIを介してこれを実現する方法についての手がかり、またはメモリの問題にもかかわらずvtkオブジェクトをpythonvtkにロードするための応急修理も大歓迎です。ぼんやりとした質問で申し訳ありませんが、どこから始めればいいのかよくわかりません...
GetClientSideObject()
(ここを参照)を使用して、ParaviewPythonシェルでVTKオブジェクトを取得できます。その後、すべての通常のVTKPython関数を使用できます。たとえば、ParaviewPythonシェルで次のように記述できます。
>>> from paraview.simple import *
>>> currentSelection = GetActiveSource()
>>> readerObj = currentSelection.GetClientSideObject()
>>> unstructgrid = readerObj.GetOutput()
>>> firstCell = unstructgrid.GetCell(0)
>>> cellPoints = firstCell.GetPoints()
または、ParaViewでプログラマブルフィルタを使用することもできます。これにより、完全なVTK pythonモジュール、さらにはNumPyやその他のモジュールにアクセスできます。プログラム可能なフィルターのスクリプトウィンドウに次のスクリプトを入力できます。
import vtk as v
import numpy as np
inp = self.GetUnstructuredGridInput()
cells = inp.GetCells()
cells.InitTraversal()
cellPtIds = v.vtkIdList()
lenArr = v.vtkDoubleArray()
lenArr.SetNumberOfComponents(3)
lenArr.SetName('CellSize')
while cells.GetNextCell( cellPtIds ):
pts = []
for i in range( cellPtIds.GetNumberOfIds() ):
ptCoords = inp.GetPoint( cellPtIds.GetId(i) )
pts.append( ptCoords )
pts = np.array( pts )
dx = np.max(pts[:,0]) - np.min(pts[:,0])
dy = np.max(pts[:,1]) - np.min(pts[:,1])
dz = np.max(pts[:,2]) - np.min(pts[:,2])
lenArr.InsertNextTuple3(dx, dy, dz)
out = self.GetUnstructuredGridOutput()
out.ShallowCopy( inp )
out.GetCellData().AddArray( lenArr )
Paraviewで、パイプラインで「ProgrammableFilter1」アイコンを選択すると、下のスクリーンショットに示すように、ドロップダウンから新しいセルデータ配列を利用できるようになります。上記のスクリプトを変更して、データをファイルに保存し、外部で分析することができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加