NF_GET_ATT_ type のファミリーの関数は、変数IDと名前を与えるとNetCDF属性の値を 返す。
INTEGER FUNCTION NF_GET_ATT_TEXT (INTEGER NCID, INTEGER VARID,
INTEGER FUNCTION NF_GET_ATT_INT1 (INTEGER NCID, INTEGER VARID,
INTEGER FUNCTION NF_GET_ATT_INT2 (INTEGER NCID, INTEGER VARID,
INTEGER FUNCTION NF_GET_ATT_INT (INTEGER NCID, INTEGER VARID,
INTEGER FUNCTION NF_GET_ATT_REAL (INTEGER NCID, INTEGER VARID,
INTEGER FUNCTION NF_GET_ATT_DOUBLE (INTEGER NCID, INTEGER VARID,
返された 属性値。属性値のベクトルの要素は全て返されるので、十分なスペースを確保する必要があります。 どれだけのスペースを確保しておかなければならないか分からない時には、 まず NF_INQ_ATTLEN を呼び出して属性の 長さを調べましょう。数値変数から文字データを読み取ったり、テキスト変数から数値データを読み取ることは出来ません。 数値データの場合には、データの型がNetCDF変数の型と異なれば型変換が行われます。(詳細については、型変換を参照してください。) |
エラーが発生していなければ、 NF_GET_ATT_ type は NF_NOERR の値を返します。 それ以外の場合には、返されたステータスがエラーを示します。エラーの原因として次のようなものが考えられます。
この例は 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