やさしい(?)バンド計算プログラムの作り方(各論) [Top]

目次
各論1
各論2(MSD,FORCE,CHAVER,STRNLの説明)
サブルーチンMSD
サブルーチンFORCE
サブルーチンCHAVER
サブルーチンSTRNL
各論3(その他のサブルーチン1)
各論4(その他のサブルーチン2)
とうとう各論に入ることとなりました。本論 でも述べているように、共同研究者との共同製作の部分もあり、プログラ ム全ての説明は現時点(2/18、1997)では不可能です。
取り敢えず、公開しても問題のない部分についての説明から始めたいと思い ます。

【注意】

以下に公開されるルーチンに関して、これらは全てに著作権が存在します。 従って、個人的なレベルでの参照、利用、流用(各々のバンド屋、研究者の所 有するプログラムに、以下に公開されるルーチンの中で有用な部分を利用する こと)に関しては何ら問題がありませんが、これらを利用した部分及び、以下 に公開されているルーチンの転載、再掲載、公表、譲渡、再配布等は現段階で は禁止します。[補足へ]
(これは、ここ〔各論〕以外で、公開されているプログラム、〔サブ〕ルーチ ン等についても適用されます。)

これは、以下に公開するルーチン等の利用、流用で得られた成果の発表を制 限するものではありません。もし成果を発表する場合、できれば筆者に知らせ てもらえると有難いです。また利用、流用して得られた成果を論文等で発表す る場合、謝辞等でその出処を示してもらえると大変嬉しいです(必ずしも強制 するものではありませんが、強くお願いする次第です)。

何らかの参照、利用、流用をした場合、それによって生じる如何なる問 題、損害、被害、不具合などに対して、筆者及び旧無機材研(現:物質・材料 研究機構)は一切責任は負えません。(3/6、1997記、6/28、 2002修正)


各論1

既に、メインルー チンは示されており、詳細な説明も本論で行なわれているので、ここでは (公開可能な範囲での)各サブルーチンの詳しい説明を行ないたいと思います。
既に、幾つかのサブルーチンが、他のドキュメント(記事)部分で公開(これはサブルーチン リストのみ〔3つだけ内容が見れる〕が表 示)されています。

では次に、現在公開可能なサブルーチンを加え て(公開可能な各サブルーチンの内容が見れます) みましょう。
これにより、プログラム全体の内の、多くの部分が公開されました。この中 には公開されても、されなくてもどうでも良いものもありますが、少なくとも MSDFORCECHAVERSTRNL は本プログラムを動かす上で、非常に重要な部分と言えます。この4つのサブ ルーチンで、波動関数の更新、力(非局所擬ポテンシャル部分)、電荷密度、 ストレス(非局所擬ポテンシャル部分)の計算が行なわれています。またFF Tを除けば、この部分だけで消費する計算時間の大部分を占めます(ただ、最 近あまり触っていません。従って、高速化や、計算効率、メモリー効率などが 悪いままになっている部分も存在するかと思います)。

各論2(MSD,FORCE,CHAVER,STRNLの説明)

ではここでは、先に挙げた重要な4つのサブルーチンMSD、FORCE、CHAVER、 STRNLについて説明したいと思います。

(1)サブルーチン MSD
本プログラムで最も重要な部分。ここで、最急降下法をもとにして、波動関 数の運動力学的(方程式を解く)な逐次更新が行なわれます。この過程では、 行列要素の計算、波動関数の直交化、固有エネルギー(エネルギーレベル)の 更新などの作業が含まれています。

