dnl This is m4 source. dnl Process using m4 to produce 'C' language file. dnl dnl This file is supposed to be the same as PnetCDF's test_get.m4 dnl dnl If you see this line, you can ignore the next one. /* Do not edit this file. It is produced from the corresponding .m4 source */ dnl /* * Copyright (C) 2003, Northwestern University and Argonne National Laboratory * See COPYRIGHT notice in top-level directory. */ /* $Id: test_get.m4 2542 2016-10-12 21:14:00Z wkliao $ */ dnl dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types dnl (MPI_Offset vs. size_t), and function name substrings for external data dnl types. dnl #include "tests.h" define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_get_$1',`test_nc_get_$1')')dnl define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl define(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl define(`GetVar', `ifdef(`PNETCDF',`ncmpi_get_var_$1_all', `nc_get_var_$1')')dnl define(`GetVara',`ifdef(`PNETCDF',`ncmpi_get_vara_$1_all',`nc_get_vara_$1')')dnl define(`GetVars',`ifdef(`PNETCDF',`ncmpi_get_vars_$1_all',`nc_get_vars_$1')')dnl define(`GetVarm',`ifdef(`PNETCDF',`ncmpi_get_varm_$1_all',`nc_get_varm_$1')')dnl define(`GetAtt', `ifdef(`PNETCDF',`ncmpi_get_att_$1',`nc_get_att_$1')')dnl undefine(`index')dnl dnl dnl dnl dnl dnl Macros dnl dnl dnl dnl dnl dnl Upcase(str) dnl define(`Upcase',dnl `dnl translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)')dnl dnl dnl dnl dnl dnl NCT_ITYPE(type) dnl define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl dnl define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl define(`CheckRange',`ifelse(`$1',`text', `1', `($2 >= $1_min && $2 <= $1_max)')')dnl define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl define(`CheckNumRange', `ifelse(`$1',`text', `1', `inRange3(cdf_format, $2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl dnl TEST_NC_GET_VAR1(TYPE) dnl define(`TEST_NC_GET_VAR1',dnl `dnl int TestFunc(var1)_$1(VarArgs) { int i, j, err, ncid, cdf_format; int nok = 0; /* count of valid comparisons */ int canConvert; /* Both text or both numeric */ IntType index[MAX_RANK]; double expect; $1 value; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); /* check if can detect a bad file ID */ err = GetVar1($1)(BAD_ID, 0, NULL, &value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK /* check if can detect a bad variable ID */ err = GetVar1($1)(ncid, BAD_VARID, NULL, &value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = 0; i < numVars; i++) { canConvert = (var_type[i] == NC_CHAR) CheckText($1); /* check if can detect out of boundary requests */ for (j = 0; j < var_rank[i]; j++) { index[j] = var_shape[i][j]; /* make an out-of-boundary starts[] */ err = GetVar1($1)(ncid, i, index, &value); if (!canConvert) { IF (err != NC_ECHAR) error("expecting NC_ECHAR but got %s", nc_err_code_name(err)); } else IF (err != NC_EINVALCOORDS) error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err)); index[j] = 0; } /* check if the contents are supposed to be */ for (j = 0; j < var_nels[i]; j++) { err = toMixedBase(j, var_rank[i], var_shape[i], index); IF (err != NC_NOERR) error("error in toMixedBase 1"); /* when file is created the variable contents are generated by * hash functions */ expect = hash4(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1)); if (var_rank[i] == 0 && i%2 ) /* this var has no dim, a scalar variable */ err = GetVar1($1)(ncid, i, NULL, &value); else err = GetVar1($1)(ncid, i, index, &value); if (canConvert) { if (inRange3(cdf_format, expect,var_type[i], NCT_ITYPE($1))) { if (CheckRange($1, expect)) { IF (err != NC_NOERR) { error("%s", APIFunc(strerror)(err)); } else { ifelse(`$1', `uchar', ` /* in put_vars(), API _put_vara_double() is used to * write the NC_BYTE variables to files. In this * case, NC_BYTE variables are treated as signed * for CDF-1 and 2 formats. Thus, we must skip the * equal test below for uchar. */ if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;') IF (!equal(value,expect,var_type[i],NCT_ITYPE($1))) { error("expected: %G, got: %G", expect, (double) value); } else { nok++; } } } else { IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_NOERR && err != NC_ERANGE) error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_ECHAR) error("expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_VAR1(text) TEST_NC_GET_VAR1(schar) TEST_NC_GET_VAR1(uchar) TEST_NC_GET_VAR1(short) TEST_NC_GET_VAR1(int) TEST_NC_GET_VAR1(long) TEST_NC_GET_VAR1(float) TEST_NC_GET_VAR1(double) TEST_NC_GET_VAR1(ushort) TEST_NC_GET_VAR1(uint) TEST_NC_GET_VAR1(longlong) TEST_NC_GET_VAR1(ulonglong) dnl TEST_NC_GET_VAR(TYPE) dnl define(`TEST_NC_GET_VAR',dnl `dnl int TestFunc(var)_$1(VarArgs) { int i, j, err, nels, ncid, cdf_format; int allInExtRange; /* all values within range of external data type */ int allInIntRange; /* all values within range of internal data type */ int nok = 0; /* count of valid comparisons */ int canConvert; /* Both text or both numeric */ IntType index[MAX_RANK]; double expect[MAX_NELS]; $1 value[MAX_NELS]; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); /* check if can detect a bad file ID */ err = GetVar($1)(BAD_ID, 0, value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK /* check if can detect a bad variable ID */ err = GetVar($1)(ncid, BAD_VARID, value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = 0; i < numVars; i++) { canConvert = (var_type[i] == NC_CHAR) CheckText($1); assert(var_rank[i] <= MAX_RANK); assert(var_nels[i] <= MAX_NELS); /* check if the contents are supposed to be */ for (nels=1,j=0; j schar_max) continue;') IF (!equal(value[j],expect[j],var_type[i],NCT_ITYPE($1))){ error("value read not that expected"); if (verbose) { error("\n"); error("varid: %d, ", i); error("var_name: %s, ", var_name[i]); error("var_type: %s, ", s_nc_type(var_type[i])); error("element number: %d, ", j); error("expect: %g, ", expect[j]); error("got: %g", (double) value[j]); } } else { nok++; } } } } else { IF (nels > 0 && err != NC_ECHAR) error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_VAR(text) TEST_NC_GET_VAR(uchar) TEST_NC_GET_VAR(schar) TEST_NC_GET_VAR(short) TEST_NC_GET_VAR(int) TEST_NC_GET_VAR(long) TEST_NC_GET_VAR(float) TEST_NC_GET_VAR(double) TEST_NC_GET_VAR(ushort) TEST_NC_GET_VAR(uint) TEST_NC_GET_VAR(longlong) TEST_NC_GET_VAR(ulonglong) dnl TEST_NC_GET_VARA(TYPE) dnl define(`TEST_NC_GET_VARA',dnl `dnl int TestFunc(vara)_$1(VarArgs) { int i, j, k, d, err, nels, nslabs, ncid, cdf_format; int allInExtRange; /* all values within external range? */ int allInIntRange; /* all values within internal range? */ int nok = 0; /* count of valid comparisons */ int canConvert; /* Both text or both numeric */ IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK]; double expect[MAX_NELS]; $1 value[MAX_NELS]; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); err = GetVara($1)(BAD_ID, 0, NULL, NULL, value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK err = GetVara($1)(ncid, BAD_VARID, NULL, NULL, value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = 0; i < numVars; i++) { canConvert = (var_type[i] == NC_CHAR) CheckText($1); assert(var_rank[i] <= MAX_RANK); assert(var_nels[i] <= MAX_NELS); for (j = 0; j < var_rank[i]; j++) { start[j] = 0; edge[j] = 1; } for (j = 0; j < var_rank[i]; j++) { start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */ err = GetVara($1)(ncid, i, start, edge, value); IF (canConvert && err != NC_EINVALCOORDS) error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err)); start[j] = 0; edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */ err = GetVara($1)(ncid, i, start, edge, value); IF (canConvert && err != NC_EEDGE) error("expecting NC_EEDGE but got %s", nc_err_code_name(err)); edge[j] = 1; } /* Check non-scalars for correct error returned even when */ /* there is nothing to get (edge[j]==0) */ if (var_rank[i] > 0) { for (j = 0; j < var_rank[i]; j++) edge[j] = 0; for (j = 0; j < var_rank[i]; j++) { if (var_dimid[i][j] > 0) { /* skip record dim */ start[j] = var_shape[i][j]; err = GetVara($1)(ncid, i, start, edge, value); IF (canConvert && err != NC_EINVALCOORDS) error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err)); start[j] = 0; } } err = GetVara($1)(ncid, i, start, edge, value); if (canConvert) { IF (err != NC_NOERR) error("%s", APIFunc(strerror)(err)); } else { IF (err != NC_ECHAR) error("expecting NC_ECHAR but got %s", nc_err_code_name(err)); } for (j = 0; j < var_rank[i]; j++) { edge[j] = 1; } } /* Choose a random point dividing each dim into 2 parts */ /* get 2^rank (nslabs) slabs so defined */ nslabs = 1; for (j = 0; j < var_rank[i]; j++) { mid[j] = roll( var_shape[i][j] ); nslabs *= 2; } /* bits of k determine whether to get lower or upper part of dim */ for (k = 0; k < nslabs; k++) { nels = 1; for (j = 0; j < var_rank[i]; j++) { if ((k >> j) & 1) { start[j] = 0; edge[j] = mid[j]; } else { start[j] = mid[j]; edge[j] = var_shape[i][j] - mid[j]; } nels *= edge[j]; } allInExtRange = allInIntRange = 1; for (j = 0; j < nels; j++) { err = toMixedBase(j, var_rank[i], edge, index); IF (err != NC_NOERR) error("error in toMixedBase 1"); for (d = 0; d < var_rank[i]; d++) index[d] += start[d]; expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1)); if (inRange3(cdf_format, expect[j],var_type[i], NCT_ITYPE($1))) { IfCheckTextChar($1, var_type[i]) allInIntRange &= CheckRange($1,expect[j]); } else { allInExtRange = 0; } } if (var_rank[i] == 0 && i%2) err = GetVara($1)(ncid, i, NULL, NULL, value); else err = GetVara($1)(ncid, i, start, edge, value); if (canConvert) { if (allInExtRange) { if (allInIntRange) { IF (err != NC_NOERR) error("%s", APIFunc(strerror)(err)); } else { IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_NOERR && err != NC_ERANGE) error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err)); } for (j = 0; j < nels; j++) { if (CheckNumRange($1, expect[j], var_type[i])) { ifelse(`$1', `uchar', ` /* in put_vars(), API _put_vara_double() is used to * write the NC_BYTE variables to files. In this * case, NC_BYTE variables are treated as signed * for CDF-1 and 2 formats. Thus, we must skip the * equal test below for uchar. */ if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') IF (!equal(value[j],expect[j],var_type[i],NCT_ITYPE($1))){ error("value read not that expected"); if (verbose) { error("\n"); error("varid: %d, ", i); error("var_name: %s, ", var_name[i]); error("var_type: %s, ", s_nc_type(var_type[i])); error("element number: %d, ", j); error("expect: %g, ", expect[j]); error("got: %g", (double) value[j]); } } else { nok++; } } } } else { IF (nels > 0 && err != NC_ECHAR) error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_VARA(text) TEST_NC_GET_VARA(uchar) TEST_NC_GET_VARA(schar) TEST_NC_GET_VARA(short) TEST_NC_GET_VARA(int) TEST_NC_GET_VARA(long) TEST_NC_GET_VARA(float) TEST_NC_GET_VARA(double) TEST_NC_GET_VARA(ushort) TEST_NC_GET_VARA(uint) TEST_NC_GET_VARA(longlong) TEST_NC_GET_VARA(ulonglong) dnl TEST_NC_GET_VARS(TYPE) dnl define(`TEST_NC_GET_VARS',dnl `dnl int TestFunc(vars)_$1(VarArgs) { int i, j, k, d, m, err, nels, nslabs, ncid, cdf_format; int allInExtRange; /* all values within external range? */ int allInIntRange; /* all values within internal range? */ int nstarts; /* number of different starts */ int nok = 0; /* count of valid comparisons */ int canConvert; /* Both text or both numeric */ IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK]; IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK]; IntType sstride[MAX_RANK]; PTRDType stride[MAX_RANK]; double expect[MAX_NELS]; $1 value[MAX_NELS]; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); err = GetVars($1)(BAD_ID, 0, NULL, NULL, NULL, value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK err = GetVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = 0; i < numVars; i++) { canConvert = (var_type[i] == NC_CHAR) CheckText($1); assert(var_rank[i] <= MAX_RANK); assert(var_nels[i] <= MAX_NELS); for (j = 0; j < var_rank[i]; j++) { start[j] = 0; edge[j] = 1; stride[j] = 1; } for (j = 0; j < var_rank[i]; j++) { start[j] = var_shape[i][j]; err = GetVars($1)(ncid, i, start, edge, stride, value); if (!canConvert) { IF (err != NC_ECHAR) error("expecting NC_ECHAR but got %s", nc_err_code_name(err)); } else { IF (err != NC_EINVALCOORDS) error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err)); start[j] = 0; edge[j] = var_shape[i][j] + 1; err = GetVars($1)(ncid, i, start, edge, stride, value); IF (err != NC_EEDGE) error("expecting NC_EEDGE but got %s", nc_err_code_name(err)); edge[j] = 1; stride[j] = 0; err = GetVars($1)(ncid, i, start, edge, stride, value); IF (err != NC_ESTRIDE) error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err)); stride[j] = 1; } } /* Choose a random point dividing each dim into 2 parts */ /* get 2^rank (nslabs) slabs so defined */ nslabs = 1; for (j = 0; j < var_rank[i]; j++) { mid[j] = roll( var_shape[i][j] ); nslabs *= 2; } /* bits of k determine whether to get lower or upper part of dim */ /* choose random stride from 1 to edge */ for (k = 0; k < nslabs; k++) { nstarts = 1; for (j = 0; j < var_rank[i]; j++) { if ((k >> j) & 1) { start[j] = 0; edge[j] = mid[j]; } else { start[j] = mid[j]; edge[j] = var_shape[i][j] - mid[j]; } sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1; nstarts *= stride[j]; } for (m = 0; m < nstarts; m++) { err = toMixedBase(m, var_rank[i], sstride, index); IF (err != NC_NOERR) error("error in toMixedBase"); nels = 1; for (j = 0; j < var_rank[i]; j++) { count[j] = 1 + (edge[j] - index[j] - 1) / stride[j]; nels *= count[j]; index[j] += start[j]; } /* Random choice of forward or backward */ /* TODO if ( roll(2) ) { for (j = 0; j < var_rank[i]; j++) { index[j] += (count[j] - 1) * stride[j]; stride[j] = -stride[j]; } } */ allInExtRange = allInIntRange = 1; for (j = 0; j < nels; j++) { err = toMixedBase(j, var_rank[i], count, index2); IF (err != NC_NOERR) error("error in toMixedBase 1"); for (d = 0; d < var_rank[i]; d++) index2[d] = index[d] + index2[d] * stride[d]; expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index2, NCT_ITYPE($1)); if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) { IfCheckTextChar($1, var_type[i]) allInIntRange &= CheckRange($1,expect[j]); } else { allInExtRange = 0; } } if (var_rank[i] == 0 && i%2 ) err = GetVars($1)(ncid, i, NULL, NULL, NULL, value); else err = GetVars($1)(ncid, i, index, count, stride, value); if (canConvert) { if (allInExtRange) { if (allInIntRange) { IF (err != NC_NOERR) error("%s", APIFunc(strerror)(err)); } else { IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_NOERR && err != NC_ERANGE) error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err)); } for (j = 0; j < nels; j++) { if (CheckNumRange($1, expect[j], var_type[i])) { ifelse(`$1', `uchar', ` /* in put_vars(), API _put_vara_double() is used to * write the NC_BYTE variables to files. In this * case, NC_BYTE variables are treated as signed * for CDF-1 and 2 formats. Thus, we must skip the * equal test below for uchar. */ if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') IF (!equal(value[j],expect[j],var_type[i], NCT_ITYPE($1))){ error("value read not that expected"); if (verbose) { error("\n"); error("varid: %d, ", i); error("var_name: %s, ", var_name[i]); error("var_type: %s, ", s_nc_type(var_type[i])); error("element number: %d, ", j); error("expect: %g, ", expect[j]); error("got: %g", (double) value[j]); } } else { nok++; } } } } else { IF (nels > 0 && err != NC_ECHAR) error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_VARS(text) TEST_NC_GET_VARS(uchar) TEST_NC_GET_VARS(schar) TEST_NC_GET_VARS(short) TEST_NC_GET_VARS(int) TEST_NC_GET_VARS(long) TEST_NC_GET_VARS(float) TEST_NC_GET_VARS(double) TEST_NC_GET_VARS(ushort) TEST_NC_GET_VARS(uint) TEST_NC_GET_VARS(longlong) TEST_NC_GET_VARS(ulonglong) dnl TEST_NC_GET_VARM(TYPE) dnl define(`TEST_NC_GET_VARM',dnl `dnl int TestFunc(varm)_$1(VarArgs) { int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format; int allInExtRange; /* all values within external range? */ int allInIntRange; /* all values within internal range? */ int nstarts; /* number of different starts */ int nok = 0; /* count of valid comparisons */ int canConvert; /* Both text or both numeric */ IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK]; IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK]; IntType sstride[MAX_RANK]; PTRDType stride[MAX_RANK], imap[MAX_RANK]; double expect[MAX_NELS]; $1 value[MAX_NELS]; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); err = GetVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK err = GetVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = 0; i < numVars; i++) { canConvert = (var_type[i] == NC_CHAR) CheckText($1); assert(var_rank[i] <= MAX_RANK); assert(var_nels[i] <= MAX_NELS); for (j = 0; j < var_rank[i]; j++) { start[j] = 0; edge[j] = 1; stride[j] = 1; imap[j] = 1; } for (j = 0; j < var_rank[i]; j++) { start[j] = var_shape[i][j]; err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); if (!canConvert) { IF (err != NC_ECHAR) error("expecting NC_ECHAR but got %s", nc_err_code_name(err)); } else { IF (err != NC_EINVALCOORDS) error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err)); start[j] = 0; edge[j] = var_shape[i][j] + 1; err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); IF (err != NC_EEDGE) error("expecting NC_EEDGE but got %s", nc_err_code_name(err)); edge[j] = 1; stride[j] = 0; err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); IF (err != NC_ESTRIDE) error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err)); stride[j] = 1; } } /* Choose a random point dividing each dim into 2 parts */ /* get 2^rank (nslabs) slabs so defined */ nslabs = 1; for (j = 0; j < var_rank[i]; j++) { mid[j] = roll( var_shape[i][j] ); nslabs *= 2; } /* bits of k determine whether to get lower or upper part of dim */ /* choose random stride from 1 to edge */ for (k = 0; k < nslabs; k++) { nstarts = 1; for (j = 0; j < var_rank[i]; j++) { if ((k >> j) & 1) { start[j] = 0; edge[j] = mid[j]; } else { start[j] = mid[j]; edge[j] = var_shape[i][j] - mid[j]; } sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1; nstarts *= stride[j]; } for (m = 0; m < nstarts; m++) { err = toMixedBase(m, var_rank[i], sstride, index); IF (err != NC_NOERR) error("error in toMixedBase"); nels = 1; for (j = 0; j < var_rank[i]; j++) { count[j] = 1 + (edge[j] - index[j] - 1) / stride[j]; nels *= count[j]; index[j] += start[j]; } /* Random choice of forward or backward */ /* TODO if ( roll(2) ) { for (j = 0; j < var_rank[i]; j++) { index[j] += (count[j] - 1) * stride[j]; stride[j] = -stride[j]; } } */ if (var_rank[i] > 0) { j = var_rank[i] - 1; imap[j] = 1; for (; j > 0; j--) imap[j-1] = imap[j] * count[j]; } allInExtRange = allInIntRange = 1; for (j = 0; j < nels; j++) { err = toMixedBase(j, var_rank[i], count, index2); IF (err != NC_NOERR) error("error in toMixedBase 1"); for (d = 0; d < var_rank[i]; d++) index2[d] = index[d] + index2[d] * stride[d]; expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index2, NCT_ITYPE($1)); if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) { IfCheckTextChar($1, var_type[i]) allInIntRange &= CheckRange($1,expect[j]); } else { allInExtRange = 0; } } if (var_rank[i] == 0 && i%2 ) err = GetVarm($1)(ncid,i,NULL,NULL,NULL,NULL,value); else err = GetVarm($1)(ncid,i,index,count,stride,imap,value); if (canConvert) { if (allInExtRange) { if (allInIntRange) { IF (err != NC_NOERR) error("%s", APIFunc(strerror)(err)); } else { IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_NOERR && err != NC_ERANGE) error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err)); } for (j = 0; j < nels; j++) { if (CheckNumRange($1, expect[j], var_type[i])) { ifelse(`$1', `uchar', ` /* in put_vars(), API _put_vara_double() is used to * write the NC_BYTE variables to files. In this * case, NC_BYTE variables are treated as signed * for CDF-1 and 2 formats. Thus, we must skip the * equal test below for uchar. */ if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') IF (!equal(value[j],expect[j],var_type[i], NCT_ITYPE($1))){ error("value read not that expected"); if (verbose) { error("\n"); error("varid: %d, ", i); error("var_name: %s, ", var_name[i]); error("var_type: %s, ", s_nc_type(var_type[i])); error("element number: %d, ", j); error("expect: %g, ", expect[j]); error("got: %g", (double) value[j]); } } else { nok++; } } } } else { IF (nels > 0 && err != NC_ECHAR) error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_VARM(text) TEST_NC_GET_VARM(uchar) TEST_NC_GET_VARM(schar) TEST_NC_GET_VARM(short) TEST_NC_GET_VARM(int) TEST_NC_GET_VARM(long) TEST_NC_GET_VARM(float) TEST_NC_GET_VARM(double) TEST_NC_GET_VARM(ushort) TEST_NC_GET_VARM(uint) TEST_NC_GET_VARM(longlong) TEST_NC_GET_VARM(ulonglong) dnl TEST_NC_GET_ATT(TYPE) dnl define(`TEST_NC_GET_ATT',dnl `dnl int TestFunc(att)_$1(AttVarArgs) { int i, j, err, ncid, cdf_format; IntType k; int allInExtRange; int allInIntRange; int canConvert; /* Both text or both numeric */ int nok = 0; /* count of valid comparisons */ double expect[MAX_NELS]; $1 value[MAX_NELS]; err = FileOpen(testfile, NC_NOWRITE); IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); err = APIFunc(inq_format)(ncid, &cdf_format); IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); err = GetAtt($1)(BAD_ID, 0, NULL, value); IF (err != NC_EBADID) error("expecting NC_EBADID but got %s", nc_err_code_name(err)); ELSE_NOK err = GetAtt($1)(ncid, BAD_VARID, NULL, value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK for (i = -1; i < numVars; i++) { for (j = 0; j < NATTS(i); j++) { canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1); err = GetAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), value); IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err)); ELSE_NOK /* check if can detect a bad name */ err = GetAtt($1)(ncid, i, NULL, NULL); IF (err != NC_EBADNAME) error("expecting NC_EBADNAME but got %s", nc_err_code_name(err)); ELSE_NOK err = GetAtt($1)(ncid, i, "noSuch", value); IF (err != NC_ENOTATT) error("expecting NC_ENOTATT but got %s", nc_err_code_name(err)); allInExtRange = allInIntRange = 1; for (k = 0; k < ATT_LEN(i,j); k++) { expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1)); if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) { /* netCDF specification make a special case for type * conversion between uchar and scahr: do not check for * range error. See * http://www.unidata.ucar.edu/software/netcdf/docs_rc/data_type.html#type_conversion */ IfCheckTextChar($1, ATT_TYPE(i,j)) ifelse(`$1',`uchar', `if (cdf_format > NC_FORMAT_64BIT_OFFSET || (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) != NC_BYTE))') allInIntRange &= CheckRange($1,expect[k]); } else { allInExtRange = 0; } } err = GetAtt($1)(ncid, i, ATT_NAME(i,j), value); if (canConvert || ATT_LEN(i,j) == 0) { if (allInExtRange) { if (allInIntRange) { IF (err != NC_NOERR) error("%s", APIFunc(strerror)(err)); } else { IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s", nc_err_code_name(err)); } } else { IF (err != NC_NOERR && err != NC_ERANGE) error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err)); } for (k = 0; k < ATT_LEN(i,j); k++) { if (CheckNumRange($1, expect[k], ATT_TYPE(i,j))) { ifelse(`$1', `uchar', ` /* in put_vars(), API _put_vara_double() is used to * write the NC_BYTE variables to files. In this * case, NC_BYTE variables are treated as signed * for CDF-1 and 2 formats. Thus, we must skip the * equal test below for uchar. */ if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;') IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_ITYPE($1))){ error("value read not that expected"); if (verbose) { error("\n"); error("varid: %d, ", i); if (i == -1) error("var_type: GLOBAL, "); else error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i])); error("att_name: %s, ", ATT_NAME(i,j)); error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j))); error("element number: %d, ", k); error("expect: %g, ", expect[k]); error("got: %g", (double) value[k]); } } else { nok++; } } } } else { IF (err != NC_ECHAR) error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err)); } } } err = APIFunc(close)(ncid); IF (err != NC_NOERR) error("close: %s", APIFunc(strerror)(err)); return nok; } ')dnl TEST_NC_GET_ATT(text) TEST_NC_GET_ATT(uchar) TEST_NC_GET_ATT(schar) TEST_NC_GET_ATT(short) TEST_NC_GET_ATT(int) TEST_NC_GET_ATT(long) TEST_NC_GET_ATT(float) TEST_NC_GET_ATT(double) TEST_NC_GET_ATT(ushort) TEST_NC_GET_ATT(uint) TEST_NC_GET_ATT(longlong) TEST_NC_GET_ATT(ulonglong)