Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
1fc839b
In the next release, fpm will support a hdf5 metapackage.
14NGiestas Feb 7, 2025
932509c
feat: add iterate and visit methods for HDF5 file traversal
14NGiestas Apr 12, 2026
3cceda8
fix: resolve ifx segfault and cross-version HDF5 compatibility for it…
14NGiestas Apr 13, 2026
fb42de0
feat: add native SWMR support for concurrent read/write
14NGiestas Apr 22, 2026
023036a
feat: add native SWMR support for concurrent read/write
14NGiestas Apr 22, 2026
d04381c
fix(nix): enable fortranSupport for HDF5 in shell.nix
14NGiestas Apr 22, 2026
59520a1
merged origin/feature/swmr
14NGiestas Apr 22, 2026
c009008
fix: use object API (h5orefresh/h5oflush) for cross-platform SWMR sup…
14NGiestas Apr 22, 2026
c9fbec1
fix: simplify SWMR to use only file-level operations for portability
14NGiestas Apr 22, 2026
fd482a8
fix: remove c_ptr import from write.f90 to avoid conflict on Windows
14NGiestas Apr 22, 2026
6edc8bb
fix: use file-level H5Fflush_f for refresh instead of object API
14NGiestas Apr 22, 2026
5f21d20
fix: update SWMR test to work with file-level operations
14NGiestas Apr 22, 2026
3ce3c4e
feat: add concurrent SWMR writer/reader test
14NGiestas Apr 22, 2026
bf2f435
feat: concurrent SWMR writer/reader with timestamps
14NGiestas Apr 22, 2026
a49f852
feat: concurrent SWMR test with writer/reader processes
14NGiestas Apr 22, 2026
9cd047a
fix: ensure SWMR tests terminate properly with wait
14NGiestas Apr 22, 2026
2d434ff
feat: SWMR tests - simple write/read and concurrent writer/reader
14NGiestas Apr 22, 2026
d315da5
test: simple SWMR write/read test (no processes)
14NGiestas Apr 22, 2026
39d7847
test: SWMR write/update/read test
14NGiestas Apr 22, 2026
4000cc9
test: remove concurrent SWMR tests (require full SWMR API)
14NGiestas Apr 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build/
.envrc
*.h5
26 changes: 26 additions & 0 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,32 @@ class(*), intent(out) :: attrval(:) !< character, real, integer
call h%delete_attr(dname, attr)
```

## Iterate over all datasets in a group

```fortran
call h%iterate(group, callback)

character(*), intent(in) :: group
subroutine callback(group_name, object_name, object_type)
character(len=*), intent(in) :: group_name
character(len=*), intent(in) :: object_name
character(len=*), intent(in) :: object_type
end subroutine
```

## Visit recursively all datasets starting from a group

```fortran
call h%visit(group, callback)

