//// [[Rcpp::export]] int binlist(int x) { int numbins = 0, *binnums = NULL; int i; int file_id,vdata_ref, vdata_id,numrecs,pvd_id; char PARAM[] = "chlor_a"; initbin(); /* Open the HDF file. */ file_id = Hopen("S1998001.L3b_DAY_CHL.main", DFACC_READ, 0); if(file_id == FAIL){ fprintf(stderr,"-E- %s line %d: Hopen(%s,DFACC_READ,0) failed.\n", __FILE__,__LINE__,"S1998001.L3b_DAY_CHL.main"); return(EXIT_FAILURE); } /* Initialize the Vdata interface. */ if(Vstart(file_id) == FAIL){ fprintf(stderr,"-E- %s line %d: Vstart(%d) failed.\n", __FILE__,__LINE__,file_id); return(EXIT_FAILURE); } /* Open the "BinList" Vdata. */ vdata_ref = VSfind(file_id,"BinList"); if(vdata_ref == FAIL){ fprintf(stderr,"-E- %s line %d: VSfind(%d,\"BinList\") failed.\n", __FILE__,__LINE__,file_id); return(EXIT_FAILURE); } vdata_id = VSattach(file_id, vdata_ref, "r"); if(vdata_id == FAIL){ fprintf(stderr,"-E- %s line %d: VSattach(%d,%d,\"r\") failed.\n", __FILE__,__LINE__,file_id,vdata_ref); return(EXIT_FAILURE); } /* Find out how many bins are stored in this file. */ numrecs = VSelts(vdata_id); if(numrecs == FAIL){ fprintf(stderr,"-E- %s line %d: VSelts(%d) failed.\n", __FILE__,__LINE__,vdata_id); return(EXIT_FAILURE); } // this doesn't seem to be necessary? /* Set up to read the fields in the BinList Vdata records. */ // if(VSsetfields(vdata_id,BLIST_FIELDS) == FAIL){ // fprintf(stderr,"-E- %s line %d: VSsetfields(%d,%s) failed.\n", // __FILE__,__LINE__,vdata_id,BLIST_FIELDS); // return(EXIT_FAILURE); // } /* Open the parameter-specific Vdata. */ vdata_ref = VSfind(file_id,PARAM); if(vdata_ref == 0){ fprintf(stderr,"-E- %s line %d: VSfind(%d,\"%s\") failed.\n", __FILE__,__LINE__,file_id,PARAM); return(EXIT_FAILURE); } pvd_id = VSattach(file_id, vdata_ref, "r"); if(pvd_id == FAIL){ fprintf(stderr,"-E- %s line %d: VSattach(%d,%d,\"r\") failed.\n", __FILE__,__LINE__,file_id,vdata_ref); return(EXIT_FAILURE); } /* Set up to read the fields in the parameter-specific Vdata records. */ { int len; len = 2*strlen(PARAM) + strlen("_sum,") + strlen("_sum_sq") + 1; param_fields = (char *)malloc(len); if(param_fields == NULL){ fprintf(stderr,"-E- %s line %d: Memory allocation failed.\n", __FILE__,__LINE__); return(EXIT_FAILURE); } strcpy(param_fields,PARAM); strcat(param_fields,"_sum,"); strcat(param_fields,PARAM); strcat(param_fields,"_sum_sq"); } if(VSsetfields(pvd_id,param_fields) == FAIL){ fprintf(stderr,"-E- %s line %d: VSsetfields(%d,%s) failed.\n", __FILE__,__LINE__,pvd_id,param_fields); return(EXIT_FAILURE); } printf(param_fields); printf("\n"); /* Output a header record to identify the fields written out below. */ printf("%80s%15.15s %15.15s\n"," ",PARAM,PARAM); printf(" bin centerlat centerlon"); printf(" north south west east"); printf(" n N sum_obs sum_squared_obs weight"); printf(" time_trend_bits l2_flag_bits sel\n"); printf("------- --------- ----------"); printf(" --------- --------- ---------- ----------"); printf(" ---- --- --------------- --------------- ---------------"); printf(" ---------------- -------------------------------- ---\n"); // for(i = 0; i < numbins; i++){ for(i = 0; i < 10; i++){ int recno; // recno = binsearch(binnums[i],vdata_id,numrecs); recno = i; if(recno >= 0){ double n,s,w,e,clat,clon; /* Read the sum and sum-of-squares for the the specified parameter for this bin. */ if(VSseek(pvd_id,recno) == FAIL){ fprintf(stderr,"-E- %s line %d: VSseek(%d,%d) failed.\n", __FILE__,__LINE__,pvd_id,recno); return(EXIT_FAILURE); } if(VSread(pvd_id,paramrec,1,FULL_INTERLACE) != 1){ fprintf(stderr,"-E- %s line %d: ",__FILE__,__LINE__); fprintf(stderr,"VSread(%d,paramrec,1,FULL_INTERLACE) failed.\n", pvd_id); return(EXIT_FAILURE); } /* VSfpack() sets the global sum and sum_sq variables via the paramptrs pointer array. */ if( VSfpack( pvd_id,_HDF_VSUNPACK,param_fields,paramrec,PREC_SIZE,1,NULL,paramptrs ) == FAIL){ fprintf(stderr,"-E- %s line %d: ",__FILE__,__LINE__); fprintf(stderr,"VSfpack(%d, ...) failed.\n", pvd_id); return(EXIT_FAILURE); } /* Get the geographical coordinates associated with this bin. */ // bin2latlon(binnums[i],&clat,&clon); // bin2bounds(binnums[i],&n,&s,&w,&e); /* Output the results. */ // printf("%7d %9.5f %10.5f %9.5f %9.5f %10.5f %10.5f ", // binnums[i],clat,clon,n,s,w,e); // printf("%4d %3d ",nobs,nscenes); // printf("% .8e % .8e % .8e ",sum,sum_sq,weights); printf("% .8e % .8e % .8e ",sum,sum_sq,0.0); // printf("%.16s %.32s ",bitstr16(time_rec),bitstr32(flags_set)); // printf("%3d",sel_cat); printf("\n"); } } if(VSdetach(pvd_id) == FAIL){ fprintf(stderr,"-E- %s line %d: VSdetach(%d) failed.\n", __FILE__,__LINE__,pvd_id); return(EXIT_FAILURE); } if(VSdetach(vdata_id) == FAIL){ fprintf(stderr,"-E- %s line %d: VSdetach(%d) failed.\n", __FILE__,__LINE__,vdata_id); return(EXIT_FAILURE); } if(Vend(file_id) == FAIL){ fprintf(stderr,"-E- %s line %d: Vend(%d) failed.\n", __FILE__,__LINE__,file_id); return(EXIT_FAILURE); } if(Hclose(file_id) == FAIL){ fprintf(stderr,"-E- %s line %d: Hclose(%d) failed.\n", __FILE__,__LINE__,file_id); return(EXIT_FAILURE); } free(param_fields); free(binnums); return 2; }
int main( ) { /************************* Variable declaration **************************/ intn status_n; /* returned status for functions returning an intn */ int32 status_32, /* returned status for functions returning an int32 */ file_id, vdata_ref, vdata_id, field_index, /* index of a field within the vdata */ n_vdattrs, /* number of vdata attributes */ n_fldattrs, /* number of field attributes */ vdata_type, /* to hold the type of vdata's attribute */ vdata_n_values,/* to hold the number of vdata's attribute values */ vdata_size, /* to hold the size of vdata's attribute values */ field_type, /* to hold the type of field's attribute */ field_n_values,/* to hold the number of field's attribute values */ field_size; /* to hold the size of field's attribute values */ char vd_attr[VATTR_N_VALUES] = {'A', 'B', 'C'};/* vdata attribute values*/ int32 fld_attr[FATTR_N_VALUES] = {2, 4, 6, 8}; /* field attribute values*/ char vattr_buf[VATTR_N_VALUES]; /* to hold vdata attribute's values */ int32 fattr_buf[FATTR_N_VALUES]; /* to hold field attribute's values */ char vattr_name[30], /* name of vdata attribute */ fattr_name[30]; /* name of field attribute */ /********************** End of variable declaration **********************/ /* * Open the HDF file for writing. */ file_id = Hopen (FILE_NAME, DFACC_WRITE, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Get the reference number of the vdata named VDATA_NAME. */ vdata_ref = VSfind (file_id, VDATA_NAME); /* * Attach to the vdata for writing. */ vdata_id = VSattach (file_id, vdata_ref, "w"); /* * Attach an attribute to the vdata, i.e., indicated by the second parameter. */ status_n = VSsetattr (vdata_id, _HDF_VDATA, VATTR_NAME, DFNT_CHAR, VATTR_N_VALUES, vd_attr); /* * Get the index of the field FIELD_NAME within the vdata. */ status_n = VSfindex (vdata_id, FIELD_NAME, &field_index); /* * Attach an attribute to the field field_index. */ status_n = VSsetattr (vdata_id, field_index, FATTR_NAME, DFNT_INT32, FATTR_N_VALUES, fld_attr); /* * Get the number of attributes attached to the vdata's first * field - should be 0. */ n_fldattrs = VSfnattrs (vdata_id, 0); printf ( "Number of attributes of the first field of the vdata: %d\n", n_fldattrs); /* * Get the number of attributes attached to the field specified by * field_index - should be 1. */ n_fldattrs = VSfnattrs (vdata_id, field_index); printf ( "Number of attributes of field %s: %d\n", FIELD_NAME, n_fldattrs); /* * Get the total number of the field's and vdata's attributes - should be 2. */ n_vdattrs = VSnattrs (vdata_id); printf ( "Number of attributes of the vdata and its fields: %d\n", n_vdattrs); /* * Get information about the vdata's first attribute, indicated * by the third parameter which is the index of the attribute. */ status_n = VSattrinfo (vdata_id, _HDF_VDATA, 0, vattr_name, &vdata_type, &vdata_n_values, &vdata_size); /* * Get information about the first attribute of the field specified by * field_index. */ status_n = VSattrinfo (vdata_id, field_index, 0, fattr_name, &field_type, &field_n_values, &field_size); /* * Get the vdata's first attribute. */ status_n = VSgetattr (vdata_id, _HDF_VDATA, 0, vattr_buf); printf("Values of the vdata attribute = %c %c %c\n", vattr_buf[0], vattr_buf[1], vattr_buf[2]); /* * Get the first attribute of the field specified by field_index. */ status_n = VSgetattr (vdata_id, field_index, 0, fattr_buf); printf("Values of the field attribute = %d %d %d %d\n", fattr_buf[0], fattr_buf[1], fattr_buf[2], fattr_buf[3]); /* * Terminate access to the vdata and to the VS interface, then close * the HDF file. */ status_32 = VSdetach (vdata_id); status_n = Vend (file_id); status_32 = Hclose (file_id); return 0; }
int main( ) { /************************* Variable declaration **************************/ intn status_n; /* returned status for functions returning an intn */ int32 status_32, /* returned status for functions returning an int32 */ file_id, vgroup_id, vgroup_ref, vdata_id, vdata_ref, num_of_records, num_of_vals_per_rec, record_pos, obj_index, /* index of an object within a vgroup */ num_of_pairs, /* number of tag/ref number pairs, i.e., objects */ obj_tag, obj_ref, /* tag/ref number of an HDF object */ vgroup_pos = 0; /* position of a vgroup in the file */ float32 databuf[N_RECORDS][N_VALS_PER_REC]; int16 rec_num; /********************** End of variable declaration ***********************/ char FIELDNAME_LIST[MAX_FIELDNAME_LIST_LENGTH]; memset(FIELDNAME_LIST, 0x00, MAX_FIELDNAME_LIST_LENGTH); int i; for (i = 0; i < N_VALS_PER_REC; i++) { char buffer[256]; if (i == 0) { sprintf(buffer, "%d", i); } else { sprintf(buffer, " %d", i); } strcat(FIELDNAME_LIST, buffer); } file_id = Hopen (FILE_NAME, DFACC_READ, 0); status_n = Vstart (file_id); vgroup_ref = -1; vgroup_ref = Vgetid (file_id, vgroup_ref); if (vgroup_ref == -1) exit(1); vgroup_ref = Vgetid (file_id, vgroup_ref); if (vgroup_ref == -1) exit(1); vgroup_id = Vattach (file_id, vgroup_ref, "r"); num_of_pairs = Vntagrefs (vgroup_id); if (num_of_pairs > 0) { printf ("\nVgroup #%d contains:\n", vgroup_pos); for (obj_index = 0; obj_index < num_of_pairs; obj_index++) { status_n = Vgettagref (vgroup_id, obj_index, &obj_tag, &obj_ref); printf ("tag = %d, ref = %d", obj_tag, obj_ref); if (Visvg (vgroup_id, obj_ref)) printf (" <-- is a vgroup\n"); else if (Visvs (vgroup_id, obj_ref)) { printf (" <-- is a vdata\n"); vdata_ref = VSfind (file_id, VDATA_NAME); vdata_id = VSattach (file_id, vdata_ref, "r"); status_n = VSsetfields (vdata_id, FIELDNAME_LIST); record_pos = VSseek (vdata_id, RECORD_INDEX); num_of_records = VSread (vdata_id, (uint8 *)databuf, N_RECORDS, FULL_INTERLACE); for (rec_num = 0; rec_num < num_of_records; rec_num++) { for (num_of_vals_per_rec = 0; num_of_vals_per_rec < N_VALS_PER_REC; num_of_vals_per_rec++) { printf ("%6.2f\n", databuf[rec_num][num_of_vals_per_rec]); } } } else { printf (" <-- neither vdata nor vgroup\n"); } } /* for */ } /* if */ else printf ("Vgroup #%d contains no HDF objects\n", vgroup_pos); /* * Terminate access to the current vgroup. */ status_32 = Vdetach (vgroup_id); /* * Move to the next vgroup position. */ vgroup_pos++; /* * Terminate access to the V interface and close the file. */ status_n = Vend (file_id); status_n = Hclose (file_id); return 0; }