Fix JAD storage not being initialized in BiCGSTAB, GMRES, GPBiCG, GMRESR and GMRESREN
Closes #820 (closed)
背景
アーキテクチャ別チューニングブランチ(SXAT2 等)を master に統合する作業(#572)の前段として 必要になった修正です。
JAD(Jagged Diagonal)形式はベクトル機向けの格納形式で、これまで実際に使われるのは CG のみでした。
そのため CG / CR にしか初期化処理が実装されておらず、他のソルバでは USEJAD=YES が
黙って無視される状態が残っていました。
アーキテクチャ別チューニングブランチは CG 以外のソルバでも JAD を使うため、統合の前に この欠落を master 側で解消しておく必要があります。SXAT2 ブランチも BiCGSTAB / GMRES / GPBiCG に ついて同等の修正を持っていますが、これはアーキテクチャ依存の変更ではなく master 自身の欠陥であるため、 #572 とは切り離して単独の修正としました。
修正内容
1. 5ソルバへの JAD 初期化・終了処理の追加(コミット a2276f75)
BiCGSTAB / GMRES / GPBiCG / GMRESR / GMRESREN に、CG / CR と同一の3箇所を追加しました。
use hecmw_jad_typecall hecmw_mat_integrate(hecMAT)直後のhecmw_JAD_INIT- 後始末の並びの中の
hecmw_JAD_FINALIZE
いずれも hecmw_mat_get_usejad(hecMAT).ne.0 でガードしており、既定の USEJAD=NO では
呼ばれません。5ファイルとも追加内容は同一です。
GMRESR / GMRESREN は後処理の形が CG / CR と異なる(hecmw_precond_clear が実行される、
deallocate が複数行に分かれる)ため、FINALIZE は hecmw_precond_clear の直後、
すなわち後始末の並びの最後に置きました。
2. NDOF=6 の JAD 分岐条件の修正(コミット 1dfed98f)
hecmw_matvec_66 だけが JAD の初期化状態ではなく hecmw_mat_get_usejad の値で分岐しており、
JAD 未初期化のまま hecmw_JAD_MATVEC を呼んで異常終了していました。
他の NDOF と同じ条件に揃えました。
- if (hecmw_mat_get_usejad(hecMAT).ne.0) then
+ if (hecmw_JAD_IS_INITIALIZED().ne.0) thenこの修正は 1 とは独立です。収束確認 hecmw_rel_resid_L2 はソルバ本体の終了後、つまり
hecmw_JAD_FINALIZE の後に行列ベクトル積を行うため、1 だけでは CG / CR を含め
NDOF=6 の異常終了は解消しません。
この変更により、JAD 経路への分岐条件は las_22 / las_33 / las_44 / las_66 / las_nn の
すべてで hecmw_JAD_IS_INITIALIZED() に揃いました。
確認したこと
7ソルバ × USEJAD=YES/NO × NDOF=3/6 の計28ケースで確認しました。
- JAD 経路に入ること:
USEJAD=YESの全14ケースでhecmw_JAD_INITが呼ばれ、 行列ベクトル積の時点で初期化済みになっていることを確認しました。 修正前に CG / CR 以外で入っていなかった NDOF=3、および全ソルバで異常終了していた NDOF=6 の いずれも解消しています - 解が一致すること:
USEJAD=YESとNOの結果を tests/compare_res.pl(相対許容差 1e-4)で 比較し、収束した全ケースで一致しました。最大相対差は 3.5e-8 で、収束判定値 1.0e-8 と同程度です - リグレッション:
ctest -L serialは 78件中78件PASSです。USEJADは既定で無効であり、既存テストの経路は変更前後で一致します
JAD は行列の行を並べ替えるため加算順序が変わり、反復回数は USEJAD=NO と一致しません
(BiCGSTAB で 168回 → 112回)。残差履歴を比較すると、先頭の相当数の反復は完全に一致し、
その後に丸め誤差の蓄積で分岐します。元から正しく動作している CG / CR も同じ傾向を示すため、
JAD 使用時の正常な挙動と判断しました。
補足
- NDOF=1(
hecmw_solver_las_11.F90)には JAD 分岐そのものが無く、CG / CR を含めUSEJADは 元から無視されます。本MRの範囲外としました - GMRESREN は
USEJADの指定によらず収束しませんでした。JAD とは無関係の既存の挙動です