如何组装全局矩阵(对于耦合)问题?

计算科学 有限元 matlab
2021-12-24 08:32:26

我正在尝试为以下系统组装全局矩阵。

[KQQTS][uhph]=[fufp]

其中,

K,Q,QT,S

是从元素积分生成的矩阵,我知道如何计算。同样, 是从元素(右侧)上的积分生成的向量,我可以计算出来。

fu,fp

我的问题是如何计算全局矩阵我知道如何计算它是否是一个简单的系统。我不确定如何在耦合的情况下处理它。KU=F

到目前为止,我拥有所有元素的矩阵,但我不知道如何组装一个全局矩阵系统。我可以为创建一个全局矩阵,然后假设它们是块矩阵并将它们附加到一个大矩阵中吗?我的问题是,在全局矩阵中,每个节点都不会耦合。KQSuhph

问题是使用了 Taylor-Hood 元素,所以个节点,个节点。所以每个节点都有不同的#自由度,要么是2,要么是3。u9p4

3个回答

我认为您可能以错误的方式看待问题。矩阵的行对应于离散方程,这取决于问题的自由度,而不是空间中的物理位置。您可以随意(理论上)对节点和节点进行编号,但您仍然会得到、一个 9x9 矩阵、一个 9x4 矩阵和upKQS一个 4x4 矩阵,特定于您的编号(和元素的选择)。空间耦合来自定义这些矩阵的积分,您不应该认为某些节点在空间上位于同一位置的面部有什么特别之处。确实存在不连续的有限元方法,其中单个变量可以有多个节点位于空间中的单个点。

如果我正确理解您的问题,那主要是关于编程而不是概念性的 FE 问题。

在通用有限元程序中,几乎总是假设不同的节点具有不同的自由度 (dof) 集。为了将每个元素组装到全局矩阵中,您需要的关键信息是从元素矩阵中的每个自由度到全局矩阵中的适当方程的“映射”。这是创建该地图的一种非常简单的方法:

  1. 在模型中创建一个维度为 max_dofs_per_node x number_of_nodes 的数组(地图)。(在您的情况下为 3 xn)
  2. 对于模型中的每个节点,如果自由度在该节点处处于活动状态,则将与该节点对应的映射矩阵列中的条目设置为 1,否则设置为 0。
  3. 现在遍历映射矩阵中的所有条目,如果条目为 1,则分配一个全局方程编号。方程编号从 1 开始,每次递增。

在组装过程中,对于每个元素节点,您可以通过参考映射矩阵中的相应列轻松确定全局方程编号。

在 MATLAB 中创建稀疏矩阵的最快方法是首先创建一个“三元组”(行、列、值)矩阵,其中行和列是映射矩阵中适当的方程编号,然后将三元组传递给 MATLAB 稀疏函数. Davis 在这篇笔记中讨论了这种方法:http: //blogs.mathworks.com/loren/2007/03/01/creating-sparse-finite-element-matrices-in-matlab/

我强烈建议使用 PETSc,特别是如果您想并行组装,并且如果您计划使用通过组合各个字段的预调节器创建的预调节器。

PETSc 中的组装非常简单。看一些例子(很多也是针对耦合问题的)。并行组装和求解是 FE 代码中最复杂的部分,PETSc 兼顾两者。