Up|<<Prev|Next>>


5.12 書き込みのフィルモードを設定する: NF_SET_FILL

この関数は以下に述べる状況下での書き込みを最適化するための高度な使用を目的としています。関数 NF_SET_FILL は書き込み用に開かれたNetCDFファイルの フィルモード を設定し、戻り値として現行のモードを返します。フィルモードは NF_FILL 又は NF_NOFILL のどちらででも設定でき、NF_FILLに対応したデフォルトステータスはデータがフィル値によって既に埋められているというものです。即ち、非記録型変数を生成する際、もしくは未だに書き込まれていないデータを超えた値を記入する際に、フィル値が記入されます。これによって書き込まれる前にデータを読み取ってしまうことを感知できます。フィル値の使用法の 詳細については、 7.16 - フィル値。独自のフィル値の定義の仕方については 8.1 - 属性の規約

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 の値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として下記が挙げられます。

 

この 例では 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無しでデータを書き込む
   ... 

Up|<<Prev|Next>>