読者です 読者をやめる 読者になる 読者になる

paraviewによる並列計算結果の一括可視化フォーマット

ライブラリ

しばらく前から探していた、並列計算結果のparaviewでの出力フォーマットを発見した。
これを以前のhdf5と組み合わせれば、たいていの結果の可視化には耐えうるのでは。


Generating vtu and pvtu files -- CFD Online Discussion Forums

"Vmware上"のUbuntu14.04へのopenmpi-1.10.2のインストール

開発環境 ライブラリ

こんなもん、普通にソースコード落としてきて、

解凍→./configure→make→make install

で終わりだろうと思っていた時代が…僕にもありました…。


Vmware上で作業するときは、解凍場所をWindowsとの共有フォルダにしていたらシンボリックリンクが張れないのですね…。



これを知らずに、なぜmakeができないのか、一時間くらいずっと悩んでいた…。

Sublime text3でLatex

開発環境

今時Latexかよ、wordでいいじゃんと、言いたい奴には言わせておけばよい。
数理系ではまだまだ現役だし、適切なテンプレートがあれば入力は非常にはかどる。

とはいえ、以前のエントリでも記入した通り、作業環境の構築が地味にめんどい。
どーしたものかと悩んでいたら、同じ部署の先輩からsublime textで書けるよと教えてもらった。
ちょっと調べてみたら、

yanoshi.hatenablog.jp


上の手順でやってみたらすごい簡単にできたので報告。


なお、Livetext2015の導入にあたり、ローエンドのPCにインストールする場合はちゃんとDVDを焼きましょう。

vtkファイルフォーマット(バイナリ形式)

バイナリ形式によるvtkファイルのフォーマットがやっとわかったので書き留めておく。
意外と日本語で解説している人、いないのよね…。


また、日本語サイトでちらほら見つかるアスキー形式のvtkファイルも、ほぼ全てがレガシーなフォーマット(.vtk)の解説になっている。

最新のvtk形式はxmlによる記述を採用しており、可視化する形状の種類(画像、構造格子、非構造格子、etc.)によって拡張子を変えている(vti,vtuなど)。
ここでは最新のフォーマットについて少しだけ解説する。



基本的な形式は下記のサイトの後半に書かれており、アスキー形式でよければすぐ理解できると思う。
VTK File Formats


サンプルコードは下記の通り。見た目だけでこれのみでは可視化不能。ちなみにこれはImageDataなので拡張子はvtiである。

<?xml version="1.0"?>
<VTKFile type="ImageData" version="1.0" byte_order="LittleEndian" header_type="UInt64">
  <ImageData WholeExtent= "Xmin Xmax Ymin Ymax Zmin Zmax" Origin= "x0 y0 z0" Spacing= "dx dy dz">
    <Piece Extent= "Pxmin Pxmax Pymin Pymax Pzmin Pzmax" > 
      <PointData>
      </PointData>
      <CellData Scalars="Scalar">
        <DataArray type="Float32" Name="Scalar" format="appended" RangeMin="minValue" RangeMax="maxValue" offset="0">
        </DataArray>
      </CellData>
    </Piece>
  </ImageData>
  <AppendedData encoding="raw">

    _NNNN(Data(Binary))

  </AppendedData>
</VTKFile>


ヘッダ部の変数は直観的にだいたい想像がつくので解説は割愛。
これは画像だが直交格子を使った計算などならこれでも対応できると思われる。

可視化したいデータをAppendedとして、最後にまとめて貼り付ければいいのでコーディングも割と楽だと思う。

ただ、注意として、
・データの頭に必ずアンダーバー(_)を配置しないといけないこと
・8バイト(もしくは4)のint型で、dataの総バイト数を記述すること(下記NNNN)4か8かは二行目のheader_typeに依存。UInt64なら8.
を忘れてはならない。encodingをrawとしているためこれは必須。

上記サイトにも注意があるかもしれないが、おそらく見落としていた。
偶然見つけた下記がなければまだ悩んでいたと思われる。感謝。
'Re: [Paraview] VTK XML Binary Output' - MARC
What they don’t tell you about VTK XML binary formats
VTK XML Formats - KitwarePublic

C/C++用語集

雑記

 これまでにググったC/C++の用語をまとめておく。
