基本的なアイデア
拡張系による圧力制御、温度制御の方法に倣い、MD計算に仮想的なコンデンサを結合させることで電位差の制御を行う。
コンデンサ内の粒子の運動
左図のようなコンデンサは、コンデンサ間に
のポテンシャルが働く。 またその中の粒子には
のポテンシャルが働く(誘起双極子が存在する場合はその項も追加される。)。 従ってこの系のハミルトニアンは、
-

|
|
(1)
|
と表される。
NVTVアンサンブル
上記ハミルトニアンは NVTQ アンサンブルとして系を扱っている。 我々が考えたいのは NVTV アンサンブルであるため、これの熱力学関数と分配関数の導出を行う。
完全な熱力学関数
N,V,T,V を指定した際の完全な熱力学関数は、
のルジャンドル変換を考えることで、
-

|
|
(2)
|
となる(エネルギー E は電場 E の字体が異なるので注意)。
分布関数
微視的状態
の出現確率を
とすると、NVTV アンサンブルでは、
が成り立つ。 従って上記を拘束条件としてエントロピーを最大にすることを考えると、
が得られる。 従って、
-

|
|
(3)
|
となる。 式 3 は 式 2 に対応するので、
であることがわかる。 以上より分配関数は、
-
![{\displaystyle
Z(N,V,T,V) = \sum_i exp [ -\beta (E_i - Q_i V)]
}](https://wikimedia.org/api/rest_v1/media/math/render/svg/710113b24436b4d094ba036eaa8c4333601dbbc0)
|
|
(4)
|
となる。 微視的なエネルギーは古典的には 式1で表されるので 式4の古典極限は、
-
![{\displaystyle
Z(N,V,T,V) = \sum_i exp[-\beta (E_i + Q_i V)] = \int dxdpdQ \ exp[-\beta {H(x,p,Q)-QV} ]
}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c6c998c7959e9f6f24b53825f065a6118c9172b1)
|
|
(5)
|
となる。
仮想系のハミルトニアンと運動方程式
式1 に仮想的なコンデンサの運動エネルギーとポテンシャルを加える形で 式 5 を実現する仮想系のハミルトニアンを作成する。 今仮想系のハミルトニアンを
とする。 この時分配関数は
となる。 従ってこれが 式5 に一致するには、
であればよい。 つまり、
-
|
|
(6)
|
である。
Q の時間発展は正準方程式により、
-

|
|
(7)
|
となる。 今瞬間の誘電分極を
-

|
|
(8)
|
瞬間の比誘電率を、
と置くと、式7 は、
-

|
|
(9)
|
と表される。 ここで、
とした。 式9 は 式6 で表される運動が、熱平衡における電位差とコンデンサに蓄えられる電荷の関係式
の周りで振動することを意味している。
一般化
本節では上記手法を任意の形状の電場
が係る系に拡張する。
電場のエネルギー
真空中に
が存在するとき、そのエネルギーは

で表される。
周期系への適用
上記手法を液液界面等の周期系に適用する場合、図のようにセル中の対称な形で荷電平板を設置する必要すればよい。
すると、各粒子には
に実対称な形で静電ポテンシャルが働き周期境界で静電ポテンシャルが連続となる。 しかしながら、このままだとその境界面では電場が不連続になることから、各平板の電荷分布がデルタ関数ではなく、
のように広がりを持つと考え電場の連続性を確保する。 各平板が作る電場、および静電ポテンシャルは、
であることから、系に働く電場は、
静電ポテンシャルは、
となる。 以上よりコンデンサ間に働くポテンシャルは、
系の中の粒子に働くポテンシャルは、
により計算される。 また、一般化座標としての Q に働くポテンシャルはコンデンサが2つ分と考え、
とする。 従って拡張系のハミルトニアンは
となる。
時間発展
上記拡張系ハミルトニアンに基づく運動方程式はフーバー形式
で表すと、
で与えられる。 最後の式において
に相当する。 以上より(疑似的な)リウビル演算子は
となる。 これを非可換性と計算の利便性によりいくつかの項に分離し
とする。 するとトロッタ分解により時間発展は
のように表される(
及び
と
が可換なことを利用している。)。
の部分は力に外部電場の項が加わったことを除き、通常のNVTの計算と同様となる。 残りの部分については、
のように時間発展させればよい。なお、
の時間発展後、
の時間発展の前に
- 相互作用テンソル
を計算する。
- コンデンサが作る静電ポテンシャル
、及び、電場
を計算する。
を外場としてクーロン相互作用を計算(誘起双極子計算を含む)。
- 得られた誘起双極子を用いて
を計算する。
の処理を行う必要がある。 また、
の時間発展後、
等の出力変数の計算も必要になる。
実装
本計算をFreeFlexに実装する場合、move_struct内に実装するべきである。 しかしこの場合問題点として、
- coulomb_struct 内にある電荷や誘起双極子が move_struct 内で必要になる。
- コンデンサによる外部電場が move_struct 内で計算されるため、計算した電場を coulomb_struct に渡す必要がある。
という2点を解決しなければならない。 後者については外部電場を指定するサブルーチンとして set_external_electric_field サブルーチンが coulomb_struct 内に用意されているのでFreeFlex.Fでこれを毎ステップ呼び出せばよい。 一方前者についても set_electric_information サブルーチンを用意し、FreeFlex.F 上で呼び出せばとりあえずは解決できる。
[1]
- ↑ (本質的には)電荷や誘起双極子のような一般的なパラメータが coulomb_struct という深い位置の構造体に記憶されていることに問題があると思われる。 そのため、これらを coulomb_struct から coord_struct に移すことも考えた。 しかしながらこの場合、FEP 計算で電荷を変化させる際に、複製した coulomb_struct を使用している状況も変更しなくてはならない。 勿論、coord_struct を複製する形に変更することも考えられるが、この場合は時間発展後の座標のコピーを毎ステップ行わなくてはいけなくなる。 この変更の煩雑さを避けるため、上記のように set_electric_infomation を使用する形で実装することにした。
以上のことから、move_struct 内に次に示す電位差一定のMD計算の構造体 move_NVTV_struct を用意する。
<source lang="fortran">
type move_NVTV_struct
REAL8 :: Q !!! 一般化座標としてのコンデンサの電荷
REAL8 :: vQ !!! 一般化座標の速度
REAL8 :: mQ !!! 一般化座標の質量
REAL8 :: FQ !!! 一般化座標にかかる力
REAL8 :: V !!! 電位差
REAL8 :: U !!! コンデンサが関わるポテンシャル。 テキストの U(x,Q) のこと。
REAL8 :: K !!! 一般化座標の運動エネルギー。
REAL8 :: q(1:nsite) !!! 各サイトの電荷
REAL8 :: mu(1:nsite) !!! 各サイトの誘起双極子のz方向成分
REAL8 :: phi(1:nsite)
!!! コンデンサが各サイトに作る静電ポテンシャル。テキストの ϕ(z_i,Q) のこと。
REAL8 :: E(1:nsite)
!!! コンデンサが各サイトに作る電場。 テキストの E(z_i,Q) のこと。
REAL8 :: dEdz(1:nsite)
!!! コンデンサが各サイトに作る電場の座標微分。 テキストの ∂E(z_i,Q)⁄(∂z_i ) のこと
REAL8 :: T0(1:nsite), T1(1:nsite), T2(1:nsite)
!!! 相互作用テンソル。
REAL8 :: phiQ(1:3)
!!! 各コンデンサ位置の静電ポテンシャル。 テキストの ∑_(j≠i)▒〖ϕ_j (Z_i,Q_j ) 〗 のこと。
REAL8 :: sigma !!! 各コンデンサの電荷の広がり
integer :: iCOM !!! コンデンサを置く位置の重心番号。テキストの Z_2 に対応。
REAL8 :: S !!! コンデンサの面積
contains
subroutine init(…)
!!! 初期設定
endsubroutne
subroutine set_electric_info(q,mu)
!!! 電荷と誘起双極子の値を受け取るサブルーチン
REAL8 :: q(1:nsite)
REAL8 :: mu(1:3,1:nsite)
endsubroutine
subroutine vQ_update1(coord,dt)
!!! vQ の時間発展を行うサブルーチン
type(coord_struct) :: coord
REAL8 :: dt
endsubroutine
subroutine Q_update(coord,dt)
!!! Q の時間発展を行うサブルーチン。
!!! 同時に相互作用テンソル、phi、E、dEdz、phiQの計算も行う。
type(coord_struct) :: coord
REAL8 :: dt
endsubroutine
subroutine vQ_update2(coord,dt)
!!! vQ の時間発展を行うサブルーチン。
!!! 同時に FQ、及び出力変数の計算も行う。
type(coord_struct) :: coord
REAL8 :: dt
endsubroutine
endtype
</source>