/FermiCG

Primary LanguageJuliaMIT LicenseMIT

FermiCG

A Julia package for course-grained electronic structure calculations

Stable Build Status Coverage

Details

FermiCG ("Fermionic Course-Graining") is a code for computing high-accuracy electronic states for molecular systems in a tensor product state (TPS) basis. Unlike in the traditional Slater determinant basis, a TPS basis can be chosen such that each basis vector has a considerable amount of electron correlation already included. As a result, the exact wavefunction in this basis can be considerably more compact. This increased compactness comes at the cost of a significant increase in complexity for determining matrix elements. So far, we have implemented multiple approach for discovering highly accurate wavefunctions in this TPS basis. This package includes:

  1. CMF - Meaning "Cluster Mean-Field", this is simply a variational optimization of both orbital and cluster state parameters, minimizing the energy of a single TPS. This was originally proposed by Scuseria and coworkers link.
  2. CMF-PT2 - Second order PT2 correction on top of CMF using a barycentric Moller-Plesset-type partitioning.
  3. CMF-CEPA - A CEPA-type formalism on top of CMF. First published here.
  4. TPSCI - this is a generalization of the CIPSI method to a TPS basis. Essentially, one starts with a small number of TPS functions, solves the Schrodinger equation in this small subspace, then uses perturbation theory to determine which TPS's to add to improve the energy. This is done iteratively until the results stop changing. First published here.
  5. BST - "Block-Sparse-Tucker"

Installation

  1. Download

    git clone https://github.com/nmayhall-vt/FermiCG.git
    cd FermiCG/
  2. Create python virtual environment which will hold the PYSCF executable

    cd src/python
    virtualenv -p python3 venv
    source venv/bin/activate
    pip install -r requirements.txt
    export TPSCI_PYTHON=$(which python)
    cd ../../
    julia --project=./ -tauto 
    julia> using Pkg; Pkg.build("PyCall")

    where -tauto let's Julia pick the max number of threads. Use -t N to select N manually. Removing defaults to 1 thread.

  3. Run tests

    julia> Pkg.test()