Abaqus-利用python處理有多個instances的odb文件,得到inp模型數據用于前處理

        在一些情況下,odb文件中包含有多個instances,instances之間會有節點和單元是重合。很多情況下需要得到該odb模型數據,并將其導入hypermesh進行前處理。如果直接從abaqus中得到odb模型數據的inp輸入導入到hypermesh中,會有重合節點和單元報錯,然而利用python可以解決該問題。代碼參考如下:

################################################
from abaqus import *
from abaqusConstants import *
from viewerModules import *
import math
from odbAccess import *
################################################
myPath='D:/2017/model/*.odb'
datapath='D:/2017/model/'
dataoutput=datapath+'engine.inp'
odb=openOdb(path=myPath)
################################################
myassembly=odb.rootAssembly
myinstances=myassembly.instances
################################################
types=locals()
for instanceEach in myinstances.keys():
        name=instanceEach.replace('-','_')
        instanceNum.append(name)
        types['elemDic_%s'%name]={}
        types['nodeDic_%s'%name]={}
        types['nodeList_%s'%name]=[]
        for elementEach in myinstances[instanceEach].elements:
                elementType=elementEach.type       
                if 'C3D' in elementType:
                        types['nodeList_%s'%name].extend(list(elementEach.connectivity))
                        types['elemDic_%s'%name][elementEach.label]=elementEach.connectivity
        types['nodeList_%s'%name]=list(set(types['nodeList_%s'%name]))
        for nodeEach in myinstances[instanceEach].nodes:
                types['nodeDic_%s'%name][nodeEach.label]=nodeEach.coordinates        
################################################
k=0
for name in instanceNum:
        elemidMin=min(types['elemDic_%s'%name].keys())
        elemidMax=max(types['elemDic_%s'%name].keys())
        if elemidMin<k:
                for elementLabel in types['elemDic_%s'%name].keys():
                        elemnewid=elementLabel+k
                        types['elemDic_%s'%name][elemnewid]=types['elemDic_%s'%name].pop(elementLabel)
                elemidMax=max(types['elemDic_%s'%name].keys())
                k=elemidMax
        else:
                k=elemidMax
################################################
k=0
for name in instanceNum:
        nodeidMin=min(types['nodeList_%s'%name])
        nodeidMax=max(types['nodeList_%s'%name])
        if nodeidMin<k:
                for elementLabel, elementConnect in types['elemDic_%s'%name].items():
                        elementnewConnect=[]
                        for connectEach in elementConnect:
                                connectnewEach=connectEach+k
                                elementnewConnect.append(connectnewEach)
                for nodeEach in types['nodeList_%s'%name]:
                        nodesOutput[nodeEach+k]=types['nodeDic_%s'%name][nodeEach]
                nodeidMax=max(types['nodeList_%s'%name])+k
                k=nodeidMax
        else:
                for nodeEach in types['nodeList_%s'%name]:
                        nodesOutput[nodeEach]=types['nodeDic_%s'%name][nodeEach]
                k=nodeidMax
################################################
typeNum=[]
for name in instanceNum:
        for elementLabel, elementConnect in types['elemDic_%s'%name].items():
                k=len(elementConnect)
                if locals().has_key('typeList%s'%k):
                        types['typeList%s'%k][elementLabel]=elementConnect
                else:
                        types['typeList%s'%k]={}
                        typeNum.append(k)
                        types['typeList%s'%k][elementLabel]=elementConnect
################################################
outputfile=open(dataoutput,'w')
data='*NODE, NSET=NALL'
outputfile.write(str(data))
outputfile.write('\n')

for nodeLabel,nodeCoordinates in nodesOutput.items():
        data='%15u%2s%10.5f%2s%10.5f%2s%10.5f'%(nodeLabel, ',', nodeCoordinates[0], ',', nodeCoordinates[1], ',', nodeCoordinates[2])
        outputfile.write(str(data))
        outputfile.write('\n')

for typeEach in typeNum:
        data='*ELEMENT,TYPE=C3D' + str(typeEach) + ',ELSET=C3D'+str(typeEach)
        outputfile.write(str(data))
        outputfile.write('\n')
        for elementLabel, elementconnect in types['typeList%s'%typeEach].items():
                data='%15u'%(elementLabel)
                for i in range(0,typeEach):
                        data=data + '%2s%15u'%(',', elementconnect[i])
                outputfile.write(str(data))
                outputfile.write('\n')

outputfile.close()
################################################

該代碼用于導出odb模型數據的所有的3D單元及相關的節點。


登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

2
2