8.4 属性値を取得する:NF_GET_ATT_ type
NF_GET_ATT_ typeのファミリーの関数は、変数IDと名前を与えるとNetCDF属性の値を返します。
用法
INTEGER FUNCTION NF_GET_ATT_TEXT (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
CHARACTER*(*) text)
INTEGER FUNCTION NF_GET_ATT_INT1 (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
INTEGER*1 i1vals(*))
INTEGER FUNCTION NF_GET_ATT_INT2 (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
INTEGER*2 i2vals(*))
INTEGER FUNCTION NF_GET_ATT_INT (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
INTEGER ivals(*))
INTEGER FUNCTION NF_GET_ATT_REAL (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
REAL rvals(*))
INTEGER FUNCTION NF_GET_ATT_DOUBLE (INTEGER NCID, INTEGER VARID,
CHARACTER*(*) NAME,
DOUBLE dvals(*))
NCID 以前のNF_OPENまたはNF_CREATE呼び出しで返されたNetCDF ID VARID 属性の変数の変数ID、またはグローバル属性の場合にはNF_GLOBAL NAME 属性名 text, i1vals, i2vals, ivals,rvals, dvals 返された属性値。属性値のベクトルの要素はすべて返されるので、十分なスペースを確保する必要があります。どれだけのスペースを確保しておかなければならないか分からない時には、まずNF_INQ_ATTLENを呼び出して属性の長さを調べましょう。数値変数から文字データを読み取ったり、テキスト変数から数値データを読み取ることは出来ません。数値データの場合には、データの型がNetCDF変数の型と異なれば型変換が行われます。(詳細については、3.3節「型変換」(p.24)を参照してください。)
エラー
エラーが発生していなければ、NF_GET_ATT_ typeはNF_NOERRの値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として次のようなものが考えられます。
・ 変数 IDが指定されたNetCDFファイルで無効である。
・ 指定された属性が存在しない。
・ 指定されたNetCDF IDがオープンされたNetCDFファイルを参照していない。
・ 属性値の一つまたはそれ以上が要求された型で表現し得る値の範囲から外れている。
例
この例はNF_GET_ATT_DOUBLEを使って、既存のfoo.ncという名前のNetCDFファイルのrhというNetCDF変数の属性valid_rangeの値と、titleという名前のグローバル属性とについて調べます。この例では、幾つの値が返されるか不明であると仮定します。そこで、格納するスペースが十分であることを確認するために、まず始めに属性の長さについて問い合わせます。
INCLUDE 'netcdf.inc'
…
PARAMETER (MVRLEN=3) ! "有効範囲"の値の最大数
PARAMETER (MTLEN=80) ! "title" 属性に最大長
INTEGER STATUS, NCID
INTEGER RHID ! 変数 ID
INTEGER VRLEN, TLEN ! 属性長
DOUBLE PRECISION VRVAL(MVRLEN) ! vr 属性値
CHARACTER*80 TITLE ! title 属性値
…
STATUS = NF_OPEN ('foo.nc', NF_WRITE, NCID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
…
STATUS = NF_INQ_VARID (NCID, 'rh', RHID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
…
! 十分なスペースがあるか確認するために、属性長を取得
STATUS = NF_INQ_ATTLEN (NCID, RHID, 'valid_range', VRLEN)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
STATUS = NF_INQ_ATTLEN (NCID, NF_GLOBAL, 'title', TLEN)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
! 大きすぎなければ、属性値を取得
IF (VRLEN .GT. MVRLEN) THEN
WRITE (*,*) 'valid_range attribute too big!'
CALL EXIT
ELSE
STATUS = NF_GET_ATT_DOUBLE (NCID, RHID, 'valid_range', VRVAL)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
ENDIF
IF (TLEN .GT. MTLEN) THEN
WRITE (*,*) 'title attribute too big!'
CALL EXIT
ELSE
STATUS = NF_GET_ATT_TEXT (NCID, NF_GLOBAL, 'title', TITLE)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
ENDIF
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |