Russ Rew, Glenn Davis, Steve Emmerson, and Harvey Davies
このマニュアルは変更を一切加えない状態で、作成・配布しても構いません。ただし、その場合には前記の著作権の一文と以下の説明文が全ての複製版に明記されていなければなりません。このソフトウェアと付属しているマニュアル等の文章は全て「原状のままで(無保証で)」提供されており、いかなる保証も付きません。UCARは保証に関する一切の責任を否認することを宣言します。それらの保証は明示・黙示に関わらず責任を否認し、又商品としての黙示的保証及び特定の目的の為の適応性に関する保証も致しません。
Unidata Program Center は University Corporation for Atmospheric Researchによって運営され、National Science Foundationによる補助を受けています。この作品中に示されている見解・発見・結論・推奨等は著者のものであり、必ずしもNational Science Foundationの見解・発見・結論・推奨等を反映しているとは限りません。
この文章中に会社・製品名が記載されていても Unidata Program Centerがそれらの会社・製品等を推奨しているわけではありません。Unidataはこの著作物から得られた情報を宣伝・広告等の目的に使用することを許可しておりません。
Unidata ( http://www.unidata.ucar.edu )はNational Science Foundationがスポンサーしている計画で、全米の大学にコンピューター及びネットワークの革新的な使用方法を提供することによって、大気及び大気関連のデータを最大限に利用し教育・研究に活かすための強力な武器を与えています。そのようなデータを解析・表示するにあたってUnidata Program CenterはUniversity of Wisconsin, Purdue University, NASA, and the National Weather Service等を含む他団体が開発したソフトウェアパッケージを大学側に提供しています。これらのソフトウェアに共通していることはデータをリアルタイムで取得し管理するUnidataが開発したシステムを使用していることです。このことによってUnidataの主張でもある、各地域に必要とされている各大学によるデータベースの独自取得・自己管理を実現できました。重要なのはUnidata 計画がデータセンターを有しないことです。データ管理は「分担」される任務であるべきなのです。
このマニュアル中で紹介されているNetwork Common Data Form (NetCDF) ソフトウェアは本来、数あるUnidataのアプリケーション用に共通のデータアクセス方法を提供する目的で開発されました。これらは定点観測・時系列・定間隔格子・衛星やレーダー観測等の様々なデータの種類を網羅しています。
NetCDFソフトウェアはI/Oライブラリとして機能し、 C・FORTRAN・C++・ Perl等の NetCDF が存在する全ての言語から呼び出し可能です。このライブラリは自己記述型マシン独立型のデータベースにデータを格納・引出します。個々のNetCDF ファイルは多次元の定義された変数(整数・実数・文字・バイト等の複数の種類を含む)を含むことが可能で、さらに各々の変数に従属的なデータ(単位・説明文など)を付随させることが出来ます。このインターフェースは既存のNetCDFファイルに既定された方法でデータを追加することが出来、機能的には(固定長の)記録方式と類似しているところもあります。しかしながら、 NetCDF ライブラリでは変数名・インデックスによってのみデータの直接アクセス格納や引出が可能であり、 ディスク(もしくはメモリ)保存型のファイルにのみ適応することが出来ます。
Unidataのソフトウェアの半分ほどは既にNetCDFアクセス可能になっており、以後、残りのUnidataのアプリケーションについても同様の共有制を持たせる予定です。それによって次のことが可能になります。
NetCDFは既にいくらか成功を収めています。現在ではNetCDFはCRAYからパーソナルコンピュータ、そしてほとんどのUNIXワークステーションを含むコンピュータのプラットフォームとして幅広く使用されています。NetCDFを使ってあるコンピュータ上で(例えばFORTRANで)複雑なファイルを作成し、その同じ自己記述型のファイルを他のコンピュータ上(例えばC)で 一切の変換なしで引き出すことが出来ます。ムNetCDF のファイルはネットワーク経由で転送したり、適切なネットワークファイルシステムを使用することによりリモート・アクセスすることも可能です。
Unidataソフトウェア以外のソフトウェアにおいてNetCDFアクセスを可能にすることはUnidataの支持層の利益に繋がると信じ、NetCDFライブラリをライセンスや重大な規制無く配布し、最新のバージョンをanonymous FTP経由で手に入れられるようにしてあります。このように自由に使用することを許可することによりUnidataの情報を解析・表示する手段のオプションが豊富になることと思われます。Unidataのソフトウェアは大気科学コミュニティー以外でも幅広く受け入れられているようで、現在では数多くのパブリックドメインや商業用データ解析システムがNetCDFファイルを読みこむことが出来ます。
いくつかの 組織ではNetCDFはデータ・アクセス法の標準として採用されており、NCSA(National Center for Supercomputer Applications; University of Illinois at Urbana-Champaignと提携している)ではHDFファイル形式(NCSAで使用されているツールがNetCDFプログラミング・インターフェースを支持する動きもあります。我々はこれらの動きを支持し、協力してきました。
NetCDFのソフトウェアがどれほどサポートされているのかという疑問が 時々寄せられます。 Unidataの正式な立場はNetCDFライブラリに添付されている著作権に関する事項にも述べられておりますが、ソフトウェアは全て‘as is(無保証)’の状態で提供されているというものです。実際には、ソフトウェアは随時アップデートされていくものなので、Unidataは当面、ソフトウェアを改良しつづける予定であります。 Unidataの目的は米国の地球科学者をサポートすることであるので、それらの学会・団体より寄せられた問題点が最優先されることをご了承下さい。
ユーザーの皆様がこのソフトウェアを重宝して下さり、活用法に関するフィードバックや改良点に関する提案を返してくだされば光栄に存じます。
Network Common Data Form (NetCDF)インターフェースのの 目的は 配列指向型のデータを自己記述型でかつポータブルなフォマーットで作成・アクセス・共有することにあります。 「自己記述型」とはそのファイルが自身に含まれるデータに関する情報を内包しているという意味です。「ポータブル」とはファイル内のデータが整数・文字・浮動小数点の格納方式が異なるコンピュータ間でやり取りできるということです。NetCDFインターフェースを使用して作った新しいファイルは、即、「ポータブル」になります。 データアクセス・管理・解析・表示するソフトウェアにNetCDFインターフェースを使用することにより、より有用なソフトウェアを作ることが出来ます。
NetCDFのソフトウェアにはNetCDFデータアクセス用にCとFORTRANのインターフェースを搭載しています。共通のプラットフォーム用にこのようなライブラリは用意されております。
NetCDFデータアクセス用のC++ と Perlのインターフェース もUnidataにより提供されています。NetCDFユーザのご助力によりそのほかのプラットフォームや他のプログラム言語用のソフトウェア・ポート もあります。配列指向型のデータやソフトウェアを共有し、より価値のあるファイルを作成することを目的に、NetCDFのソフトウェア・ライブラリのソースコードは無料で配布されています。
この ユーザー・ガイドはNetCDFデータモデルの紹介ですが、 FORTRAN のインターフェースのみで表示できます。他の言語のインターフェースリンクについてはNetCDF World Wide Web Site http://www.unidata.ucar.edu/packages/netcdf/ をご参照下さい。C, FORTRAN, C++ and Perl 用の表示文書がオンラインであります。同じサイトにUNIXシステム用の参照文書もCとFORTRANのインターフェース用にUNIX ユmanユページの形式であります。NetCDF World Wide Web Siteには他にもNetCDFに関する膨大な情報とNetCDFデータを使用できるソフトウェアへのポインタも掲載されています。
Network Common Data Form、すなわちNetCDF、は配列形式のデータを格納・引出すためのデータアクセス関数ライブラリへのインターフェースです。配列とはn次元(nは0,1,2...)の矩形構造を持ち、その要素が全て同じデータタイプ((例)8ビット文字、32ビット整数)のものを指します。スカラー(単純な一つの値)は0次元の配列です。
NetCDF はデータとは自己記述的でポータブルなオブジェクトの集合体であり、簡単なインターフェースを通じて引出し可能であるべきであるという見方を支持する抽象概念です。配列値 はデータの格納方式に関する事前の知識無しに直接アクセスできます。データに関する補助的な情報(例えば単位等)はデータと伴に格納できます。NetCDFのデータベースは一般的なユーティリティやアプリケーションプログラムを使用してアクセスでき、データの特定フィールドを変換・統合・解析・表示することが可能です。そのようなアプリケーションの開発はデータの有用性を向上させ、又、配列指向型のデータの管理・解析・表示を行うソフトウェアの再利用性の向上に繋がるでしょう。
NetCDFソフトウェアは抽象的データタイプを利用します。これはNetCDFファイル内のデータにアクセス・操作する命令は全てインターフェースによって提供されている関数のみを使わなければならないということです。データの表現はインターフェースを使うアプリケーションからは隠されており、データの格納方式は既存のプログラムに影響を及ぼすことなく変更できます。 NetCDFデータの物理的な表現方法はデータが作成されたコンピュータから独立しているように設計されています。
UnidataはC・FORTRAN・C++・PERL・色々なUNIX OSのためのNetCDFインターフェースを サポートしています。 このソフトウェアは各メジャーリリース前に、他数種類のOS用にこれらのOSのユーザーの皆様のご助力で移植テストをされています。 Unidataの NetCDF ソフトウェアは幅広い利用を促進するためにFTPを通じて無料で配布されております。
何故、配列指向型のデータ格納に関して既存のデータベース管理システムよりNetCDFの方が優れているのでしょうか?それはリレーショナルデータベースソフトウェアがNetCDFインターフェースがサポートするデータアクセス法に適していないからです。
まず、既存のリレーションモデルをサポートするデータベースシステムは データアクセスの基本単位として多次元のオブジェクト(配列)をサポートしていません。配列をリレーションとして表示することは便利なデータアクセス法を不便にし、又、多次元データや座標系の抽象化に対してはほとんど何のサポートもしていません。 配列指向型データを引出・修正・数学的に扱い・表示するためにはまったく異なるデータモデルが必要なのです。
これに関連し、汎用的なデータベースシステムに関する2番目に大きな問題があります。大きな配列に対するパフォーマンスの悪さです。衛星写真・科学的モデルの結果・長期的な全地球気象観測のデータなどを集積を効率的に引出せるように系統立て索引をつけることは既存のデータベースシステムの能力を超えています。
最後に、汎用的なデータベースシステムは資源面でもアクセスパフォーマンス面でも多大な犠牲の元に、配列指向型のデータを解析・管理・表示するためには不必要な機能を提供しています。例えば、精巧なアップデート機能・履歴検査・報告書のフォーマット・業務処理用の機能など科学的な操作には不必要なものばかりです。
ネットワーク透過性(マシン独立性)を達成するために、NetCDFはデータの表現・コード化のための標準プロトコルであるXDR(eXternal Data Representation; ftp://ds.internic.net/rfc/rfc1832.txt参照 ) に似た外部表現機能を利用します。この表現機能はデータをマシン独立型のビット列へとコード化します。 これは8ビットのバイトのみが一貫してコード化されるという前提のみにて、多種類のコンピューター上で既に実装されています。 IEEE 754 浮動小数点標準プロトコルが浮動小数点のデータを表現するのに使用されています。
NetCDFファイルののおおまかな構造の説明はSee NetCDFファイルの構造と性能にあります。
ファイル形式の詳細については See ファイルフォーマット仕様を参照してください。ただし、ファイル形式を指定した形でNetCDFファイルを読み取り・作成する独自の低レベルソフトウェアを開発することは好ましくありません。後に、フォーマットが更新された時に互換性に問題が生じる危険性があります。
NetCDFの 目的の一つは大きなファイルの部分集合へのアクセスを効率的に行うことであります。 この目的の為に、NetCDFは順次アクセスではなく直接アクセスを行います。 その方がデータが作成された順番と異なる順序で読み取られる場合や異なるアプリケーションによって読み取られる順番が異なる場合に有効です。
ポータブルな外部表現機能(XDR)に必要なオーバーヘッドの量は多くの要素に左右されます。例えばデータの種類・コンピュータの種類・データアクセスの粒度・コンピュータに実装されたXDRがのチューニング等の要素に依存します。通常の場合、オーバヘッドはアプリケーションが使用する全リソース量に比べると小さいため、 いずれの場合にも、XDRレイヤーにかかるオーバヘッドはデータのポータブルアクセスの利便性を考えると対した犠牲ではありません。
NetCDFを設計・実装するにあたってデータアクセスの効率は重大な要素でした。しかしながら、NetCDFインターフェースを非効率的に利用することは不可能ではありません。例えば、各記録から一つの値を要求するようなデータ摘出を行う場合などがそれにあたります。効率的にインターフェースを利用する方法に付いてはSee NetCDFファイルの構造と性能をご参照下さい。
NetCDF は配列を格納する為の汎用的なアーカイブフォーマットとして使用できます。NetCDFにおけるデータ圧縮は(低解像度の浮動小数点数を32ビットの配列で表す代わりに8ビットもしくは16ビットの整数配列を使用することにより)可能です。しかし、NetCDFの現行版はデータ圧縮率を最適にする設計にはなっていません。それ故、NetCDFは特定のデータベースのある特徴を生かした特殊目的用アーカイブフォーマットよりも多くのスペースを必要とするかもしれません。
NetCDFを使うことが、即、人間とマシンにとって意味のある「自己記述型」データを作成することと等価ではありません。変数や次元の名前は意味のあるものを用い、存在する慣例に従った形を取るべきです。次元に関しては(意味があると思われる場合には)対応する座標変数も与えるべきです。
属性は従属的な情報を供給する上で大変重要です。関連する慣習に従い、対応する標準属性を使用することが大切です。See 属性の慣習に一般的なアプリケーションソフトウェアのためのNetCDFライブラリ専用の属性やその慣習が記述されています。
いくつかの団体はNetCDFデータ用に独自の付加的慣例やスタイルを定義しています。これらの慣習やそれらの利用法に付いてはNetCDF Conventions site, http://www.unidata.ucar.edu/packages/netcdf/conventions.html を参照してください。
上記の慣例は都合の良い場合には使用すべきです。ローカルな使用のためにはしばしば付加的な慣例が必要とされます。このような慣例を敷く場合には、関連分野のユーザの為にも上記の NetCDF conventions siteに掲載しておくことが望ましいです。
NetCDFの 開発はUnidataの必要に迫られたしごく控えめな目標に向かって始められました。その目標とはUnidataのアプリケーションとリアルタイムの気象データとの間に共通のインターフェースを 提供することです。元々Unidataのソフトウェアは複数のハードウェアプラットフォーム上で実行され、CとFORTRANの両方からアクセスされることが前提にあったので、 Unidataの目標を達成することはより広く応用できるパッケージを提供する可能性をも秘めていました。 これらのパッケージを広く提供し、かつ同じような需要のある団体と協力することによって、我々は 科学的なデータを取得するために作られたあるソフトウェアが他の分野ばかりではなく同じ分野の中でさえも利用されない現状を打破しようと試みました。 (Fulker, 1988).
NetCDfソフトウェアの重要な コンセプトはNASA Goddard National Space Science Data Center (NSSDC)で開発されたデータアクセスソフトウェアの解説である論文、Treinish and Gough (1987) に記述されています。このソフトウェアによって提供されているインターフェースはCommon Data Format (CDF)と呼ばれ、 NASA CDF は元は配列を格納するための抽象化をサポートするプラットフォーム特定型のFORTRANライブラリとして開発されました。
NASA CDFパッケージは様々な種類のデータと幅広いアプリケーションに応用されてきました。NASA CDFは単純さ(サブルーチンは13個のみ)・格納フォーマットからの独立性・汎用性・データの論理的な見方をサポートする能力・一般的なアプリケーションに対するサポートという利点を備えていました。
1987年の8月にUnidataはコロラド州ボルダーで ワークショップが開催されました。 NASAと協力し、NASAの既存のインターフェースと互換性を持たせながらCDF FORTRANインターフェースを拡張・Cインターフェースを定義・一つのセルによるデータ集合体のアクセス許可をする可能性が追求されました。
それとは独自にNew Mexico Institute of Mining and Technologyの Dave RaymondはUNIX用にあるCソフトウェアのパッケージを開発していました。それは自己記述的データへの順次アクセスを可能にし、データの解析・分析・表示に対して「パイプとフィルター(又はデータフロー)」的なアプローチをサポートするものでした。 このパッケージもまた,「Common Data Format」 という名を冠しており、後に C-Based Analysis and Display System (CANDIS)へと改められました。Unidataは Raymondの成果を知り(Raymond, 1988)、名前付き次元、及び同一データオブジェクト内に形の異なる変数を使用するなどといった、彼の着眼点のいくつかをUnidata NetCDF インターフェースに起用しました。
1988年の初頭に Unidata のGlenn DavisがCで書かれXDRの上に被さった NetCDFパッケージの試作品を完成させました。この試作品は次の2点を証明しました。ひとつは単一ファイルのXDR上に実装されたCDFインターフェースの開発費用が許容内であること。そして2点目はそのようなプログラムがUNIXとVMSとの両方に実装可能であることでした。同時にそれは、小さく、ポータブルでNASA CDFと互換性のあるFORTRANインターフェースが望まれている汎用性を持ち得ないことも証明しました。 NASA CDF と Unidataユs NetCDFとはその後独自の発展を遂げましたが、NASA CDFの最新版は NetCDFと似たような特徴を持っています。
1988年の初頭に、1987年の Unidata CDFワークショップにも参加したSeaSpace, Inc.(カリフォルニア州サンディエゴにある商用ソフトウェア開発会) のJoe Fahleが独自にNASA CDFインターフェースをいくつか重要な点で拡張したCDFパッケージをCで開発しました (Fahle, 1989)。Raymondのパッケージと同様に、SeaSpace CDFソフトウェアは関連の無い形の変数を同一データオブジェクト内に含むことを許容し、多次元の配列に対する一般的なアクセス方法を可能にしました。 Fahleの成果はSeaSpace社では、画像処理システムに おける中間的な段階での格納形態として使われていました。このインターフェースとフォーマットは後に Terascanデータフォーマットへと発展していきます。
FahleのインターフェースはNASAのインターフェースを我々の目的に応じる形に拡張しようとした際に直面した問題の大部分を解決していました。1988年8月にUnidata NetCDF用インターフェースの形式を決定し、残された問題を解決するために小規模のワークショップが開催されました。 参加者は SeaSpace社のJoe Fahle 、Apple社の Michael Gough(NASA CDFソフトウェアの開発者の一人)、 Miami大学のAngel Li (VMSにNetCDFソフトウェアの試作品を実装し、ユーザー候補である人)、それにUnidataのシステム開発部のスタッフ達でした。いくつか簡略できる点が指摘された後にワークショップとしての合意が得られました。Glenn DavisとRuss Rewがソフトウェアの最初のバージョンを完成させる前に、ワークショップの成果を含んだUnidata NetCDFインターフェースの仕様に関する文書が意見交換を促すために広く配布されました。他のデータアクセスインターフェースとの比較やNetCDFを使用した感想に付いてはRew and Davis (1990a)、Rew and Davis (1990b)、 Jenter and Signell (1992)、 and Brown, Folk, Goucher, and Rew (1993)で議論されています。
1991年10月にNetCDF ソフトウェア2.0版の配布開始を発表しました。Cインターフェースに小さな修正を加えた(次元の長さを int ではなく long と宣言した)ことによって MS-DOSコンピューター等の安価なプラットフォーム上でのNetCDFの利便性を向上させました。さらに他のプラットフォーム上での再コンパイル作業を必要としないという利点もありました。このインターフェースへの変更は関連するファイルフォーマットの変更が必要となることもありませんでした。
1993年6月に NetCDF 2.3版がリリースされました。このバージョンではファイルフォーマットに変更はなされませんでしたが、記録への単一呼び出しアクセス・不連続なデータに関する断面へのアクセスの最適化・ユstrideユを使用した指定断面への部分サンプリング・ヤmapped array sections(マップされた配列断面)ユを使用した不連続データへのアクセス・ ncdumpとncgenユーティリティの改良・試験的な C++ インターフェース等が追加されました。
1996年2月にリリースされた2.4版では新たなプラットフォームやC++インターフェースへのサポートが加えられ、又、スーパーコンピューターのアーキテクチャに関しては重要な最適化がなされました。
1996年5月にNetCDFデータに高レベルなインターフェースを提供するソフトウェアのFAN (File Array Notation)の配布が開始された。FANのユーティリティーにはNetCDFのファイルから配列指向データを抽出し操作する・NetCDF配列から特定のデータを印刷する・ASCIIデータをNetCDFデータにコピーする・NetCDFアレイ上で様々な統計操作(sum, mean, max, min, product,ノ) を行う等が含まれました。 FAN に関する詳細は FAN Utilities document, http://www.unidata.ucar.edu/packages/netcdf/fan_utils.html にあります。
このガイドは 1997年 1月にリリースされたnetCDF 3の説明文です。NetCDF 3版は過去のバージョンと同じファイルフォーマットを使用しますが、 2.4版に比べていくつかの大きな変更がなされています。
NetCDF データモデルは名前付き属性を持つ名前付き配列変数の集合として系統だてられるデータに関しては広く応用が利きます。しかしながらこのモデルとソフトウェアの実装にはいくつかの重要な制限があります。 この制限の一部はNetCDFが包含する要求の中で相反するものに対するトレードオフに内在するものであります。他の制限に関しては次のバージョンにて対応していく予定です。
現在 NetCDF で使用できる外部数値データ種は 8-、 16-、 32-ビットの整数、 32-もしくは 64-ビットの浮動小数点数 に限られています。これらの限られたサイズはビットフィールドにデータを格納することに比べるとファイルスペースを無駄に使用する可能性があります。例えば、 9-ビットの数値の配列は16-ビットの短い整数として格納しなければなりません。1-、2-ビット長の数値を8-ビット長の値として格納するのは更に無駄が多くなります。
現行の NetCDF ファイルフォーマットでは一つのNetCDFファイルに格納できるデータは 2ギガバイトです。この制約はファイル内の配置格納の為に32ビットオフセットを使用しているために生じています。
現行のモデルの 制約の一つに各NetCDFファイルに対して無制限の(可変の)次元が一つしか使用できないことです。 無制限の次元においては複数の変数を共有することが可能ですが、それらの変数は同時に発展しなければなりません。これによってNetCDFモデルでは同一ファイル内において複数の無制限次元を持つ変数を扱ったり異なる変数に複数の無制限次元を持たせることができません。つまり、NetCDFモデルは矩型でない変数(例えば不調和な配列)の表現には不向きということになります。
データの完全な自己表現性にも限界があります。 実際にデータを共有したり格納したりする際には必ずと言って良いほど既存の決まり事が存在します。 NetCDFでは変数・次元・属性に意味のある名前、計算する際に使用可能な形態の単位、ファイル全体に関する属性値のテキストストリング、簡単な座標系に関する情報を格納出来ます。 しかし、より複雑なメタデータ(例えば一般的ではないグリッド上に正確に地球座標系 のデータを投影したり衛星からの映像を正確に表現するために必要な情報等)に対応するためには慣習を敷く必要がでてきます。
NetCDFデータモデルに適切な修正を加えることによりこれらの慣習が不必要になったり、メタデータの幾つかの種類を統一的かつコンパクトな方法で表現できるようになるかもしれません。例えば、NetCDFデータモデルに明確な 地球座標系を与えることによって複雑な地球座標系の慣習を簡易化することは可能ですが、データモデルが複雑になるという弊害があります。ここで問題となるのはモデルの豊かさと汎用性(多種多様なデータを扱える能力)との間に適切なトレードオフ地点を見つけることです。ある特定の分野の研究者同士が共有する概念を表すためだけに作られたデータモデルは複数の分野でデータを共有したり統合したりすることには不向きかもしれません。
NetCDFデータモデルはツリー・ネスト配列・ 循環的なデータ等のネスト型配列構造をサポートしていません。その最たる理由は現行のFORTRANインターフェースによって任意のNetCDFファイルを書き込み読み取れなければならないからです。複雑な表現方法や慣習によって、幾つかのネスト型構造を表現することは可能ですが、その結果、NetCDFの目標である自己記述型データではなくなってしまう可能性があります。
最後に、 現行の実装ではNetCDFファイルへの同時アクセスは制限されています。一つのファイルは同時に複数の人が読み取ることが出来ますが、書き込める人は一人に限られており、複数人による同時書き込みはサポートされていません。
現時点における計画では 等価的なデータパッキングの追加、同時アクセスのサポートの向上、2ギガバイト以上のファイルへのアクセス機能です。他にも実現可能であれば加えられる可能性のある拡張機能としてキーもしくは座標値によるデータアクセス、効率的な構造変更(例えば、新しい変数や属性の追加・変更等)、別のファイルのデータ断面へのポインタ機能、ネスト型配列(不調和配列・ツリー配列・循環型配列の表現の実現)への対応、複数の無制限次元の導入などです。
NetCDF ファイルは dimensions (次元)、 variables (変数)、 attributes (属性)等の情報を含み、全てに固有の名とID番号が割り振られています。データの意味や配列指向のデータフィールド間の関係をを把握するためにこれらの構成成分を同時に使用することが出来ます。 NetCDF ライブラリではファイル通常のファイル名のみでなくID番号によっても指定される複数のNetCDF ファイルに同時にアクセス可能です。
NetCDFファイルには記号テーブルが存在し、変数の名・データタイプ・ランク(次元数)・次元・開始ディスクアドレス等の情報が記載されています。 個々の要素はそのIDを表す配列索引(subscript、添字)の一次関数であるディスクアドレスに記憶されています。つまり、これらの索引を別々に保存する必要が無く(この点で関係データベースと異なる)、素早くコンパクトな記憶法である。
次元、変数、属性の名はローマ字もしくはアンダースコアで始まる任意のローマ字と数字で構成されている文字列(アンダースコア'_’、ハイフン'-'を含む)で表されます。(ただし、アンダ-スコアで始まる名はシステム用にのみ使用します。)
ここで簡単なNetCDFの例を使い、 NetCDFデータモデルの原理を説明します。このデータには次元も変数も属性も含まれています。 この簡単な NetCDF オブジェクトの表記は CDL (network Common Data form Language)と呼ばれ、NetCDFファイルを表記するのに大変適しています。 NetCDFシステムにはバイナリのNetCDFファイルから人間指向のCDLテキストファイルを作成する、及び逆の操作を行うためのユーティリティが含まれています。
dimensions: // dimension names and lengths are declared first
lat = 5, lon = 10, level = 4, time = unlimited;
variables: // variable types, names, shapes, attributes
float temp(time,level,lat,lon);
temp:long_name = "temperature";
rh:long_name = "relative humidity";
rh:valid_range = 0.0, 1.0; // min and max
int lat(lat), lon(lon), level(level);
time:units = "hours since 1996-1-1";
:source = "Fictional Model Output";
data: // optional data assignments
lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
rh =.5,.2,.4,.2,.3,.2,.4,.5,.6,.7,
.1,.3,.1,.1,.1,.1,.5,.7,.8,.8,
.1,.2,.2,.2,.2,.5,.7,.8,.9,.9,
.1,.2,.3,.3,.3,.3,.7,.8,.9,.9,
NetCDFファイル用の CDL表記は後述(See ncdumpを参照)のユーティリティプログラム ncdump を使って簡単に自動作成できます。別の NetCDF ユーティリティである ncgen はNetCDF ファイル(もしくは随意にNetCDFファイルを作成するために必要な呼び出しを含むC及びFORTRANのソースコード)をCDLインプットから作成します。(See ncgen)
CDL 表記法は単純で大部分が自明です。 NetCDFファイルの構成要素を説明してゆくに従いCDL 表記法のより詳細な部分を明らかにしていいkます。この時点では、 CDL文がセミコロンで終わることに注意してください。スペース・タブ・改行は自由に使って文を読みやすくしてください。 CDL のコメントはどの行においても ヤ // ユ に続きます。NetCDFファイルはCDL では下のように記述されます。
ここで name (名)は ncgen ユーティリティー を使ってファイル名を作成する際に単にデフォルトとして使用されます。 CDL記述には3つのオプションがあり、 dimensions ・ variables ・ data のキーワードによって開始されます。NetCDF 次元の宣言は dimensions の後に記述されます。NetCDF 変数及び属性は variables の後に定義され、変数データの割り当ては data の後に続きます。
次元は実際の物理的な次元(例えば、時刻・緯度・経度・高度等)を表すために使用します。また、次元は他の数量の指標(例えば、ステーションやモデル現行番号)としても使用できます。
NetCDF 次元は名前 name と 長さ lengthを持っています。次元長とは任意の正の整数ですが、 NetCDFファイル中の一つの次元は UNLIMITED の長さを持つことが出来ます。
そのような次元は無制限次元 unlimited dimension もしくは記録次元 record dimension と呼ばれます。無制限次元を持つ変数はその次元に沿って無制限に延びることが出来ます。無制限次元指標は従来の記録指向型ファイルにおける記録番号のようなものです。 一つの NetCDF ファイルは最大で一つの無制限次元しか持てませんが、無制限次元を持たなくても構いません。 もし、変数が無制限次元を持つとしたら、その次元は最も重要な(最も遅く変化する)ものでなくてはなりません。 従って、無制限次元は必ずCDL形式の最初の次元でなければならず、 FORTRAN配列宣言においては最後 の次元でなくてはなりません。
CDL 次元宣言はCDLキーワードの次元 dimensions に続く行(複数行でも可)に書かれます。同一行における複数の次元宣言は コンマで区切ります。宣言は各々名前=長さ name = length で表されます。
上記の例では4つの次元 lat 、 lon 、 level 、そして time があります。最初の3つの次元は固定長です。 Time は無制限長 UNLIMITED を与えられており、これは time が無制限次元 unlimited であることを意味します。
NetCDF ファイル中で名前のあるデータの基本単位は変数 variableです。変数はその形 shape が次元のリストとして定義されます。それらの次元は既に存在していなければなりません。次元の個数はランク rank (またはディメンショナリティ dimensionality )と呼ばれます。スカラー変数はランク0となり、ベクトルはランク1、マトリクスはランク2ということになります。
変数の形を定義するのに同じ次元を複数回使用しても構いません。(以前のバージョンのNetCDFではこれは不可能でした。)例えば、 correlation(instrument, instrument) と定義して、異なる機器で測定された値の相関を示すマトリクスを表すことが出来ます。しかし、物理的な空間/時間に相当する次元を持つデータは、たとえその次元の幾つかが同じ値を取る場合においても、異なる次元で構成される形を取るべきです。
変数 は大部分のデータをNetCDFのファイルとして格納するのに使用されます。変数とは同一タイプの値の配列を指します。 スカラー値は0次元の配列として扱われます。変数は名前・データタイプ・変数が定義されたときに与えられた次元のリストによる形を持ちます。 また、変数は関連する属性を持つことも出来ます。この属性は後に加え・削除し・変更することが出来ます。
変数外部データタイプとはNetCDFのタイプ typesの小さな集合の一つであり、次のような名前を持ちます。 FORTRAN インターフェースで NF_BYTE (同義語 NF_INT1 ), NF_CHAR , NF_SHORT (同義語 NF_INT2 ), NF_INT,NF_FLOAT (同義語 NF_REAL ), 及び NF_DOUBLE 。
CDL 表記ではではこれらはより単純な byte ・ char ・ short ・ int ・ float ・及び double 等の名前を与えられています。 real はCDL表記において float の同義語として使用できます。 long はint に対する deprecated 同義語です。 各変数の厳密な意味については「NetCDF外部データタイプ」 See NetCDF 外部データ型をご参照下さい。
CDL 変数宣言はCDKL単位中のキーワード variable に続きます。それらの形式は次元付きの変数については
t前述の CDL の例では変数が6つあります。次に述べるように、その内4つは座標変数です。残りの2つの変数 temp と rh は主変数 primary variables とも呼ばれ、一般的にデータと見なされるもので構成されています。各々の変数は time という無制限の次元を第一次元として含み、よって記録変数 record variables と呼ばれます。記録変数ではない変数は固定長(データ値の個数)を持ち、次元長の積に相当します。記録変数の長さはもその次元長の積ですが、この場合には無制限次元の長さが一定ではないためにその積は変数であり、当然変化します。無制限次元の長さは記録数に該当します。
NetCDFにおいては変数が次元と同一の名前を持つことが許されています。それらの変数はNetCDFライブラリにとっては特別な意味を持ちません。しかしながら、そのライブラリを使用するソフトウェアに特別な意味を持つ変数として扱われるという慣習があります。
次元と同じ名前を持つ 変数は座標変数 coordinate variable と称されます。通常はその次元に対応する物理的な座標を定義するために使われます。前出のCDLの例には次のように定義される座標変数 lat 、 lon 、 level 及び time が含まれています。
lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
これらはこの次元に沿った地点における緯度・経度・気圧・時刻を定義しています。つまり、ここでは高度1000、850、700、及び500 mbarに相当する高度と北緯20、30、40、50、60度におけるデータが存在するということです。各座標変数はベクトルであり同一の名前を持つ次元のみで構成されている形を持つことに注意してください。
次元に沿った位置は指標 index を使用することによって指定できます。指標は整数であり、最小値は FORTRANでは1になります。前出の例では700 mbarレベルにおける指標は 3 となります。
次元に対応する座標変数が存在する場合には、その次元に沿った位置を指定するための代替的的で通常は寄り便利な方法があります。原稿の座標変数を使用するアプリケーションパッケージでは、それらの値が数値ベクトルであり、狭義の意味で単調である(全ての値は異なり、一方的に増加もしくは減少する)という仮定をしています。
NetCDFの 属性 attributes はデータに関するデータ(補助的データ ancillary data ・メタデータ metadata )を格納するために使用されます。その手法は従来のデータベースシステムのデータ辞書や図表を格納するのに使用されている手法と多くの類似点があります。大半の属性は特定の変数に関する情報を含んでいます。その変数の名前(もしくはID)と属性の名前と併せて識別されます。
幾つかの 属性はファイル全体の情報を与えており、グローバル属性( global attributes) と呼ばれます。これらは属性の名前とCDLの場合には空白の変数名、C及びFORTRANの場合には特別なnullグローバル変数IDによって識別されます。
属性には関連する変数(グローバル属性の場合にはnullグローバル変数)、名前、データタイプ、データ長、そして値があります。現行版においては全ての属性をベクトルとして扱っています。スカラー値は単一要素ベクトルとして扱われます。
可能な場合には従来の 属性名を使用する方が好ましいでしょう。新しく名前をつける場合には出来る限り意味のあるものを付けましょう。
属性の 外部タイプは定義される際に指定されます。属性に使用できるタイプは変数の場合のNetCDFの外部データタイプと同じです。異なる変数に同一の名前の属性がある場合には異なるタイプの場合があります。例えば、変数タイプ int の有効データ値の最大値を特定する属性 valid_max は int タイプであるべきです。それに対して変数タイプ double に対する属性 valid_max は double タイプであるべきです。
属性は変数や次元よりも ダイナミックです。属性は削除可能で、作成後にもタイプ・長さ・値を変更することが可能です。それに対して、NetCDFインターフェースでは変数を削除したり、変数のタイプや形を変更することは出来ません。
となります。 CDLにおいては各属性の タイプや長さは明確には宣言されません。 それらは属性に割り振られた値によって決定されます。単一の属性に所属する値は全て同一タイプでなければなりません。 色々なNetCDFタイプの定数に使用される表記法については後述する。(See データ 定数のCDL表記)
NetCDF の例(See Network Common Data Form Language (CDL))では units は変数 lat に対する属性で13文字列` degrees_north 'の配列値を持ちます。そして valid_range とは長さ2、値ヤ 0.0 ユ と ヤ 1.0 ユを持つ変数 rh の属性です。
NetCDFファイルの例では一つの グローバル属性--- source ---が定義されています。実際の NetCDFファイルではファイル全体の起源・歴史・慣習・特徴などを記述するためにより多くのグローバル属性を持つかもしれません。
NetCDFファイルを処理する 一般的なアプリケーションの多くは 標準的な属性の慣習に従っており、特に理由が内場合には慣習に従うことをお薦めします。 Units , long_name 、 valid_min 、 valid_max 、 valid_range 、 scale_factor 、 add_offset 、 _FillValue 、及び他の慣習的な属性についてはSee 属性の慣習を参照してください。
任意のNetCDFファイルが最初に作成されてから時がたっていても属性を定義することは可能です。ですから、ファイルの作成当初に使用される可能性のある属性を全て網羅するようと悩む必要はありません。しかし、既存のファイルに新しい属性を加えることはファイルをコピーするのと同じ作業量が必要となる場合があります。より詳しい議論はSee NetCDFファイルの構造と性能にあります。
データの塊を処理するために使われる変数に 対し、属性は補助的なデータやデータに関する情報のために使用されます。 NetCDFのオブジェクトに関連し、属性に格納された補助的なデータの総量は通常、メモリ上に十分保存できます。それに対し、変数は全体をメモリ上に保管するにはしばしば大きすぎ、 処理するために分割する必要が出てきます。
属性と変数の異なる点はまだあります。それは変数は多次元であることができることです。属性は全てスカラー(単一数値)もしくはベクトル(一方向に既定された次元)です。
変数はデータ値を割り当てられる前に名前・タイプ・形を定義されます。ですから値の無い変数が存在することもあります。属性の値は作成時に指定する必要があるので、値の無い属性は存在しません。
変数は属性を持ち得ますが、属性は属性を持つことが出来ません。変数に割り当てられた属性は変数と同じ単位を持つことが出来ます(例えば valid_range )。単位の無い属性というのも可能です(例えば scale_factor )。 関連する変数と異なる単位を使用するデータを格納したい場合には属性よりも変数を使うことをお薦めします。 より一般的には、データが説明のための補助的データを必要としたり、多次元であったり、データの値の指標として定義されたNetCDF次元を必要としたり、格納量が多大である場合には場合には 、データは属性よりも変数として表現されるべきでしょう。
この章では6つの基本的なNetCDFの外部データ型、及びNetCDFインターフェースによってサポートされているデータアクセスの種類を紹介し、さらに配列型以外のデータ構造がNetCDFファイルによって実装可能であるかを紹介します。
NetCDFインターフェースによってサポートされている外部データ型は以下の通りです。
これらはデータの精度と個々の値に必要なビット数の駆け引きの幅を広げるために設定されました。これらの外部データ型は任意のマシンや言語の組み合わせによってサポートされている内部データ型から完全に独立しています。
これらのデータ型が「外部」と呼ばれるのはNetCDFデータのポータブル外部表記に対応するからです。あるプログラムがデータを内部変数として読み込む際に、必要であれば指定された内部変数型に変換されます。同様に、内部データ型がNetCDF変数の外部データ型と異なる場合には、内部データをNetCDF変数として書き込む際に、異なる外部データ型に変換されてしまう可能性があります。
外部型と内部型を分離し、自動的に外部-内部タイプ変換をすることにはいくつかの利点があります。数値変数の外部データ型を知らなくても自動的にどのような数値型にも変換できるからです。 この特性を利用して、十分に幅広い範囲の内部データ型を使用することによって外部データ型から独立した 形にコードを単純化したりすることも可能です。即ち、数種類の異なる外部データ型を持つ数値NetCDFデータに関しては2倍精度になります。ある変数の外部データ型が変更されてもプログラムを書き換える必要は無いのです。
外部数値型から、もしくは外部数値型へ変換をする場合にはライブラリに任せます。このように外部データ表記と内部データ型間の変換を自動化し、両者を切り離すことはNetCDFの将来のバージョンにとってはより一層重要な意味を持ちます。圧縮データに新たな外部データ型が加えられ、それに自然に対応する内部データが存在しないケースも出てくるかもしれません。(例えば11ビット値の圧縮配列等)
ある数値型から別の型に変換する場合に、変換された値を表現しきれない型に変換するとエラーが生じます。例えば、内部の短い整数型では外部で整数として格納されているデータを表しきれないでしょう。数値配列にアクセスする際に、表現可能な領域から一つ以上の値がはみ出してしまった場合にはレンジエラーが返されてきます。領域内に収まる他の数値については正常な変換が行われます。
ここで注意して頂きたいのはデータ型の変換に伴う単なる精度の悪化ではエラーが返されないということです。つまり、2倍精度の数値を1倍精度の不動小数点数に変換した場合には、2倍精度の値が変換先のプラットフォームで表現可能な1倍精度の不動小数点数の範囲から逸脱しない限り、エラーは返されません。 同様に、不動小数点数の仮数の有効桁数では表しきれない程の大きな整数値を読み込んだ場合にも、この操作によって失われた精度に対するエラーは返されません。 このような精度のロスを避けるにはアクセスする前に外部データの変数型をチェックし、十分な精度を持つ内部データ型に変換するようにしてください。
基本外部データ型の名前( byte , char , short , int , float 又は real , 及び double)はCDLにおいては予約語です。ですから、変数・次元・属性の名前はこれらを使用してはいけません。
IB yte データは符号付整数値(-128〜127)としても符号無し整数値(0〜255)としても扱うことができます。しかし、 バイトデータ型を他の数値表現型に変換する場合には符号付数値として認識されます。
NetCDF外部データ型と任意の言語のデータタイプとの互換性についてはSee 変数を参照してください。
NetCDFデータにアクセスする(読み込む・書き込む)場合には ,オープンされたNetCDFファイル、NetCDF変数、及び変数の要素を特定する情報(例:番号)を指定します。アクセス機能の名前は内部データ型の名前に対応します。内部データ型と外部変数型の表現が異なる場合にはデータが読み書きされる際に内部型と外部型との間の変換が行われます。
データへは direct(直接)アクセスします。これによって大きなファイルから小さな部分集合を効率的にアクセスすることができます。その部分集合の前にあるデータを先にアクセスしないからです。 データを、ファイル中の位置ではなく、変数を指定することによって読み書きすることは 、データアクセスをそのファイルの中に他に幾つ変数が存在するかとは無関係になります。これによってデータに新たな変数が加わるデータフォーマットの変更に対してプログラムの書き換えは不必要になります。
CとFORTRANインターフェースでは、データアクセスをする度にファイルを名前で特定せずに、ファイルが初めて作成・オープンされた時に割り当てられるファイルIDと呼ばれる小さな整数によって識別されます。
同様に、 任意の変数はデータアクセスの度に名前で識別されません。その代わり、変数IDと呼ばれる、NetCDF中の各変数を識別するのに使用される小さな整数 によって識別されます。
NetCDFインターフェースにはオープンなNetCDFファイル中のデータ値に直接アクセスする方法が幾つか用意されています。これらのアクセス形式を汎用性の小さいほうら順に説明します:
4種類のベクトル ( index vector ・ count vector ・ stride vector ・ index mapping vector )は変数の各次元に対応する要素を一つずつ持っています。ですから、n次元の 変数(rank = n)についてはn個のベクトルが必要となります。変数がスカラー量(無次元)の場合には、 これらのベクトルは無視されます。
Array section (配列断面)とは2つのベクトルによって指定される連続的な直方体、もしくは「板切れ」のようなものです。 Index vectorが原点に最も近い角の要素の座標を表します。 Count vector は各変数の次元に沿った板切れの縁の長さを順番に表します。アクセスされた値の個数はこれらの縁の長さの積です。
Subsampled array section (部分サンプルされた配列断面)は array section に似ていますが、さらにに stride vector というベクトルを使用してサンプリングを識別するために使用されます。このベクトルは各次元ごとに要素があり、その次元に沿って取るべきストライドの長さを表しています。例えば、ストライドが4であるなら、その次元に沿って4つ置きの値をとるという意味になります。この場合にも、アクセスされた値の総数は count vector(カウントベクトル)の各要素の積になります。 .
Mapped array section (マップドアレイセクション)は subsampled array section に似ていますが、さらに index mapping vector (インデックスマッピング)が加わり、NetCDF変数に関連するデータのメモリー中の配置を指定することができます。 各値の参照値からのオフセットは 各インデックスと対応する index mapping vectorの要素を掛け合わせたものの和になります。(マッピングがされていない場合には仮想的な内部配列のインデックスが使用されます。)アクセスされた値の個数は subsampled array section の場合と同じになります。
マップされた配列断面の応用については後により詳細に述べます。その前に、より一般的な配列断面へのアクセスの例を見ましょう。
先に扱ったNetCDFファイルの例(See Network Common Data Form Language (CDL))において、あるレベル(例えば2段目)の temp 変数の全データの断面を読み取りたいとし、そしてそのNetCDFファイルには記録が3つ ( time 値)あるとます。次元は
FORTRANの場合にはCDL表記法とは次元が逆転しており、第一次元が最も早く変化し、記録変数の最後尾が記録次元となっています。それ故、一つのレベルのみのデータを保持している変数のFORTRAN における宣言は次のようになります。
PARAMETER (LATS=5, LONS=10, LEVELS=1, TIMES=3)
REAL TEMP(LONS, LATS, LEVELS, TIMES)
第2レベルにのみある全時刻・全緯度・全経度のデータブロックを識別するためには、始点インデックスと縁の長さを与えなければなりません。始点インデックスは FORTRANでは(1, 1, 2, 1) であるので、 time ・ lon ・ lat 次元については最初から開始したいのですが、 level 次元については2番目の値から開始したいわけです。 Time 値については3個全て、 level 値については1個のみ、 lat 値については5個全て、そして lon v値については10個全てを取得しいので、縁の長さは FORTRANでは(10, 5, 1, 3) になります。この操作によって合計150個(3*1*5*1)の不動小数点数が返されるので、これだけの数を収容するのに十分な配列スペースを 確保しなければなりません。このデータが返される順番は最も早く変化する 最初の次元 LON , になります:
Mapped array sections を使用することによって変数要素のディスクアドレスとメモリ上で格納されているアドレスの間に自明ではない関係を確立することができます。 例えば、メモリ上のマトリクスはディスク上のマトリクスを移項したもので、要素が全く異なる順番で格納されるかもしれません。通常の array sectionにおいてはディスク上とメモリアドレス の関係は自明です:メモリ内値の構造(次元サイズと順番)は array sectionのものと一致しています。しかしながら、mapped array sectionにおいてはNetCDFの変数要素の指数とそれらのメモリ上のアドレスとのマッピングを定義するのに index mapping vector が使用されます。
マップ アレイアクセスによって,メモリに常駐する配列の原点とある任意の点間とのオフセット量(配列の要素の数)は index mapping vectorとその点の coordinate offset vector の inner product 1 (内積)で表される。 ある任意の 点の coordinate offset vector は各次元の内包される配列の原点からその点までのオフセット量を与えます。 FORTRANではある点の, coordinate offset vectorの値は元のcoordinate vectorの値より1小さくなります。つまり、配列要素 A(3,5)のcoordinate offset vectorは[2, 4]になります。
通常の配列部分の index mapping vector はム最も早く変化する次元から最も遅く変化する次元の順番にム常に定数1を持つはずです。なぜならば、その値と最も早く変化する次元の一辺の長さの積を取り、その値と次に早く変化する次元の一辺の長さとの積を取る、という操作を繰る返すからです。 しかし、mapped arrayにおいては, NetCDF変数のディスク上での位置とメモリ上での位置との相関は異なることもあります。
マップドアレイアクセスに関する詳しい例はマップドアレイアクセスに関するインターフェースの説明文にあります。 See マップされた配列の値を書き込む: NF_PUT_VARM_ type.
NetCDF抽象化によって部分サンプルされた配列断面やマップドアレイセクションによるアクセスを可能ですが、 これらを使用する必要はありません。 これらのより汎用的なアクセス法が不必要な場合には、これらの機能を無視して単一値によるアクセスや通常の配列断面アクセス方法を使用してください。
NetCDF変数には各々、最初に定義された時に指定される外部タイプを所有しています。この外部タイプによってデータがテキストや数値として扱われるか判別されます。数値として扱われる場合には、その範囲と精度も指定されます。
NetCDFの変数の外部タイプが char の場合、テキスト配列である文字データのみが変数として書き込み、読み取ることが可能です。 テキストデータを異なるタイプのデータに自動変換する機能はサポートされていません。
ただし、数値データである場合には変数を異なるデータタイプとしてアクセスし、メモリに格納されている数値データとNetCDF変数との間で自動的にタイプ変換する機能をNetCDFライブラリは保有しています。例えば、全ての数値データを倍精度の浮動小数点数として 扱うプログラムを作成した場合には、NetCDF変数の外部タイプがどんなタイプであるかを気にせずに、NetCDFデータを倍精度配列に読み取ることができます。 NetCDFデータを読み取る際には、様様な大きさの整数 や単精度の浮動小数点数は、倍精度の数値用のデータアクセスインターフェースを使ってアクセスすれば、自動的に全て倍精度数値になります。もちろん、このように自動的に数値が変換されることを望まない場合には、その数値タイプが存在すれば、各々のNet CDF 変数の外部データタイプに対応したインターフェースを使用すれば避けられます。
NetCDFが行なう数値変換は大変わかりやすいものばかりです。それは、数値変換が任意のタイプのデータを別のデータタイプの変数を取るよう指定する操作であるからです。例えば、浮動小数点NetCDFデータを整数として読む場合には、結果は零に打ち切られます。浮動小数点数を整数の変数に割り付ける場合と同様です。このような打ち切りは数値変換に伴う精度悪化の例といえます。
ある数値タイプから他の異なる数値タイプに変換する場合にも、変換先のタイプが変換された数値を表すことのできないタイプの場合にもエラーが生じます。例えば、整数では外部タイプとしてIEEE浮動小数点数として格納されているデータを表せません。数値の配列をアクセスする際には、一つ以上の数値が表せる範囲外である場合にはレンジエラーが返ってきます。その他の範囲内にある数値については正しく変換されます。
注意すべき点は、タイプ変換による精度のロスのみではエラーを引き起こさないということです。例えば、倍精度の数値を整数として読む場合には、倍精度の数値の大きさが読込先のプラットフォームで表し切れる整数の範囲外でなければエラーと判定されません。 同様に、大きな整数を浮動小数点数に変換する際に、浮動小数点数の仮数部にその整数の全てのビットを表し切れなくて精度にロスが生じたとしてもエラーにはなりません。このような精度のロスを避けたい場合にはアクセスする変数の外部タイプをチェックして、使用する内部タイプと整合性があることを確認してください。
表し切れる範囲の境界に近い大きな浮動小数点数を書き込む場合にレンジエラーが生じるかどうかはプラットフォーム次第です。NetCDF浮動小数点変数に書き込める最大の浮動小数点数は、使用しているシステムで表せる 最大の浮動小数点数であり、2の128乗よりは小さい値です。倍精度変数に書き込める最大の倍精度数値は、使用しているシステムで表せる最大の倍精度数値であり、2の104乗より小さくなります。
この自動変換と外部データ表示とと内部とでデータタイプを切り離すことは、NetCDFの将来のバージョンにおいてより重要性を増してくるでしょう。それは、将来、対応する内部タイプが存在しない詰めありデータ用(例えば11ビット数値の配列等)に新たな外部データタイプが導入されることが考えられるからです。
NetCDF抽象化が直接的にサポートする唯一の データ構造は ベクトル属性つきの名前のついている配列の集合のみです。NetCDFはリンクされたリストや、ツリー、粗い配列、不均一な配列等、ポインタを必要とする種類のデータ構造を表現するのには適していません。
ある配列のデータを他の配列のデータへのポインタとして使用することに関する様様な慣例を採用することにより、配列の集合により他のデータ構造を構築することは可能です。そのようなデータ構造を構築する際に、NetCDFライブラリは役にも立ちませんが阻害もしません。その代わり、そのような慣例を設計する手段を提供します。
次の例は属性 row_index を使用して 不均質な配列 ragged_mat を格納し、 それによって各列の始点となるインデックスを指定することにより関連するインデックス変数の名前を与えています。 この例では、最初の列は12個(12-0)の要素からなり、2列目は7個(19 -12)、という具合に続きます。
ragged_mat:row_index = "row_start";
もう一つの例として、NetCDF変数は任意のNetCDFGファイルの中でグループ化することが挙げられます。各グループの変数の名前を伝統的な区切り文字であるスペースやコンマによってリストにしている属性を定義することによってこれは可能になります。このようなグループ化の為に属性名の慣習付けをすることによって幾つもの名前のある変数グループを作ることを可能にします。 ある特定の慣習に従った属性を各々の変数に与えることによって変数がどのグループに属しているかのリストが作れます。他の属性や変数を指定する属性や変数の導入により、 NetCDFファイルにおける幾種の複雑な構造を表すための柔軟な手段が与えられます。
NetCDF ライブラリ 使用する為にNetCDFインターフェースの事を全て知っている必要はありません。 NetCDFファイル作るのであれば片手で足りるほどのルーチンさえ知っていれば必要な次元・変数・属性を定義し、NEtCDFファイルにデータを書き込むことができます。( ncgen ユーティリティを使用して予めファイルを作成しておいてから、NetCDFライブラリのデータ書き込みコールを活用したプログラムを走らせたならば、使用するルーチンの数はより少なくなります。同様に、あるNetCDFオブジェクトに格納されたデータにアクセスするソフトウェアを作成する際には、NetCDFファイルを開き、データにアクセスする為にはNetCDFライブラリの本の一部のNetCDFライブラリしか使用しません。 もちろん、任意のNetCDFファイルにアクセスする包括的なアプリケーションを作る場合には、NetCDFライブラリにより精通している必要があります。
この章では通常の使用に必要な一般的なNetCDFのコールのシークエンスのテンプレートを幾つか紹介します。 明確さのため、ここではルーチンの名前のみを挙げています。宣言やエラーチェックについては触れていません。また、タイプに限定される変数や属性のルーチン名のサフィクスについても省略してあります。複数回使用される宣言文は字下げをしてあります。また、...を使用して他の宣言文の任意のシークエンスを表しています。 全パラメーターのリストは後の章で説明します。
これは新しいNetCDFファイルを生成するために使用する 一般的なNetCDFコールの配列です:
NF_DEF_VAR ! 変数の定義: 名前、タイプ、次元から
NF_CLOSE ! 閉じる: 新しいNetCDFファイルを保存する
コール一つでNetCDFファイルを作成できます。その時点では、二つあるNetCDFモードの最初のモードに入っています。開かれたNetCDFファイルにアクセスする際でしたら、定義モードもしくはデータモード に 入るはずです。定義モードでは次元・変数・新しい属性などを作れますが、変数データを読んだり書き込んだりすることは出来ません。データモードではデータにアクセスし、既存の属性を変更することは出来ますが、次元・変数・属性を 新たに作ることは出来ません。
新たに作られた時限には各々 NF_DEF_DIM へのコールが一つ必要となります。同様に全ての変数には NF_DEF_VAR へのコールが一つ必要です。さらに、定義され、値を割り振られた属性には NF_PUT_ATT ファミリーのメンバーへのコールが必要となります。 定義モードから出て、データモードに入るには NF_ENDDEF とコールしてください。
一度データモードに入ると、変数に新たなデータを加えたり、古い値を変更したり、既存の属性値を変更することが出来ます(ただし、属性については格納スペースが増加しないことが条件です。)NetCDF変数に単一の値を書き込むためには、書き込むデータ種によっては NF_PUT_VAR1 ファミリーのメンバーが必要となります。 NF_PUT_VAR ファミリーのメンバーを使用して変数の取るべき値を全て一度に書き込むにことも出来ます。変数の配列や配列断面は NF_PUT_VARA ファミリーを使って書き込めます。部分サンプルされた配列断面も NF_PUT_VARS ファミリーのメンバーを使うことによって書き込めます。マップドアレイセクションも NF_PUT_VARM ファミリーのメンバーを使うことによって書き込めます。 (部分サンプルやマップドアクセスは通常のデータアクセス法の一種であり、後に説明いたします。
最後に、 書き込むために開いたNetCDFファイルは NF_CLOSE を使って必ず閉じてください。ファイルシステムへのアクセスはデフォルトでNetCDFライブラリによってバッファーされています。 データを書き込める開かれた異常な状態でプログラムが終了された場合には、その回に加えた変更が全て無効になる可能性があります。このデフォルトでバッファーしてしまう機能は、ファイルを開く際に、 NF_SHARE フラグを立てることによって避けられます。 フラグが立っていても、定義モードで行なわれた属性値の変更や定義モードで変更された事項は NF_SYNC 又は NF_CLOSE がコールされない限り、実行されません。
ここでは NetCDFファイルの名前ばかりでなく、それに含まれている次元・変数・属性の名前も既知である場合を取り上げます。(そうでない場合には"inquireモコールをする必要があります。NetCDFファイルの中の変数のデータを読むための極一般的なCでのコールの順序は:
まず、ファイルの名前を与えることにより、 最初のコールがNetCDFファイルを開きます。そして、その後、開かれたファイルを参照するために必要なNetCDF IDを返します。
次に、 NF_INQ_DIMID へのコールでアクセスする次元ごとに 次元名に由来した次元IDが割り振られます。同様にして、必要な変数IDも変数名に由来する名前が NF_INQ_VARID へのコールで決定されます。 一旦、変数IDを手に入れれば、 NetCDF ID、変数ID、そして必要な属性名を使うことにより、 NF_GET_ATT ファミリーのメンバーとして入力することにより、変数の属性値も読み取れます。(通常、各々の属性に対して NF_GET_ATT_TEXT もしくは、 NF_GET_ATT_DOUBLE ) 。変数データの値はNetCDFファイルから、直接アクセスすることが出来ます。単一の値の場合には、 NF_GET_VAR1 ファミリーのメンバーへのコールのよって、 そして変数全体の場合には NF_GET_VAR ファミリーへ、又は配列・部分サンプル・マップドアクセスの場合には NF_GET_VARA , NF_GET_VARS , もしくは NF_GET_VARM ファミリーへのコールを使います。
最後に、 NetCDF ファイルは NF_CLOSE によって閉じられます。読み取るだけのためにファイルを開いた場合には閉じる必要はありません。
変数の名前を前もって知らなくてもその全ての変数を処理するようなプログラム(例えば総括的なソフトウェア)を作成することは可能です。同様に、次元や属性名も明らかではない場合もあります。
NetCDFのオブジェクトに関するほかの情報も”inquire”機能を使用してNetCDFファイルから得られます。この機能は全NetCDFファイル・次元・変数・属性等の情報を返します。 下記のテンプレートはそれらの使用法を示しています:
上記の例のようにコール一つで既存のNetCDFファイルが開き、NetCDF IDを返します。このNetCDF IDは NF_INQ ルーチンに送られ、その操作によって次元数・変数の数・グローバル属性の数・そして存在すれば無制限次元のIDが返されます
このinquire 機能は手頃で、I/Oを必要としません。それは、最初にNetCDFファイルを開いた時に、提供する情報がメモリ内に格納されるからです。
次元 IDは 1で始まる連続な整数を取り、一旦割り当てられると消去することは出来ません。また、次元も定義されたら消去することは出来ません。 ですから、NetCDFファイル中の次元IDの数を知るということは全ての時限IDを知ることと道義になります。それらは 1, 2, 3, ノ 等の整数で次元の数だけ存在します。各次元IDに大しては、inquire機能への NF_INQ_DIM で次元名と次元長が返されます。
変数 IDもまた連続した整数 1, 2, 3, ノ で表され、変数の数だけ存在します。変数IDは NF_INQ_VAR コールを使用して各変数に割り当てられた名前、タイプ、形状、と属性数を知ることが出来ます。
一旦、ある変数の 属性値が 既知になると、 NF_INQ_ATTNAME コールによって任意の変数に割り当てられたNetCDF ID・変数ID・属性数を知ることが出来ます。属性名が分かると, NF_INQ_ATT コールで属性タイプと属性長が分かります。タイプと長さから、属性値を格納するために十分なスペースを確保しておくことが出来ます。 次に、 NF_GET_ATT ファミリーの一員へコールすることにより変数値が返されます。
一度NetCDF変数のIDと形状が既知になると、データの値は単一の値の場合は NF_GET_VAR1 ファミリーへの一員へのコール、そして複数の場合には、 NF_GET_VAR, NF_GET_VARA, NF_GET_VARS, 又は様様な種類の配列アクセス法に関しては NF_GET_VARM へのコールすることになります。
既存の NetCDFファイルはかなりの変更を加えることが出来ます。すでに存在している次元・変数・属性などに新たに加えたり、名前を変更することも可能ですし、既存の属性は抹消することが出来ます。 次のコードのテンプレートは既存のファイルに新しい要素を加えるための極一般的な例です。
NF_DEF_DIM ! (あれば)新しい次元を定義し、加える。
NF_DEF_VAR ! (あれば)新しい変数を定義し、加える。
NF_PUT_ATT ! (あれば)新しい属性を定義し、加える。
NF_ENDDEF ! 定義をチェックし、定義モードから出る。
NetCDF ファイルは、まず、 NF_OPEN コールによって開きます。このコールによって、開かれたファイルはデータモードに入ります。このモードではきぞんんおデータ値にアクセスしたり変更を加えたりすることが出来ます。また、属性値も(大きくならない限りにおいては)変更できます。ただし、このモードでは何もたすことは出来ません。新しいNetCDF次元・変数・属性を加えるには NF_REDEF コールによってテイギモードに入らなければなりません。定義モードでは、新しい次元を定義するためには NF_DEF_DIM コールを、新しい変数を加えるには NF_DEF_VAR コールを、そして古い変数や増大してしまった古い属性に新しい属性を与えるには NF_PUT_ATT ファミリーへコールします。
定義モードから出て、再びデータモードに入ることも出来ます。そこで、新しい定義に矛盾が無いか等をチェックし、ディスクに保存するには NF_ENDDEF コールをしてください。データモードに戻りたくなければ、単に NF_CLOSE コールをしてください。これは、最初に NF_ENDDEF コールをしたことと同義になります。
NF_ENDDEF コールがなされる前であれば、 NF_ABORT コールによって、定義モードで行なった全ての再定義を無効にしてNetCDFライブラリを元の状態に戻せます。 また、この NF_ABORT コールを使って、 NF_ENDDEF コールが失敗した場合にNetCDFファイルを矛盾の無い状態まで復帰させることが出来ます。定義モードから NF_CLOSE コールをしたら自動的に追従する NF_ENDDEF へのコールが失敗した際には、 NF_ABORT コールが自動的に呼び出され、NetCDFライブラリは閉じられ、元の矛盾の無い状態(定義モードに入る前の状態)に戻ります。
一つのプロセスは書き込み用に一時に最大一個のNetCDFファイルを開いていなければなりません。ライブラリは、統制の取れた NF_SYNC 機能の利用と NF_SHARE 旗を立てることによって同時に複数の読者に扱われることに大してのすポートに制限を設けています。もし、書き込むほうが定義モードに変更を加えれば(例:新しい変数、次元、属性)、 そのライブラリに対して読者が同時にアクセスすることを防ぐ制約を外部から加える必要があり、また、読者に対して次回のアクセスの前にNF_SYNC を呼び出すように注意を促す必要が出てきます。
NetCDF ライブラリはエラー処理を柔軟に行なうのに必要な機能を揃えています。 個々のNetCDF 機能は整数のステータス値を返送します。もし、返送されたステータス値によっエラーが発見されると、その処理方法をどのようにするかは自由です。関連するエラーメッセージを表示することから、エラー表示を無視して続行することも(後者は推奨しかねますが)可能です。簡単な例として、このガイド中の例はエラーステータスを調べ、エラーを処理するために別個の機能を呼び出すようになっています。
返送されたせ異数のエラーステータスをエラーメッセージストリングに変換するために NF_STRERROR 関数が準備されています。
たまに、 low levell I/O エラーがNetCDFライブラリより下層で起こる可能性があります。 例えば、ある書き込みオペレーションにより割り当てられたディスク容量を越えてしまったら、既に存在しないデバイスに書き込もうとした場合に、NetCDFライブラリより下層からエラーメッセージを表示されることがあります。しかしながら、結果として書き込みエラーは返送されたステータス値に反映されます。
NetDCFのCやFORTRANインターフェースを使用するプログラムのコンパイルとNetCDFライブラリとリンクさせる方法 は各々の条件により異なります。オペレーティングシステム、使用するコンパイラー、NetCDFライブラリやインクルードファイルの格納先などの要因です。それでもここでは敢えて、UNIXプラットフォーム上でNetCDFライブラリを使用する プログラムをコンパイルしリンクする例を挙げます。各自、使用する状況に応じてこれらの例を応用してください。
NetCDF機能や定数を参照する FORTRAN ファイルには 適切な INCLUDE 文を 最初に参照する前に含んでいなければなりません:
FORTRANコンパイラが必ず参照する基本時辞書に netcdf.inc ファイルがインストールされていない限り、コンパイラを呼び出す際には -I オプションを使用し、 netcdf.inc がインストールされているディレクトリを指定する必要があります。例えば:
この章では、単独のNetCDFファイルもしくはNetCDFライブラリ全体を扱うNetCDF機能のインターフェースに付いて解説します。
開かれていない NetCDFファイルを参照する場合にはそのファイル名でのみ参照することが可能です。一度NetCDFファイルが開かれた後には、N etCDF ID によって参照されます。NetCDF IDとはファイルを生成又は開いた時に返される小さな非負の整数である。 NetCDF ID はCにおけるファイル記述子もしくはFにおける論理装置番号によく似ています。単一のプログラムにおいては、 開かれたNetCDFファイルのNetCDF IDはファイルごとに個別の値をとります。 あるNetCDFファイルが複数回開かれた場合には複数の異なるNetCDF IDを持つことになります。しかし、書き込み可能なNetCDFファイルは開かれたファイルのある一つのIDのファイルに限定されます。開かれていたNetCDFファイルが閉じられると、割り当てられていたNetCDF ID とそのファイル間の関連付けは断たれます。
NetCDFライブラリを操作する関数には以下のものがあります:
この章では、NetCDFのインターフェースを表現するために使用される慣習のまとめの後に、これらの操作のためのインターフェースについて詳細に記述します。
この章、及びこれに続く章の中で、 各々のインターフェースでのNetCDF関数についての解説には以下の項目が含まれます:
FORTRANの 関数プロトタイプと正式なパラメーターの定義では、出力パラメータ(返された値が格納される場所)は小文字で書かれ、大文字でかかれている入力パラメータと区別されています。
この例はエラーハンドリングに関する単純な慣習に沿って、各NetCDF関数に対する呼び出しで返されたステータスをもらさずチェックし、エラーが発見されると HANDLE_ERR subroutine を呼び出します。 そのような subroutineの例は See エラー状態に対応したエラーメッセージを得る: NF_STRERRORにあります。
関数 NF_STRERROR は、他のNetCDF関数を呼び出したときに返されであろう、整数NetCDFエラー状態又はシステムエラー番号に対応するエラーメッセージストリングに対し、静的な参照個所を返します。NetCDFのエラー状態のリストは各言語バインディング中の対応する内部ファイルにあります。
この関数によって新規のNetCDFファイルが生成されます。これによって返されたNetCDF IDは他のNetCDF関数呼び出しにおいてこのファイルファイルを参照するために使用できます。書き込みアクセス用に開かれ、定義モードになっているNetCDFファイルファイルに、新しい次元・変数・属性などを加えることが出来ます。
生成モードのフラグによって、既存の同一名のファイルを上書きするか、及びファイルへのアクセスが共有されるかなどを指定できます。
関数 NF_OPEN は既存のNetCDFファイルとアクセスするために開きます。