Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Introduction

This article describes how the compilation of the OpenIFS model is controlled and how to modify the compilation. It provides more detailed information than the page 5.5 Building OpenIFS. There are a number of ways in which the compilation can be changed.

Various compiler and configuration files are supported for OpenIFS which are tested and known to work on systems we have access to (see 5.1 Supported systems).

Warning

The supplied configurations can be edited or over-ridden as described below, but we caution the user not to try their 'favourite' options. IFS is a complex code and may not behave appropriately with different compile options than supplied.

Compiling with FCM

The Flexible Configuration Management (FCM) software, from the UK Meteorological Office, is used to compile the model. FCM offers a number of advantages: configuration files are straightforward to understand, model object files are compiled 'out-of-source', source code changes can be 'out-of-source', fortran interface blocks can be generated automatically.

FCM replaces the traditional 'make' or 'gmake' command and is specifically written for compiling large fortran or mixed fortran/C codes like OpenIFS.

A quick introduction to FCM for OpenIFS users is available. A more detailed description of the 'fcm make' command is also available.

Build types

The supplied configuration files support 3 different build types:

Optimized build ('opt') - this is uses higher optimization and will generate the faster running model. Note that we do not always recommend the very highest optimization levels as this can sometimes cause the model to fail. The optimizations options are chosen conservatively to ensure the model will run successfully on a wide range of hardware and compiler versions. OpenMP is enabled in this configuration only. The user is free to increase optimization levels once the model is running successfully and we welcome feedback on best choice of compiler options.

Non-optimized build ('noopt') - this is intended for development and debugging. Optimization is set to -O0 and OpenMP is disabled. The model will run significantly slower. We recommend that when compiling OpenIFS for the first time, this build configuration is used as it will compile faster and be more stable.

Full debugging ('nansC') - this configuration is intended for debugging only. As well as setting the lowest optimization, -O0, it also enables array bound checking and initialisation of variables with special values that will trigger 'not-a-number' exceptions useful for trapping variables used before initialized. This will cause the model to run very slowly and is normally only used for short runs for tracing bugs.

Configuration files and variables

The FCM software uses configuration files identified by the suffix '.cfg'. They can be found in the directory oifs/make/cfg. The master configuration file for OpenIFS is in cfg/oifs.cfg. It sets general configuration options for FCM, lets FCM know where the source code is and reads a single architecture and compiler specific configuration file. No compiler options are contained in the oifs.cfg file - these are always in the architecture specific configuration files.

The naming convention for these architecture specific files is: <compiler>-<build type>.cfg. For example, the file cfg/gnu-opt.cfg would be for the GNU compilers and the optimized build. The user can copy and rename the files provided or create their own using an existing one as a template.

Info

Older versions of OpenIFS also used an environment variable OIFS_ARCH to indicate the architecture and files would be named <arch>-<compiler>-<build type>.cfg. This was removed in later versions of OpenIFS.

Info

Newer versions of OpenIFS (38r1v05 and on) introduced an environment variable OIFS_CFG which could be set to any user supplied configuration file with the same settings as files in make/cfg.

How to change build type.

Before compiling the OpenIFS model, the build configuration must first be set by several environment variables:

OIFS_COMP - This sets the choice of compiler. The default is 'gnu' which means the gfortran/gcc compilers will be used.

OIFS_BUILD - This sets the type of build. The default is 'noopt'.

These variables and their defaults are set in the cfg/oifs.cfg file. e.g.

Code Block
$OIFS_COMP{?} = gnu
$OIFS_BUILD{?} = noopt

For more information about FCM, please see the FCM User Guide (from the UK Met Office).

Configuration files and variables

The FCM software uses configuration files identified by the suffix '.fcm' (n.b. OpenIFS versions before 43r3 used .cfg as the suffix). They can be found in the directory oifs/make/fcm.

The master configuration file for OpenIFS is in make/oifs.fcm. It sets general configuration options for FCM, lets FCM know where the source code is and reads a single architecture and compiler specific configuration file. No compiler options are contained in the oifs.fcm file - these are always in the architecture & build specific configuration files.

The naming convention for these architecture specific files is: <compiler>-<build type>.fcm. For example, the file fcm/gnu-opt.fcm would be for the GNU compilers and the optimized build. The user can copy and rename the files provided or create their own using an existing one as a template.

Build types

The supplied FCM configuration files support 3 different build types:

Optimized build ('opt') - this is uses higher optimization and will generate the faster running model. Note that we do not always recommend the very highest optimization levels as this can  cause the model to fail in select subroutines. The optimizations options are chosen conservatively to ensure the model will run successfully on a wide range of hardware and compiler versions.
OpenMP is enabled in this configuration only.

Non-optimized build ('noopt') - this is intended for testing, development and debugging. Optimization is set to -O0 and OpenMP is disabled. The model will run significantly slower. We recommend if the model fails with OIFS_BUILD=opt when compiling OpenIFS for the first time, this build configuration should be used as it will compile faster and be more stable.

Full debugging ('nansC') - this configuration is intended for debugging only. As well as setting the lowest optimization, -O0, it also enables array bound checking and initialisation of variables with special values that will trigger 'not-a-number' exceptions useful for trapping variables used before initialized. This will cause the model to run very slowly and is normally only used for short runs for tracing bugs. This configuration is not guaranteed to work with all model versions.

How to change build type.

Before compiling the OpenIFS model, the build configuration must first be set by several environment variables:

OIFS_COMP - This sets the choice of compiler. The default is set in make/fcm configuration files to 'gnu' which means the gfortran/gcc compilers will be used.

OIFS_BUILD - This sets the type of build. The default is 'noopt'.

Code Block
languagebash
titlee.g. to use the Intel compiler instead of the default GNU compiler do...
export OIFS_COMP=intel
export OIFS_BUILD=opt


These variables and their defaults are set in the make/oifs.fcm file. e.g.

Code Block
$OIFS_COMP{?} = gnu
$OIFS_BUILD{?} = noopt

Overriding defaults in configuration files

