私家版 NuSDaS ドキュメント

平成14年4月30日 豊田英司

はじめに

NuSDaS は気象庁予報部数値予報課で開発された数値予報のための データベース*1システムである。 NuSDaS のドキュメントとしては公式マニュアルが既に存在しており 利用法については一通り説明されている。 本文書はシステムの設計や実装について検討し Pandora との関係および 今後の維持開発の方向性について議論することを目的とする。

表記について

NuSDaS のデータ構造

NuSDaS は数値予報で利用される観測、解析、予報のデータを 管理することを前提として設計された。 したがって、数値予報データに特化した前提の上で効率性が追求されている。 ここではその前提 (すなわちデータ工学一般の視点からは 数値予報データのデータモデル) について議論する。

データの分節

データベースはデータを何らかの方法で分節化し、 区分されたデータを入出力するものである。 したがって当然、データの分節方法と指定方法が必要である。 現行の NuSDaS では、データは必ず特定のレコード (入出力の単位。たかだか2次元の格子で、通常は水平面・等圧面) に帰属する ことになっており*2、 レコードは以下のキー*3 を用いて指定される。

種別(type)

16 文字*4の名前であり 種別1, 種別2, 種別3からなる。 種別1はデータ作成処理を表す4文字のモデル名空間種類からなる。 空間種類はレコードの面内に張られている格子系をあらわす2次元座標系と 面の意味をあらわす第3座標からなる。 種別2はデータの属性をあらわす2文字と 時間軸上の代表性や統計処理などをあらわす2文字の 時間種類からなる。 種別3は任意の4文字の名前である。

基準時刻(basetime)

解析時刻、予報初期時刻、あるいは観測を取りまとめるための参照時刻。 NuSDaS のほとんどの部分(後述するレコード作成時刻を除く) において 日時は1801年1月1日0時0分(UTC) からの経過時間 (分) で表現する *5

メンバ*6(member)

アンサンブル予報のメンバ、レーダーサイトなどの名前。

対象時刻(validtime)

予報時刻、観測時刻などのデータの時刻。 積算値などの時間範囲を扱えるように対象時刻1対象時刻2 の2つの時刻の組*7 からなる

面(plane)

レコードの位置付けの名前 (たとえば地表面を示す SURFなど)。 2つの面の間のデータを表現できるように面1面2の 2つの名前の組で構成される*8

要素 (element)

要素は物理量、たとえば気温と気圧の区別を表す。

データの入出力に際しては上記のキーをすべて指定する必要がある。 メタデータの入出力に際しては面と要素 (と場合によってはメンバーと対象時刻) は省略できる。

データモデル

公式文書では、前節で記したキーは次元と呼ばれている。 これはデータセット全体を配列とみる考え方から来ている。 この考え方では、ある種別で指定される NuSDaS データセットは

  1. 基準時刻、
  2. メンバ、
  3. 対象時刻*9
  4. 面、
  5. 要素、
  6. 面内の第1次元、
  7. 面内の第2次元

による 7 次元配列だということになる。 そこで、単なる配列としてデータベースを構成することは可能であるが、 必ずしも得策とはかぎらない。

その理由は、物理的必然、モデルの構造、運用上などさまざまの理由により 各キーのとりうる値は (配列のように) 独立ではないことによる。 たとえば、基準時刻が 00 時と 12 時では予報時間のリストが 異なるであるとか、 地表面にしか降水量はないが上層にしかジオポテンシャル高度がない、 といったような事情のことである。 すると、このような問題がある。

キーの組み合わせによってはレコードがないこともある、 ということを前提にしたデータ構造を記述し API を整備するためには、 配列とは異なった概念的枠組 (データモデル) が必要である。 そのようなデータモデルにはたとえば 関係モデルや木構造が挙げられるが、 NuSDaS のインターフェイスは 特に何かのデータモデルを前提として整理されているわけではない *10。 そこで、次節では実装について議論する。

NuSDaS のデータ形式

NRD と定義ファイル

NuSDaS が管理するデータは NuSDaS ルート (NuSDaS root directory, 以下 NRD と称する) と呼ばれるディレクトリ 内に配置された定義ファイルと NuSDaS ファイルから構成される。 ひとつの定義ファイルが複数の NuSDaS ファイルに対応しうる。 NRD は多数の定義ファイルを包含しうる。 要するに、以下のような帰属関係である。

NuSDaS ファイル ∈ 定義ファイル ∈ NRD

データ分節との対応

定義ファイルはデータの種別と1対1対応するものである。 NuSDaS ファイルの分け方は定義ファイルの書き方による。

これらは NRD 内の種別、基準時刻、メンバ、対象時刻に対応する ファイルに配置される。

