市來健吾の日記

プログラマ、(元)物理屋(ナノテク、流体)

ryuon


  • ずっと気になってた NetCDF を使ってみた。

  • よしっと言って、本腰を入れてみると、なるほど、これはもっと早くに使うべきであった

  • ポイントは

    1. データの可搬性(ってのは NetCDF の一番のポイントらしい)

    2. データの入出力の保証 (fprintf で %.17e して fscanf で %lf とかみっともないことする必要がない)

    3. バイナリなので fprintf-fscanf なテキストファイルよりも小さい (まぁ普通はそれを gzip なり bz2 なりで圧縮するけれども)

    4. データの付加情報をデータに付けられる

  • 最後の「付加情報」の一つとして次元も与えることが出来る。

    • なので、の yet another UDF については、やっぱり、そんな「車輪の再発明」なんかしないで NetCDF を宣伝する方が正解だろう (結果としての happy が大きいだろう)

    • 本当の innovation と「車輪の再発明」的態度 (というか"create it" 的態度) の線引きは微妙なんだろうけれど、これまたアラン・ケイ別の言葉を思い出す。

    • 一つの自明なこととして、独自ファイル形式と「囲い込み」の関係があるけれど、 この場合そこに真意はないと思いたい。 そもそもこれって事実だと思うし。

  • 私の場合これまで何が障壁になっていたのか、をきちんと認識することは大事だろう

    • 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 を書き始める。