use netcdftype(NC_DIMENSION):: dim type(NC_VARIABLE):: variable type(NC_LIMIT):: limit character(len = ...):: dimname integer:: start, count, stride integer:: starts(7), counts(7), strides(7)
! limit の生成と廃棄 type(NC_LIMIT) function WholeVariable(variable) subroutine Dispose(limit)
! limit の利用
logical function Slice(limit, dimname, start [, count [, stride]]) integer function Size(limit) starts = Start(limit) counts = Count(limit) strides = Stride(limit) ! イテレータ (利用例参照) subroutine Next(limit)
! limit について再定義された演算子・代入 ! limit = WholeVariable(variable) と等価 limit = variable if (.error. limit) ... ! 論理型を与える単項演算子
! 変数入力 real:: buffer(任意の寸法) logical function NetcdfGetReal(variable, buffer [, limit])
integer:: buffer(任意の寸法) logical function NetcdfGetInt(variable, buffer [, limit])
character(len = 任意の寸法):: buffer(任意の寸法) logical function NetcdfGetText(variable, buffer [, limit])
! より一般的な入力 real, pointer:: buffer(任意の次元数・寸法) subroutine Get(variable, buffer [, limit] [, fail])
integer, pointer:: buffer(任意の次元数・寸法) subroutine Get(variable, buffer [, limit] [, fail])
character, pointer:: buffer(任意の次元数・寸法) subroutine Get(variable, buffer [, limit] [, fail])
! 変数出力 real:: buffer(任意の次元数・寸法) logical function NetcdfPutReal(variable, buffer [, limit) subroutine Put(variable, buffer [, limit])
integer:: buffer(任意の次元数・寸法) logical function NetcdfPutInt(variable, buffer [, limit) subroutine Put(variable, buffer [, limit])
character:: buffer(任意の次元数・寸法) logical function NetcdfPutText(variable, buffer [, limit) subroutine Put(variable, buffer [, limit])
NC_LIMIT 構造体は netCDF 変数の入出力に際して用いられる範囲指定の抽象化です。 多次元配列である netCDF 変数の部分配列を入出力の対象とするには、 NC_VARIABLE 構造体から NC_LIMIT 構造体を作成し、これに Slice 関数を呼び出して範囲を設定し、 Get または Put サブルーチンの limit 引数として使用します。 Get または Put の引数を省略した場合には変数全体が対象となります。
次元変数の値を一定にしないような断面 (たとえば経緯度上に定義された データに対する北東から南西への断面) に対する入出力は サポートされていません。
モジュールやマニュアルページの名称の netcdf_slice という語は 内部的に利用される構造体名に由来します。 これは本来 netcdf_limit に変更されるべきです。
real, pointer:: varptr(:, :, :, :, :, :, :) ... limit = WholeVariable(variable) if (.error. Slice(limit, 'longitude', 1)) stop 'slice' do call Get(variable, varptr, limit) if (.not.associated(varptr)) call NetcdfAssert ... deallocate(varptr) call Next(limit) if (.error. limit) exit enddo