2001年05月06日 豊田英司
多次元数値データのための自己記述的データ格納フォーマットとして NetCDF などのタグ付き配列的なバイナリファイルフォーマットが使われている。地球流体電脳倶楽部 davis プロジェクトではデータ格納形式の共通化をめざした実験的研究の一環として gtool4 netCDF 形式を発表して netCDF の利用推進に努めている。NetCDF ファイルの利点は自己完結的なファイルを作成するのが容易なことである。
一方、 netCDF ファイルは特定のインターフェイスで作成する必要があり、いささか敷居が高いというのも事実である。そこで、典型的な4次元浮動小数点データに限って、netCDF と同じデータモデルを持ちながらより扱いやすい形式を提案する。これは GrADS の格子点データ記述ファイルと互換性があり、GrADS でプレビューしながら、あるいは GrADS 用のデータを書きかえることによってデータを作成することができる。
データの表現形式にいくつか種類があったとしても、それらのデータモデルが共通ならば、下位の入出力インターフェイスでほとんど吸収できると期待される。
ここではファイルを解釈する方法について議論する。解釈を行うプログラムとしては GrADS そのものと GSC の全機能を認識するものが想定されている。ここでは GrADS の動作と対比しつつ GSC の拡張機能について説明する。GSC 拡張機能を利用するユーザインターフェイスとしては netCDF ライブラリと互換のものを想定しているので、GSC 拡張機能の解釈を規定するとは、各行の情報が netCDF インターフェイスからみてどのような情報になるかを説明することである。
GSC データはプレーンテキストである。ここで、プレーンテキストとは Fortran で書式つき順番探査として作成・読み込みできるファイルのこととする。ファイルは行からなる。行の定義は Fortran で記録と呼ばれるもののことである。各行の長さは 255 文字を超えてはならない。
行の長さに関する制限値は GrADS に由来する。この制限はコメントにも当てはまると解される。
行頭の文字が '*' である行はだいたいコメント行である。これらはすべて GrADS にとってコメントとなる。行頭が "*!" または "*>" の行は GSC 拡張構文である。
通常は1行がそれぞれ独立した意味をもつが、中には XDEF のように複数行でひとつの意味をもつものもある。このような複数行を文ということにする。
語とは行を空白で区切ったものをいう。文頭の語は文の種別をあらわす。たとえば文頭の語が "DSET" であるものは DSET 文という。
特に断らない限り、語の意味は語中の英字が大文字であっても小文字であっても変わらない。
DSET 行の解釈は GrADS と同じ。すなわち、DSET の次の語はデータを格納するファイル名を表す。ファイル名は大文字と小文字を区別することがある。ファイル名の先頭の文字が "^" である場合はコントロールファイルの位置からの相対パスを表す。
相対パス機能はローカルファイルとしてコントロールファイルを参照する場合には有益だったが、ネットワーク環境では不充分なものである。WWW ブラウザを用いてコントロールファイルを取得した後で MIME type ハンドラとして解釈系を起動するようなシステム設計を困難にするからである。したがってネットワーク複写によってコントロールファイルの解釈が壊れることを防ぐためには、相対位置の原点を記述できなければならない。 その方法については *!BASE 文を参照されたい。
大域属性 :title として解釈される。
OPTIONS 文は第2語以降に以下の語を列挙するものである。
TEMPLATE オプションを指定している場合、DSET 文のファイル名の中にある % 文字は時間によって置換される。この機能によりファイルを時間によって分割して保存できる。有効な指定は以下の通り。
分割単位 指定 備考 年 %y2 下2桁 %y4 4桁 月 %m1 1桁または2桁 %m2 2桁、必要ならば先頭にゼロを補う %mc 月名3字、大文字か小文字かは GrADS では規定されていない 日 %d1 1桁または2桁 %d2 2桁、必要ならば先頭にゼロを補う 時 %h1 1桁または2桁 %h2 2桁、必要ならば先頭にゼロを補う %h3 3桁、必要ならば先頭にゼロを補うものと思われるが意義は不明 予報時間
(初期からの
通算時間)%f2 2桁、100以上ならば3桁 %f3 3桁 分 %n2 2桁
また % の次に i を挿入して %iy2, %iy4, %im1, %im2, %imc, %id1, %id2, %ih1, %ih2, %ih3, %in2 のようにすると時間の代わりに初期時刻を用いて置換する。
全ての変数について変数属性 :missing_value として解釈される。変数ごとに異なる欠損値を指定することはできない。
GrADS 界では慣例として -999.0 を欠損値とすることが多い。二進展開では誤差が出るので、-999.9 は避けるべきである。
XDEF, YDEF, ZDEF, TDEF ではじまる次元指定文はそれぞれ lon, lat, lev, time という次元変数を定義・確定するものとする。その典型例は以下のようなものである。
文例 | 意味 |
XDEF 20 LINEAR 0 10 | lon の格子数は 20。最初の格子位置は東経0度、格子間隔は10度。 |
ZDEF 8 LEVELS 1000 950 850 700 500 300 200 50 | lev の格子数は 8。格子位置は 1000 ... 50。 |
TDEF 365 LINEAR 00:00Z01JAN2001 01DY | time の格子数は 365。最初の格子は 2000 年1月1日0時UTC から1日間隔 |
VARS 文は以下のような構文をもつ。
VARS 変数の数 変数名 レベル数 ユニット指定 説明 ... ENDVARS
ただし、変数名は12字以内、説明は40字以内という制約がある。
レベル数は ZDEF で指定した格子数を超えない非負の整数で、 lev 方向の格子数を指定するものである。レベル数を 0 にすると、変数は lev を次元としなくなる。つまり、変数の次元依存性が (lon, lat, lev, time) が (lon, lat, time) となる。
ユニット指定はデフォルトで99とする。GrADS では以下の特殊な指定ができる。
指定 意味 -1,10,1 ファイル格納ループ順の lev と var を入れ替えて (lon, lat, var, lev, time) とする。 -1,10,2 デフォルトに同じ (lon, lat, lev, var, time) -1,20,時間レベル数 ファイル格納ループ順の var と time を入れ替えて (lon, lat, lev, time, var) とする。TEMPLATE オプションを使用する場合はファイルごとの 時間レベル数 を指定する。 -1,30 ファイル格納ループ順の lon と lat を入れ替えて (lat, lon, lev, var, time) とする。これは極めてアクセス効率が悪い。 -1,40,1 データ型を1バイト符号なし整数とする -1,40,2 データ型を2バイト符号なし整数とする -1,40,-2 データ型を2バイト符号有り整数とする -1,40,4 データ型を4バイト整数とする
拡張変数部の拡張たるゆえんは二つある。ひとつは一般に {lon, lat, lev, time} のいずれかからなる任意の次元依存性を持つ変数を定義すること、もうひとつは変数値を別ファイルでなくコントロールファイル自身に保持する方法を提供することである。
GrADS においては変数の次元依存性は (lon, lat, lev, time) または (lon, lat, time) だけで、変更できるのは層数だけであった。たとえば (lon), (lon, lat) などの次元依存性をもつデータは (lon, lat, time) の変数にすると極めて格納効率が悪い。これをインラインで表現する方法を提供すべきである。
構文は以下の通り。
*!XVARS 変数の数 *!変数名 nlon nlat nlev ntime 実体 ... *!ENDXVARS
ここで nlon nlat lnev ntime はそれぞれ * (全格子), 0 (依存性なし), - (格子数を1減じる) のいずれかであり、実体 は INTERNAL, AXIS, DSET指定 のいずれかである。
*!ATTR *!:global_attr=value *!var:attr=value *>var:attr=value& *>&value_continued& *!&value_continued_end ... *!ENDATTR
属性部は ATTR 文、属性指定文、ENDATTR 文の順に構成される。
属性指定文の最初のコロンまでが変数名、その後の最初の等号までが属性名である。等号のあとが値と解釈される。
属性指定文には継続行がありうる。行頭が '*>' となっている行は継続行と呼ばれ、次の行とあわせて解釈することを示す。
属性は netCDF の用語でいえば本来文字型である。実数型・整数型の値を必要とする場合には内部ファイルに対する入出力文で変換を行う。
たとえば以下のようなものである。
*!SLICE varname 0 0 * 0 *!1 2 3 4 5 6 ... *!SLICE varname * * z t *>0.1 2.4 4.3 1.1 *>... *!4.8 1.7 8.0
データ部は SLICE 文とデータ本体が交互に続く。SLICE 文は変数名と位置を指定するものである。位置は x, y, z, t のそれぞれについて合計4個指定され、それぞれ 0, *, 正の数値のいずれかを指定する。正の数値は格子番号を示す。数字 0 は当該次元に依存性がないことを示す。文字 * は当該次元について変数の領域の全範囲を示す。
次元 z または t について全範囲指定を行う場合は x または y について全範囲指定を行ってはならない。
データ本体は属性指定文と同様の継続行であるかもしれない。行頭の2字('*!' または '*>'))を除去すると、データ本体は並びによる入力文を用いて実数型の値に変換可能なものでなければならない。
データ本体を配置する順序は自由とするが、典型的操作においてファイルの再走査をなるべくしないで済ませるために、以下の慣例に従うことが望ましい。まず、変数を配置する順序は複数格子を有する次元によって以下のように決める。
時間に依存するデータ本体は、変数によらず時間順に並べる。
GSC ファイルは情報を失うことなく NetCDF ファイルに変換することができる。つまり、NetCDF インターフェイスを用いて GSC ファイルを読み込むようなライブラリを作成することができる。
以下の制約を満たす NetCDF ファイルは GSC に変換できる(それが適切であるか否かはさておきとして)。したがって、同じ条件のもとで NetCDF インターフェイスを用いて GSC ファイルを作成するようなライブラリを作成することができる。
地点観測結果を強引に GrADS 格子点データセットとするために X 軸を地点の番号とし、地点情報などのメタデータをコントロールファイルに記入した例。
*!BASE http://www.gfd-dennou.org/path/ DSET ^station%y4.dat OPTIONS BIG_ENDIAN TEMPLATE TITLE hourly station report UNDEF -999.0 XDEF 5 LINEAR 1 1 YDEF 1 LINEAR 1 1 ZDEF 1 LINEAR 1000 -100 TDEF 8760 LINEAR 16Z31DEC1996 1HR VARS 5 p 0 99 [hPa] surface pressure psea 0 99 [hPa] sea level pressure t 0 99 [K] temperature u 0 99 [m/s] v 0 99 [m/s] ENDVARS *!XVAARS index * 0 0 0 AXIS stnid * 0 0 0 INTERNAL lat * 0 0 0 INTERNAL lon * 0 0 0 INTERNAL *!ENDXVARS *!ATTR *!p:units=hPa *!p:long_name=surface pressure *!psea:units=hPa *!psea:long_name=sea level pressure *!t:units=K *!t:long_name=temperature *!u:units=m/s *!u:long_name=eastward wind component *!v:units=m/s *!v:long_name=northward wind component *!index:units=1 *!stnid:long_name=international station ID *!stnid:units=1 *!lat:long_name=latitude *!lat:units=degree_N *!lon:long_name=longitude *!lon:units=degree_E *!ENDATTR *!SLICE stnid * 0 0 0 *!47401 47402 47407 47412 47417 * Wakkanai, Kitamiesashi, Asahikawa, Sapporo, Obihiro *!SLICE lat * 0 0 0 *!45.4 44.9 43.8 43.1 42.9 *!SLICE lon * 0 0 0 *!141.7 142.6 142.4 141.3 143.2