ParaViewのTips
気象関係者を想定した ParaView の覚え書き。未完成だが、有用かもしれないのでとりあえず公開。
- インストール
- 基礎
- 簡単な図形の表示
- ファイルの読み込み
- 図の属性と表示(Properties, Display, View)
- 描画域(Viewport)
- 色(Color)
- フィルタ(Filter)
- カメラ
- 保存
- システム情報
- Pythonスクリプト
- 気象データの可視化
- NICAMデータ(NetCDF)の読み込み
- csvデータの可視化
- サーバ・クライアントモードの利用
- その他
- リンク
- 参考書
インストール
はじめに
https://www.paraview.org/ の「Download」から Windows、Linux、MacOS それぞれのバイナリをダウンロードすることが可能。Version から必要なバージョンを選択し「ParaView」直下の適切なリンクからダウンロードする。ファイル名に MPI が含まれるインストーラは並列版である。
ParaView はバージョンによってサポートされている python のバージョンや記述方法が異なることがある。以下ではできるだけ ParaView 5.13.0 を基準とした説明を行うが、ドキュメント作成の時期によって動作確認したバージョンが混在している。
なお、サーバ・クライアントモードで実行する場合、サーバ・クライアント間で同じバージョンの ParaView をインストールする必要がある。但し、MPI 版かどうかを合わせる必要はない。
Windows向け
特にこだわりがない場合、バージョン番号が最も新しい拡張子 msi のインストーラをダウンロードし実行するだけでよい。
Linux向け
tar.gz ファイルをダウンロード、解凍するだけでよい。
$ tar -xvzf ParaView-5.13.0-MPI-Linux-Python3.10-x86_64.tar.gz
以下、実行例。
$ cd ParaView-5.13.0-MPI-Linux-Python3.10-x86_64.tar.gz/bin $ ./paraview
但し私の経験上、それなりの確率で起動に失敗する(X環境周りのことが多そうだが解決方法不明)。幸いなことに、サーバとして動かす場合は特に問題にならない。
基礎
画面の構成
ParaView全体の表示例と代表的な要素の名称を以下に示す。
各要素を表示するかどうかは、メニューの「View」から調整できる。
各要素の右上をクリックすることで、別ウィンドウとして分離することや非表示にすることができる。
起動直後の状態にリセットする
現在の状態を保存する
後で同じ状態に復元したい場合に便利。
メニューの「File」−「Load State」から保存したファイルを選択することで復元できる。
詳細オプションの表示
簡単な図形の表示
以下では予め用意されている図形の一部を紹介する。ParaViewの操作に慣れる上でも有用である。
立方体
テキスト
- メニューの「Sources」−「Alphabetical」−「Text」を選択。
-
「Properties」パネルの「Text」に文字列を入力、「Apply」をクリック。
- latexの数式を挿入することも可能。
ファイルの読み込み
図の属性と表示(Properties, Display, View)
図形中心の位置を指定する
描画域の絶対的な座標に対する位置を指定する。描画域全体の位置を指定する場合は〜を参照。
図形の色を指定する
図形の不透明度を指定する
図形をワイヤーフレームで表示する
XYZ座標の向きを表示する/しない
描画域(Viewport)
描画域を水平/鉛直に分割する
描画域右上の「Split Horizontal」又は「Split Vertical」をクリックすると、水平又は鉛直方向に描画域を分割することができる。
分割後の初期状態では新しくできた描画域には何も表示されないが、描画したい描画域をアクティブにした状態で「Pipeline Browser」の可視化をonにすることで表示できる。このように、「Pipeline Browser」の可視化on/offは描画域毎に設定できる。
タブを用いた描画域の切り替え
描画域の表示をマウスで操作する
マウスを用いて描画域の回転・平行移動・サイズ変更を行うことができる。
- 回転(Rotate):原点のまわりでカメラを回転
- ロール(Roll):カメラの位置を固定したまま回転
- パン(Pan): カメラを平行移動
一つの動作に対して複数の方法が提供されているため、例えば中央ボタン(or スクロールボタン)がない場合でも対応できる。
以下のデフォルトの動作は、「Edits」−「Settings」、「Camera」タブから変更可能である。
3次元の図形を表示している場合
左ボタン | 中央ボタン | 右ボタン | |
---|---|---|---|
回転 | パン | 拡大・縮小 | |
Shiftを押しながら | ロール | 回転 | パン |
Ctrlを押しながら | 拡大・縮小 | 回転 | マウスに対して拡大・縮小 |
色(Color)
フィルタ(Filter)
図形を切断する(Clip)
図形を切断し、断面を表示する。
- 「Filters」−「Common」−「Clip」を選択、もしくはツールバーから を選択。
- 切断面が白枠と赤円(古いバージョンでは赤枠のみ)で表示される。
- 白枠(古いバージョンでは赤枠)をドラッグすると切断面を並行移動できる。
- 矢印をドラッグすると切断面の角度を変更できる。
- 「Apply」をクリックすることで実際に切断される。
- もし反対側を切断したい場合は、「Properties」パネルの「Properties」−「Invert」のチェックを外し(古いバージョンでは「Inside Out」にチェックを入れ)て「Apply」をクリックする。
- 切断後、枠を表示したくない場合は「Properties」パネルの「Properties」−「Plane Parameters」−「Show Plane」のチェックを外す。
切断面を厳密に決めたい場合は、「Properties」パネルの「Properties」−「Plane Parameters」において「Origin」(断面が通過する点のXYZ座標値)および「Normal」(断面の法線ベクトルのXYZ成分値)を指定すればよい。また、「X Normal」(YZ断面図)などのよく使う断面はボタンで用意してある。
図形の断面を取り出す(Slice)
- 「Filters」−「Common」−「Slice」を選択。
- 切断面が赤い枠で表示される。
- 赤枠をドラッグすると切断面を並行移動できる。矢印をドラッグすると角度を変更できる。「Properties」パネルの「Properties」−「Plane Parameters」にある「X Normal」等をクリックすると、座標軸に直行した面を指定できる。
- 「Apply」をクリックすることで実際に切断される。
Clipフィルタは図形を切断するだけだが、Sliceフィルタは切断「面」を取り出す
指定した直線上の値をグラフ化する
- PlotOverLine
ベクトルを表示する
- Glyph
流線を表示する
- Stream Tracer
描画する値の範囲を指定する
- Threshold
- missing valueが分かっている場合はこれで除去できる
カメラ
-
Camera Parameters
- Position: カメラの位置
- Focal Point: カメラの焦点(ピント)位置
保存
表示されている画像を保存する
画像の再現性を確保したい場合
以下、ディスプレイサイズの依存性を回避する方法。
- Tools から Lock View to Custom Size を選択
- 適当なサイズを入力、以後この値を使うようにする。
- ここで入力したサイズは「Save Screenshot」のデフォルト値になる模様
システム情報
Pythonスクリプト
ParaView のバージョンに応じて記述方法が大きく異なる場合がある。ここでは ParaView 5.13.0 (Python 3系)で動作確認した記述方法を紹介する。詳細は ParaView's Python documentation! などを参照のこと。なお、日本語を含むスクリプトの場合はUTFで保存するのが無難。
コマンドプロンプトの起動
「View」−「Python Shell」のチェックボックスを on にすると、コマンドプロンプトが起動できる
参考までに、古い ParaView では「Tools」−「Python Shell」からコマンドプロンプトを起動する。
簡単な例
以下に球を読み込んで表示するコマンドの例を示す。
-
球を読み込み(「Sources」−「Sphere」と同じ)
>>> sphere1 = Sphere()
-
球を可視にする
>>> Show(sphere1)
-
画面上に反映
>>> Render()
上記のようにRender()を行わないと、画面上には正しく反映されない。
-
球を不可視にして画面上に反映
>>> Hide(sphere1) >>> Render()
Pythonスクリプトの実行
球を表示するスクリプト(test.py)の例を示す。
sphere1 = Sphere() Show(sphere1) Render()
コマンドプロンプトにおいて「Run Script」をクリックし、実行したい Python スクリプト(ここではtest.py)を指定すると実行される。
ParaView起動時のPythonスクリプト読み込み
起動時のオプション --script によって、起動後すぐにスクリプトを実行できる。
Linuxの場合の例
$ paraview --script=test.py
Windowsの場合の例
C:\Users\Hoge> "C:\Program Files\ParaView 5.1.2\bin\paraview" --script=C:\Users\Hoge\Desktop\paraview\test.py
設定のトレース
GUIで実行した処理をスクリプトに落とし込むことができる。
- 「Tools」−「Start trace」
- (行いたいオプションを設定)
- 「Tools」−「Stop trace」
モジュールのロードとリロード
例えば /home/hoge/paraview/src に置いてある draw.py をモジュールとして読み込む場合、
sys.path.append( '/home/hoge/paraview/src' ) import draw
とする。draw.py 中の関数 func は
draw.func()
などで実行可能。
モジュールをロードした後、書き換えた場合、明示的にリロードしないと反映されないので注意(Python Shellの「Reset」ではリロードされない)。
from importlib import reload reload(draw)
気象データの可視化
鉛直座標の調整
ParaViewは緯度・経度を直接解釈できないため、lat/lon/levデータを読み込むと鉛直方向が極端に表示されてしまう場合がある。
Transformフィルタを使って鉛直方向に適当なスケールファクター(以下では0.001)を掛けることで解決する。
水平断面の表示(その1)
Clipフィルタを用いる。「Clip」の「Properties」パネル、「Properties」−「Plane Parameters」から「Z Normal」を選択することで切断面が水平になり、ある高さにおける水平断面を表示できる。「Origin」のZ成分を指定することで、高さを直接することも可能。
水平断面の表示(その2)
Sliceフィルタを用いる。「Slice」の「Properties」パネル、「Properties」−「Plane Parameters」から「Z Normal」を選択することで切断面が水平になり、ある高さにおける水平断面を表示できる。「Origin」のZ成分を指定することで、高さを直接することも可能。
さらにCoutourフィルタを用いると、断面における等値線を描くことができる。
等値線を描く値は「Contour」の「Properties」パネル、「Properties」−「Isosurfaces」−「Value Range」で設定する。値を決め打ちすることも可能だが、ここでは「Remove all entries」(×アイコン)をクリックした上で、「Add a range of values」をクリックして等間隔の等値線を描いてみよう。
最小値、最大値、コンターの数を指定すしたら「OK」をクリック。
「Apply」すると反映される。
「Pipeline Browser」から「Slice」の可視をonにすると、シェードの上に等値線が表示される。さらに「Contour」の 「Properties」パネル、「Properties」−「Display」−「Styling」−「Line Width」を1から3などへ増やすことで等値線がより見やすくなる。
背景に地図を描画する
地図の画像ファイルを用意して取り込むことになる。DKRZのページに詳細な情報が記載してある。
図の取り込み
- 地図の画像ファイル(たとえば NOAA Blue Marble)を「File」−「Open」、もしくはドラッグ・アンド・ドロップで開く。
- 「Properties」パネルの「Properties」から「Apply」。
- 「Properties」パネルの「Properties」−「Display」−「Scalar Coloring」の「Map Scalars」チェックボックスをoffにする(チェックボックスがない場合は歯車アイコンをクリック)。これで画像が加工されずそのまま表示される。
図のサイズの調整
上のままでは地図と物理場の位置やサイズがずれてしまう。なぜなら、
- 図(jpg):ピクセルがそのまま(x,y)座標として取り込まれる。左下が原点であり、zは常に0。
-
データ:全球の緯度経度座標の場合、x=[0:360)、y=(-90:90)などであり、この場合の原点は図の左端の中央。
従って、データに応じて図を水平移動、拡大縮小する必要がある。
land_shallow_topo_2048.jpg(blue marble, 2048×1024)、NICAM 3Dデータの場合、
-
land_shallow_topo_2048.jpg の「Properties」−「Display」−「Transforming」
- Translation = (0, -90, 0)
- Scale = (0.17578125, 0.17578125, 1) ← (360/2048)
-
物理量に対するTransform filterの「Properties」
- Translate = (0,0,-0.80841) ← 最下層を地表面に合わせる必要がある場合、-最下層(80.841)×0.01倍
- Scale = (1, 1, 0.01)
erde.png(DKRZサンプル地図, 5400×2700ピクセル)、NICAM 3Dデータの場合、
-
erde.png の「Properties」−「Display」−「Transforming」
- Translation = (0, -90, 0)
- Scale = (0.06667, 0.0667, 1) ← (360/5400)
-
物理量に対するTransform filterの「Properties」
- Translate = (0,0,-0.80841) ← 最下層を地表面に合わせる必要がある場合、-最下層(80.841)×0.01倍
- Scale = (1, 1, 0.01)
以上の方法は簡便であるが、Transformingの内容は次のPipelineに反映されないようである。従って、例えばClipなど図をさらに加工したい場合、元の図に対してClipされるため、不具合が生じる。これを回避するためには、Transformフィルタを用いる。指定方法は基本的に上と同じだが、「Transform All Input Vectors」をoffにする必要があるので注意。
なお、NOAA Blue Marble で経度の範囲を 0度−360度に変更したい場合、以下の例(ImageMagick利用)のような方法で地図を180度ずらすことが可能。
$ montage blue_marble/land_shallow_topo_2048.tif -geometry 100% -gravity west -crop 50%x100% -quality 100 blue_marble_converted/tmp2.png $ montage blue_marble/land_shallow_topo_2048.tif -geometry 100% -gravity east -crop 50%x100% -quality 100 blue_marble_converted/tmp3.png $ montage -tile 2x1 blue_marble_converted/tmp3.png blue_marble_converted/tmp2.png -geometry 100% -quality 100 blue_marble_converted/land_shallow_topo_2048.png
NICAMデータ(NetCDF)の読み込み
3次元データの読み込み
特に問題なく、そのまま読み込んで表示することができる。
2次元データの読み込み
levが存在すると表示できない、もしくは ParaView が落ちる。以下の手順で前処理を行うとうまく表示できる。
-
lev次元を除去
-
ncoを使う場合
ncwa -a lev -d lev,0,0 input.nc output.nc
-
cdoを使う場合
cdo --reduce_dim select,levidx=1 input.nc output.nc
- 一括変換ツールの例:rmlev.sh
-
ncoを使う場合
-
Paraviewで読み込み、「Properties」パネル、「Properties」−「Dimensions」で (lat,lon) を選択して「Apply」。適切な変数名を選択。
- Spherical Coordinates が on の場合はこれで表示される。
-
Spherical Coordinates が off の場合、このままでは表示されない
- 「transform」フィルタを選択し、何も設定せずに「Apply」。適切な変数名を選択すれば表示されるはず。
NetCDFファイルの結合
-
time次元をunlimitedにする(結合の準備)
ncks --mk_rec_dmn time input1.nc output1.nc ncks --mk_rec_dmn time input2.nc output2.nc
-
例:AMIPデータ
ncks --mk_rec_dmn time /ceist/nicam/hpci/amip/N12/197806/gl09/control/run01/output/1979/19790601-19790601/data_nc/02560x01280.zorg.torg/sa_lwu_toa.nc output1.nc ncks --mk_rec_dmn time /ceist/nicam/hpci/amip/N12/197806/gl09/control/run01/output/1979/19790602-19790602/data_nc/02560x01280.zorg.torg/sa_lwu_toa.nc output2.nc
-
例:AMIPデータ
-
結合
ncrcat output1.nc output2.nc output.nc
#--備考:UDUnitsが必要な場合がある。mapleでは不可、akitaでは可能。
csvデータの可視化
サーバ・クライアントモードの利用
リモートサーバで ParaView を実行し、手元のPC(クライアント)から操作することができる。
基礎
リモートサーバにおいて pvserver を実行すると、クライアントからの接続を待機する状態になる。
$ pvserver Waiting for client... Connection URL: cs://myserver:11111 Accepting connection(s): myserver:11111
次にクライアント側で ParaView を実行し、「File」−「Connect」を選択する。
「Add Server」からリモートサーバを追加する。Host および Port 番号は pvserver を実行した際の表示を参考にすること。名前(ここでは「My Server」)は好きなものでよい。
自分でつけた名前(ここでは「My Server」)をダブルクリックすると、リモートサーバに接続できる。
接続に成功すれば以後、通常とほぼ同様に ParaView を利用することができる。なお、ファイルの Open などではサーバ側のファイルを操作することになるが、python スクリプトはクライアント側のファイルを読み込むことも可能である。
まれに、X サーバ周りで警告が出ることがある。その場合、pvserver の起動時に --disable-xdisplay-test オプションを付与するとうまくいくことがある。
上記の方法は firewall による制約が特にないことが前提となる。もしポートに制約がある場合、pvserver のオプション --server-port を利用してポート番号を指定する、もしくは後述する ssh トンネリングが有効な場合がある。
並列実行
pvserver を mpiexec を利用して実行することができる。以下、8配列の例。
$ mpiexec -np 8 pvserver
リモートサーバにおいて並列実行できているかどうかは、クライアント側の ParaView で Memory Inspector から確認可能である。
経験的に、粗い解像度のデータを大並列で処理すると、タイル状の格子模様が現れるなど画像が乱れることがある。
sshトンネルを介した接続
firewall の制約などにより、ssh 以外の接続ができないリモートサーバを利用する場合に有用である。リモートサーバにおける pvserver を通常通り実行した上で、クライアントからリモートサーバへ予め ssh トンネル(ポート転送)を作成する。
-
クライアントが Linux の場合、
$ ssh -L 11111:localhost:11111 myserver
-
クライアントが Windows、TeraTerm の場合
「設定」−「SSH転送」−「追加」から「ローカルのポート」の向きで設定する。リモート側のホストにはリモートサーバのアドレスを指定する。この設定を行った後、リモートサーバへ ssh 接続する。
次に、ssh トンネルを維持した状態で、クライアント側の ParaView でリモートサーバを追加する。Host は localhost を指定する。この設定でリモートサーバへ接続できるはずである。
その他
バグ?:透過色利用時の凡例の色
透過色を利用すると、凡例の色が安定しないことがある。ファイルとして出力した図では特に問題ない。
要検証
データ表示がうまくいかない場合、何も指定せずにtransformフィルタを掛けるとうまくいくことがある。
latlonの平面図を球面に貼り付ける
- 参考:https://www.dkrz.de/up/services/analysis/visualization/sw/paraview/tutorial/earth-texture
- 図を用意
- Imagemagickで図を変換
以下だけだと上手くいかない
-
「Sources」-「Sphere」
- Theta/Phi Resolutionを8から50くらいにしておく
-
「Filters」-「TextureMaptoSphere」、一度Apply。
- 「Miscellaneous」の「Texture」をLoadに変更して画像ファイルを読み込む
線の太さを変更する
- Ribbonフィルタを利用すればよい
リンク
- ParaView(英語)
- ParaView Documentation (英語)
- Python による ParaView の操作
-
ParaView and Python
- Pythonを用いたParaViewのコントロール方法が詳しい。
-
ParaView Tutorial (by DKRZ, 英語)
- 地球科学向けのParaView入門
- NOAA Blue Marble: 背景の地図データとして利用可能