liangzulin / abaqus_pycharm

allow pycharm IDE check types and run abaqus python program
GNU Affero General Public License v3.0
93 stars 36 forks source link

关于后处理的问题 #2

Open AlbertLinstan opened 5 years ago

AlbertLinstan commented 5 years ago

你好,我觉得您的项目非常的实用,但是我在做后处理遇到了问题,from odbAccess import *,您的项目中貌似没有这些模块,初入有限元,本来准备在abaqus中写一个调试脚本的插件,看到您的项目我就放弃了,希望能了解您的思路。

liangzulin commented 5 years ago

您好,非常感谢您的提问。不知道有没有关于odbAccess使用的样例代码,或者可以的话,提供下您遇到问题的源程序。我将挨个将odbAccess包中的接口和函数进行实现。

AlbertLinstan commented 5 years ago

你好,以下是我做的一个小例子:

-- coding: mbcs --

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

==============Material read and write=======================

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()

==============Mesh information read=======================

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:

-- coding: mbcs --

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

==============block1=======================

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()

==============block2=======================

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()

==============block3=======================

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()

==============block4=======================

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中第一个对象信息

==============block5=======================

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

==============block5=======================

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:

-- coding: mbcs --

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:

-- coding: mbcs --

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:

-- coding: mbcs --

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:】

AlbertLinstan commented 5 years ago

算例7:

-- coding: mbcs --

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()

liangzulin commented 5 years ago

您好,已经在import_files文件夹添加了以下库,试试看考进site-packages后能不能运行:

odbAccess.py
odbMaterial.py
odbSection.py
AlbertLinstan commented 5 years ago

非常感谢您,我试用一下。