This site is version 0.0.1. Most of the code on this site is drafted by an agent and needs review. I apologize for the AI-speak, we are working on rewriting it!
viv-lang.org

Notebooks · lib/hf/coupling

The ROHF effective Fock matrix, and why it is not unique

ROHF keeps one set of spatial orbitals for both spins, split three ways: Nb closed-shell orbitals holding an alpha and a beta electron, Na - Nb open orbitals holding one alpha electron each, and the virtual rest. No single Fock operator has these orbitals as its eigenvectors. The energy is stationary when, in the orbital basis, three off-diagonal blocks vanish, each belonging to a different spin Fock matrix:

closed-open     F_b          (moving a beta electron)
open-virtual    F_a          (moving an alpha electron)
closed-virtual  (F_a + F_b)/2

The effective Fock matrix puts those blocks off the diagonal and anything convenient on it, F_xx = A_x F_a + B_x F_b for x = closed, open, virtual. The diagonal choice changes the orbital energies and the path of the iteration, but not the converged energy or density, since stationarity only involves the off-diagonal blocks. The registry rohf_couplings() holds four published choices of (A_c, B_c, A_o, B_o, A_v, B_v):

rohf_c_gs        Guest-Saunders (PySCF's)   1/2 1/2   1/2 1/2   1/2  1/2
rohf_c_roothaan  Roothaan                  -1/2 3/2   1/2 1/2   3/2 -1/2
rohf_c_mcweeny   McWeeny-Diercksen          1/3 2/3   1/3 2/3   2/3  1/3
rohf_c_bpd       Binkley-Pople-Dobosh       1/2 1/2   1    0    0    1

Each member takes (Fab, P, opts) in the orthonormal basis, with Fab = [F_a', F_b'] and P = [P_c', P_o'] (the closed and open projectors, P_c' = X^T S Db S X and P_o' = X^T S (Da - Db) S X), and returns the effective matrix as [1, m, m].

The SCF error is the commutator of the effective matrix with P_c' + P_o'/2 (rohf_error). Its closed-open, open-virtual and closed-virtual blocks are the three stationarity blocks above scaled by 1/2, 1/2 and 1, and it has no diagonal-block part, so it is the same for every coupling and vanishes exactly at a stationary point. DIIS extrapolates the effective matrix on it.

Orbitals are the eigenvectors of the effective matrix, but they are not occupied by its eigenvalues, which depend on the coupling. The Nb orbitals lowest in (F_a + F_b)/2 are closed, and the Na - Nb lowest in F_a among the rest are open (rohf_pick). PySCF ranks the closed orbitals by the eigenvalue of its (Guest-Saunders) effective matrix, whose diagonal blocks are (F_a + F_b)/2, and the open ones by F_a, so the two rules pick the same orbitals once the off-diagonal blocks are small.

These are the ROHF pieces of the SCF loop (lib/hf/scf_loop); lib/hf/rohf runs them.

Used with import hf.coupling.

Look inside this program

  • Atlas

    The program’s map: every function and which calls which.

  • There’s no recorded run of this program yet.

Shift+Enter in a cell runs it and moves to the next. Running a cell runs every cell above it too, as one program.

[1]lines 54–272