目录
写在前面
接上一篇文章,通过Abaqus+python提取残余应力S11的方法!今天又有新的方法,可能这是很常用的方法,但是我现在才发现。
先来看一张效果图:
这是可能会用的的Abaqus python接口
代码
def getS11(self,step="Step-1",frame=-1,out_path=""):
# Create a txt document to store the obtained stress
with open(out_path, "w+") as fp:
elementSet = self.odb.rootAssembly.elementSets['SET-5']
# elemsets = self.odb.rootAssembly.instances['PART-1-1'].nodeSets["SET-1"]
Frame = self.odb.steps[step].frames[frame]
stress_field = Frame.fieldOutputs['S']
stress_field_nodset = stress_field.getSubset(region=elementSet)
fields = stress_field_nodset.getScalarField(componentLabel="S11")
for s11 in fields.values:
#S11 S22 S33 S12 S13 S23
fp.write(str("elementLabel:"+str(s11.elementLabel)+"\tS11:"+str(s11.data))+"\n")
self.s11dict[s11.elementLabel]=s11.data
self.odb.close()
return self.s11dict
elementSet = self.odb.rootAssembly.elementSets['SET-5']
过程与方法
首先我们现在Abaqus里面选择对应的单元如下图:
然后电机Element在模型里面按住Shift点击自己需要提取的单元
如图
之后保存编译->提交工作得到.odb文件以后就可以运用python代码提取S11的值
Frame = self.odb.steps[step].frames[frame]
stress_field = Frame.fieldOutputs['S']
stress_field_nodset = stress_field.getSubset(region=elementSet)
这里使用stress_field.getSubset(region=elementSet) 指定提取单元区域就可以获取应力值,但是我们要的是S11,还需要通过一下获取S11的值。
fields = stress_field_nodset.getScalarField(componentLabel="S11")
他返回值的结构是
({'baseElementType': 'C3D8R', 'conjugateData': None, 'conjugateDataDouble': 'unknown', 'data': 0.00601191446185112, 'dataDouble': 'unknown', 'elementLabel': 337, 'face': None, 'instance': 'OdbInstance object', 'integrationPoint': 1, 'inv3': None, 'localCoordSystem': None, 'localCoordSystemDouble': 'unknown', 'magnitude': None, 'maxInPlanePrincipal': None, 'maxPrincipal': None, 'midPrincipal': None, 'minInPlanePrincipal': None, 'minPrincipal': None, 'mises': None, 'nodeLabel': None, 'outOfPlanePrincipal': None, 'position': INTEGRATION_POINT, 'precision': SINGLE_PRECISION, 'press': None, 'sectionPoint': None, 'tresca': None, 'type': SCALAR})
这里我们可能用到的就是'data'和‘elementLable’。
总结
通过以上方法获取S11值会比较方便但是前提是,单元不变就是网格不发生改变!相比上一篇文章,这个方法就方便多了!