diff --git a/.vscode/settings.json b/.vscode/settings.json
index 70e34ecb..14deeecf 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,4 @@
{
- "C_Cpp.errorSquiggles": "disabled"
+ "C_Cpp.errorSquiggles": "disabled",
+ "cmake.sourceDirectory": "/mlx_devbox/users/xiaojie.wu/playground/gpu4pyscf/build/lib.linux-x86_64-cpython-39/gpu4pyscf/lib"
}
\ No newline at end of file
diff --git a/README.md b/README.md
index c4c15e03..3773a7a1 100644
--- a/README.md
+++ b/README.md
@@ -24,20 +24,13 @@ python -m cupyx.tools.install_library --cuda 11.x --library cutensor
Features
--------
-Density fitting scheme
-- SCF, analytical Gradient, and analytical Hessian calculations for Hartree-Fock and DFT
-- LDA, GGA, mGGA without density laplacian, hybrid, and range-separated functionals
-- Geometry optimization and transition state search via [geomeTRIC](https://geometric.readthedocs.io/en/latest/)
-- Dispersion corrections via [DFT3](https://github.com/dftd3/simple-dftd3) and [DFT4](https://github.com/dftd4/dftd4)
-- Nonlocal functional correction (vv10) for SCF and gradient
-- ECP is supported and calculated on CPU
-
-Direct SCF scheme (experimental)
-- SCF for Hartree-Fock and DFT
-- LDA, GGA, mGGA without density laplacian, hybrid, and range-separated functionals
-- Dispersion corrections via [DFT3](https://github.com/dftd3/simple-dftd3) and [DFT4](https://github.com/dftd4/dftd4)
-- Nonlocal functional correction (vv10) for SCF and gradient
-- ECP is supported and calculated on CPU
+- Density fitting scheme and direct SCF scheme;
+- SCF, analytical Gradient, and analytical Hessian calculations for Hartree-Fock and DFT;
+- LDA, GGA, mGGA, hybrid, and range-separated functionals via [libXC](https://gitlab.com/libxc/libxc/-/tree/master/);
+- Geometry optimization and transition state search via [geomeTRIC](https://geometric.readthedocs.io/en/latest/);
+- Dispersion corrections via [DFT3](https://github.com/dftd3/simple-dftd3) and [DFT4](https://github.com/dftd4/dftd4);
+- Nonlocal functional correction (vv10) for SCF and gradient;
+- ECP is supported and calculated on CPU;
Limitations
--------
@@ -45,12 +38,32 @@ Limitations
- Rys roots up to 9 for direct scf scheme;
- Atomic basis up to g orbitals;
- Auxiliary basis up to h orbitals;
-- Up to ~100 atoms with def2-tzvpd basis, consuming a large amount of CPU memory;
-- Gradient, Hessian and Geometry optimization are unavailable for Direct SCF yet;
+- Up to ~168 atoms with def2-tzvpd basis, consuming a large amount of CPU memory;
+- Hessian is unavailable for Direct SCF yet;
- meta-GGA without density laplacian;
-
Examples
--------
Find examples in gpu4pyscf/examples
+Benchmarks
+--------
+Speedup with GPU4PySCF v0.6.0 over Q-Chem 6.1 (Desity fitting, SCF, def2-tzvpp, def2-universal-jkfit, (99,590))
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|:------------------|-------:|-------:|-------:|--------:|-------:|----------:|
+| 020_Vitamin_C | 20 | 2.86 | 6.09 | 13.11 | 11.58 | 17.46 |
+| 031_Inosine | 31 | 13.14 | 15.87 | 16.57 | 25.89 | 26.14 |
+| 033_Bisphenol_A | 33 | 12.31 | 16.88 | 16.54 | 28.45 | 28.82 |
+| 037_Mg_Porphin | 37 | 13.85 | 19.03 | 20.53 | 28.31 | 30.27 |
+| 042_Penicillin_V | 42 | 10.34 | 13.35 | 15.34 | 22.01 | 24.2 |
+| 045_Ochratoxin_A | 45 | 13.34 | 15.3 | 19.66 | 27.08 | 25.41 |
+| 052_Cetirizine | 52 | 17.79 | 17.44 | 19 | 24.41 | 25.87 |
+| 057_Tamoxifen | 57 | 14.7 | 16.57 | 18.4 | 24.86 | 25.47 |
+| 066_Raffinose | 66 | 13.77 | 14.2 | 20.47 | 22.94 | 25.35 |
+| 084_Sphingomyelin | 84 | 14.24 | 12.82 | 15.96 | 22.11 | 24.46 |
+| 095_Azadirachtin | 95 | 5.58 | 7.72 | 24.18 | 26.84 | 25.21 |
+| 113_Taxol | 113 | 5.44 | 6.81 | 24.58 | 29.14 | nan |
+
+Find more benchmarks in gpu4pyscf/benchmarks
+
diff --git a/benchmarks/README.md b/benchmarks/README.md
index 8b137891..82549917 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -1 +1,205 @@
+# Benchmark details
+Two types of machines for the following benchmarks
+- A100-SXM4-80G with Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz
+- V100-SXM4-32G with Intel(R) Xeon(R) Platinum 8260 CPU @ 2.40GHz
+
+CUDA and GPU driver
+- Driver Version: 450.191.01
+- CUDA Version: 11.7
+
+Q-Chem is running on Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz
+
+'nan' indicates failed jobs with Q-Chem.
+
+negative value indicates failed jobs with GPU4PySCF.
+
+Raw data for density fitting can be found `benchmarks/df/organic`
+
+Raw data for direct SCF can be found in `benchmarks/scf/water_clusters`
+
+# Density fitting SCF single-point energy (v0.6.0)
+
+## GPU4PySCF v0.6.0 on Nvidia A100-SXM4-80G vs Q-Chem 6.1 on 32 CPU threads
+
+B3LYP with different basis
+
+| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |
+|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|
+| 020_Vitamin_C | 20 | 0.92 | 1.5 | 2.13 | 5.94 | 8.36 |
+| 031_Inosine | 31 | 4.74 | 7.12 | 10.98 | 17.02 | 21.17 |
+| 033_Bisphenol_A | 33 | 4.53 | 6.24 | 7 | 16.55 | 20.96 |
+| 037_Mg_Porphin | 37 | 7.38 | 9.9 | 13.88 | 16.9 | 23.39 |
+| 042_Penicillin_V | 42 | 5.9 | 8.19 | 11.43 | 16.41 | 20.11 |
+| 045_Ochratoxin_A | 45 | 6.94 | 10.06 | 12.9 | 15.33 | 21.62 |
+| 052_Cetirizine | 52 | 7.15 | 9.86 | 13.85 | 17.34 | 23.24 |
+| 057_Tamoxifen | 57 | 7.48 | 8.95 | 13.19 | 19.26 | 24.22 |
+| 066_Raffinose | 66 | 8.22 | 10.12 | 14.98 | 15.28 | 16.1 |
+| 084_Sphingomyelin | 84 | nan | 9.69 | 14.83 | 17.82 | 20.33 |
+| 095_Azadirachtin | 95 | 16.06 | 17.18 | 24.22 | 23.29 | nan |
+| 113_Taxol | 113 | 20.11 | 18.04 | 23.38 | 24 | nan |
+| 168_Valinomycin | 168 | 23.43 | 19.41 | nan | nan | nan |
+
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|:------------------|-------:|-------:|-------:|--------:|-------:|----------:|
+| 020_Vitamin_C | 20 | 2.86 | 6.09 | 13.11 | 11.58 | 17.46 |
+| 031_Inosine | 31 | 13.14 | 15.87 | 16.57 | 25.89 | 26.14 |
+| 033_Bisphenol_A | 33 | 12.31 | 16.88 | 16.54 | 28.45 | 28.82 |
+| 037_Mg_Porphin | 37 | 13.85 | 19.03 | 20.53 | 28.31 | 30.27 |
+| 042_Penicillin_V | 42 | 10.34 | 13.35 | 15.34 | 22.01 | 24.2 |
+| 045_Ochratoxin_A | 45 | 13.34 | 15.3 | 19.66 | 27.08 | 25.41 |
+| 052_Cetirizine | 52 | 17.79 | 17.44 | 19 | 24.41 | 25.87 |
+| 057_Tamoxifen | 57 | 14.7 | 16.57 | 18.4 | 24.86 | 25.47 |
+| 066_Raffinose | 66 | 13.77 | 14.2 | 20.47 | 22.94 | 25.35 |
+| 084_Sphingomyelin | 84 | 14.24 | 12.82 | 15.96 | 22.11 | 24.46 |
+| 095_Azadirachtin | 95 | 5.58 | 7.72 | 24.18 | 26.84 | 25.21 |
+| 113_Taxol | 113 | 5.44 | 6.81 | 24.58 | 29.14 | nan |
+| 168_Valinomycin | 168 | nan | nan | nan | nan | nan |
+
+## GPU4PySCF v0.6.0 on Nvidia V100-SXM4-32G vs Q-Chem 6.1 on 32 CPU threads
+B3LYP with different basis
+
+| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |
+|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|
+| 020_Vitamin_C | 20 | 0.52 | 0.93 | 1.23 | 3.98 | 4.88 |
+| 031_Inosine | 31 | 0.97 | 1.92 | 3.03 | 6.79 | 8.19 |
+| 033_Bisphenol_A | 33 | 1.16 | 1.89 | 2.09 | 6.72 | 8.31 |
+| 037_Mg_Porphin | 37 | 1.79 | 3.55 | 4.49 | 7.64 | 10.55 |
+| 042_Penicillin_V | 42 | 1.37 | 2.62 | 3.63 | 7.69 | 9.24 |
+| 045_Ochratoxin_A | 45 | 1.58 | 3.23 | 4.12 | 7.27 | 9.88 |
+| 052_Cetirizine | 52 | 1.83 | 3.61 | 4.72 | 8.63 | 11.32 |
+| 057_Tamoxifen | 57 | 1.92 | 3.3 | 4.59 | 9.72 | 7.87 |
+| 066_Raffinose | 66 | 2.31 | 4.04 | 5.75 | 6.09 | 5.54 |
+| 084_Sphingomyelin | 84 | nan | 3.29 | 4.92 | 7.32 | 8 |
+| 095_Azadirachtin | 95 | 4.63 | 8.46 | 10.55 | 13.83 | nan |
+| 113_Taxol | 113 | 6.55 | 10.1 | 9.43 | 12.31 | nan |
+| 168_Valinomycin | 168 | 9.23 | 11.66 | nan | nan | nan |
+
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|:------------------|-------:|------:|------:|--------:|------:|----------:|
+| 020_Vitamin_C | 20 | 1.89 | 3.3 | 8.18 | 5.95 | 10.58 |
+| 031_Inosine | 31 | 4.64 | 5.95 | 6.41 | 9.48 | 13.15 |
+| 033_Bisphenol_A | 33 | 4.85 | 6.64 | 6.58 | 11.04 | 14.72 |
+| 037_Mg_Porphin | 37 | 5.61 | 8.6 | 9.01 | 12.34 | 16.56 |
+| 042_Penicillin_V | 42 | 4.36 | 6.17 | 7.09 | 10.62 | 14.28 |
+| 045_Ochratoxin_A | 45 | 5.47 | 6.97 | 8.74 | 12.05 | 14.14 |
+| 052_Cetirizine | 52 | 8.43 | 8.51 | 9.16 | 12.44 | 15.37 |
+| 057_Tamoxifen | 57 | 6.79 | 8.41 | 9.98 | 13.44 | 15.67 |
+| 066_Raffinose | 66 | 3.22 | 4.31 | 8.11 | 10.58 | 13.22 |
+| 084_Sphingomyelin | 84 | 3.34 | 3.97 | 6.52 | 8.63 | 12.11 |
+| 095_Azadirachtin | 95 | 3.35 | 4.74 | 14.29 | 16.52 | 15.05 |
+| 113_Taxol | 113 | 3.12 | 4.1 | 12.59 | 15.74 | nan |
+# Density fitting gradient (v0.6.0)
+
+## GPU4PySCF v0.6.0 on Nvidia A100-SXM4-80G vs Q-Chem 6.1 on 32 CPU threads
+
+B3LYP with different basis
+
+| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |
+|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|
+| 020_Vitamin_C | 20 | 3.13 | 4.12 | 5.98 | 9.71 | 10.7 |
+| 031_Inosine | 31 | 11.42 | 9.82 | 13.23 | 16.47 | 16.16 |
+| 033_Bisphenol_A | 33 | 13.28 | 10.3 | 11.94 | 16.08 | 16.02 |
+| 037_Mg_Porphin | 37 | 13.75 | 10.54 | 15.87 | 18.33 | 19.89 |
+| 042_Penicillin_V | 42 | 13.3 | 10.7 | 14.07 | 17.2 | 18.81 |
+| 045_Ochratoxin_A | 45 | 14.68 | 11.33 | 16.28 | 19.79 | 20.94 |
+| 052_Cetirizine | 52 | 21.46 | 14.62 | 19.55 | 20.51 | 21.93 |
+| 057_Tamoxifen | 57 | 20.97 | 16.37 | 18.78 | 20.27 | 21.96 |
+| 066_Raffinose | 66 | 25.4 | 17.78 | 25.71 | 23.88 | 22.38 |
+| 084_Sphingomyelin | 84 | nan | 17.46 | 20.9 | 23.64 | 26.52 |
+| 095_Azadirachtin | 95 | 39.13 | 32.27 | 40.78 | 39.94 | nan |
+| 113_Taxol | 113 | 48.57 | 42.77 | 51.57 | 49.03 | nan |
+| 168_Valinomycin | 168 | 87.81 | 72.58 | nan | nan | nan |
+
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|:------------------|-------:|-------:|-------:|--------:|-------:|----------:|
+| 020_Vitamin_C | 20 | 5.02 | 7.04 | 10.55 | 9.28 | 11.11 |
+| 031_Inosine | 31 | 7.3 | 10.03 | 15.12 | 12.62 | 13.9 |
+| 033_Bisphenol_A | 33 | 7.58 | 11.1 | 15.55 | 12.64 | 14 |
+| 037_Mg_Porphin | 37 | 7.47 | 11.34 | 18.05 | 15.81 | 14.85 |
+| 042_Penicillin_V | 42 | 6.03 | 8.96 | 17.4 | 14.47 | 13.81 |
+| 045_Ochratoxin_A | 45 | 7.51 | 9.33 | 19.51 | 17.2 | 14.55 |
+| 052_Cetirizine | 52 | 8.32 | 9.7 | 20.8 | 16.46 | 15.7 |
+| 057_Tamoxifen | 57 | 8.91 | 9.61 | 20.61 | 16.2 | 15 |
+| 066_Raffinose | 66 | 8.52 | 9.46 | 24.2 | 18.63 | 17.13 |
+| 084_Sphingomyelin | 84 | 8.51 | 9.49 | 23.62 | 21.63 | 17.66 |
+| 095_Azadirachtin | 95 | 7.69 | 9.48 | 42.24 | 34.01 | 23.93 |
+| 113_Taxol | 113 | 8.08 | 9.05 | 51.03 | 40.13 | nan |
+| 168_Valinomycin | 168 | nan | nan | nan | nan | nan |
+
+## GPU4PySCF v0.6.0 on Nvidia V100-SXM4-32G vs Q-Chem 6.1 on 32 CPU threads
+
+B3LYP with different basis
+
+| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |
+|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|
+| 020_Vitamin_C | 20 | 1.43 | 2.4 | 3.3 | 5.46 | 5.54 |
+| 031_Inosine | 31 | 3.01 | 4.22 | 5.14 | 7.06 | 6.84 |
+| 033_Bisphenol_A | 33 | 3.31 | 4.18 | 4.38 | 6.75 | 6.89 |
+| 037_Mg_Porphin | 37 | 4.13 | 5.08 | 6.42 | 7.89 | 8.54 |
+| 042_Penicillin_V | 42 | 4.05 | 5.06 | 5.89 | 7.88 | 8.39 |
+| 045_Ochratoxin_A | 45 | 4.59 | 5.42 | 6.8 | 8.6 | 8.93 |
+| 052_Cetirizine | 52 | 6.11 | 7.04 | 7.97 | 9.13 | 9.53 |
+| 057_Tamoxifen | 57 | 6.17 | 8.05 | 7.74 | 9.3 | 9.22 |
+| 066_Raffinose | 66 | 7.9 | 9.49 | 10.82 | 10.51 | 9.58 |
+| 084_Sphingomyelin | 84 | nan | 7.64 | 7.99 | 9.56 | 10.39 |
+| 095_Azadirachtin | 95 | 13.3 | 17.59 | 16.25 | 17.93 | nan |
+| 113_Taxol | 113 | 17.55 | 23.43 | 20.81 | 21.54 | nan |
+| 168_Valinomycin | 168 | 31.21 | 38.79 | nan | nan | nan |
+
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|:------------------|-------:|------:|------:|--------:|------:|----------:|
+| 020_Vitamin_C | 20 | 3.19 | 4.28 | 5.9 | 4.82 | 5.84 |
+| 031_Inosine | 31 | 3.21 | 4.5 | 6.55 | 5.52 | 6.39 |
+| 033_Bisphenol_A | 33 | 3.55 | 4.87 | 6.61 | 5.51 | 6.48 |
+| 037_Mg_Porphin | 37 | 3.19 | 5.2 | 8.32 | 7.26 | 6.81 |
+| 042_Penicillin_V | 42 | 3.15 | 4.35 | 8.11 | 7.23 | 6.97 |
+| 045_Ochratoxin_A | 45 | 3.32 | 4.29 | 8.99 | 8.04 | 6.92 |
+| 052_Cetirizine | 52 | 3.51 | 4.6 | 9.41 | 8.18 | 7.57 |
+| 057_Tamoxifen | 57 | 3.86 | 4.66 | 9.56 | 8.4 | 7.51 |
+| 066_Raffinose | 66 | 3.4 | 4.32 | 10.94 | 9.4 | 8.29 |
+| 084_Sphingomyelin | 84 | 3.15 | 3.81 | 9.66 | 8.97 | 8.03 |
+| 095_Azadirachtin | 95 | 3.32 | 4.37 | 18.47 | 16.01 | 1.68 |
+| 113_Taxol | 113 | 3.12 | 1.19 | 22.53 | 16.94 | nan |
+
+# Density fitting hessian (v0.6.0)
+
+coming soon..
+
+# Direct SCF single-point energy (v0.6.0)
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|------:|-------:|-------:|-------:|--------:|-------:|----------:|
+| 2 | 3 | 0.22 | 0.32 | 0.27 | 0.25 | 0.69 |
+| 3 | 15 | 0.68 | 0.25 | 1.58 | 2.61 | 4.84 |
+| 4 | 30 | 1.59 | 2.63 | 4.09 | 6.93 | 8.17 |
+| 5 | 60 | 2.86 | 3.64 | 7.15 | 8.44 | 9.44 |
+| 6 | 96 | 4.34 | 4.39 | 7.75 | 10.58 | 9.87 |
+| 7 | 141 | 4.07 | 4.1 | 8.87 | 10.47 | 10.13 |
+| 8 | 228 | 4.34 | 4.58 | 9.39 | 10.48 | 9.36 |
+| 9 | 300 | 5.05 | 5.21 | 9.35 | 11.36 | nan |
+| 10 | 417 | 4.91 | nan | nan | nan | nan |
+
+# Direct SCF gradient (v0.6.0)
+def2-tzvpp with different xc functionals
+
+| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |
+|------:|-------:|-------:|-------:|--------:|-------:|----------:|
+| 2 | 3 | 0.82 | 0.89 | 0.75 | 0.82 | 0.6 |
+| 3 | 15 | 0.39 | 0.19 | 1.46 | 1.52 | 1.47 |
+| 4 | 30 | 0.56 | 1.04 | 2.07 | 2.25 | 1.89 |
+| 5 | 60 | 0.54 | 0.87 | 2.42 | 2.4 | 1.77 |
+| 6 | 96 | 0.6 | 0.87 | 2.36 | 2.51 | 1.53 |
+| 7 | 141 | 0.93 | 1.1 | 2.61 | 2.59 | 1.55 |
+| 8 | 228 | 1.92 | 1.9 | 3.37 | 3.39 | 1.83 |
+| 9 | 300 | 2.26 | 2.02 | 3.06 | 3.59 | nan |
+| 10 | 417 | 2.46 | nan | nan | nan | nan |
\ No newline at end of file
diff --git a/benchmarks/df/dft_driver.py b/benchmarks/df/dft_driver.py
new file mode 100644
index 00000000..b2682fec
--- /dev/null
+++ b/benchmarks/df/dft_driver.py
@@ -0,0 +1,105 @@
+import os
+import csv
+import pyscf
+import time
+import argparse
+from pyscf import lib
+from pyscf.dft import rks
+
+lib.num_threads(8)
+
+parser = argparse.ArgumentParser(description='Run SCF, grad, and Hessian in GPU4PySCF for molecules')
+parser.add_argument('--basis', type=str, default='def2-tzvpp')
+parser.add_argument('--verbose', type=int, default=1)
+parser.add_argument('--xc', type=str, default='B3LYP')
+parser.add_argument('--device', type=str, default='GPU')
+parser.add_argument('--input_path', type=str, default='./')
+parser.add_argument('--output_path', type=str, default='./')
+parser.add_argument('--with_hessian', type=bool, default=False)
+args = parser.parse_args()
+bas = args.basis
+verbose = args.verbose
+xc = args.xc
+
+if xc == 'LDA':
+ xc = 'LDA,VWN5'
+
+if not os.path.exists(args.output_path):
+ os.mkdir(args.output_path)
+
+if args.device == 'GPU':
+ import cupy
+ import gpu4pyscf
+ from gpu4pyscf.dft import rks
+ props = cupy.cuda.runtime.getDeviceProperties(0)
+ device = props['name'].decode('ascii')
+ output_file = device+'.csv'
+else:
+ from pyscf.dft import rks
+ output_file = 'PySCF-16-cores-CPU.csv'
+output_file = args.output_path + output_file
+
+def run_dft(filename):
+ mol = pyscf.M(atom=filename, basis=bas, max_memory=64000)
+ start_time = time.time()
+ # set verbose >= 6 for debugging timer
+ mol.verbose = 4 #verbose
+ mol.max_memory = 40000
+ mf = rks.RKS(mol, xc=xc).density_fit(auxbasis='def2-universal-jkfit')
+ mf.grids.atom_grid = (99,590)
+ mf.chkfile = None
+ prep_time = time.time() - start_time
+ mf.conv_tol = 1e-9
+ mf.nlcgrids.atom_grid = (50,194)
+ mf.max_cycle = 100
+ try:
+ e_dft = mf.kernel()
+ scf_time = time.time() - start_time
+ except:
+ scf_time = -1
+ e_dft = 0
+
+ # calculate gradient
+ if args.device == 'GPU':
+ cupy.get_default_memory_pool().free_all_blocks()
+ try:
+ start_time = time.time()
+ g = mf.nuc_grad_method()
+ g.max_memory = 40000
+ g.auxbasis_response = True
+ f = g.kernel()
+ grad_time = time.time() - start_time
+ except:
+ grad_time = -1
+
+ # calculate hessian
+ if args.device == 'GPU':
+ cupy.get_default_memory_pool().free_all_blocks()
+
+ hess_time = -1
+ if args.with_hessian:
+ try:
+ start_time = time.time()
+ h = mf.Hessian()
+ h.auxbasis_response = 1
+ h.max_memory = 40000
+ hess = h.kernel()
+ hess_time = time.time() - start_time
+ except:
+ hess_time = -1
+
+ return mol.natm, mol.nao, scf_time, grad_time, hess_time, e_dft
+
+fields = ['mol','natm', 'nao', 't_scf', 't_gradient', 't_hessian', 'e_tot']
+csvfile = open(output_file, 'w')
+csvwriter = csv.writer(csvfile)
+csvwriter.writerow(fields)
+
+for filename in sorted(os.listdir(args.input_path)):
+ if filename.endswith(".xyz"):
+ print(f'running DFT {filename}')
+ info = run_dft(args.input_path+filename)
+ row = [filename[:-4]]+list(info)
+ csvwriter.writerow(row)
+ csvfile.flush()
+csvfile.close()
diff --git a/benchmarks/df/generate_tables.ipynb b/benchmarks/df/generate_tables.ipynb
new file mode 100644
index 00000000..322939e5
--- /dev/null
+++ b/benchmarks/df/generate_tables.ipynb
@@ -0,0 +1,552 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 122,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Density fitting with difference basis"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 125,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 124,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |\n",
+ "|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|\n",
+ "| 020_Vitamin_C | 20 | 0.92 | 1.5 | 2.13 | 5.94 | 8.36 |\n",
+ "| 031_Inosine | 31 | 4.74 | 7.12 | 10.98 | 17.02 | 21.17 |\n",
+ "| 033_Bisphenol_A | 33 | 4.53 | 6.24 | 7 | 16.55 | 20.96 |\n",
+ "| 037_Mg_Porphin | 37 | 7.38 | 9.9 | 13.88 | 16.9 | 23.39 |\n",
+ "| 042_Penicillin_V | 42 | 5.9 | 8.19 | 11.43 | 16.41 | 20.11 |\n",
+ "| 045_Ochratoxin_A | 45 | 6.94 | 10.06 | 12.9 | 15.33 | 21.62 |\n",
+ "| 052_Cetirizine | 52 | 7.15 | 9.86 | 13.85 | 17.34 | 23.24 |\n",
+ "| 057_Tamoxifen | 57 | 7.48 | 8.95 | 13.19 | 19.26 | 24.22 |\n",
+ "| 066_Raffinose | 66 | 8.22 | 10.12 | 14.98 | 15.28 | 16.1 |\n",
+ "| 084_Sphingomyelin | 84 | nan | 9.69 | 14.83 | 17.82 | 20.33 |\n",
+ "| 095_Azadirachtin | 95 | 16.06 | 17.18 | 24.22 | 23.29 | nan |\n",
+ "| 113_Taxol | 113 | 20.11 | 18.04 | 23.38 | 24 | nan |\n",
+ "| 168_Valinomycin | 168 | 23.43 | 19.41 | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "A100_file = 'NVIDIA A100-SXM4-80GB.csv'\n",
+ "V100_file = 'Tesla V100-SXM2-32GB.csv'\n",
+ "qchem_file = 'qchem-32-cores-cpu.csv'\n",
+ "\n",
+ "keys = ['mol', 'natm']\n",
+ "empty = {'mol':[], 'natm':[]}\n",
+ "df_A100_scf = pd.DataFrame(empty)\n",
+ "df_V100_scf = pd.DataFrame(empty)\n",
+ "df_A100_grad = pd.DataFrame(empty)\n",
+ "df_V100_grad = pd.DataFrame(empty)\n",
+ "path = 'organic/basis/'\n",
+ "\n",
+ "for basis in ['sto-3g', '6-31g', 'def2-svp', 'def2-tzvpp', 'def2-tzvpd']:\n",
+ " df_qchem = pd.read_csv(path + basis + '/' + qchem_file)\n",
+ " df_qchem = df_qchem.rename(columns={'t_scf':'scf_qchem', 't_gradient':'grad_qchem'})\n",
+ " \n",
+ " df_A100 = pd.read_csv(path + basis + '/' + A100_file)\n",
+ " df_A100 = df_A100.rename(columns={'t_scf':'scf_A100', 't_gradient':'grad_A100'})\n",
+ " df_A100 = df_A100.merge(df_qchem, how='outer', on='mol')\n",
+ " \n",
+ " df_A100['scf_'+basis] = df_A100['scf_qchem']/df_A100['scf_A100']\n",
+ " df_A100['grad_'+basis] = df_A100['grad_qchem']/df_A100['grad_A100']\n",
+ " df_A100 = df_A100[keys+['scf_'+basis, 'grad_'+basis]]\n",
+ " \n",
+ " df_A100_scf = df_A100_scf.merge(df_A100[keys+['scf_'+basis]], how='outer', on=keys)\n",
+ " df_A100_grad= df_A100_grad.merge(df_A100[keys+['grad_'+basis]], how='outer', on=keys)\n",
+ " df_A100_scf = df_A100_scf.rename(columns={'scf_'+basis:basis})\n",
+ " df_A100_grad = df_A100_grad.rename(columns={'grad_'+basis:basis})\n",
+ " df_A100_scf[basis] = df_A100_scf[basis].apply(lambda x: round(x,2))\n",
+ " df_A100_grad[basis] = df_A100_grad[basis].apply(lambda x: round(x,2))\n",
+ "\n",
+ " df_V100 = pd.read_csv(path + basis + '/' + V100_file)\n",
+ " df_V100 = df_V100.rename(columns={'t_scf':'scf_V100', 't_gradient':'grad_V100'})\n",
+ " df_V100 = df_V100.merge(df_qchem, how='outer', on='mol')\n",
+ " df_V100['scf_'+basis] = df_V100['scf_qchem']/df_V100['scf_V100']\n",
+ " df_V100['grad_'+basis] = df_V100['grad_qchem']/df_V100['grad_V100']\n",
+ "\n",
+ " df_V100_scf = df_V100_scf.merge(df_V100[keys+['scf_'+basis,]], how='outer', on=keys)\n",
+ " df_V100_grad= df_V100_grad.merge(df_V100[keys+['grad_'+basis]], how='outer', on=keys)\n",
+ " df_V100_scf = df_V100_scf.rename(columns={'scf_'+basis:basis})\n",
+ " \n",
+ " df_V100_grad = df_V100_grad.rename(columns={'grad_'+basis:basis})\n",
+ " df_V100_scf[basis] = df_V100_scf[basis].apply(lambda x: round(x,2))\n",
+ " df_V100_grad[basis] = df_V100_grad[basis].apply(lambda x: round(x,2))\n",
+ " \n",
+ "print(df_A100_scf.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 127,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 126,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |\n",
+ "|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|\n",
+ "| 020_Vitamin_C | 20 | 0.52 | 0.93 | 1.23 | 3.98 | 4.88 |\n",
+ "| 031_Inosine | 31 | 0.97 | 1.92 | 3.03 | 6.79 | 8.19 |\n",
+ "| 033_Bisphenol_A | 33 | 1.16 | 1.89 | 2.09 | 6.72 | 8.31 |\n",
+ "| 037_Mg_Porphin | 37 | 1.79 | 3.55 | 4.49 | 7.64 | 10.55 |\n",
+ "| 042_Penicillin_V | 42 | 1.37 | 2.62 | 3.63 | 7.69 | 9.24 |\n",
+ "| 045_Ochratoxin_A | 45 | 1.58 | 3.23 | 4.12 | 7.27 | 9.88 |\n",
+ "| 052_Cetirizine | 52 | 1.83 | 3.61 | 4.72 | 8.63 | 11.32 |\n",
+ "| 057_Tamoxifen | 57 | 1.92 | 3.3 | 4.59 | 9.72 | 7.87 |\n",
+ "| 066_Raffinose | 66 | 2.31 | 4.04 | 5.75 | 6.09 | 5.54 |\n",
+ "| 084_Sphingomyelin | 84 | nan | 3.29 | 4.92 | 7.32 | 8 |\n",
+ "| 095_Azadirachtin | 95 | 4.63 | 8.46 | 10.55 | 13.83 | nan |\n",
+ "| 113_Taxol | 113 | 6.55 | 10.1 | 9.43 | 12.31 | nan |\n",
+ "| 168_Valinomycin | 168 | 9.23 | 11.66 | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_V100_scf.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 129,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 128,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |\n",
+ "|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|\n",
+ "| 020_Vitamin_C | 20 | 3.13 | 4.12 | 5.98 | 9.71 | 10.7 |\n",
+ "| 031_Inosine | 31 | 11.42 | 9.82 | 13.23 | 16.47 | 16.16 |\n",
+ "| 033_Bisphenol_A | 33 | 13.28 | 10.3 | 11.94 | 16.08 | 16.02 |\n",
+ "| 037_Mg_Porphin | 37 | 13.75 | 10.54 | 15.87 | 18.33 | 19.89 |\n",
+ "| 042_Penicillin_V | 42 | 13.3 | 10.7 | 14.07 | 17.2 | 18.81 |\n",
+ "| 045_Ochratoxin_A | 45 | 14.68 | 11.33 | 16.28 | 19.79 | 20.94 |\n",
+ "| 052_Cetirizine | 52 | 21.46 | 14.62 | 19.55 | 20.51 | 21.93 |\n",
+ "| 057_Tamoxifen | 57 | 20.97 | 16.37 | 18.78 | 20.27 | 21.96 |\n",
+ "| 066_Raffinose | 66 | 25.4 | 17.78 | 25.71 | 23.88 | 22.38 |\n",
+ "| 084_Sphingomyelin | 84 | nan | 17.46 | 20.9 | 23.64 | 26.52 |\n",
+ "| 095_Azadirachtin | 95 | 39.13 | 32.27 | 40.78 | 39.94 | nan |\n",
+ "| 113_Taxol | 113 | 48.57 | 42.77 | 51.57 | 49.03 | nan |\n",
+ "| 168_Valinomycin | 168 | 87.81 | 72.58 | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_A100_grad.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 131,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 130,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | sto-3g | 6-31g | def2-svp | def2-tzvpp | def2-tzvpd |\n",
+ "|:------------------|-------:|---------:|--------:|-----------:|-------------:|-------------:|\n",
+ "| 020_Vitamin_C | 20 | 1.43 | 2.4 | 3.3 | 5.46 | 5.54 |\n",
+ "| 031_Inosine | 31 | 3.01 | 4.22 | 5.14 | 7.06 | 6.84 |\n",
+ "| 033_Bisphenol_A | 33 | 3.31 | 4.18 | 4.38 | 6.75 | 6.89 |\n",
+ "| 037_Mg_Porphin | 37 | 4.13 | 5.08 | 6.42 | 7.89 | 8.54 |\n",
+ "| 042_Penicillin_V | 42 | 4.05 | 5.06 | 5.89 | 7.88 | 8.39 |\n",
+ "| 045_Ochratoxin_A | 45 | 4.59 | 5.42 | 6.8 | 8.6 | 8.93 |\n",
+ "| 052_Cetirizine | 52 | 6.11 | 7.04 | 7.97 | 9.13 | 9.53 |\n",
+ "| 057_Tamoxifen | 57 | 6.17 | 8.05 | 7.74 | 9.3 | 9.22 |\n",
+ "| 066_Raffinose | 66 | 7.9 | 9.49 | 10.82 | 10.51 | 9.58 |\n",
+ "| 084_Sphingomyelin | 84 | nan | 7.64 | 7.99 | 9.56 | 10.39 |\n",
+ "| 095_Azadirachtin | 95 | 13.3 | 17.59 | 16.25 | 17.93 | nan |\n",
+ "| 113_Taxol | 113 | 17.55 | 23.43 | 20.81 | 21.54 | nan |\n",
+ "| 168_Valinomycin | 168 | 31.21 | 38.79 | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_V100_grad.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Density fitting with different xc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 133,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 132,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|:------------------|-------:|-------:|-------:|--------:|-------:|----------:|\n",
+ "| 020_Vitamin_C | 20 | 2.86 | 6.09 | 13.11 | 11.58 | 17.46 |\n",
+ "| 031_Inosine | 31 | 13.14 | 15.87 | 16.57 | 25.89 | 26.14 |\n",
+ "| 033_Bisphenol_A | 33 | 12.31 | 16.88 | 16.54 | 28.45 | 28.82 |\n",
+ "| 037_Mg_Porphin | 37 | 13.85 | 19.03 | 20.53 | 28.31 | 30.27 |\n",
+ "| 042_Penicillin_V | 42 | 10.34 | 13.35 | 15.34 | 22.01 | 24.2 |\n",
+ "| 045_Ochratoxin_A | 45 | 13.34 | 15.3 | 19.66 | 27.08 | 25.41 |\n",
+ "| 052_Cetirizine | 52 | 17.79 | 17.44 | 19 | 24.41 | 25.87 |\n",
+ "| 057_Tamoxifen | 57 | 14.7 | 16.57 | 18.4 | 24.86 | 25.47 |\n",
+ "| 066_Raffinose | 66 | 13.77 | 14.2 | 20.47 | 22.94 | 25.35 |\n",
+ "| 084_Sphingomyelin | 84 | 14.24 | 12.82 | 15.96 | 22.11 | 24.46 |\n",
+ "| 095_Azadirachtin | 95 | 5.58 | 7.72 | 24.18 | 26.84 | 25.21 |\n",
+ "| 113_Taxol | 113 | 5.44 | 6.81 | 24.58 | 29.14 | nan |\n",
+ "| 168_Valinomycin | 168 | nan | nan | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "keys = ['mol', 'natm']\n",
+ "empty = {'mol':[], 'natm':[]}\n",
+ "df_A100_scf = pd.DataFrame(empty)\n",
+ "df_V100_scf = pd.DataFrame(empty)\n",
+ "df_A100_grad = pd.DataFrame(empty)\n",
+ "df_V100_grad = pd.DataFrame(empty)\n",
+ "path = 'organic/xc/'\n",
+ "for xc in ['LDA', 'PBE', 'B3LYP', 'M06', 'wB97m-v']:\n",
+ " df_qchem = pd.read_csv(path + xc + '/' + qchem_file)\n",
+ " df_qchem = df_qchem.rename(columns={'t_scf':'scf_qchem', 't_gradient':'grad_qchem'})\n",
+ " \n",
+ " df_A100 = pd.read_csv(path + xc + '/' + A100_file)\n",
+ " df_A100 = df_A100.rename(columns={'t_scf':'scf_A100', 't_gradient':'grad_A100'})\n",
+ " df_A100 = df_A100.merge(df_qchem, how='outer', on='mol')\n",
+ " \n",
+ " df_A100['scf_'+xc] = df_A100['scf_qchem']/df_A100['scf_A100']\n",
+ " df_A100['grad_'+xc] = df_A100['grad_qchem']/df_A100['grad_A100']\n",
+ " df_A100 = df_A100[keys+['scf_'+xc, 'grad_'+xc]]\n",
+ " \n",
+ " df_A100_scf = df_A100_scf.merge(df_A100[keys+['scf_'+xc]], how='outer', on=keys)\n",
+ " df_A100_grad= df_A100_grad.merge(df_A100[keys+['grad_'+xc]], how='outer', on=keys)\n",
+ " df_A100_scf = df_A100_scf.rename(columns={'scf_'+xc:xc})\n",
+ " df_A100_grad = df_A100_grad.rename(columns={'grad_'+xc:xc})\n",
+ " df_A100_scf[xc] = df_A100_scf[xc].apply(lambda x: round(x,2))\n",
+ " df_A100_grad[xc] = df_A100_grad[xc].apply(lambda x: round(x,2))\n",
+ "\n",
+ " df_V100 = pd.read_csv(path + xc + '/' + V100_file)\n",
+ " df_V100 = df_V100.rename(columns={'t_scf':'scf_V100', 't_gradient':'grad_V100'})\n",
+ " df_V100 = df_V100.merge(df_qchem, how='outer', on='mol')\n",
+ " df_V100['scf_'+xc] = df_V100['scf_qchem']/df_V100['scf_V100']\n",
+ " df_V100['grad_'+xc] = df_V100['grad_qchem']/df_V100['grad_V100']\n",
+ "\n",
+ " df_V100_scf = df_V100_scf.merge(df_V100[keys+['scf_'+xc,]], how='outer', on=keys)\n",
+ " df_V100_grad= df_V100_grad.merge(df_V100[keys+['grad_'+xc]], how='outer', on=keys)\n",
+ " df_V100_scf = df_V100_scf.rename(columns={'scf_'+xc:xc})\n",
+ " \n",
+ " df_V100_grad = df_V100_grad.rename(columns={'grad_'+xc:xc})\n",
+ " df_V100_scf[xc] = df_V100_scf[xc].apply(lambda x: round(x,2))\n",
+ " df_V100_grad[xc] = df_V100_grad[xc].apply(lambda x: round(x,2))\n",
+ "\n",
+ "print(df_A100_scf.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 134,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|:------------------|-------:|------:|------:|--------:|------:|----------:|\n",
+ "| 020_Vitamin_C | 20 | 1.89 | 3.3 | 8.18 | 5.95 | 10.58 |\n",
+ "| 031_Inosine | 31 | 4.64 | 5.95 | 6.41 | 9.48 | 13.15 |\n",
+ "| 033_Bisphenol_A | 33 | 4.85 | 6.64 | 6.58 | 11.04 | 14.72 |\n",
+ "| 037_Mg_Porphin | 37 | 5.61 | 8.6 | 9.01 | 12.34 | 16.56 |\n",
+ "| 042_Penicillin_V | 42 | 4.36 | 6.17 | 7.09 | 10.62 | 14.28 |\n",
+ "| 045_Ochratoxin_A | 45 | 5.47 | 6.97 | 8.74 | 12.05 | 14.14 |\n",
+ "| 052_Cetirizine | 52 | 8.43 | 8.51 | 9.16 | 12.44 | 15.37 |\n",
+ "| 057_Tamoxifen | 57 | 6.79 | 8.41 | 9.98 | 13.44 | 15.67 |\n",
+ "| 066_Raffinose | 66 | 3.22 | 4.31 | 8.11 | 10.58 | 13.22 |\n",
+ "| 084_Sphingomyelin | 84 | 3.34 | 3.97 | 6.52 | 8.63 | 12.11 |\n",
+ "| 095_Azadirachtin | 95 | 3.35 | 4.74 | 14.29 | 16.52 | 15.05 |\n",
+ "| 113_Taxol | 113 | 3.12 | 4.1 | 12.59 | 15.74 | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_V100_scf.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 137,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 136,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|:------------------|-------:|-------:|-------:|--------:|-------:|----------:|\n",
+ "| 020_Vitamin_C | 20 | 5.02 | 7.04 | 10.55 | 9.28 | 11.11 |\n",
+ "| 031_Inosine | 31 | 7.3 | 10.03 | 15.12 | 12.62 | 13.9 |\n",
+ "| 033_Bisphenol_A | 33 | 7.58 | 11.1 | 15.55 | 12.64 | 14 |\n",
+ "| 037_Mg_Porphin | 37 | 7.47 | 11.34 | 18.05 | 15.81 | 14.85 |\n",
+ "| 042_Penicillin_V | 42 | 6.03 | 8.96 | 17.4 | 14.47 | 13.81 |\n",
+ "| 045_Ochratoxin_A | 45 | 7.51 | 9.33 | 19.51 | 17.2 | 14.55 |\n",
+ "| 052_Cetirizine | 52 | 8.32 | 9.7 | 20.8 | 16.46 | 15.7 |\n",
+ "| 057_Tamoxifen | 57 | 8.91 | 9.61 | 20.61 | 16.2 | 15 |\n",
+ "| 066_Raffinose | 66 | 8.52 | 9.46 | 24.2 | 18.63 | 17.13 |\n",
+ "| 084_Sphingomyelin | 84 | 8.51 | 9.49 | 23.62 | 21.63 | 17.66 |\n",
+ "| 095_Azadirachtin | 95 | 7.69 | 9.48 | 42.24 | 34.01 | 23.93 |\n",
+ "| 113_Taxol | 113 | 8.08 | 9.05 | 51.03 | 40.13 | nan |\n",
+ "| 168_Valinomycin | 168 | nan | nan | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_A100_grad.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 139,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 138,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|:------------------|-------:|------:|------:|--------:|------:|----------:|\n",
+ "| 020_Vitamin_C | 20 | 3.19 | 4.28 | 5.9 | 4.82 | 5.84 |\n",
+ "| 031_Inosine | 31 | 3.21 | 4.5 | 6.55 | 5.52 | 6.39 |\n",
+ "| 033_Bisphenol_A | 33 | 3.55 | 4.87 | 6.61 | 5.51 | 6.48 |\n",
+ "| 037_Mg_Porphin | 37 | 3.19 | 5.2 | 8.32 | 7.26 | 6.81 |\n",
+ "| 042_Penicillin_V | 42 | 3.15 | 4.35 | 8.11 | 7.23 | 6.97 |\n",
+ "| 045_Ochratoxin_A | 45 | 3.32 | 4.29 | 8.99 | 8.04 | 6.92 |\n",
+ "| 052_Cetirizine | 52 | 3.51 | 4.6 | 9.41 | 8.18 | 7.57 |\n",
+ "| 057_Tamoxifen | 57 | 3.86 | 4.66 | 9.56 | 8.4 | 7.51 |\n",
+ "| 066_Raffinose | 66 | 3.4 | 4.32 | 10.94 | 9.4 | 8.29 |\n",
+ "| 084_Sphingomyelin | 84 | 3.15 | 3.81 | 9.66 | 8.97 | 8.03 |\n",
+ "| 095_Azadirachtin | 95 | 3.32 | 4.37 | 18.47 | 16.01 | 1.68 |\n",
+ "| 113_Taxol | 113 | 3.12 | 1.19 | 22.53 | 16.94 | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_V100_grad.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Merlin (Python3 + MLSQL) [Spark 3.0]",
+ "language": "python",
+ "name": "merlin_kernel"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "Python3 with MLSQL",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "0.1"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/benchmarks/df/organic/basis/6-31g/A100-SXM-80GB.csv b/benchmarks/df/organic/basis/6-31g/A100-SXM-80GB.csv
new file mode 100644
index 00000000..62814ae4
--- /dev/null
+++ b/benchmarks/df/organic/basis/6-31g/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,124,4.608277797698975,0.4919087886810303,-1,-684.4557107433968
+031_Inosine,31,195,2.7226362228393555,0.4882214069366455,-1,-982.9155347453989
+033_Bisphenol_A,33,185,2.5274624824523926,0.4501316547393799,-1,-731.4592529768629
+037_Mg_Porphin,37,253,2.8547840118408203,0.8474681377410889,-1,-1188.2481589024778
+042_Penicillin_V,42,256,3.7431905269622803,0.8364019393920898,-1,-1503.7375080540155
+045_Ochratoxin_A,45,283,4.172262907028198,1.02577805519104,-1,-1663.525966991905
+052_Cetirizine,52,297,4.766071319580078,1.1338489055633545,-1,-1610.1693102376707
+057_Tamoxifen,57,310,5.07802152633667,1.141324520111084,-1,-1137.6493884240836
+066_Raffinose,66,370,6.551544189453125,1.6817245483398438,-1,-1907.7681834232199
+084_Sphingomyelin,84,403,7.91524338722229,1.9199373722076416,-1,-1809.5679366001991
+095_Azadirachtin,95,547,12.272940397262573,4.32565450668335,-1,-2562.3403172332264
+113_Taxol,113,660,18.444868803024292,6.884729385375977,-1,-2928.572392404445
+168_Valinomycin,168,882,37.01337122917175,14.150111198425293,-1,-3792.772043471883
diff --git a/benchmarks/df/organic/basis/6-31g/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/basis/6-31g/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..0814f1f9
--- /dev/null
+++ b/benchmarks/df/organic/basis/6-31g/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,184,4.680042505264282,0.5047404766082764,-1,-684.6645213604809
+031_Inosine,31,290,3.2322049140930176,0.6415054798126221,-1,-983.2119879900529
+033_Bisphenol_A,33,270,3.046257495880127,0.5894784927368164,-1,-731.6275229240173
+037_Mg_Porphin,37,378,3.838784694671631,1.1502361297607422,-1,-1188.4918251530944
+042_Penicillin_V,42,376,4.883107662200928,1.102980136871338,-1,-1504.089994687125
+045_Ochratoxin_A,45,418,5.26718807220459,1.3482749462127686,-1,-1663.8683699106805
+052_Cetirizine,52,432,6.492026329040527,1.4921181201934814,-1,-1610.4805475897251
+057_Tamoxifen,57,450,6.812292814254761,1.544680118560791,-1,-1137.911748912134
+066_Raffinose,66,540,8.891000986099243,2.2964015007019043,-1,-1908.3234058984917
+084_Sphingomyelin,84,568,10.732957601547241,2.3929738998413086,-1,-1810.1763282989473
+095_Azadirachtin,95,802,17.69058609008789,5.607578992843628,-1,-2563.117707989838
+113_Taxol,113,970,27.82247757911682,9.0927095413208,-1,-2929.3905280208473
+168_Valinomycin,168,1272,58.2225227355957,18.247328996658325,-1,-3793.9202343628604
diff --git a/benchmarks/df/organic/basis/6-31g/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/basis/6-31g/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..006a3b53
--- /dev/null
+++ b/benchmarks/df/organic/basis/6-31g/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,124,7.497422695159912,0.8649909496307373,-1,-684.4557107433968
+031_Inosine,31,195,11.948939800262451,1.4942827224731445,-1,-982.9155347453993
+033_Bisphenol_A,33,185,10.029215574264526,1.451491117477417,-1,-731.4592529768634
+037_Mg_Porphin,37,253,10.693403482437134,2.384176731109619,-1,-1188.2481589024774
+042_Penicillin_V,42,256,15.25686264038086,2.331570863723755,-1,-1503.7375080540169
+045_Ochratoxin_A,45,283,16.395840883255005,2.8147506713867188,-1,-1663.525966991905
+052_Cetirizine,52,297,17.720090627670288,3.1010515689849854,-1,-1610.1693102376698
+057_Tamoxifen,57,310,18.46334171295166,3.141953468322754,-1,-1137.6493884240858
+066_Raffinose,66,370,22.278468370437622,4.3040931224823,-1,-1907.768183423219
+084_Sphingomyelin,84,403,31.638314723968506,5.470108985900879,-1,-1809.5679366001973
+095_Azadirachtin,95,547,35.93686127662659,10.28779911994934,-1,-2562.3403172332246
+113_Taxol,113,660,49.680076122283936,16.596692323684692,-1,-2928.5723924044505
+168_Valinomycin,168,882,96.90761160850525,34.14221692085266,-1,-3792.772043471883
diff --git a/benchmarks/df/organic/basis/6-31g/qchem-32-cores-cpu.csv b/benchmarks/df/organic/basis/6-31g/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..ea6d0e2e
--- /dev/null
+++ b/benchmarks/df/organic/basis/6-31g/qchem-32-cores-cpu.csv
@@ -0,0 +1,14 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,7.0,2.08,-684.4557106286
+031_Inosine,23.0,6.3,-982.9155453015
+033_Bisphenol_A,19.0,6.07,-731.4592542587
+037_Mg_Porphin,38.0,12.12,-1188.2481651629
+042_Penicillin_V,40.0,11.8,-1503.7375598048
+045_Ochratoxin_A,53.0,15.27,-1663.5260142082
+052_Cetirizine,64.0,21.82,-1610.1693348384
+057_Tamoxifen,61.0,25.28,-1137.6494270196
+066_Raffinose,90.0,40.84,-1907.7682613849
+084_Sphingomyelin,104.0,41.77,-1809.5680211517
+095_Azadirachtin,304.0,180.98,-2562.3404484657
+113_Taxol,502.0,388.94,-2928.5726079375
+168_Valinomycin,1130.0,1324.46,-3792.7725532994
diff --git a/benchmarks/df/organic/basis/def2-svp/A100-SXM-80GB.csv b/benchmarks/df/organic/basis/def2-svp/A100-SXM-80GB.csv
new file mode 100644
index 00000000..e5eab95b
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-svp/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,208,5.571452856063843,0.5950183868408203,-1,-684.188129714639
+031_Inosine,31,326,3.982928991317749,0.7104775905609131,-1,-982.5227175495484
+033_Bisphenol_A,33,318,2.913531541824341,0.6623127460479736,-1,-731.1227139679804
+037_Mg_Porphin,37,414,5.25773811340332,1.176598072052002,-1,-1187.7543053199015
+042_Penicillin_V,42,430,4.716869831085205,1.2208878993988037,-1,-1503.2030492202234
+045_Ochratoxin_A,45,472,5.158869743347168,1.4054603576660156,-1,-1662.896149353448
+052_Cetirizine,52,507,6.172307014465332,1.687089443206787,-1,-1609.547890083631
+057_Tamoxifen,57,537,6.463549375534058,1.8418858051300049,-1,-1137.1212356049973
+066_Raffinose,66,636,8.732872486114502,2.637019395828247,-1,-1907.009111580206
+084_Sphingomyelin,84,721,10.769162893295288,2.9709110260009766,-1,-1809.0152777779826
+095_Azadirachtin,95,934,18.074316263198853,6.7069244384765625,-1,-2561.3061045288187
+113_Taxol,113,1123,29.4821720123291,10.809048891067505,-1,-2927.334202494234
+168_Valinomycin,168,1542,78.70354056358337,22.958770751953125,-1,-3791.169347528201
diff --git a/benchmarks/df/organic/basis/def2-svp/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/basis/def2-svp/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..6b4d0361
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-svp/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,208,4.6874213218688965,0.5549466609954834,-1,-684.1881297146392
+031_Inosine,31,326,3.2785484790802,0.6766877174377441,-1,-982.5227175495488
+033_Bisphenol_A,33,318,3.1449086666107178,0.6597239971160889,-1,-731.1227139679811
+037_Mg_Porphin,37,414,3.961493492126465,1.1308743953704834,-1,-1187.7543053199029
+042_Penicillin_V,42,430,5.164047956466675,1.1697602272033691,-1,-1503.2030492202234
+045_Ochratoxin_A,45,472,5.660542249679565,1.3970353603363037,-1,-1662.896149353448
+052_Cetirizine,52,507,6.571918487548828,1.6308255195617676,-1,-1609.5478900836329
+057_Tamoxifen,57,537,7.049911737442017,1.76767897605896,-1,-1137.121235604996
+066_Raffinose,66,636,9.546670913696289,2.519256114959717,-1,-1907.009111580206
+084_Sphingomyelin,84,721,12.070258378982544,2.762742757797241,-1,-1809.01527777798
+095_Azadirachtin,95,934,20.108874559402466,6.237654685974121,-1,-2561.3061045288187
+113_Taxol,113,1123,32.24514365196228,10.200969696044922,-1,-2927.3342024942376
+168_Valinomycin,168,1542,83.81017708778381,21.43537998199463,-1,-3791.1693475282227
diff --git a/benchmarks/df/organic/basis/def2-svp/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/basis/def2-svp/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..c51be9ba
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-svp/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,208,8.160551071166992,1.0070991516113281,-1,-684.1881297146388
+031_Inosine,31,326,11.888460874557495,1.7420969009399414,-1,-982.5227175495497
+033_Bisphenol_A,33,318,10.503359317779541,1.7978541851043701,-1,-731.1227139679806
+037_Mg_Porphin,37,414,12.260337352752686,2.7967472076416016,-1,-1187.7543053199024
+042_Penicillin_V,42,430,16.261521339416504,2.7961485385894775,-1,-1503.203049220223
+045_Ochratoxin_A,45,472,17.70514750480652,3.3417317867279053,-1,-1662.896149353448
+052_Cetirizine,52,507,19.28774070739746,4.001626968383789,-1,-1609.5478900836329
+057_Tamoxifen,57,537,20.240687608718872,4.287323236465454,-1,-1137.121235604996
+066_Raffinose,66,636,24.872922658920288,5.987769842147827,-1,-1907.0091115802052
+084_Sphingomyelin,84,721,36.35357451438904,7.227047920227051,-1,-1809.0152777779817
+095_Azadirachtin,95,934,46.181217193603516,15.65786600112915,-1,-2561.306104528813
+113_Taxol,113,1123,79.93216848373413,25.2760910987854,-1,-2927.3342024942394
+168_Valinomycin,168,1542,167.11498260498047,52.99009823799133,-1,-3791.169347528212
diff --git a/benchmarks/df/organic/basis/def2-svp/qchem-32-cores-cpu.csv b/benchmarks/df/organic/basis/def2-svp/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..33f6638f
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-svp/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,10.0,3.32,-684.188129083
+031_Inosine,36.0,8.95,-982.5227300706
+033_Bisphenol_A,22.0,7.88,-731.122714897
+037_Mg_Porphin,55.0,17.95,-1187.7543125061
+042_Penicillin_V,59.0,16.46,-1503.2030863089
+045_Ochratoxin_A,73.0,22.74,-1662.8961799823
+052_Cetirizine,91.0,31.88,-1609.5479126364
+057_Tamoxifen,93.0,33.19,-1137.1212528816
+066_Raffinose,143.0,64.76,-1907.0091675761
+084_Sphingomyelin,179.0,57.75,-1809.015318981
+095_Azadirachtin,487.0,254.39,-2561.3062000994
+113_Taxol,754.0,526.02,-2927.3343490348
diff --git a/benchmarks/df/organic/basis/def2-tzvpd/A100-SXM-80GB.csv b/benchmarks/df/organic/basis/def2-tzvpd/A100-SXM-80GB.csv
new file mode 100644
index 00000000..c59edfb2
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpd/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,534,6.654919862747192,1.303596019744873,-1,-684.9983656551171
+031_Inosine,31,826,6.409037351608276,2.4522085189819336,-1,-983.6539685687085
+033_Bisphenol_A,33,779,5.486630916595459,2.2625789642333984,-1,-731.9381014226267
+037_Mg_Porphin,37,1031,8.949623107910156,4.466444969177246,-1,-1188.8813483933504
+042_Penicillin_V,42,1074,12.623379230499268,4.779623985290527,-1,-1504.5935660538344
+045_Ochratoxin_A,45,1185,12.752293348312378,5.559885740280151,-1,-1664.4010279739869
+052_Cetirizine,52,1242,14.83137321472168,6.753576755523682,-1,-1610.9848133288647
+057_Tamoxifen,57,1300,15.52376675605774,7.169055461883545,-1,-1138.3630201787519
+066_Raffinose,66,1594,25.88677406311035,11.580754518508911,-1,-1909.2468719836588
+084_Sphingomyelin,84,1701,28.53906273841858,10.400691270828247,-1,-1810.8907909413742
+095_Azadirachtin,95,2331,136.24109745025635,33.603240966796875,-1,-2564.188899140331
+113_Taxol,113,2795,149.87984943389893,54.820167541503906,-1,-2930.586435443578
+168_Valinomycin,168,3750,399.5483500957489,125.97111797332764,-1,-3795.552665125142
diff --git a/benchmarks/df/organic/basis/def2-tzvpd/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/basis/def2-tzvpd/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..10f8f0ae
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpd/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,534,5.743236780166626,1.1048574447631836,-1,-684.9983656551174
+031_Inosine,31,826,6.614603757858276,2.201477527618408,-1,-983.6539685687085
+033_Bisphenol_A,33,779,5.724342107772827,2.133068084716797,-1,-731.9381014226274
+037_Mg_Porphin,37,1031,8.4637770652771,3.8849453926086426,-1,-1188.881348393351
+042_Penicillin_V,42,1074,11.684978246688843,4.180841445922852,-1,-1504.5935660538335
+045_Ochratoxin_A,45,1185,13.413384199142456,5.01957106590271,-1,-1664.4010279739869
+052_Cetirizine,52,1242,16.134130001068115,6.146965265274048,-1,-1610.9848133288638
+057_Tamoxifen,57,1300,16.390201568603516,6.641704082489014,-1,-1138.363020178751
+066_Raffinose,66,1594,26.651982069015503,10.789607048034668,-1,-1909.2468719836625
+084_Sphingomyelin,84,1701,31.68465304374695,9.601499557495117,-1,-1810.8907909413706
+095_Azadirachtin,95,2331,145.98889756202698,31.632495403289795,-1,-2564.188899140322
+113_Taxol,113,2795,161.56011819839478,51.75374984741211,-1,-2930.5864354435707
+168_Valinomycin,168,3750,418.6258087158203,119.92009735107422,-1,-3795.5526651251457
diff --git a/benchmarks/df/organic/basis/def2-tzvpd/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/basis/def2-tzvpd/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..82a84ab1
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpd/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,534,9.826927900314331,2.132695436477661,-1,-684.9983656551178
+031_Inosine,31,826,17.102701902389526,5.200197696685791,-1,-983.6539685687089
+033_Bisphenol_A,33,779,14.44143533706665,4.956775903701782,-1,-731.9381014226262
+037_Mg_Porphin,37,1031,18.759718656539917,9.046519756317139,-1,-1188.8813483933504
+042_Penicillin_V,42,1074,25.439067363739014,9.380114555358887,-1,-1504.5935660538348
+045_Ochratoxin_A,45,1185,29.345699787139893,11.767349481582642,-1,-1664.4010279739887
+052_Cetirizine,52,1242,33.13221502304077,14.145078659057617,-1,-1610.984813328862
+057_Tamoxifen,57,1300,50.43429255485535,15.826147079467773,-1,-1138.3630201787519
+066_Raffinose,66,1594,77.37730360031128,25.20444893836975,-1,-1909.2468719836634
+084_Sphingomyelin,84,1701,80.45511722564697,24.50955820083618,-1,-1810.8907909413724
+095_Azadirachtin,95,2331,245.97679138183594,74.33054566383362,-1,-2564.1888991403293
+113_Taxol,113,2795,313.03466963768005,120.719167470932,-1,-2930.586435443567
diff --git a/benchmarks/df/organic/basis/def2-tzvpd/qchem-32-cores-cpu.csv b/benchmarks/df/organic/basis/def2-tzvpd/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..93ed84c9
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpd/qchem-32-cores-cpu.csv
@@ -0,0 +1,11 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,48.0,11.82,-684.9983661771
+031_Inosine,140.0,35.57,-983.6539694766
+033_Bisphenol_A,120.0,34.17,-731.9380966403
+037_Mg_Porphin,198.0,77.26,-1188.8813566693
+042_Penicillin_V,235.0,78.66,-1504.593561826
+045_Ochratoxin_A,290.0,105.09,-1664.4010310483
+052_Cetirizine,375.0,134.78,-1610.9848201789
+057_Tamoxifen,397.0,145.84,-1138.3630235374
+066_Raffinose,429.0,241.49,-1909.2468694109
+084_Sphingomyelin,644.0,254.59,-1810.8907979228
diff --git a/benchmarks/df/organic/basis/def2-tzvpp/A100-SXM-80GB.csv b/benchmarks/df/organic/basis/def2-tzvpp/A100-SXM-80GB.csv
new file mode 100644
index 00000000..936ea720
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpp/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,5.566343784332275,1.0092358589172363,-1,-684.9998712304978
+031_Inosine,31,757,5.4314470291137695,1.8568284511566162,-1,-983.6545622284157
+033_Bisphenol_A,33,751,5.112223386764526,1.8574542999267578,-1,-731.9425812607694
+037_Mg_Porphin,37,944,6.796313524246216,3.2722911834716797,-1,-1188.8834346155813
+042_Penicillin_V,42,1007,9.460737943649292,3.4848668575286865,-1,-1504.5970074372067
+045_Ochratoxin_A,45,1100,10.295934677124023,4.1023268699646,-1,-1664.4047770134857
+052_Cetirizine,52,1198,13.065029382705688,5.3568878173828125,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,13.886844635009766,5.926028490066528,-1,-1138.3713903576554
+066_Raffinose,66,1502,20.67488145828247,8.696324110031128,-1,-1909.253574965227
+084_Sphingomyelin,84,1748,24.92488718032837,8.768393993377686,-1,-1810.9032955330708
+095_Azadirachtin,95,2197,92.76208138465881,24.107633590698242,-1,-2564.198712061071
+113_Taxol,113,2636,147.91346430778503,39.64811635017395,-1,-2930.5984200568655
+168_Valinomycin,168,3678,1150.1053104400635,988.2313795089722,-1,-3795.5874330220067
diff --git a/benchmarks/df/organic/basis/def2-tzvpp/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/basis/def2-tzvpp/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..38075153
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpp/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,5.556931257247925,1.0200526714324951,-1,-684.9998712304982
+031_Inosine,31,757,6.112112522125244,1.8068022727966309,-1,-983.6545622284152
+033_Bisphenol_A,33,751,5.680012941360474,1.829089641571045,-1,-731.9425812607697
+037_Mg_Porphin,37,944,7.5740807056427,3.0772857666015625,-1,-1188.8834346155818
+042_Penicillin_V,42,1007,10.663032293319702,3.3250420093536377,-1,-1504.597007437209
+045_Ochratoxin_A,45,1100,12.26717734336853,3.895185947418213,-1,-1664.4047770134857
+052_Cetirizine,52,1198,14.766838788986206,5.110014915466309,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,15.469822645187378,5.6486732959747314,-1,-1138.3713903576554
+066_Raffinose,66,1502,22.839627027511597,8.166324138641357,-1,-1909.2535749652252
+084_Sphingomyelin,84,1748,29.39814805984497,8.214901447296143,-1,-1810.9032955330708
+095_Azadirachtin,95,2197,100.23631596565247,23.491753339767456,-1,-2564.1987120610765
+113_Taxol,113,2636,157.4899492263794,37.64330840110779,-1,-2930.59842005686
+168_Valinomycin,168,3678,355.8271896839142,78.65090155601501,-1,-3795.587433022025
diff --git a/benchmarks/df/organic/basis/def2-tzvpp/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/basis/def2-tzvpp/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..1e6c402f
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpp/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,8.298742532730103,1.8147852420806885,-1,-684.9998712304971
+031_Inosine,31,757,15.306780815124512,4.217100381851196,-1,-983.6545622284152
+033_Bisphenol_A,33,751,13.980681419372559,4.3560755252838135,-1,-731.9425812607706
+037_Mg_Porphin,37,944,16.75301480293274,7.147723197937012,-1,-1188.8834346155822
+042_Penicillin_V,42,1007,22.7495539188385,7.258328199386597,-1,-1504.5970074372058
+045_Ochratoxin_A,45,1100,25.875207662582397,8.960210800170898,-1,-1664.4047770134866
+052_Cetirizine,52,1198,29.674678087234497,11.486072778701782,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,30.656619548797607,12.306862354278564,-1,-1138.3713903576554
+066_Raffinose,66,1502,57.27416181564331,18.546212673187256,-1,-1909.253574965228
+084_Sphingomyelin,84,1748,71.57202792167664,20.325098514556885,-1,-1810.90329553307
+095_Azadirachtin,95,2197,168.8704252243042,52.33920741081238,-1,-2564.1987120610693
+113_Taxol,113,2636,307.03701853752136,85.68509697914124,-1,-2930.598420056862
diff --git a/benchmarks/df/organic/basis/def2-tzvpp/qchem-32-cores-cpu.csv b/benchmarks/df/organic/basis/def2-tzvpp/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..d7bcee75
--- /dev/null
+++ b/benchmarks/df/organic/basis/def2-tzvpp/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,33.0,9.9,-684.9998717845
+031_Inosine,104.0,29.76,-983.6545630427
+033_Bisphenol_A,94.0,29.41,-731.9425766448
+037_Mg_Porphin,128.0,56.41,-1188.8834428997
+042_Penicillin_V,175.0,57.2,-1504.5970055807
+045_Ochratoxin_A,188.0,77.07,-1664.4047846776
+052_Cetirizine,256.0,104.83,-1610.9899118452
+057_Tamoxifen,298.0,114.5,-1138.3713951255
+066_Raffinose,349.0,194.98,-1909.2535813929
+084_Sphingomyelin,524.0,194.21,-1810.9033107333
+095_Azadirachtin,2335.0,938.36,-2564.1987343228
+113_Taxol,3780.0,1845.47,-2930.5984454016
diff --git a/benchmarks/df/organic/basis/sto-3g/A100-SXM-80GB.csv b/benchmarks/df/organic/basis/sto-3g/A100-SXM-80GB.csv
new file mode 100644
index 00000000..50faac13
--- /dev/null
+++ b/benchmarks/df/organic/basis/sto-3g/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,68,4.280375003814697,0.3823843002319336,-1,-675.5191427445507
+031_Inosine,31,107,2.392287015914917,0.3562748432159424,-1,-970.3601703535096
+033_Bisphenol_A,33,101,2.2256898880004883,0.34991025924682617,-1,-722.4575094545305
+037_Mg_Porphin,37,141,2.6677324771881104,0.5486934185028076,-1,-1173.7927754921366
+042_Penicillin_V,42,142,3.179009199142456,0.5451009273529053,-1,-1485.464968373929
+045_Ochratoxin_A,45,157,3.6462783813476562,0.6953268051147461,-1,-1643.4719863900064
+052_Cetirizine,52,164,3.9863054752349854,0.7237148284912109,-1,-1591.0513291828852
+057_Tamoxifen,57,169,4.125242471694946,0.7896935939788818,-1,-1123.9167963056725
+066_Raffinose,66,202,5.120527267456055,1.1471302509307861,-1,-1882.988055475049
+084_Sphingomyelin,84,220,10.285906076431274,1.2866826057434082,-1,-1787.5270517444555
+095_Azadirachtin,95,299,9.472655057907104,2.8504865169525146,-1,-2530.024523612373
+113_Taxol,113,361,12.340314865112305,4.723545789718628,-1,-2891.8561844202995
+168_Valinomycin,168,480,24.36805534362793,10.147969722747803,-1,-3744.9223643736477
diff --git a/benchmarks/df/organic/basis/sto-3g/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/basis/sto-3g/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..a9d0933a
--- /dev/null
+++ b/benchmarks/df/organic/basis/sto-3g/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,68,4.334577322006226,0.3771357536315918,-1,-675.5191427445507
+031_Inosine,31,107,2.5327394008636475,0.33897876739501953,-1,-970.3601703535105
+033_Bisphenol_A,33,101,2.4269118309020996,0.32376623153686523,-1,-722.4575094545303
+037_Mg_Porphin,37,141,2.5749151706695557,0.5360629558563232,-1,-1173.7927754921357
+042_Penicillin_V,42,142,3.392273426055908,0.5647890567779541,-1,-1485.4649683739299
+045_Ochratoxin_A,45,157,3.7472238540649414,0.6721327304840088,-1,-1643.4719863900054
+052_Cetirizine,52,164,4.3383002281188965,0.6924264430999756,-1,-1591.0513291828806
+057_Tamoxifen,57,169,4.410161018371582,0.7650091648101807,-1,-1123.9167963056748
+066_Raffinose,66,202,5.353307247161865,1.0840356349945068,-1,-1882.9880554750453
+084_Sphingomyelin,84,220,12.073735475540161,1.2556653022766113,-1,-1787.5270517444574
+095_Azadirachtin,95,299,10.272052764892578,2.6534860134124756,-1,-2530.024523612371
+113_Taxol,113,361,13.37483525276184,4.468937397003174,-1,-2891.8561844203196
+168_Valinomycin,168,480,26.158811807632446,9.459513664245605,-1,-3744.9223643736404
diff --git a/benchmarks/df/organic/basis/sto-3g/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/basis/sto-3g/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..18603814
--- /dev/null
+++ b/benchmarks/df/organic/basis/sto-3g/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,68,7.735399961471558,0.8264245986938477,-1,-675.5191427445513
+031_Inosine,31,107,12.40164589881897,1.2864620685577393,-1,-970.3601703535105
+033_Bisphenol_A,33,101,9.470605850219727,1.3010294437408447,-1,-722.4575094545307
+037_Mg_Porphin,37,141,10.585906982421875,1.7864344120025635,-1,-1173.7927754921361
+042_Penicillin_V,42,142,14.566765546798706,1.8530471324920654,-1,-1485.4649683739317
+045_Ochratoxin_A,45,157,16.409618377685547,2.151444673538208,-1,-1643.4719863900054
+052_Cetirizine,52,164,16.940945386886597,2.433612108230591,-1,-1591.0513291828825
+057_Tamoxifen,57,169,17.164642333984375,2.5976877212524414,-1,-1123.9167963056734
+066_Raffinose,66,202,19.061853408813477,3.485790491104126,-1,-1882.9880554750498
+084_Sphingomyelin,84,220,70.13539099693298,4.33745265007019,-1,-1787.52705174446
+095_Azadirachtin,95,299,35.65800380706787,7.805527210235596,-1,-2530.024523612371
+113_Taxol,113,361,41.06178140640259,12.37047815322876,-1,-2891.8561844202995
+168_Valinomycin,168,480,66.3832175731659,26.61207914352417,-1,-3744.922364373644
diff --git a/benchmarks/df/organic/basis/sto-3g/qchem-32-cores-cpu.csv b/benchmarks/df/organic/basis/sto-3g/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..cdcaf2eb
--- /dev/null
+++ b/benchmarks/df/organic/basis/sto-3g/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,4.0,1.18,-675.5191462951
+031_Inosine,12.0,3.87,-970.360227244
+033_Bisphenol_A,11.0,4.3,-722.4575492056
+037_Mg_Porphin,19.0,7.37,-1173.792785933
+042_Penicillin_V,20.0,7.51,-1485.4650864849
+045_Ochratoxin_A,26.0,9.87,-1643.4720905903
+052_Cetirizine,31.0,14.86,-1591.0513973537
+057_Tamoxifen,33.0,16.04,-1123.9168986001
+066_Raffinose,44.0,27.53,-1882.9882698522
+095_Azadirachtin,165.0,103.83,-2530.0249114909
+113_Taxol,269.0,217.06,-2891.8568650227
+168_Valinomycin,613.0,830.6,-3744.923289617
diff --git a/benchmarks/df/organic/xc/B3LYP/A100-SXM-80GB.csv b/benchmarks/df/organic/xc/B3LYP/A100-SXM-80GB.csv
new file mode 100644
index 00000000..836eb134
--- /dev/null
+++ b/benchmarks/df/organic/xc/B3LYP/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,6.536693334579468,1.0687551498413086,-1,-684.9998712304978
+031_Inosine,31,757,5.713192701339722,1.979923963546753,-1,-983.6545622284157
+033_Bisphenol_A,33,751,5.495375156402588,2.103788137435913,-1,-731.9425812607694
+037_Mg_Porphin,37,944,7.37791895866394,3.194030284881592,-1,-1188.8834346155813
+042_Penicillin_V,42,1007,9.944793939590454,3.687964916229248,-1,-1504.5970074372067
+045_Ochratoxin_A,45,1100,10.987479209899902,4.178173542022705,-1,-1664.4047770134857
+052_Cetirizine,52,1198,13.89931058883667,5.559612035751343,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,14.530046463012695,5.978527545928955,-1,-1138.3713903576554
+066_Raffinose,66,1502,20.843673706054688,8.777323961257935,-1,-1909.253574965227
+084_Sphingomyelin,84,1748,25.394211530685425,8.950069427490234,-1,-1810.9032955330708
+095_Azadirachtin,95,2197,92.36969590187073,24.318066358566284,-1,-2564.198712061071
+113_Taxol,113,2636,149.23795580863953,39.57716727256775,-1,-2930.5984200568655
+168_Valinomycin,168,3678,344.27114701271057,84.33262896537781,-1,-3795.5874330220067
diff --git a/benchmarks/df/organic/xc/B3LYP/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/xc/B3LYP/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..ec26b49f
--- /dev/null
+++ b/benchmarks/df/organic/xc/B3LYP/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,5.492899417877197,1.01948881149292,-1,-684.9998712304978
+031_Inosine,31,757,5.912674903869629,1.829479455947876,-1,-983.6545622284157
+033_Bisphenol_A,33,751,5.440834283828735,1.826728343963623,-1,-731.9425812607694
+037_Mg_Porphin,37,944,7.304898738861084,3.2838988304138184,-1,-1188.8834346155813
+042_Penicillin_V,42,1007,10.433107852935791,3.393378496170044,-1,-1504.5970074372067
+045_Ochratoxin_A,45,1100,11.496653318405151,4.0517518520355225,-1,-1664.4047770134857
+052_Cetirizine,52,1198,14.367682695388794,5.144760608673096,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,16.633729457855225,5.695083379745483,-1,-1138.3713903576554
+066_Raffinose,66,1502,22.467423677444458,8.366443872451782,-1,-1909.253574965227
+084_Sphingomyelin,84,1748,29.06774377822876,8.300293207168579,-1,-1810.9032955330708
+095_Azadirachtin,95,2197,99.11934089660645,22.951361656188965,-1,-2564.198712061071
+113_Taxol,113,2636,156.1254711151123,37.49601125717163,-1,-2930.5984200568655
+168_Valinomycin,168,3678,353.55037093162537,79.85253310203552,-1,-3795.5874330220067
diff --git a/benchmarks/df/organic/xc/B3LYP/PySCF-16-cores-CPU.csv b/benchmarks/df/organic/xc/B3LYP/PySCF-16-cores-CPU.csv
new file mode 100644
index 00000000..31060b74
--- /dev/null
+++ b/benchmarks/df/organic/xc/B3LYP/PySCF-16-cores-CPU.csv
@@ -0,0 +1,2 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,166.60069680213928,28.479886293411255,-1,-684.9998712303525
diff --git a/benchmarks/df/organic/xc/B3LYP/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/xc/B3LYP/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..28c08b15
--- /dev/null
+++ b/benchmarks/df/organic/xc/B3LYP/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,8.800972700119019,1.8244855403900146,-1,-684.9998712304971
+031_Inosine,31,757,15.298340559005737,4.22208046913147,-1,-983.6545622284152
+033_Bisphenol_A,33,751,13.67347502708435,4.29579758644104,-1,-731.9425812607706
+037_Mg_Porphin,37,944,16.657176971435547,7.128359317779541,-1,-1188.8834346155822
+042_Penicillin_V,42,1007,22.56564474105835,7.278250694274902,-1,-1504.5970074372058
+045_Ochratoxin_A,45,1100,25.849337577819824,8.798875570297241,-1,-1664.4047770134866
+052_Cetirizine,52,1198,29.810972690582275,11.371991157531738,-1,-1610.9899034451623
+057_Tamoxifen,57,1274,30.65237545967102,12.279793977737427,-1,-1138.3713903576554
+066_Raffinose,66,1502,56.71444773674011,18.516536712646484,-1,-1909.253574965228
+084_Sphingomyelin,84,1748,71.15179228782654,20.308568716049194,-1,-1810.90329553307
+095_Azadirachtin,95,2197,167.69542574882507,52.49988389015198,-1,-2564.1987120610693
+113_Taxol,113,2636,304.86932730674744,84.91861462593079,-1,-2930.598420056862
diff --git a/benchmarks/df/organic/xc/B3LYP/qchem-32-cores-cpu.csv b/benchmarks/df/organic/xc/B3LYP/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..7f714f18
--- /dev/null
+++ b/benchmarks/df/organic/xc/B3LYP/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,72.0,10.76,-684.61987682
+031_Inosine,98.0,27.66,-983.6545630427
+033_Bisphenol_A,90.0,28.4,-731.9425766448
+037_Mg_Porphin,150.0,59.28,-1188.8834428997
+042_Penicillin_V,160.0,59.04,-1504.5970055807
+045_Ochratoxin_A,226.0,79.06,-1664.4047846776
+052_Cetirizine,273.0,106.99,-1610.9899118452
+057_Tamoxifen,306.0,117.37,-1138.3713951255
+066_Raffinose,460.0,202.49,-1909.2535813929
+084_Sphingomyelin,464.0,196.09,-1810.9033107333
+095_Azadirachtin,2397.0,969.47,-2564.1987343228
+113_Taxol,3837.0,1913.29,-2930.5984454016
diff --git a/benchmarks/df/organic/xc/LDA/A100-SXM-80GB.csv b/benchmarks/df/organic/xc/LDA/A100-SXM-80GB.csv
new file mode 100644
index 00000000..ca92b52e
--- /dev/null
+++ b/benchmarks/df/organic/xc/LDA/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,5.19031834602356,0.6805047988891602,-1,-679.7314731884483
+031_Inosine,31,757,3.6360390186309814,1.1433203220367432,-1,-975.8114573030061
+033_Bisphenol_A,33,751,4.0101823806762695,1.1337347030639648,-1,-725.553770260623
+037_Mg_Porphin,37,944,4.718317270278931,1.972421407699585,-1,-1179.2748822516655
+042_Penicillin_V,42,1007,6.077786445617676,2.0127060413360596,-1,-1494.1035822615622
+045_Ochratoxin_A,45,1100,6.620861530303955,2.403964042663574,-1,-1652.835274633937
+052_Cetirizine,52,1198,7.524308204650879,3.0865039825439453,-1,-1599.592093044906
+057_Tamoxifen,57,1274,8.839669942855835,3.4637794494628906,-1,-1128.1503244194819
+066_Raffinose,66,1502,11.437867403030396,4.90704083442688,-1,-1894.4282941469082
+084_Sphingomyelin,84,1748,12.170867681503296,4.969562292098999,-1,-1796.8793662974263
+095_Azadirachtin,95,2197,86.44375610351562,15.016737222671509,-1,-2543.536233345826
+113_Taxol,113,2636,142.75920486450195,23.587186574935913,-1,-2906.270698339109
+168_Valinomycin,168,3678,300.4492816925049,96.7083010673523,-1,-3763.957449182213
diff --git a/benchmarks/df/organic/xc/LDA/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/xc/LDA/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..5d7adf5a
--- /dev/null
+++ b/benchmarks/df/organic/xc/LDA/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,4.8870251178741455,0.7088582515716553,-1,-679.7314731884483
+031_Inosine,31,757,3.7281572818756104,1.0899417400360107,-1,-975.8114573030061
+033_Bisphenol_A,33,751,3.735625743865967,1.1728365421295166,-1,-725.553770260623
+037_Mg_Porphin,37,944,4.76511025428772,1.892608880996704,-1,-1179.2748822516655
+042_Penicillin_V,42,1007,6.189059495925903,2.262063980102539,-1,-1494.1035822615622
+045_Ochratoxin_A,45,1100,7.0473151206970215,2.3621344566345215,-1,-1652.835274633937
+052_Cetirizine,52,1198,7.927794456481934,2.8812005519866943,-1,-1599.592093044906
+057_Tamoxifen,57,1274,8.841269493103027,3.150391101837158,-1,-1128.1503244194819
+066_Raffinose,66,1502,11.544088363647461,4.533247232437134,-1,-1894.4282941469082
+084_Sphingomyelin,84,1748,12.709854125976562,4.437111854553223,-1,-1796.8793662974263
+095_Azadirachtin,95,2197,90.11724829673767,14.147114038467407,-1,-2543.536233345826
+113_Taxol,113,2636,149.7301163673401,21.684542894363403,-1,-2906.270698339109
+168_Valinomycin,168,3678,305.1583340167999,46.39772653579712,-1,-3763.957449182213
diff --git a/benchmarks/df/organic/xc/LDA/PySCF-16-cores-CPU.csv b/benchmarks/df/organic/xc/LDA/PySCF-16-cores-CPU.csv
new file mode 100644
index 00000000..738bed97
--- /dev/null
+++ b/benchmarks/df/organic/xc/LDA/PySCF-16-cores-CPU.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,98.72748970985413,11.381302833557129,-1,-673.5663565948323
+031_Inosine,31,757,228.59019231796265,37.56609106063843,-1,-966.5178206724472
+033_Bisphenol_A,33,751,192.921062707901,39.41037964820862,-1,-717.6724309321194
+037_Mg_Porphin,37,944,230.14748692512512,64.43460512161255,-1,-1167.9169240469942
+042_Penicillin_V,42,1007,325.2209725379944,75.25960993766785,-1,-1481.8185642023986
+045_Ochratoxin_A,45,1100,372.61192440986633,95.17283821105957,-1,-1639.3603917983983
+052_Cetirizine,52,1198,406.4650754928589,132.0047106742859,-1,-1586.0250650347375
+057_Tamoxifen,57,1274,404.77607583999634,156.75579738616943,-1,-1115.3312859200018
+066_Raffinose,66,1502,489.996458530426,245.18819570541382,-1,-1876.6273634358213
+084_Sphingomyelin,84,1748,777.8037655353546,254.25671195983887,-1,-1779.4236365141664
+095_Azadirachtin,95,2197,1359.784873008728,771.6812634468079,-1,-2518.3629919709592
+113_Taxol,113,2636,1860.3732132911682,1313.059279680252,-1,-2876.665653644961
+168_Valinomycin,168,3678,3258.148581504822,3444.401253938675,-1,-3724.7814430309736
diff --git a/benchmarks/df/organic/xc/LDA/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/xc/LDA/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..7e681e4d
--- /dev/null
+++ b/benchmarks/df/organic/xc/LDA/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,7.407944440841675,1.1166906356811523,-1,-679.7314731884478
+031_Inosine,31,757,10.551367998123169,2.482494831085205,-1,-975.8114573030061
+033_Bisphenol_A,33,751,9.474869966506958,2.5017004013061523,-1,-725.553770260623
+037_Mg_Porphin,37,944,11.756503105163574,4.437911748886108,-1,-1179.2748822516646
+042_Penicillin_V,42,1007,14.69340968132019,4.336089134216309,-1,-1494.1035822615618
+045_Ochratoxin_A,45,1100,17.199308156967163,5.34029746055603,-1,-1652.835274633937
+052_Cetirizine,52,1198,16.72532558441162,6.831871509552002,-1,-1599.592093044906
+057_Tamoxifen,57,1274,19.13835573196411,7.274401903152466,-1,-1128.1503244194819
+066_Raffinose,66,1502,49.35603308677673,11.364518404006958,-1,-1894.42829414691
+084_Sphingomyelin,84,1748,54.22067070007324,11.977006673812866,-1,-1796.879366297428
+095_Azadirachtin,95,2197,149.97830390930176,32.74151802062988,-1,-2543.536233345817
+113_Taxol,113,2636,261.5021336078644,56.135865211486816,-1,-2906.2706983391035
diff --git a/benchmarks/df/organic/xc/LDA/qchem-32-cores-cpu.csv b/benchmarks/df/organic/xc/LDA/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..9a2de937
--- /dev/null
+++ b/benchmarks/df/organic/xc/LDA/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,14.0,3.56,-679.7314745086
+031_Inosine,49.0,7.96,-975.8114577115
+033_Bisphenol_A,46.0,8.89,-725.553763622
+037_Mg_Porphin,66.0,14.14,-1179.2748793144
+042_Penicillin_V,64.0,13.64,-1494.103579632
+045_Ochratoxin_A,94.0,17.73,-1652.8352834053
+052_Cetirizine,141.0,23.98,-1599.5921033435
+057_Tamoxifen,130.0,28.07,-1128.1503311128
+066_Raffinose,159.0,38.63,-1894.4283011989
+084_Sphingomyelin,181.0,37.76,-1796.8793820306
+095_Azadirachtin,503.0,108.83,-2543.5362671667
+113_Taxol,815.0,175.2,-2906.2707301461
diff --git a/benchmarks/df/organic/xc/M06/A100-SXM-80GB.csv b/benchmarks/df/organic/xc/M06/A100-SXM-80GB.csv
new file mode 100644
index 00000000..4a8c54bc
--- /dev/null
+++ b/benchmarks/df/organic/xc/M06/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,7.239452362060547,1.2442829608917236,-1,-684.619869515845
+031_Inosine,31,757,7.898204565048218,2.2871077060699463,-1,-983.0547589104604
+033_Bisphenol_A,33,751,6.983739376068115,2.3445489406585693,-1,-731.4091463101108
+037_Mg_Porphin,37,944,9.93832015991211,3.951474666595459,-1,-1188.1212310147703
+042_Penicillin_V,42,1007,14.46263074874878,4.66741156578064,-1,-1503.858948674962
+045_Ochratoxin_A,45,1100,14.88665509223938,5.082300901412964,-1,-1663.5696830251036
+052_Cetirizine,52,1198,20.831133365631104,6.881482362747192,-1,-1610.140238148088
+057_Tamoxifen,57,1274,21.605111598968506,7.628223896026611,-1,-1137.4845527071766
+066_Raffinose,66,1502,30.967734575271606,11.079029083251953,-1,-1908.1931821866547
+084_Sphingomyelin,84,1748,31.8246169090271,9.770634651184082,-1,-1809.8210465003963
+095_Azadirachtin,95,2197,111.95785093307495,28.64066791534424,-1,-2562.691519186691
+113_Taxol,113,2636,179.175772190094,45.65501952171326,-1,-2928.7606872249544
+168_Valinomycin,168,3678,402.1519751548767,95.37574505805969,-1,-3793.2016369712983
diff --git a/benchmarks/df/organic/xc/M06/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/xc/M06/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..fb0c8e1a
--- /dev/null
+++ b/benchmarks/df/organic/xc/M06/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,6.38824725151062,1.1219229698181152,-1,-684.619869515845
+031_Inosine,31,757,7.5703113079071045,2.168393611907959,-1,-983.0547589104604
+033_Bisphenol_A,33,751,7.170833349227905,2.2604305744171143,-1,-731.4091463101108
+037_Mg_Porphin,37,944,10.137072801589966,3.741095781326294,-1,-1188.1212310147703
+042_Penicillin_V,42,1007,14.67328405380249,4.221444845199585,-1,-1503.858948674962
+045_Ochratoxin_A,45,1100,14.957886219024658,4.712314128875732,-1,-1663.5696830251036
+052_Cetirizine,52,1198,21.75391912460327,6.525522708892822,-1,-1610.140238148088
+057_Tamoxifen,57,1274,23.0108802318573,7.200787305831909,-1,-1137.4845527071766
+066_Raffinose,66,1502,31.956539392471313,10.537749767303467,-1,-1908.1931821866547
+084_Sphingomyelin,84,1748,35.147979497909546,9.277905225753784,-1,-1809.8210465003963
+095_Azadirachtin,95,2197,121.20170712471008,27.361077070236206,-1,-2562.691519186691
+113_Taxol,113,2636,186.93862509727478,44.07694101333618,-1,-2928.7606872249544
+168_Valinomycin,168,3678,414.9386417865753,91.17277765274048,-1,-3793.2016369712983
diff --git a/benchmarks/df/organic/xc/M06/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/xc/M06/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..21027257
--- /dev/null
+++ b/benchmarks/df/organic/xc/M06/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,12.437044858932495,2.1609699726104736,-1,-684.6198695158453
+031_Inosine,31,757,20.66638159751892,4.955613374710083,-1,-983.0547589104599
+033_Bisphenol_A,33,751,18.485742568969727,5.183716773986816,-1,-731.4091463101092
+037_Mg_Porphin,37,944,23.25464677810669,8.151477813720703,-1,-1188.1212310147698
+042_Penicillin_V,42,1007,30.408202648162842,8.447172164916992,-1,-1503.858948674963
+045_Ochratoxin_A,45,1100,33.617873191833496,10.075827836990356,-1,-1663.5696830251045
+052_Cetirizine,52,1198,42.68663263320923,13.130903959274292,-1,-1610.140238148087
+057_Tamoxifen,57,1274,42.551064014434814,13.890989065170288,-1,-1137.4845527071761
+066_Raffinose,66,1502,69.30276298522949,20.872440814971924,-1,-1908.1931821866538
+084_Sphingomyelin,84,1748,90.0351390838623,22.381996154785156,-1,-1809.8210465004
+095_Azadirachtin,95,2197,196.9105498790741,58.10214638710022,-1,-2562.6915191866965
+113_Taxol,113,2636,345.9941246509552,104.40749049186707,-1,-2928.7606872249507
diff --git a/benchmarks/df/organic/xc/M06/qchem-32-cores-cpu.csv b/benchmarks/df/organic/xc/M06/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..ce078ccb
--- /dev/null
+++ b/benchmarks/df/organic/xc/M06/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,74.0,10.41,-684.61987682
+031_Inosine,196.0,27.36,-983.0547854079
+033_Bisphenol_A,204.0,28.58,-731.4091575791
+037_Mg_Porphin,287.0,59.16,-1188.1215069298
+042_Penicillin_V,323.0,61.1,-1503.858955122
+045_Ochratoxin_A,405.0,81.04,-1663.569666002
+052_Cetirizine,531.0,107.38,-1610.1402651215
+057_Tamoxifen,572.0,116.63,-1137.4845310101
+066_Raffinose,733.0,196.28,-1908.1931526222
+084_Sphingomyelin,777.0,200.71,-1809.8210431462
+095_Azadirachtin,3253.0,930.45,-2562.6915510995
+113_Taxol,5447.0,1768.82,-2928.7607429852
diff --git a/benchmarks/df/organic/xc/PBE/A100-SXM-80GB.csv b/benchmarks/df/organic/xc/PBE/A100-SXM-80GB.csv
new file mode 100644
index 00000000..d00e81f8
--- /dev/null
+++ b/benchmarks/df/organic/xc/PBE/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,6.961557388305664,0.991546630859375,-1,-684.2574240082379
+031_Inosine,31,757,5.6712257862091064,1.8366539478302002,-1,-982.5686273049541
+033_Bisphenol_A,33,751,4.852174997329712,1.7802679538726807,-1,-731.0147406494493
+037_Mg_Porphin,37,944,6.25937294960022,2.7324182987213135,-1,-1187.5447279965138
+042_Penicillin_V,42,1007,9.47238302230835,3.1186983585357666,-1,-1503.130556521959
+045_Ochratoxin_A,45,1100,9.140993595123291,3.7543253898620605,-1,-1662.7850791530736
+052_Cetirizine,52,1198,10.354186534881592,4.69004487991333,-1,-1609.366529016344
+057_Tamoxifen,57,1274,12.039185047149658,5.076211452484131,-1,-1136.8847058776219
+066_Raffinose,66,1502,16.18307614326477,7.3085174560546875,-1,-1907.112294895277
+084_Sphingomyelin,84,1748,17.68308401107788,7.188992500305176,-1,-1808.775538584849
+095_Azadirachtin,95,2197,93.63990569114685,19.67312526702881,-1,-2561.2687911203766
+113_Taxol,113,2636,156.57277917861938,30.20958161354065,-1,-2927.1162449211824
+168_Valinomycin,168,3678,357.24370884895325,109.15746283531189,-1,-3790.885012787334
diff --git a/benchmarks/df/organic/xc/PBE/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/xc/PBE/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..150747d9
--- /dev/null
+++ b/benchmarks/df/organic/xc/PBE/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,5.5862135887146,0.9870169162750244,-1,-684.2574240082379
+031_Inosine,31,757,5.732322931289673,1.5905745029449463,-1,-982.5686273049541
+033_Bisphenol_A,33,751,5.03624153137207,1.619131088256836,-1,-731.0147406494493
+037_Mg_Porphin,37,944,6.461896657943726,2.6558828353881836,-1,-1187.5447279965138
+042_Penicillin_V,42,1007,9.360698699951172,2.9013607501983643,-1,-1503.130556521959
+045_Ochratoxin_A,45,1100,9.610546350479126,3.3021762371063232,-1,-1662.7850791530736
+052_Cetirizine,52,1198,11.40823745727539,4.345647573471069,-1,-1609.366529016344
+057_Tamoxifen,57,1274,13.521334886550903,4.767632007598877,-1,-1136.8847058776219
+066_Raffinose,66,1502,17.822139739990234,6.789742469787598,-1,-1907.112294895277
+084_Sphingomyelin,84,1748,21.762745141983032,6.569229364395142,-1,-1808.775538584849
+095_Azadirachtin,95,2197,100.73956489562988,18.331065893173218,-1,-2561.2687911203766
+113_Taxol,113,2636,164.95471501350403,28.685845613479614,-1,-2927.1162449211824
+168_Valinomycin,168,3678,353.69052505493164,56.79609656333923,-1,-3790.885012787334
diff --git a/benchmarks/df/organic/xc/PBE/PySCF-16-cores-CPU.csv b/benchmarks/df/organic/xc/PBE/PySCF-16-cores-CPU.csv
new file mode 100644
index 00000000..be5e9b77
--- /dev/null
+++ b/benchmarks/df/organic/xc/PBE/PySCF-16-cores-CPU.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,127.77058172225952,22.720113039016724,-1,-684.2574240072397
+031_Inosine,31,757,281.0171639919281,69.74131369590759,-1,-982.5686273053839
+033_Bisphenol_A,33,751,235.67442345619202,69.46034455299377,-1,-731.0147406493556
+037_Mg_Porphin,37,944,290.7133102416992,111.29512572288513,-1,-1187.5447279978862
+042_Penicillin_V,42,1007,419.4401741027832,129.7432074546814,-1,-1503.1305565301836
+045_Ochratoxin_A,45,1100,502.1398868560791,163.81242108345032,-1,-1662.7850791611536
+052_Cetirizine,52,1198,482.6661548614502,229.73909282684326,-1,-1609.366529018504
+057_Tamoxifen,57,1274,517.4850268363953,277.17779302597046,-1,-1136.8847058774309
+066_Raffinose,66,1502,598.8673341274261,420.49633145332336,-1,-1907.1122948952207
+084_Sphingomyelin,84,1748,974.6237545013428,424.8226993083954,-1,-1808.7755385849691
+095_Azadirachtin,95,2197,1631.4011478424072,1277.4062144756317,-1,-2561.2687911199764
+113_Taxol,113,2636,2369.557379961014,2175.742966890335,-1,-2927.1162449197564
+168_Valinomycin,168,3678,3851.094472885132,5654.397842407227,-1,-3790.8850127873957
diff --git a/benchmarks/df/organic/xc/PBE/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/xc/PBE/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..5f7b55e1
--- /dev/null
+++ b/benchmarks/df/organic/xc/PBE/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,10.308462142944336,1.6231467723846436,-1,-684.2574240082379
+031_Inosine,31,757,15.287026643753052,3.5448477268218994,-1,-982.5686273049541
+033_Bisphenol_A,33,751,12.796265840530396,3.6957123279571533,-1,-731.0147406494491
+037_Mg_Porphin,37,944,14.30986475944519,5.791215658187866,-1,-1187.5447279965133
+042_Penicillin_V,42,1007,20.26565909385681,5.973749160766602,-1,-1503.13055652196
+045_Ochratoxin_A,45,1100,21.085000038146973,7.1822357177734375,-1,-1662.7850791530745
+052_Cetirizine,52,1198,23.37704873085022,9.17398715019226,-1,-1609.366529016344
+057_Tamoxifen,57,1274,26.621222496032715,9.831178426742554,-1,-1136.8847058776214
+066_Raffinose,66,1502,58.76239728927612,14.858367919921875,-1,-1907.112294895277
+084_Sphingomyelin,84,1748,70.2571325302124,16.36003875732422,-1,-1808.775538584849
+095_Azadirachtin,95,2197,164.3051815032959,39.811671018600464,-1,-2561.2687911203766
+113_Taxol,113,2636,273.7968969345093,218.1352825164795,-1,-2927.1162449211806
diff --git a/benchmarks/df/organic/xc/PBE/qchem-32-cores-cpu.csv b/benchmarks/df/organic/xc/PBE/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..7aad6be9
--- /dev/null
+++ b/benchmarks/df/organic/xc/PBE/qchem-32-cores-cpu.csv
@@ -0,0 +1,13 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,34.0,6.95,-684.2574253061
+031_Inosine,91.0,15.96,-982.5686273584
+033_Bisphenol_A,85.0,17.98,-731.0147356624
+037_Mg_Porphin,123.0,30.12,-1187.5447187696
+042_Penicillin_V,125.0,26.01,-1503.1305540488
+045_Ochratoxin_A,147.0,30.81,-1662.7850882275
+052_Cetirizine,199.0,42.17,-1609.3665402156
+057_Tamoxifen,224.0,45.81,-1136.8847138391
+066_Raffinose,253.0,64.25,-1907.1123038637
+084_Sphingomyelin,279.0,62.31,-1808.7755554378
+095_Azadirachtin,778.0,173.82,-2561.2688203759
+113_Taxol,1123.0,259.63,-2927.1162746272
diff --git a/benchmarks/df/organic/xc/wB97m-v/A100-SXM-80GB.csv b/benchmarks/df/organic/xc/wB97m-v/A100-SXM-80GB.csv
new file mode 100644
index 00000000..b4699f98
--- /dev/null
+++ b/benchmarks/df/organic/xc/wB97m-v/A100-SXM-80GB.csv
@@ -0,0 +1,14 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,10.226790189743042,1.9927737712860107,-1,-684.7972152992588
+031_Inosine,31,757,15.368789434432983,3.730320692062378,-1,-983.3589054987574
+033_Bisphenol_A,33,751,12.893135070800781,3.7566306591033936,-1,-731.659867656484
+037_Mg_Porphin,37,944,18.265013217926025,6.181380987167358,-1,-1188.5125072746082
+042_Penicillin_V,42,1007,25.301137924194336,6.9786598682403564,-1,-1504.2057687451456
+045_Ochratoxin_A,45,1100,29.1102192401886,7.967437505722046,-1,-1663.9748731525679
+052_Cetirizine,52,1198,33.73243761062622,10.424139022827148,-1,-1610.52602950548
+057_Tamoxifen,57,1274,38.2678804397583,11.776172161102295,-1,-1137.893595241635
+066_Raffinose,66,1502,51.070985317230225,17.83376908302307,-1,-1908.6726444847072
+084_Sphingomyelin,84,1748,63.58804726600647,18.02516770362854,-1,-1810.191885221709
+095_Azadirachtin,95,2197,171.3449671268463,47.00850176811218,-1,-2563.4535097374346
+113_Taxol,113,2636,299.15999937057495,75.36923575401306,-1,-2929.7011090075484
+168_Valinomycin,168,3678,619.5976231098175,161.8357379436493,-1,-3794.241422302097
diff --git a/benchmarks/df/organic/xc/wB97m-v/NVIDIA A100-SXM4-80GB.csv b/benchmarks/df/organic/xc/wB97m-v/NVIDIA A100-SXM4-80GB.csv
new file mode 100644
index 00000000..afe31119
--- /dev/null
+++ b/benchmarks/df/organic/xc/wB97m-v/NVIDIA A100-SXM4-80GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,8.306372880935669,1.6222960948944092,-1,-684.7972152992588
+031_Inosine,31,757,14.118914127349854,3.446458578109741,-1,-983.3589054987574
+033_Bisphenol_A,33,751,12.283555507659912,3.576833724975586,-1,-731.659867656484
+037_Mg_Porphin,37,944,17.476016998291016,5.948699951171875,-1,-1188.5125072746082
+042_Penicillin_V,42,1007,26.030335903167725,6.651940107345581,-1,-1504.2057687451456
+045_Ochratoxin_A,45,1100,27.8575758934021,7.650293827056885,-1,-1663.9748731525679
+052_Cetirizine,52,1198,34.436506032943726,10.142845153808594,-1,-1610.52602950548
+057_Tamoxifen,57,1274,38.94625115394592,11.39339303970337,-1,-1137.893595241635
+066_Raffinose,66,1502,51.84050464630127,16.5187931060791,-1,-1908.6726444847072
+084_Sphingomyelin,84,1748,65.87429904937744,17.404941082000732,-1,-1810.191885221709
+095_Azadirachtin,95,2197,184.05396628379822,46.17947554588318,-1,-2563.4535097374346
+113_Taxol,113,2636,308.77606081962585,74.03803372383118,-1,-2929.7011090075484
diff --git a/benchmarks/df/organic/xc/wB97m-v/Tesla V100-SXM2-32GB.csv b/benchmarks/df/organic/xc/wB97m-v/Tesla V100-SXM2-32GB.csv
new file mode 100644
index 00000000..5f209ca2
--- /dev/null
+++ b/benchmarks/df/organic/xc/wB97m-v/Tesla V100-SXM2-32GB.csv
@@ -0,0 +1,13 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+020_Vitamin_C,20,484,13.700514078140259,3.0849950313568115,-1,-684.7972152992584
+031_Inosine,31,757,28.050696849822998,7.492033004760742,-1,-983.3589054987569
+033_Bisphenol_A,33,751,24.049904584884644,7.726109981536865,-1,-731.6598676564843
+037_Mg_Porphin,37,944,31.93869709968567,12.972524642944336,-1,-1188.5125072746068
+042_Penicillin_V,42,1007,44.11505150794983,13.188591480255127,-1,-1504.2057687451465
+045_Ochratoxin_A,45,1100,50.081422328948975,16.08480668067932,-1,-1663.974873152567
+052_Cetirizine,52,1198,57.978368043899536,21.047912120819092,-1,-1610.526029505481
+057_Tamoxifen,57,1274,63.315815925598145,22.768672227859497,-1,-1137.893595241636
+066_Raffinose,66,1502,99.42343378067017,34.120665550231934,-1,-1908.6726444847045
+084_Sphingomyelin,84,1748,133.0005910396576,38.268571615219116,-1,-1810.19188522171
+095_Azadirachtin,95,2197,308.25982427597046,657.9918072223663,-1,-2563.4535097374364
+113_Taxol,113,2636,951.182473897934,160.49217677116394,-1,-2929.701109007554
diff --git a/benchmarks/df/organic/xc/wB97m-v/qchem-32-cores-cpu.csv b/benchmarks/df/organic/xc/wB97m-v/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..9c073f87
--- /dev/null
+++ b/benchmarks/df/organic/xc/wB97m-v/qchem-32-cores-cpu.csv
@@ -0,0 +1,12 @@
+mol,t_scf,t_gradient,e_tot
+020_Vitamin_C,145.0,18.02,-684.7972133571
+031_Inosine,369.0,47.9,-983.3589087847
+033_Bisphenol_A,354.0,50.07,-731.6598706948
+037_Mg_Porphin,529.0,88.31,-1188.5125126395
+042_Penicillin_V,630.0,91.89,-1504.2057720624
+045_Ochratoxin_A,708.0,111.31,-1663.9748783999
+052_Cetirizine,891.0,159.25,-1610.5260449011
+057_Tamoxifen,992.0,170.94,-1137.8935914288
+066_Raffinose,1314.0,282.92,-1908.6726436361
+084_Sphingomyelin,1611.0,307.38,-1810.1919027972
+095_Azadirachtin,4640.0,1105.14,-2563.4535091472
diff --git a/benchmarks/df/qchem.py b/benchmarks/df/qchem.py
new file mode 100644
index 00000000..9225997a
--- /dev/null
+++ b/benchmarks/df/qchem.py
@@ -0,0 +1,78 @@
+import os
+import csv
+import argparse
+import subprocess
+
+parser = argparse.ArgumentParser(description='Run SCF, grad with Q-Chem for molecules')
+parser.add_argument('--basis', type=str, default='def2-tzvpp')
+parser.add_argument('--xc', type=str, default='B3LYP')
+parser.add_argument('--input_path', type=str, default='./')
+parser.add_argument('--output_path', type=str, default='./')
+args = parser.parse_args()
+bas = args.basis
+xc = args.xc
+
+if not os.path.exists(args.output_path):
+ os.mkdir(args.output_path)
+
+def run_dft(filename):
+ with open(filename, 'r') as xyz_file:
+ coords = xyz_file.readlines()[2:]
+
+ with open('qchem_input.in', "w") as input:
+ input.write("$molecule\n")
+ input.write("0 1\n")
+ for line in coords:
+ input.write(line)
+ input.write("\n$end")
+ input.write("\n")
+
+ input.write("$rem\n")
+ input.write("JOBTYPE force\n")
+ input.write("METHOD " + args.xc + "\n")
+ input.write("BASIS " + args.basis + "\n")
+ input.write("SYMMETRY FALSE\n")
+ input.write("SYM_IGNORE TRUE\n")
+ input.write("XC_GRID 000099000590\n")
+ input.write("NL_GRID 000050000194\n")
+ input.write("MAX_SCF_CYCLES 100\n")
+ input.write("ri_j True\n")
+ input.write("ri_k True\n")
+ input.write("aux_basis RIJK-def2-tzvp\n")
+ input.write("SCF_CONVERGENCE 9\n")
+ input.write("THRESH 14\n")
+ input.write("BASIS_LIN_DEP_THRESH 12\n")
+ input.write("$end\n")
+
+ filename = args.xc + '_' + args.basis
+ subprocess.run(['qchem', '-np', '32', 'qchem_input.in', filename])
+ with open(filename, 'w') as output_file:
+ lines = output_file.readlines()
+ for line in lines:
+ if line[:16] == " SCF time: CPU":
+ info = line[16:].split(' ')[4]
+ scf_time = float(info[:-1])
+ if line[:20] == " Gradient time: CPU":
+ info = line[20:].split(' ')[5]
+ gradient_time = float(info)
+ energy_line = ' Total energy in the final basis set ='
+ if energy_line in line:
+ info = line.replace(energy_line, '')
+ e_tot = float(info)
+ return scf_time, gradient_time, e_tot
+
+fields = ['mol', 't_scf', 't_gradient', 'e_tot']
+output_file = 'qchem-32-cores-cpu.csv'
+output_file = args.output_path + output_file
+csvfile = open(output_file, 'w')
+csvwriter = csv.writer(csvfile)
+csvwriter.writerow(fields)
+
+for filename in os.listdir(args.input_path):
+ if filename.endswith(".xyz"):
+ print(f'running DFT {filename}')
+ info = run_dft(args.input_path+filename)
+ row = [filename[:-4]]+list(info)
+ csvwriter.writerow(row)
+ csvfile.flush()
+csvfile.close()
diff --git a/benchmarks/df/run_gpu4pyscf.sh b/benchmarks/df/run_gpu4pyscf.sh
new file mode 100644
index 00000000..c3c5dc6b
--- /dev/null
+++ b/benchmarks/df/run_gpu4pyscf.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+DIR="./organic/xc"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+for xc in LDA PBE B3LYP M06 wB97m-v
+do
+ python3 dft_driver.py --input_path ../molecules/organic/ --output_path ./organic/xc/$xc/ --xc $xc
+done
+exit
+
+DIR="./organic/basis"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+for basis in def2-svp def2-tzvpp def2-tzvpd sto-3g 6-31g
+do
+ python3 dft_driver.py --input_path ../molecules/organic/ --output_path ./organic/basis/$basis/ --basis $basis
+done
diff --git a/benchmarks/df/run_pyscf.sh b/benchmarks/df/run_pyscf.sh
new file mode 100644
index 00000000..739f38ea
--- /dev/null
+++ b/benchmarks/df/run_pyscf.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+DIR="./organic/xc"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+for xc in LDA PBE B3LYP M06 wB97m-v
+do
+ python3 dft_driver.py --input_path ../molecules/organic/ --output_path ./organic/xc/$xc/ --xc $xc --device CPU
+done
+
+DIR="./organic/basis"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+for basis in def2-svp def2-tzvpp def2-tzvpd sto-3g 6-31g
+do
+ python3 dft_driver.py --input_path ../molecules/organic/ --output_path ./organic/basis/$basis/ --basis $basis --deivce CPU
+done
diff --git a/benchmarks/df/run_qchem.sh b/benchmarks/df/run_qchem.sh
new file mode 100644
index 00000000..adc8731f
--- /dev/null
+++ b/benchmarks/df/run_qchem.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+DIR="./organic/xc"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+DIR="./organic/basis"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+#for xc in LDA PBE B3LYP M06 wB97m-v
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/xc/LDA/ --xc LDA &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/xc/PBE/ --xc PBE &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/xc/B3LYP/ --xc B3LYP &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/xc/M06/ --xc M06 &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/xc/wB97m-v/ --xc wB97m-v &&
+
+#for basis in def2-svp def2-tzvpp def2-tzvpd sto-3g 6-31g 6-31g*
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/def2-svp/ --basis def2-svp &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/def2-tzvpp/ --basis def2-tzvpp &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/def2-tzvpd/ --basis def2-tzvpd &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/sto-3g/ --basis sto-3g &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/6-31g/ --basis 6-31g &&
+run --cpu 64 --memory 128 --gpu 0 -- python3 qchem.py --input_path ../molecules/organic/ --output_path ./organic/basis/6-31g*/ --basis 6-31g*
diff --git a/benchmarks/molecules/gly/gly100.xyz b/benchmarks/molecules/gly/gly100.xyz
new file mode 100644
index 00000000..6fdbdd94
--- /dev/null
+++ b/benchmarks/molecules/gly/gly100.xyz
@@ -0,0 +1,705 @@
+703
+
+N 0.00000 0.00000 0.00000
+C 1.44675 0.00000 0.00000
+C 1.96825 0.00000 1.43350
+O 1.23855 0.00000 2.42187
+H 1.79887 -0.89599 -0.52238
+H 1.79973 0.89301 -0.52356
+H -0.47223 -0.00252 0.89965
+H -0.50800 0.07669 -0.87653
+N 3.28785 -0.00000 1.66639
+C 3.78246 0.00022 3.02597
+C 5.30787 0.00017 3.02597
+O 5.98722 -0.00002 2.00234
+H 3.41197 0.89631 3.53531
+H 3.41109 -0.89269 3.53683
+H 3.97186 0.00237 0.91504
+N 5.97787 0.00035 4.18645
+C 7.42462 0.00009 4.18645
+C 7.94612 0.00037 5.61994
+O 7.21641 0.00075 6.60831
+H 7.77658 -0.89610 3.66430
+H 7.77776 0.89290 3.66265
+H 5.50563 -0.00185 5.08610
+N 9.26572 0.00019 5.85284
+C 9.76033 0.00067 7.21242
+C 11.28573 0.00034 7.21242
+O 11.96509 -0.00024 6.18879
+H 9.39000 0.89695 7.72152
+H 9.38879 -0.89204 7.72351
+H 9.94972 0.00224 5.10149
+N 11.95573 0.00070 8.37289
+C 13.40249 0.00018 8.37289
+C 13.92398 0.00073 9.80639
+O 13.19428 0.00151 10.79476
+H 13.75428 -0.89621 7.85098
+H 13.75579 0.89279 7.84887
+H 11.48350 -0.00118 9.27255
+N 15.24359 0.00037 10.03929
+C 15.73819 0.00112 11.39887
+C 17.26360 0.00052 11.39887
+O 17.94295 -0.00046 10.37523
+H 15.36803 0.89760 11.90774
+H 15.36650 -0.89139 11.91018
+H 15.92759 0.00211 9.28794
+N 17.93360 0.00105 12.55934
+C 19.38036 0.00027 12.55934
+C 19.90185 0.00110 13.99284
+O 19.17215 0.00226 14.98121
+H 19.73199 -0.89632 12.03766
+H 19.73382 0.89267 12.03508
+H 17.46137 -0.00051 13.45900
+N 21.22146 0.00056 14.22573
+C 21.71606 0.00157 15.58531
+C 23.24147 0.00069 15.58531
+O 23.92082 -0.00067 14.56168
+H 21.34606 0.89825 16.09395
+H 21.34421 -0.89074 16.09686
+H 21.90546 0.00198 13.47438
+N 23.91147 0.00141 16.74579
+C 25.35822 0.00036 16.74579
+C 25.87972 0.00146 18.17928
+O 25.15002 0.00302 19.16765
+H 25.70969 -0.89643 16.22434
+H 25.71185 0.89256 16.22130
+H 23.43923 0.00016 17.64544
+N 27.19932 0.00075 18.41218
+C 27.69393 0.00202 19.77176
+C 29.21934 0.00086 19.77176
+O 29.89869 -0.00089 18.74813
+H 27.32409 0.89890 20.28017
+H 27.32191 -0.89009 20.28354
+H 27.88333 0.00184 17.66083
+N 29.88934 0.00176 20.93223
+C 31.33609 0.00044 20.93224
+C 31.85759 0.00183 22.36573
+O 31.12788 0.00377 23.35410
+H 31.68740 -0.89654 20.41102
+H 31.68988 0.89245 20.40752
+H 29.41710 0.00083 21.83189
+N 33.17719 0.00093 22.59863
+C 33.67180 0.00246 23.95821
+C 35.19720 0.00103 23.95821
+O 35.87656 -0.00110 22.93458
+H 33.30212 0.89955 24.46638
+H 33.29962 -0.88944 24.47022
+H 33.86119 0.00171 21.84728
+N 35.86720 0.00211 25.11868
+C 37.31396 0.00053 25.11868
+C 37.83545 0.00219 26.55218
+O 37.10575 0.00453 27.54055
+H 37.66510 -0.89665 24.59770
+H 37.66791 0.89234 24.59373
+H 35.39497 0.00150 26.01834
+N 39.15506 0.00112 26.78507
+C 39.64966 0.00291 28.14465
+C 41.17507 0.00121 28.14466
+O 41.85442 -0.00132 27.12102
+H 39.28015 0.90019 28.65260
+H 39.27732 -0.88879 28.65690
+H 39.83906 0.00158 26.03372
+N 41.84507 0.00246 29.30513
+C 43.29182 0.00062 29.30513
+C 43.81332 0.00256 30.73862
+O 43.08362 0.00528 31.72699
+H 43.64281 -0.89676 28.78438
+H 43.64594 0.89223 28.77995
+H 41.37284 0.00217 30.20478
+N 45.13293 0.00131 30.97152
+C 45.62753 0.00336 32.33110
+C 47.15294 0.00138 32.33110
+O 47.83229 -0.00154 31.30747
+H 45.25818 0.90084 32.83881
+H 45.25503 -0.88814 32.84357
+H 45.81693 0.00145 30.22017
+N 47.82294 0.00281 33.49157
+C 49.26969 0.00071 33.49158
+C 49.79119 0.00293 34.92507
+O 49.06149 0.00603 35.91344
+H 49.62051 -0.89687 32.97106
+H 49.62396 0.89212 32.96616
+H 47.35070 0.00284 34.39123
+N 51.11079 0.00149 35.15797
+C 51.60540 0.00381 36.51755
+C 53.13081 0.00155 36.51755
+O 53.81016 -0.00175 35.49392
+H 51.23621 0.90149 37.02502
+H 51.23273 -0.88749 37.03025
+H 51.79480 0.00131 34.40662
+N 53.80081 0.00316 37.67802
+C 55.24756 0.00080 37.67802
+C 55.76906 0.00329 39.11152
+O 55.03936 0.00679 40.09988
+H 55.59822 -0.89698 37.15774
+H 55.60199 0.89201 37.15238
+H 53.32857 0.00351 38.57768
+N 57.08866 0.00168 39.34442
+C 57.58327 0.00426 40.70399
+C 59.10867 0.00172 40.70400
+O 59.78802 -0.00197 39.68037
+H 57.21424 0.90214 41.21124
+H 57.21044 -0.88684 41.21693
+H 57.77266 0.00118 38.59307
+N 59.77868 0.00352 41.86447
+C 61.22543 0.00089 41.86447
+C 61.74692 0.00366 43.29796
+O 61.01722 0.00754 44.28633
+H 61.57592 -0.89709 41.34442
+H 61.58002 0.89189 41.33860
+H 59.30644 0.00418 42.76412
+N 63.06653 0.00187 43.53086
+C 63.56114 0.00471 44.89044
+C 65.08654 0.00190 44.89044
+O 65.76589 -0.00219 43.86682
+H 63.19227 0.90279 45.39745
+H 63.18815 -0.88619 45.40361
+H 63.75053 0.00105 42.77951
+N 65.75654 0.00387 46.05092
+C 67.20329 0.00098 46.05092
+C 67.72479 0.00402 47.48441
+O 66.99509 0.00830 48.47278
+H 67.55362 -0.89720 45.53110
+H 67.55805 0.89178 45.52481
+H 65.28431 0.00485 46.95057
+N 69.04439 0.00205 47.71731
+C 69.53900 0.00516 49.07689
+C 71.06441 0.00207 49.07689
+O 71.74376 -0.00240 48.05327
+H 69.17030 0.90343 49.58367
+H 69.16585 -0.88554 49.59028
+H 69.72840 0.00092 46.96596
+N 71.73441 0.00422 50.23736
+C 73.18116 0.00107 50.23737
+C 73.70266 0.00439 51.67086
+O 72.97296 0.00905 52.65922
+H 73.53133 -0.89731 49.71778
+H 73.53608 0.89167 49.71103
+H 71.26217 0.00552 51.13702
+N 75.02226 0.00224 51.90376
+C 75.51687 0.00561 53.26333
+C 77.04228 0.00224 53.26334
+O 77.72162 -0.00262 52.23971
+H 75.14833 0.90408 53.76988
+H 75.14356 -0.88489 53.77696
+H 75.70627 0.00079 51.15241
+N 77.71228 0.00457 54.42381
+C 79.15903 0.00116 54.42381
+C 79.68053 0.00476 55.85730
+O 78.95083 0.00981 56.84567
+H 79.50903 -0.89741 53.90446
+H 79.51411 0.89156 53.89725
+H 77.24004 0.00619 55.32346
+N 81.00013 0.00243 56.09020
+C 81.49474 0.00606 57.44978
+C 83.02014 0.00241 57.44979
+O 83.69949 -0.00283 56.42616
+H 81.12636 0.90473 57.95609
+H 81.12127 -0.88424 57.96364
+H 81.68413 0.00065 55.33886
+N 83.69015 0.00492 58.61026
+C 85.13689 0.00125 58.61026
+C 85.65839 0.00512 60.04375
+O 84.92870 0.01056 61.03211
+H 85.48674 -0.89752 58.09114
+H 85.49214 0.89145 58.08346
+H 83.21791 0.00686 59.50991
+N 86.97800 0.00261 60.27665
+C 87.47261 0.00651 61.63623
+C 88.99801 0.00259 61.63623
+O 89.67735 -0.00305 60.61261
+H 87.10439 0.90538 62.14231
+H 87.09897 -0.88359 62.15031
+H 87.66200 0.00052 59.52530
+N 89.66801 0.00527 62.79670
+C 91.11476 0.00133 62.79671
+C 91.63626 0.00549 64.23020
+O 90.90657 0.01132 65.21856
+H 91.46444 -0.89763 62.27782
+H 91.47017 0.89134 62.26968
+H 89.19578 0.00753 63.69636
+N 92.95586 0.00280 64.46310
+C 93.45047 0.00696 65.82267
+C 94.97588 0.00276 65.82268
+O 95.65522 -0.00327 64.79906
+H 93.08243 0.90602 66.32852
+H 93.07668 -0.88294 66.33699
+H 93.63987 0.00039 63.71175
+N 95.64588 0.00562 66.98315
+C 97.09263 0.00142 66.98316
+C 97.61413 0.00585 68.41664
+O 96.88444 0.01207 69.40500
+H 97.44214 -0.89774 66.46450
+H 97.44819 0.89122 66.45590
+H 95.17365 0.00820 67.88280
+N 98.93373 0.00299 68.64955
+C 99.42834 0.00741 70.00912
+C 100.95374 0.00293 70.00913
+O 101.63309 -0.00348 68.98551
+H 99.06046 0.90667 70.51473
+H 99.05438 -0.88229 70.52367
+H 99.61773 0.00026 67.89820
+N 101.62375 0.00598 71.16959
+C 103.07049 0.00151 71.16961
+C 103.59200 0.00622 72.60309
+O 102.86230 0.01282 73.59145
+H 103.41985 -0.89785 70.65118
+H 103.42622 0.89111 70.64212
+H 101.15152 0.00887 72.06925
+N 104.91160 0.00317 72.83599
+C 105.40621 0.00786 74.19556
+C 106.93161 0.00310 74.19557
+O 107.61095 -0.00370 73.17196
+H 105.03849 0.90732 74.70095
+H 105.03209 -0.88164 74.71034
+H 105.59560 0.00013 72.08465
+N 107.60162 0.00633 75.35604
+C 109.04836 0.00160 75.35605
+C 109.56986 0.00658 76.78954
+O 108.84017 0.01358 77.77789
+H 109.39755 -0.89796 74.83787
+H 109.40425 0.89100 74.82833
+H 107.12938 0.00955 76.25569
+N 110.88947 0.00336 77.02244
+C 111.38408 0.00831 78.38201
+C 112.90948 0.00328 78.38202
+O 113.58882 -0.00391 77.35841
+H 111.01652 0.90796 78.88716
+H 111.00980 -0.88099 78.89702
+H 111.57347 -0.00001 76.27110
+N 113.57948 0.00668 79.54249
+C 115.02623 0.00169 79.54250
+C 115.54773 0.00695 80.97598
+O 114.81804 0.01433 81.96434
+H 115.37525 -0.89807 79.02455
+H 115.38228 0.89089 79.01455
+H 113.10725 0.01022 80.44214
+N 116.86733 0.00355 81.20889
+C 117.36195 0.00875 82.56846
+C 118.88735 0.00345 82.56847
+O 119.56668 -0.00413 81.54486
+H 116.99455 0.90861 83.07337
+H 116.98750 -0.88034 83.08370
+H 117.55133 -0.00014 80.45754
+N 119.55735 0.00703 83.72893
+C 121.00410 0.00178 83.72895
+C 121.52560 0.00732 85.16243
+O 120.79591 0.01509 86.15078
+H 121.35296 -0.89818 83.21123
+H 121.36031 0.89077 83.20077
+H 119.08512 0.01089 84.62858
+N 122.84520 0.00373 85.39534
+C 123.33982 0.00920 86.75490
+C 124.86521 0.00362 86.75492
+O 125.54455 -0.00435 85.73131
+H 122.97258 0.90926 87.25958
+H 122.96521 -0.87969 87.27037
+H 123.52920 -0.00027 84.64399
+N 125.53522 0.00738 87.91538
+C 126.98196 0.00187 87.91540
+C 127.50347 0.00768 89.34888
+O 126.77378 0.01584 90.33723
+H 127.33066 -0.89828 87.39791
+H 127.33834 0.89066 87.38698
+H 125.06299 0.01156 88.81503
+N 128.82307 0.00392 89.58178
+C 129.31768 0.00965 90.94135
+C 130.84308 0.00379 90.94136
+O 131.52242 -0.00456 89.91776
+H 128.95061 0.90990 91.44580
+H 128.94292 -0.87904 91.45705
+H 129.50707 -0.00040 88.83044
+N 131.51309 0.00773 92.10183
+C 132.95983 0.00196 92.10184
+C 133.48134 0.00805 93.53532
+O 132.75165 0.01660 94.52367
+H 133.30836 -0.89839 91.58459
+H 133.31636 0.89055 91.57320
+H 131.04086 0.01223 93.00148
+N 134.80093 0.00411 93.76823
+C 135.29555 0.01010 95.12779
+C 136.82095 0.00397 95.12781
+O 137.50028 -0.00478 94.10421
+H 134.92865 0.91055 95.63201
+H 134.92062 -0.87839 95.64373
+H 135.48493 -0.00054 93.01689
+N 137.49096 0.00809 96.28827
+C 138.93770 0.00205 96.28829
+C 139.45920 0.00841 97.72177
+O 138.72952 0.01735 98.71011
+H 139.28607 -0.89850 95.77127
+H 139.29439 0.89044 95.75942
+H 137.01873 0.01290 97.18792
+N 140.77880 0.00429 97.95468
+C 141.27342 0.01055 99.31424
+C 142.79881 0.00414 99.31426
+O 143.47815 -0.00500 98.29065
+H 140.90668 0.91120 99.81822
+H 140.89833 -0.87774 99.83040
+H 141.46280 -0.00067 97.20334
+N 143.46882 0.00844 100.47472
+C 144.91556 0.00214 100.47474
+C 145.43707 0.00878 101.90822
+O 144.70739 0.01810 102.89656
+H 145.26377 -0.89861 99.95795
+H 145.27242 0.89032 99.94564
+H 142.99659 0.01357 101.37437
+N 146.75667 0.00448 102.14113
+C 147.25129 0.01100 103.50069
+C 148.77668 0.00431 103.50071
+O 149.45601 -0.00521 102.47710
+H 146.88471 0.91184 104.00443
+H 146.87604 -0.87709 104.01708
+H 147.44066 -0.00080 101.38979
+N 149.44669 0.00879 104.66117
+C 150.89343 0.00222 104.66119
+C 151.41494 0.00915 106.09466
+O 150.68526 0.01886 107.08300
+H 151.24147 -0.89872 104.14463
+H 151.25045 0.89021 104.13186
+H 148.97446 0.01424 105.56081
+N 152.73454 0.00467 106.32757
+C 153.22916 0.01145 107.68713
+C 154.75455 0.00448 107.68715
+O 155.43388 -0.00543 106.66356
+H 152.86274 0.91249 108.19065
+H 152.85375 -0.87644 108.20375
+H 153.41853 -0.00093 105.57624
+N 155.42456 0.00914 108.84761
+C 156.87130 0.00231 108.84764
+C 157.39281 0.00951 110.28111
+O 156.66313 0.01961 111.26945
+H 157.21918 -0.89883 108.33132
+H 157.22847 0.89010 108.31807
+H 154.95233 0.01491 109.74726
+N 158.71240 0.00485 110.51402
+C 159.20702 0.01190 111.87358
+C 160.73242 0.00465 111.87360
+O 161.41174 -0.00564 110.85001
+H 158.84077 0.91314 112.37686
+H 158.83145 -0.87578 112.39043
+H 159.39640 -0.00106 109.76269
+N 161.40243 0.00949 113.03406
+C 162.84916 0.00240 113.03408
+C 163.37068 0.00988 114.46756
+O 162.64100 0.02037 115.45589
+H 163.19688 -0.89893 112.51800
+H 163.20650 0.88998 112.50429
+H 160.93020 0.01558 113.93370
+N 164.69027 0.00504 114.70047
+C 165.18489 0.01235 116.06002
+C 166.71028 0.00483 116.06005
+O 167.38961 -0.00586 115.03646
+H 164.81880 0.91378 116.56307
+H 164.80916 -0.87513 116.57711
+H 165.37426 -0.00120 113.94913
+N 167.38029 0.00984 117.22051
+C 168.82703 0.00249 117.22053
+C 169.34854 0.01024 118.65400
+O 168.61887 0.02112 119.64233
+H 169.17458 -0.89904 116.70468
+H 169.18453 0.88987 116.69051
+H 166.90807 0.01625 118.12015
+N 170.66814 0.00523 118.88692
+C 171.16276 0.01280 120.24647
+C 172.68815 0.00500 120.24650
+O 173.36747 -0.00608 119.22291
+H 170.79684 0.91443 120.74928
+H 170.78687 -0.87448 120.76378
+H 171.35213 -0.00133 118.13558
+N 173.35816 0.01019 121.40695
+C 174.80490 0.00258 121.40698
+C 175.32641 0.01061 122.84045
+O 174.59674 0.02188 123.82878
+H 175.15229 -0.89915 120.89136
+H 175.16256 0.88976 120.87673
+H 172.88594 0.01692 122.30659
+N 176.64600 0.00541 123.07336
+C 177.14063 0.01325 124.43291
+C 178.66602 0.00517 124.43295
+O 179.34534 -0.00629 123.40936
+H 176.77487 0.91507 124.93549
+H 176.76457 -0.87383 124.95046
+H 177.32999 -0.00146 122.32203
+N 179.33603 0.01055 125.59340
+C 180.78276 0.00267 125.59343
+C 181.30428 0.01097 127.02689
+O 180.57461 0.02263 128.01522
+H 181.12999 -0.89926 125.07804
+H 181.14058 0.88964 125.06295
+H 178.86381 0.01759 126.49303
+N 182.62387 0.00560 127.25981
+C 183.11850 0.01370 128.61936
+C 184.64388 0.00534 128.61939
+O 185.32320 -0.00651 127.59581
+H 182.75290 0.91572 129.12171
+H 182.74228 -0.87318 129.13713
+H 183.30786 -0.00159 126.50848
+N 185.31390 0.01090 129.77984
+C 186.76063 0.00276 129.77988
+C 187.28215 0.01134 131.21334
+O 186.55248 0.02339 132.20166
+H 187.10769 -0.89936 129.26473
+H 187.11861 0.88953 129.24917
+H 184.84168 0.01826 130.67948
+N 188.60174 0.00579 131.44626
+C 189.09637 0.01415 132.80581
+C 190.62175 0.00552 132.80584
+O 191.30107 -0.00672 131.78226
+H 188.73093 0.91636 133.30792
+H 188.71999 -0.87253 133.32381
+H 189.28573 -0.00173 130.69493
+N 191.29177 0.01125 133.96629
+C 192.73849 0.00285 133.96633
+C 193.26002 0.01171 135.39979
+O 192.53035 0.02414 136.38810
+H 193.08539 -0.89947 133.45141
+H 193.09664 0.88942 133.43538
+H 190.81955 0.01893 134.86592
+N 194.57960 0.00597 135.63271
+C 195.07423 0.01459 136.99225
+C 196.59962 0.00569 136.99229
+O 197.27893 -0.00694 135.96871
+H 194.70896 0.91701 137.49413
+H 194.69770 -0.87188 137.51048
+H 195.26359 -0.00186 134.88138
+N 197.26963 0.01160 138.15274
+C 198.71636 0.00294 138.15278
+C 199.23788 0.01207 139.58623
+O 198.50822 0.02489 140.57455
+H 199.06310 -0.89958 137.63809
+H 199.07467 0.88930 137.62160
+H 196.79742 0.01960 139.05237
+N 200.55747 0.00616 139.81915
+C 201.05210 0.01504 141.17870
+C 202.57748 0.00586 141.17874
+O 203.25680 -0.00716 140.15516
+H 200.68700 0.91766 141.68034
+H 200.67540 -0.87122 141.69716
+H 201.24146 -0.00199 139.06783
+N 203.24750 0.01195 142.33918
+C 204.69423 0.00303 142.33922
+C 205.21575 0.01244 143.77268
+O 204.48609 0.02565 144.76099
+H 205.04080 -0.89969 141.82477
+H 205.05269 0.88919 141.80782
+H 202.77529 0.02027 143.23881
+N 206.53534 0.00635 144.00560
+C 207.02997 0.01549 145.36514
+C 208.55535 0.00603 145.36518
+O 209.23466 -0.00737 144.34161
+H 206.66503 0.91830 145.86655
+H 206.65311 -0.87057 145.88383
+H 207.21932 -0.00212 143.25428
+N 209.22537 0.01230 146.52563
+C 210.67209 0.00311 146.52567
+C 211.19362 0.01280 147.95912
+O 210.46396 0.02640 148.94743
+H 211.01850 -0.89979 146.01145
+H 211.03072 0.88908 145.99404
+H 208.75315 0.02094 147.42526
+N 212.51321 0.00653 148.19205
+C 213.00784 0.01594 149.55159
+C 214.53322 0.00621 149.55163
+O 215.21252 -0.00759 148.52806
+H 212.64306 0.91895 150.05276
+H 212.63082 -0.86992 150.07051
+H 213.19719 -0.00225 147.44073
+N 215.20324 0.01266 150.71208
+C 216.64996 0.00320 150.71212
+C 217.17149 0.01317 152.14557
+O 216.44183 0.02716 153.13388
+H 216.99620 -0.89990 150.19814
+H 217.00875 0.88896 150.18026
+H 214.73102 0.02161 151.61170
+N 218.49107 0.00672 152.37850
+C 218.98571 0.01639 153.73803
+C 220.51108 0.00638 153.73808
+O 221.19039 -0.00781 152.71451
+H 218.62109 0.91959 154.23898
+H 218.60853 -0.86927 154.25718
+H 219.17505 -0.00239 151.62718
+N 221.18111 0.01301 154.89852
+C 222.62783 0.00329 154.89857
+C 223.14936 0.01354 156.33202
+O 222.41970 0.02791 157.32032
+H 222.97391 -0.90001 154.38482
+H 222.98678 0.88885 154.36648
+H 220.70889 0.02228 155.79814
+N 224.46894 0.00691 156.56495
+C 224.96358 0.01684 157.92448
+C 226.48895 0.00655 157.92453
+O 227.16825 -0.00802 156.90097
+H 224.59913 0.92024 158.42519
+H 224.58624 -0.86861 158.44386
+H 225.15292 -0.00252 155.81363
+N 227.15897 0.01336 159.08497
+C 228.60569 0.00338 159.08502
+C 229.12722 0.01390 160.51846
+O 228.39757 0.02867 161.50676
+H 228.95161 -0.90011 158.57150
+H 228.96480 0.88873 158.55270
+H 226.68676 0.02295 159.98459
+N 230.44681 0.00709 160.75139
+C 230.94145 0.01729 162.11092
+C 232.46682 0.00672 162.11098
+O 233.14612 -0.00824 161.08742
+H 230.57716 0.92088 162.61140
+H 230.56394 -0.86796 162.63053
+H 231.13078 -0.00265 160.00008
+N 233.13684 0.01371 163.27141
+C 234.58356 0.00347 163.27147
+C 235.10509 0.01427 164.70491
+O 234.37544 0.02942 165.69320
+H 234.92931 -0.90022 162.75819
+H 234.94283 0.88862 162.73892
+H 232.66463 0.02362 164.17103
+N 236.42467 0.00728 164.93784
+C 236.91932 0.01774 166.29737
+C 238.44468 0.00690 166.29742
+O 239.12398 -0.00845 165.27387
+H 236.55519 0.92153 166.79761
+H 236.54165 -0.86731 166.81721
+H 237.10865 -0.00278 164.18653
+N 239.11471 0.01406 167.45786
+C 240.56142 0.00356 167.45792
+C 241.08296 0.01463 168.89136
+O 240.35331 0.03017 169.87964
+H 240.90701 -0.90033 166.94487
+H 240.92086 0.88851 166.92514
+H 238.64250 0.02429 168.35747
+N 242.40254 0.00747 169.12429
+C 242.89718 0.01819 170.48381
+C 244.42255 0.00707 170.48387
+O 245.10185 -0.00867 169.46032
+H 242.53322 0.92217 170.98382
+H 242.51936 -0.86666 171.00388
+H 243.08651 -0.00291 168.37298
+N 245.09258 0.01441 171.64431
+C 246.53929 0.00365 171.64436
+C 247.06083 0.01500 173.07780
+O 246.33118 0.03093 174.06609
+H 246.88472 -0.90043 171.13155
+H 246.89888 0.88839 171.11136
+H 244.62037 0.02496 172.54392
+N 248.38041 0.00765 173.31074
+C 248.87505 0.01864 174.67026
+C 250.40042 0.00724 174.67032
+O 251.07971 -0.00889 173.64677
+H 248.51126 0.92282 175.17003
+H 248.49707 -0.86600 175.19056
+H 249.06438 -0.00305 172.55943
+N 251.07045 0.01476 175.83075
+C 252.51716 0.00374 175.83081
+C 253.03870 0.01536 177.26425
+O 252.30905 0.03168 178.25253
+H 252.86242 -0.90054 175.31824
+H 252.87691 0.88828 175.29758
+H 250.59824 0.02563 176.73036
+N 254.35827 0.00784 177.49718
+C 254.85292 0.01909 178.85670
+C 256.37828 0.00741 178.85677
+O 257.05757 -0.00910 177.83323
+H 254.48929 0.92346 179.35624
+H 254.47478 -0.86535 179.37723
+H 255.04224 -0.00318 176.74588
+N 257.04831 0.01512 180.01720
+C 258.49502 0.00383 180.01726
+C 259.01656 0.01573 181.45069
+O 258.28693 0.03244 182.43897
+H 258.84012 -0.90065 179.50492
+H 258.85494 0.88816 179.48380
+H 256.57611 0.02630 180.91680
+N 260.33614 0.00803 181.68363
+C 260.83079 0.01954 183.04315
+C 262.35615 0.00759 183.04322
+O 263.03544 -0.00932 182.01968
+H 260.46732 0.92411 183.54245
+H 260.45249 -0.86470 183.56390
+H 261.02011 -0.00331 180.93233
+N 263.02618 0.01547 184.20364
+C 264.47289 0.00392 184.20371
+C 264.99443 0.01610 185.63714
+O 264.26480 0.03319 186.62541
+H 264.81782 -0.90075 183.69160
+H 264.83296 0.88805 183.67002
+H 262.55398 0.02697 185.10325
+N 266.31401 0.00821 185.87008
+C 266.80866 0.01999 187.22959
+C 268.33402 0.00776 187.22966
+O 269.01330 -0.00953 186.20613
+H 266.44536 0.92475 187.72866
+H 266.43019 -0.86405 187.75058
+H 266.99797 -0.00344 185.11879
+N 269.00405 0.01582 188.39009
+C 270.45076 0.00400 188.39016
+C 270.97230 0.01646 189.82358
+O 270.24267 0.03395 190.81185
+H 270.79552 -0.90086 187.87829
+H 270.81099 0.88793 187.85624
+H 268.53185 0.02764 189.28969
+N 272.29187 0.00840 190.05653
+C 272.78653 0.02043 191.41604
+C 274.31188 0.00793 191.41611
+O 274.99116 -0.00975 190.39258
+H 272.42339 0.92540 191.91487
+H 272.40790 -0.86339 191.93725
+H 272.97584 -0.00358 189.30524
+N 274.98192 0.01617 192.57654
+C 276.42862 0.00409 192.57661
+C 276.95017 0.01683 194.01003
+O 276.22054 0.03470 194.99829
+H 276.77322 -0.90097 192.06497
+H 276.78902 0.88782 192.04246
+H 274.50972 0.02832 193.47613
+N 278.26974 0.00859 194.24298
+C 278.76440 0.02088 195.60248
+C 280.28975 0.00810 195.60256
+O 280.96903 -0.00997 194.57904
+H 278.40142 0.92604 196.10108
+H 278.38561 -0.86274 196.12393
+H 278.95370 -0.00371 193.49169
+N 280.95979 0.01652 196.76298
+C 282.40649 0.00418 196.76306
+C 282.92804 0.01719 198.19648
+O 282.19841 0.03545 199.18473
+H 282.75093 -0.90107 196.25165
+H 282.76704 0.88770 196.22868
+H 280.48759 0.02899 197.66258
+N 284.24761 0.00877 198.42942
+C 284.74227 0.02133 199.78893
+C 286.26762 0.00828 199.78901
+O 286.94689 -0.01018 198.76549
+H 284.37946 0.92668 200.28729
+H 284.36332 -0.86209 200.31060
+H 284.93157 -0.00384 197.67814
+N 286.93765 0.01687 200.94943
+C 288.38435 0.00427 200.94951
+C 288.90591 0.01756 202.38292
+O 288.17628 0.03621 203.37118
+H 288.72863 -0.90118 200.43834
+H 288.74507 0.88759 200.41490
+H 286.46546 0.02966 201.84902
+N 290.22547 0.00896 202.61587
+C 290.72013 0.02178 203.97537
+C 292.24548 0.00845 203.97546
+O 292.92475 -0.01040 202.95194
+H 290.35749 0.92733 204.47350
+H 290.34103 -0.86143 204.49727
+H 290.90943 -0.00397 201.86459
+N 292.91552 0.01723 205.13587
+C 294.36222 0.00436 205.13596
+C 294.88377 0.01792 206.56937
+O 294.15415 0.03696 207.55762
+H 294.70633 -0.90128 204.62502
+H 294.72309 0.88747 204.60112
+H 292.44334 0.03033 206.03546
+N 296.20334 0.00915 206.80232
+C 296.69800 0.02223 208.16182
+C 298.22335 0.00862 208.16190
+O 298.90262 -0.01061 207.13840
+H 296.33552 0.92797 208.65971
+H 296.31874 -0.86078 208.68395
+H 296.88729 -0.00410 206.05104
+O 298.82471 0.01882 209.37164
+H 298.23643 0.03548 210.25806
diff --git a/benchmarks/molecules/gly/gly110.xyz b/benchmarks/molecules/gly/gly110.xyz
new file mode 100644
index 00000000..1a43212b
--- /dev/null
+++ b/benchmarks/molecules/gly/gly110.xyz
@@ -0,0 +1,775 @@
+773
+
+N 0.00000 0.00000 0.00000
+C 1.44675 0.00000 0.00000
+C 1.96825 0.00000 1.43350
+O 1.23855 0.00000 2.42187
+H 1.79887 -0.89599 -0.52238
+H 1.79973 0.89301 -0.52356
+H -0.47223 -0.00252 0.89965
+H -0.50800 0.07669 -0.87653
+N 3.28785 -0.00000 1.66639
+C 3.78246 0.00022 3.02597
+C 5.30787 0.00017 3.02597
+O 5.98722 -0.00002 2.00234
+H 3.41197 0.89631 3.53531
+H 3.41109 -0.89269 3.53683
+H 3.97186 0.00237 0.91504
+N 5.97787 0.00035 4.18645
+C 7.42462 0.00009 4.18645
+C 7.94612 0.00037 5.61994
+O 7.21641 0.00075 6.60831
+H 7.77658 -0.89610 3.66430
+H 7.77776 0.89290 3.66265
+H 5.50563 -0.00185 5.08610
+N 9.26572 0.00019 5.85284
+C 9.76033 0.00067 7.21242
+C 11.28573 0.00034 7.21242
+O 11.96509 -0.00024 6.18879
+H 9.39000 0.89695 7.72152
+H 9.38879 -0.89204 7.72351
+H 9.94972 0.00224 5.10149
+N 11.95573 0.00070 8.37289
+C 13.40249 0.00018 8.37289
+C 13.92398 0.00073 9.80639
+O 13.19428 0.00151 10.79476
+H 13.75428 -0.89621 7.85098
+H 13.75579 0.89279 7.84887
+H 11.48350 -0.00118 9.27255
+N 15.24359 0.00037 10.03929
+C 15.73819 0.00112 11.39887
+C 17.26360 0.00052 11.39887
+O 17.94295 -0.00046 10.37523
+H 15.36803 0.89760 11.90774
+H 15.36650 -0.89139 11.91018
+H 15.92759 0.00211 9.28794
+N 17.93360 0.00105 12.55934
+C 19.38036 0.00027 12.55934
+C 19.90185 0.00110 13.99284
+O 19.17215 0.00226 14.98121
+H 19.73199 -0.89632 12.03766
+H 19.73382 0.89267 12.03508
+H 17.46137 -0.00051 13.45900
+N 21.22146 0.00056 14.22573
+C 21.71606 0.00157 15.58531
+C 23.24147 0.00069 15.58531
+O 23.92082 -0.00067 14.56168
+H 21.34606 0.89825 16.09395
+H 21.34421 -0.89074 16.09686
+H 21.90546 0.00198 13.47438
+N 23.91147 0.00141 16.74579
+C 25.35822 0.00036 16.74579
+C 25.87972 0.00146 18.17928
+O 25.15002 0.00302 19.16765
+H 25.70969 -0.89643 16.22434
+H 25.71185 0.89256 16.22130
+H 23.43923 0.00016 17.64544
+N 27.19932 0.00075 18.41218
+C 27.69393 0.00202 19.77176
+C 29.21934 0.00086 19.77176
+O 29.89869 -0.00089 18.74813
+H 27.32409 0.89890 20.28017
+H 27.32191 -0.89009 20.28354
+H 27.88333 0.00184 17.66083
+N 29.88934 0.00176 20.93223
+C 31.33609 0.00044 20.93224
+C 31.85759 0.00183 22.36573
+O 31.12788 0.00377 23.35410
+H 31.68740 -0.89654 20.41102
+H 31.68988 0.89245 20.40752
+H 29.41710 0.00083 21.83189
+N 33.17719 0.00093 22.59863
+C 33.67180 0.00246 23.95821
+C 35.19720 0.00103 23.95821
+O 35.87656 -0.00110 22.93458
+H 33.30212 0.89955 24.46638
+H 33.29962 -0.88944 24.47022
+H 33.86119 0.00171 21.84728
+N 35.86720 0.00211 25.11868
+C 37.31396 0.00053 25.11868
+C 37.83545 0.00219 26.55218
+O 37.10575 0.00453 27.54055
+H 37.66510 -0.89665 24.59770
+H 37.66791 0.89234 24.59373
+H 35.39497 0.00150 26.01834
+N 39.15506 0.00112 26.78507
+C 39.64966 0.00291 28.14465
+C 41.17507 0.00121 28.14466
+O 41.85442 -0.00132 27.12102
+H 39.28015 0.90019 28.65260
+H 39.27732 -0.88879 28.65690
+H 39.83906 0.00158 26.03372
+N 41.84507 0.00246 29.30513
+C 43.29182 0.00062 29.30513
+C 43.81332 0.00256 30.73862
+O 43.08362 0.00528 31.72699
+H 43.64281 -0.89676 28.78438
+H 43.64594 0.89223 28.77995
+H 41.37284 0.00217 30.20478
+N 45.13293 0.00131 30.97152
+C 45.62753 0.00336 32.33110
+C 47.15294 0.00138 32.33110
+O 47.83229 -0.00154 31.30747
+H 45.25818 0.90084 32.83881
+H 45.25503 -0.88814 32.84357
+H 45.81693 0.00145 30.22017
+N 47.82294 0.00281 33.49157
+C 49.26969 0.00071 33.49158
+C 49.79119 0.00293 34.92507
+O 49.06149 0.00603 35.91344
+H 49.62051 -0.89687 32.97106
+H 49.62396 0.89212 32.96616
+H 47.35070 0.00284 34.39123
+N 51.11079 0.00149 35.15797
+C 51.60540 0.00381 36.51755
+C 53.13081 0.00155 36.51755
+O 53.81016 -0.00175 35.49392
+H 51.23621 0.90149 37.02502
+H 51.23273 -0.88749 37.03025
+H 51.79480 0.00131 34.40662
+N 53.80081 0.00316 37.67802
+C 55.24756 0.00080 37.67802
+C 55.76906 0.00329 39.11152
+O 55.03936 0.00679 40.09988
+H 55.59822 -0.89698 37.15774
+H 55.60199 0.89201 37.15238
+H 53.32857 0.00351 38.57768
+N 57.08866 0.00168 39.34442
+C 57.58327 0.00426 40.70399
+C 59.10867 0.00172 40.70400
+O 59.78802 -0.00197 39.68037
+H 57.21424 0.90214 41.21124
+H 57.21044 -0.88684 41.21693
+H 57.77266 0.00118 38.59307
+N 59.77868 0.00352 41.86447
+C 61.22543 0.00089 41.86447
+C 61.74692 0.00366 43.29796
+O 61.01722 0.00754 44.28633
+H 61.57592 -0.89709 41.34442
+H 61.58002 0.89189 41.33860
+H 59.30644 0.00418 42.76412
+N 63.06653 0.00187 43.53086
+C 63.56114 0.00471 44.89044
+C 65.08654 0.00190 44.89044
+O 65.76589 -0.00219 43.86682
+H 63.19227 0.90279 45.39745
+H 63.18815 -0.88619 45.40361
+H 63.75053 0.00105 42.77951
+N 65.75654 0.00387 46.05092
+C 67.20329 0.00098 46.05092
+C 67.72479 0.00402 47.48441
+O 66.99509 0.00830 48.47278
+H 67.55362 -0.89720 45.53110
+H 67.55805 0.89178 45.52481
+H 65.28431 0.00485 46.95057
+N 69.04439 0.00205 47.71731
+C 69.53900 0.00516 49.07689
+C 71.06441 0.00207 49.07689
+O 71.74376 -0.00240 48.05327
+H 69.17030 0.90343 49.58367
+H 69.16585 -0.88554 49.59028
+H 69.72840 0.00092 46.96596
+N 71.73441 0.00422 50.23736
+C 73.18116 0.00107 50.23737
+C 73.70266 0.00439 51.67086
+O 72.97296 0.00905 52.65922
+H 73.53133 -0.89731 49.71778
+H 73.53608 0.89167 49.71103
+H 71.26217 0.00552 51.13702
+N 75.02226 0.00224 51.90376
+C 75.51687 0.00561 53.26333
+C 77.04228 0.00224 53.26334
+O 77.72162 -0.00262 52.23971
+H 75.14833 0.90408 53.76988
+H 75.14356 -0.88489 53.77696
+H 75.70627 0.00079 51.15241
+N 77.71228 0.00457 54.42381
+C 79.15903 0.00116 54.42381
+C 79.68053 0.00476 55.85730
+O 78.95083 0.00981 56.84567
+H 79.50903 -0.89741 53.90446
+H 79.51411 0.89156 53.89725
+H 77.24004 0.00619 55.32346
+N 81.00013 0.00243 56.09020
+C 81.49474 0.00606 57.44978
+C 83.02014 0.00241 57.44979
+O 83.69949 -0.00283 56.42616
+H 81.12636 0.90473 57.95609
+H 81.12127 -0.88424 57.96364
+H 81.68413 0.00065 55.33886
+N 83.69015 0.00492 58.61026
+C 85.13689 0.00125 58.61026
+C 85.65839 0.00512 60.04375
+O 84.92870 0.01056 61.03211
+H 85.48674 -0.89752 58.09114
+H 85.49214 0.89145 58.08346
+H 83.21791 0.00686 59.50991
+N 86.97800 0.00261 60.27665
+C 87.47261 0.00651 61.63623
+C 88.99801 0.00259 61.63623
+O 89.67735 -0.00305 60.61261
+H 87.10439 0.90538 62.14231
+H 87.09897 -0.88359 62.15031
+H 87.66200 0.00052 59.52530
+N 89.66801 0.00527 62.79670
+C 91.11476 0.00133 62.79671
+C 91.63626 0.00549 64.23020
+O 90.90657 0.01132 65.21856
+H 91.46444 -0.89763 62.27782
+H 91.47017 0.89134 62.26968
+H 89.19578 0.00753 63.69636
+N 92.95586 0.00280 64.46310
+C 93.45047 0.00696 65.82267
+C 94.97588 0.00276 65.82268
+O 95.65522 -0.00327 64.79906
+H 93.08243 0.90602 66.32852
+H 93.07668 -0.88294 66.33699
+H 93.63987 0.00039 63.71175
+N 95.64588 0.00562 66.98315
+C 97.09263 0.00142 66.98316
+C 97.61413 0.00585 68.41664
+O 96.88444 0.01207 69.40500
+H 97.44214 -0.89774 66.46450
+H 97.44819 0.89122 66.45590
+H 95.17365 0.00820 67.88280
+N 98.93373 0.00299 68.64955
+C 99.42834 0.00741 70.00912
+C 100.95374 0.00293 70.00913
+O 101.63309 -0.00348 68.98551
+H 99.06046 0.90667 70.51473
+H 99.05438 -0.88229 70.52367
+H 99.61773 0.00026 67.89820
+N 101.62375 0.00598 71.16959
+C 103.07049 0.00151 71.16961
+C 103.59200 0.00622 72.60309
+O 102.86230 0.01282 73.59145
+H 103.41985 -0.89785 70.65118
+H 103.42622 0.89111 70.64212
+H 101.15152 0.00887 72.06925
+N 104.91160 0.00317 72.83599
+C 105.40621 0.00786 74.19556
+C 106.93161 0.00310 74.19557
+O 107.61095 -0.00370 73.17196
+H 105.03849 0.90732 74.70095
+H 105.03209 -0.88164 74.71034
+H 105.59560 0.00013 72.08465
+N 107.60162 0.00633 75.35604
+C 109.04836 0.00160 75.35605
+C 109.56986 0.00658 76.78954
+O 108.84017 0.01358 77.77789
+H 109.39755 -0.89796 74.83787
+H 109.40425 0.89100 74.82833
+H 107.12938 0.00955 76.25569
+N 110.88947 0.00336 77.02244
+C 111.38408 0.00831 78.38201
+C 112.90948 0.00328 78.38202
+O 113.58882 -0.00391 77.35841
+H 111.01652 0.90796 78.88716
+H 111.00980 -0.88099 78.89702
+H 111.57347 -0.00001 76.27110
+N 113.57948 0.00668 79.54249
+C 115.02623 0.00169 79.54250
+C 115.54773 0.00695 80.97598
+O 114.81804 0.01433 81.96434
+H 115.37525 -0.89807 79.02455
+H 115.38228 0.89089 79.01455
+H 113.10725 0.01022 80.44214
+N 116.86733 0.00355 81.20889
+C 117.36195 0.00875 82.56846
+C 118.88735 0.00345 82.56847
+O 119.56668 -0.00413 81.54486
+H 116.99455 0.90861 83.07337
+H 116.98750 -0.88034 83.08370
+H 117.55133 -0.00014 80.45754
+N 119.55735 0.00703 83.72893
+C 121.00410 0.00178 83.72895
+C 121.52560 0.00732 85.16243
+O 120.79591 0.01509 86.15078
+H 121.35296 -0.89818 83.21123
+H 121.36031 0.89077 83.20077
+H 119.08512 0.01089 84.62858
+N 122.84520 0.00373 85.39534
+C 123.33982 0.00920 86.75490
+C 124.86521 0.00362 86.75492
+O 125.54455 -0.00435 85.73131
+H 122.97258 0.90926 87.25958
+H 122.96521 -0.87969 87.27037
+H 123.52920 -0.00027 84.64399
+N 125.53522 0.00738 87.91538
+C 126.98196 0.00187 87.91540
+C 127.50347 0.00768 89.34888
+O 126.77378 0.01584 90.33723
+H 127.33066 -0.89828 87.39791
+H 127.33834 0.89066 87.38698
+H 125.06299 0.01156 88.81503
+N 128.82307 0.00392 89.58178
+C 129.31768 0.00965 90.94135
+C 130.84308 0.00379 90.94136
+O 131.52242 -0.00456 89.91776
+H 128.95061 0.90990 91.44580
+H 128.94292 -0.87904 91.45705
+H 129.50707 -0.00040 88.83044
+N 131.51309 0.00773 92.10183
+C 132.95983 0.00196 92.10184
+C 133.48134 0.00805 93.53532
+O 132.75165 0.01660 94.52367
+H 133.30836 -0.89839 91.58459
+H 133.31636 0.89055 91.57320
+H 131.04086 0.01223 93.00148
+N 134.80093 0.00411 93.76823
+C 135.29555 0.01010 95.12779
+C 136.82095 0.00397 95.12781
+O 137.50028 -0.00478 94.10421
+H 134.92865 0.91055 95.63201
+H 134.92062 -0.87839 95.64373
+H 135.48493 -0.00054 93.01689
+N 137.49096 0.00809 96.28827
+C 138.93770 0.00205 96.28829
+C 139.45920 0.00841 97.72177
+O 138.72952 0.01735 98.71011
+H 139.28607 -0.89850 95.77127
+H 139.29439 0.89044 95.75942
+H 137.01873 0.01290 97.18792
+N 140.77880 0.00429 97.95468
+C 141.27342 0.01055 99.31424
+C 142.79881 0.00414 99.31426
+O 143.47815 -0.00500 98.29065
+H 140.90668 0.91120 99.81822
+H 140.89833 -0.87774 99.83040
+H 141.46280 -0.00067 97.20334
+N 143.46882 0.00844 100.47472
+C 144.91556 0.00214 100.47474
+C 145.43707 0.00878 101.90822
+O 144.70739 0.01810 102.89656
+H 145.26377 -0.89861 99.95795
+H 145.27242 0.89032 99.94564
+H 142.99659 0.01357 101.37437
+N 146.75667 0.00448 102.14113
+C 147.25129 0.01100 103.50069
+C 148.77668 0.00431 103.50071
+O 149.45601 -0.00521 102.47710
+H 146.88471 0.91184 104.00443
+H 146.87604 -0.87709 104.01708
+H 147.44066 -0.00080 101.38979
+N 149.44669 0.00879 104.66117
+C 150.89343 0.00222 104.66119
+C 151.41494 0.00915 106.09466
+O 150.68526 0.01886 107.08300
+H 151.24147 -0.89872 104.14463
+H 151.25045 0.89021 104.13186
+H 148.97446 0.01424 105.56081
+N 152.73454 0.00467 106.32757
+C 153.22916 0.01145 107.68713
+C 154.75455 0.00448 107.68715
+O 155.43388 -0.00543 106.66356
+H 152.86274 0.91249 108.19065
+H 152.85375 -0.87644 108.20375
+H 153.41853 -0.00093 105.57624
+N 155.42456 0.00914 108.84761
+C 156.87130 0.00231 108.84764
+C 157.39281 0.00951 110.28111
+O 156.66313 0.01961 111.26945
+H 157.21918 -0.89883 108.33132
+H 157.22847 0.89010 108.31807
+H 154.95233 0.01491 109.74726
+N 158.71240 0.00485 110.51402
+C 159.20702 0.01190 111.87358
+C 160.73242 0.00465 111.87360
+O 161.41174 -0.00564 110.85001
+H 158.84077 0.91314 112.37686
+H 158.83145 -0.87578 112.39043
+H 159.39640 -0.00106 109.76269
+N 161.40243 0.00949 113.03406
+C 162.84916 0.00240 113.03408
+C 163.37068 0.00988 114.46756
+O 162.64100 0.02037 115.45589
+H 163.19688 -0.89893 112.51800
+H 163.20650 0.88998 112.50429
+H 160.93020 0.01558 113.93370
+N 164.69027 0.00504 114.70047
+C 165.18489 0.01235 116.06002
+C 166.71028 0.00483 116.06005
+O 167.38961 -0.00586 115.03646
+H 164.81880 0.91378 116.56307
+H 164.80916 -0.87513 116.57711
+H 165.37426 -0.00120 113.94913
+N 167.38029 0.00984 117.22051
+C 168.82703 0.00249 117.22053
+C 169.34854 0.01024 118.65400
+O 168.61887 0.02112 119.64233
+H 169.17458 -0.89904 116.70468
+H 169.18453 0.88987 116.69051
+H 166.90807 0.01625 118.12015
+N 170.66814 0.00523 118.88692
+C 171.16276 0.01280 120.24647
+C 172.68815 0.00500 120.24650
+O 173.36747 -0.00608 119.22291
+H 170.79684 0.91443 120.74928
+H 170.78687 -0.87448 120.76378
+H 171.35213 -0.00133 118.13558
+N 173.35816 0.01019 121.40695
+C 174.80490 0.00258 121.40698
+C 175.32641 0.01061 122.84045
+O 174.59674 0.02188 123.82878
+H 175.15229 -0.89915 120.89136
+H 175.16256 0.88976 120.87673
+H 172.88594 0.01692 122.30659
+N 176.64600 0.00541 123.07336
+C 177.14063 0.01325 124.43291
+C 178.66602 0.00517 124.43295
+O 179.34534 -0.00629 123.40936
+H 176.77487 0.91507 124.93549
+H 176.76457 -0.87383 124.95046
+H 177.32999 -0.00146 122.32203
+N 179.33603 0.01055 125.59340
+C 180.78276 0.00267 125.59343
+C 181.30428 0.01097 127.02689
+O 180.57461 0.02263 128.01522
+H 181.12999 -0.89926 125.07804
+H 181.14058 0.88964 125.06295
+H 178.86381 0.01759 126.49303
+N 182.62387 0.00560 127.25981
+C 183.11850 0.01370 128.61936
+C 184.64388 0.00534 128.61939
+O 185.32320 -0.00651 127.59581
+H 182.75290 0.91572 129.12171
+H 182.74228 -0.87318 129.13713
+H 183.30786 -0.00159 126.50848
+N 185.31390 0.01090 129.77984
+C 186.76063 0.00276 129.77988
+C 187.28215 0.01134 131.21334
+O 186.55248 0.02339 132.20166
+H 187.10769 -0.89936 129.26473
+H 187.11861 0.88953 129.24917
+H 184.84168 0.01826 130.67948
+N 188.60174 0.00579 131.44626
+C 189.09637 0.01415 132.80581
+C 190.62175 0.00552 132.80584
+O 191.30107 -0.00672 131.78226
+H 188.73093 0.91636 133.30792
+H 188.71999 -0.87253 133.32381
+H 189.28573 -0.00173 130.69493
+N 191.29177 0.01125 133.96629
+C 192.73849 0.00285 133.96633
+C 193.26002 0.01171 135.39979
+O 192.53035 0.02414 136.38810
+H 193.08539 -0.89947 133.45141
+H 193.09664 0.88942 133.43538
+H 190.81955 0.01893 134.86592
+N 194.57960 0.00597 135.63271
+C 195.07423 0.01459 136.99225
+C 196.59962 0.00569 136.99229
+O 197.27893 -0.00694 135.96871
+H 194.70896 0.91701 137.49413
+H 194.69770 -0.87188 137.51048
+H 195.26359 -0.00186 134.88138
+N 197.26963 0.01160 138.15274
+C 198.71636 0.00294 138.15278
+C 199.23788 0.01207 139.58623
+O 198.50822 0.02489 140.57455
+H 199.06310 -0.89958 137.63809
+H 199.07467 0.88930 137.62160
+H 196.79742 0.01960 139.05237
+N 200.55747 0.00616 139.81915
+C 201.05210 0.01504 141.17870
+C 202.57748 0.00586 141.17874
+O 203.25680 -0.00716 140.15516
+H 200.68700 0.91766 141.68034
+H 200.67540 -0.87122 141.69716
+H 201.24146 -0.00199 139.06783
+N 203.24750 0.01195 142.33918
+C 204.69423 0.00303 142.33922
+C 205.21575 0.01244 143.77268
+O 204.48609 0.02565 144.76099
+H 205.04080 -0.89969 141.82477
+H 205.05269 0.88919 141.80782
+H 202.77529 0.02027 143.23881
+N 206.53534 0.00635 144.00560
+C 207.02997 0.01549 145.36514
+C 208.55535 0.00603 145.36518
+O 209.23466 -0.00737 144.34161
+H 206.66503 0.91830 145.86655
+H 206.65311 -0.87057 145.88383
+H 207.21932 -0.00212 143.25428
+N 209.22537 0.01230 146.52563
+C 210.67209 0.00311 146.52567
+C 211.19362 0.01280 147.95912
+O 210.46396 0.02640 148.94743
+H 211.01850 -0.89979 146.01145
+H 211.03072 0.88908 145.99404
+H 208.75315 0.02094 147.42526
+N 212.51321 0.00653 148.19205
+C 213.00784 0.01594 149.55159
+C 214.53322 0.00621 149.55163
+O 215.21252 -0.00759 148.52806
+H 212.64306 0.91895 150.05276
+H 212.63082 -0.86992 150.07051
+H 213.19719 -0.00225 147.44073
+N 215.20324 0.01266 150.71208
+C 216.64996 0.00320 150.71212
+C 217.17149 0.01317 152.14557
+O 216.44183 0.02716 153.13388
+H 216.99620 -0.89990 150.19814
+H 217.00875 0.88896 150.18026
+H 214.73102 0.02161 151.61170
+N 218.49107 0.00672 152.37850
+C 218.98571 0.01639 153.73803
+C 220.51108 0.00638 153.73808
+O 221.19039 -0.00781 152.71451
+H 218.62109 0.91959 154.23898
+H 218.60853 -0.86927 154.25718
+H 219.17505 -0.00239 151.62718
+N 221.18111 0.01301 154.89852
+C 222.62783 0.00329 154.89857
+C 223.14936 0.01354 156.33202
+O 222.41970 0.02791 157.32032
+H 222.97391 -0.90001 154.38482
+H 222.98678 0.88885 154.36648
+H 220.70889 0.02228 155.79814
+N 224.46894 0.00691 156.56495
+C 224.96358 0.01684 157.92448
+C 226.48895 0.00655 157.92453
+O 227.16825 -0.00802 156.90097
+H 224.59913 0.92024 158.42519
+H 224.58624 -0.86861 158.44386
+H 225.15292 -0.00252 155.81363
+N 227.15897 0.01336 159.08497
+C 228.60569 0.00338 159.08502
+C 229.12722 0.01390 160.51846
+O 228.39757 0.02867 161.50676
+H 228.95161 -0.90011 158.57150
+H 228.96480 0.88873 158.55270
+H 226.68676 0.02295 159.98459
+N 230.44681 0.00709 160.75139
+C 230.94145 0.01729 162.11092
+C 232.46682 0.00672 162.11098
+O 233.14612 -0.00824 161.08742
+H 230.57716 0.92088 162.61140
+H 230.56394 -0.86796 162.63053
+H 231.13078 -0.00265 160.00008
+N 233.13684 0.01371 163.27141
+C 234.58356 0.00347 163.27147
+C 235.10509 0.01427 164.70491
+O 234.37544 0.02942 165.69320
+H 234.92931 -0.90022 162.75819
+H 234.94283 0.88862 162.73892
+H 232.66463 0.02362 164.17103
+N 236.42467 0.00728 164.93784
+C 236.91932 0.01774 166.29737
+C 238.44468 0.00690 166.29742
+O 239.12398 -0.00845 165.27387
+H 236.55519 0.92153 166.79761
+H 236.54165 -0.86731 166.81721
+H 237.10865 -0.00278 164.18653
+N 239.11471 0.01406 167.45786
+C 240.56142 0.00356 167.45792
+C 241.08296 0.01463 168.89136
+O 240.35331 0.03017 169.87964
+H 240.90701 -0.90033 166.94487
+H 240.92086 0.88851 166.92514
+H 238.64250 0.02429 168.35747
+N 242.40254 0.00747 169.12429
+C 242.89718 0.01819 170.48381
+C 244.42255 0.00707 170.48387
+O 245.10185 -0.00867 169.46032
+H 242.53322 0.92217 170.98382
+H 242.51936 -0.86666 171.00388
+H 243.08651 -0.00291 168.37298
+N 245.09258 0.01441 171.64431
+C 246.53929 0.00365 171.64436
+C 247.06083 0.01500 173.07780
+O 246.33118 0.03093 174.06609
+H 246.88472 -0.90043 171.13155
+H 246.89888 0.88839 171.11136
+H 244.62037 0.02496 172.54392
+N 248.38041 0.00765 173.31074
+C 248.87505 0.01864 174.67026
+C 250.40042 0.00724 174.67032
+O 251.07971 -0.00889 173.64677
+H 248.51126 0.92282 175.17003
+H 248.49707 -0.86600 175.19056
+H 249.06438 -0.00305 172.55943
+N 251.07045 0.01476 175.83075
+C 252.51716 0.00374 175.83081
+C 253.03870 0.01536 177.26425
+O 252.30905 0.03168 178.25253
+H 252.86242 -0.90054 175.31824
+H 252.87691 0.88828 175.29758
+H 250.59824 0.02563 176.73036
+N 254.35827 0.00784 177.49718
+C 254.85292 0.01909 178.85670
+C 256.37828 0.00741 178.85677
+O 257.05757 -0.00910 177.83323
+H 254.48929 0.92346 179.35624
+H 254.47478 -0.86535 179.37723
+H 255.04224 -0.00318 176.74588
+N 257.04831 0.01512 180.01720
+C 258.49502 0.00383 180.01726
+C 259.01656 0.01573 181.45069
+O 258.28693 0.03244 182.43897
+H 258.84012 -0.90065 179.50492
+H 258.85494 0.88816 179.48380
+H 256.57611 0.02630 180.91680
+N 260.33614 0.00803 181.68363
+C 260.83079 0.01954 183.04315
+C 262.35615 0.00759 183.04322
+O 263.03544 -0.00932 182.01968
+H 260.46732 0.92411 183.54245
+H 260.45249 -0.86470 183.56390
+H 261.02011 -0.00331 180.93233
+N 263.02618 0.01547 184.20364
+C 264.47289 0.00392 184.20371
+C 264.99443 0.01610 185.63714
+O 264.26480 0.03319 186.62541
+H 264.81782 -0.90075 183.69160
+H 264.83296 0.88805 183.67002
+H 262.55398 0.02697 185.10325
+N 266.31401 0.00821 185.87008
+C 266.80866 0.01999 187.22959
+C 268.33402 0.00776 187.22966
+O 269.01330 -0.00953 186.20613
+H 266.44536 0.92475 187.72866
+H 266.43019 -0.86405 187.75058
+H 266.99797 -0.00344 185.11879
+N 269.00405 0.01582 188.39009
+C 270.45076 0.00400 188.39016
+C 270.97230 0.01646 189.82358
+O 270.24267 0.03395 190.81185
+H 270.79552 -0.90086 187.87829
+H 270.81099 0.88793 187.85624
+H 268.53185 0.02764 189.28969
+N 272.29187 0.00840 190.05653
+C 272.78653 0.02043 191.41604
+C 274.31188 0.00793 191.41611
+O 274.99116 -0.00975 190.39258
+H 272.42339 0.92540 191.91487
+H 272.40790 -0.86339 191.93725
+H 272.97584 -0.00358 189.30524
+N 274.98192 0.01617 192.57654
+C 276.42862 0.00409 192.57661
+C 276.95017 0.01683 194.01003
+O 276.22054 0.03470 194.99829
+H 276.77322 -0.90097 192.06497
+H 276.78902 0.88782 192.04246
+H 274.50972 0.02832 193.47613
+N 278.26974 0.00859 194.24298
+C 278.76440 0.02088 195.60248
+C 280.28975 0.00810 195.60256
+O 280.96903 -0.00997 194.57904
+H 278.40142 0.92604 196.10108
+H 278.38561 -0.86274 196.12393
+H 278.95370 -0.00371 193.49169
+N 280.95979 0.01652 196.76298
+C 282.40649 0.00418 196.76306
+C 282.92804 0.01719 198.19648
+O 282.19841 0.03545 199.18473
+H 282.75093 -0.90107 196.25165
+H 282.76704 0.88770 196.22868
+H 280.48759 0.02899 197.66258
+N 284.24761 0.00877 198.42942
+C 284.74227 0.02133 199.78893
+C 286.26762 0.00828 199.78901
+O 286.94689 -0.01018 198.76549
+H 284.37946 0.92668 200.28729
+H 284.36332 -0.86209 200.31060
+H 284.93157 -0.00384 197.67814
+N 286.93765 0.01687 200.94943
+C 288.38435 0.00427 200.94951
+C 288.90591 0.01756 202.38292
+O 288.17628 0.03621 203.37118
+H 288.72863 -0.90118 200.43834
+H 288.74507 0.88759 200.41490
+H 286.46546 0.02966 201.84902
+N 290.22547 0.00896 202.61587
+C 290.72013 0.02178 203.97537
+C 292.24548 0.00845 203.97546
+O 292.92475 -0.01040 202.95194
+H 290.35749 0.92733 204.47350
+H 290.34103 -0.86143 204.49727
+H 290.90943 -0.00397 201.86459
+N 292.91552 0.01723 205.13587
+C 294.36222 0.00436 205.13596
+C 294.88377 0.01792 206.56937
+O 294.15415 0.03696 207.55762
+H 294.70633 -0.90128 204.62502
+H 294.72309 0.88747 204.60112
+H 292.44334 0.03033 206.03546
+N 296.20334 0.00915 206.80232
+C 296.69800 0.02223 208.16182
+C 298.22335 0.00862 208.16190
+O 298.90262 -0.01061 207.13840
+H 296.33552 0.92797 208.65971
+H 296.31874 -0.86078 208.68395
+H 296.88729 -0.00410 206.05104
+N 298.89339 0.01758 209.32232
+C 300.34008 0.00445 209.32241
+C 300.86164 0.01829 210.75581
+O 300.13203 0.03772 211.74406
+H 300.68403 -0.90139 208.81170
+H 300.70112 0.88736 208.78734
+H 298.42121 0.03100 210.22190
+N 302.18121 0.00933 210.98877
+C 302.67587 0.02268 212.34826
+C 304.20122 0.00879 212.34835
+O 304.88048 -0.01083 211.32485
+H 302.31356 0.92862 212.84592
+H 302.29645 -0.86013 212.87062
+H 302.86516 -0.00424 210.23749
+N 304.87126 0.01793 213.50877
+C 306.31795 0.00454 213.50886
+C 306.83951 0.01866 214.94226
+O 306.10990 0.03847 215.93050
+H 306.66173 -0.90150 212.99839
+H 306.67915 0.88724 212.97356
+H 304.39908 0.03167 214.40835
+N 308.15907 0.00952 215.17522
+C 308.65374 0.02313 216.53471
+C 310.17908 0.00897 216.53480
+O 310.85834 -0.01105 215.51130
+H 308.29159 0.92926 217.03213
+H 308.27415 -0.85947 217.05729
+H 308.84302 -0.00437 214.42394
+N 310.84913 0.01828 217.69521
+C 312.29582 0.00463 217.69530
+C 312.81738 0.01902 219.12870
+O 312.08777 0.03923 220.11694
+H 312.63943 -0.90160 217.18507
+H 312.65717 0.88713 217.15978
+H 310.37695 0.03234 218.59479
+N 314.13694 0.00971 219.36166
+C 314.63161 0.02358 220.72115
+C 316.15695 0.00914 220.72125
+O 316.83621 -0.01126 219.69776
+H 314.26962 0.92990 221.21834
+H 314.25186 -0.85882 221.24397
+H 314.82089 -0.00450 218.61040
+N 316.82700 0.01863 221.88166
+C 318.27368 0.00472 221.88175
+C 318.79525 0.01939 223.31515
+O 318.06564 0.03998 224.30338
+H 318.61713 -0.90171 221.37176
+H 318.63520 0.88701 221.34600
+H 316.35482 0.03301 222.78123
+N 320.11481 0.00989 223.54811
+C 320.60948 0.02403 224.90759
+C 322.13482 0.00931 224.90770
+O 322.81407 -0.01148 223.88421
+H 320.24766 0.93055 225.40455
+H 320.22957 -0.85817 225.43064
+H 320.79875 -0.00463 222.79685
+N 322.80486 0.01898 226.06810
+C 324.25155 0.00481 226.06820
+C 324.77312 0.01975 227.50160
+O 324.04351 0.04073 228.48982
+H 324.59484 -0.90181 225.55844
+H 324.61322 0.88690 225.53222
+H 322.33269 0.03368 226.96767
+N 326.09267 0.01008 227.73456
+C 326.58735 0.02448 229.09404
+C 328.11268 0.00948 229.09415
+O 328.79193 -0.01170 228.07066
+H 326.22569 0.93119 229.59076
+H 326.20728 -0.85751 229.61731
+H 326.77662 -0.00476 226.98330
+O 328.71406 0.02071 230.30387
+H 328.12579 0.03905 231.19026
diff --git a/benchmarks/molecules/gly/gly120.xyz b/benchmarks/molecules/gly/gly120.xyz
new file mode 100644
index 00000000..6ef3c463
--- /dev/null
+++ b/benchmarks/molecules/gly/gly120.xyz
@@ -0,0 +1,845 @@
+843
+
+N 0.00000 0.00000 0.00000
+C 1.44675 0.00000 0.00000
+C 1.96825 0.00000 1.43350
+O 1.23855 0.00000 2.42187
+H 1.79887 -0.89599 -0.52238
+H 1.79973 0.89301 -0.52356
+H -0.47223 -0.00252 0.89965
+H -0.50800 0.07669 -0.87653
+N 3.28785 -0.00000 1.66639
+C 3.78246 0.00022 3.02597
+C 5.30787 0.00017 3.02597
+O 5.98722 -0.00002 2.00234
+H 3.41197 0.89631 3.53531
+H 3.41109 -0.89269 3.53683
+H 3.97186 0.00237 0.91504
+N 5.97787 0.00035 4.18645
+C 7.42462 0.00009 4.18645
+C 7.94612 0.00037 5.61994
+O 7.21641 0.00075 6.60831
+H 7.77658 -0.89610 3.66430
+H 7.77776 0.89290 3.66265
+H 5.50563 -0.00185 5.08610
+N 9.26572 0.00019 5.85284
+C 9.76033 0.00067 7.21242
+C 11.28573 0.00034 7.21242
+O 11.96509 -0.00024 6.18879
+H 9.39000 0.89695 7.72152
+H 9.38879 -0.89204 7.72351
+H 9.94972 0.00224 5.10149
+N 11.95573 0.00070 8.37289
+C 13.40249 0.00018 8.37289
+C 13.92398 0.00073 9.80639
+O 13.19428 0.00151 10.79476
+H 13.75428 -0.89621 7.85098
+H 13.75579 0.89279 7.84887
+H 11.48350 -0.00118 9.27255
+N 15.24359 0.00037 10.03929
+C 15.73819 0.00112 11.39887
+C 17.26360 0.00052 11.39887
+O 17.94295 -0.00046 10.37523
+H 15.36803 0.89760 11.90774
+H 15.36650 -0.89139 11.91018
+H 15.92759 0.00211 9.28794
+N 17.93360 0.00105 12.55934
+C 19.38036 0.00027 12.55934
+C 19.90185 0.00110 13.99284
+O 19.17215 0.00226 14.98121
+H 19.73199 -0.89632 12.03766
+H 19.73382 0.89267 12.03508
+H 17.46137 -0.00051 13.45900
+N 21.22146 0.00056 14.22573
+C 21.71606 0.00157 15.58531
+C 23.24147 0.00069 15.58531
+O 23.92082 -0.00067 14.56168
+H 21.34606 0.89825 16.09395
+H 21.34421 -0.89074 16.09686
+H 21.90546 0.00198 13.47438
+N 23.91147 0.00141 16.74579
+C 25.35822 0.00036 16.74579
+C 25.87972 0.00146 18.17928
+O 25.15002 0.00302 19.16765
+H 25.70969 -0.89643 16.22434
+H 25.71185 0.89256 16.22130
+H 23.43923 0.00016 17.64544
+N 27.19932 0.00075 18.41218
+C 27.69393 0.00202 19.77176
+C 29.21934 0.00086 19.77176
+O 29.89869 -0.00089 18.74813
+H 27.32409 0.89890 20.28017
+H 27.32191 -0.89009 20.28354
+H 27.88333 0.00184 17.66083
+N 29.88934 0.00176 20.93223
+C 31.33609 0.00044 20.93224
+C 31.85759 0.00183 22.36573
+O 31.12788 0.00377 23.35410
+H 31.68740 -0.89654 20.41102
+H 31.68988 0.89245 20.40752
+H 29.41710 0.00083 21.83189
+N 33.17719 0.00093 22.59863
+C 33.67180 0.00246 23.95821
+C 35.19720 0.00103 23.95821
+O 35.87656 -0.00110 22.93458
+H 33.30212 0.89955 24.46638
+H 33.29962 -0.88944 24.47022
+H 33.86119 0.00171 21.84728
+N 35.86720 0.00211 25.11868
+C 37.31396 0.00053 25.11868
+C 37.83545 0.00219 26.55218
+O 37.10575 0.00453 27.54055
+H 37.66510 -0.89665 24.59770
+H 37.66791 0.89234 24.59373
+H 35.39497 0.00150 26.01834
+N 39.15506 0.00112 26.78507
+C 39.64966 0.00291 28.14465
+C 41.17507 0.00121 28.14466
+O 41.85442 -0.00132 27.12102
+H 39.28015 0.90019 28.65260
+H 39.27732 -0.88879 28.65690
+H 39.83906 0.00158 26.03372
+N 41.84507 0.00246 29.30513
+C 43.29182 0.00062 29.30513
+C 43.81332 0.00256 30.73862
+O 43.08362 0.00528 31.72699
+H 43.64281 -0.89676 28.78438
+H 43.64594 0.89223 28.77995
+H 41.37284 0.00217 30.20478
+N 45.13293 0.00131 30.97152
+C 45.62753 0.00336 32.33110
+C 47.15294 0.00138 32.33110
+O 47.83229 -0.00154 31.30747
+H 45.25818 0.90084 32.83881
+H 45.25503 -0.88814 32.84357
+H 45.81693 0.00145 30.22017
+N 47.82294 0.00281 33.49157
+C 49.26969 0.00071 33.49158
+C 49.79119 0.00293 34.92507
+O 49.06149 0.00603 35.91344
+H 49.62051 -0.89687 32.97106
+H 49.62396 0.89212 32.96616
+H 47.35070 0.00284 34.39123
+N 51.11079 0.00149 35.15797
+C 51.60540 0.00381 36.51755
+C 53.13081 0.00155 36.51755
+O 53.81016 -0.00175 35.49392
+H 51.23621 0.90149 37.02502
+H 51.23273 -0.88749 37.03025
+H 51.79480 0.00131 34.40662
+N 53.80081 0.00316 37.67802
+C 55.24756 0.00080 37.67802
+C 55.76906 0.00329 39.11152
+O 55.03936 0.00679 40.09988
+H 55.59822 -0.89698 37.15774
+H 55.60199 0.89201 37.15238
+H 53.32857 0.00351 38.57768
+N 57.08866 0.00168 39.34442
+C 57.58327 0.00426 40.70399
+C 59.10867 0.00172 40.70400
+O 59.78802 -0.00197 39.68037
+H 57.21424 0.90214 41.21124
+H 57.21044 -0.88684 41.21693
+H 57.77266 0.00118 38.59307
+N 59.77868 0.00352 41.86447
+C 61.22543 0.00089 41.86447
+C 61.74692 0.00366 43.29796
+O 61.01722 0.00754 44.28633
+H 61.57592 -0.89709 41.34442
+H 61.58002 0.89189 41.33860
+H 59.30644 0.00418 42.76412
+N 63.06653 0.00187 43.53086
+C 63.56114 0.00471 44.89044
+C 65.08654 0.00190 44.89044
+O 65.76589 -0.00219 43.86682
+H 63.19227 0.90279 45.39745
+H 63.18815 -0.88619 45.40361
+H 63.75053 0.00105 42.77951
+N 65.75654 0.00387 46.05092
+C 67.20329 0.00098 46.05092
+C 67.72479 0.00402 47.48441
+O 66.99509 0.00830 48.47278
+H 67.55362 -0.89720 45.53110
+H 67.55805 0.89178 45.52481
+H 65.28431 0.00485 46.95057
+N 69.04439 0.00205 47.71731
+C 69.53900 0.00516 49.07689
+C 71.06441 0.00207 49.07689
+O 71.74376 -0.00240 48.05327
+H 69.17030 0.90343 49.58367
+H 69.16585 -0.88554 49.59028
+H 69.72840 0.00092 46.96596
+N 71.73441 0.00422 50.23736
+C 73.18116 0.00107 50.23737
+C 73.70266 0.00439 51.67086
+O 72.97296 0.00905 52.65922
+H 73.53133 -0.89731 49.71778
+H 73.53608 0.89167 49.71103
+H 71.26217 0.00552 51.13702
+N 75.02226 0.00224 51.90376
+C 75.51687 0.00561 53.26333
+C 77.04228 0.00224 53.26334
+O 77.72162 -0.00262 52.23971
+H 75.14833 0.90408 53.76988
+H 75.14356 -0.88489 53.77696
+H 75.70627 0.00079 51.15241
+N 77.71228 0.00457 54.42381
+C 79.15903 0.00116 54.42381
+C 79.68053 0.00476 55.85730
+O 78.95083 0.00981 56.84567
+H 79.50903 -0.89741 53.90446
+H 79.51411 0.89156 53.89725
+H 77.24004 0.00619 55.32346
+N 81.00013 0.00243 56.09020
+C 81.49474 0.00606 57.44978
+C 83.02014 0.00241 57.44979
+O 83.69949 -0.00283 56.42616
+H 81.12636 0.90473 57.95609
+H 81.12127 -0.88424 57.96364
+H 81.68413 0.00065 55.33886
+N 83.69015 0.00492 58.61026
+C 85.13689 0.00125 58.61026
+C 85.65839 0.00512 60.04375
+O 84.92870 0.01056 61.03211
+H 85.48674 -0.89752 58.09114
+H 85.49214 0.89145 58.08346
+H 83.21791 0.00686 59.50991
+N 86.97800 0.00261 60.27665
+C 87.47261 0.00651 61.63623
+C 88.99801 0.00259 61.63623
+O 89.67735 -0.00305 60.61261
+H 87.10439 0.90538 62.14231
+H 87.09897 -0.88359 62.15031
+H 87.66200 0.00052 59.52530
+N 89.66801 0.00527 62.79670
+C 91.11476 0.00133 62.79671
+C 91.63626 0.00549 64.23020
+O 90.90657 0.01132 65.21856
+H 91.46444 -0.89763 62.27782
+H 91.47017 0.89134 62.26968
+H 89.19578 0.00753 63.69636
+N 92.95586 0.00280 64.46310
+C 93.45047 0.00696 65.82267
+C 94.97588 0.00276 65.82268
+O 95.65522 -0.00327 64.79906
+H 93.08243 0.90602 66.32852
+H 93.07668 -0.88294 66.33699
+H 93.63987 0.00039 63.71175
+N 95.64588 0.00562 66.98315
+C 97.09263 0.00142 66.98316
+C 97.61413 0.00585 68.41664
+O 96.88444 0.01207 69.40500
+H 97.44214 -0.89774 66.46450
+H 97.44819 0.89122 66.45590
+H 95.17365 0.00820 67.88280
+N 98.93373 0.00299 68.64955
+C 99.42834 0.00741 70.00912
+C 100.95374 0.00293 70.00913
+O 101.63309 -0.00348 68.98551
+H 99.06046 0.90667 70.51473
+H 99.05438 -0.88229 70.52367
+H 99.61773 0.00026 67.89820
+N 101.62375 0.00598 71.16959
+C 103.07049 0.00151 71.16961
+C 103.59200 0.00622 72.60309
+O 102.86230 0.01282 73.59145
+H 103.41985 -0.89785 70.65118
+H 103.42622 0.89111 70.64212
+H 101.15152 0.00887 72.06925
+N 104.91160 0.00317 72.83599
+C 105.40621 0.00786 74.19556
+C 106.93161 0.00310 74.19557
+O 107.61095 -0.00370 73.17196
+H 105.03849 0.90732 74.70095
+H 105.03209 -0.88164 74.71034
+H 105.59560 0.00013 72.08465
+N 107.60162 0.00633 75.35604
+C 109.04836 0.00160 75.35605
+C 109.56986 0.00658 76.78954
+O 108.84017 0.01358 77.77789
+H 109.39755 -0.89796 74.83787
+H 109.40425 0.89100 74.82833
+H 107.12938 0.00955 76.25569
+N 110.88947 0.00336 77.02244
+C 111.38408 0.00831 78.38201
+C 112.90948 0.00328 78.38202
+O 113.58882 -0.00391 77.35841
+H 111.01652 0.90796 78.88716
+H 111.00980 -0.88099 78.89702
+H 111.57347 -0.00001 76.27110
+N 113.57948 0.00668 79.54249
+C 115.02623 0.00169 79.54250
+C 115.54773 0.00695 80.97598
+O 114.81804 0.01433 81.96434
+H 115.37525 -0.89807 79.02455
+H 115.38228 0.89089 79.01455
+H 113.10725 0.01022 80.44214
+N 116.86733 0.00355 81.20889
+C 117.36195 0.00875 82.56846
+C 118.88735 0.00345 82.56847
+O 119.56668 -0.00413 81.54486
+H 116.99455 0.90861 83.07337
+H 116.98750 -0.88034 83.08370
+H 117.55133 -0.00014 80.45754
+N 119.55735 0.00703 83.72893
+C 121.00410 0.00178 83.72895
+C 121.52560 0.00732 85.16243
+O 120.79591 0.01509 86.15078
+H 121.35296 -0.89818 83.21123
+H 121.36031 0.89077 83.20077
+H 119.08512 0.01089 84.62858
+N 122.84520 0.00373 85.39534
+C 123.33982 0.00920 86.75490
+C 124.86521 0.00362 86.75492
+O 125.54455 -0.00435 85.73131
+H 122.97258 0.90926 87.25958
+H 122.96521 -0.87969 87.27037
+H 123.52920 -0.00027 84.64399
+N 125.53522 0.00738 87.91538
+C 126.98196 0.00187 87.91540
+C 127.50347 0.00768 89.34888
+O 126.77378 0.01584 90.33723
+H 127.33066 -0.89828 87.39791
+H 127.33834 0.89066 87.38698
+H 125.06299 0.01156 88.81503
+N 128.82307 0.00392 89.58178
+C 129.31768 0.00965 90.94135
+C 130.84308 0.00379 90.94136
+O 131.52242 -0.00456 89.91776
+H 128.95061 0.90990 91.44580
+H 128.94292 -0.87904 91.45705
+H 129.50707 -0.00040 88.83044
+N 131.51309 0.00773 92.10183
+C 132.95983 0.00196 92.10184
+C 133.48134 0.00805 93.53532
+O 132.75165 0.01660 94.52367
+H 133.30836 -0.89839 91.58459
+H 133.31636 0.89055 91.57320
+H 131.04086 0.01223 93.00148
+N 134.80093 0.00411 93.76823
+C 135.29555 0.01010 95.12779
+C 136.82095 0.00397 95.12781
+O 137.50028 -0.00478 94.10421
+H 134.92865 0.91055 95.63201
+H 134.92062 -0.87839 95.64373
+H 135.48493 -0.00054 93.01689
+N 137.49096 0.00809 96.28827
+C 138.93770 0.00205 96.28829
+C 139.45920 0.00841 97.72177
+O 138.72952 0.01735 98.71011
+H 139.28607 -0.89850 95.77127
+H 139.29439 0.89044 95.75942
+H 137.01873 0.01290 97.18792
+N 140.77880 0.00429 97.95468
+C 141.27342 0.01055 99.31424
+C 142.79881 0.00414 99.31426
+O 143.47815 -0.00500 98.29065
+H 140.90668 0.91120 99.81822
+H 140.89833 -0.87774 99.83040
+H 141.46280 -0.00067 97.20334
+N 143.46882 0.00844 100.47472
+C 144.91556 0.00214 100.47474
+C 145.43707 0.00878 101.90822
+O 144.70739 0.01810 102.89656
+H 145.26377 -0.89861 99.95795
+H 145.27242 0.89032 99.94564
+H 142.99659 0.01357 101.37437
+N 146.75667 0.00448 102.14113
+C 147.25129 0.01100 103.50069
+C 148.77668 0.00431 103.50071
+O 149.45601 -0.00521 102.47710
+H 146.88471 0.91184 104.00443
+H 146.87604 -0.87709 104.01708
+H 147.44066 -0.00080 101.38979
+N 149.44669 0.00879 104.66117
+C 150.89343 0.00222 104.66119
+C 151.41494 0.00915 106.09466
+O 150.68526 0.01886 107.08300
+H 151.24147 -0.89872 104.14463
+H 151.25045 0.89021 104.13186
+H 148.97446 0.01424 105.56081
+N 152.73454 0.00467 106.32757
+C 153.22916 0.01145 107.68713
+C 154.75455 0.00448 107.68715
+O 155.43388 -0.00543 106.66356
+H 152.86274 0.91249 108.19065
+H 152.85375 -0.87644 108.20375
+H 153.41853 -0.00093 105.57624
+N 155.42456 0.00914 108.84761
+C 156.87130 0.00231 108.84764
+C 157.39281 0.00951 110.28111
+O 156.66313 0.01961 111.26945
+H 157.21918 -0.89883 108.33132
+H 157.22847 0.89010 108.31807
+H 154.95233 0.01491 109.74726
+N 158.71240 0.00485 110.51402
+C 159.20702 0.01190 111.87358
+C 160.73242 0.00465 111.87360
+O 161.41174 -0.00564 110.85001
+H 158.84077 0.91314 112.37686
+H 158.83145 -0.87578 112.39043
+H 159.39640 -0.00106 109.76269
+N 161.40243 0.00949 113.03406
+C 162.84916 0.00240 113.03408
+C 163.37068 0.00988 114.46756
+O 162.64100 0.02037 115.45589
+H 163.19688 -0.89893 112.51800
+H 163.20650 0.88998 112.50429
+H 160.93020 0.01558 113.93370
+N 164.69027 0.00504 114.70047
+C 165.18489 0.01235 116.06002
+C 166.71028 0.00483 116.06005
+O 167.38961 -0.00586 115.03646
+H 164.81880 0.91378 116.56307
+H 164.80916 -0.87513 116.57711
+H 165.37426 -0.00120 113.94913
+N 167.38029 0.00984 117.22051
+C 168.82703 0.00249 117.22053
+C 169.34854 0.01024 118.65400
+O 168.61887 0.02112 119.64233
+H 169.17458 -0.89904 116.70468
+H 169.18453 0.88987 116.69051
+H 166.90807 0.01625 118.12015
+N 170.66814 0.00523 118.88692
+C 171.16276 0.01280 120.24647
+C 172.68815 0.00500 120.24650
+O 173.36747 -0.00608 119.22291
+H 170.79684 0.91443 120.74928
+H 170.78687 -0.87448 120.76378
+H 171.35213 -0.00133 118.13558
+N 173.35816 0.01019 121.40695
+C 174.80490 0.00258 121.40698
+C 175.32641 0.01061 122.84045
+O 174.59674 0.02188 123.82878
+H 175.15229 -0.89915 120.89136
+H 175.16256 0.88976 120.87673
+H 172.88594 0.01692 122.30659
+N 176.64600 0.00541 123.07336
+C 177.14063 0.01325 124.43291
+C 178.66602 0.00517 124.43295
+O 179.34534 -0.00629 123.40936
+H 176.77487 0.91507 124.93549
+H 176.76457 -0.87383 124.95046
+H 177.32999 -0.00146 122.32203
+N 179.33603 0.01055 125.59340
+C 180.78276 0.00267 125.59343
+C 181.30428 0.01097 127.02689
+O 180.57461 0.02263 128.01522
+H 181.12999 -0.89926 125.07804
+H 181.14058 0.88964 125.06295
+H 178.86381 0.01759 126.49303
+N 182.62387 0.00560 127.25981
+C 183.11850 0.01370 128.61936
+C 184.64388 0.00534 128.61939
+O 185.32320 -0.00651 127.59581
+H 182.75290 0.91572 129.12171
+H 182.74228 -0.87318 129.13713
+H 183.30786 -0.00159 126.50848
+N 185.31390 0.01090 129.77984
+C 186.76063 0.00276 129.77988
+C 187.28215 0.01134 131.21334
+O 186.55248 0.02339 132.20166
+H 187.10769 -0.89936 129.26473
+H 187.11861 0.88953 129.24917
+H 184.84168 0.01826 130.67948
+N 188.60174 0.00579 131.44626
+C 189.09637 0.01415 132.80581
+C 190.62175 0.00552 132.80584
+O 191.30107 -0.00672 131.78226
+H 188.73093 0.91636 133.30792
+H 188.71999 -0.87253 133.32381
+H 189.28573 -0.00173 130.69493
+N 191.29177 0.01125 133.96629
+C 192.73849 0.00285 133.96633
+C 193.26002 0.01171 135.39979
+O 192.53035 0.02414 136.38810
+H 193.08539 -0.89947 133.45141
+H 193.09664 0.88942 133.43538
+H 190.81955 0.01893 134.86592
+N 194.57960 0.00597 135.63271
+C 195.07423 0.01459 136.99225
+C 196.59962 0.00569 136.99229
+O 197.27893 -0.00694 135.96871
+H 194.70896 0.91701 137.49413
+H 194.69770 -0.87188 137.51048
+H 195.26359 -0.00186 134.88138
+N 197.26963 0.01160 138.15274
+C 198.71636 0.00294 138.15278
+C 199.23788 0.01207 139.58623
+O 198.50822 0.02489 140.57455
+H 199.06310 -0.89958 137.63809
+H 199.07467 0.88930 137.62160
+H 196.79742 0.01960 139.05237
+N 200.55747 0.00616 139.81915
+C 201.05210 0.01504 141.17870
+C 202.57748 0.00586 141.17874
+O 203.25680 -0.00716 140.15516
+H 200.68700 0.91766 141.68034
+H 200.67540 -0.87122 141.69716
+H 201.24146 -0.00199 139.06783
+N 203.24750 0.01195 142.33918
+C 204.69423 0.00303 142.33922
+C 205.21575 0.01244 143.77268
+O 204.48609 0.02565 144.76099
+H 205.04080 -0.89969 141.82477
+H 205.05269 0.88919 141.80782
+H 202.77529 0.02027 143.23881
+N 206.53534 0.00635 144.00560
+C 207.02997 0.01549 145.36514
+C 208.55535 0.00603 145.36518
+O 209.23466 -0.00737 144.34161
+H 206.66503 0.91830 145.86655
+H 206.65311 -0.87057 145.88383
+H 207.21932 -0.00212 143.25428
+N 209.22537 0.01230 146.52563
+C 210.67209 0.00311 146.52567
+C 211.19362 0.01280 147.95912
+O 210.46396 0.02640 148.94743
+H 211.01850 -0.89979 146.01145
+H 211.03072 0.88908 145.99404
+H 208.75315 0.02094 147.42526
+N 212.51321 0.00653 148.19205
+C 213.00784 0.01594 149.55159
+C 214.53322 0.00621 149.55163
+O 215.21252 -0.00759 148.52806
+H 212.64306 0.91895 150.05276
+H 212.63082 -0.86992 150.07051
+H 213.19719 -0.00225 147.44073
+N 215.20324 0.01266 150.71208
+C 216.64996 0.00320 150.71212
+C 217.17149 0.01317 152.14557
+O 216.44183 0.02716 153.13388
+H 216.99620 -0.89990 150.19814
+H 217.00875 0.88896 150.18026
+H 214.73102 0.02161 151.61170
+N 218.49107 0.00672 152.37850
+C 218.98571 0.01639 153.73803
+C 220.51108 0.00638 153.73808
+O 221.19039 -0.00781 152.71451
+H 218.62109 0.91959 154.23898
+H 218.60853 -0.86927 154.25718
+H 219.17505 -0.00239 151.62718
+N 221.18111 0.01301 154.89852
+C 222.62783 0.00329 154.89857
+C 223.14936 0.01354 156.33202
+O 222.41970 0.02791 157.32032
+H 222.97391 -0.90001 154.38482
+H 222.98678 0.88885 154.36648
+H 220.70889 0.02228 155.79814
+N 224.46894 0.00691 156.56495
+C 224.96358 0.01684 157.92448
+C 226.48895 0.00655 157.92453
+O 227.16825 -0.00802 156.90097
+H 224.59913 0.92024 158.42519
+H 224.58624 -0.86861 158.44386
+H 225.15292 -0.00252 155.81363
+N 227.15897 0.01336 159.08497
+C 228.60569 0.00338 159.08502
+C 229.12722 0.01390 160.51846
+O 228.39757 0.02867 161.50676
+H 228.95161 -0.90011 158.57150
+H 228.96480 0.88873 158.55270
+H 226.68676 0.02295 159.98459
+N 230.44681 0.00709 160.75139
+C 230.94145 0.01729 162.11092
+C 232.46682 0.00672 162.11098
+O 233.14612 -0.00824 161.08742
+H 230.57716 0.92088 162.61140
+H 230.56394 -0.86796 162.63053
+H 231.13078 -0.00265 160.00008
+N 233.13684 0.01371 163.27141
+C 234.58356 0.00347 163.27147
+C 235.10509 0.01427 164.70491
+O 234.37544 0.02942 165.69320
+H 234.92931 -0.90022 162.75819
+H 234.94283 0.88862 162.73892
+H 232.66463 0.02362 164.17103
+N 236.42467 0.00728 164.93784
+C 236.91932 0.01774 166.29737
+C 238.44468 0.00690 166.29742
+O 239.12398 -0.00845 165.27387
+H 236.55519 0.92153 166.79761
+H 236.54165 -0.86731 166.81721
+H 237.10865 -0.00278 164.18653
+N 239.11471 0.01406 167.45786
+C 240.56142 0.00356 167.45792
+C 241.08296 0.01463 168.89136
+O 240.35331 0.03017 169.87964
+H 240.90701 -0.90033 166.94487
+H 240.92086 0.88851 166.92514
+H 238.64250 0.02429 168.35747
+N 242.40254 0.00747 169.12429
+C 242.89718 0.01819 170.48381
+C 244.42255 0.00707 170.48387
+O 245.10185 -0.00867 169.46032
+H 242.53322 0.92217 170.98382
+H 242.51936 -0.86666 171.00388
+H 243.08651 -0.00291 168.37298
+N 245.09258 0.01441 171.64431
+C 246.53929 0.00365 171.64436
+C 247.06083 0.01500 173.07780
+O 246.33118 0.03093 174.06609
+H 246.88472 -0.90043 171.13155
+H 246.89888 0.88839 171.11136
+H 244.62037 0.02496 172.54392
+N 248.38041 0.00765 173.31074
+C 248.87505 0.01864 174.67026
+C 250.40042 0.00724 174.67032
+O 251.07971 -0.00889 173.64677
+H 248.51126 0.92282 175.17003
+H 248.49707 -0.86600 175.19056
+H 249.06438 -0.00305 172.55943
+N 251.07045 0.01476 175.83075
+C 252.51716 0.00374 175.83081
+C 253.03870 0.01536 177.26425
+O 252.30905 0.03168 178.25253
+H 252.86242 -0.90054 175.31824
+H 252.87691 0.88828 175.29758
+H 250.59824 0.02563 176.73036
+N 254.35827 0.00784 177.49718
+C 254.85292 0.01909 178.85670
+C 256.37828 0.00741 178.85677
+O 257.05757 -0.00910 177.83323
+H 254.48929 0.92346 179.35624
+H 254.47478 -0.86535 179.37723
+H 255.04224 -0.00318 176.74588
+N 257.04831 0.01512 180.01720
+C 258.49502 0.00383 180.01726
+C 259.01656 0.01573 181.45069
+O 258.28693 0.03244 182.43897
+H 258.84012 -0.90065 179.50492
+H 258.85494 0.88816 179.48380
+H 256.57611 0.02630 180.91680
+N 260.33614 0.00803 181.68363
+C 260.83079 0.01954 183.04315
+C 262.35615 0.00759 183.04322
+O 263.03544 -0.00932 182.01968
+H 260.46732 0.92411 183.54245
+H 260.45249 -0.86470 183.56390
+H 261.02011 -0.00331 180.93233
+N 263.02618 0.01547 184.20364
+C 264.47289 0.00392 184.20371
+C 264.99443 0.01610 185.63714
+O 264.26480 0.03319 186.62541
+H 264.81782 -0.90075 183.69160
+H 264.83296 0.88805 183.67002
+H 262.55398 0.02697 185.10325
+N 266.31401 0.00821 185.87008
+C 266.80866 0.01999 187.22959
+C 268.33402 0.00776 187.22966
+O 269.01330 -0.00953 186.20613
+H 266.44536 0.92475 187.72866
+H 266.43019 -0.86405 187.75058
+H 266.99797 -0.00344 185.11879
+N 269.00405 0.01582 188.39009
+C 270.45076 0.00400 188.39016
+C 270.97230 0.01646 189.82358
+O 270.24267 0.03395 190.81185
+H 270.79552 -0.90086 187.87829
+H 270.81099 0.88793 187.85624
+H 268.53185 0.02764 189.28969
+N 272.29187 0.00840 190.05653
+C 272.78653 0.02043 191.41604
+C 274.31188 0.00793 191.41611
+O 274.99116 -0.00975 190.39258
+H 272.42339 0.92540 191.91487
+H 272.40790 -0.86339 191.93725
+H 272.97584 -0.00358 189.30524
+N 274.98192 0.01617 192.57654
+C 276.42862 0.00409 192.57661
+C 276.95017 0.01683 194.01003
+O 276.22054 0.03470 194.99829
+H 276.77322 -0.90097 192.06497
+H 276.78902 0.88782 192.04246
+H 274.50972 0.02832 193.47613
+N 278.26974 0.00859 194.24298
+C 278.76440 0.02088 195.60248
+C 280.28975 0.00810 195.60256
+O 280.96903 -0.00997 194.57904
+H 278.40142 0.92604 196.10108
+H 278.38561 -0.86274 196.12393
+H 278.95370 -0.00371 193.49169
+N 280.95979 0.01652 196.76298
+C 282.40649 0.00418 196.76306
+C 282.92804 0.01719 198.19648
+O 282.19841 0.03545 199.18473
+H 282.75093 -0.90107 196.25165
+H 282.76704 0.88770 196.22868
+H 280.48759 0.02899 197.66258
+N 284.24761 0.00877 198.42942
+C 284.74227 0.02133 199.78893
+C 286.26762 0.00828 199.78901
+O 286.94689 -0.01018 198.76549
+H 284.37946 0.92668 200.28729
+H 284.36332 -0.86209 200.31060
+H 284.93157 -0.00384 197.67814
+N 286.93765 0.01687 200.94943
+C 288.38435 0.00427 200.94951
+C 288.90591 0.01756 202.38292
+O 288.17628 0.03621 203.37118
+H 288.72863 -0.90118 200.43834
+H 288.74507 0.88759 200.41490
+H 286.46546 0.02966 201.84902
+N 290.22547 0.00896 202.61587
+C 290.72013 0.02178 203.97537
+C 292.24548 0.00845 203.97546
+O 292.92475 -0.01040 202.95194
+H 290.35749 0.92733 204.47350
+H 290.34103 -0.86143 204.49727
+H 290.90943 -0.00397 201.86459
+N 292.91552 0.01723 205.13587
+C 294.36222 0.00436 205.13596
+C 294.88377 0.01792 206.56937
+O 294.15415 0.03696 207.55762
+H 294.70633 -0.90128 204.62502
+H 294.72309 0.88747 204.60112
+H 292.44334 0.03033 206.03546
+N 296.20334 0.00915 206.80232
+C 296.69800 0.02223 208.16182
+C 298.22335 0.00862 208.16190
+O 298.90262 -0.01061 207.13840
+H 296.33552 0.92797 208.65971
+H 296.31874 -0.86078 208.68395
+H 296.88729 -0.00410 206.05104
+N 298.89339 0.01758 209.32232
+C 300.34008 0.00445 209.32241
+C 300.86164 0.01829 210.75581
+O 300.13203 0.03772 211.74406
+H 300.68403 -0.90139 208.81170
+H 300.70112 0.88736 208.78734
+H 298.42121 0.03100 210.22190
+N 302.18121 0.00933 210.98877
+C 302.67587 0.02268 212.34826
+C 304.20122 0.00879 212.34835
+O 304.88048 -0.01083 211.32485
+H 302.31356 0.92862 212.84592
+H 302.29645 -0.86013 212.87062
+H 302.86516 -0.00424 210.23749
+N 304.87126 0.01793 213.50877
+C 306.31795 0.00454 213.50886
+C 306.83951 0.01866 214.94226
+O 306.10990 0.03847 215.93050
+H 306.66173 -0.90150 212.99839
+H 306.67915 0.88724 212.97356
+H 304.39908 0.03167 214.40835
+N 308.15907 0.00952 215.17522
+C 308.65374 0.02313 216.53471
+C 310.17908 0.00897 216.53480
+O 310.85834 -0.01105 215.51130
+H 308.29159 0.92926 217.03213
+H 308.27415 -0.85947 217.05729
+H 308.84302 -0.00437 214.42394
+N 310.84913 0.01828 217.69521
+C 312.29582 0.00463 217.69530
+C 312.81738 0.01902 219.12870
+O 312.08777 0.03923 220.11694
+H 312.63943 -0.90160 217.18507
+H 312.65717 0.88713 217.15978
+H 310.37695 0.03234 218.59479
+N 314.13694 0.00971 219.36166
+C 314.63161 0.02358 220.72115
+C 316.15695 0.00914 220.72125
+O 316.83621 -0.01126 219.69776
+H 314.26962 0.92990 221.21834
+H 314.25186 -0.85882 221.24397
+H 314.82089 -0.00450 218.61040
+N 316.82700 0.01863 221.88166
+C 318.27368 0.00472 221.88175
+C 318.79525 0.01939 223.31515
+O 318.06564 0.03998 224.30338
+H 318.61713 -0.90171 221.37176
+H 318.63520 0.88701 221.34600
+H 316.35482 0.03301 222.78123
+N 320.11481 0.00989 223.54811
+C 320.60948 0.02403 224.90759
+C 322.13482 0.00931 224.90770
+O 322.81407 -0.01148 223.88421
+H 320.24766 0.93055 225.40455
+H 320.22957 -0.85817 225.43064
+H 320.79875 -0.00463 222.79685
+N 322.80486 0.01898 226.06810
+C 324.25155 0.00481 226.06820
+C 324.77312 0.01975 227.50160
+O 324.04351 0.04073 228.48982
+H 324.59484 -0.90181 225.55844
+H 324.61322 0.88690 225.53222
+H 322.33269 0.03368 226.96767
+N 326.09267 0.01008 227.73456
+C 326.58735 0.02448 229.09404
+C 328.11268 0.00948 229.09415
+O 328.79193 -0.01170 228.07066
+H 326.22569 0.93119 229.59076
+H 326.20728 -0.85751 229.61731
+H 326.77662 -0.00476 226.98330
+N 328.78273 0.01933 230.25455
+C 330.22941 0.00489 230.25465
+C 330.75098 0.02012 231.68804
+O 330.02139 0.04149 232.67626
+H 330.57254 -0.90192 229.74513
+H 330.59125 0.88678 229.71844
+H 328.31056 0.03435 231.15411
+N 332.07054 0.01027 231.92101
+C 332.56522 0.02493 233.28048
+C 334.09055 0.00965 233.28059
+O 334.76979 -0.01191 232.25712
+H 332.20372 0.93183 233.77697
+H 332.18499 -0.85686 233.80399
+H 332.75448 -0.00490 231.16975
+N 334.76060 0.01969 234.44100
+C 336.20728 0.00498 234.44110
+C 336.72885 0.02049 235.87449
+O 335.99926 0.04224 236.86270
+H 336.55024 -0.90202 233.93181
+H 336.56928 0.88667 233.90466
+H 334.28843 0.03502 235.34056
+N 338.04841 0.01045 236.10746
+C 338.54309 0.02538 237.46693
+C 340.06842 0.00983 237.46704
+O 340.74766 -0.01213 236.44357
+H 338.18176 0.93248 237.96318
+H 338.16270 -0.85620 237.99066
+H 338.73234 -0.00503 235.35620
+N 340.73847 0.02004 238.62744
+C 342.18514 0.00507 238.62755
+C 342.70672 0.02085 240.06093
+O 341.97713 0.04300 241.04914
+H 342.52794 -0.90213 238.11850
+H 342.54730 0.88655 238.09088
+H 340.26630 0.03569 239.52700
+N 344.02627 0.01064 240.29390
+C 344.52096 0.02582 241.65337
+C 346.04628 0.01000 241.65349
+O 346.72552 -0.01234 240.63002
+H 344.15979 0.93312 242.14939
+H 344.14041 -0.85555 242.17733
+H 344.71021 -0.00516 239.54266
+N 346.71634 0.02039 242.81389
+C 348.16301 0.00516 242.81400
+C 348.68459 0.02122 244.24738
+O 347.95500 0.04375 245.23558
+H 348.50564 -0.90223 242.30518
+H 348.52533 0.88643 242.27710
+H 346.24417 0.03636 243.71344
+N 350.00414 0.01083 244.48035
+C 350.49883 0.02627 245.83982
+C 352.02415 0.01017 245.83994
+O 352.70338 -0.01256 244.81648
+H 350.13783 0.93376 246.33560
+H 350.11812 -0.85490 246.36400
+H 350.68807 -0.00529 243.72911
+N 352.69421 0.02074 247.00033
+C 354.14088 0.00525 247.00045
+C 354.66246 0.02158 248.43382
+O 353.93288 0.04451 249.42202
+H 354.48334 -0.90234 246.49186
+H 354.50335 0.88632 246.46333
+H 352.22204 0.03703 247.89988
+N 355.98201 0.01101 248.66680
+C 356.47670 0.02672 250.02626
+C 358.00202 0.01034 250.02639
+O 358.68124 -0.01278 249.00293
+H 356.11586 0.93441 250.52181
+H 356.09583 -0.85424 250.55068
+H 356.66593 -0.00542 247.91556
+O 358.60340 0.02259 251.23609
+H 358.01515 0.04262 252.12247
diff --git a/benchmarks/molecules/gly/gly30.xyz b/benchmarks/molecules/gly/gly30.xyz
new file mode 100644
index 00000000..f5edd6c5
--- /dev/null
+++ b/benchmarks/molecules/gly/gly30.xyz
@@ -0,0 +1,215 @@
+213
+Frame 1
+N -92.9031 -10.1231 -0.0000
+C -91.4564 -10.1231 -0.0000
+C -90.9349 -10.1231 1.4335
+O -91.6646 -10.1231 2.4219
+H -91.1043 -11.0191 -0.5224
+H -91.1034 -9.2301 -0.5236
+H -93.3754 -10.1256 0.8996
+H -93.4111 -10.0464 -0.8765
+N -89.6153 -10.1231 1.6664
+C -89.1207 -10.1229 3.0260
+C -87.5953 -10.1229 3.0260
+O -86.9159 -10.1231 2.0023
+H -89.4912 -9.2268 3.5353
+H -89.4921 -11.0158 3.5368
+H -88.9313 -10.1207 0.9150
+N -86.9253 -10.1228 4.1865
+C -85.4785 -10.1230 4.1865
+C -84.9570 -10.1227 5.6199
+O -85.6867 -10.1223 6.6083
+H -85.1266 -11.0192 3.6643
+H -85.1254 -9.2302 3.6627
+H -87.3975 -10.1250 5.0861
+N -83.6374 -10.1229 5.8528
+C -83.1428 -10.1224 7.2124
+C -81.6174 -10.1228 7.2124
+O -80.9380 -10.1233 6.1888
+H -83.5131 -9.2261 7.7215
+H -83.5143 -11.0151 7.7235
+H -82.9534 -10.1209 5.1015
+N -80.9474 -10.1224 8.3729
+C -79.5006 -10.1229 8.3729
+C -78.9791 -10.1224 9.8064
+O -79.7088 -10.1216 10.7948
+H -79.1488 -11.0193 7.8510
+H -79.1473 -9.2303 7.8489
+H -81.4196 -10.1243 9.2725
+N -77.6596 -10.1227 10.0393
+C -77.1649 -10.1220 11.3989
+C -75.6395 -10.1226 11.3989
+O -74.9602 -10.1236 10.3752
+H -77.5351 -9.2255 11.9077
+H -77.5366 -11.0145 11.9102
+H -76.9755 -10.1210 9.2879
+N -74.9695 -10.1220 12.5593
+C -73.5228 -10.1228 12.5593
+C -73.0013 -10.1220 13.9928
+O -73.7310 -10.1208 14.9812
+H -73.1712 -11.0194 12.0377
+H -73.1693 -9.2304 12.0351
+H -75.4418 -10.1236 13.4590
+N -71.6817 -10.1225 14.2257
+C -71.1871 -10.1215 15.5853
+C -69.6617 -10.1224 15.5853
+O -68.9823 -10.1238 14.5617
+H -71.5571 -9.2248 16.0940
+H -71.5589 -11.0138 16.0969
+H -70.9977 -10.1211 13.4744
+N -68.9917 -10.1217 16.7458
+C -67.5449 -10.1227 16.7458
+C -67.0234 -10.1216 18.1793
+O -67.7531 -10.1201 19.1677
+H -67.1934 -11.0195 16.2243
+H -67.1913 -9.2305 16.2213
+H -69.4639 -10.1229 17.6454
+N -65.7038 -10.1223 18.4122
+C -65.2092 -10.1211 19.7718
+C -63.6838 -10.1222 19.7718
+O -63.0045 -10.1240 18.7481
+H -65.5790 -9.2242 20.2802
+H -65.5812 -11.0132 20.2835
+H -65.0198 -10.1213 17.6608
+N -63.0138 -10.1213 20.9322
+C -61.5670 -10.1227 20.9322
+C -61.0456 -10.1213 22.3657
+O -61.7752 -10.1193 23.3541
+H -61.2157 -11.0196 20.4110
+H -61.2133 -9.2306 20.4075
+H -63.4860 -10.1223 21.8319
+N -59.7259 -10.1222 22.5986
+C -59.2313 -10.1206 23.9582
+C -57.7059 -10.1221 23.9582
+O -57.0266 -10.1242 22.9346
+H -59.6010 -9.2235 24.4664
+H -59.6035 -11.0125 24.4702
+H -59.0419 -10.1214 21.8473
+N -57.0359 -10.1210 25.1187
+C -55.5892 -10.1226 25.1187
+C -55.0677 -10.1209 26.5522
+O -55.7974 -10.1186 27.5406
+H -55.2380 -11.0197 24.5977
+H -55.2352 -9.2308 24.5937
+H -57.5082 -10.1216 26.0183
+N -53.7481 -10.1220 26.7851
+C -53.2535 -10.1202 28.1446
+C -51.7281 -10.1219 28.1447
+O -51.0487 -10.1244 27.1210
+H -53.6230 -9.2229 28.6526
+H -53.6258 -11.0119 28.6569
+H -53.0641 -10.1215 26.0337
+N -51.0581 -10.1206 29.3051
+C -49.6113 -10.1225 29.3051
+C -49.0898 -10.1205 30.7386
+O -49.8195 -10.1178 31.7270
+H -49.2603 -11.0198 28.7844
+H -49.2572 -9.2309 28.7799
+H -51.5303 -10.1209 30.2048
+N -47.7702 -10.1218 30.9715
+C -47.2756 -10.1197 32.3311
+C -45.7502 -10.1217 32.3311
+O -45.0709 -10.1246 31.3075
+H -47.6450 -9.2222 32.8388
+H -47.6481 -11.0112 32.8436
+H -47.0862 -10.1216 30.2202
+N -45.0802 -10.1203 33.4916
+C -43.6334 -10.1224 33.4916
+C -43.1119 -10.1202 34.9251
+O -43.8416 -10.1171 35.9134
+H -43.2826 -11.0200 32.9711
+H -43.2792 -9.2310 32.9662
+H -45.5524 -10.1203 34.3912
+N -41.7923 -10.1216 35.1580
+C -41.2977 -10.1193 36.5176
+C -39.7723 -10.1215 36.5176
+O -39.0930 -10.1249 35.4939
+H -41.6669 -9.2216 37.0250
+H -41.6704 -11.0106 37.0303
+H -41.1083 -10.1218 34.4066
+N -39.1023 -10.1199 37.6780
+C -37.6556 -10.1223 37.6780
+C -37.1341 -10.1198 39.1115
+O -37.8638 -10.1163 40.0999
+H -37.3049 -11.0201 37.1577
+H -37.3011 -9.2311 37.1524
+H -39.5746 -10.1196 38.5777
+N -35.8145 -10.1214 39.3444
+C -35.3199 -10.1188 40.7040
+C -33.7945 -10.1214 40.7040
+O -33.1151 -10.1251 39.6804
+H -35.6889 -9.2210 41.2112
+H -35.6927 -11.0099 41.2169
+H -35.1305 -10.1219 38.5931
+N -33.1245 -10.1196 41.8645
+C -31.6777 -10.1222 41.8645
+C -31.1562 -10.1194 43.2980
+O -31.8859 -10.1156 44.2863
+H -31.3272 -11.0202 41.3444
+H -31.3231 -9.2312 41.3386
+H -33.5967 -10.1189 42.7641
+N -29.8366 -10.1212 43.5309
+C -29.3420 -10.1184 44.8904
+C -27.8166 -10.1212 44.8904
+O -27.1373 -10.1253 43.8668
+H -29.7109 -9.2203 45.3974
+H -29.7150 -11.0093 45.4036
+H -29.1526 -10.1221 42.7795
+N -27.1466 -10.1192 46.0509
+C -25.6998 -10.1221 46.0509
+C -25.1783 -10.1191 47.4844
+O -25.9080 -10.1148 48.4728
+H -25.3495 -11.0203 45.5311
+H -25.3451 -9.2313 45.5248
+H -27.6188 -10.1182 46.9506
+N -23.8587 -10.1210 47.7173
+C -23.3641 -10.1179 49.0769
+C -21.8387 -10.1210 49.0769
+O -21.1594 -10.1255 48.0533
+H -23.7328 -9.2197 49.5837
+H -23.7373 -11.0086 49.5903
+H -23.1747 -10.1222 46.9660
+N -21.1687 -10.1189 50.2374
+C -19.7220 -10.1220 50.2374
+C -19.2005 -10.1187 51.6709
+O -19.9302 -10.1140 52.6592
+H -19.3718 -11.0204 49.7178
+H -19.3671 -9.2314 49.7110
+H -21.6410 -10.1176 51.1370
+N -17.8809 -10.1209 51.9038
+C -17.3863 -10.1175 53.2633
+C -15.8609 -10.1209 53.2633
+O -15.1815 -10.1257 52.2397
+H -17.7548 -9.2190 53.7699
+H -17.7596 -11.0080 53.7770
+H -17.1969 -10.1223 51.1524
+N -15.1909 -10.1185 54.4238
+C -13.7441 -10.1219 54.4238
+C -13.2226 -10.1183 55.8573
+O -13.9523 -10.1133 56.8457
+H -13.3941 -11.0205 53.9045
+H -13.3890 -9.2315 53.8973
+H -15.6631 -10.1169 55.3235
+N -11.9030 -10.1207 56.0902
+C -11.4084 -10.1170 57.4498
+C -9.8830 -10.1207 57.4498
+O -9.2037 -10.1259 56.4262
+H -11.7768 -9.2184 57.9561
+H -11.7819 -11.0073 57.9636
+H -11.2190 -10.1224 55.3389
+N -9.2130 -10.1182 58.6103
+C -7.7662 -10.1219 58.6103
+C -7.2447 -10.1180 60.0438
+O -7.9744 -10.1125 61.0321
+H -7.4164 -11.0206 58.0911
+H -7.4110 -9.2317 58.0835
+H -9.6852 -10.1162 59.5099
+N -5.9251 -10.1205 60.2766
+C -5.4305 -10.1166 61.6362
+C -3.9051 -10.1205 61.6362
+O -3.2258 -10.1262 60.6126
+H -5.7987 -9.2177 62.1423
+H -5.8042 -11.0067 62.1503
+H -5.2411 -10.1226 59.5253
+O -3.3038 -10.1175 62.8460
+H -3.8922 -10.1126 63.7326
diff --git a/benchmarks/molecules/gly/gly40.xyz b/benchmarks/molecules/gly/gly40.xyz
new file mode 100644
index 00000000..93c9097f
--- /dev/null
+++ b/benchmarks/molecules/gly/gly40.xyz
@@ -0,0 +1,285 @@
+283
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+O 119.4887 0.0075 83.7783
+H 118.9003 0.0141 84.6648
diff --git a/benchmarks/molecules/gly/gly50.xyz b/benchmarks/molecules/gly/gly50.xyz
new file mode 100644
index 00000000..30daa813
--- /dev/null
+++ b/benchmarks/molecules/gly/gly50.xyz
@@ -0,0 +1,355 @@
+353
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+N 119.5574 0.0070 83.7289
+C 121.0041 0.0018 83.7290
+C 121.5256 0.0073 85.1624
+O 120.7959 0.0151 86.1508
+H 121.3530 -0.8982 83.2112
+H 121.3603 0.8908 83.2008
+H 119.0851 0.0109 84.6286
+N 122.8452 0.0037 85.3953
+C 123.3398 0.0092 86.7549
+C 124.8652 0.0036 86.7549
+O 125.5445 -0.0044 85.7313
+H 122.9726 0.9093 87.2596
+H 122.9652 -0.8797 87.2704
+H 123.5292 -0.0003 84.6440
+N 125.5352 0.0074 87.9154
+C 126.9820 0.0019 87.9154
+C 127.5035 0.0077 89.3489
+O 126.7738 0.0158 90.3372
+H 127.3307 -0.8983 87.3979
+H 127.3383 0.8907 87.3870
+H 125.0630 0.0116 88.8150
+N 128.8231 0.0039 89.5818
+C 129.3177 0.0097 90.9414
+C 130.8431 0.0038 90.9414
+O 131.5224 -0.0046 89.9178
+H 128.9506 0.9099 91.4458
+H 128.9429 -0.8790 91.4570
+H 129.5071 -0.0004 88.8304
+N 131.5131 0.0077 92.1018
+C 132.9598 0.0020 92.1018
+C 133.4813 0.0081 93.5353
+O 132.7516 0.0166 94.5237
+H 133.3084 -0.8984 91.5846
+H 133.3164 0.8906 91.5732
+H 131.0409 0.0122 93.0015
+N 134.8009 0.0041 93.7682
+C 135.2955 0.0101 95.1278
+C 136.8210 0.0040 95.1278
+O 137.5003 -0.0048 94.1042
+H 134.9286 0.9105 95.6320
+H 134.9206 -0.8784 95.6437
+H 135.4849 -0.0005 93.0169
+N 137.4910 0.0081 96.2883
+C 138.9377 0.0021 96.2883
+C 139.4592 0.0084 97.7218
+O 138.7295 0.0173 98.7101
+H 139.2861 -0.8985 95.7713
+H 139.2944 0.8904 95.7594
+H 137.0187 0.0129 97.1879
+N 140.7788 0.0043 97.9547
+C 141.2734 0.0105 99.3142
+C 142.7988 0.0041 99.3143
+O 143.4781 -0.0050 98.2906
+H 140.9067 0.9112 99.8182
+H 140.8983 -0.8777 99.8304
+H 141.4628 -0.0007 97.2033
+N 143.4688 0.0084 100.4747
+C 144.9156 0.0021 100.4747
+C 145.4371 0.0088 101.9082
+O 144.7074 0.0181 102.8966
+H 145.2638 -0.8986 99.9579
+H 145.2724 0.8903 99.9456
+H 142.9966 0.0136 101.3744
+N 146.7567 0.0045 102.1411
+C 147.2513 0.0110 103.5007
+C 148.7767 0.0043 103.5007
+O 149.4560 -0.0052 102.4771
+H 146.8847 0.9118 104.0044
+H 146.8760 -0.8771 104.0171
+H 147.4407 -0.0008 101.3898
+O 149.3780 0.0094 104.7105
+H 148.7897 0.0177 105.5970
diff --git a/benchmarks/molecules/gly/gly60.xyz b/benchmarks/molecules/gly/gly60.xyz
new file mode 100644
index 00000000..bfeda008
--- /dev/null
+++ b/benchmarks/molecules/gly/gly60.xyz
@@ -0,0 +1,425 @@
+423
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+N 119.5574 0.0070 83.7289
+C 121.0041 0.0018 83.7290
+C 121.5256 0.0073 85.1624
+O 120.7959 0.0151 86.1508
+H 121.3530 -0.8982 83.2112
+H 121.3603 0.8908 83.2008
+H 119.0851 0.0109 84.6286
+N 122.8452 0.0037 85.3953
+C 123.3398 0.0092 86.7549
+C 124.8652 0.0036 86.7549
+O 125.5445 -0.0044 85.7313
+H 122.9726 0.9093 87.2596
+H 122.9652 -0.8797 87.2704
+H 123.5292 -0.0003 84.6440
+N 125.5352 0.0074 87.9154
+C 126.9820 0.0019 87.9154
+C 127.5035 0.0077 89.3489
+O 126.7738 0.0158 90.3372
+H 127.3307 -0.8983 87.3979
+H 127.3383 0.8907 87.3870
+H 125.0630 0.0116 88.8150
+N 128.8231 0.0039 89.5818
+C 129.3177 0.0097 90.9414
+C 130.8431 0.0038 90.9414
+O 131.5224 -0.0046 89.9178
+H 128.9506 0.9099 91.4458
+H 128.9429 -0.8790 91.4570
+H 129.5071 -0.0004 88.8304
+N 131.5131 0.0077 92.1018
+C 132.9598 0.0020 92.1018
+C 133.4813 0.0081 93.5353
+O 132.7516 0.0166 94.5237
+H 133.3084 -0.8984 91.5846
+H 133.3164 0.8906 91.5732
+H 131.0409 0.0122 93.0015
+N 134.8009 0.0041 93.7682
+C 135.2955 0.0101 95.1278
+C 136.8210 0.0040 95.1278
+O 137.5003 -0.0048 94.1042
+H 134.9286 0.9105 95.6320
+H 134.9206 -0.8784 95.6437
+H 135.4849 -0.0005 93.0169
+N 137.4910 0.0081 96.2883
+C 138.9377 0.0021 96.2883
+C 139.4592 0.0084 97.7218
+O 138.7295 0.0173 98.7101
+H 139.2861 -0.8985 95.7713
+H 139.2944 0.8904 95.7594
+H 137.0187 0.0129 97.1879
+N 140.7788 0.0043 97.9547
+C 141.2734 0.0105 99.3142
+C 142.7988 0.0041 99.3143
+O 143.4781 -0.0050 98.2906
+H 140.9067 0.9112 99.8182
+H 140.8983 -0.8777 99.8304
+H 141.4628 -0.0007 97.2033
+N 143.4688 0.0084 100.4747
+C 144.9156 0.0021 100.4747
+C 145.4371 0.0088 101.9082
+O 144.7074 0.0181 102.8966
+H 145.2638 -0.8986 99.9579
+H 145.2724 0.8903 99.9456
+H 142.9966 0.0136 101.3744
+N 146.7567 0.0045 102.1411
+C 147.2513 0.0110 103.5007
+C 148.7767 0.0043 103.5007
+O 149.4560 -0.0052 102.4771
+H 146.8847 0.9118 104.0044
+H 146.8760 -0.8771 104.0171
+H 147.4407 -0.0008 101.3898
+N 149.4467 0.0088 104.6612
+C 150.8934 0.0022 104.6612
+C 151.4149 0.0092 106.0947
+O 150.6853 0.0189 107.0830
+H 151.2415 -0.8987 104.1446
+H 151.2504 0.8902 104.1319
+H 148.9745 0.0142 105.5608
+N 152.7345 0.0047 106.3276
+C 153.2292 0.0115 107.6871
+C 154.7545 0.0045 107.6871
+O 155.4339 -0.0054 106.6636
+H 152.8627 0.9125 108.1907
+H 152.8537 -0.8764 108.2038
+H 153.4185 -0.0009 105.5762
+N 155.4246 0.0091 108.8476
+C 156.8713 0.0023 108.8476
+C 157.3928 0.0095 110.2811
+O 156.6631 0.0196 111.2694
+H 157.2192 -0.8988 108.3313
+H 157.2285 0.8901 108.3181
+H 154.9523 0.0149 109.7473
+N 158.7124 0.0049 110.5140
+C 159.2070 0.0119 111.8736
+C 160.7324 0.0047 111.8736
+O 161.4117 -0.0056 110.8500
+H 158.8408 0.9131 112.3769
+H 158.8315 -0.8758 112.3904
+H 159.3964 -0.0011 109.7627
+N 161.4024 0.0095 113.0341
+C 162.8492 0.0024 113.0341
+C 163.3707 0.0099 114.4676
+O 162.6410 0.0204 115.4559
+H 163.1969 -0.8989 112.5180
+H 163.2065 0.8900 112.5043
+H 160.9302 0.0156 113.9337
+N 164.6903 0.0050 114.7005
+C 165.1849 0.0124 116.0600
+C 166.7103 0.0048 116.0601
+O 167.3896 -0.0059 115.0365
+H 164.8188 0.9138 116.5631
+H 164.8092 -0.8751 116.5771
+H 165.3743 -0.0012 113.9491
+N 167.3803 0.0098 117.2205
+C 168.8270 0.0025 117.2205
+C 169.3485 0.0102 118.6540
+O 168.6189 0.0211 119.6423
+H 169.1746 -0.8990 116.7047
+H 169.1845 0.8899 116.6905
+H 166.9081 0.0162 118.1201
+N 170.6681 0.0052 118.8869
+C 171.1628 0.0128 120.2465
+C 172.6882 0.0050 120.2465
+O 173.3675 -0.0061 119.2229
+H 170.7968 0.9144 120.7493
+H 170.7869 -0.8745 120.7638
+H 171.3521 -0.0013 118.1356
+N 173.3582 0.0102 121.4070
+C 174.8049 0.0026 121.4070
+C 175.3264 0.0106 122.8404
+O 174.5967 0.0219 123.8288
+H 175.1523 -0.8992 120.8914
+H 175.1626 0.8898 120.8767
+H 172.8859 0.0169 122.3066
+N 176.6460 0.0054 123.0734
+C 177.1406 0.0132 124.4329
+C 178.6660 0.0052 124.4330
+O 179.3453 -0.0063 123.4094
+H 176.7749 0.9151 124.9355
+H 176.7646 -0.8738 124.9505
+H 177.3300 -0.0015 122.3220
+O 179.2673 0.0113 125.6427
+H 178.6790 0.0212 126.5292
diff --git a/benchmarks/molecules/gly/gly70.xyz b/benchmarks/molecules/gly/gly70.xyz
new file mode 100644
index 00000000..4af76de4
--- /dev/null
+++ b/benchmarks/molecules/gly/gly70.xyz
@@ -0,0 +1,495 @@
+493
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+N 119.5574 0.0070 83.7289
+C 121.0041 0.0018 83.7290
+C 121.5256 0.0073 85.1624
+O 120.7959 0.0151 86.1508
+H 121.3530 -0.8982 83.2112
+H 121.3603 0.8908 83.2008
+H 119.0851 0.0109 84.6286
+N 122.8452 0.0037 85.3953
+C 123.3398 0.0092 86.7549
+C 124.8652 0.0036 86.7549
+O 125.5445 -0.0044 85.7313
+H 122.9726 0.9093 87.2596
+H 122.9652 -0.8797 87.2704
+H 123.5292 -0.0003 84.6440
+N 125.5352 0.0074 87.9154
+C 126.9820 0.0019 87.9154
+C 127.5035 0.0077 89.3489
+O 126.7738 0.0158 90.3372
+H 127.3307 -0.8983 87.3979
+H 127.3383 0.8907 87.3870
+H 125.0630 0.0116 88.8150
+N 128.8231 0.0039 89.5818
+C 129.3177 0.0097 90.9414
+C 130.8431 0.0038 90.9414
+O 131.5224 -0.0046 89.9178
+H 128.9506 0.9099 91.4458
+H 128.9429 -0.8790 91.4570
+H 129.5071 -0.0004 88.8304
+N 131.5131 0.0077 92.1018
+C 132.9598 0.0020 92.1018
+C 133.4813 0.0081 93.5353
+O 132.7516 0.0166 94.5237
+H 133.3084 -0.8984 91.5846
+H 133.3164 0.8906 91.5732
+H 131.0409 0.0122 93.0015
+N 134.8009 0.0041 93.7682
+C 135.2955 0.0101 95.1278
+C 136.8210 0.0040 95.1278
+O 137.5003 -0.0048 94.1042
+H 134.9286 0.9105 95.6320
+H 134.9206 -0.8784 95.6437
+H 135.4849 -0.0005 93.0169
+N 137.4910 0.0081 96.2883
+C 138.9377 0.0021 96.2883
+C 139.4592 0.0084 97.7218
+O 138.7295 0.0173 98.7101
+H 139.2861 -0.8985 95.7713
+H 139.2944 0.8904 95.7594
+H 137.0187 0.0129 97.1879
+N 140.7788 0.0043 97.9547
+C 141.2734 0.0105 99.3142
+C 142.7988 0.0041 99.3143
+O 143.4781 -0.0050 98.2906
+H 140.9067 0.9112 99.8182
+H 140.8983 -0.8777 99.8304
+H 141.4628 -0.0007 97.2033
+N 143.4688 0.0084 100.4747
+C 144.9156 0.0021 100.4747
+C 145.4371 0.0088 101.9082
+O 144.7074 0.0181 102.8966
+H 145.2638 -0.8986 99.9579
+H 145.2724 0.8903 99.9456
+H 142.9966 0.0136 101.3744
+N 146.7567 0.0045 102.1411
+C 147.2513 0.0110 103.5007
+C 148.7767 0.0043 103.5007
+O 149.4560 -0.0052 102.4771
+H 146.8847 0.9118 104.0044
+H 146.8760 -0.8771 104.0171
+H 147.4407 -0.0008 101.3898
+N 149.4467 0.0088 104.6612
+C 150.8934 0.0022 104.6612
+C 151.4149 0.0092 106.0947
+O 150.6853 0.0189 107.0830
+H 151.2415 -0.8987 104.1446
+H 151.2504 0.8902 104.1319
+H 148.9745 0.0142 105.5608
+N 152.7345 0.0047 106.3276
+C 153.2292 0.0115 107.6871
+C 154.7545 0.0045 107.6871
+O 155.4339 -0.0054 106.6636
+H 152.8627 0.9125 108.1907
+H 152.8537 -0.8764 108.2038
+H 153.4185 -0.0009 105.5762
+N 155.4246 0.0091 108.8476
+C 156.8713 0.0023 108.8476
+C 157.3928 0.0095 110.2811
+O 156.6631 0.0196 111.2694
+H 157.2192 -0.8988 108.3313
+H 157.2285 0.8901 108.3181
+H 154.9523 0.0149 109.7473
+N 158.7124 0.0049 110.5140
+C 159.2070 0.0119 111.8736
+C 160.7324 0.0047 111.8736
+O 161.4117 -0.0056 110.8500
+H 158.8408 0.9131 112.3769
+H 158.8315 -0.8758 112.3904
+H 159.3964 -0.0011 109.7627
+N 161.4024 0.0095 113.0341
+C 162.8492 0.0024 113.0341
+C 163.3707 0.0099 114.4676
+O 162.6410 0.0204 115.4559
+H 163.1969 -0.8989 112.5180
+H 163.2065 0.8900 112.5043
+H 160.9302 0.0156 113.9337
+N 164.6903 0.0050 114.7005
+C 165.1849 0.0124 116.0600
+C 166.7103 0.0048 116.0601
+O 167.3896 -0.0059 115.0365
+H 164.8188 0.9138 116.5631
+H 164.8092 -0.8751 116.5771
+H 165.3743 -0.0012 113.9491
+N 167.3803 0.0098 117.2205
+C 168.8270 0.0025 117.2205
+C 169.3485 0.0102 118.6540
+O 168.6189 0.0211 119.6423
+H 169.1746 -0.8990 116.7047
+H 169.1845 0.8899 116.6905
+H 166.9081 0.0162 118.1201
+N 170.6681 0.0052 118.8869
+C 171.1628 0.0128 120.2465
+C 172.6882 0.0050 120.2465
+O 173.3675 -0.0061 119.2229
+H 170.7968 0.9144 120.7493
+H 170.7869 -0.8745 120.7638
+H 171.3521 -0.0013 118.1356
+N 173.3582 0.0102 121.4070
+C 174.8049 0.0026 121.4070
+C 175.3264 0.0106 122.8404
+O 174.5967 0.0219 123.8288
+H 175.1523 -0.8992 120.8914
+H 175.1626 0.8898 120.8767
+H 172.8859 0.0169 122.3066
+N 176.6460 0.0054 123.0734
+C 177.1406 0.0132 124.4329
+C 178.6660 0.0052 124.4330
+O 179.3453 -0.0063 123.4094
+H 176.7749 0.9151 124.9355
+H 176.7646 -0.8738 124.9505
+H 177.3300 -0.0015 122.3220
+N 179.3360 0.0105 125.5934
+C 180.7828 0.0027 125.5934
+C 181.3043 0.0110 127.0269
+O 180.5746 0.0226 128.0152
+H 181.1300 -0.8993 125.0780
+H 181.1406 0.8896 125.0630
+H 178.8638 0.0176 126.4930
+N 182.6239 0.0056 127.2598
+C 183.1185 0.0137 128.6194
+C 184.6439 0.0053 128.6194
+O 185.3232 -0.0065 127.5958
+H 182.7529 0.9157 129.1217
+H 182.7423 -0.8732 129.1371
+H 183.3079 -0.0016 126.5085
+N 185.3139 0.0109 129.7798
+C 186.7606 0.0028 129.7799
+C 187.2822 0.0113 131.2133
+O 186.5525 0.0234 132.2017
+H 187.1077 -0.8994 129.2647
+H 187.1186 0.8895 129.2492
+H 184.8417 0.0183 130.6795
+N 188.6017 0.0058 131.4463
+C 189.0964 0.0142 132.8058
+C 190.6217 0.0055 132.8058
+O 191.3011 -0.0067 131.7823
+H 188.7309 0.9164 133.3079
+H 188.7200 -0.8725 133.3238
+H 189.2857 -0.0017 130.6949
+N 191.2918 0.0113 133.9663
+C 192.7385 0.0029 133.9663
+C 193.2600 0.0117 135.3998
+O 192.5303 0.0241 136.3881
+H 193.0854 -0.8995 133.4514
+H 193.0966 0.8894 133.4354
+H 190.8195 0.0189 134.8659
+N 194.5796 0.0060 135.6327
+C 195.0742 0.0146 136.9922
+C 196.5996 0.0057 136.9923
+O 197.2789 -0.0069 135.9687
+H 194.7090 0.9170 137.4941
+H 194.6977 -0.8719 137.5105
+H 195.2636 -0.0019 134.8814
+N 197.2696 0.0116 138.1527
+C 198.7164 0.0029 138.1528
+C 199.2379 0.0121 139.5862
+O 198.5082 0.0249 140.5746
+H 199.0631 -0.8996 137.6381
+H 199.0747 0.8893 137.6216
+H 196.7974 0.0196 139.0524
+N 200.5575 0.0062 139.8192
+C 201.0521 0.0150 141.1787
+C 202.5775 0.0059 141.1787
+O 203.2568 -0.0072 140.1552
+H 200.6870 0.9177 141.6803
+H 200.6754 -0.8712 141.6972
+H 201.2415 -0.0020 139.0678
+N 203.2475 0.0120 142.3392
+C 204.6942 0.0030 142.3392
+C 205.2157 0.0124 143.7727
+O 204.4861 0.0257 144.7610
+H 205.0408 -0.8997 141.8248
+H 205.0527 0.8892 141.8078
+H 202.7753 0.0203 143.2388
+N 206.5353 0.0063 144.0056
+C 207.0300 0.0155 145.3651
+C 208.5553 0.0060 145.3652
+O 209.2347 -0.0074 144.3416
+H 206.6650 0.9183 145.8665
+H 206.6531 -0.8706 145.8838
+H 207.2193 -0.0021 143.2543
+O 209.1567 0.0132 146.5750
+H 208.5684 0.0248 147.4614
diff --git a/benchmarks/molecules/gly/gly80.xyz b/benchmarks/molecules/gly/gly80.xyz
new file mode 100644
index 00000000..8bb7b79d
--- /dev/null
+++ b/benchmarks/molecules/gly/gly80.xyz
@@ -0,0 +1,565 @@
+563
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+N 119.5574 0.0070 83.7289
+C 121.0041 0.0018 83.7290
+C 121.5256 0.0073 85.1624
+O 120.7959 0.0151 86.1508
+H 121.3530 -0.8982 83.2112
+H 121.3603 0.8908 83.2008
+H 119.0851 0.0109 84.6286
+N 122.8452 0.0037 85.3953
+C 123.3398 0.0092 86.7549
+C 124.8652 0.0036 86.7549
+O 125.5445 -0.0044 85.7313
+H 122.9726 0.9093 87.2596
+H 122.9652 -0.8797 87.2704
+H 123.5292 -0.0003 84.6440
+N 125.5352 0.0074 87.9154
+C 126.9820 0.0019 87.9154
+C 127.5035 0.0077 89.3489
+O 126.7738 0.0158 90.3372
+H 127.3307 -0.8983 87.3979
+H 127.3383 0.8907 87.3870
+H 125.0630 0.0116 88.8150
+N 128.8231 0.0039 89.5818
+C 129.3177 0.0097 90.9414
+C 130.8431 0.0038 90.9414
+O 131.5224 -0.0046 89.9178
+H 128.9506 0.9099 91.4458
+H 128.9429 -0.8790 91.4570
+H 129.5071 -0.0004 88.8304
+N 131.5131 0.0077 92.1018
+C 132.9598 0.0020 92.1018
+C 133.4813 0.0081 93.5353
+O 132.7516 0.0166 94.5237
+H 133.3084 -0.8984 91.5846
+H 133.3164 0.8906 91.5732
+H 131.0409 0.0122 93.0015
+N 134.8009 0.0041 93.7682
+C 135.2955 0.0101 95.1278
+C 136.8210 0.0040 95.1278
+O 137.5003 -0.0048 94.1042
+H 134.9286 0.9105 95.6320
+H 134.9206 -0.8784 95.6437
+H 135.4849 -0.0005 93.0169
+N 137.4910 0.0081 96.2883
+C 138.9377 0.0021 96.2883
+C 139.4592 0.0084 97.7218
+O 138.7295 0.0173 98.7101
+H 139.2861 -0.8985 95.7713
+H 139.2944 0.8904 95.7594
+H 137.0187 0.0129 97.1879
+N 140.7788 0.0043 97.9547
+C 141.2734 0.0105 99.3142
+C 142.7988 0.0041 99.3143
+O 143.4781 -0.0050 98.2906
+H 140.9067 0.9112 99.8182
+H 140.8983 -0.8777 99.8304
+H 141.4628 -0.0007 97.2033
+N 143.4688 0.0084 100.4747
+C 144.9156 0.0021 100.4747
+C 145.4371 0.0088 101.9082
+O 144.7074 0.0181 102.8966
+H 145.2638 -0.8986 99.9579
+H 145.2724 0.8903 99.9456
+H 142.9966 0.0136 101.3744
+N 146.7567 0.0045 102.1411
+C 147.2513 0.0110 103.5007
+C 148.7767 0.0043 103.5007
+O 149.4560 -0.0052 102.4771
+H 146.8847 0.9118 104.0044
+H 146.8760 -0.8771 104.0171
+H 147.4407 -0.0008 101.3898
+N 149.4467 0.0088 104.6612
+C 150.8934 0.0022 104.6612
+C 151.4149 0.0092 106.0947
+O 150.6853 0.0189 107.0830
+H 151.2415 -0.8987 104.1446
+H 151.2504 0.8902 104.1319
+H 148.9745 0.0142 105.5608
+N 152.7345 0.0047 106.3276
+C 153.2292 0.0115 107.6871
+C 154.7545 0.0045 107.6871
+O 155.4339 -0.0054 106.6636
+H 152.8627 0.9125 108.1907
+H 152.8537 -0.8764 108.2038
+H 153.4185 -0.0009 105.5762
+N 155.4246 0.0091 108.8476
+C 156.8713 0.0023 108.8476
+C 157.3928 0.0095 110.2811
+O 156.6631 0.0196 111.2694
+H 157.2192 -0.8988 108.3313
+H 157.2285 0.8901 108.3181
+H 154.9523 0.0149 109.7473
+N 158.7124 0.0049 110.5140
+C 159.2070 0.0119 111.8736
+C 160.7324 0.0047 111.8736
+O 161.4117 -0.0056 110.8500
+H 158.8408 0.9131 112.3769
+H 158.8315 -0.8758 112.3904
+H 159.3964 -0.0011 109.7627
+N 161.4024 0.0095 113.0341
+C 162.8492 0.0024 113.0341
+C 163.3707 0.0099 114.4676
+O 162.6410 0.0204 115.4559
+H 163.1969 -0.8989 112.5180
+H 163.2065 0.8900 112.5043
+H 160.9302 0.0156 113.9337
+N 164.6903 0.0050 114.7005
+C 165.1849 0.0124 116.0600
+C 166.7103 0.0048 116.0601
+O 167.3896 -0.0059 115.0365
+H 164.8188 0.9138 116.5631
+H 164.8092 -0.8751 116.5771
+H 165.3743 -0.0012 113.9491
+N 167.3803 0.0098 117.2205
+C 168.8270 0.0025 117.2205
+C 169.3485 0.0102 118.6540
+O 168.6189 0.0211 119.6423
+H 169.1746 -0.8990 116.7047
+H 169.1845 0.8899 116.6905
+H 166.9081 0.0162 118.1201
+N 170.6681 0.0052 118.8869
+C 171.1628 0.0128 120.2465
+C 172.6882 0.0050 120.2465
+O 173.3675 -0.0061 119.2229
+H 170.7968 0.9144 120.7493
+H 170.7869 -0.8745 120.7638
+H 171.3521 -0.0013 118.1356
+N 173.3582 0.0102 121.4070
+C 174.8049 0.0026 121.4070
+C 175.3264 0.0106 122.8404
+O 174.5967 0.0219 123.8288
+H 175.1523 -0.8992 120.8914
+H 175.1626 0.8898 120.8767
+H 172.8859 0.0169 122.3066
+N 176.6460 0.0054 123.0734
+C 177.1406 0.0132 124.4329
+C 178.6660 0.0052 124.4330
+O 179.3453 -0.0063 123.4094
+H 176.7749 0.9151 124.9355
+H 176.7646 -0.8738 124.9505
+H 177.3300 -0.0015 122.3220
+N 179.3360 0.0105 125.5934
+C 180.7828 0.0027 125.5934
+C 181.3043 0.0110 127.0269
+O 180.5746 0.0226 128.0152
+H 181.1300 -0.8993 125.0780
+H 181.1406 0.8896 125.0630
+H 178.8638 0.0176 126.4930
+N 182.6239 0.0056 127.2598
+C 183.1185 0.0137 128.6194
+C 184.6439 0.0053 128.6194
+O 185.3232 -0.0065 127.5958
+H 182.7529 0.9157 129.1217
+H 182.7423 -0.8732 129.1371
+H 183.3079 -0.0016 126.5085
+N 185.3139 0.0109 129.7798
+C 186.7606 0.0028 129.7799
+C 187.2822 0.0113 131.2133
+O 186.5525 0.0234 132.2017
+H 187.1077 -0.8994 129.2647
+H 187.1186 0.8895 129.2492
+H 184.8417 0.0183 130.6795
+N 188.6017 0.0058 131.4463
+C 189.0964 0.0142 132.8058
+C 190.6217 0.0055 132.8058
+O 191.3011 -0.0067 131.7823
+H 188.7309 0.9164 133.3079
+H 188.7200 -0.8725 133.3238
+H 189.2857 -0.0017 130.6949
+N 191.2918 0.0113 133.9663
+C 192.7385 0.0029 133.9663
+C 193.2600 0.0117 135.3998
+O 192.5303 0.0241 136.3881
+H 193.0854 -0.8995 133.4514
+H 193.0966 0.8894 133.4354
+H 190.8195 0.0189 134.8659
+N 194.5796 0.0060 135.6327
+C 195.0742 0.0146 136.9922
+C 196.5996 0.0057 136.9923
+O 197.2789 -0.0069 135.9687
+H 194.7090 0.9170 137.4941
+H 194.6977 -0.8719 137.5105
+H 195.2636 -0.0019 134.8814
+N 197.2696 0.0116 138.1527
+C 198.7164 0.0029 138.1528
+C 199.2379 0.0121 139.5862
+O 198.5082 0.0249 140.5746
+H 199.0631 -0.8996 137.6381
+H 199.0747 0.8893 137.6216
+H 196.7974 0.0196 139.0524
+N 200.5575 0.0062 139.8192
+C 201.0521 0.0150 141.1787
+C 202.5775 0.0059 141.1787
+O 203.2568 -0.0072 140.1552
+H 200.6870 0.9177 141.6803
+H 200.6754 -0.8712 141.6972
+H 201.2415 -0.0020 139.0678
+N 203.2475 0.0120 142.3392
+C 204.6942 0.0030 142.3392
+C 205.2157 0.0124 143.7727
+O 204.4861 0.0257 144.7610
+H 205.0408 -0.8997 141.8248
+H 205.0527 0.8892 141.8078
+H 202.7753 0.0203 143.2388
+N 206.5353 0.0063 144.0056
+C 207.0300 0.0155 145.3651
+C 208.5553 0.0060 145.3652
+O 209.2347 -0.0074 144.3416
+H 206.6650 0.9183 145.8665
+H 206.6531 -0.8706 145.8838
+H 207.2193 -0.0021 143.2543
+N 209.2254 0.0123 146.5256
+C 210.6721 0.0031 146.5257
+C 211.1936 0.0128 147.9591
+O 210.4640 0.0264 148.9474
+H 211.0185 -0.8998 146.0114
+H 211.0307 0.8891 145.9940
+H 208.7531 0.0209 147.4253
+N 212.5132 0.0065 148.1920
+C 213.0078 0.0159 149.5516
+C 214.5332 0.0062 149.5516
+O 215.2125 -0.0076 148.5281
+H 212.6431 0.9190 150.0528
+H 212.6308 -0.8699 150.0705
+H 213.1972 -0.0022 147.4407
+N 215.2032 0.0127 150.7121
+C 216.6500 0.0032 150.7121
+C 217.1715 0.0132 152.1456
+O 216.4418 0.0272 153.1339
+H 216.9962 -0.8999 150.1981
+H 217.0087 0.8890 150.1803
+H 214.7310 0.0216 151.6117
+N 218.4911 0.0067 152.3785
+C 218.9857 0.0164 153.7380
+C 220.5111 0.0064 153.7381
+O 221.1904 -0.0078 152.7145
+H 218.6211 0.9196 154.2390
+H 218.6085 -0.8693 154.2572
+H 219.1750 -0.0024 151.6272
+N 221.1811 0.0130 154.8985
+C 222.6278 0.0033 154.8986
+C 223.1494 0.0135 156.3320
+O 222.4197 0.0279 157.3203
+H 222.9739 -0.9000 154.3848
+H 222.9868 0.8888 154.3665
+H 220.7089 0.0223 155.7981
+N 224.4689 0.0069 156.5650
+C 224.9636 0.0168 157.9245
+C 226.4890 0.0066 157.9245
+O 227.1682 -0.0080 156.9010
+H 224.5991 0.9202 158.4252
+H 224.5862 -0.8686 158.4439
+H 225.1529 -0.0025 155.8136
+N 227.1590 0.0134 159.0850
+C 228.6057 0.0034 159.0850
+C 229.1272 0.0139 160.5185
+O 228.3976 0.0287 161.5068
+H 228.9516 -0.9001 158.5715
+H 228.9648 0.8887 158.5527
+H 226.6868 0.0229 159.9846
+N 230.4468 0.0071 160.7514
+C 230.9415 0.0173 162.1109
+C 232.4668 0.0067 162.1110
+O 233.1461 -0.0082 161.0874
+H 230.5772 0.9209 162.6114
+H 230.5639 -0.8680 162.6305
+H 231.1308 -0.0026 160.0001
+N 233.1368 0.0137 163.2714
+C 234.5836 0.0035 163.2715
+C 235.1051 0.0143 164.7049
+O 234.3754 0.0294 165.6932
+H 234.9293 -0.9002 162.7582
+H 234.9428 0.8886 162.7389
+H 232.6646 0.0236 164.1710
+N 236.4247 0.0073 164.9378
+C 236.9193 0.0177 166.2974
+C 238.4447 0.0069 166.2974
+O 239.1240 -0.0084 165.2739
+H 236.5552 0.9215 166.7976
+H 236.5417 -0.8673 166.8172
+H 237.1086 -0.0028 164.1865
+O 239.0460 0.0151 167.5072
+H 238.4577 0.0283 168.3936
diff --git a/benchmarks/molecules/gly/gly90.xyz b/benchmarks/molecules/gly/gly90.xyz
new file mode 100644
index 00000000..eb1b8dc9
--- /dev/null
+++ b/benchmarks/molecules/gly/gly90.xyz
@@ -0,0 +1,635 @@
+633
+Frame 1
+N 0.0000 0.0000 0.0000
+C 1.4468 0.0000 0.0000
+C 1.9683 0.0000 1.4335
+O 1.2385 0.0000 2.4219
+H 1.7989 -0.8960 -0.5224
+H 1.7997 0.8930 -0.5236
+H -0.4722 -0.0025 0.8996
+H -0.5080 0.0767 -0.8765
+N 3.2878 -0.0000 1.6664
+C 3.7825 0.0002 3.0260
+C 5.3079 0.0002 3.0260
+O 5.9872 -0.0000 2.0023
+H 3.4120 0.8963 3.5353
+H 3.4111 -0.8927 3.5368
+H 3.9719 0.0024 0.9150
+N 5.9779 0.0003 4.1865
+C 7.4246 0.0001 4.1865
+C 7.9461 0.0004 5.6199
+O 7.2164 0.0008 6.6083
+H 7.7766 -0.8961 3.6643
+H 7.7778 0.8929 3.6627
+H 5.5056 -0.0019 5.0861
+N 9.2657 0.0002 5.8528
+C 9.7603 0.0007 7.2124
+C 11.2857 0.0003 7.2124
+O 11.9651 -0.0002 6.1888
+H 9.3900 0.8970 7.7215
+H 9.3888 -0.8920 7.7235
+H 9.9497 0.0022 5.1015
+N 11.9557 0.0007 8.3729
+C 13.4025 0.0002 8.3729
+C 13.9240 0.0007 9.8064
+O 13.1943 0.0015 10.7948
+H 13.7543 -0.8962 7.8510
+H 13.7558 0.8928 7.8489
+H 11.4835 -0.0012 9.2725
+N 15.2436 0.0004 10.0393
+C 15.7382 0.0011 11.3989
+C 17.2636 0.0005 11.3989
+O 17.9429 -0.0005 10.3752
+H 15.3680 0.8976 11.9077
+H 15.3665 -0.8914 11.9102
+H 15.9276 0.0021 9.2879
+N 17.9336 0.0010 12.5593
+C 19.3804 0.0003 12.5593
+C 19.9018 0.0011 13.9928
+O 19.1721 0.0023 14.9812
+H 19.7320 -0.8963 12.0377
+H 19.7338 0.8927 12.0351
+H 17.4614 -0.0005 13.4590
+N 21.2215 0.0006 14.2257
+C 21.7161 0.0016 15.5853
+C 23.2415 0.0007 15.5853
+O 23.9208 -0.0007 14.5617
+H 21.3461 0.8982 16.0940
+H 21.3442 -0.8907 16.0969
+H 21.9055 0.0020 13.4744
+N 23.9115 0.0014 16.7458
+C 25.3582 0.0004 16.7458
+C 25.8797 0.0015 18.1793
+O 25.1500 0.0030 19.1677
+H 25.7097 -0.8964 16.2243
+H 25.7118 0.8926 16.2213
+H 23.4392 0.0002 17.6454
+N 27.1993 0.0008 18.4122
+C 27.6939 0.0020 19.7718
+C 29.2193 0.0009 19.7718
+O 29.8987 -0.0009 18.7481
+H 27.3241 0.8989 20.2802
+H 27.3219 -0.8901 20.2835
+H 27.8833 0.0018 17.6608
+N 29.8893 0.0018 20.9322
+C 31.3361 0.0004 20.9322
+C 31.8576 0.0018 22.3657
+O 31.1279 0.0038 23.3541
+H 31.6874 -0.8965 20.4110
+H 31.6899 0.8924 20.4075
+H 29.4171 0.0008 21.8319
+N 33.1772 0.0009 22.5986
+C 33.6718 0.0025 23.9582
+C 35.1972 0.0010 23.9582
+O 35.8766 -0.0011 22.9346
+H 33.3021 0.8996 24.4664
+H 33.2996 -0.8894 24.4702
+H 33.8612 0.0017 21.8473
+N 35.8672 0.0021 25.1187
+C 37.3140 0.0005 25.1187
+C 37.8354 0.0022 26.5522
+O 37.1058 0.0045 27.5406
+H 37.6651 -0.8967 24.5977
+H 37.6679 0.8923 24.5937
+H 35.3950 0.0015 26.0183
+N 39.1551 0.0011 26.7851
+C 39.6497 0.0029 28.1446
+C 41.1751 0.0012 28.1447
+O 41.8544 -0.0013 27.1210
+H 39.2802 0.9002 28.6526
+H 39.2773 -0.8888 28.6569
+H 39.8391 0.0016 26.0337
+N 41.8451 0.0025 29.3051
+C 43.2918 0.0006 29.3051
+C 43.8133 0.0026 30.7386
+O 43.0836 0.0053 31.7270
+H 43.6428 -0.8968 28.7844
+H 43.6459 0.8922 28.7799
+H 41.3728 0.0022 30.2048
+N 45.1329 0.0013 30.9715
+C 45.6275 0.0034 32.3311
+C 47.1529 0.0014 32.3311
+O 47.8323 -0.0015 31.3075
+H 45.2582 0.9008 32.8388
+H 45.2550 -0.8881 32.8436
+H 45.8169 0.0014 30.2202
+N 47.8229 0.0028 33.4916
+C 49.2697 0.0007 33.4916
+C 49.7912 0.0029 34.9251
+O 49.0615 0.0060 35.9134
+H 49.6205 -0.8969 32.9711
+H 49.6240 0.8921 32.9662
+H 47.3507 0.0028 34.3912
+N 51.1108 0.0015 35.1580
+C 51.6054 0.0038 36.5176
+C 53.1308 0.0016 36.5176
+O 53.8102 -0.0018 35.4939
+H 51.2362 0.9015 37.0250
+H 51.2327 -0.8875 37.0303
+H 51.7948 0.0013 34.4066
+N 53.8008 0.0032 37.6780
+C 55.2476 0.0008 37.6780
+C 55.7691 0.0033 39.1115
+O 55.0394 0.0068 40.0999
+H 55.5982 -0.8970 37.1577
+H 55.6020 0.8920 37.1524
+H 53.3286 0.0035 38.5777
+N 57.0887 0.0017 39.3444
+C 57.5833 0.0043 40.7040
+C 59.1087 0.0017 40.7040
+O 59.7880 -0.0020 39.6804
+H 57.2142 0.9021 41.2112
+H 57.2104 -0.8868 41.2169
+H 57.7727 0.0012 38.5931
+N 59.7787 0.0035 41.8645
+C 61.2254 0.0009 41.8645
+C 61.7469 0.0037 43.2980
+O 61.0172 0.0075 44.2863
+H 61.5759 -0.8971 41.3444
+H 61.5800 0.8919 41.3386
+H 59.3064 0.0042 42.7641
+N 63.0665 0.0019 43.5309
+C 63.5611 0.0047 44.8904
+C 65.0865 0.0019 44.8904
+O 65.7659 -0.0022 43.8668
+H 63.1923 0.9028 45.3974
+H 63.1881 -0.8862 45.4036
+H 63.7505 0.0010 42.7795
+N 65.7565 0.0039 46.0509
+C 67.2033 0.0010 46.0509
+C 67.7248 0.0040 47.4844
+O 66.9951 0.0083 48.4728
+H 67.5536 -0.8972 45.5311
+H 67.5581 0.8918 45.5248
+H 65.2843 0.0049 46.9506
+N 69.0444 0.0021 47.7173
+C 69.5390 0.0052 49.0769
+C 71.0644 0.0021 49.0769
+O 71.7438 -0.0024 48.0533
+H 69.1703 0.9034 49.5837
+H 69.1658 -0.8855 49.5903
+H 69.7284 0.0009 46.9660
+N 71.7344 0.0042 50.2374
+C 73.1812 0.0011 50.2374
+C 73.7027 0.0044 51.6709
+O 72.9730 0.0091 52.6592
+H 73.5313 -0.8973 49.7178
+H 73.5361 0.8917 49.7110
+H 71.2622 0.0055 51.1370
+N 75.0223 0.0022 51.9038
+C 75.5169 0.0056 53.2633
+C 77.0423 0.0022 53.2633
+O 77.7216 -0.0026 52.2397
+H 75.1483 0.9041 53.7699
+H 75.1436 -0.8849 53.7770
+H 75.7063 0.0008 51.1524
+N 77.7123 0.0046 54.4238
+C 79.1590 0.0012 54.4238
+C 79.6805 0.0048 55.8573
+O 78.9508 0.0098 56.8457
+H 79.5090 -0.8974 53.9045
+H 79.5141 0.8916 53.8973
+H 77.2400 0.0062 55.3235
+N 81.0001 0.0024 56.0902
+C 81.4947 0.0061 57.4498
+C 83.0201 0.0024 57.4498
+O 83.6995 -0.0028 56.4262
+H 81.1264 0.9047 57.9561
+H 81.1213 -0.8842 57.9636
+H 81.6841 0.0007 55.3389
+N 83.6901 0.0049 58.6103
+C 85.1369 0.0012 58.6103
+C 85.6584 0.0051 60.0438
+O 84.9287 0.0106 61.0321
+H 85.4867 -0.8975 58.0911
+H 85.4921 0.8914 58.0835
+H 83.2179 0.0069 59.5099
+N 86.9780 0.0026 60.2766
+C 87.4726 0.0065 61.6362
+C 88.9980 0.0026 61.6362
+O 89.6774 -0.0030 60.6126
+H 87.1044 0.9054 62.1423
+H 87.0990 -0.8836 62.1503
+H 87.6620 0.0005 59.5253
+N 89.6680 0.0053 62.7967
+C 91.1148 0.0013 62.7967
+C 91.6363 0.0055 64.2302
+O 90.9066 0.0113 65.2186
+H 91.4644 -0.8976 62.2778
+H 91.4702 0.8913 62.2697
+H 89.1958 0.0075 63.6964
+N 92.9559 0.0028 64.4631
+C 93.4505 0.0070 65.8227
+C 94.9759 0.0028 65.8227
+O 95.6552 -0.0033 64.7991
+H 93.0824 0.9060 66.3285
+H 93.0767 -0.8829 66.3370
+H 93.6399 0.0004 63.7118
+N 95.6459 0.0056 66.9831
+C 97.0926 0.0014 66.9832
+C 97.6141 0.0058 68.4166
+O 96.8844 0.0121 69.4050
+H 97.4421 -0.8977 66.4645
+H 97.4482 0.8912 66.4559
+H 95.1737 0.0082 67.8828
+N 98.9337 0.0030 68.6496
+C 99.4283 0.0074 70.0091
+C 100.9537 0.0029 70.0091
+O 101.6331 -0.0035 68.9855
+H 99.0605 0.9067 70.5147
+H 99.0544 -0.8823 70.5237
+H 99.6177 0.0003 67.8982
+N 101.6237 0.0060 71.1696
+C 103.0705 0.0015 71.1696
+C 103.5920 0.0062 72.6031
+O 102.8623 0.0128 73.5915
+H 103.4199 -0.8978 70.6512
+H 103.4262 0.8911 70.6421
+H 101.1515 0.0089 72.0693
+N 104.9116 0.0032 72.8360
+C 105.4062 0.0079 74.1956
+C 106.9316 0.0031 74.1956
+O 107.6109 -0.0037 73.1720
+H 105.0385 0.9073 74.7010
+H 105.0321 -0.8816 74.7103
+H 105.5956 0.0001 72.0846
+N 107.6016 0.0063 75.3560
+C 109.0484 0.0016 75.3560
+C 109.5699 0.0066 76.7895
+O 108.8402 0.0136 77.7779
+H 109.3976 -0.8980 74.8379
+H 109.4043 0.8910 74.8283
+H 107.1294 0.0095 76.2557
+N 110.8895 0.0034 77.0224
+C 111.3841 0.0083 78.3820
+C 112.9095 0.0033 78.3820
+O 113.5888 -0.0039 77.3584
+H 111.0165 0.9080 78.8872
+H 111.0098 -0.8810 78.8970
+H 111.5735 -0.0000 76.2711
+N 113.5795 0.0067 79.5425
+C 115.0262 0.0017 79.5425
+C 115.5477 0.0069 80.9760
+O 114.8180 0.0143 81.9643
+H 115.3753 -0.8981 79.0246
+H 115.3823 0.8909 79.0145
+H 113.1072 0.0102 80.4421
+N 116.8673 0.0036 81.2089
+C 117.3620 0.0088 82.5685
+C 118.8874 0.0034 82.5685
+O 119.5667 -0.0041 81.5449
+H 116.9946 0.9086 83.0734
+H 116.9875 -0.8803 83.0837
+H 117.5513 -0.0001 80.4575
+N 119.5574 0.0070 83.7289
+C 121.0041 0.0018 83.7290
+C 121.5256 0.0073 85.1624
+O 120.7959 0.0151 86.1508
+H 121.3530 -0.8982 83.2112
+H 121.3603 0.8908 83.2008
+H 119.0851 0.0109 84.6286
+N 122.8452 0.0037 85.3953
+C 123.3398 0.0092 86.7549
+C 124.8652 0.0036 86.7549
+O 125.5445 -0.0044 85.7313
+H 122.9726 0.9093 87.2596
+H 122.9652 -0.8797 87.2704
+H 123.5292 -0.0003 84.6440
+N 125.5352 0.0074 87.9154
+C 126.9820 0.0019 87.9154
+C 127.5035 0.0077 89.3489
+O 126.7738 0.0158 90.3372
+H 127.3307 -0.8983 87.3979
+H 127.3383 0.8907 87.3870
+H 125.0630 0.0116 88.8150
+N 128.8231 0.0039 89.5818
+C 129.3177 0.0097 90.9414
+C 130.8431 0.0038 90.9414
+O 131.5224 -0.0046 89.9178
+H 128.9506 0.9099 91.4458
+H 128.9429 -0.8790 91.4570
+H 129.5071 -0.0004 88.8304
+N 131.5131 0.0077 92.1018
+C 132.9598 0.0020 92.1018
+C 133.4813 0.0081 93.5353
+O 132.7516 0.0166 94.5237
+H 133.3084 -0.8984 91.5846
+H 133.3164 0.8906 91.5732
+H 131.0409 0.0122 93.0015
+N 134.8009 0.0041 93.7682
+C 135.2955 0.0101 95.1278
+C 136.8210 0.0040 95.1278
+O 137.5003 -0.0048 94.1042
+H 134.9286 0.9105 95.6320
+H 134.9206 -0.8784 95.6437
+H 135.4849 -0.0005 93.0169
+N 137.4910 0.0081 96.2883
+C 138.9377 0.0021 96.2883
+C 139.4592 0.0084 97.7218
+O 138.7295 0.0173 98.7101
+H 139.2861 -0.8985 95.7713
+H 139.2944 0.8904 95.7594
+H 137.0187 0.0129 97.1879
+N 140.7788 0.0043 97.9547
+C 141.2734 0.0105 99.3142
+C 142.7988 0.0041 99.3143
+O 143.4781 -0.0050 98.2906
+H 140.9067 0.9112 99.8182
+H 140.8983 -0.8777 99.8304
+H 141.4628 -0.0007 97.2033
+N 143.4688 0.0084 100.4747
+C 144.9156 0.0021 100.4747
+C 145.4371 0.0088 101.9082
+O 144.7074 0.0181 102.8966
+H 145.2638 -0.8986 99.9579
+H 145.2724 0.8903 99.9456
+H 142.9966 0.0136 101.3744
+N 146.7567 0.0045 102.1411
+C 147.2513 0.0110 103.5007
+C 148.7767 0.0043 103.5007
+O 149.4560 -0.0052 102.4771
+H 146.8847 0.9118 104.0044
+H 146.8760 -0.8771 104.0171
+H 147.4407 -0.0008 101.3898
+N 149.4467 0.0088 104.6612
+C 150.8934 0.0022 104.6612
+C 151.4149 0.0092 106.0947
+O 150.6853 0.0189 107.0830
+H 151.2415 -0.8987 104.1446
+H 151.2504 0.8902 104.1319
+H 148.9745 0.0142 105.5608
+N 152.7345 0.0047 106.3276
+C 153.2292 0.0115 107.6871
+C 154.7545 0.0045 107.6871
+O 155.4339 -0.0054 106.6636
+H 152.8627 0.9125 108.1907
+H 152.8537 -0.8764 108.2038
+H 153.4185 -0.0009 105.5762
+N 155.4246 0.0091 108.8476
+C 156.8713 0.0023 108.8476
+C 157.3928 0.0095 110.2811
+O 156.6631 0.0196 111.2694
+H 157.2192 -0.8988 108.3313
+H 157.2285 0.8901 108.3181
+H 154.9523 0.0149 109.7473
+N 158.7124 0.0049 110.5140
+C 159.2070 0.0119 111.8736
+C 160.7324 0.0047 111.8736
+O 161.4117 -0.0056 110.8500
+H 158.8408 0.9131 112.3769
+H 158.8315 -0.8758 112.3904
+H 159.3964 -0.0011 109.7627
+N 161.4024 0.0095 113.0341
+C 162.8492 0.0024 113.0341
+C 163.3707 0.0099 114.4676
+O 162.6410 0.0204 115.4559
+H 163.1969 -0.8989 112.5180
+H 163.2065 0.8900 112.5043
+H 160.9302 0.0156 113.9337
+N 164.6903 0.0050 114.7005
+C 165.1849 0.0124 116.0600
+C 166.7103 0.0048 116.0601
+O 167.3896 -0.0059 115.0365
+H 164.8188 0.9138 116.5631
+H 164.8092 -0.8751 116.5771
+H 165.3743 -0.0012 113.9491
+N 167.3803 0.0098 117.2205
+C 168.8270 0.0025 117.2205
+C 169.3485 0.0102 118.6540
+O 168.6189 0.0211 119.6423
+H 169.1746 -0.8990 116.7047
+H 169.1845 0.8899 116.6905
+H 166.9081 0.0162 118.1201
+N 170.6681 0.0052 118.8869
+C 171.1628 0.0128 120.2465
+C 172.6882 0.0050 120.2465
+O 173.3675 -0.0061 119.2229
+H 170.7968 0.9144 120.7493
+H 170.7869 -0.8745 120.7638
+H 171.3521 -0.0013 118.1356
+N 173.3582 0.0102 121.4070
+C 174.8049 0.0026 121.4070
+C 175.3264 0.0106 122.8404
+O 174.5967 0.0219 123.8288
+H 175.1523 -0.8992 120.8914
+H 175.1626 0.8898 120.8767
+H 172.8859 0.0169 122.3066
+N 176.6460 0.0054 123.0734
+C 177.1406 0.0132 124.4329
+C 178.6660 0.0052 124.4330
+O 179.3453 -0.0063 123.4094
+H 176.7749 0.9151 124.9355
+H 176.7646 -0.8738 124.9505
+H 177.3300 -0.0015 122.3220
+N 179.3360 0.0105 125.5934
+C 180.7828 0.0027 125.5934
+C 181.3043 0.0110 127.0269
+O 180.5746 0.0226 128.0152
+H 181.1300 -0.8993 125.0780
+H 181.1406 0.8896 125.0630
+H 178.8638 0.0176 126.4930
+N 182.6239 0.0056 127.2598
+C 183.1185 0.0137 128.6194
+C 184.6439 0.0053 128.6194
+O 185.3232 -0.0065 127.5958
+H 182.7529 0.9157 129.1217
+H 182.7423 -0.8732 129.1371
+H 183.3079 -0.0016 126.5085
+N 185.3139 0.0109 129.7798
+C 186.7606 0.0028 129.7799
+C 187.2822 0.0113 131.2133
+O 186.5525 0.0234 132.2017
+H 187.1077 -0.8994 129.2647
+H 187.1186 0.8895 129.2492
+H 184.8417 0.0183 130.6795
+N 188.6017 0.0058 131.4463
+C 189.0964 0.0142 132.8058
+C 190.6217 0.0055 132.8058
+O 191.3011 -0.0067 131.7823
+H 188.7309 0.9164 133.3079
+H 188.7200 -0.8725 133.3238
+H 189.2857 -0.0017 130.6949
+N 191.2918 0.0113 133.9663
+C 192.7385 0.0029 133.9663
+C 193.2600 0.0117 135.3998
+O 192.5303 0.0241 136.3881
+H 193.0854 -0.8995 133.4514
+H 193.0966 0.8894 133.4354
+H 190.8195 0.0189 134.8659
+N 194.5796 0.0060 135.6327
+C 195.0742 0.0146 136.9922
+C 196.5996 0.0057 136.9923
+O 197.2789 -0.0069 135.9687
+H 194.7090 0.9170 137.4941
+H 194.6977 -0.8719 137.5105
+H 195.2636 -0.0019 134.8814
+N 197.2696 0.0116 138.1527
+C 198.7164 0.0029 138.1528
+C 199.2379 0.0121 139.5862
+O 198.5082 0.0249 140.5746
+H 199.0631 -0.8996 137.6381
+H 199.0747 0.8893 137.6216
+H 196.7974 0.0196 139.0524
+N 200.5575 0.0062 139.8192
+C 201.0521 0.0150 141.1787
+C 202.5775 0.0059 141.1787
+O 203.2568 -0.0072 140.1552
+H 200.6870 0.9177 141.6803
+H 200.6754 -0.8712 141.6972
+H 201.2415 -0.0020 139.0678
+N 203.2475 0.0120 142.3392
+C 204.6942 0.0030 142.3392
+C 205.2157 0.0124 143.7727
+O 204.4861 0.0257 144.7610
+H 205.0408 -0.8997 141.8248
+H 205.0527 0.8892 141.8078
+H 202.7753 0.0203 143.2388
+N 206.5353 0.0063 144.0056
+C 207.0300 0.0155 145.3651
+C 208.5553 0.0060 145.3652
+O 209.2347 -0.0074 144.3416
+H 206.6650 0.9183 145.8665
+H 206.6531 -0.8706 145.8838
+H 207.2193 -0.0021 143.2543
+N 209.2254 0.0123 146.5256
+C 210.6721 0.0031 146.5257
+C 211.1936 0.0128 147.9591
+O 210.4640 0.0264 148.9474
+H 211.0185 -0.8998 146.0114
+H 211.0307 0.8891 145.9940
+H 208.7531 0.0209 147.4253
+N 212.5132 0.0065 148.1920
+C 213.0078 0.0159 149.5516
+C 214.5332 0.0062 149.5516
+O 215.2125 -0.0076 148.5281
+H 212.6431 0.9190 150.0528
+H 212.6308 -0.8699 150.0705
+H 213.1972 -0.0022 147.4407
+N 215.2032 0.0127 150.7121
+C 216.6500 0.0032 150.7121
+C 217.1715 0.0132 152.1456
+O 216.4418 0.0272 153.1339
+H 216.9962 -0.8999 150.1981
+H 217.0087 0.8890 150.1803
+H 214.7310 0.0216 151.6117
+N 218.4911 0.0067 152.3785
+C 218.9857 0.0164 153.7380
+C 220.5111 0.0064 153.7381
+O 221.1904 -0.0078 152.7145
+H 218.6211 0.9196 154.2390
+H 218.6085 -0.8693 154.2572
+H 219.1750 -0.0024 151.6272
+N 221.1811 0.0130 154.8985
+C 222.6278 0.0033 154.8986
+C 223.1494 0.0135 156.3320
+O 222.4197 0.0279 157.3203
+H 222.9739 -0.9000 154.3848
+H 222.9868 0.8888 154.3665
+H 220.7089 0.0223 155.7981
+N 224.4689 0.0069 156.5650
+C 224.9636 0.0168 157.9245
+C 226.4890 0.0066 157.9245
+O 227.1682 -0.0080 156.9010
+H 224.5991 0.9202 158.4252
+H 224.5862 -0.8686 158.4439
+H 225.1529 -0.0025 155.8136
+N 227.1590 0.0134 159.0850
+C 228.6057 0.0034 159.0850
+C 229.1272 0.0139 160.5185
+O 228.3976 0.0287 161.5068
+H 228.9516 -0.9001 158.5715
+H 228.9648 0.8887 158.5527
+H 226.6868 0.0229 159.9846
+N 230.4468 0.0071 160.7514
+C 230.9415 0.0173 162.1109
+C 232.4668 0.0067 162.1110
+O 233.1461 -0.0082 161.0874
+H 230.5772 0.9209 162.6114
+H 230.5639 -0.8680 162.6305
+H 231.1308 -0.0026 160.0001
+N 233.1368 0.0137 163.2714
+C 234.5836 0.0035 163.2715
+C 235.1051 0.0143 164.7049
+O 234.3754 0.0294 165.6932
+H 234.9293 -0.9002 162.7582
+H 234.9428 0.8886 162.7389
+H 232.6646 0.0236 164.1710
+N 236.4247 0.0073 164.9378
+C 236.9193 0.0177 166.2974
+C 238.4447 0.0069 166.2974
+O 239.1240 -0.0084 165.2739
+H 236.5552 0.9215 166.7976
+H 236.5417 -0.8673 166.8172
+H 237.1086 -0.0028 164.1865
+N 239.1147 0.0141 167.4579
+C 240.5614 0.0036 167.4579
+C 241.0830 0.0146 168.8914
+O 240.3533 0.0302 169.8796
+H 240.9070 -0.9003 166.9449
+H 240.9209 0.8885 166.9251
+H 238.6425 0.0243 168.3575
+N 242.4025 0.0075 169.1243
+C 242.8972 0.0182 170.4838
+C 244.4225 0.0071 170.4839
+O 245.1019 -0.0087 169.4603
+H 242.5332 0.9222 170.9838
+H 242.5194 -0.8667 171.0039
+H 243.0865 -0.0029 168.3730
+N 245.0926 0.0144 171.6443
+C 246.5393 0.0037 171.6444
+C 247.0608 0.0150 173.0778
+O 246.3312 0.0309 174.0661
+H 246.8847 -0.9004 171.1315
+H 246.8989 0.8884 171.1114
+H 244.6204 0.0250 172.5439
+N 248.3804 0.0077 173.3107
+C 248.8750 0.0186 174.6703
+C 250.4004 0.0072 174.6703
+O 251.0797 -0.0089 173.6468
+H 248.5113 0.9228 175.1700
+H 248.4971 -0.8660 175.1906
+H 249.0644 -0.0030 172.5594
+N 251.0704 0.0148 175.8307
+C 252.5172 0.0037 175.8308
+C 253.0387 0.0154 177.2643
+O 252.3091 0.0317 178.2525
+H 252.8624 -0.9005 175.3182
+H 252.8769 0.8883 175.2976
+H 250.5982 0.0256 176.7304
+N 254.3583 0.0078 177.4972
+C 254.8529 0.0191 178.8567
+C 256.3783 0.0074 178.8568
+O 257.0576 -0.0091 177.8332
+H 254.4893 0.9235 179.3562
+H 254.4748 -0.8654 179.3772
+H 255.0422 -0.0032 176.7459
+N 257.0483 0.0151 180.0172
+C 258.4950 0.0038 180.0173
+C 259.0166 0.0157 181.4507
+O 258.2869 0.0324 182.4390
+H 258.8401 -0.9007 179.5049
+H 258.8549 0.8882 179.4838
+H 256.5761 0.0263 180.9168
+N 260.3362 0.0080 181.6836
+C 260.8308 0.0195 183.0432
+C 262.3561 0.0076 183.0432
+O 263.0354 -0.0093 182.0197
+H 260.4673 0.9241 183.5424
+H 260.4525 -0.8647 183.5639
+H 261.0201 -0.0033 180.9323
+N 263.0262 0.0155 184.2036
+C 264.4729 0.0039 184.2037
+C 264.9944 0.0161 185.6371
+O 264.2648 0.0332 186.6254
+H 264.8178 -0.9007 183.6916
+H 264.8329 0.8881 183.6700
+H 262.5540 0.0270 185.1033
+N 266.3140 0.0082 185.8701
+C 266.8087 0.0200 187.2296
+C 268.3340 0.0078 187.2297
+O 269.0133 -0.0095 186.2061
+H 266.4454 0.9247 187.7287
+H 266.4302 -0.8640 187.7506
+H 266.9980 -0.0034 185.1188
+O 268.9354 0.0169 188.4394
+H 268.3471 0.0319 189.3259
diff --git a/benchmarks/molecules/organic/020_Vitamin_C.xyz b/benchmarks/molecules/organic/020_Vitamin_C.xyz
new file mode 100644
index 00000000..e119c6d3
--- /dev/null
+++ b/benchmarks/molecules/organic/020_Vitamin_C.xyz
@@ -0,0 +1,22 @@
+20
+Vitamin C
+C -0.07551087 1.68127663 -0.10745193
+O 1.33621755 1.87147409 -0.39326987
+C 1.67074668 2.95729545 0.49387976
+C 0.41740763 3.77281969 0.78495878
+C -0.60481480 3.07572636 0.28906224
+H -0.19316298 1.01922455 0.72486113
+O 0.35092043 5.03413298 1.45545728
+H 0.42961487 5.74279041 0.81264173
+O -1.95331750 3.53349874 0.15912025
+H -2.55333895 2.78846397 0.23972698
+O 2.81976302 3.20110148 0.94542226
+C -0.81772499 1.09230218 -1.32146482
+H -0.70955636 1.74951833 -2.15888136
+C -2.31163857 0.93420736 -0.98260166
+H -2.72575463 1.89080093 -0.74107186
+H -2.41980721 0.27699120 -0.14518512
+O -0.26428017 -0.18613595 -1.64425697
+H -0.72695910 -0.55328886 -2.40104423
+O -3.00083741 0.38730252 -2.10989934
+H -3.93210821 0.28874990 -1.89865997
diff --git a/benchmarks/molecules/organic/031_Inosine.xyz b/benchmarks/molecules/organic/031_Inosine.xyz
new file mode 100644
index 00000000..923dc7d5
--- /dev/null
+++ b/benchmarks/molecules/organic/031_Inosine.xyz
@@ -0,0 +1,33 @@
+31
+Inosine
+C -0.84925689 1.19426748 0.00000000
+O 0.58111411 1.19426748 0.00000000
+C 1.08310511 2.53365748 0.00000000
+C -0.09344989 3.50382448 -0.00000100
+C -1.34480089 2.63646648 -0.00000100
+H -1.17341789 0.63528848 0.91513200
+H 1.71994411 2.64115648 0.91536000
+H -0.06206089 4.16301548 -0.90190500
+H -1.97307989 2.83841948 -0.90190500
+O -0.05328805 4.34730633 1.15404640
+H -0.02922706 5.26656976 0.87840928
+O -2.14872719 2.89488055 1.15404608
+H -3.07612353 2.89074011 0.90601607
+C -1.29487091 0.42585647 -1.25800344
+H -2.36057357 0.33005726 -1.25860833
+H -0.98433839 0.96058082 -2.13123848
+O -0.69940910 -0.87426857 -1.25830689
+H -1.15722348 -1.43626839 -1.88772107
+N 1.95854804 2.68143304 -1.25831716
+C 3.40750745 2.83869936 -1.24831720
+C 1.52513756 2.69033382 -2.59758791
+C 3.83177447 2.94266783 -2.62652798
+H 0.49017157 2.59129990 -2.92355570
+C 5.16750068 3.10114669 -2.93617186
+C 5.68858554 3.05790761 -0.55874621
+H 6.43570855 3.10532282 0.24755786
+N 2.63327508 2.84671184 -3.45064980
+N 4.33322006 2.89644875 -0.22604840
+N 6.09645965 3.15797838 -1.88374496
+H 6.74393404 2.41331683 -2.04578224
+O 5.60770510 3.20620138 -4.29266866
diff --git a/benchmarks/molecules/organic/033_Bisphenol_A.xyz b/benchmarks/molecules/organic/033_Bisphenol_A.xyz
new file mode 100644
index 00000000..451e0708
--- /dev/null
+++ b/benchmarks/molecules/organic/033_Bisphenol_A.xyz
@@ -0,0 +1,35 @@
+33
+Bisphenol A
+C 0.17302217 -0.05367870 0.02060230
+C 0.68636442 0.67471439 1.27659722
+H 0.33130807 1.68408369 1.27366248
+H 0.32809533 0.17314097 2.15122134
+H 1.75636261 0.67300961 1.27757926
+C 0.68636436 0.66983803 -1.23820799
+H 1.75636429 0.67015162 -1.23801986
+H 0.32999896 0.16352848 -2.11087880
+H 0.32940246 1.67853700 -1.24035286
+C -1.36697783 -0.05365972 0.02060230
+C -2.06451416 -1.26192666 0.02294888
+C -2.06446856 1.15425163 0.01836764
+C -3.45922608 -1.26218837 0.02237872
+H -1.51433285 -2.21405130 0.02393307
+C -3.45960644 1.15416501 0.01879292
+H -1.51485954 2.10664659 0.01669790
+C -4.15704263 -0.05377385 0.02065983
+H -4.00910069 -2.21451865 0.02359421
+H -4.00927970 2.10670462 0.01744603
+C 0.68633788 -1.50560812 0.02341767
+C 0.91946288 -2.16536088 -1.18358293
+C 0.91831096 -2.16106624 1.23259561
+C 1.38381298 -3.48050177 -1.18131091
+H 0.73574920 -1.64859280 -2.13670508
+C 1.38374179 -3.47627650 1.23504147
+H 0.73479448 -1.64116737 2.18399242
+C 1.61638160 -4.13609396 0.02836974
+H 1.56698980 -4.00080229 -2.13264163
+H 1.56694472 -3.99268549 2.18857840
+O 2.09255288 -5.48448444 0.03037417
+H 3.05255142 -5.48531759 0.03182891
+O -5.58704242 -0.05436711 0.02015267
+H -5.90797050 0.43788494 0.77929237
diff --git a/benchmarks/molecules/organic/037_Mg_Porphin.xyz b/benchmarks/molecules/organic/037_Mg_Porphin.xyz
new file mode 100644
index 00000000..5b3303d0
--- /dev/null
+++ b/benchmarks/molecules/organic/037_Mg_Porphin.xyz
@@ -0,0 +1,39 @@
+37
+Mg Porphin
+C -1.41478807 -1.38673987 -0.27546855
+C 0.10179343 -1.53458053 -0.07889229
+C 0.53408642 -0.37025944 0.45145190
+C -0.67562941 0.57796327 0.46559768
+H 0.69507620 -2.39648436 -0.30089545
+H 1.52737697 -0.14599081 0.78086417
+C -0.62370820 1.96362793 0.78635139
+H 0.21323483 2.35384028 1.32735933
+C -2.29970743 -2.44324831 -0.63702830
+H -1.91393373 -3.32969289 -1.09683478
+C -1.64052102 2.84486117 0.32186518
+C -3.52932141 3.58449372 -0.59511281
+C -2.59214132 4.79754521 -0.48499553
+H -2.78843501 5.79301664 -0.82737225
+C -1.48137242 4.36442701 0.14972837
+N -2.86612663 2.50908907 -0.12553285
+N -1.74741954 -0.12018577 0.04126910
+H -0.64679525 4.95921480 0.45645615
+C -3.68393396 -2.35600549 -0.31223368
+C -4.63005393 -3.55629325 -0.15598101
+N -4.37818634 -1.24301980 -0.00220836
+C -5.78557755 -3.06857539 0.34505536
+H -4.41027665 -4.57910031 -0.38223928
+C -5.63589939 -1.53901637 0.37901842
+H -6.64304239 -3.63441062 0.64304078
+C -6.68305631 -0.62113443 0.67405446
+H -7.56136499 -0.96043354 1.18328735
+C -6.60122370 0.72696467 0.22471451
+C -7.80292122 1.66378985 0.02269080
+N -5.49689043 1.38542695 -0.17958107
+C -7.32644297 2.77323824 -0.58189005
+H -8.81986259 1.46790799 0.29231039
+C -5.79921052 2.61414176 -0.64211669
+H -7.89795710 3.60669127 -0.93279659
+C -4.88433877 3.63473378 -1.03220086
+H -5.22991618 4.47158073 -1.60163868
+Mg -3.62049120 0.63120563 -0.10251958
diff --git a/benchmarks/molecules/organic/042_Penicillin_V.xyz b/benchmarks/molecules/organic/042_Penicillin_V.xyz
new file mode 100644
index 00000000..7861c57c
--- /dev/null
+++ b/benchmarks/molecules/organic/042_Penicillin_V.xyz
@@ -0,0 +1,44 @@
+42
+Penicillin V
+C -0.77452336 -0.08132633 1.74172506
+C -0.26411504 -0.11129929 0.43692360
+C -0.35397350 1.02601929 -0.37692764
+C -0.95424489 2.19330919 0.11402082
+C -1.46465579 2.22328125 1.41882131
+C -1.37479443 1.08596370 2.23267366
+H -0.70591476 -0.94969444 2.36311840
+H 0.03573621 1.00313485 -1.37317189
+H -1.02285582 3.06167644 -0.50737346
+H -1.92297618 3.11453305 1.79367143
+H -1.76450608 1.10884747 3.22891718
+O 0.34840202 -1.30241314 -0.06404605
+C 1.35270587 -0.95567870 -1.02115052
+H 2.09459791 -0.34266532 -0.55348523
+H 0.90396901 -0.41799437 -1.83011950
+C 2.01233961 -2.23841673 -1.56065630
+O 2.09302887 -3.25968240 -0.82985109
+N 2.54773286 -2.26985691 -2.92932924
+H 3.50527213 -1.98172537 -2.91939174
+C 2.45289144 -3.63693794 -3.46130165
+C 3.06213638 -3.98156820 -4.81429695
+C 3.20775770 -4.83278916 -2.92168779
+H 1.41330079 -3.88850264 -3.43186598
+H 2.21258260 -3.95040754 -5.46405646
+O 3.42944279 -5.30612203 -1.77696850
+N 3.67522246 -5.14821806 -4.31096996
+C 3.66579173 -6.10484804 -5.36714016
+H 4.49655524 -6.75828572 -5.20055325
+C 3.84517881 -5.06783193 -6.57540908
+C 4.72191908 -5.64179240 -7.70390186
+H 4.27386857 -6.53609107 -8.08387642
+H 4.80563701 -4.92235784 -8.49149645
+H 5.69541534 -5.86571901 -7.32041536
+C 2.45462245 -4.72770184 -7.14309246
+H 2.00895589 -5.61186346 -7.54872716
+H 1.83452668 -4.34238508 -6.36084427
+H 2.55421902 -3.99253283 -7.91413529
+S 4.42031248 -3.49330876 -5.80985222
+C 2.41628932 -6.97906376 -5.58182741
+O 1.24772273 -6.54739905 -5.20566321
+O 2.52902641 -8.14944067 -6.13940253
+H 3.39110571 -8.46788950 -6.41690875
diff --git a/benchmarks/molecules/organic/045_Ochratoxin_A.xyz b/benchmarks/molecules/organic/045_Ochratoxin_A.xyz
new file mode 100644
index 00000000..21f65e21
--- /dev/null
+++ b/benchmarks/molecules/organic/045_Ochratoxin_A.xyz
@@ -0,0 +1,47 @@
+45
+Ochratoxin A
+C -2.81999319 2.42808848 0.54098799
+C -1.48506359 2.12574154 0.24053959
+C -0.57560888 3.15808633 -0.02458108
+C -1.00054575 4.49301108 0.01119766
+C -2.33541234 4.79564647 0.31151005
+C -3.24524285 3.76302115 0.57613058
+H -3.51427777 1.63974701 0.74369099
+H 0.44352769 2.92714554 -0.25417935
+H -0.30609255 5.28106112 -0.19052950
+H -2.66014056 5.81490526 0.33906034
+H -4.26458005 3.99396043 0.80476437
+C -1.01732442 0.65950815 0.20185290
+H -0.67533111 0.36853591 1.17285734
+H -1.83249438 0.03203052 -0.09154374
+C 0.13235379 0.51505962 -0.81252046
+H -0.21019462 0.80566498 -1.78314105
+C 1.30596367 1.41901641 -0.39114863
+C 1.67510534 -1.02185697 -1.82127087
+N 0.57986576 -0.88420978 -0.85050744
+H -0.18284568 -1.47067933 -1.12333537
+C 2.75580261 -2.09988547 -1.61482923
+C 2.69427195 -2.95177434 -0.50654721
+C 3.79955020 -2.23324053 -2.53790490
+C 3.70091458 -3.90483765 -0.30182990
+H 1.88147807 -2.87383893 0.18522781
+C 4.78600353 -3.21184574 -2.34716707
+H 3.84167861 -1.59151423 -3.39308111
+C 4.77253365 -4.00413187 -1.20130033
+C 5.85248621 -3.42589670 -3.42542028
+C 5.90561132 -5.00024671 -0.90103115
+C 6.77658910 -5.27533663 -2.15038566
+H 6.54653968 -4.59705454 -0.14509272
+O 2.17311788 1.97320056 -1.38357913
+H 2.51483540 2.81560975 -1.07582854
+O 1.50162390 1.66968264 0.82605442
+O 1.72973935 -0.25904981 -2.82056879
+C 7.73469993 -6.47923452 -2.09043925
+H 7.25757496 -7.33559502 -2.51759025
+H 8.62396559 -6.25453714 -2.64131193
+H 7.98803284 -6.68347394 -1.07133620
+Cl 3.62524241 -4.97417462 1.09396391
+O 5.79027817 -2.75121797 -4.48594121
+O 6.90897033 -4.37928239 -3.27178983
+H 5.46196268 -5.90980388 -0.55344219
+H 7.47765424 -4.60305065 -1.70382804
diff --git a/benchmarks/molecules/organic/052_Cetirizine.xyz b/benchmarks/molecules/organic/052_Cetirizine.xyz
new file mode 100644
index 00000000..67f0b0e1
--- /dev/null
+++ b/benchmarks/molecules/organic/052_Cetirizine.xyz
@@ -0,0 +1,54 @@
+52
+Cetirizine
+C -1.31610737 2.63679048 -0.00084644
+C 0.07905007 2.63934168 -0.00004682
+C 0.77437809 3.84836613 0.00070992
+C 0.07451596 5.05559768 -0.00053176
+C -1.32030606 5.05296923 -0.00181022
+C -2.01569681 3.84348937 -0.00157112
+H -1.86412404 1.68346969 -0.00099299
+H 1.87405556 3.85045682 0.00197421
+H 0.62297373 6.00874516 0.00000598
+H -1.87216801 6.00424292 -0.00279707
+H -3.11529902 3.84166168 -0.00238130
+C 0.85103942 1.30681443 0.00184158
+H 1.79337581 1.43985720 -0.48724099
+C 0.41505987 -0.48736387 1.68199576
+C 2.57473964 0.77351617 1.72731358
+C 0.69110348 -1.01300628 3.07592768
+H 0.78959033 -1.22526334 0.92463509
+H -0.69101600 -0.38321987 1.53238838
+C 2.85074861 0.24863316 3.12155937
+H 3.05729485 0.09861578 0.97233225
+H 3.03204876 1.79032016 1.61147100
+H 0.23490280 -2.03043373 3.19085261
+H 0.20695056 -0.33927459 3.83095099
+H 3.95676021 0.14403431 3.27103621
+H 2.47681583 0.98744831 3.87839265
+N 1.08617979 0.85184124 1.45418741
+N 2.17897791 -1.08989652 3.35069584
+C 0.03162829 0.23777883 -0.74470266
+C 0.56867017 -0.39587510 -1.86565767
+C -1.24736307 -0.09709064 -0.30018981
+C -0.17344898 -1.36368445 -2.54228606
+H 1.57672684 -0.13109474 -2.21630694
+C -1.98945087 -1.06588037 -0.97632740
+H -1.67071899 0.40210131 0.58338598
+C -1.45278973 -1.69908441 -2.09730218
+H 0.24953934 -1.86273063 -3.42621495
+H -2.99769071 -1.33000002 -0.62537518
+Cl -2.38893911 -2.92048839 -2.95134941
+C 2.78094574 -2.08721982 2.45410174
+H 2.02278564 -2.75673563 2.10504323
+H 3.23055355 -1.59117358 1.61942159
+C 3.85566305 -2.88236770 3.21851166
+H 3.99860784 -3.83253439 2.74771441
+H 4.77651636 -2.33753632 3.20913280
+C 4.26802920 -4.18276315 5.33113825
+H 3.99105398 -4.28769779 6.35932766
+H 5.29898799 -3.90383432 5.26615610
+C 4.05157947 -5.52181188 4.60196201
+O 4.49897618 -6.59036968 5.09348105
+O 3.33974189 -5.55104438 3.36206979
+H 3.28517852 -6.45557385 3.04513244
+O 3.39930599 -3.09413546 4.67401592
diff --git a/benchmarks/molecules/organic/057_Tamoxifen.xyz b/benchmarks/molecules/organic/057_Tamoxifen.xyz
new file mode 100644
index 00000000..b51df6f5
--- /dev/null
+++ b/benchmarks/molecules/organic/057_Tamoxifen.xyz
@@ -0,0 +1,59 @@
+57
+Tamoxifen
+C -1.42666665 1.35988349 0.01780185
+C -0.75139234 2.53486079 0.01780185
+C -2.96666665 1.35988349 0.01780185
+C -3.66418809 0.15160568 0.01780185
+C -3.66417225 2.56778831 0.01791304
+C -5.05890001 0.15132789 0.01723115
+H -3.11399504 -0.80051230 0.01693694
+C -5.05931013 2.56768367 0.01833813
+H -3.11457497 3.52019148 0.01809296
+C -5.75673144 1.35973487 0.01785909
+H -5.60876287 -0.80100973 0.01659711
+H -5.60899513 3.52021733 0.01884114
+H -6.85641138 1.35926586 0.01746817
+C -1.51874951 3.87006226 0.01780185
+C -1.63823871 4.60590036 -1.16149287
+C -2.09440347 4.34371845 1.19670832
+C -2.33266580 5.81544273 -1.16163975
+H -1.18363273 4.23258432 -2.09058400
+C -2.78991814 5.55312706 1.19651365
+H -2.00047584 3.76380313 2.12622693
+C -2.90901419 6.28907563 0.01764434
+H -2.42635385 6.39580205 -2.09099551
+H -3.24404320 5.92613353 2.12608927
+C 0.78860766 2.53486079 0.01780185
+C 1.48612910 3.74313859 0.01780185
+C 1.48611327 1.32695597 0.01791304
+C 2.88084102 3.74341639 0.01723115
+H 0.93593606 4.69525658 0.01693694
+C 2.88125115 1.32706060 0.01833813
+H 0.93651599 0.37455279 0.01809296
+C 3.57867246 2.53500940 0.01785909
+H 3.43070389 4.69575400 0.01659711
+H 3.43093615 0.37452694 0.01884114
+H 4.67835240 2.53547842 0.01746817
+C -0.65930948 0.02468201 0.01780185
+H -0.04466478 -0.03344716 -0.85611628
+H -0.04386363 -0.03298673 0.89118649
+C -1.66236338 -1.14385651 0.01856968
+H -2.27713573 -1.08561745 0.89239069
+H -2.27768159 -1.08629703 -0.85491210
+H -1.12919956 -2.07156136 0.01876393
+O -3.62101473 7.52921876 0.01715974
+C -2.69982994 8.60858726 0.19402752
+H -2.03011871 8.64615667 -0.63962434
+H -2.14108178 8.45680900 1.09384076
+C -3.47584819 9.93535894 0.28927757
+H -4.05456450 10.07469158 -0.59986462
+H -4.12694690 9.90759901 1.13792346
+C -1.65137806 10.90285045 1.72438609
+H -2.24764703 10.40869908 2.46274761
+H -0.79110440 10.30633800 1.50302183
+H -1.33836538 11.85545774 2.09783276
+C -3.25771829 12.42866058 0.53449492
+H -2.56611180 13.24181825 0.60767325
+H -3.86037095 12.55070987 -0.34118410
+H -3.88574784 12.41553739 1.40069735
+N -2.48185199 11.10154878 0.44281205
diff --git a/benchmarks/molecules/organic/066_Raffinose.xyz b/benchmarks/molecules/organic/066_Raffinose.xyz
new file mode 100644
index 00000000..058c3910
--- /dev/null
+++ b/benchmarks/molecules/organic/066_Raffinose.xyz
@@ -0,0 +1,68 @@
+66
+Raffinose
+C -1.42958937 -1.01658249 2.44831265
+C -1.54149463 -0.27943595 1.12935913
+C -2.95243912 1.47129501 2.22492550
+C -2.84134324 0.73400280 3.54388810
+C -1.55797242 -0.06742235 3.62210684
+H -0.66497820 0.41085733 1.01283439
+H -0.44314689 -1.54644194 2.49994231
+H -3.93813646 2.00251835 2.17350554
+H -3.71865156 0.04459988 3.66018043
+H -0.68133448 0.63238265 3.63327796
+O -1.92499204 2.46279929 2.14636482
+C -1.46076301 4.67520648 3.08258818
+C -1.65192906 4.60593616 4.58432062
+H -0.74117334 5.43388332 2.85565168
+C -3.37658473 6.27667868 2.91318631
+C -2.26541279 5.88367074 5.11970508
+H -2.31747310 3.73866848 4.83580579
+C -3.56636040 6.20921206 4.41472333
+H -4.36600055 6.45426127 2.41719619
+H -1.54350069 6.73075622 4.97913735
+H -4.32958469 5.42429404 4.65913754
+O -2.52952388 7.38269576 2.59051909
+C -3.31900286 8.44866624 2.05635630
+C -3.26458455 9.66301263 2.97202724
+C -2.80523815 10.85434814 2.14390783
+H -4.26911658 9.86120175 3.42267320
+C -2.45049436 10.34868118 0.75291070
+H -1.92149828 11.34764146 2.62047963
+H -3.01626404 10.91739387 -0.02697788
+C -4.76356005 7.92754855 1.94107026
+H -4.78266313 7.06714393 1.30527236
+H -5.12531018 7.66145994 2.91227245
+O -2.82580898 0.52071700 1.05150767
+C -0.93849427 3.31732760 2.57761263
+H -0.77727115 3.36776157 1.52103158
+H -0.01653199 3.08491476 3.06839754
+C -1.49224313 -1.28985314 -0.03177454
+H -0.58145107 -1.84899344 0.02037852
+H -2.32526415 -1.95746693 0.04080516
+C -0.95163774 10.56175833 0.47072820
+H -0.66603955 9.99216789 -0.38886496
+H -0.38034325 10.24135666 1.31681648
+O -1.55044662 -0.58860344 -1.27666860
+H -1.40118565 -1.20385620 -1.99832308
+O -2.45542951 -2.00981905 2.52598600
+H -2.07814582 -2.83668451 2.83509848
+O -1.53066740 -0.81010098 4.84381994
+H -0.61998842 -0.98424670 5.09269150
+O -2.88646987 1.67226139 4.62209700
+H -3.42291955 1.31644411 5.33428785
+O -0.39050984 4.37790095 5.21813565
+H -0.43907755 4.65272412 6.13667438
+O -2.50206790 5.74947404 6.52358741
+H -2.24542728 6.55931660 6.97067871
+O -4.06906224 7.46048270 4.89065678
+H -4.76357327 7.30283533 5.53439721
+O -2.76235824 4.99928466 2.37789525
+O -5.59594331 8.94915410 1.38576835
+H -6.48998576 8.61436213 1.28476127
+O -2.79571817 8.86766013 0.68976834
+O -2.35757225 9.42976003 4.05268533
+H -2.22828280 10.24429373 4.54402949
+O -3.84292711 11.83519815 2.06622328
+H -3.45759742 12.71343457 2.10890596
+O -0.70503591 11.94904429 0.22675035
+H 0.04258943 12.04182451 -0.36826913
diff --git a/benchmarks/molecules/organic/084_Sphingomyelin.xyz b/benchmarks/molecules/organic/084_Sphingomyelin.xyz
new file mode 100644
index 00000000..e031c92e
--- /dev/null
+++ b/benchmarks/molecules/organic/084_Sphingomyelin.xyz
@@ -0,0 +1,86 @@
+84
+Sphingomyelin
+C -7.49315956 -1.43773119 -5.92299552
+H -7.94182211 -2.40858579 -5.95529496
+H -7.95636393 -0.85617992 -5.15348929
+H -7.62668554 -0.95153649 -6.86675689
+C -5.79642037 -2.27443704 -4.26611112
+H -6.24577738 -3.24503611 -4.29637197
+H -4.75102405 -2.37166315 -4.05972888
+H -6.25894988 -1.69106781 -3.49757564
+C -5.32241415 -2.41652735 -6.73175378
+H -5.45614320 -1.93219937 -7.67644576
+H -4.27697469 -2.51320533 -6.52533261
+H -5.77127293 -3.38735843 -6.76196670
+C -5.34230471 -0.18003416 -5.58198519
+H -5.80528977 0.40321281 -4.81363123
+H -5.47564419 0.30434483 -6.52670609
+C -3.83777346 -0.31946968 -5.28442266
+H -3.37486869 -0.90308305 -6.05254674
+H -3.70443723 -0.80345768 -4.33950093
+O -3.19138412 1.07764258 -5.24131661
+O -1.08666761 2.23553569 -4.90355336
+O -1.06813532 0.15822874 -5.97009968
+O -1.50879854 0.29141327 -3.68074512
+N -5.98857475 -1.57718235 -5.62571128
+C 0.31042939 2.10678634 -4.62706904
+H 0.77368465 1.52318382 -5.39499004
+H 0.44389576 1.62311344 -3.68200436
+C 0.95616173 3.50421186 -4.58427124
+H 0.49289614 4.08781851 -3.81635961
+N 0.77281830 4.16868977 -5.88263725
+C 1.54573854 5.24091768 -6.23123101
+H 0.07949519 3.81992495 -6.49108736
+O 2.42345554 5.69243391 -5.47559455
+C 1.24369185 5.83589104 -7.61916994
+H 1.38780673 5.08532476 -8.36802317
+H 0.23032024 6.17818782 -7.64764610
+H 1.90308508 6.65755098 -7.80618734
+C 2.46072393 3.36555987 -4.28649918
+H 2.81093231 4.25132556 -3.79898177
+H 2.62197169 2.52066581 -3.65006128
+C 3.22917105 3.16808327 -5.60638252
+H 2.71745824 3.26576104 -6.54099958
+C 4.55128586 2.87101548 -5.58821090
+H 5.06299867 2.77333771 -4.65359384
+P -1.68688011 0.93821529 -4.94361253
+C 5.31973298 2.67353888 -6.90809424
+H 5.50187069 3.62584722 -7.36068089
+H 4.73852105 2.06839074 -7.57208852
+C 6.66254822 1.97641122 -6.62093532
+H 7.23864011 2.57569669 -5.94723283
+H 6.48011089 1.01887673 -6.17963685
+C 7.43879459 1.79489451 -7.93854423
+H 7.60827107 2.75133158 -8.38732686
+H 6.86923187 1.18328757 -8.60670234
+C 8.79086565 1.11708026 -7.64859306
+H 9.33478428 1.00070210 -8.56265469
+H 8.62122899 0.15610604 -7.20967171
+C 9.60424993 1.98984817 -6.67479524
+H 9.31147739 1.77019553 -5.66934163
+H 9.41944065 3.02310864 -6.88244478
+C 11.10499458 1.69162880 -6.84923923
+H 11.41365563 1.97843059 -7.83279049
+H 11.27894526 0.64483722 -6.71187639
+C 11.91113852 2.48722658 -5.80580446
+H 11.72501028 3.53319241 -5.93312987
+H 11.61354107 2.18914178 -4.82219823
+C 13.41348542 2.20643447 -5.99477425
+H 13.59898733 1.15986871 -5.87152995
+H 13.71197645 2.50833327 -6.97694542
+C 14.21924372 2.99740615 -4.94753151
+H 14.03182008 4.04381613 -5.06918080
+H 13.92251458 2.69373112 -3.96537404
+C 15.72181966 2.71939448 -5.13877756
+H 15.90913955 1.67288842 -5.01779686
+H 16.01869462 3.02369321 -6.12069789
+C 16.52751640 3.50960658 -4.09091421
+H 16.33925543 4.55603385 -4.21111315
+H 16.23150563 3.20443884 -3.10900267
+C 18.03020202 3.23295881 -4.28327314
+H 18.21842532 2.18649741 -4.16331260
+H 18.32626477 3.53834869 -5.26509994
+C 18.83587717 4.02290009 -3.23518901
+H 19.87999516 3.83124105 -3.36929500
+H 18.64710066 5.06931441 -3.35469007
+H 18.54032269 3.71699987 -2.25336795
diff --git a/benchmarks/molecules/organic/095_Azadirachtin.xyz b/benchmarks/molecules/organic/095_Azadirachtin.xyz
new file mode 100644
index 00000000..8c03f7bb
--- /dev/null
+++ b/benchmarks/molecules/organic/095_Azadirachtin.xyz
@@ -0,0 +1,97 @@
+95
+Azadirachtin
+C 0.24028400 -0.96854600 0.05735800
+C 1.49955800 -0.38999400 0.79976500
+C 1.84405900 1.11309900 0.52612700
+C 0.61115200 2.06994900 0.41027500
+C -0.38718900 1.44909800 -0.58288900
+C -0.81198100 0.11367700 0.01403200
+H 1.34464500 -0.48336800 1.89667000
+H 0.90815500 3.09474100 0.10955200
+H 0.07146500 1.40030200 -1.59457300
+H -1.08538000 0.33936800 1.09841400
+O -0.03234300 2.14051500 1.69756400
+H 0.43832200 2.76739400 2.27637900
+O -1.64345600 2.15598600 -0.77527600
+C -2.74935800 1.17918600 -0.75355500
+H -3.33770900 1.41858200 0.14457000
+H -3.31820200 1.39744800 -1.66649800
+C -2.11058900 -0.22990000 -0.71994400
+C 2.72998200 1.32748400 -0.70483200
+H 2.81316800 2.38444500 -0.97758400
+H 3.74960400 0.95856700 -0.53283000
+H 2.35200700 0.78104000 -1.58051000
+C 2.60140000 -1.34386400 0.30659000
+C 0.84678200 -1.40613600 -1.29617000
+H 0.88274800 -0.59319600 -2.03951200
+H 0.38815200 -2.30137400 -1.74034600
+O 2.22547600 -1.78168600 -1.02946800
+C -0.42290800 -2.19363100 0.75277400
+H -0.32012900 -3.08353500 0.10236100
+C -1.91400700 -2.00763500 1.11237500
+H -2.33420900 -2.99527800 1.38379200
+H -1.98093100 -1.38866600 2.03106200
+C -2.81353800 -1.37055100 0.02719800
+H -3.12020000 -2.14713900 -0.69849000
+C -1.82661295 -0.68751599 -2.16270012
+O -1.03585236 -0.24261727 -2.99355789
+O -2.59156054 -1.74766325 -2.52650357
+C -2.29916153 -2.14198817 -3.86960099
+H -2.96290254 -2.92828960 -4.16299137
+H -2.42740743 -1.30452633 -4.52313804
+H -1.28838658 -2.48820275 -3.92764814
+O -4.01986539 -0.90962471 0.64138134
+C -4.89301012 -1.93494775 0.80793745
+O -4.54153100 -3.05110585 0.42818050
+C -6.20834727 -1.48087047 1.46771166
+H -6.70958996 -0.78829922 0.82428269
+H -6.83594045 -2.33131805 1.63434212
+H -5.99341406 -1.00749899 2.40292455
+O 0.29104226 -2.52037085 1.94793763
+C 0.31248536 -3.86361432 2.13937213
+O -0.25336168 -4.56806573 1.30443072
+C 1.07328546 -4.25938123 3.41849362
+C 1.18469713 -5.56341278 3.77014145
+H 0.75137836 -6.32562659 3.15681858
+C 1.70966559 -3.16955354 4.30104443
+H 2.52793619 -2.72004059 3.77829081
+H 0.97813456 -2.42251044 4.52839648
+H 2.06508607 -3.60889199 5.20964665
+C 1.93754031 -5.94957419 5.05688405
+H 1.46239499 -5.49165555 5.89917107
+H 1.92238977 -7.01309886 5.17344190
+H 2.95091533 -5.61227499 4.99207421
+C 3.99823568 -0.71610148 0.14421916
+O 4.54063921 0.18499764 0.78248292
+O 4.69984280 -1.27738694 -0.87269582
+O 2.69271189 -2.53050618 1.09933364
+H 3.60067733 -2.84219679 1.10624230
+C 5.98847134 -0.66885730 -0.99113633
+H 6.49970371 -0.73075570 -0.05320774
+H 6.55618159 -1.17887968 -1.74112449
+H 5.87374685 0.35839671 -1.26770006
+C 2.63486992 1.58151749 1.76176538
+C 2.13434327 2.21842175 3.11643757
+C 3.90461234 2.45387090 1.74128354
+O 2.44467967 0.78466796 2.96396625
+C 3.35337126 2.98709450 3.79243900
+C 0.74513758 2.60743687 3.44136489
+O 5.00327683 3.19196370 1.11718214
+C 4.47769203 2.16352749 3.16877423
+H 3.15573566 3.35599353 1.51547111
+C 3.84794511 4.41584726 3.25643717
+H 3.24116904 2.99889070 4.88162906
+H 0.00697023 1.93995296 2.97068106
+H 0.55491721 2.57388288 4.52449549
+H 0.54134467 3.63458255 3.09753074
+C 4.84981258 4.42246076 1.92099071
+H 4.49637929 1.09030804 3.43212004
+H 5.51163803 2.50195502 3.32489990
+C 4.76579887 5.04464694 4.26535741
+O 2.75093022 5.20578033 2.83652107
+H 4.60685318 5.22136931 1.20459035
+O 6.17282363 4.70855901 2.47193815
+H 4.42807865 5.31783232 5.24674785
+C 6.01838353 5.12565144 3.78006571
+H 2.50011685 5.87405238 3.50751412
+H 6.95619123 5.44887224 4.20308201
diff --git a/benchmarks/molecules/organic/113_Taxol.xyz b/benchmarks/molecules/organic/113_Taxol.xyz
new file mode 100644
index 00000000..e472fda3
--- /dev/null
+++ b/benchmarks/molecules/organic/113_Taxol.xyz
@@ -0,0 +1,115 @@
+ 113
+
+ C -3.78400 3.91800 3.08500
+ O -4.61300 4.80300 2.94200
+ C 6.71300 1.23300 4.89600
+ C -5.60200 2.29400 3.72100
+ C -6.05000 1.05200 4.18300
+ C -5.13000 0.05200 4.50500
+ C -3.76400 0.29300 4.34500
+ C -3.32300 1.53700 3.88500
+ C -4.23400 2.55300 3.57300
+ C 5.67500 0.94800 3.84600
+ C 2.37100 0.84900 2.62900
+ C 3.10500 -0.12600 3.21600
+ C 1.03100 1.22200 3.23900
+ C 0.28800 -0.09400 3.59500
+ C 1.16700 -1.28400 4.12700
+ C 2.60800 -0.78500 4.51100
+ C 3.43500 -1.97000 5.13400
+ C 2.60600 0.31200 5.64300
+ C 2.73200 1.62200 1.37000
+ C 1.10300 -2.50000 3.10700
+ C 1.79900 -2.32400 1.70000
+ C 3.30800 -2.77100 1.51300
+ C 3.49500 -4.31700 1.69500
+ C 4.37200 -2.13300 2.41400
+ O 5.24200 -2.81400 2.93800
+ C 4.41900 -0.64300 2.66300
+ C 3.72500 -2.34100 0.06800
+ C 2.99700 -3.14600 -1.03900
+ C 1.46100 -3.21500 -0.83100
+ C 0.84800 -2.79300 0.53600
+ C 0.29500 -4.23600 0.67300
+ O 1.01800 -4.54200 -0.52000
+ O -0.29100 -1.91800 0.36400
+ O 0.12900 1.93600 2.35400
+ C 0.33500 3.25800 2.23100
+ O 1.17100 3.88700 2.86000
+ C -0.56900 3.95300 1.24000
+ O -0.32500 5.36800 1.25200
+ C -2.07200 3.65200 1.50300
+ C -2.91400 4.25500 0.36500
+ N -2.51800 4.22500 2.79400
+ C -0.02700 -0.74400 -0.23000
+ O 1.05900 -0.43700 -0.69700
+ C -1.19800 0.19400 -0.31800
+ O 5.14800 -2.36500 -0.15400
+ O 5.47500 -0.35700 3.60400
+ O 0.49900 -1.68300 5.34200
+ O -0.30500 -2.72300 2.83100
+ C -1.05000 -3.31600 3.77500
+ O -0.56400 -3.88100 4.74200
+ C -2.55500 -3.28300 3.61300
+ C -3.13100 -2.57300 2.55300
+ C -4.51900 -2.53100 2.39800
+ C -5.34300 -3.21000 3.30000
+ C -4.77400 -3.91900 4.36200
+ C -3.38600 -3.95500 4.51800
+ C -3.21900 5.62000 0.36700
+ C -3.98100 6.17900 -0.66400
+ C -4.44900 5.37200 -1.70500
+ C -4.15200 4.00700 -1.71000
+ C -3.39100 3.45200 -0.67800
+ O 5.07500 1.85100 3.28400
+ H 7.65600 0.72800 4.63700
+ H 6.35900 0.85900 5.86800
+ H 6.90100 2.31400 4.97700
+ H -6.33500 3.05700 3.47700
+ H -7.11300 0.86500 4.29300
+ H -5.47500 -0.90600 4.88100
+ H -3.04600 -0.48600 4.58000
+ H -2.25800 1.69900 3.77900
+ H 1.15700 1.83600 4.14200
+ H -0.25400 -0.39000 2.68600
+ H -0.48800 0.16600 4.33300
+ H 3.04900 -2.24700 6.12600
+ H 3.41800 -2.89600 4.55900
+ H 4.48300 -1.68700 5.29600
+ H 3.18300 0.03600 6.53800
+ H 3.06600 1.25300 5.30500
+ H 1.58900 0.52100 6.00500
+ H 3.55600 1.24200 0.76000
+ H 1.87100 1.65200 0.68700
+ H 2.99500 2.65100 1.65000
+ H 1.49200 -3.43200 3.53200
+ H 1.78900 -1.25500 1.51200
+ H 2.84900 -4.92100 1.05300
+ H 4.52100 -4.63300 1.46000
+ H 3.30100 -4.62300 2.73100
+ H 4.77700 -0.23200 1.71600
+ H 3.47200 -1.28000 -0.08100
+ H 3.20600 -2.65900 -2.00600
+ H 3.40700 -4.16400 -1.10900
+ H 0.87600 -2.86500 -1.69900
+ H 0.59700 -4.82300 1.55300
+ H -0.79000 -4.31300 0.49800
+ H -0.29700 3.59300 0.23500
+ H -0.50800 5.75400 2.10300
+ H -2.21100 2.56000 1.50700
+ H -1.85600 3.97900 3.61000
+ H -1.75600 0.19900 0.62900
+ H -0.85000 1.21600 -0.53100
+ H -1.86900 -0.13200 -1.12700
+ H 5.52800 -3.23500 -0.12600
+ H 0.81500 -2.49000 5.73000
+ H -2.50600 -2.04400 1.84200
+ H -4.95700 -1.97200 1.57800
+ H -6.42200 -3.18500 3.17700
+ H -5.41400 -4.44300 5.06600
+ H -2.95900 -4.50700 5.34800
+ H -2.86800 6.25900 1.17000
+ H -4.21000 7.24000 -0.65500
+ H -5.04000 5.80500 -2.50600
+ H -4.51500 3.37800 -2.51700
+ H -3.17400 2.38900 -0.69700
\ No newline at end of file
diff --git a/benchmarks/molecules/organic/168_Valinomycin.xyz b/benchmarks/molecules/organic/168_Valinomycin.xyz
new file mode 100644
index 00000000..953e74ea
--- /dev/null
+++ b/benchmarks/molecules/organic/168_Valinomycin.xyz
@@ -0,0 +1,170 @@
+168
+
+N -4.092316 -1.000975 -0.370529
+C -4.323298 -0.263368 -1.612788
+C -3.205279 0.755290 -1.724502
+C -4.333065 -1.195831 -2.804809
+C -5.534893 -2.195586 -2.747894
+C -4.391021 -0.411072 -4.124619
+O -2.022551 0.513260 -1.614742
+O -3.685654 1.972297 -2.032800
+C -2.674446 3.003316 -2.308876
+C -2.061835 3.479071 -0.971537
+C -3.443134 4.164203 -2.942180
+O -0.982616 4.138519 -1.109289
+N -2.562361 3.191384 0.172976
+C -1.922153 3.625377 1.414867
+C -0.521384 3.059577 1.425755
+C -2.660285 3.195460 2.693552
+C -4.031723 3.921459 2.671174
+C -1.882265 3.476688 3.916073
+O -0.237963 1.915325 1.170709
+O 0.405568 3.987667 1.716328
+C 1.781787 3.582552 1.870413
+C 2.481074 3.382195 0.575318
+C 2.480996 4.611227 2.746627
+C 2.470890 5.974202 2.063195
+C 1.863565 4.691095 4.116433
+O 3.676679 3.042497 0.627604
+N 1.882065 3.634190 -0.570600
+C 2.598479 3.416843 -1.822129
+C 3.040290 1.970656 -1.862391
+C 1.746343 3.771275 -3.063258
+C 1.427287 5.251532 -3.043648
+C 2.444655 3.420207 -4.345496
+O 2.308863 0.995380 -1.690734
+O 4.353206 1.844014 -2.141135
+C 4.912975 0.501695 -2.282755
+C 4.866954 -0.251241 -0.969886
+C 6.363862 0.653789 -2.723359
+O 4.889152 -1.491995 -0.988352
+N 4.852304 0.411828 0.187274
+C 4.863721 -0.320530 1.453267
+C 3.640496 -1.203917 1.497502
+C 4.913635 0.624865 2.635648
+C 6.173744 1.508032 2.600330
+C 4.932395 -0.156748 3.950794
+O 2.510720 -0.842020 1.236281
+O 3.945608 -2.457328 1.878505
+C 2.828097 -3.372211 2.031960
+C 2.445551 -4.040763 0.771740
+C 3.254346 -4.422058 3.076046
+C 4.485963 -5.179990 2.732181
+C 3.328906 -3.808486 4.458682
+O 1.510141 -4.859848 0.766457
+N 3.020005 -3.732477 -0.410699
+C 2.468904 -4.259053 -1.664600
+C 1.005575 -3.799167 -1.749489
+C 3.268214 -3.838849 -2.880780
+C 4.693123 -4.426191 -2.823146
+C 2.559891 -4.254352 -4.172416
+O 0.635499 -2.673457 -1.581456
+O 0.196730 -4.821967 -2.053653
+C -1.207969 -4.498197 -2.246260
+C -1.919179 -4.182296 -0.920514
+C -1.832879 -5.699367 -2.974726
+O -3.059153 -3.717116 -0.961162
+N -1.303471 -4.547234 0.218128
+C -1.982414 -4.214913 1.486175
+C -2.200782 -2.712629 1.511514
+C -1.134918 -4.689135 2.671762
+C -0.944827 -6.191286 2.623437
+C -1.829816 -4.316462 3.967327
+O -1.385866 -1.900600 1.279362
+O -3.460876 -2.442907 1.878543
+C -3.804869 -1.044508 2.117691
+C -4.050817 -0.299492 0.783208
+C -5.016031 -1.022831 3.027983
+C -6.211473 -1.582777 2.357053
+C -5.252923 0.363926 3.607945
+O -4.233373 0.913002 0.812934
+H -4.825052 -1.677193 -0.281154
+H -5.217026 0.186571 -1.599372
+H -3.479308 -1.715455 -2.769455
+H -5.508697 -2.792601 -3.549257
+H -6.393354 -1.681530 -2.740600
+H -5.468672 -2.745980 -1.915801
+H -4.394290 -1.049299 -4.894845
+H -3.590140 0.186846 -4.194563
+H -5.225516 0.143589 -4.147272
+H -1.941915 2.666583 -2.901546
+H -2.806324 4.905979 -3.158884
+H -4.135677 4.492828 -2.303388
+H -3.887482 3.852542 -3.781836
+H -3.485062 3.580046 0.182699
+H -1.927597 4.624579 1.428033
+H -2.790440 2.201843 2.715678
+H -4.555076 3.671645 3.487594
+H -4.539107 3.649591 1.856395
+H -3.884359 4.909505 2.658473
+H -2.397552 3.181021 4.719518
+H -1.703444 4.460941 3.979504
+H -1.011857 2.981721 3.879574
+H 1.807192 2.684489 2.310092
+H 3.430162 4.320142 2.868487
+H 2.930026 6.643402 2.642400
+H 1.526351 6.263032 1.907788
+H 2.948100 5.912261 1.184104
+H 2.346361 5.375005 4.664527
+H 1.934535 3.796949 4.566903
+H 0.900706 4.946579 4.034185
+H 1.064858 3.062686 -0.602928
+H 3.389388 4.028458 -1.850492
+H 0.906884 3.231889 -3.020692
+H 0.875632 5.481426 -3.847705
+H 2.276787 5.774253 -3.061772
+H 0.915762 5.470666 -2.216102
+H 1.859529 3.668329 -5.120102
+H 2.629183 2.440334 -4.368647
+H 3.304846 3.923639 -4.404726
+H 4.379382 -0.016050 -2.953946
+H 6.778208 -0.252132 -2.830428
+H 6.872358 1.169804 -2.034528
+H 6.401161 1.139812 -3.594077
+H 5.654846 1.007647 0.191146
+H 5.688734 -0.885157 1.507712
+H 4.098100 1.195862 2.574451
+H 6.173595 2.119258 3.394792
+H 6.176517 2.055384 1.762697
+H 6.990721 0.931248 2.624915
+H 4.963944 0.484942 4.718965
+H 5.737428 -0.749023 3.979542
+H 4.106880 -0.714856 4.021343
+H 2.017946 -2.856984 2.316729
+H 2.532306 -5.110371 3.074232
+H 4.687279 -5.836148 3.462200
+H 5.250346 -4.546334 2.632862
+H 4.342276 -5.672236 1.871730
+H 3.607288 -4.506348 5.120102
+H 2.432946 -3.447169 4.712392
+H 4.000576 -3.066883 4.456643
+H 3.001830 -2.736612 -0.484910
+H 2.523818 -5.256397 -1.663438
+H 3.338853 -2.839418 -2.879074
+H 5.208256 -4.142571 -3.633434
+H 4.639769 -5.426967 -2.799486
+H 5.158021 -4.099125 -2.001722
+H 3.105690 -3.967766 -4.960551
+H 1.661957 -3.821054 -4.213784
+H 2.450854 -5.248405 -4.187410
+H -1.307259 -3.664356 -2.791012
+H -2.805490 -5.528762 -3.131782
+H -1.727941 -6.522351 -2.411801
+H -1.373006 -5.834787 -3.850316
+H -1.185777 -5.539039 0.189424
+H -2.868035 -4.680768 1.554632
+H -0.239333 -4.245968 2.624327
+H -0.389239 -6.483047 3.400717
+H -0.481563 -6.441532 1.772248
+H -1.838177 -6.643402 2.663197
+H -1.275974 -4.622937 4.742494
+H -2.727713 -4.754904 4.006495
+H -1.943531 -3.322490 4.015512
+H -3.048477 -0.563112 2.562609
+H -4.828053 -1.619266 3.807471
+H -6.990721 -1.552747 2.981064
+H -6.033213 -2.529521 2.093305
+H -6.424515 -1.044284 1.539849
+H -6.059472 0.344963 4.201915
+H -5.404125 1.013925 2.864268
+H -4.452484 0.643772 4.140208
\ No newline at end of file
diff --git a/benchmarks/molecules/water_clusters/002.xyz b/benchmarks/molecules/water_clusters/002.xyz
new file mode 100644
index 00000000..8c50538d
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/002.xyz
@@ -0,0 +1,5 @@
+3
+
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
diff --git a/benchmarks/molecules/water_clusters/003.xyz b/benchmarks/molecules/water_clusters/003.xyz
new file mode 100644
index 00000000..f0bdd6dd
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/003.xyz
@@ -0,0 +1,17 @@
+15
+
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
diff --git a/benchmarks/molecules/water_clusters/004.xyz b/benchmarks/molecules/water_clusters/004.xyz
new file mode 100644
index 00000000..8a06164f
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/004.xyz
@@ -0,0 +1,32 @@
+30
+
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
diff --git a/benchmarks/molecules/water_clusters/005.xyz b/benchmarks/molecules/water_clusters/005.xyz
new file mode 100644
index 00000000..976e8f74
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/005.xyz
@@ -0,0 +1,62 @@
+60
+
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
diff --git a/benchmarks/molecules/water_clusters/006.xyz b/benchmarks/molecules/water_clusters/006.xyz
new file mode 100644
index 00000000..ed702f3d
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/006.xyz
@@ -0,0 +1,98 @@
+96
+
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 101.099000000 104.850000000 99.030700000
+H 101.483000000 104.260000000 99.740500000
+H 101.829000000 105.396000000 98.619700000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 96.373500000 99.168100000 103.663000000
+H 96.032600000 99.385200000 104.578000000
+H 97.337900000 98.909800000 103.720000000
+O 96.740700000 101.641000000 95.246600000
+H 95.765200000 101.625000000 95.027600000
+H 97.256100000 101.957000000 94.450300000
+O 103.969000000 95.809900000 100.611000000
+H 104.656000000 95.771500000 101.336000000
+H 103.152000000 96.276300000 100.950000000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 104.764000000 102.907000000 101.929000000
+H 104.157000000 103.650000000 101.648000000
+H 105.597000000 103.289000000 102.328000000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 95.278100000 97.169000000 98.965800000
+H 95.144800000 97.377000000 99.934800000
+H 95.587900000 97.991100000 98.488100000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 95.118700000 97.700600000 101.797000000
+H 94.171300000 97.423600000 101.957000000
+H 95.377300000 98.403200000 102.460000000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 103.454000000 97.589900000 96.421800000
+H 103.885000000 98.135100000 95.702500000
+H 104.142000000 97.009800000 96.857500000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 99.505700000 94.600000000 99.762000000
+H 98.915000000 94.230400000 99.044800000
+H 100.455000000 94.596700000 99.446700000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 99.128800000 95.980100000 96.602100000
+H 99.037300000 96.941600000 96.861200000
+H 100.097000000 95.729200000 96.588100000
+O 103.544000000 99.038500000 104.412000000
+H 104.182000000 99.184200000 103.655000000
+H 102.605000000 99.102500000 104.073000000
+O 103.133000000 101.981000000 104.535000000
+H 103.581000000 102.216000000 103.673000000
+H 102.678000000 101.095000000 104.444000000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
diff --git a/benchmarks/molecules/water_clusters/007.xyz b/benchmarks/molecules/water_clusters/007.xyz
new file mode 100644
index 00000000..4c949fcc
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/007.xyz
@@ -0,0 +1,143 @@
+141
+
+O 101.140000000 103.233000000 105.698000000
+H 101.800000000 103.577000000 106.365000000
+H 101.619000000 102.707000000 104.996000000
+O 103.662000000 102.962000000 95.665500000
+H 104.569000000 102.981000000 96.087800000
+H 103.118000000 102.230000000 96.076400000
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 101.099000000 104.850000000 99.030700000
+H 101.483000000 104.260000000 99.740500000
+H 101.829000000 105.396000000 98.619700000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 96.373500000 99.168100000 103.663000000
+H 96.032600000 99.385200000 104.578000000
+H 97.337900000 98.909800000 103.720000000
+O 96.740700000 101.641000000 95.246600000
+H 95.765200000 101.625000000 95.027600000
+H 97.256100000 101.957000000 94.450300000
+O 96.855700000 95.639100000 102.759000000
+H 96.157300000 96.250200000 102.386000000
+H 97.741700000 95.856700000 102.349000000
+O 103.969000000 95.809900000 100.611000000
+H 104.656000000 95.771500000 101.336000000
+H 103.152000000 96.276300000 100.950000000
+O 98.463200000 103.644000000 104.855000000
+H 99.448900000 103.710000000 105.009000000
+H 98.023000000 103.265000000 105.669000000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 104.764000000 102.907000000 101.929000000
+H 104.157000000 103.650000000 101.648000000
+H 105.597000000 103.289000000 102.328000000
+O 104.727000000 95.435700000 98.038700000
+H 103.947000000 95.065800000 97.535100000
+H 104.496000000 95.504800000 99.009000000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 95.278100000 97.169000000 98.965800000
+H 95.144800000 97.377000000 99.934800000
+H 95.587900000 97.991100000 98.488100000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 96.798000000 93.944200000 100.568000000
+H 97.508200000 94.486700000 100.119000000
+H 96.982400000 93.900400000 101.550000000
+O 95.118700000 97.700600000 101.797000000
+H 94.171300000 97.423600000 101.957000000
+H 95.377300000 98.403200000 102.460000000
+O 105.654000000 100.606000000 97.050900000
+H 105.817000000 99.917100000 96.344600000
+H 105.599000000 100.160000000 97.944500000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 99.468000000 105.283000000 95.690500000
+H 100.395000000 104.911000000 95.651600000
+H 99.511900000 106.279000000 95.772300000
+O 102.160000000 94.349500000 98.747200000
+H 102.527000000 93.534300000 98.299300000
+H 102.436000000 94.354600000 99.708300000
+O 98.771600000 100.739000000 106.197000000
+H 99.398100000 101.178000000 106.840000000
+H 99.297200000 100.231000000 105.514000000
+O 103.454000000 97.589900000 96.421800000
+H 103.885000000 98.135100000 95.702500000
+H 104.142000000 97.009800000 96.857500000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 99.505700000 94.600000000 99.762000000
+H 98.915000000 94.230400000 99.044800000
+H 100.455000000 94.596700000 99.446700000
+O 93.723900000 101.482000000 100.592000000
+H 93.285300000 102.174000000 100.019000000
+H 93.374700000 100.577000000 100.347000000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 99.128800000 95.980100000 96.602100000
+H 99.037300000 96.941600000 96.861200000
+H 100.097000000 95.729200000 96.588100000
+O 103.544000000 99.038500000 104.412000000
+H 104.182000000 99.184200000 103.655000000
+H 102.605000000 99.102500000 104.073000000
+O 99.482600000 98.237100000 94.256600000
+H 98.968300000 98.764500000 93.580400000
+H 100.018000000 98.859300000 94.827300000
+O 97.111700000 105.889000000 101.284000000
+H 97.802500000 106.403000000 101.792000000
+H 97.487600000 105.002000000 101.014000000
+O 103.133000000 101.981000000 104.535000000
+H 103.581000000 102.216000000 103.673000000
+H 102.678000000 101.095000000 104.444000000
+O 101.858000000 95.959800000 104.565000000
+H 102.487000000 95.187200000 104.478000000
+H 100.951000000 95.624200000 104.818000000
+O 106.341000000 99.341900000 99.395500000
+H 105.471000000 98.930500000 99.666400000
+H 107.040000000 99.120000000 100.075000000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
diff --git a/benchmarks/molecules/water_clusters/008.xyz b/benchmarks/molecules/water_clusters/008.xyz
new file mode 100644
index 00000000..9682cc4e
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/008.xyz
@@ -0,0 +1,230 @@
+228
+
+O 96.287700000 105.219000000 103.893000000
+H 96.781000000 104.419000000 104.235000000
+H 96.485600000 105.342000000 102.921000000
+O 101.140000000 103.233000000 105.698000000
+H 101.800000000 103.577000000 106.365000000
+H 101.619000000 102.707000000 104.996000000
+O 93.054300000 101.153000000 103.187000000
+H 93.153500000 102.024000000 103.669000000
+H 93.282100000 101.279000000 102.221000000
+O 103.662000000 102.962000000 95.665500000
+H 104.569000000 102.981000000 96.087800000
+H 103.118000000 102.230000000 96.076400000
+O 101.495000000 96.997200000 93.049900000
+H 100.616000000 97.208900000 93.477800000
+H 101.533000000 96.022200000 92.831100000
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 103.316000000 100.168000000 106.766000000
+H 103.471000000 99.766300000 105.864000000
+H 103.282000000 101.164000000 106.687000000
+O 101.099000000 104.850000000 99.030700000
+H 101.483000000 104.260000000 99.740500000
+H 101.829000000 105.396000000 98.619700000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 99.241500000 107.096000000 102.899000000
+H 99.533400000 106.810000000 103.812000000
+H 99.798300000 107.871000000 102.599000000
+O 96.373500000 99.168100000 103.663000000
+H 96.032600000 99.385200000 104.578000000
+H 97.337900000 98.909800000 103.720000000
+O 92.236600000 98.969600000 99.830200000
+H 92.257200000 98.492300000 100.709000000
+H 92.125400000 98.304300000 99.091900000
+O 96.740700000 101.641000000 95.246600000
+H 95.765200000 101.625000000 95.027600000
+H 97.256100000 101.957000000 94.450300000
+O 96.855700000 95.639100000 102.759000000
+H 96.157300000 96.250200000 102.386000000
+H 97.741700000 95.856700000 102.349000000
+O 97.209000000 95.906800000 94.278900000
+H 97.087400000 95.813100000 93.290800000
+H 98.015300000 96.468800000 94.463700000
+O 103.969000000 95.809900000 100.611000000
+H 104.656000000 95.771500000 101.336000000
+H 103.152000000 96.276300000 100.950000000
+O 106.587000000 100.034000000 103.851000000
+H 105.829000000 100.104000000 103.203000000
+H 107.394000000 100.487000000 103.470000000
+O 98.463200000 103.644000000 104.855000000
+H 99.448900000 103.710000000 105.009000000
+H 98.023000000 103.265000000 105.669000000
+O 101.993000000 104.014000000 93.998500000
+H 102.580000000 103.877000000 94.796800000
+H 102.066000000 103.222000000 93.391700000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 99.706100000 94.287900000 105.534000000
+H 98.709100000 94.214400000 105.511000000
+H 100.042000000 93.988200000 106.427000000
+O 104.764000000 102.907000000 101.929000000
+H 104.157000000 103.650000000 101.648000000
+H 105.597000000 103.289000000 102.328000000
+O 104.727000000 95.435700000 98.038700000
+H 103.947000000 95.065800000 97.535100000
+H 104.496000000 95.504800000 99.009000000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 94.272300000 104.861000000 98.027200000
+H 93.274400000 104.806000000 97.992700000
+H 94.652300000 104.579000000 97.146100000
+O 94.408300000 105.314000000 100.701000000
+H 94.396800000 105.021000000 99.744600000
+H 95.353500000 105.456000000 100.995000000
+O 106.040000000 95.593700000 102.478000000
+H 105.762000000 96.182200000 103.237000000
+H 106.867000000 95.091200000 102.732000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 95.278100000 97.169000000 98.965800000
+H 95.144800000 97.377000000 99.934800000
+H 95.587900000 97.991100000 98.488100000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.027000000 106.876000000 101.138000000
+H 102.200000000 106.695000000 100.170000000
+H 101.515000000 107.729000000 101.232000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 96.798000000 93.944200000 100.568000000
+H 97.508200000 94.486700000 100.119000000
+H 96.982400000 93.900400000 101.550000000
+O 95.118700000 97.700600000 101.797000000
+H 94.171300000 97.423600000 101.957000000
+H 95.377300000 98.403200000 102.460000000
+O 99.231100000 93.154200000 102.821000000
+H 99.331300000 93.817000000 103.563000000
+H 100.104000000 93.053400000 102.344000000
+O 103.867000000 98.228800000 93.492200000
+H 103.007000000 97.732700000 93.371700000
+H 103.971000000 98.898600000 92.757000000
+O 105.654000000 100.606000000 97.050900000
+H 105.817000000 99.917100000 96.344600000
+H 105.599000000 100.160000000 97.944500000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 95.933300000 100.069000000 106.486000000
+H 95.896800000 99.719700000 107.422000000
+H 96.887400000 100.192000000 106.213000000
+O 97.164700000 94.924300000 105.416000000
+H 96.958600000 95.152200000 104.464000000
+H 96.312500000 94.858500000 105.935000000
+O 97.960300000 99.738400000 92.323200000
+H 98.025100000 99.203100000 91.481000000
+H 97.432100000 100.570000000 92.149900000
+O 106.052000000 98.653800000 95.236000000
+H 106.528000000 97.778800000 95.148400000
+H 105.747000000 98.958900000 94.333900000
+O 99.468000000 105.283000000 95.690500000
+H 100.395000000 104.911000000 95.651600000
+H 99.511900000 106.279000000 95.772300000
+O 103.065000000 106.418000000 98.404100000
+H 102.945000000 107.087000000 97.670300000
+H 103.919000000 106.605000000 98.888900000
+O 100.125000000 101.870000000 92.894300000
+H 99.428600000 101.298000000 92.459700000
+H 99.896600000 101.996000000 93.859700000
+O 102.160000000 94.349500000 98.747200000
+H 102.527000000 93.534300000 98.299300000
+H 102.436000000 94.354600000 99.708300000
+O 101.909000000 92.717000000 101.661000000
+H 102.638000000 93.177700000 102.168000000
+H 102.284000000 91.918600000 101.190000000
+O 97.894300000 93.636500000 97.704600000
+H 96.921800000 93.462300000 97.549500000
+H 98.231600000 94.279000000 97.016600000
+O 98.771600000 100.739000000 106.197000000
+H 99.398100000 101.178000000 106.840000000
+H 99.297200000 100.231000000 105.514000000
+O 94.443800000 94.651000000 99.373500000
+H 95.293900000 94.301900000 99.767700000
+H 94.463600000 95.650800000 99.370600000
+O 103.454000000 97.589900000 96.421800000
+H 103.885000000 98.135100000 95.702500000
+H 104.142000000 97.009800000 96.857500000
+O 97.663000000 103.755000000 93.716600000
+H 97.878200000 104.678000000 94.035900000
+H 98.124000000 103.587000000 92.845200000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 99.505700000 94.600000000 99.762000000
+H 98.915000000 94.230400000 99.044800000
+H 100.455000000 94.596700000 99.446700000
+O 93.723900000 101.482000000 100.592000000
+H 93.285300000 102.174000000 100.019000000
+H 93.374700000 100.577000000 100.347000000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 99.128800000 95.980100000 96.602100000
+H 99.037300000 96.941600000 96.861200000
+H 100.097000000 95.729200000 96.588100000
+O 103.544000000 99.038500000 104.412000000
+H 104.182000000 99.184200000 103.655000000
+H 102.605000000 99.102500000 104.073000000
+O 99.482600000 98.237100000 94.256600000
+H 98.968300000 98.764500000 93.580400000
+H 100.018000000 98.859300000 94.827300000
+O 97.111700000 105.889000000 101.284000000
+H 97.802500000 106.403000000 101.792000000
+H 97.487600000 105.002000000 101.014000000
+O 103.133000000 101.981000000 104.535000000
+H 103.581000000 102.216000000 103.673000000
+H 102.678000000 101.095000000 104.444000000
+O 101.858000000 95.959800000 104.565000000
+H 102.487000000 95.187200000 104.478000000
+H 100.951000000 95.624200000 104.818000000
+O 106.341000000 99.341900000 99.395500000
+H 105.471000000 98.930500000 99.666400000
+H 107.040000000 99.120000000 100.075000000
+O 101.744000000 97.726000000 106.886000000
+H 102.077000000 97.166200000 106.128000000
+H 102.140000000 98.642000000 106.824000000
+O 95.154200000 95.840000000 96.171700000
+H 95.973800000 95.821000000 95.599100000
+H 95.413800000 96.026700000 97.119200000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
+O 98.710500000 97.265300000 106.544000000
+H 99.310200000 97.423100000 107.329000000
+H 98.159900000 96.446100000 106.705000000
diff --git a/benchmarks/molecules/water_clusters/009.xyz b/benchmarks/molecules/water_clusters/009.xyz
new file mode 100644
index 00000000..7ac20eb1
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/009.xyz
@@ -0,0 +1,302 @@
+300
+
+O 104.008000000 103.223000000 106.729000000
+H 105.001000000 103.340000000 106.712000000
+H 103.694000000 102.910000000 105.833000000
+O 96.287700000 105.219000000 103.893000000
+H 96.781000000 104.419000000 104.235000000
+H 96.485600000 105.342000000 102.921000000
+O 101.140000000 103.233000000 105.698000000
+H 101.800000000 103.577000000 106.365000000
+H 101.619000000 102.707000000 104.996000000
+O 95.023600000 104.404000000 95.147300000
+H 94.639700000 103.512000000 94.908900000
+H 95.948400000 104.479000000 94.774200000
+O 93.054300000 101.153000000 103.187000000
+H 93.153500000 102.024000000 103.669000000
+H 93.282100000 101.279000000 102.221000000
+O 103.662000000 102.962000000 95.665500000
+H 104.569000000 102.981000000 96.087800000
+H 103.118000000 102.230000000 96.076400000
+O 101.495000000 96.997200000 93.049900000
+H 100.616000000 97.208900000 93.477800000
+H 101.533000000 96.022200000 92.831100000
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 103.316000000 100.168000000 106.766000000
+H 103.471000000 99.766300000 105.864000000
+H 103.282000000 101.164000000 106.687000000
+O 101.099000000 104.850000000 99.030700000
+H 101.483000000 104.260000000 99.740500000
+H 101.829000000 105.396000000 98.619700000
+O 96.773600000 102.808000000 107.170000000
+H 96.854200000 102.589000000 108.142000000
+H 96.421400000 102.013000000 106.676000000
+O 105.665000000 96.993900000 105.027000000
+H 104.749000000 97.393500000 104.997000000
+H 106.330000000 97.657600000 104.684000000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 99.241500000 107.096000000 102.899000000
+H 99.533400000 106.810000000 103.812000000
+H 99.798300000 107.871000000 102.599000000
+O 96.373500000 99.168100000 103.663000000
+H 96.032600000 99.385200000 104.578000000
+H 97.337900000 98.909800000 103.720000000
+O 92.236600000 98.969600000 99.830200000
+H 92.257200000 98.492300000 100.709000000
+H 92.125400000 98.304300000 99.091900000
+O 96.740700000 101.641000000 95.246600000
+H 95.765200000 101.625000000 95.027600000
+H 97.256100000 101.957000000 94.450300000
+O 106.873000000 103.046000000 96.266300000
+H 106.397000000 102.273000000 96.684800000
+H 107.190000000 102.788000000 95.353900000
+O 96.855700000 95.639100000 102.759000000
+H 96.157300000 96.250200000 102.386000000
+H 97.741700000 95.856700000 102.349000000
+O 97.209000000 95.906800000 94.278900000
+H 97.087400000 95.813100000 93.290800000
+H 98.015300000 96.468800000 94.463700000
+O 103.969000000 95.809900000 100.611000000
+H 104.656000000 95.771500000 101.336000000
+H 103.152000000 96.276300000 100.950000000
+O 106.587000000 100.034000000 103.851000000
+H 105.829000000 100.104000000 103.203000000
+H 107.394000000 100.487000000 103.470000000
+O 98.463200000 103.644000000 104.855000000
+H 99.448900000 103.710000000 105.009000000
+H 98.023000000 103.265000000 105.669000000
+O 101.993000000 104.014000000 93.998500000
+H 102.580000000 103.877000000 94.796800000
+H 102.066000000 103.222000000 93.391700000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 99.706100000 94.287900000 105.534000000
+H 98.709100000 94.214400000 105.511000000
+H 100.042000000 93.988200000 106.427000000
+O 104.764000000 102.907000000 101.929000000
+H 104.157000000 103.650000000 101.648000000
+H 105.597000000 103.289000000 102.328000000
+O 104.727000000 95.435700000 98.038700000
+H 103.947000000 95.065800000 97.535100000
+H 104.496000000 95.504800000 99.009000000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 94.272300000 104.861000000 98.027200000
+H 93.274400000 104.806000000 97.992700000
+H 94.652300000 104.579000000 97.146100000
+O 107.544000000 95.677300000 98.777200000
+H 106.627000000 95.279200000 98.760300000
+H 107.707000000 96.101300000 99.668000000
+O 94.408300000 105.314000000 100.701000000
+H 94.396800000 105.021000000 99.744600000
+H 95.353500000 105.456000000 100.995000000
+O 106.040000000 95.593700000 102.478000000
+H 105.762000000 96.182200000 103.237000000
+H 106.867000000 95.091200000 102.732000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 107.589000000 103.376000000 102.668000000
+H 107.461000000 104.111000000 103.335000000
+H 107.934000000 103.760000000 101.812000000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 107.826000000 96.984100000 101.113000000
+H 108.466000000 97.497100000 101.685000000
+H 107.058000000 96.670200000 101.672000000
+O 92.639000000 96.955600000 97.829000000
+H 93.628900000 97.092800000 97.866000000
+H 92.443100000 96.008400000 97.575100000
+O 95.278100000 97.169000000 98.965800000
+H 95.144800000 97.377000000 99.934800000
+H 95.587900000 97.991100000 98.488100000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.027000000 106.876000000 101.138000000
+H 102.200000000 106.695000000 100.170000000
+H 101.515000000 107.729000000 101.232000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 96.798000000 93.944200000 100.568000000
+H 97.508200000 94.486700000 100.119000000
+H 96.982400000 93.900400000 101.550000000
+O 95.118700000 97.700600000 101.797000000
+H 94.171300000 97.423600000 101.957000000
+H 95.377300000 98.403200000 102.460000000
+O 99.231100000 93.154200000 102.821000000
+H 99.331300000 93.817000000 103.563000000
+H 100.104000000 93.053400000 102.344000000
+O 103.395000000 93.763800000 96.088800000
+H 102.541000000 93.361100000 95.758700000
+H 103.753000000 94.395700000 95.401500000
+O 103.867000000 98.228800000 93.492200000
+H 103.007000000 97.732700000 93.371700000
+H 103.971000000 98.898600000 92.757000000
+O 99.725400000 101.618000000 108.746000000
+H 99.296300000 102.517000000 108.650000000
+H 100.719000000 101.725000000 108.777000000
+O 105.654000000 100.606000000 97.050900000
+H 105.817000000 99.917100000 96.344600000
+H 105.599000000 100.160000000 97.944500000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 104.529000000 95.238500000 94.088100000
+H 104.552000000 94.923200000 93.139400000
+H 104.087000000 96.134100000 94.131500000
+O 95.933300000 100.069000000 106.486000000
+H 95.896800000 99.719700000 107.422000000
+H 96.887400000 100.192000000 106.213000000
+O 97.164700000 94.924300000 105.416000000
+H 96.958600000 95.152200000 104.464000000
+H 96.312500000 94.858500000 105.935000000
+O 97.960300000 99.738400000 92.323200000
+H 98.025100000 99.203100000 91.481000000
+H 97.432100000 100.570000000 92.149900000
+O 95.964200000 107.132000000 98.369800000
+H 96.229400000 107.195000000 99.332000000
+H 95.398600000 106.319000000 98.232100000
+O 103.231000000 106.520000000 103.603000000
+H 102.896000000 106.662000000 102.672000000
+H 102.458000000 106.505000000 104.237000000
+O 92.780100000 95.010400000 101.424000000
+H 92.910900000 94.266600000 102.079000000
+H 93.220200000 94.772800000 100.558000000
+O 99.794600000 91.488300000 100.023000000
+H 100.445000000 92.220600000 100.224000000
+H 98.904700000 91.885300000 99.798800000
+O 106.052000000 98.653800000 95.236000000
+H 106.528000000 97.778800000 95.148400000
+H 105.747000000 98.958900000 94.333900000
+O 99.468000000 105.283000000 95.690500000
+H 100.395000000 104.911000000 95.651600000
+H 99.511900000 106.279000000 95.772300000
+O 103.065000000 106.418000000 98.404100000
+H 102.945000000 107.087000000 97.670300000
+H 103.919000000 106.605000000 98.888900000
+O 100.125000000 101.870000000 92.894300000
+H 99.428600000 101.298000000 92.459700000
+H 99.896600000 101.996000000 93.859700000
+O 92.131300000 97.642300000 102.177000000
+H 91.317000000 97.791400000 102.738000000
+H 92.266500000 96.661000000 102.040000000
+O 102.160000000 94.349500000 98.747200000
+H 102.527000000 93.534300000 98.299300000
+H 102.436000000 94.354600000 99.708300000
+O 101.909000000 92.717000000 101.661000000
+H 102.638000000 93.177700000 102.168000000
+H 102.284000000 91.918600000 101.190000000
+O 101.195000000 106.928000000 105.456000000
+H 101.206000000 106.434000000 106.325000000
+H 100.871000000 107.862000000 105.607000000
+O 97.894300000 93.636500000 97.704600000
+H 96.921800000 93.462300000 97.549500000
+H 98.231600000 94.279000000 97.016600000
+O 98.771600000 100.739000000 106.197000000
+H 99.398100000 101.178000000 106.840000000
+H 99.297200000 100.231000000 105.514000000
+O 94.443800000 94.651000000 99.373500000
+H 95.293900000 94.301900000 99.767700000
+H 94.463600000 95.650800000 99.370600000
+O 103.454000000 97.589900000 96.421800000
+H 103.885000000 98.135100000 95.702500000
+H 104.142000000 97.009800000 96.857500000
+O 97.663000000 103.755000000 93.716600000
+H 97.878200000 104.678000000 94.035900000
+H 98.124000000 103.587000000 92.845200000
+O 93.470000000 98.898100000 105.386000000
+H 93.191400000 99.414300000 104.576000000
+H 94.083300000 99.457800000 105.943000000
+O 92.500500000 101.454000000 96.905900000
+H 92.032300000 101.750000000 97.738200000
+H 92.354500000 100.473000000 96.773000000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 103.773000000 93.788800000 103.794000000
+H 103.865000000 93.694200000 104.785000000
+H 104.676000000 93.734600000 103.368000000
+O 105.714000000 105.895000000 99.861500000
+H 105.704000000 106.458000000 100.688000000
+H 106.647000000 105.580000000 99.685100000
+O 99.505700000 94.600000000 99.762000000
+H 98.915000000 94.230400000 99.044800000
+H 100.455000000 94.596700000 99.446700000
+O 93.723900000 101.482000000 100.592000000
+H 93.285300000 102.174000000 100.019000000
+H 93.374700000 100.577000000 100.347000000
+O 92.515400000 104.356000000 102.399000000
+H 92.834800000 104.698000000 103.283000000
+H 93.169800000 104.611000000 101.687000000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 99.128800000 95.980100000 96.602100000
+H 99.037300000 96.941600000 96.861200000
+H 100.097000000 95.729200000 96.588100000
+O 103.544000000 99.038500000 104.412000000
+H 104.182000000 99.184200000 103.655000000
+H 102.605000000 99.102500000 104.073000000
+O 99.482600000 98.237100000 94.256600000
+H 98.968300000 98.764500000 93.580400000
+H 100.018000000 98.859300000 94.827300000
+O 97.111700000 105.889000000 101.284000000
+H 97.802500000 106.403000000 101.792000000
+H 97.487600000 105.002000000 101.014000000
+O 103.133000000 101.981000000 104.535000000
+H 103.581000000 102.216000000 103.673000000
+H 102.678000000 101.095000000 104.444000000
+O 101.858000000 95.959800000 104.565000000
+H 102.487000000 95.187200000 104.478000000
+H 100.951000000 95.624200000 104.818000000
+O 106.341000000 99.341900000 99.395500000
+H 105.471000000 98.930500000 99.666400000
+H 107.040000000 99.120000000 100.075000000
+O 101.744000000 97.726000000 106.886000000
+H 102.077000000 97.166200000 106.128000000
+H 102.140000000 98.642000000 106.824000000
+O 95.154200000 95.840000000 96.171700000
+H 95.973800000 95.821000000 95.599100000
+H 95.413800000 96.026700000 97.119200000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
+O 94.116000000 101.973000000 94.712100000
+H 93.626400000 101.369000000 94.082700000
+H 93.593800000 102.064000000 95.560000000
+O 98.710500000 97.265300000 106.544000000
+H 99.310200000 97.423100000 107.329000000
+H 98.159900000 96.446100000 106.705000000
diff --git a/benchmarks/molecules/water_clusters/010.xyz b/benchmarks/molecules/water_clusters/010.xyz
new file mode 100644
index 00000000..ddf34b4e
--- /dev/null
+++ b/benchmarks/molecules/water_clusters/010.xyz
@@ -0,0 +1,419 @@
+417
+
+O 104.008000000 103.223000000 106.729000000
+H 105.001000000 103.340000000 106.712000000
+H 103.694000000 102.910000000 105.833000000
+O 96.287700000 105.219000000 103.893000000
+H 96.781000000 104.419000000 104.235000000
+H 96.485600000 105.342000000 102.921000000
+O 101.140000000 103.233000000 105.698000000
+H 101.800000000 103.577000000 106.365000000
+H 101.619000000 102.707000000 104.996000000
+O 95.023600000 104.404000000 95.147300000
+H 94.639700000 103.512000000 94.908900000
+H 95.948400000 104.479000000 94.774200000
+O 96.652200000 92.863600000 94.168600000
+H 96.603500000 93.849000000 94.005100000
+H 95.732400000 92.507100000 94.332700000
+O 93.054300000 101.153000000 103.187000000
+H 93.153500000 102.024000000 103.669000000
+H 93.282100000 101.279000000 102.221000000
+O 100.056000000 104.833000000 91.780500000
+H 100.663000000 104.400000000 92.446900000
+H 99.761600000 105.723000000 92.126900000
+O 103.662000000 102.962000000 95.665500000
+H 104.569000000 102.981000000 96.087800000
+H 103.118000000 102.230000000 96.076400000
+O 101.495000000 96.997200000 93.049900000
+H 100.616000000 97.208900000 93.477800000
+H 101.533000000 96.022200000 92.831100000
+O 97.873900000 103.017000000 100.816000000
+H 98.128600000 103.038000000 99.848800000
+H 97.173800000 102.317000000 100.960000000
+O 103.316000000 100.168000000 106.766000000
+H 103.471000000 99.766300000 105.864000000
+H 103.282000000 101.164000000 106.687000000
+O 101.099000000 104.850000000 99.030700000
+H 101.483000000 104.260000000 99.740500000
+H 101.829000000 105.396000000 98.619700000
+O 96.773600000 102.808000000 107.170000000
+H 96.854200000 102.589000000 108.142000000
+H 96.421400000 102.013000000 106.676000000
+O 105.665000000 96.993900000 105.027000000
+H 104.749000000 97.393500000 104.997000000
+H 106.330000000 97.657600000 104.684000000
+O 92.694200000 96.495000000 105.409000000
+H 91.854100000 96.418200000 104.872000000
+H 92.964700000 97.455900000 105.469000000
+O 105.279000000 92.275800000 100.558000000
+H 104.667000000 91.493800000 100.676000000
+H 105.767000000 92.188100000 99.689400000
+O 100.645000000 100.169000000 95.891500000
+H 101.491000000 100.305000000 96.406200000
+H 99.888700000 100.618000000 96.367800000
+O 99.814000000 100.835000000 101.232000000
+H 99.329200000 99.976800000 101.063000000
+H 99.151600000 101.561000000 101.414000000
+O 98.804000000 98.512200000 97.758100000
+H 99.782100000 98.646900000 97.916700000
+H 98.421800000 99.326500000 97.321300000
+O 100.747000000 100.164000000 103.736000000
+H 100.658000000 100.628000000 102.855000000
+H 100.105000000 99.398600000 103.776000000
+O 98.070300000 98.516900000 100.438000000
+H 97.172800000 98.878600000 100.690000000
+H 98.194000000 98.592200000 99.448100000
+O 99.241500000 107.096000000 102.899000000
+H 99.533400000 106.810000000 103.812000000
+H 99.798300000 107.871000000 102.599000000
+O 101.321000000 92.439600000 94.597100000
+H 100.828000000 92.917700000 93.869600000
+H 100.676000000 91.895200000 95.133600000
+O 97.511000000 109.183000000 97.591000000
+H 97.971100000 109.344000000 98.464100000
+H 97.118900000 108.263000000 97.585400000
+O 96.373500000 99.168100000 103.663000000
+H 96.032600000 99.385200000 104.578000000
+H 97.337900000 98.909800000 103.720000000
+O 98.712300000 104.348000000 108.710000000
+H 99.403100000 105.010000000 108.418000000
+H 97.801400000 104.702000000 108.498000000
+O 92.236600000 98.969600000 99.830200000
+H 92.257200000 98.492300000 100.709000000
+H 92.125400000 98.304300000 99.091900000
+O 96.740700000 101.641000000 95.246600000
+H 95.765200000 101.625000000 95.027600000
+H 97.256100000 101.957000000 94.450300000
+O 103.992000000 93.621500000 106.488000000
+H 103.820000000 92.924200000 107.184000000
+H 104.711000000 94.239300000 106.806000000
+O 93.812300000 95.791400000 93.897200000
+H 93.511100000 94.848700000 93.753200000
+H 94.305800000 95.854800000 94.764600000
+O 105.589000000 107.064000000 102.225000000
+H 104.796000000 106.766000000 102.758000000
+H 105.511000000 108.041000000 102.031000000
+O 94.447800000 93.062900000 97.104400000
+H 94.685200000 93.846500000 96.530300000
+H 94.118000000 93.387100000 97.991100000
+O 106.873000000 103.046000000 96.266300000
+H 106.397000000 102.273000000 96.684800000
+H 107.190000000 102.788000000 95.353900000
+O 96.855700000 95.639100000 102.759000000
+H 96.157300000 96.250200000 102.386000000
+H 97.741700000 95.856700000 102.349000000
+O 97.209000000 95.906800000 94.278900000
+H 97.087400000 95.813100000 93.290800000
+H 98.015300000 96.468800000 94.463700000
+O 103.969000000 95.809900000 100.611000000
+H 104.656000000 95.771500000 101.336000000
+H 103.152000000 96.276300000 100.950000000
+O 106.587000000 100.034000000 103.851000000
+H 105.829000000 100.104000000 103.203000000
+H 107.394000000 100.487000000 103.470000000
+O 97.068600000 95.759300000 91.564500000
+H 97.632500000 96.221500000 90.880200000
+H 97.128400000 94.769800000 91.432600000
+O 100.377000000 94.639000000 92.016300000
+H 100.540000000 94.798900000 91.042700000
+H 99.775700000 93.847800000 92.128000000
+O 98.463200000 103.644000000 104.855000000
+H 99.448900000 103.710000000 105.009000000
+H 98.023000000 103.265000000 105.669000000
+O 101.993000000 104.014000000 93.998500000
+H 102.580000000 103.877000000 94.796800000
+H 102.066000000 103.222000000 93.391700000
+O 91.476100000 103.263000000 99.076600000
+H 91.525700000 104.257000000 98.982100000
+H 90.519400000 102.973000000 99.050700000
+O 98.548000000 101.265000000 97.248600000
+H 98.688900000 102.140000000 97.711000000
+H 97.919900000 101.391000000 96.480800000
+O 99.706100000 94.287900000 105.534000000
+H 98.709100000 94.214400000 105.511000000
+H 100.042000000 93.988200000 106.427000000
+O 104.764000000 102.907000000 101.929000000
+H 104.157000000 103.650000000 101.648000000
+H 105.597000000 103.289000000 102.328000000
+O 104.727000000 95.435700000 98.038700000
+H 103.947000000 95.065800000 97.535100000
+H 104.496000000 95.504800000 99.009000000
+O 103.898000000 98.427900000 99.984500000
+H 103.015000000 98.654900000 99.573700000
+H 104.128000000 97.477300000 99.776100000
+O 108.743000000 100.423000000 97.268200000
+H 107.828000000 100.128000000 97.542100000
+H 109.219000000 99.663600000 96.823800000
+O 99.166600000 96.442100000 101.723000000
+H 98.843200000 97.206600000 101.166000000
+H 99.643900000 95.783700000 101.141000000
+O 94.272300000 104.861000000 98.027200000
+H 93.274400000 104.806000000 97.992700000
+H 94.652300000 104.579000000 97.146100000
+O 107.544000000 95.677300000 98.777200000
+H 106.627000000 95.279200000 98.760300000
+H 107.707000000 96.101300000 99.668000000
+O 94.408300000 105.314000000 100.701000000
+H 94.396800000 105.021000000 99.744600000
+H 95.353500000 105.456000000 100.995000000
+O 106.040000000 95.593700000 102.478000000
+H 105.762000000 96.182200000 103.237000000
+H 106.867000000 95.091200000 102.732000000
+O 102.891000000 100.842000000 97.477600000
+H 103.837000000 100.662000000 97.209700000
+H 102.868000000 101.166000000 98.423400000
+O 106.874000000 99.683900000 106.428000000
+H 106.236000000 100.310000000 106.876000000
+H 106.818000000 99.803900000 105.436000000
+O 107.589000000 103.376000000 102.668000000
+H 107.461000000 104.111000000 103.335000000
+H 107.934000000 103.760000000 101.812000000
+O 96.227200000 100.990000000 101.698000000
+H 96.148800000 100.422000000 102.517000000
+H 95.313600000 101.237000000 101.375000000
+O 107.826000000 96.984100000 101.113000000
+H 108.466000000 97.497100000 101.685000000
+H 107.058000000 96.670200000 101.672000000
+O 92.639000000 96.955600000 97.829000000
+H 93.628900000 97.092800000 97.866000000
+H 92.443100000 96.008400000 97.575100000
+O 95.278100000 97.169000000 98.965800000
+H 95.144800000 97.377000000 99.934800000
+H 95.587900000 97.991100000 98.488100000
+O 100.904000000 98.618600000 90.342100000
+H 101.764000000 98.307000000 89.937000000
+H 100.795000000 98.208600000 91.247600000
+O 98.864800000 98.222500000 103.917000000
+H 98.949800000 97.463000000 103.272000000
+H 99.054800000 97.896400000 104.843000000
+O 104.578000000 100.035000000 101.952000000
+H 104.419000000 101.011000000 101.802000000
+H 104.206000000 99.514900000 101.184000000
+O 102.027000000 106.876000000 101.138000000
+H 102.200000000 106.695000000 100.170000000
+H 101.515000000 107.729000000 101.232000000
+O 102.429000000 104.060000000 101.348000000
+H 101.757000000 103.665000000 101.974000000
+H 102.209000000 105.021000000 101.185000000
+O 109.444000000 101.526000000 99.560200000
+H 109.322000000 101.267000000 98.601900000
+H 110.317000000 102.000000000 99.669500000
+O 96.798000000 93.944200000 100.568000000
+H 97.508200000 94.486700000 100.119000000
+H 96.982400000 93.900400000 101.550000000
+O 108.101000000 103.927000000 99.741400000
+H 108.585000000 103.064000000 99.882900000
+H 108.116000000 104.162000000 98.769500000
+O 95.118700000 97.700600000 101.797000000
+H 94.171300000 97.423600000 101.957000000
+H 95.377300000 98.403200000 102.460000000
+O 99.231100000 93.154200000 102.821000000
+H 99.331300000 93.817000000 103.563000000
+H 100.104000000 93.053400000 102.344000000
+O 103.395000000 93.763800000 96.088800000
+H 102.541000000 93.361100000 95.758700000
+H 103.753000000 94.395700000 95.401500000
+O 103.867000000 98.228800000 93.492200000
+H 103.007000000 97.732700000 93.371700000
+H 103.971000000 98.898600000 92.757000000
+O 99.725400000 101.618000000 108.746000000
+H 99.296300000 102.517000000 108.650000000
+H 100.719000000 101.725000000 108.777000000
+O 105.654000000 100.606000000 97.050900000
+H 105.817000000 99.917100000 96.344600000
+H 105.599000000 100.160000000 97.944500000
+O 98.708200000 103.752000000 98.244300000
+H 98.397100000 104.234000000 97.425400000
+H 99.598500000 104.111000000 98.524400000
+O 93.574900000 105.539000000 104.514000000
+H 93.322000000 106.507000000 104.525000000
+H 94.568500000 105.454000000 104.587000000
+O 104.529000000 95.238500000 94.088100000
+H 104.552000000 94.923200000 93.139400000
+H 104.087000000 96.134100000 94.131500000
+O 100.150000000 108.297000000 95.202800000
+H 101.071000000 108.189000000 95.577600000
+H 99.689000000 109.055000000 95.663400000
+O 97.590800000 90.988100000 102.432000000
+H 96.888100000 91.054500000 101.724000000
+H 98.094000000 91.850700000 102.484000000
+O 95.933300000 100.069000000 106.486000000
+H 95.896800000 99.719700000 107.422000000
+H 96.887400000 100.192000000 106.213000000
+O 97.164700000 94.924300000 105.416000000
+H 96.958600000 95.152200000 104.464000000
+H 96.312500000 94.858500000 105.935000000
+O 97.960300000 99.738400000 92.323200000
+H 98.025100000 99.203100000 91.481000000
+H 97.432100000 100.570000000 92.149900000
+O 95.964200000 107.132000000 98.369800000
+H 96.229400000 107.195000000 99.332000000
+H 95.398600000 106.319000000 98.232100000
+O 103.231000000 106.520000000 103.603000000
+H 102.896000000 106.662000000 102.672000000
+H 102.458000000 106.505000000 104.237000000
+O 92.780100000 95.010400000 101.424000000
+H 92.910900000 94.266600000 102.079000000
+H 93.220200000 94.772800000 100.558000000
+O 99.794600000 91.488300000 100.023000000
+H 100.445000000 92.220600000 100.224000000
+H 98.904700000 91.885300000 99.798800000
+O 106.052000000 98.653800000 95.236000000
+H 106.528000000 97.778800000 95.148400000
+H 105.747000000 98.958900000 94.333900000
+O 98.547200000 109.727000000 100.061000000
+H 98.227700000 109.627000000 101.003000000
+H 98.884800000 110.658000000 99.920200000
+O 98.521800000 99.296300000 109.570000000
+H 99.206400000 98.567900000 109.543000000
+H 98.932100000 100.151000000 109.251000000
+O 99.468000000 105.283000000 95.690500000
+H 100.395000000 104.911000000 95.651600000
+H 99.511900000 106.279000000 95.772300000
+O 103.065000000 106.418000000 98.404100000
+H 102.945000000 107.087000000 97.670300000
+H 103.919000000 106.605000000 98.888900000
+O 100.125000000 101.870000000 92.894300000
+H 99.428600000 101.298000000 92.459700000
+H 99.896600000 101.996000000 93.859700000
+O 92.131300000 97.642300000 102.177000000
+H 91.317000000 97.791400000 102.738000000
+H 92.266500000 96.661000000 102.040000000
+O 102.160000000 94.349500000 98.747200000
+H 102.527000000 93.534300000 98.299300000
+H 102.436000000 94.354600000 99.708300000
+O 101.909000000 92.717000000 101.661000000
+H 102.638000000 93.177700000 102.168000000
+H 102.284000000 91.918600000 101.190000000
+O 93.189700000 99.957300000 93.042600000
+H 92.585400000 99.291400000 93.479900000
+H 93.929500000 99.477100000 92.571400000
+O 97.613900000 109.323000000 102.431000000
+H 98.079300000 108.566000000 102.889000000
+H 97.464100000 110.066000000 103.084000000
+O 101.195000000 106.928000000 105.456000000
+H 101.206000000 106.434000000 106.325000000
+H 100.871000000 107.862000000 105.607000000
+O 97.894300000 93.636500000 97.704600000
+H 96.921800000 93.462300000 97.549500000
+H 98.231600000 94.279000000 97.016600000
+O 98.771600000 100.739000000 106.197000000
+H 99.398100000 101.178000000 106.840000000
+H 99.297200000 100.231000000 105.514000000
+O 96.613800000 101.997000000 91.481900000
+H 96.731600000 102.040000000 90.489800000
+H 96.070000000 102.779000000 91.787000000
+O 94.443800000 94.651000000 99.373500000
+H 95.293900000 94.301900000 99.767700000
+H 94.463600000 95.650800000 99.370600000
+O 102.486000000 102.214000000 109.341000000
+H 103.154000000 101.634000000 109.808000000
+H 102.963000000 102.838000000 108.721000000
+O 103.454000000 97.589900000 96.421800000
+H 103.885000000 98.135100000 95.702500000
+H 104.142000000 97.009800000 96.857500000
+O 97.663000000 103.755000000 93.716600000
+H 97.878200000 104.678000000 94.035900000
+H 98.124000000 103.587000000 92.845200000
+O 94.716800000 95.339500000 106.730000000
+H 94.731500000 95.780000000 107.628000000
+H 94.004900000 95.757200000 106.165000000
+O 100.740000000 109.200000000 101.978000000
+H 100.530000000 109.974000000 102.574000000
+H 100.204000000 109.272000000 101.137000000
+O 108.674000000 100.948000000 102.346000000
+H 108.614000000 100.958000000 101.348000000
+H 108.378000000 101.833000000 102.706000000
+O 104.383000000 100.426000000 91.793300000
+H 103.614000000 101.043000000 91.624700000
+H 105.239000000 100.940000000 91.747600000
+O 93.470000000 98.898100000 105.386000000
+H 93.191400000 99.414300000 104.576000000
+H 94.083300000 99.457800000 105.943000000
+O 92.500500000 101.454000000 96.905900000
+H 92.032300000 101.750000000 97.738200000
+H 92.354500000 100.473000000 96.773000000
+O 95.630300000 99.996600000 98.245400000
+H 96.540400000 100.410000000 98.268900000
+H 94.982900000 100.638000000 97.834500000
+O 91.348100000 98.770100000 96.465200000
+H 91.788200000 98.003500000 96.932700000
+H 90.438200000 98.918700000 96.852400000
+O 103.773000000 93.788800000 103.794000000
+H 103.865000000 93.694200000 104.785000000
+H 104.676000000 93.734600000 103.368000000
+O 105.714000000 105.895000000 99.861500000
+H 105.704000000 106.458000000 100.688000000
+H 106.647000000 105.580000000 99.685100000
+O 99.505700000 94.600000000 99.762000000
+H 98.915000000 94.230400000 99.044800000
+H 100.455000000 94.596700000 99.446700000
+O 93.723900000 101.482000000 100.592000000
+H 93.285300000 102.174000000 100.019000000
+H 93.374700000 100.577000000 100.347000000
+O 92.515400000 104.356000000 102.399000000
+H 92.834800000 104.698000000 103.283000000
+H 93.169800000 104.611000000 101.687000000
+O 102.360000000 101.551000000 99.964500000
+H 102.675000000 102.370000000 100.444000000
+H 101.556000000 101.180000000 100.430000000
+O 99.128800000 95.980100000 96.602100000
+H 99.037300000 96.941600000 96.861200000
+H 100.097000000 95.729200000 96.588100000
+O 95.836300000 91.031200000 100.005000000
+H 95.675500000 91.876800000 99.496200000
+H 95.236400000 91.004200000 100.805000000
+O 100.395000000 90.892200000 97.253800000
+H 99.729500000 90.724800000 97.981200000
+H 101.269000000 91.162100000 97.657400000
+O 103.544000000 99.038500000 104.412000000
+H 104.182000000 99.184200000 103.655000000
+H 102.605000000 99.102500000 104.073000000
+O 99.482600000 98.237100000 94.256600000
+H 98.968300000 98.764500000 93.580400000
+H 100.018000000 98.859300000 94.827300000
+O 97.111700000 105.889000000 101.284000000
+H 97.802500000 106.403000000 101.792000000
+H 97.487600000 105.002000000 101.014000000
+O 103.133000000 101.981000000 104.535000000
+H 103.581000000 102.216000000 103.673000000
+H 102.678000000 101.095000000 104.444000000
+O 101.858000000 95.959800000 104.565000000
+H 102.487000000 95.187200000 104.478000000
+H 100.951000000 95.624200000 104.818000000
+O 102.969000000 107.814000000 95.734000000
+H 102.874000000 108.030000000 94.762400000
+H 103.931000000 107.884000000 95.998000000
+O 106.341000000 99.341900000 99.395500000
+H 105.471000000 98.930500000 99.666400000
+H 107.040000000 99.120000000 100.075000000
+O 101.744000000 97.726000000 106.886000000
+H 102.077000000 97.166200000 106.128000000
+H 102.140000000 98.642000000 106.824000000
+O 95.154200000 95.840000000 96.171700000
+H 95.973800000 95.821000000 95.599100000
+H 95.413800000 96.026700000 97.119200000
+O 101.836000000 97.446700000 102.110000000
+H 100.860000000 97.397400000 101.898000000
+H 101.991000000 97.133400000 103.047000000
+O 101.665000000 98.316100000 98.319400000
+H 101.904000000 99.233800000 98.002000000
+H 102.224000000 97.640900000 97.837700000
+O 99.984700000 103.272000000 102.307000000
+H 99.640700000 103.104000000 103.231000000
+H 99.216500000 103.453000000 101.693000000
+O 92.533800000 103.109000000 105.488000000
+H 92.597100000 102.910000000 106.466000000
+H 93.148200000 103.865000000 105.261000000
+O 94.116000000 101.973000000 94.712100000
+H 93.626400000 101.369000000 94.082700000
+H 93.593800000 102.064000000 95.560000000
+O 96.662300000 107.245000000 105.890000000
+H 96.449100000 106.611000000 105.147000000
+H 96.367500000 106.851000000 106.761000000
+O 102.243000000 102.219000000 91.223000000
+H 102.226000000 102.797000000 90.406800000
+H 101.309000000 102.079000000 91.551900000
+O 98.710500000 97.265300000 106.544000000
+H 99.310200000 97.423100000 107.329000000
+H 98.159900000 96.446100000 106.705000000
diff --git a/benchmarks/scf/dft_driver.py b/benchmarks/scf/dft_driver.py
new file mode 100644
index 00000000..0a63d350
--- /dev/null
+++ b/benchmarks/scf/dft_driver.py
@@ -0,0 +1,103 @@
+import os
+import csv
+import pyscf
+import time
+import argparse
+from pyscf import lib
+from pyscf.dft import rks
+
+lib.num_threads(8)
+
+parser = argparse.ArgumentParser(description='Run SCF, grad, and Hessian in GPU4PySCF for molecules')
+parser.add_argument('--basis', type=str, default='def2-tzvpp')
+parser.add_argument('--verbose', type=int, default=1)
+parser.add_argument('--xc', type=str, default='B3LYP')
+parser.add_argument('--device', type=str, default='GPU')
+parser.add_argument('--input_path', type=str, default='./')
+parser.add_argument('--output_path', type=str, default='./')
+parser.add_argument('--with_hessian', type=bool, default=False)
+args = parser.parse_args()
+bas = args.basis
+verbose = args.verbose
+xc = args.xc
+
+if xc == 'LDA':
+ xc = 'LDA,VWN5'
+
+if not os.path.exists(args.output_path):
+ os.mkdir(args.output_path)
+
+if args.device == 'GPU':
+ import cupy
+ import gpu4pyscf
+ from gpu4pyscf.dft import rks
+ props = cupy.cuda.runtime.getDeviceProperties(0)
+ device = props['name'].decode('ascii')
+ output_file = device+'.csv'
+else:
+ from pyscf.dft import rks
+ output_file = 'PySCF-16-cores-CPU.csv'
+output_file = args.output_path + output_file
+
+def run_dft(filename):
+ mol = pyscf.M(atom=filename, basis=bas, max_memory=64000)
+ start_time = time.time()
+ # set verbose >= 6 for debugging timer
+ mol.verbose = 4 #verbose
+ mol.max_memory = 40000
+ mf = rks.RKS(mol, xc=xc)
+ mf.grids.atom_grid = (99,590)
+ mf.chkfile = None
+ prep_time = time.time() - start_time
+ mf.conv_tol = 1e-9
+ mf.nlcgrids.atom_grid = (50,194)
+ mf.max_cycle = 100
+ try:
+ e_dft = mf.kernel()
+ scf_time = time.time() - start_time
+ except:
+ scf_time = -1
+ e_dft = 0
+
+ # calculate gradient
+ if args.device == 'GPU':
+ cupy.get_default_memory_pool().free_all_blocks()
+ try:
+ start_time = time.time()
+ g = mf.nuc_grad_method()
+ g.max_memory = 40000
+ f = g.kernel()
+ grad_time = time.time() - start_time
+ except:
+ grad_time = -1
+
+ # calculate hessian
+ if args.device == 'GPU':
+ cupy.get_default_memory_pool().free_all_blocks()
+
+ hess_time = -1
+ if args.with_hessian:
+ try:
+ start_time = time.time()
+ h = mf.Hessian()
+ h.max_memory = 40000
+ hess = h.kernel()
+ hess_time = time.time() - start_time
+ except:
+ hess_time = -1
+
+ return mol.natm, mol.nao, scf_time, grad_time, hess_time, e_dft
+
+fields = ['mol','natm', 'nao', 't_scf', 't_gradient', 't_hessian', 'e_tot']
+csvfile = open(output_file, 'w')
+csvwriter = csv.writer(csvfile)
+csvwriter.writerow(fields)
+
+for filename in sorted(os.listdir(args.input_path)):
+ if filename.endswith(".xyz"):
+ print(f'running DFT {filename}')
+ info = run_dft(args.input_path+filename)
+ row = [filename[:-4]]+list(info)
+ csvwriter.writerow(row)
+ csvfile.flush()
+csvfile.close()
diff --git a/benchmarks/scf/generate_tables.ipynb b/benchmarks/scf/generate_tables.ipynb
new file mode 100644
index 00000000..e49ae7cc
--- /dev/null
+++ b/benchmarks/scf/generate_tables.ipynb
@@ -0,0 +1,235 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Direct SCF with different xc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|------:|-------:|-------:|-------:|--------:|-------:|----------:|\n",
+ "| 2 | 3 | 0.22 | 0.32 | 0.13 | 0.24 | 0.69 |\n",
+ "| 3 | 15 | 0.81 | 1.35 | 1.45 | 1.8 | 4.85 |\n",
+ "| 4 | 30 | 1.83 | 2.76 | 4.1 | 6.66 | 7.61 |\n",
+ "| 5 | 60 | 2.88 | 3.71 | 7.24 | 8.36 | 9.44 |\n",
+ "| 6 | 96 | 4.27 | 4.48 | 7.73 | 10 | 9.79 |\n",
+ "| 7 | 141 | 3.94 | 4.07 | 8.57 | 10.39 | 9.39 |\n",
+ "| 8 | 228 | nan | nan | nan | nan | nan |\n",
+ "| 9 | 300 | nan | nan | nan | nan | nan |\n",
+ "| 10 | 417 | nan | nan | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "A100_file = 'A100-SXM-80GB.csv'\n",
+ "qchem_file = 'qchem-32-cores-cpu.csv'\n",
+ "\n",
+ "keys = ['mol', 'natm']\n",
+ "empty = {'mol':[], 'natm':[]}\n",
+ "df_A100_scf = pd.DataFrame(empty)\n",
+ "df_V100_scf = pd.DataFrame(empty)\n",
+ "df_A100_grad = pd.DataFrame(empty)\n",
+ "df_V100_grad = pd.DataFrame(empty)\n",
+ "path = 'water_clusters/xc/'\n",
+ "for xc in ['LDA', 'PBE', 'B3LYP', 'M06', 'wB97m-v']:\n",
+ " df_qchem = pd.read_csv(path + xc + '/' + qchem_file)\n",
+ " df_qchem = df_qchem.rename(columns={'t_scf':'scf_qchem', 't_gradient':'grad_qchem'})\n",
+ " \n",
+ " df_A100 = pd.read_csv(path + xc + '/' + A100_file)\n",
+ " df_A100 = df_A100.rename(columns={'t_scf':'scf_A100', 't_gradient':'grad_A100'})\n",
+ " df_A100 = df_A100.merge(df_qchem, how='outer', on='mol')\n",
+ " \n",
+ " df_A100['scf_'+xc] = df_A100['scf_qchem']/df_A100['scf_A100']\n",
+ " df_A100['grad_'+xc] = df_A100['grad_qchem']/df_A100['grad_A100']\n",
+ " df_A100 = df_A100[keys+['scf_'+xc, 'grad_'+xc]]\n",
+ " \n",
+ " df_A100_scf = df_A100_scf.merge(df_A100[keys+['scf_'+xc]], how='outer', on=keys)\n",
+ " df_A100_grad= df_A100_grad.merge(df_A100[keys+['grad_'+xc]], how='outer', on=keys)\n",
+ " df_A100_scf = df_A100_scf.rename(columns={'scf_'+xc:xc})\n",
+ " df_A100_grad = df_A100_grad.rename(columns={'grad_'+xc:xc})\n",
+ " df_A100_scf[xc] = df_A100_scf[xc].apply(lambda x: round(x,2))\n",
+ " df_A100_grad[xc] = df_A100_grad[xc].apply(lambda x: round(x,2))\n",
+ "\n",
+ "print(df_A100_scf.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "''"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "| mol | natm | LDA | PBE | B3LYP | M06 | wB97m-v |\n",
+ "|------:|-------:|-------:|-------:|--------:|-------:|----------:|\n",
+ "| 2 | 3 | 0.85 | 0.84 | 0.77 | 0.74 | 0.57 |\n",
+ "| 3 | 15 | 0.56 | 0.89 | 1.44 | 1.57 | 1.52 |\n",
+ "| 4 | 30 | 0.59 | 1.03 | 2.13 | 2.08 | 1.9 |\n",
+ "| 5 | 60 | 0.53 | 0.87 | 2.45 | 2.35 | 1.73 |\n",
+ "| 6 | 96 | 0.61 | 0.87 | 2.43 | 2.37 | 1.59 |\n",
+ "| 7 | 141 | 0.92 | 1.08 | 2.61 | 2.62 | 1.53 |\n",
+ "| 8 | 228 | nan | nan | nan | nan | nan |\n",
+ "| 9 | 300 | nan | nan | nan | nan | nan |\n",
+ "| 10 | 417 | nan | nan | nan | nan | nan |\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df_A100_grad.to_markdown(index=False))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Merlin (Python3 + MLSQL) [Spark 3.0]",
+ "language": "python",
+ "name": "merlin_kernel"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "Python3 with MLSQL",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "0.1"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/benchmarks/scf/qchem.py b/benchmarks/scf/qchem.py
new file mode 100644
index 00000000..fe5eeb39
--- /dev/null
+++ b/benchmarks/scf/qchem.py
@@ -0,0 +1,89 @@
+import os
+import csv
+import argparse
+import subprocess
+
+parser = argparse.ArgumentParser(description='Run SCF, grad with Q-Chem for molecules')
+parser.add_argument('--basis', type=str, default='def2-tzvpp')
+parser.add_argument('--xc', type=str, default='B3LYP')
+parser.add_argument('--input_path', type=str, default='./')
+parser.add_argument('--output_path', type=str, default='./')
+args = parser.parse_args()
+bas = args.basis
+xc = args.xc
+
+if not os.path.exists(args.output_path):
+ os.mkdir(args.output_path)
+
+os.environ['QCSCRATCH'] = '/tmp/'
+
+def run_dft(filename):
+ with open(filename, 'r') as xyz_file:
+ coords = xyz_file.readlines()[2:]
+
+ with open('qchem_input.in', "w") as input:
+ input.write("$molecule\n")
+ input.write("0 1\n")
+ for line in coords:
+ input.write(line)
+ input.write("\n$end")
+ input.write("\n")
+
+ input.write("$rem\n")
+ input.write("JOBTYPE force\n")
+ input.write("MEM_STATIC 10000\n")
+ input.write("METHOD " + args.xc + "\n")
+ input.write("BASIS " + args.basis + "\n")
+ input.write("SYMMETRY FALSE\n")
+ input.write("SYM_IGNORE TRUE\n")
+ input.write("XC_GRID 000099000590\n")
+ input.write("NL_GRID 000050000194\n")
+ input.write("MAX_SCF_CYCLES 100\n")
+ input.write("SCF_CONVERGENCE 9\n")
+ input.write("THRESH 14\n")
+ input.write("INCDFT_DENDIFF_THRESH 14\n")
+ input.write("INCDFT_GRIDDIFF_THRESH 14\n")
+ input.write("BASIS_LIN_DEP_THRESH 12\n")
+ input.write("$end\n")
+
+ import tempfile
+ temp = tempfile.NamedTemporaryFile()
+ filename = temp.name
+
+ import os
+ print(f'creating a temp file named {filename}')
+ os.system('qchem -nt 32 qchem_input.in > ' + filename)
+
+ with open(filename, 'r') as output_file:
+ lines = output_file.readlines()
+ for line in lines:
+ if line[:16] == " SCF time: CPU":
+ info = line[16:].split(' ')[4]
+ scf_time = float(info[:-1])
+ if line[:20] == " Gradient time: CPU":
+ info = line[20:].split(' ')[5]
+ gradient_time = float(info)
+ energy_line = ' Total energy in the final basis set ='
+ if energy_line in line:
+ info = line.replace(energy_line, '')
+ e_tot = float(info)
+ return scf_time, gradient_time, e_tot
+
+fields = ['mol', 't_scf', 't_gradient', 'e_tot']
+output_file = 'qchem-32-cores-cpu.csv'
+output_file = args.output_path + output_file
+csvfile = open(output_file, 'w')
+csvwriter = csv.writer(csvfile)
+csvwriter.writerow(fields)
+
+for filename in os.listdir(args.input_path):
+ if filename.endswith(".xyz"):
+ print(f'running DFT {filename}')
+ try:
+ info = run_dft(args.input_path+filename)
+ row = [filename[:-4]]+list(info)
+ csvwriter.writerow(row)
+ csvfile.flush()
+ except:
+ continue
+csvfile.close()
diff --git a/benchmarks/scf/run_gpu4pyscf.sh b/benchmarks/scf/run_gpu4pyscf.sh
new file mode 100644
index 00000000..5009b40f
--- /dev/null
+++ b/benchmarks/scf/run_gpu4pyscf.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+DIR="./water_clusters/xc"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+for xc in B3LYP M06 wB97m-v
+do
+ python3 dft_driver.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/$xc/ --xc $xc
+done
+
+DIR="./water_clusters/basis"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+for basis in def2-svp def2-tzvpp def2-tzvpd sto-3g 6-31g
+do
+ python3 dft_driver.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/$basis/ --basis $basis
+done
diff --git a/benchmarks/scf/run_qchem.sh b/benchmarks/scf/run_qchem.sh
new file mode 100644
index 00000000..702a86ab
--- /dev/null
+++ b/benchmarks/scf/run_qchem.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+DIR="./water_clusters/xc"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+DIR="./water_clusters/basis"
+[ ! -d "$DIR" ] && mkdir -p "$DIR"
+
+#for xc in LDA PBE B3LYP M06 wB97m-v
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/LDA/ --xc LDA &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/PBE/ --xc PBE &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/B3LYP/ --xc B3LYP &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/M06/ --xc M06 &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/xc/wB97m-v/ --xc wB97m-v &&
+
+#for basis in def2-svp def2-tzvpp def2-tzvpd sto-3g 6-31g 6-31g*
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/def2-svp/ --basis def2-svp &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/def2-tzvpp/ --basis def2-tzvpp &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/def2-tzvpd/ --basis def2-tzvpd &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/sto-3g/ --basis sto-3g &&
+run --cpu 64 --memory 256 --gpu 0 -- python3 qchem.py --input_path ../molecules/water_clusters/ --output_path ./water_clusters/basis/6-31g/ --basis 6-31g
diff --git a/benchmarks/scf/water_clusters/basis/def2-svp/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/basis/def2-svp/A100-SXM-80GB.csv
new file mode 100644
index 00000000..653f42cb
--- /dev/null
+++ b/benchmarks/scf/water_clusters/basis/def2-svp/A100-SXM-80GB.csv
@@ -0,0 +1,10 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,24,4.148226022720337,0.3080751895904541,-1,-76.35507825399924
+003,15,120,3.6573052406311035,0.4902074337005615,-1,-381.8380528962804
+004,30,240,5.5983216762542725,0.9368572235107422,-1,-763.6788774841843
+005,60,480,13.53732705116272,3.472562313079834,-1,-1527.417027558146
+006,96,768,22.537059783935547,9.176054954528809,-1,-2443.9474650967923
+007,141,1128,42.59495186805725,20.909643173217773,-1,-3589.549673810101
+008,228,1824,134.44798135757446,57.621416091918945,-1,-5804.445984225651
+009,300,2400,210.6200053691864,100.0945954322815,-1,-7637.513698651397
+010,417,3336,433.1721432209015,202.22071170806885,-1,-10616.193625522421
diff --git a/benchmarks/scf/water_clusters/basis/def2-tzvpp/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/basis/def2-tzvpp/A100-SXM-80GB.csv
new file mode 100644
index 00000000..5abbfc2f
--- /dev/null
+++ b/benchmarks/scf/water_clusters/basis/def2-tzvpp/A100-SXM-80GB.csv
@@ -0,0 +1,7 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,8.470207452774048,1.4737763404846191,-1,-76.46322544495135
+003,15,295,8.816063165664673,3.085206985473633,-1,-382.357205914378
+004,30,590,20.10008144378662,8.881540536880493,-1,-764.7067284397813
+005,60,1180,80.48115015029907,46.26161599159241,-1,-1529.4310604217367
+006,96,1888,193.53197193145752,140.9103033542633,-1,-2447.1438293049277
+007,141,2773,427.13886523246765,334.8242115974426,-1,-3594.237230008426
diff --git a/benchmarks/scf/water_clusters/xc/B3LYP/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/xc/B3LYP/A100-SXM-80GB.csv
new file mode 100644
index 00000000..e4fdea98
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/B3LYP/A100-SXM-80GB.csv
@@ -0,0 +1,10 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,7.446745872497559,1.4890987873077393,-1,-76.46322544495138
+003,15,295,8.20776653289795,3.088024616241455,-1,-382.357205914378
+004,30,590,19.075977563858032,8.805874824523926,-1,-764.7067284397813
+005,60,1180,78.91655683517456,46.418694734573364,-1,-1529.4310604217358
+006,96,1888,191.31885242462158,139.2458095550537,-1,-2447.1438293049323
+007,141,2773,423.7260158061981,335.1603214740753,-1,-3594.2372300084335
+008,228,4484,1316.6078534126282,957.1870391368866,-1,-5812.014703235804
+009,300,5900,2345.5859880447388,1839.9111471176147,-1,-7647.445922746505
+010,417,8201,4981.907049417496,-1,-1,-10630.000430916734
diff --git a/benchmarks/scf/water_clusters/xc/B3LYP/qchem-32-cores-cpu.csv b/benchmarks/scf/water_clusters/xc/B3LYP/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..a02a55ed
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/B3LYP/qchem-32-cores-cpu.csv
@@ -0,0 +1,9 @@
+mol,t_scf,t_gradient,e_tot
+002,2.0,1.11,-76.463225456
+003,13.0,4.51,-382.3572057405
+004,78.0,18.25,-764.7067300035
+005,564.0,112.33,-1529.4310619108
+006,1482.0,329.04,-2447.1438297879
+007,3758.0,875.37,-3594.237253658
+008,12363.0,3228.61,-5812.0148173975
+009,21922.0,5630.13,-7647.4461469752
diff --git a/benchmarks/scf/water_clusters/xc/LDA/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/xc/LDA/A100-SXM-80GB.csv
new file mode 100644
index 00000000..39dadef4
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/LDA/A100-SXM-80GB.csv
@@ -0,0 +1,10 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,9.225790977478027,1.4185154438018799,-1,-75.90268906696716
+003,15,295,7.397925138473511,2.8502917289733887,-1,-379.5797340893446
+004,30,590,16.355782747268677,8.106590747833252,-1,-759.1648944538588
+005,60,1180,67.11810564994812,42.11477756500244,-1,-1518.4136174508121
+006,96,1888,150.1366548538208,123.72907543182373,-1,-2429.5441191728487
+007,141,2773,343.5950632095337,294.0564568042755,-1,-3568.3923493779457
+008,228,4484,1115.31450009346,830.5021951198578,-1,-5770.235412520906
+009,300,5900,1818.3365054130554,1541.8647923469543,-1,-7592.496654636234
+010,417,8201,3969.0601046085358,3079.625981092453,-1,-10553.62557808817
diff --git a/benchmarks/scf/water_clusters/xc/LDA/qchem-32-cores-cpu.csv b/benchmarks/scf/water_clusters/xc/LDA/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..89982020
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/LDA/qchem-32-cores-cpu.csv
@@ -0,0 +1,10 @@
+mol,t_scf,t_gradient,e_tot
+002,2.0,1.16,-75.9026890798
+003,5.0,1.11,-379.5797340245
+004,26.0,4.57,-759.1648953711
+005,192.0,22.83,-1518.413619284
+006,652.0,73.78,-2429.5441182967
+007,1397.0,272.44,-3568.392370216
+008,4837.0,1597.4,-5770.2355466345
+009,9183.0,3477.07,-7592.4969199839
+010,19493.0,7588.13,-10553.6261407037
diff --git a/benchmarks/scf/water_clusters/xc/M06/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/xc/M06/A100-SXM-80GB.csv
new file mode 100644
index 00000000..111d5cb4
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/M06/A100-SXM-80GB.csv
@@ -0,0 +1,10 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,8.018011093139648,1.4549763202667236,-1,-76.42230995745035
+003,15,295,8.033772468566895,3.0619895458221436,-1,-382.15281612639114
+004,30,590,17.61726713180542,9.003378868103027,-1,-764.3001897093113
+005,60,1180,81.65214920043945,47.97585415840149,-1,-1528.6342026318757
+006,96,1888,203.2343192100525,141.86565041542053,-1,-2445.8771856718595
+007,141,2773,454.99277329444885,342.3325181007385,-1,-3592.384902761716
+008,228,4484,1482.6199061870575,973.8926177024841,-1,-5809.019196158548
+009,300,5900,2313.471456050873,1839.8394575119019,-1,-7643.512481718673
+010,417,8201,5401.685059785843,-1,-1,-10624.527652349374
diff --git a/benchmarks/scf/water_clusters/xc/M06/qchem-32-cores-cpu.csv b/benchmarks/scf/water_clusters/xc/M06/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..e812b2b3
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/M06/qchem-32-cores-cpu.csv
@@ -0,0 +1,9 @@
+mol,t_scf,t_gradient,e_tot
+002,2.0,1.19,-76.4223108992
+003,21.0,4.65,-382.152812227
+004,122.0,20.25,-764.3002346074
+005,689.0,115.14,-1528.6342165681
+006,2151.0,356.58,-2445.8771639475
+007,4765.0,888.11,-3592.3849002142
+008,15544.0,3302.29,-5809.0193494868
+009,26273.0,6603.01,-7643.5126043516
diff --git a/benchmarks/scf/water_clusters/xc/PBE/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/xc/PBE/A100-SXM-80GB.csv
new file mode 100644
index 00000000..565b0c67
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/PBE/A100-SXM-80GB.csv
@@ -0,0 +1,9 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,9.291892051696777,1.4225475788116455,-1,-76.37766746751761
+003,15,295,8.156267642974854,2.935978889465332,-1,-381.9348034197885
+004,30,590,15.962292432785034,8.48238229751587,-1,-763.8652659637253
+005,60,1180,72.18495297431946,43.69742465019226,-1,-1527.7567909450809
+006,96,1888,179.55721712112427,128.3840160369873,-1,-2444.4690727239595
+007,141,2773,417.78475403785706,303.23629927635193,-1,-3590.311141797014
+008,228,4484,1193.5109581947327,849.2616429328918,-1,-5805.667819160899
+009,300,5900,1949.8315885066986,1573.4793248176575,-1,-7639.10075269956
diff --git a/benchmarks/scf/water_clusters/xc/PBE/qchem-32-cores-cpu.csv b/benchmarks/scf/water_clusters/xc/PBE/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..2b84da77
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/PBE/qchem-32-cores-cpu.csv
@@ -0,0 +1,10 @@
+mol,t_scf,t_gradient,e_tot
+002,3.0,1.27,-76.3776674546
+003,2.0,0.56,-76.4223108992
+004,42.0,8.79,-763.865266486
+005,263.0,38.15,-1527.7567927732
+006,788.0,111.71,-2444.4690716504
+007,1714.0,332.76,-3590.3111630938
+008,5461.0,1612.37,-5805.6679517032
+009,10163.0,3177.01,-7639.1010198948
+010,19784.0,7948.14,-10618.4038040287
diff --git a/benchmarks/scf/water_clusters/xc/wB97m-v/A100-SXM-80GB.csv b/benchmarks/scf/water_clusters/xc/wB97m-v/A100-SXM-80GB.csv
new file mode 100644
index 00000000..accd128a
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/wB97m-v/A100-SXM-80GB.csv
@@ -0,0 +1,8 @@
+mol,natm,nao,t_scf,t_gradient,t_hessian,e_tot
+002,3,59,8.755343914031982,2.7149200439453125,-1,-76.42962896737262
+003,15,295,12.602488994598389,5.6929285526275635,-1,-382.1935089484747
+004,30,590,34.28473353385925,17.03866934776306,-1,-764.38419323472
+005,60,1180,137.12103152275085,89.90183711051941,-1,-1528.8072112200903
+006,96,1888,360.53807830810547,272.61835861206055,-1,-2446.1569735127805
+007,141,2773,805.6741592884064,655.3605453968048,-1,-3592.7988171011075
+008,228,4484,2325.739989757538,1879.468992471695,-1,-5809.700870753863
diff --git a/benchmarks/scf/water_clusters/xc/wB97m-v/qchem-32-cores-cpu.csv b/benchmarks/scf/water_clusters/xc/wB97m-v/qchem-32-cores-cpu.csv
new file mode 100644
index 00000000..0497b835
--- /dev/null
+++ b/benchmarks/scf/water_clusters/xc/wB97m-v/qchem-32-cores-cpu.csv
@@ -0,0 +1,8 @@
+mol,t_scf,t_gradient,e_tot
+002,6.0,1.62,-76.4296290258
+003,61.0,8.37,-382.1935086065
+004,280.0,32.13,-764.3841960213
+005,1294.0,159.2,-1528.8072072633
+006,3559.0,417.08,-2446.1569577984
+007,8163.0,1016.0,-3592.7988029841
+008,21767.0,3444.87,-5809.7009024698
diff --git a/examples/00-h2o.py b/examples/00-h2o.py
index 1f509a37..622a8194 100644
--- a/examples/00-h2o.py
+++ b/examples/00-h2o.py
@@ -24,7 +24,7 @@
H 0.7570000000 0.0000000000 -0.4696000000
'''
-xc='B3LYP'
+xc='LDA'
bas='def2-tzvpp'
auxbasis='def2-tzvpp-jkfit'
scf_tol = 1e-10
diff --git a/examples/06-h2o_hf.py b/examples/06-h2o_hf.py
index fdb42fc8..342435dc 100644
--- a/examples/06-h2o_hf.py
+++ b/examples/06-h2o_hf.py
@@ -1,3 +1,18 @@
+# Copyright 2023 The GPU4PySCF Authors. All Rights Reserved.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
from pyscf import gto, scf, grad
import numpy as np
@@ -11,14 +26,29 @@
verbose=4)
mf = scf.hf.RHF(mol)
-mf.direct_scf_tol = 1e-10
-mf.kernel()
+mf.direct_scf_tol = 1e-14
+mf.conv_tol = 1e-12
+e_cpu = mf.kernel()
cpu_gradient = grad.rhf.Gradients(mf)
cpu_gradient.kernel()
+from gpu4pyscf import scf
import gpu4pyscf
+
+mf = scf.hf.RHF(mol)
+mf.direct_scf_tol = 1e-14
+mf.conv_tol = 1e-12
+e_gpu = mf.kernel()
gpu_gradient = gpu4pyscf.grad.rhf.Gradients(mf)
gpu_gradient.kernel()
-assert(np.max(np.abs(cpu_gradient.de - gpu_gradient.de)) < 1e-10)
+cpu_de = cpu_gradient.de
+print(cpu_de)
+print(gpu_gradient.de)
+
+cpu_de -= np.sum(cpu_de, axis=0)/mol.natm
+print('e diff = ', e_cpu - e_gpu)
+print('g diff = \n', cpu_de - gpu_gradient.de)
+
+assert np.max(np.abs(cpu_de - gpu_gradient.de)) < 1e-6
diff --git a/examples/dft_driver.py b/examples/dft_driver.py
index 410fe13e..0a7073cf 100644
--- a/examples/dft_driver.py
+++ b/examples/dft_driver.py
@@ -35,14 +35,14 @@
basis=bas,
max_memory=32000)
# set verbose >= 6 for debugging timer
-mol.verbose = 1
+mol.verbose = 6
print(mol.nao)
mf_df = rks.RKS(mol, xc='HYB_GGA_XC_B3LYP').density_fit(auxbasis=args.auxbasis)
-mf_df.grids.level = 1
+mf_df.grids.atom_grid = (99,590)
mf_df.kernel()
print('compute time for energy: {}s'.format((time.time() - start_time)))
-
+exit()
start_time = time.time()
g = mf_df.nuc_grad_method()
g.auxbasis_response = True
diff --git a/gpu4pyscf/__init__.py b/gpu4pyscf/__init__.py
index ef7eb44d..e0e70192 100644
--- a/gpu4pyscf/__init__.py
+++ b/gpu4pyscf/__init__.py
@@ -1 +1,2 @@
+from . import lib, grad, hessian, solvent, scf, dft
__version__ = '0.6.0'
diff --git a/gpu4pyscf/df/df.py b/gpu4pyscf/df/df.py
index e24f7406..88e8df80 100644
--- a/gpu4pyscf/df/df.py
+++ b/gpu4pyscf/df/df.py
@@ -130,8 +130,8 @@ def get_blksize(self, extra=0, nao=None):
raise RuntimeError("Not enough GPU memory")
return blksize
-
- def loop(self, blksize=None):
+
+ def loop(self, blksize=None, unpack=True):
'''
loop over all cderi and unpack
'''
@@ -160,9 +160,12 @@ def loop(self, blksize=None):
if isinstance(cderi_sparse, np.ndarray) and p1 < p2:
buf_prefetch.set(cderi_sparse[p1:p2,:])
stop_event = data_stream.record()
- buf2 = cupy.zeros([p1-p0,nao,nao])
- buf2[:p1-p0,rows,cols] = buf
- buf2[:p1-p0,cols,rows] = buf
+ if unpack:
+ buf2 = cupy.zeros([p1-p0,nao,nao])
+ buf2[:p1-p0,rows,cols] = buf
+ buf2[:p1-p0,cols,rows] = buf
+ else:
+ buf2 = None
yield buf2, buf.T
compute_stream.wait_event(stop_event)
cupy.cuda.Device().synchronize()
diff --git a/gpu4pyscf/df/df_jk.py b/gpu4pyscf/df/df_jk.py
index e6d40994..e3243b3b 100644
--- a/gpu4pyscf/df/df_jk.py
+++ b/gpu4pyscf/df/df_jk.py
@@ -162,10 +162,10 @@ def get_veff(self, mol=None, dm=None, dm_last=None, vhf_last=0, hermi=1):
'''
if mol is None: mol = self.mol
if dm is None: dm = self.make_rdm1()
-
+
# for DFT
if mf_class == rks.RKS:
- return rks._get_veff(self, dm=dm)
+ return rks.get_veff(self, dm=dm)
if self.direct_scf:
ddm = cupy.asarray(dm) - dm_last
@@ -246,7 +246,9 @@ def get_jk(dfobj, dms_tag, hermi=1, with_j=True, with_k=True, direct_scf_tol=1e-
'''
get jk with density fitting
outputs and input are on the same device
+ TODO: separate into three cases: j only, k only, j and k
'''
+
log = logger.new_logger(dfobj.mol, dfobj.verbose)
out_shape = dms_tag.shape
out_cupy = isinstance(dms_tag, cupy.ndarray)
@@ -276,23 +278,25 @@ def get_jk(dfobj, dms_tag, hermi=1, with_j=True, with_k=True, direct_scf_tol=1e-
dm_sparse = dms[:,rows,cols]
dm_sparse[:, dfobj.intopt.cderi_diag] *= .5
vj = cupy.zeros_like(dms)
+ vj_tmp = cupy.zeros_like(dms)
+
+ if with_k:
+ vk = cupy.zeros_like(dms)
def get_j(cderi_sparse):
rhoj = 2.0*dm_sparse.dot(cderi_sparse)
vj_sparse = cupy.dot(rhoj, cderi_sparse.T)
- vj_tmp = cupy.zeros_like(dms)
vj_tmp[:,rows,cols] = vj_sparse
vj_tmp[:,cols,rows] = vj_sparse
vj_sparse = None
return vj_tmp
-
- vk = cupy.zeros_like(dms)
+
# SCF K matrix with occ
if nset == 1 and hasattr(dms_tag, 'occ_coeff'):
occ_coeff = cupy.asarray(dms_tag.occ_coeff[ao_idx, :], order='C')
nocc = occ_coeff.shape[1]
blksize = dfobj.get_blksize(extra=nao*nocc)
- for cderi, cderi_sparse in dfobj.loop(blksize=blksize):
+ for cderi, cderi_sparse in dfobj.loop(blksize=blksize, unpack=with_k):
# leading dimension is 1
if with_j:
vj += get_j(cderi_sparse)
@@ -300,7 +304,8 @@ def get_j(cderi_sparse):
rhok = contract('Lij,jk->Lki', cderi, occ_coeff)
#vk[0] += contract('Lki,Lkj->ij', rhok, rhok)
contract('Lki,Lkj->ij', rhok, rhok, alpha=1.0, beta=1.0, out=vk[0])
- vk *= 2.0
+ if with_k:
+ vk *= 2.0
# CP-HF K matrix
elif hasattr(dms_tag, 'mo1'):
mo1 = dms_tag.mo1[:,ao_idx,:]
@@ -308,7 +313,7 @@ def get_j(cderi_sparse):
# 2.0 due to rhok and rhok1, put it here for symmetry
occ_coeff = dms_tag.occ_coeff[ao_idx,:] * 2.0
blksize = dfobj.get_blksize(extra=2*nao*nocc)
- for cderi, cderi_sparse in dfobj.loop(blksize=blksize):
+ for cderi, cderi_sparse in dfobj.loop(blksize=blksize, unpack=with_k):
if with_j:
vj += get_j(cderi_sparse)
if with_k:
@@ -318,11 +323,12 @@ def get_j(cderi_sparse):
vk[i] += contract('Lki,Lkj->ij', rhok, rhok1)
#contract('Lki,Lkj->ij', rhok, rhok1, alpha=1.0, beta=1.0, out=vk[i])
occ_coeff = rhok1 = rhok = mo1 = None
- vk = vk + vk.transpose(0,2,1)
+ if with_k:
+ vk = vk + vk.transpose(0,2,1)
# general K matrix with density matrix
else:
blksize = dfobj.get_blksize()
- for cderi, cderi_sparse in dfobj.loop(blksize=blksize):
+ for cderi, cderi_sparse in dfobj.loop(blksize=blksize, unpack=with_k):
if with_j:
vj += get_j(cderi_sparse)
if with_k:
@@ -331,7 +337,7 @@ def get_j(cderi_sparse):
vk[k] += contract('Lki,Lkj->ij', cderi, rhok)
rhok = None
- rev_ao_idx = numpy.argsort(dfobj.intopt.sph_ao_idx)
+ rev_ao_idx = dfobj.intopt.rev_ao_idx
if with_j:
vj = take_last2d(vj, rev_ao_idx)
vj = vj.reshape(out_shape)
@@ -380,3 +386,5 @@ def get_j(dfobj, dm, hermi=1, direct_scf_tol=1e-13):
rhoj *= 2.0
vj = int3c2e.get_j_int3c2e_pass2(intopt, rhoj)
return vj
+
+density_fit = _density_fit
\ No newline at end of file
diff --git a/gpu4pyscf/df/grad/rhf.py b/gpu4pyscf/df/grad/rhf.py
index c0d39b9a..5214a62a 100644
--- a/gpu4pyscf/df/grad/rhf.py
+++ b/gpu4pyscf/df/grad/rhf.py
@@ -33,9 +33,7 @@ def get_jk(mf_grad, mol=None, dm0=None, hermi=0, with_j=True, with_k=True, omega
if mol is None: mol = mf_grad.mol
#TODO: dm has to be the SCF density matrix in this version. dm should be
# extended to any 1-particle density matrix
- # TODO: fix this
- #with_j = True; with_k = True
-
+
if(dm0 is None): dm0 = mf_grad.base.make_rdm1()
mf = mf_grad.base
if omega is None:
diff --git a/gpu4pyscf/df/grad/rks.py b/gpu4pyscf/df/grad/rks.py
index 1ccf6ca6..ba307509 100644
--- a/gpu4pyscf/df/grad/rks.py
+++ b/gpu4pyscf/df/grad/rks.py
@@ -16,8 +16,8 @@
import numpy
import cupy
+import pyscf
from pyscf import lib
-from pyscf.df.grad import rks
from gpu4pyscf.grad import rks as rks_grad
from gpu4pyscf.df.grad.rhf import get_jk, grad_elec
from gpu4pyscf.lib.cupy_helper import contract, tag_array
@@ -39,8 +39,7 @@ def get_veff(ks_grad, mol=None, dm=None):
grids = mf.grids
if grids.coords is None:
- grids.build(sort_grids=False)
- #grids.build(with_non0tab=True)
+ grids.build(with_non0tab=False)
nlcgrids = None
if mf.nlc or ni.libxc.is_nlc(mf.xc):
@@ -49,7 +48,7 @@ def get_veff(ks_grad, mol=None, dm=None):
else:
nlcgrids = mf.nlcgrids
if nlcgrids.coords is None:
- nlcgrids.build(sort_grids=False)
+ nlcgrids.build(with_non0tab=False)
if mf.nlc != '':
raise NotImplementedError
@@ -116,7 +115,7 @@ def get_veff(ks_grad, mol=None, dm=None):
vxc = tag_array(vxc, aux=e1_aux)
return vxc
-class Gradients(rks.Gradients):
+class Gradients(rks_grad.Gradients):
from gpu4pyscf.lib.utils import to_cpu, to_gpu, device
get_jk = get_jk
@@ -130,28 +129,7 @@ def get_j(self, mol=None, dm=None, hermi=0, omega=None):
def get_k(self, mol=None, dm=None, hermi=0, omega=None):
_, vk, _, vkaux = self.get_jk(mol, dm, with_j=False, omega=omega)
return vk, vkaux
-
- def get_dispersion(self):
- if self.base.disp[:2].upper() == 'D3':
- from pyscf import lib
- with lib.with_omp_threads(1):
- import dftd3.pyscf as disp
- d3 = disp.DFTD3Dispersion(self.mol, xc=self.base.xc, version=self.base.disp)
- _, g_d3 = d3.kernel()
- return g_d3
-
- if self.base.disp[:2].upper() == 'D4':
- from pyscf.data.elements import charge
- atoms = numpy.array([ charge(a[0]) for a in self.mol._atom])
- coords = self.mol.atom_coords()
-
- from pyscf import lib
- with lib.with_omp_threads(1):
- from dftd4.interface import DampingParam, DispersionModel
- model = DispersionModel(atoms, coords)
- res = model.get_dispersion(DampingParam(method=self.base.xc), grad=True)
- return res.get("gradient")
-
+
def extra_force(self, atom_id, envs):
if self.auxbasis_response:
return envs['dvhf'].aux[atom_id]
diff --git a/gpu4pyscf/df/int3c2e.py b/gpu4pyscf/df/int3c2e.py
index c3998ad8..9f01ac3b 100644
--- a/gpu4pyscf/df/int3c2e.py
+++ b/gpu4pyscf/df/int3c2e.py
@@ -236,6 +236,7 @@ def build(self, cutoff=1e-14, group_size=None,
nsph = sph_ao_loc[-1]
self.cart2sph = block_c2s_diag(ncart, nsph, self.angular, l_ctr_counts)
inv_idx = np.argsort(self.sph_ao_idx, kind='stable').astype(np.int32)
+ self.rev_ao_idx = inv_idx
self.coeff = self.cart2sph[:, inv_idx]
# pairing auxiliary basis with fake basis set
@@ -1398,7 +1399,8 @@ def _split_l_ctr_groups(uniq_l_ctr, l_ctr_counts, group_size):
for l_ctr, counts in zip(uniq_l_ctr, l_ctr_counts):
l = l_ctr[0]
nf = (l + 1) * (l + 2) // 2
- max_shells = max(group_size // nf, 2)
+ aligned_size = (group_size // nf // 1) * 1
+ max_shells = max(aligned_size, 2)
if l > LMAX_ON_GPU or counts <= max_shells:
_l_ctrs.append(l_ctr)
_l_ctr_counts.append(counts)
diff --git a/gpu4pyscf/df/tests/test_df_ecp.py b/gpu4pyscf/df/tests/test_df_ecp.py
index e13e2ef3..e6614d53 100644
--- a/gpu4pyscf/df/tests/test_df_ecp.py
+++ b/gpu4pyscf/df/tests/test_df_ecp.py
@@ -24,8 +24,8 @@
xc='pbe0'
bas='def2-tzvpp'
auxbasis='def2-tzvpp-jkfit'
-grids_level = 5
-eps=1e-4
+grids_level = 6
+eps=0.001
def setUpModule():
global mol
@@ -45,10 +45,6 @@ def tearDownModule():
mol.stdout.close()
del mol
-def tearDownModule():
- global mol
- del mol
-
def run_dft(xc):
mf = rks.RKS(mol, xc=xc).density_fit(auxbasis=auxbasis)
mf.grids.level = grids_level
@@ -80,17 +76,11 @@ def _check_grad(grid_response=False, tol=1e-5):
mol.build()
e0 = f_scanner(mol)
- mf = rks.RKS(mol, xc=xc).density_fit(auxbasis=auxbasis)
- mf.grids.level = grids_level
-
coords[i,j] -= 2.0 * eps
mol.set_geom_(coords, unit='Bohr')
mol.build()
e1 = f_scanner(mol)
- mf = rks.RKS(mol, xc=xc).density_fit(auxbasis=auxbasis)
- mf.grids.level = grids_level
-
coords[i,j] += eps
mol.set_geom_(coords, unit='Bohr')
grad_fd[i,j] = (e0-e1)/2.0/eps
@@ -122,7 +112,7 @@ def _check_dft_hessian(disp=None, ix=0, iy=0, tol=1e-3):
pmol.set_geom_(coords + v, unit='Bohr')
pmol.build()
_, g0 = g_scanner(pmol)
-
+
pmol.set_geom_(coords - v, unit='Bohr')
pmol.build()
_, g1 = g_scanner(pmol)
@@ -160,7 +150,6 @@ def test_rks_hessian(self):
_check_dft_hessian(ix=0, iy=0)
_check_dft_hessian(ix=0, iy=1)
-
if __name__ == "__main__":
print("Full Tests for DF ECP")
unittest.main()
diff --git a/gpu4pyscf/df/tests/test_df_grad.py b/gpu4pyscf/df/tests/test_df_grad.py
index 4e70018f..ade19e87 100644
--- a/gpu4pyscf/df/tests/test_df_grad.py
+++ b/gpu4pyscf/df/tests/test_df_grad.py
@@ -79,17 +79,11 @@ def _check_grad(grid_response=False, xc=xc0, disp=disp0, tol=1e-6):
mol.build()
e0 = f_scanner(mol)
- mf = rks.RKS(mol, xc=xc, disp=disp).density_fit(auxbasis=auxbasis0)
- mf.grids.level = grids_level
-
coords[i,j] -= 2.0 * eps
mol.set_geom_(coords, unit='Bohr')
mol.build()
e1 = f_scanner(mol)
- mf = rks.RKS(mol, xc=xc, disp=disp).density_fit(auxbasis=auxbasis0)
- mf.grids.level = grids_level
-
coords[i,j] += eps
mol.set_geom_(coords, unit='Bohr')
grad_fd[i,j] = (e0-e1)/2.0/eps
diff --git a/gpu4pyscf/df/tests/test_jk.py b/gpu4pyscf/df/tests/test_jk.py
index 6f057a90..6fb3ed86 100644
--- a/gpu4pyscf/df/tests/test_jk.py
+++ b/gpu4pyscf/df/tests/test_jk.py
@@ -34,14 +34,17 @@
bas='ccpvdz'
-mol = pyscf.M(atom=atom, basis=bas, max_memory=32000)
-mol.build()
-mol.verbose = 1
-auxmol = df.addons.make_auxmol(mol, auxbasis='sto3g')
-
+def setUpModule():
+ global mol, auxmol
+ mol = pyscf.M(atom=atom, basis=bas, max_memory=32000)
+ mol.output = '/dev/null'
+ mol.build()
+ mol.verbose = 1
+ auxmol = df.addons.make_auxmol(mol, auxbasis='sto3g')
+
def tearDownModule():
- global mol
- del mol
+ global mol, auxmol
+ del mol, auxmol
class KnownValues(unittest.TestCase):
diff --git a/gpu4pyscf/dft/__init__.py b/gpu4pyscf/dft/__init__.py
new file mode 100644
index 00000000..f42a3a7f
--- /dev/null
+++ b/gpu4pyscf/dft/__init__.py
@@ -0,0 +1 @@
+from . import rks
\ No newline at end of file
diff --git a/gpu4pyscf/dft/gen_grid.py b/gpu4pyscf/dft/gen_grid.py
index 09358fca..8e70d549 100644
--- a/gpu4pyscf/dft/gen_grid.py
+++ b/gpu4pyscf/dft/gen_grid.py
@@ -42,50 +42,9 @@
libdft = lib.load_library('libdft')
libgdft = load_library('libgdft')
-GROUP_BOX_SIZE = 1.2
-GROUP_BOUNDARY_PENALTY = 4.2
-# Padding grids to make the AO value generated by eval_gto aligned in memory
-ALIGNMENT_UNIT = 8
-NELEC_ERROR_TOL = getattr(__config__, 'dft_rks_prune_error_tol', 0.02)
-
-# ~= (L+1)**2/3
-LEBEDEV_ORDER = {
- 0 : 1 ,
- 3 : 6 ,
- 5 : 14 ,
- 7 : 26 ,
- 9 : 38 ,
- 11 : 50 ,
- 13 : 74 ,
- 15 : 86 ,
- 17 : 110 ,
- 19 : 146 ,
- 21 : 170 ,
- 23 : 194 ,
- 25 : 230 ,
- 27 : 266 ,
- 29 : 302 ,
- 31 : 350 ,
- 35 : 434 ,
- 41 : 590 ,
- 47 : 770 ,
- 53 : 974 ,
- 59 : 1202,
- 65 : 1454,
- 71 : 1730,
- 77 : 2030,
- 83 : 2354,
- 89 : 2702,
- 95 : 3074,
- 101: 3470,
- 107: 3890,
- 113: 4334,
- 119: 4802,
- 125: 5294,
- 131: 5810
-}
-LEBEDEV_NGRID = numpy.array(list(LEBEDEV_ORDER.values()))
+from pyscf.dft.gen_grid import GROUP_BOX_SIZE, GROUP_BOUNDARY_PENALTY, NELEC_ERROR_TOL, LEBEDEV_ORDER, LEBEDEV_NGRID
+ALIGNMENT_UNIT = 32
# SG0
# S. Chien and P. Gill, J. Comput. Chem. 27 (2006) 730-739.
@@ -301,16 +260,9 @@ def gen_atomic_grids(mol, atom_grid={}, radi_method=radi.gauss_chebyshev,
idx = numpy.where(angs==n)[0]
coords.append(cupy.einsum('i,jk->jik', rad[idx], grid[:,:3]).reshape(-1,3))
vol.append(cupy.einsum('i,j->ji', rad_weight[idx], grid[:,3]).ravel())
- '''
- for i0, i1 in lib.prange(0, len(idx), 12): # 12 radi-grids as a group
- coords.append(numpy.einsum('i,jk->jik',rad[idx[i0:i1]],
- grid[:,:3]).reshape(-1,3))
- vol.append(numpy.einsum('i,j->ji', rad_weight[idx[i0:i1]],
- grid[:,3]).ravel())
- '''
- atom_grids_tab[symb] = (cupy.vstack(coords), cupy.hstack(vol))
- #print(atom_grids_tab[symb][0].shape, atom_grids_tab[symb][1].shape)
+ atom_grids_tab[symb] = (cupy.vstack(coords), cupy.hstack(vol))
+
return atom_grids_tab
def get_partition(mol, atom_grids_tab,
@@ -450,16 +402,14 @@ def arg_group_grids(mol, coords, box_size=GROUP_BOX_SIZE):
tot_boxes = numpy.prod(boxes + 2)
logger.debug(mol, 'tot_boxes %d, boxes in each direction %s', tot_boxes, boxes)
# box_size is the length of each edge of the box
- box_size = (boundary[1] - boundary[0]) / boxes
- frac_coords = (coords - boundary[0]) * (1./box_size)
- box_ids = numpy.floor(frac_coords).astype(int)
+ box_size = cupy.asarray((boundary[1] - boundary[0]) / boxes)
+ frac_coords = (coords - cupy.asarray(boundary[0])) * (1./box_size)
+ box_ids = cupy.floor(frac_coords).astype(int)
box_ids[box_ids<-1] = -1
box_ids[box_ids[:,0] > boxes[0], 0] = boxes[0]
box_ids[box_ids[:,1] > boxes[1], 1] = boxes[1]
box_ids[box_ids[:,2] > boxes[2], 2] = boxes[2]
-
- rev_idx, counts = numpy.unique(box_ids, axis=0, return_inverse=True,
- return_counts=True)[1:3]
+ rev_idx = numpy.unique(box_ids.get(), axis=0, return_inverse=True)[1]
return rev_idx.argsort(kind='stable')
def _load_conf(mod, name, default):
@@ -551,7 +501,7 @@ class Grids(lib.StreamObject):
alignment = ALIGNMENT_UNIT
cutoff = CUTOFF
-
+
def __init__(self, mol):
self.mol = mol
self.stdout = mol.stdout
diff --git a/gpu4pyscf/dft/numint.py b/gpu4pyscf/dft/numint.py
index 389f8cd9..f2806a3c 100644
--- a/gpu4pyscf/dft/numint.py
+++ b/gpu4pyscf/dft/numint.py
@@ -160,53 +160,54 @@ def eval_rho2(mol, ao, mo_coeff, mo_occ, non0tab=None, xctype='LDA',
shls_slice = (0, mol.nbas)
ao_loc = mol.ao_loc_nr()
- if True:
- cpos = cupy.einsum('ij,j->ij', mo_coeff[:,mo_occ>0], cupy.sqrt(mo_occ[mo_occ>0]))
- if xctype == 'LDA' or xctype == 'HF':
- c0 = _dot_ao_dm(mol, ao, cpos, non0tab, shls_slice, ao_loc)
- #:rho = numpy.einsum('pi,pi->p', c0, c0)
- rho = _contract_rho(c0, c0)
- elif xctype in ('GGA', 'NLC'):
- rho = cupy.empty((4,ngrids))
- c0 = _dot_ao_dm(mol, ao[0], cpos, non0tab, shls_slice, ao_loc)
- #:rho[0] = numpy.einsum('pi,pi->p', c0, c0)
- rho[0] = _contract_rho(c0, c0)
- for i in range(1, 4):
- c1 = _dot_ao_dm(mol, ao[i], cpos, non0tab, shls_slice, ao_loc)
- #:rho[i] = numpy.einsum('pi,pi->p', c0, c1) * 2 # *2 for +c.c.
- rho[i] = _contract_rho(c0, c1) * 2
- else: # meta-GGA
- if with_lapl:
- # rho[4] = \nabla^2 rho, rho[5] = 1/2 |nabla f|^2
- rho = cupy.empty((6,ngrids))
- tau_idx = 5
- else:
- rho = cupy.empty((5,ngrids))
- tau_idx = 4
- c0 = _dot_ao_dm(mol, ao[0], cpos, non0tab, shls_slice, ao_loc)
- #:rho[0] = numpy.einsum('pi,pi->p', c0, c0)
- rho[0] = _contract_rho(c0, c0)
+
+ #cpos = cupy.einsum('ij,j->ij', mo_coeff[:,mo_occ>0], cupy.sqrt(mo_occ[mo_occ>0]))
+ cpos = mo_coeff[:,mo_occ>0] * cupy.sqrt(mo_occ[mo_occ>0])
+ if xctype == 'LDA' or xctype == 'HF':
+ c0 = _dot_ao_dm(mol, ao, cpos, non0tab, shls_slice, ao_loc)
+ #:rho = numpy.einsum('pi,pi->p', c0, c0)
+ rho = _contract_rho(c0, c0)
+ elif xctype in ('GGA', 'NLC'):
+ rho = cupy.empty((4,ngrids))
+ c0 = _dot_ao_dm(mol, ao[0], cpos, non0tab, shls_slice, ao_loc)
+ #:rho[0] = numpy.einsum('pi,pi->p', c0, c0)
+ rho[0] = _contract_rho(c0, c0)
+ for i in range(1, 4):
+ c1 = _dot_ao_dm(mol, ao[i], cpos, non0tab, shls_slice, ao_loc)
+ #:rho[i] = numpy.einsum('pi,pi->p', c0, c1) * 2 # *2 for +c.c.
+ rho[i] = _contract_rho(c0, c1) * 2
+ else: # meta-GGA
+ if with_lapl:
+ # rho[4] = \nabla^2 rho, rho[5] = 1/2 |nabla f|^2
+ rho = cupy.empty((6,ngrids))
+ tau_idx = 5
+ else:
+ rho = cupy.empty((5,ngrids))
+ tau_idx = 4
+ c0 = _dot_ao_dm(mol, ao[0], cpos, non0tab, shls_slice, ao_loc)
+ #:rho[0] = numpy.einsum('pi,pi->p', c0, c0)
+ rho[0] = _contract_rho(c0, c0)
- rho[tau_idx] = 0
- for i in range(1, 4):
- c1 = _dot_ao_dm(mol, ao[i], cpos, non0tab, shls_slice, ao_loc)
- #:rho[i] = numpy.einsum('pi,pi->p', c0, c1) * 2 # *2 for +c.c.
- #:rho[5] += numpy.einsum('pi,pi->p', c1, c1)
- rho[i] = _contract_rho(c0, c1) * 2
- rho[tau_idx] += _contract_rho(c1, c1)
-
- if with_lapl:
- if ao.shape[0] > 4:
- XX, YY, ZZ = 4, 7, 9
- ao2 = ao[XX] + ao[YY] + ao[ZZ]
- c1 = _dot_ao_dm(mol, ao2, cpos, non0tab, shls_slice, ao_loc)
- #:rho[4] = numpy.einsum('pi,pi->p', c0, c1)
- rho[4] = _contract_rho(c0, c1)
- rho[4] += rho[5]
- rho[4] *= 2
- else:
- rho[4] = 0
- rho[tau_idx] *= .5
+ rho[tau_idx] = 0
+ for i in range(1, 4):
+ c1 = _dot_ao_dm(mol, ao[i], cpos, non0tab, shls_slice, ao_loc)
+ #:rho[i] = numpy.einsum('pi,pi->p', c0, c1) * 2 # *2 for +c.c.
+ #:rho[5] += numpy.einsum('pi,pi->p', c1, c1)
+ rho[i] = _contract_rho(c0, c1) * 2
+ rho[tau_idx] += _contract_rho(c1, c1)
+
+ if with_lapl:
+ if ao.shape[0] > 4:
+ XX, YY, ZZ = 4, 7, 9
+ ao2 = ao[XX] + ao[YY] + ao[ZZ]
+ c1 = _dot_ao_dm(mol, ao2, cpos, non0tab, shls_slice, ao_loc)
+ #:rho[4] = numpy.einsum('pi,pi->p', c0, c1)
+ rho[4] = _contract_rho(c0, c1)
+ rho[4] += rho[5]
+ rho[4] *= 2
+ else:
+ rho[4] = 0
+ rho[tau_idx] *= .5
return rho
def eval_rho3(mol, ao, c0, mo1, non0tab=None, xctype='LDA',
@@ -382,15 +383,9 @@ def nr_rks(ni, mol, grids, xc_code, dms, relativity=0, hermi=1,
dms = [coeff @ dm @ coeff.T for dm in dms.reshape(-1,nao0,nao0)]
nset = len(dms)
ao_loc = mol.ao_loc_nr()
-
- #print(mo_coeff is not None, mo_occ is not None)
- if mo_coeff is not None: mo_coeff = coeff @ mo_coeff
- def _make_rho(ao_value, dm, xctype=None):
- if mo_coeff is not None and mo_occ is not None:
- rho = eval_rho2(mol, ao, mo_coeff, mo_occ, None, xctype)
- else:
- rho = eval_rho(mol, ao_value, dm, xctype=xctype, hermi=1)
- return rho
+
+ if mo_coeff is not None:
+ mo_coeff = coeff @ mo_coeff
nelec = cupy.zeros(nset)
excsum = cupy.zeros(nset)
@@ -409,11 +404,42 @@ def _make_rho(ao_value, dm, xctype=None):
ao_deriv = 0
else:
ao_deriv = 1
- for ao, sindex, weight, coords in ni.block_loop(mol, grids, nao, ao_deriv):
+
+ block_id = 0
+ for ao, sindex, weight, _ in ni.block_loop(mol, grids, nao, ao_deriv, blksize=ni.grid_blksize):
+ if ni.grid_blksize is None:
+ ni.grid_blksize = weight.shape[0]
+
+ # cache ao indices
+ if block_id not in ni.non0ao_idx:
+ t0 = (logger.process_clock(), logger.perf_counter())
+ if xctype == 'LDA':
+ mask = cupy.any(cupy.abs(ao) > AO_THRESHOLD, axis=[1])
+ idx = cupy.argwhere(mask).astype(np.int32)[:,0]
+ ao_mask = ao[idx,:]
+ else:
+ mask = cupy.any(cupy.abs(ao) > AO_THRESHOLD, axis=[0,2])
+ idx = cupy.argwhere(mask).astype(np.int32)[:,0]
+ ao_mask = ao[:,idx,:]
+ ni.non0ao_idx[block_id] = idx
+ t1 = log.timer_debug1('initialize ao sparsity', *t0)
+ else:
+ idx = ni.non0ao_idx[block_id]
+ if xctype == 'LDA':
+ ao_mask = ao[idx,:]
+ else:
+ ao_mask = ao[:,idx,:]
+ block_id += 1
for i in range(nset):
t0 = (logger.process_clock(), logger.perf_counter())
#rho = eval_rho(opt.mol, ao, dms[i], xctype=xctype, hermi=1)
- rho = _make_rho(ao, dms[i], xctype=xctype)
+ #rho = _make_rho(ao, dms[i], xctype=xctype)
+ if mo_coeff is None:
+ rho = eval_rho(mol, ao, dms[i], xctype=xctype, hermi=1)
+ else:
+ mo_coeff_mask = mo_coeff[idx,:]
+ rho = eval_rho2(mol, ao_mask, mo_coeff_mask, mo_occ, None, xctype)
+
t1 = log.timer_debug1('eval rho', *t0)
exc, vxc = ni.eval_xc_eff(xc_code, rho, deriv=1, xctype=xctype)[:2]
vxc = cupy.asarray(vxc, order='C')
@@ -428,11 +454,8 @@ def _make_rho(ao_value, dm, xctype=None):
_dot_ao_ao_sparse(ao, ao, wv, nbins, sindex, ao_loc,
pair2shls_full, pairs_locs_full, vmat[i])
elif USE_SPARSITY == 2:
- mask = cupy.any(cupy.abs(ao) > AO_THRESHOLD, axis=[1])
- idx = cupy.argwhere(mask).astype(np.int32)[:,0]
- ao_mask = ao[idx,:]
aow = _scale_ao(ao_mask, wv)
- #vmat[i][cupy.ix_(mask, mask)] += ao_mask.dot(aow.T)
+ # vmat[i][cupy.ix_(mask, mask)] += ao_mask.dot(aow.T)
add_sparse(vmat[i], ao_mask.dot(aow.T), idx)
else:
raise NotImplementedError('Not implemented yet')
@@ -447,9 +470,6 @@ def _make_rho(ao_value, dm, xctype=None):
_dot_ao_ao_sparse(ao[0], aow, None, nbins, sindex, ao_loc,
pair2shls_full, pairs_locs_full, vmat[i])
elif USE_SPARSITY == 2:
- mask = cupy.any(cupy.abs(ao) > AO_THRESHOLD, axis=[0,2])
- idx = cupy.argwhere(mask).astype(np.int32)[:,0]
- ao_mask = ao[:,idx,:]
aow = _scale_ao(ao_mask, wv)
#vmat[i][cupy.ix_(mask, mask)] += ao_mask[0].dot(aow.T)
add_sparse(vmat[i], ao_mask[0].dot(aow.T), idx)
@@ -471,9 +491,6 @@ def _make_rho(ao_value, dm, xctype=None):
_tau_dot_sparse(ao, ao, wv[4], nbins, sindex, ao_loc,
pair2shls_full, pairs_locs_full, vmat[i])
else:
- mask = cupy.any(cupy.abs(ao) > AO_THRESHOLD, axis=[0,2])
- idx = cupy.argwhere(mask).astype(np.int32)[:,0]
- ao_mask = ao[:,idx,:]
aow = _scale_ao(ao_mask, wv[:4])
vtmp = ao_mask[0].dot(aow.T)
vtmp+= _tau_dot(ao_mask, ao_mask, wv[4])
@@ -1061,7 +1078,9 @@ def _block_loop(ni, mol, grids, nao=None, deriv=0, max_memory=2000,
coords = grids.coords[ip0:ip1]
weight = grids.weights[ip0:ip1]
sindex = None#ni.screen_index[ip0//GRID_BLKSIZE:]
+ t0 = (logger.process_clock(), logger.perf_counter())
ao = eval_ao(ni, mol, coords, deriv)
+ log.timer_debug1('eval ao', *t0)
yield ao, sindex, weight, coords
class NumInt(numint.NumInt):
@@ -1090,6 +1109,11 @@ def build(self, mol, coords):
screen_index = make_screen_index(pmol, coords, blksize=GRID_BLKSIZE)
screen_index = screen_index.reshape(-1, nbas4, BAS_ALIGNED).max(axis=2)
self.screen_index = np.asarray(screen_index, dtype=np.uint8)
+ elif USE_SPARSITY == 2:
+ # blocksize will be fixed, once it is determined,
+ # nonzero ao index will be saved
+ self.grid_blksize = None
+ self.non0ao_idx = {}
return self
get_rho = get_rho
diff --git a/gpu4pyscf/dft/rks.py b/gpu4pyscf/dft/rks.py
index 868c4b2d..8c33ee95 100644
--- a/gpu4pyscf/dft/rks.py
+++ b/gpu4pyscf/dft/rks.py
@@ -20,10 +20,9 @@
import cupy
from pyscf import lib
-from pyscf.scf import hf as pyscf_hf
from pyscf.dft import rks
-from gpu4pyscf.scf import diis
+from gpu4pyscf import scf
from gpu4pyscf.lib import logger
from gpu4pyscf.dft import numint, gen_grid
from gpu4pyscf.scf.hf import RHF
@@ -70,8 +69,7 @@ def initialize_grids(ks, mol=None, dm=None):
if mol is None: mol = ks.mol
if ks.grids.coords is None:
t0 = (logger.process_clock(), logger.perf_counter())
- ks.grids.build(sort_grids=False)
- # do not support sparsity yet
+ ks.grids.build()
#ks.grids.build(with_non0tab=True)
ks.grids.weights = cupy.asarray(ks.grids.weights)
ks.grids.coords = cupy.asarray(ks.grids.coords)
@@ -87,7 +85,7 @@ def initialize_grids(ks, mol=None, dm=None):
if ks.nlcgrids.coords is None:
t0 = (logger.process_clock(), logger.perf_counter())
#ks.nlcgrids.build(with_non0tab=True)
- ks.nlcgrids.build(sort_grids=False)
+ ks.nlcgrids.build()
ks.nlcgrids.weights = cupy.asarray(ks.nlcgrids.weights)
ks.nlcgrids.coords = cupy.asarray(ks.nlcgrids.coords)
if (ks.small_rho_cutoff > 1e-20 and
@@ -202,7 +200,7 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
vxc = tag_array(vxc, ecoul=ecoul, exc=exc, vj=vj, vk=vk)
return vxc
-class RKS(rks.RKS):
+class RKS(scf.hf.RHF, rks.RKS):
from gpu4pyscf.lib.utils import to_cpu, to_gpu, device
def __init__(self, mol, xc='LDA,VWN', disp=None):
@@ -237,7 +235,7 @@ def get_dispersion(self):
return res.get("energy")
def reset(self, mol=None):
- pyscf_hf.SCF.reset(self, mol)
+ super().reset(mol)
self.grids.reset(mol)
self.nlcgrids.reset(mol)
self._numint.gdftopt = None
@@ -260,6 +258,10 @@ def energy_tot(self, dm, h1e, vhf=None):
self.scf_summary['nuc'] = nuc.real
return e_tot
+ def nuc_grad_method(self):
+ from gpu4pyscf.grad import rks as rks_grad
+ return rks_grad.Gradients(self)
+
get_jk = RHF.get_jk
get_veff = get_veff
_eigh = RHF._eigh
diff --git a/gpu4pyscf/grad/__init__.py b/gpu4pyscf/grad/__init__.py
new file mode 100644
index 00000000..fae01045
--- /dev/null
+++ b/gpu4pyscf/grad/__init__.py
@@ -0,0 +1,2 @@
+from .rhf import Gradients as RHF
+from .rks import Gradients as RKS
\ No newline at end of file
diff --git a/gpu4pyscf/grad/rhf.py b/gpu4pyscf/grad/rhf.py
index 79fd4976..59a3aeac 100644
--- a/gpu4pyscf/grad/rhf.py
+++ b/gpu4pyscf/grad/rhf.py
@@ -31,6 +31,7 @@
BINSIZE = 128
libgvhf = load_library('libgvhf')
+'''
def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None,
verbose=None):
@@ -247,9 +248,9 @@ def _get_jk(gradient_object, mol=None, dm=None, hermi=1, with_j=True, with_k=Tru
vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega, verbose=log)
log.timer('vj and vk gradient on gpu', *cput0)
return vj, vk
+'''
-
-def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None,
+def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None,
verbose=None, atmlst=None):
if atmlst is None:
atmlst = range(mol.natm)
@@ -279,6 +280,7 @@ def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None
vj = vk = None
vj_ptr = vk_ptr = lib.c_null_ptr()
+ vj_per_atom = vk_per_atom = None
if with_j:
vj = cupy.zeros([vhfopt.mol.nbas, 3])
vj_per_atom = cupy.zeros([len(atmlst), 3])
@@ -326,7 +328,7 @@ def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None
dm_shl = cupy.asarray(np.log(dm_shl))
nshls = dm_shl.shape[0]
t0 = time.perf_counter()
-
+
if hermi != 1:
dm_ctr_cond = (dm_ctr_cond + dm_ctr_cond.T) * .5
fn = libgvhf.GINTget_veff_ip1
@@ -345,7 +347,7 @@ def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None
ll = vhfopt.uniq_l_ctr[cpl,0]
if lk > LMAX_ON_GPU or ll > LMAX_ON_GPU or log_q_kl.size == 0:
continue
-
+
# TODO: determine cutoff based on the relevant maximum value of dm blocks?
sub_dm_cond = max(dm_ctr_cond[cpi,cpj], dm_ctr_cond[cpk,cpl],
dm_ctr_cond[cpi,cpk], dm_ctr_cond[cpj,cpk],
@@ -386,7 +388,8 @@ def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None
ctypes.cast(dm_shl.data.ptr, ctypes.c_void_p),
ctypes.c_int(nshls),
ctypes.cast(log_q_ij.data.ptr, ctypes.c_void_p),
- ctypes.cast(log_q_kl.data.ptr, ctypes.c_void_p))
+ ctypes.cast(log_q_kl.data.ptr, ctypes.c_void_p)
+ )
if err != 0:
detail = f'CUDA Error for ({l_symb[li]}{l_symb[lj]}|{l_symb[lk]}{l_symb[ll]})'
raise RuntimeError(detail)
@@ -413,16 +416,20 @@ def get_veff(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None
coeff = dms = None
cupy.get_default_memory_pool().free_all_blocks()
+ #if vj is not None: vj_per_atom = vj_per_atom.T
+ #if vk is not None: vk_per_atom = vk_per_atom.T
if out_cupy:
return vj_per_atom, vk_per_atom
else:
return vj_per_atom.get() if vj is not None else None, \
vk_per_atom.get() if vk is not None else None
-def _get_veff(gradient_object, mol, dm):
+def _get_jk(gradient_object, mol=None, dm=None, hermi=1, with_j=True, with_k=True,
+ omega=None):
mf = gradient_object.base
cput0 = (logger.process_clock(), logger.perf_counter())
log = logger.new_logger(gradient_object)
+ log.debug3('apply get_grad_jk on gpu')
if hasattr(mf, '_opt_gpu'):
vhfopt = mf._opt_gpu
else:
@@ -432,10 +439,12 @@ def _get_veff(gradient_object, mol, dm):
getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm'))
vhfopt.build(mf.direct_scf_tol)
mf._opt_gpu = vhfopt
-
- vj, vk = get_veff(mol, dm, vhfopt=vhfopt)
+ vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega, verbose=log)
log.timer('vj and vk gradient on gpu', *cput0)
+ return vj, vk
+def get_veff(mf_grad, mol, dm):
+ vj, vk = mf_grad.get_jk(mol, dm)
return vj - vk * .5
def get_dh1e_ecp(mol, dm):
@@ -489,7 +498,6 @@ def grad_elec(mf_grad, mo_energy=None, mo_coeff=None, mo_occ=None, atmlst=None):
mo_energy = cupy.asarray(mo_energy)
mo_occ = cupy.asarray(mo_occ)
mo_coeff = cupy.asarray(mo_coeff)
-
dm0 = mf.make_rdm1(mo_coeff, mo_occ)
dme0 = mf_grad.make_rdm1e(mo_energy, mo_coeff, mo_occ)
@@ -553,3 +561,17 @@ class Gradients(rhf.Gradients):
grad_nuc = grad_nuc
get_veff = get_veff
get_jk = _get_jk
+
+ def get_j(self, mol=None, dm=None, hermi=0, omega=None):
+ vj, _ = self.get_jk(mol, dm, with_k=False, omega=omega)
+ return vj
+
+ def get_k(self, mol=None, dm=None, hermi=0, omega=None):
+ _, vk = self.get_jk(mol, dm, with_j=False, omega=omega)
+ return vk
+
+ def extra_force(self, atom_id, envs):
+ '''
+ grid response is implemented get_veff
+ '''
+ return 0
\ No newline at end of file
diff --git a/gpu4pyscf/grad/rks.py b/gpu4pyscf/grad/rks.py
index 041a4f5d..8695927c 100644
--- a/gpu4pyscf/grad/rks.py
+++ b/gpu4pyscf/grad/rks.py
@@ -19,24 +19,101 @@
'''Non-relativistic RKS analytical nuclear gradients'''
import numpy
import cupy
+import pyscf
from pyscf import lib, gto
from pyscf.lib import logger
-from pyscf.dft import radi, gen_grid
-from gpu4pyscf.dft import numint, xc_deriv
+from pyscf.dft import radi
+from gpu4pyscf.lib.utils import patch_cpu_kernel
+from gpu4pyscf.grad import rhf as rhf_grad
+from gpu4pyscf.dft import numint, xc_deriv, rks
from gpu4pyscf.dft.numint import _GDFTOpt, AO_THRESHOLD
-from gpu4pyscf.lib.cupy_helper import contract, get_avail_mem, add_sparse
+from gpu4pyscf.lib.cupy_helper import contract, get_avail_mem, add_sparse, tag_array
from pyscf import __config__
MIN_BLK_SIZE = getattr(__config__, 'min_grid_blksize', 128*128)
ALIGNED = getattr(__config__, 'grid_aligned', 16*16)
+def _get_veff(ks_grad, mol=None, dm=None):
+ '''
+ First order derivative of DFT effective potential matrix (wrt electron coordinates)
+
+ Args:
+ ks_grad : grad.uhf.Gradients or grad.uks.Gradients object
+ '''
+ if mol is None: mol = ks_grad.mol
+ if dm is None: dm = ks_grad.base.make_rdm1()
+ t0 = (logger.process_clock(), logger.perf_counter())
+
+ mf = ks_grad.base
+ ni = mf._numint
+ if ks_grad.grids is not None:
+ grids = ks_grad.grids
+ else:
+ grids = mf.grids
+
+ if grids.coords is None:
+ grids.build(sort_grids=True)
+
+ nlcgrids = None
+ if mf.nlc or ni.libxc.is_nlc(mf.xc):
+ if ks_grad.nlcgrids is not None:
+ nlcgrids = ks_grad.nlcgrids
+ else:
+ nlcgrids = mf.nlcgrids
+ if nlcgrids.coords is None:
+ nlcgrids.build(sort_grids=True)
+
+ mem_now = lib.current_memory()[0]
+ max_memory = max(2000, ks_grad.max_memory*.9-mem_now)
+ if ks_grad.grid_response:
+ exc, vxc = get_vxc_full_response(ni, mol, grids, mf.xc, dm,
+ max_memory=max_memory,
+ verbose=ks_grad.verbose)
+ if mf.nlc or ni.libxc.is_nlc(mf.xc):
+ raise NotImplementedError
+ else:
+ exc, vxc = get_vxc(ni, mol, grids, mf.xc, dm,
+ max_memory=max_memory, verbose=ks_grad.verbose)
+ if mf.nlc or ni.libxc.is_nlc(mf.xc):
+ if ni.libxc.is_nlc(mf.xc):
+ xc = mf.xc
+ else:
+ xc = mf.nlc
+ enlc, vnlc = get_nlc_vxc(
+ ni, mol, nlcgrids, xc, dm,
+ max_memory=max_memory, verbose=ks_grad.verbose)
+ vxc += vnlc
+ t0 = logger.timer(ks_grad, 'vxc', *t0)
+
+ # this can be moved into vxc calculations
+ occ_coeff = cupy.asarray(mf.mo_coeff[:, mf.mo_occ>0.5], order='C')
+ tmp = contract('nij,jk->nik', vxc, occ_coeff)
+ vxc = 2.0*contract('nik,ik->ni', tmp, occ_coeff)
+
+ aoslices = mol.aoslice_by_atom()
+ vxc = [vxc[:,p0:p1].sum(axis=1) for p0, p1 in aoslices[:,2:]]
+ vxc = cupy.asarray(vxc)
+ omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, spin=mol.spin)
+ if abs(hyb) < 1e-10 and abs(alpha) < 1e-10:
+ vj = ks_grad.get_j(mol, dm)
+ vxc += vj
+ else:
+ vj, vk = ks_grad.get_jk(mol, dm)
+ vk *= hyb
+ if abs(omega) > 1e-10: # For range separated Coulomb operator
+ vk_lr = ks_grad.get_k(mol, dm, omega=omega)
+ vk += vk_lr * (alpha - hyb)
+ vxc += vj - vk * .5
+ return vxc
+
def get_vxc(ni, mol, grids, xc_code, dms, relativity=0, hermi=1,
max_memory=2000, verbose=None):
log = logger.new_logger(mol, verbose)
xctype = ni._xc_type(xc_code)
opt = getattr(ni, 'gdftopt', None)
if opt is None:
- opt = ni.gdftopt = _GDFTOpt(mol)
+ ni.build(mol, grids.coords)
+ opt = ni.gdftopt
mo_occ = cupy.asarray(dms.mo_occ)
mo_coeff = cupy.asarray(dms.mo_coeff)
@@ -139,7 +216,8 @@ def get_nlc_vxc(ni, mol, grids, xc_code, dms, relativity=0, hermi=1,
xctype = ni._xc_type(xc_code)
opt = getattr(ni, 'gdftopt', None)
if opt is None:
- opt = ni.gdftopt = _GDFTOpt(mol)
+ ni.build(mol, grids.coords)
+ opt = ni.gdftopt
mo_occ = cupy.asarray(dms.mo_occ)
mo_coeff = cupy.asarray(dms.mo_coeff)
@@ -240,7 +318,8 @@ def get_vxc_full_response(ni, mol, grids, xc_code, dms, relativity=0, hermi=1,
xctype = ni._xc_type(xc_code)
opt = getattr(ni, 'gdftopt', None)
if opt is None:
- opt = ni.gdftopt = _GDFTOpt(mol)
+ ni.build(mol, grids.coords)
+ opt = ni.gdftopt
coeff = cupy.asarray(opt.coeff)
nao, nao0 = coeff.shape
dms = cupy.asarray(dms)
@@ -420,3 +499,28 @@ def get_du(ia, ib): # JCP 98, 5612 (1993); (B10)
w1 *= vol
w0 = vol * pbecke[ia] * z
yield coords, w0, w1
+
+class Gradients(rhf_grad.Gradients, pyscf.grad.rks.Gradients):
+ device = 'gpu'
+ get_veff = patch_cpu_kernel(pyscf.grad.rks.Gradients.get_veff)(_get_veff)
+
+ def get_dispersion(self):
+ if self.base.disp[:2].upper() == 'D3':
+ from pyscf import lib
+ with lib.with_omp_threads(1):
+ import dftd3.pyscf as disp
+ d3 = disp.DFTD3Dispersion(self.mol, xc=self.base.xc, version=self.base.disp)
+ _, g_d3 = d3.kernel()
+ return g_d3
+
+ if self.base.disp[:2].upper() == 'D4':
+ from pyscf.data.elements import charge
+ atoms = numpy.array([ charge(a[0]) for a in self.mol._atom])
+ coords = self.mol.atom_coords()
+
+ from pyscf import lib
+ with lib.with_omp_threads(1):
+ from dftd4.interface import DampingParam, DispersionModel
+ model = DispersionModel(atoms, coords)
+ res = model.get_dispersion(DampingParam(method=self.base.xc), grad=True)
+ return res.get("gradient")
\ No newline at end of file
diff --git a/gpu4pyscf/grad/tests/test_rhf_grad.py b/gpu4pyscf/grad/tests/test_rhf_grad.py
new file mode 100644
index 00000000..14c74d3b
--- /dev/null
+++ b/gpu4pyscf/grad/tests/test_rhf_grad.py
@@ -0,0 +1,62 @@
+# Copyright 2023 The GPU4PySCF Authors. All Rights Reserved.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+import pyscf
+import numpy as np
+import unittest
+import gpu4pyscf
+from pyscf import scf
+
+atom = '''
+O 0.0000000000 -0.0000000000 0.1174000000
+H -0.7570000000 -0.0000000000 -0.4696000000
+H 0.7570000000 0.0000000000 -0.4696000000
+'''
+
+bas0='cc-pvtz'
+
+def setUpModule():
+ global mol
+ mol = pyscf.M(atom=atom, basis=bas0, max_memory=32000)
+ mol.output = '/dev/null'
+ mol.build()
+ mol.verbose = 1
+
+def tearDownModule():
+ global mol
+ mol.stdout.close()
+ del mol
+
+def _check_grad(tol=1e-6):
+ mf = scf.hf.RHF(mol)
+ mf.direct_scf_tol = 1e-10
+ mf.kernel()
+
+ cpu_gradient = pyscf.grad.RHF(mf)
+ g_cpu = cpu_gradient.kernel()
+
+ # TODO: use to_gpu function
+ mf.__class__ = gpu4pyscf.scf.hf.RHF
+ gpu_gradient = gpu4pyscf.grad.RHF(mf)
+ g_gpu = gpu_gradient.kernel()
+ assert(np.linalg.norm(g_cpu - g_gpu) < tol)
+
+class KnownValues(unittest.TestCase):
+ def test_grad_rhf(self):
+ _check_grad(tol=1e-6)
+
+if __name__ == "__main__":
+ print("Full Tests for Gradient")
+ unittest.main()
diff --git a/gpu4pyscf/grad/tests/test_grad.py b/gpu4pyscf/grad/tests/test_rks_grad.py
similarity index 54%
rename from gpu4pyscf/grad/tests/test_grad.py
rename to gpu4pyscf/grad/tests/test_rks_grad.py
index 298613dc..04d7c7c8 100644
--- a/gpu4pyscf/grad/tests/test_grad.py
+++ b/gpu4pyscf/grad/tests/test_rks_grad.py
@@ -15,12 +15,10 @@
import pyscf
import cupy
-import numpy as np
import unittest
-from pyscf import lib
-from gpu4pyscf.dft import rks
-
-lib.num_threads(8)
+from pyscf.dft import rks
+import gpu4pyscf
+from gpu4pyscf.dft import numint
atom = '''
O 0.0000000000 -0.0000000000 0.1174000000
@@ -28,92 +26,73 @@
H 0.7570000000 0.0000000000 -0.4696000000
'''
-xc0='B3LYP'
bas0='def2-tzvpp'
-disp0='d3bj'
-grids_level = 6
+grids_level = 5
+nlcgrids_level = 3
def setUpModule():
global mol
mol = pyscf.M(atom=atom, basis=bas0, max_memory=32000)
mol.output = '/dev/null'
mol.build()
mol.verbose = 1
-
-eps = 1.0/1024
def tearDownModule():
global mol
mol.stdout.close()
del mol
-def _check_grad(grid_response=False, xc=xc0, disp=disp0, tol=1e-6):
- mf = rks.RKS(mol, xc=xc, disp=disp)
- mf.device = 'gpu'
+def _check_grad(grid_response=False, xc='B3LYP', disp='d3bj', tol=1e-6):
+ mf = rks.RKS(mol, xc=xc)
+ mf.direct_scf_tol = 1e-14
mf.grids.level = grids_level
- mf.conv_tol = 1e-12
- e_tot = mf.kernel()
- g = mf.nuc_grad_method()
- g.grid_response = grid_response
-
- g_scanner = g.as_scanner()
- g_analy = g_scanner(mol)[1]
- print('analytical gradient:')
- print(g_analy)
-
- f_scanner = mf.as_scanner()
- coords = mol.atom_coords()
- grad_fd = np.zeros_like(coords)
- for i in range(len(coords)):
- for j in range(3):
- coords = mol.atom_coords()
- coords[i,j] += eps
- mol.set_geom_(coords, unit='Bohr')
- mol.build()
- e0 = f_scanner(mol)
-
- mf = rks.RKS(mol, xc=xc, disp=disp)
- mf.device = 'gpu'
- mf.grids.level = grids_level
+ mf.grids.prune = None
+ mf.grids.small_rho_cutoff = 1e-30
+ if mf._numint.libxc.is_nlc(mf.xc):
+ mf.nlcgrids.level = nlcgrids_level
+ mf.kernel()
- coords[i,j] -= 2.0 * eps
- mol.set_geom_(coords, unit='Bohr')
- mol.build()
- e1 = f_scanner(mol)
-
- mf = rks.RKS(mol, xc=xc, disp=disp)
- mf.device = 'gpu'
- mf.grids.level = grids_level
+ cpu_gradient = pyscf.grad.RKS(mf)
+ cpu_gradient.grid_response = grid_response
+ g_cpu = cpu_gradient.kernel()
+
- coords[i,j] += eps
- mol.set_geom_(coords, unit='Bohr')
- grad_fd[i,j] = (e0-e1)/2.0/eps
- grad_fd = np.array(grad_fd).reshape(-1,3)
- print('finite difference gradient:')
- print(grad_fd)
- print('difference between analytical and finite difference gradient:', cupy.linalg.norm(g_analy - grad_fd))
- assert(cupy.linalg.norm(g_analy - grad_fd) < tol)
+ # TODO: use to_gpu functionality
+ mf.__class__ = gpu4pyscf.dft.rks.RKS
+ mf._numint = numint.NumInt(xc=xc)
+ mf.grids = gpu4pyscf.dft.gen_grid.Grids(mol)
+ mf.grids.level = grids_level
+ mf.grids.prune = None
+ mf.grids.small_rho_cutoff = 1e-30
+ if mf._numint.libxc.is_nlc(mf.xc):
+ mf.nlcgrids = gpu4pyscf.dft.gen_grid.Grids(mol)
+ mf.nlcgrids.level = nlcgrids_level
+
+ gpu_gradient = gpu4pyscf.grad.RKS(mf)
+ gpu_gradient.grid_response = grid_response
+ g_gpu = gpu_gradient.kernel()
+ assert(cupy.linalg.norm(g_cpu - g_gpu) < tol)
class KnownValues(unittest.TestCase):
def test_grad_with_grids_response(self):
print("-----testing DFT gradient with grids response----")
- _check_grad(grid_response=True)
+ _check_grad(grid_response=True, tol=1e-5)
def test_grad_without_grids_response(self):
print('-----testing DFT gradient without grids response----')
- _check_grad(grid_response=False)
+ _check_grad(grid_response=False, tol=1e-5)
def test_grad_lda(self):
print("-----LDA testing-------")
- _check_grad(xc='LDA', disp=None, tol=1e-6)
+ _check_grad(xc='LDA', disp=None, tol=1e-5)
def test_grad_gga(self):
print('-----GGA testing-------')
- _check_grad(xc='PBE', disp=None, tol=1e-6)
+ _check_grad(xc='PBE', disp=None, tol=1e-5)
def test_grad_hybrid(self):
print('------hybrid GGA testing--------')
- _check_grad(xc='B3LYP', disp=None, tol=1e-6)
+ _check_grad(xc='B3LYP', disp=None, tol=1e-5)
def test_grad_mgga(self):
print('-------mGGA testing-------------')
@@ -125,7 +104,7 @@ def test_grad_rsh(self):
def test_grad_nlc(self):
print('--------nlc testing-------------')
- _check_grad(xc='HYB_MGGA_XC_WB97M_V', disp=None, tol=1e-6)
+ _check_grad(xc='HYB_MGGA_XC_WB97M_V', disp=None, tol=1e-5)
if __name__ == "__main__":
print("Full Tests for Gradient")
diff --git a/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1.cu b/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1.cu
index f0dad5e0..eb6ff512 100644
--- a/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1.cu
+++ b/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1.cu
@@ -42,7 +42,7 @@ static void GINTint2e_get_veff_ip1_kernel(GINTEnvVars envs,
int i, j, k, l, f;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -128,10 +128,12 @@ static void GINTint2e_get_veff_ip1_kernel(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
-
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
@@ -201,10 +203,12 @@ static void GINTint2e_get_veff_ip1_kernel(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
-
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
@@ -282,9 +286,12 @@ static void GINTint2e_get_veff_ip1_kernel(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
@@ -364,7 +371,7 @@ GINTint2e_get_veff_ip1_kernel_0000(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -427,11 +434,13 @@ GINTint2e_get_veff_ip1_kernel_0000(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
-
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
double root0, weight0;
-
+
if (x < 3.e-7) {
root0 = 0.5;
weight0 = 1.;
@@ -444,7 +453,7 @@ GINTint2e_get_veff_ip1_kernel_0000(GINTEnvVars envs,
double fmt1 = b * (fmt0 - e);
root0 = fmt1 / (fmt0 - fmt1);
}
-
+ root0 /= root0 + 1 - root0 * theta;
double u2 = a0 * root0;
double tmp2 = akl * u2 / (u2 * aijkl + a1);
double c00x = xij - xi - tmp2 * xijxkl;
diff --git a/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1_root2.cu b/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1_root2.cu
index fd1c70dc..4ca7c9b0 100644
--- a/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1_root2.cu
+++ b/gpu4pyscf/lib/gvhf/g2e_get_veff_ip1_root2.cu
@@ -32,6 +32,7 @@ static void GINTint2e_get_veff_ip1_kernel0010(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -113,10 +114,14 @@ static void GINTint2e_get_veff_ip1_kernel0010(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -312,6 +317,7 @@ static void GINTint2e_get_veff_ip1_kernel0011(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -431,10 +437,14 @@ static void GINTint2e_get_veff_ip1_kernel0011(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -847,6 +857,7 @@ static void GINTint2e_get_veff_ip1_kernel0020(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -946,10 +957,14 @@ static void GINTint2e_get_veff_ip1_kernel0020(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -1253,6 +1268,7 @@ static void GINTint2e_get_veff_ip1_kernel1000(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1332,10 +1348,14 @@ static void GINTint2e_get_veff_ip1_kernel1000(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -1525,6 +1545,7 @@ static void GINTint2e_get_veff_ip1_kernel1010(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1642,10 +1663,14 @@ static void GINTint2e_get_veff_ip1_kernel1010(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -2043,6 +2068,7 @@ static void GINTint2e_get_veff_ip1_kernel1100(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -2158,10 +2184,14 @@ static void GINTint2e_get_veff_ip1_kernel1100(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -2553,6 +2583,7 @@ static void GINTint2e_get_veff_ip1_kernel2000(GINTEnvVars envs,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -2650,10 +2681,14 @@ static void GINTint2e_get_veff_ip1_kernel2000(GINTEnvVars envs,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double gz0 = rw[irys+2] * fac;
double root0 = rw[irys];
diff --git a/gpu4pyscf/lib/gvhf/g2e_ip1.cu b/gpu4pyscf/lib/gvhf/g2e_ip1.cu
index 5d64a8d8..c22c7ec4 100644
--- a/gpu4pyscf/lib/gvhf/g2e_ip1.cu
+++ b/gpu4pyscf/lib/gvhf/g2e_ip1.cu
@@ -807,7 +807,7 @@ static void GINTint2e_ip1_jk_kernel(GINTEnvVars envs, JKMatrix jk, BasisProdOffs
double v_jk_x, v_jk_y, v_jk_z, v_jl_x, v_jl_y, v_jl_z;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -903,9 +903,11 @@ static void GINTint2e_ip1_jk_kernel(GINTEnvVars envs, JKMatrix jk, BasisProdOffs
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
-
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
buf_ij = gout;
@@ -986,9 +988,11 @@ static void GINTint2e_ip1_jk_kernel(GINTEnvVars envs, JKMatrix jk, BasisProdOffs
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
-
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
dm = jk.dm;
@@ -1150,9 +1154,11 @@ static void GINTint2e_ip1_jk_kernel(GINTEnvVars envs, JKMatrix jk, BasisProdOffs
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root(x, uw);
-
+ GINTscale_u(uw, theta);
GINTg0_2e_2d4d_ip1(envs, g, uw, norm,
as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
dm = jk.dm;
@@ -1279,7 +1285,7 @@ GINTint2e_ip1_jk_kernel_0000(GINTEnvVars envs, JKMatrix jk, BasisProdOffsets off
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -1346,8 +1352,12 @@ GINTint2e_ip1_jk_kernel_0000(GINTEnvVars envs, JKMatrix jk, BasisProdOffsets off
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
double root0, weight0;
@@ -1363,7 +1373,7 @@ GINTint2e_ip1_jk_kernel_0000(GINTEnvVars envs, JKMatrix jk, BasisProdOffsets off
double fmt1 = b * (fmt0 - e);
root0 = fmt1 / (fmt0 - fmt1);
}
-
+ root0 /= root0 + 1 - root0 * theta;
double u2 = a0 * root0;
double tmp2 = akl * u2 / (u2 * aijkl + a1);
double c00x = xij - xi - tmp2 * xijxkl;
@@ -1461,7 +1471,7 @@ void GINTint2e_ip1_jk_kernel<4, NABLAGOUTSIZE4>(GINTEnvVars envs, JKMatrix jk,
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -1519,8 +1529,12 @@ void GINTint2e_ip1_jk_kernel<4, NABLAGOUTSIZE4>(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
+
GINTrys_root<4>(x, uw);
+ GINTscale_u<4>(uw, theta);
GINTg0_2e_2d4d_ip1<4>(envs, g, uw, norm, as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
GINTgout2e_ip1<4>(envs, gout, g, ai, aj);
}
@@ -1549,7 +1563,7 @@ void GINTint2e_ip1_jk_kernel<5, NABLAGOUTSIZE5>(GINTEnvVars envs, JKMatrix jk,
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
-
+ double omega = envs.omega;
int nprim_ij = envs.nprim_ij;
int nprim_kl = envs.nprim_kl;
int prim_ij = offsets.primitive_ij + task_ij * nprim_ij;
@@ -1607,8 +1621,11 @@ void GINTint2e_ip1_jk_kernel<5, NABLAGOUTSIZE5>(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
GINTrys_root<5>(x, uw);
+ GINTscale_u<5>(uw, theta);
GINTg0_2e_2d4d_ip1<5>(envs, g, uw, norm, as_ish, as_jsh, as_ksh, as_lsh, ij, kl);
GINTgout2e_ip1<5>(envs, gout, g, ai, aj);
}
diff --git a/gpu4pyscf/lib/gvhf/g2e_ip1_root2.cu b/gpu4pyscf/lib/gvhf/g2e_ip1_root2.cu
index 7f3b9a97..3cf95b9a 100644
--- a/gpu4pyscf/lib/gvhf/g2e_ip1_root2.cu
+++ b/gpu4pyscf/lib/gvhf/g2e_ip1_root2.cu
@@ -31,6 +31,7 @@ static void GINTint2e_ip1_jk_kernel_0010(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -111,10 +112,14 @@ static void GINTint2e_ip1_jk_kernel_0010(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
-
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -247,6 +252,7 @@ static void GINTint2e_ip1_jk_kernel_0011(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -365,10 +371,14 @@ static void GINTint2e_ip1_jk_kernel_0011(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -581,6 +591,7 @@ static void GINTint2e_ip1_jk_kernel_0020(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -679,10 +690,14 @@ static void GINTint2e_ip1_jk_kernel_0020(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -872,6 +887,7 @@ static void GINTint2e_ip1_jk_kernel_1000(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -950,10 +966,14 @@ static void GINTint2e_ip1_jk_kernel_1000(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -1093,6 +1113,7 @@ static void GINTint2e_ip1_jk_kernel_1010(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1209,10 +1230,14 @@ static void GINTint2e_ip1_jk_kernel_1010(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -1440,6 +1465,7 @@ static void GINTint2e_ip1_jk_kernel_1100(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1554,10 +1580,14 @@ static void GINTint2e_ip1_jk_kernel_1100(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
@@ -1798,6 +1828,7 @@ static void GINTint2e_ip1_jk_kernel_2000(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1894,10 +1925,14 @@ static void GINTint2e_ip1_jk_kernel_2000(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<2>(x, rw);
+ GINTscale_u<2>(rw, theta);
for (irys = 0; irys < 2; ++irys) {
double weight0 = rw[irys+2] * fac;
double root0 = rw[irys];
diff --git a/gpu4pyscf/lib/gvhf/g2e_ip1_root3.cu b/gpu4pyscf/lib/gvhf/g2e_ip1_root3.cu
index 175ad323..49152851 100644
--- a/gpu4pyscf/lib/gvhf/g2e_ip1_root3.cu
+++ b/gpu4pyscf/lib/gvhf/g2e_ip1_root3.cu
@@ -31,6 +31,7 @@ static void GINTint2e_ip1_jk_kernel_0021(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -204,10 +205,14 @@ static void GINTint2e_ip1_jk_kernel_0021(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -542,6 +547,7 @@ static void GINTint2e_ip1_jk_kernel_0022(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -823,10 +829,14 @@ static void GINTint2e_ip1_jk_kernel_0022(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -1364,6 +1374,7 @@ static void GINTint2e_ip1_jk_kernel_0030(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -1487,10 +1498,14 @@ static void GINTint2e_ip1_jk_kernel_0030(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -1757,6 +1772,7 @@ static void GINTint2e_ip1_jk_kernel_0031(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -2002,10 +2018,14 @@ static void GINTint2e_ip1_jk_kernel_0031(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -2501,6 +2521,7 @@ static void GINTint2e_ip1_jk_kernel_1011(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -2728,10 +2749,14 @@ static void GINTint2e_ip1_jk_kernel_1011(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -3153,6 +3178,7 @@ static void GINTint2e_ip1_jk_kernel_1020(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -3324,10 +3350,14 @@ static void GINTint2e_ip1_jk_kernel_1020(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -3683,6 +3713,7 @@ static void GINTint2e_ip1_jk_kernel_1021(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -4072,10 +4103,14 @@ static void GINTint2e_ip1_jk_kernel_1021(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -4777,6 +4812,7 @@ static void GINTint2e_ip1_jk_kernel_1030(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -5020,10 +5056,14 @@ static void GINTint2e_ip1_jk_kernel_1030(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -5552,6 +5592,7 @@ static void GINTint2e_ip1_jk_kernel_1110(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -5777,10 +5818,14 @@ static void GINTint2e_ip1_jk_kernel_1110(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -6209,6 +6254,7 @@ static void GINTint2e_ip1_jk_kernel_1111(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -6760,10 +6806,14 @@ static void GINTint2e_ip1_jk_kernel_1111(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -7660,6 +7710,7 @@ static void GINTint2e_ip1_jk_kernel_1120(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -8047,10 +8098,14 @@ static void GINTint2e_ip1_jk_kernel_1120(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -8761,6 +8816,7 @@ static void GINTint2e_ip1_jk_kernel_2010(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -8932,10 +8988,14 @@ static void GINTint2e_ip1_jk_kernel_2010(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -9300,6 +9360,7 @@ static void GINTint2e_ip1_jk_kernel_2011(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -9689,10 +9750,14 @@ static void GINTint2e_ip1_jk_kernel_2011(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -10414,6 +10479,7 @@ static void GINTint2e_ip1_jk_kernel_2020(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -10693,10 +10759,14 @@ static void GINTint2e_ip1_jk_kernel_2020(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -11298,6 +11368,7 @@ static void GINTint2e_ip1_jk_kernel_2100(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -11467,10 +11538,14 @@ static void GINTint2e_ip1_jk_kernel_2100(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -11854,6 +11929,7 @@ static void GINTint2e_ip1_jk_kernel_2110(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -12241,10 +12317,14 @@ static void GINTint2e_ip1_jk_kernel_2110(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -12972,6 +13052,7 @@ static void GINTint2e_ip1_jk_kernel_2200(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -13249,10 +13330,14 @@ static void GINTint2e_ip1_jk_kernel_2200(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -13900,6 +13985,7 @@ static void GINTint2e_ip1_jk_kernel_3000(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -14021,10 +14107,14 @@ static void GINTint2e_ip1_jk_kernel_3000(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -14321,6 +14411,7 @@ static void GINTint2e_ip1_jk_kernel_3010(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -14564,10 +14655,14 @@ static void GINTint2e_ip1_jk_kernel_3010(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
@@ -15118,6 +15213,7 @@ static void GINTint2e_ip1_jk_kernel_3100(GINTEnvVars envs, JKMatrix jk,
int bas_ij = offsets.bas_ij + task_ij;
int bas_kl = offsets.bas_kl + task_kl;
double norm = envs.fac;
+ double omega = envs.omega;
int *bas_pair2bra = c_bpcache.bas_pair2bra;
int *bas_pair2ket = c_bpcache.bas_pair2ket;
int ish = bas_pair2bra[bas_ij];
@@ -15359,10 +15455,14 @@ static void GINTint2e_ip1_jk_kernel_3100(GINTEnvVars envs, JKMatrix jk,
double aijkl = aij + akl;
double a1 = aij * akl;
double a0 = a1 / aijkl;
+ double theta = omega > 0.0 ? omega * omega / (omega * omega + a0) : 1.0;
+ a0 *= theta;
double x = a0 * (xijxkl * xijxkl + yijykl * yijykl + zijzkl * zijzkl);
- double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
+ double fac = norm * eij * ekl * sqrt(a0 / (a1 * a1 * a1));
+ //double fac = norm * eij * ekl / (sqrt(aijkl) * a1);
GINTrys_root<3>(x, rw);
+ GINTscale_u<3>(rw, theta);
for (irys = 0; irys < 3; ++irys) {
double weight0 = rw[irys+3] * fac;
double root0 = rw[irys];
diff --git a/gpu4pyscf/lib/utils.py b/gpu4pyscf/lib/utils.py
index bbe3d2df..4489fab3 100644
--- a/gpu4pyscf/lib/utils.py
+++ b/gpu4pyscf/lib/utils.py
@@ -34,11 +34,14 @@ def hybrid_kernel(method, *args, **kwargs):
def to_cpu(method):
# Search for the class in pyscf closest to the one defined in gpu4pyscf
for pyscf_cls in method.__class__.__mro__:
- if 'gpu4pyscf' not in pyscf_cls:
+ if 'gpu4pyscf' not in pyscf_cls.__module__:
break
method = method.view(pyscf_cls)
- keys = [cls._keys for cls in pyscf_cls.__mro__[:-1] if hasattr(cls, '_keys')]
+ keys = set()
+ for cls in pyscf_cls.__mro__[:-1]:
+ if hasattr(cls, '_keys'):
+ keys.update(cls._keys)
if keys:
keys = set(keys).intersection(method.__dict__)
diff --git a/gpu4pyscf/scf/hf.py b/gpu4pyscf/scf/hf.py
index 833919ec..49378c69 100644
--- a/gpu4pyscf/scf/hf.py
+++ b/gpu4pyscf/scf/hf.py
@@ -214,11 +214,13 @@ def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None,
if with_j:
vj1[:,idy,idx] = vj1[:,idx,idy]
+ vj1 = cupy.asarray(vj1)
for i, v in enumerate(vj1):
vj[i] += coeff.T.dot(v).dot(coeff)
if with_k:
if hermi:
vk1[:,idy,idx] = vk1[:,idx,idy]
+ vk1 = cupy.asarray(vk1)
for i, v in enumerate(vk1):
vk[i] += coeff.T.dot(v).dot(coeff)
cput0 = log.timer_debug1('get_jk pass 2 for l>4 basis on cpu', *cput0)
@@ -240,8 +242,11 @@ def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None,
if out_cupy:
return vj, vk
else:
- return vj.get() if vj else None, vk.get() if vk else None
-
+ if with_j:
+ vj = vj.get()
+ if with_k:
+ vk = vk.get()
+ return vj, vk
def _get_jk(mf, mol=None, dm=None, hermi=1, with_j=True, with_k=True,
omega=None):
@@ -359,13 +364,14 @@ def _kernel(mf, conv_tol=1e-10, conv_tol_grad=None,
if(dm0 is None):
dm0 = mf.get_init_guess(mol)
+
dm = cupy.asarray(dm0, order='C')
- if hasattr(dm0, 'occ_coeff') and hasattr(dm0, 'mo_occ'):
+ if hasattr(dm0, 'mo_coeff') and hasattr(dm0, 'mo_occ'):
mo_coeff = cupy.asarray(dm0.mo_coeff)
mo_occ = cupy.asarray(dm0.mo_occ)
occ_coeff = cupy.asarray(mo_coeff[:,mo_occ>0])
dm = tag_array(dm, occ_coeff=occ_coeff, mo_occ=mo_occ, mo_coeff=mo_coeff)
-
+
# use optimized workflow if possible
if hasattr(mf, 'init_workflow'):
mf.init_workflow(dm0=dm)
@@ -534,6 +540,8 @@ def _quad_moment(mf, mol=None, dm=None, unit='Debye-Ang'):
mol_quad *= nist.AU2DEBYE * nist.BOHR
return mol_quad
+def _eigh(mf, h, s):
+ return eigh(h, s)
class RHF(hf.RHF):
from gpu4pyscf.lib.utils import to_cpu, to_gpu, device
@@ -541,7 +549,8 @@ class RHF(hf.RHF):
screen_tol = 1e-14
DIIS = diis.SCF_DIIS
get_jk = _get_jk
- _eigh = staticmethod(eigh)
+ #_eigh = staticmethod(_eigh)
+ _eigh = _eigh
make_rdm1 = make_rdm1
get_fock = get_fock
get_occ = get_occ
@@ -575,12 +584,29 @@ def scf(self, dm0=None, **kwargs):
return self.e_tot
kernel = pyscf_lib.alias(scf, alias_name='kernel')
+ def reset(self, mol=None):
+ if mol is not None:
+ self.mol = mol
+ self._opt_gpu = None
+ self._opt_gpu_omega = None
+ self._eri = None
+ return self
+
+ def nuc_grad_method(self):
+ from gpu4pyscf.grad import rhf
+ return rhf.Gradients(self)
+
+ def density_fit(self, auxbasis=None, with_df=None, only_dfj=False):
+ import gpu4pyscf.df.df_jk
+ return gpu4pyscf.df.df_jk.density_fit(self, auxbasis, with_df, only_dfj)
+
class _VHFOpt(_vhf.VHFOpt):
from gpu4pyscf.lib.utils import to_cpu, to_gpu, device
def __init__(self, mol, intor, prescreen='CVHFnoscreen',
qcondname='CVHFsetnr_direct_scf', dmcondname=None):
self.mol, self.coeff = basis_seg_contraction(mol)
+ self.coeff = cupy.asarray(self.coeff)
# Note mol._bas will be sorted in .build() method. VHFOpt should be
# initialized after mol._bas updated.
self._intor = intor
diff --git a/gpu4pyscf/solvent/grad/pcm.py b/gpu4pyscf/solvent/grad/pcm.py
index 68b87229..a1f2b689 100644
--- a/gpu4pyscf/solvent/grad/pcm.py
+++ b/gpu4pyscf/solvent/grad/pcm.py
@@ -153,12 +153,10 @@ def grad_kernel(pcmobj, dm):
gridslice = pcmobj.surface['gslice_by_atom']
grid_coords = pcmobj.surface['grid_coords']
exponents = pcmobj.surface['charge_exp']
- switch_fun = pcmobj.surface['switch_fun']
v_grids = pcmobj._intermediates['v_grids']
A = pcmobj._intermediates['A']
D = pcmobj._intermediates['D']
S = pcmobj._intermediates['S']
- R = pcmobj._intermediates['R']
K = pcmobj._intermediates['K']
q = pcmobj._intermediates['q']
q_sym = pcmobj._intermediates['q_sym']
diff --git a/gpu4pyscf/solvent/pcm.py b/gpu4pyscf/solvent/pcm.py
index ddfc515c..aaed5922 100644
--- a/gpu4pyscf/solvent/pcm.py
+++ b/gpu4pyscf/solvent/pcm.py
@@ -47,35 +47,35 @@ def pcm_for_scf(mf, solvent_obj=None, dm=None):
# TABLE II, J. Chem. Phys. 122, 194110 (2005)
XI = {
-6: 4.84566077868,
-14: 4.86458714334,
-26: 4.85478226219,
-38: 4.90105812685,
-50: 4.89250673295,
-86: 4.89741372580,
-110: 4.90101060987,
-146: 4.89825187392,
-170: 4.90685517725,
-194: 4.90337644248,
-302: 4.90498088169,
-350: 4.86879474832,
-434: 4.90567349080,
-590: 4.90624071359,
-770: 4.90656435779,
-974: 4.90685167998,
-1202: 4.90704098216,
-1454: 4.90721023869,
-1730: 4.90733270691,
-2030: 4.90744499142,
-2354: 4.90753082825,
-2702: 4.90760972766,
-3074: 4.90767282394,
-3470: 4.90773141371,
-3890: 4.90777965981,
-4334: 4.90782469526,
-4802: 4.90749125553,
-5294: 4.90762073452,
-5810: 4.90792902522,
+ 6: 4.84566077868,
+ 14: 4.86458714334,
+ 26: 4.85478226219,
+ 38: 4.90105812685,
+ 50: 4.89250673295,
+ 86: 4.89741372580,
+ 110: 4.90101060987,
+ 146: 4.89825187392,
+ 170: 4.90685517725,
+ 194: 4.90337644248,
+ 302: 4.90498088169,
+ 350: 4.86879474832,
+ 434: 4.90567349080,
+ 590: 4.90624071359,
+ 770: 4.90656435779,
+ 974: 4.90685167998,
+ 1202: 4.90704098216,
+ 1454: 4.90721023869,
+ 1730: 4.90733270691,
+ 2030: 4.90744499142,
+ 2354: 4.90753082825,
+ 2702: 4.90760972766,
+ 3074: 4.90767282394,
+ 3470: 4.90773141371,
+ 3890: 4.90777965981,
+ 4334: 4.90782469526,
+ 4802: 4.90749125553,
+ 5294: 4.90762073452,
+ 5810: 4.90792902522,
}
Bondi = radii.VDW
@@ -325,12 +325,10 @@ def grad_kernel(pcmobj, dm):
gridslice = pcmobj.surface['gslice_by_atom']
grid_coords = pcmobj.surface['grid_coords']
exponents = pcmobj.surface['charge_exp']
- switch_fun = pcmobj.surface['switch_fun']
v_grids = pcmobj._intermediates['v_grids']
A = pcmobj._intermediates['A']
D = pcmobj._intermediates['D']
S = pcmobj._intermediates['S']
- R = pcmobj._intermediates['R']
K = pcmobj._intermediates['K']
q = pcmobj._intermediates['q']
q_sym = pcmobj._intermediates['q_sym']
@@ -550,10 +548,8 @@ def _get_vind(self, dms):
if not self._intermediates or self.grids.coords is None:
self.build()
- mol = self.mol
nao = dms.shape[-1]
dms = dms.reshape(-1,nao,nao)
- n_dm = dms.shape[0]
K = self._intermediates['K']
R = self._intermediates['R']
@@ -609,11 +605,8 @@ def _get_v(self, surface, dms):
def _get_vmat(self, q):
mol = self.mol
nao = mol.nao
- atom_coords = mol.atom_coords(unit='B')
- atom_charges = mol.atom_charges()
grid_coords = self.surface['grid_coords']
exponents = self.surface['charge_exp']
-
max_memory = self.max_memory - lib.current_memory()[0]
blksize = int(max(max_memory*.9e6/8/nao**2, 400))
ngrids = grid_coords.shape[0]