Loading
接触解析のリファクタリング
Close #85 (closed) #419 (closed) #522 (closed)
接触解析のリファクタリングです。アプリ層fistr1側に分散していた接触・埋め込み関係のファイルや処理を新規ディレクトリanalysis/interaction配下に集約し、整理しました。平滑化、面対面接触の実装など今後の機能拡張に必須のリファクタリングになりますので、ぜひレビュー、マージをお願いいたします。
合わせて、拡張ラグランジュ法のルーチンについても大幅に修正を行い、標準ラグランジュ定数法と同等の計算ができるようになっています。ただしこちらは静解析のみの対応です(元々動解析に拡張ラグランジュ法はないため)。
ファイル移動を伴う大規模なコード変更で、カスタマイズしている場合にgitによる競合解決は困難だとは思うのですが、その場合はgithub copilotなどAIエージェントの支援を受けて修正することをおすすめします。具体的にはカスタマイズのコミットをパッチ出力し、そのパッチを添えて(変更元のファイルも渡すとなお親切)エージェントに「これと同じ内容の修正をこのブランチに適用して。接触関係の処理はリファクタリングされてinteraction配下に集約されています」と指示すると、精度良く修正してくれる印象です。セキュリティの都合などで使えない場合は申し訳ないですが、変更すべき場所は減って手動修正も楽になっているはずです。
変更のポイントは以下になります
- ディレクトリの考え方
- analysis/interaction(新設):相互作用(接触・埋め込み・今後増えるもの)関連計算の処理部。接触点探索、接触剛性・力の計算
- lib/contact(既存):相互作用関連の構造体・基本関数・定数の定義。tContact, tContactState, tSurf, Bucket関連など
- プログラムの依存関係
- fstr_contact.f90:最上位の接触tContact構造体関連処理管理レイヤ。CONTACTペアごとのON/OFF制御、点面・面面(将来的)の選択
- fstr_contact_assembly.f90:力学計算の接触ペア単位での処理レイヤ。スレーブ節点・面(将来的)ループ、CONTACT/FREEでの処理切り替えなど
- fstr_contact_element.f90:力学計算の接触要素単位での処理の管理モジュール。配下のモジュールのuseのみ
- fstr_contact_elem_slag.f90:標準ラグランジュ定数法の剛性行列作成、節点力計算
- fstr_contact_elem_alag.f90:拡張ラグランジュ定数法の剛性行列作成、節点力計算、ラグランジュ定数の更新
- fstr_contact_elem_common.f90:接触の力学計算で共通で使われるルーチン
- fstr_contact_interference.f90:嵌合干渉のプログラム
- fstr_contact_element.f90:力学計算の接触要素単位での処理の管理モジュール。配下のモジュールのuseのみ
- fstr_contact_search.f90:接触探索
- fstr_contact_geom.f90:接触探索で使われる投影関数など
- fstr_contact_output.f90:接触変数出力関係の処理
- fstr_contact_mpc.f90:古いmpc関数(接触面からequationを作成)。useのみで未使用
- fstr_contact_assembly.f90:力学計算の接触ペア単位での処理レイヤ。スレーブ節点・面(将来的)ループ、CONTACT/FREEでの処理切り替えなど
- fstr_mat_con_contact.f90:hecLagMATの組み立て
- fstr_contact.f90:最上位の接触tContact構造体関連処理管理レイヤ。CONTACTペアごとのON/OFF制御、点面・面面(将来的)の選択
- 力学計算共通サブルーチンcomputeTm_Tt(射影行列)
- スレーブ・マスター構成節点の変位を相対変位および相対すべり変位に写す射影行列Tm,Ttを計算する。貫入量など他の接触関連の諸量も原則すべてここから計算できる。
- 例えば、貫入量であれば相対変位を与える射影行列Tmを使って
dot_product(direction,matmul(Tm,elemcoord))で計算できる - 例えば、相対滑り変位であれば滑り方向を
matmul(Tt, ndDu)で計算できる- Ttは法線ベクトル
nとTmからTt=(I-n x n)Tmですぐ計算できる行列だが、Tmと同時に作る機会が多いのでこのルーチンの中で計算させている
- Ttは法線ベクトル
- 例えば、貫入量であれば相対変位を与える射影行列Tmを使って
- こうしておくことで接触剛性・接触力の計算と離散化でサブルーチンが完全に分離するので、平滑化や面々接触など離散化の機能を拡張しやすくなる
- スレーブ・マスター構成節点の変位を相対変位および相対すべり変位に写す射影行列Tm,Ttを計算する。貫入量など他の接触関連の諸量も原則すべてここから計算できる。
- 拡張ラグランジュ法関連の主な修正
- 貫入量の計算誤りが原因で隙間のある状態で収束するなどしていた不具合を修正した
- 接触状態ループとラグランジュ定数更新ループが一体になっていたのを二重ループに分離した
- !CONTACT_ALGO,TYPE=ALAGRANGE,AUGITER=Nでラグランジュ定数更新のループだけを複数回回すことができる。デフォルトは2
- 接触、ラグランジュ定数更新ループのなかでの右辺計算を見直して、初回Newton反復でも正しい右辺がセットされるようになり、収束性が向上
- あるプロセスで接触状態のペアがないことで、MPI全体通信でデッドロックする不具合を修正し、分散並列でも動作するようになった
- ペナルティを接触のモジュール変数から接触構造体配下の変数に格納するよう変更。これでペアごとにNPENALTY, TPENALTYで設定できる。
- 滑り摩擦の収束性改善のため、簡易なペナルティの自動調整を導入(試行摩擦力とすべり摩擦力の比が一定以上の場合にペナルティを下げる)
- testsに例題を追加
Edited by inagaki