/nc_test4/tst_grps2.c

https://bitbucket.org/iridl/netcdf · C · 204 lines · 149 code · 24 blank · 31 comment · 171 complexity · f9bca9bed044250dea7b1c6ffdef3788 MD5 · raw file

  1. /* This is part of the netCDF package.
  2. Copyright 2010 University Corporation for Atmospheric Research/Unidata
  3. See COPYRIGHT file for conditions of use.
  4. Test netcdf-4 group code some more.
  5. $Id: tst_grps2.c 981 2011-03-15 10:19:08Z ed $
  6. */
  7. #include <nc_tests.h>
  8. #include "netcdf.h"
  9. #define FILE_NAME "tst_grps.nc"
  10. #define DIM1_NAME "kingdom"
  11. #define DIM1_LEN 3
  12. #define DIM2_NAME "year"
  13. #define DIM2_LEN 5
  14. #define VAR1_NAME "Number_of_Beheadings_in_Family"
  15. #define DYNASTY "Tudor"
  16. #define HENRY_VII "Henry_VII"
  17. #define MARGARET "Margaret"
  18. #define JAMES_V_OF_SCOTLAND "James_V_of_Scotland"
  19. #define MARY_I_OF_SCOTLAND "Mary_I_of_Scotland"
  20. #define JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND "James_VI_of_Scotland_and_I_of_England"
  21. #define MAX_SIBLING_GROUPS 10
  22. #define NUM_CASTLES_NAME "Number_of_Castles"
  23. int
  24. main(int argc, char **argv)
  25. {
  26. printf("\n*** Testing netcdf-4 group functions.\n");
  27. printf("*** testing use of unlimited dim in parent group...");
  28. {
  29. #define NDIMS_IN_VAR 1
  30. #define NDIMS_IN_FILE 2
  31. #define BABE_LIMIT 3
  32. #define DIM_NAME1 "Influence"
  33. #define DIM_NAME2 "Babe_Factor"
  34. #define VAR_NAME1 "Court_of_Star_Chamber"
  35. #define VAR_NAME2 "Justice_of_the_Peace"
  36. #define VAR_NAME3 "Bosworth_Field"
  37. int ncid, dimid1, dimid2, varid1, varid2, varid3, henry_vii_id;
  38. int grpid_in, varid_in1, varid_in2, varid_in3;
  39. nc_type xtype_in;
  40. int ndims_in, dimids_in[NDIMS_IN_FILE], dimid1_in, natts;
  41. char name_in[NC_MAX_NAME + 1];
  42. size_t len_in, index[NDIMS_IN_VAR] = {0};
  43. long long value = NC_FILL_INT64 + 1, value_in;
  44. /* Create a file with an unlimited dim and a limited, used by
  45. * variables in child groups. */
  46. if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
  47. if (nc_def_dim(ncid, DIM_NAME1, NC_UNLIMITED, &dimid1)) ERR;
  48. if (nc_def_dim(ncid, DIM_NAME2, BABE_LIMIT, &dimid2)) ERR;
  49. if (nc_def_grp(ncid, HENRY_VII, &henry_vii_id)) ERR;
  50. if (nc_def_var(henry_vii_id, VAR_NAME1, NC_INT64, NDIMS_IN_VAR, &dimid1, &varid1)) ERR;
  51. if (nc_def_var(henry_vii_id, VAR_NAME2, NC_INT64, NDIMS_IN_VAR, &dimid1, &varid2)) ERR;
  52. if (nc_def_var(henry_vii_id, VAR_NAME3, NC_INT64, NDIMS_IN_VAR, &dimid2, &varid3)) ERR;
  53. /* Check it out. Find the group by name. */
  54. if (nc_inq_ncid(ncid, HENRY_VII, &grpid_in)) ERR;
  55. /* Ensure that dimensions in parent are visible and correct. */
  56. if (nc_inq_dimids(grpid_in, &ndims_in, dimids_in, 1)) ERR;
  57. if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2) ERR;
  58. if (nc_inq_dim(grpid_in, dimids_in[0], name_in, &len_in)) ERR;
  59. if (strcmp(name_in, DIM_NAME1) || len_in != 0) ERR;
  60. if (nc_inq_dim(grpid_in, dimids_in[1], name_in, &len_in)) ERR;
  61. if (strcmp(name_in, DIM_NAME2) || len_in != BABE_LIMIT) ERR;
  62. /* Check the vars in the group. */
  63. if (nc_inq_varid(grpid_in, VAR_NAME1, &varid_in1)) ERR;
  64. if (nc_inq_varid(grpid_in, VAR_NAME2, &varid_in2)) ERR;
  65. if (nc_inq_varid(grpid_in, VAR_NAME3, &varid_in3)) ERR;
  66. if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3) ERR;
  67. if (nc_inq_var(grpid_in, varid1, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  68. if (strcmp(name_in, VAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  69. dimid1_in != dimid1 || natts != 0) ERR;
  70. if (nc_inq_var(grpid_in, varid2, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  71. if (strcmp(name_in, VAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  72. dimid1_in != dimid1 || natts != 0) ERR;
  73. if (nc_inq_var(grpid_in, varid3, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  74. if (strcmp(name_in, VAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  75. dimid1_in != dimid2 || natts != 0) ERR;
  76. /* Write one value to one variable. */
  77. if (nc_put_var1_longlong(grpid_in, varid_in1, index, &value)) ERR;
  78. /* Read one value from the second unlim dim variable. It should
  79. * be the fill value. */
  80. if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in)) ERR;
  81. if (value_in != NC_FILL_INT64) ERR;
  82. /* Read one value from the variable with limited dim. It should
  83. * be the fill value. */
  84. if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in)) ERR;
  85. if (value_in != NC_FILL_INT64) ERR;
  86. /* Attempt to read beyond end of dimensions to generate error. */
  87. index[0] = BABE_LIMIT;
  88. if (nc_get_var1_longlong(grpid_in, varid_in1, index, &value_in) != NC_EINVALCOORDS) ERR;
  89. if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in) != NC_EINVALCOORDS) ERR;
  90. if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in) != NC_EINVALCOORDS) ERR;
  91. if (nc_close(ncid)) ERR;
  92. /* Check it out again. */
  93. if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
  94. /* Find the group by name. */
  95. if (nc_inq_ncid(ncid, HENRY_VII, &grpid_in)) ERR;
  96. /* Ensure that dimensions in parent are visible and correct. */
  97. if (nc_inq_dimids(grpid_in, &ndims_in, dimids_in, 1)) ERR;
  98. if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2) ERR;
  99. if (nc_inq_dim(grpid_in, dimids_in[0], name_in, &len_in)) ERR;
  100. if (strcmp(name_in, DIM_NAME1) || len_in != 1) ERR;
  101. if (nc_inq_dim(grpid_in, dimids_in[1], name_in, &len_in)) ERR;
  102. if (strcmp(name_in, DIM_NAME2) || len_in != BABE_LIMIT) ERR;
  103. /* Check the vars in the group. */
  104. if (nc_inq_varid(grpid_in, VAR_NAME1, &varid_in1)) ERR;
  105. if (nc_inq_varid(grpid_in, VAR_NAME2, &varid_in2)) ERR;
  106. if (nc_inq_varid(grpid_in, VAR_NAME3, &varid_in3)) ERR;
  107. if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3) ERR;
  108. if (nc_inq_var(grpid_in, varid1, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  109. if (strcmp(name_in, VAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  110. dimid1_in != dimid1 || natts != 0) ERR;
  111. if (nc_inq_var(grpid_in, varid2, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  112. if (strcmp(name_in, VAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  113. dimid1_in != dimid1 || natts != 0) ERR;
  114. if (nc_inq_var(grpid_in, varid3, name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
  115. if (strcmp(name_in, VAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
  116. dimid1_in != dimid2 || natts != 0) ERR;
  117. /* Read one value from the second unlim dim variable. It should
  118. * be the fill value. */
  119. index[0] = 0;
  120. if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in)) ERR;
  121. if (value_in != NC_FILL_INT64) ERR;
  122. /* Read one value from the variable with limited dim. It should
  123. * be the fill value. */
  124. if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in)) ERR;
  125. if (value_in != NC_FILL_INT64) ERR;
  126. /* Attempt to read beyond end of dimensions to generate error. */
  127. index[0] = BABE_LIMIT;
  128. if (nc_get_var1_longlong(grpid_in, varid_in1, index, &value_in) != NC_EINVALCOORDS) ERR;
  129. if (nc_get_var1_longlong(grpid_in, varid_in2, index, &value_in) != NC_EINVALCOORDS) ERR;
  130. if (nc_get_var1_longlong(grpid_in, varid_in3, index, &value_in) != NC_EINVALCOORDS) ERR;
  131. if (nc_close(ncid)) ERR;
  132. }
  133. SUMMARIZE_ERR;
  134. printf("*** testing groups and unlimited dimensions...");
  135. {
  136. int ncid;
  137. int henry_vii_id;
  138. int tudor_id;
  139. int dimids_in[MAX_SIBLING_GROUPS], ndims_in;
  140. int num_grps;
  141. int dimid, dynasty, varid;
  142. size_t len_in;
  143. int natts_in;
  144. int grpids_in[10];
  145. nc_type xtype_in;
  146. char name_in[NC_MAX_NAME + 1];
  147. int data_out[DIM1_LEN] = {0, 2, 6}, data_in[DIM1_LEN];
  148. size_t start[1] = {0}, count[1] = {3};
  149. int j;
  150. /* Create one group, with one var, which has one dimension, which is unlimited. */
  151. if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
  152. if (nc_def_grp(ncid, DYNASTY, &tudor_id)) ERR;
  153. if (nc_def_dim(tudor_id, DIM1_NAME, NC_UNLIMITED, &dimid)) ERR;
  154. if (nc_def_grp(tudor_id, HENRY_VII, &henry_vii_id)) ERR;
  155. if (nc_def_var(henry_vii_id, VAR1_NAME, NC_INT, 1, &dimid, &varid)) ERR;
  156. if (nc_put_vara_int(henry_vii_id, varid, start, count, data_out)) ERR;
  157. if (nc_close(ncid)) ERR;
  158. /* Now check the file to see if the dimension and variable are
  159. * there. */
  160. if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
  161. if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
  162. if (num_grps != 1) ERR;
  163. if (nc_inq_grps(dynasty, &num_grps, grpids_in)) ERR;
  164. if (num_grps != 1) ERR;
  165. if (nc_inq_dim(grpids_in[0], 0, name_in, &len_in)) ERR;
  166. if (strcmp(name_in, DIM1_NAME) || len_in != DIM1_LEN) ERR;
  167. if (nc_inq_var(grpids_in[0], 0, name_in, &xtype_in, &ndims_in, dimids_in,
  168. &natts_in)) ERR;
  169. if (strcmp(name_in, VAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
  170. dimids_in[0] != 0 || natts_in != 0) ERR;
  171. if (nc_get_vara_int(grpids_in[0], 0, start, count, data_in)) ERR;
  172. for (j=0; j<DIM1_LEN; j++)
  173. if (data_in[j] != data_out[j]) ERR;
  174. if (nc_close(ncid)) ERR;
  175. }
  176. SUMMARIZE_ERR;
  177. FINAL_RESULTS;
  178. }