4214

チュートリアルフリーの可視化ソフトとして今日広く利用されている ParaView の使い方についてその初歩の初歩を解説します。本号では MPI 並列計算で出力する比較的複雑な時系列の可視化モデルを ParaView にて一発で開く方法を紹介します。ParaView 関連の書籍およびウェブ上にある
ParaView の操作方法に関するドキュメント類と併せてお読みください。

ParaView 超入門 其の四
大西 有希
1

はじめに

本稿はフリーの汎用可視化ソフトである「ParaView」の超入門チュートリアルの第四弾です。第三弾で最終回のつもりでしたが、嬉しいことに一部の方からご好評を頂きましたため、やや発展的な内容を追加で紹介したいと思います。其の一〜三（Vol. 23 No. 4〜Vol. 24
No. 2）をご覧になっていない方はまずそちらからご覧になることをお勧めします。
さて、其の四の本稿では時系列の可視化モデルをよりユーザーフレンドリーに ParaView で開いて可視化するためのファイル構造およびその作成方法について解説します。其の一で解説した通り、ParaView ではファイル名に数字が含まれていて連番になっているファイル群を1度に開き、それを時系列データとして取り込んでアニメーション表示する機能があります。単純かつ小規模な問題であればこの機能だけで十分に実用的な可視化を行うことが出来ます。しかし、モデル形状が複雑になったり大規模になったりしてくると、段々とこの「連番ファイルを使う方法」では取り扱いが難しくなってくることでしょう。例えば次の様な要求が出て来るのではないかと思います。
♢複数の表示グループに分かれた可視化モデルを一発で ParaView に取り込みたい。
♢ MPI 並列計算時に各ランクがバラバラに出力した可視化モデルを自動的にマージして表示したい。
♢表示モデルの出力時刻を属性情報として表示モデルの中に含めたい。
本稿では上記の様な要求に応える時系列データを「vtm.series ファイルを使う方法」で出力する方法を紹介します。

筆者紹介

2

ファイル構成紹介する可視化データのファイル構成を図1に示します。三層構成になっています。
paraview.vtm.series
t0000.vtm
pieceA.r0000.t0000.vtu



pieceA.r0001.t0000.vtu



⋮





pieceB.r0001.t0000.vtu

⋮t0001.vtm
pieceA.r0000.t0001.vtu



pieceA.r0001.t0001.vtu



⋮



図1

pieceB.r0000.t0000.vtu



pieceB.r0000.t0001.vtu



pieceB.r0001.t0001.vtu

⋮

可視化データのファイル構成（三層構成）

第一層の「paraview.vtm.series」は元締めファイルであり、ParaView で開くよう指示するのはこのファイルのみです。第二層の「t????.vtm」は各出力時刻における中締めファイルであり、???? は出力時刻の通し番号等を表します。第三層の「pieceX.r****.t????.vtu」は各ピース（表示グループ）に対する各 MPI ランクの各出力時刻における末端ファイルであり、**** は MPI ランクを表します。いずれのファイルも拡張子を除いて名前は任意です。次章より各ファイルの中身を詳しく見て行きます。
続きは Web で
日本計算工学会誌「計算工学（Vol.26, No.1）」HP:
http://www.jsces.org/activity/journal/

おおにし ゆうき
2005年東京工業大学大学院情報理工学研究科博士課程修了、みずほ情報総研株式会社を経て、現在、東京工業大学工学院助教。固体の超大変形解析、腐食や電着塗装などの電気化学解析、熱／光インプリントのプロセス解析などの研究に従事。

（32）

計算工学

チュートリアル

ParaView 超入門 其の四3

サンプル可視化ファイル

4

第一層：vtm.series ファイル

ファイルの内容を解説する前に、サンプルを見た方が分かり易いと思いますので、サンプルデータを用意しました。本 PDF にサンプルデータ一式を7-Zip で圧縮したファイル「samples.7z」を添付（埋込）していますので、ファイルを保存・展開して参照してください。添付ファイルを開けない PDF ビューワーもあると思いますので、その場合は別のビューワーをお試しください。