The FCM syntax allows for variables in the configuration files (.fcm) to be overridden by user environment variables. You will have already seen this before when setting OIFS_BUILD and OIFS_COMP which correspond to these lines in the make/fcm/*.fcm files.

The {?} syntax (often seen in the The {?} syntax (often seen in the configuration files) means that if an environment variable of the same name exists, that value will be used instead of the value assigned. This provides a way to change many of the settings in the configuration files. For example, using

Create your own config files

Suppose we wanted to run the model on MacOS X with the intel compiler and a optimized setting. There are several ways we could change the compilation configuration.

(a) We could set:

Code Block
export OIFS_BUILD=opt

changes the build type to the 'optimized' build. This means instead the file 'cfg/gnu-opt.cfg' will be included by cfg/oifs.cfg instead of the file cfg/gnu-noopt.cfg.

Create your own config files

Suppose we wanted to run the model on MacOS X with the intel compiler and a optimized setting. We could set:

Code Block
export OIFS_COMP=osx_intel
export OIFS_BUILD=opt

FCM would then expect to find a file called: osx_intel-opt.cfg in the make/cfg directory. This file would need to be created by the user. We suggest copying one of the existing .cfg files as a template and modifying it to suit your purpose.

COMP=osx_intel
export OIFS_BUILD=opt

FCM would then expect to find a file called: osx_intel-opt.cfg in the make/cfg directory. This file would need to be created by the user. We suggest copying one of the existing .cfg files as a template and modifying it to suit your purpose.

(b) Or you could use the OIFS_CFG environment variable. By default this variable is set to:

Code Block
$OIFS_CFG{?} = $HERE/fcm/${OIFS_COMP}-${OIFS_BUILD}.fcm

The $HERE variable in this line means 'the directory where this file is located'.

Instead of changing OIFS_COMP & OIFS_BUILD, you could instead use:

Code Block
export OIFS_CFG="\$HERE/fcm/mac-gnu-opt.fcm

The mac-gnu-opt.fcm would need to be an edited copy of one of the configuration files in the make/fcm directory. The backslash character '\' means the '$' symbol is passed through to the fcm command rather than being interpreted by the export command.

Your own .fcm files do not need to be kept in the make/fcm Your own .cfg files do not need to be kept in the make/cfg directory. You might like to create a directory, say, make/mycfg my-configs and store them in there. Use the -f option for the fcm make command to load the new files:

Code Block
languagebash
titlee.g.
% cd oifs/make
% mkdir mycfgmy-configs
% lncp -s cfg/oifs.cfg mycfg/oifs.cfg                                 #  the oifs.cfg must exist in the same directory as your custom .cfg file.
% cp cfg/intel-opt.cfg mycfg/osx_intel_v13-opt.cfg
(edit osx_intel_v13-opt.cfg)
% export OIFS_COMP=osx_intel_v13
% export OIFS_BUILD=opt
% fcm make -f mycfg/oifs.cfg

Change compiler options globally

fcm/intel-opt.fcm my-configs/osx_intel_v13-opt.fcm
(edit osx_intel_v13-opt.fcm)
% export OIFS_CFG="\$HERE/my-configs/osx_intel_v13-opt.fcm"
% fcm make -f mycfg/oifs.cfg

Note there is no need to set OIFS_BUILD & OIFS_COMP in this example as they are not used, OIFS_CFG takes precedence.

Change compiler options globally

All the compiler flags and options are contained in the build specific files (e.g. intel-opt.fcm). As above, a number of environment variables can be defined to override the default options set in these files.

All the compiler flags and options are contained in the build specific files (e.g. intel-opt.cfg). As above, a number of environment variables can be defined to override the default options set in these files. As a general rule, any variable with a {?} can be overriden by setting an environment variable.

The following compilation variables in the configuration files can be overriden by environment variables:

User configurable variablesDescriptionOIFS_GRIB_API_DIR

Location of the grib_api installation directory. This must be changed or overridden to the location of your grib_api install before OpenIFS can be compiled.
e.g. OIFS_GRIB_API_DIR{?} = /home/user/ecmwf/grib_api_gcc

OIFS_GRIB_API_INCLUDELocation of the 'include' sub-directory in the grib_api installation. This does not normally need changing.OIFS_GRIB_API_LIBLocation of the 'lib' sub-directory in the grib_api installation. This does not normally need changing. Note: although grib_api builds both shared and static libraries, OpenIFS always links to the static library in case different versions of grib_api exist on the user system.OIFS_LAPACK_LIBCompiler options to set the directory of the LAPACK and BLAS libraries. This must be changed or overriden as the supplied default is unlikely to be correct on most systems. e.g. OIFS_LAPACK_DIR{?} = -L/opt/apps/lapack/LP64/ -llapack -lblasOIFS_EXTRA_LIB

Available in case additional libraries need to be specified. This is most likely set when vendors supply special optimized libraries. One example is IBM's optimized math function library MASS. e.g.  OIFS_EXTRA_LIB{?} = -L/usr/lib/mass -lmass -lmassvp6

OIFS_FCSpecifies the fortran compiler. The normal default is 'mpif90' but might be 'mpiifort' for the Intel compiler or more generally 'mpifc'. We recommend that mpi compiler wrappers are used whenever possible to simplify the compilation e.g. OIFS_FC = mpif90.OIFS_FFLAGSFortran compiler flags for free format source files. These flags will vary between the 'opt', 'noopt' and 'nansC' build configurations. e.g.
OIFS_FFLAGS = -g -O2 -m64 -march=native -fconvert=big-endian -fopenmpOIFS_FFIXEDExtra fortran compiler flags, in addition to OIFS_FFLAGS, for fixed source form Fortran. There are a small number of fortran source files in OpenIFS that are still in fixed format. These options will be added to the options in OIFS_FFLAGS.OIFS_FCDEFSFortran preprocessor DEFINE flags. This is a list, separated by spaces, of the DEFINE flags required by the code in preprocessor statements like #ifdef. The user is advised not to change theseOIFS_LFLAGSLinker options. These are separate flags to be passed to the linker. For example, a common requirement is to generate a loadmap or increase stack memory size. e.g.
OIFS_LFLAGS{?} = -bloadmap:map -bmaxstack:0x80000000OIFS_CCSpecifies the C compiler. As for the Fortran compiler this would normally be a compiler wrapper supplied by the MPI system in use. e.g. mpicc for GCC or mpiicc for Intel.OIFS_CFLAGSC compiler flags. As for the Fortran flags, these will vary between the 'opt', 'noopt' and 'nansC' build options.OIFS_CCDEFSC preprocessor flags. As for the OIFS_FCDEFS, the user is advised not to change these.

Examples

Set minimum required options.
The only two compilation variables that need to be changed before building OpenIFS are the location of the grib_api installation and the location of the LAPACK and BLAS libraries.
Code Block
titlee.g.
export OIFS_GRIB_API_DIR=/home/me/ecmwf/grib_api
export OIFS_LAPACK_LIB="/opt/apps/lapack/current/LP64 -llapack -lblas"
fcm make -f cfg/oifs.cfg
Would override the values of these variables in the FCM config files. In this example, FCM would use the gnu-noopt.cfg build as this is the default specified in the oifs.cfg file (in the oifs/make/cfg directory).

Changing compiler and compiler options.
In this example, the build type is changed and the choice of underlying fortran compiler is altered along with some compiler options:

Code Block
export OIFS_COMP=gnu
export OIFS_BUILD=opt
export OIFS_GRIB_DIR=/opt/local/ecmwf/grib_api_xe6
export OIFS_LAPACK_LIB="-L/opt/apps/scal/lib -llapack -lblas"
export OIFS_FC="mpif90 --fc=crayftn"
export OIFS_FFLAGS="-g -O1 -m64 -convert big-endian"

} can be overriden by setting an environment variable.

The following compilation variables in the configuration files can be overriden by environment variables (this may vary between releases so always check the .fcm file):

User configurable variablesDescription
OIFS_GRIB_DIR

Location of the GRIB library installation directory. This must be changed or overridden to the location of your ecCodes install before OpenIFS can be compiled.
e.g. OIFS_GRIB_DIR{?} = /home/user/ecmwf/eccodes

OIFS_GRIB_INCLUDELocation of the 'include' sub-directory in the eccodes installation. This does not normally need changing unless it's located in a non-standard location.
OIFS_GRIB_LIBLocation of the 'lib' sub-directory in the eccodes installation. This does not normally need changing. Note: although eccodes builds both shared and static libraries, OpenIFS always links to the static library in case different versions of eccodes exist on the user system.
OIFS_NETCDF_DIRLocation of the netCDF installation directory. This must be changed or overridden to the location on your system as the default supplied may not be correct.
OIFS_LAPACK_LIBCompiler options to set the directory of the LAPACK and BLAS libraries. This often needs to be changed or overriden as the supplied default is unlikely to be correct on most systems.
OIFS_EXTRA_LIB

Available in case additional libraries need to be specified. This is most likely set when vendors supply special optimized libraries. One example is IBM's optimized math function library MASS. e.g.  OIFS_EXTRA_LIB{?} = -L/usr/lib/mass -lmass -lmassvp6 (n.b. only OpenIFS version before 43r3 supported the IBM compiler).

OIFS_FCSpecifies the fortran compiler. The normal default is 'mpif90' but might be 'mpiifort' for the Intel compiler or more generally 'mpifc'. We recommend that mpi compiler wrappers are used whenever possible to simplify the compilation e.g. OIFS_FC = mpif90.
OIFS_FFLAGSFortran compiler flags for free format source files. These flags will vary between the 'opt', 'noopt' and 'nansC' build configurations. e.g.
OIFS_FFLAGS = -g -O2 -m64 -march=native -fconvert=big-endian -fopenmp
OIFS_FFIXEDExtra fortran compiler flags, in addition to OIFS_FFLAGS, for fixed source form Fortran. There are a small number of fortran source files in OpenIFS that are still in fixed format. These options will be added to the options in OIFS_FFLAGS.
OIFS_FCDEFSFortran preprocessor DEFINE flags. This is a list, separated by spaces, of the DEFINE flags required by the code in preprocessor statements like #ifdef. The user is advised not to change these
OIFS_LFLAGSLinker options. These are separate flags to be passed to the linker. For example, a common requirement is to generate a loadmap or increase stack memory size. e.g.
OIFS_LFLAGS{?} = -bloadmap:map -bmaxstack:0x80000000
OIFS_CCSpecifies the C compiler. As for the Fortran compiler this would normally be a compiler wrapper supplied by the MPI system in use. e.g. mpicc for GCC or mpiicc for Intel.
OIFS_CFLAGSC compiler flags. As for the Fortran flags, these will vary between the 'opt', 'noopt' and 'nansC' build options.
OIFS_CCDEFSC preprocessor flags. As for the OIFS_FCDEFS, the user is advised not to change these.


Changing compiler options per file

The description above covers changing the compiler options globally, that is, for all files in the compilation. There may be instances when options for one or a few files need to be changed. For instance, in debugging where array bound checking is required for a handful of changed subroutines.

Changing options per file cannot be done using environment variables. There are several ways in which it can be done:

Edit the oifs.fcm file

The oifs.fcm file is the place to put all file specific options. Some can be found in this file already e.g.

Code Block
oifs.prop{fc.flags}[algor/internal/fourier]       = $OIFS_FFIXED $OIFS_FFLAGS
oifs.prop{fc.flags}[algor/internal/lanczos/i2x.F] = $OIFS_FFIXED $OIFS_FFLAGS

The first line above sets the build property 'fc.flags' (ie. fortran compiler flags) for the directory algor/internal/fourier (under the 'src' directory). Note this sets compiler flags for all files in that directory.

The second line set the build property, compiler flags, for the specific file, algor/internal/lanczos/i2x.F. Note that all other files in this directory, unless changed elsewhere, will use the default compiler options as described above.

These statements are used to ensure F77 files are compiled correctly.

Example: you need to reduce the optimisation and include array bound checking on a specific file for testing. We suggest you make a copy of the oifs.fcm and add the line:

Code Block
languagebash
titleEdit a copy of oifs.fcm and add the line:
oifs.prop{fc.flags}[ifs/module/yomtrans.F90] = -g -O0 -m64 -C -fconvert=big-endian

and then compile using this new file:

Code Block
fcm make -f oifs_copy.fcm


Info

As this is a new .fcm file for FCM it will do a full build of the code from scratch. Any subsequent builds will be incremental - only compiling changed files.

Using the 'include' statement

FCM configuration files support an 'include' statement. The oifs.fcm file uses this to include architecture and compiler specific information. If you need to include several lines changing the options for multiple files then another option would be to add an additional 'include' statement to point to a new file containing the oifs.prop lines you need. For example:

Code Block
titleEdit oifs.cfg and add this line
include = $HERE/debug.fcm

and then create the file make/fcm/debug.fcm with the 'oifs.prop' lines you need.

Info

The $HERE variable is a special FCM specific variable that expands to the directory name containing the file. In this example the oifs.fcm and your debug.fcm are in the same directory.

Inherited build

A third way to customize at the file level is through FCM's 'inherited build' mechanism. This simple but powerful facility is described in more detail in the HowTo modify and add new code. In brief this allows you to leave the current configuration and source untouched and 'use' or 'inherit' the OpenIFS configuration in a completely separate directory. This makes it easier to update the OpenIFS code for new releases and keeps any changes you make completely separate

In this example, the compiler has been changed although FCM will still use the gnu-opt.cfg configuration file. This might be because a user wants to temporarily try a different compiler. However, it's recommended that each compiler has its own set of .cfg files rather than alter it this way.
Another example is where an optimized build is required but the optimization level is dropped to -O1 instead of -O2.

Changing options per file

The description above covers changing the compiler options globally, that is, for all files in the compilation. There may be instances when options for one or a few files need to be changed. For instance, in debugging where array bound checking is required for a handful of changed subroutines.

Changing options per file cannot be done using environment variables. There are several ways in which it can be done:

Edit the oifs.cfg file

The oifs.cfg file is the place to put all file specific options. Some can be found in this file already e.g.

Code Block
build.prop{fc.flags}[algor/internal/fourier]       = $OIFS_FFIXED $OIFS_FFLAGS
build.prop{fc.flags}[algor/internal/lanczos/i2x.F] = $OIFS_FFIXED $OIFS_FFLAGS

More information on the configuration file syntax for FCM can be found on the FCM Users Guide from the UK Met Office.

The first line above sets the build property 'fc.flags' (ie. fortran compiler flags) for the directory algor/internal/fourier (under the 'src' directory). Note this sets compiler flags for all files in that directory.

The second line set the build property, compiler flags, for the specific file, algor/internal/lanczos/i2x.F. Note that all other files in this directory, unless changed elsewhere, will use the default compiler options as described above.

These statements are used to ensure F77 files are compiled correctly.

Example: you need to reduce the optimisation and include array bound checking on a specific file for testing. We suggest you make a copy of the oifs.cfg and add the line:

Code Block
titleEdit a copy of oifs.cfg and add the line:
build.prop{fc.flags}[ifs/module/yomtrans.F90] = -g -O0 -m64 -C -fconvert=big-endian

and then compile using this new file:

Code Block
fcm make -f cfg/oifs_copy.cfg
Info

As this is a new .cfg file for FCM it will do a full build of the code from scratch. Any subsequent builds will be incremental - only compiling changed files.

Using the 'include' statement

FCM configuration files support an 'include' statement. The oifs.cfg file uses this to include architecture and compiler specific information. If you need to include several lines changing the options for multiple files then another option would be to add an additional 'include' statement to point to a new file containing the build.prop lines you need. For example:

Code Block
titleEdit oifs.cfg and add this line
include = $HERE/debug.cfg

and then create the file cfg/debug.cfg with the 'build.prop' lines you need.

Info

The $HERE variable is a special FCM specific variable that expands to the directory name containing the file. In this example the oifs.cfg and your debug.cfg are in the same directory.

Inherited build

A third way to customize at the file level is through FCM's 'inherited build' mechanism. This simple but powerful facility is described in more detail in the HowTo modify and add new code. In brief this allows you to leave the current configuration and source untouched and 'use' or 'inherit' the OpenIFS configuration in a completely separate directory. This makes it easier to update the OpenIFS code for new releases and keeps any changes you make completely separate.

The reader is referred to the separate HowTo modify and add new code for examples on how to use it.

Recommendations

As described above, the build environment uses 3 types of build:

  • Optimised
  • Non-optimized
  • Full debugging (nansC)

The compilation of OpenIFS can be changed is several ways:

Setting the OIFS_COMP and OIFS_BUILD environment variables.
This changes the compilation to use one of the supplied FCM configuration files: <comp>-<build>.cfg.
Set additional environment variables to override the settings in the supplied configuration files.
e.g. changing OIFS_FFLAGS to alter the optimization level.
  • Creating new .cfg files and set OIFS_COMP & OIFS_BUILD accordingly. Often best when testing is finished and different compiler options have been chosen.
  • For temporary changes when testing or debugging, setting environment variables (2) to override the compiler options is perhaps the simplest.

    Once testing is finished and permanent changes are required, or if unsupported compilers are required, then copy an existing .cfg file and create your own. Any names can be used. For instance, if you wanted to have 2 configurations for the Intel compiler, one with the Intel MPI, the other with OpenMPI, then create files: intel_impi-opt.cfg and intel_ompi-opt.cfg and use the environment variable OIFS_COMP to switch between them. e.g. OIFS_COMP=intel_ompi (it's up to the user whether they want to create .cfg files for each build type; 'opt', 'noopt', 'nansC').






    Excerpt Include
    Credits
    Credits
    nopaneltrue


    Panel
    borderColorgrey

    On this page ...

    Table of Contents
    indent12px


    Panel
    titleIn this section...

    Children Display
    depth1
    page5. OpenIFS Installation


    Panel
    titleOpenIFS User Guide ...

    Children Display
    depth1
    pageOpenIFS 43r3 User Guide