thomas-fermi方程式のfemによる解法
TRANSCRIPT
@dc1394 2015/10/14 Rev. 2.0
Thomas-Fermi方程式のFEMによる解法
Thomas-Fermi方程式の数値解法上の困難
Thomas-Fermi方程式(以後T-F方程式と呼ぶ)は、
であり、境界条件は、y(0) = 1, y(∞) = 0である。
この境界条件は、この方程式を数値的に解く上で何も言っていないのと同じである。
この方程式は原点に特異点を持つので原点から解けない。また当然ながらコンピュータは無限大を扱えない。
原点に十分近い点での境界値
仕方がないので、y(x)のMaclaurin展開を用いて、原点に十分近い点Δxでの境界値を決定する。
論文[1]によれば、y(x)のMaclaurin展開は、
であり、またy(x)の微分y’(x)は、
である。ここで、B = y’(0)であり、同論文によれば、
である。
なお、このy(Δx)とy’(Δx)を使って、T-F方程式を初期値問題として数値的に解こうとしても遠方で発散する。
[1] M. A. Noor and S. T. Mohyud-Din. Homotopy Perturbation Method for Solving Thomas-Fermi Equation Using Pade Approximants. International Journal of Nonlinear Science, 8(2009):27-31.
遠方での境界値
次に遠方での境界値を決定する。文献[1]によれば遠方で漸進的に、
と書いてあるが、この近似は粗すぎる。ここで、論文[2]
によれば、やはり遠方で漸進的に、
とある。ここで、λ = 3.886, x0 = 5.2415である。
[1] R.G.パール, W.ヤング 『原子・分子の密度汎関数法』シュプリンガー・フェアラーク東京(1996)
[2] M. Desaix, D. Anderson, and M. Lisak, Eur. J. Phys. 25 (2004) 699.
T-F方程式の問題
これで、原点にごく近い点での境界値と、遠方での境界値が分かったことになる。
つまり、常微分方程式の2点境界値問題に帰着したので、次に有限要素による離散化を考えてみる。
T-F方程式は非線形常微分方程式であり、離散化にも工夫が必要である。
ここで、以下のような線形常微分方程式について考えてみよう。
β(x)を用いた反復法
この方程式は線形常微分方程式であり、有限要素による離散化によって、[K]{u} = {F}という形式の連立1
次方程式に帰着でき、解ける。
ここでもし、β(x)を次のように置くならば、
(1)式を解くことによって得たy(x)から、(2)式によってβ(x)を得て、それからまた(1)式を解くことによってy(x)
を得て…という反復法によって解ける(T-F方程式を直接離散化するなどの別の方法もあるだろうが、SCF法の練習になるので、この方法を採用する)。
初期関数y0(x)
この方法でT-F方程式を解くには、y(x)の初期関数y0(x)が必要である。
ここで、まずT-F方程式を適合点への狙い撃ち法
で解き(常微分方程式の解法には、補外法の一種であるBulirsch-Stoer法を用いる)、その解をy0(x)
とする。
Bulirsch-Stoer法は本(たとえば[1])を参考に自分で実装しても良いのだが、ここではBoost.Odeintを使う。
[1] William H. Press, William T. Vetterling, Saul A. Teukolsky, Brian P. Flannery 『ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ』 技術評論社(1993)
適合点への狙い撃ち法の問題
著者のコードでは、狙い撃ち法の適合点を、ユーザーが指定できるようにしている(適合点の値は、概ね10.0~15.0程度でないと収束しない)。
なお、適合点での狙い撃ち法は、適合点で値が「異なる」ので、精度の高い解が得られないが、初期関数y0(x)とするには十分である。
x 原点に十分近い点から解いたy(x) 遠方から解いたy(x)
4.98 0.0788376
4.99 0.0785983
5.00 0.0783599 0.0792299
5.01 0.0789933
5.02 0.0787575
1次混合
入力と出力が一致する解を得るために、最も簡単な1
次混合法を使う。
すなわち、i + 1段階での改善された入力関数yi+1in
は、i段階でのyiinとyi
outを用いて、次式で与えられる。
ここでαはパラメータであり、著者のコードでは、このパラメータをユーザーが指定できるようにしている(α= 0.05程度としないと収束しない)。
混合法には、 GR-Pulay法などのより高度な方法もあるが、1反復あたりの計算時間が短いので、今の場合は1次混合法で十分である。
反復法の収束の判定
yiは(数値計算上は)ベクトルと見なせる。ここで、yi
outとyiinの差の大きさをNormRDと適当に名付け、
NormRD = |yiout – yi
in|と定義する。
このNormRDがある閾値(criterion)未満になった場合(NormRD < criterion)、収束したと判定する。
著者のコードでは、criterionを、ユーザーが指定できるようにしてある(10-13程度が限界のようである)。
有限要素による離散化
最も単純な1次要素によって、T-F方程式を離散化する(2次要素は、試してみたが収束しなかった)。
連立1次方程式を解くにはIntel Math Kernel
Library (Intel MKL)を使う。
1次要素だと、連立1次方程式[K]{u} = {F}の[K]が対称正定値三重対角行列になるので、[K]は2次元配列を使わなくても、単に配列を2つ用意するだけで済む。これはメモリの節約になる。
フローチャート
初期関数y0(x), [K]の生成
β(x), {f}の生成
[K], {f}に境界条件処理
Intel MKLによりy(x)を求める
終了
収束したか?
YES
NO
T-F方程式の数値解とエネルギー
以上の解法で得たT-F方程式の数値解は、文献[1]に載っている、T-F方程式の解の数表と「ほぼ」一致している。従って、バグは残っていないと判断した。
T-F方程式の解から得られる中性原子のエネルギーは、Zを原子番号として、
である。ここで、y’(0)には、適合点への狙い撃ち法で得た値y’(Δx)を用いる。
著者のコードでは、y’(Δx) = -1.588073であり、この値は文献[1]の値とほぼ一致している。
[1] E. U. Condon, Halis Odabasi. Atomic Structure, Cambridge University Press, Cambridge, 1980
ちなみにこの本はGoogle ブックスで(全部ではないが)読める。数表のページのURLはこちら: http://bit.ly/1fRQ71T
実行画面
Thomas-Fermi方程式の解のグラフ
Thomas-Fermi方程式の解のグラフ(y軸対数目盛)
並列化
次に、Intel Cilk Plus(以下Cilkと呼ぶ)による並列化を試みた。
その効果を検証したのが次ページの表1である。
計測環境:
CPU: Intel Core i7-3930K (Sandy Bridge-E, Hyper
Threading ON (6C12T), SpeedStep OFF, Turbo
Boost OFF)
コンパイラ: Intel® Parallel Studio XE 2016 for C++
OS: Linux Mint 17.1 - Cinnamon (64-bit)
物理メモリ: 16GB
並列化
Cilkによる並列化により、ほぼ5.4倍のパフォーマンス向上に成功していることが分かる。
並列化による誤差は確認できない。
ただし、並列化を有効にすると、反復の途中で突然NormRDが大きくなり、収束に時間がかかる場合がある。
計算時間(秒) 収束時のNormRD
Cilk無効 39.5 4.9E-14
Cilk有効 7.31 4.9E-14
表1 並列化の有無の効果の比較(三回の平均)
※計算時間とは、総経過時間から、結果出力処理の時間を差し引いた時間を差す
インプットファイル
ソースコードへのリンク
このプログラムのソースコードは、GitHub上で公開しています。
https://github.com/dc1394/thomasfermi
ライセンスは2条項BSDライセンスとします。
まとめ
Thomas-Fermi方程式を、有限要素(1次要素)による離散化と反復法によって、数値的に解いた。
得られた結果は、文献の結果とほぼ一致していた。
高速化をめざして、Cilkによる並列化を試みた。
Cilkによる並列化は非常に効果的であった。
並列化による誤差は確認できなかった。
参考サイト
Internet-College of Finite Element Method:
http://www.fem.gr.jp/index.html
有限要素法プログラミング演習(fortran, C のソースコードつき)(開発版): http://www.sml.k.u-
tokyo.ac.jp/members/nabe/FEM/fem.html