OM2/MRCI

PyQED exposes an OM2/MRCI API for semiempirical excited-state workflows. The API is intentionally separated into two layers:

  • OM2 builds the semiempirical reference Hamiltonian and orbitals.

  • MRCI diagonalizes the selected multireference CI Hamiltonian.

Current Status

The native API now includes a runnable closed-shell OM2-style reference and MRCI driver:

  • Built-in H/C/N/O/F OM2 parameter table from Dral et al., J. Chem. Theory Comput. 12, 1082 (2016), Table 2, including the X-H resonance rows, orthogonalization factors, and semiempirical ECP rows.

  • Orthogonal valence AO Hamiltonian data with one-electron terms, compact NDDO-like electron repulsion terms, core attraction, semiempirical ECP corrections, additive OM2 orthogonalization corrections, and core repulsion.

  • Closed-shell SCF reference energies and orbitals.

  • Full or selected determinant-space MRCI using the PyQED Slater-Condon CI builder.

  • Scanner and CI-vector pseudo-overlap helpers for PES/LDR workflows.

The current integral kernel is intentionally modular. It now uses the published X-H resonance rows, semiempirical ECP rows, and explicit additive F1/F2 and G1/G2 orthogonalization-correction contractions. It is still not bit-for-bit MNDO2005 OM2 because the native overlap/local-core primitives are compact analytic approximations. The next physics step is replacing those primitive overlap/local-core kernels by the exact OM2 two-center primitives while keeping the same user API.

API Sketch

from pyqed.qchem.semiempirical import OM2

om2 = OM2(
    atom="C 0 0 0; H 0 0 1.09",
    charge=0,
    spin=0,
    unit="angstrom",
).run()

mrci = om2.MRCI(nstates=5).run()
print(mrci.e)

MRCI is intentionally both the driver and the result object. After run(), energies and CI vectors are available as mrci.e and mrci.ci; there is no separate MRCIResult wrapper.

For PES scans, the same interface will be usable as a callable scanner:

scanner = OM2(atom="H 0 0 0; H 0 0 0.74").as_scanner(
    nstates=2,
    full=True,
)
result = scanner(atom="H 0 0 0; H 0 0 0.80")
print(result.e)

Wavefunction pseudo-overlaps can be computed directly from two completed MRCI objects:

s = mrci1.wavefunction_overlap(mrci2)

Published Benchmarks

PyQED ships a small registry of published OM2 benchmark targets from the OMx papers. It includes aggregate MAEs plus selected molecule-level supporting-information values from the G2-CHNOF and S22 tables. These values are heats of formation or interaction energies rather than total electronic energies, so they are useful for tracking the expected accuracy envelope while a direct MNDO executable benchmark is unavailable.

from pyqed.qchem.semiempirical import (
    format_published_om2_benchmarks,
    format_published_om2_molecule_benchmarks,
)

print(format_published_om2_benchmarks())
print(format_published_om2_molecule_benchmarks())

The same registry is used by examples/qchem/benchmark_om2_published.py.

Implementation Roadmap

  1. Replace the compact approximate integral kernel with the exact OM2 orthogonalization/ECP Hamiltonian.

  2. Add open-shell/UHF OM2 references.

  3. Add production MRCI reference selection and perturbative selection thresholds.

  4. Add transition dipoles and oscillator strengths.

  5. Add analytic or robust finite-difference gradients after energies/overlaps are stable.