拡張子が vtm.series のファイルには各出力時刻の vtmファイルへの相対パスおよび出力時刻のリストを JSON形式で記述します。内容例を図2に示します。
1行目はおまじないです。2〜4行目は各出力時刻のvtm ファイルへの相対パスおよび出力時刻が記載されています。5行目はおまじない終了のカッコです。
本例では vtm.series ファイルがあるディレクトリの下に vtm というディレクトリを作って、その中に各時刻の vtm ファイルを置いています。ファイルの置き場所に決まりはないので、用途に合わせてカスタマイズ可能です。
自作プログラムから vtm.series ファイルを出力する場
合、特にライブラリ等は使用せず、ofstrem や fprintf を用いて MPI ランクが0のプロセスに出力させれば良いでしょう。ただし、注意点としてファイル末尾が「]}」で終わらなければならない点が挙げられます。いわゆる追記モードを用いて各出力時刻に vtm.series ファイルを追記更新することは出来ません。読み書きモードで末尾の「]}」の直前に行を追加しても良いですが、末尾の「]}」を除くファイル内容を常にメモリ上で保持・更新して上書きモードで vtm.series ファイルを都度書き出すのが簡単で良いでしょう。

5

第二層：vtm ファイル拡 張 子 が vtm の フ ァ イ ル に は 各 出 力 時 刻 の 表 示 グ
ループ名および構成する末端ファイル（本例では vtuファイル）への相対パスを XML 形式で記述します。内容例を図3に示します。
先頭2行と末尾2行はおまじないで、それ以外に表示グループとその中身のファイル名が定義されています。少し煩雑ですが、表示グループが Block、Piece、DataSet の三段構成（図1の三層ファイル構成の話とは別）で記述されています。
「<Block name=” blockI”」〜「</Block>」で1つのブロックを定義しています。例えば、2つの物体が衝突する様な解析を行う場合、各物体をそれぞれ1つのブロックとして定義するのが良いでしょう。なお、図3の例ではBlock が blockI の1つしか定義されていませんが、続けて blockII 等の情報を記述すれば複数のブロックを定義できます。

{ "file-series-version" : "1.0", "files" : [{ "name" : "vtm/t0000.vtm", "time" : 0 },{ "name" : "vtm/t0001.vtm", "time" : 60 },{ "name" : "vtm/t0002.vtm", "time" : 120 }]}図2

vtm.series ファイルの内容例（出力時刻が0,60、120秒の3つの場合）。

<VTKFile type="vtkMultiBlockDataSet" version="1.0" byte_order="LittleEndian"header_type="UInt32"><vtkMultiBlockDataSet><Block name="blockI"><Piece name="pieceA"><DataSet name="pieceA" file="vtu/blockI-pieceA.r0000.t0005.vtu"></DataSet><DataSet name="pieceA" file="vtu/blockI-pieceA.r0001.t0005.vtu"></DataSet><DataSet name="pieceA" file="vtu/blockI-pieceA.r0002.t0005.vtu"></DataSet></Piece><Piece name="pieceB"><DataSet name="pieceB" file="vtu/blockI-pieceB.r0000.t0005.vtu"></DataSet><DataSet name="pieceB" file="vtu/blockI-pieceB.r0002.t0005.vtu"></DataSet></Piece></Block></vtkMultiBlockDataSet></VTKFile>

図3
計算工学

vtm ファイルの内容例（ブロック数が1、ピース数が2、出力時刻番号が5、MPI ランク数が3の場合）。
（32-2）

Vol.26, No.1 2021

チュートリアル

ParaView 超入門 其の四「<Piece name=” pieceA”」〜「</Piece>」で1つ の ピ ー スを定義しています。blockI の定義の中に書いてあるので、表示グループ blockI の一部を構成する表示グループとして pieceA が定義されます。例えば、ある物体が複数のパーツからなる場合、パーツ1つ1つを別々のPiece として定義するのが良いでしょう。
「<DataSet name=” pieceA”」〜「</DataSet>」で Piece を構成するデータとして vtu ファイルを1つ登録しています。DataSet は表示グループを定義するものではないた
め、DataSet の name は属する Piece と同じ名前を指定します。1つの Piece は複数の DataSet の和集合として定義できるため、MPI 並列環境ではランク毎に別々に出力した vtu ファイルを並べて記述すれば良いです。図3のpieceA では MPI ランク0〜2が出力時刻番号5の時点で別々に出力した3つの vtu ファイルを登録しています。
他方、pieceB では MPI ランク0と2が出力した vtu ファイルを登録しています。これは、MPI ランク1が pieceB とは 無 関 係 で あ る 場 合 の 記 述 で、 不 必 要 な（空 の）vtuファイルを出す必要がなくなります。なお、本例ではvtm ディレクトリの下に vtu というディレクトリを作って、その中にすべての vtu ファイルを置いています。ここでもファイルの置き場所に決まりはないので、用途に合わせてカスタマイズ可能です。
詳細は後述しますが、Block や Piece で作成した表示グループは ParaView の Multi-block Inspector を使用して表示の ON/OFF 等を制御できます。1つの Piece に複数の DataSet を指定した場合、この Multi-block Inspector 上
で は1つ の Piece に マ ー ジ さ れ た も の と し て 扱 わ れ ます。Block や Piece の 定 義 は 任 意 な の で DataSet の み でvtm ファイルを記述することも出来ますが、ParaView上で表示グループに分けて可視化することが出来なくなります。従って、適切な範囲で Block や Piece に分ける方が良いでしょう。
自作プログラムから vtm ファイルを出力する場合、やはり ofstream や fprintf を用いて MPI ランクが0のプロセスに出力させれば良いでしょう。

