eigen: fix the mass size, the eigenvector normalization and the residual under MPC elimination

概要

MPCを消去法(MPCMETHOD=3)で処理する固有値解析の open な issue 3件を、issue ごとに1コミットで直した。

#699 (closed): 並列では、外部節点にあるスレーブのマスター節点が縮約で追加され、hecMATmpc の NP が元の hecMAT%NP より大きくなりうる。集中質量は元の大きさのままだったので、Lanczos 法がその範囲外を読んでいた。hecmw_mpc_trans_mass に hecMATmpc を渡し、右辺ベクトルと同じく縮約後の大きさで質量を返す。追加分の質量は右辺と同じく 0 で、内積は内部節点だけなので結果は変わらない。-fcheck=all のビルドで tests/analysis/eigen/mpc_elim の2モデルを2プロセスで実行すると、修正前は固定あり・フリーフリーとも停止し、修正後は完走して固有値が逐次と一致する。

#861 (closed): 正規化が符号つきの最大値で割っていたため、成分がすべて負のモードでは縮約系に残るスレーブ自由度の正の微小成分で割られ、tie の1次モードが 1e15 倍になっていた。Lanczos の filter でスレーブ自由度を固定自由度と同じく 0 にし(消去法のときだけ)、絶対値が最大の成分が +1 になるように正規化する。スレーブが自由度数に数えられなくなったことで、maxiter を自由度数で抑える処理が反復を1回少なく止めること(反復は maxiter-1 回)が表面化したので、あわせて直した。

#862 (closed): Abs. Residual を元の空間の剛性行列と逆変換後の固有ベクトルで計算していたため、MPC を含むモデルでは拘束力が残って指標にならなかった。残差の計算を逆変換の前に移し、縮約行列・縮約後の質量・縮約空間の固有ベクトルで行う。調べる過程で、シフト sigma(既定 0.01)はフリーフリーのときだけ行列に加えられるのに残差では常に引かれていることが分かり、MPC なしのモデルでも残差が sigma·||M phi|| 程度(単位質量のモデルで 2e-2)になっていた。issue の記述に無いが同じ式なので、シフトを加えたときだけ (lambda + sigma) で引くように同じコミットで直した。修正後の残差は MPC の有無、固定の有無、逐次・2プロセスのいずれも 1e-14 以下である。

既存の固有値解析テストは固有値が不変で、固有ベクトルは定数倍(絶対値最大の成分が負だったモードは符号が反転)になる。tests/analysis/eigen/mpc_elim の参照結果ファイル4件はそれを反映して更新した。

Close #699 (closed), #861 (closed), #862 (closed)

変更内容

コミット 要約
9d65f5c1 eigen: size the reduced lumped mass by the reduced matrix under MPC elimination 質量を縮約後の大きさで確保する。陽解法の呼び出しも同じ引数に揃える
f76eeac7 eigen: keep slave DOFs out of the Lanczos vectors and normalize by the largest magnitude filter でスレーブ自由度を 0 にし、絶対値最大の成分が +1 になるよう正規化する。maxiter の上限を自由度数 +1 にする。参照結果4件を更新
61609c3a eigen: compute the residual of the eigenproblem as solved 残差を縮約空間で逆変換前に計算し、シフトはフリーフリーのときだけ考慮する
Edited by Kazuya Goto

Merge request reports

Loading
Loading