summaryrefslogtreecommitdiffstats
path: root/doc/html/Datasets.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/Datasets.html')
-rw-r--r--doc/html/Datasets.html839
1 files changed, 839 insertions, 0 deletions
diff --git a/doc/html/Datasets.html b/doc/html/Datasets.html
new file mode 100644
index 0000000..e0f9680
--- /dev/null
+++ b/doc/html/Datasets.html
@@ -0,0 +1,839 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+ <head>
+ <title>The Dataset Interface (H5D)</title>
+ </head>
+
+ <body>
+ <h1>The Dataset Interface (H5D)</h1>
+
+ <h2>1. Introduction</h2>
+
+ <p>The purpose of the dataset interface is to provide a mechanism
+ to describe properties of datasets and to transfer data between
+ memory and disk. A dataset is composed of a collection of raw
+ data points and four classes of meta data to describe the data
+ points. The interface is hopefully designed in such a way as to
+ allow new features to be added without disrupting current
+ applications that use the dataset interface.
+
+ <p>The four classes of meta data are:
+
+ <dl>
+ <dt>Constant Meta Data
+ <dd>Meta data that is created when the dataset is created and
+ exists unchanged for the life of the dataset. For instance,
+ the data type of stored array elements is defined when the
+ dataset is created and cannot be subsequently changed.
+
+ <dt>Persistent Meta Data
+ <dd>Meta data that is an integral and permanent part of a
+ dataset but can change over time. For instance, the size in
+ any dimension can increase over time if such an increase is
+ allowed when the dataset was created.
+
+ <dt>Memory Meta Data
+ <dd>Meta data that exists to describe how raw data is organized
+ in the application's memory space. For instance, the data
+ type of elements in an application array might not be the same
+ as the data type of those elements as stored in the HDF5 file.
+
+ <dt>Transport Meta Data
+ <dd>Meta data that is used only during the transfer of raw data
+ from one location to another. For instance, the number of
+ processes participating in a collective I/O request or hints
+ to the library to control caching of raw data.
+ </dl>
+
+ <p>Each of these classes of meta data is handled differently by
+ the library although the same API might be used to create them.
+ For instance, the data type exists as constant meta data and as
+ memory meta data; the same API (the <code>H5T</code> API) is
+ used to manipulate both pieces of meta data but they're handled
+ by the dataset API (the <code>H5D</code> API) in different
+ manners.
+
+
+
+ <h2>2. Storage Layout Properties</h2>
+
+ <p>The dataset API partitions these terms on three orthogonal axes
+ (layout, compression, and external storage) and uses a
+ <em>dataset creation property list</em> to hold the various
+ settings and pass them through the dataset interface. This is
+ similar to the way HDF5 files are created with a file creation
+ property list. A dataset creation property list is always
+ derived from the default dataset creation property list (use
+ <code>H5Pcreate()</code> to get a copy of the default property
+ list) by modifying properties with various
+ <code>H5Pset_<em>property</em>()</code> functions.
+
+ <dl>
+ <dt><code>herr_t H5Pset_layout (hid_t <em>plist_id</em>,
+ H5D_layout_t <em>layout</em>)</code>
+ <dd>The storage layout is a piece of constant meta data that
+ describes what method the library uses to organize the raw
+ data on disk. The default layout is contiguous storage.
+
+ <br><br>
+ <dl>
+ <dt><code>H5D_COMPACT</code>
+ <dd>The raw data is presumably small and can be stored
+ directly in the object header. Such data is
+ non-extendible, non-compressible, non-sparse, and cannot
+ be stored externally. Most of these restrictions are
+ arbitrary but are enforced because of the small size of
+ the raw data. Storing data in this format eliminates the
+ disk seek/read request normally necessary to read raw
+ data. <b>This layout is not implemented yet.</b>
+
+ <br><br>
+ <dt><code>H5D_CONTIGUOUS</code>
+ <dd>The raw data is large, non-extendible, non-compressible,
+ non-sparse, and can be stored externally. This is the
+ default value for the layout property. The term
+ <em>large</em> means that it may not be possible to hold
+ the entire dataset in memory. The non-compressibility is
+ a side effect of the data being large, contiguous, and
+ fixed-size at the physical level, which could cause
+ partial I/O requests to be extremely expensive if
+ compression were allowed.
+
+ <br><br>
+ <dt><code>H5D_CHUNKED</code>
+ <dd>The raw data is large and can be extended in any
+ dimension at any time (provided the data space also allows
+ the extension). It may be sparse at the chunk level (each
+ chunk is non-sparse, but there might only be a few chunks)
+ and each chunk can be compressed and/or stored externally.
+ A dataset is partitioned into chunks so each chunk is the
+ same logical size. The chunks are indexed by a B-tree and
+ are allocated on demand (although it might be useful to be
+ able to preallocate storage for parts of a chunked array
+ to reduce contention for the B-tree in a parallel
+ environment). The chunk size must be defined with
+ <code>H5Pset_chunk()</code>.
+
+ <br><br>
+ <dt><em>others...</em>
+ <dd>Other layout types may be defined later without breaking
+ existing code. However, to be able to correctly read or
+ modify data stored with one of these new layouts, the
+ application will need to be linked with a new version of
+ the library. This happens automatically on systems with
+ dynamic linking.
+ </dl>
+ </dl>
+
+ <p>Once the general layout is defined, the user can define
+ properties of that layout. Currently, the only layout that has
+ user-settable properties is the <code>H5D_CHUNKED</code> layout,
+ which needs to know the dimensionality and chunk size.
+
+ <dl>
+ <dt><code>herr_t H5Pset_chunk (hid_t <em>plist_id</em>, int
+ <em>ndims</em>, hsize_t <em>dim</em>[])</code>
+ <dd>This function defines the logical size of a chunk for
+ chunked layout. If the layout property is set to
+ <code>H5D_CHUNKED</code> and the chunk size is set to
+ <em>dim</em>. The number of elements in the <em>dim</em> array
+ is the dimensionality, <em>ndims</em>. One need not call
+ <code>H5Dset_layout()</code> when using this function since
+ the chunked layout is implied.
+ </dl>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example: Chunked Storage</h4></caption>
+ <tr>
+ <td>
+ <p>This example shows how a two-dimensional dataset
+ is partitioned into chunks. The library can manage file
+ memory by moving the chunks around, and each chunk could be
+ compressed. The chunks are allocated in the file on demand
+ when data is written to the chunk.
+ <center>
+ <img alt="Chunked Storage" src="chunk1.gif">
+ </center>
+
+ <p><code><pre>
+size_t hsize[2] = {1000, 1000};
+plist = H5Pcreate (H5P_DATASET_CREATE);
+H5Pset_chunk (plist, 2, size);
+ </pre></code>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+
+ <p>Although it is most efficient if I/O requests are aligned on chunk
+ boundaries, this is not a constraint. The application can perform I/O
+ on any set of data points as long as the set can be described by the
+ data space. The set on which I/O is performed is called the
+ <em>selection</em>.
+
+ <h2>3. Compression Properties</h2>
+
+ <p>Some types of storage layout allow data compression which is
+ defined by the functions described here. <b>Compression is not
+ implemented yet.</b>
+
+ <dl>
+ <dt><code>herr_t H5Pset_compression (hid_t <em>plist_id</em>,
+ H5Z_method_t <em>method</em>)</code>
+ <dt><code>H5Z_method_t H5Pget_compression (hid_t
+ <em>plist_id</em>)</code>
+ <dd>These functions set and query the compression method that
+ is used to compress the raw data of a dataset. The
+ <em>plist_id</em> is a dataset creation property list. The
+ possible values for the compression method are:
+
+ <br><br>
+ <dl>
+ <dt><code>H5Z_NONE</code>
+ <dd>This is the default and specifies that no compression is
+ to be performed.
+
+ <br><br>
+ <dt><code>H5Z_DEFLATE</code>
+ <dd>This specifies that a variation of the Lempel-Ziv 1977
+ (LZ77) encoding is used, the same encoding used by the
+ free GNU <code>gzip</code> program.
+ </dl>
+
+ <br><br>
+ <dt><code>herr_t H5Pset_deflate (hid_t <em>plist_id</em>,
+ int <em>level</em>)</code>
+ <dt><code>int H5Pget_deflate (hid_t <em>plist_id</em>)</code>
+ <dd>These functions set or query the deflate level of
+ dataset creation property list <em>plist_id</em>. The
+ <code>H5Pset_deflate()</code> sets the compression method to
+ <code>H5Z_DEFLATE</code> and sets the compression level to
+ some integer between one and nine (inclusive). One results in
+ the fastest compression while nine results in the best
+ compression ratio. The default value is six if
+ <code>H5Pset_deflate()</code> isn't called. The
+ <code>H5Pget_deflate()</code> returns the compression level
+ for the deflate method, or negative if the method is not the
+ deflate method.
+ </dl>
+
+ <h2>4. External Storage Properties</h2>
+
+ <p>Some storage formats may allow storage of data across a set of
+ non-HDF5 files. Currently, only the <code>H5D_CONTIGUOUS</code> storage
+ format allows external storage. A set segments (offsets and sizes) in
+ one or more files is defined as an external file list, or <em>EFL</em>,
+ and the contiguous logical addresses of the data storage are mapped onto
+ these segments.
+
+ <dl>
+ <dt><code>herr_t H5Pset_external (hid_t <em>plist</em>, const
+ char *<em>name</em>, off_t <em>offset</em>, hsize_t
+ <em>size</em>)</code>
+ <dd>This function adds a new segment to the end of the external
+ file list of the specified dataset creation property list. The
+ segment begins a byte <em>offset</em> of file <em>name</em> and
+ continues for <em>size</em> bytes. The space represented by this
+ segment is adjacent to the space already represented by the external
+ file list. The last segment in a file list may have the size
+ <code>H5F_UNLIMITED</em>.
+
+ <br><br>
+ <dt><code>int H5Pget_external_count (hid_t <em>plist</em>)</code>
+ <dd>Calling this function returns the number of segments in an
+ external file list. If the dataset creation property list has no
+ external data then zero is returned.
+
+ <br><br>
+ <dt><code>herr_t H5Pget_external (hid_t <em>plist</em>, int
+ <em>idx</em>, size_t <em>name_size</em>, char *<em>name</em>, off_t
+ *<em>offset</em>, hsize_t *<em>size</em>)</code>
+ <dd>This is the counterpart for the <code>H5Pset_external()</code>
+ function. Given a dataset creation property list and a zero-based
+ index into that list, the file name, byte offset, and segment size are
+ returned through non-null arguments. At most <em>name_size</em>
+ characters are copied into the <em>name</em> argument which is not
+ null terminated if the file name is longer than the supplied name
+ buffer (this is similar to <code>strncpy()</code>).
+ </dl>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example: Multiple Segments</h4></caption>
+ <tr>
+ <td>
+ <p>This example shows how a contiguous, one-dimensional dataset
+ is partitioned into three parts and each of those parts is
+ stored in a segment of an external file. The top rectangle
+ represents the logical address space of the dataset
+ while the bottom rectangle represents an external file.
+ <center>
+ <img alt="Multiple Segments" src="extern1.gif">
+ </center>
+
+ <p><code><pre>
+plist = H5Pcreate (H5P_DATASET_CREATE);
+H5Pset_external (plist, "velocity.data", 3000, 1000);
+H5Pset_external (plist, "velocity.data", 0, 2500);
+H5Pset_external (plist, "velocity.data", 4500, 1500);
+ </pre></code>
+
+ <p>One should note that the segments are defined in order of the
+ logical addresses they represent, not their order within the
+ external file. It would also have been possible to put the
+ segments in separate files. Care should be taken when setting
+ up segments in a single file since the library doesn't
+ automatically check for segments that overlap.
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example: Multi-Dimensional</h4></caption>
+ <tr>
+ <td>
+ <p>This example shows how a contiguous, two-dimensional dataset
+ is partitioned into three parts and each of those parts is
+ stored in a separate external file. The top rectangle
+ represents the logical address space of the dataset
+ while the bottom rectangles represent external files.
+ <center>
+ <img alt="Multiple Dimensions" src="extern2.gif">
+ </center>
+
+ <p><code><pre>
+plist = H5Pcreate (H5P_DATASET_CREATE);
+H5Pset_external (plist, "scan1.data", 0, 24);
+H5Pset_external (plist, "scan2.data", 0, 24);
+H5Pset_external (plist, "scan3.data", 0, 16);
+ </pre></code>
+
+ <p>The library maps the multi-dimensional array onto a linear
+ address space like normal, and then maps that address space
+ into the segments defined in the external file list.
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>The segments of an external file can exist beyond the end of the
+ file. The library reads that part of a segment as zeros. When writing
+ to a segment that exists beyond the end of a file, the file is
+ automatically extended. Using this feature, one can create a segment
+ (or set of segments) which is larger than the current size of the
+ dataset, which allows to dataset to be extended at a future time
+ (provided the data space also allows the extension).
+
+ <p>All referenced external data files must exist before performing raw
+ data I/O on the dataset. This is normally not a problem since those
+ files are being managed directly by the application, or indirectly
+ through some other library.
+
+
+ <h2>5. Data Type</h2>
+
+ <p>Raw data has a constant data type which describes the data type
+ of the raw data stored in the file, and a memory data type that
+ describes the data type stored in application memory. Both data
+ types are manipulated with the <a
+ href="Datatypes.html"><code>H5T</code></a> API.
+
+ <p>The constant file data type is associated with the dataset when
+ the dataset is created in a manner described below. Once
+ assigned, the constant datatype can never be changed.
+
+ <p>The memory data type is specified when data is transferred
+ to/from application memory. In the name of data sharability,
+ the memory data type must be specified, but can be the same
+ type identifier as the constant data type.
+
+ <p>During dataset I/O operations, the library translates the raw
+ data from the constant data type to the memory data type or vice
+ versa. Structured data types include member offsets to allow
+ reordering of struct members and/or selection of a subset of
+ members and array data types include index permutation
+ information to allow things like transpose operations (<b>the
+ prototype does not support array reordering</b>) Permutations
+ are relative to some extrinsic descritpion of the dataset.
+
+
+
+ <h2>6. Data Space</h2>
+
+ <p>The dataspace of a dataset defines the number of dimensions
+ and the size of each dimension and is manipulated with the
+ <code>H5S</code> API. The <em>simple</em> dataspace consists of
+ maximum dimension sizes and actual dimension sizes, which are
+ usually the same. However, maximum dimension sizes can be the
+ constant <code>H5D_UNLIMITED</code> in which case the actual
+ dimension size can be incremented with calls to
+ <code>H5Dextend()</code>. The maximium dimension sizes are
+ constant meta data while the actual dimension sizes are
+ persistent meta data. Initial actual dimension sizes are
+ supplied at the same time as the maximum dimension sizes when
+ the dataset is created.
+
+ <p>The dataspace can also be used to define partial I/O
+ operations. Since I/O operations have two end-points, the raw
+ data transfer functions take two data space arguments: one which
+ describes the application memory data space or subset thereof
+ and another which describes the file data space or subset
+ thereof.
+
+
+ <h2>7. Setting Constant or Persistent Properties</h2>
+
+ <p>Each dataset has a set of constant and persistent properties
+ which describe the layout method, pre-compression
+ transformation, compression method, data type, external storage,
+ and data space. The constant properties are set as described
+ above in a dataset creation property list whose identifier is
+ passed to <code>H5Dcreate()</code>.
+
+ <dl>
+ <dt><code>hid_t H5Dcreate (hid_t <em>file_id</em>, const char
+ *<em>name</em>, hid_t <em>type_id</em>, hid_t
+ <em>space_id</em>, hid_t <em>create_plist_id</em>)</code>
+ <dd>A dataset is created by calling <code>H5Dcreate</code> with
+ a file identifier, a dataset name, a data type, a data space,
+ and constant properties. The data type and data space are the
+ type and space of the dataset as it will exist in the file,
+ which may be different than in application memory. The
+ <em>create_plist_id</em> is a <code>H5P_DATASET_CREATE</code>
+ property list created with <code>H5Pcreate()</code> and
+ initialized with the various functions described above.
+ <code>H5Dcreate()</code> returns a dataset handle for success
+ or negative for failure. The handle should eventually be
+ closed by calling <code>H5Dclose()</code> to release resources
+ it uses.
+
+ <br><br>
+ <dt><code>hid_t H5Dopen (hid_t <em>file_id</em>, const char
+ *<em>name</em>)</code>
+ <dd>An existing dataset can be opened for access by calling this
+ function. A dataset handle is returned for success or a
+ negative value is returned for failure. The handle should
+ eventually be closed by calling <code>H5Dclose()</code> to
+ release resources it uses.
+
+ <br><br>
+ <dt><code>herr_t H5Dclose (hid_t <em>dataset_id</em>)</code>
+ <dd>This function closes a dataset handle and releases all
+ resources it might have been using. The handle should not be
+ used in subsequent calls to the library.
+
+ <br><br>
+ <dt><code>herr_t H5Dextend (hid_t <em>dataset_id</em>,
+ hsize_t <em>dim</em>[])</code>
+ <dd>This function extends a dataset by increasing the size in
+ one or more dimensions. Not all datasets can be extended.
+ </dl>
+
+
+
+ <h2>8. Querying Constant or Persistent Properties</h2>
+
+ <p>Constant or persistent properties can be queried with a set of
+ three functions. Each function returns an identifier for a copy
+ of the requested properties. The identifier can be passed to
+ various functions which modify the underlying object to derive a
+ new object; the original dataset is completely unchanged. The
+ return values from these functions should be properly destroyed
+ when no longer needed.
+
+ <dl>
+ <dt><code>hid_t H5Dget_type (hid_t <em>dataset_id</em>)</code>
+ <dd>Returns an identifier for a copy of the dataset permanent
+ data type or negative for failure.
+
+ <dt><code>hid_t H5Dget_space (hid_t <em>dataset_id</em>)</code>
+ <dd>Returns an identifier for a copy of the dataset permanent
+ data space, which also contains information about the current
+ size of the dataset if the data set is extendable with
+ <code>H5Dextend()</code>.
+
+ <dt><code>hid_t H5Dget_create_plist (hid_t
+ <em>dataset_id</em>)</code>
+ <dd>Returns an identifier for a copy of the dataset creation
+ property list. The new property list is created by examining
+ various permanent properties of the dataset. This is mostly a
+ catch-all for everything but type and space.
+ </dl>
+
+
+
+ <h2>9. Setting Memory and Transfer Properties</h2>
+
+ <p>A dataset also has memory properties which describe memory
+ within the application, and transfer properties that control
+ various aspects of the I/O operations. The memory can have a
+ data type different than the permanent file data type (different
+ number types, different struct member offsets, different array
+ element orderings) and can also be a different size (memory is a
+ subset of the permanent dataset elements, or vice versa). The
+ transfer properties might provide caching hints or collective
+ I/O information. Therefore, each I/O operation must specify
+ memory and transfer properties.
+
+ <p>The memory properties are specified with <em>type_id</em> and
+ <em>space_id</em> arguments while the transfer properties are
+ specified with the <em>transfer_id</em> property list for the
+ <code>H5Dread()</code> and <code>H5Dwrite()</code> functions
+ (these functions are described below).
+
+ <dl>
+ <dt><code>herr_t H5Pset_buffer (hid_t <em>xfer_plist</em>,
+ size_t <em>max_buf_size</em>, void *<em>tconv_buf</em>, void
+ *<em>bkg_buf</em>)</code>
+ <dt><code>size_t H5Pget_buffer (hid_t <em>xfer_plist</em>, void
+ **<em>tconv_buf</em>, void **<em>bkg_buf</em>)</code>
+ <dd>Sets or retrieves the maximum size in bytes of the temporary
+ buffer used for data type conversion in the I/O pipeline. An
+ application-defined buffer can also be supplied as the
+ <em>tconv_buf</em> argument, otherwise a buffer will be
+ allocated and freed on demand by the library. A second
+ temporary buffer <em>bkg_buf</em> can also be supplied and
+ should be the same size as the <em>tconv_buf</em>. The
+ default values are 1MB for the maximum buffer size, and null
+ pointers for each buffer indicating that they should be
+ allocated on demand and freed when no longer needed. The
+ <code>H5Pget_buffer()</code> function returns the maximum
+ buffer size or zero on error.
+ </dl>
+
+ <p>If the maximum size of the temporary I/O pipeline buffers is
+ too small to hold the entire I/O request, then the I/O request
+ will be fragmented and the transfer operation will be strip
+ mined. However, certain restrictions apply to the strip
+ mining. For instance, when performing I/O on a hyperslab of a
+ simple data space the strip mining is in terms of the slowest
+ varying dimension. So if a 100x200x300 hyperslab is requested,
+ the temporary buffer must be large enough to hold a 1x200x300
+ sub-hyperslab.
+
+ <p>To prevent strip mining from happening, the application should
+ use <code>H5Pset_buffer()</code> to set the size of the
+ temporary buffer so it's large enough to hold the entire
+ request.
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example</h4></caption>
+ <tr>
+ <td>
+ <p>This example shows how to define a function that sets
+ a dataset transfer property list so that strip mining
+ does not occur. It takes an (optional) dataset transfer
+ property list, a dataset, a data space that describes
+ what data points are being transfered, and a data type
+ for the data points in memory. It returns a (new)
+ dataset transfer property list with the temporary
+ buffer size set to an appropriate value. The return
+ value should be passed as the fifth argument to
+ <code>H5Dread()</code> or <code>H5Dwrite()</code>.
+ <p><code><pre>
+ 1 hid_t
+ 2 disable_strip_mining (hid_t xfer_plist, hid_t dataset,
+ 3 hid_t space, hid_t mem_type)
+ 4 {
+ 5 hid_t file_type; /* File data type */
+ 6 size_t type_size; /* Sizeof larger type */
+ 7 size_t size; /* Temp buffer size */
+ 8 hid_t xfer_plist; /* Return value */
+ 9
+10 file_type = H5Dget_type (dataset);
+11 type_size = MAX(H5Tget_size(file_type), H5Tget_size(mem_type));
+12 H5Tclose (file_type);
+13 size = H5Sget_npoints(space) * type_size;
+14 if (xfer_plist&lt;0) xfer_plist = H5Pcreate (H5P_DATASET_XFER);
+15 H5Pset_buffer(xfer_plist, size, NULL, NULL);
+16 return xfer_plist;
+17 }
+ </pre></code>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+
+
+ <h2>10. Querying Memory or Transfer Properties</h2>
+
+ <p>Unlike constant and persistent properties, a dataset cannot be
+ queried for it's memory or transfer properties. Memory
+ properties cannot be queried because the application already
+ stores those properties separate from the buffer that holds the
+ raw data, and the buffer may hold multiple segments from various
+ datasets and thus have more than one set of memory properties.
+ The transfer properties cannot be queried from the dataset
+ because they're associated with the transfer itself and not with
+ the dataset (but one can call
+ <code>H5Pget_<em>property</em>()</code> to query transfer
+ properties from a tempalate).
+
+
+ <h2>11. Raw Data I/O</h2>
+
+ <p>All raw data I/O is accomplished through these functions which
+ take a dataset handle, a memory data type, a memory data space,
+ a file data space, transfer properties, and an application
+ memory buffer. They translate data between the memory data type
+ and space and the file data type and space. The data spaces can
+ be used to describe partial I/O operations.
+
+ <dl>
+ <dt><code>herr_t H5Dread (hid_t <em>dataset_id</em>, hid_t
+ <em>mem_type_id</em>, hid_t <em>mem_space_id</em>, hid_t
+ <em>file_space_id</em>, hid_t <em>xfer_plist_id</em>,
+ void *<em>buf</em>/*out*/)</code>
+ <dd>Reads raw data from the specified dataset into <em>buf</em>
+ converting from file data type and space to memory data type
+ and space.
+
+ <br><br>
+ <dt><code>herr_t H5Dwrite (hid_t <em>dataset_id</em>, hid_t
+ <em>mem_type_id</em>, hid_t <em>mem_space_id</em>, hid_t
+ <em>file_space_id</em>, hid_t <em>xfer_plist_id</em>,
+ const void *<em>buf</em>)</code>
+ <dd>Writes raw data from an application buffer <em>buf</em> to
+ the specified dataset converting from memory data type and
+ space to file data type and space.
+ </dl>
+
+
+ <p>In the name of sharability, the memory datatype must be
+ supplied. However, it can be the same identifier as was used to
+ create the dataset or as was returned by
+ <code>H5Dget_type()</code>; the library will not implicitly
+ derive memory data types from constant data types.
+
+ <p>For complete reads of the dataset one may supply
+ <code>H5S_ALL</code> as the argument for the file data space.
+ If <code>H5S_ALL</code> is also supplied as the memory data
+ space then no data space conversion is performed. This is a
+ somewhat dangerous situation since the file data space might be
+ different than what the application expects.
+
+
+
+ <h2>12. Examples</h2>
+
+ <p>The examples in this section illustrate some common dataset
+ practices.
+
+
+ <p>This example shows how to create a dataset which is stored in
+ memory as a two-dimensional array of native <code>double</code>
+ values but is stored in the file in Cray <code>float</code>
+ format using LZ77 compression. The dataset is written to the
+ HDF5 file and then read back as a two-dimensional array of
+ <code>float</code> values.
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example 1</h4></caption>
+ <tr>
+ <td>
+ <p><code><pre>
+ 1 hid_t file, data_space, dataset, properties;
+ 2 double dd[500][600];
+ 3 float ff[500][600];
+ 4 hsize_t dims[2], chunk_size[2];
+ 5
+ 6 /* Describe the size of the array */
+ 7 dims[0] = 500;
+ 8 dims[1] = 600;
+ 9 data_space = H5Screate_simple (2, dims);
+10
+11
+12 /*
+13 * Create a new file using with read/write access,
+14 * default file creation properties, and default file
+15 * access properties.
+16 */
+17 file = H5Fcreate ("test.h5", H5F_ACC_RDWR, H5P_DEFAULT,
+18 H5P_DEFAULT);
+19
+20 /*
+21 * Set the dataset creation plist to specify that
+22 * the raw data is to be partitioned into 100x100 element
+23 * chunks and that each chunk is to be compressed with
+24 * LZ77.
+25 */
+26 chunk_size[0] = chunk_size[1] = 100;
+27 properties = H5Pcreate (H5P_DATASET_CREATE);
+28 H5Pset_chunk (properties, 2, chunk_size);
+29 H5Pset_compression (properties, H5D_COMPRESS_LZ77);
+30
+31 /*
+32 * Create a new dataset within the file. The data type
+33 * and data space describe the data on disk, which may
+34 * be different than the format used in the application's
+35 * memory.
+36 */
+37 dataset = H5Dcreate (file, "dataset", H5T_CRAY_FLOAT,
+38 data_space, properties);
+39
+40 /*
+41 * Write the array to the file. The data type and data
+42 * space describe the format of the data in the `dd'
+43 * buffer. The raw data is translated to the format
+44 * required on disk defined above. We use default raw
+45 * data transfer properties.
+46 */
+47 H5Dwrite (dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
+48 H5P_DEFAULT, dd);
+49
+50 /*
+51 * Read the array as floats. This is similar to writing
+52 * data except the data flows in the opposite direction.
+53 */
+54 H5Dread (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL,
+55 H5P_DEFAULT, ff);
+56
+64 H5Dclose (dataset);
+65 H5Sclose (data_space);
+66 H5Pclose (properties);
+67 H5Fclose (file);
+ </pre></code>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>This example uses the file created in Example 1 and reads a
+ hyperslab of the 500x600 file dataset. The hyperslab size is
+ 100x200 and it is located beginning at element
+ &lt;200,200&gt;. We read the hyperslab into an 200x400 array in
+ memory beginning at element &lt;0,0&gt; in memory. Visually,
+ the transfer looks something like this:
+
+ <center>
+ <img alt="Raw Data Transfer" src="dataset_p1.gif">
+ </center>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example 2</h4></caption>
+ <tr>
+ <td>
+ <p><code><pre>
+ 1 hid_t file, mem_space, file_space, dataset;
+ 2 double dd[200][400];
+ 3 hssize_t offset[2];
+ 4 hsize size[2];
+ 5
+ 6 /*
+ 7 * Open an existing file and its dataset.
+ 8 */
+ 9 file = H5Fopen ("test.h5", H5F_ACC_RDONLY, H5P_DEFAULT);
+10 dataset = H5Dopen (file, "dataset");
+11
+12 /*
+13 * Describe the file data space.
+14 */
+15 offset[0] = 200; /*offset of hyperslab in file*/
+16 offset[1] = 200;
+17 size[0] = 100; /*size of hyperslab*/
+18 size[1] = 200;
+19 file_space = H5Dget_space (dataset);
+20 H5Sset_hyperslab (file_space, 2, offset, size);
+21
+22 /*
+23 * Describe the memory data space.
+24 */
+25 size[0] = 200; /*size of memory array*/
+26 size[1] = 400;
+27 mem_space = H5Screate_simple (2, size);
+28
+29 offset[0] = 0; /*offset of hyperslab in memory*/
+30 offset[1] = 0;
+31 size[0] = 100; /*size of hyperslab*/
+32 size[1] = 200;
+33 H5Sset_hyperslab (mem_space, 2, offset, size);
+34
+35 /*
+36 * Read the dataset.
+37 */
+38 H5Dread (dataset, H5T_NATIVE_DOUBLE, mem_space,
+39 file_space, H5P_DEFAULT, dd);
+40
+41 /*
+42 * Close/release resources.
+43 */
+44 H5Dclose (dataset);
+45 H5Sclose (mem_space);
+46 H5Sclose (file_space);
+47 H5Fclose (file);
+ </pre></code>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>If the file contains a compound data structure one of whose
+ members is a floating point value (call it "delta") but the
+ application is interested in reading an array of floating point
+ values which are just the "delta" values, then the application
+ should cast the floating point array as a struct with a single
+ "delta" member.
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=bottom><h4>Example 3</h4></caption>
+ <tr>
+ <td>
+ <p><code><pre>
+ 1 hid_t file, dataset, type;
+ 2 double delta[200];
+ 3
+ 4 /*
+ 5 * Open an existing file and its dataset.
+ 6 */
+ 7 file = H5Fopen ("test.h5", H5F_ACC_RDONLY, H5P_DEFAULT);
+ 8 dataset = H5Dopen (file, "dataset");
+ 9
+10 /*
+11 * Describe the memory data type, a struct with a single
+12 * "delta" member.
+13 */
+14 type = H5Tcreate (H5T_COMPOUND, sizeof(double));
+15 H5Tinsert (type, "delta", 0, H5T_NATIVE_DOUBLE);
+16
+17 /*
+18 * Read the dataset.
+19 */
+20 H5Dread (dataset, type, H5S_ALL, H5S_ALL,
+21 H5P_DEFAULT, dd);
+22
+23 /*
+24 * Close/release resources.
+25 */
+26 H5Dclose (dataset);
+27 H5Tclose (type);
+28 H5Fclose (file);
+ </pre></code>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <hr>
+ <address><a href="mailto:matzke@llnl.gov">Robb Matzke</a></address>
+<!-- Created: Tue Dec 2 09:17:09 EST 1997 -->
+<!-- hhmts start -->
+Last modified: Wed May 13 18:57:47 EDT 1998
+<!-- hhmts end -->
+ </body>
+</html>