前節までの方法によって電界に関する偏微分方程式(2-1-6)は次式の連立一次方程式になります。
A x = b (2-9-1)
ここで行列Aは複素数非対称行列であり、1行の非ゼロ要素が13個以下の疎行列です。
以下では行列の大きさをNで表します。
式(2-9-1)の連立一次方程式をBi-CGSTAB法(BiConjugate Gradient STABilized, 安定化双共役勾配法)を用いて解きます。
Bi-CGSTAB法のアルゴリズムは以下の通りです[6]-[10]。
図2-9-1 Bi-CGSTAB法
ここでxcは複素共役を表します。
また(x,y)はベクトルの内積(Σxiyi)を表します。
これをプログラムに即して書くと以下のようになります。
図2-9-2 Bi-CGSTAB法(実装版)
作業ベクトルq,t,uを追加しています。
ベクトルは毎回上書きされますので添え字kを省略しています。
演算量の多い行列とベクトルの積は反復回数あたり2回((8)と(11))です。
なお、(3)以降ベクトルbは使用されませんので他のベクトル
(例えばr0*)と共用することができます。
Bi-CGSTAB法では計算精度の観点から倍精度を使用する必要があります。
共役勾配法では対角スケーリングを行うことによって収束を速め計算時間を短縮することができます。
対角スケーリングは反復計算の前に行います。対角スケーリングによって使用メモリーが増えることはありません。
図2-9-3 対角スケーリング
図2-9-4に対角スケーリングがないときとあるときの収束状況の一例を示します。
対角スケーリングによって収束が速くなることがわかります。
図2-9-4 対角スケーリングと収束状況(Nx=Ny=Nz=100)
図2-9-2ではベクトル同士の演算は以下の複素数倍精度のBLAS Level-1の関数で表現することができます。
関数名 | 処理 |
---|---|
Zcopy | コピー(y=x) |
Zdotu | 内積(x,y) |
Zdotc | 内積(xc,y) |
Zaxpy | y=ax+y |
Dznrm2 | 2乗ノルム||x||2 |