项目作者: aromanro

项目描述 :
A program implementing the Hartree–Fock/self-consistent field method with Gaussian orbitals
高级语言: C++
项目地址: git://github.com/aromanro/HartreeFock.git
创建时间: 2016-09-18T21:08:37Z
项目社区:https://github.com/aromanro/HartreeFock

开源协议:GNU General Public License v3.0

下载


HartreeFock

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: http://compphys.go.ro/the-hartree-fock-program/

Some Hartree-Fock theory here: http://compphys.go.ro/the-hartree-fock-method/

Some things more general (Schrödinger equation, Born-Oppenheimer approximation, variational principle), here: http://compphys.go.ro/how-to-solve-a-quantum-many-body-problem/

PROGRAM IN ACTION

Program video

HOW TO COMPUTE

Here are some things about usage:

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

  1. Systems::AtomWithShells H1, H2, O, N, C, He, Li, Ne, Ar;
  2. for (auto &atom : basis.atoms)
  3. {
  4. if (atom.Z == 1) H1 = H2 = atom;
  5. else if (atom.Z == 2) He = atom;
  6. else if (atom.Z == 3) Li = atom;
  7. else if (atom.Z == 8) O = atom;
  8. else if (atom.Z == 6) C = atom;
  9. else if (atom.Z == 7) N = atom;
  10. else if (atom.Z == 10) Ne = atom;
  11. else if (atom.Z == 18) Ar = atom;
  12. }

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

  1. H1.position.X = H2.position.X = O.position.X = 0;
  2. H1.position.Y = 1.43233673;
  3. H1.position.Z = -0.96104039;
  4. H2.position.Y = -1.43233673;
  5. H2.position.Z = -0.96104039;
  6. O.position.Y = 0;
  7. O.position.Z = 0.24026010;
  8. Systems::Molecule H2O;
  9. H2O.atoms.push_back(H1);
  10. H2O.atoms.push_back(H2);
  11. H2O.atoms.push_back(O);
  12. H2O.Init();

And here is how you calculate:

  1. HartreeFock::RestrictedHartreeFock HartreeFockAlgorithm;
  2. HartreeFockAlgorithm.alpha = 0.5;
  3. HartreeFockAlgorithm.initGuess = 0;
  4. HartreeFockAlgorithm.Init(&H2O);
  5. 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:

  1. Systems::Molecule Heatom;
  2. Heatom.atoms.push_back(He);
  3. Heatom.Init();

LATEST ADDITIONS

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:

https://github.com/CrawfordGroup/ProgrammingProjects

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.