星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图


目前在Abaqus中,基于全局或局部嵌入Cohesive单元,以模拟非均质材料的裂缝扩展的方法已经相当普遍。我想POLARIS_InsertCohElem插件起到不小的作用。

后处理方面,也推出的POLARIS_CrackGeo插件提取Cohesive单元和XFEM模拟获得的裂缝数据。但如何出图来展示裂缝形态,成为插件用户的一大痛点。

Abaqus中,Cohesive单元模拟的裂缝路径可以通过显示特征边的方式进行展示,但这种方法有几个方面的缺点

  1. 1. 虽然可以叠加显示出裂缝周边实体单元的应力、孔压等场量输出,但在表现裂缝自身场量结果时没有线图直观,如下例中显示缝宽的效果对比;

  2. 2. 很难像线图那样凸显天然裂缝颗粒边界以及其它特殊位置的Cohesive单元;

  3. 3. 由于全局嵌入Cohesive单元,在单元共节点位置存在孔洞,部件变形后,孔洞呈现出小黑点的形式,无法去除,线图就完全不存在这些问题;


星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图的图1


常用的编程绘图工具,目前以MatlabPython 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输出)和裂缝宽度,裂缝宽度排序采用倒序记录:第一个裂缝宽度,为最后一个分析步的最后一帧所对应的宽度,第二个裂缝宽度,为倒数第二帧对应的宽度,依此类推……

星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图的图2

读取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文件

用于存储不同时刻下的破裂单元数量破裂体积最大缝宽裂缝长度/面积,以及破裂单元的编号

  1. 1. FrameTime:场输出帧对应的总时间;

  2. 2. CrackElemNum:破裂单元数量;

  3. 3. CrackVolume:破裂单元的体积;

  4. 4. MaxWidth:最大缝宽;

  5. 5. CrackLength:二维裂缝长度;

  6. 6. CrackArea:三维裂缝面积;

  7. 7. CrackMode_1_percentage:张拉裂缝占总裂缝比率

  8. 8. 破裂单元编号位于G列之后的所有数据。

    星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图的图3

读取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=(1010))
        #绘制结果
        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,以帮助插件用户快速输出线图,目前绘图功能主要包含:

  1. 1. 单次或批量输出图片:可一次性输出所有时刻、指定特定时刻、按时间间隔或按帧编号间隔批量输出系列图片;

  2. 2. 2D线图输出:由于绘制的是二维线图,因此三维模型需要指定投影坐标系,目前支持XY、XZ、YZ、YX、ZX、ZY六种投影坐标系

  3. 3. 灰色背景线条:可指定单元Set集作为灰色背景线条,以指示天然裂缝、骨料边界的位置;

  4. 4. 线条颜色:可以指定线条颜色代表的含义,如区域类型、失效类型、开裂时间、缝宽;

  5. 5. 线条宽度:可以与缝宽进行绑定,因此可以用线条粗细指示不同位置的裂缝宽度;

  6. 6. 副图曲线:裂缝分布图旁可增加显示裂缝统计信息曲线图,缝长-时间曲线,失效单元-时间曲线等。

    星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图的图4

部分输出效果如下:

星辰技文|Abaqus中提取裂缝数据并用matplotlib库绘图的图5

【声明】请走正规购买渠道更新插件,更新前请确保安装了2021以上版本的Abaqus!还是老规矩:一年内的用户是免费更新的,超过一年,仅需20%费用。再次感谢大家的支持!


(2条)
默认 最新
感谢分享
评论 点赞
感谢分享
评论 点赞
点赞 17 评论 2 收藏 29
关注