# ポスト SCF 法:RI-MP2

[Hartree–Fock](../10-foundations/hartree-fock.md) は平均場法です:各電子は他電子の*平均*場しか感じないので、
電子が**瞬間的に互いを避ける**さまを外します。その欠けた効果のエネルギーが**相関エネルギー**で、それを回収するのが
**ポスト SCF**（ポスト Hartree–Fock）法の仕事です。本章は qc-rs が現在実装する系列 — **RI-MP2** とそのスピン
スケール変種 — を扱います。

## 理論:相関と 2 次摂動論

[Part II](../10-foundations/hartree-fock.md) の定義を思い出しましょう:

$$
E_{\text{corr}} = E_{\text{exact}} - E_{\text{HF}} \;<\; 0 .
$$

全エネルギーに対しては小さな割合ですが、*化学的には決定的* — 結合エネルギー・反応障壁・分散はすべてそこにあります。
それを見積もる最も安価で系統的な方法が **2 次 Møller–Plesset 摂動論（MP2）**です:真の電子間反発と HF 平均場の
差を摂動として扱い、2 次のエネルギー補正を取ります。閉殻では

$$
E^{(2)} = \sum_{ij}^{\text{occ}} \sum_{ab}^{\text{virt}}
\frac{ (ia\,|\,jb)\,\big[\,2(ia\,|\,jb) - (ib\,|\,ja)\,\big] }
     { \varepsilon_i + \varepsilon_j - \varepsilon_a - \varepsilon_b } ,
$$

占有（$i,j$）と仮想（$a,b$）軌道にわたる二電子積分 $(ia|jb)$ を軌道エネルギー分母で割った和です。括弧内の 2 項が
**異スピン**と**同スピン**の寄与で、qc-rs はこれらを別々に報告します（`e_os`, `e_ss`）。これが下のスピンスケール
変種を可能にします。

### RI（「密度フィッティング」）近似

ボトルネックは 4 指標積分 $(ia|jb)$ です。**恒等分解（RI）**、すなわち密度フィッティング近似は、AO ペア密度を
Coulomb 計量のもとで**補助基底** $\{\chi_P\}$ にフィットします、

$$
(\mu\nu\,|\,\lambda\sigma) \;\approx\; \sum_{PQ} (\mu\nu\,|\,P)\,\big(V^{-1}\big)_{PQ}\,(Q\,|\,\lambda\sigma),
\qquad
V_{PQ} = (P|Q),
$$

これにより、4 指標の対象は単一の**白色化 factor**を通じて 3 指標の積に潰れます、

$$
\boxed{\,B_{P,\mu\nu} = \sum_Q \big(V^{-1/2}\big)_{PQ}\,(Q\,|\,\mu\nu)\,}
\qquad\Longrightarrow\qquad
(\mu\nu\,|\,\lambda\sigma) \approx \sum_P B_{P,\mu\nu}\,B_{P,\lambda\sigma}.
$$

$V^{-1/2}$ は対称な計量 $V=U\Lambda U^\top$ を固有分解し、カットオフ（`ri.metric_cutoff`、既定 $10^{-10}$）
以下のほぼ線形従属なモードを落として得ます — これが RI が行う唯一の近似で、補助基底とこのカットオフだけで
制御され、qc-rs のどのバックエンドでも同一です。重要なのは、$B$ は積分だけに依存し密度には依存しないので、
**一度**構築して使い回されること;MP2 はこれを分子軌道形 $(ia|jb)\approx\sum_P B_{P,ia}B_{P,jb}$ で必要とし
ます（RI-JK が SCF に使うのと同じ $B$ を、占有×仮想指標に半変換したもの）。だから RI は SCF の
`eri="ri-*"` と MP2 の `ric=` が共有する 1 つの統一機構です
（[完全な導出](../10-foundations/density-fitting-ri.md)）。これが qc-rs の *唯一の* MP2 経路です — 速く
正確で、フィッティング誤差は化学的精度をはるかに下回ります — だから `qc.chk.new(...)` に `ric=` で
**相関フィッティング補助基底**を渡します。

## 使い方

MP2 は **LCT** 法です（SCF 参照の上に載る相関法群を `lct` が扱います）。先に SCF を走らせ、`lct` ステップを足します:

```python
import qc
water = "O 0 0 0.117; H 0 0.757 -0.469; H 0 -0.757 -0.469"

hf = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom",
                ric="cc-pvdz-ri/mp2fit").scf(ref="r").run()   # ric= 補助基底に注意
m  = hf.lct(method="mp2").run()

m.lct.energy    # -76.230747   全 MP2 エネルギー（E_HF + E_corr）
m.lct.e_corr    # -0.203953    相関エネルギー
m.lct.e_os      # 異スピン部分
m.lct.e_ss      # 同スピン部分
```

`ric=` 補助基底（ここでは `cc-pvdz` に合わせた相関フィッティング集合 `cc-pvdz-ri/mp2fit`）は必須です — RI-MP2 に
非 RI のフォールバックはありません。補助は軌道基底に合わせて選びます（`cc-pvtz` → `cc-pvtz-ri/mp2fit`、def2 系 →
その `def2-*/mp2fit`）。

:::{tip} RI-MP2 の精度は？
RI フィッティング誤差はごくわずかです。この 水/cc-pVDZ では、qc の RI-MP2 相関エネルギー（−0.203953）は従来型
（非 RI）MP2 と **1.5 × 10⁻⁵ Ha** で一致 — 化学的精度（〜1.6 mHa）をはるかに下回ります。
:::

### スピン成分スケール変種

MP2 は相関をわずかに過大評価するため、異/同スピン部分の 2 つの経験的な再スケーリングが、追加コストなしで精度を
改善することがよくあります — `method` を変えるだけです:

```python
scs = hf.lct(method="scs-mp2").run().lct.energy    # -76.226839   SCS-MP2 (Grimme)
sos = hf.lct(method="sos-mp2").run().lct.energy    # -76.224885   SOS-MP2 (同スピンを落とす、O(N⁴))
```

- **`scs-mp2`** は異・同スピンを異なる係数（⅚ と ⅓）でスケールします。
- **`sos-mp2`** は異スピン項*だけ*を残し（1.3 倍）、O(N⁴) の Laplace アルゴリズムを可能にします。

### 開殻と frozen core

RI-MP2 は **RHF・UHF・ROHF** 参照で動きます（開殻ラジカルはその UHF/ROHF 軌道を使います）。**frozen-core**
近似（化学的に不活性な内殻軌道を相関和から除く、この分野の通常の既定）やその他の調整は `lct.*` 下の `iop` キー
です — 例 `iop={"lct.frozen_core": True}` — [IOP リファレンス](../40-reference/iop.md) に記載。

:::{note} 現在実装されているもの
**RI-MP2 系列**（`mp2` / `scs-mp2` / `sos-mp2`）は実際のエネルギーを計算します。他の `lct` 法（`cc2`）、
多参照法（`casscf`, `caspt2`, `nevpt2`, `fci`, `dmrg`）、励起状態 `td` は認識されますが**モック**です（実相関
エネルギーなしにワークフローだけ組みます）。本章は実数値を出す手法を扱います。
:::

## 総合例:相関エネルギー

```python
import qc
water = "O 0 0 0.117; H 0 0.757 -0.469; H 0 -0.757 -0.469"

hf = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom",
                ric="cc-pvdz-ri/mp2fit").scf(ref="r").run()
print(f"E(RHF)     = {hf.scf.energy:.6f}")            # -76.026794

for method in ("mp2", "scs-mp2", "sos-mp2"):
    e = hf.lct(method=method).run().lct.energy
    print(f"E({method:8}) = {e:.6f}")
# E(mp2     ) = -76.230747   (E_corr = -0.203953)
# E(scs-mp2 ) = -76.226839
# E(sos-mp2 ) = -76.224885
```

相関を加えると RHF エネルギーは約 0.20 Ha 下がります — 全体に対しては小さいですが、これが結合エネルギーや反応
熱化学を正しくする部分です。

:::{exercise}
:label: ex-postscf

1. `hf` を `ric=` なしで作って `hf.lct(method="mp2").run()` を呼びました。何が問題で、SCF が要らなかったのに
   MP2 がそれを必要とするのはなぜですか。
2. `m.lct.e_os` と `m.lct.e_ss` から、素の MP2 相関エネルギーをどう再構成しますか。そして SOS-MP2 は `e_ss` に
   何をしますか。
:::

:::{solution} ex-postscf
:class: dropdown

1. RI-MP2 には**非 RI 経路がない**ので、相関フィッティング補助基底が必要です;`ric=` がないと 4 指標積分を分解
   する補助がありません。SCF が要らなかったのは、その J/K 構築が 4 中心 ERI（または JK-fit 補助）を使っていた
   ため — MP2 相関補助とは*別の*フィッティング集合です。
2. 素の MP2:`e_corr = e_os + e_ss`。**SOS-MP2 は `e_ss` を完全に落とし**（0 倍）、`e_os` を 1.3 倍します。これが
   O(N⁴) で走れる理由です。
:::

RI-MP2 は 1 つの構造での相関エネルギーを与えました。平衡構造と力を求めるため、[次章](gradients-geomopt.md) は
解析的勾配と構造最適化に進みます。
