/*******************************************************************/ /* */ /* sd_create.c */ /* This program creates an HDF file, file1.hdf, which */ /* contains an SDS of size 10 x 5. */ /* */ /*******************************************************************/ #include "mfhdf.h" #define DIM0 4 #define DIM1 3 #define DIM2 2 #define XX 5 #define YY 5 main( ) { int32 sd_id, sds_id, sds_id1, sds_id2, sds_id3, sds_idx, sds_idx1, istat; int32 dims[3], start[3], start_w[3], rank=3; int32 edges1[3], edges2[1]; int16 array1_data[DIM0][DIM1][DIM2], outdata[DIM0][DIM1][DIM2]; char name1[10]; int32 dtype, nattrs, dimsizes[3]; intn ii, jj, kk; /* Create and open the file and initiate the SD interface. */ sd_id = SDstart("hdffile_unlim.hdf", DFACC_CREATE); if (sd_id == FAIL) { fprintf(stderr,"SDstart failed.\n"); HEprint(stdout,0); exit (-1); } else fprintf(stderr,"\n... hdffile_unlim.hdf created\n"); /* Define the rank and dimensions of the data set to be created. */ rank = 3; dims[0] = SD_UNLIMITED; dims[1] = DIM1; dims[2] = DIM2; /* Create the array data set. */ sds_id = SDcreate(sd_id, "data1", DFNT_INT16, rank, dims); #if 0 istat = SDendaccess(sds_id); sds_idx = SDnametoindex (sd_id, "data1"); sds_id = SDselect (sd_id, sds_idx); #endif /* Fill the array with values. */ for (ii = 0; ii < 1; ii++) for (jj = 0; jj < DIM1; jj++) for (kk = 0; kk < DIM2; kk++) { array1_data[ii][jj][kk] = kk + jj + 100; } /***** write first 1x3x2 slab *****/ /* Define the location, pattern, and size of the data set */ for (ii = 0; ii < rank; ii++) { start[ii] = 0; start_w[ii] = 0; } edges1[0] = 1; edges1[1] = DIM1; edges1[2] = DIM2; /* write the first time to data1 */ istat = SDwritedata(sds_id, start_w, NULL, edges1, (VOIDP)array1_data); if (istat == -1) fprintf(stderr," SDwritedata data1 first time failed \n"); fprintf(stderr, "\n**** After writing first slab ****\n"); HDmemset(&outdata, 0, sizeof(outdata)); istat = SDreaddata(sds_id, start, NULL, edges1, (VOIDP) outdata); if (istat == -1) fprintf(stderr," SDreaddata failed \n"); fprintf(stderr, "\nData read from data1 after first write: \n"); for (ii = 0; ii < 1; ii++) { for (jj = 0; jj < DIM1; jj++) { for (kk = 0; kk < DIM2; kk++) { fprintf(stderr, " %d ", outdata[ii][jj][kk]); } fprintf(stderr, "\n"); } fprintf(stderr, "\n"); } fprintf(stderr, "\n\n"); istat = SDendaccess(sds_id); sds_idx = SDnametoindex (sd_id, "data1"); sds_id = SDselect (sd_id, sds_idx); istat = SDgetinfo(sds_id, name1, &rank, dimsizes, &dtype, &nattrs); fprintf(stderr, "dataset %s has %d dimensions: %d,%d,%d\n", name1, rank, dimsizes[0], dimsizes[1], dimsizes[2]); /* close the file */ istat = SDend (sd_id); /* Reopen the file for writing. */ sd_id = SDstart("hdffile_unlim.hdf", DFACC_RDWR); if (sd_id == FAIL) { fprintf(stderr,"SDstart failed.\n"); HEprint(stdout,0); exit (-1); } else fprintf(stderr,"\n... hdffile_unlim.hdf opened first time\n"); /***** write second 1x3x2 slab *****/ sds_idx = SDnametoindex (sd_id, "data1"); sds_id = SDselect (sd_id, sds_idx); istat = SDgetinfo(sds_id, name1, &rank, dimsizes, &dtype, &nattrs); fprintf(stderr, "dataset %s has %d dimensions: %d,%d,%d\n", name1, rank, dimsizes[0], dimsizes[1], dimsizes[2]); /* Define the location, pattern, and size of the data set */ start_w[0] = 1; edges1[0] = 1; edges1[1] = DIM1; edges1[2] = DIM2; /* write the second time to data1 */ istat = SDwritedata(sds_id, start_w, NULL, edges1, (VOIDP)array1_data); if (istat == -1) fprintf(stderr," SDwritedata data1 first time failed \n"); fprintf(stderr, "\n**** After writing second slab ****\n"); HDmemset(&outdata, 0, sizeof(outdata)); edges1[0] = 2; /* already wrote 2 slabs */ istat = SDreaddata(sds_id, start, NULL, edges1, (VOIDP) outdata); if (istat == -1) fprintf(stderr," SDreaddata failed \n"); fprintf(stderr, "\nData read from data1 after second write: \n"); for (ii = 0; ii < 2; ii++) { for (jj = 0; jj < DIM1; jj++) { for (kk = 0; kk < DIM2; kk++) { fprintf(stderr, " %d ", outdata[ii][jj][kk]); } fprintf(stderr, "\n"); } fprintf(stderr, "\n"); } fprintf(stderr, "\n\n"); istat = SDendaccess(sds_id); sds_idx = SDnametoindex (sd_id, "data1"); sds_id = SDselect (sd_id, sds_idx); istat = SDgetinfo(sds_id, name1, &rank, dimsizes, &dtype, &nattrs); fprintf(stderr, "dataset %s has %d dimensions: %d,%d,%d\n", name1, rank, dimsizes[0], dimsizes[1], dimsizes[2]); /* close the file */ istat = SDend (sd_id); /* Reopen the file for writing. */ sd_id = SDstart("hdffile_unlim.hdf", DFACC_RDWR); if (sd_id == FAIL) { fprintf(stderr,"SDstart failed.\n"); HEprint(stdout,0); exit (-1); } else fprintf(stderr,"\n... hdffile_unlim.hdf opened second time\n"); /***** write third and fourth 2x3x2 slabs at once *****/ /* Fill the array with values for two slab. */ for (ii = 0; ii < 2; ii++) for (jj = 0; jj < DIM1; jj++) for (kk = 0; kk < DIM2; kk++) { array1_data[ii][jj][kk] = kk + jj + 100; } /* Define the location, pattern, and size of the data set */ start_w[0] = 2; edges1[0] = 2; edges1[1] = DIM1; edges1[2] = DIM2; /* write the third time to data1 */ istat = SDwritedata(sds_id, start_w, NULL, edges1, (VOIDP)array1_data); if (istat == -1) fprintf(stderr," SDwritedata data1 first time failed \n"); fprintf(stderr, "\n**** After writing third and fourth slabs ****\n"); HDmemset(&outdata, 0, sizeof(outdata)); edges1[0] = 4; /* already wrote 4 slabs */ istat = SDreaddata(sds_id, start, NULL, edges1, (VOIDP) outdata); if (istat == -1) fprintf(stderr," SDreaddata failed \n"); fprintf(stderr, "\nData read from data1 after third write: \n"); for (ii = 0; ii < DIM0; ii++) { for (jj = 0; jj < DIM1; jj++) { for (kk = 0; kk < DIM2; kk++) { fprintf(stderr, " %d ", outdata[ii][jj][kk]); } fprintf(stderr, "\n"); } fprintf(stderr, "\n"); } fprintf(stderr, "\n\n"); istat = SDendaccess(sds_id); sds_idx = SDnametoindex (sd_id, "data1"); sds_id = SDselect (sd_id, sds_idx); istat = SDgetinfo(sds_id, name1, &rank, dimsizes, &dtype, &nattrs); fprintf(stderr, "dataset %s has %d dimensions: %d,%d,%d\n", name1, rank, dimsizes[0], dimsizes[1], dimsizes[2]); istat = SDendaccess(sds_id); if (istat == -1) fprintf(stderr," SDendaccess failed \n"); istat = SDend(sd_id); }