基底関数の選び方【量子化学計算】

量子化学計算では、input ファイルのキーワードセクションで計算レベルの指定を行います。

B3LYP/6-31G(d)MP2/6-31+G(d,p) などの記載を論文でもよく見かけると思います。計算する系によって、最適な基底関数を選択することは非常に重要であり、計算結果に大きな影響を与えます。

不適切な基底関数を用いた計算結果は、意味を為さないものとなってしまいます。また、論文投稿時に Reviewer から指摘されてしまい、全部計算やり直しになることもあります。

この記事では、どのようにして最適な基底関数を選択すれば良いのか?をまとめました。

基底関数の種類

基底関数には大きく分けて4種類あります。

Pople 系Huzinaga-Dunning 系Roos ANO 系Dunning cc-pV NZ 系です。

  • Pople 系は、3-21G6-31G などで書き表される基底関数系です。
  • Huzinaga-Dunning 系は、D95, D95V などで書き表される基底関数系です。
  • Roos ANO 系は、DZ-ANO, TZ-ANO などで書き表される基底関数系です。
  • Dunning cc-pV NZ 系は、cc-pVDZ, cc-pVTZ, cc-pVQZ などで書き表される基底関数系です。

分野や宗派によってどの基底関数を使うかは違うと思いますが、Pople 系が最も一般的です。計算速度でも Pople 系が圧倒的に速いです。

以下、この記事では Pople 系の基底関数を例として取り上げます。

基底関数の選び方

結論から言いますと、とりあえず計算するときは 6-31G* を使うのを第一選択として下さい。そして、系の特徴によって以下のように変更を変えてください。

  • カチオンが含まれている場合は、** をつける(6-31G**)
  • アニオンや励起状態を扱うときは、をつける(6-31+G*)
  • ヒドリドが含まれている場合は、++ をつける(6-31++G*)

また、より計算レベルを上げたい時には、triple zeta (6-311G*) にしてください。ECP を併用するときは、double zeta のときは LANL2DZ、triple zrta のときは SDD を使用して、レベルをそろえた方が無難だと思います。

基底関数のレベルを上げると、下表のように計算コストも高くなっていきます。この辺は、お使いの計算機や wall time との相談になるかと思います。

特に diffuse 関数をつけると計算時間は劇的に長くなります。

basis_set出典:http://www.wavefun.com/support/sp_compfaq/BasisSetFAQ.html

* の意味

Gaussian の input ファイルでは、Pople 系の基底関数を書き表す時に (d) を *、(d,p) を ** で代用することが可能です。例えば、 6-31G** 6-31G(d,p) を意味します。

この二つはどこが違うのか疑問に思う人もいるかと思いますが、全く同じと考えてもらって構いません!

唯一の例外は、3-21G* と 3-21G(d) で sulfoxide や sulfone を含んだ系を計算する場合のみです。しかし、現在では 3-21 系で計算する人はほとんどおらず、6-31 系が主流となっているため、違いはないと覚えてください!(出典: Introduction to Computational Chemistry 3rd Edition, 201 ページ)

管理人は、input ファイル等では * を使い、論文に記述する際には (d) や (d,p) を使うようにしています。

基底関数が大きすぎるとエラーが起きる

NBO 計算などでは基底関数の数が多すぎるとエラーで止まります。もしも NBO計算がエラーで落ちたときは、log ファイル内で “primitive” で検索して基底関数の数を確認して下さい。

 307 basis functions,   498 primitive gaussians,   307 cartesian basis functions

この例の場合、元の基底関数の数は498個、短縮後の基底関数の数は307個です。
管理人の経験がらいうと 500 個を越えるとエラーで止まる場合が出てきます。(しかし、必ずエラーで計算が止まるという訳ではない。)

この場合は、仕方ないので、基底関数のレベルを下げます。

DFT 計算では基底関数のレベルが高ければ良いというものではない!

詳しくは以下の記事を参照して欲しいのですが、DFT 計算では基底関数のレベルをあげれば計算精度が上がるということは絶対ではありません。

参考: 【Enthalpy】B3LYP での計算誤差について【Underestimation】

例えば、使用している汎関数がその反応を overestimate してしまい、基底関数系が underestimate してしまい、結果として計算精度がよくなっている場合があるとしましょう。ここで、基底関数系のレベルを上げてしまうと、汎関数の overestimate を相殺できなくなってしまうため、結果として計算精度が落ちてしまいます。

一点計算を行う際に、基底関数のレベルをとても高くするのは無意味だと思ってください。きちんとベンチマーク等を測定して、最適な基底関数系を選択するのが肝要です。

DFT計算を行う方は、汎関数の選び方も合わせてお読みください。

関連する記事



コメントを残す(投稿者名のみ必須)