Skip to content

A program implementing the Hartree–Fock (also post-HF: MP2, CCSD(T), CIS and TDHF/RPA)/self-consistent field method (also DIIS) with Gaussian orbitals


Notifications You must be signed in to change notification settings


Folders and files

Last commit message
Last commit date

Latest commit


Repository files navigation


A program implementing the Hartree–Fock/self-consistent field method (and more, see the README at the end)

Codacy Badge CodeFactor

Description is available here:

Some Hartree-Fock theory here:

Some things more general (Schrödinger equation, Born-Oppenheimer approximation, variational principle), here:


Program video


Here are some things about usage:

Using the classes should be easy. Here is how to grab some atoms from the 'basis':

	Systems::AtomWithShells H1, H2, O, N, C, He, Li, Ne, Ar;

	for (auto &atom : basis.atoms)
		if (atom.Z == 1) H1 = H2 = atom;
		else if (atom.Z == 2) He = atom;
		else if (atom.Z == 3) Li = atom;
		else if (atom.Z == 8) O = atom;
		else if (atom.Z == 6) C = atom;
		else if (atom.Z == 7) N = atom;
		else if (atom.Z == 10) Ne = atom;
		else if (atom.Z == 18) Ar = atom;

Here is how to set the H2O molecule with the coordinates from the 'Mathematica Journal' (referenced in the code):

	H1.position.X = H2.position.X = O.position.X = 0;

	H1.position.Y = 1.43233673;
	H1.position.Z = -0.96104039;
	H2.position.Y = -1.43233673;
	H2.position.Z = -0.96104039;

	O.position.Y = 0;
	O.position.Z = 0.24026010;

	Systems::Molecule H2O;



And here is how you calculate:

HartreeFock::RestrictedHartreeFock HartreeFockAlgorithm;
HartreeFockAlgorithm.alpha = 0.5;
HartreeFockAlgorithm.initGuess = 0;

double result = HartreeFockAlgorithm.Calculate();

You can do computation for a single atom, too, for now by putting it into a dummy molecule with a single atom in it. For example for He:

  Systems::Molecule Heatom;


I added more basis sets, it's not limited to STO-nG. While doing that, I found and fixed a bug in the integrals repository that manifested for orbitals having L > 1. Now it seems to work fine.

Basis sets added:

  • Split valence orbitals: 3-21G, 6-21G, 6-31G
  • Besides 'split valence', polarization on heavy atoms: 6-31G*
  • 'Split valence', polarization on heavy atoms and hydrogen and diffusion functions on heavy atoms: 6-31+G**

You may add more of them, the parsed format is nwchem.

Tutorials from Crawford Group

Most of those are already implemented:

Projects for MP2, DIIS, CCSD(T), CIS and TDHF/RPA are implemented. DIIS and MP2 are implemented for both the restricted and unrestricted methods.

Projects 1 and 2 are not implemented here, maybe I'll add a python workbook for those in the python repository, 3 was already implemented obviously before finding this. Project 7 is also not implemented, also 9 and 13.