基底関数と AO 表現#

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

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

Part IILCAO の考えを思い出しましょう:各分子軌道は、固定 された原子中心の基底関数 \(\{\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 つのガウス関数は形が悪い — カスプがなく、 減衰が速すぎる — ので、いくつか貼り合わせて直します:

定義 4 (縮約ガウス基底関数)

縮約ガウス型軌道(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 に近い精度を与えます。

qc-rs は生の係数とプリミティブ正規化済みの係数の両方を保持し、標準的なガウス正規化を代わりに適用します (qc-mol が担当);基底を手で正規化することは決してありません。

基底関数系の構造#

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

  • 最小基底(例 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 から一覧できます:

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= で基底を選ぶ#

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

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")

原子ごとに異なる基底#

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

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

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

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

Hartree–Fock は変分的Part II)なので、基底を大きくするとエネルギーは 下がる(または保たれる)だけで、悪化しません。上の構造での水(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\)、と続きます。

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 元素に完全なカスタム基底を与える(分子の入力 に例)か、同梱の .py ファイルを編集/追加できます。NWChem テキスト形式と完全な編集手順はリファレンス章 同梱基底一覧docs/qc-basis.md にあります。

  • 重元素(ECP)。 重原子では、有効内殻ポテンシャル(ECP)が化学的に不活性な内殻電子を置き換え、コストを 削減しスカラー相対論効果を折り込みます。def2 系や相関無矛盾の -pp 系(例 cc-pvdz-pp)は ECP をインライン で持つので、重原子への qc.chk.new(ao="def2-svp") は自動的に価電子のみで走ります — 追加引数は不要です。ECP の 機構は、それが使われる SCF・重元素の手引きで扱います。

総合例と演習#

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

練習 2

  1. 水について、6-31g*6-31+g* のどちらが低い RHF エネルギーを与えるか、その理由とともに予想し、確認しなさい。

  2. 水/cc-pvdz は spherical で \(K=24\) 基底関数です。Cartesian ならいくつになりますか?(ヒント:違うのは酸素の \(d\) 殻だけ。)

  3. 水酸化物イオン OH⁻ を研究しています。構造リストのどのの関数を加えるのが最も重要で、どの基底名がそれを与え ますか。

分子と基底が揃ったら、次の問いは SCF がどこから始まるか — 初期推定です。それが 次章 です。