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

run_ccm_uhf

WSSC-weighted UHF; spin-resolved SCF

UKS

run_ccm_uks

any libxc functional

UMP2

run_ccm_ump2

on the CCM MO integrals

UCCSD(T)

run_ccm_uccsd

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_homo_lumo_gap (spin-resolved)

derive_aiccm2026dev_b_scf_properties (spin populations)

  • Γ-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