[次] [性急過ぎる ] [トップ ] [内容 ] [インデックス ] [ netCDFホームページ ] [ユニ‐データホームページ]

FortranのためのNetCDFユーザーのガイド

アペンディクスBファイルフォーマット仕様


このアペンディクスは、netCDFを指定するフォーマットバージョン1をファイルしなさい。このフォーマットは、少なくともnetCDFライブラリバージョン3.0を経て使用中であろう。

BNFを使って、そのフォーマットが最初に正式に提示される文法表記法。文法において、任意のコンポーネントは、中括弧 ( [ and ] ) の間に囲まれている。コメントは、` // 'キャラクターに従う。非ターミナルは、小文字にあり、そして、ターミナルは、大文字にある。ゼロのシーケンス、または、実体の更に多くの出来事は、[実体... ]表示される`。

詳細におけるフォーマット



netcdf_file :=ヘッダデータ

ヘッダ:=の魔法のnumrecs dim_array gatt_array var_array

魔法の:= 'C' 'D' 'F' VERSION_BYTE

VERSION_BYTE := '\001' //、ファイルフォーマットバージョン番号、

numrecs := NON_NEG

dim_array :=、不在の、|NC_DIMENSION nelems [薄暗い... ]

gatt_array := att_array //グローバルな属性

att_array :=、不在の、|NC_ATTRIBUTE nelems [ attr ... ]

var_array :=、不在の、|NC_VARIABLE nelems [ var ... ]

ABSENT := ZERO ZERO //ミーンズアレイ、ない、プレゼント ( // nelems == 0への等価物 ) 。

結果に従う際のエレメントのnelems := NON_NEG //数

薄暗い:=名前dim_length

ストリングと:=を指定する

dim_length := NON_NEG // Ifゼロ、これは、レコード次元である。
//せいぜい1つのレコード次元があることができる。

attr :=名前nc_type nelems [値]

nc_type := NC_BYTE|NC_CHAR|NC_SHORT|NC_INT|NC_FLOAT|NC_DOUBLE

var :=名前nelems [ 2‐中央の... ] vatt_array nc_type vsizeは、// nelemsを始める、//変数のランク ( 寸法があること ) である;スカラ、ベクトル、//マトリックス、...のための2のための1のための0。

vatt_array := att_array //の変数‐特定の属性

//変数形のための2‐中央の:= NON_NEG // Dimension ID ( dim_arrayへのインデックス ) 。我々は、最初の//次元がレコード次元であるならば、そして、最初の//次元がレコード次元でありさえすれば、これが「レコード//変数」である、と言う。

:= NON_NEG //変数サイズをvsizeしなさい。もしそうでなければ、レコード変数、//、//に割当てられたバイトにおけるスペースの量、その変数のデータ。この数は、次元長さ、掛ける4バイト//境界に詰め物をされたタイプの//サイズの//製品である。〜ならば、レコード変数、それは、レコードにつきスペースの//量である。netCDF //「レコードサイズ」は、//の和として計算される、vsizeのもの、レコード変数のうちで。

:= NON_NEG // Variableスタートロケーションを始めなさい。この変数のためのデータの//初めのファイルにおける//バイト ( インデックスを求める ) におけるオフセット。

データ:= non_recsレクリエーション

non_recs := [値... ]//第1位のデータは、var、第2の//非レコードvar、...を伝えない。

レクリエーション:= [レクリエーション... ]//最初のレコード、第2のレコード、...。

レクリエーション:= [値... ]//第1位のデータは、レコード// nのための変数、レコードn、...のための第2のレコード変数を伝える。
//特別なケースのために下のノートを見なさい。

値:= [バイト]|[木炭]|[半ズボン]|[ ints ]|[フロート]|[ダブル]

ストリング:= nelems [木炭]

バイト:= [ BYTE ... ]パディング

木炭:= [ CHAR ... ]パディング

半ズボン:= [ SHORT ... ]パディング

ints := [ INT ... ]

フロート:= [ FLOAT ... ]

ダブル:= [ DOUBLE ... ]

