龔亞飛,李旭東,何 玲
(蘭州理工大學(xué) 省部共建有色金屬先進加工與再利用國家重點實驗室,甘肅 蘭州 730050)
?
ABAQUS二次開發(fā)在變形幾何模型重構(gòu)中的應(yīng)用
龔亞飛,李旭東,何玲
(蘭州理工大學(xué) 省部共建有色金屬先進加工與再利用國家重點實驗室,甘肅 蘭州730050)
摘要為了實現(xiàn)變形幾何模型的重構(gòu),通過在ABAQUS平臺的Python腳本的二次開發(fā),訪問ABAQUS的結(jié)果輸出數(shù)據(jù)庫(ODB),讀取ODB對象的數(shù)據(jù),通過相應(yīng)的計算獲取建模需要的數(shù)據(jù)。在此基礎(chǔ)上,編寫腳本程序,重新構(gòu)建出變形后的幾何模型,并且實現(xiàn)了幾何模型構(gòu)建過程的可視化,從而為后續(xù)的多載荷分析奠定了基礎(chǔ),同時也為不規(guī)則幾何模型的構(gòu)建提供了一種新的思路。
關(guān)鍵詞多載荷;二次開發(fā);幾何模型重構(gòu);可視化
當(dāng)今社會,隨著產(chǎn)品設(shè)計的復(fù)雜程度越來越高,工程分析的復(fù)雜程度也相應(yīng)呈現(xiàn)出加速增長的趨勢。針對這一現(xiàn)象,大型有限元分析軟件在其分析過程中的應(yīng)用越來越廣泛。有限元分析是以電子計算機為工具的一種現(xiàn)代數(shù)值計算方法[1]。而ABAQUS就是一種功能強大且通用性很強的商用工程分析有限元軟件[2],它可以解決從相對簡單的線性問題到復(fù)雜的非線性等各種工程問題。
Python語言是一門功能強大的面向?qū)ο蟮木幊陶Z言,它允許在多種平臺上編寫腳本和快速開發(fā)[3,4]。ABAQUS軟件二次開發(fā)環(huán)境提供的腳本接口就是基于Python語言進行的定制開發(fā)。對于形狀異常復(fù)雜或者特殊形狀的模型,在ABAQUS軟件或其他軟件中難以實現(xiàn)時,就可以嘗試編寫腳本來建立或修改模型[5]。
在工程分析中,有很多部件或裝配體要受到多次載荷的作用,在這種情況下,下一次載荷的作用是基于前一次載荷作用后分析的結(jié)果,而下一次載荷作用前的模型建立成為了一個難點。研究通過ABAQUS的二次開發(fā)來重新構(gòu)建施加載荷作用后的幾何模型。主要的方法是通過Python腳本程序訪問ABAQUS的輸出數(shù)據(jù)庫(ODB,output data base),獲取數(shù)據(jù)并進行計算,最終獲取建模所需要的數(shù)據(jù)信息。在此基礎(chǔ)上,編寫腳本程序,重新構(gòu)建出變形后的幾何模型,并實現(xiàn)了構(gòu)建幾何模型的可視化過程。
1ABAQUS的二次開發(fā)
1.1二次開發(fā)的意義
使用ABAQUS進行數(shù)值模擬的一般步驟是:根據(jù)所要模擬的問題類型進行建模,包括建立幾何模型、分配材料的屬性、施加載荷和邊界條件、設(shè)定分析步和劃分網(wǎng)格等;建模完成后形成輸入文件提交給ABAQUS/Standard或ABAQUS/Explicit進行計算;最后對計算完成得到的結(jié)果進行后處理[6]。后處理就是利用計算機圖形學(xué)原理對計算結(jié)果進行形象的描述和解釋,供用戶進行查看和分析。
ABAQUS后處理提供了許多功能,如云圖的顯示、模擬過程的動畫顯示、等值線的繪制以及其他的列表及曲線等。但是,還有一些功能是ABAQUS并未提供的,例如幾何體變形后的節(jié)點的坐標(biāo)信息,需要使用Python進行二次開發(fā)。
1.2二次開發(fā)實現(xiàn)的原理
對后處理的二次開發(fā),首先要讀取結(jié)果數(shù)據(jù)庫中的數(shù)據(jù),即使用Python語言通過ABAQUS腳本接口訪問ABAQUS對象中的數(shù)據(jù)。ABAQUS腳本接口即是一個基于對象的程序庫[7]。在對象創(chuàng)建后,可以使用該對象提供的方法來處理對象中的數(shù)據(jù)成員。ODB對象是結(jié)果數(shù)據(jù)庫對象,包含了模型數(shù)據(jù)和結(jié)果數(shù)據(jù),是后處理二次開發(fā)考察的重點。模型數(shù)據(jù)描述了分析匯總使用的模型,包括部件、裝配等。結(jié)果數(shù)據(jù)描述了分析得到的結(jié)果,包括步、幀、場變量輸出和歷史變量輸出等[8]。在對后處理的二次開發(fā)中,就是讀取ODB對象中的數(shù)據(jù)、進行計算等相應(yīng)的處理,然后輸出為相應(yīng)形式供用戶查看和使用。
1.3幾何重構(gòu)的原理
研究基于3D打印的思想,首先把變形后的幾何體離散成為一個個的單元,然后再分別構(gòu)建這些單元,最后再把這些單元合并起來構(gòu)建出整個變形后的幾何模型。
對于每一個單元來說,進行幾何拆解:一個單元是由面構(gòu)成,一個面是由線構(gòu)成,而線是由點構(gòu)成。在重構(gòu)的過程中,則是由點構(gòu)線,由線構(gòu)面,由面構(gòu)體。
2變形幾何體重構(gòu)的過程
2.1訪問輸出數(shù)據(jù)庫獲取數(shù)據(jù)
(1)模型建立,獲取ODB文件建立一個20 mm×20 mm×100 mm的模型,如圖1所示[9],它由兩個部件裝配而成,采用六面體網(wǎng)格技術(shù)劃分網(wǎng)格,總共的網(wǎng)格數(shù)目為46 600個。然后施加一個載荷,使其產(chǎn)生轉(zhuǎn)動,最終的效果如圖2所示。需要注意的是,在構(gòu)建模型的時候,要為每個部件都建立一個節(jié)點,目的是保證獲取的節(jié)點信息和位移信息能夠一一對應(yīng),確保最終獲取的模型變形后的節(jié)點坐標(biāo)信息是準(zhǔn)確的。
(2)獲取變形后每個節(jié)點的坐標(biāo)信息在訪問ODB的時候會進行大量數(shù)據(jù)的讀寫,數(shù)據(jù)的快速讀寫取決于計算機的軟硬件兩個方面,在現(xiàn)有硬件上提高讀寫速度,只能是優(yōu)化應(yīng)用程序和操作系統(tǒng)的API接口調(diào)用。Python語言對文件讀寫通常要對三個層次的緩存進行操作,分別是運行庫、操作系統(tǒng)和硬盤。這些緩存被設(shè)置,主要是因為在I/O操作中底層操作耗時較多,只能滿足一般小數(shù)據(jù)讀取的高速性。但是大數(shù)據(jù)量讀取寫入時,這樣的緩存設(shè)置就成為負(fù)擔(dān),需要先將數(shù)據(jù)寫入緩存再往內(nèi)存中寫入。為了跨越這個瓶頸,可以采用直接讀寫文件的方法,繞過這些緩存,從而實現(xiàn)大數(shù)據(jù)文件的快速讀入和回寫[10]。
得出分析結(jié)果后,通過訪問ODB下面的部件實例的節(jié)點集合nodeSets,就可以獲得節(jié)點對象,而該對象的成員就包含有節(jié)點的編號、節(jié)點變形前的坐標(biāo)等信息。
通過訪問ODB下面的steps對象,遍歷多個分析步和幀的位移值(U)[11],該位移對象的成員包含節(jié)點編號、位移在x,y,z三個方向上的分量。腳本主要代碼如下:
f11 = open(filename,’w’)
odb =openOdb(odb name)
sRegion=odb.rootAssembly.instances[instance_name].nodeSets[set_name]
N =sRegion.nodes
U= odb.steps.values()[-1].frames[-1].fieldOutputs['U'].getSubset(region =sRegion).values
#通過循環(huán),獲取節(jié)點的編號和變形前的坐標(biāo)信息
for i in N:
n1 = i.label
x1 = i.coordinates[0]
y1 = i.coordinates[1]
z1 = i.coordinates[2]
#通過循環(huán),獲取節(jié)點編號和變形后的位移信息
for j in U:
n2 = j.nodeLabel
x2 = j.coordinates[0]
y2 = j.coordinates[1]
z2 = j.coordinates[2]
#通過判斷,獲取節(jié)點編號和變形后的坐標(biāo)信息
if n1 == n2:
n = ‘%6d’%n1
x = ‘%20.10e’%(x1+x2)
y = ‘%20.10e’%(y1+y2)
z = ‘%20.10e’%(z1+z2)
#將信息寫入到文件里面
print >>f11,n,x,y,z
f11.close()
(3)獲取每個單元的編號及其節(jié)點編號通過訪問ODB下面的部件實例的單元集合elementSets,就可以獲得 elements對象,而該對象的成員包含有單元的編號和構(gòu)成該單元的每個節(jié)點的編號信息。主要代碼如下:
f21 = (filename,’w’)
E= odb.rootAssembly.instances[instance_name].elementSets[set_name].elements
for element in E:
print >>f21,'%8d'%element.label,
fornodeNumin element.connectivity:
print >>f21,'%8d'%nodeNum,
print >>f21,' '
f21.close()
odb.close()
(4)獲取建模需要的數(shù)據(jù)格式為了方便建模,需要將每個單元的節(jié)點信息寫入到一個列表里面。已經(jīng)獲取了變形后的節(jié)點信息和單元的信息,通過對其進行數(shù)據(jù)處理,將每個單元構(gòu)成點的節(jié)點編號替換成其變形后的坐標(biāo)信息,這樣就獲得了一個單元的建模數(shù)據(jù)。例如,一個單元由4個點構(gòu)成,列表為[1,2,3,4],其中的1,2,3,4為節(jié)點編號,通過數(shù)據(jù)處理后,變?yōu)閇(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4)],即為建模所需要的每個單元的信息。
2.2根據(jù)數(shù)據(jù)進行幾何重構(gòu)
由于之前畫網(wǎng)格時選用的網(wǎng)格技術(shù)是六面體網(wǎng)格,因此它是由八個節(jié)點、六個面構(gòu)成,每個面是由四個節(jié)點構(gòu)成。在重構(gòu)的過程中,需要確定每個面的節(jié)點信息。確定了一個面的節(jié)點信息后,由點構(gòu)線,再由線構(gòu)面。構(gòu)建好每一個面后,再通過ABAQUS中合并功能,將這些面合并成為一個殼體,然后將這個殼體填充構(gòu)建好一個實體單元。通過循環(huán),將所有的單元構(gòu)建出來,最后再合并成為一個實體,那么整個幾何體就重構(gòu)出來了。
(1)獲取每個面的節(jié)點信息主要代碼如下:
Df1 = (list[0],list[1],list[2],list[3],list[0])
Df2 = (list[0],list[4],list[7],list[3],list[0])
Df3 = (list[3],list[7],list[6],list[2],list[3])
Df4 = (list[2],list[6],list[5],list[1],list[2])
Df5 = (list[0],list[4],list[5],list[1],list[0])
Df6 = (list[4],list[5],list[6],list[7],list[4])
Dfs = [Df1,Df2,Df3,Df4,Df5,Df6]
del Df1,Df2,Df3,Df4,Df5,Df6
其中:list表示的是構(gòu)成每個單元的節(jié)點信息的列表,它總共由8個節(jié)點構(gòu)成;Df1,Df2,Df3,Df4,Df5,Df6表示的是每個面的節(jié)點的數(shù)據(jù)信息,而Dfs表示的是每個單元的所有面的數(shù)據(jù)信息,這樣就可以通過循環(huán)快速地構(gòu)建每個面。然后刪除每個面的數(shù)據(jù)信息,這樣可以減少內(nèi)存的使用,提高建模的效率。
(2)由點構(gòu)線,由線構(gòu)面主要代碼如下:
k1 = 1
for Df in Dfs:
facename = 'face-'+str(k1)
faceNameSet+=(facename,)
p1=
mdb.models['Model-1'].Part(name=facename,dimensionality=THREE_D,type=DEFORMABLE_BODY)
p1= mdb.models['Model-1'].parts[facename]
p1.ConvertToPrecise()
p1.WirePolyLine(Df)
p1.CoverEdges(p1.edges[:],
tryAnalytical= TRUE)
k1+= 1
其中:Df表示每個面的節(jié)點數(shù)據(jù)信息。命令p1.WirePolyLine(Df)就是將節(jié)點連接起來構(gòu)成一個封閉的線框,此線框就是該面的邊界。命令p1.CoverEdges(p1.edges[:],tryAnalytical= TRUE)就是由那些構(gòu)成線框的所有線生成一個面。這樣,通過循環(huán)就可以構(gòu)建出每個單元的所有面。
(3)由面構(gòu)體主要代碼如下:
cellname='Cell-'+str(k)
a = mdb.models['Model-1'].rootAssembly
a.PartFromBooleanMerge(domain = GEOMETRY,instances =faceInstanceSet,name = cellname)
p = mdb.models['Model-1'].parts[cellname]
p.AddCells(p.faces)
其中:faceInstanceSet表示的是一個單元所有面的部件實例的集合,此處即為6個面的部件實例的集合。命令PartFromBooleanMerge(domain = GEOMETRY,instances =faceInstanceSet,name = cellname)就是將所有的面合并成為一個殼體。命令p.AddCells(p.faces)就是將合并好的殼體填充成為一個實體部件[12]。這樣一個單元的實體部件就構(gòu)建好了。
通過循環(huán),獲取一個單元的信息就構(gòu)建一個實體部件,直到最后一個單元構(gòu)建完成,整個幾何體的輪廓就產(chǎn)生了,然后把所有的實體部件合并成為一個新的實體部件。該部件是由很多個小部件合并而成,所以在它的表面會有很多個小面。由于這些小面的存在,與實際的幾何體不符,故需要將每個面輪廓上的小面都修復(fù)成一個大面。只有把所有面輪廓上的小面都修復(fù)完畢,整個幾何體的構(gòu)建才算完成。
(4)結(jié)果展示兩個部件的構(gòu)建原理是一樣的,部件1重構(gòu)過程的可視化如圖3所示。部件2重構(gòu)過程的可視化如圖4所示。兩個部件分別合并完成后,可以看到它們表面有許多小面。通過修復(fù),將這些小面合并成一個輪廓面,這樣,幾何模型的重構(gòu)就完成了,如圖5所示。
3結(jié)論
通過ABAQUS的二次開發(fā),實現(xiàn)了變形幾何模型的重構(gòu),并且實現(xiàn)了可視化。得到以下幾點結(jié)論:
(1)通過Python腳本訪問ABAQUS的輸出數(shù)據(jù)庫,可以獲取從該軟件不能直接獲取的結(jié)果數(shù)據(jù)。此方法補充了ABAQUS/CAE的功能,擴展了其應(yīng)用;
(2)實現(xiàn)了變形的、不規(guī)則幾何體在ABAQUS的前處理中的自動建模過程,并且做到了可視化,說明此方法是正確的。這也為構(gòu)建其他不規(guī)則幾何體模型提供了一種新的思路。
參考文獻(xiàn):
[1]楊利花,楊世強.現(xiàn)代設(shè)計方法及其發(fā)展趨勢[J].甘肅科學(xué)學(xué)報,2004,16(2):111-114.
[2]石亦平,周玉蓉.ABAQUS有限元分析實例詳解[M].北京:機械工業(yè)出版社,2006.
[3]鐘同圣,衛(wèi)豐,王鷙,等.Python語言和ABAQUS前處理二次開發(fā)[J].鄭州大學(xué)學(xué)報:理學(xué)版,2006,38(1):60-64.
[4]鮑榮浩,盧文浩.ABAQUS前處理程序二次開發(fā)在蜂窩材料中的應(yīng)用[J].工程設(shè)計學(xué)報,2003,10(6):330-333.
[5]曹金鳳,王旭春,孔亮.Python語言在ABAQUS中的應(yīng)用[M].北京:機械工業(yè)出版社,2011.
[6]連昌偉,王兆遠(yuǎn),杜傳軍,等.ABAQUS后處理二次開發(fā)在塑性成形模擬中的應(yīng)用[J].鍛壓技術(shù),2006,31(4):111-114.
[7]滕軍,張何,李祚華.ABAQUS后處理二次開發(fā)在結(jié)構(gòu)彈塑性分析中的應(yīng)用[J].防災(zāi)減災(zāi)工程學(xué)報,2013,33(S1):9-14.
[8]張強,馬永,李四超.基于Python的ABAQUS二次開發(fā)方法與應(yīng)用[J].艦船電子工程,2011,31(2):131-134.
[9]俞樹榮,嚴(yán)志剛,曹睿,等.有限元軟件模擬裂紋擴展的方法探討[J].甘肅科學(xué)學(xué)報,2003,15(4):15-21.
[10]張龍,李旭東,郭德昌.3D打印過程的計算機仿真[J].計算機仿真,2014,31(8):226-229.
[11]ABAQUS Inc.ABAQUS Scripting User’s Manual.Version6.10[M].Pawtucket:ABAQUS Inc,2010.
[12]ABAQUS Inc.ABAQUS Scripting Reference Manual.Version6.10[M].Pawtuckt:ABAQUS Inc,2010.
Application of Secondary Development of ABAQUS in Geometric Deformable Model Reconstruction
Gong Yafei,Li Xudong,He Ling
(State Key Laboratory of Advanced Processing and Recycling of Nonferrous Metals,Lanzhou University of Technology,Lanzhou 730050,China)
Key wordsMultiple load;Secondary development;Geometric model reconstruction;Visualization
AbstractIn order to implement the geometric deformable model reconstruction,data required by modeling is obtained by secondary development of Python script in ABAQUS platform,visiting ODB of ABAQUS,reading the data of ODB after corresponding calculation.Based on that data,visualization during geometric model building process is implemented by writing script programs and reconstructing geometric deformable model,which lays a foundation for the subsequent multiple load analysis,provides a new idea for the building of irregular geometry model as well.
doi:10.16468/j.cnki.issn1004-0366.2016.03.017.
收稿日期:2015-02-12;修回日期:2015-03-25.
作者簡介:龔亞飛(1987-),男,山西運城人,碩士研究生,研究方向為計算機仿真模擬、CAE軟件的二次開發(fā).E-mail:gongyafei0408@sina.com. 通訊作者:李旭東.E-mail:lixd@lut.cn.
中圖分類號:N945.12
文獻(xiàn)標(biāo)志碼:A
文章編號:1004-0366(2016)03-0080-05
引用格式:Gong Yafei,Li Xudong,He Ling.Application of Secondary Development of ABAQUS in Geometric Deformable Model Reconstruction[J].Journal of Gansu Sciences,2016,28(3):80-84.[龔亞飛,李旭東,何玲.ABAQUS二次開發(fā)在變形幾何模型重構(gòu)中的應(yīng)用[J].甘肅科學(xué)學(xué)報,2016,28(3):80-84.]