NetCDF / Parallel-NetCDF
NetCDF (Network Common Data Form) and Parallel-NetCDF (PnetCDF) are available through the Spack package manager for scientific data storage and parallel I/O operations.
NetCDF provides comprehensive support for HDF5 backend, multiple compression formats, and both serial and parallel I/O. Both NetCDF-C and NetCDF-Fortran libraries are available.
Parallel-NetCDF (PnetCDF) is a high-performance I/O library optimized for parallel access to NetCDF files, featuring burst buffering and relaxed consistency semantics for improved performance in MPI applications.
NetCDF Quick Start
Note
For the value of ${SPACK_ROOT}, please refer to Spack Instances for the installation path.
# Modify this path accordingly
export SPACK_ROOT="/path/to/spack"
# Activate Spack environment
source "${SPACK_ROOT}/dist/bin/setup-env.sh" -y
# Load a supported compiler and MPI
module load intel-oneapi-compilers
module load intel-oneapi-mpi
# Check available NetCDF versions
module avail netcdf
# Load NetCDF-C
module load netcdf-c
# Load NetCDF-Fortran
module load netcdf-fortran
# Verify installation
nc-config --version
nf-config --version # If Fortran loaded
Note
Module names may include a 7-digit hash suffix (e.g., netcdf-c/4.9.2-abc1234).
You do NOT need to include this hash when loading - the version alone
(e.g., 4.9.2) is sufficient.
Parallel NetCDF Quick Start
Note
For the value of ${SPACK_ROOT}, please refer to Spack Instances for the installation path.
# Modify this path accordingly
export SPACK_ROOT="/path/to/spack"
# Activate Spack environment
source "${SPACK_ROOT}/dist/bin/setup-env.sh" -y
# Load a supported compiler and MPI
module load intel-oneapi-compilers/2025
module load intel-oneapi-mpi/2021
# Check available Parallel NetCDF versions
module avail parallel-netcdf
# Load Parallel NetCDF
module load parallel-netcdf
# Verify installation
pnetcdf-config --version
Note
Module names may include a 7-digit hash suffix (e.g., parallel-netcdf/1.14.0-abc1234).
You do NOT need to include this hash when loading - the version alone
(e.g., 1.14.0) is sufficient.
Building with NetCDF
C Programs
# Export compiler and linker flags for Makefiles
export CC=mpicc
export CFLAGS="$(nc-config --cflags)"
export LDFLAGS="$(nc-config --libs)"
# Direct compilation example
$CC -o myprogram myprogram.c $CFLAGS $LDFLAGS
C++ Programs
# Export compiler and linker flags for Makefiles
export CXX=mpicxx
export CXXFLAGS="$(nc-config --cflags)"
export LDFLAGS="$(nc-config --libs)"
# Direct compilation example
$CXX -o myprogram myprogram.cpp $CXXFLAGS $LDFLAGS
Fortran Programs
# Export compiler and linker flags for Makefiles
export FC=mpifort
export FFLAGS="$(nf-config --fflags)"
export LDFLAGS="$(nf-config --flibs)"
# Direct compilation example
$FC -o myprogram myprogram.f90 $FFLAGS $LDFLAGS
Using Makefile
CC ?= mpicc
CXX ?= mpicxx
FC ?= mpifort
# Set NetCDF related flags
CFLAGS += $(shell nc-config --cflags)
CXXFLAGS += $(shell nc-config --cflags)
FFLAGS += $(shell nf-config --fflags)
LDFLAGS += $(shell nc-config --libs)
FLDFLAGS += $(shell nf-config --flibs)
# Build rule for C source files
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
# Build rule for C++ source files
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@
# Build rule for Fortran source files
.f90.o:
$(FC) $(FFLAGS) -c $< -o $@
# Link example for a C program. For Fortran, use $(FC) and $(FLDFLAGS).
myprogram: myprogram.o
$(CC) -o $@ $^ $(LDFLAGS)
Using CMake
Using FindNetCDF:
find_package(NetCDF REQUIRED)
target_link_libraries(myprogram PRIVATE netCDF::netcdf)
Using pkg-config in CMake:
find_package(PkgConfig REQUIRED)
pkg_check_modules(NETCDF REQUIRED IMPORTED_TARGET netcdf)
target_link_libraries(myprogram PRIVATE PkgConfig::NETCDF)
Using pkg-config
# Query flags for NetCDF-C
pkgconf --cflags --keep-system-cflags netcdf
pkgconf --libs --keep-system-libs netcdf
# Query flags for NetCDF-Fortran
pkgconf --cflags --keep-system-cflags netcdf-fortran
pkgconf --libs --keep-system-libs netcdf-fortran
# Use in compilation
export CC=mpicc
export CFLAGS="$(pkgconf --cflags --keep-system-cflags netcdf)"
export LDFLAGS="$(pkgconf --libs --keep-system-libs netcdf)"
Building with Parallel NetCDF
C Programs
# Export compiler and linker flags for Makefiles
export CC=mpicc
export CFLAGS="$(pnetcdf-config --cflags)"
export LDFLAGS="$(pnetcdf-config --libs)"
# Direct compilation example
$CC -o myprogram myprogram.c $CFLAGS $LDFLAGS
C++ Programs
# Export compiler and linker flags for Makefiles
export CXX=mpicxx
export CXXFLAGS="$(pnetcdf-config --cflags)"
export LDFLAGS="$(pnetcdf-config --libs)"
# Direct compilation example
$CXX -o myprogram myprogram.cpp $CXXFLAGS $LDFLAGS
Fortran Programs
# Export compiler and linker flags for Makefiles
export FC=mpifort
export FFLAGS="$(pnetcdf-config --fflags)"
export LDFLAGS="$(pnetcdf-config --flibs)"
# Direct compilation example
$FC -o myprogram myprogram.f90 $FFLAGS $LDFLAGS
Using Makefile
CC ?= mpicc
CXX ?= mpicxx
FC ?= mpifort
# Set Parallel NetCDF related flags
CFLAGS += $(shell pnetcdf-config --cflags)
CXXFLAGS += $(shell pnetcdf-config --cflags)
FFLAGS += $(shell pnetcdf-config --fflags)
LDFLAGS += $(shell pnetcdf-config --libs)
FLDFLAGS += $(shell pnetcdf-config --flibs)
# Build rule for C source files
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
# Build rule for C++ source files
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@
# Build rule for Fortran source files
.f90.o:
$(FC) $(FFLAGS) -c $< -o $@
# Link example for a C program. For Fortran, use $(FC) and $(FLDFLAGS).
myprogram: myprogram.o
$(CC) -o $@ $^ $(LDFLAGS)
Using pkg-config
# Query flags for Parallel NetCDF
pkgconf --cflags --keep-system-cflags pnetcdf
pkgconf --libs --keep-system-libs pnetcdf
# Use in compilation
export CC=mpicc
export CFLAGS="$(pkgconf --cflags --keep-system-cflags pnetcdf)"
export LDFLAGS="$(pkgconf --libs --keep-system-libs pnetcdf)"
Features Availability
NetCDF-C Features
Feature |
Description |
Enabled |
|---|---|---|
Parallel I/O |
MPI-based parallel file access |
✓ |
NetCDF-4/HDF5 Format |
Full NetCDF-4 and HDF5 backend support |
✓ |
Parallel NetCDF (PnetCDF) |
High-performance parallel I/O library |
✓ |
Standard Filters |
Compression filters: deflate, bz2, blosc, zstd |
✓ |
ZSTD Compression |
Modern compression algorithm |
✓ |
SZIP Compression |
Lossless compression support |
✓ |
Multi-filters |
Multiple compression filters support |
✓ |
NetCDF-2 Classic Format |
Legacy classic format support |
✓ |
CDF-5 Format |
Large variable support (>2GB) |
✓ |
NCZarr |
Cloud-optimized Zarr format support |
✓ |
Logging |
Debug and diagnostic logging |
✓ |
HDF4 Format |
Legacy HDF4 format support |
✗ |
DAP2/DAP4 Protocol |
Remote data access protocols |
✗ |
Benchmarks |
Performance benchmarking tools |
✗ |
Parallel NetCDF Features
Feature |
Description |
Enabled |
|---|---|---|
Burst Buffering |
Improved I/O performance via buffering |
✓ |
Erange Fill |
Fill values for out-of-range errors |
✓ |
Relax Coordinate Boundary |
Relaxed coordinate boundary checking |
✓ |
In-place Swap |
Automatic byte-swapping |
Auto |
NetCDF-4 Format |
NetCDF-4/HDF5 format support |
✗ |
Thread-safe |
Thread-safe operations |
✗ |
Subfiling |
Subfiling for improved parallel I/O |
✗ |
ADIOS Integration |
ADIOS I/O framework integration |
✗ |
Profiling |
Performance profiling support |
✗ |
Debug Mode |
Debug mode with additional checks |
✗ |
Null-byte Header Padding |
Header padding for alignment |
✗ |
Support and Resources
NetCDF Documentation
Parallel-NetCDF Documentation