ふわっと意味が分かっている単語もそれが大量に羅列されるとストレスがたまるので、そこそこ簡単なものも節操なく書く。c++の絵本読めばわかるレベル。

 構造体やクラス内で定義された関数や変数を、その構造体もしくはクラスのメンバと呼ぶ。

 主に名前空間内の関数の呼び出しに使用。using namespace ~で省略可。
もしくはクラス内のstaticかつpublicな関数ならば(そう明示して定義すれば)、そのクラスのオブジェクト(class A; みたいなやつ)を定義しなくても呼び出すことが可能。

  • ヒープとスタック

 これはC/C++関係ない。プログラム内でデータをメモリに保管する際、適当な領域を確保する必要がある。
このときプログラム内で後々領域を移動できるよう、動的に確保した領域をヒープ、一度指定したらもう動かせない領域をスタックと呼んでいるらしい。
ヒープ領域ならばメモリのどの場所にあるかを明示することができる。この住所みたいなもんを、そのままアドレスと呼ぶ。
ヒープとスタック | 学校では教えてくれないこと | [技術コラム集]組込みの門 | ユークエスト株式会社
 C/C+で悪名高いポインタは、ポインタの名前のみをスタック領域に保存し、内部のデータをヒープ領域に保存している。Cでファイルの入出力のときに定義するポインタも、ファイルの中身をIO処理するのでわざわざメモリに固定する必要がないという経緯から定義されている?

構造体やクラス内のメンバがスタック領域にあるときの呼び出し方。構造体もしくはクラスの宣言に依存。
A.hogehogeみたいなやつ。

構造体やクラス内のメンバがヒープ領域にあるときの呼び出し方。構造体もしくはクラスの宣言に依存。
A->hogehogeみたいなやつ。


  • 値渡し、ポインタ渡し、参照渡し

 関数の定義の際の変数の設定方法。値渡しはただ単に設定した変数のコピーがそのまま関数に入力される。関数側でその変数の値が変わったところで、入力側に影響しない。

ポインタ渡しと参照渡しの定義は若干混乱が見られる。C言語だと両方同じものを指すが、C++だと少し意味が異なる。

 関数の宣言に*Aとして記述されていればポインタ渡し。入力側が指定したアドレスがコピーされて関数側に入力される。アドレスの差す領域自体は不変なので、関数内で値が変わると入力側の値も変更される。
面白いことに、スタック領域に定義した変数も、関数の呼び出しの際に&Aと書くことでスタック領域のアドレスが関数内にコピーされ、領域内の値を変更できる。

 関数の宣言に&Aとして記述されていれば参照渡し。スタックだろうがヒープだろうが、どこに保管したデータもアドレス自体は必ず持っている。それを明示したのがポインタだが、スタックだってアドレスがなければコンピュータは認識できない。参照渡しとは、わざわざポインタを明示しなくても、ポインタ渡しと同じことが出来るようになる渡し方であろう、と、考えられる。ポインタ渡しにしてしまうと、その関数内では全ての変数をポインタとして書かないといけないので、アロー演算子が必要になったり面倒くさい。参照渡しにしておけば、通常の変数として特にストレスなく書けるのでなんとなく楽。

 なお、値渡しと参照渡しでは比較にならないほど参照渡しの方が速いらしい。値渡しをC++ユーザが使用するメリットはないので、手当り次第&をつけて定義すれば多分よさげ。ただ、参照渡しにするということは変数の中身が書き代わる可能性を含むということなので、場合によってはconstを記述する。
値渡しと参照渡しとポインタ渡し - Windows より Mac より Linux がいい
C++ 速度比較(2) 参照渡し vs 値渡し vectorにおける比較 - のんびりしているエンジニアの日記

netcdf-4.4.0のインストール(Ubuntu14.04)

データ管理用フォーマットとして名高いnetcdfをインストールした。


ソースコードをダウンロードしてきて、

./configure --prefix=/home/hoge/netcdf-4.4.0
make
make install

で終了。なぜかhelpを見てもhdf5との依存関係の設定方法が書いてなかった。

後はc++APIでも落としてこようかなと思わなくもないが、とりあえずFFV-Cでnetcdfが使えるよう再設定を試みる。

Paraviewによる成分からのベクトルの可視化

開発環境

ちょっと調べたらすぐ見つかったのでメモ。

成分からベクトル作成 - Mesh Wiki

便利な世の中ですね。これでFFV-Cはかなり使いこなせつつある。