1/* This is part of the netCDF package.  Copyright 2005-2011,
2   University Corporation for Atmospheric Research/Unidata. See
3   COPYRIGHT file for conditions of use.
4
5   Test that NetCDF-4 can read HDF4 files.
6*/
7#include <config.h>
8#include <nc_tests.h>
9#include "err_macros.h"
10#include <hdf5.h>
11#include <H5DSpublic.h>
12#include <mfhdf.h>
13
14#define FILE_NAME "tst_interops2.h4"
15
16int
17main(int argc, char **argv)
18{
19   printf("\n*** Testing HDF4/NetCDF-4 interoperability...\n");
20   printf("*** testing that netCDF can read a HDF4 file with some ints...");
21   {
22#define PRES_NAME "pres"
23#define LAT_LEN 3
24#define LON_LEN 2
25#define DIMS_2 2
26
27      int32 sd_idsds_id;
28      int32 dim_size[DIMS_2] = {LAT_LENLON_LEN};
29      int32 start[DIMS_2] = {0, 0}, edge[DIMS_2] = {LAT_LENLON_LEN};
30      int ncidnvars_inndims_innatts_inunlimdim_in;
31      size_t len_in;
32      int data_out[LAT_LEN][LON_LEN], data_in[LAT_LEN][LON_LEN];
33      size_t nstart[DIMS_2] = {0, 0}, ncount[DIMS_2] = {LAT_LENLON_LEN};
34      size_t nindex[DIMS_2] = {0, 0};
35      int scalar_data_in = 0;
36      int ij;
37
38      /* Create some data. */
39      for (i = 0; i < LAT_LENi++)
40  for (j = 0; j < LON_LENj++)
41     data_out[i][j] = j;
42
43      /* Create a file with one SDS, containing our phony data. */
44      sd_id = SDstart(FILE_NAMEDFACC_CREATE);
45      sds_id = SDcreate(sd_idPRES_NAMEDFNT_INT32DIMS_2dim_size);
46      if (SDwritedata(sds_idstartNULLedge, (void *)data_out)) ERR;
47      if (SDendaccess(sds_id)) ERR;
48      if (SDend(sd_id)) ERR;
49
50      /* Now open with netCDF and check the contents. */
51      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
52      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdim_in)) ERR;
53      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdim_in != -1) ERR;
54      if (nc_inq_dim(ncid, 0, NULL, &len_in)) ERR;
55      if (len_in != LAT_LENERR;
56      if (nc_inq_dim(ncid, 1, NULL, &len_in)) ERR;
57      if (len_in != LON_LENERR;
58
59      /* Read the data through a vara function from the netCDF API. */
60      if (nc_get_vara(ncid, 0, nstartncountdata_in)) ERR;
61      for (i = 0; i < LAT_LENi++)
62  for (j = 0; j < LON_LENj++)
63     if (data_in[i][j] != data_out[i][j]) ERR;
64
65      /* Reset for next test. */
66      for (i = 0; i < LAT_LENi++)
67  for (j = 0; j < LON_LENj++)
68     data_in[i][j] = -88;
69
70      /* Read the data through a vara_int function from the netCDF API. */
71      if (nc_get_vara_int(ncid, 0, nstartncount, (int *)data_in)) ERR;
72      for (i = 0; i < LAT_LENi++)
73  for (j = 0; j < LON_LENj++)
74     if (data_in[i][j] != data_out[i][j]) ERR;
75
76      /* Reset for next test. */
77      for (i = 0; i < LAT_LENi++)
78  for (j = 0; j < LON_LENj++)
79     data_in[i][j] = -88;
80
81      /* Read the data through a var_int function from the netCDF API. */
82      if (nc_get_var_int(ncid, 0, (int *)data_in)) ERR;
83      for (i = 0; i < LAT_LENi++)
84  for (j = 0; j < LON_LENj++)
85     if (data_in[i][j] != data_out[i][j]) ERR;
86
87      /* Read the data through a var1 function from the netCDF API. */
88      for (i = 0; i < LAT_LENi++)
89  for (j = 0; j < LON_LENj++)
90  {
91     nindex[0] = i;
92     nindex[1] = j;
93     if (nc_get_var1(ncid, 0, nindex, &scalar_data_in)) ERR;
94     if (scalar_data_in != data_out[i][j]) ERR;
95     scalar_data_in = -88; /* reset */
96     if (nc_get_var1_int(ncid, 0, nindex, &scalar_data_in)) ERR;
97     if (scalar_data_in != data_out[i][j]) ERR;
98  }
99
100      if (nc_close(ncid)) ERR;
101   }
102   SUMMARIZE_ERR;
103   printf("*** testing with a more complex HDF4 file...");
104   {
105#define Z_LEN 3
106#define Y_LEN 2
107#define X_LEN 5
108#define DIMS_3 3
109#define NUM_TYPES 8
110
111      int32 sd_idsds_id;
112      int32 dim_size[DIMS_3] = {Z_LENY_LENX_LEN};
113      int dimids_in[DIMS_3];
114      int ncidnvars_inndims_innatts_inunlimdim_in;
115      size_t len_in;
116      nc_type type_in;
117      int hdf4_type[NUM_TYPES] = {DFNT_FLOAT32DFNT_FLOAT64,
118   DFNT_INT8DFNT_UINT8DFNT_INT16,
119   DFNT_UINT16DFNT_INT32DFNT_UINT32};
120      int netcdf_type[NUM_TYPES] = {NC_FLOATNC_DOUBLE,
121   NC_BYTENC_UBYTENC_SHORT,
122   NC_USHORTNC_INTNC_UINT};
123      char tmp_name[NC_MAX_NAME + 1], name_in[NC_MAX_NAME + 1];
124      char dim_name[NC_MAX_NAME + 1][DIMS_3] = {"z", "y", "x"};
125      int dt;
126
127      /* Create a HDF4 SD file. */
128      sd_id = SDstart (FILE_NAMEDFACC_CREATE);
129
130      /* Create some HDF4 datasets. */
131      for (t = 0; t < NUM_TYPESt++)
132      {
133  sprintf(tmp_name, "hdf4_dataset_type_%d", t);
134  if ((sds_id = SDcreate(sd_idtmp_namehdf4_type[t],
135 DIMS_3dim_size)) == FAILERR;
136  /* Set up dimensions. By giving them the same names for each
137   * dataset, I am specifying that they are shared
138   * dimensions. */
139  for (d = 0; d < DIMS_3d++)
140  {
141     int32 dimid;
142     if ((dimid = SDgetdimid(sds_idd)) == FAILERR;
143     if (SDsetdimname(dimiddim_name[d])) ERR;
144  }
145  if (SDendaccess(sds_id)) ERR;
146      }
147      if (SDend(sd_id)) ERR;
148
149      /* Open the file with netCDF and check it out. */
150      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
151      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdim_in)) ERR;
152      if (ndims_in != DIMS_3 || nvars_in != NUM_TYPES || natts_in != 0 || unlimdim_in != -1) ERR;
153      if (nc_inq_dim(ncid, 0, NULL, &len_in)) ERR;
154      if (len_in != Z_LENERR;
155      if (nc_inq_dim(ncid, 1, NULL, &len_in)) ERR;
156      if (len_in != Y_LENERR;
157      if (nc_inq_dim(ncid, 2, NULL, &len_in)) ERR;
158      if (len_in != X_LENERR;
159      for (t = 0; t < NUM_TYPESt++)
160      {
161  if (nc_inq_var(ncidtname_in, &type_in, &ndims_in,
162 dimids_in, &natts_in)) ERR;
163  if (type_in != netcdf_type[t] || ndims_in != DIMS_3 ||
164      dimids_in[0] != 0 || dimids_in[2] != 2 || dimids_in[2] != 2 ||
165      natts_in != 0) ERR;
166      }
167
168      if (nc_close(ncid)) ERR;
169   }
170   SUMMARIZE_ERR;
171   FINAL_RESULTS;
172}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed