This is an old revision of the document!
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:
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)