カテゴリー別アーカイブ: 分子動力学

プログラミング環境の準備

研究室ではLinux環境を推奨していますが、ここではLinuxに慣れていない人のためにWindows上で環境を準備する方法を説明します。


Microsoft Microsoft Visual Studio Express 2013 のインストール方法

1. Express 2013 woth Update 4 for Windows Desktopのインストール
2. ユーザ登録(個人のPCにインストールした場合)
  • メニューから「ヘルプ」→「製品の登録」を選択
  • 「今すぐ登録」をクリックする。
  • webページに必要事項を記入して製品登録し、登録キーを入手する。
3. 終了
  • メニューから「ファイル」→「終了」を選択

 


 VMDのインストール手順

VMDはイリノイ大学で開発されたフリーの分子可視化ソフトです。      

1. VMDインストーラのダウンロード
  • http://www.ks.uiuc.edu/Research/vmd/にアクセスし、左メニューから「Download VMD」を選択する。
  • 最新のバージョンから、使用しているプラットホームに合ったプログラムを選択する。(おそらく多くの人はWindows OpenGL)。
  • ユーザ登録をして、インストーラ(vmd19*win32.msi)をダウンロードする。
2.インストーラを起動し、インストールする。

Windows版gnuplotのインストール手順 

1. インストーラのダウンロード
  • http://sourceforge.net/projects/gnuplot/files/にアクセス。「gunuplot」フォルダを開き、最新版のフォルダ(本稿執筆時は4.6.0)を開き、「gp460-win-setup.exe」を選択し、ダウンロード。
2. ダウンロードしたファイルを実行し、インストール。
  • 「コンポーネントの選択」で、必要であれば「日本語対応」にチェックする。
  • 「追加タスクの選択」で、必要であれば「デスクトップ上にアイコンを作成する」にチェックする。
3. セットアップウィザードを完了して終了。

Hello World!

プログラムの開発環境を導入した後、誰もが最初にするのは、”Hello World!”と文字列を出力するプログラムの動作テストでしょう。ここでは、Visual Studioでコンソールウィンドウに文字列を出力するテストプログラムの作成法を説明します。

1. Visual Studioを起動する。

2.  新規プロジェクトの作成

  • メニューから「ファイル」→「新規作成」→「プロジェクト」を選択
  • 「新しいプロジェクト」ダイアログボックスがオープンする。「Visual C++」の「Win32」を選択して「Win32 コンソール アプリケーション」を選ぶ。
  • 下部に「プロジェクト名」を入力し、さらにその下の「場所」でプロジェクトの保存先を指定する。
  • Win32アプリケーション・ウィザード 「完了」

 

3.  プログラムの作成

  • 最初から下記のフレームワークが用意される。
#include “stdafx.h”

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
  • フレームワークに文字列を出力するコードを追記する。
#include “stdafx.h”

int _tmain(int argc, _TCHAR* argv[])
{
 printf(“Hello World!\n”);
  return 0;
}

3.  プログラムの実行

  • メニューから「ビルド」→「ソリューションのビルド」を選択
  • メニューから「デバッグ」→「デバッグなしで開始」を選択
  • コンソールウィンドウが開いて、「Hello World!」と表示されれば成功。

 

4.  Visual Studioの終了

  • メニューから「ファイル」→「終了」を選択

 

 

VMDによる分子の表示

1. 構造ファイルの準備

適当なテキストエディタ(メモ張、ワードパッド、秀丸など)で、次のファイルを作成する。これは水分子のxyz座標を記述したファイルである。

ファイル名:water.xyz

3
Water molecule
O  5.00  5.00 5.00
H  5.76  4.41 5.00
H  4.24  4.41 5.00
水分子の構造

 

 

2.VMDを起動

プログラムを起動すると、下図のように「VMD 1.9.* OpenGL Display」、「VMD Main」「VMD1.9.*」の3つのウィンドウが現れる。

vmd1
VMD起動時の画面

3. 分子構造ファイルの読み込み

  • 「VMD Main」ウィンドウの「File」→「New Molecule」を選択。「Molecule File Browser」ダイアログの「Filename」テキストフィールドに入力ファイルへのパスを入力。あるいは、テキストフィールド脇の「Browse…」ボタンを押して、エクスプローラを起動し、ファイルを指定する。
    ※ファイルのパスに日本語のディレクトリが含まれているとエラーになるので要注意。
  • 「Molecule File Browser」ダイアログの「Load」を押すと、ファイルが読み込まれる。
vmd2
water.xyzを読み込み直後の画面

 3. 見栄えの調整

  • 「VMD Main」ウィンドウの「Graphics」→「Representations」を選択。「Graphical Representations」ダイアログの「Drawing Method」で、たとえば「CPK」を選択すると、「VMD 1.9.* OpenGL Display」の原子が球体で表示される。
  • 「Graphical Representations」ダイアログの「Sphere Radius」を調節すると、原子を表わす多面体の細かさが変化する。
vmd3
Representation調整後の表示例

 4. VMDの終了

「VMD Main」ウィンドウの「File」→「Quit」を選択。ダイアログで「Yes」を押して終了。

グラフェンの原子模型

グラフェンシートの構造を生成するプログラムを作成し、VMDで表示させてみよう。

グラフェンとは、C(炭素)が下図のような2次元6角形格子をなしたものである。a は格子定数 でa=2.461Åである。単位格子には2つのC原子(A,B)が含まれる。それぞれの原子の座標はA: (0, 0), B: (2/3, 2/3)である。

図1のコピー
グラフェンの構造

 1. VC++で以下のプログラムを作成する。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
  double a = 2.461;     // lattice constant
  double a1[2], a2[2];  // basis vectors
  double A[2], B[2];    // atom positions;
  int L1, L2;           // number of repitition
  double b[2], c[2];    // temporal memory
  int i,j;
  FILE *fp;

  a1[0] = a * 0.5 * 1.7320508;
  a1[1] = a * 0.5;
  a2[0] = a * 0.5 * 1.7320508;
  a2[1] = a * (-0.5);
  A[0] = 0.0; A[1] = 0.0;
  B[0] = 2.0/3.0; B[1] = 2.0/3.0;
  L1 = 10; L2 = 10;

  fopen_s(&fp,"graphen.xyz","wt");
  fprintf(fp,"%d\n", 2*L1*L2);
  fprintf(fp,"graphen sheet\n");

  for(i=0; i<L1; ++i){
    for(j=0; j<L2; ++j){
    // put atom A
    b[0] = (double)i + A[0];
    b[1] = (double)j + A[1];
    c[0] = a1[0] * b[0] + a2[0] * b[1];
    c[1] = a1[1] * b[0] + a2[1] * b[1];
    fprintf(fp,"C %f %f 0.0\n", c[0], c[1]);
    // put atom B
    b[0] = (double)i + B[0];
    b[1] = (double)j + B[1];
    c[0] = a1[0] * b[0] + a2[0] * b[1];
    c[1] = a1[1] * b[0] + a2[1] * b[1];
    fprintf(fp,"C %f %f 0.0\n", c[0], c[1]);
  }
}

fclose(fp);
return 0;
}

2. プログラムをビルド、実行

 

3. グラフェンの表示

  • プロジェクト・ディレクトリの中の、プロジェクト名と同じディレクトリの中に “graphen.xyz”というファイルが生成されている。
  • VMDでこの”graphen.xyz”を読み込み、分子構造を表示する。
  • 下図のような構造が表示されたら成功。
vmd4
VMDで表示したグラフェン

 

Newton方程式の数値解法 (Verlet法)


Newtonの運動方程式を有限差分近似で解く方法を説明する。

1. 有限差分法とは

有限差分法 (finite difference method)とは、導関数を有限差分を使った代数式で近似して微分方程式を解く方法である。

$$\frac{df(t)}{dt} = \frac{f(t+h)-f(t)}{h}+O(h)$$

これは、\( t \)から\( h\)だけ先に進んだ地点(時点)の値を使って傾きを計算しているので、前進差分近似と呼ばれる。逆に後ろの地点(時点)の値を使って

$$\frac{df(t)}{dt} = \frac{f(t)-f(t-h)}{h}+O(h)$$

と近似することもできる。これを後退差分近似と呼ぶ。

\( t +h\)の値と\( t-h\)の値の両方を使って近似する方法を、中央差分近似と呼ぶ。

$$\frac{df(t)}{dt} = \frac{f(t+h)-f(t-h)}{2h}+O(h^2)$$

中央差分近似は、前進差分や後退差分と比べて誤差が\(h^2\)のオーダーとなり、近似精度が良い。

2階の導関数は次のように有限差分で近似できる。

$$\frac{d^2f(t)}{dt^2} = \frac{f(t+h)-2f(t)+f(t-h)}{h^2}+O(h^2)$$

2. Verlet法

Verlet法は、Newton方程式の数値解法としてシンプルかつ実用的な方法として広く用いられている方法である。

時刻\(t\)における粒子の位置ベクトルを\(\boldsymbol{r}(t)\)としたとき、時刻\(t+\Delta t\)の位置ベクトル\(\boldsymbol{r}(t+\Delta t)\)を、次式で決定する。

$$ \boldsymbol{r}(t+\Delta t) =2   \boldsymbol{r}(t)  – \boldsymbol{r}(t-\Delta t)+\Delta t^2   \frac{\boldsymbol{f}(t)}{m}$$

ここで\(\boldsymbol{a}(t)\)は時刻\(t\)において粒子に加わる力を表す。\(m\)は粒子の質量である。

最初に\(\boldsymbol{r}(0)\)と\(\boldsymbol{r}(\Delta t)\)を与えれば、上の式を繰り返し適用することで\(\boldsymbol{r}(\Delta t), \boldsymbol{r}(2\Delta t), \boldsymbol{r}(3\Delta t), \boldsymbol{r}(4\Delta t)\cdots\)と時間間隔\(\Delta t\)で次々と位置座標の時系列データが生成される。

Verlet法による調和振動子のMD計算

調和振動子の運動をVerlet法を用いて再現してみよう。

1.調和振動子

まずは復習を兼ねて1次元の調和振動子の運動方程式を解析的に解いてみよう。

調和振動子の位置を\(x\)と書くと、調和振動子のテンシャルエネルギーは

$$ \phi(x) = \frac{1}{2}C x^2 $$

で与えられる。\(C\)は定数である。位置\(x\)において調和振動子に加わる力は

$$ f(x) = -\frac{d}{dx}\phi(x) = -C x$$

となる。したがって調和振動子の運動方程式は

$$ \frac{d^2 x(t)}{dt^2} = -\frac{C}{m} x(t)$$

となる。この微分方程式の一般解は

$$x(t) = A \sin \sqrt{\frac{C}{m}}t+B\cos  \sqrt{\frac{C}{m}}t$$

である。例として初期条件\(x(0)=1\)、\(\dot x (0) = 0\)のときの特解を求めると

$$x(t) =  \sin \sqrt{\frac{C}{m}}t$$

すなわち、角周波数\(\omega = \sqrt{C/m}\)、周期\(T=2\pi \sqrt{m/C}\)の単振動(正弦波)となる。

Lennard-Jonesポテンシャルを用いたMDシミュレーション

原子間ポテンシャル

\(N\)個の粒子からなる系の全ポテンシャルエネルギー\(V(\boldsymbol{r}_1,\boldsymbol{r}_2,\cdots,\boldsymbol{r}_N)\)は、1体項、2体項、3体項、・・・の和に展開して表すことができる。これをクラスター展開と呼ぶ。

$$\begin{eqnarray} V(\boldsymbol{r}_1,\boldsymbol{r}_2,\cdots,\boldsymbol{r}_N) & = & \sum_i v_1(\boldsymbol{r}_i) +  \sum_i \sum_{j>i}v_2(\boldsymbol{r}_i,\boldsymbol{r}_j)\\
&&+\sum_i \sum_{j>i} \sum_{k>j>i} v_3(\boldsymbol{r}_i,\boldsymbol{r}_j,\boldsymbol{r}_k)+\cdots
\end{eqnarray}$$

\(v_1(\boldsymbol{r}_i)\)は1体項と呼ばれ、外力の効果を表す。第2項以降が原子間相互作用のポテンシャルである。\(v_2(\boldsymbol{r}_i,\boldsymbol{r}_j)\)は2体項、あるいはペアポテンシャルと呼ばれる。2原子間の距離\(r_{ij}=|\boldsymbol{r}_i-\boldsymbol{r}_j |\)のみに依存する場合は、\(v_2(r_{ij})\)と書ける。\(v_3(\boldsymbol{r}_i,\boldsymbol{r}_j,\boldsymbol{r}_k)\)は3体項と呼ばれ、共有結合の結合角に依存したエネルギーを表すためによく用いられる。

上の式には示されていないが、分子鎖のねじれ角の歪エネルギーを表すために4体項が用いられることもある。5体項以上は少なくとも筆者は見たことがない。ただし、配位数に応じて2体項や3体項が変化するように拡張した、いわゆる多体効果を取り入れた2体、3体ポテンシャルは無数に存在する。

有効ペアポテンシャル

共有結合のように異方性の強い相互作用がなければ、3体項以上の多体項の効果を2体項に繰り込んでしまう近似法が取られることが多い。これを有効ペアポテンシャルと呼ぶ。

$$ V \simeq \sum_i v_2^{\rm eff} (r_{ij}) $$

有効ペアポテンシャルの代表的な例が、Lennard-Jones 12-6 ポテンシャルである。

$$ v_2^{\rm LJ}(r) = 4 \varepsilon \left \{ \left ( \frac{\sigma}{r} \right )^{12} – \left ( \frac{\sigma}{r} \right )^6 \right \} $$

ちなみに\(1/r^6\)に比例する項がロンドン力、すなわち誘起双極子間に働く引力で、いわゆるファン・デル・ワールス力の主成分である。\(1/r^{12}\)に比例する項は近接反発項で、12乗という数字に特に理論的根拠はない。6乗に反比例する項より速やかにゼロに収束させるためには6乗より大きくする必要があるが、12という数が用いられるのは、単に6の2倍で、計算に便利だからであろう。

ポテンシャルの単位変換

Stillinger-Weberポテンシャルでは、長さの単位が\(\sigma\)=2.0951Å、エネルギーの単位が\(\varepsilon\)=50kcal/molと指定されており、含まれるポテンシャルパラメータの数値もこの単位系を前提にして決められている。しかしプログラムによっては、Å-eV単位系を使いたいときもあるだろうし、原子単位系を使いたい場合もあるだろう。

単位変換の一般的な指針

ある単位系で定義されたポテンシャル関数\(\phi(r)\)を、別の単位系のポテンシャル関数\(\phi^\prime(r^\prime)\)に変換するにはどうしたらよいだろうか? ここで\(r^\prime\)は、 \(r^\prime= \sigma r\)によって長さの単位が変えられた新しい変数を表す。元の単位系のエネルギーの単位が、新しいエネルギー単位の\(\varepsilon\)倍であるとすると、単位系の変換の前と後でポテンシャルエネルギーは同一でなければならないから

$$\phi^\prime(r^\prime) = \varepsilon \phi(r) $$

が成立するはずである。ポテンシャルの単位系を変換するには、この条件を満たすようにパラメータの数値を変換すればよい。

単位変換の具体例

次式で与えられるStillinger-Weberポテンシャルの2体項を例にとって単位の変換法を見てみよう。

$$\phi_2(r) = A (Br^{-p} –  r^{-q})\exp{\left ( \frac{1}{r-a} \right )} $$

ただしここで\(r < a\)である。\(a\)はカットオフ距離と呼ばれ、2つの原子間距離\(r\)がカットオフ距離以上では、上式を用いずにポテンシャルエネルギーをゼロとする(こうしても\(r=a\)で不連続にならず、\(C^\infty\)級の連続関数になっているところがこの関数の良いところだ)。Si用のStillinger-Weberポテンシャルでは、長さの単位が\(\sigma\)=2.0951Å、エネルギーの単位が\(\varepsilon\)=50kcal/molとして各パラメータ\(A,B,p,q,a\)の値が決められている。

ここで、\(r^\prime= \sigma r\)で\(r\)を置き換えると

$$\begin{eqnarray}\phi_2(r^\prime/\sigma)& =& A (B(r^\prime/\sigma)^{-p} – (r^\prime/\sigma)^{-q})\exp{\left ( \frac{1}{(r^\prime/\sigma)-a} \right )}\\&=& A \sigma^q(B\sigma^{p-q}r^{\prime-p} –  r^{\prime-q})\exp{\left ( \frac{\sigma}{r^\prime-a\sigma} \right )}\end{eqnarray}$$

となり、新しい単位系におけるポテンシャル\(\phi_2^\prime(r^\prime)\)は

$$\begin{eqnarray}\phi_2^\prime(r^\prime)& =&\varepsilon  \phi_2(r)\\&=&\varepsilon A \sigma^q(B\sigma^{p-q}r^{\prime-p} –  r^{\prime-q})\exp{\left ( \frac{\sigma}{r^\prime-a\sigma} \right )}\end{eqnarray}$$

となる。したがって、下の表のように新しい単位系のパラメータを定義すれば、元の関数形をほぼ維持しながら新しい単位系に移行できる。

単位変換前 単位変換後
\(A\) \(A^\prime = \varepsilon A \sigma^q\)
\(B\) \(B^\prime = B\sigma^{p-q}\)
\(p\) \(p^\prime = p\)
\(q\) \(q^\prime = q\)
\(a\) \(a^\prime = \sigma a\)

$$\phi_2^\prime(r^\prime)= A^\prime (B^\prime r^{\prime-p^\prime} –  r^{\prime-q^\prime})\exp{\left ( \frac{\sigma}{r^\prime-a^\prime} \right )}$$

指数関数の中の分子の1が\(\sigma\)に変わってしまうところが玉にキズだが、この1は長さの次元を持った量なので、本来パラメータとして扱うべきものである。

力の計算ルーチンのターム指向記述

繰り返し手続きを表す記法の導入

forループのプログラム

for(i=0; i<N; i++){
  a[i] += f();
}

を次のように記述してみよう。

$$ \mathop{\large \Lambda}_{i=0}^{N-1} \Bigl\{a_i \;+\!\!=\; f() \Bigr\}$$

ここで\(\Lambda\)は本稿オリジナルの記法で、右に書かれている代入操作を\(i=0\)から\(i=N-1\)まで\(i\)を1つずつ増やしながら繰り返し実行することを表す。操作の結果が繰り返しの順序によらない場合は交換則

$$ \mathop{\large \Lambda}_{i}\mathop{\large \Lambda}_{j}\bigl\{{\it operation}\bigr\} = \mathop{\large \Lambda}_{j}\mathop{\large \Lambda}_{i}\bigl\{{\it operation}\bigr\} $$

が成り立つ。等号は「計算で扱っている変数の値が、一連の計算終了後に全て同じになる」ことを意味する。

また、原子間ポテンシャルや力の計算でよく現れる和\(\sum\)は、繰り返しの足し算操作であるから

$$ \mathop{\large \Lambda}_{i}\left\{a_i\;+\!\!=\;\sum_j f_j\right\} = \mathop{\large \Lambda}_{i}\mathop{\large \Lambda}_{j}\Biggl\{a_i\;+\!\!=\;\ f_j\Biggr\} $$

のように\(\Lambda\)を使って書き直すことができる。

 アトム指向記述とターム指向記述

forループによる繰り返し操作を表す\(\Lambda\)を使って、Lennard-Jonesポテンシャル

$$ V = \sum _i \sum_{j>i} v_2^{\rm LJ}(r_{ij}) = \sum _i \sum_{j>i} 4 \varepsilon \left \{ \left ( \frac{\sigma}{r_{ij}} \right )^{12} – \left ( \frac{\sigma}{r_{ij}} \right )^6 \right \} $$

とその力

$$ \boldsymbol{F}_i = -\sum_{j\neq i} 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}
^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_i-\boldsymbol{r}_j}{r_{ij}}
$$

の計算ルーチンを記述してみよう。

ポテンシャルエネルギーの計算ルーチンは

$$ \mathop{\large \Lambda}_{i} \mathop{\large \Lambda}_{j>i} \Biggl\{ V \;+\!\!=\; 4 \varepsilon \left \{ \left ( \frac{\sigma}{r_{ij}} \right )^{12} – \left ( \frac{\sigma}{r_{ij}} \right )^6 \right \} \Biggr\}$$

でよい。これは問題ないだろう。

力については、系の全ての原子にかかる力を計算するのだから、

$$ \begin{eqnarray}
&&\mathop{\large \Lambda}_{i} \Biggl\{ \boldsymbol{F}_i \;+\!\!=\; -\sum_{j\neq i} 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_i-\boldsymbol{r}_j}{r_{ij}} \Biggr\}\\
&=& \mathop{\large \Lambda}_{i} \mathop{\large \Lambda}_{j\neq i} \Biggl\{ \boldsymbol{F}_i \;+\!\!=\; – 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}
^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_i-\boldsymbol{r}_j}{r_{ij}} \Biggr\}
\end{eqnarray}
$$

となる。これをアトム指向記述と筆者は呼んでいる。ポテンシャルの計算も一緒に行うなら、

$$ \begin{eqnarray}
&\mathop{\large \Lambda}_{i} \mathop{\large \Lambda}_{j \neq i} \bigl\{ \bigr .&\\
&& {\rm if}(j>i) \;\;\; V \;+\!\!=\; 4 \varepsilon \left \{ \left ( \frac{\sigma}{r_{ij}} \right )^{12} – \left ( \frac{\sigma}{r_{ij}} \right )^6 \right \} ;\\
&& \boldsymbol{F}_i \;+\!\!=\; – 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}
^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_i-\boldsymbol{r}_j}{r_{ij}}\\
&\bigl . \bigr \}&
\end{eqnarray}$$

と記述すればよい。\(j\)についての\(\Lambda\)ループの範囲が\(j > i\)に限定されていないので、\( {\rm if}(j>i)\)の制限がないとポテンシャルエネルギーを足し合わせすぎることになる。Lennard-Jonesポテンシャルは単純だから問題ないかもしれないが、3体項など複雑な項を含むポテンシャルの場合は、どのような制限を設けたらよいか分かりにくくなり、ミスの原因になりやすい。

これに対しターム指向記述では、ポテンシャルの計算ルーチンをベースに力の計算手続きを加えていく。

$$ \begin{eqnarray}
&\mathop{\large \Lambda}_{i} \mathop{\large \Lambda}_{j>i} \bigl\{ \bigr .&\\
&& V \;+\!\!=\; 4 \varepsilon \left \{ \left ( \frac{\sigma}{r_{ij}} \right )^{12} – \left ( \frac{\sigma}{r_{ij}} \right )^6 \right \} ;\\
&& \boldsymbol{F}_i \;+\!\!=\; – 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_i-\boldsymbol{r}_j}{r_{ij}};\\
&& \boldsymbol{F}_j \;+\!\!=\; – 4 \varepsilon \left ( -12 \frac{\sigma^{12}}{r_{ij}^{13}} + 6 \frac{\sigma^6}{r_{ij}^7} \right)\frac{\boldsymbol{r}_j-\boldsymbol{r}_i}{r_{ij}}\\
&\bigl . \bigr \}&
\end{eqnarray}$$

ターム指向記述のポイントは、\(\Lambda\)ループの中の各ポテンシャルエネルギー項に注目し、その項に関与する全ての原子(ここでは\(i\)と\(j\)の2個)に掛かる力を計算して足し合わせている点にある。まず系の全ポテンシャルエネルギーを計算するルーチンを記述しておき、このフレームワークの中で、力の計算式を追記するだけでよい。

ここで取り上げたLennard-Jonesポテンシャルは非常に単純なので、ターム指向記述の良さは伝わりにくいかもしれない。ターム指向記述の良さは、より複雑なポテンシャルでも、同じ手順で機械的にポテンシャルエネルギーと力の計算ルーチンを作成できる点にある。作用-反作用の法則より原子\(i\)と原子\(j\)の間には逆向きに同じ大きさの力が働くから、うまく書けばアトム指向記述に比べて計算量を大幅に減らすことができる。

力の計算ルーチンをインプリメントする際は、ターム指向記述を心がけよう!

Stillinger-Weberポテンシャル

Stillinger-Weberポテンシャルの定義

$$ V = \varepsilon \sum_{i}\sum_{j>i} f_2(r_{ij}) + \varepsilon \sum_i\sum_{j>i}\sum_{k>j>i} f_3(\boldsymbol{r}_i,  \boldsymbol{r}_j, \boldsymbol{r}_k) $$

ここで\(f_2\)は2体項で

$$ f_2(r) = \left \{
\begin{array}[ll]
\displaystyle A(Br^{-p} – r^{-q}) \exp \left ( \frac{1}{r-a} \right ), & r < a \\ 0, & r \geq a \end{array} \right . $$

と定義される。\(f_3\)は3体項で

$$ \begin{eqnarray} f_3(\boldsymbol{r}_i,  \boldsymbol{r}_j, \boldsymbol{r}_k) & = & h(r_{ij}, r_{ik}, \theta_{jik}) + h(r_{ji}, r_{jk}, \theta_{ijk})\\ &&+ h(r_{ki}, r_{kj}, \theta_{ikj}) \end{eqnarray} $$
$$ h(r_{ij}, r_{ik}, \theta_{jik}) = \lambda \exp \left [\left (\frac{\gamma}{r_{ij}-a}\right ) + \left (\frac{\gamma}{r_{ik}-a}\right) \right ] {\left (\cos \theta_{jik} + \frac{1}{3} \right )} ^2 $$

のように定義されている。