1#!/bin/bash -e
2[ "${BASH_SOURCE[0]}" ] && SCRIPT_NAME="${BASH_SOURCE[0]}" || SCRIPT_NAME=$0
3SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_NAME")" && pwd -P)"
4
5sirius_ver="6.4.4"
6sirius_sha256="1c5de9565781847658c3cc11edcb404e6e6d1c5a9dfc81e977de7a9a7a162c8a"
7
8
9source "${SCRIPT_DIR}"/common_vars.sh
10source "${SCRIPT_DIR}"/tool_kit.sh
11source "${SCRIPT_DIR}"/signal_trap.sh
12source "${INSTALLDIR}"/toolchain.conf
13source "${INSTALLDIR}"/toolchain.env
14
15if [ "$MPI_MODE" = "no" ] && [ "$ENABLE_OMP" = "__FALSE__" ] ; then
16    report_warning $LINENO "MPI and OpenMP are disabled, skipping sirius installation"
17    echo 'with_sirius="__FALSE__"' >> ${BUILDDIR}/setup_sirius
18    exit 0
19fi
20
21[ -f "${BUILDDIR}/setup_sirius" ] && rm "${BUILDDIR}/setup_sirius"
22
23SIRIUS_CFLAGS=''
24SIRIUS_LDFLAGS=''
25SIRIUS_LIBS=''
26! [ -d "${BUILDDIR}" ] && mkdir -p "${BUILDDIR}"
27cd "${BUILDDIR}"
28
29case "$with_sirius" in
30    __DONTUSE__)
31    ;;
32    __INSTALL__)
33        echo "==================== Installing SIRIUS ===================="
34        require_env FFTW_LDFLAGS
35        require_env FFTW_LIBS
36        require_env FFTW_CFLAGS
37        require_env ELPAROOT
38        require_env ELPA_LDFLAGS
39        require_env ELPA_LIBS
40        require_env ELPA_CFLAGS
41        require_env GSL_LDFLAGS
42        require_env GSL_CFLAGS
43        require_env GSL_LIBS
44        require_env MATH_LIBS
45        require_env MPI_LDFLAGS
46        require_env MPI_LIBS
47        require_env SCALAPACKROOT
48        require_env SCALAPACK_LDFLAGS
49        require_env SCALAPACK_CFLAGS
50        require_env SCALAPACK_LIBS
51        require_env LIBXC_LIBS
52        require_env LIBXC_CFLAGS
53        require_env LIBXC_LDFLAGS
54        require_env SPGLIB_LIBS
55        require_env SPGLIB_CFLAGS
56        require_env SPGLIB_LDFLAGS
57        require_env HDF5_LIBS
58        require_env HDF5_CFLAGS
59        require_env HDF5_LDFLAGS
60        require_env LIBVDWXC_CFLAGS
61        require_env LIBVDWXC_LIBS
62        require_env LIBVDWXC_LDFLAGS
63        require_env GSL_INCLUDE_DIR
64        require_env GSL_LIBRARY
65        require_env GSL_CBLAS_LIBRARY
66        require_env SPFFT_ROOT
67        require_env SPFFT_CFLAGS
68        require_env SPFFT_LDFLAGS
69        require_env SPFFT_LIBS
70        ARCH=`uname -m`
71        SIRIUS_OPT="-O3 -DNDEBUG -mtune=native -ftree-loop-vectorize ${MATH_CFLAGS}"
72        if [ "$ARCH" = "ppc64le" ]; then
73            SIRIUS_OPT="-O3 -DNDEBUG -mcpu=power8 -mtune=power8 -funroll-loops -ftree-vectorize  -mvsx  -maltivec  -mpopcntd  -mveclibabi=mass -fvect-cost-model -fpeel-loops -mcmodel=medium ${MATH_CFLAGS}"
74            SIRIUS_DBG="-O2 -g -mcpu=power8 -mtune=power8 -funroll-loops -ftree-vectorize  -mvsx  -maltivec  -mpopcntd  -mveclibabi=mass -fvect-cost-model -fpeel-loops -mcmodel=medium ${MATH_CFLAGS}"
75        fi
76
77        if [ "$ARCH" = "x86_64" ]; then
78            SIRIUS_OPT="-O3 -DNDEBUG -mtune=native -ftree-loop-vectorize ${MATH_CFLAGS}"
79            SIRIUS_DBG="-O2 -g -mtune=native -ftree-loop-vectorize ${MATH_CFLAGS}"
80        fi
81
82        pkg_install_dir="${INSTALLDIR}/sirius-${sirius_ver}"
83        install_lock_file="${pkg_install_dir}/install_successful"
84        if verify_checksums "${install_lock_file}" ; then
85            echo "sirius_dist-${sirius_ver} is already installed, skipping it."
86        else
87            if [ -f SIRIUS-${sirius_ver}.tar.gz ] ; then
88                echo "sirius_${sirius_ver}.tar.gz is found"
89            else
90                download_pkg ${DOWNLOADER_FLAGS} ${sirius_sha256} \
91                             "https://github.com/electronic-structure/SIRIUS/archive/v${sirius_ver}.tar.gz" \
92                             -o SIRIUS-${sirius_ver}.tar.gz
93            fi
94
95            echo "Installing from scratch into ${pkg_install_dir}"
96            [ -d sirius-${sirius_ver} ] && rm -rf sirius-${sirius_ver}
97            tar -xzf SIRIUS-${sirius_ver}.tar.gz
98            cd SIRIUS-${sirius_ver}
99            rm -Rf build
100            mkdir build
101            cd build
102            COMPILATION_OPTIONS="-DHDF5_DIR=${HDF5_DIR}"
103            if [ -n "$ELPA_LIBS" ] ; then
104                if [ -s "$ELPAROOT" ] ; then
105                    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$ELPAROOT/lib/pkgconfig:$ELPAROOT/lib64/pkgconfig
106                fi
107                COMPILATION_OPTIONS="-DUSE_ELPA=ON -DELPA_INCLUDE_DIR=${ELPAROOT}/include/elpa-${ELPAVERSION}/elpa $COMPILATION_OPTIONS"
108            fi
109
110            if [ -n "$SCALAPACK_LIBS" ] ; then
111                export SCALAPACK_LIB="$SCALAPACK_LIBS"
112                if [ -s "$SCALAPACKROOT" ] ; then
113                    COMPILATION_OPTIONS="-DUSE_SCALAPACK=ON -DSCALAPACK_INCLUDE_DIR=${SCALAPACKROOT}/include ${COMPILATION_OPTIONS}"
114                else
115                    COMPILATION_OPTIONS="-DUSE_SCALAPACK=ON ${COMPILATION_OPTIONS}"
116                fi
117            fi
118            if [ -n "$HDF5_LIBS" ] ; then
119                COMPILATION_OPTIONS="-DUSE_HDF5=ON $COMPILATION_OPTIONS"
120            fi
121            if [ -n "$LIBVDWXC_LIBS" ] ; then
122                COMPILATION_OPTIONS="-DUSE_VDWXC=ON $COMPILATION_OPTIONS"
123            fi
124            if [ -n "$MKL_LIBS" ] ; then
125                COMPILATION_OPTIONS="-DUSE_MKL=ON -DUSE_SCALAPACK=ON $COMPILATION_OPTIONS"
126            fi
127
128
129            CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}:${SPFFT_ROOT}/lib/cmake:${SPFFT_ROOT}/lib64/cmake" \
130            cmake -DCMAKE_INSTALL_PREFIX=${pkg_install_dir} \
131                  -DCMAKE_CXXFLAGS_RELEASE="${SIRIUS_OPT}" \
132                  -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="${SIRIUS_DBG}" \
133                  -DCMAKE_CXX_COMPILER="${MPICXX}" \
134                  -DCMAKE_C_COMPILER="${MPICC}" \
135                  ${COMPILATION_OPTIONS} .. > compile.log 2>&1
136            make -j $NPROCS -C src >> compile.log 2>&1
137
138            install -d ${pkg_install_dir}/include >> install.log 2>&1
139            install -d ${pkg_install_dir}/lib >> install.log 2>&1
140            cp -R ../src/* ${pkg_install_dir}/include >> install.log 2>&1
141            install -m 644 src/*.a ${pkg_install_dir}/lib >> install.log 2>&1
142            install -m 644 src/mod_files/*.mod ${pkg_install_dir}/include >> install.log 2>&1
143            cd ..
144
145            # now do we have cuda as well
146
147            if [ "$ENABLE_CUDA" = "__TRUE__" ] ; then
148                [ -d build-cuda ] && rm -rf "build-cuda"
149                mkdir build-cuda
150                cd build-cuda
151                CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}:${SPFFT_ROOT}/lib/cmake:${SPFFT_ROOT}/lib64/cmake" \
152                cmake -DCMAKE_INSTALL_PREFIX=${pkg_install_dir} \
153                      -DCMAKE_CXXFLAGS_RELEASE="${SIRIUS_OPT}" \
154                      -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="${SIRIUS_DBG}" \
155                      -DUSE_CUDA=ON \
156                      -DGPU_MODEL=P100 \
157                      -DCMAKE_CXX_COMPILER="${MPICXX}" \
158                      -DCMAKE_C_COMPILER="${MPICC}" ${COMPILATION_OPTIONS} .. >> compile.log 2>&1
159                make -j $NPROCS -C src >> compile.log 2>&1
160                install -d ${pkg_install_dir}/lib/cuda
161                install -d ${pkg_install_dir}/include/cuda
162                install -m 644 src/*.a ${pkg_install_dir}/lib/cuda >> install.log 2>&1
163                install -m 644 src/mod_files/*.mod ${pkg_install_dir}/include/cuda >> install.log 2>&1
164                SIRIUS_CUDA_LDFLAGS="-L'${pkg_install_dir}/lib/cuda' -Wl,-rpath='${pkg_install_dir}/lib/cuda'"
165                cd ..
166            fi
167            SIRIUS_CFLAGS="-I'${pkg_install_dir}/include/cuda'"
168            SIRIUS_LDFLAGS="-L'${pkg_install_dir}/lib' -Wl,-rpath='${pkg_install_dir}/lib'"
169            write_checksums "${install_lock_file}" "${SCRIPT_DIR}/$(basename ${SCRIPT_NAME})"
170        fi
171        ;;
172    __SYSTEM__)
173        require_env FFTW_LDFLAGS
174        require_env FFTW_LIBS
175        require_env FFTW_CFLAGS
176        require_env ELPAROOT
177        require_env ELPA_LDFLAGS
178        require_env ELPA_LIBS
179        require_env ELPA_CFLAGS
180        require_env GSL_LDFLAGS
181        require_env GSL_CFLAGS
182        require_env GSL_LIBS
183        require_env MATH_LIBS
184        require_env MPI_LDFLAGS
185        require_env MPI_LIBS
186        require_env SCALAPACKROOT
187        require_env SCALAPACK_LDFLAGS
188        require_env SCALAPACK_CFLAGS
189        require_env SCALAPACK_LIBS
190        require_env LIBXC_LIBS
191        require_env LIBXC_CFLAGS
192        require_env LIBXC_LDFLAGS
193        require_env SPGLIB_LIBS
194        require_env SPGLIB_CFLAGS
195        require_env SPGLIB_LDFLAGS
196        require_env HDF5_LIBS
197        require_env HDF5_CFLAGS
198        require_env HDF5_LDFLAGS
199        require_env LIBVDWXC_CFLAGS
200        require_env LIBVDWXC_LDFLAGS
201        require_env LIBVDWXC_LIBS
202        require_env SPFFT_ROOT
203        require_env SPFFT_CFLAGS
204        require_env SPFFT_LDFLAGS
205        require_env SPFFT_LIBS
206
207        check_lib -lsirius "sirius"
208        add_include_from_paths SIRIUS_CFLAGS "sirius*" $INCLUDE_PATHS
209        add_lib_from_paths SIRIUS_LDFLAGS "libsirius.*" $LIB_PATHS
210        ;;
211    *)
212        echo "==================== Linking SIRIUS_Dist to user paths ===================="
213        pkg_install_dir="$with_sirius"
214        check_dir "${pkg_install_dir}/lib"
215        check_dir "${pkg_install_dir}/lib64"
216        check_dir "${pkg_install_dir}/include"
217        ;;
218esac
219if [ "$with_sirius" != "__DONTUSE__" ] ; then
220    SIRIUS_LIBS="-lsirius IF_CUDA(-lcusolver|)"
221    SIRIUS_CUDA_LDFLAGS="-L'${pkg_install_dir}/lib/cuda' -Wl,-rpath='${pkg_install_dir}/lib/cuda'"
222    SIRIUS_LDFLAGS="-L'${pkg_install_dir}/lib' -Wl,-rpath='${pkg_install_dir}/lib'"
223    SIRIUS_CFLAGS="-I'${pkg_install_dir}/include'"
224    if [ "$with_sirius" != "__SYSTEM__" ] ; then
225        cat <<EOF > "${BUILDDIR}/setup_sirius"
226prepend_path LD_LIBRARY_PATH "$pkg_install_dir/lib"
227prepend_path LD_LIBRARY_PATH "$pkg_install_dir/lib/cuda"
228prepend_path LD_RUN_PATH "$pkg_install_dir/lib"
229prepend_path LD_RUN_PATH "$pkg_install_dir/lib/cuda"
230prepend_path LIBRARY_PATH "$pkg_install_dir/lib"
231prepend_path LIBRARY_PATH "$pkg_install_dir/lib/cuda"
232prepend_path CPATH "$pkg_install_dir/include"
233EOF
234        cat "${BUILDDIR}/setup_sirius" >> $SETUPFILE
235    fi
236    cat <<EOF >> "${BUILDDIR}/setup_sirius"
237export SIRIUS_CFLAGS="IF_CUDA(-I${pkg_install_dir}/include/cuda|-I${pkg_install_dir}/include)"
238export SIRIUS_FFLAGS="IF_CUDA(-I${pkg_install_dir}/include/cuda|-I${pkg_install_dir}/include)"
239export SIRIUS_LDFLAGS="-L'${pkg_install_dir}/lib' -Wl,-rpath='${pkg_install_dir}/lib'"
240export SIRIUS_CUDA_LDFLAGS="-L'${pkg_install_dir}/lib/cuda' -Wl,-rpath='${pkg_install_dir}/lib/cuda'"
241export SIRIUS_LIBS="${SIRIUS_LIBS}"
242export CP_DFLAGS="\${CP_DFLAGS} IF_MPI(IF_OMP("-D__SIRIUS"|)|)"
243export CP_CFLAGS="\${CP_CFLAGS} IF_MPI(IF_OMP("\${SIRIUS_CFLAGS}"|)|)"
244export CP_LDFLAGS="\${CP_LDFLAGS} IF_MPI(IF_OMP(IF_CUDA("\${SIRIUS_CUDA_LDFLAGS}"|"\${SIRIUS_LDFLAGS}")|)|)"
245export CP_LIBS="IF_MPI(IF_OMP("\${SIRIUS_LIBS}"|)|) \${CP_LIBS}"
246EOF
247fi
248
249# update toolchain environment
250load "${BUILDDIR}/setup_sirius"
251export -p > "${INSTALLDIR}/toolchain.env"
252
253cd "${ROOTDIR}"
254report_timing "sirius"
255