シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle...

49
シミュレーションの全体像・概論 松本充弘 京都大学 大学院工学研究科 問合せ先: [email protected] 資料掲載:http://www.mitsuhiromatsumoto.mech.kyoto-u.ac.jp/ 2019 7 月 改訂 目次 1 本講の目的 2 2 分子シミュレーションとは 2 3 モンテカルロ法 vs 分子動力学法 4 3.1 統計力学のエッセンス .................................. 4 3.2 まずはモンテカルロ法の原理を理解しよう ....................... 5 3.3 つづいて分子動力学法の原理を学ぶ ........................... 11 3.4 その他,さまざまな分子シミュレーション ....................... 14 4 例題:単原子分子系の分子シミュレーションとデータ解析 16 4.1 分子間の相互作用 ..................................... 16 4.2 境界条件 .......................................... 19 4.3 分子動力学シミュレーション ............................... 20 4.4 モンテカルロシミュレーション ............................. 23 4.5 データ解析入門 ...................................... 25 5 計算効率を上げるには 33 5.1 高速化:物理学的な視点から ............................... 33 5.2 高速化:数値計算法の視点から ............................. 37 5.3 高速化:計算機の視点から ................................ 38 6 分子シミュレーションのためのオープンソースソフトウェアの例 46 6.1 分子シミュレーションソフトウェア ........................... 46 6.2 データ可視化用ソフトウェア ............................... 47 参考文献 48 1

Upload: others

Post on 08-Jul-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

シミュレーションの全体像・概論

松 本 充 弘京都大学 大学院工学研究科

問合せ先: [email protected]

資料掲載:http://www.mitsuhiromatsumoto.mech.kyoto-u.ac.jp/

2019年 7月 改訂

目 次

1 本講の目的 2

2 分子シミュレーションとは 2

3 モンテカルロ法 vs 分子動力学法 4

3.1 統計力学のエッセンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3.2 まずはモンテカルロ法の原理を理解しよう . . . . . . . . . . . . . . . . . . . . . . . 5

3.3 つづいて分子動力学法の原理を学ぶ . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.4 その他,さまざまな分子シミュレーション . . . . . . . . . . . . . . . . . . . . . . . 14

4 例題:単原子分子系の分子シミュレーションとデータ解析 16

4.1 分子間の相互作用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4.2 境界条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.3 分子動力学シミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

4.4 モンテカルロシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

4.5 データ解析入門 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5 計算効率を上げるには 33

5.1 高速化:物理学的な視点から . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.2 高速化:数値計算法の視点から . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.3 高速化:計算機の視点から . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

6 分子シミュレーションのためのオープンソースソフトウェアの例 46

6.1 分子シミュレーションソフトウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

6.2 データ可視化用ソフトウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

参考文献 48

1

Page 2: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

1 本講の目的

本講は,分子シミュレーションの原理をひととおり理解していただくためのものである.本スクール

では,「分子シミュレーション」を共通のキーワードとする,さまざまな分野の専門家の方々が,いろいろ

な手法を解説し,またその応用例を紹介することになっているが,その前提として,分子シミュレーショ

ンの基本事項をある程度知っておいていただく必要がある.本スクールの受講者が一人でも多く,「何

だ,分子シミュレーションはブラックボックスの道具ではないのか.よぅし,私も研究の一手段として

分子シミュレーションを始めてみよう」と思うようになっていただければ,本講の目的が達成される.

このテキストは,90分の時間内で,分子シミュレーションの基本事項を「広く,浅く」紹介するため

の資料として作成した.従って,理論的な基礎や裏付け,最先端のテクニック,実際に利用する際の細か

い注意点などにはほとんど触れていない.各自の研究手段として分子シミュレーションを現場で利用し

てもらうための詳細は,必要に応じて,このスクールの他の講義やいろいろな参考書で実践的に学んで

いただかなければならない.分子シミュレーションに関して,数多くの教科書・参考書が出版されてい

る.幸いにも,日本は分子シミュレーション分野で世界の最先端を走っている国のひとつであり,日本

語で書かれた教科書も多い.現在,比較的入手しやすいと思われるものを章末の参考文献に挙げておく.

日本語のもの [1–16]も英語のもの [17–26]もあるので,用途やレベルに応じて適当なものを選ぶことが

できる.

2 分子シミュレーションとは

シミュレート simulate とは「ふりをする,模倣する」という意味の他動詞である.そこから派生し

た名詞 シミュレーション simulation は,科学技術用語としては元来「模擬実験」を意味する.何らか

のモデルに基づいて,対象系のふるまいを調べる方法を一般にシミュレーションとよぶ.コンピュータ

による数値計算を必要とする場合,数値シミュレーション numerical simulation という用語もよく聞か

れる.耐震設計のための構造シミュレーション,自動車や航空機を設計するための流体シミュレーショ

ン1,などはよく知られた例であろう.このスクールで取り上げるのは,分子シミュレーション molecular

simulation である.狭義に解釈すると,分子集合系を対象とする数値シミュレーション ということにな

るが,最近ではその手法はずいぶんと広がり,後述のようにマクロスケールの現象のシミュレーション

への応用もさかんに行われている.

扱う空間スケールとしてはかなり大きな幅をもつ「分子シミュレーション」であるが,共通点は,シ

ミュレーションの最小単位を “粒子 particle”と考えることである.1つの粒子が1つの原子や分子を

あらわすものが,狭義の分子シミュレーションであるが,数十個あるいは数万個もの原子・分子を1つ

の粒子と考える粗視化シミュレーションも,手法としての共通点が大きいため,やはり分子シミュレー

ションの一種と考えることができる.また極端な場合には,サイズが 1mにもなるような岩石塊や流体

要素を1つの粒子とするような,非常にマクロスケールな混相流 (multi-phase flow) シミュレーション

1数値風洞 numerical wind tunnel というしゃれた名前を耳にしたことがあるかも知れない.

2

Page 3: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

も行われている.この場合は,むしろ粒子シミュレーション particle simulation という呼び名がふさわし

い.この講義では,概論 として,主に分子スケールの粒子を対象とするシミュレーション法について説

明する.

分子シミュレーションの手法は,モンテカルロ法 と 分子動力学法 に大別される.前者は,計算機の中

に対象系の熱平衡状態を作り出し,その性質を評価する目的で利用されるのが原則である.後者は,対

象系を構成する各粒子の運動を計算機で追跡することにより,粒子集合体の性質を調べるものであり,平

衡状態の解析以外にもさまざまな目的で行われる.この2つの方法は,出発点となる考え方がかなり異

なる.まずは,次の第 3章でそれぞれの基本事項を説明する.

さて,「原子・分子の集合体を計算機内で再現する」とは言っても,その数はとてもアボガドロ数には

届かない.スーパーコンピュータと呼ばれるような最新鋭の計算機でも,高々105–1010程度がせいぜい

であろう2.小さな系と有限の能力しかない計算機を使って,いかにうまく研究対象となる系の性質を調

べるか が,シミュレーション屋としての腕の見せ所である.その出発点となるように,2つのプロトタ

イプ計算コードを示しながら,モンテカルロ法・分子動力学法の具体的な計算手順や基礎的なデータ解

析法を述べるのが,第 4章である.

最後の第 5章では,実際に分子シミュレーションを研究手段として使ってもらうための,いくつかの

工夫を述べる.研究分野ごとにさまざまなアイディアが次々と提案され,シミュレーション技術は日進月

歩で進化しているのであるが,「モデルを用いた数値計算」である以上,(1) モデルに関する工夫,(2)

数値計算に関する工夫,(3) 計算機(ハードウェア,ソフトウェア)に関する工夫,には分野を越えてあ

る程度共通のところがある.第 5章に紹介しているようなことから始めて,ひと通りの基本的な手法を

身につけておくと,ある日突然,少し離れた分野で技術革新が起こったときに,それをすぐに自分の研

究分野に役立てる,などということも不可能ではない3.

それでは, さっそく始めよう. ようこそ, 分子シミュレーションの世界へ . . .

図 2-1: 私が独断で描いた本年度の

ロードマップ.主催者や各講師の方々

と事前に打ち合わせることはしてい

ないので,あくまでも参考程度に眺

めてください.キーワードも私が勝

手につけたものです.

2システムサイズ (粒子数) だけを競うのはサイエンスとして無意味であるが,かつては例えば,N = 21603 ∼ 1010 粒子を用いた宇宙のシミュレーション [Virgo Consortium, “Simulating the joint evolution of quasars, galaxies and their large-scale distribution,” Nature, 435 (2005) 629–636] や N ∼ 109 粒子による結晶中の転位の生成と運動のシミュレーション[F. F. Abraham, “How fast can cracks move? A research adventure in materials failure using millions of atoms and bigcomputers,” Adv. Phys., 52 (2003) 727–790] などの超大規模系の計算が一躍,有名となった.

3例えば,2000年代初頭,グラフィックス表示用の GPUボードの並列処理能力が大幅に向上したときに,それを数値計算に流用しようと考えた人たちがいたように.

3

Page 4: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

3 モンテカルロ法 vs 分子動力学法

分子シミュレーションは次の2つに大別される:

• モンテカルロ法 (Monte Carlo simulation, MC法):乱数を駆使して適切な統計集団を作り出す

• 分子動力学法 (Molecular dynamics simulation, MD法):粒子の従う運動方程式を数値的に時間

積分して粒子の軌道を追跡する

本章では,それぞれについて,その基本事項を説明する.

3.1 統計力学のエッセンス

数ある分子シミュレーションの手法から,自分の目的に合う適切なものを選択したり,データ解析の方法を

開発したりするために最低限必要な,統計力学の事項を以下にまとめておく.詳しくは,甲賀研一郎先生:

統計力学を聞いていただくとともに,適当な統計力学の教科書を参照されたい.

1. 小正準集団 microcanonical ensemble:対象系の粒子数N,体積 V,全エネルギー E が指定された

とき,その条件を満たす全ての微視的状態は等しい確率で出現する(等確率の原理).この系を

特徴づけるのは,多重度 multiplicity (あるいは 縮退度 degeneracy, 微視的状態数 ともよばれる)

W (N,V,E)である.

2. Boltzmann の関係式:小正準集団において,多重度W は熱力学のエントロピー entropy S と次

の関係がある:

S(N,V,E) = kB logW (N,V,E) (1)

ここで,Boltzmann 定数 kB ≃ 1.38× 10−23 J/K は重要な物理定数である.

3. 正準集団 canonical ensemble:温度 T の 熱浴 (heat bath, thermal reservoir) と接している粒子数

N , 体積 V の系では,全エネルギー E は一定ではなく,熱浴とのエネルギーのやりとりによって

揺らぐ.エネルギーが E となる確率は,

P (E) ∝ W (E) exp

[− E

kBT

](2)

で与えられる.熱浴の自由度に由来する exp[− E

kBT

]を Boltzmann因子 とよぶ.

4. 分配関数 partition function:正準集団での確率 P (E)を規格化すると

P (E) =

W (E) exp

[− E

kBT

]∑E

W (E) exp

[− E

kBT

] (3)

4

Page 5: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

表 3-1: 分子シミュレーションで取り扱われる主な統計集団 [27].

独立変数 名称 出現確率 規格化因子と名称 熱力学関数 関係

N , E, V

小正準集団micro-canonicalensemble

W (N,E, V )

多重度,縮退度—

Sエントロピー

S = kB logW

Boltzmann の関係式

N , T , V

正準集団canonicalensemble

W exp

[−

E

kBT

]Boltzmann 因子

Z =∑E

W exp

[−

E

kBT

] 分配関数

F = E − TSHelmholtz 自由エネルギー

F = −kBT logZ

N , T , P

T -P 集団T -Pensemble

W exp

[−E + PV

kBT

]Y =

∫dV exp

[−

PV

kBT

]Z(N,T, V )

  T -P 分配関数

G = F + PVGibbs 自由エネルギー

G = −kBT log Y

µ, T , V

大正準集団grandcanonicalensemble

W exp

[−E − µN

kBT

]Gibbs 因子

Ξ =∑N

exp

[µN

kBT

]Z(N,T, V )

 大分配関数

J = F − µNグランドポテンシャル

J = −kBT log Ξ

となる.この規格化因子 (分母)を 分配関数 とよぶ:

Z(N,V, T ) ≡∑E

W (E) exp

[− E

kBT

](4)

任意の物理量 Aの平均値は

⟨A⟩ ≡∑E

A · P (E) =

∑E

A ·W (E) exp

[− E

kBT

]∑E

W (E) exp

[− E

kBT

] (5)

によって求められる.

5. 自由エネルギー free energy:エネルギーの平均値 ⟨E⟩について考察することにより,この規格化

因子 Z は熱力学の Helmholz自由エネルギー と関係づけられる:

F = −kBT logZ (6)

6. その他の統計集団: 「圧力溜め pressure reservior」や「粒子溜め particle reservoir」と接した系

を考えることにより,正準集団と同様の論法で,いろいろな統計集団を考えることができる.表 3-1

に重要なものをまとめておく [27].どの熱力学変数を外部パラメタ(制御変数)と考えるかによっ

て,適切な統計集団を使い分けることが重要である.

3.2 まずはモンテカルロ法の原理を理解しよう

温度 T の熱平衡状態における物理量 A (例えば全エネルギー E)の平均は次式で定義される:

⟨A⟩ =∑

E A ·W (E)e− E

kBT

Z=∑E

A · P (E) (7)

5

Page 6: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

これを数値計算によって近似的に求めることを考える4.このために,確率 P (E)で出現する状態をコン

ピュータ内で次々とつくり出す方法が欲しい.これが Monte Carlo法 (MC法) の出発点である.

3.2.1 簡単な例:2状態間の遷移

MC法の原理を簡単に理解してもらうために,エネルギーの異なる2つの微視的状態のみを持つ単純な

系を考えよう.状態1 (エネルギー E1)と状態2 (同 E2)の間を,1ステップごとに行き来させる.nス

テップ目において,各々の状態にいる確率を P1(n), P2(n)とすると,n− 1ステップ目の状態との関係は(P1(n)

P2(n)

)=

(m11 m12

m21 m22

)(P1(n− 1)

P2(n− 1)

)(8)

と書けるだろう(ベクトルと行列で表示した).ここで,右辺の 2× 2行列の各要素 mij は1ステップ

で状態 j から状態 iに 遷移する確率5を表す.なおここでは,mij はステップによらない定数6であると

仮定する.当然ながらmij はすべて非負の実数であり,いつでも状態1と2のどちらかでなければなら

ないという要請から {m11 +m21 = 1

m12 +m22 = 1(9)

という条件を満たす必要がある.式 (8)はベクトル形式で

P (n) = MP (n− 1) (10)

と表すと簡単である.P は 状態ベクトル state vector, Mは 遷移行列 transition matrix などとよばれ

る.式 (10)から時間を さかのぼ

遡 っていくと,直ちに

P (n) = MP (n− 1) = M2P (n− 2) = · · · = MnP (0) (11)

が得られる.すなわち,初期状態 P (0)と遷移行列Mを与えると,未来の任意の時点(ステップ)での

状態がわかることになる.

自然現象の多くは,経験的に,ステップ数 nが十分大きいと(すなわち十分に時間が経過すると),や

がて平衡状態 (定常状態)に到達する7と期待していいだろう.このとき平衡状態ベクトル P∞ に対して,

もう1ステップ遷移をさせても変わらないから

P∞ = MP∞ (12)

4ここでは,最も基本的な正準集団 (体積 V,温度 T,粒子数 N が一定)での取り扱いについてのみ記述するが,他の統計集団でも考え方は同じである.

5記号 mij は mi←j を意味している.ここだけを見ると,mji と書いた方が分かり易いようにも思えるが,行列・ベクトルとして略記する場合は,この添え字の付け方のほうが美しいだろう.

6この仮定により,あるステップでの状態は,1つ前の状態のみによって決まり,それより昔の状態にはよらないことになる.このような過程は (単純) マルコフ過程 と呼ばれる.

7数学的には,いつまでたっても決して平衡状態に達しないという反例を作ることは簡単である.例えば

M =

(0 11 0

)の場合,永遠に2つの状態を往復することになる.しかし,我々が計算の対象とするような系のほとんどは,待っていればいつか平衡状態に達する,と期待してよいだろう.

6

Page 7: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

となっているはずである.すなわち,平衡状態 P∞ はMの固有値1の固有ベクトルである.

具体的に平衡状態を求めてみよう.条件式 (9) から,遷移行列M は2つの独立な要素をもつので,

m21 ≡ q, m12 ≡ rを独立パラメタに選ぶことにすると(P∞1

P∞2

)=

(1− q r

q 1− r

)(P∞1

P∞2

)(13)

と書ける.このとき,固有ベクトルは容易に求めることができて8

P∞2

P∞1

=q

r(14)

となる.平衡状態はふつう1つだけであるから,逆に,式 (14)を満たすように q, rを選ぶと,任意の

初期状態 P (0)から出発しても必ず与えられた平衡状態 P∞ に近づくはずである.

2つの状態のエネルギーが E1 < E2であると仮定しよう(状態1が基底状態であると考えればよい).

このとき,例えば, {r = 1

q = exp[−E2−E1

kT

] (15)

と選ぶと,式 (14)からP2

P1= exp

[−E2 − E1

kT

](16)

となって,Boltzmann分布を実現することができる.式 (15)のように遷移確率を選ぶ方法が,Metropolis

モンテカルロ法9である [28].すなわち

• エネルギーの高い状態は,次のステップで必ず低い状態に遷移させる.

• エネルギーの低い状態は,次には,確率 exp[−∆E

kT

]で高い状態に遷移させる.ここで∆E は2つ

の状態のエネルギー差である.

「確率 p(もちろん 0 ≤ p ≤ 1)で状態を遷移させる」という手順を計算機で実現する方法は幾つか考

えられるが,よく使われるものとして

1. 0 ≤ r ≤ 1の一様乱数 rを計算機でつくる.

2. rと確率 pを比較して

(a) r ≤ pなら,別の状態に遷移させる

(b) r > pなら,もとの状態にとどまらせる

という方法がある.C言語でのプログラム例と実行結果を図 3-2に示した.なお,一様乱数の生成には,

stdlib.h で定義されている rand( ) を利用した.10

8固有ベクトルという条件だけでは,成分の比が求まるだけであるが,P1 + P2 = 1 という規格化条件も使うと

P∞1 =r

q + rP∞2 =

q

q + r

と定めることができる.9乱数 random number を計算の本質的な部分に用いる数値計算法を一般に モンテカルロ Monte Carlo 法という.カジ

ノで有名なモナコ公国の都市 Monte Carlo から名付けられたものであろう.10rand( ) は,0 以上 RAND MAX 以下の整数値を見かけ上ランダムに返す準乱数生成関数であり,ほとんどの数値計算ライブラ

7

Page 8: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

#include <stdio.h>#include <stdlib.h>#include <math.h>

double frand( ) /* Simple Random Number Generator of [0, 1] */{

return rand( )/(RAND_MAX+1.0);}

int main( ) //--------------------------------------------------{int num_step,step,state;int hist1,hist2;double eng1=0.0, eng2=1.0;double temperature=1.0;

while(printf("Number of Steps?")!=0 && scanf("%d",&num_step)==1) {hist1=hist2=0;state=1; /* Initial State */

for (step=0;step<num_step;step++) {if (state==1) {

if (frand( ) < exp(-(eng2-eng1)/temperature)) {state=2;hist2++;

}else {

hist1++;}

}else {

state=1;hist1++;

}}printf("%10d %8.4f %8.4f\n", num_step,hist1/(double)num_step, hist2/(double)num_step);

}}

Number of Steps? 10

10 0.8000 0.2000

Number of Steps? 100

100 0.7300 0.2700

Number of Steps? 1000

1000 0.7340 0.2660

Number of Steps? 10000

10000 0.7289 0.2711

Number of Steps? 100000

100000 0.7305 0.2695

Number of Steps? 1000000

1000000 0.7313 0.2687

Number of Steps? 10000000

10000000 0.7311 0.2689

Number of Steps? x

図 3-2: ∆EkBT = 1のエネルギー差がある2状態の間の遷移のメトロポリスMCプログラム例と実行結果:

ステップ数を増やすと,2つの状態の出現確率は Boltzmann分布の比に近づくことがわかる.なお,厳

密な平衡分布の比は,1 : exp[−1] = 0.73105 . . . : 0.26894 . . .である.

3.2.2 N 状態への拡張

2状態の話を,素直に N 状態の場合に拡張する.遷移行列

M =

m11 m12 . . . m1N

m21 m22 . . . m2N

......

...

mN1 mN2 . . . mNN

(17)

および nステップにおける状態ベクトル

P (n) =

P1(n)

P2(n)...

PN (n)

(18)

リで類似のものが実装されている.初期値を srand(iseed) により与えることができる.ただし,rand( ) に使われている乱数生成アルゴリズムは,単純な合同乗算法が使われていることが多く,その性質にやや偏りがあることが知られている.最近では,メルセンヌ ツイスター Mersenne twister [29] などさらに優れたアルゴリズムが開発されているので,本格的な MC 計算にはこちらをお勧めする.

8

Page 9: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

を定義すると,2状態の場合と全く同様に,次式で状態遷移が表される:

P (n) = MP (n− 1) (19)

特殊な例外11 はあるものの,多くの場合において,n → +∞で唯一の平衡状態に収束することが期待さ

れる.したがって,平衡状態はやはりMの固有値1に対する固有ベクトルである.

(固有値1を持つことの証明)遷移行列の性質から,式 (9)と同様に

∑imij = 1が成り立つ.固有値方程式∣∣∣∣∣∣∣

m11 − λ m12 . . .m21 m22 − λ . . ....

...

∣∣∣∣∣∣∣ = 0

の左辺の行列式を考えると,各列 (縦方向) の総和が∑

imij − λ となるが,式 (9) と同様に考えて∑

imij = 1 であるから,λ = 1という固有値を持つ. (証明終わり)

我々が欲しいのは,Boltzmann因子に比例した確率で状態をつくり出すアルゴリズム である.すな

わち,平衡状態が

P∞i =

e−EikT∑

i e− Ei

kT

(20)

となるように遷移行列Mを選びたい.この選び方は一意的ではないが,次の詳細つり合い条件 detailed

balanceを満たすように選ぶのが一案である:

mijP∞j = mjiP

∞i (21)

なぜなら,このように選ぶと

MP∞の i番目の要素 =∑j

mijP∞j

=∑j

mjiP∞i   ∵ detailed balance

= Pi(∞)  ∵∑

j mji = 1 (22)

となって,確かに P∞ が固有ベクトルとなるからである.

Metropolis MC法では,次のように遷移確率を選ぶ:Ei < Ej のときに,cをある正定数として{mij = c

mji = ce−Ej−Ei

kT

(23)

このとき,確かに Boltzmann分布 Pi ∝ e−EikT に対して詳細つり合い条件が満たされている.この手順を

標語的にまとめると,

11 例えば,右のように複数の孤立系が並立するような系では,明らかに平衡状態が初期状態に依存するのでダメである:

1

4

2

3

5

6

9

Page 10: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

Metropolis Monte Carlo法の一般手順

1. 現在の状態を iとする.エネルギーは Ei である.

2. 遷移する先の状態の候補 j をランダムに選び,そのエネルギー Ej を計算する.

3. エネルギー差∆E ≡ Ej − Ei を計算する.

(a) もし,∆E ≤ 0であれば,必ず j に遷移させる.

(b) もし,∆E > 0であれば,確率 e−∆EkT で,状態 j に遷移させる.遷移しなかった場合

は,元の状態 iのままとする.

4. この手順を,必要なだけ(さまざまな巨視的物理量が収束するまで)繰り返す.

これによって,十分なステップの後12 には,Boltzmann分布に従う確率で様々な状態(つまり平衡状

態)が出現することになる.平衡状態において,合計M ステップにわたり状態をサンプリングしたとす

ると,それらを熱平衡状態にある状態の統計集団 enemble in thermal equilibrium と見なして,さまざま

な熱力学量の平均を求めることが可能となる.

3.2.3 補足:モンテカルロ法のいろいろ

乱数あるいは準乱数を用いた数値計算法を一般にモンテカルロ法と呼んでいるが,分野によって様々

な応用例がある.

• 統計物理学:ここで紹介したMetropolis法を土台とすることが多い.出現頻度の少ない事象(例

えば,低温における励起状態)をうまくサンプリングするために,様々な工夫が行なわれる.自由

エネルギーを求める方法も提案されている.この講義でも, 奥村久士先生 :各種統計アンサンブ

ルの生成法や 松林伸幸先生 :自由エネルギー計算などで紹介されると思う.

 また,気体力学などで用いられているDSMC (Direct Simulation Monte Carlo)法 [30]も,考

え方は少し異なるが,その名の通り,モンテカルロ法の一種である.

• 数値積分:乱数を使って円の面積を求める例が有名だが,実用的には,多次元図形の面積 (体積)を

求めるのに便利である.

• 発展形:Simulated Anealing(焼きなまし,SA)法, Genetic Algorithm(遺伝アルゴリズム,GA)

法など,最適化の数値計算手法としてよく用いられる方法も,系のランダムな状態変化をうまく使

うという点でモンテカルロ法の発展形と考えることができる.

12実際には,初期状態の影響を取り除くため,最初のほうに出現する状態は捨ててしまわなければならない.平衡になったと見なせるまでどのくらいのステップが必要かは,計算対象や初期条件によって大きく異なるが,一般論として,なるべく熱平衡に近い状態を初期状態に選ぶと収束が速い.

10

Page 11: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

• 拡張アンサンブル法:対象系のエネルギー (Hamilton関数) E に,別の関数 Ea を仮想的に加えて

みる.もとの系における物理量 A の平均値を ⟨A⟩,新しい系における平均値を ⟨A⟩a と書くこと

にすると

⟨A⟩ =

∑A exp

(− E

kBT

)∑

exp(− E

kBT

)=

∑exp

(−E+Ea

kBT

)∑

exp(− E

kBT

) ·

∑A exp

(− E

kBT

)∑

exp(−E+Ea

kBT

)=

∑exp

(−E+Ea

kBT

)∑

exp(+ Ea

kBT

)exp

(−E+Ea

kBT

) ·

∑A exp

(+ Ea

kBT

)exp

(−E+Ea

kBT

)∑

exp(−E+Ea

kBT

)=

⟨A exp

(+ Ea

kBT

)⟩a⟨

exp(+ Ea

kBT

)⟩a

(24)

すなわち,新しい系における集団平均から元の系の平均 ⟨A⟩ を求めることができる.元の系におい

て温度が低く,あるいはエネルギーの局所的な構造が複雑などの理由で位相空間内で幅広くサンプ

リングすることが困難な場合13に,このような方法で ⟨A⟩ を求める方法がいろいろと提案されてお

り,拡張アンサンブル法, アンブレラサンプリング法 などと名づけられている. 奥村久士先生 :

各種統計アンサンブルの生成法, 松林伸幸先生 :自由エネルギー計算, 志賀基之先生 :自由エネ

ルギー計算手法・アラカルト, 藤崎弘士先生 :生体分子の構造変化経路サンプリングなどで詳し

く紹介されるだろう.粒子の化学ポテンシャルを求めるための,有名なWidomの粒子挿入法 [31]

もその1つと理解することができる.

3.3 つづいて分子動力学法の原理を学ぶ

粒子の運動方程式を数値積分することによって,粒子の動きを追跡する方法が分子動力学 molecular

dynamics (MD)法である.この節ではその原理を簡単に説明する.

簡単な例として,Newton運動方程式に従う1つの粒子を考えよう:

md2r

dt2= F (r) (25)

これは,粒子座標 rの時間 tに関する2階常微分方程式であり,一般には差分化することで数値的に解く

ことができる.多くの場合,運動量 pを導入して14,連立1階常微分方程式にしておくのが便利である.mdr

dt= p

dp

dt= F (r)

(26)

13例えばタンパク質の相転移を議論する場合,普通の Metropolis MC 法では往々にしてエネルギーの local minimum に捕らえられてしまって,global な安定状態に到達できないことがある.

14もちろん,運動量の代わりに速度 v ≡dr

dtを使ってもよい.

11

Page 12: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

3.3.1 素朴な差分化

MD法の原理を理解してもらうために,まず,素朴な前進差分を使ってみよう:mdr

dt≃ m

r(t+∆t)− r(t)

∆t= p(t)

dp

dt≃ p(t+∆t)− p(t)

∆t= F (r(t))

(27)

両辺に∆tを掛け,それぞれの辺の時刻を揃えるように移項すると{r(t+∆t) = r(t) + 1

m p(t)∆t

p(t+∆t) = p(t) + F (r(t))∆t(28)

すなわち,時刻 tでの粒子情報 (r, p) から,次の時刻 t+∆t での粒子情報が得られることになる.この

計算を繰り返すことで,時刻 0(初期状態)から出発して,離散的な時刻∆t, 2∆t, 3∆t, . . .における粒

子情報を得ることができるはずである.

簡単な例として,1次元調和振動子のプログラムと計算結果の例を図 3-3に示す:

md2x

dt2= −kx (29)

であるから,容易に厳密解を求めることができて

x(t) = A sinω0t+B cosω0t  ただし ω0 ≡√

k/m (30)

である (A, B は初期条件によって決まる定数).∆t = 0.1√

mk とすると,グラフに示すように,数値計

算の結果はどんどん厳密解からはずれていくので,残念ながら実用的な方法ではないことがわかる.な

おこの方法は,数値積分の分野ではオイラー Euler法と呼ばれるものに対応している.

#include <stdio.h>#include <math.h>

#define MAX_TIME 10.0#define MASS 1.0 // Particle Mass#define SPRING 1.0 // Spring Constant#define INIT_X 1.0 // Initial Position#define INIT_P 0.0 // Initial Momentum

int main( ){

double x=INIT_X;double p=INIT_P;double t=0.0;double dt, force,omega;double exact; // exact solution x=cos(omega*t)FILE *fout;

fout=fopen("naive.dat","w");printf("Input dt: ");scanf("%lf",&dt);

omega=sqrt(SPRING/MASS);

while (t<MAX_TIME) {t += dt;force = -SPRING * x;x += dt*p/MASS;p += dt*force;exact=cos(omega*t);fprintf(fout,"%8.5f %8.5f %8.5f\n",t,x,exact);

}

fclose(fout);return 0;

}

-2.0

-1.5

-1.0

-0.5

0.0

0.5

1.0

1.5

2.0

0 2 4 6 8 10

X

t

Numerical

Exact

図 3-3: 単純な前進差分による1次元調和振動子の計算プログラム例と計算結果: ∆t = 0.1とした.

12

Page 13: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

3.3.2 差分法の改良

素朴な差分化は使い物にならないことがわかった.改良のアイディアとして,中間差分をとることを

考える.すなわち式 (27)の代わりにmr(t+∆t)− r(t)

∆t= p

(t+ 1

2∆t)

p(t+∆t)− p(t)

∆t= F

(r(t+ 1

2∆t)) (31)

としよう.ただしこれでは,中間時刻 t+ 12∆t での r や p を別に求める必要があり計算量が増えるので,

次のように rと pを求める時刻を 12∆tだけずらせてみよう:mr(t+∆t)− r(t)

∆t= p

(t+ 1

2∆t)

p(t+ 32∆t)− p(t+ 1

2∆t)

∆t= F (r (t+∆t))

(32)

すなわち,式 (28)の代わりに r(t+∆t) = r(t) + 1m p(t+ 1

2

)∆t

p(t+ 3

2∆t)

= p(t+ 1

2∆t)+ F (r (t+∆t))∆t

(33)

を使うことにする.この方法は 蛙跳び leapfrog 法15 と呼ばれる.

図 3-4に1次元調和振動子についてのプログラムと計算例を示す.単純な前進差分の場合(図 3-3)と

比べると,プログラムのわずかな変更で,画期的に精度が向上するのがわかる.

#include <stdio.h>#include <math.h>

#define MAX_TIME 10.0#define MASS 1.0 // Particle Mass#define SPRING 1.0 // Spring Constant#define INIT_X 1.0 // Initial Position#define INIT_P 0.0 // Initial Momentum

int main( ){

double x=INIT_X;double p=INIT_P;double t=0.0;double dt, force,omega;double exact; // exact solution x=cos(omega*t)FILE *fout;

fout=fopen("leapfrog.dat","w");printf("Input dt: ");scanf("%lf",&dt);

omega=sqrt(SPRING/MASS);

while (t<MAX_TIME) {t += dt;x += dt*p/MASS;force = -SPRING * x;p += dt*force;exact=cos(omega*t);fprintf(fout,"%8.5f %8.5f %8.5f\n",t,x,exact);

}

fclose(fout);return 0;

}

-2.0

-1.5

-1.0

-0.5

0.0

0.5

1.0

1.5

2.0

0 2 4 6 8 10

X

t

LeapFrogExact

図 3-4: Leapfrog法による1次元調和振動子の計算プログラム例と計算結果: 同じ ∆t = 0.1 でもずいぶ

んと精度が向上している.図 3-3のプログラムとの違いを見つけてみよう.

15アルゴリズムとしては「蛙跳び法」という名称が定着しているが,もともと leapfrog とは「馬跳び」に相当する子供の遊びだそうである.位置と運動量の更新を交互に行うところが,二人で行う馬跳びに似ている.

13

Page 14: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

もちろん,もっと系統的に数値差分法を改良することができる.常微分方程式の数値積分法について

書かれた教科書を見ると,ルンゲクッタ Runge-Kutta 法,予測子–修正子 predictor–corrector 法

などさまざまな方法が紹介されているが,まずはこの leapfrog法,あるいは類似の 速度 verlet法 を理

解しておこう. 吉井範行先生 :力学,解析力学,数値解法,拘束動力学の講義で系統的な説明が行われ

る予定である.

3.4 その他,さまざまな分子シミュレーション

3.4.1 第一原理計算

本稿では,粒子間相互作用のモデルポテンシャル U ({r})の関数形はすでに与えられたものとして,そ

れを使ったMC法やMD法の考え方を紹介しているが,粒子配置が更新されるたびに新たに Schrodinger

方程式 (あるいはそれに相当する量子力学方程式)を解いて,ポテンシャルエネルギーや力を求めなおす,

という方法も当然考えられる.もちろん,きわめて多くの計算時間が必要であるが,化学反応や量子効

果が重要であるような計算系を対象とするときは避けて通れない.Car-Parrinelloの提案 [32]以来,こ

のような第一原理計算 (first principle simulation または ab initio calculation) が大きな発展を遂げている.

3.4.2 粗視化シミュレーション

当然のことながら,計算資源の制約から,いくら頑張っても,高々104–1010程度の粒子数しか扱うこ

とはできない.大きなスケールの計算対象を扱うために,詳細過ぎて不要な情報を落として重要な物理

を抽出したモデルでシミュレーションを行う方法がいくつも開発されており,粗視化 coarse-grained

シミュレーションなどと名づけられている.いくつかの有名/重要な例を挙げる.

1. United atomモデル:有機物のシミュレーションなどで,炭化水素 (アルキル)鎖の水素原子をあ

らわに扱わず,CH3– あるいは –CH2– などをひとつの粒子とするモデル

2. バネ–ビーズモデル:柔軟な高分子を扱う際に,ビーズが非線形バネで結合された簡単なモデルが

よく使われる.

3. Brownian Dynamics (BD) 法 [13]:たとえばコロイド分散系のシミュレーションを行う際に,

コロイド粒子に比べて何桁も小さい水分子やイオンの自由度を直接扱うことは無駄が多い.水分子

の寄与はランダム力や摩擦力として,またイオンの効果は静電場として考え,Boltzmann分布を

したイオンがつくる静電場中でコロイドの ラ ン ジュ ヴァ ン

Langevin 方程式16を解くという方法がよく行われる.16運動方程式の外力項に,周囲の媒質の熱揺らぎに起因するランダム力と流体抵抗を入れたもの.ブラウン運動を表す運動方程式としてよく用いられる.もっとも単純なものとしては,次の形をとる:

md2r

dt2= −∇U (r)− γv + fr(t)

ここで,U は外場ポテンシャル,γ は抵抗係数,fr はランダム力である.揺動散逸定理 fluctuation-dissipation theorem によって,fr の平均強度,γ,温度の間にはある関係が成り立つ [44].

14

Page 15: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4. DPD (Dissipative Particle Dynamics) 法 [33]:例えば 10個程度の溶媒分子をひとまとめに

して1つの粒子と考えようという手法である.この仮想的な粒子は Langevin型の運動方程式に従

うと仮定される.粒子サイズや相互作用パラメタを適切に選ぶことで,粗視化レベルで流体の挙動

を再現することができ,界面活性剤系の構造 (ミセルなど)形成のシミュレーションに適用されて

いる.

5. SPH (Smoothed Particle Hydodynamics) 法 [34]:さらに粗視化スケールが大きくなると,

連続体の空間要素を粒子とみなして計算することになる.SPH法では,空間点の近傍の物理量(例

えば密度場や圧力場)を,適当な重み関数を使って平均化 (smoothing)することで,空間要素を粒

子として扱う.流体中の衝撃波伝播の解析や固体材料の弾塑性解析など工学分野での応用例が多

い.このスケールになるともはや,「分子シミュレーション」というよりは「粒子法によるメッシュ

フリー数値解析」に位置づけるのがふさわしい.

6. MPS (Moving Particle Semi-implicit) 法 [35]:多数の流体粒子の情報を重み関数によって平

均化するという点で,SPH法と類似したアプローチである.ダムの崩壊や土石流といった,複雑

な混相流問題への適用が行われている [36–39].

本スクールでもそのいくつかの例が, 篠田渉先生 :階層的分子モデリング –粗視化の方法について–

や 畝山多加志先生 :高分子の粗視化分子シミュレーションなどで紹介されるだろう.

3.4.3 マルチスケール,ハイブリッド,その他いろいろ

対象系が大規模かつ複雑になってくると,1つの計算手法だけではカバーしきれなくなり,複数の手

法を組み合わせることが模索される.マルチスケール (多階層)シミュレーションやハイブリッドシミュ

レーションとよばれるものである.有名な例として,タンパク質の化学反応などを取り扱うために,反

応サイトの近くは量子化学的に詳細な計算を行い,それ以外の部分は古典的モデルで扱う QM/MM法

が注目されている.そのほか,粒子法と連続体計算の組み合わせなどいろいろな可能性があり,統合的

なシミュレータを開発するには必須の技術となっている.例えば, 篠田渉先生:階層的分子モデリング

–粗視化の方法について–, 長岡正隆先生 :化学反応と分子シミュレーションなどで様々な応用例の紹介

があるかと思う.

15

Page 16: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4 例題:単原子分子系の分子シミュレーションとデータ解析

この章では,具体例として,簡単な相互作用モデルと古典力学17に基づく単原子分子系(質点系)18の

分子シミュレーション (MD法 および MC法) と簡単なデータ解析を,プロトタイプとなる計算コード

と共に紹介する.

4.1 分子間の相互作用

MC法でもMD法でも,粒子間に適切な相互作用ポテンシャルを設定することがその第一歩である.

一般には,分子集合体中で各原子間や分子間にはたらく相互作用は極めて複雑である.

N 粒子系のポテンシャルエネルギーを UN ({ri})と書くことにしよう.ri は i番目の粒子の座標ベク

トルを表し,{ri}はすべての粒子の座標を与えて初めて決まる関数であることを示す習慣的な表記であ

る.多くの場合,次のような「展開」を考えるのが便利である:

UN ({ri}) = u0 +∑i

u1 (ri) +∑i,j

u2 (ri, rj) +∑i,j,k

u3 (ri, rj , rk) + · · · (34)

エネルギーの原点は自由に選べるので,定数項 u0は省略できる.また,電場などの外場がない簡単な場

合を考えて,1次の項 u1も省略することにしよう.これにより,展開の最初の項は2つの粒子の座標に

よって決まる u2となる.これを,二体項 (pair-wise term または two-body term)とよぶ.次の項は,3

つの粒子によって決まる u3 (三体項)である.ずっと高次の項まで考慮すればもちろん UN をさらによく

表すことができるはずだが,計算量が増大する19.実際的な系について,相互作用をどのようにモデル

化するかについての詳細は,本スクールの講義 三上益弘先生 :原子間・分子間相互作用エネルギー関

数と長距離力計算法で詳しく紹介されるだろう.また, 杉井泰介先生 :分子シミュレーションの活用 –

企業における取り組み方と事例–などの講義でも扱われるかも知れない.

ここでは,入門的な例として二体項のみを考えよう:

UN ({ri}) ≃∑i,j

u2 (ri, rj) (35)

さらに,u2が2つの粒子の間の距離だけの関数 であると仮定する20.これは,クーロン力や分散力など

を扱える典型的なモデルであり,ペアポテンシャルモデルともよばれる.

UN =1

2

∑i,j

u2 (|ri − rj |) ≡1

2

∑i,j

ϕ (rij) (36)

ここで,係数 12 は (i, j)ペアを2重に数えることを防ぐためのものである.21

17電子ダイナミクスを扱う場合など量子効果が本質的な場合には,もちろん古典力学を前提とするわけにはいかない.その例は

たとえば 長岡正隆先生 :化学反応と分子シミュレーションなどで紹介されるかも知れない.18多原子分子では,分子の回転や振動など分子の内部自由度を扱う必要があり,それぞれに応じて各種のアルゴリズムが開発さ

れている. 吉井範行先生 :力学,解析力学,数値解法,拘束動力学で解説される予定である.19素朴に考えると,二体項の計算は ∝ N2,三体項の計算は ∝ N3,. . .の時間がかかるはずである.もちろんアルゴリズムの工夫で計算量を大きく減らすことが可能ではあるが.

20例えば粒子が電気双極子をもっていると,エネルギーは距離だけではなく双極子の相対的な配向にも依存するので,こうはいかない.

21 1

2

∑i,j

と書く代わりに,∑i>j

などと表記することもできる.

16

Page 17: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

図 4-5: ペアポテンシャルモデルで,1つの原子にはたらく力の模式図.

さて,MC法であればポテンシャルエネルギーを与えるだけでよいが,MD法では,粒子にはたらく

力が必要である.これは,解析力学の知識を使って,次のようにして求めればよい:

Fi = −∂UN

∂ri

= −1

2

∑i,j

∂ϕ(rij)

∂ri

= −1

2

∑j (=i)

[∂ϕ(rij)

∂ri+

∂ϕ(rji)

∂ri

]

= −∑j (=i)

dϕ(rij)

drij· ∂rij∂ri  脚注22

= −∑j (=i)

dϕ(rij)

drij· ri − rj

rij(37)

ここでri − rjrij

は,j原子から i原子に向かう単位ベクトルを表している.結局,距離だけに依存するペ

アポテンシャルモデルでは,i原子が感じる力は,周囲の原子から受ける力 −dϕ

drの合力(ベクトル和)

となることがわかる (図 4-5).

この講義で使うプロトタイプコードでは,有名な Lennard-Jones (LJ) ポテンシャル23 [40]を使う

ことにする:

ϕLJ(r) = 4ϵ

[(σr

)12−(σr

)6](39)

第1項は電子雲の重なりによる原子間の反発を,第2項は電子雲の偏りにより生じる引力 (分散力 dispersion

intereaction) を表している24 .LJポテンシャルは,2つのパラメタを含んでいる: ϵ : エネルギーパラメタ,ポテンシャルの深さに対応する

σ : 長さパラメタ,粒子の直径に対応する

22この微分は,例えば x 方向なら

∂rij

∂x=

∂√

(xi − xj)2 + (yi − yj)2 + (zi − zj)2

∂xi=

xi − xj√(xi − xj)2 + (yi − yj)2 + (zi − zj)2

=xi − xj

rij(38)

のように求めることができる.23Sir John Edward Lennard-Jones (1894–1954), 英国の理論化学者24式 (39) は,LJ(12-6) ポテンシャルともよばれ,より一般的な LJ(mn) ポテンシャルの一種である.

ϕmn(r) ∝ ϵ

[(σ

r

)m

−(σ

r

)n]    (一般に m > n)

17

Page 18: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

-3

-2

-1

0

1

2

3

4

5

0 1 2 3 4

u [ε] o

r f [ε/σ

]

r [σ]

PotentialForce

図 4-6: Lennard-Jones ポテンシャル.

図 4-6を見ればその意味がわかるであろう.個々の粒子間に働く力は,式 (37)より

f = −∇ϕLJ(r) = −dϕLJ

dr· rr=

24ϵ

σ

[2(σr

)13−(σr

)7]· rr

(40)

となる.

この LJポテンシャルは,アルゴンやキセノンのような希ガスの相互作用を比較的よく記述できる.ア

ルゴンであれば,次のようなパラメタの値がよく用いられる:

ϵ = 120 kB , σ = 0.34 nm (41)

ここで,kB は Boltzmann定数, 1.38× 10−23 J/K である.また,メタンのように比較的単純な構造の分

子も LJポテンシャルで近似的に扱われることがある.その際のパラメタは,さまざまな実験 (状態方程

式や粘性係数など)と比較することで経験的に決定したり [41],量子化学計算の結果をフィッティングし

て決めたりしている.

通常は,さまざまな物理量を 無次元化 して表すことが多い.計算コードの中でも,実単位系よりも

換算単位 reduced units で扱うほうが便利である.LJモデルでは,表 4-2のような無次元化がよく行わ

れる.

表 4-2: LJモデル系の単位系と,アルゴン換算の値の例.

物理量 単位 アルゴンの値

長さ LJパラメタ σ 0.34× 10−9 m

エネルギー LJパラメタ ϵ 120 kB=1.66× 10−21 J

質量 粒子質量 m 6.6× 10−26 kg

時間 τ ≡ σ√

m/ϵ 2.15× 10−12 s

速度 σ/τ 1.6× 102 m/s

温度 ϵ/kB 120K

圧力 ϵ/σ3 42× 106 Pa

18

Page 19: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4.2 境界条件

どのような境界条件を用いるかは,計算を進める上で重要である.アボガドロ数程度の分子集合体を扱

うのであれば,その境界 (つまり集合体の表面)がどうなっていてもバルクとしての性質にはほとんど影

響がないであろうが,高々103から 106程度の粒子数のシミュレーションでは,表面の影響は大きい.流

体力学との類推から考えると,(1) 反射境界,(2) 自由境界,(3) 流出流入境界,(4) 周期境界,などいろ

いろなものがあり得るが,多くの分子シミュレーションでは,周期境界条件 periodic boundary condition

を使う.これは,図 4-7のように,同じ計算系を繰り返し並べたと考えるものである.その要点は

1. 有限個の粒子が 有限サイズの計算セル に閉じ込められていると考える.計算セルの形状は,すき

間なく周期的に並べられるように,立方体,直方体,平行六面体,などに限定される.

2. 計算セルには 壁 は存在せず,粒子は計算セルの境界から影響を受けることなく運動できる.しか

し,計算セルから出た粒子は,反対側の壁の対応する位置から同じ運動量で入ってくると考える25

(図 4-7の左).

3. 粒子の運動だけではなく,粒子間の相互作用についても周期境界を考える必要がある(図 4-7の

右).このとき,実質的に同じペアの相互作用を重ねて数えることがないように,実粒子・shadow

粒子を含めて最も近いペアの間のみを考えなければならない.これは,計算セルサイズの半分のと

ころで相互作用をカットすることに相当し,minimal image convention とよばれている.

粒子の運動について 粒子間相互作用について

図 4-7: 周期境界条件の概念図.中央の影を付けたものが「実セル」であり,それを隙間なく無限に並べ

たものを考える.描画の都合で2次元で表しているが,3方向ともに周期境界を課すことが多い.

25粒子が反対側から再流入すると考える代わりに,無限に並んだ shadow セルから shadow 粒子が計算セルに入ってきて実体化すると考えても同じことである.

19

Page 20: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4.3 分子動力学シミュレーション

 まず,LJ粒子系のMDシミュレーションコードの例26を図 4-8に

示す.次のような比較的単純な構造のプログラムである.少々長い

が,main( )関数を眺めると,典型的なMDプログラムの構造が

理解できるだろう.すなわち

Initialize

Force

Move

Data accumulation

Finalize

1. Initialization:

運動方程式の初期条件として,粒子配置と初期運動量を与える. 以前に行ったMD計算の結果から

始めることもあるので,本来ならば初期条件を作成するプログラムを別に実行し,その出力結果を

読み込む方が柔軟性があって望ましいが,このサンプルプログラムが単体で動くように,ここでは

内部で初期条件を生成している.

2. Force calculation:

それぞれの粒子にはたらく力を求める.その際に,周期境界条件 (および minimal image convention)

を忘れずに考慮する.このプログラムは素朴に,すべての (i, j)ペアの積算を行っているので,効

率はよくない27.第 5章では,効率を上げる工夫をいくつか紹介している.

3. Particle movement:

各粒子の運動量と座標のデータを更新する.このプログラムでは,3.3節で紹介した leapfrog法を

使っている.

4. Data accumulation:

さまざまな物理量の統計をとる.特に,温度に関しては,4.5.1節で簡単に述べる.

5. Finalization:

ファイルを閉じるなど必要な後始末を行う.また,終了時の粒子データ (運動量と座標)をファイ

ルに出力しておくと,後でMDを再開することができる.

なお,このサンプルプログラムは,gnuplot を使って 結果をアニメーション風に眺める ことができる

ようにしてある.SAVE STEPごとに粒子の座標データが出力されるとともに,コマンドファイル lj.pltが

作成されるので,MD計算終了後に,このコマンドファイルを gnuplotで読み込む(loadする)だけで

ある.

26本講義資料に掲載している主なプログラムは

http://www.mitsuhiromatsumoto.mech.kyoto-u.ac.jp/

からダウンロードすることができる.このテキスト本体の pdf もそこに置いてある.27ただし 作用反作用の法則 を使って,力の計算回数を半分にする工夫だけは行っている.

20

Page 21: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

// A Simple MD Code for Lennard-Jones System// mass=1; epsilon=1; sigma=1;// Temperature Control + Periodic Boundary Conditions//#include <stdio.h>#include <stdlib.h>#include <math.h>

#define NUM_LATTICE 5#define NUM_ATOM (NUM_LATTICE*NUM_LATTICE*NUM_LATTICE) // 全粒子数

#define TOTAL_STEP 10000#define SAVE_STEP 50

double DEL_T = 0.001;double CELL_X = 10.0;double CELL_Y = 10.0;double CELL_Z = 10.0;

// Function Prototypesvoid initial( ), force( ), move( ), statistics(int), initplot( ), finalplot( ), scaling( );

double posx[NUM_ATOM], posy[NUM_ATOM], posz[NUM_ATOM];double momx[NUM_ATOM], momy[NUM_ATOM], momz[NUM_ATOM];double frcx[NUM_ATOM], frcy[NUM_ATOM], frcz[NUM_ATOM];double eng_kin, eng_pot, t_target, tsum;int ntcount;FILE *fgnuplot, *fsave;

//-------------------------------------------------------------------------int main( ){

int step;

printf("Input Target Temperature :"); // 温度を入力するscanf("%lf",&t_target);

initial( );initplot( );

for (step=0; step<=TOTAL_STEP; step++) {force( );move( );if (step%SAVE_STEP==0) {

statistics(step);}

}finalplot( );

}//---------------------------------------------------------// Initialize Gnuplot Command Filevoid initplot( ){

fgnuplot=fopen("lj.plt","w");

fprintf(fgnuplot,"set size square\n");fprintf(fgnuplot,"set xran [0:%lf]\n",CELL_X);fprintf(fgnuplot,"set yran [0:%lf]\n",CELL_Y);fprintf(fgnuplot,"set key at graph 1.2, graph 0.9 \n");fprintf(fgnuplot,"set key samplen 2\n");

}//---------------------------------------------------------// Finalize Gnuplot Command Filevoid finalplot( ){

fprintf(fgnuplot,"pause -1\n");fclose(fgnuplot);

}//---------------------------------------------------------// Make Simple Cubic Lattice with Random Momentavoid initial( ){

int i=0;int ix,iy,iz;double dx,dy,dz;

dx=CELL_X/NUM_LATTICE; dy=CELL_Y/NUM_LATTICE; dz=CELL_Z/NUM_LATTICE;

tsum=0.0;for (ix=0;ix<NUM_LATTICE;ix++) {for (iy=0;iy<NUM_LATTICE;iy++) {for (iz=0;iz<NUM_LATTICE;iz++) {

posx[i] = dx*ix;posy[i] = dy*iy;posz[i] = dz*iz;momx[i] = (rand( )/(double)RAND_MAX -0.5);momy[i] = (rand( )/(double)RAND_MAX -0.5);momz[i] = (rand( )/(double)RAND_MAX -0.5);

tsum += (momx[i]*momx[i]+momy[i]*momy[i]+momz[i]*momz[i]);i++;

} } }tsum /= 2;scaling( );

}

図 4-8: サンプルMDコード(続く)

21

Page 22: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

//---------------------------------------------------------// Calculate Forces: with Minimal Image Conventionvoid force( ){

int i, j;double dx,dy,dz,r2,ri06,ri12;double eng, frc;double cxh=CELL_X/2,cyh=CELL_Y/2,czh=CELL_Z/2;

eng_pot=0.0;for (i=0; i<NUM_ATOM; i++) { frcx[i]=0.0; frcy[i]=0.0; frcz[i]=0.0; }

for (i=0; i<NUM_ATOM; i++) {for (j=i+1; j<NUM_ATOM; j++) {

dx=posx[i]-posx[j];if (dx<-cxh) dx+=CELL_X; else if (dx>cxh) dx-=CELL_X;

dy=posy[i]-posy[j];if (dy<-cyh) dy+=CELL_Y; else if (dy>cyh) dy-=CELL_Y;

dz=posz[i]-posz[j];if (dz<-czh) dz+=CELL_Z; else if (dz>czh) dz-=CELL_Z;

r2=dx*dx+dy*dy+dz*dz;ri06=1.0/(r2*r2*r2);ri12=ri06*ri06;eng=4*(ri12-ri06);frc=4*(12*ri12-6*ri06)/r2;

eng_pot += eng; // ↓ 作用反作用の法則で計算量を半分にfrcx[i] += frc*dx; frcy[i] += frc*dy; frcz[i] += frc*dz;frcx[j] -= frc*dx; frcy[j] -= frc*dy; frcz[j] -= frc*dz;

} }}//---------------------------------------------------------// Update Particle Positon & Momentum: with Periodic Boundariesvoid move( ){

int i;

eng_kin=0.0;for (i=0; i<NUM_ATOM; i++) {

momx[i] += frcx[i]*DEL_T;momy[i] += frcy[i]*DEL_T;momz[i] += frcz[i]*DEL_T;

eng_kin += (momx[i]*momx[i]+momy[i]*momy[i]+momz[i]*momz[i]);posx[i] += momx[i]*DEL_T;

if (posx[i]<0.0) posx[i]+=CELL_X; else if (posx[i]>CELL_X) posx[i]-=CELL_X;posy[i] += momy[i]*DEL_T;

if (posy[i]<0.0) posy[i]+=CELL_Y; else if (posy[i]>CELL_Y) posy[i]-=CELL_Y;posz[i] += momz[i]*DEL_T;

if (posz[i]<0.0) posz[i]+=CELL_Z; else if (posz[i]>CELL_Z) posz[i]-=CELL_Z;}

eng_kin /= 2;ntcount++;tsum += (2.0/3.0)*eng_kin;

}//---------------------------------------------------------// Output Statistical Data & Configurationvoid statistics(int step){

int i;char fname[100];

tsum /= ntcount;scaling( );

printf("%8d %10.5f %10.5f %10.5f\n", step, eng_kin/NUM_ATOM, eng_pot/NUM_ATOM, (eng_kin+eng_pot)/NUM_ATOM);

sprintf(fname,"lj%8.8d.dat",step);fsave=fopen(fname,"w");

for (i=0;i<NUM_ATOM;i++) {fprintf(fsave,"%8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n",posx[i],posy[i],posz[i],momx[i],momy[i],momz[i]);

}fclose(fsave);

fprintf(fgnuplot, "plot \"%s\" using 1:2 t \"Step %5.5d\" w po lw 2 pt 6 ps 2\n",fname,step);if (step==0) fprintf(fgnuplot,"pause -1\n");

}//---------------------------------------------------------// Velocity Scaling for Temperature Controlvoid scaling( ){

int i;double factor;

factor=sqrt(t_target*NUM_ATOM/tsum);for (i=0;i<NUM_ATOM;i++) { momx[i] *= factor; momy[i] *= factor; momz[i] *= factor; }tsum=0.0;ntcount=0;

}

サンプルMD コードの計算結果を gnuplotで可視化した例. 無次元温度 T = 0.7 と設定した. 気液共存状態のようなものが見えている. グラフのスタイルは gnuplot のバージョンなどによって異なる.

図 4-8: サンプルMDコード(続き)

22

Page 23: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4.4 モンテカルロシミュレーション

 続いて,MCシミュレーションコードの例28を図 4-9に示

す.力を求めたり運動量を扱ったりする必要がない分,MD

プログラムよりも少し簡単である.主要部分は,Metropolis

法に基づいて粒子座標を更新する部分 (Update)であり,新

たな粒子配置でのポテンシャルエネルギーを求めるために,

関数 Potentialが呼び出される.

Initialize

Update

Data accumulation

Finalize

Potential

Updateの中では,ランダムに粒子を選んで「ある範囲内で」動かすという試行を,粒子数に等しい回

数行う29.ある範囲内,というのも重要である.このプログラムでは,元の位置から x, y, z 各方向に最

大 ±D MAX 動かすことにしている.D MAX を大きく選ぶと元の粒子配置から大きく異なった状態を試行

しやすくなり,統計平均をとる上では望ましいが,液体や固体のように密度の高い状態を対象としてい

る場合には他の粒子との重なりが生じやすく,Metropolis法で新しい配置が棄却されることが多くなり,

計算効率が低下する.適切な D MAX を選ぶにはある程度の試行錯誤が必要となる.

MD法と異なり,MC法には原則としては 時間経過 の概念がない30.このため,各ステップでの粒子

配置にはあまり物理的な意味はなく,あくまでも平衡状態に到達したあとの各種物理量の統計平均だけ

が重要である.しかし何が起きているかを知るために瞬間的な粒子配置を利用することもあり,MD法

と同様に gnuplotで配置の変化のアニメーションを眺める機能をつけた.

// A Simple MC Code for Lennard-Jones System// epsilon=1; sigma=1;//#include <stdio.h>#include <stdlib.h>#include <math.h>

#define NUM_LATTICE 5#define NUM_ATOM (NUM_LATTICE*NUM_LATTICE*NUM_LATTICE) // 全粒子数

#define TOTAL_STEP 10000#define SAVE_STEP 50#define D_MAX 1.0

double CELL_X = 10.0;double CELL_Y = 10.0;double CELL_Z = 10.0;

void initial( ); // Function Prototypesdouble potential(int);void update( ), statistics(int), initplot( ), finalplot( );double myrand( );

double t_target;double posx[NUM_ATOM], posy[NUM_ATOM], posz[NUM_ATOM];double eng_pot;FILE *fgnuplot, *fsave;

図 4-9: サンプルMCコード(続く)28このプログラムも,同じく

http://www.mitsuhiromatsumoto.mech.kyoto-u.ac.jp/

からダウンロードすることができる.291ステップにつき,1つの粒子を平均1回動かすということになる.これを 1モンテカルロステップ と数えることもある301回のステップで粒子を動かす範囲を適切に選べば,擬似的に自己拡散のような過渡現象を追跡することはできる.動的モンテカルロ法 などとよばれる方法である.

23

Page 24: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

int main( ) //------------------------------------{

int step;

printf("Input Target Temperature :");scanf("%lf",&t_target);initial( );initplot( );

for (step=0; step<=TOTAL_STEP; step++) {update( );if (step%SAVE_STEP==0) statistics(step);

}finalplot( );

}double myrand( ) //-------------------------------{

return rand( )/(RAND_MAX+1.0);}//------------------------------------------------// Initialize Gnuplot Command Filevoid initplot( ){

fgnuplot=fopen("lj.plt","w");fprintf(fgnuplot,"set size square\n");fprintf(fgnuplot,"set xran [0:%f]\n",CELL_X);fprintf(fgnuplot,"set yran [0:%f]\n",CELL_Y);fprintf(fgnuplot,"set key at graph 1.2, graph 0.9\n");fprintf(fgnuplot,"set key samplen 2\n");

}//------------------------------------------------// Finalize Gnuplot Command Filevoid finalplot( ){

fprintf(fgnuplot,"pause -1\n");fclose(fgnuplot);

}//------------------------------------------------// Make Simple Cubic Latticevoid initial( ){

int i=0;int ix,iy,iz;double dx,dy,dz;

dx=CELL_X/NUM_LATTICE; dy=CELL_Y/NUM_LATTICE; dz=CELL_Z/NUM_LATTICE;

for (ix=0;ix<NUM_LATTICE;ix++) {for (iy=0;iy<NUM_LATTICE;iy++) {for (iz=0;iz<NUM_LATTICE;iz++) {

posx[i] = dx*ix; posy[i] = dy*iy; posz[i] = dz*iz;i++;

} } }

eng_pot=0.0;for (i=0;i<NUM_ATOM;i++) {

eng_pot+=potential(i);}

eng_pot/=2;}//------------------------------------------------// Calculate Potential with Minimal Image Conventiondouble potential(int i){

int j;double dx,dy,dz,r2,ri06,ri12;double eng=0.0;double cxh=CELL_X/2, cyh=CELL_Y/2, czh=CELL_Z/2;

for (j=0; j<NUM_ATOM; j++) {if (j!=i) {

dx=posx[i]-posx[j];if (dx<-cxh) dx+=CELL_X; else if (dx>cxh) dx-=CELL_X;

dy=posy[i]-posy[j];if (dy<-cyh) dy+=CELL_Y; else if (dy>cyh) dy-=CELL_Y;

dz=posz[i]-posz[j];if (dz<-czh) dz+=CELL_Z; else if (dz>czh) dz-=CELL_Z;

r2=dx*dx+dy*dy+dz*dz;ri06=1.0/(r2*r2*r2);ri12=ri06*ri06;eng+=4*(ri12-ri06);

}}

return eng;}

サンプルMC コードの計算結果を gnuplot で可視化した例. 三重点温度 (T ≃ 0.67) よりも低い T = 0.5 を与えてみた.長時間待っていると,結晶化してもおかしくない温度ではあるが…

図 4-9: サンプルMCコード (続き)

24

Page 25: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

//------------------------------------------------// Update Particle Positons with Metroplis MCvoid update( ){

int i, mc;double enew,eold, xold, yold, zold;

for (mc=0; mc<NUM_ATOM; mc++) {i=myrand( )*NUM_ATOM;

xold=posx[i]; yold=posy[i]; zold=posz[i]; eold=potential(i);posx[i] += D_MAX*(2.0*myrand( )-1.0);

if (posx[i]<0.0) posx[i]+=CELL_X; else if (CELL_X<=posx[i]) posx[i]-=CELL_X;posy[i] += D_MAX*(2.0*myrand( )-1.0);

if (posy[i]<0.0) posy[i]+=CELL_Y; else if (CELL_Y<=posy[i]) posy[i]-=CELL_Y;posz[i] += D_MAX*(2.0*myrand( )-1.0);

if (posz[i]<0.0) posz[i]+=CELL_Z; else if (CELL_Z<=posz[i]) posz[i]-=CELL_Z;enew=potential(i);

if (enew<eold) { /* Metropolis MC */eng_pot += enew-eold;

} else {if (myrand( ) < exp(-(enew-eold)/t_target)) {

eng_pot += enew-eold;} else {

posx[i]=xold; posy[i]=yold; posz[i]=zold;}

}}

}//------------------------------------------------// Output Statistical Data & Configurationvoid statistics(int step){

int i;char fname[100];

printf("%8d %10.5lf\n",step, eng_pot/NUM_ATOM);

sprintf(fname,"lj%8.8d.dat",step);fsave=fopen(fname,"w");

for (i=0;i<NUM_ATOM;i++) {fprintf(fsave,"%8.3lf %8.3lf %8.3lf\n",posx[i],posy[i],posz[i]);

}fclose(fsave);

fprintf(fgnuplot,"plot \"%s\" using 1:2 t \"Step %5.5d\" w po lw 2 pt 6 ps 2\n",fname,step);

if (step==0) fprintf(fgnuplot,"pause -1\n");}

図 4-9: サンプルMCコード (続き)

4.5 データ解析入門

分子シミュレーションが一通り終わると,研究の目的に応じてさまざまなデータ解析をすることにな

る.シミュレーションを用いる一連の研究の中で最もおもしろく,また頭を使う部分である.どのよう

なデータ解析を行うかは,研究目的によってさまざまであるが,ここでは入門として,典型的なものを

いくつか紹介しよう.

まずは,次のように計算対象を分類するのが便利である:

平衡 equilibrium 状態 :  (例)相図を求める,結晶構造を求める,. . .

非平衡 nonequilibrium 状態 

定常 steady 状態 :  (例)熱伝導,拡散係数,蒸発凝縮速度,. . .

過渡 transient 現象 :  (例)核生成や結晶成長過程を調べる,. . .

25

Page 26: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

以下で紹介する例は主として,平衡状態あるいは定常状態における解析であり,集団平均 ensemble average

とともに 時間平均 time average をとることを想定している.過渡現象の場合は,時間平均をとることが

できないので,精度のよいデータ解析をするためには特別な工夫31が必要となる.

4.5.1 温度

MCシミュレーションではほとんどの場合,温度は求めるものではなく,パラメタとして与えるもの

である.そこで,この節では,MDシミュレーションにおける温度の話題に限定する.

まず初等統計力学の結果として,熱平衡状態においては,温度は運動エネルギーの平均値から決定さ

れることを思い出そう.LJ系のように,並進運動しかない質点系32では

3

2kBT =

⟨p2

2m

⟩(42)

が 温度 T の定義 であり,多くの場合において,運動エネルギーの平均値(集団平均+時間平均)をと

ることで温度が見積もられる.

Newton運動方程式を数値的に解くと,全エネルギーが保存される.統計力学的には,これは,小正準

集団 (N,V,E 一定) を扱っていることになる.しかし,熱浴と接している正準集団 (N,V, T 一定) のほ

うが計算結果の検討には便利であろう.計算系の温度を指定の値に制御する方法は,いろいろと開発さ

れている:

1. 速度スケーリング法: 式 (42)で見積もった計算系の温度 T が,目標とする温度 T0とずれている

とする.このとき,すべての粒子について

pnew =

√T0

T× pold (43)

により運動量 (もしくは速度)を変えてやることで,T0に近づけることができる.素朴な方法であ

り,厳密な意味では正準集団を生成することはできないが,この速度スケーリングを繰り返し行っ

て目標温度に近づけた後,温度制御をやめて小正準集団として結果を解析するということはよく行

われる.

2. 熱浴を使う: 正準集団の考え方に従って,熱浴に相当する自由度を計算系に導入することで,温

度を制御することができる.能勢33–Hoover熱浴 が有名である. 奥村久士先生 :各種統計アン

サンブルの生成法で詳しく述べられるであろう.31初期条件を変えて何度も計算するとか,うんと大きな計算系を使うとか… とにかく過渡現象の解析は大変です.32古典統計力学では一般に,1自由度あたり 1

2kBT ずつの運動エネルギーが分配される (エネルギー等分配則 equi-partition

law of kinetic energy). この結果,nd 自由度系 (例えば水分子の剛体モデルなら並進+回転で nd = 6) であれば,

nd

2kBT =

⟨nd∑g=1

p2g

2mg

⟩が T の定義となる.ここで,pg は g 番目の自由度の一般化運動量,mg は対応する一般化質量である.古典力学系では運動エネルギーはこのように一般化運動量の2次形式で書き表せるため,熱平衡状態では,すべての自由度の温度は等しいはずである.

33能勢修一 Shuichi Nose (1951-2005) 慶應大物理.この温度制御法の開発により,1989年,日本 IBM科学賞を受賞.彼にちなんで,分子シミュレーション研究会 (2019 年より分子シミュレーション学会と改称) 学術賞に 2008 年,能勢賞が制定された.

26

Page 27: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

3. ランダム力を使う: ブラウン運動に見られるように,(仮想的な)ランダム力 fr と 速度に比例し

た摩擦力をもつ ランジュバン Langevin 方程式

md2

dt2r = f − γ

d

dtr + fr (44)

を利用すると,粒子系の平均温度を制御できる.ランジュバン熱浴 ともよばれ,固体壁面の温度

を一定に保つためなどによく利用されている.

4.5.2 圧力

計算系の圧力 P はもちろん重要な熱力学量である.いくつかの求め方が知られている:

1. 系内に「壁」を設けて,壁が受ける力積から直接に圧力を求める.

2. ビリアル定理 virial theorem を利用する.

3. 熱力学の関係式を利用して間接的に求める.

ここでは,最もよく用いられる ビリアル定理に基づく方法を簡単に紹介する [42].

記述を簡単にするため,粒子間距離にのみ依存するペアポテンシャル ϕ(r) の場合に限定する.正準集

団 (N,V, T が一定) を考えると,その分配関数 partition function ZN (V, T ) は

ZN (V, T ) =1

N !

∫{dr}

∫{dp} exp

−∑ p2i

2m+∑ 1

2ϕ (|ri − rj |)

kBT

(45)

で定義される.ただし,簡単のため Planck定数の因子は省略した.§3.1で述べたように,分配関数は

Helmholtz自由エネルギー F (N,V, T ) と結びついている:

F (N,V, T ) = −kBT lnZN (46)

したがって,求めたい圧力 P は

P = −(∂F

∂V

)T

=kBT

ZN

(∂ZN

∂V

)T

(47)

と表現される.

ここで,計算系が,L×L×L の立方体だとしよう.もちろん L = 3√V である.F の体積依存性を調

べるため,座標ベクトル ri を次のように無次元化する:

ri =3√V · si (48)

このとき,分配関数は

ZN (V, T ) =V N

N !

∫ 1

0

{ds}∫

{dp} exp

−∑ p2i

2m+∑ 1

2ϕ(

3√V |si − sj |

)kBT

(49)

27

Page 28: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

-1

0

1

2

3

4

0 1 2 3 4 5 6 7

Pre

ssu

re

Volume per Particle

T=3.0T=2.0T=1.5T=1.0T=0.7 図 4-10: 式 (51)に基づいて LJ流体の圧力を

求め,1粒子あたりの体積 V/N の関数とし

てプロットしてみた.LJ流体の気液臨界温度

(無次元)は T ∼ 1.3 であることが知られて

いる.それより低温では,気液相分離状態が

出現する.シミュレーションでは,単調では

ない圧力変化(van der Waals ループ)が

観察される.

となるから,式 (47)にあらわれる体積微分は解析的に計算することができて,

kBT

ZN

(∂ZN

∂V

)T

=NkBT

V−

⟨∑i,j

1

2

dr

3√V |si − sj |

3V

⟩(50)

となる.ところで −dϕ

drは粒子 iと j の間に働く力の大きさであるから,最終的に次式を得る:

P =NkBT

V+

1

3V

∑i,j

⟨1

2fij · rij

⟩=

NkBT

V+

1

3V

∑i>j

⟨fij · rij

⟩(51)

第1項は理想気体にも存在する運動エネルギーの寄与である.第2項が粒子間相互作用に由来するもの

で,⟨fij · rij

⟩は ビリアル virial とよばれている34.もし,粒子間に斥力が強く働いている場合は,fij

は rij と同じ向きになるので,圧力に対してビリアル⟨fij · rij

⟩は正の寄与をする.引力が強い場合は,

fij は rij と逆向きなのでビリアル⟨fij · rij

⟩は負になり,理想気体よりも圧力が低下する.これらは直

感的にも理解できるだろう.図 4-10に,前節のMDプログラムに圧力計算を付け加えて求めた LJ流体

の 圧力-密度曲線 の例を示す.

式 (51)を利用して計算系の圧力を求めるには,十分な粒子数と十分な時間を使って⟨fij · rij

⟩を求め

る必要がある.計算系が小さかったり,時間平均が不足したりする場合には,圧力はひどく揺らぐこと

がよくある.ときどき,圧力の瞬間値とか,局所的な圧力といった表現の論文を見かけるが,その精度

や物理的な意味には注意が必要である.

圧力に関する補足

• 界面系など対象が等方的でない場合は,ビリアルはテンソル量となる.その各成分から,界面張力

を求めることができる [43].

• 真空の圧力がゼロなのだから,一般の物質については圧力は必ず正になる,と思い込んでいる人が

ときどきいる.しかし,式 (51)自体は P の正負について何も主張していない.実際,液体のシミュ

34“virial” という用語はラテン語の visに由来し,“force” あるいは “energy” といった意味合いをもつ.1870年にクラウジウスが命名したそうである.

28

Page 29: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

レーションにおいて計算セルを次第に広げて密度を下げていくと,よく負圧 negative pressure が

観測される.これは決して不自然なことではない.固体材料を扱っている人であれば,引っ張り試

験をする際の応力 stress を考えれば理解できるであろう.もちろん,大きな負圧の下では系は不安

定となり,気泡が発生したり亀裂が入ったりする.

• 統計力学の T–P 集団に対応して,圧力を制御するMC法,MD法がもちろん開発されている.本

スクールでは 奥村久士先生 :各種統計アンサンブルの生成法で紹介されるだろう.

4.5.3 構造解析の第一歩:動径分布関数

得られた粒子の座標データに基づいて,分子集合体の微視的な構造をさまざまな観点から解析するこ

とができる.原理的には,MD法でもMC法でも同じである.

均質 homogeneousな流体相 (気体,液体)であれば,まずは 動径分布関数 (radial distribution function,

RDF) g(r) を求めることから始まるだろう.これは,それぞれの粒子から距離 r離れたところに他の粒

子がどの程度存在しているかを示す指標であり,次式で定義される:

g(r) =原点に粒子があるとき,そこから距離 r と r +∆r の間にある他の粒子の個数

ρ× 4π

3

[(r +∆r)3 − r3

] (52)

ここで,ρは流体の数密度である35.一般的な特徴として,

1. 粒子間距離 rが非常に小さい場合には,粒子間の斥力のために粒子は存在できず,g(r) → 0となる.

2. r が粒子直径程度のところで g(r)はピークをもつ.引力的相互作用がある場合はもちろんポテン

シャルの谷にトラップされたからと理解できるが,斥力のみの場合であっても,粒子が互いに押し

付けあうことによるピークが観測される.

3. r → ∞では,粒子間に位置の相関がなく平均密度で存在するようになるため,g(r) → 1となる.

4. 密度・温度の条件によっては,g(r)が数回の振動を示すことがある.極端な場合として,結晶に対

しては,第一近接,第二近接,. . .に対応した位置にいくつもの鋭いピークがあらわれる.

図 4-11に,サンプルコードと解析例を示す.

この g(r)は,X線や中性子線の散乱実験から得られる構造因子 structure factor S(Q)と関係が深い:

S(Q) = 1 +

∫ ∞

0

4πr2ρ [g(r)− 1]sinQr

Qrdr (53)

また,液体理論においては g(r)は粒子相関を表す基本的な量である [42].

35厳密に言えば,ある粒子が原点にいるときの,他の粒子の平均数密度であるから,ρ = N−1V

(V は計算系の体積) とするべき

である.計算系のサイズが小さい (N が少ない) 場合は ρ = NVとした場合とは多少の違いが生じる.

29

Page 30: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

// rdf.cpp : calculate radial distribution function using save files#include <stdio.h>#include <math.h>

#define NUM_ATOM 512#define R_MAX 5.0#define TOTAL_STEP 10000#define SAVE_STEP 10#define NUM_HIST 100

void getdata(int), ini_rdf( ), calc_rdf( ), out_rdf( );

double posx[NUM_ATOM],posy[NUM_ATOM],posz[NUM_ATOM],momx[NUM_ATOM],momy[NUM_ATOM],momz[NUM_ATOM];int nsum, hist[NUM_HIST];double delta_r,cellx,celly,cellz,chx,chy,chz;

int main( ) //========================================={

int step;

ini_rdf( );for (step=TOTAL_STEP/2; step<=TOTAL_STEP; step+=SAVE_STEP) {

getdata(step);calc_rdf( );

}out_rdf( );

return 0;}void getdata(int step) //==============================={

int i;char fname[100];FILE *fsave;

sprintf(fname,"lj%8.8d.dat",step);printf("%s\n",fname);fsave=fopen(fname,"r");

if (fsave==NULL) {printf("Input File NOT Exist\n");return;

}fscanf(fsave,"%lf %lf %lf",&cellx,&celly,&cellz);chx=cellx/2; chy=celly/2; chz=cellz/2;

for (i=0;i<NUM_ATOM;i++) {fscanf(fsave,"%lf %lf %lf",&posx[i],&posy[i],&posz[i]);fscanf(fsave,"%lf %lf %lf",&momx[i],&momy[i],&momz[i]);

}fclose(fsave);return;

}void ini_rdf( ) //============================= Initialize Counter{

int h;

nsum=0;for (h=0;h<NUM_HIST;h++) hist[h]=0;delta_r=R_MAX/NUM_HIST;return;

}void calc_rdf( ) //========================== Accumulate Histogram{

int i,j,h;double dx,dy,dz;

for (i=1;i<NUM_ATOM;i++) {for (j=0;j<i;j++) { Periodic boundary taken into account

dx=posx[j]-posx[i];if (dx<-chx) dx+=cellx; else if (dx>chx) dx-=cellx;

dy=posy[j]-posy[i];if (dy<-chy) dy+=celly; else if (dy>chy) dy-=celly;

dz=posz[j]-posz[i];if (dz<-chz) dz+=cellz; else if (dz>chz) dz-=cellz;

h=(int)(sqrt(dx*dx+dy*dy+dz*dz)/delta_r);if (h<NUM_HIST) hist[h]++;

} }nsum++;return;

}void out_rdf( ) //==================================== Output RDF{

int h;double density,volume,r,rdf;FILE *fout;

fout=fopen("rdf.dat","w");density=NUM_ATOM/(cellx*celly*cellz);

for (h=0;h<NUM_HIST;h++) {volume=4.0*3.141592654/3.0*(3*h*h+3*h+1)*delta_r*delta_r*delta_r;rdf = hist[h]/(double)nsum/(0.5*NUM_ATOM)/(density*volume);r=(h+0.5)*delta_r;fprintf(fout,"%6.2f %8.3f %10d\n",r,rdf,hist[h]);

}fclose(fout);return;

}

0

1

2

3

4

0 1 2 3 4

RD

F

r

T=2.0, ρ=0.008T=0.7, ρ=1.0

得られた動径分布関数の例.高温低密度の気体状態と低温高密度の液体状態の比較.

図 4-11: 動径分布関数を求めるプログラムの例.解析に先立ってMDシミュレーションが行われて,粒

子の座標データが SAVE STEP ごとに得られているものとする.

30

Page 31: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

4.5.4 ダイナミクス解析の第一歩:速度自己相関関数

MD法では粒子の軌跡を追跡できるので,ダイナミクスの解析はMDシミュレーションをおこなう主

な目的のひとつであろう.まずは,自己拡散 self diffusion や 速度自己相関関数 (velocity autocorrelation

function, VAF) を求めるところから始まることが多い.

ある粒子の時刻 tにおける速度を v(t)とすると,VAFは次のように定義される:

VAF(t) = ⟨v(0)v(t)⟩ (54)

サンプルプログラムを図 4-12に載せた.

搖動散逸定理 fluctuation-dissipation theorem あるいは Green-Kubo公式36に基づいて,VAFから 自

己拡散係数 D を求めることができる37.

D ∝∫ ∞

0

⟨v(0)v(t)⟩ dt (55)

また,VAF の Fourier 変換から,Wiener-Khintchine 定理 により 振動状態スペクトル (density of

vibrational states, DOS) を求めることもよく行われる.

DOS(ω) =

⟨∣∣∣∣∫ v(t) exp(iωt)dt

∣∣∣∣2⟩

∝∫ ∞

0

V AF (t) cos(ωt)dt (56)

36以下に要点を示す.詳しくは統計力学の教科書等を参照されたい [44].一般に,時間変動する物理量(スカラー量でもベクトル量でもよい)A(t) を考え,定常状態において,その輸送係数 transport coefficient α を次式で定義する:

α ≡ limt→∞

1

2t⟨[A(t)−A(0)]2⟩

次式を用いて,この式を変形する:

A(t)−A(0) =

∫ t

0

A(t′)dt′

⟨[A(t)−A(0)]2⟩

=

∫ t

0

dt′∫ t

0

dt′′⟨A(t′)A(t′′)⟩

=

∫ t

0

dt′∫ t−t′

−t′dτ⟨A(t′)A(τ + t′)⟩   ∵ τ = t′′ − t′ に変数変換

=

∫ 0

−t

∫ t

−τ

dt′⟨A(t′)A(τ + t′)⟩+∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

= . . .途中,変数変換を経て . . .

= 2

∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

= 2

∫ t

0

dτ(t− τ)⟨A(0)A(τ)⟩

故に

limt→∞

1

2t⟨[A(n)−A(0)]2⟩ = lim

t→∞

∫ t

0

(1−

τ

t

)⟨A(0)A(t)⟩dτ ≃

∫ ∞0

⟨A(0)A(τ)⟩dτ

37計算条件によっては,t → ∞での収束性の問題などを検討しなければならず,面倒な場合もある (低温とか低密度において緩和が遅い場合など).拡散係数は平均二乗変位 mean square displacement から直接に求めることも多い.詳しくは教科書等を参照されたい

31

Page 32: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

// vaf.cpp : calculate velocity autocorrelation function#include <stdio.h>#include <math.h>

#define NUM_ATOM 512#define TOTAL_STEP 10000#define SAVE_STEP 10#define DEL_T 0.001#define NUM_HIST 100#define NUM_DATA (TOTAL_STEP/2/SAVE_STEP+1)

void getdata(int), vaf( );

double momx[NUM_ATOM][NUM_DATA], momy[NUM_ATOM][NUM_DATA], momz[NUM_ATOM][NUM_DATA];int ndata;

int main( ) //=============================================={

int step;

ndata=0;for (step=TOTAL_STEP/2; step<=TOTAL_STEP && ndata<NUM_DATA ; step+=SAVE_STEP) {

getdata(step);ndata++;

}vaf();return 0;

}void getdata(int step) //===================================={

int i;double posx, posy, posz, cx, cy, cz;char fname[100];FILE *fsave;

sprintf(fname,"lj%8.8d.dat",step);printf("%s\n",fname);fsave=fopen(fname,"r");

if (fsave==NULL) {printf("Input File NOT Exist\n");return;

}fscanf(fsave,"%lf %lf %lf",&cx,&cy,&cz);

for (i=0;i<NUM_ATOM;i++) {fscanf(fsave,"%lf %lf %lf",&posx,&posy,&posz);fscanf(fsave,"%lf %lf %lf",

&momx[i][ndata],&momy[i][ndata],&momz[i][ndata]);}fclose(fsave);return;

}void vaf( ) //============================================{

int i, t1, t2, tmax, h, count[NUM_HIST];double vaf[NUM_HIST];FILE *fout;

for (h=0;h<NUM_HIST; h++) {vaf[h]=0; count[h]=0;

}

for (i=0;i<NUM_ATOM;i++) {for (t1=0; t1<ndata; t1++) {

tmax=t1+NUM_HIST;if (tmax>ndata) tmax=ndata;for (t2=t1;t2<tmax;t2++) {

vaf[t2-t1] += momx[i][t2]*momx[i][t1]+momy[i][t2]*momy[i][t1]+momz[i][t2]*momz[i][t1];count[t2-t1]++;

}} }

fout=fopen("vaf.dat","w");for (h=0;h<NUM_HIST;h++) {

fprintf(fout,"%8.3f %10.4f\n",h*DEL_T*SAVE_STEP,vaf[h]/count[h]);}fclose(fout);

return;}

-0.50

-0.25

0.00

0.25

0.50

0.75

1.00

1.25

0 0.2 0.4 0.6 0.8 1

VA

F / V

AF

(t=

0)

t

T=2.0, ρ=0.008T=0.7, ρ=1.0

得られた VAFの例.高温低密度の気体状態と低温高密度の液体状態の比較.

図 4-12: 速度自己相関関数 VAF を求めるプログラムの例.

32

Page 33: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

5 計算効率を上げるには

どんな数値計算にも共通することであるが,計算効率をあげるためには,プログラムのどの部分に時

間が費やされているかを評価する必要がある.自分で関数やサブルーチン単位の時間計測をしてもよい

が,プロファイラ profiler と呼ばれるツール群が存在するので,適当なものを使うのもよい [45].

分子シミュレーションでは,ほとんどの場合において最も計算時間がかかるのは,粒子間相互作用(ポ

テンシャルエネルギーや力の計算)を計算する部分である.例えば,2体相互作用の場合を考えてみよ

う.第 4章で紹介したような素朴なアルゴリズムであれば,N 粒子系に対して,相互作用計算の時間は

N2(すなわちペアの数)に比例するのに対して,それ以外の部分(位置と運動量の更新など)はN に比

例する程度であるから,N が大きくなると相互作用の計算が他を圧倒するようになる.したがって,ま

ずは相互作用計算の効率を上げることに集中しよう.

この章では,分子シミュレーションにおいて計算効率を上げる工夫の一端を,3つの観点から簡単に

紹介する. 安藤嘉倫先生 :分子シミュレーションの高速・並列化 –最近の進展–の講義で詳しく取り上

げられるだろう.

5.1 高速化:物理学的な視点から

5.1.1 相互作用のカットオフ

一般に,粒子間相互作用は粒子が離れると急速に小さくなる.そこで,ある程度以上離れた粒子の間

には相互作用が働かない,と近似することができるだろう.2体相互作用 ϕ(r)であれば,ある定数 rcを

決めて,r > rc では ϕ = 0としてしまう.これは,相互作用のカットオフ (cutoff あるいは truncation)

と呼ばれる.擬似コードを図 5-13に示す.

カットオフによってどの程度の誤差が出るかは,直接的には,カットオフ位置でのポテンシャルエネ

ルギー ϕ(rc) として評価することができる.別の評価法として,本来は r > rcにおいても相互作用して

いるはずのペアを無視したのだから

ρ

∫ ∞

rc

4πr2ϕ(r)dr (57)

程度のポテンシャルエネルギーをゼロと近似してしまったという評価もできる (ρは数密度).

for (i=1;i<NATOM;i++) {for (j=0;j<i;j++) {   dx=posx[i]-posx[j];   dy=posy[i]-posy[j];   dz=posz[i]-posz[j];   r2= dx*dx +dy*dy +dz*dz;   if (r2 < RCUT*RCUT) {     calculation of force and potential energy   }}  }

図 5-13: 相互作用カットオフの部分の擬似コード

33

Page 34: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

表 5-3: Lennard-Jones相互作用をカットオフすることによるエネルギーの誤差の見積り.

rc [σ] ϕLJ(rc) [ϵ]

∫ ∞

rc

4πr2ϕLJ(r)dr [ϵ]

2.0 -0.06152344 -2.08348679

2.5 -0.01631689 -1.07086620

3.0 -0.00547944 -0.62027776

3.5 -0.00217478 -0.39072006

4.0 -0.00097632 -0.26177808

4.5 -0.00048165 -0.18386270

5.0 -0.00025598 -0.13403843

5.5 -0.00014450 -0.10070599

6.0 -0.00008573 -0.07756963-1

0

1

2

0 1 2 3

φ [ε]

r [σ]

LJ Potential

rc

φ(rc)

Lennard-Jones相互作用の場合の例を表 5-3に示す.例えば,rc = 4.0σとすると,ポテンシャルの深

さ ϵに対して 0.1% 程度の誤差が,またポテンシャルエネルギー全体 (最密充填構造なら約 −12ϵ)に対

して 2% 程度の誤差が生じるであろうと予想される.実用上は,rc = 3.5 ∼ 5.0σ 程度がよく使われる

ようである.

カットオフに関する補足

1. カットオフ長さより遠いところにあるペアについて,本来なら相互作用しているはずのものを無視し

たのであるから,遠方での分布が均一である [すなわち,§4.5.3で紹介した動径分布関数が g(r) = 1]

との仮定の下に,計算後に補正 (カットオフ補正)をすることができる.圧力の計算についても,ビ

リアル項への補正が可能である.

2. カットオフ補正をする代わりに

ϕnew(r) =

ϕ(r)− ϕ(rc) r ≤ rc

0 rc < r(58)

のように,ポテンシャル関数自体を ϕ(rc)だけ底上げした別の関数形 (cut-and-shiftedポテンシャ

ル)を使ったと考えることもできる.MD法では,ϕ(r)の勾配 (一階微分)として求める「力」だけ

が必要となるため,この定数分の底上げは粒子の軌跡には影響を与えない.しかし,rcにおいて力

が不連続であることに変わりはないので,高精度の計算を行うために,rc付近を滑らかにつなぐよ

うな 窓関数 (あるいは smoothing) を利用することがある.

3. もちろん,クーロン相互作用など,r−n (n ≤ 3) の形をした長距離相互作用の場合,式 (57)は発

散してしまうので,このような単純なカットオフ法を用いることはできない.エワルド法 Ewald

summation technique や PPPM法 particle-particle-particle-mesh algorithm などが開発されている.

詳しくは 三上益弘先生:原子間・分子間相互作用エネルギー関数と長距離力計算法で紹介される

だろう.

34

Page 35: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

5.1.2 帳簿法

相互作用をカットオフすることで,r > rc でのポテンシャルや力を計算する必要がなくなるが,実はこ

のことによる計算速度の向上はあまり大きくない38.それは,そもそも粒子間距離 rを求める計算コスト

が大きいからである.遠く離れたすべての粒子ペアの距離を毎回毎回計算しなくても済む方法があればう

れしい.その目的で2種類の方法がよく利用されている.まずは帳簿法 (book keeping method, neighbor

list method) を紹介する.

カットオフ長さ rc を決めると,それぞれの粒子は,半径 r ≤ rc 以内にある粒子としか相互作用をしな

いことになる.通常の固体や液体であれば,その数は高々100粒子程度であり,総粒子数に比べると一般

にきわめて少ない.そこで,各粒子について,予め相互作用をする粒子のリスト (帳簿 あるいは neighbor

list)を持たせておけば,計算効率が上がると期待される.もちろんそのリストの作成自体には計算コス

トがかかるのであるが,リスト作成の頻度を,100ステップに1回,あるいは 1000ステップに1回,と

いうように少なくできればよい.一般には,粒子は次第に移動していくので,ある程度シミュレーショ

ンが進んだ後には,そのリストを更新してやらなければならない.この方法により,リスト更新の時間

を除くと,相互作用の計算が ∝ N2 から ∝ N に軽減されることになる.

実際には,ある長さ ∆r を決めておき,ある瞬間にそれぞれの粒子について r < rc+∆r 以内にある他

の粒子のリストを作成する39.その後,M ステップの間はそのリストに基づいて相互作用の計算を行っ

た後,リストを更新する.図 5-14に擬似コードを示す.

2つのパラメタ,∆r と更新頻度 M を適切に選ぶことが重要である.∆r を小さくして登録する粒子

数を減らすと,1ステップあたりの相互作用の計算時間を減らすことができるが,リストを頻繁に更新

しなければならなくなるため,∆r と M はトレードオフの関係にあり,試行錯誤で決定する必要がある.

実際のパラメタの値は,計算対象の条件によって大きく異なる.温度が高く粒子の運動が激しい場合に

は,すぐにリストの範囲外に出てしまうため,∆r を大きくし,かつ頻繁な更新が必要となる.逆に,低

温の結晶のように,各粒子が格子点付近で振動するだけでほとんど拡散が起こらない場合,リストの更

新の頻度を大きく下げることができるだろう.例えば,三重点付近の低温・高密度の Lennard-Jones液

体の場合なら,∆r ∼ σ,M ∼ 100 程度でもいい..

rcut

rtbl=rcut+∆r

for (i=1;i<NATOM;i++) {for (jt=0;jt<itmax[i];jt++) {   j=itable[i][jt];

   dx=posx[i]-posx[j];

   dy=posy[i]-posy[j];

   dz=posz[i]-posz[j];

   r2= dx*dx +dy*dy +dz*dz;

   if (r2 < RCUT*RCUT) {    calculation of force and potential energy

   }} }

図 5-14: 帳簿法の概念と該当部分の擬似コード.

38もちろん,相互作用の計算自体に時間がかかるような複雑な関数形ならばカットオフのみでも多少の効果は期待できるが.39もちろん,作用・反作用の法則を利用して,i < j のペアのみ選び出せばよい.

35

Page 36: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

5.1.3 セル分割法

高速化のための別の方法として,計算系を,一辺が l の小さな立方体セル40に分割することを考える.

サイズ l を rc ≤ l を満たすように選べば,粒子間の相互作用は,(1) 同じセルに属する粒子間,もしく

は (2) 隣接するセルに属する粒子間,に限定される.図 5-15に示すように,隣接するセルの数は限られ

ている (2次元なら 32 − 1 = 8つ,3次元なら 33 − 1 = 26個,さらに作用反作用の法則を使うとその半

分でよい) から,大きな計算系であれば相互作用の計算を大幅に減らすことができる.この方法は セル

分割法 cell division method と呼ばれている.

それぞれのセルに属する粒子の数は有限 (ふつうは高々100粒子程度) であるから,相互作用の計算時

間は ∝ N となる.帳簿法とは異なり,セル分割は各ステップごとに行わなければならないが,この分割

作業は各粒子がどのセルに属するかを決定するだけであるから,∝ N で高速に計算できる.従って,セ

ル分割法では全体として ∝ N の計算速度が期待される.図 5-16に速度の N 依存性の例を示す.

素朴なセル分割法では,セルサイズを rc に近く選ぶが,クーロン力や重力のような長距離相互作用

がある系で,遠方の粒子からの影響を,セル単位に粗視化して考慮することも行われている (PPPM

法 [46]など). 三上益弘先生 :原子間・分子間相互作用エネルギー関数と長距離力計算法で紹介される

かと思う.

>rcut

for (icell=0;icell<NUMCELL;icell++) {

for (it=0;it<ntmax[icell];it++) {

i=ntable[icell][it];

// In the same subcell

for (jt=0;jt<it;jt++) {

j=ntable[icell][jt];

dx=posx[i]-posx[j];

dy=posy[i]-posy[j];

dz=posz[i]-posz[j];

r2= dx*dx +dy*dy +dz*dz;

if (r2 < RCUT*RCUT) {

calculation of force and potential energy

}

}

// between the neighbor subcells (13 in 3D case)

for (jc=0;jc<13;jc++) {

jcell=neighborcell[icell][jc];

for (jt=0;jt<ntmax[jcell];jt++) {

j=ntable[jcell][jt];

dx=posx[i]-posx[j];

dy=posy[i]-posy[j];

dz=posz[i]-posz[j];

r2= dx*dx +dy*dy +dz*dz;

if (r2 < RCUT*RCUT) {

calculation of force and potential energy

}

} }

}

図 5-15: セル分割法の概念と該当部分の擬似コード.

40計算系が直方体であれば,分割するセルも一般には直方体となるが,その最小辺の長さが rc 以上であればよい.

36

Page 37: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

0

50

100

150

200

250

300

350

400

0 25 50 75 100 125 150

Tim

e [se

co

nd

/ 1

00

ste

ps]

Number of Atoms [X1000]

図 5-16: セル分割法を用いたMDシミュレー

ションの計算速度の例:LJ流体 (カットオ

フ長さ rc = 3.5σ, 数密度 ρ = 0.8),Intel

Core2Quad 2.66GHzを使用.計算時間が粒

子数にほぼ比例している(つまり ∝ N)こ

とがわかる.

5.1.4 補足:帳簿法とセル分割法の使い分け

多くの粒子を含む計算系に対して,ここで紹介した方法はどちらも有効にはたらく.それぞれの長所・

短所を簡単に述べると41

• 帳簿法:各粒子に近接粒子のリストデータを持たせるだけなので,プログラミングは容易.パラメ

タ∆rとM (更新頻度) を最適に選ぶためには,少し試行錯誤が必要.∆rが小さすぎたりM が大

きすぎると,リストから漏れる粒子対が発生し,誤差の原因となるが,気付きにくい.気液共存系

などの場合には,粒子の移動が速い領域に合わせて∆rとM を選ぶことになるので,無駄が生じ

やすい.

• セル分割法:分割したセルごとに粒子を登録するという部分を効率よくプログラミングするのに少

し手間がかかる.また,サブセルごとに粒子リストを作成することから,一般的には必要なメモリ

量も帳簿法よりも多い.rc ≤ Lという条件を守っている限り,この方法を導入したことによる誤差

は生じない.系内に不均一性があっても計算効率への影響は小さい.また,後述する並列計算(特

に分散メモリ型並列)との相性がよい.

5.2 高速化:数値計算法の視点から

MD法は,運動方程式を数値積分する手法である.誤差や数値不安定性の許容範囲内で,できるだけ

時間刻み ∆t を大きくとることで,計算速度を向上させることができる42.

41以上のような特徴から,私のグループでは,粒子数 104 程度までの規模の流体系,および自己拡散が少ない固体系では帳簿法を,それ以外の大規模系な流体系の計算にはセル分割法を使うが多い.

42もっときちんと言えば,少ないステップ数で,目的とする時間経過を追跡することができる,ということである.仮に ∆t を10倍にとることができれば,ステップ数は 1/10で済むので,アルゴリズムが複雑になって1ステップ当りの計算量が多少増えたとしても,トータルでは計算時間の短縮が期待できる.

37

Page 38: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

5.2.1 シンプレクティック積分法

従来は,3.3節で簡単に紹介したように,運動方程式を差分化してある次数で打ち切るというタイプの

数値積分法が使われてきた.蛙跳び法,Verlet法,予測子-修正子法,などがそれである.最近,こうし

た運動方程式を別の角度から眺めることで,エネルギーの保存を満たしつつ,系統的に数値積分の精度

を上げる方法 (symplectic integrator)がよく使われるようになってきた. 吉井範行先生 :力学,解析力

学,数値解法,拘束動力学の中で紹介があると思う.

5.2.2 マルチタイムステップ法

回転や振動など,並進運動以外の自由度をもつ分子系のMD計算を考えてみよう.例えば,図 5-17の

ような回転運動を考えると,慣性モーメント成分の大きさが方向によって異なるため,回転運動の特徴

的な時間も方向によって異なることになる.図 5-17の例で言えば,水素原子の質量が小さいため,y軸

まわりの慣性モーメントが非常に小さく,1 fs (=10−15秒) のオーダーで回転している43.通常のMD法

では,特徴的な時間の最も短い自由度に合わせて時間刻み∆tを設定しなければならないため,計算効率

が低下する.そこで,特徴的時間の短い (=速い)運動には小さな∆tを,特徴的時間の長い (=遅い)運

動には大きな∆tを使えば,あまり精度を落とすことなく数値積分ができると期待される.これがマルチ

タイムステップ法 multi-timestep method の原理で,振動・回転・並進など多階層にわたる自由度を持つ

分子系のシミュレーションに用いられることがある.

x

y

z 図 5-17: 水分子のモデル例.非直線分子なので,並進運動

以外に,質量中心を通る各慣性主軸まわりの回転運動が存在

し,その特徴的時間はそれぞれ異なる.

5.3 高速化:計算機の視点から

「速い計算機」を使うことができれば,もちろん計算時間を短縮できる.いくつかの選択肢を述べて

おこう.

43x 軸まわり,z 軸まわりの回転の特徴的時間は 10 fs 程度,並進運動は 20 fs 程度.

38

Page 39: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

表 5-4: TOP500 (June, 2019) のデータから [47].

計算性能は今でも,昔ながらの LINPACK44ベンチマークにより flops45単位で計測される.

Rank Site, Name Nation Year CoresMax Speed

(Tflops)Accelerator

1 Oak Ridge National Lab., Summit USA 2018 2,414,592 148,600 NVIDIA Volta GV1002 Lawlence Livermore National Lab., Sierra USA 2018 1,572,480 94,640 NVIDIA Volta GV1003 Supercomp. Center in Wuxi, 神威太湖之光 China 2016 10,649,600 93,015 None4 Supercomp. Center in Guangzhou, 天河 2A China 2018 4,981,760 61,445 Matrix-20005 Univ. Texas, Frontera USA 2019 448,448 23,516 None6 Swiss National Supercomp. Centre, Piz Daint Switzerland 2017 387,872 21,230 NVIDIA Tesla P1007 Los Alamos National Lab., Trinity USA 2017 979,072 20,159 None8 産総研, AI Bridging Cloud Infrastructure Japan 2018 391,680 19,880 NVIDIA Tesla V1009 Leibniz Rechenzentrum, SuperMUC-NG Germany 2018 305,856 19,477 None

· · ·16 HPC 基盤施設 (筑波大, 東京大), Oakforest Japan 2016 556,104 13,555 Xeon Phi20 理研, 京 (K) computer Japan 2011 705,024 10,510 None25 東工大, Tsubame 3.0 Japan 2017 135,828 8,125 NVIDIA Tesla P10032 気象庁 Japan 2018 135,792 5,731 None33 気象庁 Japan 2018 135,792 5,731 None

図 5-18: TOP500 (June, 2019) のデータから,(左)性能の変遷,(右)国別シェア.

5.3.1 高速なハードウェアを使う

有名な TOP500 の最新データを表 5-4に示す.2012年に世界1位となった  けい

京 コンピュータ [48] は今

年 8月で廃止となり,さらに次世代スーパーコンピュータの建設が始まっている.世界の国々との競争

の中で,将来にわたって日本の計算機環境をトップレベルに維持できるかどうかは,皆さんの肩にかかっ

ている!

このような「スーパーコンピュータ」の特徴は,計算性能をあげるために コア数 を極端に増やしてい

ることであり,TOP500の上位にくるようなシステムでは,数十万コア以上が普通である.これは,1つ

44もともと米国 Argonne 国立研究所で開発された線形代数の数値計算パッケージ.その中で,連立一次方程式をガウスの消去法で解くプログラムが,計算機の速度性能を測るベンチマークとして今でもよく利用されている.

45flops は Floating Point number Operations per Second の頭文字をとったもので,1秒間に1回浮動小数点演算が行えるとき,1 flops である.ハードウェアの設計性能としては,例えば,Intel の Core i7 (Nehalem, 4 コア, 3.3GHz) の理論性能が50Gflops程度とされている.これは,4 flops/clock×3.3GHz×4コア として見積もられる (Wikipedia日本語版, FLOPSの項より).

39

Page 40: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

のコアの性能向上46に限界が見えてきているためとされる.このため,コア数を増やすことで計算性能

を上げようとしているのである.また,身近な例では,PCに搭載されているプロセッサ (例:Pentium

や Core i7)も

single core → dual core → quad core → · · ·

とコア数が増え続けている.47これらは マルチコアプロセッサ と総称されている.さらに,十数個以上

のコアを搭載しているものは メニーコアプロセッサ と呼ばれることもある.

従って,現在では,高速な計算機を使うことは多くのコアを駆使して並列計算を行うこととほぼ同義

である と言える.以下では,分子シミュレーションに並列計算を使うための基礎を簡単に紹介する.

5.3.2 並列計算の基礎知識:まずはハードウェアについて

並列計算機は,分散メモリ型と共有メモリ型に大別される (図 5-19).

○ 共有メモリ型 distributed memory system

• 長所:原則としてすべてのコア (あるいは CPU)が同じメモリにアクセスできるので,データの所

在をあまり意識することなくプログラムを作成できる.

• 短所:コア数が多くなると,メモリアクセスの競合が起こりやすい.また,ハードウェア(特にコ

ア間をつなぐ通信回路)の構造が複雑になり,製造コストが高くなりがちである.

○ 分散メモリ型 shared memory system

• 長所:ハードウェアの構造が比較的単純で,コストパフォーマンスに優れる.たとえば複数台の PC

をネットワークで結合した PCクラスターも分散メモリ型に分類される.

• 短所:データの一部のみをローカルメモリに置いて処理を行うので,メインメモリとローカルメモ

リの整合性を考えたプログラムを作成しなければならない.すなわち,データ通信をユーザ側であ

らわに制御する必要がある.

CPU CPU CPU CPU

Main MemoryData

Bus

CPU

Local Memory

CPU

Local Memory

CPU

Local Memory

Data

Bus

図 5-19: 並列計算機のハードウェアの基本概念:(左)共有メモリ型,(右)分散メモリ型.

46有名なムーアの法則 Moore’s law は,集積回路の集積度が 2–2.5 年で倍増することを予測する.1つのコアの計算速度は,大まかには集積度にほぼ比例すると考えることができる.

472017年 6月 15日,Intel は,28コアを1つのパッケージに収めた Xeon Platinum を発表した.本稿執筆時点での Intelの最強プロセッサは Xeon Platinum 9282 (56 コア,2.60 GHz, 2019 年 4 月発売) のようである.一方,AMD は,Ryzen 9 の3950 (32 コア,3.5 GHz) の発売を予定している.

40

Page 41: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

これらの特徴から,TOP500に登場するような大規模並列計算システムの多くは,分散メモリ型を基本

としている.他方,Intel Core X, Xeon, IBM POWER7, AMD Ryzen といった最近のマルチコアプロ

セッサの多くは,そのプロセッサ内部が,すべてのコアから等しくメモリにアクセスできる共有メモリ

型であるため,OSの指令により1つの処理がいろいろなコアを自由に移動することで,処理の集中を避

けている.48

補足:ハードウェアについてもう少し

• Homogeneous core vs. Heterogeneous core: 1つのコアの性能が頭打ちになっている状況で,

マルチコア化が進んでいるが,dual core, quad core などの CPUは,基本的には共有メモリ型で

あり,すべてのコアから同じようにメモリにアクセスできると考えてよい.これを homogeneous

core とよび,そのための並列プログラミングは比較的容易である.

 他方,元来は少し特殊な用途を想定して,役割の異なるコアを組み込んだものがある.1つは,

ゲーム機PS3に搭載されたことで有名になった Cell Broadband Engine (SCE, IBM,東芝の共同開発)

であり,1つの汎用的なコアと8個の高速かつ比較的単純な演算コアで構成された,heterogeneous

な構造をとっている.もう1つは,NVIDIA社のGeForceなどに代表されるような GPU (Graphic

Processing Unit) であり,元々は高速な画面表示のために CPUとは独立に画像処理を行うために

開発されたチップであり,単純な演算のみを高速に行う多数の演算ユニット49をもっている.GPU

を数値計算の並列処理目的で使う GPGPU (General Purpose computing on GPU) が注目を集めて

いる [49–52].これらは,コアの構成に対応したデータ通信を意識してプログラミングする必要が

ある.他方,このようなトレンドに対抗して,2013年 1月,Intel は Xeon Phi と称する並列コン

ピューティングボードを発売した50.現在,コア数 60程度の x86互換コアを搭載した製品が市販

されている [53].

• Grid Computing: さまざまなコンピュータをネットワーク(とミドルウェア)を介して疎結合

し,大規模な計算をうまく分散させて並列に処理するアイディアが実用化されている.幾つかの有

名な例をあげると:

・NAREGI (National Research Grid Initiative):国立情報学研究所を中心として,日本国内の大

型計算機等を結合して使うことをめざしたプロジェクト [54].2012年終了.

・SETI@home:地球外生命体 (Search for Extra-Terrestrial Intelligence) の探索目的で,家庭の

PCなどを疎結合して宇宙線データの解析をおこなうプロジェクト.

・Folding@home:タンパク質の構造解析やシミュレーションのために,SETI@home と同様に多

48関連する技術をもう2つ:・ハイパースレッディング hyperthreading:本来は Intel の商標.1 つのコアで複数のコード(多くは2つ)を実行する技術.例えば,「Intel Core i7 7700 は物理コア 4, 論理コア 8 を搭載」などと称する.他社のマルチコアプロセッサも類似の技術を使っている.・ターボブースト tubro boost:Intelが開発した,プロセッサを定格の周波数より高速で動作させる技術.計算負荷が集中している特定コアのみをクロックアップする.例えば,「Intel Core i7 7700 は動作周波数 3.6 GHz, ターボブースト時は最大 4.2 GHz」などと言う.プロセッサ全体を使うマルチスレッド計算時には恩恵が少ない.

49NVIDIA:Tesla M2000 シリーズでは,コア数 448–512,単精度浮動小数点性能 1.55–1.85Tflops (倍精度はその半分) だそうである.

502016年 6月,後継の Xeon Phi Knights Landing の一般市場への出荷が始まった.アクセラレータとしての利用が標準だった前のバージョン(Xeon Phi Knights Corner)と違い,homogeneous な構造をもち,単体で OS が走る.

41

Page 42: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

くの PCを疎結合したプロジェクト [55].2006年には,PS3 をも組み込めるようになった.現在

は,NVIDIA の GPU も参加できる.

• Intel Core i9 vs. Ryzen: 本稿執筆時点で市販中または市販予定の各社のデスクトップ PC向け

最上位 CPUは以下のとおり.デスクトップ PCでも 20並列,30並列の計算が容易に行える時代

がやってきた!

製造 シリーズ プロセスルール 型番 コア数/スレッド数 クロック L2キャッシュ 発売日

Intel Skylake-X 14 nm 9980XE 18/36 3.0 GHz 1024kB×18 2018.12.21

AMD Ryzen 9 7 nm 3950X 16/32 3.5 GHz 8 MB 2019.9(予定)

5.3.3 並列計算の基礎知識:続いてソフトウェアの観点から

マルチコアプロセッサの普及に伴って,ほとんどの OSが何らかの形での並列処理をサポートするよ

うになってきている.一般ユーザが手を出しやすいものを幾つか挙げておく:

1. pthread:もともとは POSIX に標準的に装備されていた thread libraryであるが,Windows版も

存在する [56].

2. PVM: Parallel Virtual Machine [57] から名づけられた.古くからある並列処理言語であり,実装

されている計算機も多い.

3. MPI: Message Passing Interface の略 [58,59].PVM に代わるようにして広く使われている.実装

としては MPICH2 や OpenMPI が有名であり,多くの分散メモリ型計算機で利用されている.

4. OpenMP:主として共有メモリ型の計算機のためのライブラリ.マルチコアプロセッサを搭載した

単体の PCで並列計算を行うのに便利 [60, 61].

5. CUDA, OpenCL: CUDA (Compute Unified Device Architecture) は NVIDIA社が自社 GPUの

ために提供しているライブラリ [49].GPU やマルチコア CPU,CELL などのための汎用的並列

処理ライブラリとして,OpenCL が制定され,ライブラリの提供が始まっている [52].

6. Cilk Plus:インテルの並列コンパイラ環境 Parallel Composer に含まれる Cおよび C++の言語拡

張 [62].きめこまかいチューニングが可能.

5.3.4 演習:すぐに始められる並列計算

最近の PCの多くは,マルチコアCPU (たとえば インテル社の Core i5) を搭載しているだろう.その

ような PCを使って,手軽に並列計算を試してみよう.ノート PCでも,多少性能は劣るかも知れないが

可能である.多くの人にとって敷居が低いように,Windows+OpenMP を利用することにする [60,61].

42

Page 43: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

1. 環境の整備:

OpenMPライブラリが使えるコンパイラは幾つか存在する.ここでは,学生や個人開発者向けに

無償で公開されている Windows Visual Studio Community に付属する C++コンパイラを使うこと

にする51.

(a) MicrosoftのWebサイトよりMicrosoft Visual Studio Community 2019 (あるいは別のバージョ

ン) をダウンロードし,インストールする.URL は “visual studio community” などで検索

すれば見つかるはず.

(b) 次のテストプログラムを作成し,適当な名前 (例えば hello-para.cpp)で保存する:

#include <omp.h>#include <stdio.h>

int main(){#pragma omp parallel printf("Hello from thread %d / %d\n", omp_get_thread_num(), omp_get_num_threads()); return 0;}

(c) 開発環境用のコマンドプロンプト (通称 DOS窓) を開き,テストプログラムを保存したフォ

ルダに移り,コンパイル・実行する (図 5-20).コンパイラオプション /openmp をつけるのが

重要である.搭載している CPUのコア数 (ハイパースレッディングを使っている場合は論理

コア数) が表示されれば,正しく環境が構築されている.

> cd プログラムファイルのあるフォルダ> cl /openmp hello-para.cpp  ・・・> hello-para.exeHello from thread 0 / 8Hello from thread 2 / 8Hello from thread 1 / 8  ・・・

図 5-20: テスト用並列プログラムのコンパイルと実行の様子.

51以下の記述は,本稿執筆時点 (2019 年 7 月) でのものです.最新の情報はご自身で確認してください.また,環境のインストールもご自身の責任で行ってください.多分,Visual Studio 2010 など少し古いバージョンでも動くと思います.

43

Page 44: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

2. MDプログラム並列化の指針:

第 5章冒頭でも述べているように,分子シミュレーションで最も時間がかかるのは相互作用の計

算である.この部分をうまく並列化することができれば,効率の大幅な向上が期待できる52.並列

化の考え方には大別して,各プロセッサが受け持つ粒子を常に固定しておく粒子並列化と,各プロ

セッサには固定された空間領域を受け持たせる領域並列化の2つがある.ここでは,より簡単な粒

子並列化のみを簡単に紹介するが,大規模計算系では,領域分割 (§5.1.3) と領域並列化を併用する

のが一般的であろう.

3. MDプログラムの並列化の第1歩:

OpenMP は,原則としてプログラムをあまり大きく変更/修正することなく,ディレクティブ

directive とよばれる指示行をプログラム中に埋め込むことによって,並列化をコンパイラに指示す

るというスタイルをとる.コンパイル時に並列化オプションをつけなければ非並列の実行ファイル

が作られるので,計算環境が変わってもコンパイルし直すだけで同じプログラムを使い続けられる

というメリットがある.図 5-21のサンプルプログラムは,元のMDプログラム (図 4-8) のうち,

force部分を粒子単位で並列化したものであり,ループの直前に次の指示行を挿入している:

 #pragma omp parallel for private (dx, dy, ...) reduction+: (eng_pot, fix, ...)

//------------------------------------------------// Calculate Forces: minimal image convention//void force( ){

   ・・・途中省略・・・for (i=0; i<NUM_ATOM; i++) {

fix=fiy=fiz=0.0;#pragma omp parallel for private (dx,dy,dz,r2,ri06,ri12,eng,frc) reduction(+:eng_pot,fix,fiy,fiz)

for (j=i+1; j<NUM_ATOM; j++) {dx=posx[i]-posx[j];

if (dx<-cxh) dx+=CELL_X; else if (dx>cxh) dx-=CELL_X;dy=posy[i]-posy[j];

if (dy<-cyh) dy+=CELL_Y; else if (dy>cyh) dy-=CELL_Y;dz=posz[i]-posz[j];

if (dz<-czh) dz+=CELL_Z; else if (dz>czh) dz-=CELL_Z;r2=dx*dx+dy*dy+dz*dz;

if (r2<RCUT*RCUT) {ri06=1.0/(r2*r2*r2);ri12=ri06*ri06;eng=4*(ri12-ri06);frc=4*(12*ri12-6*ri06)/r2;

eng_pot += eng;fix += frc*dx;fiy += frc*dy;fiz += frc*dz;frcx[j] -= frc*dx;frcy[j] -= frc*dy;frcz[j] -= frc*dz;

}}

frcx[i]+=fix;frcy[i]+=fiy;frcz[i]+=fiz;

}}

図 5-21: OpenMPによるMDプログラムの並列化の例:force( )の主要部のみを示す.#pragmaで始

まる行が,OpenMP用の指示行.

52計算コードを並列化したときの性能向上率を定量的に記述したものとして,アムダールの法則 Amdahl’s law がよく知られている.全体の計算のうち,並列化可能な部分の割合を P , 並列化ができず順次実行するしかない部分の割合を 1− P とすると,N 個のプロセッサ (コア) による性能向上率は 1

PN

+(1−P )と見積もることができる.

44

Page 45: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

図 5-22: Core i7 (4コア/8スレッド) 搭

載のWindows機で並列MD計算を実行

している時のタスクマネージャーの例.

8つの論理コアがほぼ 100% 稼働して

いる.

これは,それぞれのスレッドが局所的に使用する変数の指示,ならびに,最後に総和をとることを

指示するものである [61].

4. その先へ:

少し大規模な計算系だと,元のMDプログラム自体に 帳簿法 や セル分割法 を使っていることだ

ろう.もしセル分割法を使っていれば,セルごとに並列化することができる (領域並列化).その方

が計算単位が大きい (よく “粒度 granularity が大きい” という言い方をする) ために,一般には効

率を向上させやすい.図 5-23にセル分割法 + OpenMP による LJ流体系の性能向上の例を示す.

また,分散並列計算の例として,LAMMPS (§6.1.1) の webページで公開されている LJ流体系の

ベンチマークを図 5-24に示す.

10-1

100

101

102

103

103

104

105

106

Tim

e (

se

c/1

00

0 s

tep

s)

Number of Atoms

Xeon E5, singleXeon E5, 8 threadsXeon Phi, 228 threads

1

図 5-23: セル分割 + OpenMPを用いた

MD 計算の並列化による速度向上の例.

Xeon 1スレッドに比べて,8スレッドで

は 5倍近くの速度向上が得られた.

1

10

100

1000

1 10 100 1000

LJ 32,000 on Xeon/Myrinet

Sp

ee

d-u

p

# of Nodes

図 5-24: LAMMPS による LJ 流体(32,000粒子)の並列化効率の例.https://lammps.sandia.gov/bench/lj desktop.html

45

Page 46: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

6 分子シミュレーションのためのオープンソースソフトウェアの例

研究グループ内で計算プログラムを自作しているところも多いであろうが,対象系が複雑・大規模な場

合は,既存のソフトウェアを利用することも視野に入れるといい.利用できるソフトウェアには,有償

/無償のものがいろいろ存在するが,以下にオープンソースコードの一例を紹介する.併せて,計算結

果の可視化を得意とするオープンソースソフトウェアも取り上げるので,機会があれば体験してみよう.

6.1 分子シミュレーションソフトウェア

6.1.1 LAMMPS

LAMMPS (Large-scale Atomic/Molecular Massively Paral-

lel Simulator) は 1990年代以降,米国 Sandia国立研究所な

どが中心となって開発・配布をおこなっている分子シミュレー

ションソフトウェアで,さまざまな原子間相互作用が実装さ

れているほか,粗視化MD法なども組み込まれている.オー

プンソースであり,ユーザ側で独自の拡張を組み込むことも

できる.“Massively Parallel” と謳っているように,MPIを

利用した効率のよい並列計算が,マルチコア計算機やクラス

タサーバからスパコンまで幅広く可能.

http://lammps.sandia.gov/

6.1.2 GROMACS

Prof. Berendsen (Groningen大学) らが 1990年代に始めた

プロジェクトで,もともと生体分子系のMDシミュレーショ

ンを主な対象としたソフトウェアだったが,大規模系の計算

効率に優れていると言われており,利用分野が大きく拡大し

ている [63].詳しくは

http://www.gromacs.org/

6.1.3 Amber

1975年,Prof. Kollman(UCSF)らのグループが始めたプ

ロジェクトで,さまざまな原子間相互作用のパラメタセッ

ト(力場, force field)として古くから利用されているが,

生体分子系を主な対象とする分子シミュレーションプログ

ラムパッケージとしても広く利用されている.

http://ambermd.org/

46

Page 47: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

6.1.4 CHARMM

Chemistry at HARvard Macromolecular Mechanics という名

前のとおり,生体分子などの大規模系の分子シミュレーション

パッケージで,その力場モデルも広く用いられている.1970

年代,Prof. Karplus(Harvard大学)らのグループが始めた

プロジェクト.

https://www.charmm.org/charmm/

6.2 データ可視化用ソフトウェア

簡単なマウス操作で,原子配置をいろいろな視点から眺めたり,表示方法を切り替えたりできるなど,

高機能な可視化ソフトウェアがいくつも存在する.

6.2.1 VMD

VMD は Schulten(Illinois大学)らのグループを中心に開発

されているソフトウェアで,生体分子の表示や解析を得意と

するが,それ以外の様々な系にも柔軟に対応できる.分子シ

ミュレーションで原子座標を適当なフォーマット53でファイ

ル出力し,VMDで可視化する,といった使い方が基本であ

るが,スクリプトによる動画作成なども可能である.

http://www.ks.uiuc.edu/Research/vmd/ペプチド分子を VMDで表示した例.

6.2.2 Jmol

主に Java applet として使える molecular viewer. やはり,

さまざまなデータ形式に対応している.

http://www.jmol.org/

同じペプチド分子を Jmolで表示した例.

53生体分子系で標準的な PDB形式のほか,AMBER, CHARMM, Gromacsなど様々なシミュレーションプログラムからの出力形式に対応している.LAMMPS からは xyz 形式での出力も便利である.

47

Page 48: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

参考文献

○分子シミュレーションに関する主な参考書・解説書

[1] 泉 聡志,増田裕寿, “機械・材料設計に生かす実践分子動力学シミュレーション –汎用コードで設計を始めるための実践的知識–” (森北出版, 2013).

[2] 岡崎 進, 吉井範行, “コンピュータ・シミュレーションの基礎(第 2版)” (化学同人, 2011).

[3] Amber研究会, “Amberによる生体高分子シミュレーション入門” (サイエンスハウス, 2011).

[4] 日本機械学会編, “計算力学ハンドブック 第3巻” (日本機械学会, 2009).

[5] 佐藤 明, “分子シミュレーション アドバンス実践編 –分子動力学法, モンテカルロ法, 格子ボルツマン法”(ブイツーソリューション, 2009).

[6] 長岡正隆, “すぐできる分子シミュレーションビギナーズマニュアル” (講談社, 2008).

[7] “ナノシミュレーション技術ハンドブック” (共立出版, 2006).

[8] 佐藤 明, “HOW TO分子シミュレーション―分子動力学法,モンテカルロ法,ブラウン動力学法,散逸粒子動力学法” (共立出版, 2004).

[9] 上田 顕, “分子シミュレーション –古典系から量子系手法まで” (裳華房, 2003).

[10] 片岡洋右, 竹内宗孝, 三井崇志, “分子動力学法による物理化学実験” (三共出版, 2000).

[11] 神山新一, 佐藤 明, “モンテカルロ・シミュレーション (分子シミュレーション講座1)” (朝倉書店, 1997).

[12] 神山新一, 佐藤 明, “分子動力学シミュレーション (分子シミュレーション講座2)” (朝倉書店, 1997).

[13] 神山新一, 佐藤 明, “流体ミクロ・シミュレーション (分子シミュレーション講座3)” (朝倉書店, 1997).

[14] 川添良幸, 大野かおる, 三上益弘, “コンピュータ・シミュレーションによる物質科学 –分子動力学とモンテカルロ法” (共立出版, 1996).

[15] 日本機械学会 編, “原子・分子モデルを用いる数値シミュレーション” (コロナ, 1996).

[16] 上田 顕, “コンピュータシミュレーション –マクロな系の中の原子運動” (朝倉書店, 1990).

[17] M.E. Velinova, “Molecular Dynamics Simulations,” (Delve, 2017).

[18] V.R. Bollapalli and V.R.R. Morusupalli, “Molecular Dynamics Simulation Studies,” (Scholars Press,2017).

[19] B. Leimkuhler and C. Matthews, “Molecular Dynamics: With Deterministic and Stochastic NumericalMethods (Interdisciplinary Applied Mathematics),” (Springer, 2016).

[20] B. Leimkuhler and C. Matthews, “Molecular Dynamics: With Deterministic and Stochastic NumericalMethods,” (Springer, 2015).

[21] M. Griebel, S. Knapek, and G Zumbusch, “Numerical Simulation in Molecular Dynamics: Numerics,Algorithms, Parallelization, Applications” (Springer, 2007).

[22] D. C. Rapaport, “The Art of Molecular Dynamics Simulation” (Cambridge University Press, 2004).

[23] P. Nielaba, M. Mareschal, G. Ciccotti (ed.), “Bridging the Time Scales: Molecular Simulations for theNext Decade” (Springer, 2003).

[24] D. Frenkel and B. Smit, “Understanding Molecular Simulation, Second Edition: From Algorithms toApplications” (Academic Press, 2001).

[25] J. M. Haile, “Molecular Dynamics Simulation: Elementary Methods” (Wiley, 1997).

[26] M.P. Allen and D.J. Tildesley, “Computer Simulation of Liquids” (Oxford University Press, 1989).

○引用文献,参照ウェブサイトなど

[27] たとえば,久保亮五 編, “大学演習 熱学・統計力学[修訂版]” (裳華房, 1998).

[28] N. Metropolis, A.W. Rosenbluth, M.N. Rosenbluth, A.H. Teller, “Equation of State Calculations by FastComputing Machines,” J. Chem. Phys., 21 (1953) 1087–1092.

[29] Mersenne twisterの開発者,松本眞氏による webページhttp://www.math.sci.hiroshima-u.ac.jp/ m-mat/MT/SFMT/index-jp.html

[30] G. A. Bird, “Molecular Gas Dynamics and the Direct Simulatoion of Gas Flow” (Oxford UniversityPress, 1994).

[31] B. Widom, “Potential-Didtribution Theory and the Statistical Mechanics of Fluids,” J. Phys. Chem., 86(1982) 869–872.

[32] R. Car, M. Parrinello, “Unified Approach for Molecular Dynamics and Density-Functional Theory,” Phys.Rev. Lett., 55 (1985) 2471–2474.

48

Page 49: シミュレーションの全体像・概論も行われている.この場合は,むしろ粒子シミュレーションparticle simulation という呼び名がふさわし

[33] R. D. Groot, P. B. Warren, “Dissipative Particl Dynamis: Bridging the Gap between Atomistic andMesoscopic Simulation,” J. Chem. Phys., 107 (1997) 4423–4435.

[34] J. J. Monaghan, “Simulating Free Surface Flows with SPH,” J. Computational Phys., 110 (1994) 399–406.

[35] 越塚誠一, “数値流体力学” (培風館, 1997).

[36] 後藤仁志, “粒子法:連続体・混相流・粒状体のための計算科学,” (森北出版, 2018).

[37] 矢川元基, 酒井譲, “粒子法 基礎と応用,” (岩波, 2016).

[38] 越塚誠一,柴田和也,室谷浩平, “粒子法入門—流体シミュレーションの基礎から並列計算と可視化まで—C/C++ソースコード付き,” (丸善, 2014).

[39] 越塚誠一, “計算力学レクチャーシリーズ 粒子法,” (丸善, 2005).

[40] J. E. Lennard-Jones, Proc. Roy. Soc., A106 (1924) 463.

[41] B. E. Polilng, J. M. Prausnitz, J. P. O’connell, “The Properties of Gases and Liquids”, 5th ed. (McGrawHill, 2000).

[42] J. P. Hansen, I. R. McDonald, “Theory of Simple Liquids”, 3rd ed. (Academic Press, 2006).

[43] J. S. Rowlinson, B. Widom, “Molecular Theory of Capillarity”, paperback ed., (Dover, 2003).

[44] 中上級の統計力学の教科書,例えば香取真理, “非平衡統計力学” (裳華房, 1999) や D. Chandler, “統計力学概説” (オーム社, 1990) など.

[45] 例えば,GNUプロジェクトの一部として,gprofがある.http://sourceware.org/binutils/docs/gprof/

[46] R. W. Hockney, J. W. Eastwood, “Computer Simulation Using Particles” (Institute of Physics Publica-tion, 1988).

[47] http://www.top500.org/

[48] (独)理化学研究所 次世代コンピュータ開発実施本部 の webページhttp://www.nsc.riken.jp/index j.html

[49] J. Sanders, E. Kandrot, “CUDA by Example 汎用 GPUプログラミング入門” (インプレス, 2011).

[50] D. Kirk, W. Hwu, “CUDAプログラミング実践講座 – 超並列プロセッサにおけるプログラミング手法” (ボーンデジタル, 2010).

[51] 青木尊之, 額田 彰, “はじめての CUDAプログラミング –驚異の開発環境 [GPU+CUDA] を使いこなす” (工学社, 2009).

[52] フィックスターズ編, “OpenCL入門 –マルチコア CPU・GPUのための並列プログラミング” (インプレスジャパン, 2010).

[53] ジム・ジェファース他, “インテル Xeon Phiコプロセッサーハイパフォーマンス・プログラミング” (カットシステム, 2013).

[54] 国立情報学研究所 リサーチグリッド研究開発センター の webページhttp://www.naregi.org/index.html

[55] 米国スタンフォード大学内の folding@home の webページhttp://folding.stanford.edu/

[56] C. Breshears, “並行コンピューティング技法 –実践マルチコア/マルチスレッドプログラミング” (オライリージャパン, 2009).

[57] http://www.csm.ornl.gov/pvm/

[58] http://www.mcs.anl.gov/research/projects/mpi/

[59] P. パチェコ, “MPI並列プログラミング” (培風館, 2001).

[60] 北山洋幸, “OpenMP入門 –マルチコア CPU時代の並列プログラミング” (秀和システム, 2009).

[61] 菅原清文, “C/C++ プログラマーのための OpenMP” (カットシステム, 2009).

[62] 菅原清文, “Cilkがやってきた —C/C++プログラマーのための並列プログラミング言語” (カットシステム,2011).

[63] A. Chatterjee, “Molecular dynamics simulation: GROMACS software and itsapplication” (Lambert Aca-demic Pub, 2019).

49