Commit d7dc190
committed
Add OrbitalEvaluator and Gaussian cube writer utility
Adds a public, host-parallel point-set evaluator for molecular orbitals
and densities, plus a self-contained Gaussian cube file writer. The two
are deliberately decoupled: OrbitalEvaluator returns plain numerical
arrays, and write_cube depends only on Molecule + raw field data. Either
can be used independently.
OrbitalEvaluator (include/gauxc/orbital_evaluator.hpp,
src/orbital_evaluator.cxx)
- Constructed from a BasisSet; caches the LocalHostWorkDriver internally
so it can be reused across many evaluations for the same molecule.
- eval_orbital / eval_orbitals: chi_j(r) = sum_mu C[mu, j] * phi_mu(r),
one or many MOs at a time on an arbitrary AoS point set.
- eval_density: rho(r) = sum_{mu,nu} D[mu, nu] * phi_mu(r) * phi_nu(r),
for a symmetric AO density matrix.
- Internally batches points with an adaptive batch size (~16 MB AO
scratch per thread) and parallelises the batch loop with OpenMP. Each
thread owns its own scratch.
- Currently Host-only; the public API takes ExecutionSpace so device
backends can be slotted in later without an ABI break.
write_cube + CubeGrid (include/gauxc/external/cube.hpp,
src/external/cube.cxx)
- Standard Gaussian cube text format, byte-compatible with the output of
PySCF / Gaussian / NWChem cubegen utilities.
- CubeGrid::from_molecule builds a default axis-aligned grid that
encloses the molecule with a configurable margin (default 3.0 Bohr,
matching PySCF cubegen).
- The data block is formatted in parallel: each (ix, iy) row is
serialised independently into a pre-sized byte buffer and committed
with a single fwrite at the end. The per-value formatter is a
hand-rolled %13.5E that matches glibc snprintf bit-for-bit on the
fast path (1-2 digit exponent) and falls back to snprintf for the
rare 3-digit-exponent case. This is the same writer that produced the
measured 5x end-to-end speedup over PySCF cubegen on the QDK-Chemistry
workloads that motivated this PR.
- Self-contained: no third-party dependencies, no GauXC kernel coupling.
Tests (tests/orbital_evaluator_test.cxx, [orbital_evaluator] / [cube]):
- Water cc-pVDZ kernel checks against direct eval_collocation reference:
one-hot MO, multi-MO contraction, identity density, rank-1 density.
- CubeGrid layout: first/last point coordinates, iz-fastest ordering.
- write_cube round-trip: parses back the written file and verifies
header (atoms, origin, axes) and field values to %13.5E precision.
- write_cube formatter: byte-exact comparison of the data block against
glibc snprintf("%13.5E", v) for a battery of edge-case values
(signed zero, near-power-of-ten boundaries, 3-digit exponents).
- All 1570 assertions pass; existing [collocation] suite unaffected.1 parent 2c4a2bd commit d7dc190
8 files changed
Lines changed: 1087 additions & 0 deletions
File tree
- include/gauxc
- external
- src
- external
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
12 | 15 | | |
13 | 16 | | |
14 | 17 | | |
| |||
0 commit comments