オープンソースのデータ可視化ソフト「Paraview」を使って、平面ベクトル場と流線を簡単に描画する作業例を紹介します。
デモ
この記事では可視化ソフトのParaviewを使って、座標を記載したCSVファイルを読み込み、ベクトル場と流線を描画し、以下の図を作成します。
Paraviewとは?
ParaView は2次元および3次元データを可視化するための、高機能な無料オープンソースアプリケーションです。地球規模の気象状況の視覚化など、大規模なデータの処理が可能です。
- 公式サイトのギャラリーに写真付きで、視覚化の例が色々掲載されています。
- 営利目的でも無料で使用できます。詳しいライセンスについてhttps://www.paraview.org/paraview-license/
導入について
導入については、以下の公式サイトからダウンロードし、一般的なソフトと同様にインストールすればOKです。例えばWindowsユーザーなら、ParaView-5.9.1-Windows-Python3.8-msvc2017-64bit.exe
(上から二行目:2021/6/5時点)をダウンロードして、実行します。
チュートリアルあり
インストール直後は何が何だか状態だったので、チュートリアルの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での格子点の作成について、別記事の中盤にまとめています。
ファイルをParaviewで開く
CSVファイルを開くには、上部のメニューバーのFile→Open→該当するファイルを選択し、OKをクリック。
そして、左したのプロパティパネルのApplyをクリックすると、読み込み完了です。
▼操作の様子です。(gif)
新しい配列をつくる
先ほど読み込んだ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です)
グリッドを作る
次に、読み込んだCSVの座標をグリッド(格子状の点)に変換します。
今回はTable To Structured Gridというフィルタを使います。
まず、左上あたりのパイプライン ブラウザ(操作履歴のようなモノ)に注目し、先ほど作ったCalculator1という項目をクリックします。
そして、上部のメニューバーのFilters→Search→キーボードでta(フィルタ名の頭文字)と入力します。そして、現れた候補のTable To Structured Gridをクリックして、Enterキーで確定します。
▼操作の様子です。(gif)
するとプロパティパネルに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フィルタについて詳細(ParaViewのWikiです)
矢線を描く
これで準備が整ったので、次は、視覚化作業としてベクトルの矢線を描画します。
Glyphというフィルタを使います。
パイプラインブラウザに注目し、先ほど作ったTableToStructuredGrid 1をクリックしてから、ツールバー上の地球?のようなアイコンをクリックします。
▼そして、プロパティパネルで以下のように設定します。
Orientation ArrayとScale Arrayは、先ほどCalculatorフィルタで作った配列を選択して下さい。
Applyで確定すると……
▼こんな感じになりました。
各設定値を変えることで、背景色や線の太さなどの外観や表示状態を変えられます。
例えば、Scale/Scale Factorの数値を変えると、矢線に縮尺を掛けられます。
これで、最初はCSVの単なる座標の表だったのが、目に見える形になりました。
▼ Glyphフィルタについて詳細(ParaViewのWikiです)
流線を描く
最後は、流線を書きます。Evenly Spaced Streamlines 2Dというフィルタを使います。
上部のメニューバーのFilters→Search→キーボードでev(フィルタ名の頭文字)と入力します。そして、現れた候補のEvenly Spaced Streamlines 2Dをクリックして、Enterキーで確定します。
するとまた、プロパティパネルに色々と設定する項目が出てきます。
※ もし項目が少なかったら、右上の歯車のアイコンをクリックすると詳細メニューが表示されます。
例えば下図のように設定値を入れてApplyを押すと、早速流線が描画されます。
設定項目が沢山ありますが、最低限Start Positionは指定して下さい。あとはSeparating Distanceなどの値を変えて、見た目を調整していきます。
各設定値の仕組みについては、私は理解しきれていないので、詳しくは次項目で紹介している開発元のブログやドキュメントをご覧ください。
今回のベクトル場は円の方程式を微分した式から作ったので、流線は円になる筈です。下図を見て、正しく描画ができたと判断しました。
▼ 下図は、別のベクトル場を作ってフィルタをかけてみた様子です。
Evenly Spaced Streamlines 2D について
このEvenly Spaced Streamlines 2Dというフィルタは、開発元のKitware社のブログで知りました。
▼ 下記のブログです。
最低限Start Positionに開始点の座標を入力し、Applyを押せば、自動的に流線が描画されます。
細かい見た目は、Separating Distanceなど流線の密度を決める値で調整していきます。
私はまだ各パラメータの仕組みはまだ十分理解しきれていませんが、今後便利に使えそうです。
Paraviewにはツールバーに最初から出ている「Stream Tracer」という同目的のフィルタもありますが、二次元平面で使うなら、Evenly Spaced Streamlines 2D のほうが使い勝手がよいと思いました。
▼ パラメータについて詳細(ParaViewのgithubのドキュメントです)
さいごに
今回のプロット内容はParaview以外のJuliaやPythonなど他の計算環境でも十分に実現できますが、慣れないParaviewに触れるという目的で取り組みました。
「Paraview」は高機能なので習得が億劫に感じてしまい、今まであまり使えていませんでした。
しかしひとまず何かを描画すれば抵抗がなくなってきたので、今後は勉強しながら使う機会を増やそうと思っています。
▼ 動画版も作ってみました。音声入り、9分ほどです。(Youtubeへのリンク)