NuSDaS ファイルの形式には v1.0 ファイル形式ESファイル形式 がある。これらは定義ファイルの path ステートメントで区別される。

v1.0ファイル形式

NuSDaS レコードの構造
位置長さ内容
bytebyte
04整数レコード長 n
44文字レコード種別
84整数レコード有効長 m (m >= n - 8)
124整数UNIX の time_t の形式でレコード作成時刻
16m - 8---レコード内容
8 + mn - m - 8---空き (普通は存在しない)
n - 44整数レコード長 n

NuSDaS ファイルは可変長のレコード (record) の羅列である。 レコードは 図1 のような構造を持つ。 これは Fortran の書式なし順番探索ファイルを模したものであり、 順方向および逆方向のレコード単位のシークができるようになっているが、 レコード長にレコード長フィールド自体の長さ (4 byte × 2 = 8 byte) を含んでいる *11 ので直接 Fortran から読むことはできない。

レコードの役割はレコード種別欄の値によって以下のように決まっている。

NUSD

識別部。ファイルの先頭レコードとしてただ1つ存在しなければならない。 作成元、NuSDaS 版数、 ファイル総バイト数が書かれている

CNTL

管理部。ファイルの第2レコードとしてただ1つ存在しなければならない 同定情報 (種別・基準時刻)、 内部構造情報 (メンバ、対象時刻、面、要素のリスト)、 空間情報 (格子系指定などのジオメトリ情報) を収める

INDX

アドレス部。ファイルの第3レコードとしてただ1つ存在しなければならない メンバ番号、対象時刻番号、面番号、要素番号を添字として DATA レコードのバイトオフセットを収める配列

SUBC

補助管理部。アドレス部の次に存在してもよい。 σ, η, z* 系についての鉛直格子記述、 レーダー運用情報などのメタデータを収める

INFO

情報部。補助管理部の次に存在してもよい。 ユーザ定義の任意のメタデータを収める

DATA

データ部。補助管理部の次に任意個存在してよい

END△

終了部。ファイルの最終レコードとしてただ1つ存在しなければならない

ESファイル形式

同じ NuSDaS インターフェイスでも、ES*12を用いる場合は ファイル形式が変わる。具体的にはファイルが順番探査ではなく 直接探査となっており、NUSD, INDX, END レコードを欠き SUBC, INFO レコードが必須となっている。

レコードの構造は未調査である。

NuSDaS の利用

NuSDaS データセットの操作は原則としてインターフェイスを通じて行う。 ただし、一部のデータ管理処理は直接ファイル操作で行われているものもある。

書式とコード表

定義ファイル

NuSDaS 定義ファイルは NuSDaS データセットの構造を 定義するプレーンテキストファイルである。 定義ファイルは行指向である。 各行は空白によって語に区切られる。 行頭語が予約語 (大文字と小文字を区別しない) になっている行が ステートメントを構成する。 行頭語が予約語でない行は直前の行の続きとしてひとつのステートメントとして 解釈される。

とくに断りがないかぎり、ステートメントは省略可能である。 ステートメントを記述する順番が決まっているものがあるので注意されたい (とりあえず、以下の構文例示の順序であれば問題ないのでお勧めする)。

構文規則の中で、縦線 | は「または」を示す。

nusdas version

NuSDaS のバージョン番号を記述します。 省略した場合は 1.0 が想定されます。

path 指定

NuSDaS ルート内のディレクトリ構造を指示します。 具体的には次のようになっています。

path relative_path template

template変数名置換した結果をディレクトリ名とします。 デフォルトは ``/_model/_attribute/_space/_time/_name'' です。

path nwp_path_s

``path relative_path /_3d_name'' と ``filename _validtime'' を指定するのと同等です。

path nwp_path_vm

``path relative_path /_3d_name'' と ``filename _member'' を指定するのと同等です。

path nwp_path_m

``path relative_path /_3d_name/_member'' と ``filename _validtime'' を指定するのと同等です。

path nwp_path_bs

``path relative_path /_3d_name/_basetime'' と ``filename _validtime'' を指定するのと同等です。

filename filename

ファイル名を filename変数名置換したものにします。 デフォルトでは _basename です。

creator creator

データセットの作成者を指示します。 いまのところ、ルーチンではあまり使われていないようです。

type1 _model _2d _3d

必須項目です。 _model は数値予報モデルを識別します。 _2d は入出力の単位となる面が属する空間の種類を指示します。 _3d は面を識別する座標の種類を指示します。

type2 _attribute _time

必須項目です。 _attribute は予報、解析、観測などのデータの属性を表します。 _time は瞬間値、平均値、平年値などの時間方向の代表性を表します。

