目前在Abaqus中,基于全局或局部嵌入Cohesive单元,以模拟非均质材料的裂缝扩展的方法已经相当普遍。我想POLARIS_InsertCohElem插件起到不小的作用。
后处理方面,也推出的POLARIS_CrackGeo插件提取Cohesive单元和XFEM模拟获得的裂缝数据。但如何出图来展示裂缝形态,成为插件用户的一大痛点。
在Abaqus中,Cohesive单元模拟的裂缝路径可以通过显示特征边的方式进行展示,但这种方法有几个方面的缺点:
- 虽然可以叠加显示出裂缝周边实体单元的应力、孔压等场量输出,但在表现裂缝自身场量结果时没有线图直观,如下例中显示缝宽的效果对比;
- 很难像线图那样凸显天然裂缝或颗粒边界以及其它特殊位置的Cohesive单元;
- 由于全局嵌入Cohesive单元,在单元共节点位置存在孔洞,部件变形后,孔洞呈现出小黑点的形式,无法去除,线图就完全不存在这些问题;
常用的编程绘图工具,目前以Matlab和Python matplotlib为主,Abaqus2021版本之后就已经内置了matplotlib库,因此本文以matplotlib库为基础,带大家绘制POLARIS_CrackGeo插件提取的裂缝线图。
第一步,了解数据文件结构
POLARIS_CrackGeo插件提取odb结果后,在ODB文件所在目录下,会生成两个与ODB文件同名的CSV文件,分别是:“odbName-XFEM/COH-infos.csv”和“odbName-XFEM/COH-Output.csv”:
infos.csv文件
用于存储所有破裂单元的裂缝面的节点坐标、裂缝破裂形式MMIXDMI和裂缝宽度信息;当提取的是XFEM裂缝时,仅输出节点坐标信息;当提取的是Cohesive单元裂缝时可输出MMIXDMI(场量有定义MMIXDMI输出)和裂缝宽度,裂缝宽度排序采用倒序记录:第一个裂缝宽度,为最后一个分析步的最后一帧所对应的宽度,第二个裂缝宽度,为倒数第二帧对应的宽度,依此类推……
读取infos.csv文件代码示例如下:
def readCohesiveInfo(fileName):
### 读取infos.csv文件,获得单元坐标信息
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文件
用于存储不同时刻下的破裂单元数量、破裂体积、最大缝宽、裂缝长度/面积,以及破裂单元的编号;
- FrameTime:场输出帧对应的总时间;
- CrackElemNum:破裂单元数量;
- CrackVolume:破裂单元的体积;
- MaxWidth:最大缝宽;
- CrackLength:二维裂缝长度;
- CrackArea:三维裂缝面积;
- CrackMode_1_percentage:张裂缝占总裂缝比率;
- 破裂单元编号位于G列之后的所有数据。
读取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
第二步,绘图并输出
如下代码,是将读取后的单元和裂缝数据传入到plotResult函数中,并将不同时刻的裂缝形态绘制出来,批量输出到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))
#绘制结果
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()
注,完整代码可在公众号**【星辰北极星】中回复:【PY裂缝绘图】**获取下载路径。
这里只是给一个简单的案例,绘图效果有限的,如果需要添加天然裂缝数据,设置不同的线宽和颜色,则还需要从odb文件中获得更多数据信息。当然,也能尽显你的创意和特色,加油,期待你的效果!
POLARIS_CrackPlot
我们也不会放过任何一个用户需求来更新完善插件功能,在POLARIS_CrackGeo插件V2023.3的版本中,已经新增了线图绘制功能POLARIS_CrackPlot,以帮助插件用户快速输出线图,目前绘图功能主要包含:
- 单次或批量输出图片:可一次性输出所有时刻、指定特定时刻、按时间间隔或按帧编号间隔批量输出系列图片;
- 2D线图输出:由于绘制的是二维线图,因此三维模型需要指定投影坐标系,目前支持XY、XZ、YZ、YX、ZX、ZY六种投影坐标系
- 灰色背景线条:可指定单元Set集作为灰色背景线条,以指示天然裂缝、骨料边界的位置;
- 线条颜色:可以指定线条颜色代表的含义,如区域类型、失效类型、开裂时间、缝宽;
- 线条宽度:可以与缝宽进行绑定,因此可以用线条粗细指示不同位置的裂缝宽度;
- 副图曲线:裂缝分布图旁可增加显示裂缝统计信息曲线图,缝长-时间曲线,失效单元-时间曲线等。
部分输出效果如下:
与本文相关的文章:
技文|ABAQUS二次开发小工具推荐
插件|POLARIS_PythonTest
插件|POLARIS_MesoConcrete
技文|ABAQUS结果提取大于某值的区域体积
技文|INP关键字跳转、代码高亮、自动补全
技文|Abaqus中提取裂缝数据并用matplotlib库绘图
技文|Abaqus中提取裂缝数据并用matplotlib库绘图
技文|用35行代码生成二维随机颗粒模型