PhiPsi-高性能有限元程序
大家好,本期木木给大家分享一个计算性能十分强悍的有限元求解器——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)
对于更大模型的测试,读者感兴趣的话也可以自行测试,我的个人笔记本过于老旧,内存也太小,不太方便。不过对于模型数目越大的情况下,并行计算的优势也会体现的越明显!
对于PPV的使用,我会录制一期专门的视频去讲,本次只做案例分享。对PhiPsi感兴趣的小伙伴可进入(http://phipsi.top)发现新世界的大门~