:=〈0、1、2、または、3バイト〜次に4バイト境界〉// Inヘッダに詰め物をして、パディングは、0バイトを持っている。//データにおいて、パディングは、変数のフィル‐値を持っている。

NON_NEG :=〈非負の値を持つINT〉

ZERO :=〈ゼロの値を持つINT〉

バイト:=〈8ビットバイト〉

シャール:=〈〈8ビットACSII/ISOがキャラクタをコード化した〉

SHORT :=〈〈16ビットは、整数に署名した、Bigendian、2は、補数である〉

INT :=〈〈32ビットは、整数に署名した、Bigendian、2は、補数である〉

フロート:=〈32ビットIEEE単精度フロート、Bigendian〉

二重の:=〈64ビットIEEE倍精度フロート、Bigendian〉

//タグは、32ビットINTsである
NC_BYTE := 1 //データは、8ビット署名された整数の配置である
NC_CHAR := 2 //データは、キャラクタの配置である、すなわち、テキスト、
NC_SHORT := 3 //データは、16ビット署名された整数の配置である
NC_INT := 4 //データは、32ビット署名された整数の配置である
NC_FLOAT := 5 //データは、IEEE単精度フロートの配置である
NC_DOUBLE := 6 //データは、IEEE倍精度フロートの配置である
NC_DIMENSIONに以下。= 10
NC_VARIABLEな:= 11 NC_ATTRIBUTE := 12

ファイルオフセットを計算すること

計算するために、指定されたデータ値のオフセット ( ファイルの中のポジション ) は、external_sizeofに指定された変数、nc_typeのための適切なタイプの1つのデータ値のバイトで外部のサイズでさせた:



NC_BYTE 1 NC_CHAR 1 NC_SHORT 2 NC_INT 4 NC_FLOAT 4 NC_DOUBLE 8
コールに関して、に、NF_OPEN ( 、〜もしくは、NF_ENDDEF ) 、変数の配置によるスキャンは、上のvar_arrayを表示し、そして、recsizeすると推定するための「レコード」変数のvsizeフィールドを合計する。

右からレコード変数のために最も左の ( レコード ) 次元を飛ばす、そして、結果を各変数のための製品アレイに格納する左まで変数のために次元長さの製品を形成しなさい。例えば:



変数を記録しないでください:

次元の長さ:[ 5 3 2 7 ]、製品、[ 210 42 14 7 ]

変数を記録しなさい:

次元の長さ:[ 0 2 9 4 ]、製品、[ 0 72 36 4 ]
この点で、4の次の倍数に切り上げられたとき、最も左の製品は、上の文法において変数サイズ、vsizeである。例えば、上の非レコード変数において、vsizeフィールドの値は、212である ( 210 4の倍数に切り上げられる ) 。レコード変数のために、これが既に4の倍数であるので、vsizeの値は、ほんの72である。

coordに一連の所望のデータ値の座標でさせ、そして、相殺されて、所望の結果にしなさい。それから、オフセットは、単にcoord、及び、製品ベクトル、掛けるサイズの内積に加えられた所望の変数 ( その、フィールドを始める ) の最初のデータ値のファイルオフセットである ( 変数のための各データのバイトで ) 。最終的に、その変数がレコード変数、レコード番号、` coord[0] '、及び、レコードサイズの製品がrecsizeすることであるかどうかは、最終のオフセット値をもたらすために、加えられる。

偽りの‐Cコードにおいて、ここにオフセットの計算がある:



innerProduct += product[i]のために ( innerProduct = i = 0 ; i < var.rank ; i++ ) 、* coord[i]は、= var.beginを相殺した;
offset += external_sizeof * innerProduct if ( IS_RECVAR ( var ) ) offset += coord[0] * recsize ; .

従って、データを得るために、以下を評価しなさい ( 外部の表現において ) 。



lseek ( fd、オフセット、SEEK_SET ) ;
read ( fd、buf、external_sizeof ) ;

特別なケース:ちょうど1つのレコード変数がある所で、我々は、各々が示す制限を落とす、並べられた4バイトである、それほどこの場合、レコードパディングがない。

上の文法を用いることによって、我々、得る、次元、変数なし、属性なしを持たない最も小さい正当なnetCDFファイル、従って、データなし。空のnetCDFファイルのCDL表現、である、



netcdfは、移す{ }
これあなたがCDL表現からそれを生成するために` ncgen -b empty.cdl 'を使うことによって証明するかもしれないように、空のnetCDFファイルは、32バイトを持っている。それは、4バイト「魔法数」 ( それがnetCDFバージョン1ファイルであると確認する ) によって始まる:'C'、'D'、'F'、'\001'。下記は、レコード、空の一連の次元、空の一連のグローバルな属性の数、及び、空の一連の変数を表す7 32ビット整数ゼロである。

