実習で利用したアプリケーションは、初期条件を変えるたびに再度コンパイルする必要があった。また、ソルバは2次のルンゲ=クッタ法のみであった。そこで、今回のレポートでは3体問題の軌道をシミュレーションするGUIアプリケーションを作成した。このソフトでは、アプリケーションを操作する中で初期条件(factorやxp3の値など)を変化させ、再度コンパイルすることなくシミュレーションできる。また、ソルバとしてはEuler法、2次のRunge Kutta法、4次のRunge Kutta法の3つを用意した。
実習で利用したアプリケーションは、初期条件を変えるたびに再度コンパイルする必要があった。また、ソルバは2次のルンゲ=クッタ法のみであった。そこで、今回のレポートでは3体問題の軌道をシミュレーションするGUIアプリケーションを作成した。このソフトでは、アプリケーションを操作する中で初期条件(factorやxp3の値など)を変化させ、再度コンパイルすることなくシミュレーションできる。また、ソルバとしてはEuler法、2次のRunge Kutta法、4次のRunge Kutta法の3つを用意した。
下図は、作成したアプリケーションのスクリーンショットである。右側のパネルの上段で初期条件(ソルバ、ステップ数、xp3、factor)を決める。そして、updateボタンを押せば計算結果が左のパネルに表示される。同時に、角運動量変動具合が標準偏差となって右側パネル下段のテキストボックスに表示される。なお、ズームボタンの+やーを押すことで拡大や縮小表示をすることができる。
このソフトでは、ソルバとしてEuler法、2次のRunge Kutta法、4次のRunge Kutta法の3つの方法で数値計算が行える。これらの3つの方法は、後者の方法になるほど計算の精度は上がるが、トレードオフとして計算に必要な時間も増える。このことについて考えてみることにする。
実験の条件は、Factor=2 xp3=3 nstep=5*10^7とする。この条件では安定した楕円軌道をすることが課題2ですでに分かっている。また、本来保存すべきシステムの全角運動量がどの程度変動するかによって、それぞれの数値計算法の精度を見積もることができるものとする。なお、その全角運動量の変動は標準偏差(STD)によって評価したいと思う。なお、実験機の環境はOSがDebian 4.3.2-1.1、CPUがIntel Core2 Quad(2.83GHz)、メインメモリが約8GBである。
保存量を用いることで、それぞれの数値計算法の精度を比較すればやはりEuler法から高次のRunge Kutta法になるほど精度が向上することが確認された。また、精度の向上のトレードオフとして計算量が増えることにより、計算時間が増加することも見て取れる。今回の3体問題を取り扱うにあたって、Euler法ではタイムステップを重ねると誤差が広がり過ぎてしまうと言う結果が出た。しかしながら、今回のシミュレーションのソルバとしてEuler法が本当に不適なのかは、プログラムが与えたタイムステップの幅が、CFL条件を満たしているのかなどの確認を行う必要があるように思われる。
精度が上がるからとって、高次の数値計算法を用いればいいかというとそうも言い切れないように思う。2次のRunge Kutta法と4次のRunge Kutta法の結果を比較したところそれほど大きな精度の向上がないように感じる。(定量的に言うには、もう少したくさんの初期条件で考えたり、その精度が様々な物理量にどのように効いてくるのかを考える必要があるようには思われるが..)それに比べて、計算時間は2倍となっているが、問題はここである。今必要としているシミュレーション結果の精度向上が、計算時間のトレードオフと釣り合うものなのかということ考えるべきである。例えば、今回の実習みたいに軌道を視覚化するだけならばおそらく2次のRunge Kutta法で行ったとしても精度に問題は生じないだろう。それよりもいろいろな初期条件で、軌道がどのように変化するかを調べたいのに計算時間に時間がかかりすぎてしまっては、作業が効率的に進まない。この様な意味においても必ずしも高次のソルバがいつでもよい選択とは言えないと今回実習を通して思った。
今回作成したソフトウエアはかなりの計算量を要するので、itpassで使っているハイスペックな計算機ならば問題なかったが、自分が持っているノートパソコンでは計算に非常に時間がかかった。ここで、プログラムの高速化について考えたい。CPUの開発状況から、今後プログラマは高速化のためにプログラムの並列化について考える必要がある。特に注意を払わなければ、例えCPUが多くのコアや個数があっても、シングルコア用のプログラムとなってしまうことが多い。つまり、パソコンにつまれているCPUがDualCoreなどであっても有効に使いきれていないことになる。今回作成したプログラムもOpenMPなどのライブラリを使って、作業の並列化を考える必要があるだろう。コンパイラによってはオプションだけで自動的に並列化してくれるが、状況によってはそれほど単純にはいかない。それには、もう少しプログラムの解析が必要となるので次の課題である。