以下、もう少し詳しく説明していきます。上の題目MSDをクリックしても らえるとサブルーチンMSDのソースのページが開きます。また、以下の各項 目をクリックすると、項目で説明されている箇所が表示されます。
  1. [ まず最初に、コモン変数呼び込みのためのインクルード文、パラメーター変 数、局所的に使う配列(含む作業用配列)の定義、VPP用並列化定義(k点 に関する並列化)などが行なわれます。]

  2. [ その後、初期変数値の設定(含むゼロ初期化)を行ない。]
  3. [特別な 条件(ストレスによるユニットセルの最適化)の時に非局所擬ポテンシャル部 分の動径方向(実空間)から逆空間へのフーリエ変換を行なうサブルーチンK BINTと力の計算(非局所擬ポテンシャル部分、簡易版なので実際の力は計 算していない)サブルーチンFORZFBを呼び出しています。]

  4. [ そして次に、運動エネルギー、ハートリー、交換相関、局所・非局所擬ポテ ンシャル、各項に対応する行列要素を作ります。]
  5. [ 波動関数は最急降下法で更新します。但し、収束を加速するため、波動関数 に対する時間に関しての1次微分方程式を解析的に解き、時間刻みをより大き くとれるようにしています(詳しくは筆者のD論)][(またはA. R. Williams and J. Solerの文献参照)]

  6. [ 更新された波動関数を直交化(グラムシュミットの方法)します。その後エ ネルギー固有値(固有エネルギー、バンドレベル、エネルギー準位などいろい ろ言い方があります)を求めます。]
  7. [求めた エネルギー固有値は必要によって並べ替えを行ないます。]

(2)サブルーチ ンFORCE
非局所擬ポテンシャル部分の力を計算するサブルーチン。この部分で作った 行列要素はMSDでも利用されます。従って、電子状態のみを計算する場合は、 簡易版のFORF ZBが使われます(力の計算部分を除いてあります)。

このサブルーチンの計算手順は先のMSDと比べるとずっと簡単です。

  1. [ ま ず最初に、PACVPPをインクルードし、局所(作業用)変数を定義する。 ]
  2. [ そ こでは、k点に関する並列化の設定も行なわれています。]
  3. [ 次 に作業用変数等をゼロ初期化する。]
  4. [ そ して、MSDでも使う非局所擬ポテンシャル用行列要素の計算を行ない。 ]
  5. [ 最 後に、非局所擬ポテンシャルの力の計算を行ないます。]
尚、上のリスト項目4、5の作業は、s、p用とs、p、d用に場合分けし て実行されています。項目4が非局所項がs、pのみの場合で、項目5が非局 所項にdも含む場合で、この部 分ではdポテンシャル部分の計算が行なわれています。

(3)サブルー チンCHAVER
これは電荷密度の計算を行なうサブルーチンです。電荷密度はサブルーチン MSDで更新された波動関数(固有ベクトル)の積を畳み込みの手法(FFT が利用できる)を使って求めます。この積に関して各バンド(エネルギー準位)、 k点で和をとります。和の上限はフェルミ面(エネルギー)までです(このフェ ルミ面は、サブルーチンFERMIで求められます)。

このサブルーチンの計算手順は以下のようになります。

  1. [ まず最初に、PACVPPをインクルードし、局所(作業用)変数を定義する。 ]
  2. [ そこでは、k点に関する並列化の設定も行なわれています。]
  3. [ 次に作業用変数等をゼロ初期化する。]
  4. [ そして、逆空間での波動関数をFFT用の3次元複素配列に(マッピングしな がら)格納します。]
  5. [ これをFFTで逆フーリエ変換(逆空間--->実空間をフーリエ逆変換と定 義しています)して実空間の波動関数(3次元複素配列)を作ります。]
  6. [ 次に、畳み込みを行ないます。これは単純に先に求めた実空間波動関数同士を かけているだけです。これによって実空間電荷密度が得られます。この時、バ ンド(エネルギーレベル)とk点に関してフェルミ面までの和をとります。こ れにより系の総電荷密度が求まります。]
  7. [ そして最後に、求めた実空間電荷密度をフーリエ変換して、逆空間での電荷密 度を求めます。]
(4)サブルーチ ンSTRNL

このサブルーチンは非局所擬ポテンシャルの ストレス部分(pngイメージ[30KB]あり。このサブルーチンはs、p、d のみ)の計算を行ないます。 非局所ストレス部分の各項(pngイメージ [30kb]あり、このイメージではf部分も記述されています)毎に計算を分けて 行ないます。それぞれのルーチン内で、非局所部分がs、pのみの場合と、s、 p、dの場合とに分けてあいます。