下記は、Unixコマンドを使うビッグエンディアンマシン上で作られたファイルの ( 編集される ) ダンプである



od -xcs empty.nc
ファイルの各16バイト部分は、4行によって表示される。最初のラインは、16進においてバイトを示す。第2のラインは、キャラクタとしてバイトを示す。第3のラインは、各一群の署名された16ビット整数と解釈された2バイトを示す。第4のライン ( 人間によって加えられる ) は、netCDFコンポーネント、及び、値に関してバイトの解釈を提示する。



4344 4601 0000 0000 0000 0000 0000 0000 C D F 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 17220 17921 00000 00000 00000 00000 00000 00000 [ magic number ] [ 0 records ] [ 0 dimensions ( ABSENT ) ]

0000 0000 0000 0000 0000 0000 0000 0000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 00000 00000 00000 00000 00000 00000 00000 00000 [ 0 global atts ( ABSENT ) ] [ 0 variables ( ABSENT ) ]
僅かにあまりささいでない例としてCDLを考察する



netcdfの小さい{次元:
= 5を薄暗くしなさい;
変数:
短いvx ( dim ) ;
データ:
vx = 3、1、4、1、5 ;
}
92バイトnetCDFファイルと一致する。下記は、このファイルの編集されたダンプである:



4344 4601 0000 0000 0000 000a 0000 0001 C D F 001 \0 \0 \0 \0 \0 \0 \0 \n \0 \0 \0 001 17220 17921 00000 00000 00000 00010 00000 00001 [ magic number ] [ 0 records ] [ NC_DIMENSION ] [ 1 dimension ]

0000 0003 6469 6d00 0000 0005 0000 0000 \0 \0 \0 003 d i m \0 \0 \0 \0 005 \0 \0 \0 \0 00000 00003 25705 27904 00000 00005 00000 00000 [ 3 char name =「dim」] [ size = 5 ] [ 0 global atts

0000 0000 0000 000b 0000 0001 0000 0002 \0 \0 \0 \0 \0 \0 \0 013 \0 \0 \0 001 \0 \0 \0 002 00000 00000 00000 00011 00000 00001 00000 00002 ( ABSENT ) ] [ NC_VARIABLE ] [ 1 variable ] [ 2 char name =

7678 0000 0000 0001 0000 0000 0000 0000 v x \0 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0 \0 30328 00000 00000 00001 00000 00000 00000 00000「vx」] [ 1 dimension ] [ with ID 0 ] [ 0 attributes

0000 0000 0000 0003 0000 000c 0000 0050 \0 \0 \0 \0 \0 \0 \0 003 \0 \0 \0 \f \0 \0 \0 P 00000 00000 00000 00003 00000 00012 00000 00080 ( ABSENT ) ] [ type NC_SHORT ] [ size 12 bytes ] [ offset : 80 ]

0003 0001 0004 0001 0005 8001 \0 003 \0 001 \0 004 \0 001 \0 005 200 001 00003 00001 00004 00001 00005 -32767 [ 3 ] [ 1 ] [ 4 ] [ 1 ] [ 5 ] [ fill ]

詳細におけるフォーマット
ファイルオフセットを計算すること

FortranのためのNetCDFユーザーのガイド- 1997年6月5日
[次] [性急過ぎる ] [トップ ] [内容 ] [インデックス ] [ netCDFホームページ ] [ユニ‐データホームページ]