int CONetCDF4::getGroup(const CNetCDF4Path & path) { int retvalue = this->ncidp; CNetCDF4Path::const_iterator it = path.begin(), end = path.end(); for (;it != end; it++) { const std::string & groupid = *it; CheckError(nc_inq_ncid(retvalue, const_cast<char*>(groupid.c_str()), &retvalue)); } return (retvalue); }
/*! This function makes a request to netcdf with ncid and group name then return ncid of the named group \param [in] ncid Groupd id (or File Id) \param [in] grpName Name of the desired group (or file) \param [in/out] grpId Group id if the group is found \return Status code */ int CNetCdfInterface::inqNcId(int ncid, const StdString& grpName, int& grpId) { int status = nc_inq_ncid(ncid, grpName.c_str(), &grpId); if (NC_NOERR != status) { StdString errormsg(nc_strerror(status)); StdStringStream sstr; sstr << "Error when calling function nc_inq_ncid(ncid, grpName.c_str(), &grpId)" << std::endl << errormsg << std::endl << "Unable to get id of a group (File), given its name: " << grpName << std::endl; StdString e = sstr.str(); throw CNetCdfException(e); } return status; }
/* This has same semantics as nc_inq_ncid */ int nc_inq_grp_ncid(int ncid, const char *grp_name, int *grp_ncid) { return nc_inq_ncid(ncid,grp_name,grp_ncid); }
int main(int argc, char **argv) { nc_set_log_level(0); printf("\n*** Testing netcdf-4 dimensions even more.\n"); printf("*** testing netcdf-4 dimension inheritance..."); { #define FILE_NAME "tst_dims3.nc" #define RANK_time 1 #define GRP_NAME "G" #define TIME_NAME "time" #define VAR2_NAME "z" #define TIME_RANK 1 #define NUM_TIMES 2 int ncid, grpid; int time_dim, time_dim_in; int time_var, z_var; size_t len; int time_data[NUM_TIMES] = {1, 2} ; size_t time_startset[TIME_RANK] = {0} ; size_t time_countset[TIME_RANK] = {NUM_TIMES} ; /* Create file with unlimited dim and associated coordinate * variable in root group, another variable that uses unlimited * dim in subgroup. */ if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR; if (nc_def_grp(ncid, GRP_NAME, &grpid)) ERR; if (nc_def_dim(ncid, TIME_NAME, NC_UNLIMITED, &time_dim)) ERR; if (nc_def_var(ncid, TIME_NAME, NC_INT, TIME_RANK, &time_dim, &time_var)) ERR; if (nc_def_var(grpid, VAR2_NAME, NC_INT, TIME_RANK, &time_dim, &z_var)) ERR; if (nc_enddef(ncid)) ERR; /* Assign data to time variable, creating two times */ if (nc_put_vara(ncid, time_dim, time_startset, time_countset, time_data)) ERR; /* Check the dim len from the root group */ if (nc_inq_dimlen(ncid, time_dim, &len)) ERR; if (len != NUM_TIMES) ERR; /* Check the dim len from the sub group */ if (nc_inq_dimlen(grpid, time_dim, &len)) ERR; if (len != NUM_TIMES) ERR; if (nc_close(ncid)) ERR; /* Now check how many times there are from the subgroup */ if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR; if (nc_inq_ncid(ncid, GRP_NAME, &grpid)) ERR; if (nc_inq_dimid(ncid, TIME_NAME, &time_dim)) ERR; /* Check the dim len from the root group */ if (nc_inq_dimlen(ncid, time_dim, &len)) ERR; if (len != NUM_TIMES) ERR; /* Check the dim len from the sub group */ if (nc_inq_dimlen(grpid, time_dim, &len)) ERR; if (len != NUM_TIMES) ERR; /* Find the dimension by name. */ if (nc_inq_dimid(grpid, TIME_NAME, &time_dim_in)) ERR; if (time_dim_in != time_dim) ERR; if (nc_close(ncid)) ERR; } SUMMARIZE_ERR; printf("*** testing a scalar coordinate dimension..."); { int ncid, dimid, varid, stat; float data = 42.5; /* Create a scalar coordinate dimension. The only reason that * the user can ever possibly have for doing this is just * because they like to make life difficult for poor, poor * netCDF programmers, trapped in this horrible place, in a * Rocky Mountain valley, drenched in sunlight, with a stream * quietly gurgling, deer feeding on the grasses, and all those * damn birds chirping! */ if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR_RET; if (nc_def_dim(ncid, "scalar", 0, &dimid)) ERR_RET; if (nc_def_var(ncid, "scalar", NC_FLOAT, 0, &dimid, &varid)) ERR_RET; if (nc_put_var_float(ncid, varid, &data)) ERR_RET; if (nc_close(ncid)) ERR_RET; } SUMMARIZE_ERR; FINAL_RESULTS; }
int main(int argc, char **argv) { printf("\n*** Testing netcdf-4 group functions.\n"); printf("*** testing use of unlimited dim in parent group..."); { #define NDIMS_IN_VAR 1 #define NDIMS_IN_FILE 2 #define BABE_LIMIT 3 #define DIM_NAME1 "Influence" #define DIM_NAME2 "Babe_Factor" #define VAR_NAME1 "Court_of_Star_Chamber" #define VAR_NAME2 "Justice_of_the_Peace" #define VAR_NAME3 "Bosworth_Field" int ncid, dimid1, dimid2, varid1, varid2, varid3, henry_vii_id; int grpid_in, varid_in1, varid_in2, varid_in3; nc_type xtype_in; int ndims_in, dimids_in[NDIMS_IN_FILE], dimid1_in, natts; char name_in[NC_MAX_NAME + 1]; size_t len_in, index[NDIMS_IN_VAR] = {0}; long long value = NC_FILL_INT64 + 1, value_in; /* Create a file with an unlimited dim and a limited, used by * variables in child groups. */ if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR; if (nc_def_dim(ncid, DIM_NAME1, NC_UNLIMITED, &dimid1)) ERR; if (nc_def_dim(ncid, DIM_NAME2, BABE_LIMIT, &dimid2)) ERR; if (nc_def_grp(ncid, HENRY_VII, &henry_vii_id)) ERR; if (nc_def_var(henry_vii_id, VAR_NAME1, NC_INT64, NDIMS_IN_VAR, &dimid1, &varid1)) ERR; if (nc_def_var(henry_vii_id, VAR_NAME2, NC_INT64, NDIMS_IN_VAR, &dimid1, &varid2)) ERR; if (nc_def_var(henry_vii_id, VAR_NAME3, NC_INT64, NDIMS_IN_VAR, &dimid2, &varid3)) ERR; /* Check it out. Find the group by name. */ if (nc_inq_ncid(ncid, HENRY_VII, &grpid_in)) ERR; /* Ensure that dimensions in parent are visible and correct. */ if (nc_inq_dimids(grpid_in, &ndims_in, dimids_in, 1)) ERR; if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2) ERR; if (nc_inq_dim(grpid_in, dimids_in[0], name_in, &len_in)) ERR; if (strcmp(name_in, DIM_NAME1) || len_in != 0) ERR; if (nc_inq_dim(grpid_in, dimids_in[1], name_in, &len_in)) ERR; if (strcmp(name_in, DIM_NAME2) || len_in != BABE_LIMIT) ERR; /* Check the vars in the group. */ if (nc_inq_varid(grpid_in, VAR_NAME1, &varid_in1)) ERR; if (nc_inq_varid(grpid_in, VAR_NAME2, &varid_in2)) ERR; if (nc_inq_varid(grpid_in, VAR_NAME3, &varid_in3)) ERR; if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3) ERR; if (nc_inq_var(grpid_in, varid1, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid1 || natts != 0) ERR; if (nc_inq_var(grpid_in, varid2, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid1 || natts != 0) ERR; if (nc_inq_var(grpid_in, varid3, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid2 || natts != 0) ERR; /* Write one value to one variable. */ if (nc_put_var1_longlong(grpid_in, varid_in1, index, &value)) ERR; /* Read one value from the second unlim dim variable. It should * be the fill value. */ if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in)) ERR; if (value_in != NC_FILL_INT64) ERR; /* Read one value from the variable with limited dim. It should * be the fill value. */ if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in)) ERR; if (value_in != NC_FILL_INT64) ERR; /* Attempt to read beyond end of dimensions to generate error. */ index[0] = BABE_LIMIT; if (nc_get_var1_longlong(grpid_in, varid_in1, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_close(ncid)) ERR; /* Check it out again. */ if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR; /* Find the group by name. */ if (nc_inq_ncid(ncid, HENRY_VII, &grpid_in)) ERR; /* Ensure that dimensions in parent are visible and correct. */ if (nc_inq_dimids(grpid_in, &ndims_in, dimids_in, 1)) ERR; if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2) ERR; if (nc_inq_dim(grpid_in, dimids_in[0], name_in, &len_in)) ERR; if (strcmp(name_in, DIM_NAME1) || len_in != 1) ERR; if (nc_inq_dim(grpid_in, dimids_in[1], name_in, &len_in)) ERR; if (strcmp(name_in, DIM_NAME2) || len_in != BABE_LIMIT) ERR; /* Check the vars in the group. */ if (nc_inq_varid(grpid_in, VAR_NAME1, &varid_in1)) ERR; if (nc_inq_varid(grpid_in, VAR_NAME2, &varid_in2)) ERR; if (nc_inq_varid(grpid_in, VAR_NAME3, &varid_in3)) ERR; if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3) ERR; if (nc_inq_var(grpid_in, varid1, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid1 || natts != 0) ERR; if (nc_inq_var(grpid_in, varid2, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid1 || natts != 0) ERR; if (nc_inq_var(grpid_in, varid3, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR; if (strcmp(name_in, VAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR || dimid1_in != dimid2 || natts != 0) ERR; /* Read one value from the second unlim dim variable. It should * be the fill value. */ index[0] = 0; if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in)) ERR; if (value_in != NC_FILL_INT64) ERR; /* Read one value from the variable with limited dim. It should * be the fill value. */ if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in)) ERR; if (value_in != NC_FILL_INT64) ERR; /* Attempt to read beyond end of dimensions to generate error. */ index[0] = BABE_LIMIT; if (nc_get_var1_longlong(grpid_in, varid_in1, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in) != NC_EINVALCOORDS) ERR; if (nc_close(ncid)) ERR; } SUMMARIZE_ERR; printf("*** testing groups and unlimited dimensions..."); { int ncid; int henry_vii_id; int tudor_id; int dimids_in[MAX_SIBLING_GROUPS], ndims_in; int num_grps; int dimid, dynasty, varid; size_t len_in; int natts_in; int grpids_in[10]; nc_type xtype_in; char name_in[NC_MAX_NAME + 1]; int data_out[DIM1_LEN] = {0, 2, 6}, data_in[DIM1_LEN]; size_t start[1] = {0}, count[1] = {3}; int j; /* Create one group, with one var, which has one dimension, which is unlimited. */ if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR; if (nc_def_grp(ncid, DYNASTY, &tudor_id)) ERR; if (nc_def_dim(tudor_id, DIM1_NAME, NC_UNLIMITED, &dimid)) ERR; if (nc_def_grp(tudor_id, HENRY_VII, &henry_vii_id)) ERR; if (nc_def_var(henry_vii_id, VAR1_NAME, NC_INT, 1, &dimid, &varid)) ERR; if (nc_put_vara_int(henry_vii_id, varid, start, count, data_out)) ERR; if (nc_close(ncid)) ERR; /* Now check the file to see if the dimension and variable are * there. */ if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR; if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR; if (num_grps != 1) ERR; if (nc_inq_grps(dynasty, &num_grps, grpids_in)) ERR; if (num_grps != 1) ERR; if (nc_inq_dim(grpids_in[0], 0, name_in, &len_in)) ERR; if (strcmp(name_in, DIM1_NAME) || len_in != DIM1_LEN) ERR; if (nc_inq_var(grpids_in[0], 0, name_in, &xtype_in, &ndims_in, dimids_in, &natts_in)) ERR; if (strcmp(name_in, VAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 || dimids_in[0] != 0 || natts_in != 0) ERR; if (nc_get_vara_int(grpids_in[0], 0, start, count, data_in)) ERR; for (j=0; j<DIM1_LEN; j++) if (data_in[j] != data_out[j]) ERR; if (nc_close(ncid)) ERR; } SUMMARIZE_ERR; FINAL_RESULTS; }
int main() { /* There will be netCDF IDs for the file, each group, and each * variable. */ int ncid, varid1, varid2, grp1id, grp2id; unsigned long long data_in[NX][NY]; /* Loop indexes, and error handling. */ int x, y, retval; /* The following struct is written as a compound type. */ struct s1 { int i1; int i2; }; struct s1 compound_data[NX][NY]; /* Open the file. NC_NOWRITE tells netCDF we want read-only access * to the file.*/ if ((retval = nc_open(FILE_NAME, NC_NOWRITE, &ncid))) ERR(retval); /* Get the group ids of our two groups. */ if ((retval = nc_inq_ncid(ncid, "grp1", &grp1id))) ERR(retval); if ((retval = nc_inq_ncid(ncid, "grp2", &grp2id))) ERR(retval); /* Get the varid of the uint64 data variable, based on its name, in * grp1. */ if ((retval = nc_inq_varid(grp1id, "data", &varid1))) ERR(retval); /* Read the data. */ if ((retval = nc_get_var_ulonglong(grp1id, varid1, &data_in[0][0]))) ERR(retval); /* Get the varid of the compound data variable, based on its name, * in grp2. */ if ((retval = nc_inq_varid(grp2id, "data", &varid2))) ERR(retval); /* Read the data. */ if ((retval = nc_get_var(grp2id, varid2, &compound_data[0][0]))) ERR(retval); /* Check the data. */ for (x = 0; x < NX; x++) for (y = 0; y < NY; y++) { if (data_in[x][y] != x * NY + y || compound_data[x][y].i1 != 42 || compound_data[x][y].i2 != -42) return ERRCODE; } /* Close the file, freeing all resources. */ if ((retval = nc_close(ncid))) ERR(retval); printf("*** SUCCESS reading example file %s!\n", FILE_NAME); return 0; }