运⾏python命令_sfepy:python有限元分析模块介绍-【2】从
命令⾏运⾏命令进。。。
下⾯简单介绍⼀下,采⽤sfepy进⾏有限元分析的⽅法,这⾥注意⼏点:
1、sfepy只是进⾏有限元分析计算,前道⼯序,⼏何建模是⽤其他⼯具完成,建议⽤gmesh,后⾯会撰⽂介绍,sfepy可以设置材料参数、边界条件等;
2、后道处理是调⽤mayavi来进⾏显⽰,这⼀块兼容性问题很⼤,如果不需要,可以不⽤安装,⽐如改⽤matplotlib来显⽰,或者
⽤pandas,都是很好的替换。
采⽤ sfepy进⾏分析的⽅法,可以参见官⽹:
Tutorial - SfePy 2019.2+git.02048e0e244c13d4d186df7eabe206906fdfdf84 documentation
这⾥简单说明如何从命令⾏直接运⾏(把sfepy当作⼀个⿊盒软件 来运⾏),这⾥可以⽤sfepy-run程序运⾏特定命令,对指定的problem_description_file进⾏分析,其语法是:
sfepy-run
usage: sfepy-run [command] [options] [problem_description_file]
Simple wrapper for main SfePy commands.
positional arguments:
{
extractor,
homogen,
phonon,
postproc, (后处理)
probe,
run_tests,
simple  (分析)
}
Available SfePy command(s).
options              Additional options passed directly to selected
[command].
optional arguments:
-h, --help            show this help message and exit
-v, --version        show program's version number and exit
-w, --window          use alternative (pythonw) interpreter
能运行python的软件
⼀般常⽤的命令就是simple和postproc,分别是分析计算和后处理分析。
这⾥的problem_description_file是对有限元问题的描述⽂件,下⾯以⼀个⽰例(即前⽂中的poisson_short_syntax.py)来说明⾥⾯ 的基本结构:
这个问题是来描述⼀个圆柱体(cylinder)在稳定温度场下的热传导分析,适⽤于Laplace equation来求解,使⽤到的材料参数只有⼀个:热扩散系数 。
⼏何模型⽂件在data_dir +'/meshes/sh',描述了⼀个圆柱体(并划分好了单元) ,其⽂件结构为:
MeshVersionFormatted 1  (Mesh版本)
Dimension 3              (三维)
Vertices                (下⾯是3D点坐标)
354                      (共354个点)
1.0000000000e-01
2.0000000000e-02 -1.2246063538e-18 0
1.0000000000e-01 1.8019377358e-02 8.6776747824e-03 0
1.0000000000e-01 1.2469796037e-02 1.5636629649e-02 0
....
Tetrahedra              (⽹格划分后的四⾯体)
1348                    (四⾯体个数)
29 61 46 30 6            (前⾯是四⾯体四个顶点在上⾯点列表中的序号,最后⼀个未知)
29 61 58 46 6
29 58 28 46 6
14 71 13 22 6
....
体现的cylinder如下图所⽰:
下⾯是poisson_short_syntax.py⽂件:
from __future__ import absolute_import
from sfepy import data_dir  #这⾥是获取sfepy安装的⽬录
#⼏何模型⽂件
filename_mesh = data_dir + '/meshes/sh'
#材料参数
materials = {
'coef' : ({'val' : 1.0},),  #材料的热扩散系数,⼤概是玻璃
}
#设置积分的区域,以⽅便后⾯设置边界条件
regions = {
'Omega' : 'all', # or 'cells of group 6',Omega区域:所有单元
'Gamma_Left' : ('vertices in (x < 0.00001)', 'facet'),  #左区域Γ,x<0.00001的所有⾯    'Gamma_Right' : ('vertices in (x > 0.099999)', 'facet'), #右区域Γ,x>0.099999的所有⾯
'Gamma_Right' : ('vertices in (x > 0.099999)', 'facet'), #右区域Γ,x>0.099999的所有⾯
}
#设置变量字段(加在边界条件或初始条件上的负载)的类型
#定义: <name> : (<data_type>, <shape>, <region_name>, <approx_order>)
#<name>: 类型名字
#<data_type>: 变量数值类型,可选: ‘real’ or ‘complex',或 numpy ⽀持的类型
#<shape>: 负载的维度DOF,可以是:1,2,3
#<region_name>: 这些负载作⽤在哪个区域,在上⾯的regions中定义
#<approx_order>: 近似阶数,可以是0, 1, 2, 1B(1 with Bubble)
fields = {
'temperature' : ('real', 1, 'Omega', 1),
}
#定义变量(⽤于设置边界条件或负载等)
#定义: <name> : (<kind>, <field_name>, <spec>, [<history>])
#<name>:名字
#<kind>: 变量种类,可选:'unknown field’(未知字段变量), ‘test field’(因变量) or ‘parameter field’
#<field_name>: 变量字段类型,必须在上⾯的fields中定义,
#<spec>: 指定相关,如果变量是:'unknown filed',需要指定初始值,如果是:'test field',需要指定相关变量#<history>: number of time steps to remember prior to current step
variables = {
't' : ('unknown field', 'temperature', 0),  #变量 t: ⾃变量,字段类型是上⾯的'temperature',也就是
#其维度DOF,只有1,也就是要设置或获取其值,要使⽤'t.0'这样的指定
's' : ('test field',    'temperature', 't'),  #变量s: 因变量,  相当于 s=f(t), 同样只有⼀维。
}
# Dirichlet 边界条件设置:
#定义:  <name> : (<region_name>, [<times_specification>,]
#              {<dof_specification> : <value>[,
#              <dof_specification> : <value>, ...]
#              } )
#<region_name> : 边界条件加载的区域
#<times_specification>: The times can be given either using a list of tuples (t0, t1)
#                      making the condition active for t0 <= t < t1,
#                      or by a name of a function taking the time argument and returning True or False
#                      depending on whether the condition is active at the given time or not.
#<dof_specification>: 负载的⾃由度
#<value>: 负载的值
ebcs = {
't1' : ('Gamma_Left', {'t.0' : 2.0}),
't2' : ('Gamma_Right', {'t.0' : -2.0}),
}
#定义积分类型和正交规则。
#注意,在这⾥,积分规则的名字必须以'i'开头
integrals = {
'i' : 2,  #在3维空间上的⼆阶正交
}
#设定如何设置组合项:combining term,可以有两个选择:
# Laplace equation, named integral:  dw_laplace.i.Omega( coef.val, s, t ) = 0
# Laplace equation, simplified integral given by order:
#                  dw_laplace.2.Omega( coef.val, s, t ) = 0
equations = {
'Temperature' : """dw_laplace.i.Omega( coef.val, s, t ) = 0"""
}
#设置线性和⾮线性的求解器的参数
solvers = {
'ls' : ('ls.scipy_direct', {}), #线性求解器
'newton' : ('wton',      #⾮线性求解器
{'i_max'      : 1,
'eps_a'      : 1e-10,  #误差范围
}),
}
}
#设置求解需要的线性和⾮线性求解器
options = {
'nls' : 'newton',
'ls' : 'ls',
}
上⾯的⽂件设置好后,就可以运⾏sfepy-run进⾏求解,结果会⽣成vtk⽂件,包含所需要的数据。
下⼀节,我们介绍如何通过ipython的交互式环境,来⼀步步通过API来设置并进⾏分析,并通过mayavi来查看不同的postproc的结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。