反復ソルバ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 の後に行列ベクトル積を行うためです。

再現手順

  1. master をビルドする
  2. tests/solver/CG/SSOR.cnt と SSOR.msh をコピーし、!SOLVER 行を次のように書き換える !SOLVER,METHOD=BiCGSTAB,PRECOND=1,ITERLOG=YES,TIMELOG=YES,USEJAD=YES
  3. fistr1 で実行する
  4. 反復回数・残差が USEJAD=NO の場合と完全に一致する(JAD 経路に入っていない)

NDOF=6 は tests/analysis/static/exA/A741 で同様に USEJAD=YES を指定すると異常終了します。

環境