Abaqus中使用Python提取裂缝数据并用matplotlib库绘图

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

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

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

  1. 虽然可以叠加显示出裂缝周边实体单元的应力、孔压等场量输出,但在表现裂缝自身场量结果时没有线图直观,如下例中显示缝宽的效果对比;
  2. 很难像线图那样凸显天然裂缝颗粒边界以及其它特殊位置的Cohesive单元;
  3. 由于全局嵌入Cohesive单元,在单元共节点位置存在孔洞,部件变形后,孔洞呈现出小黑点的形式,无法去除,线图就完全不存在这些问题;

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

读取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. FrameTime:场输出帧对应的总时间;
  2. CrackElemNum:破裂单元数量;
  3. CrackVolume:破裂单元的体积;
  4. MaxWidth:最大缝宽;
  5. CrackLength:二维裂缝长度;
  6. CrackArea:三维裂缝面积;
  7. CrackMode_1_percentage:张裂缝占总裂缝比率;
  8. 破裂单元编号位于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,以帮助插件用户快速输出线图,目前绘图功能主要包含:

  1. 单次或批量输出图片:可一次性输出所有时刻、指定特定时刻、按时间间隔或按帧编号间隔批量输出系列图片;
  2. 2D线图输出:由于绘制的是二维线图,因此三维模型需要指定投影坐标系,目前支持XY、XZ、YZ、YX、ZX、ZY六种投影坐标系
  3. 灰色背景线条:可指定单元Set集作为灰色背景线条,以指示天然裂缝、骨料边界的位置;
  4. 线条颜色:可以指定线条颜色代表的含义,如区域类型、失效类型、开裂时间、缝宽;
  5. 线条宽度:可以与缝宽进行绑定,因此可以用线条粗细指示不同位置的裂缝宽度;
  6. 副图曲线:裂缝分布图旁可增加显示裂缝统计信息曲线图,缝长-时间曲线,失效单元-时间曲线等。
    在这里插入图片描述
    部分输出效果如下:
    在这里插入图片描述

与本文相关的文章:
技文|ABAQUS二次开发小工具推荐
插件|POLARIS_PythonTest
插件|POLARIS_MesoConcrete
技文|ABAQUS结果提取大于某值的区域体积
技文|INP关键字跳转、代码高亮、自动补全
技文|Abaqus中提取裂缝数据并用matplotlib库绘图
技文|Abaqus中提取裂缝数据并用matplotlib库绘图
技文|用35行代码生成二维随机颗粒模型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值