openFOAM-2.3.1における結果出力の際の圧縮の是非

もう時代はopenFOAM-3なので、書いたところで誰も得しないが…。

controldictで出力するファイルをtar.gz形式で圧縮するか選べる。ストレージの圧縮を最低限に抑えるため使用していた。

本日、これを使うとmapfieldsなどのオプションでまともに読み込めず、間違った値が入力されることが発覚。他にも問題があったような気がするし、とにかく安全を考えるとasciiかつ圧縮無しが一番無難なよう。
しかし、同じようなことを考える人はかなり多いと思うのだが、改善されないもんだろうか?出力形式を変えたら問題なく動いたのでたぶんバグだと思うのだが…。

openFOAMでこれなので、やっぱりIO処理は難しいんだなあと再認識した。自分のコードでは、自分で頑張らずHDF5さんに全て任せようと改めて強く思う次第。

openFOAMってそこまで便利か?

タダより高いものはない。非構造格子でのメッシュ作成を必要とする実用的な問題が解きたい場合、商用ソフトのほうが絶対に良い。

使用するまでにかかる時間やメッシュ作成・修正の手間を考えると、ちょっと必要な時間のロスが大きすぎる。使い方を一通り覚えるまでの辛抱かと思っていたが、メッシュを変えるたびに計算の破綻におびえる日々はストレスがやばい。


有限体積法による非構造格子の取り扱い方自体が格好悪くてあまり好きになれないということもある。境界適合格子ならばまだ許せるが…。
理論の美しさは有限要素法の足元にも及ばないし。自作のFEMソルバーのほうが安定するような気さえする。計算時間が大きくなるのはやむを得ないとして。


openFOAMがちょうどいい問題って、メッシュが構造格子な、わりとprimitiveな問題に限られる気がする。計算手法の基礎的な研究目的にはいいかもしれないが…。

FunkySetFieldsによるcell zone全体への値の設定方法

openFOAMで使用するメッシュの一部をcell zoneとして陽に定義しておけば、後からcell zone内の変数の値を一括で変更することができる。
これはスカラーの移流拡散やVOFを用いた計算の初期値の設定の際などに応用がきく。

ただ、この文法がいまいちよくわからず、日本語で上記のことを説明している文章が見つからなかったので忘備録として記述する。

ファイル自体に書いておく方法もあるが、これは結構説明してくれている。
http://www.ofwikija.org/images/Swak4Foam%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%282%29.pdf

コマンドラインからも変更できて便利なので、そっちを書いておく。
なお、swak4foamは必須である。web上の資料もしくは以前のエントリを参照のこと。下記の通り。

funkySetFields -filed 設定したい変数名 -condition "zone(設定したいzone名)" -expression 値 -time 設定したい時間(0なら不要)


平たく言えば、オプションの一つであるconditionに上記のように記述すればよい。
conditionについて、数式を使った設定方法の記述は多いのだが、やりたいことはもっと単純だよねってことで…。

Vsphere-1.7.8 (VCAD)のインストール

Vsphereと言えば、vmwareが出してるソフトウェアの一つだけれども、実は同名のソフトウェアを理研が公開している(要登録)。
VCAD システム研究プログラム

純国産コードのみでのCAEの統合開発環境の構築を試みたVCADシステム、その中核を担うソフトウェアだが、ちょっとググった限りではそれほど広く普及しているとは言い難い。
そんな中で諸事情により本ソフトウェアをローカル環境にインストールする必要に迫られた。

理研の上記リンクからVsphereをダウンロードして展開し、

./configure --prefix=$HOME/Vsphere
make

をまずやってみた。これに失敗。
エラーを見ると、SKLTiming.hの中でfprintfが定義されていないと言われる。いやいや、stdio.hにあるだろ…。
不信感にかられつつSKLTiming.hの中を見るとstdio.hのインクルードがない。別のインクルードファイルで間接的に引用しているとかも見たところなさげ。
わけがわからんなーと思いつつ、SKLTiming.hの一番上に#include を書き足してmakeを行う。

