如何在整体稀疏有限元刚度矩阵中有效地实现Dirichlet边界条件


9

我想知道整体稀疏有限元矩阵中的Dirichlet边界条件实际上是如何有效实现的。例如,假设我们的全局有限元矩阵为:

K=[5201024100016321037000203]and right-hand side vectorb=[b1b2b3b4b5]

然后在第一个节点()上应用Dirichlet条件,我们将第一行清零,在,然后从右侧减去第一列。例如,我们的系统将变为: x1=cK11

K=[1000004100016320037000203]and right-hand side vectorb=[cb22×cb30×cb4+1×cb50×c]

从理论上讲,这一切都很好,但是,如果我们的K矩阵以压缩行格式(CRS)存储,那么对于大型系统(许多节点为dirichlet),将列移到右侧会变得很昂贵。另一种选择是不将与Dirichlet条件对应的列移到右侧,即我们的系统将变为:

K=[1000024100016321037000203]and right-hand side vectorb=[cb2b3b4b5]

但是,这样做的主要缺点是系统不再对称,因此我们无法再使用预处理的共轭梯度(或其他对称求解器)。我遇到的一个有趣的解决方案是Gennadiy Nikishkov在“ Java中编程有限元素”一书中找到的“大数方法”。此方法使用双精度仅包含约16位精度的事实。而不是在位置放置1,我们放置了大量数字。例如,我们的系统变为: K11

K=[1.0e64201024100016321037000203]and right-hand side vectorb=[c×1.0e64b2b3b4b5]

该方法的优点是它在保持矩阵对称性的同时,对于稀疏存储格式也非常有效。我的问题如下:

通常如何在有限元代码中对热量/流体实现Dirichlet边界条件?人们通常使用大数方法还是做其他事情?有人可以看到的大数方法有什么缺点吗?我假设大多数商业代码和非商业代码中都可能使用某种标准有效的方法来解决此问题(显然,我不希望人们知道每个商业有限元求解器的所有内部工作原理,但是这个问题似乎是基本/根本的)。足以使某人可能从事过此类项目并可以提供指导)。


2
您是否有证据表明这大大降低了您的速度?
比尔·巴特

@BillBarth是的,尽管我总是有可能效率低下。Gennadily自己写道,虽然显式方法对于完整的2d数组很容易,但“ ..当矩阵为紧凑格式时,访问矩阵行和列并不总是那么容易。” 这表明显式方法可能难以有效实施。正如我当前编写的代码一样,显式方法可能比实际解决方案花费更多时间。
詹姆斯

1
像Wolfgang所说的那样做,并在组装之前将边界条件应用于元素矩阵。
比尔·巴特

@BillBarth是的,我想我会这样做。他的视频太棒了!我只是对他发表评论/问题,询问您是否需要在每个时间步骤重新组合全局矩阵,然后我想我会接受他的回答。
詹姆斯

Answers:


11

在deal.II(http : //www.dealii.org-免责声明:我是该库的主要作者之一)中,我们确实省去了整行和整列,并且总体上来说并不太昂贵。诀窍是利用稀疏模式通常是对称的这一事实,因此您知道消除整个列​​时需要查看哪些行。

我认为,更好的方法是在将单元格矩阵中的这些行和列添加到全局矩阵之前,将它们消除。在这里,您可以使用完整的矩阵,因此一切都是高效的。

我从未听说过采用大量方法,也不会使用它,因为它肯定会导致病态严重的问题。

作为参考,在http://www.math.colostate.edu/~bangerth/videos.html的演讲21.6和21.65中概念性地描述了我们在deal.II中使用的算法。它们非常符合您的描述。


2
对于与时间有关的问题(例如热方程),您是否在每个时间步都重新组装了全局矩阵?我问的原因是,在非零Dirichlet条件的情况下,修改右侧时需要原始全局矩阵中的信息,但是如果在上一个时间步中将这些列清零,则此信息会丢失(除非您存储它在其他数组中)。如果全局矩阵在每个时间步都重新组装,这将不是问题,尽管这是我正在考虑做的事情,如果使用自适应网格,无论如何都必须做。
詹姆斯

1
这取决于应用程序。所有“大”代码都解决了非线性时间相关的问题,对于这些问题,很明显,您需要以一种或另一种方式重新组装。对于线性代码,您可以只存储原始矩阵,然后在每个步骤中将其复制到其他位置,应用边界条件,然后在求解器中使用它。这只需要更多的内存,但是价格便宜。
Wolfgang Bangerth,2015年

1
嗯,我知道这就是我所怀疑的。我会按照您的建议实施。好的,这对您有所帮助。那些deallii教程视频真的很棒!
詹姆斯

2

零BC很容易。对于非零BC,您还可以使用拉格朗日乘数。例如,在这里。LM的一个优点是,尽管系统变得不确定,所以您可以使用任何约束方程式,因此您需要适当的求解器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.