平成14年4月30日 豊田英司
NuSDaS は気象庁予報部数値予報課で開発された数値予報のための データベース*1システムである。 NuSDaS のドキュメントとしては公式マニュアルが既に存在しており 利用法については一通り説明されている。 本文書はシステムの設計や実装について検討し Pandora との関係および 今後の維持開発の方向性について議論することを目的とする。
NuSDaS は数値予報で利用される観測、解析、予報のデータを 管理することを前提として設計された。 したがって、数値予報データに特化した前提の上で効率性が追求されている。 ここではその前提 (すなわちデータ工学一般の視点からは 数値予報データのデータモデル) について議論する。
データベースはデータを何らかの方法で分節化し、 区分されたデータを入出力するものである。 したがって当然、データの分節方法と指定方法が必要である。 現行の NuSDaS では、データは必ず特定のレコード (入出力の単位。たかだか2次元の格子で、通常は水平面・等圧面) に帰属する ことになっており*2、 レコードは以下のキー*3 を用いて指定される。
16 文字*4の名前であり 種別1, 種別2, 種別3からなる。 種別1はデータ作成処理を表す4文字のモデル名と 空間種類からなる。 空間種類はレコードの面内に張られている格子系をあらわす2次元座標系と 面の意味をあらわす第3座標からなる。 種別2はデータの属性をあらわす2文字と 時間軸上の代表性や統計処理などをあらわす2文字の 時間種類からなる。 種別3は任意の4文字の名前である。
解析時刻、予報初期時刻、あるいは観測を取りまとめるための参照時刻。 NuSDaS のほとんどの部分(後述するレコード作成時刻を除く) において 日時は1801年1月1日0時0分(UTC) からの経過時間 (分) で表現する *5。
アンサンブル予報のメンバ、レーダーサイトなどの名前。
予報時刻、観測時刻などのデータの時刻。 積算値などの時間範囲を扱えるように対象時刻1と対象時刻2 の2つの時刻の組*7 からなる
レコードの位置付けの名前 (たとえば地表面を示す SURF
など)。
2つの面の間のデータを表現できるように面1と面2の
2つの名前の組で構成される*8。
要素は物理量、たとえば気温と気圧の区別を表す。
データの入出力に際しては上記のキーをすべて指定する必要がある。 メタデータの入出力に際しては面と要素 (と場合によってはメンバーと対象時刻) は省略できる。
公式文書では、前節で記したキーは次元と呼ばれている。 これはデータセット全体を配列とみる考え方から来ている。 この考え方では、ある種別で指定される NuSDaS データセットは
による 7 次元配列だということになる。 そこで、単なる配列としてデータベースを構成することは可能であるが、 必ずしも得策とはかぎらない。
その理由は、物理的必然、モデルの構造、運用上などさまざまの理由により 各キーのとりうる値は (配列のように) 独立ではないことによる。 たとえば、基準時刻が 00 時と 12 時では予報時間のリストが 異なるであるとか、 地表面にしか降水量はないが上層にしかジオポテンシャル高度がない、 といったような事情のことである。 すると、このような問題がある。
キーの組み合わせによってはレコードがないこともある、 ということを前提にしたデータ構造を記述し API を整備するためには、 配列とは異なった概念的枠組 (データモデル) が必要である。 そのようなデータモデルにはたとえば 関係モデルや木構造が挙げられるが、 NuSDaS のインターフェイスは 特に何かのデータモデルを前提として整理されているわけではない *10。 そこで、次節では実装について議論する。
NuSDaS が管理するデータは NuSDaS ルート (NuSDaS root directory, 以下 NRD と称する) と呼ばれるディレクトリ 内に配置された定義ファイルと NuSDaS ファイルから構成される。 ひとつの定義ファイルが複数の NuSDaS ファイルに対応しうる。 NRD は多数の定義ファイルを包含しうる。 要するに、以下のような帰属関係である。
NuSDaS ファイル ∈ 定義ファイル ∈ NRD
定義ファイルはデータの種別と1対1対応するものである。 NuSDaS ファイルの分け方は定義ファイルの書き方による。
これらは NRD 内の種別、基準時刻、メンバ、対象時刻に対応する ファイルに配置される。
NuSDaS ファイルの形式には v1.0 ファイル形式 と ESファイル形式 がある。これらは定義ファイルの path ステートメントで区別される。
位置 | 長さ | 型 | 内容 |
byte | byte | ||
0 | 4 | 整数 | レコード長 n |
4 | 4 | 文字 | レコード種別 |
8 | 4 | 整数 | レコード有効長 m (m >= n - 8) |
12 | 4 | 整数 | UNIX の time_t の形式でレコード作成時刻 |
16 | m - 8 | --- | レコード内容 |
8 + m | n - m - 8 | --- | 空き (普通は存在しない) |
n - 4 | 4 | 整数 | レコード長 n |
NuSDaS ファイルは可変長のレコード (record) の羅列である。 レコードは 図1 のような構造を持つ。 これは Fortran の書式なし順番探索ファイルを模したものであり、 順方向および逆方向のレコード単位のシークができるようになっているが、 レコード長にレコード長フィールド自体の長さ (4 byte × 2 = 8 byte) を含んでいる *11 ので直接 Fortran から読むことはできない。
レコードの役割はレコード種別欄の値によって以下のように決まっている。
識別部。ファイルの先頭レコードとしてただ1つ存在しなければならない。 作成元、NuSDaS 版数、 ファイル総バイト数が書かれている
管理部。ファイルの第2レコードとしてただ1つ存在しなければならない 同定情報 (種別・基準時刻)、 内部構造情報 (メンバ、対象時刻、面、要素のリスト)、 空間情報 (格子系指定などのジオメトリ情報) を収める
アドレス部。ファイルの第3レコードとしてただ1つ存在しなければならない メンバ番号、対象時刻番号、面番号、要素番号を添字として DATA レコードのバイトオフセットを収める配列
補助管理部。アドレス部の次に存在してもよい。 σ, η, z* 系についての鉛直格子記述、 レーダー運用情報などのメタデータを収める
情報部。補助管理部の次に存在してもよい。 ユーザ定義の任意のメタデータを収める
データ部。補助管理部の次に任意個存在してよい
終了部。ファイルの最終レコードとしてただ1つ存在しなければならない
同じ NuSDaS インターフェイスでも、ES*12を用いる場合は ファイル形式が変わる。具体的にはファイルが順番探査ではなく 直接探査となっており、NUSD, INDX, END レコードを欠き SUBC, INFO レコードが必須となっている。
レコードの構造は未調査である。
NuSDaS データセットの操作は原則としてインターフェイスを通じて行う。 ただし、一部のデータ管理処理は直接ファイル操作で行われているものもある。
NuSDaS 定義ファイルは NuSDaS データセットの構造を 定義するプレーンテキストファイルである。 定義ファイルは行指向である。 各行は空白によって語に区切られる。 行頭語が予約語 (大文字と小文字を区別しない) になっている行が ステートメントを構成する。 行頭語が予約語でない行は直前の行の続きとしてひとつのステートメントとして 解釈される。
とくに断りがないかぎり、ステートメントは省略可能である。 ステートメントを記述する順番が決まっているものがあるので注意されたい (とりあえず、以下の構文例示の順序であれば問題ないのでお勧めする)。
構文規則の中で、縦線 | は「または」を示す。
NuSDaS のバージョン番号を記述します。 省略した場合は 1.0 が想定されます。
NuSDaS ルート内のディレクトリ構造を指示します。 具体的には次のようになっています。
template を変数名置換した結果をディレクトリ名とします。 デフォルトは ``/_model/_attribute/_space/_time/_name'' です。
``path relative_path /_3d_name'' と ``filename _validtime'' を指定するのと同等です。
``path relative_path /_3d_name'' と ``filename _member'' を指定するのと同等です。
``path relative_path /_3d_name/_member'' と ``filename _validtime'' を指定するのと同等です。
``path relative_path /_3d_name/_basetime'' と ``filename _validtime'' を指定するのと同等です。
ファイル名を filename を変数名置換したものにします。 デフォルトでは _basename です。
データセットの作成者を指示します。 いまのところ、ルーチンではあまり使われていないようです。
必須項目です。 _model は数値予報モデルを識別します。 _2d は入出力の単位となる面が属する空間の種類を指示します。 _3d は面を識別する座標の種類を指示します。
必須項目です。 _attribute は予報、解析、観測などのデータの属性を表します。 _time は瞬間値、平均値、平年値などの時間方向の代表性を表します。
必須項目です。 _name は 4 文字の名前です。
n_dc は識別符の数を指示します。 第3語が out のとき、複数識別符は別のファイルに格納され、 in のとき複数識別符は同じファイルに格納されます。
識別符を列挙します。
参照時刻を指示します。 YYYYmmddHHMM の書式は UNIX コマンド date(1) で を用いて date +%Y%m%d%H%M としたときと同様です。
必須項目です。 対象時刻の数 n_vt と単位 unit を指示します。 unit は min, hour, day, pen, mon, week, jun のいずれかでなければなりません。 第3語が out のとき、複数対象時刻は別のファイルに格納され、 in のとき複数対象時刻は同じファイルに格納されます。
どちらかの形が必須です。 arithmetic は予報時間 (対象時刻と参照時刻の差) が 初項 initial, 公差 step の等差数列であることを示します。 all_list は n_vt 個の予報時間のリストが 後に続くことを示します。
value は n_vt 個の正の値のリストであるか、 1 個の負の値です。 正の値の場合は vt1 vt2 vt3 ... にそれぞれ対応する順番の value を加えたものが対象時刻2となります。 負の値の場合は vt1 vt2 vt3 ... にそれぞれ $-$value を加えたものが対象時刻2となります。
面の数を指示します。
面の名前 name を最大で n_lv 個列挙します。
面間データで使用するための第二面の名前 name を最大で n_lv 個列挙します。 省略時は plane1 と同じリストになります。
必須項目。 要素の数 n_el を指定します。
必須項目。要素名 elemname と 要素ごとに許される面・対象時刻・識別符の組み合わせを指示する ビットマップ elementmap からなります。 詳細は次節を参照してください。
必須項目。 面の格子数 (nx, ny) を指示します。
基準点 $(x, y)$ の経緯度 (lon, lat) を指示します。 経緯度は数字に N, E, W, S のいずれかを後置したものです。 面が水平面でない場合の処置は未調査です。
格子間隔を指示します。面が経緯度等間隔格子である場合は単位は度、 それ以外の格子である場合は地図上距離 (m)。 面が水平面でない場合の処置は未調査です。
地図投影法に依存する意味をもつ標準経緯度を指示します。 面が水平面でない場合の処置は未調査です。
地図投影法に依存する意味をもつ標準経緯度を指示します。 面が水平面でない場合の処置は未調査です。
格子に対する値の代表性を指示します。 ``PVAL'' は格子点値、 ``MEAN'' は平均値、 ``REPR'' は代表値を指示します。
圧縮方式 compression を指示します。 デフォルトは面ごとの 16 ビット圧縮です。
欠損値の表現方法を指示します。 ``NONE'' は欠損値を許しません。これがデフォルトです。 ``UDFV'' の場合はデータ書き込み前に欠損値を設定しなければなりません。 ``MASK'' の場合はデータ書き込み前に欠損範囲ビットマップを 設定しなければなりません。
本ステートメントがあると、 各データファイルに情報部レコードが作成されます。 初期値はファイル filename の内容です。
本ステートメントがあると、 各データファイルに補助管理部レコードが作成されます。 補助管理部レコードの種別 group と大きさ size を指示します。
本ステートメントがある場合、 各レコードは size バイトの Fortran 直接探査ファイルとなります。 デフォルトでは順番探査ファイルとなります。
定義ファイルのパス規約やファイル名の指定では、 表の「変数名」が適切な値に置換されて使われます。
変数名 | 置換内容 |
_model | モデル名 |
_2d | 2次元の格子系 |
_3d | 第3次元 |
_attibute | 属性 |
_time | 時間種類 |
_name | 名前 |
_space | _2d_3d の略語 |
_base | 現在時刻 |
_valid | 対象時刻 |
_member | メンバ |
_plane | 面識別子 |
elementmap はある element が各 member, validtime, plane について 存在するかを示すもので、一種の連長圧縮を施された独自の形式の数字列に なっています。
「数値予報標準データセットシステム (NuSDaS)」. 2000年3月7日, 気象庁予報部数値予報課.
*1 正式には「データセットシステム」といっている
*2 つまり、レコードをさらに細分することや、
複数のレコードにまたがるデータの取得は、
少なくとも今のところはできない。
*3 公式マニュアルの用語では「次元」
*4 Pandora では読みやすいように
``_GSMLLPP.FCSV.STD1
'' のように種別1-3の間に
ピリオドを入れた表記を用いるため、18文字を要する
*5 32bit 符号つき整数でこの通算分がオーバーフローするのは 5884 年なので
表現形式としては当面問題ない。
*6公式マニュアルでは識別子
*7 瞬間値の場合は対象時刻2を欠損値すなわち 1 とする
*8単独の面の上で定義されるデータについては
面1と面2を同じ名前にする
*9対象時刻から基準時刻を引いた予報時間 forcast time
にすると、リストが基準時刻によらなくなることが多い。
実際、後述する定義ファイルでは予報時間を用いている
*10そりゃ、配列だと自称しているのだからあたりまえだ
*11典型的な Fortran 書式なし順番探索ファイルの場合は
レコード(記録) の前後に入るレコード長には
レコード長の長さを含まない。
*12日立 SR8000 に特有の
メモリファイルシステムのようなもの。