#include "mfhdf.h" #define DIM0 6 #define DIM1 3 #define DIM2 2 #define CHECKFAIL(status, mesg) {\ if (status == -1) \ fprintf(stderr," %s\n", mesg);} int main() { int ncid; int sds1, sds2, time_id; int lat_dim, lon_dim, level_dim; int time_dim, dim1, dim2, dim3; long dimsize1=0, dimsize2=0, dimsize3=0; short data1_slab1[] = { 110,111,111,112,112,113}; short data1_slab2[] = { 210,211,211,212,212,213}; short data2_slab1[] = { 120,121,122}; short data2_slab2[] = { 220,221,222}; short data2_slab3[] = { 320,321,322}; short data1_slab234[] = { 320,301,301,302,302,303,400,401,401,402,402,403,500,501,502,503,504,505}; /* short data34[] = { 320,301,301,302,302,303,400,401,401,402,402,403}; */ short data34[] = { 32,30,30,30,30,30,40,40,40,40,40,40}; short data2x2[] = { 10,11,12}; short outdata[DIM0][DIM1][DIM2]; short outdata2[DIM0][DIM1]; char varname[10]; nc_type rh_type; /* variable type */ int rh_ndims; /* number of dims */ int rh_dims[MAX_VAR_DIMS]; /* variable shape */ int rh_natts; /* number of attributes */ int ii, jj, kk; int16 var1_fillval=99; int16 var2_fillval=11; intn status = 0; /* variable shapes */ int dims[3]; /* enter define mode */ ncid = nccreate("nc_3D2Dslabs_6.nc", NC_CLOBBER); fprintf(stderr, "Create file nc_3D2Dslabs_6.nc\n"); ncsetfill(ncid, NC_FILL); /* define dimensions */ time_dim = ncdimdef(ncid, "time", NC_UNLIMITED); dim1 = ncdimdef(ncid, "dimension 1", 3L); dim2 = ncdimdef(ncid, "dimension 2", 2L); /* define variables */ dims[0] = time_dim; dims[1] = dim1; dims[2] = dim2; sds1 = ncvardef (ncid, "Variable 1", NC_SHORT, 3, dims); dims[0] = time_dim; dims[1] = dim1; sds2 = ncvardef (ncid, "Variable 2", NC_SHORT, 2, dims); ncattput(ncid, sds1, "_FillValue", NC_SHORT, 1, &var1_fillval); ncattput(ncid, sds2, "_FillValue", NC_SHORT, 1, &var2_fillval); /* leave define mode */ ncendef (ncid); { /* write variable 1 first time */ long rh_start[] = {0, 0, 0}; long rh_edges[] = {1, 3, 2}; fprintf(stderr, "\n---write 1x3x2 to Variable 1\n"); ncvarput(ncid, sds1, rh_start, rh_edges, (void *)data1_slab1); fprintf(stderr, "done ---write 1x3x2 to Variable 1\n\n"); } fprintf(stderr, "data2_slab1 = %d %d %d \n", data2_slab1[0], data2_slab1[1], data2_slab1[2]); /* inquire dimension sizes */ ncdiminq(ncid, time_dim, 0, &dimsize1); ncdiminq(ncid, dim1, 0, &dimsize2); ncdiminq(ncid, dim2, 0, &dimsize3); ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); fprintf(stderr, "data2_slab1 = %d %d %d \n", data2_slab1[0], data2_slab1[1], data2_slab1[2]); fprintf(stderr, "\n **** After first write ****\n"); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d,%d\n", dimsize1,dimsize2,dimsize3); { /* write variable 2 first time */ long rh_start[] = {0, 0}; long rh_edges[] = {1, 3}; fprintf(stderr, "\n---write 1x3 to Variable 2\n"); fprintf(stderr, "data2_slab1 = %d %d %d \n", data2_slab1[0], data2_slab1[1], data2_slab1[2]); ncvarput(ncid, sds2, rh_start, rh_edges, (void *)data2_slab1); fprintf(stderr, "data2_slab1 = %d %d %d \n", data2_slab1[0], data2_slab1[1], data2_slab1[2]); fprintf(stderr, "done ---write 1x3 to Variable 2\n\n"); } /* inquire dimension sizes */ ncdiminq(ncid, time_dim, 0, &dimsize1); ncdiminq(ncid, dim1, 0, &dimsize2); ncvarinq (ncid, sds2, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d\n", dimsize1,dimsize2); /* close file */ ncclose (ncid); fprintf(stderr, "Close file...\n"); /* enter define mode */ ncid = ncopen("nc_3D2Dslabs_6.nc", NC_RDWR); fprintf(stderr, "\nOpen file nc_3D2Dslabs_6.nc first time\n"); sds1 = ncvarid(ncid, "Variable 1"); sds2 = ncvarid(ncid, "Variable 2"); { /* read Variable 2 */ long start[] = {0, 0}; long edges[2]; edges[0] = dimsize1; edges[1] = dimsize2; fprintf(stderr, "dimsize1 = %d, dimsize2 = %d\n", dimsize1, dimsize2); HDmemset(outdata2, 0, DIM0*DIM1); fprintf(stderr, "\n++++ reading sds2 after first write to both vars\n"); ncvarget(ncid, sds2, start, edges, outdata2); fprintf(stderr, "done ++++ reading sds2 after first write to both vars\n\n"); fprintf(stderr, "Variable 2, after writing first time to both: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { fprintf(stderr, " %d ", outdata2[ii][jj]); } fprintf(stderr, "\n"); } } /* end read data */ { /* write variable1 second time */ long rh_start[] = {1, 0, 0}; long rh_edges[] = {3, 3, 2}; fprintf(stderr, "\n---write 3x3x2 to Variable 1\n"); ncvarput(ncid, sds1, rh_start, rh_edges, (void *)data1_slab234); fprintf(stderr, "done ---write 3x3x2 to Variable 1\n\n"); } /* get dimsizes after second write */ ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); dim1 = ncdimid(ncid, "time"); dim2 = ncdimid(ncid, "dimension 1"); dim3 = ncdimid(ncid, "dimension 2"); ncdiminq(ncid, dim1, 0, &dimsize1); ncdiminq(ncid, dim2, 0, &dimsize2); ncdiminq(ncid, dim3, 0, &dimsize3); { /* write variable2 third time */ long rh_start[] = {1, 0, 0}; rh_start[0] = dimsize1-1; long rh_edges[] = {1, 3}; fprintf(stderr, "\n---write 1x3 to Variable 2, starting at %d\n", rh_start[0]); ncvarput(ncid, sds2, rh_start, rh_edges, (void *)data2_slab1); } { /* read Variable 2 */ long start[] = {0, 0}; long edges[2]; edges[0] = dimsize1; edges[1] = dimsize2; HDmemset(outdata2, 0, DIM0*DIM1); ncvarget(ncid, sds2, start, edges, outdata2); fprintf(stderr, "Variable 2, after writing second time to both: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { fprintf(stderr, " %d ", outdata2[ii][jj]); } fprintf(stderr, "\n"); } } /* end read data */ fprintf(stderr, "\n **** After second write ****\n"); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d,%d\n", dimsize1,dimsize2,dimsize3); /* close file */ ncclose (ncid); fprintf(stderr, "Close file...\n"); ncid = ncopen("nc_3D2Dslabs_6.nc", NC_RDWR); fprintf(stderr, "\nOpen file nc_3D2Dslabs_6.nc second time\n"); sds1 = ncvarid(ncid, "Variable 1"); { /* write variable third time */ long rh_start[] = {4, 0, 0}; long rh_edges[] = {2, 3, 2}; fprintf(stderr, "\n---write 2x3x2 to Variable 1\n"); ncvarput(ncid, sds1, rh_start, rh_edges, (void *)data34); } /* Variable 1: get info after third write */ ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); /* get dimensions */ dim1 = ncdimid(ncid, "time"); dim2 = ncdimid(ncid, "dimension 1"); dim3 = ncdimid(ncid, "dimension 2"); ncdiminq(ncid, dim1, 0, &dimsize1); ncdiminq(ncid, dim2, 0, &dimsize2); ncdiminq(ncid, dim3, 0, &dimsize3); fprintf(stderr, "\n **** After third write ****\n"); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d,%d\n", dimsize1,dimsize2,dimsize3); { /* read Variable 1 */ long start[] = {0, 0, 0}; long edges[3]; edges[0] = dimsize1; edges[1] = dimsize2; edges[2] = dimsize3; HDmemset(outdata, 0, DIM0*DIM1*DIM2); ncvarget(ncid, sds1, start, edges, outdata); fprintf(stderr, "Final data of Variable 1: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { for (kk = 0; kk < dimsize3; kk++) { fprintf(stderr, " %d ", outdata[ii][jj][kk]); } fprintf(stderr, "\n"); } fprintf(stderr, "\n"); } } /* Variable 2: get info after third write */ sds2 = ncvarid(ncid, "Variable 2"); ncvarinq (ncid, sds2, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); /* get dimensions */ dim1 = ncdimid(ncid, "time"); dim2 = ncdimid(ncid, "dimension 1"); ncdiminq(ncid, dim1, 0, &dimsize1); ncdiminq(ncid, dim2, 0, &dimsize2); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d\n", dimsize1,dimsize2); fprintf(stderr, "\nTry to read Variable 2 up to dimsize1-1 = %d\n", dimsize1-1); sds2 = ncvarid(ncid, "Variable 2"); { /* write variable2 third time */ long rh_start[] = {1, 0, 0}; rh_start[0] = dimsize1-1; long rh_edges[] = {1, 3}; fprintf(stderr, "\n---write 1x3 to Variable 2, starting at %d\n", dimsize1); ncvarput(ncid, sds2, rh_start, rh_edges, (void *)data2_slab3); } { /* read Variable 2 */ long start[] = {0, 0}; long edges[2]; edges[0] = dimsize1; edges[1] = dimsize2; HDmemset(outdata2, 0, DIM0*DIM1); ncvarget(ncid, sds2, start, edges, outdata2); fprintf(stderr, "Final data of Variable 2: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { fprintf(stderr, " %d ", outdata2[ii][jj]); } fprintf(stderr, "\n"); } } /* end read data */ /* close file */ ncclose(ncid); fprintf(stderr, "Close file...\n"); fprintf(stderr, "\n **** Read data and info back after all writes are done ****\n"); ncid = ncopen("nc_3D2Dslabs_6.nc", NC_RDWR); fprintf(stderr, "\nOpen file nc_3D2Dslabs_6.nc to read info only\n"); sds1 = ncvarid(ncid, "Variable 1"); sds2 = ncvarid(ncid, "Variable 2"); /* Variable 1: get info */ ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); /* get dimensions */ dim1 = ncdimid(ncid, "time"); dim2 = ncdimid(ncid, "dimension 1"); dim3 = ncdimid(ncid, "dimension 2"); ncdiminq(ncid, dim1, 0, &dimsize1); ncdiminq(ncid, dim2, 0, &dimsize2); ncdiminq(ncid, dim3, 0, &dimsize3); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d,%d,%d\n", dimsize1,dimsize2,dimsize3); { /* read data after done all writes and closing file */ long start[] = {0, 0, 0}; long edges[3]; edges[0] = dimsize1; edges[1] = dimsize2; edges[2] = dimsize3; HDmemset(outdata, 0, DIM0*DIM1*DIM2); ncvarget(ncid, sds1, start, edges, outdata); fprintf(stderr, "Read data of Variable 1: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { for (kk = 0; kk < dimsize3; kk++) { fprintf(stderr, " %d ", outdata[ii][jj][kk]); } fprintf(stderr, "\n"); } fprintf(stderr, "\n"); } } { /* read Variable 2 after done all writes and closing file */ long start[] = {0, 0}; long edges[2]; edges[0] = dimsize1; edges[1] = dimsize2; HDmemset(outdata2, 0, DIM0*DIM1); ncvarget(ncid, sds2, start, edges, outdata2); fprintf(stderr, "Read data of Variable 2: \n"); for (ii = 0; ii < dimsize1; ii++) { for (jj = 0; jj < dimsize2; jj++) { fprintf(stderr, " %d ", outdata2[ii][jj]); } fprintf(stderr, "\n"); } } /* end read data */ ncclose(ncid); fprintf(stderr, "Close file...\n"); return 0; }