# 基底関数と AO 表現

[前章](molecular-input.md) では*どの*分子を計算するかを定めました。本章は、計算の**コスト対精度**を左右する
最大のレバー — **基底関数系**、すなわち qc-rs が分子軌道を展開する関数の集合 — についてです。これは `ao=` 引数で
選びます。ここで感覚を掴めば、惰性で `cc-pvdz` をコピーするのではなく、意図を持った良い選択ができるようになります。

## 理論:なぜ基底が要るのか、なぜガウス関数か

[Part II](../10-foundations/variational-lcao-basis.md) の **LCAO** の考えを思い出しましょう:各分子軌道は、固定
された原子中心の**基底関数** $\{\phi_\mu\}$ の線形結合として書かれます、

$$
\psi_i(\mathbf r) = \sum_{\mu=1}^{K} C_{\mu i}\,\phi_\mu(\mathbf r).
$$

集合 $\{\phi_\mu\}$ が*基底*そのもので、その大きさ $K$ が Roothaan 行列問題
$\mathbf{FC}=\mathbf{SC}\boldsymbol\varepsilon$ の次元です。大きく柔軟な基底ほど SCF は真の軌道を忠実に記述できます
— ただしコストは $K$ とともに急増します（積分は形式上 $\mathcal O(K^4)$）。基底を理解することは、精度と実行時間の
両方がどこから来るのかを理解することです。

$\phi_\mu$ はどんな形であるべきか。厳密な原子軌道は $e^{-\zeta r}$ で減衰します — **Slater 型軌道**（STO）で、核で
鋭いカスプを持ち、正しい遠距離の裾を持ちます。しかし STO 上の二電子積分は法外に高価です。量子化学を実用にした工夫
は、代わりに**ガウス**関数 $e^{-\alpha r^2}$ を使うことです:その積分は閉形式を持ち（ガウス積の定理により、異なる
中心の 2 つのガウス関数の積が 1 つのガウス関数になる）、*速い*のです。1 つのガウス関数は形が悪い — カスプがなく、
減衰が速すぎる — ので、いくつか貼り合わせて直します:

:::{prf:definition} 縮約ガウス基底関数
:label: def-cgto

**縮約ガウス型軌道（CGTO）**は、中心と角運動量を共有する**プリミティブ**ガウス関数の*固定された*線形結合です、

$$
\phi_\mu(\mathbf r) = \sum_{k=1}^{n_\mu} d_{k\mu}\; g_k(\mathbf r),
\qquad
g_k(\mathbf r) \propto x^{a} y^{b} z^{c}\, e^{-\alpha_k r^2},
$$

**縮約係数** $d_{k\mu}$ と**指数** $\alpha_k$ は基底設計者が固定します。複数のプリミティブが組み合わさって
カスプに近い Slater の形を模し、一方 SCF が変えるのは縮約関数ごとに*ただ 1 つ*の係数 $C_{\mu i}$ だけ — だから
CGTO はガウスの速さで STO に近い精度を与えます。
:::

### プリミティブ正規化

縮約係数 $d_{k\mu}$ が基底表の意図どおりの意味を持つ前に、各プリミティブ $g_k$ 自身が正規化されて
いなければなりません:$\langle g_k|g_k\rangle=1$。角運動量 $l$、指数 $\alpha$ のプリミティブについて、この
ガウス積分を実行すると

$$
N(l,\alpha) = \left(\frac{2}{\pi}\right)^{3/4} 2^{\,l}\, \alpha^{(2l+3)/4} \Big/ \sqrt{(2l-1)!!}\,,
$$

ここで $(2l-1)!! = 1\cdot 3\cdot 5\cdots(2l-1)$ は二重階乗（$l=0$ では $(-1)!!:=1$ とし、$s$ プリミティブ
では $N(0,\alpha)=(2/\pi)^{3/4}\alpha^{3/4}$）。qc-rs は基底が解析されるとき（`qc-mol`）に $N(l,\alpha)$ を
一度適用し、生の文献係数と、この正規化済みの係数集合を**両方**並べて保持します — 自分で正規化ルーチンを
呼ぶことは決してなく、上の縮約和は常に正規化済みの集合で取られます。

## 基底関数系の構造

基底は層を積み上げて作られ、名前がどの層を含むかを符号化しています:

- **最小基底**（例 **STO-3G** — 関数ごとに 3 つのガウスを縮約）:占有原子軌道ごとにちょうど 1 関数。安価で定性的、
  定量にはまれにしか使えません。
- **原子価分割**（Pople **6-31G** 系列）:化学的に活発な*原子価*軌道に**2 つ以上**の関数（きつい「内側」+ ゆるい
  「外側」）を与えるので、結合が伸縮できます。内殻は最小のまま。
- **分極関数**（`6-31G*` の `*`/`**`、または cc-p 系の組み込みの `d`,`f`,…）:結合形成時に軌道が**中心からずれて
  歪む**のを許す、高角運動量の関数（重原子には $d$、H には $p$）。本当の精度にはほぼ必須です。
- **拡散関数**（`6-31+G` の `+`/`++`、または `aug-` 接頭辞）:核から遠くまで届く電子密度のための、広くゆっくり減衰
  する関数 — **陰イオン・孤立電子対・励起状態・弱い分子間相互作用**。密度が拡散的なときに加え、そうでなければ省き
  ます（収束を遅くしうる）。

### qc-rs が同梱する系列

qc-rs は編集可能な Python データファイルとして **229 の名前付き基底**を同梱しています。最もよく使う 3 系列:

| 系列 | 例 | 特徴 |
|---|---|---|
| **Pople** | `3-21g`, `6-31g`, `6-31g*`, `6-31+g**`, `6-311g**` | 原子価分割、コンパクト、広く表化 |
| **Dunning（相関無矛盾）** | `cc-pvdz`, `cc-pvtz`, `cc-pvqz`, `aug-cc-pvdz` | 完全基底極限へ**系統的に収束**;相関法の標準 |
| **Karlsruhe def2** | `def2-svp`, `def2-tzvp`, `def2-qzvp` | 精度/コストのバランス;重元素（Rb 以降）に**組み込み ECP** |

Python から一覧できます:

```python
from qc import basis
print(len(basis.baslib_filename))              # 229
print("cc-pvtz" in basis.baslib_filename)      # True
print(sorted(n for n in basis.baslib_filename if n.startswith("def2")))
```

## 使い方:`ao=` で基底を選ぶ

よくあるのは、全原子に単一の名前を適用する場合です:

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

