同じ構造を持つ2つの異なるVTKファイルに保存された2つのフィールド間の数値の差を計算するにはどうすればよいですか?


14

構造化されたグリッド形式の2つのVTKファイルがあるとします。構造化されたグリッドは同じであり(同じ順序で同じポイントのリストを持っています)、各VTKファイルに「Phi」と呼ばれるフィールドがあります。同じ構造のグリッドを使用して、3番目のVTKファイルを作成し、最初のVTKファイルのPhiと2番目のVTKファイルのPhiの差であるフィールドをプロットします。

これを手動で行う方法を知っています。2つのVTKファイルの未加工テキストを解析し、データを配列にコピーし、一方の配列を他方から減算し、正しい形式のデータを新しいファイルにダンプできます。この差を計算してVTKにエクスポートするより良い方法はありますか?Python、またはVisItやParaviewのような視覚化ソフトウェアのソリューションは、C ++のようなコンパイルされた言語を使用するよりも望ましいでしょう。

この差を計算する目的は、PDEの解を計算するためのさまざまな数値手法を比較することです。同じソフトウェアを使用してソリューションを生成しているため、生成する各ファイルでフィールドPhiを除くすべてのデータが同じになることを保証できます。


この質問を投稿したのは、答えを見つけるのに1日半ほどかかったからです。昨日見つけなかったら、とにかくここでこの質問をしたでしょう。同じタスクを達成する他の迅速な方法があるかどうかを確認することに興味があります。
ジェフオックスベリー

「生のテキストを解析する」と言うとき、文字通りファイルに入るか、Pythonパーサーを使用しますか?
SAAD 14

当時、私はPythonパーサーを手で書くことを意味していました。
ジェフオックスベリー

回答:


15

同じ構造のグリッドを持つ異なるVTKファイルから2つのフィールドを減算する最も簡単な方法は、Paraviewでプログラム可能なフィルターを使用することです。これにより、Pythonスクリプトを使用してデータを操作できます。

プログラム可能なフィルターダイアログボックスで、2つの配列を減算し、コードで出力に書き込むことができます。

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

この場合、フィールドPhiはたまたまセルデータです。フィールドがポイントデータの場合CellData、スクリプト内のすべての場所をに置き換えますPointData。詳細については、http://public.kitware.com/pipermail/paraview/2010-April/016667.htmlを参照してください。


4
2つの入力(inputs [0]とinputs [1])があることを思い出すのは、決してやり過ぎではありません。プログラム可能なフィルターを選択する前に、両方のデータセットを強調表示する必要があります。
-toliveira

3

ParaViewには、これに使用できるAppend Attributesフィルターがあります。ポイントデータを適切に追加するには、同じ数のポイントがデータセット内にあり、セルデータを適切に追加するには、同じ数のセルがデータセット内にある必要があります。同じ名前の配列(例ではPhi)では問題が発生します。ただし、属性の追加フィルターを使用する前に、電卓フィルターを使用してその配列を簡単にコピーできます。次に、別の電卓フィルターを使用して減算を実行できます。ただし、これはおそらく、ParaViewのPythonプログラマブルフィルターを使用するよりも効率的ではありません。それに加えて、グリッドとその属性の両方に直接アクセスできるため、vtkpython実行可能ファイルを使用して手動で実行できます。


1

特に良い方法はありませんが、「phi」フィールドを1つのVTKファイルから別のVTKファイルにコピーし、「phiprime」などの名前を付けます。ParaviewとVisitの両方で、他のフィールドの値を使用する式によって新しいフィールドを定義するオプションがあります。次に、フィールドエディタでフィールド「エラー」を「error = phi-phiprime」として定義し、このフィールド「エラー」を表面、等高線プロット、または興味のあるものとしてプロットできます。

あるファイルから別のファイルにデータのブロックをコピーする手順は明らかに厄介ですが、私が思いつくのは最善です。


1

これは少し古いことに気付きましたが、VisItソリューションに興味があるかもしれませんが:

これは、VisItで、Connectively Based Cross Mesh Field Expressionと呼ばれるものを使用して実行できます。これは一口ですが、基本的にはデータベース(フィールドの場合はVTKファイル)間でフィールドをマッピングするための機械です。

「接続ベース」(conn_cmfe)は、トポロジーがファイル間で同じ場合に使用されます-あなたの場合のように。

また、トポロジが異なるメッシュ間でサンプリングする「位置ベース」(pos_cmfe)もあります。

あなたの場合、最初のファイルを開き、Expressionsウィンドウを使用して式(MyPhi_Diff)を定義します。

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

次に、疑似カラープロットで「MyPhi_Diff」をプロットできます。

式の定義に役立つウィザードもあります

(オプションメニュー->「データレベル比較」)

詳細は次のとおりです。

http://visitusers.org/index.php?title=Cmfe

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.