“KeyError: 0”弹出来,是在odb里用nodeSet或者elementSet取点的时候名字对不上,abaqus的Python接口不会自动补全名字,set名字大小写敏感,必须先print(odb.rootAssembly.instances.keys())和print(odb.rootAssembly.nodeSets.keys())看清楚实际有什么,再往脚本里填。
取任意点坐标两种方式,一种是用getByBoundingBox(xMin,yMin,zMin,xMax,yMax,zMax,tolerance),给一个很小的包围盒把那个点框出来,返回的是nodeList和elementList,另一种是用getClosest(coordinates=(x,y,z), searchTolerance=0.5),返回最近的节点和单元,坐标用全局坐标系,如果模型有instance,先找到instance再调这个方法,不然是从rootAssembly里找,根装配下面没有节点,返回空。
应力应变数据在field output里,取法跟坐标不一样,不能直接按节点取,因为应力是积分点上的量,要先找到单元,再找积分点,再找截面点。elementLabel从elementList里拿,integrationPoint一般从1开始数,sectionPoint对壳单元和实体单元不一样,实体只有一个截面点,壳有几个,每个截面的应力都不一样,不指定的话默认是第一个,脚本里写成element.getIntegrationPointData('S', integrationPoint, sectionPoint),返回的是该积分点的应力张量,六个分量S11 S22 S33 S12 S13 S23。

取应变把'S'换成'E'或者'LE',E是小应变,LE是对数应变,大变形用LE,小变形用E,别混,弹塑性分析里塑性应变是PE,跟总应变E不一样,要区分清楚,PE是塑性部分,E是弹性加塑性,PEEQ是等效塑性应变,一个标量,看屈服区用PEEQ更直观。
插值到节点上,abaqus有个自带的工具叫fieldOutput.getSubset()配合node,但更直接的做法是用odbAccess里的FieldOutput,先getSubset(region=nodeSet)把那个节点的数据抽出来,如果节点在单元角点上,直接就有值,如果节点不在角点上,abaqus会自动从积分点外推到节点,这个外推是内置的,不用自己写,结果在odb里显示的就是节点应力。
批量提取多个点,把坐标写进一个csv或者txt,每行一个xyz,python里循环读,每个点调getClosest拿到节点和单元,再提取S和E,存到一个字典里,最后统一写到一个csv,列名用point_id x y z S11 S22 S33 S12 S13 S23 E11 E22...,写的时候用python的csv模块,别忘了import csv和import odbAccess,脚本放在abaqus cae noGUI下跑,或者abaqus python直接跑,后者不用开CAE,快很多。
坐标系问题,odb里的坐标和应力都是全局的,如果模型有旋转或者平移,全局坐标跟你图纸上的局部坐标不一样,要么在建模时就按全局坐标建,要么在脚本里做坐标变换,变换矩阵从assembly的transform里拿,或者自己手算,旋转矩阵别写反,x' = R*x + t,R是3x3,t是3x1。
常见坑,odb还没关闭就打开会报错,用openOdb(path, readOnly=True),用完close(),路径用绝对路径,反斜杠在python里是转义字符,写成r'D:\abaqus\odb\job.odb'或者用双反斜杠,job名字别带空格,单位跟模型一致,mm-tonne-s下应力是MPa,应变无量纲,坐标是mm,导出的时候在表头写清楚单位,下次把脚本存到D:\abaqus\scripts\extract_stress.py,参数用命令行传,坐标文件路径和输出路径都从sys.argv里读,硬编码改起来麻烦。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删