星辰技文|Abaqus中提取裂縫數(shù)據(jù)并用matplotlib庫繪圖
目前在Abaqus中,基于全局或局部嵌入Cohesive單元,以模擬非均質(zhì)材料的裂縫擴(kuò)展的方法已經(jīng)相當(dāng)普遍。我想POLARIS_InsertCohElem插件起到不小的作用。
后處理方面,也推出的POLARIS_CrackGeo插件提取Cohesive單元和XFEM模擬獲得的裂縫數(shù)據(jù)。但如何出圖來展示裂縫形態(tài),成為插件用戶的一大痛點(diǎn)。
在Abaqus中,Cohesive單元模擬的裂縫路徑可以通過顯示特征邊的方式進(jìn)行展示,但這種方法有幾個方面的缺點(diǎn):
1. 雖然可以疊加顯示出裂縫周邊實(shí)體單元的應(yīng)力、孔壓等場量輸出,但在表現(xiàn)裂縫自身場量結(jié)果時沒有線圖直觀,如下例中顯示縫寬的效果對比;
2. 很難像線圖那樣凸顯天然裂縫或顆粒邊界以及其它特殊位置的Cohesive單元;
3. 由于全局嵌入Cohesive單元,在單元共節(jié)點(diǎn)位置存在孔洞,部件變形后,孔洞呈現(xiàn)出小黑點(diǎn)的形式,無法去除,線圖就完全不存在這些問題;
常用的編程繪圖工具,目前以Matlab和Python matplotlib為主,Abaqus2021版本之后就已經(jīng)內(nèi)置了matplotlib庫,因此本文以matplotlib庫為基礎(chǔ),帶大家繪制POLARIS_CrackGeo插件提取的裂縫線圖。
第一步,了解數(shù)據(jù)文件結(jié)構(gòu)
POLARIS_CrackGeo插件提取odb結(jié)果后,在ODB文件所在目錄下,會生成兩個與ODB文件同名的CSV文件,分別是:“odbName-XFEM/COH-infos.csv”和“odbName-XFEM/COH-Output.csv”:
infos.csv文件
用于存儲所有破裂單元的裂縫面的節(jié)點(diǎn)坐標(biāo)、裂縫破裂形式MMIXDMI和裂縫寬度信息;當(dāng)提取的是XFEM裂縫時,僅輸出節(jié)點(diǎn)坐標(biāo)信息;當(dāng)提取的是Cohesive單元裂縫時可輸出MMIXDMI(場量有定義MMIXDMI輸出)和裂縫寬度,裂縫寬度排序采用倒序記錄:第一個裂縫寬度,為最后一個分析步的最后一幀所對應(yīng)的寬度,第二個裂縫寬度,為倒數(shù)第二幀對應(yīng)的寬度,依此類推……
讀取infos.csv文件代碼示例如下:
def readCohesiveInfo(fileName):
### 讀取infos.csv文件,獲得單元坐標(biāo)信息
dataDict = {}
f = open(fileName,'r')
lines = f.readlines()
f.close()
strDatas = lines[0].replace('\n','').split(',')
headDict = {}
for i,w in enumerate(strDatas):
headDict[w] = i
for line in lines[1:]:
strDatas = line.replace('\n','').split(',')
if len(strDatas)<6:continue
data = []
for i in ["x1","y1","x2","y2"]:
data.append(eval(strDatas[headDict[i]]))
dataDict[int(strDatas[0])] = data
return dataDict
Output.csv文件
用于存儲不同時刻下的破裂單元數(shù)量、破裂體積、最大縫寬、裂縫長度/面積,以及破裂單元的編號;
1. FrameTime:場輸出幀對應(yīng)的總時間;
2. CrackElemNum:破裂單元數(shù)量;
3. CrackVolume:破裂單元的體積;
4. MaxWidth:最大縫寬;
5. CrackLength:二維裂縫長度;
6. CrackArea:三維裂縫面積;
7. CrackMode_1_percentage:張拉裂縫占總裂縫比率;
8.
破裂單元編號位于G列之后的所有數(shù)據(jù)。
讀取Output.csv文件代碼示例如下:
def readResultInfo(fileName):
### 讀取Output.csv文件,獲得不同時刻的失效單元
resultDict = {}
f = open(fileName,'r')
lines = f.readlines()
f.close()
beginCol = len(lines[0].split(","))
for line in lines[1:]:
strDatas = line.replace('\n','').split(',')
data = [eval(i) for i in strDatas]
if len(data)>beginCol:
resultDict[data[0]] = data[beginCol:]
return resultDict
第二步,繪圖并輸出
如下代碼,是將讀取后的單元和裂縫數(shù)據(jù)傳入到plotResult函數(shù)中,并將不同時刻的裂縫形態(tài)繪制出來,批量輸出到outDir目錄下。
def plotResult(outDir,coheDict,resultDict):
### 批量繪制圖片并輸出
times = list(resultDict.keys())
times.sort()
times.reverse()
resultNum = len(times)
for it,t in enumerate(times):
fig,ax = plt.subplots(figsize=(10, 10))
#繪制結(jié)果
result = resultDict[t]
for elemLable in result:
x1,y1,x2,y2 = coheDict[elemLable]
ax.plot([x1,x2], [y1,y2],'r-')
ax.set_title("Time:%f"%(t))
outFig = os.path.join(outDir,"%d_Time_%s.png"%(resultNum-it,t))
plt.savefig(outFig,dpi=300,transparent=True)
plt.close()
注,完整代碼可在公眾號【星辰北極星】中回復(fù):【PY裂縫繪圖】獲取下載路徑。
這里只是給一個簡單的案例,繪圖效果有限的,如果需要添加天然裂縫數(shù)據(jù),設(shè)置不同的線寬和顏色,則還需要從odb文件中獲得更多數(shù)據(jù)信息。當(dāng)然,也能盡顯你的創(chuàng)意和特色,加油,期待你的效果!
POLARIS_CrackPlot
我們也不會放過任何一個用戶需求來更新完善插件功能,在POLARIS_CrackGeo插件V2023.3的版本中,已經(jīng)新增了線圖繪制功能POLARIS_CrackPlot,以幫助插件用戶快速輸出線圖,目前繪圖功能主要包含:
1. 單次或批量輸出圖片:可一次性輸出所有時刻、指定特定時刻、按時間間隔或按幀編號間隔批量輸出系列圖片;
2. 2D線圖輸出:由于繪制的是二維線圖,因此三維模型需要指定投影坐標(biāo)系,目前支持XY、XZ、YZ、YX、ZX、ZY六種投影坐標(biāo)系
3. 灰色背景線條:可指定單元Set集作為灰色背景線條,以指示天然裂縫、骨料邊界的位置;
4. 線條顏色:可以指定線條顏色代表的含義,如區(qū)域類型、失效類型、開裂時間、縫寬;
5. 線條寬度:可以與縫寬進(jìn)行綁定,因此可以用線條粗細(xì)指示不同位置的裂縫寬度;
6. 副圖曲線:裂縫分布圖旁可增加顯示裂縫統(tǒng)計(jì)信息曲線圖,縫長-時間曲線,失效單元-時間曲線等。
部分輸出效果如下:
【聲明】請走正規(guī)購買渠道更新插件,更新前請確保安裝了2021以上版本的Abaqus!還是老規(guī)矩:一年內(nèi)的用戶是免費(fèi)更新的,超過一年,僅需20%費(fèi)用。再次感謝大家的支持!
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺客服
TOP




















