/*------------------------------------------------------------------------- * Function: read_data * * Purpose: Read data from a data file. * * Return: Success: 0 * Failure: -1 * * Programmer: Raymond Lu * 21 January 2011 * * Modifications: * *------------------------------------------------------------------------- */ static int read_data(char *fname) { char pathname[1024]; char *srcdir = getenv("srcdir"); /*where the src code is located*/ hid_t file, dataset; /* handles */ double data_in[NX+1][NY]; /* input buffer */ double data_out[NX+1][NY]; /* output buffer */ long long int_data_in[NX+1][NY]; /* input buffer */ long long int_data_out[NX+1][NY]; /* output buffer */ int i, j; unsigned nerrors = 0; const char *not_supported= " Scaleoffset filter is not enabled."; pathname[0] = '\0'; /* Generate correct name for test file by prepending the source path */ if(srcdir && ((strlen(srcdir) + strlen(fname) + 1) < sizeof(pathname))) { strcpy(pathname, srcdir); strcat(pathname, "/"); } strcat(pathname, fname); /* * Open the file. */ if((file = H5Fopen(pathname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) TEST_ERROR; TESTING("regular dataset"); /* * Open the regular dataset. */ if((dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = i + j; data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; } /* * 0 1 2 3 4 5 * 1 2 3 4 5 6 * 2 3 4 5 6 7 * 3 4 5 6 7 8 * 4 5 6 7 8 9 * 5 6 7 8 9 10 * -2.2 -2.2 -2.2 -2.2 -2.2 -2.2 */ /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { /* if (data_out[j][i] != data_in[j][i]) { */ if (!FLT_ABS_EQUAL(data_out[j][i], data_in[j][i])) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); TESTING("dataset of LE FLOAT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME2, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = ((double)(i + j + 1))/3; data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001)) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE FLOAT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME3, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = ((double)(i + j + 1))/3; data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001)) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of LE DOUBLE with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME4, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = ((double)(i + j + 1))/3; data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001)) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE DOUBLE with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME5, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = ((double)(i + j + 1))/3; data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001)) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of LE CHAR with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME6, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE CHAR with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME7, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of LE SHORT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME8, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE SHORT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME9, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of LE INT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME10, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE INT with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME11, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of LE LONG LONG with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME12, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ TESTING("dataset of BE LONG LONG with scale-offset filter"); #ifdef H5_HAVE_FILTER_SCALEOFFSET /* * Open the dataset with scale-offset filter. */ if((dataset = H5Dopen2(file, DATASETNAME13, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); #else /*H5_HAVE_FILTER_SCALEOFFSET*/ SKIPPED(); puts(not_supported); #endif /*H5_HAVE_FILTER_SCALEOFFSET*/ if(H5Fclose(file)) TEST_ERROR return 0; error: H5E_BEGIN_TRY { H5Fclose(file); } H5E_END_TRY; return 1; }
/*------------------------------------------------------------------------- * Function: open_dataset * * Purpose: Read and compare the data from a dataset. * * Return: Success: 0 * Failure: 1 * * Programmer: Raymond Lu * 17 May 2011 * * Modifications: * *------------------------------------------------------------------------- */ static int check_data(const char *dsetname, hid_t fid, hbool_t floating_number) { hid_t dataset; /* handles */ double data_in[NX+1][NY]; /* input buffer */ double data_out[NX+1][NY]; /* output buffer */ long long int_data_in[NX+1][NY]; /* input buffer */ long long int_data_out[NX+1][NY]; /* output buffer */ int i, j; unsigned nerrors = 0; /* * Open the regular dataset. */ if((dataset = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0) TEST_ERROR; /* * Data and output buffer initialization. */ for (j = 0; j < NX; j++) { for (i = 0; i < NY; i++) { data_in[j][i] = ((double)(i + j + 1))/3; data_out[j][i] = 0; int_data_in[j][i] = i + j; int_data_out[j][i] = 0; } } for (i = 0; i < NY; i++) { data_in[NX][i] = -2.2; data_out[NX][i] = 0; int_data_in[NX][i] = -2; int_data_out[NX][i] = 0; } /* * Read data from hyperslab in the file into the hyperslab in * memory and display. */ if(floating_number) { if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001)) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %g but should have been %g\n", j, i, data_out[j][i], data_in[j][i]); } } } } } else { if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, int_data_out) < 0) TEST_ERROR; /* Check results */ for (j=0; j<(NX+1); j++) { for (i=0; i<NY; i++) { if (int_data_out[j][i] != int_data_in[j][i]) { if (!nerrors++) { H5_FAILED(); printf("element [%d][%d] is %d but should have been %d\n", j, i, (int)int_data_out[j][i], (int)int_data_in[j][i]); } } } } } /* * Close/release resources. */ if(H5Dclose(dataset) < 0) TEST_ERROR /* Failure */ if (nerrors) { printf("total of %d errors out of %d elements\n", nerrors, NX*NY); return 1; } PASSED(); return 0; error: H5E_BEGIN_TRY { H5Dclose(dataset); } H5E_END_TRY; return 1; }