mychk = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom")
```

### 原子ごとに異なる基底

**辞書**を渡すと、元素 — または個別のラベル付き原子 — に独自の基底を与えられます。重要な場所にだけ大きな基底を
置く（例:反応する原子に大きな基底、傍観者に小さな基底）方法です:

```python
# 酸素には水素より大きな基底
mychk = qc.chk.new(atom=water, ao={"O": "cc-pvtz", "H": "cc-pvdz"}, unit="angstrom")
```

引き当ては**原子ラベル → 基底元素 → 元素記号**の順なので、ラベル付き原子（`C1`）やゴースト（`H-Bq` は `H` を継承）
は期待どおりに解決されます — [分子の入力](molecular-input.md) 参照。

### 大きな基底 → 低いエネルギー（そして高コスト）

Hartree–Fock は**変分的**（[Part II](../10-foundations/hartree-fock.md)）なので、基底を大きくするとエネルギーは
*下がる*（または保たれる）だけで、悪化しません。上の構造での水（RHF）を系列ごとに、基底関数数 $K$ とともに示します:

| `ao=` | 層 | $K$（spherical） | $E$(RHF) / $E_h$ |
|---|---|---|---|
| `sto-3g` | 最小 | 7 | −74.962947 |
| `6-31g` | 原子価分割 | 13 | −75.983993 |
| `6-31g*` | + 分極 | 18 | −76.009128 |
| `cc-pvdz` | 2ζ + 分極 | 24 | −76.026794 |
| `cc-pvtz` | 3ζ + 分極 | 58 | −76.057161 |

エネルギーは着実に下がり、$K$ — したがってコスト — は上がります。これは **Hartree–Fock の完全基底極限**へ収束
しますが、*厳密なエネルギーではありません*:基底は HF をどれだけ良く解くかを制御し、欠けている**相関**は基底では
なく*手法*（DFT やポスト HF）の問題です。よくある実用的妥協は、分極つき 2ζ または 3ζ 基底です（手早くは
`cc-pvdz`/`def2-svp`、本番は `cc-pvtz`/`def2-tzvp`）。

## AO 表現:spherical と Cartesian

もう 1 つの、より微妙な選択があります:各殻の角度部分をどう表現するか。**`ao_rep=`** で設定します（既定
`"spherical"`;別名 `"sph"`/`"cart"`）。

Cartesian の $d$ 殻は**6 つ**の成分 $\{x^2, y^2, z^2, xy, xz, yz\}$ を持ちますが、1 つの組み合わせ
（$x^2+y^2+z^2$）は球対称 — 実は $s$ 関数です。**spherical**（純粋）表現はこれを落とし、**5 つ**の真の $l=2$ 実立体
調和関数を保ちます。だから spherical 殻は $2l+1$ 関数、Cartesian 殻は $(l+1)(l+2)/2$ 関数 — $s$ と $p$ では等しく、
$d$ では $5$ 対 $6$、$f$ では $7$ 対 $10$、と続きます。

```python
sph  = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom", ao_rep="spherical")  # 既定
cart = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom", ao_rep="cartesian")
# 水/cc-pvdz は O に d 殻が 1 つ:spherical K = 24、Cartesian K = 25
```

**既定の spherical 表現を推奨**します — 現代の標準で、冗長な関数がなく、実運用ワークフローが期待するものです。
`ao_rep="cartesian"` は、Cartesian 関数を使ったプログラムや参照に合わせるときだけ使います。qc-rs は選択を
チェックポイントに正規化して保存します（別名 `"sph"`/`"cart"` は `"spherical"`/`"cartesian"` に正規化）。

:::{tip} 基底サイズを確認する
基底関数数 $K$ は重なり行列の次元です。積分を材料化した後、`np.asarray(mychk.ints().run().overlap).shape` は
`(K, K)` です。$K$ に注意 — 実行時間はこれに対して急に増えます。
:::

## カスタム基底・重元素の基底

- **カスタム / 編集した基底。** データファイルは素の Python なので、`qc.basis.nwchem_format(...)` を `ao=` 辞書に
  インラインで渡して 1 元素に完全なカスタム基底を与える（[分子の入力](molecular-input.md) に例）か、同梱の `.py`
  ファイルを編集/追加できます。NWChem テキスト形式と完全な編集手順はリファレンス章
  [同梱基底一覧](../40-reference/basis-list.md) と `docs/qc-basis.md` にあります。
- **重元素（ECP）。** 重原子では、**有効内殻ポテンシャル（ECP）**が化学的に不活性な内殻電子を置き換え、コストを
  削減しスカラー相対論効果を折り込みます。`def2` 系や相関無矛盾の `-pp` 系（例 `cc-pvdz-pp`）は ECP を**インライン**
  で持つので、重原子への `qc.chk.new(ao="def2-svp")` は自動的に価電子のみで走ります — 追加引数は不要です。ECP の
  機構は、それが使われる SCF・重元素の手引きで扱います。

## 総合例と演習

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

# 手早く見るなら 2ζ、より良いエネルギーなら 3ζ
for name in ("cc-pvdz", "cc-pvtz"):
    chk = qc.chk.new(atom=water, ao=name, unit="angstrom").scf(ref="r").run()
    print(f"{name:8}  E(RHF) = {chk.scf.energy:.6f}")
# cc-pvdz   E(RHF) = -76.026794
# cc-pvtz   E(RHF) = -76.057161
```

:::{exercise}
:label: ex-basis

1. 水について、`6-31g*` と `6-31+g*` のどちらが低い RHF エネルギーを与えるか、その理由とともに予想し、確認しなさい。
2. 水/`cc-pvdz` は spherical で $K=24$ 基底関数です。**Cartesian** ならいくつになりますか？（ヒント:違うのは酸素の
   $d$ 殻だけ。）
3. 水酸化物イオン OH⁻ を研究しています。構造リストのどの*層*の関数を加えるのが最も重要で、どの基底名がそれを与え
   ますか。
:::

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

1. `6-31+g*` が低い（または等しい）:**拡散**関数（`+`）を加えて変分空間を広げ、HF は変分的なので関数が増えても
   エネルギーは上がりません。拡散関数は特に密度が広がる場面で効きます。
2. **25**。O の $d$ 殻 1 つは spherical で $5$、Cartesian で $6$ なので $24 - 5 + 6 = 25$（上の
   `ao_rep="cartesian"` と一致）。
3. **拡散**関数 — 陰イオンの余分な電子は空間的に広い軌道を占め、コンパクトな基底ではうまく記述できません。
   `aug-cc-pvdz`（または Pople の `6-31+g*`）のような増補系を使います。
:::

分子と基底が揃ったら、次の問いは SCF が**どこから始まるか** — 初期推定です。それが [次章](initial-guess.md) です。
