反復ソルバ5種で USEJAD=YES が無視される(NDOF=6 では異常終了する)
概要
!SOLVER の USEJAD=YES が、反復ソルバ BiCGSTAB / GMRES / GPBiCG / GMRESR / GMRESREN の5種で
効きません。エラーも警告も出ないため、オプションが有効になっていると誤解します。
あわせて、NDOF=6(シェル・梁要素)では USEJAD=YES を指定すると異常終了します。
こちらは CG / CR を含む全ソルバで発生します。
期待される動作
USEJAD=YES を指定した場合、CG / CR と同様に JAD 形式の行列ベクトル積が使われる。
現状の動作
| NDOF=3(および 2 / 4 / nn) | NDOF=6 | |
|---|---|---|
| CG / CR | JAD 経路に入る(正常) | 異常終了 |
| 上記5ソルバ | JAD 経路に入らず BCSR で計算。警告なし | 異常終了 |
原因
5ソルバで JAD が無視される件
hecmw1/src/solver/iterative/ 配下のうち、CG と CR は hecmw_JAD_INIT / hecmw_JAD_FINALIZE を
呼んでいますが、上記5ソルバには呼び出しがありません。
行列ベクトル積側(hecmw_solver_las_33.F90 等)は hecmw_JAD_IS_INITIALIZED() で分岐しており、
初期化されていなければ通常の BCSR 経路へ黙ってフォールバックします。
NDOF=6 で異常終了する件
hecmw_solver_las_66.F90 だけが、JAD の初期化状態ではなく hecmw_mat_get_usejad の値で
分岐しています(他の NDOF は hecmw_JAD_IS_INITIALIZED() で分岐)。
このため JAD が未初期化のまま hecmw_JAD_MATVEC が呼ばれ、未割り付けの配列を参照します。
CG / CR でも発生するのは、hecmw_solver_iterative.F90 の収束確認 hecmw_rel_resid_L2 が
ソルバ本体の終了後、つまり hecmw_JAD_FINALIZE の後に行列ベクトル積を行うためです。
再現手順
- master をビルドする
- tests/solver/CG/SSOR.cnt と SSOR.msh をコピーし、
!SOLVER行を次のように書き換える!SOLVER,METHOD=BiCGSTAB,PRECOND=1,ITERLOG=YES,TIMELOG=YES,USEJAD=YES - fistr1 で実行する
- 反復回数・残差が
USEJAD=NOの場合と完全に一致する(JAD 経路に入っていない)
NDOF=6 は tests/analysis/static/exA/A741 で同様に USEJAD=YES を指定すると異常終了します。
環境
- FrontISTR master bb0b7bed