# Installation

The Quantum Package can be downloaded on GitHub as an archive or as a git repository.

    git clone https://github.com/LCPQ/quantum_package

Before anything, go into your `quantum_package` directory and run

    ./configure

This script will create the `quantum_package.rc` bash script, which sets all the environment variables required for the normal operation of the Quantum Package.

Running this script will also tell you which external dependencies are missing and need to be installed.

When all dependencies have been installed, ( the configure will tell you) source the `quantum_package.rc` in order to load all environment variables and compile the Quantum Package.

## Requirements

- Linux OS
- Fortran compiler : GNU Fortran, Intel Fortran or IBM XL Fortran
- GNU make
- Autoconf
- Python > 2.6
- IRPF90 : Fortran code generator
- EZFIO : Easy Fortran Input/Output library generator
- BLAS and LAPACK
- Zlib
- GNU Patch
- ZeroMQ : networking library
- OCaml compiler with OPAM package manager
- Ninja : a parallel build system

When all the dependencies have been installed, go into the `config` directory, and copy the configuration file that corresponds to your architecture. Modify it if needed, and run configure with `configure -c`.

    cp ./config/gfortran.example config/gfortran.cfg
    ./configure -c config/gfortran.cfg

Note

The `popcnt` instruction accelerates a lot the programs, so the SSE4.2, AVX or AVX2 instruction sets should be enabled in the configuration file if possible.

## Help for installing external dependencies

### Using the configure executable

The configure executable can help you in installing the minimal dependencies you will need to compile the Quantum Package. The command is to be used as follows:

    ./configure --install <package>

The following packages are supported by the configure installer:

- ninja
- irpf90
- zeromq
- f77zmq
- ocaml ( \(\approx\) 10 minutes)
- ezfio
- docopt
- resultsFile
- bats

Example:

    ./configure -i ezfio

Note

When installing the ocaml package, you will be asked the location of where it should be installed. A safe option is to enter the path proposed by the Quantum Package:

QP>> Please install it here: /your_quantum_package_directory/bin

So just enter the proposition of the Quantum Package and press enter.

### If the configure executable fails to install a specific dependency

If the configure executable does not succeed to install a specific dependency, there are some proposition of how to download and install the minimal dependencies to compile and use the Quantum Package

Before doing anything below, try to install the packages with your package manager (apt, yum, etc)

### Ninja

Ninja is a build system (like GNU make), with a focus on speed.

- Download the latest binary version of Ninja here : https://github.com/ninja-build/ninja/releases/latest
- Unzip the ninja-linux.zip file, and move the ninja binary into the `$QP_ROOT/bin` directory.

### IRPF90

IRPF90 is a Fortran code generator for programming using the Implicit Reference to Parameters (IRP) method.

- Download the latest version of IRPF90 here : https://github.com/scemama/irpf90/releases/latest and move the downloaded archive in the `$QP_ROOT/external` directory
- Extract the archive and go into the `irpf90-*` directory to run make

Note

The `IRPF90_PATH` variable may need to be updated in the configuration file `$QP_ROOT/etc/irpf90.rc`.

### ZeroMQ and its Fortran binding

ZeroMQ is a high-performance asynchronous messaging library.

- Download the latest stable version of ZeroMQ here : https://github.com/zeromq/libzmq/releases/latest and move the downloaded archive in the `$QP_ROOT/external` directory
- Extract the archive, go into the `zeromq-*` directory and run the following commands

    ./configure --prefix="${QP_ROOT}" --without-libsodium
    make
    make install

- Download the Fortran binding here : https://github.com/zeromq/f77_zmq/releases/latest and move the downloaded archive in the `$QP_ROOT/external` directory
- Extract the archive, go into the `f77_zmq-*` directory and run the following commands

    export ZMQ_H=${QP_ROOT}/include/zmq.h
    make
    cp libf77zmq.a ${QP_ROOT}/lib
    cp libf77zmq.so ${QP_ROOT}/lib

- Copy the `f77_zmq_free.h` file in the `ZMQ` module as follows:

    cp f77_zmq_free.h ${QP_ROOT}/src/ZMQ/f77_zmq.h

### Zlib

Zlib is the compression library used by gzip.

- Download the latest version of Zlib here: https://www.zlib.net/zlib-1.2.11.tar.gz and move it in the `$QP_ROOT/external` directory
- Extract the archive, go into the `zlib-*` directory and run the following commands

    ./configure --prefix=${QP_ROOT}
    make
    make install

### OCaml

OCaml is a general purpose programming language with an emphasis on expressiveness and safety.

- Download the installer of the OPAM package manager here : https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh and move it in the `$QP_ROOT/external` directory

- If you use OCaml only with the Quantum Package, you can install the OPAM directory containing the compiler and all the installed libraries in the `$QP_ROOT/external` directory as

      export OPAMROOT=${QP_ROOT}/external/opam

- Run the installer

      echo ${QP_ROOT}/bin
      ${QP_ROOT}/external/opam_installer.sh --no-backup --fresh

  You the opam command can be installed in the `$QP_ROOT/bin` directory. To do this, take the output of `echo ${QP_ROOT}/bin` and use it as an answer to where opam should be installed.

- Install the OCaml compiler

      opam init --disable-sandboxing --comp=4.07.0
      eval `${QP_ROOT}/bin/opam env`

- Install the required external OCaml libraries

      opam install ocamlbuild cryptokit zmq core sexplib ppx_sexp_conv ppx_deriving getopt

### EZFIO

EZFIO is the Easy Fortran Input/Output library generator.

- Download EZFIO here : https://gitlab.com/scemama/EZFIO/-/archive/master/EZFIO-master.tar.gz and move the downloaded archive in the `$QP_ROOT/external` directory
- Extract the archive, and rename it as `$QP_ROOT/external/ezfio`

### Docopt

Docopt is a Python package defining a command-line interface description language.

If you have pip for Python2, you can do

    pip2 install --user docopt

Otherwise,

- Download the archive here : https://github.com/docopt/docopt/releases/tag/0.6.2
- Extract the archive
- Copy `docopt-0.6.2/docopt.py` in the `$QP_ROOT/scripts` directory