tyep3 _name

必須項目です。 _name は 4 文字の名前です。

member n_dc in|out

n_dc は識別符の数を指示します。 第3語が out のとき、複数識別符は別のファイルに格納され、 in のとき複数識別符は同じファイルに格納されます。

memberlist member, member, ...

識別符を列挙します。

basetime YYYYmmddHHMM

参照時刻を指示します。 YYYYmmddHHMM の書式は UNIX コマンド date(1) で を用いて date +%Y%m%d%H%M としたときと同様です。

validtime n_vt in|out unit

必須項目です。 対象時刻の数 n_vt と単位 unit を指示します。 unitmin, hour, day, pen, mon, week, jun のいずれかでなければなりません。 第3語が out のとき、複数対象時刻は別のファイルに格納され、 in のとき複数対象時刻は同じファイルに格納されます。

validtime1 arithmetic initial step
validtime1 all_list vt1 vt2 vt3 ...

どちらかの形が必須です。 arithmetic は予報時間 (対象時刻と参照時刻の差) が 初項 initial, 公差 step の等差数列であることを示します。 all_listn_vt 個の予報時間のリストが 後に続くことを示します。

validtime2 value

valuen_vt 個の正の値のリストであるか、 1 個の負の値です。 正の値の場合は vt1 vt2 vt3 ... にそれぞれ対応する順番の value を加えたものが対象時刻2となります。 負の値の場合は vt1 vt2 vt3 ... にそれぞれ $-$value を加えたものが対象時刻2となります。

plane n_lv

面の数を指示します。

plane1 name name name ...

面の名前 name を最大で n_lv 個列挙します。

plane2 name name name ...

面間データで使用するための第二面の名前 name を最大で n_lv 個列挙します。 省略時は plane1 と同じリストになります。

element n_el

必須項目。 要素の数 n_el を指定します。

elementmap elemname elementmap

必須項目。要素名 elemname と 要素ごとに許される面・対象時刻・識別符の組み合わせを指示する ビットマップ elementmap からなります。 詳細は次節を参照してください。

size nx ny

必須項目。 面の格子数 (nx, ny) を指示します。

basepoint x y lon lat

基準点 $(x, y)$ の経緯度 (lon, lat) を指示します。 経緯度は数字に N, E, W, S のいずれかを後置したものです。 面が水平面でない場合の処置は未調査です。

distance x y

格子間隔を指示します。面が経緯度等間隔格子である場合は単位は度、 それ以外の格子である場合は地図上距離 (m)。 面が水平面でない場合の処置は未調査です。

standard lon lat lon2 lat2

地図投影法に依存する意味をもつ標準経緯度を指示します。 面が水平面でない場合の処置は未調査です。

others lon lat lon2 lat2

地図投影法に依存する意味をもつ標準経緯度を指示します。 面が水平面でない場合の処置は未調査です。

value PVAL|MEAN|REPR

格子に対する値の代表性を指示します。 ``PVAL'' は格子点値、 ``MEAN'' は平均値、 ``REPR'' は代表値を指示します。

packing compression

圧縮方式 compression を指示します。 デフォルトは面ごとの 16 ビット圧縮です。

missing NONE|UDFV|MASK

欠損値の表現方法を指示します。 ``NONE'' は欠損値を許しません。これがデフォルトです。 ``UDFV'' の場合はデータ書き込み前に欠損値を設定しなければなりません。 ``MASK'' の場合はデータ書き込み前に欠損範囲ビットマップを 設定しなければなりません。

information filename

本ステートメントがあると、 各データファイルに情報部レコードが作成されます。 初期値はファイル filename の内容です。

subcntl group size

本ステートメントがあると、 各データファイルに補助管理部レコードが作成されます。 補助管理部レコードの種別 group と大きさ size を指示します。

forcedlen size

本ステートメントがある場合、 各レコードは size バイトの Fortran 直接探査ファイルとなります。 デフォルトでは順番探査ファイルとなります。

変数名置換

定義ファイルのパス規約やファイル名の指定では、 表の「変数名」が適切な値に置換されて使われます。

変数名置換のキーワード
変数名置換内容
_modelモデル名
_2d2次元の格子系
_3d第3次元
_attibute属性
_time時間種類
_name名前
_space_2d_3d の略語
_base現在時刻
_valid対象時刻
_memberメンバ
_plane面識別子

elementmap

elementmap はある element が各 member, validtime, plane について 存在するかを示すもので、一種の連長圧縮を施された独自の形式の数字列に なっています。

elementmap の BNF

種別名

メンバ名

要素名

引用文献

公式マニュアル

「数値予報標準データセットシステム (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 に特有の メモリファイルシステムのようなもの。