Up|<<Prev|Next>>


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

全ての書き込まれるデータの中で先頭のデータ値が書き込まれる変数を指定する、サイズ_tの整数のベクトル。インデックスは零に相対的なので、変数の最初のデータ値のインデックスは(0,0、...、0)になります。 start の要素は変数の次元と順番に対応していなければならない。よって、記録変数の場合には、最初のインデックスはデータ値を書き込む開始記録番号に相当する。

count

各次元に沿って選ばれたインデックスの数を指定するサイズ_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, or dp

データ値の位置を計算するために使用される位置を示すポインタ。データ値は呼び出された関数に適当な型でなくてはならない。データがNetCDF変数型と異なる場合にはタイプ変換が行なわれます。詳細については タイプ変換を参照してください。

 

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

 

以下の 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);

Up|<<Prev|Next>>