Generating Molecular Hamiltonians

The CUDA-Q Solvers library accelerates a wide range of applications in the domain of quantum chemistry. To facilitate these calculations, CUDA-Q Solvers provides the solver.create_molecule function to allow users to generate basis sets and Hamiltonians for many systems of interest. The molecule class contains basis set informations, and the Hamiltonian (molecule.hamiltonian) for the target systems. These Hamiltonians can then be used as input into the hybrid quantum-classical solvers that the CUDA-Q Solvers API provides.

Molecular Orbitals and Hamiltonians

First we define the atomic geometry of the molecule by specifying a array of atomic symbols as strings, and coordinates in 3D space. We then get a molecule object from the solvers.create_molecule call. Here we create “default” Hamiltonian for the N2 system using complete active space molecular orbitals constructed from Hartree-Fock atomic orbitals.

geometry = [('N', (0.0, 0.0, 0.5600)), ('N', (0.0, 0.0, -0.5600))]
molecule = solvers.create_molecule(geometry,
                                   'sto-3g',
                                   0,
                                   0,
                                   nele_cas=2,
                                   norb_cas=3,
                                   verbose=True)
We specify:
  • The geometry previously created

  • The single particle basis set (here STO-3G)

  • The total spin

  • The total charge

  • The number of electrons in the complete active space

  • The number of orbitals in the complete activate space

  • A verbosity flag to help introspect on the data what was generated.

Along with the orbitals and Hamiltonian, we can also view various properties like the Hartree-Fock energy, and the energy of the frozen core orbitals by printing molecule.energies.

Natural Orbitals from MP2

Now we take our same N2 molecule, but generate natural orbitals from second order Møller–Plesset perturbation theory as the basis.

geometry = [('N', (0.0, 0.0, 0.5600)), ('N', (0.0, 0.0, -0.5600))]
molecule = solvers.create_molecule(geometry,
                                   'sto-3g',
                                   0,
                                   0,
                                   nele_cas=2,
                                   norb_cas=3,
                                   MP2=True,
                                   integrals_natorb=True,
                                   verbose=True)

Note that we use the same API but,toggle MP2=True and integrals_natorb=True.

CASSCF Orbitals

Next, we can start from either Hartree-Fock or perturbation theory atomic orbitals and build complete active space self-consistent field (CASSCF) molecular orbitals.

geometry = [('N', (0.0, 0.0, 0.5600)), ('N', (0.0, 0.0, -0.5600))]
molecule = solvers.create_molecule(geometry,
                                   'sto-3g',
                                   0,
                                   0,
                                   nele_cas=2,
                                   norb_cas=3,
                                   casscf=True,
                                   integrals_casscf=True,
                                   verbose=True)

For Hartree-Fock, or

geometry = [('N', (0.0, 0.0, 0.5600)), ('N', (0.0, 0.0, -0.5600))]
molecule = solvers.create_molecule(geometry,
                                   'sto-3g',
                                   0,
                                   0,
                                   nele_cas=2,
                                   norb_cas=3,
                                   MP2=True,
                                   natorb=True,
                                   casscf=True,
                                   integrals_casscf=True,
                                   verbose=True)

for MP2. In these cases, printing the molecule.energies also shows the R-CASSCF energy for the system.

Now that we have seen how to generate basis sets and Hamiltonians for quantum chemistry systems, we can use these as inputs to hybrid quantum-classical methods like VQE or adapt VQE via the CUDA-Q Solvers API.