Open-shell AICCM¶
Both Γ-CCM (aiccm2026dev-a) and χ-CCM[1]
(aiccm2026dev-b) ship unrestricted SCF (UHF, UKS) and unrestricted
correlation, but their open-shell reach differs. Γ-CCM is the direct-torus
representation, while χ-CCM is the finite-character (Γ-centred
character-mesh) representation of the same declared finite-BvK-torus
Hamiltonian. This page maps what is available, what is validated, and what is
still closed.
Warning
Experimental. Open-shell AICCM numbers are research-grade. Every invocation emits an experimental warning. Validate against a closed-shell consistency check before trusting a result.
Γ-CCM / aiccm2026dev-a¶
Γ-CCM ships the full unrestricted stack through the CCM integral weighting.
level |
function |
notes |
|---|---|---|
UHF |
|
WSSC-weighted UHF; spin-resolved SCF |
UKS |
|
any libxc functional |
UMP2 |
|
on the CCM MO integrals |
UCCSD(T) |
|
spin-orbital CCSD(T); αα = ββ collapse verified |
The closed-shell consistency gate: on a closed-shell cluster
run_ccm_uccsd reproduces run_ccm_ccsd to ≤ 1e-8 (both the CCSD and
the (T) triples correction, tests/test_ccm_uccsd.py). For ionic
correlation the neutral reference is required - the Madelung background
shifts denominators.
UHF + UCCSD(T) on a doublet chain¶
import numpy as np
from vibeqc import Atom, PeriodicSystem
from vibeqc.periodic.ccm import CCMSystem
from vibeqc.periodic.ccm.uhf import run_ccm_uhf
from vibeqc.periodic.ccm.uccsd import run_ccm_uccsd
from vibeqc.periodic.ccm.neutral import ccm_eri_neutral
BOHR = 1.0 / 0.529177210903
a = 3.2 * BOHR
system = PeriodicSystem(
1, np.diag([a, 40.0, 40.0]),
[Atom(3, [0, 0, 0]), Atom(1, [a/2, 0, 0])],
charge=0, multiplicity=2, # doublet → open-shell UHF
)
ccm = CCMSystem(system, (4, 1, 1), "sto-3g")
# Neutral reference (required for ionic correlation)
g = ccm_eri_neutral(ccm)
# UHF
uhf = run_ccm_uhf(ccm, method="aiccm2026dev-a", eri=g)
print(f"UHF E/cell = {uhf.energy:.8f} Ha")
print(f"⟨S²⟩ = {uhf.s2_expectation:.4f}")
# UCCSD(T)
ucc = run_ccm_uccsd(ccm, uhf, eri=g)
print(f"UCCSD(T) Ecorr = {ucc.e_correlation:.8f} Ha, (T) = {ucc.e_t:.2e}")
print(f"n_alpha = {ucc.n_alpha}, n_beta = {ucc.n_beta}")
NiO AFM - antiferromagnetic rocksalt¶
NiO is the open-shell benchmark in the 28-system test set. The AFM ordering doubles the primitive cell to 4 atoms (2 Ni↑, 2 Ni↓, 4 O):
import numpy as np
from vibeqc import Atom, PeriodicSystem
from vibeqc.periodic.ccm import CCMSystem
from vibeqc.periodic.ccm.uhf import run_ccm_uhf
from vibeqc.periodic.ccm.ri import run_ccm_rhf_gdf
BOHR = 1.0 / 0.529177210903
a = 4.162 * BOHR
lat = np.array([[0, a/2, a/2], [a/2, 0, a/2], [a/2, a/2, 0]])
# AFM-II: double the cell along [001] to alternate spin layers.
# Primitive cell 2 atoms; AFM cell 4 atoms: Ni↑, Ni↓, O, O.
# (Simplified here - the test-set NiO entry uses the full CRYSTAL .d12
# geometry; see aiccm-2026/testset.py for the exact builder.)
system = PeriodicSystem(
3, np.diag([a, a, 2*a]),
[Atom(28, [0, 0, 0]), Atom(28, [0, 0, a]),
Atom(8, [a/2, a/2, a/2]),
Atom(8, [a/2, a/2, 3*a/2])],
charge=0, multiplicity=3, # two unpaired spins → triplet
)
ccm = CCMSystem(system, (2, 2, 1), "sto-3g")
# UHF - use the GDF route for the absolute energy (ionic, Madelung)
uhf = run_ccm_uhf(ccm, method="aiccm2026dev-a")
print(f"NiO AFM UHF E/atom = {uhf.energy_per_atom:.8f} Ha")
print(f"⟨S²⟩ = {uhf.s2_expectation:.4f}")
Heavier basis, the C++ scalable kernel, and the GDF route are needed for production NiO numbers. The test-set runner handles this:
cd aiccm-2026
python run_case.py nio-afm aiccm-hf # UHF on the four-center
python run_case.py nio-afm aiccm-ri # UHF with GDF Coulomb
χ-CCM / aiccm2026dev-b¶
χ-CCM ships unrestricted SCF (UHF, UKS) and unrestricted correlation (UMP2, UCCSD(T), DLPNO-UMP2, DLPNO-UCCSD(T)) through the direct APIs:
from vibeqc.periodic_aiccm2026dev_b import run_aiccm2026dev_b_uhf, run_aiccm2026dev_b_uks
from vibeqc.periodic_aiccm2026dev_b_posthf import (
run_aiccm2026dev_b_ump2,
run_aiccm2026dev_b_uccsd_t,
run_aiccm2026dev_b_dlpno_ump2,
run_aiccm2026dev_b_dlpno_uccsd_t,
)
All are 3-D only (1-D/2-D post-HF fails closed until the lower-dimensional gauges are matched). Alpha and beta occupied projectors are localized independently. The full-domain UCCSD(T) implementation is the explicitly cost-capped O(N⁶) correctness oracle from the DLPNO stack, not a claim of production reduced scaling.
The run_periodic_job entry point with jk_method="aiccm2026dev-b" is
closed-shell only at present - use the direct APIs for open-shell
χ-CCM work.
UMP2 on a 3-D LiH doublet¶
import numpy as np
import vibeqc as vq
from vibeqc.periodic_aiccm2026dev_b_posthf import run_aiccm2026dev_b_ump2
a = 4.0840
lat = np.array([[0, a/2, a/2], [a/2, 0, a/2], [a/2, a/2, 0]])
system = vq.PeriodicSystem(
3, lat,
[vq.Atom(3, [0, 0, 0]),
vq.Atom(1, (lat @ np.array([0.5, 0.5, 0.5])).tolist())],
charge=1, multiplicity=2, # doublet
)
basis = vq.BasisSet(system.unit_cell_molecule(), "sto-3g")
ump2 = run_aiccm2026dev_b_ump2(system, basis, lattice_extension=(2, 1, 1))
print(f"UMP2 Ecorr = {ump2.e_correlation:.8f} Ha")
Spin-contamination diagnostics¶
Both lines report ⟨S²⟩ on unrestricted SCF results. For a pure spin
state the expectation should be close to S(S+1):
# Γ-CCM
s2 = uhf.s2_expectation
s2_ideal = 0.5 * (0.5 + 1) # doublet → 0.75
print(f"⟨S²⟩ = {s2:.4f} (ideal = {s2_ideal})")
# χ-CCM - available on the direct API result
# result.s2_expectation, result.spin_contamination
Current limits¶
feature |
Γ-CCM |
χ-CCM |
|---|---|---|
UHF |
✅ |
✅ (direct API) |
UKS |
✅ |
✅ (direct API) |
UMP2 |
✅ |
✅ (3-D, direct API) |
UCCSD(T) |
✅ |
✅ (3-D, direct API) |
DLPNO-UMP2 |
❌ |
✅ (3-D, direct API) |
DLPNO-UCCSD(T) |
❌ |
✅ (3-D, direct API) |
run_periodic_job entry |
N/A |
❌ (closed-shell only) |
Spin properties |
|
|
Γ-CCM DLPNO for open-shell is scoped (
docs/aiccm2026dev_a_followon.md§ D.3) but not yet implemented.χ-CCM open-shell is 3-D only; lower-dimensional post-HF is blocked until the mixed-boundary Green’s function is implemented.
Analytic gradients for open-shell CCM do not exist on either line - use numerical gradients (
ccm_numerical_gradient, Γ-CCM only).
See also¶
Γ-CCM reference - the full Γ-CCM method stack
χ-CCM user guide - the χ-CCM API and backend matrix
Γ-CCM tutorial - step-by-step walkthrough
Molecular open-shell tutorial - UHF/UKS concepts that apply to the CCM as well