Skip to content

page index

OverviewAMIO (Asynchronous Multidimensional I/O) is a high-performance I/O engine designed for NOAA NWS Earth system models. It provides a unified C99 API surface with Fortran 2003 bindings for writing and reading multidimensional scientific data through pluggable backend drivers.

Key Features

  • Asynchronous I/O: Non-blocking write operations with staging pool and worker threads for overlapping computation with I/O.

  • Multiple Backends: Pluggable drivers for NetCDF-4 (parallel HDF5), Zarr v3 (TensorStore or NCZarr fallback), and GRIB2 (nceplibs-g2c).

  • Unified API: Single C99 API surface consumed by both C/C++ and Fortran applications through iso_c_binding wrappers.

  • MPI-Aware: Communicator splitting and parallel I/O support for distributed-memory HPC applications.

  • Type-Safe Handles: Opaque handle system with generation-counter validation prevents use-after-free and handle misuse.

Architecture

┌─────────────────────────────────────────────────────────┐
│                   Host Application                       │
│              (C / C++ / Fortran)                         │
├─────────────────────────────────────────────────────────┤
│              AMIO Public API (C99 FFI)                   │
│         amio.h / amio_mod (Fortran)                     │
├─────────────────────────────────────────────────────────┤
│                  C-Boundary Layer                        │
│    Handle Table │ Exception Bridge │ Config Loader       │
├─────────────────────────────────────────────────────────┤
│   Staging Pool  │  Worker Pool  │  Prefetch Queue       │
├─────────────────────────────────────────────────────────┤
│              Backend Factory (Plugin Registry)           │
├──────────────┬──────────────┬───────────────────────────┤
│  NetCDF-4    │   Zarr v3    │       GRIB2               │
│  Driver      │   Driver     │       Driver              │
│ (HDF5/pnetcdf)│(TensorStore/ │  (nceplibs-g2c)          │
│              │  NCZarr)     │                           │
└──────────────┴──────────────┴───────────────────────────┘

Quick StartC API

#include <[amio/amio.h](site/api/api-amio.h.md#amio_8h)>

[amio_core_handle](site/api/api-amio_core_handle.md#amio__types_8h_1a40ca069f7efb7765f5f87d118f2d2456) core = NULL;
[amio_status_t](site/api/api-amio_status_t.md#amio__errors_8h_1ac629b1349893ce6659582f2140f854e1) rc = [amio_init](site/api/api-amio_init.md#amio_8h_1a9e0151f2a4efd94de22842c657b188fd)("manifest.yaml", &core);
if (rc != [AMIO_OK](site/api/api-AMIO_OK.md#amio__errors_8h_1a36457c86faa30c50b5eff175f3422ab1a4ca528f9fdc067a7fd53448b08f6330d)) {
    fprintf(stderr, "Init failed: %s\n", [amio_strerror](site/api/api-amio_strerror.md#amio__errors_8h_1a8f6d724b36dcca5d66487ace3b47a559)(rc));
    return 1;
}

[amio_dataset_handle](site/api/api-amio_dataset_handle.md#amio__types_8h_1a9687e377cd4a7e1c3582f22a9aa30d37) ds = NULL;
rc = [amio_open_dataset](site/api/api-amio_open_dataset.md#amio_8h_1acc0d48b38ac4681b35a4e4996c8efe74)(core, "dataset.yaml", [AMIO_MODE_WRITE](site/api/api-AMIO_MODE_WRITE.md#amio__types_8h_1a5ca753fc600875548fd99563d5e24713), &ds);

// Write data...
[amio_flush](site/api/api-amio_flush.md#amio_8h_1af1c229b161d14e76e3db4f27b504f1d8)(ds, 0);
[amio_close_dataset](site/api/api-amio_close_dataset.md#amio_8h_1ab1b5a9579243b1221a9f9f0adc8543c7)(ds);
[amio_finalize](site/api/api-amio_finalize.md#amio_8h_1a32bded0945b6a7097cc8c5e4047929ef)(core);

Fortran API

use [amio_mod](site/api/api-amio_mod.md#namespaceamio__mod)
type(c_ptr) :: core, dataset, io_handle
integer(c_int32_t) :: rc

rc = [amio_init](site/api/api-amio_mod::amio_init.md#interfaceamio__mod_1_1amio__init)("manifest.yaml" // c_null_char, core)
rc = [amio_open_dataset](site/api/api-amio_mod::amio_open_dataset.md#interfaceamio__mod_1_1amio__open__dataset)(core, "dataset.yaml" // c_null_char, &
                       [amio_mode_write](site/api/api-amio_mode_write.md#namespaceamio__mod_1a4885ed40c10bc44cc2dd7f976087832e), dataset)

! Use convenience subroutines for type-safe writes
call [amio_write_array](site/api/api-amio_mod::amio_write_array.md#interfaceamio__mod_1_1amio__write__array)(dataset, "temperature" // c_null_char, &
                      temp_field, io_handle, rc)

rc = [amio_flush](site/api/api-amio_mod::amio_flush.md#interfaceamio__mod_1_1amio__flush)(dataset, 0_c_int64_t)
rc = [amio_close_dataset](site/api/api-amio_mod::amio_close_dataset.md#interfaceamio__mod_1_1amio__close__dataset)(dataset)
rc = [amio_finalize](site/api/api-amio_mod::amio_finalize.md#interfaceamio__mod_1_1amio__finalize)(core)

API Reference

ExamplesComplete, compilable examples are provided in the examples/ directory:

  • C Examples (examples/c/):

  • example_netcdf4_write.c — Write a 3D temperature field to NetCDF-4

  • example_zarr_write.c — Write SST data to Zarr v3 (NCZarr mode)

  • example_grib2_write.c — Write geopotential height to GRIB2

  • Fortran Examples (examples/fortran/):

  • example_netcdf4_write.f90 — Write a 3D temperature field to NetCDF-4

  • example_zarr_write.f90 — Write SST data to Zarr v3

  • example_grib2_write.f90 — Write geopotential height to GRIB2

  • Manifest Files (examples/manifests/):

  • netcdf4_manifest.yaml — Configuration for NetCDF-4 backend

  • zarr3_manifest.yaml — Configuration for Zarr v3 backend

  • grib2_manifest.yaml — Configuration for GRIB2 backend

Building

mkdir build && cd build
cmake .. -DAMIO_BUILD_DOCS=ON -DAMIO_BUILD_EXAMPLES=ON
make
make docs    # Generate Doxygen HTML documentation

LicenseSee the LICENSE file in the project root.