5.12 書き込みのフィルモードを設定する: NF_SET_FILL
この関数は以下に述べる状況下での書き込みを最適化するための高度な利用を目的としています。関数NF_SET_FILL は書き込み用にオープンされたNetCDFファイルのフィルモード(fill mode)を設定し、戻り値として現行のモードを返します。フィルモードは NF_FILL または NF_NOFILL のどちらででも設定でき、NF_FILLに対応したデフォルトステータスはデータがフィル値によって既に埋められているというものです。即ち、非記録型変数を生成する際、もしくは未だに書き込まれていないデータを超えた値を記入する際に、フィル値が記入されます。これによって書き込まれる前にデータを読み取ってしまうことを感知できます。フィル値の使用法の詳細については、7.16節 「フィル値」(p.82)を参照して下さい。独自のフィル値の定義の仕方については 8.1節 「属性の規約」(p.84)を参照して下さい。
NF_NOFILL に対応する動作は、データをフィル値で満たそうとするデフォルト動作を無効にします。これによって、NetCDFライブラリがフィル値を書き込み、さらにそれらの値が後にデータによって上書きされるという二重の操作を避けることができ、パフォーマンスが向上します。
戻り値によってNetCDFファイルがどのモードにあったかということが分かります。この値を利用して、オープンされたNetCDFファイルのフィルモードを一時的に変更し、後で元のモードに復旧させることができます。
オープンされたNetCDFファイルをNF_NOFILL モードにした後は、後で読み取られるすべての位置に有効なデータが書き込まれていることを確認してください。nofillモードは書き込み用にオープンされたNetCDFファイルの一時的な性質でしかない点に注意してください。ファイルを一度クローズして再度開いたときには、デフォルト動作に戻ります。また、フィルモードを陽にNF_NOFILLに設定するために、再びNF_SET_FILLを呼び出すことによってデフォルト動作に戻ることができます。
nofillモードを設定することが有益な場合が3つあります。
1. NetCDFファイルを生成・初期化するとき。この場合にはNF_ENDDEFを呼び出す前にnofillモードを設定しましょう。その後に、非記録型変数と初期化したい記録変数の初期値を完全に書き込んで下さい。
2. 既存の記録指向のNetCDFファイルを拡張する時。書き込み用にファイルを開いた後に、nofillモードを設定し、追加する記録を漏れなく付加します。間に書き込まれていない記録が存在してはいけません。
3. 既存のNetCDFファイルに初期化する予定の新しい変数を追加するとき。NF_ENDDEFを呼び出す前にnofillモードを設定し、新しい変数を完全に書き込んで下さい。
もし、NetCDFファイルが無制限次元を持ち、最後の記録がnofillモードにおいて書き込まれた場合には、nofillモードが設定されていない場合に比べてファイルが短い可能性があります。しかし、これはNetCDFインターフェースを通してのみデータアクセスすれば完全に透過性は保たれます。
将来のリリースでは、この機能はなくなっている(または不必要である)かもしれません。プログラマーはこの機能に必要以上に頼らないことが望ましいでしょう。
用法
INTEGER FUNCTION NF_SET_FILL(INTEGER NCID, INTEGER FILLMODE,
INTEGER old_mode)
NCID 以前のNF_OPEN or NF_CREATE呼び出しで返されたNetCDF ID FILLMODE ファイルの取るべきフィルモード。 NF_NOFILL または NF_FILL old_mode この呼び出し以前の返された現行のフィルモードの位置を示すポインタ。NF_NOFILL または NF_FILL
エラー
エラーが発生していなければ、NF_SET_FILL はNF_NOERRの値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として下記が挙げられます。
・ 指定されたNetCDF IDがオープンされたNetCDFファイルを参照していない。
・ 指定されたNetCDF IDが読み取り専用にオープンされたファイルを参照している。
・ フィルモード引数が NF_NOFILL または NF_FILLのどちらでもない。
例
この例では NF_SET_FILL を使って、foo.ncというNetCDFファイルの連続書き込みのnofillモードを設定します。
INCLUDE 'netcdf.inc'
…
INTEGER NCID, STATUS, OMODE
…
STATUS = NF_OPEN('foo.nc', NF_WRITE, NCID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
…
! デフォルトのprefill設定でデータを書き込む
…
OMODE = NF_SET_FILL(NCID, NF_NOFILL)
…
! prefill無しでデータを書き込む
…
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |