官方文档:https://sfepy.org/doc-devel/introduction.html
介绍:
是一个通过有限元法解决1D,2D,3D中的耦合偏微分方程的系统. 可以对于复杂FEM问题进行简单编码
其基于Numpy和Scipy, 是一个多平台的软件
通过Example, Gallery, Tutorial获取相关的示例. 对于高级功能, 查看Primer
示例:
使用Salome软件包配合SfePy
Salome是一个开源工具用于产生网格并将处理后的数据发出. 当前是一个示例使用Salome作为使用SfePy的预处理工具.
当前示例的前提条件是假设已经有了一个可用的Salome副本. 这个副本可以经由Salome的源文件构建而出. 而且假设已经安装了SfePy并拥有MED read支持. 相关安装参考Installation
当前示例的标记:
- <sfepy_root>: sfepy源文件的根目录
- <work_dir>: 当前的运行目录
Salome的官方文档: Salome
-
根据Salome 示例1通过点击
Export to MED file
, 将文件保存在当前目录下的Mesh_Partition_Hexa.med
文件中 -
在当前示例中, 我们认为是需要处理一个线性弹性问题, 并将这条"鱼"从头到尾进行波动. 将
sfepy
文件夹中的申明文件复制到当前文件夹<sfepy_root>/sfepy/examples/linear_elasticity/linear_elastic.py
-
修改
linear_elastic.py
文件指定的med对象:
# 将
filename_mesh = data_dir + '/meshes/3d/cylinder.mesh'
# 更改为
filename_mesh = 'Mesh_Partition_Hexa.med' # 用于指定需要进行模拟的med对象
- 范围定义: 需要定义mesh对象的合理范围. 这里我们要做的是将这条鱼的尾部设置位移限制, 并设置整条鱼的上下界
# 将
regions = {
'Omega' : 'all',
'Left' : ('vertices in (x < 0.001)', 'facet'),
'Right' : ('vertices in (x > 0.099)', 'facet'),
'SomewhereTop' : ('vertices in (z > 0.017) & (x > 0.03) & (x < 0.07)', 'vertex'),
}
# 更改为
regions = {
'Omega' : 'all',
'Tail' : ('vertices in (x < -94)', 'facet'),
'TopFixed' : ('vertices in (z > 9.999) & (x > 54)', 'facet'),
'BotFixed' : ('vertices in (z < 0.001) & (x > 54)', 'facet'),
}
- 设定字段说明: Salome的网格对象是一个六边形网格组成的对象, 通过User’s Guide查看标记的内容
# 只需要保持以下内容:
fields = {
'displacement': ('real', 'vector', 'Omega', 1),
}
- 边界条件定义: 在这部分中我们需要告诉SfePy固定"鱼头"部分的上下顶点, 并且将鱼尾以10单位/s的速度进行移动
# 更改以下内容:
ebcs = {
'Fixed' : ('Left', {'u.all' : 0.0}),
'Displaced' : ('Right', {'u.0' : 0.01, 'u.[1,2]' : 0.0}),
'PerturbedSurface' : ('SomewhereTop', {'u.2' : 0.005}),
}
# 改为以下内容:
ebcs = {
'TopFixed' : ('TopFixed', {'u.all' : 0.0}),
'BotFixed' : ('BotFixed', {'u.all' : 0.0}),
'Displaced' : ('Tail', {'u.2' : 10, 'u.[0,1]' : 0.0}),
}
-
运行模拟: 在当前运行目录中运行该目录
./simple.py linear_elastic.py
这是在运行模拟过程, 当模型的余量小到一定程度后模拟结束. 其应当只运行一次因为我们只试图解一个线性问题. 其运行结果会被存放进Mesh_Partition_Hexa.vtk
文件. -
解析结果: 通过这个命令进行结果的查看
./resview.py Mesh_Partition_Hexa.vtk -f u:wu:f2.0:p0 0:vw:p0
运行这个命令应该能获得变化或者未变化的模型的图形