首页/文章/ 详情

开源有限元框架 deal.ii

6月前浏览3084

本文摘要(由AI生成):

deal.II是一个基于C++的有限元库,广泛用于数值分析和偏微分方程求解。它包含多个组件,如Triangulation处理几何建模和网格划分,FiniteElement定义有限元空间,Quadrature用于数值积分,DoFHandler分配自由度,Mapping映射信息到实际网格,FEValues计算形函数值,Linear Systems组装刚度矩阵和等效节点力,Linear Solver求解线性系统,以及Output支持多种输出格式。虽然安装复杂,但社区支持强大,提供丰富资源帮助用户。源代码托管在GitHub,方便用户获取、报告问题和贡献代码。

官网:https://www.dealii.org/

deal.ii安装过程很麻烦,需要装个虚拟机。


deal.ii基于c++语言开发,目前活跃度较高。整体框架如图所示

1)Triangulation

Triangulation类相当于前处理的几何建模和网格划分。Triangulation存储了网格的几何和拓扑性质,如单元接触形式和顶点位置。一个triangulation对象不知道我们要在这个网格上使用的有限元的任何信息,它甚至都不知道它的单元的形状,它只知道2维时有4个面和4个顶点,三维时有6个面、12条边和8个顶点,其他信息都在映射类中定义。


2)FiniteElement

FiniteElement类用来描述定义在参考单元上的有限元空间(有限维的函数空间)的性质,比如单元的顶点、边界和内部有多少自由度,此外还给出了节点上形函数的值和梯度。


3)Quadrature

Quadrature类与FinteElement类一起,在参考单元上定义,它们仅用来描述参考单元上积分点的位置和每个积分点的权重。


4)DoFHandler

DoFHandler类是triangulation和finite elements的汇聚点:finite elements描述了每个节点、边和单元内部需要多少自由度,DoFHandler类按照finite elements对自由度的要求在triangulation的节点、边和单元内部分配自由度,并获得每个自由度的全局标识。

如同triangulation对象,DoFHandler类的大部分操作也是通过对单元进行循环来完成的,我们可以得到的信息包括:单元的几何和拓扑信息(该信息在之前通过triangulation的迭代器获得),当前单元的自由度的全局标识,从一个存储triangulation全部自由度相关联的值的数据向量中提取当前单元的自由度相关联的值。

DoFHandler类也不知道从参考单元到实际单元的映射的任何信息,它也不知道它管理的自由度的形函数的信息,它只知道每个节点、每条边、每个单元内部有多少自由度


5)Mapping

当我们需要计算矩阵和右端项的元素或每一个triangulation单元上的某个值时,我们需要知道实际单元上的有限元形函数和积分公式的积分点位置(finite elements对象提供形函数值和梯度等信息,quadrature对象提供积分公式、积分点位置和积分点权重,但是这些信息都是定义在参考单元上的;通过mapping类,将参考单元上的这些信息映射到实际的triangulation单元上),通过Mapping类及其派生类将参考单元的诸多信息映射到实际单元。


6)FEValues

FEValues类计算单元上积分点处的形函数的值和梯度、散度等其他信息。当我们计算在一个单元上的积分时,我们实际上是用近似的求积公式来代替积分,因此我们只需要知道单元区域的有限个点的位置的形函数值、梯度即可。FEValues就提供这些信息:给定有限元、积分信息和映射,FEValues类计算"the restriction of a continuous function space"。


7)Linear Systems

类似于组装刚度矩阵以及等效节点力向量。


8)Linear Solver

使用求解器来求解有限维的线性系统。FEM中,通常是用迭代法来求解矩阵方程。当然deal.II也提供了矩阵方程直接求解器或稀疏矩阵直接求解器。


9)Output

输出结果及后处理。deal.II没有直接将结果进行后处理的功能,但是它提供了多种计算结果输出格式,可以用多种可视化软件进行可视化处理。



来源:数值分析与有限元编程
System
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:6月前
太白金星
本科 慢慢来
获赞 5粉丝 8文章 318课程 0
点赞
收藏
作者推荐

Fortran如何实现矩阵与向量的乘法运算

本文摘要(由AI生成):矩阵为二维数组,向量乃一维数组,Fortran中matmul函数无法直接实现两者的乘法。然而,Fortran提供了多种方法解决此问题。一是将向量视作矩阵的退化形式,如将a(3)视为a(3,1)或a(1,3),进而用matmul运算。二是利用spread函数将一维数组扩展为二维数组,再通过matmul进行计算。此外,dot_product函数也能实现矩阵与向量的乘法,它通过对矩阵的每一行与向量进行点积运算来得出结果。程序员重复造轮子,在学习阶段有助于深入理解技术内部机制,锻炼技能,同时也是对新技术的实践应用。矩阵是二维数组,而向量是一维数组,内置函数matmul不能实现矩阵与向量的乘法运算。在这一点Fortran不如matlab灵活。Fortran如何实现矩阵与向量的乘法运算,现有以下三种方法供参考。一)将一维数组看作二维数组的退化形式,比如a(3)可以看作a(3,1)或者a(1,3),这样就可以用matmul函数计算了。二)用spread函数将一维数组扩展成二维数组,同样可用matmul函数计算。来看过程。数组c的第一列就是需要的计算结果。spread(B,2,2)就是按列扩展,成为二维数组三)利用dot_product函数。dot_product函数是向量点积运算函数,可将二维数组的每一行抽取出来,和一维数组作dot_product运算。程序员为什么会重复造轮子?现在的软件发展趋势,越来越多的基础服务能够“开箱即用”、“拿来用就好”,越来越多的新软件可以通过组合已有类库、服务以搭积木的方式完成。这是趋势,将来不懂开发语言的人都可以通过利用现有软件组件快速构建出能解决实际问题的软件产品。对程序员来讲,在一开始的学习成长阶段,造轮子则具有特殊的学习意义,学习别人怎么造,了解内部机理,自己造造看,这是非常好的锻炼。每次学习新技术都可以用这种方式来练习。来源:数值分析与有限元编程

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