大家好,本期木木给大家分享一个计算性能十分强悍的有限元求解器——PhiPsi,有关PhiPsi程序更详细的功能介绍,可以点击历史推文:开源XFEM程序:PhiPsi介绍。
最近,PhiPsi结合了PyQt5,形成了一个软件的界面形式PPView:
<<< 左右滑动见更多 >>>
软件的使用,相比于前期版本的使用方法要方便很多,只需鼠标点点点,即可完成数据读取、内核计算、后处理自定义显示,作为有限元宝藏up主,怎么可能不整点花活儿呢~
在体验完XFEM的一些功能后,我就又回到了有限元求解上,网上都说Fortran计算效率高,我倒要看看到底有多高,拿一个164万个C3D8单元有限元模型作测试,对比一下Abaqus的计算速度与PhiPsi的计算速度!
底部约束所有的自由度,顶部施加向上的压力,简单的拉伸模型:
Abaqus采用迭代解6线程并行计算
<<< 左右滑动见更多 >>>
PhiPsi采共享内存并行计算技术:OpenMP,6线程并行计算,在刚度矩阵的求解上采用了EBE-PCG预处理迭代求解技术,相关理论可参考《有限元方法编程(第五版)》P55。
场变量均只输出节点位移,PhiPsi的结果文件按照二进制格式输出。
Abaqus共使用5分42秒
PhiPsi共使用298秒,也就是4分58秒,比Abaqus快了44秒
Abaqus的节点位移最大为:
0.0162334625623317
PhiPsi节点位移最大为:
0.016423374759488234
吻合度98.83%,精度可以接受。
对于查看Abaqus模型中场边量的最大值,可以在cae中进行查看:
小数点后面最大可以保留九位,对于上文提及的0.0162334625623317是怎么得到的呢?
有限元UP主又可以开始整活儿了!直接来一个python脚本,自定义程度极高,想查看什么就查看什么,相对数据怎么操作就怎么操作,想转换什么数据格式就转换...好了进入正题!
# -*-coding:UTF-8-*-
from odbAccess import *
from math import sqrt
# 打开ODB文件
odbName = session.viewports[session.currentViewportName].odbDisplay.name
odb = session.odbs[odbName]
assembly = odb.rootAssembly
# 打印所有节点集的名称
print("All node sets in the model:")
for nodeSetName in assembly.nodeSets.keys():
print(nodeSetName)
# 选择步骤和增量
stepName = 'Step-1' # 替换为你的实际步骤名称
lastFrame = odb.steps[stepName].frames[-1]
# 初始化最大位移合量变量
maxDisplacementMagnitude = 0
# 遍历所有节点
# 我将顶面节点设置为set-up
for node in assembly.nodeSets['SET-UP'].nodes[0]:
# 获取节点的位移输出(这里假设输出变量为U,即位移)
displacement = lastFrame.fieldOutputs['U'].getSubset(region=node).values[0]
# 计算位移合量
displacementMagnitude = sqrt(displacement.data[0]**2 + displacement.data[1]**2 + displacement.data[2]**2)
# 更新最大位移合量
if displacementMagnitude > maxDisplacementMagnitude:
maxDisplacementMagnitude = displacementMagnitude
# 输出最大位移合量
print('Maximum displacement magnitude is:', maxDisplacementMagnitude)
对于更大模型的测试,读者感兴趣的话也可以自行测试,我的个人笔记本过于老旧,内存也太小,不太方便。不过对于模型数目越大的情况下,并行计算的优势也会体现的越明显!