Building Nalu on Thor
Nalu is a Low-Mach Number turbulent flow simulator for energy applications.
This post describes the steps followed to build it on Thor, a Linux cluster with Intel Xeon (Broadwell) processor and Mellanox EDR InfiniBand interconnect.
- 1 References
- 2 Installation
- 3 Usage
References
Installation
First, consult the following document , specifically the Linux section.
Note that the two subsections with heading Nalu Releases aren't especially clear, but the build will work if one follows the directions for "Head Code Base". Many packages need to be built before one has a working Nalu executable.
1. Set up the build environment
a. Load the compiler and HPC-X modules you wish to use
module load intel/compiler/2017.4.196 hpcx-1.9/icc-2017
export CC=icc
export CXX=icpc
export FC=ifort
export F90=ifort
export F77=ifort
export OMPI_CC=icc
export OMPI_CXX=icpc
export OMPI_FC=ifort
export OMPI_F77=ifort
b. Replace the path that follows with whatever is appropriate for you
cd /mnt/beegfs3/gerardo/nrel_esif/Nalu/
mkdir build
cd build
export nalu_build_dir=$PWD
mkdir $nalu_build_dir/packages
mkdir $nalu_build_dir/install
mkdir $nalu_build_dir/install/lib
cd $nalu_build_dir/packages
export nalu_install_dir=$nalu_build_dir/install
2. Install CMake
wget http://www.cmake.org/files/v3.1/cmake-3.1.0-rc2.tar.gz
tar zxvf cmake-3.1.0-rc2.tar.gz
cd cmake-3.1.0-rc2/
./configure --prefix=$nalu_build_dir/install
make
make install
Make sure your newly-built CMake can be found
export PATH=/mnt/beegfs3/gerardo/nrel_esif/Nalu/build/install/bin:$PATH
3. Install SuperLU
cd $nalu_build_dir/packages
wget http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_4.3.tar.gz
tar zxvf superlu_4.3.tar.gz
cd $nalu_build_dir/packages/SuperLU_4.3
cp MAKE_INC/make.linux make.inc
Edit make.inc so that the following macros are defined as indicated:
# PLAT = _x86_64
# SuperLUroot = /mnt/beegfs3/gerardo/nrel_esif/Nalu/build/packages/SuperLU_4.3
# BLASLIB = -L/opt/intel/compilers_and_libraries_2017.4.196/linux/mkl/lib/intel64 -lmkl_blas95_lp64 -lmkl_core -lmkl_rt -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_avx2 -liomp5
# CC = mpicc
# FORTRAN = mpif77
Create directory and make
mkdir $nalu_build_dir/install/SuperLU_4.3
mkdir $nalu_build_dir/install/SuperLU_4.3/lib
mkdir $nalu_build_dir/install/SuperLU_4.3/include
make
cp SRC/*.h $nalu_build_dir/install/SuperLU_4.3/include
Note: The following copy step is missing from the directions in the base document, it will trip you up if not done.
cp -p lib/libsuperlu_4.3.a $nalu_build_dir/install/SuperLU_4.3/lib
4. Install libml2
cd $nalu_build_dir/packages
wget http://www.xmlsoft.org/sources/libxml2-2.9.2.tar.gz
tar zxvf libxml2-2.9.2.tar.gz
cd $nalu_build_dir/packages/libxml2-2.9.2
CC=mpicc CXX=mpicxx ./configure -without-python --prefix=$nalu_build_dir/install
make -k install
5. Install Boost
cd $nalu_build_dir/packages
wget http://iweb.dl.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz
tar zxvf boost_1_55_0.tar.gz
cd $nalu_build_dir/packages/boost_1_55_0
echo "using mpi : `which mpicxx` ;" >> ./tools/build/v2/user-config.jam
./bootstrap.sh --prefix=$nalu_build_dir/install --with-libraries=signals,regex,filesystem,system,mpi,serialization,thread,program_options,exception
./b2 -j 4 2>&1 | tee boost_build_one
./b2 -j 4 install 2>&1 | tee boost_build_instal
6. Install Yaml
cd $nalu_build_dir/packages
git clone https://github.com/jbeder/yaml-cpp
cd $nalu_build_dir/packages/yaml-cpp
mkdir build
cd build
cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_CXX_FLAGS=-std=c++11 -DCMAKE_CC_COMPILER=mpicc -DCMAKE_INSTALL_PREFIX=$nalu_build_dir/install ..
make
make install
7. Install Zlib
Note that the base document above calls for downloading http://zlib.net/zlib-1.2.8.tar.gz, which is no longer available
cd $nalu_build_dir/packages
wget http://zlib.net/zlib-1.2.11.tar.gz
tar zxvf zlib-1.2.11.tar.gz
cd $nalu_build_dir/packages/zlib-1.2.11
## CC=gcc CXX=g++ CFLAGS=-O3 CXXFLAGS=-O3 ./configure --prefix=$nalu_build_dir/install/
CC=icc CXX=icpc CFLAGS=-O3 CXXFLAGS=-O3 ./configure --prefix=$nalu_build_dir/install/
make
make install
8. Install HDFS5
Note that the URL provided in the base document above, http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.12/src/hdf5-1.8.12.tar.gz changed.
cd $nalu_build_dir/packages/
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.12/src/hdf5-1.8.12.tar.gz
tar zxvf hdf5-1.8.12.tar.gz
cd $nalu_build_dir/packages/hdf5-1.8.12
./configure CC=mpicc FC=mpif90 CXX=mpicxx CXXFLAGS="-fPIC -O3" CFLAGS="-fPIC -O3" FCFLAGS="-fPIC -O3" --enable-parallel --with-zlib=$nalu_build_dir/install --prefix=$nalu_build_dir/install
make
make install
make check
9. Install Parallel NetCDF
cd $nalu_build_dir/packages/
wget http://cucis.ece.northwestern.edu/projects/PnetCDF/Release/parallel-netcdf-1.6.1.tar.gz
tar zxvf parallel-netcdf-1.6.1.tar.gz
cd parallel-netcdf-1.6.1
./configure --prefix=$nalu_install_dir CC=mpicc FC=mpif90 CXX=mpicxx CFLAGS="-I$nalu_install_dir/include -O3" LDFLAGS=-L$nalu_install_dir/lib --disable-fortran
make
make install
10. Install NetCDF
cd $nalu_build_dir/packages/
curl -o netcdf-c-4.3.3.1.tar.gz https://codeload.github.com/Unidata/netcdf-c/tar.gz/v4.3.3.1
tar zxvf netcdf-c-4.3.3.1.tar.gz
cd netcdf-c-4.3.3.1
./configure --prefix=$nalu_install_dir CC=mpicc FC=mpif90 CXX=mpicxx CFLAGS="-I$nalu_install_dir/include -O3" LDFLAGS=-L$nalu_install_dir/lib --enable-pnetcdf --enable-parallel-tests --enable-netcdf-4 --disable-shared --disable-fsync --disable-cdmremote --disable-dap --disable-doxygen --disable-v2
make -j 4
make install
make check
11. Install Trilinos
Note that this step takes a lot of time.
cd $nalu_build_dir/packages/
git clone https://github.com/trilinos/Trilinos.git
cd Trilinos/
Use the "Head Code Base"
mkdir build
curl -o $nalu_build_dir/packages/Trilinos/build/do-configTrilinos_release https://raw.githubusercontent.com/NaluCFD/Nalu/master/build/do-configTrilinos_release
cd build
Edit do-configTrilinos_release to provide the MPI base dir & the Nalu build dir; in this example:
## mpi_base_dir=/opt/hpcx-1.9/ompi-v2.x.i2017
## nalu_build_dir=/mnt/beegfs3/gerardo/nrel_esif/Nalu/build
## In addition, F\fix -DBoost_INCLUDE_DIRS and -DBoost_LIBRARY_DIRS, i.e., add the following lines:
## -DBoost_INCLUDE_DIRS=$boost_dir/include \
## -DBoost_LIBRARY_DIRS=$boost_dir/lib \
Change mode and install
chmod +x do-configTrilinos_release
./do-configTrilinos_release
make
Go do something else, the above 'make' takes several hours
make install
12. Install Nalu
cd $nalu_build_dir/packages/
git clone https://github.com/NaluCFD/Nalu.git
cd Nalu/build/
cp do-configNalu_release do-configNaluNonTracked
Edit do-configNaluNonTracked to adjust the nalu_build_dir path
./do-configNaluNonTracked
make
This make takes another 70 minutes or so. When complete, you will have a NaluX executable under $nalu_build_dir/packages/Nalu/build
Usage
Nalu was supplied with two datasets: abl_3km_256 and abl_3km_512. Running Nalu on 768 cores (24 nodes having 32 cores each) takes about 1 hour for the small (abl_3km_256) dataset; 10 times as much for the large dataset. Here is a Slurm script used to test Nalu with the small dataset:
#!/bin/bash
#SBATCH -N 24
#SBATCH -o nalu_256-24n-%j.out
#SBATCH --tasks-per-node=32
#SBATCH -J Nalu256
#SBATCH -p pthor
#SBATCH -t 06:00:00
#SBATCH --exclusive
#SBATCH -d singleton
## Load any modules required here
module load intel/compiler/2017.4.196 hpcx-1.9/icc-2017
NODES=$SLURM_NNODES
NPROC=$SLURM_NPROCS
export OMP_NUM_THREADS=1
MPI=ompi
LOG=${NPROC}-${MPI}-plain-mbn-$SLURM_JOB_ID
MPIFLAGS=""
MPIFLAGS+="--map-by node --rank-by core "
MPIFLAGS+="-report-bindings --display-map "
MPIFLAGS+="-mca btl_sm_use_knem 1 "
## ulimit -s 10485760
ulimit -s unlimited
echo Running on host `hostname`
echo Time is `date`
echo Directory is `pwd`
echo '----------------------------------------------------'
echo ' NODES USED = '$SLURM_NODELIST
echo ' SLURM_JOB_ID = '$SLURM_JOB_ID
echo ' CORES = '$NPROC
echo '----------------------------------------------------'
EXE=/mnt/beegfs3/gerardo/nrel_esif/Nalu/build/install/bin/naluX
echo "ldd $EXE"
ldd $EXE
echo "Launch command: /usr/bin/time -p mpirun -np ${NPROC} $MPIFLAGS $EXE -i abl_3km_256.i -o abl_3km_256_${NPROC}.log"
/usr/bin/time -p mpirun -np ${NPROC} $MPIFLAGS $EXE -i abl_3km_256.i -o abl_3km_256_${NPROC}.log
mv abl_3km_256_${NPROC}.log abl_3km_256_${LOG}