6

第三層：vtu ファイル

拡張子が vtu のファイルには各ピースの各 MPI ランクが担当する各出力時刻におけるデータを出力します。
MPI ランク毎に完全に独立して出力出来るので、並列コードは極めて容易に実装できます。
vtu ファイル出力には VTK ライブラリを使うことをお勧めします。他のファイルと同様に ofstream や fprintfを用いて書き出すことも可能ですが、ライブラリを用いる方がコーディングが簡単ですし ZLIB や LZMA によるデータ圧縮が使えるメリットもあります。VTK ライ
ブラリを用いた vtu ファイルの出力方法については拙著「ParaView 超入門 其の三」を参照してください。ただし、4.4節に紹介されている時刻の情報を FieldData で追加 す る 処 理 は 不 要 で す（∵ 本 稿 の 方 法 で は vtm.series
ファイルに時刻の情報が含まれているため）。
一応ですが、vtu ファイルの内容を簡単に説明します
計算工学（VTK ライブラリの使用を強く推奨していますので、出力内容の確認のためだけの知識と捉えてください）。
内容例を図4a および4b に示します。ファイル形式はXML 形式です。「Piece」タグに節点数と要素数が書かれています。「PointData」タグおよび「CellData」タグの中身には節点および要素に対する値（物理量など）がそれ ぞ れ 格 納 さ れ て い ま す。 各 節 点・ 要 素 量 は「DataArray」タグの中にそれぞれ格納されており、タグ内にその量に関する説明（名前など）が書かれています。量のデータそのものは通例圧縮して出力するので人間には読めません。「Points」タグの中身には主に節点座標のデータが格納されています。座標の2ノルムの情報などが勝手に挿入されますが、特に気にする必要はありません。「Cells」タグの中身には要素の構成節点の情報（connectivity）や要素タイプの情報（types）が格納されています。データがどこで終わるかを記した情報（oﬀset）も格納されていますが、特に気にする必要はありません。
本稿では非構造格子の vtu ファイルを例に挙げましたが、構造格子の vts ファイルや古典的な legacy vtk ファイル等も利用できます。その際は vtm ファイルで指定するファイル名の拡張子も変更してください。

7

vtm.series ファイルを用いる方法の長所と短所

ここで、本稿で紹介した「vtm.series ファイルを用いる方法」の長所と短所をまとめておきます。
長所■可視化モデルの一発読込。
・ 元締めファイルの vtm.series を開くだけで良いので、操作が簡単です。Linux なら paraview コマンドの引数に vtm.series ファイルを指定するだけです。Windows
なら拡張子 series を ParaView で開くように関連付けておけばダブルクリックするだけです。
・ 出力時刻の情報が含まれているので、Annotate Timeで時刻を表示する処理（詳細は後述）が簡単です。
・ 自作コードを他人に使ってもらう時など、可視化方法の説明も簡単になります。
■ファイル出力処理時に MPI 通信が不要。
・ vtu ファイルを書き出す処理の最中に MPI 通信を行う必要がありません。
・ ただし、ランク0のプロセスが vtm ファイルを書き出す際にどのランクがどの Piece を出力するかを知っておく必要があります。
■ ParaView 読込が速くて省メモリ。
・ 著者の経験上、「連番ファイルを使う方法」と比べて読 込 が 速 く メ モ リ の 消 費 量 も 少 な い で す（PipelineBrowser に多数のデータがあると ParaView の動作が何故かもっさりする）。
・ 表示させる量の変更手順が1回で済むメリットもあり ま す（Pipeline Browser に 複 数 の デ ー タ が あ る 場
合、全てのデータに対して表示量変更を行う必要がある）。

（32-3）

Vol.26, No.1 2021

チュートリアル