大体の計算の流れは以下のようになります。

  1. [ ま ず最初に、PACVPPをインクルードし、局所(作業用)変数を定義する。 ]
  2. [ そ こでは、k点に関する並列化の設定も行なわれています。]
  3. [ 次 に作業用変数等をゼロ初期化する。]
  4. [ そ して、各項毎のストレスの計算を行ないます。最初に作業用変数の初期化を行 ない、表式通りに計算を行ない、各配列に値を代入していきます。計算1 ]
  5. [ 計 算2 ]
  6. [ 計 算3 ]
  7. [ 計 算4 ]
このルーチンは表式(pngイメージ[30kb] あり)通りに計算を正直に行なっているだけです。あまり効率の良い計算(ベ クトル化、並列化、高速化等)を行なっていません。

各論3

各論2で、本プログラムを構成する上でもっとも重要な4つのサブルーチン の説明を行ないました。各ルーチンとも色分けを行なっています。厳密でない 部分もありますが、大体、SUBROUTINE文は赤、インクルード文はオレンジ、配 列定義は緑、並列化指示行は青または RoyalBlue、FTT関係は深い空色、不 用な注釈行は銀色、サブルーチンコールはSalmon、その他重要な部分は Firebrick、Deeppink、Indianredなどで色分けしています。

現在、これら以外の公開されているサブルーチンも随時色分けしています (3/11、1997年)。但し、あまり重要でないサブルーチンは色分け しない、あるいはしても必要最低限のみ色分けします。
ここでは、各論2で説明したサブルーチン以外で、重要なものについてまと めて説明を行ないたいと思います。説明しないものはサブルーチンリスト内の簡単な説明で十分なも のです。

これから説明するサブルーチンは、KPMWBZ、KBINT、FORZFB、STRESS、 FORLOC、MD、CONV2です。

KPMWBZ
これは、ブリュアンゾーン内のk点座標の設定を行なうサブルーチ ンで、対称性は考慮していません。従って、第一ブリュアンゾーン全体を等メッ シュで分割したk点座標を作ります。この時、k点座標全体を原点(Γ点)を 基準として、ずらすことも可能です(深いピンク色になっている注釈行)。但 し、ずらし方は、慎重に行なわないと思わぬ失敗の原因になります。
またKPMSF は2次元(つまり表面用)の場合でのk点を作成します。
KBINT
これは非局所擬ポテンシャル部分の実空間(動径方向)から逆空間 へのフーリエ変換を行なうサブルーチンです。基本的にはKBMATと同じです。
KBINTでは後でス トレス計算で使用するための逆空間用非局所部分を配列変数に格納している部 分があります(深いピンク色で示した部分)。
FORZFB
これはサブルーチンFORCE の簡略版です。つまり、電子状態の計算のみを行なう場合などでは、力の計算 を行なう必要がないので、それらの部分を取り除いた部分からなるのが、この FORZFBです。小規模なルーチンなので、並列化部分の参考例としても良いかと 思います。
STRESS
非局所擬ポテンシャル以外の部分のストレスの計算を行なうサブルー チンです。ストレスの計算は、非常に複雑なので、詳しい説明は避けます。基 本的に、Nielsen and Martinの方法に従っ て、ストレスの各項の計算を行なっています。
FORLOC
力の非局所擬ポテンシャル以外の項(局所擬ポテンシャル項、エバ ルト項)からの寄与部分の計算(エバルト項は別のルーチン〔非公開〕で計算 しています)と、取りまとめ(非局所項も加えて、最終的な力を求めています) をしているサブルーチン。

(10/1、1999)現在、このルーチンでは ZVXCPCという変数を使って力の計算を行なっている部分がありますが、この部 分は不必要であることが判明しました。従って、現在当該部分を注釈行として 扱っています。
MD
FORCEFORLOCSTRESSSTRNL で求めた力、ストレスをもとに分子動力学計算を行なうサブルーチン。原子は ベレのアルゴリズムで更新されます。また、ユニットセル自身も、ストレスを 使って任意の外部圧力条件下のもとに最適化することが可能です。ユニットセ ルそのものの動力学はベレまたは最急降下法で行なわれます。この部分は後か ら付け足した形になっていて、ルーチンとしての構成はあまり良いものではあ りません。
このサブルーチンは、計算全体の1%以下し か占めません(だからといって疎かにしてはいけません)。
ENERGY
(9/30、1999)このルーチンは各サブルーチンで計算され た結果をもとに、全エネルギーを最終的に求めるサブルーチンです。このルー チンに最近、問題があることが分かりました。それは、変数EPCに関してのものです。
サブルーチンENERGYでは最終的な全エネ ルギーの値ETOTALに変数EPCが引かれています。このEPCはサブルーチンPCCで求 められていますが、系のセル(体積)に依らない単なる定数であり、全エネル ギーにとっては余計なパラメーターであることが判明しています。EPCは系の 体積(格子定数)に全く依存しないので、エネルギーの基準がEPC分シフトし ただけであり、同じ原子構成からなる系での全エネルギーの比較という点では 何ら問題ありません。但し、凝集エネルギーを求める場合(系同士の構成原子 の数が異なる)には問題を生じる可能性があります。
もし、問題があると思われる場合は、当該部分、ETOTAL = ETOTAL-EPCを注釈行にして計算しないようにして下さい。
CONV2
電子状態計算での収束判定をするサブルーチンです。またイタレー ションでの古い電荷密度と新しい電荷密度の混合も行なっています。
混合の仕方には他にも、ブロイデン法 や準ニュートン法によるものなど幾つか存在します。対角化を使用しないこの 手の方法では、波動関数の更新(MSD) の段階で、古い波動関数(1イタレーション前、最急降下法の場合)を新しい 波動関数に混ぜているので、これは電荷混合と同じ効果を既にもたらしていま す。しかし実際には、電荷の混合も合わせて行なうと更に収束を速める場合が 多いです(筆者はそうでない場合を経験したことがありません)。
以上で、公開されたサブルーチンの中で、特に説明が必要なものは全て解説 し終ったことになります。これだけで擬ポテンシャルを使った平面波によるバ ンド計算の基本的な部分を、大体網羅したことになると思います。だからと言っ ていますぐバンド計算プログラムが作成出来る、という訳では決してないと思 います。

大部分を網羅したのは事実ですが、全てを網羅している訳ではありません。 まず対称性に関する部分はほとんど公開していません。低い対称性か全く対称 性を考慮する必要のない大規模系の計算を除けば、結晶対称性を考慮した方が 計算精度を上げることができ、実質的に、ブリュアンゾーン内のk点数も対称 性を使って稼ぐことができます。特に金属の場合や、詳細なバンド構造を表示 したい場合には対称性を考慮した計算は必須と言えます。

また、最初のイタレーションで使う初期電荷密度(INTCHG)、あるいは求め られる初期波動関数(対角化手法を使って求められる、DIAGON)も公開してい ません。初期の波動関数は対角化から求める以外にも、乱数から求める方法も あり、2回目のイタレーション以降で使う固有ベクトル(波動関数)を用意す るだけなので、方法としてはいくらでもあるかと思います。また、初期電荷密 度もルーチンとしては10行程度のもので、行なっていることも特殊なもので はありません。
しかし、何も参考とすべきものがない、かつ周りに頼るべきバンド屋さんが いない場合、少しでも参考とすべき指針を示すことは重要なのではないかと思っ ています。将来、これら二つのサブルーチンが何らかの形で公開できるように したいと思っています(大部分が公開可能になりました。4/5)。

各論4

では、現在公開可能なサブルーチンを示して みましょう(4/9版)。

これで分かるように、公開不可能なものを除くと、ごく一部を除いて、サブ ルーチンのほとんどが公開されました。既にこの段階で、公開されたサブルー チンを繋ぎ合わせれば、1つの稼働可能な第一原理分子動力学計算プログラム が作れてしまう一歩手前まで来ています。

実際に、プログラムを構築するのは、次の「つくってみようバンド計算プロ グラム」で行なうとして、ここでは新たに 公開されたサブルーチンの中で、特に重要なもの(新たに公開されたものの中 にはさして重要でないものもあります)の説明を以下に行ないたいと思います。

