#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]; short outdata1[DIM0]; 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[1]; /* 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); /* define variables */ dims[0] = time_dim; sds1 = ncvardef (ncid, "Variable 1", NC_SHORT, 1, dims); sds2 = ncvardef (ncid, "Variable 2", NC_SHORT, 1, 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}; long rh_edges[] = {4}; short data[] = { 320,301,301,302}; short data1[] = { 102, 104}; fprintf(stderr, "\n---write 4 to Variable 1\n"); ncvarput(ncid, sds1, rh_start, rh_edges, (void *)data); fprintf(stderr, "\n---write 2 to Variable 2\n"); rh_edges[0] = 2; ncvarput(ncid, sds2, rh_start, rh_edges, (void *)data1); fprintf(stderr, "done ---write both variables\n\n"); } /* inquire dimension sizes */ /* ncdiminq(ncid, time_dim, 0, &dimsize1); */ ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); ncdiminq(ncid, rh_dims[0], 0, &dimsize1); fprintf(stderr, "\n **** After first write ****\n"); fprintf(stderr, "variable <%s> has %d dimensions\n", varname, rh_ndims); fprintf(stderr, "ncdiminq returns dimsizes %d\n", dimsize1); #if 0 { /* 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); #endif /* 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"); ncvarinq (ncid, sds1, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); ncdiminq(ncid, rh_dims[0], 0, &dimsize1); fprintf(stderr, "rh_ndims = %d, rh_dims[0] = %d\n", rh_ndims, rh_dims[0]); fprintf(stderr, "%s: dimsize1 = %d\n", varname, dimsize1); sds2 = ncvarid(ncid, "Variable 2"); ncvarinq (ncid, sds2, varname, &rh_type, &rh_ndims, rh_dims, &rh_natts); ncdiminq(ncid, rh_dims[0], 0, &dimsize1); fprintf(stderr, "rh_ndims = %d, rh_dims[0] = %d\n", rh_ndims, rh_dims[0]); fprintf(stderr, "%s: dimsize1 = %d\n", varname, dimsize1); { /* read Variable 2 */ long start[] = {0}; long edges[1]; edges[0] = dimsize1-2; /* temporary -2 */ HDmemset(outdata1, 0, DIM0); fprintf(stderr, "\n++++ reading sds1 after first write to both vars\n"); ncvarget(ncid, sds1, start, edges, outdata1); fprintf(stderr, "done ++++ reading sds1 after first write to both vars\n\n"); fprintf(stderr, "Variable 1, after writing first time to both: \n"); for (ii = 0; ii < dimsize1; ii++) { fprintf(stderr, " %d ", outdata1[ii]); } fprintf(stderr, "\n"); edges[0] = 1; HDmemset(outdata1, 0, DIM0); fprintf(stderr, "\n++++ reading sds2 after first write to both vars\n"); ncvarget(ncid, sds2, start, edges, outdata1); 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 < 1; ii++) { fprintf(stderr, " %d ", outdata1[ii]); } fprintf(stderr, "\n"); } /* end read data */ #if 0 { /* 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 */ #endif ncclose(ncid); fprintf(stderr, "Close file...\n"); return 0; }