首页/文章/ 详情

三维曲面四面体有限元实现-泊松方程

6天前浏览321

简述

继上次实现了二维曲面有限元之后,本文继续探讨三维四面体曲面有限元的实现技术。

与二维曲面有限元一样,其关键技术两点,1是曲面四面体网格的划分,这里使用gmesh实现,直接剖分成二阶四面体网格;2是曲面四面体到参考直边四面体的映射关系。

1、边值问题

本案例以单元球体为例,使用泊松方程为微分方程,采用以下边值问题:

该方程存在解析解:

其有限元离散问题为:

2、gmesh网格剖分

直接让AI生成了一个gmesh输入几何geo文件,模型为一个球形。















SetFactory("OpenCASCADE");Sphere(1) = {0001};  // 单位球体// Physical Surface("Dirichlet") = {1};  // 球面为 Dirichlet 边界Physical Volume("Omega") = {1};       // 球体内部为求解域           // 全局网格尺寸(值越小网格越密)Mesh.CharacteristicLengthMin = 0.1;  // 最小网格尺寸Mesh.CharacteristicLengthMax = 0.3;  // 最大网格尺寸               Mesh.ElementOrder = 2;      // 二阶四面体单元Mesh.Algorithm3D = 4;      // Delaunay 算法Mesh.Optimize = 1;          // 优化网格质量

生成结果如下,同样仔细观测可以发现,在表面的棱边并不是直线,其棱边中点并不在棱边上,而是在契合曲面的位置。

进一步观察gmsh文件,其每个四面体均有10个点组成,即四个顶点+六个棱边点。相比之前的直边四面体仅需要四个顶点描述,二阶四面体(曲面四面体)因为其六个棱边点不一定在棱边中点,因此需要10个点描述。

3、曲边四面体到直边四面体

上述描述了二阶四面体由10个点组成,从等参单元的角度考虑,有限元应该也使用二阶基函数,如此才能恰好使用二阶四面体的特征。

由于是曲边四面体,那么传统的直接在原四面体上使用体积坐标获取基函数的方式不再可行,因此使用坐标转换公式将任意曲边四面体映射到参考四面体进行处理。而参考四面体即可选择最简单的直边四面体。如下:   

 

对于处理参考坐标系的二阶基函数,相对而言就很容易获得其对应的线性基函数与二阶形函数。参考坐标系的线性基函数可以表示为:

插值型二阶基函数表示为:

然后推导任意曲面四面体到参考四面体的雅可比矩阵,已知对于两个坐标系之间,满足:

雅可比矩阵可以写成:

雅可比矩阵的每个元素为:

例如,计算其中一个N5 的梯度:   

可见,雅可比矩阵是与10个节点均关联,因此其原曲面四面体的二阶曲面点性质在雅可比矩阵中得到体现。这不同于直边四面体的雅可比矩阵只需要关联4个顶点。

其次从N5不难分析得到,与直边四面体雅可比矩阵在单元内是常数矩阵,而二阶四面体的雅可比矩阵与参考坐标值的选取相关。

同样,对于基函数梯度,可以推导:

4、矩阵组装

根据上述推导,不难更加详细的有限元离散方程的单元积分等式:

对该积分等式带入高斯积分公式,可以求解得到对应的积分结果。

其中,高斯积分点与权重为:    

具体组装过程与常规有限元一般无二,这里不再赘述。

5、测试结果

下图是在单位球模型下,泊松方程的理论解和数值解的对比。数值与理论解结果基本上是一模一样的,说明曲面有限流程是正确的。

其三维散点图也可以大致看出,在球心位置的数值最大,在边界上等于0。    


               

最后

1.曲面有限元的与直边有限元的流程基本上一致,区别仅在于雅可比矩阵的求解,直边雅可比矩阵只需要4个顶点进行求解,曲面有限元会加入曲面信息的棱边点。而这一点也恰好是曲面的体现。

2.整个过程可以发现,基函数与四面体网格阶数是一致,这也称之为等参单元。并且细心可以发现,二阶基函数使用的是插值基函数而不是叠层基函数,因为从雅可比矩阵出发,如果采用叠层基函数,在高阶项部分,曲面棱边中点坐标不能够通过叠层基函数获得,此时雅可比矩阵无法通过叠层基函数获取。因此对于曲面有限元而言,是否能使用叠层基函数还有待进一步讨论。

3.对于曲面有限元的高阶四面体网格单元,如果要体现其四面体高阶网格性质,对应的基函数也需要采用对应的高阶插值基函数。



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


来源:实践有限元
ACTUM理论曲面
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-04-24
最近编辑:6天前
实践有限元
硕士 签名征集中
获赞 0粉丝 7文章 62课程 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
联系我们
帮助与反馈