7.14 マップされた配列の値を読む: nc_get_varm_ type
関数nc_get_varm_ typeのファミリーはオープンされたNetCDFファイルのNetCDF変数からマップされた配列断面を読みます。マップされた配列断面は隅・縁の長さ・ストライドベクトル・インデックスマッピングベクトルを与えることによって指定されます。インデックスマッピングベクトルとはNetCDF変数と内部データ配列のメモリ内構造との間のマッピングを指定する整数ベクトルです。データ配列に関しては順番や長さなどについていかなる仮定もされません。
用法
int nc_get_varm_text (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], char *tp);
int nc_get_varm_uchar (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], unsigned char *up);
int nc_get_varm_schar (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], signed char *cp);
int nc_get_varm_short (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], short *sp);
int nc_get_varm_int (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], int *ip);
int nc_get_varm_long (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], long *lp);
int nc_get_varm_float (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], float *fp);
int nc_get_varm_double(int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], double *dp);
ncid 以前のnc_openまたはnc_create呼び出しで返されたNetCDF ID varid 変数ID start 先頭のデータ値が読み込まれる変数を指定する、size_tの整数のベクトル。インデックスは零に相対的なので、変数の最初のデータ値のインデックスは(0,0,…,0)になります。startの要素は指定された変数の次元と順番に対応しています。よって、記録変数の場合には、最初のインデックスはデータ値を読み取る開始記録番号に相当します。 count 各次元に沿っていくつのインデックスが選定されるかを指定するsize_tの整数ベクトル。例えば単一の値を読み取る場合には、countを(1, 1, … , 1)と指定して下さい。countの要素は変数の次元に順番に対応します。よって、記録変数の場合にはcountの最初の要素が読み取る記録数の総計に対応します。 stride 各次元ごとに選定されたインデックスの間隔を指定するサイズptrdiff_tの整数ベクトル。ストライドベクトルの要素は変数の次元に順番に対応します。値が1ならば、対応する次元のNetCDF変数で隣接する値をアクセスします。値が2の場合には対応するNetCDF変数の値を一つおきにアクセスします。NULLストライド引数は(1, 1, … , 1)として扱われる。 imap NetCDF変数の次元と内部データ配列とのメモリ内構造間のマッピングを指定する整数ベクトル。imap[0]は最も遅く変化するNetCDF変数の次元に対応する内部配列の要素と要素間の距離を示します。imap[n-1](nはNetCDF変数のランク)は最も早く変化するNetCDF変数の次元に対応する内部配列の要素と要素の間の距離を示します。この二つの要素の間にある他の要素が他のNetCDF変数の次元に対応することは自明です。要素間の距離は要素の型独立の単位で指定されます。(隣接する位置にある内部メモリ間の距離は1であり、NetCDF2のように要素のバイト長ではありません。) tp, up, cp, sp, ip, lp, fp, dp データ値が読み込まれる位置へのポインタ。データ型は呼び出された関数に適した型でなければなりません。データ型がNetCDF変数型と異なる場合には型変換が行なわれます。詳細は3.3節「型変換」(p.24)を参照して下さい。
エラー
エラーが発生していなければ、関数nc_get_varm_ typeはNC_NOERRの値を返します。その他の場合は返されたステータスがエラーの発生を示します。エラーの原因としては:
・ 変数IDが指定されたNetCDFファイルでは有効ではない。
・ 指定されたstart, countとstrideでは範囲外のインデックスを生成してしまう。imapベクトルではエラーチェックができないことに注意してください。
・ 一つもしくはそれ以上の値が要求された型で表現し得る範囲外である。
・ 指定されたNetCDFがデータモードではなく定義モードになっている。
・ 指定されたNetCDF IDがオープンされたNetCDFファイルを参照しない。
例
次のimapベクトルは4x3x2のNetCDF変数と同じ形の内部配列を自明な形でマップします。
float a[4][3][2]; /* NetCDF変数と同じ形 */
size_t imap[3] = {6, 2, 1};
/* NetCDF次元 要素間距離 */
/* ---------------- ---------------------- */
/* 最も早く変化する 1 */
/* 中間 2 (=imap[2]*2) */
/* 最も遅く変化する 6 (=imap[1]*3) */
上記のimapベクトルとnc_get_varm_floatとを使用した場合と、単にnc_get_var_floatを使用した場合とでは同じ結果が得られます。
この例ではnc_get_varm_floatを使用してC宣言文float rh[6][4](次元のサイズと順番に注目)で表わされたNetCDF変数rhを移項します。
#include <netcdf.h>
…
#define NDIM 2 /* rank of NetCDF変数のランク */
int ncid; /* NetCDF ID */
int status; /* エラーステータス */
int rhid; /* 変数ID */
static size_t start[NDIM] /* NetCDF変数のスタート地点 : */
= {0, 0}; /* 最初の要素 */
static size_t count[NDIM] /* 内部配列のサイズ: NetCDF変数全体;*/
= {6, 4}; /* 順番はNetCDF変数の順番に対応 */
/* -- 内部配列の順番ではない */
static ptrdiff_t stride[NDIM] /* 変数の部分サンプル間隔: */
= {1, 1}; /* NetCDF要素を一つおきにサンプル */
static ptrdiff_t imap[NDIM] /* 内部配列の要素間距離; */
= {1, 6}; /* 置換しなければ {4, 1} */
float rh[4][6]; /* NetCDF変数の次元が */
/* 置換されている点に注意 */
…
status = nc_open("foo.nc", NC_WRITE, &ncid);
if (status != NC_NOERR) handle_error(status);
…
status = nc_inq_varid(ncid, "rh", &rhid);
if (status != NC_NOERR) handle_error(status);
…
status = nc_get_varm_float(ncid, rhid, start, count, stride, imap, rh);
if (status != NC_NOERR) handle_error(status);
関数nc_get_varm_floatを使用したこの別の例では、NetCDF変数の点を一つおきにアクセスして同じNetCDF変数を移項すると同時に部分サンプルします。
#include <netcdf.h>
…
#define NDIM 2 /* NetCDF変数のランク */
int ncid; /* NetCDF ID */
int status; /* エラーステータス */
int rhid; /* 変数ID */
static size_t start[NDIM] /* NetCDF変数のスタート地点: */
= {0, 0}; /* 最初の要素 */
static size_t count[NDIM] /* 内部配列のサイズ: すべての */
= {3, 2}; /* (部分サンプルされた) NetCDF変数;次元の */
/* 順番はNetCDF変数に対応 */
/* -- 内部配列ではない*/
static ptrdiff_t stride[NDIM]/* 変数の部分サンプル間隔: */
= {2, 2}; /* NetCDF要素を一つおきにサンプル */
static ptrdiff_t imap[NDIM] /* 内部配列の要素間距離; */
= {1, 3}; /* 置換しなければ {2, 1} */
float rh[2][3]; /* (部分サンプルされた)NetCDF変数次元が */
/* 置換されていることに注意 */
…
status = nc_open("foo.nc", NC_WRITE, &ncid);
if (status != NC_NOERR) handle_error(status);
…
status = nc_inq_varid(ncid, "rh", &rhid);
if (status != NC_NOERR) handle_error(status);
…
status = nc_get_varm_float(ncid, rhid, start, count, stride, imap, rh);
if (status != NC_NOERR) handle_error(status);
Quadralay Corporation http://www.webworks.com Voice: (512) 719-3399 Fax: (512) 719-3606 sales@webworks.com |