Population analysis and electrostatic potential
Population methods assign electrons to atoms and report atomic charges. ESP gives the electrostatic potential at a chosen point. Check which method was used before comparing results.
Mulliken populations
Mulliken analysis partitions the AO density using the overlap matrix. Atomic electron populations are accumulated from basis functions assigned to each atom, and charge is nuclear charge minus assigned electrons. Results can be strongly basis-set dependent.
Symmetric Löwdin populations
Löwdin analysis first applies symmetric orthogonalization with \(S^{1/2}\) before collecting atomic populations. It offers a different partition, not a uniquely “correct” atomic charge. Report the method and basis set whenever comparing charges.
Electrostatic potential
At point \(\mathbf r\), the nuclear term is
Charge-model potentials use Mulliken or Löwdin point charges. Electronic ESP uses the AO density and Gaussian Coulomb integrals by default; a spatial-grid approximation is available explicitly. Total ESP combines the electronic and nuclear terms.
Nuclear and total ESP are singular at a charged nucleus; choose a point away from it. Purely electronic ESP can be evaluated there. The high-level CLI/API point coordinates use ångströms, and the potential uses hartree/e. Grid spacing and padding use bohr.
Interpretation and status
- Nuclear and Mulliken/Löwdin point-charge ESP: Stable implementation, subject to model limitations.
- Gaussian-integral electronic and total point ESP: Validated for the documented reference scope below.
- Grid-derived electronic and total ESP: Experimental. Numerical Coulomb quadrature is sensitive to grid coverage and near-singular behavior.
Do not present different population schemes as experimentally observable charges. Use them as model-dependent descriptors and test whether conclusions survive reasonable methodological choices.
Gaussian-integral point ESP
Electronic and total point ESP default to --method integrals.
The shared Python entry point is load(path).esp((x, y, z), component="total").
Coordinates are angstrom and the returned potential is hartree/e. The electronic
term is -sum(P_mu,nu * V_mu,nu), using the total spin-summed AO density;
V_mu,nu = integral chi_mu(r) chi_nu(r) / |r-C| dr.
The native kernel uses the Laplace identity
1/r = (2/sqrt(pi)) integral_0^infinity exp(-t*t*r*r) dt, the Gaussian product
theorem, exact Cartesian polynomial moments and the change of variable
u=t/sqrt(alpha+beta+t*t). The remaining integral is on [0,1].
Normalization and pure spherical transforms are shared with the existing AO core.
Two Gauss–Legendre rules (64 and 96 nodes) check numerical consistency to
1e-10 hartree/e. This difference is a convergence diagnostic, not a rigorous
error bound. A rescaled interval resolves the far-field Gaussian tail.
Before integral evaluation, a primitive/node work estimate must remain below
100 million and a request may contain at most 1024 points. AO-metric electron
conservation must pass 1e-6 e; unmet convergence/conservation returns partial
Experimental results. Nuclear/total ESP remains singular at a nucleus, whereas
purely electronic ESP is finite there. ECPs use source effective nuclear charges;
this reference corpus does not independently validate all ECP conventions.
Fresh PySCF int1e_rinv comparisons cover 11 restricted/unrestricted, charged,
diffuse and Cartesian/pure molecular cases at three points each (including a
nuclear center for the electronic term), with 1e-8 hartree/e tolerance. Exact
radial expectations independently test every primitive Cartesian/pure s–h
component at its center. Successful integral results are Validated for this
scope. The earlier spatial-grid ESP remains available with --method grid and
remains Experimental, with its recorded convergence failures retained.
The structured result contains method, value, electron_count,
expected_electrons, electron_conservation_error, quadrature_nodes,
quadrature_check_nodes, quadrature_max_error, quadrature_passed, source
provenance, validation status and result status.