ParaViewで平面ベクトル場と流線を、手軽に描画する方法

勉強の記録

オープンソースのデータ可視化ソフト「Paraview」を使って、平面ベクトル場と流線を簡単に描画する作業例を紹介します。

スポンサーリンク

デモ

この記事では可視化ソフトのParaviewを使って、座標を記載したCSVファイルを読み込み、ベクトル場と流線を描画し、以下の図を作成します。

Paraviewとは?

ParaView は2次元および3次元データを可視化するための、高機能な無料オープンソースアプリケーションです。地球規模の気象状況の視覚化など、大規模なデータの処理が可能です。

導入について

導入については、以下の公式サイトからダウンロードし、一般的なソフトと同様にインストールすればOKです。例えばWindowsユーザーなら、ParaView-5.9.1-Windows-Python3.8-msvc2017-64bit.exe(上から二行目:2021/6/5時点)をダウンロードして、実行します。

Download | ParaView

チュートリアルあり

インストール直後は何が何だか状態だったので、チュートリアルのPDFを読んで、簡単な課題をこなし、画面とか操作の雰囲気に慣れるようにしました。

最新版は英語ですが、少し前のバージョンならありがたいことに日本語訳があります。
※以下サイトの、Japanese Translation of the ParaView Tutorial for version 4.2を参照

操作の流れ

操作の流れは、以下の通りです。これから各項目について詳述します。

  • 1.
    CSVファイルを用意する

    格子状の配列を記載します。

  • 2.
    ParaViewに読み込む
  • 3.
    CSVの各点から、新しい配列を作る

    …… 使うフィルタ:Calculator

  • 4.
    グリッドを作る

    …… 使うフィルタ:Table To Structured Grid

  • 5.
    ベクトルの矢を描

    …… 使うフィルタ:Glyph

  • 6.
    流線を描く

    …… 使うフィルタ:Evenly Spaced Streamlines 2D

