Installation

Pre-build Packages

If you are lucky to run one of the following operating systems, you can install fimex from a package repository:

Ubuntu 10.04 Lucid

Ubuntu Lucid packages are available since 0.28 at: https://launchpad.net/~heiko-klein/+archive/fimex

Ubuntu 8.04 Hardy

Ubuntu Lucid packages are available up to 0.25 at: https://launchpad.net/~heiko-klein/+archive/fimex

Dependencies

Fimex requires at least the following libraries to be installed for compilation:

c99/c++ compiler

libxml2 >= 2.5.0

boost library >= 1.32

proj-4 >= 4.4.9

udunits 1.12.x or >= 2.1.x

To configure the different file formats it requires:

NetCDF (netcdf-3 > 3.6)

Felt (libmi or libfelt (bundled))

grib_api (> 1.4)

Build

The installation follows the usual autoconf rules, see 'INSTALL' for extensive information. Since Fimex makes some floating-point calculations in large loops, it is advisable to switch on SIMD/SSE operations in your compiler. On a Xeon machine with a x386 machine and gcc, I use the following flags (those are default for x86-64) (see microbenchmark of sse for more information)

Since fimex 0.21

CFLAGS='-O2 -mfpmath=sse -msse2 -ftree-vectorize -fno-math-errno' CXXFLAGS='-O2 -mfpmath=sse -msse2 -ftree-vectorize -fno-math-errno' ./configure --with-netcdf=/usr --with-udunits=/usr
make
make check
make install

Static netcdf4

Use nc-config or package-config scripts to detect library dependencies, e.g.

./configure --with-netcdf=/paht/to/nc-config

Static grib_api

The static grib_api does not come with an automatic library detection program like package-config. When linking against grib_api, you need to know the required library flags, e.g. -L/path/to/jasper -ljasper -lpng -ljpeg or -L/path/to/openjpeg -lopenjpeg -lpng -ljpeg. Put this string into the LDFLAGS variable before running configure, e.g.

export LDFLAGS='-L/path/to/openjpeg -lopenjpeg -lpng -ljpeg'
./configure --with-grib_api=/path/to/grib_api

Optimizations with gcc

The following optimizations have been tried with gcc 4.4 and kd-tree interpolation.

-O2 general optimizations like loop-unrolling/inline

-mfpmath=sse -msse2 on i386 computers, use math from sse-unit. The build-in FPU is not IEEE conform and performs very slowly (> factor 2) when calculating sqrt(nan). This is already the default on i386-64.

-ftree-vectorize -fno-math-errno gives tiny performance gain through auto-vecotrization. -fno-math-errno is required to enable vectorization of intrinsic functions like sqrt.

-fno-trapping-math -fno-signaling-nans fimex does not make use of trapping-math or signaling-nans, so this option can safely be switched on. Unfortunately, this does not give any performance gain.

-O3 gives no visible performance gain. This should be tested again with newer compiler-versions.

-fprofile-generate/-fprofile-use gives a performance gain of ~4%. Since it complicates the build, it is not used by default.

Parallelization (OpenMP)

Fimex can be build with OpenMP parallelization support with the configure option --enable-openmp. The following operations are parallelized:

interpolation: fill2d (good parallelization on z-axis)

interpolation with coord_nearestneighbor (good parallelization in startup)

CAVEAT

Due to a bug in libtool, the options required for linking again a parallelized libfimex are not set automatically and need be entered manually by the programmer using libfimex: https://lists.gnu.org/archive/html/bug-libtool/2011-03/msg00022.html

Test

Download the file with testdata: flth00.dat.gz

Put this file into the test-catalogue

gunzip the file

run 'make check' (make check will work even without the testdata and skip a lot of tests)