概要
!EQUATION と !BOUNDARY が同じ節点・自由度に掛かると境界値が守られない不具合(#697 (closed)、#718 (closed))を直した。原因は v5.6 のコミット 24bfe253 で変位境界条件(EBC)の適用が MPC 処理の前に移ったことである。EBC を先に掛けると、hecmw_mat_ass_bc が正準形にした行・列が消去 T^t K T で崩れてマスターの境界値が守られず、スレーブに掛けた EBC は縮約で捨てられる。ペナルティ法でも対角の 1 がペナルティ項 に埋もれる。
24bfe253 が順序を戻したのは、旧順序(MPC の後に hecMATmpc へ適用)が MPI で破綻するためだった。その直接の原因は、縮約後の行列では外部節点の行が空になるため、hecmw_mat_ass_bc が対象節点の行から列の非零を探せず、列が消えないまま非対称になって CG が収束しないことである。
対処として、EBC を即時に行列へ掛けず、自由度ごとの拘束フラグと指定値として hecmw 側の境界条件データ hecmwST_ebc(hecmw1/src/solver/mpc/hecmw_ebc_defer.f90)に記録し、MPC 処理(消去またはペナルティ)の後に縮約後の行列へ掛けるようにした。拘束フラグは縮約で追加される外部節点まで assemble と update で広げ、行・列の消去は全行を走査して行う。接触・陰解法動解析の経路は MPC 処理がソルバ 内(solve_LINEQ_contact)にあるので、hecmwST_ebc をソルバに渡してその中で掛ける。Lagrange 列の処理(hecmw_mat_ass_bc_contactlag)は従来どおり即時に行うので、EBC 自由度は接触スレーブに選ばれず、接触の消去の後に掛けても同値である。
スレーブ自由度に与えた EBC は、マスターが 1 つの拘束 a_s u_s + a_m u_m = c ならマスターの EBC u_m = (c - a_s u_s)/a_m に変換して満たす。マスターが複数の拘束では Dirichlet 条件として表せないため、節点番号を示すメッセージを出してエラー終了する。#697 (closed) の報告例(u1z = 0.5 u2z + 0.5 u3z のスレーブに EBC)はこれに当たり、マスターの 1 つを別の式のスレーブにする書き換えが必要になる。マス ターに既に別の値の EBC があるときも同じくエラーにする。
確認は、トラス 10 本のチェーン(u_x(11) = 2 u_x(2))にマスターまたはスレーブの EBC を与えたモデルで行い、逐次と 2 プロセスの両方で手計算の値と一致する。#718 (closed) 相当の beam 611 の三角形は、修正前は CG が収束せず、修正後は v5.5 のビルドの結果と一致する。同じチェーンを陰解法動解析にしたモデルも一致する。既存の参照結果は変えていない。
| モデル | 修正前 u_x(2), u_x(11) | 修正後 | 期待 |
|---|---|---|---|
| 節点 2(マスター)に u_x = 0.1 | 0.0846, 0.169 | 0.1, 0.2 | 0.1, 0.2 |
| 節点 11(スレーブ)に u_x = 0.3 | 0.124, 0.248 | 0.15, 0.3 | 0.15, 0.3 |
hecmw_mat_ass_bc を呼ぶ箇所は無くなったが、hecmw の公開 API として残してある。縮約後の行列には使えないので、いずれ削除するか注意書きを付けるのがよい。マニュアルの多点拘束の章にある「スレーブ自由度に !BOUNDARY を重ねてはならない」の記述は frontistr_documents 側の MR で改める。
Close #697 (closed), #718 (closed)
変更内容
| コミット | 要約 |
|---|---|
| 00e6803d hecmw: add a container that keeps essential boundary conditions until after the MPC processing | 境界条件データ hecmwST_ebc と init / set / apply / finalize。apply は外部節点への拡張と全行走査の消去を行う |
| ad8d0d47 static, eigen: impose the prescribed displacements after the MPC processing | 静解析(接触なし)と固有値解析で MPC 処理の後に掛ける。Lanczos の filter は hecmwST_ebc の拘束フラグから作る。テスト mpc_ebc(マスター)を追加 |
| 26e8c025 contact, dynamic: impose the prescribed displacements inside solve_LINEQ_contact after the MPC processing | 接触の反復法・直接法と陰解法動解析で、ソルバ内の MPC 処理の後に掛ける |
| 56c10164 hecmw: impose a prescribed displacement on the slave DOF of an !EQUATION through its master | スレーブへの EBC をマスターの条件に変換、複数マスターと矛盾はエラー。テスト mpc_ebc(スレーブ)を追加 |
| 7c3d22c6 heat, quasi-newton: record the prescribed values in the container like the other analyses | 熱伝導の固定温度と準ニュートン法の探索方向のマスクを同じ hecmwST_ebc で扱う |