付録B計算環境の準備とPySCF入門
本書の第6章以降では,手計算で追った理論を実際に計算機で確かめる.そこで使うのが PySCF(Python-based Simulations of Chemistry Framework)というPythonモジュールと,pymatgen(Python Materials Genomics)という材料科学向けモジュールである.どちらも無償で,ノートPC1台あれば動く.
ただ,多くの学生がつまずくのは理論ではなく環境構築である.「pythonがどこにあるか分からない」「pip install したのにモジュールが見つからない」「ファイルの場所を指定できない」——これらはすべて,ターミナルとパスの概念を知らないことから来ている.本付録では,そこを最初に押さえてから,PySCFの使い方に進む.
- ディレクトリ・パス・コマンド・シェル・環境変数という5つの言葉の意味
- ターミナルで最低限使うUNIXコマンド(
pwd,cd,ls,mkdir,cp,rm,cat,grep,awk,sed) - Python環境の用意(ローカルのAnaconda/miniconda,あるいはGoogle Colab)
- PySCFとpymatgenのインストールと動作確認
- xyzファイル・POSCARファイルの書式
- 本書で使う6つの計算スクリプトの使い方とオプション一覧
- forループによる系統計算と,
grep/awkによる結果の抽出・プロット - VESTAによる分子構造・波動関数の可視化
B.1 まず覚える5つの言葉
定義:計算機を使うための最小語彙
- ディレクトリ(directory):ファイルを入れる箱.WindowsやmacOSの画面で「フォルダ」と呼ばれているものと同じ.
- パス(path):ファイルやディレクトリの住所.
/Users/ymochizuki/Downloads/XYZ_H.xyzのように書く.先頭が/(ルート)から始まるものを絶対パス,いま自分がいる場所からの相対的な位置を書いたものを相対パスという. - コマンド(command):ターミナルに打ち込む命令.Enterキーで実行される.
- シェル(shell):人間の書いたコマンドを機械語に翻訳してくれる「殻」.
bashとzshが主流で,macOSの既定はzsh,Windows上のUbuntuではbashが既定である.echo $SHELLで確認できる. - 環境変数(environment variable):シェルの動作を決める変数.
$SHELLや$PATHがその例.表示するときは頭にドル記号を付ける.
なぜ?:なぜマウスではなくコマンドを使うのか
コンピュータとの対話には2種類ある.マウスで画面上のアイコンを操作する GUI(Graphical User Interface)と,文字でコマンドを打ち込む CLI(Command Line Interface)である.
研究でCLIを使う理由は,同じ作業を大量に,正確に,記録を残しながら繰り返せるからである.たとえば第8章では $\mathrm{O_2}$ の結合長を 0.9 Å から 2.0 Å まで 12 通り変えて全エネルギーを計算する.GUIで12回クリックして回すこともできるが,結合長を 0.01 Å 刻みにしたら110回になる.CLIならforループを3行書くだけで,しかもあとから「何をやったか」がコマンドの履歴として残る.再現性が命の研究では,これは決定的な差になる.
~ と略記できる.B.2 ターミナルとUNIXコマンド
macOSなら「ターミナル」アプリ,WindowsならWSL(Windows Subsystem for Linux)上のUbuntuを起動する.黒い画面に文字を打ち込む,あの画面である.
B.2.1 移動と一覧
$ pwd # いまいる場所を表示 (print working directory)
/Users/ymochizuki
$ ls # この場所にあるファイルを一覧 (list segments)
Desktop Documents Downloads
$ ls -a # 隠しファイルも含めて全部表示
$ ls -l # 詳細(サイズ・更新日時)つきで表示
$ mkdir 2026_comp_mat_sci # ディレクトリを作る (make directory)
$ cd 2026_comp_mat_sci # 移動する (change directory)
$ pwd
/Users/ymochizuki/2026_comp_mat_sci
$ cd .. # 1つ上の階層へ戻る
$ cd ~ # ホームディレクトリへ戻る(cd だけでも同じ)
コードB.1 移動と一覧の基本コマンド.$ はプロンプトなので入力しない.
数学ノートではなく「操作のノート」:ドットの意味
パスの中に現れる記号の意味を整理しておく.
.(ドット1つ):いま自分がいる場所..(ドット2つ):1つ上の階層~(チルダ):ホームディレクトリ/(先頭のスラッシュ):ルート(最上位)*(アスタリスク):任意の文字列にマッチするワイルドカード.output_*はoutput_で始まる全ファイル.
たとえば cp ~/Downloads/XYZ_CH4.xyz . は「ホームのDownloadsにある XYZ_CH4.xyz を,いまいる場所にコピーせよ」という意味になる.
B.2.2 コピー・削除・表示
$ cp XYZ_H.xyz XYZ_H_backup.xyz # ファイルをコピー (copy)
$ cp ~/Downloads/XYZ_CH4.xyz . # 別の場所から今いる場所へコピー
$ cp -r pyscf_tutorial1 backup/ # ディレクトリごとコピー (recursive)
$ mv old.xyz new.xyz # 名前の変更/移動 (move)
$ rm XYZ_H_backup.xyz # ファイルを削除 (remove)
$ rm -r backup # ディレクトリごと削除
$ cat XYZ_H2O.xyz # ファイルの中身を表示 (concatenate)
3
962
O 6.30121 0.00000 -0.38499
H 7.63502 0.00000 0.38499
H 4.96764 0.00000 0.38499
$ head -20 output.txt # 先頭20行だけ表示
$ tail -20 output.txt # 末尾20行だけ表示
コードB.2 ファイル操作の基本コマンド.
注意:rm にごみ箱はない
GUIでファイルを消すとごみ箱に入り,あとから戻せる.しかしターミナルの rm は即座に完全に消す.とくに rm -r はディレクトリごと消えるので,実行前に必ず pwd と ls で「いまどこにいて,何を消そうとしているのか」を確認する習慣をつけてほしい.研究データを一瞬で失う事故は,たいていこのコマンドで起きる.
B.2.3 文字列の置換・検索・切り出し
第8章で $\mathrm{O_2}$ の結合長を系統的に変えるときに使う3つのコマンドである.
# sed: 文字列を置換して別ファイルに保存する
$ sed -e 's/1.20000/2.00000/g' XYZ_O2_1p20000.xyz > XYZ_O2_2p00000.xyz
# grep: 特定の文字列を含む行だけ抜き出す
$ grep "Total Energy" output_1p20000.txt
Total Energy (eV) : -4069.348
# 複数ファイルをまとめて検索(ワイルドカード)
$ grep "Total Energy" output_*.txt
# awk: 空白区切りの n 列目だけ取り出す
$ grep "Total Energy" output_*.txt | awk '{print $NF}'
-4069.348
-4061.466
...
コードB.3 sed/grep/awk.縦棒 | は「パイプ」で,左のコマンドの出力を右のコマンドの入力に渡す.
awk の $1, $2, … は空白区切りの列番号,$NF は最後の列を意味する.出力の書式に応じて列番号を数え,必要な数字だけを取り出す.
B.3 Python環境を用意する
Pythonを動かす方法は大きく2つある.
| ローカル環境(Anaconda/miniconda) | Google Colab | |
|---|---|---|
| 準備 | インストールが必要(30分〜数時間) | Googleアカウントだけ.ブラウザで即開始 |
| 計算速度 | 自分のPCの性能次第 | 無料枠でもそこそこ速い |
| ファイルの保存 | PCに永続的に残る | 12時間放置すると消える(Google Driveに置けば残る) |
| UNIXコマンド | そのまま使える | 先頭に ! が必要(cd だけは %) |
| 向いている人 | 本格的に研究で使いたい | まず動かしてみたい・環境構築で詰まった |
B.3.1 ローカル環境
「windows anaconda install」「mac anaconda install」などで検索し,案内に従ってインストールする.インストール後,ターミナルで次を確認する.
$ which python3 # python本体がどこにあるか
/Users/ymochizuki/anaconda3/bin/python3
$ python3 --version
Python 3.11.5
$ echo $SHELL # シェルの種類
/bin/zsh
$ pip3 list | grep pyscf # PySCFが入っているか
コードB.4 環境の確認.which が何も返さなければ,まだPythonにパスが通っていない.
B.3.2 必要なモジュールのインストール
$ pip3 install pyscf
$ pip3 install numpy matplotlib
$ pip3 install pymatgen # 第13章で使う
$ pip3 install geometric # 構造最適化に使われることがある
コードB.5 モジュールのインストール.
Jupyter Notebook(拡張子 .ipynb)を開くには,Visual Studio Code をインストールしてPython拡張機能を入れるのが手軽である.講義配布の pyscf_tutorial1.ipynb などはこの形式になっている.
B.4 Google Colabを使う
環境構築で詰まったら,迷わずGoogle Colabに切り替えてよい.https://colab.research.google.com/ にアクセスし,「ノートブックを新規作成」をクリックするだけで,ブラウザ上にJupyter Notebookが立ち上がる.ファイル名は 2026_マテリアル計算科学.ipynb のように分かりやすく変えておくとよい.
注意:ColabはPythonであってLinuxではない
Colabのセルに書くのはPythonのコードである.echo や ls はLinuxのコマンドなので,そのまま書くとエラーになる.Notebook上でLinuxコマンドを使いたいときは先頭に ! を付ける.ただし cd だけは例外で % を付ける(!cd だとそのセルの中でしか移動が有効にならないため).
# Colabのセルに書く内容
!pwd
!ls
!pip install pyscf
%cd /content/drive/MyDrive/pyscf_tutorial1
!python3 calc_pyscf.py --xyz XYZ_H.xyz --spin 1
B.4.1 Google Driveと接続する
Colabの作業領域(/content)は,12時間以上放置すると中身がすべて消える.作ったファイルを残すには,自分のGoogle Driveをマウント(接続)しておく.
# Colabのセルで実行
from google.colab import drive
drive.mount('/content/drive')
コードB.6 Google Driveのマウント.認証画面が出るので許可する.
マウントすると /content/drive/MyDrive/ が自分のDriveのルートになる.講義配布の pyscf_tutorial1.zip は必ず解凍してからDriveに置くこと(zipのまま置くと中のファイルにアクセスできない).
# 12時間放置して環境がリセットされたら,これを順に実行し直すだけでよい
from google.colab import drive
drive.mount('/content/drive')
!pip install pyscf
%cd /content/drive/MyDrive/pyscf_tutorial1
!python3 calc_pyscf.py --xyz XYZ_Be.xyz --spin 0 --basis 6-31g
コードB.7 セッションが切れたあとの復帰手順.
使い終わったらマウントを外しておくとよい.
drive.flush_and_unmount()
コードB.8 マウントの解除.
B.5 PySCFのインストールと最初の計算
準備ができたら,講義配布の pyscf_tutorial1 ディレクトリに移動して,水素原子を計算してみよう.
$ cd ~/Downloads/pyscf_tutorial1
$ ls
XYZ_B.xyz XYZ_Be.xyz XYZ_CH4.xyz XYZ_F.xyz XYZ_H.xyz XYZ_He.xyz
XYZ_Li.xyz XYZ_N.xyz XYZ_Ne.xyz XYZ_O.xyz XYZ_O2.xyz calc_pyscf.py
$ python3 calc_pyscf.py --xyz XYZ_H.xyz --spin 1
コードB.9 水素原子の計算.--spin 1 は「アップスピンとダウンスピンの数の差が1」という意味.
出力には,計算手法(Method : UHF),全エネルギー(Total Energy),分子軌道エネルギー(MO energies)と占有数が並ぶ.STO-3G基底での水素原子の全エネルギーは $-12.696$ eV で,厳密解 $-13.606$ eV に対して 6.7% の誤差である(第6章6.7節).
注意:--spin は $2S$ であって電子数ではない
PySCFの --spin はスピン多重度 $2S+1$ でもなく,電子数でもなく,$2S$(=アップスピンとダウンスピンの電子数の差)である.
- H 原子(電子1個):$2S=1$ →
--spin 1 - He 原子(閉殻):$2S=0$ →
--spin 0 - $\mathrm{O_2}$(三重項,基底状態):$2S=2$ →
--spin 2 - C 原子($2p^2$,$^3P$):$2S=2$ →
--spin 2
ここを間違えると,計算そのものは走るのに答えが物理的に意味のないものになる.エネルギーが実験値と大きくずれたら,まず --spin を疑うとよい.
B.6 構造ファイルの書式
B.6.1 xyzファイル(分子)
分子の構造を書く最も単純な形式である.
3
962
O 6.30121 0.00000 -0.38499
H 7.63502 0.00000 0.38499
H 4.96764 0.00000 0.38499
コードB.10 XYZ_H2O.xyz.1行目が原子数,2行目はコメント(何を書いてもよい),3行目以降が「元素記号 x y z」.座標の単位はÅ.
B.6.2 SDFファイルからの変換
PubChem(https://pubchem.ncbi.nlm.nih.gov/)で分子名や組成式を検索し,「3D Conformer」の Download Coordinates から SDF 形式で保存できる.ファイル名は SDF_D-glucose.sdf のように「何の分子か」が分かる形に変えておくと,あとで ls したときに一目で分かる.
$ python3 sdf2xyz.py --sdf SDF_D-glucose.sdf --xyz XYZ_D-glucose.xyz
$ head -3 XYZ_D-glucose.xyz
24
converted from SDF_D-glucose.sdf
C -0.7810 1.2680 0.4980
コードB.11 SDF → xyz の変換.--xyz を省略すると既定の名前で出力される.
B.6.3 POSCARファイル(結晶)
第13章のpymatgenでは,結晶構造をVASPのPOSCAR形式で与える.Materials Project(https://next-gen.materialsproject.org/)から無償でダウンロードできる.
Na4 Cl4
1.0
5.6920 0.0000 0.0000
0.0000 5.6920 0.0000
0.0000 0.0000 5.6920
Na Cl
4 4
Direct
0.000 0.000 0.000
0.000 0.500 0.500
...
コードB.12 POSCARの構造.1行目はコメント,2行目はスケール因子,3〜5行目が格子ベクトル,6行目が元素,7行目が各元素の原子数,8行目が座標系(Direct=分率座標),以降が原子座標.
B.7 計算スクリプト一覧とオプション
講義で配布されるスクリプトは6つある.いずれも --help を付けると使い方が表示される.
$ python3 calc_pyscf_dos.py --help
コードB.13 困ったらまず --help.
| スクリプト | 何をするか | 対応する章 |
|---|---|---|
calc_pyscf.py | 1点計算(全エネルギー・分子軌道エネルギー) | 第6章・第7章・第9章 |
calc_pyscf_relax.py | 構造最適化(構造緩和) | 第8章・第10章 |
calc_pyscf_dos.py | 状態密度(DOS/PDOS),COOP/COHP | 第10章 |
calc_pyscf_wf.py | 分子軌道の波動関数をcubeファイルに出力 | 第10章 |
calc_pyscf_vib.py | 振動数(振動準位)の計算 | 第10章 |
sdf2xyz.py | SDF → xyz 変換 | 第10章 |
B.7.1 共通のオプション
| オプション | 意味 | 既定値 |
|---|---|---|
--xyz FILE | 入力構造ファイル(必須) | — |
--basis NAME | 基底関数(sto-3g, 3-21g, 6-31g, 6-31g*, 6-31+g など) | sto-3g |
--method NAME | SCF法(auto/rhf/uhf/rohf) | auto |
--theory NAME | 理論レベル(scf/dft/mp2/ccsd/ccsd_t) | scf |
--xc NAME | 交換相関汎関数(--theory dft のとき) | b3lyp |
--spin N | $2S$(アップとダウンの電子数の差) | 0 |
--charge N | 系全体の電荷 | 0 |
--unit NAME | 座標の単位(Angstrom/Bohr) | Angstrom |
B.7.2 calc_pyscf.py の固有オプション
| オプション | 意味 |
|---|---|
--decompose-total-energy | 全エネルギーを $T$(運動)/$V_{ne}$(核-電子)/$J$(Hartree項)/$K$(交換項)/$V_{nn}$(核-核)に分解して表示.第9章9.10節で使う |
--pes --rmin A --rmax B --npts N | 二原子分子のポテンシャルエネルギー曲線を一括で走査(距離の単位はBohr) |
--zpe | 調和近似で零点エネルギーを計算 |
--mom --promote-from i --promote-to j | MOM法による励起状態の$\Delta$SCF計算(UHFのみ) |
# 第9章:全エネルギーの内訳を見る
$ python3 calc_pyscf.py --xyz XYZ_He.xyz --spin 0 --basis 6-31g --decompose-total-energy
# 第6章:Li 原子を UHF と ROHF で比べる
$ python3 calc_pyscf.py --xyz XYZ_Li.xyz --spin 1
$ python3 calc_pyscf.py --xyz XYZ_Li.xyz --spin 1 --method rohf
# 第6章:電荷を変える(Li+)
$ python3 calc_pyscf.py --xyz XYZ_Li.xyz --spin 0 --charge 1
# 第7章:炭素原子の低スピンと高スピン
$ python3 calc_pyscf.py --xyz XYZ_C.xyz --spin 2 --basis 6-31g
$ python3 calc_pyscf.py --xyz XYZ_C.xyz --spin 4 --basis 6-31g
コードB.14 calc_pyscf.py の使用例.
B.7.3 構造最適化・DOS・波動関数・振動
# 第8章・第10章:構造緩和.XYZ_○○-finish.xyz が出力される
$ python3 calc_pyscf_relax.py --xyz XYZ_O2_0p900000.xyz --spin 2 --basis 6-31g
# 第10章:状態密度(元素・軌道分解つき,表示範囲を -30〜10 eV に)
$ python3 calc_pyscf_dos.py --xyz XYZ_D-glucose-finish.xyz --spin 0 \
--basis 6-31g --xrange -30 10 --element-pdos
# 第10章:COHP(結合の強さの解析)
$ python3 calc_pyscf_dos.py --xyz XYZ_CH4-finish.xyz --spin 0 --basis 6-31g \
--cohp --pair C,H
# 第10章:HOMO と LUMO を cube ファイルに出力
$ python3 calc_pyscf_wf.py --xyz XYZ_CH4-finish.xyz --spin 0 --basis 6-31g \
--homo --lumo
# 特定の分子軌道を指定して出力(0始まりの番号)
$ python3 calc_pyscf_wf.py --xyz XYZ_CH4-finish.xyz --spin 0 --basis 6-31g \
--mo 1 2 3 4 7
# 第10章:振動数の計算
$ python3 calc_pyscf_vib.py --xyz XYZ_H2O-finish.xyz --spin 0 --basis 6-31g
コードB.15 各スクリプトの代表的な使い方.行末の \ は「次の行に続く」という意味で,1行で書いてもよい.
calc_pyscf_dos.py には --sigma(Gauss広がりの幅,既定 0.3 eV),--csv/--txt/--output(数値データや図の保存先)といったオプションもある.calc_pyscf_wf.py は --nx --ny --nz でcubeファイルの格子点数,--margin で箱の余白(Bohr単位)を調整できる.
B.8 forループによる系統計算と結果の抽出
第8章で行う「$\mathrm{O_2}$ の結合長を変えて全エネルギーを計算する」という作業を,最初から最後まで通してみよう.手作業なら数十回の繰り返しになるが,ターミナルなら数行で済む.
B.8.1 構造ファイルを量産する
# 元になるファイル(結合長 1.20000 Å)
$ cat XYZ_O2_1p20000.xyz
2
O2 molecule
O 0.00000 0.00000 0.00000
O 0.00000 0.00000 1.20000
# 0.90 Å から 1.90 Å まで 0.10 Å 刻みで構造ファイルを作る
$ for d in 0p90000 1p00000 1p10000 1p20000 1p30000 1p40000 1p50000 \
1p60000 1p70000 1p80000 1p90000
do
r=$(echo $d | sed -e 's/p/./')
sed -e "s/1.20000/$r/" XYZ_O2_1p20000.xyz > XYZ_O2_${d}.xyz
done
$ ls XYZ_O2_*.xyz
XYZ_O2_0p90000.xyz XYZ_O2_1p00000.xyz ... XYZ_O2_1p90000.xyz
コードB.16 sed と for ループによる構造ファイルの量産.ドル記号は変数を意味する.ファイル名にピリオドを使うと紛らわしいので p で代用している.
B.8.2 まとめて計算する
$ for f in XYZ_O2_*.xyz
do
tag=$(basename $f .xyz)
python3 calc_pyscf.py --xyz $f --spin 2 --basis 6-31g > output_${tag}.txt
done
コードB.17 全ファイルを順に計算し,結果をテキストファイルに保存する.> は「出力をファイルに書き出す」という意味(リダイレクト).
B.8.3 結果を抜き出してプロットする
# 全エネルギーの行だけ抜き出す
$ grep "Total Energy" output_*.txt
# 数値だけ取り出す
$ grep "Total Energy" output_*.txt | awk '{print $NF}'
# 1列目に結合長,2列目に全エネルギーを並べたファイルを作る
$ for f in output_XYZ_O2_*.txt
do
d=$(echo $f | sed -e 's/.*O2_//' -e 's/.txt//' -e 's/p/./')
e=$(grep "Total Energy" $f | awk '{print $NF}')
echo "$d $e"
done > energy_vs_distance.dat
$ cat energy_vs_distance.dat
0.90000 -4060.401
1.00000 -4066.xxx
...
1.20000 -4069.348
...
2.00000 -4061.466
コードB.18 結果を2列のデータファイルにまとめる.
# plot_energy.py
import numpy as np
import matplotlib.pyplot as plt
d, e = np.loadtxt("energy_vs_distance.dat", unpack=True)
plt.figure(figsize=(5, 4))
plt.plot(d, e, "o-", color="#14684a")
plt.xlabel(r"Bond length $R$ (Å)", fontsize=13)
plt.ylabel("Total energy (eV)", fontsize=13)
plt.grid(alpha=0.4)
plt.tight_layout()
plt.savefig("O2_potential_curve.png", dpi=200)
plt.show()
コードB.19 matplotlibによるプロット.教科書に出てくる原子間ポテンシャル曲線がそのまま得られる.
なぜ?:この一連の流れが「計算科学」そのもの
いま行ったのは,(1) 入力を系統的に作る,(2) まとめて計算する,(3) 出力から必要な数値だけ抜き出す,(4) 図にして物理を読み取る,という4段階である.扱う対象が分子でも固体でも,手法が量子化学計算でも分子動力学でも,この4段階の構造は変わらない.個々のソフトウェアの使い方より,この流れを自分の手で回せることのほうがずっと重要である.
B.9 VESTAによる可視化
VESTA(https://jp-minerals.org/vesta/)は,結晶構造・分子構造・波動関数を可視化する無償ソフトウェアである.日本で開発され,世界中の第一原理計算ユーザーが使っている.
| 拡張子 | 内容 | 本書での用途 |
|---|---|---|
.xyz | 分子構造 | 構造の確認,結合長・結合角の測定 |
POSCAR | 結晶構造(VASP形式) | 第13章のイオン結晶 |
.cube | 3次元スカラー場(波動関数・電子密度) | 第10章のHOMO/LUMO可視化 |
使い方の要点をまとめる.
- ドラッグで回転,ホイールで拡大縮小.
- 2つの原子を続けてクリックすると結合長,3つ続けてクリックすると結合角が下部に表示される.実験値と比べるときに使う.
- cubeファイルを開くと等値面が表示される.黄色が波動関数の正の領域,青色が負の領域である.等値面の値は Properties → Isosurfaces で変えられる.
- 正と負の領域がどう並んでいるかを見れば,結合性軌道か反結合性軌道かが判定できる.原子間で同符号(節がない)なら結合性,異符号(節がある)なら反結合性である(第11章).
B.10 pymatgenとMadelungエネルギー
第13章では,イオン結晶の静電エネルギー(Madelungエネルギー)をpymatgenで計算する.pymatgenは,米国が2011年に始めた Materials Genome Initiative の中で開発されたPythonモジュールで,Materials Informatics(材料インフォマティクス)の事実上の標準になっている.
$ pip3 install pymatgen
$ cd ~/Downloads/pymatgen_tutorial
$ ls
POSCAR_NaCl_Fm-3m POSCAR_MgO_Fm-3m POSCAR_TiO2_P42mnm_rutile ...
calc_madelung_constant.py
$ python3 calc_madelung_constant.py POSCAR_NaCl_Fm-3m
コードB.20 NaClのMadelungエネルギーの計算.
出力には,セルあたり(Na 4個・Cl 4個)のMadelungエネルギーと,化学式単位(formula unit,Na 1個・Cl 1個)あたりのMadelungエネルギー,そしてMadelung定数が並ぶ.「セルあたり」と「化学式単位あたり」を取り違えると4倍ずれるので注意してほしい.
イオンの価数が自動推定でうまくいかないときは,明示的に指定できる.
# 価数を明示する
$ python3 calc_madelung_constant.py POSCAR_Mg2Si_Fm-3m --oxidation-state Mg=2 Si=-4
# 特定のカチオン・アニオン対を基準にMadelung定数を出す
$ python3 calc_madelung_constant.py POSCAR_NaCl_Fm-3m --reference-pair Na Cl
コードB.21 価数の指定と参照イオン対の指定.
スクリプトの中身は本質的に数行である.
from pymatgen.analysis.ewald import EwaldSummation
from pymatgen.io.vasp.inputs import Poscar
structure = Poscar.from_file("POSCAR_NaCl_Fm-3m").structure
structure.add_oxidation_state_by_guess()
ewald = EwaldSummation(structure)
print("Madelung energy (cell) :", ewald.total_energy, "eV")
コードB.22 pymatgenの中核部分.EwaldSummation がEwald法による静電エネルギーの計算を担う.
補足:なぜEwald法が必要か
第13章で見るように,Madelung定数を決める級数 $\sum_j \pm N_j/c_j$ は条件収束であり,足す順番によって答えが変わってしまう.素朴に近い順から足しても,なかなか収束しない.Ewald法は,この和を実空間の和と逆空間(フーリエ空間)の和に分割し,両方とも指数関数的に速く収束させる技法である.周期系の第一原理計算ではほぼ例外なく使われている.
B.11 よくあるエラーと対処
| 症状 | 原因 | 対処 |
|---|---|---|
command not found: python3 | Pythonにパスが通っていない | which python3 で確認.何も出なければインストールし直すか,Colabに切り替える |
ModuleNotFoundError: No module named 'pyscf' | モジュールが未インストール,または別のPython環境にインストールされている | pip3 install pyscf.Colabなら12時間で消えるので再実行 |
No such file or directory | ファイルの場所が違う | pwd と ls で現在地と中身を確認.絶対パスで指定し直すのが確実 |
| zipのまま置いてしまった | 解凍していない | 必ず解凍してからGoogle Driveに置く |
| SCFが収束しない | スピン多重度の指定ミス,初期構造が壊れている | --spin を見直す.VESTAで構造を目視確認する |
| エネルギーが実験値と大きくずれる | 基底関数が小さすぎる/スピン状態が違う | --basis 6-31g 以上を試す.--spin を変えて比較する |
| 構造緩和後のほうがエネルギーが高い | 基底関数が粗すぎる(第10章10.3節) | より大きな基底で再計算して確認する |
| 計算が終わらない | 原子数が多い/基底が大きい | まず小さな分子・小さな基底で試し,段階的に上げる |
心構え:エラーは失敗ではない
環境構築とデバッグに時間を取られると,「自分はプログラミングに向いていない」と思いがちである.しかし,研究の現場でも計算時間の相当部分はここに費やされている.エラーメッセージは何がどう間違っているかを教えてくれる情報であって,叱られているわけではない.読んで,検索して,それでも分からなければ生成AIに貼り付けて聞いてみるとよい.大事なのは,エラーが出たときに落ち着いて pwd と ls から確認し直す習慣である.
B.12 演習問題
演習B.1 環境の確認
自分のPC(またはColab)で次を実行し,結果を記録せよ.
(1) which python3,python3 --version,echo $SHELL
(2) 作業用ディレクトリ 2026_comp_mat_sci をホームに作り,その中に移動して pwd で確認する.
(3) PySCFをインストールし,pip3 list | grep pyscf でバージョンを確認する.
演習B.2 xyzファイルを自分で書く
$\mathrm{H_2}$ 分子のxyzファイルを,結合長 0.74 Å として自分の手で作成し,PySCFで全エネルギーを計算せよ.基底は sto-3g と 6-31g の両方で試し,値を比較せよ.
ヒント:1行目は原子数(2),2行目は任意のコメント,3〜4行目は「H 0 0 0」と「H 0 0 0.74」.閉殻なので --spin 0.基底を大きくすると全エネルギーは必ず下がる(変分原理,第3章)ことを確認せよ.
演習B.3 スピン状態の指定
酸素原子(XYZ_O.xyz)について,--spin 0, --spin 2, --spin 4 の3通りで全エネルギーを計算し,最も安定なものを答えよ.その結果はHundの規則(第7章・第9章)と整合しているか.
ヒント:酸素原子の電子配置は $1s^2 2s^2 2p^4$.$2p$ 軌道3本に4個の電子を入れるとき,Hundの規則からアップスピンが2個多くなる.
演習B.4 forループによる系統計算
$\mathrm{H_2}$ 分子の結合長を 0.5 Å から 2.5 Å まで 0.1 Å 刻みで変え,全エネルギーをプロットせよ.平衡結合長を読み取り,実験値 0.741 Å と比較せよ.また解離エネルギー(無限遠での2つのH原子のエネルギーの和と,平衡点でのエネルギーの差)を求め,実験値 4.75 eV と比較せよ.
ヒント:コードB.16〜B.19をそのまま流用できる.$\mathrm{H_2}$ は閉殻なので --spin 0.無限遠のエネルギーは,H原子1個の計算(--spin 1)を2倍すればよい.制限Hartree–Fock(RHF)では解離極限が正しく記述できないことが知られており,大きなずれが出るはずである.なぜそうなるかを第11章11.9節の議論と結びつけて考察してみよ.
演習B.5 好きな分子を1つ計算する
PubChemから好きな分子の構造をダウンロードし,次を順に実行して結果を考察せよ.
(1) SDF → xyz 変換 → VESTAで構造を確認
(2) calc_pyscf_relax.py で構造最適化し,緩和前後の全エネルギーを比較
(3) calc_pyscf_dos.py --element-pdos で状態密度を出し,HOMO付近がどの元素・どの軌道でできているかを述べる
(4) calc_pyscf_wf.py --homo --lumo で波動関数を出し,VESTAで可視化して結合性・反結合性を判定する
ヒント:原子数が多いと時間がかかるので,まずは20原子程度までの分子を選ぶとよい.ベンゼン $\mathrm{C_6H_6}$(12原子)や酢酸 $\mathrm{CH_3COOH}$(8原子)あたりが手頃である.
演習B.6 Madelung定数を比べる
pymatgen_tutorial にあるPOSCARのうち,POSCAR_NaCl_Fm-3m(岩塩型),POSCAR_CsCl_Pm-3m(塩化セシウム型),POSCAR_NaCl_F-43m(閃亜鉛鉱型),POSCAR_NaCl_P63mc(ウルツ鉱型)についてMadelung定数を計算し,第13章の表の値(1.7476, 1.7627, 1.6381, 1.6413)と比較せよ.
ヒント:同じ組成 NaCl でも構造が違えばMadelung定数が違うこと,そして配位数が大きいほどMadelung定数が大きくなる傾向があることを確認せよ.ただし実際にどの構造が安定になるかは,静電エネルギーだけでなくイオン半径比と斥力項でも決まる.
参考文献
- Q. Sun et al., "PySCF: the Python-based simulations of chemistry framework", WIREs Comput. Mol. Sci. 8, e1340 (2018). ——PySCFの原論文.
- Q. Sun et al., "Recent developments in the PySCF program package", J. Chem. Phys. 153, 024109 (2020).
- PySCF公式ドキュメント https://pyscf.org/
- S. P. Ong et al., "Python Materials Genomics (pymatgen): A robust, open-source python library for materials analysis", Comput. Mater. Sci. 68, 314 (2013). ——pymatgenの原論文.
- A. Jain et al., "Commentary: The Materials Project: A materials genome approach to accelerating materials innovation", APL Materials 1, 011002 (2013). ——Materials Projectの解説.
- K. Momma and F. Izumi, "VESTA 3 for three-dimensional visualization of crystal, volumetric and morphology data", J. Appl. Crystallogr. 44, 1272 (2011). ——VESTAの原論文.
- J. C. Kromann, J. H. Jensen et al., Molcalc — https://molcalc.org/ ——ブラウザだけで量子化学計算ができるWebアプリ.
- PubChem https://pubchem.ncbi.nlm.nih.gov/ ——分子構造のデータベース.
- Materials Project https://next-gen.materialsproject.org/ ——結晶構造と計算物性のデータベース.
- P. P. Ewald, "Die Berechnung optischer und elektrostatischer Gitterpotentiale", Ann. Phys. 369, 253 (1921). ——Ewald法の原論文.