1169 words
6 minutes
【PySCF】PySCFを用いて構造最適化する方法
最終更新:2025-03-26
概要
PySCFはPythonで書かれたオープンソースの第一原理電子構造計算ソフトウェアである。 本稿では、最新版(PySCF 2.3.0)に準拠した構造最適化の手順を、Hartree-Fock (HF) およびDFTの両方の例とともに簡潔に示す。 デフォルトの設定では、構造最適化に使うsolverはgeomeTRIC(https://github.com/leeping/geomeTRIC)である。
1. Hartree-Fock法による構造最適化
# 1. 必要なモジュールをインポート
from pyscf import gto, scf
from pyscf.geomopt.geometric_solver import optimize
# geometric_solverからoptimize関数を呼び出す
# 2. 分子情報を定義
mol = gto.Mole()
mol.atom = '''
O 0.000000 0.000000 0.000000
H 0.757000 0.586000 0.000000
H -0.757000 0.586000 0.000000
'''
# たとえば水分子の座標を定義
mol.charge = 0 # 電荷(中性なら0)
mol.spin = 0 # スピン多重度1 (singlet) のため spin=0
mol.basis = '6-31G*' # 基底関数を指定
mol.build()
# 3. SCF計算(Restricted Hartree-Fock)の設定
mf = scf.RHF(mol)
mf.max_cycle = 100 # SCF計算の反復回数を設定
mf.conv_tol = 1e-9 # SCF計算のエネルギー収束閾値
mf.verbose = 4 # 計算ログの出力レベル(大きいほど詳細)
mf.diis = True # 収束を加速するDIISアルゴリズムを使用
# 4. 構造最適化を実行
# optimize関数にSCFインスタンスを渡して呼び出すと、分子の座標を最適化したうえで
# 収束した最終座標を返す
optimized_coords = optimize(mf)
print("Optimized Coordinates (Angstrom) with HF:", optimized_coords)
行ごとの意味:
- pyscf.geomopt.geometric_solverからoptimize関数をインポートしている。
- Moleオブジェクトを生成し、原子座標・基底関数などを定義している。
- RHFを用いてSCF計算のセットアップを行い、反復回数や収束条件などを指定している。
- optimize関数を呼び出して構造最適化を実行し、最終的な座標を取得している。
SCFのアルゴリズムを変更する場合
- mf.diis = False とするとDIISを無効化する。
2. DFTによる構造最適化
from pyscf import gto, dft
from pyscf.geomopt.geometric_solver import optimize
# 1. 分子情報を定義
mol = gto.Mole()
mol.atom = '''
O 0.000000 0.000000 0.000000
H 0.757000 0.586000 0.000000
H -0.757000 0.586000 0.000000
'''
# 例: トリプレット系の場合 spin=2 (n-1) にする点に注意
mol.charge = 0
mol.spin = 0
mol.basis = '6-31G*'
mol.build()
# 2. DFTの設定 (Restricted Kohn-Sham)
mf_dft = dft.RKS(mol)
mf_dft.xc = 'B3LYP' # XC汎関数を指定 (例: B3LYP)
mf_dft.grids.level = 3 # DFT計算用グリッドの細かさ(0~9程度)
mf_dft.max_cycle = 100 # SCF計算の反復回数
mf_dft.conv_tol = 1e-8 # SCFエネルギー収束閾値
mf_dft.verbose = 4
# 3. 構造最適化の実行
opt_coords_dft = optimize(mf_dft)
print("Optimized Coordinates (Angstrom) with DFT:", opt_coords_dft)
行ごとの意味:
- SCFの場合と同様、分子情報を定義する。
dft.RKS
を立ち上げ、汎関数(xc)や計算精度、グリッド細分化レベルなどを指定する。- HFと同様にoptimize関数を呼び出すことで座標最適化を実行し、最終的な原子座標を取得する。
DFTのグリッド設定
mf_dft.grids.level
の数字を上げるほど細かいグリッドを使い、計算精度が向上する一方で計算コストも増大する。mf_dft.grids.atom_grid = (75,302)
のようにより詳細なグリッドを個別に設定することも可能。
mf_dft.grids.atom_gridでタプル (R, A) の形でグリッドの細かさを指定する場合、最初の要素 R は“各原子に対する半径方向の格子点数(radial grid points)”を、2番目の要素 A は“角度方向の格子点数(angular grid points)”を表す。たとえば (75, 302) と指定した場合、原子ごとに半径方向に 75 個の積分点、角度方向に 302 個の積分点を設定することになる。
注意事項
- PySCF バージョン2.2.0 以降では、構造最適化関数は「pyscf.geomopt.geometric_solver」から
optimize
を呼び出す。 - スピン多重度がn重項の場合は、コード上で「mol.spin = n - 1」と設定しなければならない。 (2.の補足) ラジカル等、開核系の計算でスピン多重度が2以上になる場合や、一重項ラジカル等を取り扱う場合は、
scf.RHF
からscf.UHF
(DFTの場合はscf.RKS
からscf.UKS
)に書き換えたうえで構造最適化を行う。 - SCF計算での収束がうまくいかない場合は、反復回数 (
max_cycle
) やアルゴリズム (DIIS
,level_shift
など) を適宜調整する。 - DFT計算では、グリッドの細かさ (
grids.level
など) を調整することで精度と計算時間のトレードオフを制御できる。 (4.の補足) M06等のmeta-GGA汎関数はHessianの計算時にグリッドが十分細かくとらないと、不正確な結果が出力されるので注意。(少なくともデフォルトのmf_dft.grids.level
よりも細かくとる必要がある)
【PySCF】PySCFを用いて構造最適化する方法
https://ss0832.github.io/posts/20250326_pyscf_geometry_optimization/