Update URL documentation links to support site (#4781)

This commit is contained in:
Allen Byrne
2024-08-29 16:27:44 -05:00
committed by GitHub
parent 7e7d3b30e1
commit bca2806055
98 changed files with 944 additions and 1603 deletions
+1 -1
View File
@@ -9,4 +9,4 @@ authors:
website: 'https://www.hdfgroup.org'
repository-code: 'https://github.com/HDFGroup/hdf5'
url: 'https://www.hdfgroup.org/HDF5/'
repository-artifact: 'https://www.hdfgroup.org/downloads/hdf5/'
repository-artifact: 'https://support.hdfgroup.org/downloads/HDF5'
+6 -6
View File
@@ -48,17 +48,17 @@ HDF5 SNAPSHOTS, PREVIOUS RELEASES AND SOURCE CODE
--------------------------------------------
Full Documentation and Programming Resources for this HDF5 can be found at
https://portal.hdfgroup.org/documentation/index.html
https://support.hdfgroup.org/documentation/HDF5/index.html
Periodically development code snapshots are provided at the following URL:
https://gamma.hdfgroup.org/ftp/pub/outgoing/hdf5/snapshots/
https://github.com/HDFGroup/hdf5/releases
Source packages for current and previous releases are located at:
https://portal.hdfgroup.org/downloads/
https://support.hdfgroup.org/releases/hdf5/downloads/
Development code is available at our Github location:
https://github.com/HDFGroup/hdf5.git
+1 -1
View File
@@ -108,7 +108,7 @@ Periodically development code snapshots are provided at the following URL:
Source packages for current and previous releases are located at:
https://portal.hdfgroup.org/Downloads
https://support.hdfgroup.org/downloads/HDF5
Development code is available at our Github location:
+1 -1
View File
@@ -75,6 +75,6 @@ For more information see USING_CMake_Examples.txt in the install folder.
===========================================================================
Documentation for this release can be found at the following URL:
https://portal.hdfgroup.org/documentation/index.html#hdf5
https://support.hdfgroup.org/hdf5/@HDF5_PACKAGE_NAME@-@HDF5_PACKAGE_VERSION@/documentation/doxygen/index.html
Bugs should be reported to help@hdfgroup.org.
+36 -19
View File
@@ -64,9 +64,9 @@ H5Dwrite(..., dxpl_id, ...);
The following are two simple examples of using the parallel
compression feature:
[ph5_filtered_writes.c](https://github.com/HDFGroup/hdf5/blob/develop/HDF5Examples/C/H5PAR/ph5_filtered_writes.c)
[ph5_filtered_writes.c][u1]
[ph5_filtered_writes_no_sel.c](https://github.com/HDFGroup/hdf5/blob/develop/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c)
[ph5_filtered_writes_no_sel.c][u2]
The former contains simple examples of using the parallel
compression feature to write to compressed datasets, while the
@@ -79,7 +79,7 @@ participate in the collective write call.
## Multi-dataset I/O support
The parallel compression feature is supported when using the
multi-dataset I/O API routines ([H5Dwrite_multi](https://hdfgroup.github.io/hdf5/develop/group___h5_d.html#gaf6213bf3a876c1741810037ff2bb85d8)/[H5Dread_multi](https://hdfgroup.github.io/hdf5/develop/group___h5_d.html#ga8eb1c838aff79a17de385d0707709915)), but the
multi-dataset I/O API routines ([H5Dwrite_multi][u3]/[H5Dread_multi][u4]), but the
following should be kept in mind:
- Parallel writes to filtered datasets **must** still be collective,
@@ -99,7 +99,7 @@ following should be kept in mind:
## Incremental file space allocation support
HDF5's [file space allocation time](https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga85faefca58387bba409b65c470d7d851)
HDF5's [file space allocation time][u5]
is a dataset creation property that can have significant effects
on application performance, especially if the application uses
parallel HDF5. In a serial HDF5 application, the default file space
@@ -118,7 +118,7 @@ While this strategy has worked in the past, it has some noticeable
drawbacks. For one, the larger the chunked dataset being created,
the more noticeable overhead there will be during dataset creation
as all of the data chunks are being allocated in the HDF5 file.
Further, these data chunks will, by default, be [filled](https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga4335bb45b35386daa837b4ff1b9cd4a4)
Further, these data chunks will, by default, be [filled][u6]
with HDF5's default fill data value, leading to extraordinary
dataset creation overhead and resulting in pre-filling large
portions of a dataset that the application might have been planning
@@ -126,12 +126,12 @@ to overwrite anyway. Even worse, there will be more initial overhead
from compressing that fill data before writing it out, only to have
it read back in, unfiltered and modified the first time a chunk is
written to. In the past, it was typically suggested that parallel
HDF5 applications should use [H5Pset_fill_time](https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga6bd822266b31f86551a9a1d79601b6a2)
HDF5 applications should use [H5Pset_fill_time][u7]
with a value of `H5D_FILL_TIME_NEVER` in order to disable writing of
the fill value to dataset chunks, but this isn't ideal if the
application actually wishes to make use of fill values.
With [improvements made](https://www.hdfgroup.org/2022/03/parallel-compression-improvements-in-hdf5-1-13-1/)
With [improvements made][u8]
to the parallel compression feature for the HDF5 1.13.1 release,
"incremental" file space allocation is now the default for datasets
created in parallel *only if they have filters applied to them*.
@@ -154,7 +154,7 @@ optimal performance out of the parallel compression feature.
### Begin with a good chunking strategy
[Starting with a good chunking strategy](https://portal.hdfgroup.org/documentation/hdf5-docs/chunking_in_hdf5.html)
[Starting with a good chunking strategy][u9]
will generally have the largest impact on overall application
performance. The different chunking parameters can be difficult
to fine-tune, but it is essential to start with a well-performing
@@ -166,7 +166,7 @@ chosen chunk size becomes a very important factor when compression
is involved, as data chunks have to be completely read and
re-written to perform partial writes to the chunk.
[Improving I/O performance with HDF5 compressed datasets](https://docs.hdfgroup.org/archive/support/HDF5/doc/TechNotes/TechNote-HDF5-ImprovingIOPerformanceCompressedDatasets.pdf)
[Improving I/O performance with HDF5 compressed datasets][u10]
is a useful reference for more information on getting good
performance when using a chunked dataset layout.
@@ -220,14 +220,14 @@ chunks to end up at addresses in the file that do not align
well with the underlying file system, possibly leading to
poor performance. As an example, Lustre performance is generally
good when writes are aligned with the chosen stripe size.
The HDF5 application can use [H5Pset_alignment](https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
The HDF5 application can use [H5Pset_alignment][u11]
to have a bit more control over where objects in the HDF5
file end up. However, do note that setting the alignment
of objects generally wastes space in the file and has the
potential to dramatically increase its resulting size, so
caution should be used when choosing the alignment parameters.
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
[H5Pset_alignment][u11]
has two parameters that control the alignment of objects in
the HDF5 file, the "threshold" value and the alignment
value. The threshold value specifies that any object greater
@@ -264,19 +264,19 @@ in a file, this can create significant amounts of free space
in the file over its lifetime and eventually cause performance
issues.
An HDF5 application can use [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/develop/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
An HDF5 application can use [H5Pset_file_space_strategy][u12]
with a value of `H5F_FSPACE_STRATEGY_PAGE` to enable the paged
aggregation feature, which can accumulate metadata and raw
data for dataset data chunks into well-aligned, configurably
sized "pages" for better performance. However, note that using
the paged aggregation feature will cause any setting from
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
[H5Pset_alignment][u11]
to be ignored. While an application should be able to get
comparable performance effects by [setting the size of these pages](https://hdfgroup.github.io/hdf5/develop/group___f_c_p_l.html#gad012d7f3c2f1e1999eb1770aae3a4963) to be equal to the value that
would have been set for [H5Pset_alignment](https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a),
comparable performance effects by [setting the size of these pages][u13]
to be equal to the value that would have been set for [H5Pset_alignment][u11],
this may not necessarily be the case and should be studied.
Note that [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/develop/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
Note that [H5Pset_file_space_strategy][u12]
has a `persist` parameter. This determines whether or not the
file free space manager should include extra metadata in the
HDF5 file about free space sections in the file. If this
@@ -300,12 +300,12 @@ hid_t file_id = H5Fcreate("file.h5", H5F_ACC_TRUNC, fcpl_id, fapl_id);
While the parallel compression feature requires that the HDF5
application set and maintain collective I/O at the application
interface level (via [H5Pset_dxpl_mpio](https://hdfgroup.github.io/hdf5/develop/group___d_x_p_l.html#ga001a22b64f60b815abf5de8b4776f09e)),
interface level (via [H5Pset_dxpl_mpio][u14]),
it does not require that the actual MPI I/O that occurs at
the lowest layers of HDF5 be collective; independent I/O may
perform better depending on the application I/O patterns and
parallel file system performance, among other factors. The
application may use [H5Pset_dxpl_mpio_collective_opt](https://hdfgroup.github.io/hdf5/develop/group___d_x_p_l.html#gacb30d14d1791ec7ff9ee73aa148a51a3)
application may use [H5Pset_dxpl_mpio_collective_opt][u15]
to control this setting and see which I/O method provides the
best performance.
@@ -318,7 +318,7 @@ H5Dwrite(..., dxpl_id, ...);
### Runtime HDF5 Library version
An HDF5 application can use the [H5Pset_libver_bounds](https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gacbe1724e7f70cd17ed687417a1d2a910)
An HDF5 application can use the [H5Pset_libver_bounds][u16]
routine to set the upper and lower bounds on library versions
to use when creating HDF5 objects. For parallel compression
specifically, setting the library version to the latest available
@@ -332,3 +332,20 @@ H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
hid_t file_id = H5Fcreate("file.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
...
```
[u1]: https://github.com/HDFGroup/hdf5/blob/develop/HDF5Examples/C/H5PAR/ph5_filtered_writes.c
[u2]: https://github.com/HDFGroup/hdf5/blob/develop/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c
[u3]: https://hdfgroup.github.io/hdf5/develop/group___h5_d.html#gaf6213bf3a876c1741810037ff2bb85d8
[u4]: https://hdfgroup.github.io/hdf5/develop/group___h5_d.html#ga8eb1c838aff79a17de385d0707709915
[u5]: https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga85faefca58387bba409b65c470d7d851
[u6]: https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga4335bb45b35386daa837b4ff1b9cd4a4
[u7]: https://hdfgroup.github.io/hdf5/develop/group___d_c_p_l.html#ga6bd822266b31f86551a9a1d79601b6a2
[u8]: https://support.hdfgroup.org/documentation/HDF5/parallel-compression-improvements-in-hdf5-1-13-1
[u9]: https://support.hdfgroup.org/documentation/HDF5/chunking_in_hdf5.html
[u10]: https://support.hdfgroup.org/documentation/HDF5/technotes/TechNote-HDF5-ImprovingIOPerformanceCompressedDatasets.pdf
[u11]: https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a
[u12]: https://hdfgroup.github.io/hdf5/develop/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70
[u13]: https://hdfgroup.github.io/hdf5/develop/group___f_c_p_l.html#gad012d7f3c2f1e1999eb1770aae3a4963
[u14]: https://hdfgroup.github.io/hdf5/develop/group___d_x_p_l.html#ga001a22b64f60b815abf5de8b4776f09e
[u15]: https://hdfgroup.github.io/hdf5/develop/group___d_x_p_l.html#gacb30d14d1791ec7ff9ee73aa148a51a3
[u16]: https://hdfgroup.github.io/hdf5/develop/group___f_a_p_l.html#gacbe1724e7f70cd17ed687417a1d2a910
+10 -11
View File
@@ -4,17 +4,16 @@ ALIASES += THG="The HDF Group"
# Default URLs (Note that md files do not use any aliases)
################################################################################
# Default URL for HDF Group Files
ALIASES += HDFURL="docs.hdfgroup.org/hdf5"
ALIASES += HDFURL="support.hdfgroup.org"
# URL for archived files
ALIASES += ARCURL="docs.hdfgroup.org/archive/support/HDF5/doc"
ALIASES += ARCURL="\HDFURL/archive/support/HDF5/doc"
# URL for RFCs
ALIASES += RFCURL="docs.hdfgroup.org/hdf5/rfc"
ALIASES += RFCURL="\HDFURL/hdf5/rfc"
# URL for documentation
ALIASES += DSPURL="portal.hdfgroup.org/display/HDF5"
ALIASES += DOCURL="portal.hdfgroup.org/documentation/hdf5-docs"
ALIASES += DOCURL="\HDFURL/releases/hdf5/documentation"
# URL for downloads
ALIASES += DWNURL="portal.hdfgroup.org/downloads"
ALIASES += AEXURL="support.hdfgroup.org/ftp/HDF5/examples"
ALIASES += DWNURL="\HDFURL/releases/hdf5/downloads"
ALIASES += AEXURL="\HDFURL/archive/support/ftp/HDF5/examples"
# doxygen subdir (develop, v1_14)
ALIASES += DOXURL="hdfgroup.github.io/hdf5/develop"
#branch name (develop, hdf5_1_14)
@@ -259,13 +258,13 @@ ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_co
ALIASES += ref_cons_semantics="<a href=\"https://\RFCURL/RFC%20PHDF5%20Consistency%20Semantics%20MC%20120328.docx.pdf\">Enabling a Strict Consistency Semantics Model in Parallel HDF5</a>"
ALIASES += ref_file_image_ops="<a href=\"https://\RFCURL/HDF5FileImageOperations.pdf\">HDF5 File Image Operations</a>"
ALIASES += ref_filter_pipe="<a href=\"https://\DSPURL/HDF5+Data+Flow+Pipeline+for+H5Dread\">Data Flow Pipeline for H5Dread()</a>"
ALIASES += ref_filter_pipe="<a href=\"https://\DOCURL/HDF5+Data+Flow+Pipeline+for+H5Dread\">Data Flow Pipeline for H5Dread()</a>"
ALIASES += ref_group_impls="<a href=\"https://\DOXURL/group___h5_g.html\">Group implementations in HDF5</a>"
ALIASES += ref_h5lib_relver="<a href=\"https://\ARCURL/TechNotes/Version.html\">HDF5 Library Release Version Numbers</a>"
ALIASES += ref_mdc_in_hdf5="<a href=\"https://\DSPURL/Metadata+Caching+in+HDF5\">Metadata Caching in HDF5</a>"
ALIASES += ref_mdc_logging="<a href=\"https://\DSPURL/H5F_START_MDC_LOGGING\">Metadata Cache Logging</a>"
ALIASES += ref_mdc_in_hdf5="<a href=\"https://\DOCURL/Metadata+Caching+in+HDF5\">Metadata Caching in HDF5</a>"
ALIASES += ref_mdc_logging="<a href=\"https://\DOCURL/H5F_START_MDC_LOGGING\">Metadata Cache Logging</a>"
ALIASES += ref_news_112="<a href=\"https://\DOCURL/release_specifics/new_features_1_12.html\">New Features in HDF5 Release 1.12</a>"
ALIASES += ref_h5ocopy="<a href=\"https://\DSPURL/Copying+Committed+Datatypes+with+H5Ocopy\">Copying Committed Datatypes with H5Ocopy()</a>"
ALIASES += ref_h5ocopy="<a href=\"https://\DOCURL/Copying+Committed+Datatypes+with+H5Ocopy\">Copying Committed Datatypes with H5Ocopy()</a>"
ALIASES += ref_sencode_fmt_change="<a href=\"https://\RFCURL/H5Sencode_format.docx.pdf\">RFC H5Sencode() / H5Sdecode() Format Change</a>"
ALIASES += ref_vlen_strings="\Emph{Creating variable-length string datatypes}"
ALIASES += ref_vol_doc="VOL documentation"
+1 -1
View File
@@ -83,7 +83,7 @@ as a general reference.
All custom commands for this project are located in the
<a href="https://\SRCURL/doxygen/aliases"><tt>aliases</tt></a>
file in the <a href="https://github.com/HDFGroup/hdf5/tree/develop/doxygen"><tt>doxygen</tt></a>
file in the <a href="https://\SRCURL/doxygen"><tt>doxygen</tt></a>
subdirectory of the <a href="https://github.com/HDFGroup/hdf5">main HDF5 repo</a>.
The custom commands are grouped in sections. Find a suitable section for your command or
-2
View File
@@ -1,7 +1,5 @@
/** \page DDLBNF110 DDL in BNF through HDF5 1.10
\todo Revise this & break it up!
\section intro110 Introduction
This document contains the data description language (DDL) for an HDF5 file. The
-2
View File
@@ -1,7 +1,5 @@
/** \page DDLBNF112 DDL in BNF for HDF5 1.12 through HDF5 1.14.3
\todo Revise this & break it up!
\section intro112 Introduction
This document contains the data description language (DDL) for an HDF5 file. The
-2
View File
@@ -1,7 +1,5 @@
/** \page DDLBNF114 DDL in BNF for HDF5 1.14.4 and above
\todo Revise this & break it up!
\section intro114 Introduction
This document contains the data description language (DDL) for an HDF5 file. The
+71 -70
View File
@@ -30,7 +30,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_alloc.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_alloc.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Alloc.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Alloc.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_alloc.h5</td>
@@ -43,7 +43,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_checksum.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_checksum.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Checksum.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Checksum.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_checksum.h5</td>
@@ -56,7 +56,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_chunk.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_chunk.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Chunk.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Chunk.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_chunk.h5</td>
@@ -69,7 +69,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_compact.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_compact.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Compact.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Compact.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_compact.h5</td>
@@ -82,7 +82,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_extern.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_extern.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_External.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_External.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_External.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_extern.h5</td>
@@ -95,7 +95,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_fillval.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_fillval.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_FillValue.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_FillValue.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_fillval.h5</td>
@@ -108,7 +108,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_gzip.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_gzip.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Gzip.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Gzip.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_gzip.h5</td>
@@ -121,7 +121,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_hyper.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_hyper.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Hyperslab.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Hyperslab.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_hyper.h5</td>
@@ -134,7 +134,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_nbit.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_nbit.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Nbit.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Nbit.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_nbit.h5</td>
@@ -147,7 +147,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_rdwr.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_rdwr.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_ReadWrite.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_ReadWrite.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_rdwrc.h5</td>
@@ -160,7 +160,7 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_shuffle.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Shuffle.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Shuffle.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_shuffle.h5</td>
@@ -173,7 +173,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_sofloat.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Sofloat.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Sofloat.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_sofloat.h5</td>
@@ -186,7 +186,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_soint.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_soint.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Soint.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Soint.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_soint.h5</td>
@@ -199,7 +199,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_szip.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_szip.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Szip.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Szip.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_szip.h5</td>
@@ -212,7 +212,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_transform.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_transform.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Transform.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Transform.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_transform.h5</td>
@@ -225,7 +225,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimadd.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedAdd.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedAdd.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_unlimadd.h5</td>
@@ -238,7 +238,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedGzip.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedGzip.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_unlimgzip.h5</td>
@@ -251,7 +251,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimmod.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_unlimmod.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedMod.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedMod.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_d_unlimmod.h5</td>
@@ -275,7 +275,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_compact.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_compact.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Compact.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Compact.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_compact.h5</td>
@@ -289,7 +289,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_corder.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_corder.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Corder.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Corder.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_corder.h5</td>
@@ -302,7 +302,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_create.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_create.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Create.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Create.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_create.h5</td>
@@ -315,7 +315,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_intermediate.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Intermediate.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Intermediate.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_intermediate.h5</td>
@@ -328,7 +328,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_iterate.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Iterate.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Iterate.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_iterate.h5</td>
@@ -341,7 +341,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_phase.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_phase.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Phase.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Phase.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_phase.h5</td>
@@ -366,7 +366,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_visit.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Visit.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Visit.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_g_visit.h5</td>
@@ -388,9 +388,9 @@ FORTRAN
<td>Read / Write Array (Attribute)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_arrayatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_arrayatt.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_arrayatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ArrayAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ArrayAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_arrayatt.h5</td>
@@ -401,9 +401,9 @@ FORTRAN
<td>Read / Write Array (Dataset)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_array.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_array.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_array_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Array.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Array.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_array.h5</td>
@@ -414,9 +414,9 @@ FORTRAN
<td>Read / Write Bitfield (Attribute)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_bitatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bitatt.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bitatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_BitAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_BitAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_bitatt.h5</td>
@@ -427,9 +427,9 @@ FORTRAN
<td>Read / Write Bitfield (Dataset)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_bit.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bit.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bit_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Bit.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Bit.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_bit.h5</td>
@@ -440,9 +440,9 @@ FORTRAN
<td>Read / Write Compound (Attribute)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpdatt.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpdatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_CompoundAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_CompoundAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_cmpdatt.h5</td>
@@ -453,9 +453,9 @@ FORTRAN
<td>Read / Write Compound (Dataset)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cmpd.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpd.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpd_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Compound.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Compound.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_cmpd.h5</td>
@@ -468,7 +468,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_commit.c">C</a>
FORTRAN
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Commit.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Commit.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_commit.h5</td>
@@ -533,7 +533,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_floatatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_floatatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_FloatAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_FloatAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_floatatt.h5</td>
@@ -546,7 +546,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_float.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_float_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Float.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Float.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_float.h5</td>
@@ -559,7 +559,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_intatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_intatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_IntegerAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_IntegerAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_intatt.h5</td>
@@ -572,7 +572,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_int.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_int_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Integer.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Integer.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_int.h5</td>
@@ -585,7 +585,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_objrefatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_objrefatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReferenceAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReferenceAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_objrefatt.h5</td>
@@ -598,7 +598,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_objref.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_objref_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReference.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReference.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_objref.h5</td>
@@ -611,7 +611,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_opaqueatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_OpaqueAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_OpaqueAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_opaqueatt.h5</td>
@@ -624,7 +624,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_opaque.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_opaque_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Opaque.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Opaque.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_opaque.h5</td>
@@ -637,7 +637,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_regrefatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_regrefatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReferenceAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReferenceAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_regrefatt.h5</td>
@@ -650,7 +650,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_regref.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReference.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReference.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_regref.h5</td>
@@ -661,9 +661,9 @@ FORTRAN
<td>Read / Write String (Attribute)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_stringatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_stringatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_stringCatt_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_StringAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_StringAttribute.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_stringatt.h5</td>
@@ -676,7 +676,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_string.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_string_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_String.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_String.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_String.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_string.h5</td>
@@ -709,8 +709,7 @@ FORTRAN
<td>Read / Write Variable Length String (Attribute)</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t__F03.F90">FORTRAN</a>
Java JavaObj MATLAB PyHigh PyLow
FORTRAN Java JavaObj MATLAB PyHigh PyLow
</td>
<td>h5ex_t_vlstringatt.h5</td>
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlstringatt.tst">h5ex_t_vlstringatt.tst</a></td>
@@ -722,7 +721,7 @@ FORTRAN
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlstring.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_vlstring_F03.F90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_VLString.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_VLString.java">JavaObj</a>
MATLAB PyHigh PyLow
</td>
<td>h5ex_t_vlstring.h5</td>
@@ -843,7 +842,7 @@ FORTRAN
<td>Create/Read/Write an Attribute</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5AttributeCreate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateAttribute.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_CreateAttribute.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5AttributeCreate.txt">HDF5AttributeCreate.txt</a></td>
</tr>
@@ -851,7 +850,7 @@ FORTRAN
<td>Create Datasets</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5DatasetCreate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateDataset.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_CreateDataset.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5DatasetCreate.txt">HDF5DatasetCreate.txt</a></td>
</tr>
@@ -859,7 +858,7 @@ FORTRAN
<td>Read/Write Datasets</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5DatasetRead.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_ReadWrite.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_ReadWrite.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5DatasetRead.txt">HDF5DatasetRead.txt</a></td>
</tr>
@@ -867,7 +866,7 @@ FORTRAN
<td>Create an Empty File</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateFile.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_CreateFile.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5FileCreate.txt">HDF5FileCreate.txt</a></td>
</tr>
@@ -883,9 +882,9 @@ FORTRAN
<td>Create Groups</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroup.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroup.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5GroupCreate.java">HDF5GroupCreate.txt</a></td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5GroupCreate.txt">HDF5GroupCreate.txt</a></td>
</tr>
<tr>
<td>Select a Subset of a Dataset</td>
@@ -899,9 +898,9 @@ FORTRAN
<td>Create Two Datasets Within Groups</td>
<td>
<a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java">Java</a>
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroupDataset.java">JavaObj</a>
<a href="https://\HVURL/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroupDataset.java">JavaObj</a>
</td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5GroupDatasetCreate.java">HDF5GroupDatasetCreate.txt</a></td>
<td><a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/tfiles/110/HDF5GroupDatasetCreate.txt">HDF5GroupDatasetCreate.txt</a></td>
</tr>
</table>
@@ -918,7 +917,7 @@ FORTRAN
<td>Creating and Accessing a File</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_file_create.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_file_create.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_file_create.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -928,7 +927,7 @@ FORTRAN
<td>Creating and Accessing a Dataset</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_dataset.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_dataset.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_dataset.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -938,7 +937,7 @@ FORTRAN
<td>Writing and Reading Contiguous Hyperslabs</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_row.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_row.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_row.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -948,7 +947,7 @@ FORTRAN
<td>Writing and Reading Regularly Spaced Data Hyperslabs</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_col.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_col.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_col.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -958,7 +957,7 @@ FORTRAN
<td>Writing and Reading Pattern Hyperslabs</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_pattern.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_pattern.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_pattern.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -968,7 +967,7 @@ FORTRAN
<td>Writing and Reading Chunk Hyperslabs</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_chunk.c">C</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_chunk.f90">FORTRAN</a>
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_chunk.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
@@ -978,7 +977,8 @@ FORTRAN
<td>Using the Subfiling VFD to Write a File Striped Across Multiple Subfiles</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_subfiling.c">C</a>
FORTRAN MATLAB PyHigh PyLow
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_subfiling.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
<td>ph5_.tst</td>
@@ -996,7 +996,8 @@ FORTRAN
<td>Collectively Write Datasets with Filters and Not All Ranks have Data</td>
<td>
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c">C</a>
FORTRAN MATLAB PyHigh PyLow
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_filtered_writes_no_sel.f90">FORTRAN</a>
MATLAB PyHigh PyLow
</td>
<td>ph5_.h5</td>
<td>ph5_.tst</td>
+2 -2
View File
@@ -38,7 +38,7 @@ Step by step instructions for learning HDF5 that include programming examples
\subsection subsec_learn_tutor The HDF Group Tutorials and Examples
These tutorials and examples are available for learning about the HDF5 High Level APIs, tools,
Parallel HDF5, and the HDF5-1.10 VDS and SWMR new features:
Parallel HDF5, and the VDS and SWMR features:
<table>
<tr>
<td style="background-color:#F5F5F5">
@@ -68,7 +68,7 @@ A brief introduction to Parallel HDF5. If you are new to HDF5 please see the @re
</tr>
<tr>
<td style="background-color:#F5F5F5">
HDF5-1.10 New Features
New Features since HDF5-1.10
</td>
<td>
\li \ref VDS
+3 -3
View File
@@ -262,7 +262,7 @@ FORTRAN routines are similar; they begin with “h5*” and end with “_f”.
<li>
Java routines are similar; the routine names begin with “H5*” and are prefixed with “H5.” as the class. Constants are
in the HDF5Constants class and are prefixed with "HDF5Constants.". The function arguments
are usually similar, @see @ref HDF5LIB
are usually similar, see @ref HDF5LIB
</li>
</ul>
For example:
@@ -616,8 +616,8 @@ on the <a href="http://hdfeos.org/">HDF-EOS Tools and Information Center</a> pag
\section secHDF5Examples Examples
\li \ref LBExamples
\li \ref ExAPI
\li <a href="https://github.com/HDFGroup/hdf5/tree/develop/HDF5Examples">Examples in the Source Code</a>
\li <a href="https://\DSPURL/Other+Examples">Other Examples</a>
\li <a href="https://\SRCURL/HDF5Examples">Examples in the Source Code</a>
\li <a href="https://\DOCURL/Other+Examples">Other Examples</a>
\section secHDF5ExamplesCompile How To Compile
For information on compiling in C, C++ and Fortran, see: \ref LBCompiling
+4 -4
View File
@@ -59,7 +59,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c
<tr>
<td>Create a file
</td>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrp.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_crtgrp.py">Python</a>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrp.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_crtdat.py">Python</a>
</td>
<td>
</td>
@@ -91,7 +91,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c
<tr>
<td>Create a group
</td>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrp.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_crtgrp.py">Python</a>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrp.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_links.py">Python</a>
</td>
<td>
</td>
@@ -107,7 +107,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c
<tr>
<td>Create datasets in a group
</td>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrpd.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_crtgrpd.py">Python</a>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_crtgrpd.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp">C++</a> <a href="https://\SRCURL/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java">Java</a> <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_links.py">Python</a>
</td>
<td>
</td>
@@ -131,7 +131,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c
<tr>
<td>Create a chunked and compressed dataset
</td>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_cmprss.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp">C++</a> Java <a href="https://\SRCURL/HDF5Examples/PYTHON/h5_cmprss.py">Python</a>
<td><a href="https://\SRCURL/HDF5Examples/C/TUTR/h5_cmprss.c">C</a> <a href="https://\SRCURL/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90">Fortran</a> <a href="https://\SRCURL/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp">C++</a> Java Python
</td>
<td>
</td>
+9 -7
View File
@@ -183,7 +183,7 @@ to a new with a new layout.
\section secLBDsetLayoutSource Sources of Information
<a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a>
(See the documentation on <a href="https://\DOCURL/advanced_topics_list.html">Advanced Topics in HDF5</a>)
\see \ref sec_plist in the HDF5 \ref UG.
see \ref sec_plist in the HDF5 \ref UG.
<hr>
Previous Chapter \ref LBPropsList - Next Chapter \ref LBExtDset
@@ -251,7 +251,7 @@ The following operations are required in order to create a compressed dataset:
\li Create the dataset.
\li Close the dataset creation property list and dataset.
For more information on compression, see the FAQ question on <a href="https://confluence.hdfgroup.org/display/HDF5/Using+Compression+in+HDF5">Using Compression in HDF5</a>.
For more information on compression, see the FAQ question on <a href="https://\DOCURL/Using+Compression+in+HDF5">Using Compression in HDF5</a>.
\section secLBComDsetProg Programming Example
@@ -720,7 +720,7 @@ Previous Chapter \ref LBQuiz - Next Chapter \ref LBCompiling
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
/** @page LBCompiling Compiling HDF5 Applications
@page LBCompiling Compiling HDF5 Applications
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
<hr>
@@ -969,13 +969,13 @@ or on WINDOWS you may need to add the path to the bin folder to PATH.
\subsection subsecLBCompilingCMakeScripts CMake Scripts for Building Applications
Simple scripts are provided for building applications with different languages and options.
See <a href="https://confluence.hdfgroup.org/display/support/CMake+Scripts+for+Building+Applications">CMake Scripts for Building Applications</a>.
See <a href="https://\DOCURL/CMake+Scripts+for+Building+Applications">CMake Scripts for Building Applications</a>.
For a more complete script (and to help resolve issues) see the script provided with the HDF5 Examples project.
\subsection subsecLBCompilingCMakeExamples HDF5 Examples
The installed HDF5 can be verified by compiling the HDF5 Examples project, included with the CMake built HDF5 binaries
in the share folder or you can go to the <a href="https://github.com/HDFGroup/hdf5-examples">HDF5 Examples</a> github repository.
in the share folder or you can go to the <a href="https://\SRCURL/HDF5Examples">HDF5 Examples</a> in the HDF5 github repository.
Go into the share directory and follow the instructions in USING_CMake_examples.txt to build the examples.
@@ -1035,9 +1035,11 @@ Previous Chapter \ref LBQuizAnswers - Next Chapter \ref LBTraining
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
*/
@page LBTraining Training Videos
/ref LBTraining
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
<a href="https://\DOCURL/Training+Videos">Training Videos</a>
<hr>
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+2 -2
View File
@@ -7,7 +7,7 @@ This tutorial enables you to get a feel for HDF5 by using the HDFView browser. I
any programming experience.
\section sec_learn_hv_install HDFView Installation
\li Download and install HDFView. It can be downloaded from the <a href="https://\DWNURL/hdfview/hdfview3_3_1.html">Download HDFView</a> page.
\li Download and install HDFView. It can be downloaded from the <a href="https://\DWNURL/hdfview/v3_3_2/index.html">Download HDFView</a> page.
\li Obtain the <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> text file, used in the tutorial.
\section sec_learn_hv_begin Begin Tutorial
@@ -246,7 +246,7 @@ in the file).
Please note that the chunk sizes used in this topic are for demonstration purposes only. For
information on chunking and specifying an appropriate chunk size, see the
<a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a> documentation.
<a href="https://\DOCURL/advanced_topics/chunking_in_hdf5.html">Chunking in HDF5</a> documentation.
Also see the HDF5 Tutorial topic on \ref secLBComDsetCreate.
<ul>
+3 -3
View File
@@ -9,19 +9,19 @@ the entire HDF5 ecosystem in one place, and you should also consult the document
sets of the many outstanding community projects.
For a first contact with HDF5, the best place is to have a look at the \link
GettingStarted getting started\endlink page that shows you how to write and
GettingStarted getting started \endlink page that shows you how to write and
compile your first program with HDF5.
The \b main \b documentation is organized by documentation flavor. Most
technical documentation consists to varying degrees of information related to
<em>tasks</em>, <em>concepts</em>, or <em>reference</em> material. As its title
suggests, the \link RM Reference Manual\endlink is 100% reference material,
suggests, the \link RM Reference Manual \endlink is 100% reference material,
while the \link Cookbook \endlink is focused on tasks. The different guide-type
documents cover a mix of tasks, concepts, and reference, to help a specific
<em>audience</em> succeed.
\par Offline reading
You can <a href="https://github.com/HDFGroup/hdf5/releases/download/snapshot/snapshot.doxygen.zip">download</a> it as an archive for offline reading.
You can <a href="https://\DWNURL/v1_14/v1_14_4/downloads/hdf5-1.14.4-3.doxygen.zip">download</a> it as an archive for offline reading.
\par ToDo List
There is plenty of <a href="./todo.html">unfinished business</a>.
+1 -1
View File
@@ -17,7 +17,7 @@
\li \ref IMG
\li \ref TBL
\li <a href="https://support.hdfgroup.org/HDF5/doc/HL/H5DS_Spec.pdf">
\li <a href="https://\DOCURL/HL/H5DS_Spec.pdf">
HDF5 Dimension Scale Specification</a>
*/
+253 -16
View File
@@ -4,10 +4,10 @@
\li \ref APPDBG
\li \ref FMTDISC
\li \ref FILEIMGOPS
\li \ref FILTER
\li \ref subsubsec_dataset_transfer_filter
\li \ref IOFLOW
\li \ref TNMDC
\li \ref MT
\li \ref thread-safe-lib
\li \ref SWMR
\li \ref VDS
\li \ref RELVERSION
@@ -17,12 +17,6 @@
*/
/** \page MT HDF5 Thread Safe library
\htmlinclude ThreadSafeLibrary.html
*/
/** \page IOFLOW HDF5 Raw I/O Flow Notes
\htmlinclude IOFlow.html
@@ -53,12 +47,6 @@
*/
/** \page FILTER HDF5 Filters
\htmlinclude Filters.html
*/
/** \page APPDBG Debugging HDF5 Applications
\htmlinclude DebuggingHDF5Applications.html
@@ -67,13 +55,262 @@
/** \page SWMR Introduction to Single-Writer/Multiple-Reader (SWMR)
\htmlinclude intro_SWMR.html
\section sec_swmr_intro Introduction to SWMR
The Single-Writer / Multiple-Reader (SWMR) feature enables multiple processes to read an HDF5 file
while it is being written to (by a single process) without using locks or requiring communication between processes.
<img src=tutr-swmr1.png alt="tutr-swmr1.png" width=500>
All communication between processes must be performed via the HDF5 file. The HDF5 file under SWMR access must
reside on a system that complies with POSIX write() semantics.
The basic engineering challenge for this to work was to ensure that the readers of an HDF5 file always
see a coherent (though possibly not up to date) HDF5 file.
The issue is that when writing data there is information in the metadata cache in addition to the physical file on disk:
<img src=tutr-swmr2.png alt="tutr-swmr2.png" width=500>
However, the readers can only see the state contained in the physical file:
<img src=tutr-swmr3.png alt="tutr-swmr3.png" width=500>
The SWMR solution implements dependencies on when the metadata can be flushed to the file. This ensures that metadata cache
flush operations occur in the proper order, so that there will never be internal file pointers in the physical file
that point to invalid (unflushed) file addresses.
A beneficial side effect of using SWMR access is better fault tolerance. It is more difficult to corrupt a file when using SWMR.
\subsection subsec_swmr_doc Documentation
\subsubsection subsubsec_swmr_doc_guide User Guide
<a href="https://docs.hdfgroup.org/documentation/HDF5/features/SWMR/HDF5_SWMR_Users_Guide.pdf">SWMR User Guide</a>
\subsubsection subsubsec_swmr_doc_apis HDF5 Library APIs
<ul>
<li>#H5Fstart_swmr_write — Enables SWMR writing mode for a file</li>
<li>#H5DOappend — Appends data to a dataset along a specified dimension</li>
<li>#H5Pset_object_flush_cb — Sets a callback function to invoke when an object flush occurs in the file</li>
<li>#H5Pget_object_flush_cb — Retrieves the object flush property values from the file access property list</li>
<li>#H5Odisable_mdc_flushes — Prevents metadata entries for an HDF5 object from being flushed from the metadata cache to storage</li>
<li>#H5Oenable_mdc_flushes — Enables flushing of dirty metadata entries from a file’s metadata cache</li>
<li>#H5Oare_mdc_flushes_disabled — Determines if an HDF5 object has had flushes of metadata entries disabled</li>
</ul>
\subsubsection subsubsec_swmr_doc_tools Tools
\li h5watch — Outputs new records appended to a dataset as the dataset grows
\li h5format_convert — Converts the layout format version and chunked indexing types of datasets created with
HDF5-1.10 so that applications built with HDF5-1.8 can access them
\li h5clear — Clears superblock status_flags field, removes metadata cache image, prints EOA and EOF, or sets EOA of a file
\subsubsection subsubsec_swmr_doc_design Design Documents
\subsection subsec_swmr_model Programming Model
Please be aware that the SWMR feature requires that an HDF5 file be created with the latest file format. See
#H5Pset_libver_bounds for more information.
To use SWMR follow the the general programming model for creating and accessing HDF5 files and objects along with the steps described below.
\subsubsection subsubsec_swmr_model_writer SWMR Writer
The SWMR writer either opens an existing file and objects or creates them as follows.
Open an existing file:
Call #H5Fopen using the #H5F_ACC_SWMR_WRITE flag.
Begin writing datasets.
Periodically flush data.
Create a new file:
Call #H5Fcreate using the latest file format.
Create groups, datasets and attributes, and then close the attributes.
Call #H5Fstart_swmr_write to start SWMR access to the file.
Periodically flush data.
<h4 id="example-code">Example Code:</h4>
Create the file using the latest file format property:
\code
fapl = H5Pcreate (H5P_FILE_ACCESS);
status = H5Pset_libver_bounds (fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
// Create objects (files, datasets, ...).
// Close any attributes and named datatype objects.
// Groups and datasets may remain open before starting SWMR access to them.
// Start SWMR access to the file:
status = H5Fstart_swmr_write (fid);
// Reopen the datasets and then start writing, periodically flushing data:
status = H5Dwrite (dset_id, ...);
status = H5Dflush (dset_id);
\endcode
\subsubsection subsubsec_swmr_model_reader SWMR Reader
The SWMR reader must continually poll for new data:
Call #H5Fopen using the #H5F_ACC_SWMR_READ flag.
Poll, checking the size of the dataset to see if there is new data available for reading.
Read new data, if any.
<h4 id="example-code-1">Example Code:</h4>
\code
// Open the file using the SWMR read flag:
fid = H5Fopen (filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, H5P_DEFAULT);
// Open the dataset and then repeatedly poll the dataset, by getting the dimensions, reading new data, and refreshing:
dset_id = H5Dopen (...);
space_id = H5Dget_space (...);
while (...) {
status = H5Dread (dset_id, ...);
status = H5Drefresh (dset_id);
space_id = H5Dget_space (...);
}
\endcode
\subsection subsec_swmr_scope Limitations and Scope
An HDF5 file under SWMR access must reside on a system that complies with POSIX write()
semantics. It is also limited in scope as follows.
The writer process is only allowed to modify raw data of existing datasets by;
Appending data along any unlimited dimension.
Modifying existing data
The following operations are not allowed (and the corresponding HDF5 files will fail)
\li The writer cannot add new objects to the file.
\li The writer cannot delete objects in the file.
\li The writer cannot modify or append data with variable length, string or region reference datatypes.
\li File space recycling is not allowed. As a result the size of a file modified by a SWMR writer may be larger than a file modified by a non-SWMR writer.</p>
\subsection subsec_swmr_tools Tools for Working with SWMR
Two new tools, h5watch and h5clear, are available for use with SWMR. The other HDF5 utilities have also been modified to recognize SWMR
\li The h5watch tool allows a user to monitor the growth of a dataset.
\li The h5clear tool clears the status flags in the superblock of an HDF5 file.
\li The rest of the HDF5 tools will exit gracefully but not work with SWMR otherwise.
\subsection subsec_swmr_example Programming Example
A good example of using SWMR is included with the HDF5 tests in the source code. You can run it while reading
the file it creates. If you then interrupt the application and reader and look at the resulting file, you will
see that the file is still valid. Follow these steps:
\li Download the HDF5 source code to a local directory on a filesystem (that complies with POSIX write() semantics).
Build the software. No special configuration options are needed to use SWMR.
\li Invoke two command terminal windows. In one window go into the bin directory of the built binaries.
In the other window go into the test directory of the HDF5-1.10 source code that was just built.
\li In the window in the test directory compile and run use_append_chunk.c. The example writes a three
dimensional dataset by planes (with chunks of size 1 x 256 x 256).
\li In the other window (in the bin directory) run h5watch on the file created by
use_append_chunk.c (use_append_chunk.h5). It should be run while use_append_chunk is executing and you
will see valid data displayed with h5watch.
\li Interrupt use_append_chunk while it is running, and stop h5watch.
\li Use h5clear to clear the status flags in the superblock of the HDF5 file (use_append_chunk.h5).
\li View the file with h5dump. You will see that it is a valid file even though the application did not
close properly. It will contain data up to the point that it was interrupted.
*/
/** \page VDS Introduction to the Virtual Dataset - VDS
\htmlinclude intro_VDS.html
\section sec_vds_intro Introduction to VDS
The HDF5 Virtual Dataset (VDS) feature enables users to access data in a collection of HDF5 files as a
single HDF5 dataset and to use the HDF5 APIs to work with that dataset.
For example, your data may be collected into four files:
<img src="tutrvds-multimgs.png" alt="tutrvds-multimgs.png" width=750>
You can map the datasets in the four files into a single VDS that can be accessed just like any other dataset:
<img src="tutrvds-snglimg.png" alt="tutrvds-snglimg.png" width=500>
The mapping between a VDS and the HDF5 source datasets is persistent and transparent to an application. If a source
file is missing the fill value will be displayed.
See the Virtual (VDS) Documentation for complete details regarding the VDS feature.
The VDS feature was implemented using hyperslab selection (#H5Sselect_hyperslab). See the tutorial on
Reading From or Writing to a Subset of a Dataset for more information on selecting hyperslabs.
\subsection subsec_vds_intro_model Programming Model
To create a Virtual Dataset you simply follow the HDF5 programming model and add a few additional API calls
to map the source code datasets to the VDS.
Following are the steps for creating a Virtual Dataset:
\li Create the source datasets that will comprise the VDS
\li Create the VDS: ‐ Define a datatype and dataspace (can be unlimited)
\li Define the dataset creation property list (including fill value)
\li (Repeat for each source dataset) Map elements from the source dataset to elements of the VDS
\li Select elements in the source dataset (source selection)
\li Select elements in the virtual dataset (destination selection)
\li Map destination selections to source selections (see Functions for Working with a VDS)
\li Call H5Dcreate using the properties defined above
\li Access the VDS as a regular HDF5 dataset
\li Close the VDS when finished
<h4>Functions for Working with a VDS</h4>
The #H5Pset_virtual API sets the mapping between virtual and source datasets. This is a dataset creation property list.
Using this API will change the layout of the dataset to #H5D_VIRTUAL. As with specifying any dataset creation property
list, an instance of the property list is created, modified, passed into the dataset creation call and then closed:
\code
dcpl = H5Pcreate (H5P_DATASET_CREATE);
src_space = H5screate_simple ...
status = H5Sselect_hyperslab (space, ...
status = H5Pset_virtual (dcpl, space, SRC_FILE[i], SRC_DATASET[i], src_space);
dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
status = H5Pclose (dcpl);
\endcode
There are several other APIs introduced with Virtual Datasets, including query functions. For details
see the complete list of HDF5 library APIs that support Virtual Datasets.
<h4>Limitations</h4>
This feature was introduced in HDF5-1.10.
The number of source datasets is unlimited. However, there is a limit on the size of each source dataset.
\subsection subsec_vds_intro_examples Programming Examples
<em>Example 1</em>
This example creates three HDF5 files, each with a one-dimensional dataset of 6 elements. The datasets in these files
are the source datasets that are then used to create a 4 x 6 Virtual Dataset with a fill value of -1. The first three
rows of the VDS are mapped to the data from the three source datasets as shown below:
<img src="tutrvds-ex.png" alt="tutrvds-ex.png" width=500>
In this example the three source datasets are mapped to the VDS with this code:
\code>
src_space = H5Screate_simple (RANK1, dims, NULL);
for (i = 0; i &lt; 3; i++) {
start[0] = (hsize_t)i;
// Select i-th row in the virtual dataset; selection in the source datasets is the same.
status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
status = H5Pset_virtual (dcpl, space, SRC_FILE[i], SRC_DATASET[i], src_space);
}
endcode>
After the VDS is created and closed, it is reopened. The property list is then queried to determine the
layout of the dataset and its mappings, and the data in the VDS is read and printed.
This example is in the HDF5 source code and can be obtained from here:
<h4>C Example</h4>
For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]
<h4>Example 2</h4>
This example shows how to use a C-style printf statement for specifying multiple source datasets as one virtual
dataset. Only one mapping is required. In other words only one #H5Pset_virtual call is needed to map multiple datasets.
It creates a 2-dimensional unlimited VDS. Then it re-opens the file, makes queries, and reads the virtual dataset.
The source datasets are specified as A-0, A-1, A-2, and A-3. These are mapped to the virtual dataset with one call:
\code
status = H5Pset_virtual (dcpl, vspace, SRCFILE, "A-%b", src_space);
\endcode
The %b indicates that the block count of the selection in the dimension should be used.
<h4>C Example</h4>
For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]
Using h5dump with a VDS
The h5dump utility can be used to view a VDS. The h5dump output for a VDS looks exactly like that for any other dataset.
If h5dump cannot find a source dataset then the fill value will be displayed.
You can determine that a dataset is a VDS by looking at its properties with
\code
h5dump -p
\endcode
It will display each source dataset mapping, beginning with Mapping 0. Below is an excerpt of the output of
\code
h5dump -p
\endcode
on the vds.h5 file created in Example 1.You can see that the entire source file a.h5 is mapped to the first row of the VDS dataset.
<img src="tutrvds-map.png" alt="tutrvds-map.png" width=650>
*/
@@ -1,155 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en-US">
<head>
<title>Thread Safe Library</title>
</head>
/** \page thread-safe-lib Thread Safe Library
<h1>1. Library header files and conditional compilation</h1>
<p>
\section sec_tsafe_compilation Library header files and conditional compilation
The following code is placed at the beginning of H5private.h:
</p>
<blockquote>
<pre>
\code
#ifdef H5_HAVE_THREADSAFE
#include &lt;pthread.h&gt;
#include <pthread.h>
#endif
</pre>
</blockquote>
\endcode
<p>
<code>H5_HAVE_THREADSAFE</code> is defined when the HDF5 library is
compiled with the --enable-threadsafe configuration option. In general,
compiled with the <em>--enable-threadsafe</em> configuration option using autotools or
<em>HDF5_ENABLE_THREADSAFE=ON</em> using CMake. In general,
code for the non-threadsafe version of HDF5 library are placed within
the <code>#else</code> part of the conditional compilation. The exception
the <code># else</code> part of the conditional compilation. The exception
to this rule are the changes to the <code>FUNC_ENTER</code> (in
H5private.h), <code>HRETURN</code> and <code>HRETURN_ERROR</code> (in
H5Eprivate.h) macros (see section 3.2).
H5Eprivate.h) macros (see section \ref subsec_tsafe_macro_ret).
</p>
\section sec_tsafe_global Global variables/structures
<h1>2. Global variables/structures</h1>
<h2>2.1 Global library initialization variable</h2>
<p>
\subsection subsec_tsafe_global_var Global library initialization variable
In the threadsafe implementation, the global library initialization
variable <code>H5_libinit_g</code> is changed to a global structure
consisting of the variable with its associated lock (locks are explained
in section 4.1):
</p>
<blockquote>
<pre>
in section \ref subsec_tsafe_impl_locks):
\code
hbool_t H5_libinit_g = FALSE;
</pre>
</blockquote>
\endcode
<p>
becomes
</p>
<blockquote>
<pre>
\code
H5_api_t H5_g;
</pre>
</blockquote>
\endcode
<p>
where <code>H5_api_t</code> is
</p>
<blockquote>
<pre>
\code
typedef struct H5_api_struct {
H5_mutex_t init_lock; /* API entrance mutex */
H5_mutex_t init_lock; // API entrance mutex
hbool_t H5_libinit_g;
} H5_api_t;
</pre>
</blockquote>
\endcode
<p>
All former references to <code>H5_libinit_g</code> in the library are now
made using the macro <code>H5_INIT_GLOBAL</code>. If the threadsafe
library is to be used, the macro is set to <code>H5_g.H5_libinit_g</code>
instead.
</p>
<h2>2.2 Global serialization variable</h2>
<p>
\subsection subsec_tsafe_global_serial Global serialization variable
A new global boolean variable <code>H5_allow_concurrent_g</code> is used
to determine if multiple threads are allowed to an API call
simultaneously. This is set to <code>FALSE</code>.
</p>
<p>
All APIs that are allowed to do so have their own local variable that
shadows the global variable and is set to <code>TRUE</code>. In phase 1,
no such APIs exist.
</p>
<p>
It is defined in <code>H5.c</code> as follows:
</p>
<blockquote>
<pre>
\code
hbool_t H5_allow_concurrent_g = FALSE;
</pre>
</blockquote>
\endcode
<h2>2.3 Global thread initialization variable</h2>
<p>
\subsection subsec_tsafe_global_init Global thread initialization variable
The global variable <code>H5_first_init_g</code> of type
<code>pthread_once_t</code> is used to allow only the first thread in the
application process to call an initialization function using
<code>pthread_once</code>. All subsequent calls to
<code>pthread_once</code> by any thread are disregarded.
</p>
<p>
The call sets up the mutex in the global structure <code>H5_g</code> (see
section 3.1) via an initialization function
section \ref subsec_tsafe_global_var) via an initialization function
<code>H5_first_thread_init</code>. The first thread initialization
function is described in section 4.2.
</p>
function is described in section \ref subsec_tsafe_impl_first.
<p>
<code>H5_first_init_g</code> is defined in <code>H5.c</code> as follows:
</p>
<blockquote>
<pre>
\code
pthread_once_t H5_first_init_g = PTHREAD_ONCE_INIT;
</pre>
</blockquote>
\endcode
<h2>2.4 Global key for per-thread error stacks</h2>
<p>
\subsection subsec_tsafe_global_key Global key for per-thread error stacks
A global pthread-managed key <code>H5_errstk_key_g</code> is used to
allow pthreads to maintain a separate error stack (of type
<code>H5E_t</code>) for each thread. This is defined in <code>H5.c</code>
as:
</p>
<blockquote>
<pre>
\code
pthread_key_t H5_errstk_key_g;
</pre>
</blockquote>
\endcode
<p>
Error stack management is described in section 4.3.
</p>
Error stack management is described in section \ref subsec_tsafe_impl_err.
<h2>2.5 Global structure and key for thread cancellation prevention</h2>
<p>
\subsection subsec_tsafe_global_cancel Global structure and key for thread cancellation prevention
We need to preserve the thread cancellation status of each thread
individually by using a key <code>H5_cancel_key_g</code>. The status is
preserved using a structure (of type <code>H5_cancel_t</code>) which
@@ -157,32 +97,21 @@ maintains the cancellability state of the thread before it entered the
library and a count (which works very much like the recursive lock
counter) which keeps track of the number of API calls the thread makes
within the library.
</p>
<p>
The structure is defined in <code>H5private.h</code> as:
</p>
<blockquote>
<pre>
/* cancellability structure */
\code
// cancellability structure
typedef struct H5_cancel_struct {
int previous_state;
unsigned int cancel_count;
} H5_cancel_t;
</pre>
</blockquote>
\endcode
<p>
Thread cancellation is described in section 4.4.
</p>
Thread cancellation is described in section \ref subsec_tsafe_impl_cancel.
\section sec_tsafe_macro Changes to Macro expansions
<h1>3. Changes to Macro expansions</h1>
<h2>3.1 Changes to FUNC_ENTER</h2>
<p>
\subsection subsec_tsafe_macro_fe Changes to FUNC_ENTER
The <code>FUNC_ENTER</code> macro is now extended to include macro calls
to initialize first threads, disable cancellability and wraps a lock
operation around the checking of the global initialization flag. It
@@ -191,458 +120,345 @@ acquiring the lock on the library. Doing so otherwise would allow the
possibility that the thread be cancelled just after it has acquired the
lock on the library and in that scenario, if the cleanup routines are not
properly set, the library would be permanently locked out.
</p>
<p>
The additional macro code and new macro definitions can be found in
Appendix E.1 to E.5. The changes are made in <code>H5private.h</code>.
</p>
Appendix \ref subsec_tsafe_app_E. The changes are made in <code>H5private.h</code>.
<h2>3.2 Changes to HRETURN and HRETURN_ERROR</h2>
<p>
\subsection subsec_tsafe_macro_ret Changes to HRETURN and HRETURN_ERROR
The <code>HRETURN</code> and <code>HRETURN_ERROR</code> macros are the
counterparts to the <code>FUNC_ENTER</code> macro described in section
3.1. <code>FUNC_LEAVE</code> makes a macro call to <code>HRETURN</code>,
\ref subsec_tsafe_macro_fe. <code>FUNC_LEAVE</code> makes a macro call to <code>HRETURN</code>,
so it is also covered here.
</p>
<p>
The basic changes to these two macros involve adding macro calls to call
an unlock operation and re-enable cancellability if necessary. It should
be noted that the cancellability should be re-enabled only after the
thread has released the lock to the library. The consequence of doing
otherwise would be similar to that described in section 3.1.
</p>
otherwise would be similar to that described in section \ref subsec_tsafe_macro_fe.
<p>
The additional macro code and new macro definitions can be found in
Appendix E.9 to E.9. The changes are made in <code>H5Eprivate.h</code>.
</p>
Appendix \ref subsec_tsafe_app_E. The changes are made in <code>H5Eprivate.h</code>.
<h1>4. Implementation of threadsafe functionality</h1>
\section sec_tsafe_impl Implementation of threadsafe functionality
<h2>4.1 Recursive Locks</h2>
<p>
\subsection subsec_tsafe_impl_locks Recursive Locks
A recursive mutex lock m allows a thread t1 to successfully lock m more
than once without blocking t1. Another thread t2 will block if t2 tries
to lock m while t1 holds the lock to m. If t1 makes k lock calls on m,
then it also needs to make k unlock calls on m before it releases the
lock.
</p>
<p>
Our implementation of recursive locks is built on top of a pthread mutex
lock (which is not recursive). It makes use of a pthread condition
variable to have unsuccessful threads wait on the mutex. Waiting threads
are awaken by a signal from the final unlock call made by the thread
holding the lock.
</p>
<p>
Recursive locks are defined to be the following type
(<code>H5private.h</code>):
</p>
<blockquote>
<pre>
\code
typedef struct H5_mutex_struct {
pthread_t owner_thread; /* current lock owner */
pthread_mutex_t atomic_lock; /* lock for atomicity of new mechanism */
pthread_cond_t cond_var; /* condition variable */
pthread_t owner_thread; // current lock owner
pthread_mutex_t atomic_lock; // lock for atomicity of new mechanism
pthread_cond_t cond_var; // condition variable
unsigned int lock_count;
} H5_mutex_t;
</pre>
</blockquote>
\endcode
<p>
Detailed implementation code can be found in Appendix A. The
Detailed implementation code can be found in Appendix \ref subsec_tsafe_app_A. The
implementation changes are made in <code>H5TS.c</code>.
</p>
<h2>4.2 First thread initialization</h2>
<p>
\subsection subsec_tsafe_impl_first First thread initialization
Because the mutex lock associated with a recursive lock cannot be
statically initialized, a mechanism is required to initialize the
recursive lock associated with <code>H5_g</code> so that it can be used
for the first time.
</p>
<p>
The pthreads library allows this through the pthread_once call which as
described in section 3.3 allows only the first thread accessing the
described in section \ref subsec_tsafe_global_init allows only the first thread accessing the
library in an application to initialize <code>H5_g</code>.
</p>
<p>
In addition to initializing <code>H5_g</code>, it also initializes the
key (see section 3.4) for use with per-thread error stacks (see section
4.3).
</p>
key (see section \ref subsec_tsafe_global_key) for use with per-thread error stacks (see section
\ref subsec_tsafe_impl_err).
<p>
The first thread initialization mechanism is implemented as the function
call <code>H5_first_thread_init()</code> in <code>H5TS.c</code>. This is
described in appendix B.
</p>
<h2>4.3 Per-thread error stack management</h2>
<p>
\subsection subsec_tsafe_impl_err Per-thread error stack management
Pthreads allows individual threads to access dynamic and persistent
per-thread data through the use of keys. Each key is associated with
a table that maps threads to data items. Keys can be initialized by
<code>pthread_key_create()</code> in pthreads (see sections 3.4 and 4.2).
<code>pthread_key_create()</code> in pthreads (see sections \ref subsec_tsafe_global_key and \ref subsec_tsafe_impl_first).
Per-thread data items are accessed using a key through the
<code>pthread_getspecific()</code> and <code>pthread_setspecific()</code>
calls to read and write to the association table respectively.
</p>
<p>
Per-thread error stacks are accessed through the key
<code>H5_errstk_key_g</code> which is initialized by the first thread
initialization call (see section 4.2).
</p>
initialization call (see section \ref subsec_tsafe_impl_first).
<p>
In the non-threadsafe version of the library, there is a global stack
variable <code>H5E_stack_g[1]</code> which is no longer defined in the
threadsafe version. At the same time, the macro call to gain access to
the error stack <code>H5E_get_my_stack</code> is changed from:
</p>
<blockquote>
<pre>
\code
#define H5E_get_my_stack() (H5E_stack_g+0)
</pre>
</blockquote>
\endcode
<p>
to:
</p>
<blockquote>
<pre>
\code
#define H5E_get_my_stack() H5E_get_stack()
</pre>
</blockquote>
\endcode
<p>
where <code>H5E_get_stack()</code> is a surrogate function that does the
following operations:
</p>
<ol>
<li>if a thread is attempting to get an error stack for the first
time, the error stack is dynamically allocated for the thread and
associated with <code>H5_errstk_key_g</code> using
<code>pthread_setspecific()</code>. The way we detect if it is the
first time is through <code>pthread_getspecific()</code> which
returns <code>NULL</code> if no previous value is associated with
the thread using the key.</li>
<li>if a thread is attempting to get an error stack for the first
time, the error stack is dynamically allocated for the thread and
associated with <code>H5_errstk_key_g</code> using
<code>pthread_setspecific()</code>. The way we detect if it is the
first time is through <code>pthread_getspecific()</code> which
returns <code>NULL</code> if no previous value is associated with
the thread using the key.</li>
<li>if <code>pthread_getspecific()</code> returns a non-null value,
then that is the pointer to the error stack associated with the
thread and the stack can be used as usual.</li>
<li>if <code>pthread_getspecific()</code> returns a non-null value,
then that is the pointer to the error stack associated with the
thread and the stack can be used as usual.</li>
</ol>
<p>
A final change to the error reporting routines is as follows; the current
implementation reports errors to always be detected at thread 0. In the
threadsafe implementation, this is changed to report the number returned
by a call to <code>pthread_self()</code>.
</p>
<p>
The change in code (reflected in <code>H5Eprint</code> of file
<code>H5E.c</code>) is as follows:
</p>
<blockquote>
<pre>
\code
#ifdef H5_HAVE_THREADSAFE
fprintf (stream, "HDF5-DIAG: Error detected in thread %d."
,pthread_self());
fprintf (stream, "HDF5-DIAG: Error detected in thread %d." ,pthread_self());
#else
fprintf (stream, "HDF5-DIAG: Error detected in thread 0.");
#endif
</pre>
</blockquote>
\endcode
<p>
Code for <code>H5E_get_stack()</code> can be found in Appendix C. All the
Code for <code>H5E_get_stack()</code> can be found in Appendix \ref subsec_tsafe_app_C. All the
above changes were made in <code>H5E.c</code>.
</p>
<h2>4.4 Thread Cancellation safety</h2>
<p>
\subsection subsec_tsafe_impl_cancel Thread Cancellation safety
To prevent thread cancellations from killing a thread while it is in the
library, we maintain per-thread information about the cancellability
status of the thread before it entered the library so that we can restore
that same status when the thread leaves the library.
</p>
<p>
By <i>enter</i> and <i>leave</i> the library, we mean the points when a
thread makes an API call from a user application and the time that API
call returns. Other API or callback function calls made from within that
API call are considered <i>within</i> the library.
</p>
<p>
Because other API calls may be made from within the first API call, we
need to maintain a counter to determine which was the first and
correspondingly the last return.
</p>
<p>
When a thread makes an API call, the macro <code>H5_API_SET_CANCEL</code>
calls the worker function <code>H5_cancel_count_inc()</code> which does
the following:
</p>
<ol>
<li>if this is the first time the thread has entered the library,
a new cancellability structure needs to be assigned to it.</li>
<li>if the thread is already within the library when the API call is
made, then cancel_count is simply incremented. Otherwise, we set
the cancellability state to <code>PTHREAD_CANCEL_DISABLE</code>
while storing the previous state into the cancellability structure.
<code>cancel_count</code> is also incremented in this case.</li>
<li>if this is the first time the thread has entered the library,
a new cancellability structure needs to be assigned to it.</li>
<li>if the thread is already within the library when the API call is
made, then cancel_count is simply incremented. Otherwise, we set
the cancellability state to <code>PTHREAD_CANCEL_DISABLE</code>
while storing the previous state into the cancellability structure.
<code>cancel_count</code> is also incremented in this case.</li>
</ol>
<p>
When a thread leaves an API call, the macro
<code>H5_API_UNSET_CANCEL</code> calls the worker function
<code>H5_cancel_count_dec()</code> which does the following:
</p>
<ol>
<li>if <code>cancel_count</code> is greater than 1, indicating that the
thread is not yet about to leave the library, then
<code>cancel_count</code> is simply decremented.</li>
<li>otherwise, we reset the cancellability state back to its original
state before it entered the library and decrement the count (back
to zero).</li>
<li>if <code>cancel_count</code> is greater than 1, indicating that the
thread is not yet about to leave the library, then
<code>cancel_count</code> is simply decremented.</li>
<li>otherwise, we reset the cancellability state back to its original
state before it entered the library and decrement the count (back
to zero).</li>
</ol>
<p>
<code>H5_cancel_count_inc</code> and <code>H5_cancel_count_dec</code> are
described in Appendix D and may be found in <code>H5TS.c</code>.
</p>
described in Appendix \ref subsec_tsafe_app_D and may be found in <code>H5TS.c</code>.
<h1>5. Test programs</h1>
<p>
\section sec_tsafe_test Test programs
Except where stated, all tests involve 16 simultaneous threads that make
use of HDF5 API calls without any explicit synchronization typically
required in a non-threadsafe environment.
</p>
<h2>5.1 Data set create and write</h2>
<p>
\subsection subsec_tsafe_test_create Data set create and write
The test program sets up 16 threads to simultaneously create 16
different datasets named from <i>zero</i> to <i>fifteen</i> for a single
file and then writing an integer value into that dataset equal to the
dataset's named value.
</p>
<p>
The main thread would join with all 16 threads and attempt to match the
resulting HDF5 file with expected results - that each dataset contains
the correct value (0 for <i>zero</i>, 1 for <i>one</i> etc ...) and all
datasets were correctly created.
</p>
<p>
The test is implemented in the file <code>ttsafe_dcreate.c</code>.
</p>
<h2>5.2 Test on error stack</h2>
<p>
\subsection subsec_tsafe_test_err Test on error stack
The error stack test is one in which 16 threads simultaneously try to
create datasets with the same name. The result, when properly serialized,
should be equivalent to 16 attempts to create the dataset with the same
name.
</p>
<p>
The error stack implementation runs correctly if it reports 15 instances
of the dataset name conflict error and finally generates a correct HDF5
containing that single dataset. Each thread should report its own stack
of errors with a thread number associated with it.
</p>
<p>
The test is implemented in the file <code>ttsafe_error.c</code>.
</p>
<h2>5.3 Test on cancellation safety</h2>
<p>
\subsection subsec_tsafe_test_cancel Test on cancellation safety
The main idea in thread cancellation safety is as follows; a child thread
is spawned to create and write to a dataset. Following that, it makes a
<code>H5Diterate</code> call on that dataset which activates a callback
function.
</p>
<p>
A deliberate barrier is invoked at the callback function which waits for
both the main and child thread to arrive at that point. After that
happens, the main thread proceeds to make a thread cancel call on the
child thread while the latter sleeps for 3 seconds before proceeding to
write a new value to the dataset.
</p>
<p>
After the iterate call, the child thread logically proceeds to wait
another 3 seconds before writing another newer value to the dataset.
</p>
<p>
The test is correct if the main thread manages to read the second value
at the end of the test. This means that cancellation did not take place
until the end of the iteration call despite of the 3 second wait within
the iteration callback and the extra dataset write operation.
Furthermore, the cancellation should occur before the child can proceed
to write the last value into the dataset.
</p>
<h2>5.4 Test on attribute creation</h2>
<p>
\subsection subsec_tsafe_test_attr Test on attribute creation
A main thread makes 16 threaded calls to <code>H5Acreate</code> with a
generated name for each attribute. Sixteen attributes should be created
for the single dataset in random (chronological) order and receive values
depending on its generated attribute name (e.g. <i>attrib010</i> would
receive the value 10).
</p>
<p>
After joining with all child threads, the main thread proceeds to read
each attribute by generated name to see if the value tallies. Failure is
detected if the attribute name does not exist (meaning they were never
created) or if the wrong values were read back.
</p>
<h1>A. Recursive Lock implementation code</h1>
\section sec_tsafe_app Appendix
<blockquote>
<pre>
\subsection subsec_tsafe_app_A Recursive Lock implementation code
\code
void H5_mutex_init(H5_mutex_t *H5_mutex)
{
H5_mutex-&gt;owner_thread = NULL;
pthread_mutex_init(&amp;H5_mutex-&gt;atomic_lock, NULL);
pthread_cond_init(&amp;H5_mutex-&gt;cond_var, NULL);
H5_mutex-&gt;owner_thread = NULL;
pthread_mutex_init(&amp;H5_mutex-&gt;atomic_lock, NULL);
pthread_cond_init(&amp;H5_mutex-&gt;cond_var, NULL);
H5_mutex-&gt;lock_count = 0;
}
void H5_mutex_lock(H5_mutex_t *H5_mutex)
{
pthread_mutex_lock(&amp;H5_mutex-&gt;atomic_lock);
pthread_mutex_lock(&amp;H5_mutex-&gt;atomic_lock);
if (pthread_equal(pthread_self(), H5_mutex-&gt;owner_thread)) {
/* already owned by self - increment count */
H5_mutex-&gt;lock_count++;
} else {
if (H5_mutex-&gt;owner_thread == NULL) {
/* no one else has locked it - set owner and grab lock */
H5_mutex-&gt;owner_thread = pthread_self();
H5_mutex-&gt;lock_count = 1;
} else {
/* if already locked by someone else */
while (1) {
pthread_cond_wait(&amp;H5_mutex-&gt;cond_var, &amp;H5_mutex-&gt;atomic_lock);
if (pthread_equal(pthread_self(), H5_mutex-&gt;owner_thread)) {
// already owned by self - increment count
H5_mutex-&gt;lock_count++;
}
else {
if (H5_mutex-&gt;owner_thread == NULL) {
// no one else has locked it - set owner and grab lock
H5_mutex-&gt;owner_thread = pthread_self();
H5_mutex-&gt;lock_count = 1;
}
else {
/* if already locked by someone else */
while (1) {
pthread_cond_wait(&amp;H5_mutex-&gt;cond_var, &amp;H5_mutex-&gt;atomic_lock);
if (H5_mutex-&gt;owner_thread == NULL) {
H5_mutex-&gt;owner_thread = pthread_self();
H5_mutex-&gt;lock_count = 1;
break;
} /* else do nothing and loop back to wait on condition*/
}
}
}
if (H5_mutex-&gt;owner_thread == NULL) {
H5_mutex-&gt;owner_thread = pthread_self();
H5_mutex-&gt;lock_count = 1;
break;
} // else do nothing and loop back to wait on condition
}
}
}
pthread_mutex_unlock(&amp;H5_mutex-&gt;atomic_lock);
pthread_mutex_unlock(&amp;H5_mutex-&gt;atomic_lock);
}
void H5_mutex_unlock(H5_mutex_t *H5_mutex)
{
pthread_mutex_lock(&amp;H5_mutex-&gt;atomic_lock);
H5_mutex-&gt;lock_count--;
pthread_mutex_lock(&amp;H5_mutex-&gt;atomic_lock);
H5_mutex-&gt;lock_count--;
if (H5_mutex-&gt;lock_count == 0) {
H5_mutex-&gt;owner_thread = NULL;
pthread_cond_signal(&amp;H5_mutex-&gt;cond_var);
}
pthread_mutex_unlock(&amp;H5_mutex-&gt;atomic_lock);
if (H5_mutex-&gt;lock_count == 0) {
H5_mutex-&gt;owner_thread = NULL;
pthread_cond_signal(&amp;H5_mutex-&gt;cond_var);
}
pthread_mutex_unlock(&amp;H5_mutex-&gt;atomic_lock);
}
</pre>
</blockquote>
\endcode
<h1>B. First thread initialization</h1>
<blockquote>
<pre>
\subsection subsec_tsafe_app_B First thread initialization
\code
void H5_first_thread_init(void)
{
/* initialize global API mutex lock */
// initialize global API mutex lock
H5_g.H5_libinit_g = FALSE;
H5_g.init_lock.owner_thread = NULL;
pthread_mutex_init(&amp;H5_g.init_lock.atomic_lock, NULL);
pthread_cond_init(&amp;H5_g.init_lock.cond_var, NULL);
H5_g.init_lock.lock_count = 0;
/* initialize key for thread-specific error stacks */
// initialize key for thread-specific error stacks
pthread_key_create(&amp;H5_errstk_key_g, NULL);
/* initialize key for thread cancellability mechanism */
// initialize key for thread cancellability mechanism
pthread_key_create(&amp;H5_cancel_key_g, NULL);
}
</pre>
</blockquote>
\endcode
<h1>C. Per-thread error stack acquisition</h1>
<blockquote>
<pre>
\subsection subsec_tsafe_app_C Per-thread error stack acquisition
\code
H5E_t *H5E_get_stack(void)
{
H5E_t *estack;
if (estack = pthread_getspecific(H5_errstk_key_g)) {
return estack;
} else {
/* no associated value with current thread - create one */
estack = (H5E_t *)malloc(sizeof(H5E_t));
pthread_setspecific(H5_errstk_key_g, (void *)estack);
return estack;
return estack;
}
else {
// no associated value with current thread - create one
estack = (H5E_t *)malloc(sizeof(H5E_t));
pthread_setspecific(H5_errstk_key_g, (void *)estack);
return estack;
}
}
</pre>
</blockquote>
\endcode
<h1>D. Thread cancellation mechanisms</h1>
<blockquote>
<pre>
\subsection subsec_tsafe_app_D Thread cancellation mechanisms
\code
void H5_cancel_count_inc(void)
{
H5_cancel_t *cancel_counter;
if (cancel_counter = pthread_getspecific(H5_cancel_key_g)) {
/* do nothing here */
} else {
/*
* first time thread calls library - create new counter and
* associate with key
*/
// do nothing here
}
else {
// first time thread calls library - create new counter and
// associate with key
cancel_counter = (H5_cancel_t *)malloc(sizeof(H5_cancel_t));
cancel_counter-&gt;cancel_count = 0;
pthread_setspecific(H5_cancel_key_g, (void *)cancel_counter);
@@ -650,8 +466,7 @@ created) or if the wrong values were read back.
if (cancel_counter-&gt;cancel_count == 0) {
/* thread entering library */
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
&amp;(cancel_counter-&gt;previous_state));
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &amp;(cancel_counter-&gt;previous_state));
}
cancel_counter-&gt;cancel_count++;
@@ -666,22 +481,19 @@ created) or if the wrong values were read back.
cancel_counter-&gt;cancel_count--;
}
</pre>
</blockquote>
\endcode
<h1>E. Macro expansion codes</h1>
\subsection subsec_tsafe_app_E Macro expansion codes
<h2>E.1 <code>FUNC_ENTER</code></h2>
<blockquote>
<pre>
/* Initialize the library */ \
\subsubsection subsubsec_tsafe_app_E1 <code>FUNC_ENTER</code>
\code
// Initialize the library \
H5_FIRST_THREAD_INIT \
H5_API_UNSET_CANCEL \
H5_API_LOCK_BEGIN \
if (!(H5_INIT_GLOBAL)) { \
H5_INIT_GLOBAL = TRUE; \
if (H5_init_library() &lt; 0) { \
if (H5_init_library() &lt; 0) { \
HRETURN_ERROR (H5E_FUNC, H5E_CANTINIT, err, \
"library initialization failed"); \
} \
@@ -690,56 +502,37 @@ created) or if the wrong values were read back.
:
:
:
</pre>
</blockquote>
\endcode
<h2>E.2 <code>H5_FIRST_THREAD_INIT</code></h2>
<blockquote>
<pre>
/* Macro for first thread initialization */
\subsubsection subsubsec_tsafe_app_E2 <code>H5_FIRST_THREAD_INIT</code>
\code
// Macro for first thread initialization
#define H5_FIRST_THREAD_INIT \
pthread_once(&amp;H5_first_init_g, H5_first_thread_init);
</pre>
</blockquote>
\endcode
<h2>E.3 <code>H5_API_UNSET_CANCEL</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E3 <code>H5_API_UNSET_CANCEL</code>
\code
#define H5_API_UNSET_CANCEL \
if (H5_IS_API(__func__)) { \
H5_cancel_count_inc(); \
}
</pre>
</blockquote>
\endcode
<h2>E.4 <code>H5_API_LOCK_BEGIN</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E4 <code>H5_API_LOCK_BEGIN</code>
\code
#define H5_API_LOCK_BEGIN \
if (H5_IS_API(__func__)) { \
H5_mutex_lock(&amp;H5_g.init_lock);
</pre>
</blockquote>
\endcode
<h2>E.5 <code>H5_API_LOCK_END</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E5 <code>H5_API_LOCK_END</code>
\code
#define H5_API_LOCK_END }
</pre>
</blockquote>
\endcode
<h2>E.6 <code>HRETURN</code> and <code>HRETURN_ERROR</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E6 <code>HRETURN</code> and <code>HRETURN_ERROR</code>
\code
:
:
H5_API_UNLOCK_BEGIN \
@@ -747,41 +540,27 @@ created) or if the wrong values were read back.
H5_API_SET_CANCEL \
return ret_val; \
}
</pre>
</blockquote>
\endcode
<h2>E.7 <code>H5_API_UNLOCK_BEGIN</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E7 <code>H5_API_UNLOCK_BEGIN</code>
\code
#define H5_API_UNLOCK_BEGIN \
if (H5_IS_API(__func__)) { \
H5_mutex_unlock(&amp;H5_g.init_lock);
</pre>
</blockquote>
\endcode
<h2>E.8 <code>H5_API_UNLOCK_END</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E8 <code>H5_API_UNLOCK_END</code>
\code
#define H5_API_UNLOCK_END }
</pre>
</blockquote>
\endcode
<h2>E.9 <code>H5_API_SET_CANCEL</code></h2>
<blockquote>
<pre>
\subsubsection subsubsec_tsafe_app_E9 <code>H5_API_SET_CANCEL</code>
\code
#define H5_API_SET_CANCEL \
if (H5_IS_API(__func__)) { \
H5_cancel_count_dec(); \
}
</pre>
</blockquote>
\endcode
<h2>By Chee Wai Lee</h2>
<h4>By Bill Wendling</h4>
</body>
</html>
*/
+1 -1
View File
@@ -986,7 +986,7 @@ See this <a href="https://\DOXURL/_l_b_datatypes.html">section</a> for more info
\subsubsection subsubsecViewToolsViewDtypes_newref New References
References were reworked in HDF5 1.12.0. The new reference datatype is #H5T_STD_REF. The old reference datatypes are deprecated.
@see sec_reference.
see @ref sec_reference.
\subsubsection subsubsecViewToolsViewDtypes_objref Object Reference
An Object Reference is a reference to an entire object (attribute, dataset, group, or named datatype).
+6 -6
View File
@@ -7,23 +7,23 @@
* for working with region references, hyperslab selections, and bit-fields.
* These functions were created as part of a project supporting
* NPP/NPOESS Data Production and Exploitation (
* <a href="https://support.hdfgroup.org/projects/jpss/documentation">
* project</a>, <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
* <a href="https://\PRJURL/jpss/documentation">
* project</a>, <a href="https://\PRJURL/jpss/ftp/pub/outgoing/NPOESS/source">
* software </a>).
* While they were written to facilitate access to NPP, NPOESS, and JPSS
* data in the HDF5 format, these functions may be useful to anyone working
* with region references, hyperslab selections, or bit-fields.
*
* Note that these functions are not part of the standard HDF5 distribution;
* the <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
* the <a href="https://\PRJURL/jpss/ftp/pub/outgoing/NPOESS/source">
* software </a>
* must be separately downloaded and installed.
*
* A comprehensive guide to this library,
* <a href="https://support.hdfgroup.org/projects/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf">
* <a href="https://\PRJURL/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf">
* <em>User Guide to the HDF5 High-level Library for Handling Region References and Hyperslab Selections</em></a>
* is available at
* https://support.hdfgroup.org/projects/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf.
* https://\PRJURL/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf.
*
* - \ref H5LRcopy_reference
* \n Copies data from the specified dataset to a new location and creates a reference to it.
@@ -297,7 +297,7 @@ H5_HLRDLL herr_t H5LRcopy_region(hid_t obj_id,
* - #H5_ITER_NATIVE Fastest available order
*
* For more detailed information on these two parameters,
* @see H5Lvisit().
* see H5Lvisit().
*
* \p ref_type specifies the type of the reference to be used.
* Valid values include the following:
-1
View File
@@ -1,5 +1,4 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- saved from url=(0072)https://gamma.hdfgroup.org/papers/HISS/030515.FileFormat/FileFormat.html -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HDF5 File Format Discussion</title>
-450
View File
@@ -1,450 +0,0 @@
<html>
<head>
<title>Filters</title>
<h1>Filters in HDF5</h1>
<b>Note: Transient pipelines described in this document have not
been implemented.</b>
<h2>Introduction</h2>
<p>HDF5 allows chunked data to pass through user-defined filters
on the way to or from disk. The filters operate on chunks of an
<code>H5D_CHUNKED</code> dataset can be arranged in a pipeline
so output of one filter becomes the input of the next filter.
</p><p>Each filter has a two-byte identification number (type
<code>H5Z_filter_t</code>) allocated by The HDF Group and can also be
passed application-defined integer resources to control its
behavior. Each filter also has an optional ASCII comment
string.
</p>
<table>
<tbody><tr>
<th>Values for <code>H5Z_filter_t</code></th>
<th>Description</th>
</tr>
<tr valign="top">
<td><code>0-255</code></td>
<td>These values are reserved for filters predefined and
registered by the HDF5 library and of use to the general
public. They are described in a separate section
below.</td>
</tr>
<tr valign="top">
<td><code>256-511</code></td>
<td>Filter numbers in this range are used for testing only
and can be used temporarily by any organization. No
attempt is made to resolve numbering conflicts since all
definitions are by nature temporary.</td>
</tr>
<tr valign="top">
<td><code>512-65535</code></td>
<td>Reserved for future assignment. Please contact the
<a href="mailto:help@hdfgroup.org">HDF5 development team</a>
to reserve a value or range of values for
use by your filters.</td>
</tr></tbody></table>
<h2>Defining and Querying the Filter Pipeline</h2>
<p>Two types of filters can be applied to raw data I/O: permanent
filters and transient filters. The permanent filter pipeline is
defined when the dataset is created while the transient pipeline
is defined for each I/O operation. During an
<code>H5Dwrite()</code> the transient filters are applied first
in the order defined and then the permanent filters are applied
in the order defined. For an <code>H5Dread()</code> the
opposite order is used: permanent filters in reverse order, then
transient filters in reverse order. An <code>H5Dread()</code>
must result in the same amount of data for a chunk as the
original <code>H5Dwrite()</code>.
</p><p>The permanent filter pipeline is defined by calling
<code>H5Pset_filter()</code> for a dataset creation property
list while the transient filter pipeline is defined by calling
that function for a dataset transfer property list.
</p><dl>
<dt><code>herr_t H5Pset_filter (hid_t <em>plist</em>,
H5Z_filter_t <em>filter</em>, unsigned int <em>flags</em>,
size_t <em>cd_nelmts</em>, const unsigned int
<em>cd_values</em>[])</code>
</dt><dd>This function adds the specified <em>filter</em> and
corresponding properties to the end of the transient or
permanent output filter pipeline (depending on whether
<em>plist</em> is a dataset creation or dataset transfer
property list). The <em>flags</em> argument specifies certain
general properties of the filter and is documented below. The
<em>cd_values</em> is an array of <em>cd_nelmts</em> integers
which are auxiliary data for the filter. The integer values
will be stored in the dataset object header as part of the
filter information.
</dd><dt><code>int H5Pget_nfilters (hid_t <em>plist</em>)</code>
</dt><dd>This function returns the number of filters defined in the
permanent or transient filter pipeline depending on whether
<em>plist</em> is a dataset creation or dataset transfer
property list. In each pipeline the filters are numbered from
0 through <em>N</em>-1 where <em>N</em> is the value returned
by this function. During output to the file the filters of a
pipeline are applied in increasing order (the inverse is true
for input). Zero is returned if there are no filters in the
pipeline and a negative value is returned for errors.
</dd><dt><code>H5Z_filter_t H5Pget_filter (hid_t <em>plist</em>,
int <em>filter_number</em>, unsigned int *<em>flags</em>,
size_t *<em>cd_nelmts</em>, unsigned int
*<em>cd_values</em>, size_t namelen, char name[])</code>
</dt><dd>This is the query counterpart of
<code>H5Pset_filter()</code> and returns information about a
particular filter number in a permanent or transient pipeline
depending on whether <em>plist</em> is a dataset creation or
dataset transfer property list. On input, <em>cd_nelmts</em>
indicates the number of entries in the <em>cd_values</em>
array allocated by the caller while on exit it contains the
number of values defined by the filter. The
<em>filter_number</em> should be a value between zero and
<em>N</em>-1 as described for <code>H5Pget_nfilters()</code>
and the function will return failure (a negative value) if the
filter number is out of range. If <em>name</em> is a pointer
to an array of at least <em>namelen</em> bytes then the filter
name will be copied into that array. The name will be null
terminated if the <em>namelen</em> is large enough. The
filter name returned will be the name appearing in the file or
else the name registered for the filter or else an empty string.
</dd></dl>
<p>The flags argument to the functions above is a bit vector of
the following fields:
</p>
<table>
<tbody><tr>
<th>Values for <em>flags</em></th>
<th>Description</th>
</tr>
<tr valign="top">
<td><code>H5Z_FLAG_OPTIONAL</code></td>
<td>If this bit is set then the filter is optional. If
the filter fails (see below) during an
<code>H5Dwrite()</code> operation then the filter is
just excluded from the pipeline for the chunk for which
it failed; the filter will not participate in the
pipeline during an <code>H5Dread()</code> of the chunk.
This is commonly used for compression filters: if the
compression result would be larger than the input then
the compression filter returns failure and the
uncompressed data is stored in the file. If this bit is
clear and a filter fails then the
<code>H5Dwrite()</code> or <code>H5Dread()</code> also
fails.</td>
</tr>
</tbody></table>
<h2>Defining Filters</h2>
<p>Each filter is bidirectional, handling both input and output to
the file, and a flag is passed to the filter to indicate the
direction. In either case the filter reads a chunk of data from
a buffer, usually performs some sort of transformation on the
data, places the result in the same or new buffer, and returns
the buffer pointer and size to the caller. If something goes
wrong the filter should return zero to indicate a failure.
</p><p>During output, a filter that fails or isn't defined and is
marked as optional is silently excluded from the pipeline and
will not be used when reading that chunk of data. A required
filter that fails or isn't defined causes the entire output
operation to fail. During input, any filter that has not been
excluded from the pipeline during output and fails or is not
defined will cause the entire input operation to fail.
</p><p>Filters are defined in two phases. The first phase is to
define a function to act as the filter and link the function
into the application. The second phase is to register the
function, associating the function with an
<code>H5Z_filter_t</code> identification number and a comment.
</p><dl>
<dt><code>typedef size_t (*H5Z_func_t)(unsigned int
<em>flags</em>, size_t <em>cd_nelmts</em>, const unsigned int
<em>cd_values</em>[], size_t <em>nbytes</em>, size_t
*<em>buf_size</em>, void **<em>buf</em>)</code>
</dt><dd>The <em>flags</em>, <em>cd_nelmts</em>, and
<em>cd_values</em> are the same as for the
<code>H5Pset_filter()</code> function with the additional flag
<code>H5Z_FLAG_REVERSE</code> which is set when the filter is
called as part of the input pipeline. The input buffer is
pointed to by <em>*buf</em> and has a total size of
<em>*buf_size</em> bytes but only <em>nbytes</em> are valid
data. The filter should perform the transformation in place if
possible and return the number of valid bytes or zero for
failure. If the transformation cannot be done in place then
the filter should allocate a new buffer with
<code>malloc()</code> and assign it to <em>*buf</em>,
assigning the allocated size of that buffer to
<em>*buf_size</em>. The old buffer should be freed
by calling <code>free()</code>.
<br><br>
</dd><dt><code>herr_t H5Zregister (H5Z_filter_t <em>filter_id</em>,
const char *<em>comment</em>, H5Z_func_t
<em>filter</em>)</code>
</dt><dd>The <em>filter</em> function is associated with a filter
number and a short ASCII comment which will be stored in the
hdf5 file if the filter is used as part of a permanent
pipeline during dataset creation.
</dd></dl>
<h2>Predefined Filters</h2>
<p>If <code>zlib</code> version 1.1.2 or later was found
during configuration then the library will define a filter whose
<code>H5Z_filter_t</code> number is
<code>H5Z_FILTER_DEFLATE</code>. Since this compression method
has the potential for generating compressed data which is larger
than the original, the <code>H5Z_FLAG_OPTIONAL</code> flag
should be turned on so such cases can be handled gracefully by
storing the original data instead of the compressed data. The
<em>cd_nvalues</em> should be one with <em>cd_value[0]</em>
being a compression aggression level between zero and nine,
inclusive (zero is the fastest compression while nine results in
the best compression ratio).
</p><p>A convenience function for adding the
<code>H5Z_FILTER_DEFLATE</code> filter to a pipeline is:
</p><dl>
<dt><code>herr_t H5Pset_deflate (hid_t <em>plist</em>, unsigned
<em>aggression</em>)</code>
</dt><dd>The deflate compression method is added to the end of the
permanent or transient filter pipeline depending on whether
<em>plist</em> is a dataset creation or dataset transfer
property list. The <em>aggression</em> is a number between
zero and nine (inclusive) to indicate the tradeoff between
speed and compression ratio (zero is fastest, nine is best
ratio).
</dd></dl>
<p>Even if the <code>zlib</code> isn't detected during
configuration the application can define
<code>H5Z_FILTER_DEFLATE</code> as a permanent filter. If the
filter is marked as optional (as with
<code>H5Pset_deflate()</code>) then it will always fail and be
automatically removed from the pipeline. Applications that read
data will fail only if the data is actually compressed; they
won't fail if <code>H5Z_FILTER_DEFLATE</code> was part of the
permanent output pipeline but was automatically excluded because
it didn't exist when the data was written.
</p><p><code>zlib</code> can be acquired from
<code><a href="https://zlib.net">
https://zlib.net</a></code>.
</p><h2>Example</h2>
<p>This example shows how to define and register a simple filter
that adds a checksum capability to the data stream.
</p><p>The function that acts as the filter always returns zero
(failure) if the <code>md5()</code> function was not detected at
configuration time (left as an exercise for the reader).
Otherwise the function is broken down to an input and output
half. The output half calculates a checksum, increases the size
of the output buffer if necessary, and appends the checksum to
the end of the buffer. The input half calculates the checksum
on the first part of the buffer and compares it to the checksum
already stored at the end of the buffer. If the two differ then
zero (failure) is returned, otherwise the buffer size is reduced
to exclude the checksum.
</p>
<table>
<tbody><tr>
<td>
<p><code></code></p><pre><code>
size_t
md5_filter(unsigned int flags, size_t cd_nelmts,
const unsigned int cd_values[], size_t nbytes,
size_t *buf_size, void **buf)
{
#ifdef HAVE_MD5
unsigned char cksum[16];
if (flags &amp; H5Z_REVERSE) {
/* Input */
assert(nbytes&gt;=16);
md5(nbytes-16, *buf, cksum);
/* Compare */
if (memcmp(cksum, (char*)(*buf)+nbytes-16, 16)) {
return 0; /*fail*/
}
/* Strip off checksum */
return nbytes-16;
} else {
/* Output */
md5(nbytes, *buf, cksum);
/* Increase buffer size if necessary */
if (nbytes+16&gt;*buf_size) {
*buf_size = nbytes + 16;
*buf = realloc(*buf, *buf_size);
}
/* Append checksum */
memcpy((char*)(*buf)+nbytes, cksum, 16);
return nbytes+16;
}
#else
return 0; /*fail*/
#endif
}
</code></pre>
</td>
</tr>
</tbody></table>
<p>Once the filter function is defined it must be registered so
the HDF5 library knows about it. Since we're testing this
filter we choose one of the <code>H5Z_filter_t</code> numbers
from the reserved range. We'll randomly choose 305.
</p><p>
</p>
<table>
<tbody><tr>
<td>
<p><code></code></p><pre><code>
#define FILTER_MD5 305
herr_t status = H5Zregister(FILTER_MD5, "md5 checksum", md5_filter);
</code></pre>
</td>
</tr>
</tbody></table>
<p>Now we can use the filter in a pipeline. We could have added
the filter to the pipeline before defining or registering the
filter as long as the filter was defined and registered by time
we tried to use it (if the filter is marked as optional then we
could have used it without defining it and the library would
have automatically removed it from the pipeline for each chunk
written before the filter was defined and registered).
</p><p>
</p>
<table>
<tbody><tr>
<td>
<p><code></code></p><pre><code>
hid_t dcpl = H5Pcreate(H5P_DATASET_CREATE);
hsize_t chunk_size[3] = {10,10,10};
H5Pset_chunk(dcpl, 3, chunk_size);
H5Pset_filter(dcpl, FILTER_MD5, 0, 0, NULL);
hid_t dset = H5Dcreate(file, "dset", H5T_NATIVE_DOUBLE, space, dcpl);
</code></pre>
</td>
</tr>
</tbody></table>
<h2>6. Filter Diagnostics</h2>
<p>If the library is compiled with debugging turned on for the H5Z
layer (usually as a result of <code>configure
--enable-debug=z</code>) then filter statistics are printed when
the application exits normally or the library is closed. The
statistics are written to the standard error stream and include
two lines for each filter that was used: one for input and one
for output. The following fields are displayed:
</p><p>
</p>
<table>
<tbody><tr>
<th>Field Name</th>
<th>Description</th>
</tr>
<tr valign="top">
<td>Method</td>
<td>This is the name of the method as defined with
<code>H5Zregister()</code> with the characters
"&lt; or "&gt;" prepended to indicate
input or output.</td>
</tr>
<tr valign="top">
<td>Total</td>
<td>The total number of bytes processed by the filter
including errors. This is the maximum of the
<em>nbytes</em> argument or the return value.
</td></tr>
<tr valign="top">
<td>Errors</td>
<td>This field shows the number of bytes of the Total
column which can be attributed to errors.</td>
</tr>
<tr valign="top">
<td>User, System, Elapsed</td>
<td>These are the amount of user time, system time, and
elapsed time in seconds spent in the filter function.
Elapsed time is sensitive to system load. These times
may be zero on operating systems that don't support the
required operations.</td>
</tr>
<tr valign="top">
<td>Bandwidth</td>
<td>This is the filter bandwidth which is the total
number of bytes processed divided by elapsed time.
Since elapsed time is subject to system load the
bandwidth numbers cannot always be trusted.
Furthermore, the bandwidth includes bytes attributed to
errors which may significantly taint the value if the
function is able to detect errors without much
expense.</td>
</tr>
</tbody></table>
<p>
</p>
<table>
<caption align="bottom">
<b>Example: Filter Statistics</b>
</caption>
<tbody><tr>
<td>
<p><code></code></p><pre><code>H5Z: filter statistics accumulated ov=
er life of library:
Method Total Errors User System Elapsed Bandwidth
------ ----- ------ ---- ------ ------- ---------
&gt;deflate 160000 40000 0.62 0.74 1.33 117.5 kBs
&lt;deflate 120000 0 0.11 0.00 0.12 1.000 MBs
</code></pre>
</td>
</tr>
</tbody></table>
<hr>
<p><a name="fn1">Footnote 1:</a> Dataset chunks can be compressed
through the use of filters. Developers should be aware that
reading and rewriting compressed chunked data can result in holes
in an HDF5 file. In time, enough such holes can increase the
file size enough to impair application or library performance
when working with that file. See
<a href="https://support.hdfgroup.org/HDF5/doc1.6/Performance.html#Freespace">
Freespace Management</a>
in the chapter
<a href="https://support.hdfgroup.org/HDF5/doc1.6/Performance.html">
Performance Analysis and Issues</a>.</p>
</html>
+2 -2
View File
@@ -3441,8 +3441,8 @@ Elena> "Free-space object"
library. Values 256 through 511 have been set aside for
use when developing/testing new filters. The remaining
values are allocated to specific filters by contacting the
<a href="mailto:hdf5dev@ncsa.uiuc.edu">HDF5 Development
Team</a>.</td>
<a href="mailto:help@hdfgroup.org">HDF5 development team</a>.
</td>
</tr>
<tr valign=top>
+3 -3
View File
@@ -5558,9 +5558,9 @@ TABLE.list TD { border:none; }
<a name="Footnote1Change"><sup>1</sup></a>If you are reading
an earlier version of this document, this link may have changed.
If the link does not work, use the latest version of this document
on <a href="https://support.hdfgroup.org">The HDF Group</a>&rsquo;s website,
<a href="/HDF5/doc/H5.format.html">
<code>https://support.hdfgroup.org/HDF5/doc/H5.format.html</code></a>;
on <a href="https://hdfgroup.github.io/hdf5/develop/index.html">The HDF Group</a>&rsquo;s website,
<a href="https://hdfgroup.github.io/hdf5/develop/_f_m_t11.html">
<code>H5.format.html</code></a>;
the link there will always be correct.
<small><a href="#FilterMessage">(Return)</a>
</P>
Binary file not shown.
-1
View File
@@ -1,5 +1,4 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- saved from url=(0064)https://gamma.hdfgroup.org/papers/HISS/030821.IOFlow/IOFlow.html -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HDF5 Raw I/O Flow Notes</title>
@@ -241,7 +241,7 @@ HDF5 Library. For more information, see the
</tbody></table>
<p>For more information on these and other function calls and macros,
see the <a href="https://docs.hdfgroup.org/hdf5/develop/_r_m.html"> <cite>HDF5 Reference Manual</cite></a>. </p>
see the <a href="https://\DOXURL/_r_m.html"> <cite>HDF5 Reference Manual</cite></a>. </p>
<h2><a name="UseCases">Use Cases</a></h2>
-103
View File
@@ -1,103 +0,0 @@
<html>
<head>
<title>Introduction to Single-Writer_Multiple-Reader (SWMR)</title>
<h2 id="introduction-to-swmr">Introduction to SWMR</h2>
<p>The Single-Writer / Multiple-Reader (SWMR) feature enables multiple processes to read an HDF5 file while it is being written to (by a single process) without using locks or requiring communication between processes.</p>
<p><img src=tutr-swmr1.png alt="tutr-swmr1.png" width=500>
<p>All communication between processes must be performed via the HDF5 file. The HDF5 file under SWMR access must reside on a system that complies with POSIX write() semantics.</p>
<p>The basic engineering challenge for this to work was to ensure that the readers of an HDF5 file always see a coherent (though possibly not up to date) HDF5 file.</p>
<p>The issue is that when writing data there is information in the metadata cache in addition to the physical file on disk:</p>
<p><img src=tutr-swmr2.png alt="tutr-swmr2.png" width=500>
<p>However, the readers can only see the state contained in the physical file:</p>
<p><img src=tutr-swmr3.png alt="tutr-swmr3.png" width=500>
<p>The SWMR solution implements dependencies on when the metadata can be flushed to the file. This ensures that metadata cache flush operations occur in the proper order, so that there will never be internal file pointers in the physical file that point to invalid (unflushed) file addresses.</p>
<p>A beneficial side effect of using SWMR access is better fault tolerance. It is more difficult to corrupt a file when using SWMR.</p>
<h2 id="documentation">Documentation</h2>
<h3 id="swmr-users-guide"><a href="https://docs.hdfgroup.org/hdf5/tn/HDF5_SWMR_User_Guide.pdf">SWMR User&#39;s Guide</a></h3>
<h3 id="hdf5-library-apis">HDF5 Library APIs</h3>
<ul>
<li><a href="https://\DOXURL/group___s_w_m_r.html#ga159be34fbe7e4a959589310ef0196dfe">H5F_START_SWMR_WRITE</a> — Enables SWMR writing mode for a file</li>
<li><a href="https://\DOXURL/group___h5_d_o.html#ga316caac160af15192e0c78228667341e">H5DO_APPEND</a> — Appends data to a dataset along a specified dimension</li>
<li>H5P_SET_OBJECT_FLUSH_CB — Sets a callback function to invoke when an object flush occurs in the file</li>
<li>H5P_GET_OBJECT_FLUSH_CB — Retrieves the object flush property values from the file access property list</li>
<li>H5O_DISABLE_MDC_FLUSHES — Prevents metadata entries for an HDF5 object from being flushed from the metadata cache to storage</li>
<li>H5O_ENABLE_MDC_FLUSHES — Enables flushing of dirty metadata entries from a file’s metadata cache</li>
<li>H5O_ARE_MDC_FLUSHES_DISABLED — Determines if an HDF5 object has had flushes of metadata entries disabled</li>
</ul>
<h3 id="tools">Tools</h3>
<ul>
<li>h5watch — Outputs new records appended to a dataset as the dataset grows</li>
<li>h5format_convert — Converts the layout format version and chunked indexing types of datasets created with HDF5-1.10 so that applications built with HDF5-1.8 can access them</li>
<li>h5clear — Clears superblock status_flags field, removes metadata cache image, prints EOA and EOF, or sets EOA of a file</li>
</ul>
<h3 id="design-documents">Design Documents</h3>
<p>Error while fetching page properties report data:</p>
<h2 id="programming-model">Programming Model</h2>
<p>Please be aware that the SWMR feature requires that an HDF5 file be created with the latest file format. See H5P_SET_LIBVER_BOUNDS for more information.</p>
<p>To use SWMR follow the the general programming model for creating and accessing HDF5 files and objects along with the steps described below.</p>
<h3 id="swmr-writer">SWMR Writer:</h3>
<p>The SWMR writer either opens an existing file and objects or creates them as follows.</p>
<p>Open an existing file:</p>
<p>Call H5Fopen using the H5F_ACC_SWMR_WRITE flag.
Begin writing datasets.
Periodically flush data.
Create a new file:</p>
<p>Call H5Fcreate using the latest file format.
Create groups, datasets and attributes, and then close the attributes.
Call H5F_START_SWMR_WRITE to start SWMR access to the file.
Periodically flush data.</p>
<h4 id="example-code">Example Code:</h4>
<p>Create the file using the latest file format property:</p>
<p>
fapl = H5Pcreate (H5P_FILE_ACCESS);
status = H5Pset_libver_bounds (fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
[Create objects (files, datasets, ...). Close any attributes and named datatype objects. Groups and datasets may remain open before starting SWMR access to them.]</p>
<p>Start SWMR access to the file:</p>
<p> status = H5Fstart_swmr_write (fid);
Reopen the datasets and start writing, periodically flushing data:</p>
<p> status = H5Dwrite (dset_id, ...);
status = H5Dflush (dset_id);</p>
<h3 id="swmr-reader">SWMR Reader:</h3>
<p>The SWMR reader must continually poll for new data:</p>
<p>Call H5Fopen using the H5F_ACC_SWMR_READ flag.
Poll, checking the size of the dataset to see if there is new data available for reading.
Read new data, if any.</p>
<h4 id="example-code-1">Example Code:</h4>
<p>Open the file using the SWMR read flag:</p>
<p> fid = H5Fopen (filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, H5P_DEFAULT);
Open the dataset and then repeatedly poll the dataset, by getting the dimensions, reading new data, and refreshing:</p>
<p> dset_id = H5Dopen (...);
space_id = H5Dget_space (...);
while (...) {
status = H5Dread (dset_id, ...);
status = H5Drefresh (dset_id);
space_id = H5Dget_space (...);
}</p>
<h2 id="limitations-and-scope">Limitations and Scope</h2>
<p>An HDF5 file under SWMR access must reside on a system that complies with POSIX write() semantics. It is also limited in scope as follows:</p>
<p>The writer process is only allowed to modify raw data of existing datasets by;</p>
<p>Appending data along any unlimited dimension.
Modifying existing data
The following operations are not allowed (and the corresponding HDF5 files will fail):</p>
<p>The writer cannot add new objects to the file.
The writer cannot delete objects in the file.
The writer cannot modify or append data with variable length, string or region reference datatypes.
File space recycling is not allowed. As a result the size of a file modified by a SWMR writer may be larger than a file modified by a non-SWMR writer.</p>
<h2 id="tools-for-working-with-swmr">Tools for Working with SWMR</h2>
<p>Two new tools, h5watch and h5clear, are available for use with SWMR. The other HDF5 utilities have also been modified to recognize SWMR:</p>
<p>The h5watch tool allows a user to monitor the growth of a dataset.
The h5clear tool clears the status flags in the superblock of an HDF5 file.
The rest of the HDF5 tools will exit gracefully but not work with SWMR otherwise.</p>
<h2 id="programming-example">Programming Example</h2>
<p>A good example of using SWMR is included with the HDF5 tests in the source code. You can run it while reading the file it creates. If you then interrupt the application and reader and look at the resulting file, you will see that the file is still valid. Follow these steps:</p>
<p>Download the HDF5-1.10 source code to a local directory on a filesystem (that complies with POSIX write() semantics). Build the software. No special configuration options are needed to use SWMR.</p>
<p>Invoke two command terminal windows. In one window go into the bin/ directory of the built binaries. In the other window go into the test/ directory of the HDF5-1.10 source code that was just built.</p>
<p>In the window in the test/ directory compile and run use_append_chunk.c. The example writes a three dimensional dataset by planes (with chunks of size 1 x 256 x 256).</p>
<p>In the other window (in the bin/ directory) run h5watch on the file created by use_append_chunk.c (use_append_chunk.h5). It should be run while use_append_chunk is executing and you will see valid data displayed with h5watch.</p>
<p>Interrupt use_append_chunk while it is running, and stop h5watch.</p>
<p>Use h5clear to clear the status flags in the superblock of the HDF5 file (use_append_chunk.h5).</p>
<p>View the file with h5dump. You will see that it is a valid file even though the application did not close properly. It will contain data up to the point that it was interrupted.</p>
</body></html>
-72
View File
@@ -1,72 +0,0 @@
<html>
<head>
<title>Introduction to the Virtual Dataset - VDS</title>
<p>The HDF5 Virtual Dataset (VDS) feature enables users to access data in a collection of HDF5 files as a single HDF5 dataset and to use the HDF5 APIs to work with that dataset.</p>
<p>For example, your data may be collected into four files:</p>
<p><img src="tutrvds-multimgs.png" alt="tutrvds-multimgs.png" width=750></center>
<p>You can map the datasets in the four files into a single VDS that can be accessed just like any other dataset:</p>
<p><img src="tutrvds-snglimg.png" alt="tutrvds-snglimg.png" width=500></center>
<p>The mapping between a VDS and the HDF5 source datasets is persistent and transparent to an application. If a source file is missing the fill value will be displayed.</p>
<p>See the Virtual (VDS) Documentation for complete details regarding the VDS feature.</p>
<p>The VDS feature was implemented using hyperslab selection (H5S_SELECT_HYPERSLAB). See the tutorial on Reading From or Writing to a Subset of a Dataset for more information on selecting hyperslabs.</p>
<p>Programming Model
To create a Virtual Dataset you simply follow the HDF5 programming model and add a few additional API calls to map the source code datasets to the VDS.</p>
<p>Following are the steps for creating a Virtual Dataset:</p>
<p>Create the source datasets that will comprise the VDS
Create the VDS: ‐ Define a datatype and dataspace (can be unlimited)
‐ Define the dataset creation property list (including fill value)
‐ (Repeat for each source dataset) Map elements from the source dataset to elements of the VDS:
Select elements in the source dataset (source selection)
Select elements in the virtual dataset (destination selection)
Map destination selections to source selections (see Functions for Working with a VDS)</p>
<p>‐ Call H5Dcreate using the properties defined above
Access the VDS as a regular HDF5 dataset
Close the VDS when finished</p>
<p>Functions for Working with a VDS
The H5P_SET_VIRTUAL API sets the mapping between virtual and source datasets. This is a dataset creation property list. Using this API will change the layout of the dataset to H5D_VIRTUAL. As with specifying any dataset creation property list, an instance of the property list is created, modified, passed into the dataset creation call and then closed:</p>
<p> dcpl = H5Pcreate (H5P_DATASET_CREATE);</p>
<p> src_space = H5screate_simple ...
status = H5Sselect_hyperslab (space, ...
status = H5Pset_virtual (dcpl, space, SRC_FILE[i], SRC_DATASET[i], src_space);</p>
<p> dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);</p>
<p> status = H5Pclose (dcpl);
There are several other APIs introduced with Virtual Datasets, including query functions. For details see the complete list of HDF5 library APIs that support Virtual Datasets</p>
<p>Limitations
This feature requires HDF5-1.10.
The number of source datasets is unlimited. However, there is a limit on the size of each source dataset.</p>
<p>Programming Examples
Example 1
This example creates three HDF5 files, each with a one-dimensional dataset of 6 elements. The datasets in these files are the source datasets that are then used to create a 4 x 6 Virtual Dataset with a fill value of -1. The first three rows of the VDS are mapped to the data from the three source datasets as shown below:</p>
<p><img src="tutrvds-ex.png" alt="tutrvds-ex.png" width=500></p>
<p>In this example the three source datasets are mapped to the VDS with this code:</p>
<pre><code>src\_space = H5Screate\_simple (RANK1, dims, NULL);
for (i = 0; i &lt; 3; i++) {
start[0] = (hsize\_t)i;
/* Select i-th row in the virtual dataset; selection in the source datasets is the same. */
status = H5Sselect\_hyperslab (space, H5S\_SELECT\_SET, start, NULL, count, block);
status = H5Pset\_virtual (dcpl, space, SRC\_FILE[i], SRC\_DATASET[i], src\_space);
}
</code></pre>
<p>After the VDS is created and closed, it is reopened. The property list is then queried to determine the layout of the dataset and its mappings, and the data in the VDS is read and printed.</p>
<p>This example is in the HDF5 source code and can be obtained from here:</p>
<p>C Example</p>
<p>For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]</p>
<p>Example 2
This example shows how to use a C-style printf statement for specifying multiple source datasets as one virtual dataset. Only one mapping is required. In other words only one H5P_SET_VIRTUAL call is needed to map multiple datasets. It creates a 2-dimensional unlimited VDS. Then it re-opens the file, makes queries, and reads the virtual dataset.</p>
<p>The source datasets are specified as A-0, A-1, A-2, and A-3. These are mapped to the virtual dataset with one call:</p>
<pre><code>status = H5Pset\_virtual (dcpl, vspace, SRCFILE, &quot;/A-%b&quot;, src\_space);
</code></pre>
<p>The %b indicates that the block count of the selection in the dimension should be used.</p>
<p>C Example</p>
<p>For details on compiling an HDF5 application: [ Compiling HDF5 Applications ]</p>
<p>Using h5dump with a VDS
The h5dump utility can be used to view a VDS. The h5dump output for a VDS looks exactly like that for any other dataset. If h5dump cannot find a source dataset then the fill value will be displayed.</p>
<p>You can determine that a dataset is a VDS by looking at its properties with h5dump -p. It will display each source dataset mapping, beginning with Mapping 0. Below is an excerpt of the output of h5dump -p on the vds.h5 file created in Example 1.You can see that the entire source file a.h5 is mapped to the first row of the /VDS dataset:</p>
<p><img src="tutrvds-map.png" alt="tutrvds-map.png" width=650></p>
</body></html>
+4 -4
View File
@@ -490,12 +490,12 @@ and one raw data file.</td>
<tr>
<td>#H5Pget_filter</td>
<td>Returns information about a filter in a pipeline.
The C function is a macro: \see \ref api-compat-macros.</td>
The C function is a macro: @see @ref api-compat-macros.</td>
</tr>
<tr>
<td>#H5Pget_filter_by_id</td>
<td>Returns information about the specified filter.
The C function is a macro: \see \ref api-compat-macros.</td>
The C function is a macro: @see @ref api-compat-macros.</td>
</tr>
<tr>
<td>#H5Pmodify_filter</td>
@@ -739,12 +739,12 @@ of the library for reading or writing the actual data.</td>
<tr>
<td>#H5Pget_filter</td>
<td>Returns information about a filter in a pipeline. The
C function is a macro: \see \ref api-compat-macros.</td>
C function is a macro: @see @ref api-compat-macros.</td>
</tr>
<tr>
<td>#H5Pget_filter_by_id</td>
<td>Returns information about the specified filter. The
C function is a macro: \see \ref api-compat-macros.</td>
C function is a macro: @see @ref api-compat-macros.</td>
</tr>
<tr>
<td>#H5Pget_nfilters</td>
+3 -3
View File
@@ -5,12 +5,12 @@
<tab type="user" url="@ref GettingStarted" title="Getting started" />
<tab type="user" url="@ref UG" title="User Guide" />
<tab type="user" url="@ref RM" title="Reference Manual" />
<!-- <tab type="user" url="https://\DSPURL/HDF5+Application+Developer%27s+Guide" title="Application Developer's Guide" />
<tab type="user" url="https://github.com/HDFGroup/arch-doc/blob/main/An_Overview_of_the_HDF5_Library_Architecture.v2.pdf" title="HDF5 Library Architecture Overview" /> -->
<!-- <tab type="user" url="https://support.hdfgroup.org/documentation/hdf5/HDF5+Application+Developer%27s+Guide" title="Application Developer's Guide" />
<tab type="user" url="https://support.hdfgroup.org/documentation/hdf5/An_Overview_of_the_HDF5_Library_Architecture.v2.pdf" title="HDF5 Library Architecture Overview" /> -->
<tab type="user" url="@ref Cookbook" title="Cookbook" />
<tab type="user" url="@ref TN" title="Technical Notes" />
<!-- <tab type="user" url="@ref VOL_Connector" title="HDF5 VOL Connector Author Guide" />
<tab type="user" url="https://\DSPURL/HDF5+VOL+User%27s+Guide" title="HDF5 VOL User's Guide" /> -->
<tab type="user" url="https://support.hdfgroup.org/documentation/hdf5/HDF5+VOL+User%27s+Guide" title="HDF5 VOL User's Guide" /> -->
<tab type="user" url="@ref RFC" title="RFCs" />
<tab type="user" url="@ref SPEC" title="Specifications" />
<tab type="user" url="@ref GLS" title="Glossary" />
+1 -1
View File
@@ -161,7 +161,7 @@ H5_HLDLL herr_t H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t e
* from one datatype to another, and the filter pipeline to write the chunk.
* Developers should have experience with these processes before
* using this function. Please see
* <a href="https://\DSPURL/Using+the+Direct+Chunk+Write+Function">
* <a href="https://\DOCURL/Using+the+Direct+Chunk+Write+Function">
* Using the Direct Chunk Write Function</a>
* for more information.
*
+3 -3
View File
@@ -117,7 +117,7 @@ H5_HLDLL herr_t H5DSwith_new_ref(hid_t obj_id, hbool_t *with_new_ref);
*
* Entries are created in the #DIMENSION_LIST and
* #REFERENCE_LIST attributes, as defined in section 4.2 of
* <a href="https://support.hdfgroup.org/HDF5/doc/HL/H5DS_Spec.pdf">
* <a href="https://docs.hdfgroup.org/documentation/HDF5/HL/H5DS_Spec.pdf">
* HDF5 Dimension Scale Specification</a>.
*
* Fails if:
@@ -147,7 +147,7 @@ H5_HLDLL herr_t H5DSattach_scale(hid_t did, hid_t dsid, unsigned int idx);
* dimension \p idx of dataset \p did. This deletes the entries in the
* #DIMENSION_LIST and #REFERENCE_LIST attributes,
* as defined in section 4.2 of
* <a href="https://support.hdfgroup.org/HDF5/doc/HL/H5DS_Spec.pdf">
* <a href="https://support.hdfgroup.org/documentation/HDF5/HL/H5DS_Spec.pdf">
* HDF5 Dimension Scale Specification</a>.
*
* Fails if:
@@ -180,7 +180,7 @@ H5_HLDLL herr_t H5DSdetach_scale(hid_t did, hid_t dsid, unsigned int idx);
* as defined above. Creates the CLASS attribute, set to the value
* "DIMENSION_SCALE" and an empty #REFERENCE_LIST attribute,
* as described in
* <a href="https://support.hdfgroup.org/HDF5/doc/HL/H5DS_Spec.pdf">
* <a href="https://support.hdfgroup.org/documentation/HDF5/HL/H5DS_Spec.pdf">
* HDF5 Dimension Scale Specification</a>.
* (PDF, see section 4.2).
*
+5 -5
View File
@@ -1386,8 +1386,8 @@ H5_HLDLL herr_t H5LTget_attribute_info(hid_t loc_id, const char *obj_name, const
* \p lang_type definition of HDF5 datatypes.
* Currently, only the DDL(#H5LT_DDL) is supported.
* The complete DDL definition of HDF5 datatypes can be found in
* the last chapter of the
* <a href="https://\DSPURL/HDF5+User+Guides">
* the specifications chapter of the
* <a href="https://\DOXURL/_s_p_e_c.html">
* HDF5 User's Guide</a>.
*
* \par Example
@@ -1424,8 +1424,8 @@ H5_HLDLL hid_t H5LTtext_to_dtype(const char *text, H5LT_lang_t lang_type);
*
* Currently only DDL (#H5LT_DDL) is supported for \p lang_type.
* The complete DDL definition of HDF5 data types can be found in
* the last chapter of the
* <a href="https://\DSPURL/HDF5+User+Guides">
* the specifications chapter of the
* <a href="https://\DOXURL/_s_p_e_c.html">
* HDF5 User's Guide</a>.
*
* \par Example
@@ -1625,7 +1625,7 @@ H5_HLDLL htri_t H5LTpath_valid(hid_t loc_id, const char *path, hbool_t check_obj
* \note **Recommended Reading:**
* \note This function is part of the file image operations feature set.
* It is highly recommended to study the guide
* <a href="https://\DSPURL/HDF5+File+Image+Operations">
* <a href="https://\DOCURL/HDF5+File+Image+Operations">
* HDF5 File Image Operations</a> before using this feature set.\n
* See the “See Also” section below for links to other elements of
* HDF5 file image operations.
+1 -1
View File
@@ -91,6 +91,6 @@ The <i><b>H5</b> </i>class automatically loads the native method implementations
and the HDF5 library.
<h3>To Obtain</h3>
The JHI5 is included with the <a href="https://support.hdfgroup.org/downloads/index.html">HDF5</a> library.
The JHI5 is included with the <a href="https://support.hdfgroup.org/downloads/HDF5/index.html">HDF5</a> library.
</body>
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-3
View File
@@ -21,9 +21,6 @@ extern "C" {
* Each routine wraps a single HDF entry point, generally with the
* analogous arguments and return codes.
*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#include <jni.h>
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#include <jni.h>
#include "H5version.h"
#include <string.h>
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-5
View File
@@ -10,11 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifndef H5UTIL_H__
#define H5UTIL_H__
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-6
View File
@@ -10,12 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-5
View File
@@ -10,11 +10,6 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* For details of the HDF libraries, see the HDF Documentation at:
* https://portal.hdfgroup.org/documentation/index.html
*
*/
/*
* This module contains the implementation of all the native methods
* used for number conversion. This is represented by the Java
+1 -1
View File
@@ -49,7 +49,7 @@ CONTENTS
include the Szip library with the encoder enabled. These can be found
here:
https://www.hdfgroup.org/downloads/hdf5/
https://support.hdfgroup.org/downloads/HDF5
Please notice that if HDF5 configure cannot find a valid Szip library,
configure will not fail; in this case, the compression filter will
+2 -2
View File
@@ -334,7 +334,7 @@ III. Full installation instructions for source distributions
(or '--with-pthread=DIR') flag to the configure script.
For further information, see:
https://portal.hdfgroup.org/display/knowledge/Questions+about+thread-safety+and+concurrent+access
https://support.hdfgroup.org/documentation/HDF5/Questions+about+thread-safety+and+concurrent+access
The high-level, C++, Fortran and Java interfaces are not compatible
with the thread-safety option because the lock is not hoisted
@@ -492,7 +492,7 @@ IV. Using the Library
For information on using HDF5 see the documentation, tutorials and examples
found here:
https://portal.hdfgroup.org/documentation/index.html
https://support.hdfgroup.org/documentation/HDF5/index.html
A summary of the features included in the built HDF5 installation can be found
in the libhdf5.settings file in the same directory as the static and/or
+1 -1
View File
@@ -59,7 +59,7 @@ HDF Group recommends using the ctest script mode to build HDF5.
-------------------------------------------------------------------------
Individual files needed as mentioned in this document
-------------------------------------------------------------------------
Download from https://github.com/HDFGroup/hdf5/tree/master/config/cmake/scripts:
Download from https://github.com/HDFGroup/hdf5/blob/develop/config/cmake/scripts:
CTestScript.cmake -- CMake build script
HDF5config.cmake -- CMake configuration script
+1 -1
View File
@@ -90,7 +90,7 @@ nodes. They would probably work for other Cray systems but have
not been verified.
Obtain the HDF5 source code:
https://portal.hdfgroup.org/display/support/Downloads
https://support.hdfgroup.org/downloads/HDF5
The entire build process should be done on a MOM node in an interactive allocation and on a file system accessible by all compute nodes.
Request an interactive allocation with qsub:
+3 -3
View File
@@ -15,16 +15,16 @@ final release.
Links to HDF5 documentation can be found on:
https://portal.hdfgroup.org/documentation/
https://support.hdfgroup.org/documentation/HDF5
The official HDF5 releases can be obtained from:
https://www.hdfgroup.org/downloads/hdf5/
https://support.hdfgroup.org/downloads/HDF5/
Changes from Release to Release and New Features in the HDF5-1.16.x release series
can be found at:
https://portal.hdfgroup.org/documentation/hdf5-docs/release_specific_info.html
https://support.hdfgroup.org/documentation/HDF5/release_specific_info.html
If you have any questions or comments, please send them to the HDF Help Desk:
+41 -25
View File
@@ -18,7 +18,7 @@ Maintenance releases are always forward compatible with regards to the HDF5 file
- HDF5 libraries and command line utilities can access files created by future maintenance versions of the library.
Note that maintenance releases are NOT guaranteed to be interface-compatible, meaning that, on occasion, application source code will need updated and re-compiled against a new maintenance release when the interface changes. Interface changes are only made when absolutely necessary as deemed by the HDF5 product manager(s), and interface compatibility reports are published with each release to inform customers and users of any incompatibilities in the interface.
For more information on the HDF5 versioning and backward and forward compatibility issues, see the [API Compatibility Macros](https://hdfgroup.github.io/hdf5/develop/api-compat-macros.html) on the public website.
For more information on the HDF5 versioning and backward and forward compatibility issues, see the [API Compatibility Macros][u13] on the public website.
## Participants:
- Product Manager — The individual responsible for the overall direction and development of a software product at The HDF Group.
@@ -35,21 +35,21 @@ For more information on the HDF5 versioning and backward and forward compatibili
### 3. Prepare Release Notes (Release Manager)
1. Confirm that all non-trivial changes made to the source are reflected in the release notes. Verify the following:
- [HDF5 Milestones Projects](https://github.com/HDFGroup/hdf5/milestones)
- Each entry in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt) traces to one or more resolved GH issues marked with FixVersion="X.Y.Z".
- Each resolved GH milestone issue traces to an entry in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt).
- Each entry in [RELEASE.txt][u1] traces to one or more resolved GH issues marked with FixVersion="X.Y.Z".
- Each resolved GH milestone issue traces to an entry in [RELEASE.txt][u1].
- Each resolved GH milestone issue traces to one or more revisions to the HDF5 source.
- Each resolved GH milestone issue traces to one or more pull requests.
2. For each previously authored KNOWN ISSUE in the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt), if the issue has been resolved or can no longer be confirmed, remove the issue from the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt).
2. For each previously authored KNOWN ISSUE in the [RELEASE.txt][u1], if the issue has been resolved or can no longer be confirmed, remove the issue from the [RELEASE.txt][u1].
- Document any new known issues at the top of the list.
3. Update the TESTED CONFIGURATION FEATURES SUMMARY in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt) to correspond to features and options that have been tested during the maintenance period by the automated daily regression tests.
3. Update the TESTED CONFIGURATION FEATURES SUMMARY in [RELEASE.txt][u1] to correspond to features and options that have been tested during the maintenance period by the automated daily regression tests.
- **See: Testing/Testing Systems(this is a page in confluence)**
4. Update current compiler information for each platform in the PLATFORMS TESTED section of [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt).
5. Review the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt) for formatting and language to verify that it corresponds to guidelines found in **[Writing Notes in a RELEASE.txt(this is missing)]()** File.
6. Review and update, if needed, the [README](https://github.com/HDFGroup/hdf5/blob/develop/README.md) and [COPYING](https://github.com/HDFGroup/hdf5/blob/develop/COPYING) files.
7. Review and update all INSTALL_* files in [release_docs](https://github.com/HDFGroup/hdf5/tree/develop/release_docs), if needed.
- [INSTALL](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL) should be general info and not require extensive changes
- [INSTALL_Autotools.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL_Autotools.txt) are the instructions for building under autotools.
- [INSTALL_CMake.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL_CMake.txt) are the instructions for building under CMake.
4. Update current compiler information for each platform in the PLATFORMS TESTED section of [RELEASE.txt][u1].
5. Review the [RELEASE.txt][u1] for formatting and language to verify that it corresponds to guidelines found in **[Writing Notes in a RELEASE.txt(this is missing)]()** File.
6. Review and update, if needed, the [README][u2] and [COPYING][u3] files.
7. Review and update all INSTALL_* files in [release_docs][u4], if needed.
- [INSTALL][u5] should be general info and not require extensive changes
- [INSTALL_Autotools.txt][u6] are the instructions for building under autotools.
- [INSTALL_CMake.txt][u7] are the instructions for building under CMake.
### 4. Freeze Code (Release Manager | Test Automation Team)
1. Transition from performing maintenance on software to preparing for its delivery.
@@ -62,14 +62,14 @@ For more information on the HDF5 versioning and backward and forward compatibili
### 5. Update Interface Version (Release Manager | Product Manager)
1. Verify interface additions, changes, and removals, and update the shared library interface version number.
2. Execute the CI snapshot workflow.
- Actions - “[hdf5 release build](https://github.com/HDFGroup/hdf5/blob/develop/.github/workflows/release.yml)” workflow and use the defaults.
- Actions - “[hdf5 release build][u8]” workflow and use the defaults.
3. Download and inspect release build source and binary files. Downloaded source files should build correctly, one or more binaries should install and run correctly. There should be nothing missing nor any extraneous files that aren’t meant for release.
4. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots](https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.14) page.
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot](https://github.com/HDFGroup/hdf5/releases/tag/snapshot) section.
5. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots](https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.14) page.
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot](https://github.com/HDFGroup/hdf5/releases/tag/snapshot) section.
4. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots]u14] page.
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot][u15] section.
5. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots][u14] page.
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot][u15] section.
6. Confirm the necessity of and approve of any interface-breaking changes. If any changes need to be reverted, task the developer who made the change to do so as soon as possible. If a change is reverted, return to the previous step and regenerate the compatibility report after the changes is made. Otherwise, continue to the next step.
7. Update the .so version numbers in the [config/lt_vers.am](https://github.com/HDFGroup/hdf5/blob/develop/config/lt_vers.am) file in the support branch according to [libtool's library interface version](https://www.gnu.org/software/libtool/manual/libtool.html#Versioning) scheme.
7. Update the .so version numbers in the [config/lt_vers.am][u9] file in the support branch according to [libtool's library interface version](https://www.gnu.org/software/libtool/manual/libtool.html#Versioning) scheme.
- See [Updating version info (Libtool)](https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info) for rules to help update library version numbers.
8. After the release branch has been created, run `./autogen.sh` to regenerate build system files on the release branch and commit the changes.
@@ -83,21 +83,21 @@ For more information on the HDF5 versioning and backward and forward compatibili
- or create the new branch in GitHub GUI.
4. Check that required CMake files point to the specific versions of the third-party software (szip, zlib and plugins) that they depend on.
- Update as needed.
5. Change the **support** branch to X.Y.{Z+1}-1 using the [bin/h5vers](https://github.com/HDFGroup/hdf5/blob/develop/bin/h5vers) script:
5. Change the **support** branch to X.Y.{Z+1}-1 using the [bin/h5vers][u10] script:
- `$ git checkout hdf5_X_Y`
- `$ bin/h5vers -s X.Y.{Z+1}-1;`
- `$ git commit -m "Updated support branch version number to X.Y.{Z+1}-1"`
- `$ git push`
6. Change the **release preparation branch**'s version number to X.Y.Z-{SR+1} using the [bin/h5vers](https://github.com/HDFGroup/hdf5/blob/develop/bin/h5vers) script:
6. Change the **release preparation branch**'s version number to X.Y.Z-{SR+1} using the [bin/h5vers][u10]/bin/h5vers script:
- `$ git checkout hdf5_X_Y_Z;`
- `$ bin/h5vers -s X.Y.Z-{SR+1};`
- `$ git commit -m "Updated release preparation branch version number to X.Y.Z-{SR+1}"`
- `$ git push`
7. Update default configuration mode
- `$ git checkout hdf5_X_Y_Z;` and `$ bin/switch_maint_mode -disable ./configure.ac` to disable `AM_MAINTAINER_MODE`.
- Need to set option `HDF5_GENERATE_HEADERS` to `OFF`, currently in line 996 of [src/CMakeLists.txt](https://github.com/HDFGroup/hdf5/blob/develop/src/CMakeLists.txt).
- Change the **release preparation branch**'s (i.e. hdf5_X_Y_Z) default configuration mode from development to production in [configure.ac](https://github.com/HDFGroup/hdf5/blob/develop/configure.ac).
- Find “Determine build mode” in [configure.ac](https://github.com/HDFGroup/hdf5/blob/develop/configure.ac).
- Need to set option `HDF5_GENERATE_HEADERS` to `OFF`, currently in line 996 of [src/CMakeLists.txt][11].
- Change the **release preparation branch**'s (i.e. hdf5_X_Y_Z) default configuration mode from development to production in [configure.ac][u12].
- Find “Determine build mode” in [configure.ac][u12].
- Change `default=debug` to `default=production` at the bottom of the `AS_HELP_STRING` for `--enable-build-mode`.
- Under `if test "X-$BUILD_MODE" = X- ; then` change `BUILD_MODE=debug` to `BUILD_MODE=production`.
- Run `sh ./autogen.sh` to regenerate the UNIX build system files and commit the changes. (use `git status --ignored` to see the changes and `git add -f` to add all files. First delete any new files not to be committed, notably `src/H5public.h~` and `autom4te.cache/`.)
@@ -114,7 +114,7 @@ For more information on the HDF5 versioning and backward and forward compatibili
7. Choose the release branch
8. Change ‘Release version tag’ name to 'hdf5_X.Y.Z.P'
- P is some pre-release number.
9. Send a message to the HDF forum indicating that a pre-release source package is available for testing at <e.g. gamma.hdfgroup.org/ftp/pub/outgoing/hdf5/{hdf5-X.Y.Z-P}> and that feedback from the user community on their test results is being accepted.
9. Send a message to the HDF forum indicating that a pre-release source package is available for testing at <e.g. https://github.com/HDFGroup/hdf5/releases/{hdf5-X.Y.Z-P}> and that feedback from the user community on their test results is being accepted.
10. Contact paying clients who are interested in testing the pre-release source package and inform them that it is available for testing and that feedback on their test results of the pre-release is appreciated.
11. This should be automated and currently github binaries are not signed.
- Follow the [How to sign binaries with digital certificates(this is missing)]() work instructions to sign each Windows and Mac binary package with a digital certificate.
@@ -137,7 +137,7 @@ For more information on the HDF5 versioning and backward and forward compatibili
### 8. Finalize Release Notes (Release Manager)
1. Perform a final review of release notes and ensure that any new changes made to the source, any new known issues discovered, and any additional tests run since the code freeze have been reflected in RELEASE.txt and other appropriate in-source documentation files (INSTALL_*, etc.). (Refer to the sub-steps of step 3 for what to check).
2. Update the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt) in the **support** branch (i.e. hdf5_X_Y) to remove entries in “Bugs fixed” and “New Features” sections and increment the version number for the following release (“Bug fixes since X.Y.Z” - occurs twice).
2. Update the [RELEASE.txt][u1] in the **support** branch (i.e. hdf5_X_Y) to remove entries in “Bugs fixed” and “New Features” sections and increment the version number for the following release (“Bug fixes since X.Y.Z” - occurs twice).
- `$ git checkout hdf5_X_Y`
- `$ vi RELEASE.txt # update RELEASE.txt to clear it out`
- `$ git commit -m "Reset RELEASE.txt in preparation for the next release."`
@@ -161,3 +161,19 @@ For more information on the HDF5 versioning and backward and forward compatibili
### 11. Conduct Release Retrospective (Release Manager)
1. Schedule time and solicit comments from retrospective
2. Identify issues and document them
[u1]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt
[u2]: https://github.com/HDFGroup/hdf5/blob/develop/README.md
[u3]: https://github.com/HDFGroup/hdf5/blob/develop/COPYING
[u4]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs
[u5]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL
[u6]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL_Auto.txt
[u7]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL_CMake.txt
[u8]: https://github.com/HDFGroup/hdf5/blob/develop/.github/workflows/release.yml
[u9]: https://github.com/HDFGroup/hdf5/blob/develop/config/lt_vers.am
[u10]: https://github.com/HDFGroup/hdf5/blob/develop/bin/h5vers
[u11]: https://github.com/HDFGroup/hdf5/blob/develop/src/CMakeLists.txt
[u12]: https://github.com/HDFGroup/hdf5/blob/develop/configure.ac
[u13]: https://support.hdfgroup.org/documentation/HDF5/v1_14/v1_14_4/api-compat-macros.html
[u14]: https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.14
[u15]: https://github.com/HDFGroup/hdf5/releases/tag/snapshot
+2 -22
View File
@@ -59,7 +59,7 @@
* attached directly to that object
*
* \subsection subsec_error_H5A Attribute Function Summaries
* @see H5A reference manual
* see @ref H5A reference manual
*
* \subsection subsec_attribute_program Programming Model for Attributes
*
@@ -98,26 +98,6 @@
* \li Close the attribute
* \li Close the primary data object (if appropriate)
*
* <table>
* <tr><th>Create</th><th>Update</th></tr>
* <tr valign="top">
* <td>
* \snippet{lineno} H5A_examples.c create
* </td>
* <td>
* \snippet{lineno} H5A_examples.c update
* </td>
* <tr><th>Read</th><th>Delete</th></tr>
* <tr valign="top">
* <td>
* \snippet{lineno} H5A_examples.c read
* </td>
* <td>
* \snippet{lineno} H5A_examples.c delete
* </td>
* </tr>
* </table>
*
* \subsection subsec_attribute_work Working with Attributes
*
* \subsubsection subsubsec_attribute_work_struct The Structure of an Attribute
@@ -376,7 +356,7 @@
* An HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary data
* object. A primary data object may be a dataset, group, or committed datatype.
*
* @see sec_attribute
* @see \ref sec_attribute
*
*/
+4 -4
View File
@@ -887,7 +887,7 @@ filter.</td>
* It is clear that the internal HDF5 filter mechanism, while extensible, does not work well with third-party
* filters. It would be a maintenance nightmare to keep adding and supporting new compression methods
* in HDF5. For any set of HDF5 “internal” filters, there always will be data with which the “internal”
filters
* filters
* will not achieve the optimal performance needed to address data I/O and storage problems. Thus the
* internal HDF5 filter mechanism is enhanced to address the issues discussed above.
*
@@ -901,7 +901,7 @@ filters
*
* When an application reads data compressed with a third-party HDF5 filter, the HDF5 Library will search
* for the required filter plugin, register the filter with the library (if the filter function is not
registered) and
* registered) and
* apply it to the data on the read operation.
*
* For more information,
@@ -1496,7 +1496,7 @@ allocated if necessary.
* the size of the memory datatype and the number of elements in the memory selection.
*
* Variable-length data are organized in two or more areas of memory. For more information,
* \see \ref h4_vlen_datatype "Variable-length Datatypes".
* see \ref h4_vlen_datatype "Variable-length Datatypes".
*
* When writing data, the application creates an array of
* vl_info_t which contains pointers to the elements. The elements might be, for example, strings.
@@ -2735,7 +2735,7 @@ allocated if necessary.
* See The HDF Group website for further information regarding the SZip filter.
*
* \subsubsection subsubsec_dataset_filters_dyn Using Dynamically-Loadable Filters
* \see \ref sec_filter_plugins for further information regarding the dynamically-loadable filters.
* see \ref sec_filter_plugins for further information regarding the dynamically-loadable filters.
*
* HDF has a filter plugin repository of useful third-party plugins that can used
* <table>
+42 -49
View File
@@ -58,7 +58,7 @@
* design for the Error Handling API.
*
* \subsection subsec_error_H5E Error Handling Function Summaries
* @see H5E reference manual
* see @ref H5E reference manual
*
* \subsection subsec_error_program Programming Model for Error Handling
* This section is under construction.
@@ -80,24 +80,21 @@
* an error stack ID is needed as a parameter, \ref H5E_DEFAULT can be used to indicate the library's default
* stack. The first error record of the error stack, number #000, is produced by the API function itself and
* is usually sufficient to indicate to the application what went wrong.
* <table>
* <caption align=top>Example: An Error Message</caption>
* <tr>
* <td>
* <p>If an application calls \ref H5Tclose on a
* predefined datatype then the following message is
* printed on the standard error stream. This is a
* simple error that has only one component, the API
* function; other errors may have many components.
* <p><code><pre>
*
* If an application calls \ref H5Tclose on a
* predefined datatype then the following message is
* printed on the standard error stream. This is a
* simple error that has only one component, the API
* function; other errors may have many components.
*
* <em>An Error Message Example</em>
* \code
* HDF5-DIAG: Error detected in HDF5 (1.10.9) thread 0.
* #000: H5T.c line ### in H5Tclose(): predefined datatype
* major: Function argument
* minor: Bad value
* </pre></code>
* </td>
* </tr>
* </table>
* \endcode
*
* In the example above, we can see that an error record has a major message and a minor message. A major
* message generally indicates where the error happens. The location can be a dataset or a dataspace, for
* example. A minor message explains further details of the error. An example is “unable to open file”.
@@ -158,15 +155,15 @@
*
* <em>Example: Turn off error messages while probing a function</em>
* \code
* *** Save old error handler ***
* // Save old error handler
* H5E_auto2_t oldfunc;
* void *old_client_data;
* H5Eget_auto2(error_stack, &old_func, &old_client_data);
* *** Turn off error handling ***
* // Turn off error handling
* H5Eset_auto2(error_stack, NULL, NULL);
* *** Probe. Likely to fail, but that's okay ***
* // Probe. Likely to fail, but that's okay
* status = H5Fopen (......);
* *** Restore previous error handler ***
* // Restore previous error handler
* H5Eset_auto2(error_stack, old_func, old_client_data);
* \endcode
*
@@ -174,9 +171,9 @@
*
* <em>Example: Disable automatic printing and explicitly print error messages</em>
* \code
* *** Turn off error handling permanently ***
* // Turn off error handling permanently
* H5Eset_auto2(error_stack, NULL, NULL);
* *** If failure, print error message ***
* // If failure, print error message
* if (H5Fopen (....)<0) {
* H5Eprint2(H5E_DEFAULT, stderr);
* exit (1);
@@ -243,9 +240,9 @@
*
* The following example shows a user‐defined callback function.
*
* <em>Example: A user‐defined callback function</em>
* <em>A user‐defined callback function Example</em>
* \code
* \#define MSG_SIZE 64
* #define MSG_SIZE 64
* herr_t
* custom_print_cb(unsigned n, const H5E_error2_t *err_desc, void *client_data)
* {
@@ -255,7 +252,7 @@
* char cls[MSG_SIZE];
* const int indent = 4;
*
* *** Get descriptions for the major and minor error numbers ***
* // Get descriptions for the major and minor error numbers
* if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE) < 0)
* TEST_ERROR;
* if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE) < 0)
@@ -296,13 +293,11 @@
* to push its own error records onto the error stack once it declares an error class of its own through the
* HDF5 Error API.
*
* <table>
* <caption align=top>Example: An Error Report</caption>
* <tr>
* <td>
* <p>An error report shows both the library's error record and the application's error records.
* See the example below.
* <p><code><pre>
* An error report shows both the library's error record and the application's error records.
* See the example below.
*
* <em>An Error Report Example</em>
* \code
* Error Test-DIAG: Error detected in Error Program (1.0)
* thread 8192:
* #000: ../../hdf5/test/error_test.c line ### in main():
@@ -318,10 +313,8 @@
* not a dataset
* major: Invalid arguments to routine
* minor: Inappropriate type
* </pre></code>
* </td>
* </tr>
* </table>
*\endcode
*
* In the line above error record #002 in the example above, the starting phrase is HDF5. This is the error
* class name of the HDF5 Library. All of the library's error messages (major and minor) are in this default
* error class. The Error Test in the beginning of the line above error record #000 is the name of the
@@ -334,7 +327,7 @@
*
* <em>Example: The user‐defined error handler</em>
* \code
* \#define MSG_SIZE 64
* #define MSG_SIZE 64
* herr_t
* custom_print_cb(unsigned n, const H5E_error2_t *err_desc,
* void* client_data)
@@ -345,7 +338,7 @@
* char cls[MSG_SIZE];
* const int indent = 4;
*
* *** Get descriptions for the major and minor error numbers ***
* // Get descriptions for the major and minor error numbers
* if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE) < 0)
* TEST_ERROR;
* if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE) < 0)
@@ -411,13 +404,13 @@
*
* <em>Example: Create an error class and error messages</em>
* \code
* *** Create an error class ***
* // Create an error class
* class_id = H5Eregister_class(ERR_CLS_NAME, PROG_NAME, PROG_VERS);
* *** Retrieve class name ***
* // Retrieve class name
* H5Eget_class_name(class_id, cls_name, cls_size);
* *** Create a major error message in the class ***
* // Create a major error message in the class
* maj_id = H5Ecreate_msg(class_id, H5E_MAJOR, “... ...”);
* *** Create a minor error message in the class ***
* // Create a minor error message in the class
* min_id = H5Ecreate_msg(class_id, H5E_MINOR, “... ...”);
* \endcode
*
@@ -486,14 +479,14 @@
*
* <em>Example: Pushing an error message to an error stack</em>
* \code
* *** Make call to HDF5 I/O routine ***
* // Make call to HDF5 I/O routine
* if((dset_id=H5Dopen(file_id, dset_name, access_plist)) < 0)
* {
* *** Push client error onto error stack ***
* // Push client error onto error stack
* H5Epush(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,
* CLIENT_ERR_MAJ_IO,CLIENT_ERR_MINOR_OPEN, “H5Dopen failed”);
* }
* *** Indicate error occurred in function ***
* // Indicate error occurred in function
* return 0;
* \endcode
*
@@ -504,15 +497,15 @@
* \code
* if (H5Dwrite(dset_id, mem_type_id, mem_space_id, file_space_id, dset_xfer_plist_id, buf) < 0)
* {
* *** Push client error onto error stack ***
* // Push client error onto error stack
* H5Epush2(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,
* CLIENT_ERR_MAJ_IO,CLIENT_ERR_MINOR_HDF5,
* “H5Dwrite failed”);
* *** Preserve the error stack by assigning an object handle to it ***
* // Preserve the error stack by assigning an object handle to it
* error_stack = H5Eget_current_stack();
* *** Close dataset ***
* // Close dataset
* H5Dclose(dset_id);
* *** Replace the current error stack with the preserved one ***
* // Replace the current error stack with the preserved one
* H5Eset_current_stack(error_stack);
* }
* return 0;
@@ -545,7 +538,7 @@
* error stack. The error stack is statically allocated to reduce the
* complexity of handling errors within the \ref H5E package.
*
* @see sec_error
* @see \ref sec_error
*
*/
+15 -14
View File
@@ -43,7 +43,7 @@
* \li The use of low-level file drivers
*
* This chapter assumes an understanding of the material presented in the data model chapter. For
* more information, @see @ref sec_data_model.
* more information, see \ref sec_data_model.
*
* \subsection subsec_file_access_modes File Access Modes
* There are two issues regarding file access:
@@ -101,7 +101,7 @@
* a user-definable data block; the size of data address parameters; properties of the B-trees that are
* used to manage the data in the file; and certain HDF5 Library versioning information.
*
* For more information, @see @ref subsubsec_file_property_lists_props.
* For more information, see \ref subsubsec_file_property_lists_props.
*
* This section has a more detailed discussion of file creation properties. If you have no special
* requirements for these file characteristics, you can simply specify #H5P_DEFAULT for the default
@@ -112,7 +112,7 @@
* settings, and parallel I/O. Data alignment, metadata block and cache sizes, and data sieve buffer
* size are factors in improving I/O performance.
*
* For more information, @see @ref subsubsec_file_property_lists_access.
* For more information, see \ref subsubsec_file_property_lists_access.
*
* This section has a more detailed discussion of file access properties. If you have no special
* requirements for these file access characteristics, you can simply specify #H5P_DEFAULT for the
@@ -466,8 +466,9 @@
* remain valid. Each of these file identifiers must be released by calling #H5Fclose when it is no
* longer needed.
*
* For more information, @see @ref subsubsec_file_property_lists_access.
* For more information, @see @ref subsec_file_property_lists.
* For more information, see \ref subsubsec_file_property_lists_access.
*
* For more information, see \ref subsec_file_property_lists.
*
* \subsection subsec_file_closes Closing an HDF5 File
* #H5Fclose both closes a file and releases the file identifier returned by #H5Fopen or #H5Fcreate.
@@ -512,7 +513,7 @@
* information for every property list function is provided in the \ref H5P
* section of the HDF5 Reference Manual.
*
* For more information, @see @ref sec_plist.
* For more information, @see \ref sec_plist.
*
* \subsubsection subsubsec_file_property_lists_create Creating a Property List
* If you do not wish to rely on the default file creation and access properties, you must first create
@@ -594,7 +595,7 @@
* \subsubsection subsubsec_file_property_lists_access File Access Properties
* This section discusses file access properties that are not related to the low-level file drivers. File
* drivers are discussed separately later in this chapter.
* For more information, @see @ref subsec_file_alternate_drivers.
* For more information, @see \ref subsec_file_alternate_drivers.
*
* File access property lists control various aspects of file I/O and structure.
*
@@ -657,7 +658,7 @@
*
* HDF5 employs an extremely flexible mechanism called the virtual file layer, or VFL, for file
* I/O. A full understanding of the VFL is only necessary if you plan to write your own drivers
* @see \ref VFL in the HDF5 Technical Notes.
* see \ref VFL in the HDF5 Technical Notes.
*
* For our
* purposes here, it is sufficient to know that the low-level drivers used for file I/O reside in the
@@ -690,7 +691,7 @@
*
* If an application requires a special-purpose low-level driver, the VFL provides a public API for
* creating one. For more information on how to create a driver,
* @see @ref VFL in the HDF5 Technical Notes.
* see \ref VFL in the HDF5 Technical Notes.
*
* \subsubsection subsubsec_file_alternate_drivers_id Identifying the Previously‐used File Driver
* When creating a new HDF5 file, no history exists, so the file driver must be specified if it is to be
@@ -888,11 +889,11 @@
*
* Additional parameters may be added to these functions in the future.
*
* @see <a href="https://\DOCURL/advanced_topics/file_image_ops.html">
* see <a href="https://\DOCURL/advanced_topics/file_image_ops.html">
* HDF5 File Image Operations</a>
* section for information on more advanced usage of the Memory file driver, and
* @see <a
* href="https://docs.hdfgroup.org/archive/support/HDF5/doc/Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">
* see <a
* href="https://\DOCURL/advanced_topics/ModifiedRegionWrites.pdf">
* Modified Region Writes</a>
* section for information on how to set write operations so that only modified regions are written
* to storage.
@@ -1070,7 +1071,7 @@
* name is FILE. If the function does not find an existing file, it will create one. If it does find an
* existing file, it will empty the file in preparation for a new set of data. The identifier for the
* "new" file will be passed back to the application program.
* For more information, @see @ref subsec_file_access_modes.
* For more information, @see \ref subsec_file_access_modes.
*
* <em>Creating a file with default creation and access properties</em>
* \code
@@ -1182,7 +1183,7 @@
* Note: In the code example above, loc_id is the file identifier for File1, /B is the link path to the
* group where File2 is mounted, child_id is the file identifier for File2, and plist_id is a property
* list identifier.
* For more information, @see @ref sec_group.
* For more information, @see \ref sec_group.
*
* See the entries for #H5Fmount, #H5Funmount, and #H5Lcreate_external in the HDF5 Reference Manual.
*
+1 -1
View File
@@ -722,7 +722,7 @@
*
* <h4>Mounting a File</h4>
* An external link is a permanent connection between two files. A temporary connection can be set
* up with the #H5Fmount function. For more information, @see sec_file.
* up with the #H5Fmount function. For more information, @see \ref sec_file.
* For more information, see the #H5Fmount function in the \ref RM.
*
* \subsubsection subsubsec_group_program_info Discovering Information about Objects
+5 -3
View File
@@ -276,10 +276,12 @@
* \endcode
*
* See the documentation at
* <aref="https://github.com/HDFGroup/hdf5_plugins/tree/master/docs">hdf5_plugins/docs</a> folder. In
* <a href="https://github.com/HDFGroup/hdf5_plugins/tree/master/docs">hdf5_plugins/docs</a> folder. In
* particular:
* <aref="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/INSTALL_With_CMake.txt">INSTALL_With_CMake</a>
* <aref="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/USING_HDF5_AND_CMake.txt">USING_HDF5_AND_CMake</a>
* <a
* href="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/INSTALL_With_CMake.txt">INSTALL_With_CMake</a>
* <a
* href="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/USING_HDF5_AND_CMake.txt">USING_HDF5_AND_CMake</a>
*/
/**
+2 -2
View File
@@ -979,7 +979,7 @@
* <div>
* \snippet{doc} tables/propertyLists.dox lcpl_table
* </div>
* @see STRCPL
* @see @ref STRCPL
*
* \defgroup ACPL Attribute Creation Properties
* \ingroup STRCPL
@@ -988,7 +988,7 @@
* \snippet{doc} tables/propertyLists.dox acpl_table
* </div>
*
* @see STRCPL
* @see @ref STRCPL
*
* \defgroup LAPL Link Access Properties
* \ingroup H5P
+1 -1
View File
@@ -5205,7 +5205,7 @@ H5_DLL herr_t H5Pset_mdc_config(hid_t plist_id, H5AC_cache_config_t *config_ptr)
* current state of the logging flags.
*
* The log format is described in [<em>Metadata Cache Logging</em>]
* (https://\DSPURL/Fine-tuning+the+Metadata+Cache).
* (https://\DOCURL/advanced_topics/Fine-tuning+the+Metadata+Cache).
*
* \since 1.10.0
*
+172 -33
View File
@@ -53,7 +53,7 @@
* sub‐sampling, and scatter‐gather access to datasets.
*
* \subsection subsec_dataspace_function Dataspace Function Summaries
* @see H5S reference manual provides a reference list of dataspace functions, the H5S APIs.
* see \ref H5S reference manual provides a reference list of dataspace functions, the H5S APIs.
*
* \subsection subsec_dataspace_program Definition of Dataspace Objects and the Dataspace Programming Model
*
@@ -977,9 +977,9 @@
* \subsection subsec_dataspace_refer References
*
* Another use of selections is to store a reference to a region of a dataset in the file or an external file.
An HDF5 object reference
* An HDF5 object reference
* object is a pointer to an object (attribute, dataset, group, or committed datatype) in the file or an
external file. A selection can
* external file. A selection can
* be used to create a pointer to a set of selected elements of a dataset, called a region reference. The
* selection can be either a point selection or a hyperslab selection.
*
@@ -990,36 +990,9 @@
* To discover the elements and/or read the data, the region reference can be dereferenced to obtain the
* identifiers for the dataset and dataspace.
*
* For more information, \see subsubsec_datatype_other_refs.
* For more information, \see \ref subsubsec_datatype_other_refs.
*
* \subsubsection subsubsec_dataspace_refer_use Example Uses for Region References
*
* \subsubsection subsubsec_dataspace_refer_create Creating References to Regions
*
* \subsubsection subsubsec_dataspace_refer_read Reading References to Regions
*
* \subsection subsec_dataspace_deprecated_refer Deprecated References to Dataset Regions
* The API described in this section was deprecated since HDF5 1.12.0. Shown are
* examples and usage in use by applications written before 1.12.0.
*
* Another use of selections is to store a reference to a region of a dataset. An HDF5 object reference
* object is a pointer to an object (dataset, group, or committed datatype) in the file. A selection can
* be used to create a pointer to a set of selected elements of a dataset, called a region reference. The
* selection can be either a point selection or a hyperslab selection.
*
* A region reference is an object maintained by the HDF5 Library. The region reference can be stored in a
* dataset or attribute, and then read. The dataset or attribute is defined to have the special datatype,
* #H5T_STD_REF_DSETREG.
*
* To discover the elements and/or read the data, the region reference can be dereferenced. The
* #H5Rdereference call returns an identifier for the dataset, and then the selected dataspace can be
* retrieved with a call to #H5Rget_region(). The selected dataspace can be used to read the selected data
* elements.
*
* For more information, \see subsubsec_datatype_other_refs.
*
* \subsubsection subsubsec_dataspace_deprecated_refer_use Deprecated Example Uses for Region References
*
* Region references are used to implement stored pointers to data within a dataset. For example, features
* in a large dataset might be indexed by a table. See the figure below. This table could be stored as an
* HDF5 dataset with a compound datatype, for example, with a field for the name of the feature and a region
@@ -1041,9 +1014,175 @@
* </tr>
* </table>
*
* \subsubsection subsubsec_dataspace_refer_create Creating References to Regions
* To create a region reference:
* \li 1. Create or open the dataset that contains the region
* \li 2. Get the dataspace for the dataset
* \li 3. Define a selection that specifies the region
* \li 4. Create a region reference using the dataset and dataspace with selection
* \li 5. Write the region reference(s) to the desired dataset or attribute
* \li 6. Release the region reference(s)
*
* The figure below shows a diagram of a file with three datasets. Dataset D1 and D2 are two dimensional
* arrays of integers. Dataset R1 is a one dimensional array of references to regions in D1 and D2. The
* regions can be any valid selection of the dataspace of the target dataset.
* <table>
* <tr>
* <td>
* \image html Dspace_three_datasets.gif "A file with three datasets"
* </td>
* </tr>
* </table>
* <em>Note: In the figure above, R1 is a 1 D array of region pointers; each pointer refers to a selection
* in one dataset.</em>
*
* The example below shows code to create the array of region references. The references are created in an
* array of type #H5R_ref_t. Each region is defined as a selection on the dataspace of the dataset,
* and a reference is created using \ref H5Rcreate_region(). The call to \ref H5Rcreate_region() specifies the
file,
* dataset, and the dataspace with selection.
*
* <em>Create an array of region references</em>
* \code
* // create an array of 4 region references
* H5R_ref_t ref[4];
*
* // Create a reference to the first hyperslab in the first Dataset.
* offset[0] = 1; offset[1] = 1;
* count[0] = 3; count[1] = 2;
* status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, count, NULL);
* status = H5Rcreate_region(file_id, "D1", space_id, H5P_DEFAULT, &ref[0]);
*
* // The second reference is to a union of hyperslabs in the first Dataset
* offset[0] = 5; offset[1] = 3;
* count[0] = 1; count[1] = 4;
* status = H5Sselect_none(space_id);
* status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, count, NULL);
* offset[0] = 6; offset[1] = 5;
* count[0] = 1; count[1] = 2;
* status = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, offset, NULL, count, NULL);
* status = H5Rcreate_region(file_id, "D1", space_id, H5P_DEFAULT, &ref[1]);
*
* // the fourth reference is to a selection of points in the first Dataset
* status = H5Sselect_none(space_id);
* coord[0][0] = 4; coord[0][1] = 4;
* coord[1][0] = 2; coord[1][1] = 6;
* coord[2][0] = 3; coord[2][1] = 7;
* coord[3][0] = 1; coord[3][1] = 5;
* coord[4][0] = 5; coord[4][1] = 8;
*
* status = H5Sselect_elements(space_id, H5S_SELECT_SET, num_points, (const hssize_t **)coord);
* status = H5Rcreate_region(file_id, "D1", space_id, H5P_DEFAULT, &ref[3]);
*
* // the third reference is to a hyperslab in the second Dataset
* offset[0] = 0; offset[1] = 0;
* count[0] = 4; count[1] = 6;
* status = H5Sselect_hyperslab(space_id2, H5S_SELECT_SET, offset, NULL, count, NULL);
* status = H5Rcreate_region(file_id, "D2", space_id2, H5P_DEFAULT, &ref[2]);
* \endcode
*
* When all the references are created, the array of references is written to the dataset R1. The
* dataset is declared to have datatype #H5T_STD_REF. See the example below. Also, note the release
* of the references afterwards.
*
* <em>Write the array of references to a dataset</em>
* \code
* Hsize_t dimsr[1];
* dimsr[0] = 4;
*
* // Dataset with references.
* spacer_id = H5Screate_simple(1, dimsr, NULL);
* dsetr_id = H5Dcreate(file_id, "R1", H5T_STD_REF_DSETREG, spacer_id, H5P_DEFAULT, H5P_DEFAULT,
* H5P_DEFAULT);
*
* // Write dataset with the references.
* status = H5Dwrite(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref);
*
* status = H5Rdestroy(&ref[0]);
* status = H5Rdestroy(&ref[1]);
* status = H5Rdestroy(&ref[0]);
* status = H5Rdestroy(&ref[1]);
* \endcode
*
* When creating region references, the following rules are enforced.
* \li The selection must be a valid selection for the target dataset, just as when transferring data
* \li The dataset must exist in the file when the reference is created; #H5Rcreate_region
* \li The target dataset must be in the same file as the stored reference
*
* \subsubsection subsubsec_dataspace_refer_read Reading References to Regions
* To retrieve data from a region reference, the reference must be read from the file, and then the data can
* be retrieved. The steps are:
* \li 1. Open the dataset or attribute containing the reference objects
* \li 2. Read the reference object(s)
* \li 3. For each region reference, get the dataset (#H5Ropen_object) and dataspace (#H5Ropen_region)
* \li 4. Use the dataspace and datatype to discover what space is needed to store the data, allocate the
* correct storage and create a dataspace and datatype to define the memory data layout
* \li 5. Release the region reference(s)
*
* The example below shows code to read an array of region references from a dataset, and then read the
* data from the first selected region. Note that the region reference has information that records the
* dataset (within the file) and the selection on the dataspace of the dataset. After dereferencing the
* regions reference, the datatype, number of points, and some aspects of the selection can be discovered.
* (For a union of hyperslabs, it may not be possible to determine the exact set of hyperslabs that has been
* combined.)
* The table below the code example shows the inquiry functions.
*
* When reading data from a region reference, the following rules are enforced:
* \li The target dataset must be present and accessible in the file
* \li The selection must be a valid selection for the dataset
*
* <em>Read an array of region references; read from the first selection</em>
* \code
* dsetr_id = H5Dopen (file_id, "R1", H5P_DEFAULT);
* status = H5Dread(dsetr_id, H5T_STD, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_out);
*
* // Dereference the first reference.
* // 1) get the dataset (H5Ropen_object)
* // 2) get the selected dataspace (H5Ropen_region)
*
* dsetv_id = H5Ropen_object(&ref_out[0], H5P_DEFAULT, H5P_DEFAULT);
* space_id = H5Ropen_region(&ref_out[0], H5P_DEFAULT, H5P_DEFAULT);
*
* // Discover how many points and shape of the data
* ndims = H5Sget_simple_extent_ndims(space_id);
* H5Sget_simple_extent_dims(space_id,dimsx,NULL);
*
* // Read and display hyperslab selection from the dataset.
* dimsy[0] = H5Sget_select_npoints(space_id);
* spacex_id = H5Screate_simple(1, dimsy, NULL);
*
* status = H5Dread(dsetv_id, H5T_NATIVE_INT, H5S_ALL, space_id, H5P_DEFAULT, data_out);
* printf("Selected hyperslab: ");
* for (i = 0; i < 8; i++) {
* printf("\n");
* for (j = 0; j < 10; j++)
* printf("%d ", data_out[i][j]);
* }
* printf("\n");
*
* status = H5Rdestroy(&ref_out[0]);
* \endcode
*
*
* \subsection subsec_dataspace_deprecated_refer Deprecated References to Dataset Regions
* The API described in this section was deprecated since HDF5 1.12.0. Shown are
* examples and usage in use by applications written before 1.12.0.
*
* Another use of selections is to store a reference to a region of a dataset. An HDF5 object reference
* object is a pointer to an object (dataset, group, or committed datatype) in the file. A selection can
* be used to create a pointer to a set of selected elements of a dataset, called a region reference. The
* selection can be either a point selection or a hyperslab selection.
*
* A region reference is an object maintained by the HDF5 Library. The region reference can be stored in a
* dataset or attribute, and then read. The dataset or attribute is defined to have the special datatype,
* #H5T_STD_REF_DSETREG.
*
* To discover the elements and/or read the data, the region reference can be dereferenced. The
* #H5Rdereference call returns an identifier for the dataset, and then the selected dataspace can be
* retrieved with a call to #H5Rget_region(). The selected dataspace can be used to read the selected data
* elements.
*
* \subsubsection subsubsec_dataspace_deprecated_refer_create Deprecated Creating References to Regions
*
* To create a region reference:
* \li 1. Create or open the dataset that contains the region
* \li 2. Get the dataspace for the dataset
@@ -1183,6 +1322,7 @@
* printf("\n");
* \endcode
*
* \subsection subsec_dataspace_funcs Functions
* <table>
* <caption>The inquiry functions</caption>
* <tr>
@@ -1243,7 +1383,6 @@
* </tr>
* </table>
*
*
* \subsection subsec_dataspace_sample Sample Programs
*
* This section contains the full programs from which several of the code examples in this chapter were
+11 -2
View File
@@ -304,7 +304,7 @@
*
* </td>
* <td>
* @see H5R
* @see @ref H5R
* </td>
* </tr>
* <tr>
@@ -971,7 +971,7 @@
* translated to and from standard types of the same class, as described above.
*
* \subsection subsec_datatype_function Datatype Function Summaries
* @see H5T reference manual provides a reference list of datatype functions, the H5T APIs.
* see \ref H5T reference manual provides a reference list of datatype functions, the H5T APIs.
*
* \subsection subsec_datatype_program Programming Model for Datatypes
* The HDF5 Library implements an object-oriented model of datatypes. HDF5 datatypes are
@@ -2164,6 +2164,7 @@ filled according to the value of this property. The padding can be:
* \endcode
*
* The example below shows the content of the file written on a little-endian machine.
*
* <em>Create and write a little-endian dataset with a compound datatype in C</em>
* \code
* HDF5 “SDScompound.h5” {
@@ -2248,6 +2249,7 @@ filled according to the value of this property. The padding can be:
*
* The figure below shows the content of the file written on a little-endian machine. Only float and
* double fields are written. The default fill value is used to initialize the unwritten integer field.
*
* <em>Writing floats and doubles to a dataset on a little-endian system</em>
* \code
* HDF5 “SDScompound.h5” {
@@ -2285,6 +2287,7 @@ filled according to the value of this property. The padding can be:
* compound datatype. As this example illustrates, writing and reading compound datatypes in
* Fortran is always done by fields. The content of the written file is the same as shown in the
* example above.
*
* <em>Create and write a dataset with a compound datatype in Fortran</em>
* \code
* ! One cannot write an array of a derived datatype in
@@ -2921,6 +2924,7 @@ filled according to the value of this property. The padding can be:
* declaration of a datatype of type #H5T_C_S1 which is set to #H5T_VARIABLE. The HDF5
* Library automatically translates between this and the vl_t structure. Note: the #H5T_VARIABLE
* size can only be used with string datatypes.
*
* <em>Set the string datatype size to H5T_VARIABLE</em>
* \code
* tid1 = H5Tcopy (H5T_C_S1);
@@ -2929,6 +2933,7 @@ filled according to the value of this property. The padding can be:
*
* Variable-length strings can be read into C strings (in other words, pointers to zero terminated
* arrays of char). See the example below.
*
* <em>Read variable-length strings into C strings</em>
* \code
* char *rdata[SPACE1_DIM1];
@@ -3053,6 +3058,7 @@ filled according to the value of this property. The padding can be:
* would be as an array of integers. The example below shows an example of how to create an
* enumeration with five elements. The elements map symbolic names to 2-byte integers. See the
* table below.
*
* <em>Create an enumeration with five elements</em>
* \code
* hid_t hdf_en_colors;
@@ -3582,6 +3588,7 @@ filled according to the value of this property. The padding can be:
*
* To create two or more datasets that share a common datatype, first commit the datatype, and then
* use that datatype to create the datasets. See the example below.
*
* <em> Create a shareable datatype</em>
* \code
* hid_t t1 = ...some transient type...;
@@ -3697,6 +3704,7 @@ filled according to the value of this property. The padding can be:
* memory. The destination datatype must be specified in the #H5Dread call. The example below
* shows an example of reading a dataset of 32-bit integers. The figure below the example shows
* the data transformation that is performed.
*
* <em>Specify the destination datatype with H5Dread</em>
* \code
* // Stored as H5T_STD_BE32
@@ -3797,6 +3805,7 @@ filled according to the value of this property. The padding can be:
* The currently supported text format used by #H5LTtext_to_dtype and #H5LTdtype_to_text is the
* data description language (DDL) and conforms to the \ref DDLBNF114. The portion of the
* \ref DDLBNF114 that defines HDF5 datatypes appears below.
*
* <em>The definition of HDF5 datatypes from the HDF5 DDL</em>
* \code
* <datatype> ::= <atomic_type> | <compound_type> | <variable_length_type> | <array_type>
+6 -2
View File
@@ -28,6 +28,7 @@
/** \page H5DM_UG HDF5 Data Model and File Structure
*
* \section sec_data_model The HDF5 Data Model and File Structure
*
* \subsection subsec_data_model_intro Introduction
* The Hierarchical Data Format (HDF) implements a model for managing and storing data. The
* model includes an abstract data model and an abstract storage model (the data format), and
@@ -100,8 +101,11 @@
* model, and stored in a storage medium. The stored objects include header blocks, free lists, data
* blocks, B-trees, and other objects. Each group or dataset is stored as one or more header and data
* blocks.
* @see <a href="https://\DOXURL/_s_p_e_c.html">HDF5 File Format Specification</a>
* for more information on how these objects are organized. The HDF5 library can also use other
*
* For more information on how these objects are organized;
* see <a href="https://\DOXURL/_s_p_e_c.html">HDF5 File Format Specification</a>
*
* The HDF5 library can also use other
* libraries and modules such as compression.
*
* <table>
+1 -1
View File
@@ -336,7 +336,7 @@ usage(const char *prog)
PRINTVALSTREAM(
rawoutstream,
" "
"https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.\n");
"https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.\n");
PRINTVALSTREAM(rawoutstream,
" Without the file driver flag, the file will be opened with each driver in\n");
PRINTVALSTREAM(rawoutstream, " turn and in the order specified above until one driver succeeds\n");
+1 -1
View File
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.
@@ -105,7 +105,7 @@ usage: h5dump [OPTIONS] files
--------------- Option Argument Conventions ---------------
D - is the file driver to use in opening the file. Acceptable values are available from
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_virtual_file_drivers_vfds.html.
https://support.hdfgroup.org/documentation/HDF5/registered_virtual_file_drivers_vfds.html.
Without the file driver flag, the file will be opened with each driver in
turn and in the order specified above until one driver succeeds
in opening the file.