# Installation

## Prerequisites

> MPI C++ compiler |  | C++11 and MPI-3 support
> GNU Libtool | https://www.gnu.org/software/libtool |
> GNU Autoconf | https://www.gnu.org/software/autoconf | Version 2.69 or newer
> GNU Automake | https://www.gnu.org/software/automake |
> Boost C++ Libraries | http://www.boost.org | Version 1.53.0 or newer
> BLAS | http://www.netlib.org/blas | Use optimized BLAS
> LAPACK | http://www.netlib.org/lapack | Use optimized LAPACK
> ScaLAPACK | http://www.netlib.org/scalapack | Use optimized ScaLPACK

Intel MKL is strongly recommended for BLAS, LAPACK, and ScaLAPACK (distributed for free for academic users)

## Downloading the source

The simplest approach is to just download and extract the tarball containing the most recent BAGEL release:

    $ wget https://github.com/nubakery/bagel/archive/v1.1.1.tar.gz
    $ tar xvf bagel-1.1.1.tar.gz
    $ cd bagel

Alternatively, you can clone the git repository:

    $ git clone https://github.com/nubakery/bagel.git
    $ cd bagel

The SMITH3 code generator can be downloaded in a similar manner from the NUBakery GitHub page.

## Build BAGEL

- Automake

      $ glibtoolize (or, libtoolize)
      $ aclocal
      $ autoconf
      $ autoheader
      $ automake -a

- Create an object directory

      $ mkdir obj
      $ cd obj

- Configure

  A minimal set of configure options is

      $ export BOOST_ROOT=/path/to/boost
      $ export LD_LIBRARY_PATH=$BOOST_ROOT/lib:$LD_LIBRARY_PATH

      $ ../configure --enable-mkl --with-boost=$BOOST_ROOT

  Configure options:
    `--with-mpi=value` turns on MPI, where “value” can be “mvapich”, “intel”, or “openmpi”. However, Open MPI is not recommended.
    `--enable-mkl` turns on MKL extensions, such as efficient matrix transposition. MKL libraries are automatically detected.
    `--with-boost=/path/to/boost` specifies the BOOST library to be used.
    `--disable-scalapack` will disable the use of ScaLapack (parallel Lapack) which is not recommended.
    `--disable-smith` will disable the code generated by SMITH which is not recommended.
    `--with-include` can be used to specifically include paths.
    `--with-libxc` turns on the interface to libxc.
    `CXXFLAGS=-DNDEBUG` deactivates the debugging mode. It is absolutely essential to specify this for release builds.
    `CXXFLAGS=-DCOMPILE_J_ORB` allows the inclusion of j-type atomic basis functions.

  Example (Release build on the Shiozaki group’s cluster)

      $ export BOOST_ROOT=/usr/local/boost/boost_1_64_0_gcc-7.1.0
      $ export LD_LIBRARY_PATH=$BOOST_ROOT/lib:$LD_LIBRARY_PATH

      $ ../configure CXXFLAGS="-DNDEBUG -O3 -mavx" --enable-mkl --with-boost=$BOOST_ROOT --with-mpi=intel

- Compile

      $ make -j4
      $ make install

- Test run

      $ BAGEL path_to_bagel/test/benzene_svp_mp2.json

  Also there is a suite of test programs. To run this, in obj

      $ cd bagel/obj
      $ make check
      $ cd src
      $ ./TestSuite --log_level=all

  One of the tests (ASD-DMRG) is meant to fail.

- Additional Notes

  - Configuring without MKL

    If MKL is not available, the path to cblas headers may need to be included as a configure option (e.g., ‘–with-include=-I/usr/path/to/cblas’). One may also add “LDFLAGS=-lcblas” as an option. Furthermore, if relativistic calculations fail without MKL, users may consider reconfiguring and recompiling with -DZDOT_RETURN in CXXFLAGS.

  - Compiling on small machines

    Some files in BAGEL require several GB of RAM to compile. This is generally not a problem for clusters, but on personal computers the compilation will occasionally fail. Compiling with one thread (make -j1) and not using -DCOMPILE_J_ORB may help.