ParaView 超入門 其の四<?xml version="1.0"?><VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian" header_type="UInt32"
compressor="vtkLZMADataCompressor"><UnstructuredGrid><Piece NumberOfPoints=“100" NumberOfCells=“186"><PointData><DataArray type="Float32" Name="Potential, $¥phi$ $¥mathrm{(¥mu V)}$" format="binary"

RangeMin="0" RangeMax="3.14">（圧縮されたデータ行．人間には読めない文字列なので省略．）</DataArray>（中略．節点に対する上記以外の DataArray が並ぶ．）</PointData><CellData><DataArray type="Int32" Name="User-defined Element Number" format="binary" RangeMin="0"

RangeMax="347">（圧縮されたデータ行．人間には読めない文字列なので省略．）</DataArray>（中略．要素に対する上記以外の DataArray が並ぶ．）</CellData>

図4avtu ファイル前半部分の内容例（節点数が100、要素数が186の場合）。節点量として電位を、要素量としてユーザー定義要
素番号を格納している。

<Points><DataArray type="Float32" Name="Points" NumberOfComponents="3" format="binary"

RangeMin="17.075137485226954" RangeMax="19.301821679297596">（圧縮されたデータ行．人間には読めない文字列なので省略．）<InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"><Value index="0">17.075137485</Value><Value index="1">19.301821679</Value></InformationKey></DataArray></Points><Cells><DataArray type="Int32" Name="connectivity" format="binary" RangeMin="0"

RangeMax="1043">（圧縮されたデータ行．人間には読めない文字列なので省略．）</DataArray><DataArray type="Int32" Name="offsets" format="binary" RangeMin="3" RangeMax="1044">（圧縮されたデータ行．人間には読めない文字列なので省略．）</DataArray><DataArray type="UInt8" Name="types" format="binary" RangeMin="5" RangeMax="5">（圧縮されたデータ行．人間には読めない文字列なので省略．）</DataArray></Cells></Piece></UnstructuredGrid></VTKFile>

図4b
計算工学

vtu ファイル後半部分の内容例。3次元の節点座標や要素構成節点などを格納している。
（32-4）

Vol.26, No.1 2021

チュートリアル

ParaView 超入門 其の四

短所■ vtu ファイル数が多くなってしまう。
・ 表示グループ数が多い大規模モデルで並列数も多いと、どうしても vtu ファイル数が多くなります。
・ 逆に1つにまとめようとすると MPI 通信が発生するので、書き出し性能が落ちる可能性があります。つまり、ノード間通信が速くディスク IO が遅い環境だと、MPI-IO 等より書き出しが遅くなる可能性があります。
■ vtu ファイル出力に VTK ライブラリが必須となる。
・ VTK が C++ で書かれているため、XML 形式の VTKファイル（vtu ファイル等）を用いるなら、出力部分だけは基本的に C++ で書く必要があります。

8

ParaView による可視化

いよいよ、ParaView を用いて可視化を行います。最新の ParaView と本 PDF に添付されているサンプルデー
タ（3章参照）を解凍したものを準備してください。OSは Windows でも Linux でも構いません。
開き方
サンプルデータの sample1ディレクトリの中にある「paraview.vtm.series」を 開 い て み ま す。sample1の vtu
ファイルは敢えて圧縮せず素のアスキーデータで出力してあります。
Windows の方は「paraview.vtm.series」をダブルクリックしてください。ファイルを開く方法を尋ねられるので、 最 新 版 の ParaView を 指 定 し て く だ さ い。Auto
Apply を有効にしていれば、図5の様に立方体が表示され、無事に開けると思います。次回以降は vtm.series
ファイルをダブルクリックするだけで OK です。
Linux の 方 は paraview コ マ ン ド の 引 数 に「paraview.

