TOC PREV NEXT INDEX

Put your logo here!


7.9 マップされた配列の値を書き込む: nc_put_varm_ type


関数nc_put_varm_ typeのファミリーはマップされた配列断面の値をオープンされたNetCDFファイルの変数に書き込んでいきます。マップされた配列断面は隅の位置・カウントのベクトル・ ストライドベクトル・ インデックスマッピングベクトルを与えることによって指定されます。インデックスマッピングベクトルとは整数のベクトルで、NetCDF変数の次元と内部データ配列のメモリ内構造間のマッピングを指定するベクトルです。データ配列に関する次元の順番や長さに関する仮定は一切なされません。NetCDFファイルはデータモードになっていなければなりません。

用法
int nc_put_varm_text (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const char *tp);
int nc_put_varm_uchar (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const unsigned char *up);
int nc_put_varm_schar (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const signed char *cp);
int nc_put_varm_short (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const short *sp);
int nc_put_varm_int (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const int *ip);
int nc_put_varm_long (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const long *lp);
int nc_put_varm_float (int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const float *fp);
int nc_put_varm_double(int ncid, int varid, const size_t start[],
const size_t count[], const ptrdiff_t stride[],
const ptrdiff_t imap[], const 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 NetCDF変数の各次元に沿ってのサンプリング間隔を指定する ptrdiff_t型整数のベクトル。ストライドベクトルの要素はNetCDF変数の次元に順番に対応します。(stride[0] はNetCDF変数の次元中で最も遅く変化する次元のサンプリング間隔を与える。)サンプリングの間隔は要素の型独立の単位で指定される。(値が1は対応する次元に沿って隣接するNetCDF変数を選定します。値が2ならばNetCDF変数の次元に沿って一つおきの値にアクセスします。) ストライドが NULL (0)の場合には各次元に沿って(1, 1, … , 1)、つまり隣接した値にアクセスしていくとデフォルトで定義されています。
imap NetCDF変数と内部データ配列のメモリ内構造間のマッピングを指定する ptrdiff_t型の整数ベクトル。インデックスマッピングベクトルの要素はNetCDF変数の次元と順番に対応します。(imap[0] はNetCDF変数の次元のうち、最も遅く変化する次元に対応する内部配列の要素間の距離を与えます。)要素間の距離は型独立な要素の単位で示されます。(メモリ内で隣接している位置にある内部要素間の距離は1であり、NetCDF 2の場合のように要素のバイト長ではありません。) 引数NULL はメモリ内の値が関連付けられるNetCDF変数と同じ構造を持っていることを示します。
tp, up, cp, sp, ip, lp, fp, dp データ値の位置を計算するために使用される位置を示すポインタ。データ値は呼び出された関数に適当な型でなくてはなりません。データがNetCDF変数型と異なる場合には型変換が行なわれます。詳細については 3.3節「型変換」(p.24)を参照してください。

エラー

エラーが発生していない場合には関数nc_put_varm_ typeNC_NOERRの値を返します。それ以外の場合には、返されたステータスがエラーを示します。エラーの原因としては:

・ 変数IDが指定されたNetCDFファイルに対して有効ではない。
・ 指定された start, count 及び stride では範囲外のインデックスを生じてしまう。imapベクトルにおいてはエラーチェックができないことに注意してください。
・ 指定された値のうち、少なくとも一つが変数の外部データ型で表現可能な値の範囲外である。
・ 指定されたNetCDFファイルがデータモードではなく定義モードになっている。
・ 指定されたNetCDF IDがオープンされたNetCDFファイルを参照しない。

以下の imapベクトルは4x3x2 NetCDF変数と同じ形の内部配列を簡潔な方法でマップします。

float a[4][3][2]; /* NetCDF変数と同じ形 */
int imap[3] = {6, 2, 1};
/* NetCDF 次元 要素間距離 */
/* ---------------- ---------------------- */
/* 最も早く変化 1 */
/* 中間 2 (=imap[2]*2) */
/* 最も遅く変化 6 (=imap[1]*3) */

上記の例で imap ベクトルとあわせて nc_put_varm_float 使用すると、単にnc_put_var_floatを使用した場合と同じ結果が得られます。

この例では nc_put_varm_float を使用して、転置された内部配列から、NetCDF変数rhを書きます。変数 rh は C宣言文 float rh[6][4] で定義されています。(次元の大きさに注意してください。)

#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] /* 内部配列のサイズ: 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_put_varm_float(ncid, rhid, start, count, stride, imap, rh);
if (status != NC_NOERR) handle_error(status);

この例では nc_put_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_put_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
TOC PREV NEXT INDEX