有限元自学教程(有限元思路)
有限元分析是什么意思 有限元DIY看看我亲自写的有限元程序
导读DinoFem,我自己维护的代码,目前已经的求解器,有
泊松方程求解器
热方程求解器
最近国产CAE软件,风声四起。大家都关注,如何才能有我们自己国产的纯自主的有限元分析软件。
这件事我准备好几年了。从1D的到现在,居然耽搁了有3年的时间。最近,去看了comsol的计算性能,让我又燃起了自己写我的DinoFem的热情。
我的DinoFEM终于迭代到了2D的版本。
写了一个教程。
一、边界类型及定义规则
边界名称,对应 边界类型对所有边界形成的字典.在边界处理的时候,根据BN边界的index,通过boundaries_name找到边界名称,再通过边界名称在这个字典中查找边界类型
DinoFem 的边界设定,以字典形式来完成。
边界名称 对应的边界的类型及函数信息。
这个信息存储在Mesh2D类的boundary_type_dict,和boundary_value_dict两个字典中。
边界类型以BoundaryType定义
class BoundaryType(Enum): Dirichlet = -1 ZeroGradient = -2 NonZeroGradient = -3
字典设定规则如下
边界类型
数学表达
标记
值
Dirichlet
T=g
Dirichlet
g函数类型
齐次Neumann
Grad T = 0
ZeroGradient
None
非齐次Neumann
Grad T = phi
NonZeroGradient
phi函数类型
二、求解器使用案例
1、泊松方程求解
(1)求解过程
求解构造如下
该求解器使用过程
之一步导入需要使用的函数
from DinoFem2D.solvers import Laplace2DSolverfrom math import exp, sin, cos, pifrom DinoFem2D.FeBase import Mesh2Dfrom DinoFem2D.postprocess import post_meshfrom DinoFem2D import BdyType
第二步定义需要使用的函数,这里主要是,c(x),f(x)和g函数
def solution(x,y): return sin(2pix)cos(2piy)def ceo_fun(x,y): return 1def force_fun(x, y): return 8pi2sin(2pix)cos(2piy)def g(x, y): return solution(x, y)
第三步 进行计算,连接计算过程
def run(inp_file, ceo_fun, force_fun): # ------ # 生成网格 # -------- pt = Mesh2D() pt.get_pt_from_inp(inp_file) # ----------- # 设定边界条件 # 边界条件与边界值,是对应的。 # ------------ pt.set_boundary(#34bottom#34, BdyType.ZeroGradient) pt.set_boundary(#34left#34, BdyType.Dirichlet, g) pt.set_boundary(#34right#34, BdyType.Dirichlet, g) pt.set_boundary(#34up#34, BdyType.Dirichlet, g) # ----------------------------------- # 求解器输入网格,方程系数,外力函数和边界函数 # ------------------------------------ fem = Laplace2DSolver(pt=pt, load_fun=force_fun, coe_fun=ceo_fun, # 方程的系数 ) # 求解 fem.solve() # 获得解 v = fem.result # 计算误差 error = [abs(v[i] - solution(pt.P[i][0], pt.P[i][1])) for i in range(pt.number_of_nodes)] return post_mesh(inp_file=inp_file,result=v,error=error)
该部分,也分成三部分
Step1创建网格文件,这里直接从inp文件读取
# ------ # 生成网格 # -------- pt = Mesh2D() pt.get_pt_from_inp(inp_file)
Step2:创建求解实例,导入系数和参数,并求解
# ----------------------------------- # 求解器输入网格,方程系数,外力函数和边界函数 # ------------------------------------ fem = Laplace2DSolver(pt=pt, load_fun=force_fun, coe_fun=ceo_fun, # 方程的系数 ) # 求解 fem.solve()
Step3为求解后处理,准备数据,生成数据
# 获得解 v = fem.result # 计算误差 error = [abs(v[i] - solution(pt.P[i][0], pt.P[i][1])) for i in range(pt.number_of_nodes)] return post_mesh(inp_file=inp_file,result=v,error=error)
(2)后处理
本案例,是一个谐波函数的解。
可视化后的解结构,如下图。
误差,是直接的绝对误差,如下图
可以看到误差在0.01左右。
2、热方程 案例一(自定义网格)
本算法,暂时只支持c与时间无关的情况。
(1)求解过程
,定义基本系数
第二步,生成网格
这个网格生成,由于是矩形,所以,直接手动剖分的网格。
第三步设定边界条件
第四步,求解及文件存储
(2)后处理
使用paraview可进行后处理
可通过paraview完成动画演示。
3、热方程 案例二(无结构网格)
(1)网格
(2)计算结果
(3)误差
从误差可以看,四个内角点是误差更大的地方。
4、结论
自己动手丰衣足食。
有限元思路 有限元简单实例