首页/文章/ 详情

有限元区域分解技术入门级实现-泊松方程

17天前浏览74

简述

在所有有限元数值模拟领域,都会面临精度、效率、计算资源不足这三大问题。尤其对于动辄上千万网格的复杂模型,在这些问题上都具有极大的挑战。因此,有限元区域分解技术孕育而生。

本文从最简单的二维泊松方程为例,介绍有限元区域分解技术的基本实现流程。

该方法将计算区域分解成多个子区域,分别对每个区域进行独立求解,然后再对耦合区域求解,从而解决大规模问题。

1.边值问题

边值问题依然沿用最简单的二维泊松方程:

其有限元离散方程为:

具体有限元推导这里不再介绍,参考:有限元文章集 合-2024年

2.区域分解技术

假设对研究区域[0,1]X[0,1]进行网格剖分,以x=0.5为分界面,剖分成两套网格:

区域分解的技术的步骤:

1.独立求解区域1、2,将区域1、2中与分界面点(耦合点)无关的点(内部点)的信息独立聚合到耦合点上;

2.寻找区域之间耦合点的物理关系,在系数矩阵中强加耦合点的约束关系(拉格朗日乘子),从而得到关于耦合点的新的系数方程组,并求解该方程组,从而得到耦合点的解。

3.根据耦合点解回代得到每个区域内部点的解。

下面更加详细的介绍这个流程:

首先区域1,区域2具有独立编号,因此可以独立的对两个区域进行有限元矩阵组装:

然后分别确定两个区域的内部点与耦合点的ID,因此两个区域的有限元方程组均可以表示为:

然后采用缩聚的原理,将内部点uI的信息缩聚到耦合点uB上,具体做法:

用方程1表示uI,并带入方程2中,得到:

最终,转化成求解uB的方程:

缩聚相关知识可以参考:缩聚技术在网格结构层面上的技巧

此时,独立处理区域1、2的任务完成,分别得到独立的两套系数方程组。写在一起可以表示为:

接下来,需要耦合矩阵将两套独立的系数矩阵耦合在一起即可。

对于区域1和区域2的耦合点,在泊松方程的物理规律中,区域1求解的耦合点解应该和区域2求解的耦合点解一致,即耦合点的关系具有:

写成矩阵形式:

这也就是耦合点的关系,耦合矩阵。只需要依次获得每个耦合点的耦合矩阵,然后按照区域1、区域2的耦合点的位置关系将耦合矩阵组装进原系数矩阵中:

B1,B2分别是区域1、2的耦合系数矩阵,可以发现,该方程在保留了原有信息的前提下,加入了耦合项:

此时,求解该方程,即可得到的解u1B、u2B就是一致的。这里给出该网格下具体的系数矩阵,以供参考:

一般的对于大规模网格而言,上述系数矩阵规模是耦合未知数的三倍,依然会很大,因此可以进一步推导,降低矩阵维度,如下:

将第一、二个等式带入第三个,可以得到:

最后需要求解的问题仅仅是求解lamda,之前的矩阵求解过程均可以在各自区域中独立完成。

获得lamda解结果后,依次回代即可求解得到所有未知数。

3.结果展示

对于上述极其简单网格,其求解只有在中间一个节点非零,区域分解的结果与直接求解整个区域的结果对比如下:

可以发现,全域求解和区域分解求解的误差挺大的,并不是完全一致。原因是由于区域分解时耦合点是通过强加耦合方程(拉格朗日算子)实现的,而全域求解是严格按照有限元理论,二者本质上存在差别。将网格量加密,误差会减小,得到的结果直观上也是正确的。

全域求解结果:

区域分解求解结果:

进一步观察上述区域分解的网格,可以发现区域1、2的耦合点是共点的,两个网格能够完全拼起来。

对于一些特殊案例,区域之间可能无法完全拼接,耦合位置可能会存在悬浮点的情况,这时候也可以通过耦合边界所在三角形的插值关系,获得每个悬浮点的耦合系数矩阵。例如网格如下:

耦合位置存在很多悬浮点,此时对耦合位置的悬挂点插值处理,具体可以参考文章:有限元中悬挂点的处理方式:泊松方程实例,最终可以得到区域分解结果:

直观上possion方程的结果是正确的。

4.最后

本文用最简单的案例介绍了有限元区域分解技术的实现原理。

根据有限元区域分解技术的优势不难发现,可以将大规模模型分解成若干个子模型来处理,天然就很适合并行处理,最后的通信也仅在耦合面上,能很好的利用计算机资源,保证精度的情况下高效率完成求解,在大规模网格中是非常实用的。

