The current release version of the I/O API library is Version 3.2; 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. Version 3.2 is 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.2New features of 2.2 and later releases are documented here in the Change Log; build instructions are available here.
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).
- 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,More older platforms, for which test machines are no longer available to me:COMMON
blocks, 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 hugeCOMMON
blocks (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.
Linux2_x86_64
- For Linux on (64-bit) Intel(/AMD) x86_64 using gcc and gfortran, with OpenMP support.
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_64af95
but 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_64af95
but compiled for debug, with OpenMP support.
Old: no longer have test-machine
Linux2_x86_64dbg
- Like
Linux2_x86_64
but 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 objet-files and programs.
Linux2_x86_64g95dbg
- Like
Linux2_x86_64g95
but 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_64gfort
but compiled for debug.
Linux2_x86_64gfortmpi
- Like
Linux2_x86_64gfort
but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64gfort_medium
- Like
Linux2_x86_64gfort
but compiled for medium memory model.
Linux2_x86_64gfort_mediumdbg
- Like
Linux2_x86_64gfort_medium
but compiled for debug.
Linux2_x86_64gfort_360
,Linux2_x86_64gfort_360
- Like
Linux2_x86_64gfort
but 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.
Linux2_x86_64gfort10dbg
- Like
Linux2_x86_64gfort10
but compiled for debug.
Linux2_x86_64gfort10mpi
- Like
Linux2_x86_64gfort10
but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64gfort10_medium
- Like
Linux2_x86_64gfort10
but compiled for medium memory model.
Linux2_x86_64gfort_mediumdbg
- Like
Linux2_x86_64gfort10
but compiled for debug.
Linux2_x86_64ifort
- For Linux on (64-bit) Intel(/AMD) x86_64 using Intel icc and ifort, with OpenMP support.
Linux2_x86_64ifortdbg
- Like
Linux2_x86_64ifort
but compiled for debug
Linux2_x86_64ifortmpi
- Like
Linux2_x86_64ifort
but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64ifort_medium
- Like
Linux2_x86_64ifort
but compiled with =mcmodel=medium, as needed for programs with arrays andCOMMON
blocks larger than 2 GB.
Linux2_x86_64ifort_mediumdbg
- Like
Linux2_x86_64ifort_medium
but compiled for debug
Linux2_x86_64gfort_360
,Linux2_x86_64gfort_360
- Like
Linux2_x86_64ifort
but compiled for 360-day or 365-day climatology-modeling "year".
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_64path
but compiled for debug
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_64pg
but 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_64pg
but with OpenMP turned off.
Linux2_x86_64pgmpi
- Like
Linux2_x86_64pg
but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
Linux2_x86_64pg_medium
- Like
Linux2_x86_64pg
but compiled with =mcmodel=medium, as needed for programs with arrays andCOMMON
blocks larger than 2 GB.
Linux2_x86_64pg_360
,Linux2_x86_64pg_360
- Like
Linux2_x86_64pg
but compiled for 360-day or 365-day climatology-modeling "year".
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_64sun
but compiled for debug
Linux2_x86_64sunmpi
- Like
Linux2_x86_64sun
but compiled for using PnetCDF/MPI distributed I/O in CMAQ.
- I/O API-3.2 only:
WIN_x86gfort
- for the Cygwin environment under MS-Windows using Cygwin 32-bit gcc and gfortran
- I/O API-3.2 only:
WIN_x86_64mingw64
- for the Cygwin environment under MS-Windows using MingW64 64-bit gcc and gfortran
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
IRIX64
but compiled for debug.
IRIX64r8
- Like
IRIX64
but compiled forINTEGER*8
andREAL*8
IRIX6n32
- For SGI IRIX 6 -n32 on mips-4 platforms using f90 and cc, with OpenMP support.
IRIX6n32dbg
- Like
IRIX6n32
but compiled for debug.
IRIX6n32r8
- Like
IRIX6n32
but compiled forINTEGER*8
andREAL*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_alpha
but 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_x86af95
but with Feldman-style name mangling
Linux2_x86af95_dbg
- Like
Linux2_x86af95_
but compiled for debug
Linux2_x86af95dbg
- Like
Linux2_x86af95
but compiled for debug
Linux2_x86dbg
- Like
Linux2_x86
but compiled for debug
Linux2_x86g95
- For Linux on (32-bit) Intel(/AMD) x86 using GNU gcc and g95
Linux2_x86g95dbg
- Like
Linux2_x86g95
but 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_mp
but 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_x86sun
but 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
SunOS5
but 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_64gfort
but 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