我想知道整体稀疏有限元矩阵中的Dirichlet边界条件实际上是如何有效实现的。例如,假设我们的全局有限元矩阵为:
ķ=⎡⎣⎢⎢⎢⎢⎢⎢520− 10241个0001个632− 1037000203⎤⎦⎥⎥⎥⎥⎥⎥和右侧矢量图b =⎡⎣⎢⎢⎢⎢⎢⎢b 1b 2b 3b 4b 5⎤⎦⎥⎥⎥⎥⎥⎥
然后在第一个节点()上应用Dirichlet条件,我们将第一行清零,在,然后从右侧减去第一列。例如,我们的系统将变为:
X1个= cķ11
ķ=⎡⎣⎢⎢⎢⎢⎢⎢1个0000041个0001个6320037000203⎤⎦⎥⎥⎥⎥⎥⎥和右侧矢量图b =⎡⎣⎢⎢⎢⎢⎢⎢Cb 2 − 2 × cb 3 − 0 × cb 4 + 1 × cb 5 − 0 × c⎤⎦⎥⎥⎥⎥⎥⎥
从理论上讲,这一切都很好,但是,如果我们的K矩阵以压缩行格式(CRS)存储,那么对于大型系统(许多节点为dirichlet),将列移到右侧会变得很昂贵。另一种选择是不将与Dirichlet条件对应的列移到右侧,即我们的系统将变为:
ķ=⎡⎣⎢⎢⎢⎢⎢⎢1个20− 10041个0001个6320037000203⎤⎦⎥⎥⎥⎥⎥⎥和右侧矢量图b =⎡⎣⎢⎢⎢⎢⎢⎢Cb 2b 3b 4b 5⎤⎦⎥⎥⎥⎥⎥⎥
但是,这样做的主要缺点是系统不再对称,因此我们无法再使用预处理的共轭梯度(或其他对称求解器)。我遇到的一个有趣的解决方案是Gennadiy Nikishkov在“ Java中编程有限元素”一书中找到的“大数方法”。此方法使用双精度仅包含约16位精度的事实。而不是在位置放置1,我们放置了大量数字。例如,我们的系统变为:
ķ11
ķ=⎡⎣⎢⎢⎢⎢⎢⎢1.0 和6420− 10241个0001个632− 1037000203⎤⎦⎥⎥⎥⎥⎥⎥和右侧矢量图b =⎡⎣⎢⎢⎢⎢⎢⎢c × 1.0 e 64b 2b 3b 4b 5⎤⎦⎥⎥⎥⎥⎥⎥
该方法的优点是它在保持矩阵对称性的同时,对于稀疏存储格式也非常有效。我的问题如下:
通常如何在有限元代码中对热量/流体实现Dirichlet边界条件?人们通常使用大数方法还是做其他事情?有人可以看到的大数方法有什么缺点吗?我假设大多数商业代码和非商业代码中都可能使用某种标准有效的方法来解决此问题(显然,我不希望人们知道每个商业有限元求解器的所有内部工作原理,但是这个问题似乎是基本/根本的)。足以使某人可能从事过此类项目并可以提供指导)。