The current release version of the I/O API library is Version 3.2. Version 4.0 is in beta. Versions 3.0 and 3.1 in maintenance only release mode, and versions 2.2 and 2.1 are available for historic interest. To download source for these, please go to the I/O API Download Page.
Release Version 3.0, 3.1, 3.2 of the I/O API and the I/O -related tool and sample programs, as well as obsolete prior versions 2.1 and 2.2, are available here on the CMAS Center web site:
in source code form. Versions 3.2 and 4.0 also available from GitHub, using the following command:
- ioapi-3.2.tar.gz
- ioapi-3.1.tar.gz
- ioapi-3.0.tar.gz
- ioapi-2.2.tar.gz
- ioapi-2.1.tar.gz
git clone https://github.com/cjcoats/ioapi-3.2
or
git clone https://github.com/cjcoats/ioapi-3.2 -b ioapi-4.0 ioapi-4.0
New features of 2.2 and later releases are documented here in the I/O API Change Log;
build instructions are in the
I/O API Availability/Downlsoad/Build Document.
For each supported architecture, there are several relevant archive libraries of compiled object files:
- libioapi.a
- contains object files for the I/O API (both public and private routines), the coordinate and grid manipulation routines , the date and time manipulation routines , and the utility routines.
- libnetcdf.a (and libnetcdff.a for netCDF-4.1 or later)
- contains object files for the underlying netCDF library; it is compiled with optimization on (typically at optimization level -O2).
Note that netCDF-4 requires additional (installation dependent) libraries- libpnetcdf.a
- if you are building with PnetCDF/MPI distributed I/O enabled (e.g., for CMAQ).
- libpvm3.a
- contains object files for the underlying PVM library: if you build with I/O API Coupling Mode enabled.
Note that optimized and debug versions of the libraries are normally built into distinct build-directories each with its own $BIN (e.g., Linux2_x86_64ifort vs Linux2_x86_64ifortdbg); you should segregate profiling-enabled, global;-climate, and distributed-I/O (etc.) libraries similarly. If you call I/O API routines, you will need both libioapi.a and libnetcdf.a (and, for netCDF-4, libnetcdff.a; these are normally copied into the relevant build-directory); if you build with PnetCDF/MPI distributed I/O enabled, you will need libpnetcdf.a; if you build with coupling mode enabled, you will also need libpvm3.a. If you call only coordinate and grid or date and time manipulation routines or utility routines, you will just need libioapi.a.
I/O API
Version 3.x libraries have build support for C and
Fortran-90 compilers only (but not Fortran-77), on the following
hardware/operating-system/compiler-set/compiler-option platforms
referred to by environment variable $BIN. Note that
supporting additional platforms generally is quite easy, following
the pattern of these existing builds, as found in the
ioapi/Makeinclude.$BIN configuration files:
Linux2_x86_64* NOTE: Most "64-bit" Linux compilers default to the so-called "64-bit-small" memory model, which limits individual arrays,COMMONblocks, and initialized data to less than 2 GB, unless you override this by compile-flags.
Exceptions are the Sun compilers and g95, which default to medium memory model, which supports huge arrays and hugeCOMMONblocks (but not huge machine-code surbroutines). Note that for various other compilers, there are explicitly medium-memory-model configurations, which should be kept separate from the "normal" small-memory-model versions. See this note for more info
BIN Types
Linux2_x86_64- For Linux on (64-bit) Intel(/AMD) x86_64 using gcc and gfortran version 9 or earlier, with OpenMP support.
Linux2_x86_64dbg- Like
Linux2_x86_64but compiled for debug, with OpenMP support.
Linux2_x86_64g95- For Linux on (64-bit) Intel(/AMD) x86_64 using gcc and g95.
Creates medium memory model object-files and programs.
Linux2_x86_64g95dbg- Like
Linux2_x86_64g95but compiled for debug
Linux2_x86_64gfort- For Linux on (64-bit) Intel(/AMD) x86_64 using gcc and gfortran, before version 10, with OpenMP support.
Linux2_x86_64gfortdbg- Like
Linux2_x86_64gfortbut compiled for debug.
Linux2_x86_64gfortmpi- Like
Linux2_x86_64gfortbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64gfort_medium- Like
Linux2_x86_64gfortbut compiled for medium memory model.
Linux2_x86_64gfort_mediumdbg- Like
Linux2_x86_64gfort_mediumbut compiled for debug.
Linux2_x86_64gfort_360,Linux2_x86_64gfort_360- Like
Linux2_x86_64gfortbut compiled for 360-day or 365-day climatology-modeling "year".
Linux2_x86_64gfort10- For Linux on (64-bit) Intel(/AMD) x86_64 using gcc and gfortran version 10 or later, with OpenMP support.
For I/O API 3.2 or later only.
Linux2_x86_64gfort10dbg- Like
Linux2_x86_64gfort10but compiled for debug.
For I/O API 3.2 or later only.
Linux2_x86_64gfort10mpi- Like
Linux2_x86_64gfort10but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
For I/O API 3.2 or later only.
Linux2_x86_64gfort10_medium- Like
Linux2_x86_64gfort10but compiled for medium memory model.
For I/O API 3.2 or later only.
Linux2_x86_64gfort_mediumdbg- Like
Linux2_x86_64gfort10but compiled for debug.
For I/O API 3.2 or later only.
BIN Types
Linux2_x86_64ifort- For Linux on (64-bit) Intel(/AMD) x86_64 using Intel icc and ifort (2024 or earlier, with OpenMP support.
Linux2_x86_64ifortdbg- Like
Linux2_x86_64ifortbut compiled for debug
Linux2_x86_64ifortmpi- Like
Linux2_x86_64ifortbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64ifortmpidbg- Like
Linux2_x86_64ifortbut compiled for debug
Linux2_x86_64ifort_360,Linux2_x86_64ifort_360- Like
Linux2_x86_64ifortbut compiled for 360-day or 365-day climatology-modeling "year".
Linux2_x86_64ifort_medium- Like
Linux2_x86_64ifortbut compiled with =mcmodel=medium, as needed for programs with arrays andCOMMONblocks larger than 2 GB.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifort_mediumdbg- Like
Linux2_x86_64ifort_mediumbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifx- For Linux on (64-bit) Intel(/AMD) x86_64 using Intel OPneAPI® icx and ifx (2025 or later, with OpenMP support.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifxdbg- Like
Linux2_x86_64ifxbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifxmpi- Like
Linux2_x86_64ifxbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifxmpidbg- Like
Linux2_x86_64ifxbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifx_medium- Like
Linux2_x86_64ifxbut compiled with =mcmodel=medium, as needed for programs with arrays andCOMMONblocks larger than 2 GB.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifx_mediumdbg- Like
Linux2_x86_64ifx_mediumbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64ifx_360,Linux2_x86_64ifx_360- Like
Linux2_x86_64ifxbut compiled for 360-day or 365-day climatology-modeling "year".
For I/O API 3.2 or later after Jan. 2025 only.
BIN Types
Linux2_x86_64nvfort- For Linux on (64-bit) Intel(/AMD) x86_64 using nVidia nvc and nvfortran, with OpenMP support.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64nvfortdbg- Like
Linux2_x86_64nvfortbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64nvfort_medium- Like
Linux2_x86_64nvfbut compiled for medium memory model
For I/O API 3.2 or later after Jan. 2025 only.ort
Linux2_x86_64nvfort_mediumdbg- Like
Linux2_x86_64nvfort_mediumbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
BIN Types
Linux2_x86_64of95- For Linux on (64-bit) Intel(/AMD) x86_64 using Oracle suncc and sunf95, with OpenMP support.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64of95dbg- Like
Linux2_x86_64of95but compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64of95mpi- Like
Linux2_x86_64of95but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64sun- For Linux on (64-bit) Intel(/AMD) x86_64 using Sun/Oracle suncc and sunf95., with OpenMP support.
Defaults to medium memory model
Linux2_x86_64sundbg- Like
Linux2_x86_64sunbut compiled for debug
Linux2_x86_64sunmpi- Like
Linux2_x86_64sunbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
BIN Types
Linux2_x86_64pg- For Linux on (64-bit) Intel(/AMD) x86_64 using Portland Group pgcc and pgf90, with OpenMP support.
Linux2_x86_64pgmpi- Like
Linux2_x86_64pgbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64pg_gcc_nomp- For Linux on (64-bit) Intel(/AMD) x86_64 using GNU gcc and Portland Group pgf90, with OpenMP turned off.
Linux2_x86_64pg_pgcc_nomp- Like
Linux2_x86_64pgbut with OpenMP turned off.
Linux2_x86_64pgmpi- Like
Linux2_x86_64pgbut compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64pg_medium- Like
Linux2_x86_64pgbut compiled with =mcmodel=medium, as needed for programs with arrays andCOMMONblocks larger than 2 GB.
Linux2_x86_64pg_360,Linux2_x86_64pg_360- Like
Linux2_x86_64pgbut compiled for 360-day or 365-day climatology-modeling "year".
BIN Types
Linux2_x86_64af95- For Linux on (64-bit) Intel(/AMD) x86_64 using GNU gcc and Absoft af95, with native Absoft name-mangling, with OpenMP support.
Old: no longer have test-machine
Linux2_x86_64af95_- Like
Linux2_x86_64af95but Feldman-style name mangling (set up using compiler command-line directives), with OpenMP support.
Old: no longer have test-machine
Linux2_x86_64af95_dbg- Like
Linux2_x86_64af95_but compiled for debug, with OpenMP support.
Old: no longer have test-machine
Linux2_x86_64af95dbg- Like
Linux2_x86_64af95but compiled for debug, with OpenMP support.
Old: no longer have test-machine
Linux2_x86_64aoccflang- For Linux on (64-bit) Intel(/AMD) x86_64 using AMD Optimizing Compiler Collection clang and flang, with OpenMP support.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64aoccflangdbg- Like
Linux2_x86_64aoccflangbut compiled for debug.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64aoccflang_medium- Like
Linux2_x86_64aoccflangbut compiled for medium memory model.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64llvmflang- For Linux on (64-bit) Intel(/AMD) x86_64 using LLVM clang and flang, with OpenMP support.
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64llvmflangdbg- Like
Linux2_x86_64llvmflangbut compiled for debug
For I/O API 3.2 or later after Jan. 2025 only.
Linux2_x86_64path- For Linux on (64-bit) Intel(/AMD) x86_64 using PathScale pathcc and pathf90, with OpenMP support.
Linux2_x86_64pathdbg- Like
Linux2_x86_64pathbut compiled for debug
BIN Types
WIN_x86gfort- for the Cygwin environment under MS-Windows using Cygwin 32-bit gcc and gfortran
WIN_x86_64mingw64- for the Cygwin environment under MS-Windows using MingW64 64-bit gcc and gfortran
BIN
Types,for which test machines are no longer available to me:
AIX- for AIX on POWER-<n> using xlc_r and xlf_r, with OpenMP support.
AIX_- As for AIX but with Feldman-style (trailing underscore) Fortran name-mangling for linker symbols.
AIXdbg- As for AIX but for debug
Darwin_x86_64ifort- For Mac/Darwin using Intel icc and ifort
HPUX- for HP-UX using f90 and c89.
IRIX5- For SGI IRIX 5 ("-o32" on mips-2 platforms using f90 and cc
IRIX64- For SGI IRIX 5 ("-64" on mips-4 platforms using f90 and cc, with OpenMP support.
IRIX64dbg- Like
IRIX64but compiled for debug.
IRIX64r8- Like
IRIX64but compiled forINTEGER*8andREAL*8
IRIX6n32- For SGI IRIX 6 -n32 on mips-4 platforms using f90 and cc, with OpenMP support.
IRIX6n32dbg- Like
IRIX6n32but compiled for debug.
IRIX6n32r8- Like
IRIX6n32but compiled forINTEGER*8andREAL*8
Linux2_alpha- For Linux on DEC^H^H^HCompaq^H^H^H^H^H^HHP Alpha systems using Digital fort.
Linux2_alphadbg- Like
Linux2_alphabut compiled for debug.
Linux2_ia64- For Linux on Intel IA64 using Intel ecc and efc Version 7.x. No OpenMP support.
Linux2_ia64_mp- For Linux on Intel IA64 using Intel ecc and efc Version 7.x, with OpenMP support.
Linux2_ia64_nomp- same as
Linux2_ia64
Linux2_ia64dbg- ...compiled for debug
Linux2_ia64g95- ... using gcc and g95
Linux2_ia64gfort- ... using gcc and gfortran
Linux2_ia64ifort- ... Intel Version 8.x icc and ifort with OpenMP support.
Linux2_ia64ifortdbg- ...compiled for debug, with OpenMP support.
Linux2_x86- For Linux on (32-bit) Intel(/AMD) x86 using gcc and gfortran, with OpenMP support.
Linux2_x86af95- For Linux on (32-bit) Intel(/AMD) x86 using GNU gcc and Absoft af95, with native Absoft name-mangling, with OpenMP support.
Linux2_x86af95_- Like
Linux2_x86af95but with Feldman-style name mangling
Linux2_x86af95_dbg- Like
Linux2_x86af95_but compiled for debug
Linux2_x86af95dbg- Like
Linux2_x86af95but compiled for debug
Linux2_x86dbg- Like
Linux2_x86but compiled for debug
Linux2_x86g95- For Linux on (32-bit) Intel(/AMD) x86 using GNU gcc and g95
Linux2_x86g95dbg- Like
Linux2_x86g95but compiled for debug
Linux2_x86lf95- For Linux on (32-bit) Intel(/AMD) x86 using GNU gcc and Lahey lf95
Linux2_x86path- For Linux on (32-bit) Intel(/AMD) x86 using Pathscale pathcc and path95, with OpenMP support.
Linux2_x86pg- For Linux on (32-bit) Intel(/AMD) x86 using Portland Group pgcc and pg90, with OpenMP support.
Linux2_x86pg_gcc_mp- For Linux on (32-bit) Intel(/AMD) x86 using GNU pgcc and Portland Group pg90, with OpenMP support.
Linux2_x86pg_gcc_nomp- Like
Linux2_x86pg_gcc_mpbut without OpenMP
Linux2_x86pg_pgcc_mp- Like
Linux2_x86pg_pgcc, with OpenMP support
Linux2_x86pg_pgcc_nomp- Like
Linux2_x86pg_pgcc, but without OpenMP
Linux2_x86sun- For Linux on (32-bit) Intel(/AMD) x86 using Sun/Oracle suncc and sunf95., with OpenMP support.
Linux2_x86sundbg- Like
Linux2_x86sunbut compiled for debug
OSF1- For Digital Alpha or Vax OSF1, using Digital cc and f90
Old: no longer have test-machine
OSX_x86- For 32-bit Mac Darwin, using GNU gcc and gfortran.
Old: no longer have test-machine
OSX_x86_64ifort- For 64-bit Mac Darwin, using GNU gcc and Intel ifort.
Old: no longer have test-machine
SunOS5- For Sun Solaris, using Sun cc and f90, with OpenMP support
Old: no longer have test-machine
SunOS5dbg- Like
SunOS5but compiled for debug
Old: no longer have test-machine
WIN_x86_64gfort- For CygWin64 under 64-bit MS-Windows, using GNU gcc and gfortran, with OpenMP support.
WIN_x86_64gfort_medium- Like
WIN_x86_64gfortbut compiled for medium memory model
WIN_x86_64mingw64- For MingW64 under 64-bit MS-Windows, using GNU gcc and gfortran, with OpenMP support.
WIN_x86gfort- For CygWin32 under MS-Windows, using GNU gcc and gfortran, with OpenMP support.
cray- for UNICOS on Cray vector machines using Cray cc and f90
Old: no longer have test-machine
The libraries have in the past been compiled for a number of platforms (some of which are noted above), but the machines used for building these no longer are available to compile and build the latest versions of the libraries. It should be a simple task to build versions of the libioapi.a and libnetcdf.a archive libraries on most UNIX/Linux workstations--at least, those with Feldman-descended Fortran compilers.
For C programmers: Further note that since most of the .c library routines use/are C wrappers around Fortran code, you need to use cc -c to build ".o" files for your program, and then use the relevant Fortran compiler, as appropriate, to invoke the linker (since f90 knows how to link in the Fortran run-time libraries but cc doesn't), as in the following example which builds SunOS5 program "qux" from "qux.c":
setenv LIB /env/apps/SunOS5/lib # library directory
cc -c qux.c # produces qux.o
f90 -o qux qux.o -L${LIB} -lioapi -lnetcdf # linking step
To: Models-3/EDSS I/O API: The Help Pages