グローバルスパース有限要素行列のディリクレ境界条件が実際に効率的に実装される方法を知りたいです。たとえば、グローバルな有限要素行列が次のとおりだったとします
次に、最初のノード()にディリクレ条件を適用するために、最初の行をゼロにし、 1を入れ、右側から最初の列を減算します。たとえば、システムは次のようになります K 11 K = [ 1 0 0 0 0 0 4 1 0 0 0 1 6 3 2 0 0 3 7 0 0 0 2 0 3 ]
理論的にはこれで十分ですが、K行列が圧縮行形式(CRS)で格納されている場合、列を右側に移動すると、大規模なシステム(ディリクレが多いノード)のコストが高くなります。代替案は、ディリクレ条件に対応する列を右側に移動しないことです。つまり、システムは次のようになります:
ただし、これはシステムが対称ではなくなり、前処理付き共役勾配法(または他の対称ソルバー)を使用できなくなるという大きな欠点があります。私が遭遇した興味深い解決策の1つは、Gennadiy Nikishkovの著書「Programming Finite Elements in Java」で見つけた「Method of Large Numbers」です。この方法は、倍精度には約16桁の精度しか含まれないという事実を利用しています。位置に1を置く代わりに、多数を配置します。たとえば、システムは次のようになります。
この方法の利点は、スパースストレージフォーマットに対して非常に効率的であると同時に、マトリックスの対称性を維持することです。私の質問は次のとおりです:
ディリクレ境界条件は通常、熱/流体の有限要素コードにどのように実装されますか?人々は通常、大量の方法を使用しますか、それとも他のことをしますか?誰かが見ることができる大きな数の方法に不利な点はありますか?私はこの問題を解決するほとんどの商用および非商用コードで使用される標準の効率的な方法がおそらくあると想定しています(明らかに私は人々がすべての商用有限要素ソルバーのすべての内部の仕組みを知っているとは期待していませんが、この問題は基本的/基本的なようです誰かがそのようなプロジェクトに取り組んでいる可能性があり、ガイダンスを提供できるほどです。