有限元自学教程(有限元思路)

生活常识 2023-04-18 20:12生活常识www.baidianfengw.cn

有限元分析是什么意思 有限元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、结论

自己动手丰衣足食。

有限元思路 有限元简单实例

Copyright@2015-2025 白癜风网版板所有