ryuon
ずっと気になってた NetCDF を使ってみた。
よしっと言って、本腰を入れてみると、なるほど、これはもっと早くに使うべきであった
ポイントは
データの可搬性(ってのは NetCDF の一番のポイントらしい)
データの入出力の保証 (fprintf で %.17e して fscanf で %lf とかみっともないことする必要がない)
バイナリなので fprintf-fscanf なテキストファイルよりも小さい (まぁ普通はそれを gzip なり bz2 なりで圧縮するけれども)
データの付加情報をデータに付けられる
最後の「付加情報」の一つとして次元も与えることが出来る。
私の場合これまで何が障壁になっていたのか、をきちんと認識することは大事だろう
tutorial が grid data を主に扱っていて、 粒子系なデータにおける必然性が分からなかった
時系列データの扱いが、よく分からなかった (というか、そこまで読むこちらの気力が無かった)
総じて、 document が抽象的すぎるんだろう。 (つまり、頭の良すぎる document と言えるんだろうけど)
自分の project にそういうことの無いように気を付けた方がよいな
で、そういう私の trivial な疑問に対する答え:
粒子系なデータは一次元配列で扱う (と書くと当り前だな、事実、本当にそのとおり 当り前なんだけど)
場所 x は他の粒子データ (例えば速度 U) と同様に 普通の変数とする
時系列は unlimited な次元というのが使える
とりあえず作ってみた NetCDF file の構造
自分の場合 C で書くとき、ベクトルも行列もベタっと一次元配列だけですませる
ベクトルの場合は r[np*3] と取って r=(x0,y0,z0, x1,y1,z1, ...) と並べる。
なので、空間次元の 3 を vec として陽に導入して、以下のように定義してみた
netcdf test {
dimensions:
p = 256 ;
vec = 3 ;
time = UNLIMITED ;
variables:
int p(p) ;
int vec(vec) ;
int time(time) ;
double x0(p, vec) ;
x0:long_name = "positions of particle center at t0" ;
double x(time, p, vec) ;
x:long_name = "positions of particle center" ;
double U(time, p, vec) ;
U:long_name = "translational velocities" ;
data:p = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
...中略...
248, 249, 250, 251, 252, 253, 254, 255 ;vec = 0, 1, 2 ;
...以下省略...
}
こうすれば普通にその C の pointer を NetCDF に渡すことができる。
5/15/2007: CDF というものを見つける
10/6/2008: stnc utility tool の stnc を書き始める。