区域分解技术方式还有很多,这里仅介绍其中一种,但是在具体大规模问题实现中,尤其是涉及求逆运算,还有许多关键技术需要共同使用,如此才能实现达到最优的计算效率。


博主长期深入实践电磁学领域的有限元技术,感兴趣的朋友可以添加博主公众 号,欢迎共同探讨与有限元相关的技术知识。



来源:实践有限元
通信理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-05-29
最近编辑:17天前
实践有限元
硕士 签名征集中
获赞 1粉丝 7文章 67课程 0
点赞
收藏
作者推荐

Cursor实践心得,附有问答过程

简述这段时间本想用Cursor实现仿真流程的简单建模、网格剖分、有限元求解、显示这几个步骤,尝试做成一个简单的小软件,结果不断尝试后,发现还是毕竟难以实现,或者说还没有找到更好的对话方式。最后Cursor的免费使用时间,这个想法也暂时夭折了。不过,实现过程中还是有一些结果与心得,这里简单总结一下。最后附上部分与cursor对话的截图。一些结果1.我先让Cursor帮我用Qt做一个界面,实现简单建模的功能。实现过程中,界面绘制简单模型,包括与右端几何树的联动好了,结果在进一步添加bool运算的时候,始终报错。最后导致整个代码难以调试通过,也回不去没有bool运算的结果。中间环境的代码没有保存,因此也无法展示没有bool运算的结果了。只能看看一步步生成的文件夹内容。2.想了想,那就看看能不能实现简单的网格剖分想着Cursor可能比较笨,因此就选择毕竟容易的python语言。最先让它帮我写了一个markdown,现在里面写好各个步骤的流程与一些能想到的细节。然后给它正确的读入几何模型的格式(直接用triangle的input格式)。解析好后,然后使用delaunay网格剖分,很快最简单的实现了,这时候吸取教训,保存的结果:然后让Cursor帮我添加面积约束,也实现了,只不过网格质量很差:然后想着和tiangle一样,实现区域的面积控制,也基本上实现了,虽然网格质量还是很差:这里我预感后面的优化可能会出问题,于是备份代码。接下来,我尝试让其帮我优化网格质量,根据角度、长短边比之类的。这里就开始卡住了,始终解决不了问题,而且在一次次的修改bug中也打乱了没有优化网格的代码,结果再一次导致整个代码无法修复,最终的结果就出现如下问题:无论如何调试,始终不对,直到Cursor试用期到了。下面是生成的文件名,可以看到mesh_generator.py修改了110次了还没有成功。使用心得:1.对于比较复杂的依赖环境Cursor能很好的提供解决方案和傻瓜式的流程,一步一步教你安装、查看版本、如何编译等待操作。只要你的电脑环境本身不复杂,那么基本上它能帮你安装好可行的环境。2.对于简单的案例,例如测试文档、简单的框架、简单的功能cursor能快速帮你实现,一旦上了点难度的,可能就得反复调试。3.如果能清晰详细的描述想要实现的功能,cursor也能帮你实现,如果不清晰,技术点自己都不知道的情况下,那么就很难成功了。4.对于C++而言,Cursor很多时候检查不到位,添加了新函数,或者更改了函数接口时,不会自动检查是否定义该函数,是否会造成重定义、接口是否统一等问题,当然也可以通过一次次的反复询问解决这些语言上的问题。5.如果真想用cursor来写复杂的代码的时候,一定一定要记着自己备份,如果一旦cursor反复调试后实现不了,而你没有备份,那么基本上就宣告失败了(或许也有其他方法,目前还不知道)。因为AI本身有随机性,基本上恢复不了某个阶段的代码。6.Cursor的试用期是两周,到期后就不能使用claude-3.5-sonnet了,只能使用mini。但是mini基本上都没有上下文而且很“笨”,如果调试操过三次没有成功,基本上就陷入了答非所问的结果。7.之前有朋友问具体步骤怎么实现了。觉得用多了就有感觉了,下面截图一些我个人的提问和回答内容,不喜勿喷。问1:给出你想要做的事情,可以先写在md里面。问2:直接上截图问3:让cursor推荐语言问4:根据cursor提示继续....自己查看markdown,觉得差不多了,就可以让cursor写代码了。想要个测试代码,问cursor第一次生成的文件有错误,于是提示它修改:.....之后的提问类似,有什么需求就问,有错误就复杂粘贴错误内容,然后就开始一步一步去实现你想要实现的功能。8.个人感受,整个过程就是提问和粘贴复制,虽然感觉很舒服,但是如果遇到cursor反复解决不了的问题,就会陷入无限的修复bug过程中,拆了东墙补西墙的感觉,脑袋啥也没做嗡嗡嗡的。可能还需要学习,多实践找点简单的案例来实践。来源:实践有限元

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