character(*), intent(in) :: group
subroutine callback(group_name, object_name, object_type)
character(len=*), intent(in) :: group_name
character(len=*), intent(in) :: object_name
character(len=*), intent(in) :: object_type
end subroutine
```

## high level operations

These are single-call operations that are slower than the object-oriented methods above.
Expand Down
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ endif()
# --- h5fortran library

add_library(h5fortran)

target_include_directories(h5fortran PUBLIC
$<BUILD_INTERFACE:${CMAKE_Fortran_MODULE_DIRECTORY}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
Expand Down
61 changes: 61 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

243 changes: 243 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
{
description = "h5fortran development shells";

inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
flake-utils.url = "github:numtide/flake-utils";
};

outputs =
{
self,
nixpkgs,
flake-utils,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
};
};

common-build-tools = with pkgs; [
cmake
ninja
pkg-config
git
];

mkGccShell =
{
name,
gcc-pkg,
gfortran-pkg,
packages ? [ ],
shellHookExtra ? "",
}:
pkgs.mkShell {
inherit name;
packages =
common-build-tools
++ [
gcc-pkg
gfortran-pkg
pkgs.hdf5
pkgs.zlib
pkgs.python3
]
++ packages;

shellHook = ''
export CC=${gcc-pkg}/bin/gcc
export FC=${gfortran-pkg}/bin/gfortran
export CXX=${gcc-pkg}/bin/g++
echo "h5fortran: ${name}"
echo "CC: $CC FC: $FC CXX: $CXX"
echo "HDF5: ${pkgs.hdf5.dev}"
${shellHookExtra}
'';

HDF5_DIR = "${pkgs.hdf5.dev}";
};
in
{
devShells.default = mkGccShell {
name = "h5fortran-gcc-default";
gcc-pkg = pkgs.gcc14;
gfortran-pkg = pkgs.gfortran14;
shellHookExtra = ''echo "Build: cmake -Bbuild -G Ninja --workflow --preset default"'';
};

devShells.gcc-old = mkGccShell {
name = "h5fortran-gcc-11";
gcc-pkg = pkgs.gcc11;
gfortran-pkg = pkgs.gfortran11;
shellHookExtra = ''echo "Build: cmake -Bbuild -G Ninja --workflow --preset default"'';
};

devShells.gcc-new = mkGccShell {
name = "h5fortran-gcc-14";
gcc-pkg = pkgs.gcc14;
gfortran-pkg = pkgs.gfortran14;
shellHookExtra = ''echo "Build: cmake -Bbuild -G Ninja --workflow --preset default"'';
};

devShells.flang = pkgs.mkShell {
name = "h5fortran-flang";
packages =
common-build-tools
++ [
pkgs.llvmPackages.clang
pkgs.llvmPackages.flang
pkgs.llvmPackages.llvm
pkgs.llvmPackages.libomp
pkgs.hdf5
pkgs.zlib
];

shellHook = ''
export CC=${pkgs.llvmPackages.clang}/bin/clang
export CXX=${pkgs.llvmPackages.clang}/bin/clang++
export FC=${pkgs.llvmPackages.flang}/bin/flang-new
echo "h5fortran: LLVM/Flang + HDF5 + CMake + Ninja"
echo "HDF5: ${pkgs.hdf5.dev}"
'';

HDF5_DIR = "${pkgs.hdf5.dev}";
};

devShells.fpm = pkgs.mkShell {
name = "h5fortran-fpm";
packages =
common-build-tools
++ [
pkgs.gcc14
pkgs.gfortran14
pkgs.hdf5
pkgs.zlib
pkgs.fpm
pkgs.python3
];

shellHook = ''
export CC=${pkgs.gcc14}/bin/gcc
export FC=${pkgs.gfortran14}/bin/gfortran
export CXX=${pkgs.gcc14}/bin/g++
export FPM_FFLAGS="-I${pkgs.hdf5.dev}/include"
export FPM_LDFLAGS="-L${pkgs.hdf5.lib}/lib"
echo "h5fortran: fpm + GCC + HDF5"
echo "Build: fpm build"
'';
};

devShells.testing = mkGccShell {
name = "h5fortran-testing";
gcc-pkg = pkgs.gcc14;
gfortran-pkg = pkgs.gfortran14;
packages = with pkgs; [
valgrind
gcovr
];
shellHookExtra = ''
echo "Tools: valgrind, gcovr, python (h5py/numpy)"
echo "Build: cmake -Bbuild -G Ninja --workflow --preset default"
'';
};

devShells.cmake-old = pkgs.mkShell {
name = "h5fortran-cmake-old";
packages = with pkgs; [
cmake_3_24
ninja
pkg-config
gcc14
gfortran14
hdf5
zlib
git
];

shellHook = ''
export CC=${pkgs.gcc14}/bin/gcc
export FC=${pkgs.gfortran14}/bin/gfortran
export CXX=${pkgs.gcc14}/bin/g++
echo "h5fortran: CMake 3.24 (old) + GCC 14 + HDF5 + Ninja"
echo "HDF5: ${pkgs.hdf5.dev}"
'';

HDF5_DIR = "${pkgs.hdf5.dev}";
};

devShells.oneapi = pkgs.mkShell {
name = "h5fortran-oneapi";
packages = with pkgs;
common-build-tools
++ [
pkgs.intel-oneapi.hpc
pkgs.hdf5-fortran
pkgs.zlib
pkgs.python3
pkgs.stdenv.cc
];

shellHook = ''
# Source Intel oneAPI environment
if [ -d /opt/intel/oneapi ]; then
source /opt/intel/oneapi/setvars.sh >/dev/null 2>&1
fi

# Create icx wrapper with proper linker paths
_NIX_GLIBC_LIB=$(dirname $(gcc -print-file-name=Scrt1.o))
_NIX_GCC_CRT=$(dirname $(gcc -print-file-name=crtbeginS.o))
_NIX_GCC_SLIB=$(dirname $(gcc -print-file-name=libgcc_s.so))
_ICX_WRAPPER=$(mktemp /tmp/icx-wrapper-XXXXXX)
cat > "$_ICX_WRAPPER" << EOF
#!/usr/bin/env bash
exec ${pkgs.intel-oneapi.hpc}/bin/icx -L$_NIX_GLIBC_LIB -L$_NIX_GCC_CRT -L$_NIX_GCC_SLIB -B$_NIX_GLIBC_LIB -B$_NIX_GCC_CRT "\$@"
EOF
chmod +x "$_ICX_WRAPPER"

export CC="$_ICX_WRAPPER"
export CXX=${pkgs.intel-oneapi.hpc}/bin/icpx
export FC=${pkgs.intel-oneapi.hpc}/bin/ifx
export PATH=${pkgs.intel-oneapi.hpc}/bin:$PATH
export LD_LIBRARY_PATH=${pkgs.intel-oneapi.hpc}/lib:$_NIX_GLIBC_LIB:$_NIX_GCC_CRT:$_NIX_GCC_SLIB:$LD_LIBRARY_PATH

echo "h5fortran: Intel oneAPI (ifx/icx) + HDF5 + CMake + Ninja"
echo "CC: $CC FC: $FC"
echo "HDF5: ${pkgs.hdf5-fortran.dev}"
'';

HDF5_DIR = "${pkgs.hdf5-fortran.dev}";
};

devShells.coverage = mkGccShell {
name = "h5fortran-coverage";
gcc-pkg = pkgs.gcc14;
gfortran-pkg = pkgs.gfortran14;
packages = with pkgs; [
gcovr
lcov
];
shellHookExtra = ''
echo "Tools: gcovr, lcov"
echo "Build: cmake -Bbuild -G Ninja --preset coverage"
'';
};

devShells.shared = mkGccShell {
name = "h5fortran-shared";
gcc-pkg = pkgs.gcc14;
gfortran-pkg = pkgs.gfortran14;
shellHookExtra = ''
echo "Build: cmake -Bbuild -G Ninja --workflow --preset shared"
'';
};

packages = { };
}
);
}
12 changes: 12 additions & 0 deletions fpm.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,18 @@ main = "test_shape.f90"
name = "string"
main = "test_string.f90"

[[test]]
name = "visit"
main = "test_visit.f90"

[[test]]
name = "iterate"
main = "test_iterate.f90"

[[test]]
name = "version"
main = "test_version.f90"

[[test]]
name = "swmr"
main = "test_swmr.f90"
Loading