# Programming in the Quantum Package

To program in the Quantum Package, it is required that you are familiar with the IRPF90 code generator. A GitBook can be found here, and programmers are encouraged to visit this manual.

IRPF90 make programming very simple. The only information a programmer needs in order to write a new program is the name of the required IRPF90 entities which may already exist in other modules. For example, writing a program which prints the Hartree-Fock energy is as simple as:

    program print_hf_energy
      implicit none
      BEGIN_DOC
    ! Program which prints the Hartree-Fock energy
    ! to the standard output
      END_DOC
      print *, 'HF energy = ', HF_energy
    end

The only required information was the existence of a provider for hf_energy. A detailed list of all the providers, subroutines and functions of the Quantum Package can be found in the appendix of this manual.

## Architecture

As IRPF90 is used, the programmer doesn’t have a full control of the sequence of instructions in the produced Fortran code. This explains why the input data is stored in a database rather than in sequential text files. Indeed, the programmer can’t know by advance in which order the files will be read, so a simple random access to persistent data is needed. The EZFIO library generator is a practical answer to this problem.

The Quantum Package uses a collection of programs inter-operating together. Each of these programs is reading and/or modifying information in the EZFIO database. This is done mostly using the command line or scripting.

Important

Each command modifies the state of the EZFIO database, so running twice the same program on the same database may have different behaviors because of the state of the database. For reproducibility, users are encouraged to run scripts where a fresg new EZFIO database is created at the beginning of the script. This way of running the Quantum Package makes calculations reproducible.

The computational part Quantum Package is organized in modules. A module is a directory which contains multiple IRPF90 files, a `README.rst` and a `NEED` file.

The `README.rst` file contains documentation about the module, that is automatically included in the documentation of the Quantum Package. The documentation is generated by the Sphinx documentation builder, and it should be written using the RST format.

The `NEED` file contains the list of the modules which are needed for the current module. When a module is needed, it means that all the IRPF90 files it contains should be included in the current module. This is done automatically during the building process, by creating symbolic links in the current directory.

To compile the program, the Ninja build system is used, and all the building process is fully automated such that the programmer will never have to modify a file by hand. Running ninja inside a module will compile only the module, and running ninja at the root of the Quantum Package will build all the modules, as well as the tools.