# 同梱基底関数一覧

qc-rs は `python/qc/basis/` 下に編集可能な Python データファイルとして **229 の名前付き基底**を同梱しています。
[基底の章](../20-guide/basis-and-ao.md) がチュートリアルで、本ページは同梱データの**一覧・読み込み・カスタマイズ**
のリファレンスです。

## 利用可能なものの一覧

名前は `qc.basis.baslib_filename`（`name → module_stem` の辞書）にあります:

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

これらの名前はいずれも `qc.chk.new(...)` の有効な `ao=`（や `rijk=`/`ric=`）の値です。主な系列:

| 系列 | 例 | 注記 |
|---|---|---|
| Pople | `3-21g`, `6-31g`, `6-31g*`, `6-31+g**`, `6-311g**`, `6-311++g**` | 原子価分割 |
| Dunning cc | `cc-pvdz`, `cc-pvtz`, `cc-pvqz`, `aug-cc-pvdz`, `cc-pvdz-pp` | 相関無矛盾;`-pp` は ECP を持つ |
| Karlsruhe def2 | `def2-svp`, `def2-tzvp`, `def2-qzvp`, `def2-tzvpd` | 重元素（Rb 以降）に組み込み ECP |
| 補助 | `cc-pvdz-jkfit`, `cc-pvdz-ri/mp2fit`, `def2-universal/jkfit` | RI フィッティング集合（`rijk=`/`ric=`） |

## データファイル

各ファイル（`_00*` ユーティリティを除く）は**基底データファイル**で、元素ごとに 1 つのモジュール変数（記号に
ちなむ — `H`, `He`, `Li`, …）を `nwchem_format(...)` オブジェクトとして定義します:

```python
import importlib
cc_pvdz = importlib.import_module("qc.basis.cc_pvdz")
h = cc_pvdz.H
h.description     # "cc-pvdz:H"
h.inpdata         # NWChem 形式の軌道殻テキスト
h.ecp             # None（または ECP テキスト、*-pp / def2 重元素用）
```

### `nwchem_format` オブジェクト

```python
class nwchem_format:
    inpdata      # str: NWChem 軌道基底テキスト（1 元素）
    description  # str または None: 人が読めるラベル
    ecp          # str または None: NWChem ECP テキスト（全電子は None）
```

`inpdata` は `qc.chk.new(ao=...)` 呼び出し時に Rust の `qc_mol::nwchem::parse()` で解析されます。

### NWChem テキスト形式

```text
SYMBOL  SHELL_TYPE
  exponent  coeff1  coeff2  ...
  exponent  coeff1  coeff2  ...
```

- `SHELL_TYPE`:`S`, `P`, `D`, `F`, `G`, `H`, `I`, `K`、または `SP`（S と P に自動分割）。
- 複数の係数列 → 一般縮約殻。

```text
H    S
     13.0100000   0.0196850
      1.9620000   0.1379770
      0.4446000   0.4781480
H    S
      0.1220000   1.0000000
H    P
      0.7270000   1.0000000
```

プリミティブ正規化を手で適用**しない**でください — `qc-mol` が生の係数から一度だけ行います。

## カスタム基底を使う

### 元素ごとにインライン

`nwchem_format` オブジェクトを作り、`ao=` に（辞書の値として）渡します:

```python
from qc.basis import nwchem_format
import qc

myN = nwchem_format("""
N S
  242.766  0.0598657
   36.485  0.352955
    7.814  0.706513
N P
    5.425  0.237972
    1.149  0.858953
""", description="custom:N")

m = qc.chk.new(atom="N 0 0 0; N 0 0 1.1", ao={"N": myN}, unit="angstrom")
```

### 同梱集合の編集・追加

ファイルは素の Python なので、元素のブロックをその場で編集したり、新しい `<name>.py` データファイルを追加して
`baslib_filename` に登録したりできます。編集後は拡張を**再ビルド**（`make install` / `maturin develop`）して
変更を反映させます。完全な編集/追加手順:`docs/qc-basis.md`。

## ECP を持つ基底

相関無矛盾の `-pp` 系と **def2** 系は、有効内殻ポテンシャルを**インライン**（`ecp` フィールド）で持ちます。
だから重原子への `qc.chk.new(ao="def2-svp")` は自動的に価電子のみで走ります — 別途 `ecp=` 引数なし — PySCF の
`basis="def2-svp", ecp="def2-svp"` に一致します。def2 の JK-fit 補助は汎用の `def2-universal/jkfit` です。
