【要約】Pythonで学ぶ有限要素法の実装(2): オブジェクト指向によるソルバーと要素の整理 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が有限要素法の解析プログラムを構築する際、初期の単純な実装では将来的な拡張が困難になる。手続き型に近い実装では、以下の問題に直面する。
- ・行列ソルバーの種類を変更する際、メインプログラムのロジックを大幅に書き換える必要がある。
- ・要素の種類が増えるたびに、呼び出し側のコードに個別の関数呼び出しが必要になる。
- ・疎行列を用いる際に不可欠な、非ゼロ構造の事前確定プロセスを組み込みにくい。
// Approach
開発者は、計算結果を維持したまま、プログラムの構造を拡張性の高いオブジェクト指向設計へとリファクタリングした。具体的には、以下の手法を採用している。
- ・行列ソルバーを
IShape,IBuilder,ISolver,IFactorizedの4段階のインターフェースに分離する。 - ・
abcモジュールを用いて抽象基底クラスを定義し、実装の詳細を隠蔽する。 - ・要素の計算処理を要素クラスのメソッドとしてカプセル化し、ポリモーフィズムを利用可能にする。
- ・密行列実装として
ScipyDenseシリーズを構築し、インターフェースの動作を検証する。
// Result
このリファクタリングにより、開発者はソルバーの実装を変更しても、解析モデルの定義やメインプログラムを修正せずに済む。具体的な成果は以下の通りである。
- ・
ScipyDense実装により、既存の密行列+Cholesky分解の挙動を維持した。 - ・要素タイプを追加する際、呼び出し側のコードを変更せずに対応できる土台が整った。
- ・次ステップの疎行列ソルバー実装に向けた、堅牢な設計基盤が構築された。
Senior Engineer Insight
> 本設計は、数値計算ライブラリの「疎結合化」において極めて理にかなっている。特に、行列構築のプロセスを
IShape から IFactorized まで段階的に分離した点は、計算コストの高い疎行列処理への移行をスムーズにする優れた設計である。実戦においては、計算速度のオーバーヘッドを最小限に抑えつつ、この抽象化レイヤーをどこまで設けるかが鍵となる。拡張性とパフォーマンスのトレードオフを考慮した、プロフェッショナルな設計思想が見て取れる。