首页/文章/ 详情

三维矢量有限元实现过程-电场矢量波动方程

1月前浏览971

简述

针对三维电场矢量波动方程,在前面有介绍过一篇文章,使用节点有限元来实现,推导过程也是相当的复杂。并且在文章最后说明了节点有限元由于其节点基函数自然满足未知数连续性的条件,因此在电场遇到介质分界面的时候,无法模拟电场法向不连续的物理现象,从而出现伪解。

因此,本文介绍三维矢量(棱边)有限元,该方法的能够完全避开节点有限元的存在的问题,因为棱边有限元自然约束条件是未知数的切向连续,而对未知数的法向并没有约束,恰好满足电场在介质分界面的传播规律。

当然由于未知数之间的关系仅剩下切向分量维持,因此棱边有限元的系数矩阵质量相比于节点有限元而言更差,因此使用迭代法求解往往需要很长的时间收敛,甚至无法收敛,而使用直接求解的方法效果要好一些。

1.边值问题与有限元方程

对于电场矢量波动方程的边值问题的描述与有限元问题在文章:电场矢量波动方程的三维有限元实现中有详细介绍,这里不再赘述,给出有限元方程:

边界条件使用第一类边界条件加载。

2.四面体棱边基函数

根据四面体网格,已知通过体积坐标得到的线性插值基函数:(具体推导参考:三维非结构化有限元实现-possion方程


根据上述四面体棱边规定的顺序,有棱边编号对应的局部节点编号顺序:

由此可以得到棱边基函数表达式;    

可见六条棱边,各自对应一个基函数,每个棱边基函数由其两个顶点的节点基函数组合而成,并乘以该棱边的长度,同时该棱边是具有方向性的,约定棱边顺序为全局顶点编号小到全局顶点编号大为正。

例如一号棱边的局部顶点编号1、2,如果对应的全局编号为129、100此时该棱边长度标记为负数;如果对应的全局编号为100、129,则此时该棱边长度标记为正数。

进一步研究棱边基函数,对N1分别取梯度与旋度算子,可以得到:

    

可见,N1求梯度结果为零,求旋度结果不为零。证实了棱边基函数仅对切向方向有约束,而对于法向方向无约束。

对比三维节点有限元的基函数,不管是取梯度(泊松方程)还是取旋度(电场波动方程)其结果均不为零,说明节点有限元对切向、法向方向均有约束作用。

继续推导旋度的结果,可以得到任意棱边形函数的旋度表达式:

可以通过旋度发现,与之前的节点形函数不同,棱边形函数是具有两个方向的,方向1是棱边节点顺序的方向,方向2是表示坐标轴上的xyz矢量的方向,所以称之为矢量基函数,矢量有限元。此时由于基函数表示了三个矢量方向,所以求解的未知数则是一个无方向的数,表示棱边切向量。    

3.单元系数矩阵推导

对于矢量波动方程的有限元方程,主要系数矩阵就是K矩阵,如下:

积分项分成两项,第一项是基函数旋度的乘积,第二项是基函数的乘积,对第一项进行推导,首先推导k11的积分:

   

可见,推导后得到的是一个系数,xyz的方向性在内积的过程中消失,继续推导:

可以观察其中规律,进而可以快速得到其他部分的积分结果:    

上述式子的积分通式是非常重要的,只要通过形函数得到关于线性基函数的表达式,如上述式子的左端项,根据下标关系,即可得知右端项的具体积分结果,这对于编程实现是非常的方便。

对于K矩阵的右端项,同样的推导方式:

对于线性基函数Li的梯度可以表示为:

因此,推导可得:

观察上述推导规律,N*N的每一项都可以表示为类似的形式,区别仅在于基函数的下标,因此令:    

则,K11可以表示为:

验证推导,K12可以表示为:

注意,对于li*lj的棱边长度的乘积,其下标与Kij的下标是一致,下面就不再将这部分反复写入,继续推导系数部分:    

进一步熟悉,观察规律可以简化成如此:
继续简化推导,得出规律,法向LiLj的系数项相同为2,不相同为1;fij的下标等于梯度LiLj的下标组合即可。    


    

最后,总结规律可以得到:    

该通式也是同样的重要,在编程实现过程中是非常有帮助的。

如此对单元系数矩阵推导完成,最终得到6*6的单元系数矩阵,一一对应四面体的六条棱边。

4.四面体网格、系数矩阵组装与边界条件加载

对于四面体网格,同样需要注意的是四面体单元的局部棱边顺序。根据前面给出的棱边顺序与节点关系,对tetgen原有的棱边顺序进行修改,如下图:

系数矩阵组装过程中与传统有限元一样,如果在组装每个单元系数矩阵过程中统一了棱边方向,即可直接按照单元棱边编号和全局棱边编号的关系一一映射组装即可。    

第一类边界条件加载则与之前有很大区别,已知第一类边界条件为:

上述的边界条件信息表示的是在节点上的电场三分量,表示为电场传播方向为z方向,振动方向仅在x方向。由于棱边有限元的未知数是表示棱边上的电场切向分标量,因此这里也需要把矢量的电场值投影到棱边上,具体做法如下,先得到棱边的单位方向向量:

其中i,j表示棱边的两个节点,这两个节点的顺序必须与之前定义的棱边顺序一致。因此,矢量电场在棱边上的投影切向电场为:

这里可以取棱边中点位置电场作为被投影的电场矢量场。在得到棱边的切向电场值后,再使用乘以大数的方法,将六个外表面的棱边均赋予第一类边界条件。

5.结果展示

研究区域大小10m*10m*10m,频率10000Hz,电导率1欧姆米。网格为4314个四面体,872个节点,5485条棱边,所以5485个未知数。

在获得棱边切向场结果后,根据插值公式,获得四面体中心点的电场结果:

a.当介质为均匀介质时,插值获得四面体中心点的电场,该位置的理论解与数值解对比:

可见,相比于节点有限元,误差较大,原因1是由于棱边与棱边之间的关联较差,导致结果也较差;原因2是由于插值过程中有精度损失。

b.将网格图中,研究区域中心位置的电阻率设置为0.05欧姆米。

可以发现,即使模型中间存在电导率不同的区域,处理在一次场本身的传播方向上有明显的体现,在Y、Z方向上几乎看不到反应,完全被误差掩盖。因此考虑细化网格与加强电导率的差异来测试。

c.网格细化,四面体7063个,棱边9350个的,并把电阻率为0.001的时候,如图所示:

    

 可见,当   网格细化,电导率继续降低的时候,   在Z,Y方向的误差就无法完全掩盖电场规律,图中能明显看到Y、Z实部的异常,虚部异常也隐约可见。  

6.总结

 a.局部棱边方向到全局棱边方向一定要保证一致。每个单元六条棱边,每个棱边在全局有唯一确定的方向。  

 b.第一类边界条件加载的时候,也要注意确保棱边方向的唯一性。  

 c.相比于节点有限元,棱边有限元除了基函数完全不一致之外,最需要注意的就是棱边方向的统一,在一切有使用到棱边的位置都需要对棱边方向统一。  

 d.结果显示,棱边有限元想要得到精度足够高的结果是比较困难的,不断的加密网格是一个直接的方法,但是随着网格足够多,对于内存开销也是一个挑战;另一个办法则是使用高阶棱边有限元,能够有效的提高精度,但是实现难度则是成倍增加。  

 e.在实际物理问题中,往往不需要每个区域都有足够高的精度,只需要特点区域的精度足够高即可,这时候就可以针对感兴趣的区域进行网格加密,即使用自适应技术迭代求得最优网格,如此也能获得想要的精度同时也保证计算效率、内存开销得到保证。  

来源:实践有限元
振动电场理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-12-06
最近编辑:1月前
实践有限元
硕士 签名征集中
获赞 0粉丝 0文章 57课程 0
点赞
收藏
作者推荐

泊松方程三维二阶插值有限元实现-四面体

简述相比于线性基函数,高阶基函数的优势在于能使用较少的网格数量实现精度更高的计算求解,因此对于高阶有限元的实现是数值模拟中不可避免的重点话题。本文还是以简单的泊松方程边值问题入手,介绍四面体的二阶插值基函数有限元的实现过程。其中,实现的关键还是在于基函数的确定与系数矩阵的推导。本文将重点介绍系数矩阵的推导,对于泊松方程的描述与有限元方程的推导不再赘述,可参考:泊松方程三维结构化有限元实现初探。1.四面体二阶插值基函数对于四面体的二阶插值基函数,与二维三角形高阶基函数一样是由线性基函数组合而来,已知线性基函数表达式(推导可参考:三维非结构化有限元实现-possion方程):根据上述四面体示意图可知,二阶基函数基函数由4个顶点和6条边的中点组成,共计10个节点。其中六个中点编号与顶点关系的顺序如下:因此可以得到四面体的二阶插值基函数:此时,四面体内任意一点p的插值公式可以表示为:进一步理解插值基函数,通过p点的移动,根据面积坐标原理,可以分析得到,当p点落在1号点时,L1=1,L2~4=0,带入二阶基函数中,得到N1=1,N2~10=0;编号2~4同样可以推导得到相同的结果;当p点落在5号点时:如上图显示,根据基函数面积坐标原理,可以得到:带入二阶基函数,得到:同理6~10号中点能推导得到相同的结果。由此可知上述组合二阶基函数满足基本的插值基函数原理,即p点落在任意插值节点的时候,对应节点的形函数为1,其他形函数为0.对应二阶基函数的在x方向的偏导数如下,根据线性基函数L表达式,y或者z方向的偏导数将系数a变成b或者c即可得到。2.单元系数矩阵推导已知三维泊松方程的有限元公式,包括左端的偏导数项与右端项激励项。当f=0时,退化为拉普拉斯方程。左端项对各个方向的偏导,从四面体二阶基函数不难发现,各方向的偏导数在形式上一致的,区别在于偏导得到的线性基函数系数(a,b,c)不同,因此仅需要推导一个方向的系数矩阵,其他方向改变系数即可得到。以x方向的偏导为例,根据二阶基函数规律,将10*10的系数矩阵分成9块亚系数矩阵:可见,由于系数矩阵的对称性,仅需要推导对角线三个加上三角三个共计六个亚系数矩阵求解即可,如此更容易根据规律推导,a.首先推导K11系数矩阵根据其中推导的规律性,得出其他部分的系数项:因此,K11系数矩阵为:b.推导K12系数矩阵总汇得到K12系数矩阵:c.推导K13的系数矩阵N3N8~10与N4N8~10可以通过规律类比得出:最终得出K13的系数矩阵:d.推导K22的系数矩阵总汇得出K22系数矩阵:e.推导K23的系数矩阵汇总得出K23系数矩阵:f.推导K33的系数矩阵由此,对x方向的偏导数的系数矩阵推导结束,将上述亚系数矩阵组合起来,即可得到10*10的完整的系数矩阵,如下:右端项的向量推导相对而言要简单很多:因此,右端项的向量为:3.全局系数矩阵组装组装全局系数矩阵的前提,必须得知道每个二阶单元与节点的映射关系。这里使用tetgen网格剖分中的-o2命令生成二阶四面体网格,如此生成的ele文件中每个单元包含10个节点的映射关系。在node文件中包含四面体4个顶点与6个边中点的所有信息。需要注意的是,本文中使用的单元10个节点的顺序为下图中“自定义节点位置顺序”,而tetgen的节点顺序是左图“tetgen节点位置顺序”,因此需要将生成的单元映射关系转化为“自定义节点位置顺序”,如此才能使得单元系数矩阵顺序与实际单元节点顺序是一致的。否则组装结果错误。例如,tetgen生成的网格单元映射关系:转化后的单元映射关系:统一映射关系后,再根据正确单元映射关系,将单元系数矩阵组装成全局系数矩阵,过程与以前介绍的组装方式基本一致(参考:最简单的一维有限元问题:求解cos函数分布)。对于第一类边界条件的加载也和以前介绍的方法一致,使用乘以大数的方法加载。需要注意的是二阶四面体对应的边界面也是二阶三角形,因此加载第一类边界的时候不仅考虑三角形顶点,同时也要考虑三角形棱边中点的加载。4.结果展示在组装好系数矩阵与右端项后,使用matlab自带求解器,求解结果。本次网格信息:四面体单元:2234,总节点个数:3847。a.首先当不考虑右端项,处理成拉普拉斯方程,边界条件在Z=0处放置0,Z=10处放置1,其他边界不进行处理。数值模拟的结果与理论解对比:可见,从节点数据对比与三维插值结果显示,二阶基函数有限元的整个流程与系数矩阵均是正确的。b.加入右端项,将边界条件全部以乘以大数的方法置零,求解泊松方程。下图为2阶基函数有限元的泊松方程结果,网格量2234,节点3847:下图为1阶基函数有限元的泊松方程结果,网格单元2234,节点593,参考:三维非结构化有限元实现-possion方程。可见,同等网格单元量,使用2阶四面体网格,得到的结果明显要比1阶的精度更高,结果更加光滑。耗时也仅仅花费了4.6s时间。5.总结1.二阶插值基函数有限元的关键在于基函数与单元系数矩阵,在这过程中一定要保证四面体单元的节点顺序与基函数定义的顺序一致。如此才能保证组装的过程是正确的。2.系数矩阵的推导看似繁琐众多,实际其中有规律可循,在检查最终的系数矩阵的时候,也可以通过隐藏在其间的规律查找问题。来源:实践有限元

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