Amanzi Third Party Library (TPL) Build System#
Introduction#
This project builds the required and optional TPL software for the Amanzi code project. The build system is designed to configure and build TPLs to the requirements documented here https://software.lanl.gov/ascem/trac/wiki/Amanzi/Building/SoftwareRequirements.
Users are required to provide the following to build:
A recent and stable GCC or Intel compiler. We have successfully built with GNU versions 4.x to 9.x and Intel versions 11 through 17.
Mercurial version 1.8 or higher.
CMake version 3.11.4 or higher.
MPI installation with compiler wrappers. (mpicc, mpicxx, etc.)
BLAS/LAPACK built and tuned to the target architecture. See the Trilinos Configuration section for more information.
A location to install all the TPLs. The entire software stack will be installed in directories rooted to this directory. Since the download–patch-build-install cycle for each TPL is tied to a single target, the user must have read and write permission for this location.
The build directory will need approximately 2.1 Gb of space and the install directory tree requires 300 Mb.
On most UNIX-like OS (including Mac OSX) systems, the entire TPL software stack can be built using the bootstrap.sh
shell script found in the config directory. The script searches for CMake and will download and build CMake 2.8.8, if it does not locate the cmake command. The script also searches for a working mpi installation and will download and build OpenMPI 1.4.4 if it does not locate mpi. At this time, the script does not build compilers, LAPACK
or BLAS
. See the compilers section on how to obtain a supported compiler and LAPACK for LAPACK
and BLAS
suggestions. See the MPI section on how to obtain and install other mpi implementations.
The bootstrap.sh
script will create two build directories, one for the TPLs, TPL_BUILD, and one for amanzi, amanzi-build, in the directory the script is called from. Users can control the install location of the TPLs and Amanzi through command line arguments. The command
<amanzi source root>/bootstrap.sh --help
will print all the available options and default values.
If a TPL fails to download, configure, build or install, check the log files stored under a directory labeled:
<TPL name lowercase>/<TPL name lowercase>-timestamps.
Each step step is recorded with STDOUT
and STDERR
outputs stored
in separate files. Any bug report related to the TPLs should include these log files.
Obtaining A Supported Compiler#
At this time, Amanzi can be built with recent versions of GCC, 4.x through 9.x, and Intel versions 11.* and 17.*. Since GCC is widely used by the development team and it is free, we recommend using one of the supported GCC compilers.
GCC On Mac OSX#
The default GCC install on Mac OSX does not include a Fortran compiler. Mac users should use the MacPorts software http://www.macports.org/ to install GCC. Once MacPorts is installed,
port install gcc
will install GCC in the /opt/local directory. Be aware that Apple requires these compiler names to be gcc-mp-x.x, g++-mp-x.x and gfortran-mp-x.x, not the standard names gcc, g++ and gfortran.
GCC On Ubuntu#
Use the apt-get utility,
apt-get install gcc
Building GCC From Source#
Please contact your local IT support before attempting to build GCC from source. The binaries may be available in a non-standard location.
Building GCC requires several precision libraries that must be installed before building GCC. See http://gcc.gnu.org/install/prerequisites.html for more information. Once these packages are installed, GCC must be configured with C, C++ and Fortran enabled. Documentation of the available configure options is here http://gcc.gnu.org/install/configure.html. The quickest way to determine the best configure options is to find a similar machine with a matching OS that has the target GCC already installed, and look at the verbose version output. The command
gcc -v
will print out the configure options used to build that GCC compiler. One important note to remember: DO NOT BUILD GCC IN THE SOURCE DIRECTORY. Create a separate build directory. The GCC build time is long. On most systems it will need more than 2 hours to complete.
Obtaining MPI#
Amanzi has been built against both MPICH2 and OpenMPI. Both are easy to build and install, but on clusters, users should contact their local support before building either one. Many vendors provide tuned and optimized MPI libraries that should be used to maximize performance. Otherwise, install either MPICH2 or OpenMPI.
MPICH2#
We recommend that users install a stable version of MPICH2. MPICH even minor versions (Ex: 1.4.1 minor version is 4) are stable. Odd minor versions are beta releases.
Steps to build and install MPICH2 are
Download MPICH2
Unpack the tar file and create a separate build directory. In this build directory, configure MPICH2 with:
configure --prefix=<install prefix> \ --enable-f77 \ --enable-fc \ --enable-cxx \ --enable-romio \ --enable-shared \ --enable-static \ CC=<full path to C compiler> CXX=<full path to C++ compiler> FC=<full path to Fortran compiler> F77=<full path to Fortran compiler that support F77>Build, test and install. MPICH does not support parallel builds.:
make all; make test; make installSet environment variables, PATH, LD_LIBRARY_PATH on UNIX/Linux system:
setenv PATH <install prefix>/bin:${PATH} setenv LD_LIBRARY_PATH <install prefix>/lib:${LD_LIBRARY_PATH}or for
bash
shells:export PATH=<install prefix>/bin:${PATH} export LD_LIBRARY_PATH=<install prefix>/lib:${LD_LIBRARY_PATH}For Mac OSX, set PATH and DYLD_LIBRARY_PATH environment variables:
setenv PATH <install prefix>/bin:${PATH} setenv DYLD_LIBRARY_PATH <install prefix>/lib:${DYLD_LIBRARY_PATH}or for
bash
shells:export PATH=<install prefix>/bin:${PATH} export DYLD_LIBRARY_PATH=<install prefix>/lib:${DYLD_LIBRARY_PATH}Set environment variable MPI_ROOT. The
bootstrap.sh
script searches for compiler wrappers in this directory when this is set.:setenv MPI_ROOT <install prefix> or export MPI_ROOT=<install prefix>
OpenMPI#
Steps to build and install OpenMPI are
Download OpenMPI http://www.open-mpi.org
Unpack the tar file in a directory and create a separate build directory. In this build directory configure OpenMPI with
configure \ --prefix=<install prefix> \ --enable-mpi-f77 \ --enable-mpi-f90 \ --enable-mpi-cxx \ --enable-shared \ --enable-static \ CC=<full path to C compiler> CXX=<full path to C++ compiler> FC=<full path to Fortran compiler> F77=<full path to Fortran compiler that support F77>,where the compilers are defined explicitly on the command line.
Build, test and install. OpenMPI does support parallel builds.:
make all; make test; make installSet environment variables, PATH, LD_LIBRARY_PATH on UNIX/Linux system:
setenv PATH <install prefix>/bin:${PATH} setenv LD_LIBRARY_PATH <install prefix>/lib:${LD_LIBRARY_PATH}or for
bash
shells:export PATH=<install prefix>/bin:${PATH} export LD_LIBRARY_PATH=<install prefix>/lib:${LD_LIBRARY_PATH}For Mac OSX, set PATH and DYLD_LIBRARY_PATH environment variables:
setenv PATH <install prefix>/bin:${PATH} setenv DYLD_LIBRARY_PATH <install prefix>/lib:${DYLD_LIBRARY_PATH}or for
bash
shells:export PATH=<install prefix>/bin:${PATH} export DYLD_LIBRARY_PATH=<install prefix>/lib:${DYLD_LIBRARY_PATH}Set environment variable MPI_ROOT. The bootstrap.sh script searches for compiler wrappers in this directory when this is set.
setenv MPI_ROOT <install prefix> or export MPI_ROOT=<install prefix>
Obtaining LAPACK/BLAS#
Most systems have LAPACK
and BLAS
installed in system directories.
Building these libraries from source and optimizing for the target machine is difficult.
We recommend that users attempt to build Amanzi before building LAPACK
and BLAS
from
source. Trilnos, the package that requires both, detects the libraries in their build system
and in many cases finds them automatically. If the Trilinos build system fails to find the
libraries or if the user wants to build against non-standard LAPACK
/BLAS
distributions,
please read the Trilinos configuration section.
If the user must build LAPACK
and BLAS
from source, we recommend ATLAS
, a sofware package
that automatically builds tuned BLAS
libraries and a small subset of LAPACK
. By default
ATLAS
does not build a full LAPACK
distribution, but Amanzi requires a full LAPACK
library.
Read the ATLAS
documentation on how to build ATLAS
with a full LAPACK
installation.
ATLAS
downloads are available at http://math-atlas.sourceforge.net.
Building TPLs and Amanzi Using Bootstrap.sh
#
The script bootstrap.sh
is located in the config
directory. See bootstrap.sh --help
for a full list of options and default settings. The script will create two subdirectories in the currect directory. The first is TPL_BUILD used for downloading and builing the TPLs. The second is amanzi-build used for building Amanzi. The TPLs and Amanzi will be installed in the directory specified by the option --prefix
.
See the Quickstart Using Bootstrap section for instructions building using Bootstrap.sh
.
Building TPLs From The Command Line using CMake#
We recommend that users run the provided bootstrap.sh
script in the config
directory, to build
the TPLs. The instructions in this section are for advanced users and developers.
The steps to build entire suite of TPL software from the command line are
Configure with cmake:
cmake \ -D CMAKE_C_COMPILER=/full/path/mpicc \ -D CMAKE_CXX_COMPILER=/full/path/mpicxx \ -D CMAKE_Fortran_COMPILER=/full/path/mpif90 \ -D TPL_INSTALL_PREFIX=/full/path/to/tpls /full/path/to/amanzi/config/SuperBuildBuild with make (in parallel if desired):
make -j nwhere n is the number of make jobs.
Install with make:
make install
The final step, make install, copies a CMake configuration file,amanzi-tpl-config.cmake, to the install location under share/cmake that is useful when building Amanzi. Passing this configuration to cmake using the -C option defines all the TPL locations needed to build amanzi.
For example
cmake -C /full/path/to/amanzi-tpl-config.cmake \
[Additional CMake opts] /full/path/amanzi
will build and link amanzi linked against the TPLs built with this project, reducing the need for complicated build scripts.
Known Issues#
NetCDF fails to configure on Mac OSX#
This problem occurs when a user has HDF5 installed through MacPorts and uses the MacPorts OpenMPI. This is an issue with NetCDF’s configure script which does not allow the user to control the HDF5 prefix installation. Users can either install OpenMPI in another directory and use the wrappers in that directory (RECOMMENDED) or set ENABLE_NetCDF4:BOOL=FALSE while configuring SuperBuild from the command line.
Library parallelio (ASCEM-IO) missing archive index (MacOSX)#
This bug has only been reported on Macs. Users will experience this bug when linking the HDF5 test binaries in the Amanzi test suite. Despite a kludge in the shell script to address this when building ASCEM-IO, this problem persists. The work-around is to run ranlib on the installed libparallelio.a library.
Trilinos Configuration#
Amanzi relies on Trilinos for basic distributed data structures, input file handling and non-linear solvers. It is critical, for performance reasons, that the Trilinos build point to tuned BLAS and LAPACK libraries. On most systems, the BLAS and LAPACK libraries are found in standard system libraries (/usr/lib or /usr/lib64). However on large scale clusters these libraries are typically generic implementations and will not provide optimal performance. Such machines have tuned BLAS/LAPACK libraries. Please consult the support documentation for these machines to find the recommended libraries.
To guide the search for BLAS/LAPACK libraries, add -D ENABLE_BLA_Search:BOOL=TRUE
to your cmake options. The CMake mechanism (FindBLAS and FindLAPACK) searches through
a list of known vendor supplied BLAS/LAPACK libraries.
Unless, BLA_VENDOR
is set, all possible vendors
are searched, and the search ceases once a valid BLAS/LAPACK library is found. For the
search to be successful, the library must be located in a standard installation location or
defined in the user’s environment variables LD_LIBRARY_PATH
or DYLD_LIBRARY_PATH
.
Supported BLAS/LAPACK Vendors:
Vendor |
Description |
ATLAS |
Automatically Tuned Linear Algebra Software |
PhiPACK |
PHiPAC (Portable High Performance ANSI C) |
CXML |
HP Libraries |
DXML |
?? |
SunPerf |
Sun Performance Libraries |
SCSL |
SGI/Cray Performance Libraries |
SGIMATH |
?? |
IBMESSL |
?? |
ACML |
AMD Core Math Library |
ACML_MP |
AMD Core Math Library multi-threaded |
Apple |
Mac OSX Accelerate Framework |
NAS |
?? |
Intel10_32 |
Intel MKL with 32bit int |
Intel10_64lp |
Intel MKL with 64bit int |
Intel |
Older versions of MKL |
Generic |
Generic BLAS |
If the search fails during the TPL configuration or if the Trilinos configuration
fails to locate these libraries, the user can override the search by explicitly
defining the libraries with BLAS_LIBRARIES
and LAPACK_LIBRARIES
at
configuration time. Multiple library names should be
separated with a semi-colon. In some cases, Intel’s MKL libraries, require
additional link flags when building Amanzi. Use the CMAKE_EXE_LINKER_FLAGS
configuration variable to define these additional link flags when building Amanzi.
Consult the documentation for the particular library for more information.
Trilinos Build Configuration Files#
SuperBuild contains Trilinos CMake configuration files for specific platforms and
compilers. The files are located under the tpl-build/cmake directory.
The file name should be defined while configuring tpl-build with the option
-D Trilinos_Build_Config_File:STRING=<file>
. This configuration file will
be the last CMake configuration variable passed to Trilinos, thus all the
definitions in this file will override previous configuration definitions.
- Hopper (NERSC):
- Compiler:
Intel
- Config File:
trilinos-build-libsci-intel.cmake
- Description:
Defines the LibSci libraries as BLAS/LAPACK libraries.
- Hopper (NERSC):
- Compiler:
GNU
- Config File:
trilinos-build-libsci-gnu.cmake
- Description:
Defines the LibSci libraries as BLAS/LAPACK libraries.