Status | Coverage |
---|---|
The goal of MolecularIntegrals.jl is to supply fast and hackable one- and two-electron integrals for computational chemistry calculations. There are many excellent molecular integral packages available to Julia programmers, but few are written in Julia. This project will explore how fast we can make these integrals while maintaining a readable and hackable code base.
The code is released under a MIT License.
If you're only interested in using molecular integral code, we highly recommend using one of these existing projects:
- libints and its Julia bindings Lints.jl
- Pyscf, the libcint package.
- JuliaChem.jl's JERI bindings
Briefly, the libints
packages implement Obara-Saiko and Head-Gordon/Pople recurrence relations, and the libcints
packages implement
Rys quadrature based methods. Both are excellent, and, more importantly, are well-tested by being used in many current projects.
What we hope MolecularIntegrals.jl
will provide is simple, easily understandable methods that are nonetheless
fast enough for production use and that will be valuable for people interested in understanding
how these integration techniques work, and in modifying and improving them.
As a starting point to motivate the development, we will consider Table 5 from the paper Libcint: an efficient general integral library for Gaussian basis functions written by Qiming Sun, the author of Libcint and Pyscf, reporting the time required to compute electron repulsion integrals for ethane using different programs and different basis sets.
Basis | size | Psi4 | Molpro | Libcint w/o | w/SSE3 |
---|---|---|---|---|---|
6-31G | 30 | 0.10 | 0.09 | 0.09 | 0.07 |
6-311G** | 72 | 0.64 | 0.49 | 0.49 | 0.41 |
ANO | 238 | 2527.6 | 51.13 | 53.59 | 37.78 |
cc-pVDZ | 58 | 0.45 | 0.34 | 0.24 | 0.21 |
aug-cc-pVDZ | 100 | 1.87 | 1.18 | 1.02 | 0.85 |
cc-pVTZ | 144 | 4.98 | 4.82 | 2.65 | 2.05 |
aug-cc-pVTZ | 230 | 26.03 | 23.12 | 12.40 | 9.27 |
cc-pVQZ | 290 | 81.24 | 65.12 | 31.51 | 22.60 |
aug-cc-pVQZ | 436 | 444.23 | 324.29 | 151.04 | 107.24 |
Compare to roughly 0.1 sec albeit on completely different hardware. This is mostly just to set a crude benchmark to compare coding improvements.
Results using a single thread:
Basis | size | Huz | HGP | Rys |
---|---|---|---|---|
sto-3G | 16 | 1.71 | 0.041 | 0.415 |
6-31G | 30 | 6.56 | 0.202 | 1.550 |
cc-pVDZ | 58 | 115.4 | 2.451 | 25.94 |
With 4 threads:
Basis | size | Huz | HGP | Rys |
---|---|---|---|---|
sto-3G | 16 | 0.814 | 0.021 | 0.186 |
6-31G | 30 | 3.723 | 0.131 | 0.803 |
cc-pVDZ | 58 | 62.60 | 1.727 | 16.31 |
These results hopefully still have lots of room for speedups.