Open AlbertLinstan opened 5 years ago
您好,非常感谢您的提问。不知道有没有关于odbAccess使用的样例代码,或者可以的话,提供下您遇到问题的源程序。我将挨个将odbAccess包中的接口和函数进行实现。
你好,以下是我做的一个小例子:
import os, sys, json from odbAccess import from abaqusConstants import
class OpenOdb(object):
def __init__(self):
self.data_dir = 'E:/Study_Learn/ABAQUS/2019-04-12/data/rf_data'
self.work_dir = 'E:/Study_Learn/ABAQUS/2019-04-12'
def get_odb_paths(self):
dr = self.work_dir
ls = []
for root, d, f in os.walk(top=dr, topdown=False):
if root == dr:
for file in f:
file_name, extension = os.path.splitext(file)
if extension == '.odb':
fp = dr + '/' + file
ls.append(fp)
return ls
@staticmethod
def get_forces(odb_path):
my_odb = openOdb(path=odb_path)
all_steps = my_odb.steps
step1 = all_steps.keys()[0]
my_frame = all_steps[step1].frames[-1]
nodes_region = my_odb.rootAssembly.nodeSets[' ALL NODES']
rf_opt = my_frame.fieldOutputs['RF'].getSubset(region=nodes_region).values
rf_data = map(lambda x: [x.nodeLabel, x.data[0], x.data[1]], rf_opt)
rf_dict = {}
for i in rf_data:
rf_dict[i[0]] = {}
rf_dict[i[0]]['fx'] = str(i[1])
rf_dict[i[0]]['fy'] = str(i[2])
node_dict = {}
length = 0
ins = my_odb.rootAssembly.instances
for key in ins.keys():
for node in ins[key].nodes:
node_dict[node.label] = {}
node_dict[node.label]['x'] = str(node.coordinates[0])
node_dict[node.label]['y'] = str(node.coordinates[1])
node_dict[node.label]['z'] = str(node.coordinates[2])
if length < node.coordinates[1]:
length = node.coordinates[1]
my_odb.close()
return rf_dict, node_dict, length
@staticmethod
def calculate_data(rf_dict, node_dict, length):
orther = {}
rf = 0
for i in rf_dict.keys():
if node_dict[i] == -50:
rf += rf_dict[i][0]
else:
orther[i] = rf_dict[i]
def get_data(self):
odb_ls = self.get_odb_paths()
if not os.path.exists(self.data_dir):
os.makedirs(self.data_dir)
for p in odb_ls:
f_dir, f_name = os.path.split(p)
name, extension = os.path.splitext(f_name)
if name[0] == 'E':
rf_dict, node_dict, length = self.get_forces(p)
with open(self.data_dir+'/rf_data-' + name + '.txt', 'w') as f:
f.write(json.dumps(rf_dict))
f.close()
with open(self.data_dir+'/node_dict-' + name + '.txt', 'w') as f:
f.write(json.dumps(node_dict))
f.close()
if name == 'main': open_odb = OpenOdb() open_odb.get_data()
还有我的参考书上过于都处理的一些源码供您参考: 算例1:# -- coding: mbcs -- from odbAccess import from abaqusConstants import
o = session.openOdb(name='HertzContact.odb', readOnly=False) m = o.materials m0 = m['STEEL'] print m0.name, m0.density.table, m0.elastic.table, m0.elastic.type m1 = o.Material(name='NewSteel') m1.Density(table=m0.density.table) m1.Elastic(table=m0.elastic.table, type=m0.elastic.type) o.save()
o = session.openOdb(name='HertzContact.odb', readOnly=False) p = o.parts p1 = p['BASE'] print len(p1.nodes)
a = o.rootAssembly i = a.instances print i
ia = i['ASSEMBLY'] na = ia.nodes print len(na) na0_coord = na[0].coordinates na0_label = na[0].label na0_instance = na[0].instanceName
ib = i['BASE-1'] nb = ib.nodes print len(nb) eb = ib.elements print len(eb)
nb0_coord = nb[0].coordinates nb0_label = nb[0].label nb0_instance = nb[0].instanceName 算例2:
import os, os.path, sys from odbAccess import from abaqusConstants import def extractNodes(odbname, tname, tpath=None): if tpath==None: tpath = os.getcwd() tname = tname + '.inp' oname = odbname+'.odb' tFile=os.path.join(tpath,tname) oPath=os.path.join(tpath,oname) f = open(tFile, 'w') o = openOdb(path=oPath) instes = o.rootAssembly.instances for key in instes.keys(): labels, xyz = [], [] for node in instes[key].nodes: labels.append(node.label) xyz.append(node.coordinates) cc = dict(zip(labels, xyz)) aa = sorted(labels) bb = [cc[item] for item in aa] f.write('*Instance '+instes[key].name+'\n') for i in range(len(aa)): tepS = str(aa[i])+', '+str(bb[i][0])+', '+str(bb[i][1])+', '+\ str(bb[i][2])+'\n' f.write(tepS) f.close() o.close()
if name=="main": extractNodes(odbname='HertzContact', tname='hertzcontact') 算例3: -- coding: mbcs -- from odbAccess import from abaqusConstants import
o = session.openOdb(name='myJob.odb', readOnly=False) a = o.rootAssembly ns = a.nodeSets es = a.elementSets nsX = ns['SETX'] nsXnodes = nsX.nodes print len(nsX.nodes) print nsX.nodes[0][0].instanceName print nsX.nodes[1][0].instanceName print nsX.nodes[2][0].instanceName o.close()
o = session.openOdb(name='myJob.odb', readOnly=False) instes = o.rootAssembly.instances print instes inst1 = instes['PART-1-1'] inst2 = instes['PART-1-2'] inst3 = instes['PART-2-1'] nodes1 = inst1.nodes[1:10] nodes2 = inst2.nodes[1:10] nodes3 = inst3.nodes[1:10] setOnInstance = inst1.NodeSet(name='setOnInst1', nodes=nodes1) setOnAssembly = o.rootAssembly.NodeSet(name='setOnAssembly', nodes=(nodes1,nodes2,nodes3)) o.close()
o = session.openOdb(name='myJob.odb', readOnly=False) setFromLabel = o.rootAssembly.NodeSetFromNodeLabels(name = 'setFromLabel', nodeLabels = (('PART-1-1', (1,3,5,7,9)),('PART-1-2',(1,3,5,7,9)))) o.close() o = session.openOdb(name='myJob.odb', readOnly=False) session.viewports['Viewport: 1'].setValues(displayedObject=o) o.close()
from textRepr import *#为了使用prettyPrint()函数 o = session.openOdb(name='myJob.odb', readOnly=False) session.viewports['Viewport: 1'].setValues(displayedObject=o) steps = o.steps print steps step = steps['myStep1']
print len(frames) f1 = frames[0] #从frames列表中取第一个OdbFrame对象 f2 = step.getFrame(frameValue=0.0) #利用函数获得帧特征为0.0的OdbFrame对象 f1==f2 prettyPrint(f1) HR = step.historyRegions #HR为仓库类型 prettyPrint(HR[HR.keys()[0]])#打印仓库HR中第一个对象信息
from textRepr import *#为了使用prettyPrint()函数 o = session.openOdb(name='myJob.odb', readOnly=False) session.viewports['Viewport: 1'].setValues(displayedObject=o) steps = o.steps frames = steps['myStep1'].frames f1 = frames[-1] fop = f1.fieldOutputs #获得OdbFrame对象中存储结果的仓库fieldOutput prettyPrint(fop)#当前仓库中存储的两类输出量:位移场U和应力场S fopS = fop['S']#FieldOutput对象应力场变量 fopU = fop['U']#FieldOutput对象位移场变量 prettyPrint(fopS.locations[0])#locations为记录数据依附点的FieldLocation对象序列 prettyPrint(fopU.locations[0]) prettyPrint(fopS.values[0])#foS.values为场变量数据值FieldValue对象序列 print fopS.values[0].mises print fopS.values[0].magnitude print fopU.values[0].magnitude print fopU.values[0].mises
setX=o.rootAssembly.nodeSets['SETX'] print len(setX.nodes[0])+len(setX.nodes[1])+len(setX.nodes[2]) fopUFromSet = fopU.getSubset(region=setX)#获得SETX集合处的结果数据对象 print len(fopUFromSet.values) fopSFromSet = fopS.getSubset(region=setX) print len(fopSFromSet.values) setXE = o.rootAssembly.elementSets['SETX'] print len(setXE.elements[0])+len(setXE.elements[1])+len(setXE.elements[2]) fopSFromSet = fopS.getSubset(region=setXE) print len(fopSFromSet.values) inst1 = o.rootAssembly.instances['PART-1-1'] ele1 = inst1.getElementFromLabel(label=30)#取得Part-1-1中编号为30的单元 fopSFromEle = fopS.getSubset(region=ele1)#获得这一个单元的数据结果 prettyPrint(fopSFromEle.values[0]) 算例4:
import os, os.path, sys from odbAccess import * elementL = 644 instanceL = 'PART-2-1' times, stress = [], [] o = openOdb(path='myJob.odb', readOnly=False) inst = o.rootAssembly.instances[instanceL] ele = inst.getElementFromLabel(label=elementL) frames = o.steps['myStep1'].frames for frame in frames: times.append(frame.frameValue) fopS = frame.fieldOutputs['S'] fopSFromEle = fopS.getSubset(region=ele) stress.append(fopSFromEle.values[0].mises) o.close() stressData = zip(times,stress) plotData = session.XYData(data=stressData,name='Stress at element 644', xValuesLabel='Time s',yValuesLabel='Stress Mpa') stressCurve = session.Curve(xyData=plotData) stressPlot = session.XYPlot(name='Stress Plot') stressPlot.title.setValues(text='Stress at element 644') chartName = stressPlot.charts.keys()[0] chart = stressPlot.charts[chartName] chart.setValues(curvesToPlot=(stressCurve,), ) chart.gridArea.style.setValues(color='White') chart.legend.area.style.setValues(color='Gray') myViewport = session.Viewport(name='myViewport',border=OFF, titleBar=OFF,titleStyle=CUSTOM) myViewport.setValues(width=120,height=80,origin=(0,-20)) myViewport.setValues(displayedObject=stressPlot) session.printToFile(fileName='stressPlot', format=PNG, canvasObjects=( myViewport, )) 算例5:
import os, os.path, sys from odbAccess import from abaqusConstants import
o = openOdb(path='HertzContact.odb', readOnly=False) insts = o.rootAssembly.instances inst1 = insts['BASE-1'] ele1 = inst1.elements frame = o.steps['Contact'].frames[-1] fopDIY = frame.FieldOutput(name='DIY',description='stress triaxiality', type=SCALAR) fopS = frame.fieldOutputs['S'] for ele in ele1: SFromEle = fopS.getSubset(region=ele).values[0] temp = SFromEle.press/SFromEle.mises if SFromEle.mises>1.0 else 0.0 fopDIY.addData(position=CENTROID, instance=inst1, labels=[ele.label,], data=((temp,),)) o.close() 算例6:
import os, os.path, sys from odbAccess import from abaqusConstants import
o = openOdb(path='HertzContact.odb', readOnly=False) a = o.rootAssembly insts = a.instances inst1 = insts['BASE-1'] ele1 = inst1.elements eleLabel1 = [ele.label for ele in ele1] if a.elementSets.has_key('eleSet1'): eleSet1 = a.elementSets['eleSet1'] else: eleSet1 = a.ElementSet(name='eleSet1', elements=(ele1,)) frame = o.steps['Contact'].frames[-1] fopDIY = frame.FieldOutput(name='DIY',description='stress triaxiality', type=SCALAR) fopS = frame.fieldOutputs['S'] fopSFromEle = fopS.getSubset(region=eleSet1).values ST = [(SFromEle.press/SFromEle.mises if SFromEle.mises>1.0 else 0.0,) for SFromEle in fopSFromEle] fopDIY.addData(position=CENTROID, instance=inst1, labels=eleLabel1, data=ST) o.close() 算例7:】
算例7:
from math import from odbAccess import from abaqusConstants import * name = 'BeamADeform' path = 'BeamADeform.odb' R = 50.0 fN=6 Num = 2*fN50
o = Odb(name=name, path=path) part = o.Part(name='beam', embeddedSpace=THREE_D, type=DEFORMABLE_BODY) nodeLabels = range(1, Num+1) xNode = [Rsin((node-1.0)/Num2.0pi) for node in nodeLabels] yNode = [Rcos((node-1.0)/Num2.0pi) for node in nodeLabels] zNode = [0.0 for node in nodeLabels] nodeData = zip(nodeLabels, xNode, yNode, zNode) part.addNodes(nodeData=nodeData, nodeSetName='beamPart') nodelist1 = range(1, Num+1) nodelist2 = [node+1 if node<Num else 1 for node in nodelist1] eleLabels = range(1, Num+1) eleData = zip(eleLabels, nodelist1, nodelist2) part.addElements(elementData=eleData, type='B31') inst = o.rootAssembly.Instance(name='beamInstance', object=part) step = o.Step(name='deform', description='Step4Deform', domain=TIME, timePeriod=1.0) for i in range(fN): dataU, dataS = [], [] base = Num/2*i for m in nodeLabels: temp = m%base/float(base)pi + m/base2.0pi dataU.append((0.0,0.0,5.0sin(temp)i)) dataS.append((5.0sin(temp)i,0.0,0.0)) frame = step.Frame(incrementNumber=i, frameValue=float(i)/(fN-1), description='Step time: '+str(float(i)/(fN-1))) fopU = frame.FieldOutput(name='U', description='Custom data', type=VECTOR, validInvariants=(MAGNITUDE,)) fopU.addData(position=NODAL, instance=inst, labels=nodeLabels,data=dataU) fopS = frame.FieldOutput(name='S', description='Custom data', type=TENSOR_3D_SURFACE, validInvariants=(MISES,)) fopS.addData(position=INTEGRATION_POINT, instance=inst, labels=eleLabels, data=dataS) o.save() o.close()
您好,已经在import_files文件夹添加了以下库,试试看考进site-packages后能不能运行:
odbAccess.py
odbMaterial.py
odbSection.py
非常感谢您,我试用一下。
你好,我觉得您的项目非常的实用,但是我在做后处理遇到了问题,from odbAccess import *,您的项目中貌似没有这些模块,初入有限元,本来准备在abaqus中写一个调试脚本的插件,看到您的项目我就放弃了,希望能了解您的思路。