![]() |
HDF User’s GuideVersion 4.2r4 |
[Top] [Prev][Next] |
create_vdatas.c#include "hdf.h" #define FILE1_NAME "General_Vdatas.hdf" #define FILE2_NAME "Two_Vdatas.hdf" #define VDATA_NAME "Vdata 1" #define VDATA_CLASS "Empty Vdatas" main( ) { /************************* Variable declaration **************************/ intn status_n; /* returned status for functions returning an intn */ int32 status_32, /* returned status for functions returning an int32 */ file1_id, file2_id, vdata_id, vdata1_id, vdata2_id, vdata_ref = -1; /* ref number of a vdata, set to -1 to create */ /********************** End of variable declaration **********************/ /* * Create the first HDF file. */ file1_id = Hopen (FILE1_NAME, DFACC_CREATE, 0); /* * Initialize the VS interface associated with the first HDF file. */ status_n = Vstart (file1_id); /* * Create a vdata in the first HDF file. */ vdata_id = VSattach (file1_id, vdata_ref, "w"); /* * Assign a name to the vdata. */ status_32 = VSsetname (vdata_id, VDATA_NAME); /* * Other operations on the vdata identified by vdata_id can be carried * out starting from this point. */ /* * Create the second HDF file. */ file2_id = Hopen (FILE2_NAME, DFACC_CREATE, 0); /* * Initialize the VS interface associated with the second HDF file. */ status_n = Vstart (file2_id); /* * Create the first vdata in the second HDF file. */ vdata1_id = VSattach (file2_id, vdata_ref, "w"); /* * Create the second vdata in the second HDF file. */ vdata2_id = VSattach (file2_id, vdata_ref, "w"); /* * Assign a class name to these vdatas. */ status_32 = VSsetclass (vdata1_id, VDATA_CLASS); status_32 = VSsetclass (vdata2_id, VDATA_CLASS); /* * Other operations on the vdatas identified by vdata1_id and vdata2_id * can be carried out starting from this point. */ /* * Terminate access to the first vdata in the second HDF file. */ status_32 = VSdetach (vdata1_id); /* * Terminate access to the second vdata in the second HDF file. */ status_32 = VSdetach (vdata2_id); /* * From this point on, any operations on the vdatas identified by vdata1_id and vdata2_id are invalid but not on the vdata identified by vdata_id. */ /* * Terminate access to the VS interface associated with the second HDF file. */ status_n = Vend (file2_id); /* * Close the second HDF file. */ status_n = Hclose (file2_id); /* * Terminate access to the vdata in the first HDF file. */ status_32 = VSdetach (vdata_id); /* * Terminate access to the VS interface associated with the first HDF file. */ status_n = Vend (file1_id); /* * Close the first HDF file. */ status_n = Hclose (file1_id); }create_vdatas.fprogram create_vdatas implicit none C C Parameter declaration C character*18 FILE1_NAME character*14 FILE2_NAME character*7 VDATA_NAME character*12 VDATA_CLASS C parameter (FILE1_NAME = `General_Vdatas.hdf', + FILE2_NAME = `Two_Vdatas.hdf', + VDATA_NAME = `Vdata 1', + VDATA_CLASS = `Empty Vdatas') integer DFACC_CREATE parameter (DFACC_CREATE = 4) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsfsnam, vsfscls, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file1_id, file2_id integer vdata_id, vdata1_id, vdata2_id integer vdata_ref C C**** End of variable declaration ************************************ C C C Create the first HDF file. C file1_id = hopen(FILE1_NAME, DFACC_CREATE, 0) C C Initialize the VS interface associated with the first HDF file. C status = vfstart(file1_id) C C Create a vdata in the first HDF file. C vdata_ref = -1 vdata_id = vsfatch(file1_id, vdata_ref, `w') C C Assign a name to the vdata. C status = vsfsnam(vdata_id, VDATA_NAME) C C Other operations on the vdata identified by vdata_id can be carried out C starting from this point. C C Create the second HDF file. C file2_id = hopen(FILE2_NAME, DFACC_CREATE, 0) C C Initialize the VS interface associated with the second HDF file. C status = vfstart(file2_id) C C Create the first vdata in the second HDF file. C vdata1_id = vsfatch(file2_id, vdata_ref, `w') C C Create the second vdata in the second HDF file. C vdata2_id = vsfatch(file2_id, vdata_ref, `w') C C Assign a class name to these vdatas. C status = vsfscls(vdata1_id, VDATA_CLASS) status = vsfscls(vdata2_id, VDATA_CLASS) C C Other operations on the vdatas identified by vdata1_id and vdata2_id C can be carried out starting from this point. C C C Terminate access to the first vdata in the second HDF file. C status = vsfdtch(vdata1_id) C C Terminate access to the second vdata in the second HDF file. C status = vsfdtch(vdata2_id) C C Terminate access to the VS interface associated with the second HDF file. C status = vfend(file2_id) C C Close the second HDF file. C status = hclose(file2_id) C C Terminate access to the vdata in the first HDF file. C status = vsfdtch(vdata_id) C C terminate access to the VS interface associated with the first HDF file. C status = vfend(file1_id) C C Close the first HDF file. C status = hclose(file1_id) endcreate_onefield_vdata.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define CLASS1_NAME "5x1 Array" #define CLASS2_NAME "6x4 Array" #define VDATA1_NAME "First Vdata" #define VDATA2_NAME "Second Vdata" #define FIELD1_NAME "Single-component Field" #define FIELD2_NAME "Multi-component Field" #define N_RECORDS_1 5 /* number of records the first vdata contains */ #define N_RECORDS_2 6 /* number of records the second vdata contains */ #define ORDER_2 4 /* order of the field in the second vdata */ /* Note that the order of the field in the first vdata is 1 */ main( ) { /************************* Variable declaration **************************/ intn status_n; /* returned status for functions returning an intn */ int32 status_32; /* returned status for functions returning an int32 */ int32 file_id, vdata1_ref, vdata2_ref; /* * Define an array to buffer the data of the first vdata. */ char8 vdata1_buf [N_RECORDS_1] = {`V', `D', `A', `T', `A'}; /* * Define an array to buffer the data of the second vdata. */ int32 vdata2_buf [N_RECORDS_2][ORDER_2] = {{1, 2, 3, 4}, {2, 4, 6, 8}, {3, 6, 9, 12}, {4, 8, 12, 16}, {5, 10, 15, 20}, {6, 12, 18, 24}}; /********************** 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); /* * Create the first vdata and populate it with data from the vdata1_buf * array. Note that the buffer vdata1_buf is cast to (uint8 *) for the * benefit of generic data type. */ vdata1_ref = VHstoredata (file_id, FIELD1_NAME, (uint8 *)vdata1_buf, N_RECORDS_1, DFNT_CHAR8, VDATA1_NAME, CLASS1_NAME); /* * Create the second vdata and populate it with data from the vdata2_buf * array. */ vdata2_ref = VHstoredatam (file_id, FIELD2_NAME, (uint8 *)vdata2_buf, N_RECORDS_2, DFNT_INT32, VDATA2_NAME, CLASS2_NAME, ORDER_2); /* * Terminate access to the VS interface and close the HDF file. */ status_n = Vend (file_id); status_32 = Hclose (file_id); }create_onefield_vdata.fprogram create_onefield_vdatas implicit none C C Parameter declaration C character*18 FILE_NAME character*9 CLASS1_NAME character*9 CLASS2_NAME character*11 VDATA1_NAME character*12 VDATA2_NAME character*22 FIELD1_NAME character*21 FIELD2_NAME integer N_RECORDS_1, N_RECORDS_2 integer ORDER_2 C parameter (FILE_NAME = `General_Vdatas.hdf', + CLASS1_NAME = `5x1 Array', + CLASS2_NAME = `6x4 Array', + VDATA1_NAME = `First Vdata', + VDATA2_NAME = `Second Vdata', + FIELD1_NAME = `Single-component Field', + FIELD2_NAME = `Multi-component Field') parameter (N_RECORDS_1 = 5, + N_RECORDS_2 = 6, + ORDER_2 = 4) integer DFACC_WRITE, DFNT_CHAR8, DFNT_INT32 parameter (DFACC_WRITE = 2, + DFNT_CHAR8 = 4, + DFNT_INT32 = 24) C C Function declaration C integer hopen, hclose integer vfstart, vhfscd, vhfsdm, vfend C C**** Variable declaration ******************************************* C integer status integer file_id integer vdata1_ref, vdata2_ref character vdata1_buf(N_RECORDS_1) integer vdata2_buf(ORDER_2, N_RECORDS_2) data vdata1_buf /'V','D','A','T','A'/ data vdata2_buf / 1, 2, 3, 4, + 2, 4, 6, 8, + 3, 6, 9, 12, + 4, 8, 12, 16, + 5, 10, 15, 20, + 6, 12, 18, 24/ C C**** End of variable declaration ************************************ C C C Open the HDF file for writing. C file_id = hopen(FILE_NAME, DFACC_WRITE, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Create the first vdata and populate it with data from vdata1_buf array. C vdata1_ref = vhfscd(file_id, FIELD1_NAME, vdata1_buf, N_RECORDS_1, + DFNT_CHAR8, VDATA1_NAME, CLASS1_NAME) C C Create the second vdata and populate it with data from vdata2_buf array. C vdata2_ref = vhfsdm(file_id, FIELD2_NAME, vdata2_buf, N_RECORDS_2, + DFNT_INT32, VDATA2_NAME, CLASS2_NAME, + ORDER_2) C C Terminate access to the VS interface and close the HDF file. C status = vfend(file_id) status = hclose(file_id) endwrite_to_vdata.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define N_RECORDS 10 /* number of records the vdata contains */ #define ORDER_1 3 /* order of first field */ #define ORDER_2 1 /* order of second field */ #define ORDER_3 2 /* order of third field */ #define CLASS_NAME "Particle Data" #define VDATA_NAME "Solid Particle" #define FIELD1_NAME "Position" /* contains x, y, z values */ #define FIELD2_NAME "Mass" /* contains weight values */ #define FIELD3_NAME "Temperature" /* contains min and max values */ #define FIELDNAME_LIST "Position,Mass,Temperature" /* No spaces b/w names */ /* number of values per record */ #define N_VALS_PER_REC (ORDER_1 + ORDER_2 + ORDER_3) 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_id, vdata_ref = -1, /* ref number of a vdata, set to -1 to create */ num_of_records; /* number of records actually written to vdata */ int16 rec_num; /* current record number */ float32 data_buf[N_RECORDS][N_VALS_PER_REC]; /* buffer for vdata values */ /********************** 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); /* * Create a new vdata. */ vdata_id = VSattach (file_id, vdata_ref, "w"); /* * Set name and class name of the vdata. */ status_32 = VSsetname (vdata_id, VDATA_NAME); status_32 = VSsetclass (vdata_id, CLASS_NAME); /* * Introduce each field's name, data type, and order. This is the first * part in defining a field. */ status_n = VSfdefine (vdata_id, FIELD1_NAME, DFNT_FLOAT32, ORDER_1 ); status_n = VSfdefine (vdata_id, FIELD2_NAME, DFNT_FLOAT32, ORDER_2 ); status_n = VSfdefine (vdata_id, FIELD3_NAME, DFNT_FLOAT32, ORDER_3 ); /* * Finalize the definition of the fields. */ status_n = VSsetfields (vdata_id, FIELDNAME_LIST); /* * Buffer the data by the record for fully interlaced mode. Note that the * first three elements contain the three values of the first field, the * fourth element contains the value of the second field, and the last two * elements contain the two values of the third field. */ for (rec_num = 0; rec_num < N_RECORDS; rec_num++) { data_buf[rec_num][0] = 1.0 * rec_num; data_buf[rec_num][1] = 2.0 * rec_num; data_buf[rec_num][2] = 3.0 * rec_num; data_buf[rec_num][3] = 0.1 + rec_num; data_buf[rec_num][4] = 0.0; data_buf[rec_num][5] = 65.0; } /* * Write the data from data_buf to the vdata with full interlacing mode. */ num_of_records = VSwrite (vdata_id, (uint8 *)data_buf, N_RECORDS, FULL_INTERLACE); /* * 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); }write_to_vdata.fprogram write_to_vdata implicit none C C Parameter declaration C character*18 FILE_NAME character*13 CLASS_NAME character*14 VDATA_NAME character*8 FIELD1_NAME character*4 FIELD2_NAME character*11 FIELD3_NAME character*27 FIELDNAME_LIST integer N_RECORDS integer ORDER_1, ORDER_2, ORDER_3 integer N_VALS_PER_REC C parameter (FILE_NAME = `General_Vdatas.hdf', + CLASS_NAME = `Particle Data', + VDATA_NAME = `Solid Particle', + FIELD1_NAME = `Position', + FIELD2_NAME = `Mass', + FIELD3_NAME = `Temperature', + FIELDNAME_LIST = `Position,Mass,Temperature') parameter (N_RECORDS = 10, + ORDER_1 = 3, + ORDER_2 = 1, + ORDER_3 = 2, + N_VALS_PER_REC = ORDER_1 + ORDER_2 + ORDER_3) integer DFACC_WRITE, DFNT_FLOAT32, FULL_INTERLACE parameter (DFACC_WRITE = 2, + DFNT_FLOAT32 = 5, + FULL_INTERLACE = 0) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsfsnam, vsfscls, vsffdef, vsfsfld, + vsfwrt, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id integer vdata_ref, rec_num, num_of_records real data_buf(N_VALS_PER_REC, N_RECORDS) C C**** End of variable declaration ************************************ C C C Open the HDF file for writing. C file_id = hopen(FILE_NAME, DFACC_WRITE, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Create a new vdata. C vdata_ref = -1 vdata_id = vsfatch(file_id, vdata_ref, `w') C C Set name and class name of the vdata. C status = vsfsnam(vdata_id, VDATA_NAME) status = vsfscls(vdata_id, CLASS_NAME) C C Introduce each field's name, data type, and order. This is the C first part in defining a field. C status = vsffdef(vdata_id, FIELD1_NAME, DFNT_FLOAT32, ORDER_1) status = vsffdef(vdata_id, FIELD2_NAME, DFNT_FLOAT32, ORDER_2) status = vsffdef(vdata_id, FIELD3_NAME, DFNT_FLOAT32, ORDER_3) C C Finalize the definition of the fields. C status = vsfsfld(vdata_id, FIELDNAME_LIST) C C Buffer the data by the record for fully interlaced mode. Note that the C first three elements contain the three values of the first field, C the forth element contains the value of the second field, and the last two C elements contain the two values of the third field. C do 10 rec_num = 1, N_RECORDS data_buf(1, rec_num) = 1.0 * rec_num data_buf(2, rec_num) = 2.0 * rec_num data_buf(3, rec_num) = 3.0 * rec_num data_buf(4, rec_num) = 0.1 + rec_num data_buf(5, rec_num) = 0.0 data_buf(6, rec_num) = 65.0 10 continue C C Write the data from data_buf to the vdata with the full interlacing mode. C num_of_records = vsfwrt(vdata_id, data_buf, N_RECORDS, + FULL_INTERLACE) C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endwrite_mixed_vdata.c#include "hdf.h" #define FILE_NAME "Packed_Vdata.hdf" #define VDATA_NAME "Mixed Data Vdata" #define CLASS_NAME "General Data Class" #define FIELD1_NAME "Temp" #define FIELD2_NAME "Height" #define FIELD3_NAME "Speed" #define FIELD4_NAME "Ident" #define ORDER 1 /* number of values in the field */ #define N_RECORDS 20 /* number of records the vdata contains */ #define N_FIELDS 4 /* number of fields in the vdata */ #define FIELDNAME_LIST "Temp,Height,Speed,Ident" /* No spaces b/w names */ /* number of bytes of the data to be written, i.e., the size of all the field values combined times the number of records */ #define BUF_SIZE (2*sizeof(float32) + sizeof(int16) + sizeof(char)) * N_RECORDS 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_id, vdata_ref = -1, /* vdata's reference number, set to -1 to create */ num_of_records; /* number of records actually written to the vdata */ float32 temp[N_RECORDS]; /* buffer to hold values of first field */ int16 height[N_RECORDS]; /* buffer to hold values of second field */ float32 speed[N_RECORDS]; /* buffer to hold values of third field */ char8 ident[N_RECORDS]; /* buffer to hold values of fourth field */ VOIDP fldbufptrs[N_FIELDS];/*pointers to be pointing to the field buffers*/ uint16 databuf[BUF_SIZE]; /* buffer to hold the data after being packed*/ int i; /********************** End of variable declaration **********************/ /* * Create an HDF file. */ file_id = Hopen (FILE_NAME, DFACC_CREATE, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Create a new vdata. */ vdata_id = VSattach (file_id, vdata_ref, "w"); /* * Set name and class name of the vdata. */ status_32 = VSsetname (vdata_id, VDATA_NAME); status_32 = VSsetclass (vdata_id, CLASS_NAME); /* * Introduce each field's name, data type, and order. This is the first * part in defining a vdata field. */ status_n = VSfdefine (vdata_id, FIELD1_NAME, DFNT_FLOAT32, ORDER); status_n = VSfdefine (vdata_id, FIELD2_NAME, DFNT_INT16, ORDER); status_n = VSfdefine (vdata_id, FIELD3_NAME, DFNT_FLOAT32, ORDER); status_n = VSfdefine (vdata_id, FIELD4_NAME, DFNT_CHAR8, ORDER); /* * Finalize the definition of the fields of the vdata. */ status_n = VSsetfields (vdata_id, FIELDNAME_LIST); /* * Enter data values into the field buffers by the records. */ for (i = 0; i < N_RECORDS; i++) { temp[i] = 1.11 * (i+1); height[i] = i; speed[i] = 1.11 * (i+1); ident[i] = `A' + i; } /* * Build an array of pointers each of which points to a field buffer that * holds all values of the field. */ fldbufptrs[0] = &temp[0]; fldbufptrs[1] = &height[0]; fldbufptrs[2] = &speed[0]; fldbufptrs[3] = &ident[0]; /* * Pack all data in the field buffers that are pointed to by the set of * pointers fldbufptrs, and store the packed data into the buffer * databuf. Note that the second parameter is _HDF_VSPACK for packing. */ status_n = VSfpack (vdata_id,_HDF_VSPACK, NULL, (VOIDP)databuf, BUF_SIZE, N_RECORDS, NULL, (VOIDP)fldbufptrs); /* * Write all records of the packed data to the vdata. */ num_of_records = VSwrite (vdata_id, (uint8 *)databuf, N_RECORDS, FULL_INTERLACE); /* * Terminate access to the vdata and the VS interface, then close * the HDF file. */ status_32 = VSdetach (vdata_id); status_n = Vend (file_id); status_32 = Hclose (file_id); }write_mixed_vdata.fprogram write_mixed_vdata implicit none C C Parameter declaration C character*16 FILE_NAME character*18 CLASS_NAME character*16 VDATA_NAME character*4 FIELD1_NAME character*6 FIELD2_NAME character*5 FIELD3_NAME character*5 FIELD4_NAME character*23 FIELDNAME_LIST integer N_RECORDS, N_FIELDS, ORDER integer BUF_SIZE C parameter (FILE_NAME = `Packed_Vdata.hdf', + CLASS_NAME = `General Data Class', + VDATA_NAME = `Mixed Data Vdata', + FIELD1_NAME = `Temp', + FIELD2_NAME = `Height', + FIELD3_NAME = `Speed', + FIELD4_NAME = `Ident', + FIELDNAME_LIST = `Temp,Height,Speed,Ident') parameter (N_RECORDS = 20, + N_FIELDS = 4, + ORDER = 1, + BUF_SIZE = (4 + 2 + 4 + 1)*N_RECORDS) integer DFACC_WRITE, DFNT_FLOAT32, DFNT_INT16, DFNT_CHAR8, + FULL_INTERLACE, HDF_VSPACK parameter (DFACC_WRITE = 2, + DFNT_FLOAT32 = 5, + DFNT_INT16 = 22, + DFNT_CHAR8 = 4, + FULL_INTERLACE = 0, + HDF_VSPACK = 0) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsfsnam, vsfscls, vsffdef, vsfsfld, + vsfnpak, vsfcpak, vsfwrit, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id integer vdata_ref, num_of_records real temp(N_RECORDS) integer*2 height(N_RECORDS) real speed(N_RECORDS) character ident(N_RECORDS) integer i C C Buffer for packed data should be big enough to hold N_RECORDS. C integer databuf(BUF_SIZE/4 + 1) C C**** End of variable declaration ************************************ C C C Open the HDF file for writing. C file_id = hopen(FILE_NAME, DFACC_WRITE, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Create a new vdata. C vdata_ref = -1 vdata_id = vsfatch(file_id, vdata_ref, `w') C C Set name and class name of the vdata. C status = vsfsnam(vdata_id, VDATA_NAME) status = vsfscls(vdata_id, CLASS_NAME) C C Introduce each field's name, data type, and order. This is the C first part in defining a field. C status = vsffdef(vdata_id, FIELD1_NAME, DFNT_FLOAT32, ORDER) status = vsffdef(vdata_id, FIELD2_NAME, DFNT_INT16, ORDER) status = vsffdef(vdata_id, FIELD3_NAME, DFNT_FLOAT32, ORDER) status = vsffdef(vdata_id, FIELD4_NAME, DFNT_CHAR8, ORDER) C C Finalize the definition of the fields. C status = vsfsfld(vdata_id, FIELDNAME_LIST) C C Enter data values into the field databufs by the records. C do 10 i = 1, N_RECORDS temp(i) = 1.11 * i height(i) = i - 1 speed(i) = 1.11 * i ident(i) = char(64+i) 10 continue C C Pack N_RECORDS of data into databuf. In Fortran, each field is packed C using separate calls to vsfnpak or vsfcpak. C status = vsfnpak(vdata_id, HDF_VSPACK, ` `, databuf, BUF_SIZE, + N_RECORDS, FIELD1_NAME, temp) status = vsfnpak(vdata_id, HDF_VSPACK, ` `, databuf, BUF_SIZE, + N_RECORDS, FIELD2_NAME, height) status = vsfnpak(vdata_id, HDF_VSPACK, ` `, databuf, BUF_SIZE, + N_RECORDS, FIELD3_NAME, speed) status = vsfcpak(vdata_id, HDF_VSPACK, ` `, databuf, BUF_SIZE, + N_RECORDS, FIELD4_NAME, ident) C C Write all the records of the packed data to the vdata. C num_of_records = vsfwrit(vdata_id, databuf, N_RECORDS, + FULL_INTERLACE) C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endread_from_vdata.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define VDATA_NAME "Solid Particle" #define N_RECORDS 5 /* number of records the vdata contains */ #define RECORD_INDEX 3 /* position where reading starts - 4th record */ #define ORDER_1 3 /* order of first field to be read */ #define ORDER_2 2 /* order of second field to be read */ #define FIELDNAME_LIST "Position,Temperature" /* only two fields are read */ #define N_VALS_PER_REC (ORDER_1 + ORDER_2) /* number of values per record */ 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_id, vdata_ref, /* vdata's reference number */ num_of_records, /* number of records actually written to the vdata */ record_pos; /* position of the current record */ int16 i, rec_num; /* current record number in the vdata */ float32 databuf[N_RECORDS][N_VALS_PER_REC]; /* buffer for vdata values */ /********************** End of variable declaration **********************/ /* * Open the HDF file for reading. */ file_id = Hopen (FILE_NAME, DFACC_READ, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Get the reference number of the vdata, whose name is specified in * VDATA_NAME, using VSfind, which will be discussed in Section 4.7.3. */ vdata_ref = VSfind (file_id, VDATA_NAME); /* * Attach to the vdata for reading if it is found, otherwise * exit the program. */ if (vdata_ref == 0) exit; vdata_id = VSattach (file_id, vdata_ref, "r"); /* * Specify the fields that will be read. */ status_n = VSsetfields (vdata_id, FIELDNAME_LIST); /* * Place the current point to the position specified in RECORD_INDEX. */ record_pos = VSseek (vdata_id, RECORD_INDEX); /* * Read the next N_RECORDS records from the vdata and store the data * in the buffer databuf with fully interlaced mode. */ num_of_records = VSread (vdata_id, (uint8 *)databuf, N_RECORDS, FULL_INTERLACE); /* * Display the read data as many records as the number of records * returned by VSread. */ printf ("\n Particle Position Temperature Range\n\n"); for (rec_num = 0; rec_num < num_of_records; rec_num++) { printf (" %6.2f, %6.2f, %6.2f %6.2f, %6.2f\n", databuf[rec_num][0], databuf[rec_num][1], databuf[rec_num][2], databuf[rec_num][3], databuf[rec_num][4]); } /* * 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); }read_from_vdata.fprogram read_from_vdata implicit none C C Parameter declaration C character*18 FILE_NAME character*14 VDATA_NAME character*20 FIELDNAME_LIST integer N_RECORDS, RECORD_INDEX integer ORDER_1, ORDER_2 integer N_VALS_PER_REC C parameter (FILE_NAME = `General_Vdatas.hdf', + VDATA_NAME = `Solid Particle', + FIELDNAME_LIST = `Position,Temperature') parameter (N_RECORDS = 5, + RECORD_INDEX = 3, + ORDER_1 = 3, + ORDER_2 = 2, + N_VALS_PER_REC = ORDER_1 + ORDER_2 ) integer DFACC_READ, FULL_INTERLACE parameter (DFACC_READ = 1, + FULL_INTERLACE = 0) C C Function declaration C integer hopen, hclose integer vfstart, vsffnd, vsfatch, vsfsfld, vsfrd, vsfseek, + vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id integer vdata_ref, rec_num, num_of_records, rec_pos real databuf(N_VALS_PER_REC, N_RECORDS) integer i C C**** End of variable declaration ************************************ C C C Open the HDF file for reading. C file_id = hopen(FILE_NAME, DFACC_READ, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Get the reference number of the vdata, whose name is specified in C VDATA_NAME, using vsffnd, which will be discussed in Section 4.7.3. C vdata_ref = vsffnd(file_id, VDATA_NAME) C C Attach to the vdata for reading if it is found, C otherwise exit the program. C if (vdata_ref .eq. 0) stop vdata_id = vsfatch(file_id, vdata_ref, `r') C C Specify the fields that will be read. C status = vsfsfld(vdata_id, FIELDNAME_LIST) C C Place the current point to the position specified in RECORD_INDEX. C rec_pos = vsfseek(vdata_id, RECORD_INDEX) C C Read the next N_RECORDS from the vdata and store the data in the buffer C databuf with fully interlace mode. C num_of_records = vsfrd(vdata_id, databuf, N_RECORDS, + FULL_INTERLACE) C C Display the read data as many records as the number of records returned C by vsfrd. C write(*,*) ` Particle Position Temperature Range' write(*,*) do 10 rec_num = 1, num_of_records write(*,1000) (databuf(i, rec_num), i = 1, N_VALS_PER_REC) 10 continue 1000 format(1x,3(f6.2), 8x,2(f6.2)) C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endread_mixed_vdata.c#include "hdf.h" #define N_RECORDS 20 /* number of records to be read */ #define N_FIELDS 2 /* number of fields to be read */ #define FILE_NAME "Packed_Vdata.hdf" #define VDATA_NAME "Mixed Data Vdata" #define FIELDNAME_LIST "Temp,Ident" /* number of bytes of the data to be read */ #define BUFFER_SIZE ( sizeof(float32) + sizeof(char)) * N_RECORDS 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_id, num_of_records, /* number of records actually read */ vdata_ref, /* reference number of the vdata to be read */ buffer_size; /* number of bytes the vdata can hold */ float32 itemp[N_RECORDS]; /* buffer to hold values of first field */ char idents[N_RECORDS]; /* buffer to hold values of fourth field */ uint8 databuf[BUFFER_SIZE]; /* buffer to hold read data, still packed */ VOIDP fldbufptrs[N_FIELDS];/*pointers to be pointing to the field buffers*/ int i; /********************** End of variable declaration **********************/ /* * Open the HDF file for reading. */ file_id = Hopen (FILE_NAME, DFACC_READ, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Get the reference number of the vdata, whose name is specified in * VDATA_NAME, using VSfind, which will be discussed in Section 4.7.3. */ vdata_ref = VSfind (file_id, VDATA_NAME); /* * Attach to the vdata for reading. */ vdata_id = VSattach (file_id, vdata_ref, "r"); /* * Specify the fields that will be read. */ status_n = VSsetfields(vdata_id, FIELDNAME_LIST); /* * Read N_RECORDS records of the vdata and store the values into the * buffer databuf. */ num_of_records = VSread (vdata_id, (uint8 *)databuf, N_RECORDS, FULL_INTERLACE); /* * Build an array of pointers each of which points to an array that * will hold all values of a field after being unpacked. */ fldbufptrs[0] = &itemp[0]; fldbufptrs[1] = &idents[0]; /* * Unpack the data from the buffer databuf and store the values into the * appropriate field buffers pointed to by the set of pointers fldbufptrs. * Note that the second parameter is _HDF_VSUNPACK for unpacking and the * number of records is the one returned by VSread. */ status_n = VSfpack (vdata_id, _HDF_VSUNPACK, FIELDNAME_LIST, (VOIDP)databuf, BUFFER_SIZE, num_of_records, NULL, (VOIDP)fldbufptrs); /* * Display the read data being stored in the field buffers. */ printf ("\n Temp Ident\n"); for (i=0; i < num_of_records; i++) printf (" %6.2f %c\n", itemp[i], idents[i]); /* * Terminate access to the vdata and the VS interface, then close * the HDF file. */ status_32 = VSdetach (vdata_id); status_n = Vend (file_id); status_32 = Hclose (file_id); }read_mixed_vdata.fprogram read_mixed_vdata implicit none C C Parameter declaration C character*16 FILE_NAME character*16 VDATA_NAME character*4 FIELD1_NAME character*5 FIELD2_NAME character*10 FIELDNAME_LIST integer N_RECORDS, N_FIELDS integer BUFFER_SIZE C parameter (FILE_NAME = `Packed_Vdata.hdf', + VDATA_NAME = `Mixed Data Vdata', + FIELD1_NAME = `Temp', + FIELD2_NAME = `Ident', + FIELDNAME_LIST = `Temp,Ident') parameter (N_RECORDS = 20, + N_FIELDS = 2, + BUFFER_SIZE = (4 + 1)*N_RECORDS) integer DFACC_READ, DFNT_FLOAT32, DFNT_CHAR8, + FULL_INTERLACE, HDF_VSUNPACK parameter (DFACC_READ = 1, + DFNT_FLOAT32 = 5, + DFNT_CHAR8 = 4, + FULL_INTERLACE = 0, + HDF_VSUNPACK = 1) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsffnd, vsfsfld, + vsfnpak, vsfcpak, vsfread, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id integer vdata_ref, num_of_records real temp(N_RECORDS) character ident(N_RECORDS) integer i C C Buffer for read packed data should be big enough to hold N_RECORDS. C integer databuf(BUFFER_SIZE/4 + 1) C C**** End of variable declaration ************************************ C C C Open the HDF file for reading. C file_id = hopen(FILE_NAME, DFACC_READ, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Get the reference number of the vdata, whose name is specified in C VDATA_NAME, using vsffnd, which will be discussed in Section 4.7.3. C vdata_ref = vsffnd(file_id, VDATA_NAME) C C Attach to the vdata for reading if it is found, C otherwise exit the program. C if (vdata_ref .eq. 0) stop vdata_id = vsfatch(file_id, vdata_ref, `r') C C Specify the fields that will be read. C status = vsfsfld(vdata_id, FIELDNAME_LIST) C C Read N_RECORDS records of the vdata and store the values into the databuf. C num_of_records = vsfread(vdata_id, databuf, N_RECORDS, + FULL_INTERLACE) C C Unpack N_RECORDS from databuf into temp and ident arrays. C In Fortran, each field is unpacked using separate calls to C vsfnpak or vsfcpak. C status = vsfnpak(vdata_id, HDF_VSUNPACK, FIELDNAME_LIST, databuf, + BUFFER_SIZE, num_of_records, FIELD1_NAME, temp) status = vsfcpak(vdata_id, HDF_VSUNPACK, FIELDNAME_LIST, databuf, + BUFFER_SIZE, num_of_records, FIELD2_NAME, ident) C C Display the read data being stored in the field databufs. C write (*,*) ` Temp Ident' do 10 i = 1, num_of_records write(*,1000) temp(i), ident(i) 10 continue 1000 format (3x,F6.2, 4x, a) C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endlocate_vdata.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define SEARCHED_FIELDS "Position,Temperature" 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_id, vdata_ref, index = 0; /* index of the vdata in the file - manually kept */ int8 found_fields; /* TRUE if the specified fields exist in the vdata */ /********************** End of variable declaration **********************/ /* * Open the HDF file for reading. */ file_id = Hopen (FILE_NAME, DFACC_READ, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Set the reference number to -1 to start the search from * the beginning of file. */ vdata_ref = -1; /* * Assume that the specified fields are not found in the current vdata. */ found_fields = FALSE; /* * Use VSgetid to obtain each vdata by its reference number then * attach to the vdata and search for the fields. The loop * terminates when the last vdata is reached or when a vdata which * contains the fields listed in SEARCHED_FIELDS is found. */ while ((vdata_ref = VSgetid (file_id, vdata_ref)) != FAIL) { vdata_id = VSattach (file_id, vdata_ref, "r"); if ((status_n = VSfexist (vdata_id, SEARCHED_FIELDS)) != FAIL) { found_fields = TRUE; break; } /* * Detach from the current vdata before continuing searching. */ status_32 = VSdetach (vdata_id); index++; /* advance the index by 1 for the next vdata */ } /* * Print the index of the vdata containing the fields or a "not found" * message if no such vdata is found. Also detach from the vdata found. */ if (!found_fields) printf ("Fields Position and Temperature were not found.\n"); else { printf ("Fields Position and Temperature found in the vdata at position %d\n", index); status_32 = VSdetach (vdata_id); } /* * Terminate access to the VS interface and close the HDF file. */ status_n = Vend (file_id); status_32 = Hclose (file_id); }locate_vdata.fprogram locate_vdata implicit none C C Parameter declaration C character*18 FILE_NAME character*20 SEARCHED_FIELDS C parameter (FILE_NAME = `General_Vdatas.hdf', + SEARCHED_FIELDS = `Position,Temperature') integer DFACC_READ parameter (DFACC_READ = 1) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsfgid, vsfex, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id, vdata_ref integer index logical found_fields C C**** End of variable declaration ************************************ C C C Open the HDF file for reading. C file_id = hopen(FILE_NAME, DFACC_READ, 0) C C Initialize the VS interface. C status = vfstart(file_id) index = 0 C C Set the reference number to -1 to start the search from the beginning C of the file. C vdata_ref = -1 C C Assume that the specified fields are not found in the current vdata. C found_fields = .FALSE. 10 continue C C Use vsfgid to obtain each vdata by its reference number then C attach to the vdata and search for the fields. The loop terminates C when the last vdata is reached or when a vdata which contains the C fields listed in SEARCHED_FIELDS is found. C vdata_ref = vsfgid(file_id, vdata_ref) if (vdata_ref .eq. -1) goto 100 vdata_id = vsfatch(file_id, vdata_ref, `r') status = vsfex(vdata_id, SEARCHED_FIELDS) if (status .ne. -1) then found_fields = .TRUE. goto 100 endif status = vsfdtch(vdata_id) index = index + 1 goto 10 100 continue C C Print the index of the vdata containing the fields or a `not found' C message if no such vdata is found. Also detach from the vdata found. C if(.NOT.found_fields) then write(*,*) `Fields Positions and Temperature were not found' else write(*,*) + `Fields Positions and Temperature were found in the vdata', + ` at position `, index C C Terminate access to the vdata C status = vsfdtch(vdata_id) endif C C Terminate access to the VS interface and close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endset_get_vdata_attr.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define VDATA_NAME "Solid Particle" #define FIELD_NAME "Mass" #define VATTR_NAME "Site Ident" /* name of the vdata attribute */ #define FATTR_NAME "Scales" /* name of the field attribute */ #define VATTR_N_VALUES 3 /* number of values in the vdata attribute */ #define FATTR_N_VALUES 4 /* number of values in the field attribute */ 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); }set_get_vdata_attr.fprogram vdata_attributes implicit none C C Parameter declaration C character*18 FILE_NAME character*14 VDATA_NAME character*4 FIELD_NAME character*10 VATTR_NAME character*6 FATTR_NAME integer VATTR_N_VALUES, FATTR_N_VALUES C parameter (FILE_NAME = `General_Vdatas.hdf', + VDATA_NAME = `Solid Particle', + FIELD_NAME = `Mass', + VATTR_NAME = `Site Ident', + FATTR_NAME = `Scales') parameter (VATTR_N_VALUES = 3, + FATTR_N_VALUES = 4) integer DFACC_WRITE, FULL_INTERLACE, HDF_VDATA integer DFNT_INT32, DFNT_CHAR8 parameter (DFACC_WRITE = 2, + FULL_INTERLACE = 0, + HDF_VDATA = -1, + DFNT_INT32 = 24, + DFNT_CHAR8 = 4) C C Function declaration C integer hopen, hclose integer vfstart, vsffnd, vsfatch, vsfscat, vsfsnat, + vsffnas, vsffidx, vsfnats, vsfainf, vsfgcat, vsfgnat, + vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id, vdata_ref integer field_index, n_vdattrs, n_fldattrs integer vdata_type, vdata_n_values, vdata_size integer field_type, field_n_values, field_size character vd_attr(VATTR_N_VALUES) integer fld_attr(FATTR_N_VALUES) character vattr_buf(VATTR_N_VALUES) integer fattr_buf(FATTR_N_VALUES) character vattr_name_out(30), fattr_name_out(30) data vd_attr /'A', `B', `C'/ data fld_attr /2, 4, 6, 8/ C C**** End of variable declaration ************************************ C C C Open the HDF file for writing. C file_id = hopen(FILE_NAME, DFACC_WRITE, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Get the reference number of the vdata named VDATA_NAME. C vdata_ref = vsffnd(file_id, VDATA_NAME) C C Attach to the vdata for writing. C vdata_id = vsfatch(file_id, vdata_ref, `w') C C Attach an attribute to the vdata, as it is indicated by second parameter. C status = vsfscat(vdata_id, HDF_VDATA, VATTR_NAME, DFNT_CHAR8, + VATTR_N_VALUES, vd_attr) C C Get the index of the field FIELD_NAME within the vdata. C status = vsffidx(vdata_id, FIELD_NAME, field_index) C C Attach an attribute to the field with the index field_index. C status = vsfsnat(vdata_id, field_index, FATTR_NAME, DFNT_INT32, + FATTR_N_VALUES, fld_attr) C C Get the number of attributes attached to the vdata's first C field - should be 0. C n_fldattrs = vsffnas(vdata_id, 0) write(*,*) `Number of attributes of the first field' write(*,*) ` of the vdata: `, n_fldattrs C C Get the number of the attributes attached to the field specified by C index field_index - should be 1. C n_fldattrs = vsffnas(vdata_id, field_index) write(*,*) `Number of attributes of field `, FIELD_NAME, + n_fldattrs C C Get the total number of the field's and vdata's attributes - should be 2. C n_vdattrs = vsfnats(vdata_id) write(*,*) `Number of attributes of the vdata and its fields: `, + n_vdattrs C C Get information about the vdata's first attribute, indicated by C the third parameter, which is the index of the attribute. C status = vsfainf(vdata_id, HDF_VDATA, 0, vattr_name_out, + vdata_type, vdata_n_values, vdata_size) C C Get information about the first attribute of the field specified by C field_index. C status = vsfainf(vdata_id, field_index, 0, fattr_name_out, + field_type, field_n_values, field_size) C C Get the vdata's first attribute. C status = vsfgcat(vdata_id, HDF_VDATA, 0, vattr_buf) write(*,*) `Values of vdata attribute `, vattr_buf C C Get the first attribute of the field specified by field_index. C status = vsfgnat(vdata_id, field_index, 0, fattr_buf) write(*,*) `Values of the field attribute = `, fattr_buf C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) endget_vdata_info.c#include "hdf.h" #define FILE_NAME "General_Vdatas.hdf" #define FIELD_SIZE 80 /* maximum length of all the field names */ main( ) { /************************* Variable declaration **************************/ intn status_n; /* returned status for functions returning an intn */ int32 status_32, /* returned status for functions returning an int32 */ n_records, /* to retrieve the number of records in the vdata */ interlace_mode,/* to retrieve the interlace mode of the vdata */ vdata_size, /* to retrieve the size of all specified fields */ file_id, vdata_ref, vdata_id; char fieldname_list[FIELD_SIZE], /* buffer to retrieve the vdata data */ vdata_name[VSNAMELENMAX]; /* buffer to retrieve the vdata name */ /********************** End of variable declaration **********************/ /* * Open the HDF file for reading. */ file_id = Hopen (FILE_NAME, DFACC_READ, 0); /* * Initialize the VS interface. */ status_n = Vstart (file_id); /* * Set vdata_ref to -1 to start the search from the beginning of file. */ vdata_ref = -1; /* * Use VSgetid to obtain each vdata by its reference number then attach * to the vdata and get its information. The loop terminates when * the last vdata is reached. */ while ((vdata_ref = VSgetid (file_id, vdata_ref)) != FAIL) { /* * Attach to the current vdata for reading. */ vdata_id = VSattach (file_id, vdata_ref, "r"); /* * Test whether the current vdata is not a storage of an attribute, then * obtain and display its information. */ if( VSisattr (vdata_id) != TRUE ) { status_n = VSinquire (vdata_id, &n_records, &interlace_mode, fieldname_list, &vdata_size, vdata_name); printf ("Vdata %s: - contains %d records\n\tInterlace mode: %s \ \n\tFields: %s - %d bytes\n\t\n", vdata_name, n_records, interlace_mode == FULL_INTERLACE ? "FULL" : "NONE", fieldname_list, vdata_size ); } /* * Detach from the current vdata. */ status_32 = VSdetach (vdata_id); } /* while */ /* * Terminate access to the VS interface and close the HDF file. */ status_n = Vend (file_id); status_32 = Hclose (file_id); }get_vdata_info.fprogram vdata_info implicit none C C Parameter declaration C character*18 FILE_NAME integer DFACC_READ, FULL_INTERLACE integer FIELD_SIZE C parameter (FILE_NAME = `General_Vdatas.hdf', + DFACC_READ = 1, + FULL_INTERLACE = 0, + FIELD_SIZE = 80) C C Function declaration C integer hopen, hclose integer vfstart, vsfatch, vsfgid, vsfinq, + vsfisat, vsfdtch, vfend C C**** Variable declaration ******************************************* C integer status integer file_id, vdata_id, vdata_ref integer n_records, interlace_mode, vdata_size character*64 vdata_name character*80 fieldname_list C C**** End of variable declaration ************************************ C C C Open the HDF file for reading. C file_id = hopen(FILE_NAME, DFACC_READ, 0) C C Initialize the VS interface. C status = vfstart(file_id) C C Set the reference number to -1 to start the search from the beginning C of the file. C vdata_ref = -1 10 continue C C Use vsfgid to obtain each vdata by its reference number then C attach to the vdata and get information. The loop terminates C when the last vdata is reached. C vdata_ref = vsfgid(file_id, vdata_ref) if (vdata_ref .eq. -1) goto 100 C C Attach to the current vdata for reading. C vdata_id = vsfatch(file_id, vdata_ref, `r') C C Test whether the current vdata is not a storage for an attribute, C then obtain and display its information. if (vsfisat(vdata_id) .ne. 1) then status = vsfinq(vdata_id, n_records, interlace_mode, + fieldname_list, vdata_size, vdata_name) write(*,*) `Vdata: `, vdata_name write(*,*) `contains `, n_records, ` records' if (interlace_mode .eq. 0) then write(*,*) `Interlace mode: FULL' else write(*,*) `Interlace mode: NONE' endif write(*,*) `Fields: `, fieldname_list(1:30) write(*,*) `Vdata record size in bytes :', vdata_size write(*,*) endif C C Detach from the current vdata. C status = vsfdtch(vdata_id) goto 10 100 continue C C Terminate access to the vdata and to the VS interface, and C close the HDF file. C status = vsfdtch(vdata_id) status = vfend(file_id) status = hclose(file_id) end
HDF4.2r4 - February 2009 Copyright |
The HDF Group www.hdfgroup.org ![]() |