コード開発

 ここ数週間ぐらい研究のことを書いてなかったので覚書。

 以前の記事でも書いたが、今年に入って本格的に新しいコードの開発をしている。私の使っている一般相対論的MHD(GRMHD)コードは世界で最初に作られたコードである。コードが作られてから6年近く経ち、今では幾つかのグループでより精度の高いGRMHDコードが作られている。計算方法の精度の高さは、例えば、非常に光速に近い速度でのシミュレーションや磁場の強い状況でのシミュレーションなどより極限でのシミュレーションを可能にしてくれると信じている。また近年になってdiv B=0(磁気モノポールの不在)を満たす計算方法が開発され、その方法を使っていない我々のコードは物理的に信用できるものなのかという問題をいつもぶつけられてきた。

 今までいろいろ研究成果をあげているにも関わらず、我々のコードが持っている問題点がウィークポイントとなり、なかなかグラントが通らないという状況が続いている。この状況を打破するには皆の納得のいくコードを作るしかない。ということで私はそのコード開発でこの仕事を雇われているのだ。

 さて長い前置きになったが、ここ数週間でコード開発は多いに進んだ。というか研究はこれしかやっていない。バグはあるかもしれないが、とりあえずコードの基本形は出来上がった。テストシミュレーションでも正しい結果が出てきている。実際にプログラミングする際いろいろ考え直すところがあったが、今のところかなり順調である。そしてこれからの開発が着実に難しい点に入っていく。いろいろ悩む点が多い。頑張りどころだ。何とか2月中に形を作ってしまいたいな。

 ここからここ数週間でやったことを書く。かなり専門的な話になるので覚悟を。

 新しいコードの開発と言っても、今使っているコードを基本形として、より精度の高い、物理を考慮した計算方法を加えていくという形を取る。

 具体的にコードの開発点は以下の6つのパートである。ある意味、高精度有限差分法の基本部分全てである。

 -reconstruction step

 cell-interfaceでの値からcell-boundaryでの値を計算する。この計算方法でシミュレーションの空間精度が決まる。

 -wave speedの計算

 各cell-boundaryで上流、下流に行く波の速度を見積もる。この波の速度がRiemann問題を考慮しながら数値流束を計算するときに必要になる。RMHDでは正確な波の速度を計算するには数値的に分散関係式を解く必要が出てくる。

 -数値流束の計算

 cell-boundaryでRiemann問題を考慮しながら数値流束を計算する。

 -時間発展

 計算した数値流束から次の時間発展をする。計算方法によってシミュレーションの時間精度が決まる。
 
 -recovery step

 相対論的流体、磁気流体シミュレーションでは保存量と基本量が簡単な式では関係づけられないため数値的に求めなけらばならない。ここにもいろいろな計算方法が提案されている。

 -constrained transport

 div B=0を満たすためにはそれを考慮した計算方法を使わなくてはならない。

 ここ数週間でのコード開発で、slope-limiterを使ったreconstruction step(空間2次精度)、近似的に波の速度を求める計算方法、近似Riemann解法であるHLL methodを使った数値流束の計算、multi-step Runge-Kutta method(時間2次、3次精度)を使った時間発展、新しいrecovery stepの計算方法の部分を作った。これによってコードの基本的な部分は出来上がった。ただ、現在使っている方法はある意味一番簡単なものを使っている。まだまだ発展できる部分は多分にある。

 そして今後の開発予定は以下である。

 -flux-CT methodを用いたconstrained transportパートの開発

 まず一番初めにこの部分を作る。これが完成すれば、2003年にGammie達が作ったGRMHDコードとほぼ同じレベル(精度、方法)まで行く。そうすれば基本的に文句の言われないGRMHDコードになるだろう。当面の目標はこのレベルである。

 -より精度の高いreconstruction step

 今使っているreconstruction stepはある意味一番簡単な方法を使っている。簡単であるということは精度が低いのである。そのためより精度の高いシミュレーションをするにはより精度の高いreconstruction stepが必要となる。今のところPPM methodを使おうと考えている。

 -正確なwave speedの計算

 前にも書いたが、正確な波の速度を求めるのは分散関係式を数値的に解く必要がある。これも出来れば取り入れたいな。

 より精度の高い計算をするにはより複雑な計算とstepが必要となり、1ステップ計算するのに多量の計算メモリと計算時間を必要とする。結局は計算コストとの戦いになってしまうのだ。なかなか難しい問題だな。