サブルーチン、LATTIC、GSTEP1、GSTEPF、KSTEP、BASNUM、FORM、CHGAVR、 INTCHG、FORCES、SYMM、LATSCA、GSTSCA、SYMSCA、GSFSCA、などはサブルーチンリストの中の説明で十分と考えら れます。

ちょっとだけ付加的説明をしますと、GSTEP1 でエネルギーカットオフ2Gmaxまでの逆格子ベクトルを設定します。そして、 BASNUM で、Gmaxまでの逆格子空間を考え、この空間内に収まるのが基底関数としての 平面波です。従って、本プログラムが扱っている逆格子空間の点数と、平面波 の数には大体8:1の関係が成り立ちます。
但し、FFTで扱っている空間は(4Gmax)*(4Gmax)*(4Gmax)の立方体内全点 ですが、逆格子としての空間は、その中の半径2Gmaxの球内ということになり ます。平面波の空間は半径Gmaxの球内となります。
この逆格子空間からFFT空間へのマッピングを行なっているのがGSTEPF です。更に、FFT(3次元複素高速フーリエ変換なので)での位相の問題を 解決するようにマップしています(そうしないと、この場合、実空間電荷密度 が複素数になってしまいます。当然、実空間電荷密度は実数であるはずですが、 位相のずれからマッピングしていないと複素数になってしまうことがあります。)。

LATSCAGSTSACSYMSCAGSFSCA、 はストレスを使って、ユニットセルの最適化を行なう場合に使うサブルーチン で、それぞれLATTICGSTEP1SYMMGSTEPF、 が対応します。ユニットセルの形が変わるだけで、かつ平面波数を固定(あま り良いやり方ではない)しているので、格子に関しての再計算をする必要がな いため、それらの簡易版になっています。

SYMMKSTEP はそれぞれ、扱う系に対称性がある場合、そのための対称操作を計算するサブ ルーチン、ブリュアンゾーン内のk点座標の計算(対称性を考慮した部分も存 在)を行なうサブルーチンです。
但し、現段階では、対称性の具体的な計算部分(サブルーチン)は公開でき ないので、ここでSYMMやKSTEPの説明を行なう意味はあまりありません(ので 省略)。

EWVECEWVMD はエバルト和の計算を行なうサブルーチンです。実はどちらも同じことをする サブルーチンですが、EWVMDの方が、ややベクトル化を考慮してあります。エ バルト和はつまり、原子のイオン芯同士のクーロン相互作用であり、マーデル ングエネルギーとほぼ同じものと思ってもらって差し仕えありません。
基本的には、実空間部分と逆空間部分とに分けて、うまくイオン芯同士のクー ロン相互作用の計算を行ないます。
エバルト和の計算については、参考文献 (4)の31ページを参照して下さい。

次にPCCの説 明を行ないます。これは部分内殻補正(partial core correcotion:PCC)の計算を行なうサブルーチンです。具 体的には、擬ポテンシャル作成段階で作っておいたPCC部分(動径方向、実 空間)を、逆空間にフーリエ変換します。そのため動径方向に関しての数値積 分を行なっています。やり方そのものは、局所擬ポテンシャルの場合と基本的に同じです。

残ったサブルーチンで説明を必要とするのはXCFFTXSTPCDIAGON です。
これらのサブルーチンはちょっと詳しく説明する必要があります。

XCFFT
これは交換相関ポテンシャル、エネルギーを計算するためのサブルー チンです。具体的には、逆空間の(CHAVER で作った)電荷密度を高速フーリエ逆変換を使って実空間電荷密度にします。 本計算ではWignerの方法を使って、この 実空間電荷密度から交換相関ポテンシャル、エネルギーを求めます。
また、ここでPCCの考慮が必要な場 合は、その計算も行ないます。
そして、求めた実空間での交換相関ポテンシャル、エネルギーを再び高速フー リエ変換を使って、逆空間のものに戻します。
因みに、このサブルーチンではポテンシャルとエネルギーは同時には計算さ れません。(ポテンシャル用、エネルギー用と場合分け〔当然IF文で〕されて います。)
XSTPC
これは交換相関ポテンシャル、エネルギーのストレス版です。特に、 部分内殻補正PCCがストレス計算で考 慮されています。
部分内殻補正に対するストレスの表式(pdf形 式、159 kb、Appendix参照、CMSMD'96の原稿pdf)。
但し、実を言うとこのサブルーチンには問題があります。深刻なほどではな いのですが、完全に無視できるほどではありません(厳密にはバグとも言えな い)。もう少し新しいバージョンのプログラム(磁性考慮版)では修正されて いますが、本バージョンでは取り敢えずこのまま公開してしまいます。
また、PCCを使わない場合は、この問題 は顕在化しません。
DIAGON
いよいよ最後(でなくなった。10/13)に残った、各論4で最も 重要なサブルーチンの説明を行ないます。このルーチンは本計算プログラムで は第一回目のイタレーションでのみ呼び出されます。
つまり、カー・パリネロ的な計算のためには、初期値としての固有ベクトル (つまり波動関数)と固有値(固有エネルギー)が必要です。そのために最初 のイタレーションで、従来から使われてきた対角化による方法を用いて、初期 固有ベクトル、固有値を求めます。これを第2回目以降の逐次更新型の計算イ タレーションで利用する訳です。
この対角化の計算部分では、最初にマトリックス要素(運動エネルギー項、 ローカル項〔局所擬ポテンシャル項、ハートリー項、交換相関項〕、非局所擬 ポテンシャル項、その他)を計算します。これを対角化することによって、固 有ベクトル、固有値を求めます。

ここでの問題が対角化を行なうサブルーチンですが、 このDIAGON ではCHOBSD、HZES1M、DHEIG2(後の2つは注釈になっています)を呼び出して います。これらはそれぞれNUMPAC(科学技術計算ライブラリ、元は名古屋大学 の研究者が開発したもの、現在は富士通が管理)、日立のメインフレーム用の 科学技術計算ライブラリ、SSL2(富士通のメインフレーム用の科学技術計算ラ イブラリ)の各ライブラリに対応しています。これらは市販されているもので、 当該企業に著作権、所有権があります。従って、これらを公開することはできません

筆者が一番最初に計算した頃(1989年当時)は、SSL2のDHEIG(エ ルミート行列の対角化)を使っていました。このサブルーチン(DHEIG)は、 対角化すべき2次元配列の格納方法が特殊だったため、DIAGONでのマトリック ス要素の計算方法が大分複雑になってしまっています。当然、DHEIG以外のルー チンを使う場合は、格納方法が異なるのですが、最初の方法をそのまま踏襲す るような形でルーチンに修正を加えています。従って、このDIAGONサブルーチ ンはあまり可読性が良いと言えません。
FERMI
(10/13、1997)追加としてサブルーチンFERMI の説明を行ないます。これは、東京理科大学の浜田先生が作成したものです。 これは、バンドが完全に詰まり切っていない場合(部分的にバンドに電子が占 有される状態、つまり金属状態)で、k点とバンド(バンドインデックス)の 足し上げを行なうための簡易方法の一 つです。
具体的な方法は、バンドを二つの放物線関数を張り合わせた幅のある形で表 現し、それが部分的に占有され、金属的なバンド構造の場合でのk点、バンド 毎の足し上げを可能とします。

幅の与え方によって、全エネルギーの値が異なるので、系の全エネルギーを 比較する場合は、同じ幅で統一しておかないと比 較する意味が無くなってしまうので注意が必 要です。(本当は、幅をゼロにした場合への外挿なども考慮する必要がありま すが、筆者はそこまではやっていません。ただ極めて厳密な計算が必要でなけ れば、外挿までする必要はないと考えられます。)

尚、サブルーチンWIDTH2 は、幅を持たせたバンドでの、電子の占有数を計算(放物関数を使っているの で厳密に求められる)しています。
以上で、大部分のサブルーチンに関しての説明は終了しました。これまで説 明、公開してきたメインルーチン、サブルーチンを使って、一つのバンド計算 プログラムを次の「つくってみようバンド計算プログラム編」(当該ページは 現在存在しません。5/23、2005)で作ってみようと思います。
現在、当該ページは、「使ってみようバンド計 算プログラム」となっています。

[先頭][総目次 ][最初に戻る][使ってみようバンド計算プログラム編][デバッグ編]