▼ 動画版も作ってみました。音声入り、9分ほどです。(Youtubeへのリンク

CSVファイルを用意する

CSVファイルを用意します。

このファイルには、平面ベクトル場の各点の座標を格子状に記載しておきます(下図参照)。
このサンプルファイルの範囲は-2から2、間隔は0.4で、121行(1行目の見出しを除く)です。


格子点CSVのサンプル

このCSVファイルは、プログラミング言語のJuliaで作成しました。
格子点が記述できてCSV出力ができれば、エクセルのVBA、Pythonなどソフトは問いません。

▼ Juliaでの格子点の作成について、別記事の中盤にまとめています。

下記の記事ではベクトル場の生成まで行っていますが、格子点だけ作っておけばOKです。後述しますが、ベクトル場はParaviewの計算機能で作ります。

ファイルをParaviewで開く

CSVファイルを開くには、上部のメニューバーのFileOpen→該当するファイルを選択し、OKをクリック。
そして、左したのプロパティパネルのApplyをクリックすると、読み込み完了です。

▼操作の様子です。(gif)

ParaviewでCSVファイルを開く様子

新しい配列をつくる

先ほど読み込んだCSVには、XとY軸の座標の組み合わせを記述しているだけので、その各点のベクトルを記述した、ベクトル場としての配列を新しく作ります。

Calculatorというフィルタを使います。

「フィルタ」とは、取り込んだデータに対して、何らかの処理を行うための仕組みです。(フィルタについての公式ドキュメント

電卓のアイコンをクリックして、数式の記入欄に、基本ベクトルを使って式を入力します。

例として作るベクトル場を

\[\textbf{f}(x,y) = [-y,x]\]

だとすると、

-y*iHat+x*jHat と書けば、格子点の各座標をベクトルとして記述できます。例えば、座標(2,0)だったら、その点のベクトルは[0,2]となり、垂直上向きになります。

また、数式入力欄の上のResult Array Nameには配列名を任意に入れられます。
今回は、デフォルトの Result にしておきました。

入力が終わったらApplyをクリックしたら、設定が確定されます。

▼ Calculatorフィルタについて詳細(ParaViewのWikiです)

ParaView/Users Guide/List of filters - KitwarePublic

グリッドを作る

次に、読み込んだCSVの座標をグリッド(格子状の点)に変換します。
今回はTable To Structured Gridというフィルタを使います。

まず、左上あたりのパイプライン ブラウザ(操作履歴のようなモノ)に注目し、先ほど作ったCalculator1という項目をクリックします。

そして、上部のメニューバーのFiltersSearch→キーボードでta(フィルタ名の頭文字)と入力します。そして、現れた候補のTable To Structured Gridをクリックして、Enterキーで確定します。

▼操作の様子です。(gif)

Table To Structured Gridを呼び出す様子
Table To Structured Gridフィルタを呼び出す様子

するとプロパティパネルにX,Y,Z各軸のポイントの情報を入力する場所が現れるので、入力していきます。今回の仕様は下記だったので……

  • X,Y軸共に範囲は-2~2,間隔は0.4
    →点の数は、11個

プロパティパネルには、以下のように記入します。

  • WholeExtent …… 1、2行目は0 10。Z軸に当たる3行目は0 0
    (※グリッドの数は、ゼロからカウントされるようです。この場合計11点になる)
  • X,Y,Z Column…… それぞれの軸の座標の配列を、リストから選ぶ。X Columnならxを

入力が終わったらApplyをクリックすると、設定が確定されます。

▼ 下図は、Table To Structured Gridフィルタを適用後の様子です。ツールバーの表示プロパティを「Points」にして、点を表示しています。

Table To Structured Gridフィルタを適用後。表示プロパティをPointsにして、表示。
Table To Structured Gridフィルタを適用後の様子。

▼ Table To Structured Gridフィルタについて詳細(ParaViewのWikiです)

ParaView/Users Guide/List of filters - KitwarePublic

矢線を描く

これで準備が整ったので、次は、視覚化作業としてベクトルの矢線を描画します。
Glyphというフィルタを使います。

パイプラインブラウザに注目し、先ほど作ったTableToStructuredGrid 1をクリックしてから、ツールバー上の地球?のようなアイコンをクリックします。

▼そして、プロパティパネルで以下のように設定します。

Orientation ArrayScale Arrayは、先ほどCalculatorフィルタで作った配列を選択して下さい。

Applyで確定すると……

▼こんな感じになりました。

各設定値を変えることで、背景色や線の太さなどの外観や表示状態を変えられます。
例えば、Scale/Scale Factorの数値を変えると、矢線に縮尺を掛けられます。

Scale/Scale Factorを0.5にした様子

これで、最初はCSVの単なる座標の表だったのが、目に見える形になりました。

▼ Glyphフィルタについて詳細(ParaViewのWikiです)

ParaView/Users Guide/List of filters - KitwarePublic

流線を描く

最後は、流線を書きます。Evenly Spaced Streamlines 2Dというフィルタを使います。

上部のメニューバーのFiltersSearch→キーボードでev(フィルタ名の頭文字)と入力します。そして、現れた候補のEvenly Spaced Streamlines 2Dをクリックして、Enterキーで確定します。

するとまた、プロパティパネルに色々と設定する項目が出てきます。
※ もし項目が少なかったら、右上の歯車のアイコンをクリックすると詳細メニューが表示されます。

例えば下図のように設定値を入れてApplyを押すと、早速流線が描画されます。

設定項目が沢山ありますが、最低限Start Positionは指定して下さい。あとはSeparating Distanceなどの値を変えて、見た目を調整していきます。

各設定値の仕組みについては、私は理解しきれていないので、詳しくは次項目で紹介している開発元のブログやドキュメントをご覧ください。

Evenly Spaced Streamlines 2Dのプロパティ

今回のベクトル場は円の方程式を微分した式から作ったので、流線は円になる筈です。下図を見て、正しく描画ができたと判断しました。

流線が描画された様子

▼ 下図は、別のベクトル場を作ってフィルタをかけてみた様子です。

Result=y*iHat-(x-y)*jHat の場合
Result=y*iHat-(x-y)*jHat の場合
Result=1*iHat+x*jHat の場合
Result=1*iHat+x*jHat の場合

Evenly Spaced Streamlines 2D について

このEvenly Spaced Streamlines 2Dというフィルタは、開発元のKitware社のブログで知りました。

▼ 下記のブログです。

Evenly Spaced Streamlines 2D - Kitware Blog
Motivation VTK and ParaView provide visualization of vector fields through streamlines using vtkStreamTracer in VTK or Stream Tracer in ParaView. The ability of...

最低限Start Positionに開始点の座標を入力し、Applyを押せば、自動的に流線が描画されます。
細かい見た目は、Separating Distanceなど流線の密度を決める値で調整していきます。

私はまだ各パラメータの仕組みはまだ十分理解しきれていませんが、今後便利に使えそうです。

Paraviewにはツールバーに最初から出ている「Stream Tracer」という同目的のフィルタもありますが、二次元平面で使うなら、Evenly Spaced Streamlines 2D のほうが使い勝手がよいと思いました。

▼ パラメータについて詳細(ParaViewのgithubのドキュメントです)

paraview.simple.EvenlySpacedStreamlines2D — ParaView/Python 5.9.1 documentation

さいごに

今回のプロット内容はParaview以外のJuliaやPythonなど他の計算環境でも十分に実現できますが、慣れないParaviewに触れるという目的で取り組みました。

「Paraview」は高機能なので習得が億劫に感じてしまい、今まであまり使えていませんでした。
しかしひとまず何かを描画すれば抵抗がなくなってきたので、今後は勉強しながら使う機会を増やそうと思っています。

タイトルとURLをコピーしました