以下の CDLの例では、幾つかの名前付き次元( lat , lon , time )、変数( z , t , p , rh , lat , lon , time )、変数属性( units , _FillValue , valid_range )とデータからなるNetCDFファイルを記述しています。
netcdf foo { // CDLによるNetCDF指定の例
dimensions:
lat = 10, lon = 5, time = unlimited;
variables:
int lat(lat), lon(lon), time(time);
float z(time,lat,lon), t(time,lat,lon);
double p(time,lat,lon);
int rh(time,lat,lon);
lat:units = "degrees_north";
lon:units = "degrees_east";
time:units = "seconds";
z:units = "meters";
z:valid_range = 0., 5000.;
p:_FillValue = -9999.;
rh:_FillValue = -1;
data:
lat = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90;
lon = -140, -118, -96, -84, -52;
}
全ての CDL 宣言文はセミコロンで終わります。スペース・タブ・改行は可読性の為に自由に使えます。コメントは ダブルスラッシュ //に続き、どの行にも配置可能です。
CDL 記述は次元・変数・属性の3つのオプション部分から構成されます。変数部は変数宣言文や属性割り当てを含むことが出来ます。
次元はCDL記述で記述される多次元変数の形を定義するために使われます。次元には名前と長さがあります。CDL記述の次元の内、一つの次元まで無制限長を持つことが出来、それはこの次元を使う変数が任意の長さになり得る(ファイル中の記録番号のように)ことを意味します。
変数は同じ型の値の多次元配列を表現します。変数は名前・データ型・そして次元のリストによって記述された形を持ちます。各変数はデータ値のほかに関連する属性(下記参照)も持ちえます。 名前・データ型・変数の形はCDL記述中の変数部分における宣言文によって指定されます。変数は次元と同じ名前を持つことが出来ます。慣習として、そのような変数は 次元の座標値を名前に含んでいます。
属性は変数やNetCDFファイル全体についての情報を含んでいます。属性は単位・特別な値・有効な値の最大値と最小値・圧縮パラメーターのような特性を指定するのに使われます。 属性情報は単一の値や値の配列によって表現されます。例えば、 units は celsius 等の文字列によって表現される属性です。属性には関連する変数・名前・データ型・長さがあります。 データ用の変数とは対照的に、属性は従属的なデータ(データに関するデータ)のためにあります。
CDLでは、属性は変数と属性名とをコロン( `:' ) で区切ったもので指定される。変数名を省略し、属性名をコロン( `:' ) ではじめることによって、NetCDFファイル全体に グローバル属性を割り当てることもできます。 CDLの属性のデータ型はそれに割り当てられている値の型で決まります。属性の長さはデータ値の数又はそれに割り当てられた文字列中の文字の数になります。文字でない属性に複数の値を割り当てる場合には、値をコンマ( `,' )で区切れば可能です。属性に割り当てられた値は全て同じ型でなくてはいけません。
変数・属性・次元に対するCDL 名には、英数字と `_' 及び `-' の任意の組み合わせが許可されているが、 ` _ 'で始まる名前はライブラリ専用です。CDL名では大文字小文字は区別されます。NetCDFライブラリはNetCDF名に制約を加えていないので、有効なCDL名ではない名前を使って変数を定義することも可能ですが薦められません。 基本的なデータ型の名前はCDLでは予約語であるので、変数・次元・属性の名前は型の名前は取れません。
CDL記述のオプションのデータ部分では、 NetCDF 変数が 初期化されます。 初期化のお構文は単純です。
variable = value_1, value_2, ノ ;
コンマで区切られた定数のリストは、空白・タブ・改行によって分けることができます。多次元配列では、最後の次元が最も早く変わります。 よって、行列には行順ではなく列順が使われます。 変数を満たすのに不十分な値が与えられた場合には、フィル値によって埋められます。定数の型は変数に宣言された型と一致していなくても良く、例えば、整数を浮動小数点数に強制的に変換するといった操作が行なわれます。意味のあるタイプ変換は全てサポートされています。
フィル値用の特別な記述がサポートされています。 `_' 文字は変換のためのフィル値を指します。