これで最後までmakeができたので

make install

今度も問題なし。まあ、とりあえず動くかな…と、思い、サンプルコードを探してみたら見つからない。どうやらそんな軟弱なものは提供していないらしい。


諸事情から、Vsphereを使った物理計算のコードが手元にあったので、Vsphereのprefixを自分のローカル環境に書き換えてコンパイルしてみた。


しかし再度失敗。どうやらg++やgfortranと相性があまりよろしくないらしい。仕方ないのでIntelコンパイラで再度Vsphereをインストールする。ついでにopenmpiも最新版を設定しておいた(前のエントリ)。

./configure --prefix=$HOME/Vsphere --enable-openmpi=$HOME/openmpi CXX=icpc F90=ifort CXXFLAGS=-O3 F90FLAGS=-O3 LDFLAGS=-L/opt/intel/lib/intel64
make
make install

インストール後、手元のコードをコンパイルすると、無事実行ファイルが作成され、mpiが正常に動作することを確認した。

しかしデフォルトで出力されるファイルはVCADシステムオリジナルのバイナリファイルで中身のフォーマットさえ分からない。計算結果の確認さえできない。
どうやらまた別の可視化ソフトV-isioを使わないといけないらしい。面倒。このへんがいまいち流行ってない原因だろうか…。

openmpi-1.10.1のインストール

openmpiの最新版が二日前にリリースされていたので、ローカル環境にインストールを行った。
tar.gzファイルを落として解凍し、
./configure --prefix=$HOME/openmpi-1.10.1
make
make install
で終了。.bashrcに
export PATH=$HOME/openmpi-1.10.1/bin:$PATH
export MANPATH=$HOME/openmpi-1.10.1/share/man:$MANPATH

と書いて終了。気軽なもんです。includeとlibのパスはmakefileに書くので無視。


2016/04追記
bigvalley.hatenablog.com

C++によるHDF5からの入力

日曜日の全てをかけてHDF5とXDMFの使い方を調べてきたが、これでやっと一段落だろうか。
C++によるHDF5からのデータの入力方法について、公式サイトのsampleがこちら。

HDF5 C++ API: readdata.cpp

いろいろとsampleとしての処理を行っているためか、ぱっと見で把握できなかった。
そこで上を参考にして、ただdouble型の2次元配列を読み込むためだけのコードを作成してみた。
下記に示す。templateを使用すれば任意の型に対応できると思う。
(追記(11/3):boostのmulti_arrayを導入して一部簡略化した)

#include<iostream>
#include<H5Cpp.h>
#include"boost/multi_array.hpp"

using namespace std;

int main(){

	H5::H5File file("SDS.h5", H5F_ACC_RDONLY);
	H5::DataSet dataset = file.openDataSet("doubleArray2"); 
	H5::DataSpace dataspace = dataset.getSpace();

	int rank = dataspace.getSimpleExtentNdims();

	hsize_t dims_out[2];
	int ndims = dataspace.getSimpleExtentDims( dims_out, NULL);
	int NX = (unsigned long)(dims_out[0]);
	int NY = (unsigned long)(dims_out[1]);
	cout << "rank " << rank << ", dimensions " << NX << " x " << NY << endl;

	boost::multi_array<double,2> data(boost::extents[NX][NY]);

	dataset.read(data.data(),H5::PredType::NATIVE_DOUBLE);

	for(int i=0;i<NX;i++){
		for(int j=0;j<NY;j++) cout << data[i][j] << " ";
		cout << endl;
	}
}

先の書き込み用フォーマットと併せてオリジナルのクラスを作成すれば、HDF5におけるIO処理はほぼ全ての処理が自動化できる。
ここまでやって初めて、自分でバイナリのファイルを作成するよりはるかに作業の効率化が望めるだろう。週末をこれでつぶした甲斐はあったかな…。