Population Analysis (Mulliken & Löwdin)
Population analysis extracts per-atom partial charges from the molecular orbital coefficients produced by the EHT solver. sci-form implements both Mulliken and Löwdin partitioning schemes.
Overview
Given the density matrix
Mulliken Population Analysis
Density Matrix
The density matrix is constructed from occupied molecular orbital coefficients:
where
Mulliken Charge Formula
The Mulliken charge on atom
where:
is the nuclear charge (number of valence electrons) is the gross orbital population for orbital - The sum runs over all atomic orbitals
centered on atom
Charge Conservation
The total Mulliken charges always sum to the net molecular charge:
This follows from
Löwdin Population Analysis
Symmetric Orthogonalization
Löwdin analysis first orthogonalizes the basis by diagonalizing the overlap matrix:
Löwdin Charge Formula
The Löwdin density matrix in the orthogonalized basis is:
The Löwdin charge on atom
Advantages Over Mulliken
| Property | Mulliken | Löwdin |
|---|---|---|
| Basis-set dependence | Strong — charges shift with basis size | Weaker — more stable |
| Orbital populations | Can be negative | Always |
| Overlap handling | Splits 50/50 between atoms | Orthogonalizes first |
| Rotational invariance | No | Yes |
API
Rust
use sci_form::compute_population;
let result = compute_population("O", None);
// result.mulliken_charges: Vec<f64>
// result.lowdin_charges: Vec<f64>
// result.gross_populations: Vec<f64>
// result.bond_orders: Vec<Vec<f64>>CLI
sci-form population "O"
# Output: JSON with mulliken_charges, lowdin_charges, etc.Python
import sci_form
result = sci_form.population("O")
print(result.mulliken_charges) # [-0.33, 0.17, 0.17]WASM
import { compute_population } from 'sci-form';
const result = compute_population("O");
// result.mulliken_charges, result.lowdin_chargesValidation
- Charge conservation:
tested for all molecules - Electronegativity ordering: O charges < C charges < H charges (expected from EN)
- Equivalence: Symmetry-equivalent atoms get equal charges (e.g., H atoms in CH₄)
- Boundedness: Löwdin populations always in