Straightforward single-file/module access to HDF5.
Uses Fortran 2008 submodule
for clean, templatable structure.
This thin object-oriented modern Fortran library abstracts away the messy parts of HDF5 so that you can read/write various types/ranks of data with a single command.
Polymorphic API with read/write for types integer, real32, real64 with rank:
- scalar (0-D)
- 1-D .. 7-D
as well as character (string) variables and attributes.
Tested on systems with HDF5 1.8 and 1.10 including:
- MacOS (homebrew)
- Ubuntu 16.04 / 18.04 (gfortran 6 or newer)
- Windows Subsystem for Linux.
Note: Currently, Cygwin does not have Fortran HDF5 libraries.
Requirements:
- modern Fortran 2008 compiler (such as gfortran ≥ 5.4.1, etc.)
- HDF5 Fortran library (1.8 or 1.10)
- Mac:
brew install gcc hdf5
- Linux:
apt install gfortran libhdf5-dev
- Windows Subsystem for Linux:
apt install gfortran libhdf5-dev
- Mac:
Note that some precompiled HDF5 libraries include C / C++ without Fortran. We have included a test in the build system to ensure that HDF5 links in Fortran before trying to buidl the OOHDF5 library.
Build this HDF5 OO Fortran interface with other Meson or CMake.
The library libh5oo
is built, link it into your program as usual.
meson build
ninja -C build
Optionally test via:
meson test -C build
cmake -B build
cmake --build build --parallel
Optionally run self-tests:
cd build
ctest -V
If you need to specify a particular HDF5 library, use
cmake -DHDF5_ROOT=/path/to/hdf5lib -B build
All examples assume:
use hdf5_interface, only: hdf5_file
type(hdf5_file) :: h5f
- gzip compression may be applied for rank ≥ 2 arrays by setting
comp_lvl
to a value betwen 1 and 9. Shuffle filter is automatically applied for better compression - string attributes may be applied to any variable at time of writing or later.
chunk_size
option may be set for better compression
call h5f%initialize('test.h5',status='new',action='w')
call h5f%add('/value1', 123.)
call h5f%finalize()
call h5f%initialize('test.h5',status='old',action='rw')
call h5f%add('/value1', 123.)
call h5f%finalize()
real :: val2(1000,1000,3) = 0.
call h5f%initialize('test.h5', comp_lvl=1)
call h5f%add('/value2', val2)
call h5f%finalize()
chunk_size may optionally be set in the %add()
method.
real :: val2(1000,1000,3) = 0.
call h5f%initialize('test.h5')
call h5f%add('/scope/')
call h5f%finalize()
Note the trailing /
on /scope/
, that tells the API you are creating a group instead of a variable.
- The first character of the filename should be a character, NOT whitespace to avoid file open/creation errors.
- Using compilers like PGI or Flang may require first compiling the HDF5 library yourself.
- Intel compiler HDF5 compile notes
- Polymorphic array rank is implemented by explicit code internally. We could have used pointers, but the code is simple enough to avoid the risk associated with explicit array pointers.