Gaussianは多様な計算機環境の下でも能率的に計算できるように設計されています。通常Gaussianは計算機のメモリやディスク容量に応じて最適なアルゴリズムを選択するようになっています。Gaussianには様々なアルゴリズムが組み込まれているため,その可能性とトレードオフを把握しておくことは,最適なパフォーマンスを引き出すのに役に立つでしょう。
話を進める前に,重要な点を2点強調しておきます:
-M- メモリ容量 (例) -M- 800MB
-#- Maxdisk=ディスク容量 (例) -#- MaxDisk=2000GB
次式は, 様々なGaussianジョブにおけるメモリ必要量の見積もりで用いられます(バイト単位):
M + 16(NB)2
ここで, NBは計算で用いる基底関数の数,Mは通常256 MBです(Gaussian09の場合✝)。例えば,300基底DFT計算を行う場合,必要なメモリの概算は
256 × 106 + 16 × 3002 = 257 440 000 (Byte)
で,少し余裕を見て約260 MBになります。また上記の式は,高次角運動量(f以上)関数に非縮約関数を利用することを前提としています。縮約された高次角運動量関数の微分を求める場合には,より多くのメモリが必要になります。
以下のこの章では,全般的なパフォーマンスだけでなく個々のジョブで最適なパフォーマンスを得るために,様々な選択によるトレードオフについて理解したいユーザー向けに説明されています。さらに関連した情報は文献[572]にあります。
†Gaussian 03の場合,メモリ必要量の見積もりの式におけるMの値は,以下のテーブルに挙げるようにジョブタイプに依存する値となります。なおこのテーブルの値は32ビット計算機システムの場合であり,64ビットシステムではこれらの値を2倍する必要があることにご注意ください。
ジョブタイプ | 最高角運動量基底関数 | ||||
f 関数 | g 関数 | h 関数 | i 関数 | j 関数 | |
SCF エネルギー | 4 MW | 4 MW | 9 MW | 23 MW | ~60 MW |
SCF グラジェント(勾配) | 4 MW | 5 MW | 16 MW | 38 MW | |
SCF 振動数 | 4 MW | 9 MW | 27 MW | ||
MP2 エネルギー | 4 MW | 5 MW | 10 MW | 28 MW | ~70 MW |
MP2 グラジェント(勾配) | 4 MW | 6 MW | 16 MW | 38 MW | |
MP2 振動数 | 6 MW | 10 MW | 28 MW |
例えば,32ビット計算機でg関数を含む300基底DFT構造最適化計算を行う場合,必要なメモリは約5.2 MW(約42 MB)になります。なお,1 MW = 1,048,576ワード(= 8,388,608 バイト)です。また,Gaussian 09と同様に,縮約された高次角運動量関数の微分を求める場合は,さらに多くのメモリが必要になります。
共有メモリ型マルチプロセッサを用いている場合には, 前述の表を用いて各プロセッサに対して必要なメモリ量を見積もることができます。したがって,表の値が10MWで,共有メモリ型プロセッサを4つ用いる場合には,%Mem を少なくとも40MWにします。
分散メモリ型計算(つまり,Lindaでの計算)を行っている場合には, %Memで指定したメモリ量は前述の表の値と同じかそれ以上にすべきでしょう。
Gaussian 03では,2つの並列化法を組み合わせることも可能です。例えば,以下の命令を用いれば,2共有メモリ型マルチプロセッサを4つ用いた8CPUの計算を実行されます。
%Mem=20MW 各マルチプロセッサごとに必要なメモリ
%NProcLinda=4 Lindaプロセスを4つ利用(1マルチプロセッサごと)
%NProcShared=2 各マルチプロセッサコンピュータで共有メモリ型プロセッサを2つ利用
パフォーマンスに関連する最も重要な選択の一つに,数値的電子反発積分(ERI)の処理の仕方があります。2電子反発積分の取り扱い方について,Gaussianには5つの方法が実装されています。
原子軌道に対する2電子積分(AO積分)を一旦生成して,それをディスク(外部記憶)に保存します。これは従来の(conventional)SCF計算で用いられる方法です。
AO積分を一旦生成,外部記憶に保存し,さらにMO基底に変換します。変換された(MO)積分も外部記憶に保存されます。これは,以前のバージョンのGaussianでは,全相関エネルギー法で用いられていた方法です。
AO積分は(とその微分も)必要に応じて再計算されます。この方法ではO(N4) の内部または外部記憶は必要ありませんが,余計な計算を行う可能性があります。いくつかのケースでは,この余計な計算を埋め合わせられるように他の部分で計算を削減します。またどのようなケースでも,Direct法は,メモリとディスクを使い果たしてしまうようなときの唯一の方法であり,そのため巨大な計算に対しては必然的に使われる方法です。以前のバージョンとは違って,Direct法はGaussianでのSCF計算でのデフォルトとして用いられます。
AO積分は(とその微分も)必要に応じて再計算されます。さらに,そのサイズが利用可能なディスクスペースに収まる限り,MO積分は一時的にディスクに保存されます。
AO積分を一旦生成し,メインメモリにカノニカル順に(つまりゼロも含めて)保存します。これは巨大なメモリが必要ですが,積分を単純な行列操作で処理できるので,I/O処理がいらず,その結果非常に高速です。
Gaussianの全手法に対して,少なくとも2つの積分処理方法が用意されています。与えられたジョブに対するデフォルトの方法は,小〜中程度のサイズの分子に対してよいパフォーマンスを与える方法が選ばれます。各方法に対する様々なオプションとそのトレードオフは以下のセクションで説明されています。
SCF計算でのパフォーマンスはどのように積分を処理するのかによって依存し,デフォルトの方法で収束しないようであれば,他の計算方法を選択します。
デフォルトでは,SCF計算はダイレクトアルゴリズムを用います。Direct SCFはディスク領域が十分でないときにだけ選ばれるように思われるかもしれません。しかしながら,実際にはそうではありません。積分のカットオフを利用することによって,direct SCFのコストは分子のサイズのN2.7 に比例するか,それより良くなります。一方,従来のSCFでは実際にはN3.5になってしまいます[572]。それゆえ,積分を再計算(本当に必要な積分のみ)したほうが実際に外部記憶を用いるよりCPU時間が少なくて済む点に達するのがかなり早くなります。この交差はいかに速く積分評価をdirect SCFで行えるかに依存し,そしてそれはマシンごとで異なるでしょう。しかし,現在の計算機システムでは,最も効率的な方法は,可能でされあればin-core SCF で行うことであり,その点からもdirect SCFを用いることです。従来のアルゴリズムは実質的に現在のシステムでは良い選択ではありません。
これらの事実を鑑みて,Gaussian 98 からデフォルトのアルゴリズムはdirect SCF に変更されました。SCF=Conven キーワードは古いPCのような小さなメモリしかない計算機システムでしか必要にならないでしょう。
In-core SCFも利用可能です。積分を保存するのに十分なメモリがある場合,direct SCF計算は自動的にin-coreで実行されます。SCF=InCoreでin-core計算を指定することもできますが,積分を保存するのに十分なメモリがないとジョブは終了してしまうでしょう。一般に,閉殻in-core SCF計算では約N4/8 + 500,000ワードが,UHF,ROHF in-core SCF計算では約N4/4 + 500,000ワードのメモリが必要です。これは,100基底のジョブでは約100MB,200基底のジョブでは約1.6GB,300基底のジョブでは約8.1GBになります(閉殻の場合)。
GVBおよびMCSCF計算でも directまたはin-core アルゴリズムを用いることができます[405]。必要なメモリ量は開殻Hatree-Fock計算(前述)と同程度です。主な違いは,多数のFock演算子を各反復で生成する必要があることです。GVBでは,2Norb の演算子が必要です(Norb はGVBペアの軌道の数)。MCSCFでは,Nactive(Nactive-1)/2 + 1 の演算子が必要です(Nactive はアクティブスペース内の軌道の数)。結果として:
Direct HF計算のスピードをあげるために,反復は2つのフェーズで行われます。
この方法は これまでに検討されている全てのケースで収束性が遅い場合を除いては,最初から完全な積分精度を用いるよりも実質的に速くなります。何らかの問題があり,最初から完全な積分精度を用いるには,SCF=NoVarAccとします(余計にCPU時間がかかります)。詳細についてはSCFキーワードを参照してください。
シングルポイント(一点)directおよびin-core SCF計算のパフォーマンスをよくするためには,デフォルトのSCF法の修正版を用います:
これで相対エネルギー,電子密度解析,多極子モーメント,静電ポテンシャル,静電ポテンシャルでの電荷といった通常のシングルポイントSCF計算には十分な精度です。従来のSCFシングルポイント計算やシングルポイント以外の全てのジョブでは電子密度で10-8の厳しい収束条件が用いられます。より厳しい収束条件をシングルポイントdirect SCFで用いるには,SCF=Tightとします。詳細についてはSCFキーワードを参照してください。
現在用いられているデフォルトのSCFアルゴリズムは,2つのDirect Inversion in the Iterative Subspace (DIIS)外挿法EDIISとCDIISを組み合わせたものです。。EDIIS [559]は外挿にエネルギーを用い,SCF収束プロセスにおける初期の反復に非常に有効です。CDIISは,フォックおよび密度行列の交換子に基づいて外挿を行い,SCF収束過程の後半のフェーズを取り扱います。この新しいアルゴリズムは非常に信頼性が高く,これまでSCF収束困難だったケースでも,今ではこのデフォルトアルゴリズムを用いればたいてい収束させることができます。残りの病的な収束困難なケースに対しては,Gaussian 03ではFermi broadening およびダンピングをCDIISと組み合わせた方法(自動レベルシフトを含む)を用意しています。
デフォルトの方法で収束しなかった場合に利用可能な代替法を対応するキーワードごとに列記します。
SCF=Fermi
初期のSCFの反復で,温度broadening [562]をCDIISと動的ダンピングを組み合わせて利用します。
SCF=QC
Bacskayの方法[563]に基づく二次収束SCF手続きを利用します。Bacskayによって示唆されたように線形最小化とNewton-Raphsonアルゴリズムを組み合わせるので,最終的には定留点に到達することが保障されます。通常,SCF=QCは従来のSCFの2倍程度計算コストがかかります。SCF=QCは確実で,direct SCFでも用いることができるので,収束問題に直面した場合には通常最初に用いられる選択肢です。この方法はRHFとUHFでは利用可能ですが,ROHFでは使えません。
Guess=Alter
収束困難なケースによっては, 初期推測軌道で誤った軌道が占有軌道になっているケースもあります。推測軌道を,特に占有軌道の対称性に関して調べておくべきです。Guess=Alterを用いれば,占有される軌道を修正することができます。
SCF=NoDIIS
旧式の3または4点外挿を用いた従来のSCFを行います。RHFやUHFに対しては通常はよい選択ではありませんが,ROHFでは代わりとなる方法が少ないので,役に立つかもしれません。収束には64サイクル以上かかるかもしれません。
SCF=(MaxCyc=N)
SCF反復の回数をNに増やします。デフォルトのアルゴリズムで単にSCFサイクル数を増やしても,ほとんど役に立たないことに注意してください。
SCF=DM
Seegerの最急降下アルゴリズム[564]を用います。これはcomplex HFで用いることができますが,direct HFやDFTでは利用できません。
これらの方法は全て,軌道空間の中で最も近い定留点に強制的に収束させる傾向があります。軌道の回転に関しては最小でないかもれません。安定性の計算は,適切なSCF解が得られたかどうかを確認するために用いることができます(Stableキーワード参照)。特に Guess=Alterを用いたときは,最終波動関数が求めたい電子状態に対応しているかどうかを確かめる必要があることに注意してください。
Hartree-Fock2次導関数における積分処理では4つの方法が選択できます。
coupled perturbed Hartree-Fock (CPHF)方程式を解きますが,その際用いられるAO積分は反復ごとに再計算します。Dircet CPHFにおける積分カットオフはDirect SCFほどは効果的ではないので,基底関数が多くないとダイレクト法のほうが速くなりません。しかし,100基底関数でも,ダイレクト法での振動数は従来の方法(AO)より約40%遅くなるだけです。そのため,direct SCFの場合と同様に,ダイレクト法は基底関数が約100以上あるか,もしくはベクトルマシンを用いているときには適したアルゴリズムであり,またスカラーマシンでもディスクを使い尽くしてしまうときには必要となるでしょう。このアルゴリズムはデフォルトです。
保存したAO積分を用いてCPHF方程式を解きます。 プチ(対称性簡約)リストが用いられます。これは,約100基底関数までのジョブでは最適な選択肢でしょう。
変換されたMO積分を用いてCPHF方程式を解きます。これは,他の多くの電子状態計算プログラムで用いられている唯一の方法であり,小規模系ではAO基底を用いるより少し早いものの,根本的にディスク領域を浪費する方法です。これはルートセクションで CPHF=MO を指定すれば選択できます。このオプションはDFT法では利用できません。
積分をカノニカル順にメモリ上に保存します。必要なメモリ量は in-core SCFと場合と同じです。これは利用可能であれば,最も高速な方法です。このアルゴリズムを指定するときにはSCF=InCoreとします。
デフォルトでは,in-coreで振動数を求めるときには,積分は必要に応じて各リンクで一度計算されます。この方法では,ディスク領域はダイレクト法と同じであまり使わずに済み,O(N3)程度です。N4/8分のディスク領域が利用可能であり,さらにin-core法のスピードを上げたい場合,SCF=(InCore,Pass)を指定すれば,積分を最初に計算した時はそれをディスク(read-writeファイル)に保存し,後のステップではその積分は再計算せずにディスクから読み込むようになります。
HF振動数計算では赤外およびラマン振動強度の予測をデフォルトで行います。IR強度予測が計算にあたえるオーバーヘッドはほとんど無視できますが,ラマン強度予測では10-20%計算コストが増加します。ラマン強度が必要ないのであれば,Freq=NoRamanを指定すればラマン強度を計算しません。
Freq=Ramanを指定するとラマン強度をDFTまたはMP2振動数計算に対する数値微分により求めます。このオプションを利用しても,計算における必要ディスク量は変わりませんが,ジョブのCPU時間は増加するでしょう。前期共鳴ラマン強度(CPHF=RdFreq)は約2倍計算時間がかかります。
振動数計算はほとんどメモリを必要としませんが, 巨大基底ジョブでは,1回の過程で主なステップが終えることができるだけの十分なメモリ量があればかなり良くなります。Link 1110では全ての自由度(つまり,3×原子数)に対して「骨格微分Fock行列(skeleton derivative Fock matrix)」を作成しなければならず,行列を部分的にしかメモリ上に保存できなければ,積分導関数を1回以上計算することになります。同様に,CPHF解法の全ての反復で,link 1002で全ての微分Fock行列の更新を行う必要があります。Link 1110では3NAN2/2ワードのメモリが必要となり,さらに効率よく実行するためには積分導関数に対して一定量のメモリが必要です。Link 1002では 3NAN2 ワードのメモリが必要であり,さらに効率よく実行するためには一定量のメモリが必要です。
freqmemユーティリティプログラムでは振動数計算とは異なるパラメータでの最適なメモリサイズ(つまり,1回の過程で主なステップを実行するのに必要な量)を返します。
MP2計算では4つのアルゴリズムが利用可能ですが,その選択はプログラムによって自動的に決定されます。決定時の重要な要素としてはMaxDiskの値があり,これは用いている計算機の構成(3章参照)によります。この値では使用可能な最大ディスク量をワードで指定します。ルートセクションもしくはDefault.RouteファイルのどちらにもMaxDiskの値が設定されていない場合,Gaussianは余計な処理をせずに計算を実行するだけの十分なディスクが利用可能であると想定します(よって,大きい計算ではディスクが足らなくなるケースもあるかもしれません)。したがって,利用可能なメモリ量とディスク量を指定することは,MP2計算で最大限のパフォーマンスを引き出すのに極めて重要になります。それらの指定をすることで,様々な利用可能なアルゴリズムの中から,用いている計算機構成に最適なものが選択されるようになります。メモリ・ディスク指定は(インプットファイル中MaxDiskや%Memでも指定可能ですが)Default.Routeファイル中-M- コマンドやMaxDiskキーワードで設定しておくのが最善です。
MP2エネルギー計算で利用可能なアルゴリズムは以下の通りです:
AO積分を必要があれば生成します。一つまたは複数個の占有軌道 i に対して半分だけ変換された積分 (ip|λσ)をディスクに保存します。この方法では,O(N2) のメモリと N3のディスクがあれば実行可能であり,通常最適な選択肢です。この方法を指定するにはMP2=SemiDirectとします。
AO積分を一度生成し,それをメモリ上にカノニカル順に保存します。N4/4 のメモリが必要です。実行するのに十分なメモリがあれば非常に高速です。このアルゴリズムを指定するにはMP2=InCoreとします。これにより,in-core SCFおよびMP2を実行します。
AO積分はE(2)の評価において必要となるたびに再計算されます。外部記憶は必要ありません。積分評価の数は利用可能なメモリ量に依存します。これは大きな物理メモリがあるマシンでのみ優れた方法です。このアルゴリズムを指定するには,MP2=FullDirectとします。
AO積分を書き出して変換し,その後E(2)を評価するためにMO積分を反対称化しておきます。これはGaussian 88とそれ以前のバージョンではデフォルトアルゴリズムでした。MP2=Convenとすると,強制的にこの従来式のMP2アルゴリズムを用います。新しい(semi-direct)アルゴリズムでは十分な動作をするためには控えめにみてもNという巨大なメモリが必要ですが,このアルゴリズムでは基底関数にs, p, d関数しか含まれない系では必要メモリ量は約100万ワードと固定されていて最低限ですみます。この古いコードはどの計算機でも遅いものの,メモリが少量しかないマシンでも実行できるので,そのようなマシンでは必要となるでしょう。
AO積分を書き出し,その後積分変換とE(2)の評価をメモリ上で行います。N3/2のメモリが必要です。これは,エネルギーは必要だがグラジェントは必要ない場合のGaussian 88 におけるオプションでした。このアルゴリズムを選択するには,Use=L903とします。
なお, direct, semi-direct, in-core MP2 アルゴリズムを用いているときには,SCFはconventional, direct, in-coreのいずれでも実行できます。デフォルトはdirectまたはin-core SCFです。
以下の場合を除いて,MP2グラジェント(勾配)でのアルゴリズムの選択はMP2エネルギーとほぼ同じです:
MP2エネルギーと同様に,デフォルトはdirect または in-core SCF を行い,その後semi-direct, direct, in-core E2を自動的に選択します。
解析的MP22次導関数計算では,semi-direct法だけが利用可能です。この方法では従来式のアルゴリズムでは必要だったディスク使用量を減らすことができます。
MP2振動数ジョブもかなりの量のメモリを必要とします。 大きな系ではデフォルト値(600万ワード)から増やさないとならないでしょう。f関数を用いている場合,64-bit整数を用いている計算機システムでは800万ワードのメモリが必要となるでしょう。
MP2以上の全ての電子相関法(例えば,MP3, MP4, CCSD, CISD, QCISD等)では全て,変換された(MO)積分をディスクに保存する必要があり,したがって(MP2エネルギーやグラジェントとは異なり)分子のサイズに対して4次で必要なディスク量が増加します。しかし,どのように変換積分の生成するのか,どの程度ディスクに保存するのか,残りの項をどのように計算するのか等でいくつか方法があります。
post-SCF計算では完全積分変換で用いるディスク使用量がMaxDisk以下で収まる場合,完全積分変換を行って計算されます。そうでない場合は,部分変換を行い,項によってはAO基底から計算されます。よって,post-SCFジョブを行うときにはMaxDiskの値を設定しておくことが非常に重要になります。これはルートセクション内かDefault.Routeファイルのシステムごとの設定で可能です。MaxDiskが設定されていない場合,プログラムはディスクが十分あることを想定するので,デフォルトで完全変換を実行します。MaxDiskが設定されておらず,完全変換に十分なディスクスペースもなかった場合,ジョブは失敗してしまうでしょう。
post-SCF法に対するMaxDiskの影響をまとめると,以下のようになります:
積分保存選択だけでなく,再スタート機能を上手に用いると CISやTD計算のコストを節約できます。
一電子励起CIを用いた励起状態計算では次の5つの方法が使えます(ラベルはCISキーワードのオプションに対応しています)。TDでは以下のうち最初の2つだけが利用可能です。
反復的な対角化を用いて指定した数の状態に対して解きます。その際,必要に応じて2電子積分から積ベクトルを作ります。このアルゴリズムは使用するメモリとディスク容量をO(N2)にまで減らせます。
AO Raffenettiの組み合わせをメモリ上に保存します。in-core法は非常に効率的ですが,小分子系でしか実用的でなく, N4/4 ワードの大きなメモリがある計算機が必要です。この方法は十分なメモリが利用可能な場合,自動的に用いられます。
反復的な(Davidson)対角化を用いて指定した数の状態に対して解きます。その際MO積分を用いて積ベクトルを作ります。これは最も高速な方法で,デフォルトです。このアルゴリズムは約150基底関数までなら有効な選択肢ですが,占有軌道の数にも依存します。占有軌道の数が多くなれば,すぐにdirectアルゴリズムのほうが有用になるでしょう。(グラジェントでも)2つの仮想軌道を含む積分だけが必要なので,MaxDiskに従うように動作します。最低必要なディスクは約4O2N2 (開殻系では6O2N2 )です。
反復的な対角化を用いて指定した数の状態に対して解きます。その際,書き出したAO積分から積ベクトル作ります。この方法は遅いので,最適な選択肢では決してありません。
完全CISハミルトニアン行列をコアにロードし,対角化します。この手法は全ての状態を求められますが,O2V2 のメモリと O3V3のCPU時間が必要です。したがって,これは非常に小さな系か,デバッグ目的以外では実用的でありません。
CISやTDジョブは Gaussianチェックポイントファイルから再スタートすることが可能です。これは小さな計算に限られますが,MO基底で計算することができ,新しい積分と変換を計算しないとなりませんが,direct CISでは非常に貴重です。direct CISジョブがCISフェーズで中止された場合,CIS=RestartやTD=Restartだけでなく,SCF=Restartを指定する必要があります。これは最終的なSCF波動関数は完全にジョブステップ(または最適化ステップ)が終了するまで保存領域(Guess=Read用)に移されないからです。
電子密度解析だけが必要で,励起状態がすでに見つかっている場合には,CIS電子密度はチェックポイントファイルからDensity=(Check,Current) Guess=Onlyとすることで取り出すことができます。これで現在の方法(普通ならCIS)で保存された一般化電子密度行列を読み出し,電子密度解析を再び行います。一体(緩和してない)密度行列でも一般化(緩和した)密度行列でも検討することができますが,CISレベルでの双極子モーメントやその他プロパティは一体密度行列を用いると(つまり軌道緩和項を無視すると)ほとんど正確ではないということが知られていることに注意してください[108,447]。結果として,CIS一体密度行列を用いることは,正確な密度行列と比較したり,他のプログラムが一般化密度行列を計算できない場合を除いては,避けるべきです。
いくつかの状態に対して一般化密度行列を生成するためには別々に計算を行う必要があります。CPHF計算は各々の状態で実行しなければならないためです。これを行うために,まず全ての状態に対して解を求め,第一励起状態に対して密度を求めます:
# CIS=(Root=1,NStates=N) Density=Current
N 状態を調べたいのであれば,次のようにルートセクションで指定することで,N-1回計算を実行します:
CIS=(Read,Root=M,NStates=N) Density=Current
これで 状態N中M=2を求めます。
UHF参照状態はS2の固有値になっていないので,CISでもTDでも励起状態を生成することはできません[573]。
RHF,UHFや制限および非制限DFT波動関数の3重項・1重項不安定性をテストするにはStableキーワードを用います。MO, AO, Direct, InCoreオプションも利用可能です。デフォルトはDirectです。direct安定性計算は上述したようにCISでは再スタートできます。
CASSCF法を用いたときに最初に問題となるのはアクティブスペース(活性空間)軌道を適切に選択することです。その方法はいくつかあります。
全てのケースで,最適化を行う前にはシングルポイント(1点)計算を実行すべきです。それにより,収束したアクティブスペースをチェックして,指定した電子が相関しているかを確かめることができます。励起状態に対してCASSCF波動関数を解くためにはさらに検討すべき事項があります(詳細についてはCASSCFキーワードを参照してください)。
CASSCF振動数計算には多くのメモリが必要となります。利用可能なメモリ量を増やすと,CASSCF振動数ジョブのパフォーマンスが良くなるでしょう(同じことはその他の方法による振動数計算ではあてはまりません)。またこの計算にはO2N2のディスク領域が必要です。
平日9:30~17:30 (土曜日、日曜日、祝祭日、年末年始、夏期休暇は、休日とさせていただきます。)