図5
計算工学vtm.series」へのパスを与えてください。MESA を使う場合のコマンドは例えば次の様になります。
/opt/paraview/ParaView-5.8.1-MPI-Linux-Python3.7-64bit/
bin/paraview-mesa paraview – sample1/paraview.vtm.series
場合によっては、ある時刻の全体データのみを開きたいことや、ある Piece の時系列データのみを開きたいこともあると思います。その場合は、vtm ディレクト
リの下にある「t????.vtm」のみを開いたり、vtu ディレク
トリの下にある「xxxx.r****.t????.vtu」のみを開いたりすることで実現出来ます。使い慣れて来たら試してみても良いでしょう。
Multi-block Inspector の表示
表示グループを操作するには Multi-block Inspector を使 用 し ま す。 メ ニ ュ ー バ ー の View か ら Multi-block
Inspector にチェックを入れてください。初期設定では
画面左の Pipeline Browser の下、Properties と Informationの並びのタブに Multi-block Inspector のタブが追加される と 思 い ま す（図5参 照）。sample1で は Block と し て「Mesh_A」のみが定義されており、その下に6個の Pieceが定義されています。これらのチェックボックスを用いることで表示グループの表示の ON/OFF を切り替えられます。なお、sample1では立方体の表面メッシュ（全て三角形）のみが出力されています。
幾つか注意点があります。一部の Block や Piece のみを表示した状態で時間フレームを移動させるとモデル全部を表示する状態に変わってしまうことがあります。これは ParaView のバグだと思われます。そんな時は、何れか1つの Block か Piece のチェックボックスを2度クリック（ON にしてまた OFF に戻す等）すれば意図し た 通 り の 表 示 に 戻 り ま す。 ま た、 一 部 の Block やPiece の み を 表 示 し た 状 態 で Reset（意 味 的 に は Fit

sample1の ParaView 可視化例。
（32-5）

Vol.26, No.1 2021

チュートリアル

ParaView 超入門 其の四Window）ボタンを押してもその一部へとはズームされず、あくまでモデル全体に視界がフィットされます。
どうしてもその一部へとズームして欲しい場合はExtract Selection（後述）を使用します。
部分モデルの抽出
可視化モデルの一部をただ表示したい場合は Multiblock Inspector で充分ですが、それをさらに操作したい
場 合 は Extract Selection を 用 い て 部 分 モ デ ル の 抽 出 を
行 っ た 方 が 良 い で し ょ う。 操 作 法 は 簡 単 で、Multiblock Inspector 上で必要な Block や Piece を選択状態にし（チェックボックスの ON ではない）、Extract Selection
ボタンを押すだけです。選択状態にするにはチェックボックス以外の部分を左クリックします。Ctrl ＋左クリ ッ ク や Shift ＋ 左 ク リ ッ ク も 使 用 で き ま す。Multiblock Inspector を使わず、Select Cells On 等の機能を用いて選択することも勿論可能です。
抽出を行うと、Pipeline Browser に「ExtractSelection1」の行が新たに追加されます。この行が選択された状態でReset ボタンを押せば抽出部分のみへと視界がフィットされます。その他の操作を行う場合も、必要な部分だけ抽出しておいた方が楽に行えることが多いでしょう。
時刻の表示
開いた vtm.series ファイルには時刻の情報が含まれて
い ま す。 こ れ を ParaView の 画 面 上 に 表 示 す る に は メ
ニューバーから Sources → Annotation → Annotate Time を選択します。画面上に時刻が表示されるはずです。似たような機能で Filters の中に Annotate Time Filter があります
が、こちらは vtm.series ファイルに書かれた時刻情報を参照しないので今回の使い方ではお勧めできません。

図6計算工学電着塗装解析のサンプル
最後に、比較的実用に近い可視化例として、著者が開発している電着塗装解析のサンプルを紹介したいと思います。サンプルデータの sample2を開いてみてくだ
さい。おもちゃの車が塗料で満たされた電着槽をくぐり抜ける際に電気が流れ、塗膜が析出してゆくアニメーションが見られます。sample1同様、出力は表面メ ッ シ ュ の み で す。Properties の 中 の Backface
Representation を Cull Frontface に変更すると内部が見易くなります（図6参照）。Block は3つあり、電着槽メッシ ュ（pool）、 車 体 周 辺 メ ッ シ ュ（body）、 お よ び ユ ー
ザーが事前指定した特定の要素表面（picked_face）に分かれています。車体メッシュだけを表示する等の操作が簡単に出来るため利便性が向上します。

9

おわりにvtm.series ファイルを使う方法で自作コードの時系列
解析結果を ParaView で一発表示する方法を紹介しました。表示グループに関する操作が商用 FEM ソフトの機能（例 え ば ABAQUS Viewer の Display Group 機 能）と 比べて今一つの使い勝手ですが、あらかじめ細かめにBlock や Piece へ分けておけば作りたい絵は一応出来る方法かと思います。紹介した方法を自分なりにアレンジしてご利用頂ければ幸いです。
次号では Fortran コードで今回の vtm.series ファイルを使う方法を実現するテクニックなどを紹介する予定です。

sample2の ParaView 可視化例。
（32-6）

Vol.26, No.1 2021