Abaqus三维六面体Hex8单元:Cohesive Element脚本插入

小伙伴们大家好,我是无悔果,今天是2022-3-26日。

昨晚调这个程序,不对,应该说今天凌晨了,发了个bilibili动态,本想着说挺不容易,发了没多久就有一些小伙伴回复了,,,太离谱了,你们都不睡觉的吗,这么刻苦的。还是不要熬夜了,兄弟们。

今天我们讲一个算是遗留许久的问题,我下午的时候想着做点什么的时候了,它就浮现在我的脑海里。当时我在专栏里提的时候,就有粉丝私信我,给我分享了一个别人写的插件里的脚本,如果你一直坚持的付出,你终究会得到反馈,我没付出多少,但是却得到了你们很多的反馈,感谢各位。那个插件应该比较全面,当时我看了,但是着实有点费劲,比较别人不是教学的,我自己的水平也低,看不太明白。今天咱自个就来写个试试看,当然开始可能会很糙,我会跟各位讲讲我的思路,先一步步来,先糙后精对吧,每个优秀的项目都是从1.0开始,那么我们今天就开始我们的cohesive element 1.0。

为了便于大家看的明白,我解释一下什么是cohesive element,以及有什么用。

 ABAQUS提供一种粘结单元(cohesive element),用以模拟两个部分之间的粘性连接,一般来说,它要求粘结材料尺寸和强度都小于粘结部分(比如多层复合材料的胶粘层),进而可以利用cohesive element模拟材料的断裂。从本质上讲,利用cohesive element模拟材料的断裂其实是单元删除方法的一种。

再来一波原理图,看完有点懵,我也有点懵,但是不影响我使用

。其实我的理解就是,cohesive就是一层比基体弱的基体,在前处理设置一点参数,然后就可以模拟断裂了。

既然看不懂,那就再来一点理论,没想到吧

当然我今天的任务不是解释这些,我只负责建模部分。那我解释一下如何建模,怎么在abaqus里插入全局的cohesive单元。首先,理论解释部分,如下图,我自己画了一点图。假如下面是初始画好网格的part,为了简单,目前只有两个单元,插入一层cohesive单元,插入的位置如黄色所示,0厚度的。

其实从建模的角度来说,cohesive单元就是一个单元,只不过这个单元的厚度为0而已,我们的目标,就是基于现有的单元,在交界面之间再插入一个厚度的单元。具体步骤,如下:

原理部分,我放上去了,注意的是拆分的过程,并不是把原有part给拆开,而是重新生成一个part,再利用信息,重新生成节点单元,最后再把交接部分的单元建立好,因为交接部分的单元节点是重合的,所以最后生成的单元就是初始0厚度的。

重点内容已经讲完了,拜拜,溜了。下期再见。

真的下期再见了。

不相信我?

行,不信任我。那么接下来,就是实现的部分了,那么我们就照着这个思路一步步做。

首先,要有基本的part,这个是本章难的部分了。一点要仔细仔细仔细,这两个单元是精华部分,坐标最好精确到小数点后8位。我把节点坐标打一下:

p1 (1.00000000, 0.00000000, 0.00000000)

p2 (1.00000000, 1.00000000, 0.00000000) .....

照这个精度来,把part做好。

第二步,第二步是拆分,这一步需要两个知识,一个是如何新建节点,一个是如何新建单元。这个简单啊,先把函数搞出来,一个是新建node的函数,一个是新建element的函数:

# create node
part.Node(coordinates = (x, y, z))

# create element
part.Element((n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]), elemShape=HEX8)

part是abaqus里的part对象,然后Node()里,只需要传入坐标点就行,就可以建立坐标了。Element(),需要传入两个信息,一个是单元类型,我们是建立8节点的Hex单元,elemShape=HEX8,未来我会介绍一下别的单元类型是如何插入cohesive的。第二个参数是节点的信息,这里要主要讲一下节点的顺序,从1-8是有一定顺序的,不能乱填,顺序如下图,这个顺序很重要,我亲测过的,如果顺序乱的,是组不成一个封闭的六面体的,各位可以自行尝试一下。

得到两个函数之后,以画好网格的Part-1为基准,提取其每个单元的节点信息,在part-cohesive_test3中重构。程序如下:

model = mdb.models["Model-1"]
partBase = model.parts["Part-1"]

if model.parts.has_key("Part-cohesive_test3"):
    del model.parts["Part-cohesive_test"]
part = model.Part(name="Part-cohesive_test3", dimensionality=THREE_D, type=DEFORMABLE_BODY)

baseNoses = partBase.nodes

for ele in partBase.elements:
    connectivity = ele.connectivity
    eleNode = []
    for index in connectivity:
        coord = baseNoses[index].coordinates
        node = part.Node(coordinates = coord)
        eleNode.append(node)
    part.Element(nodes=tuple(eleNode), elemShape=HEX8)

运行之后的结果,左边的是原始的part,右边的是重构之后的单元。乍一看好像都一样,但是大家仔细看下两个part的node编号,重构后交界处的节点数量变化了,变成了2个,说明我们已经把初始的两个单元分开了,现在的单元已经是独立的了。

拆分之后,第三步是把孤立的单元连接起来,就是我们所需要的0厚度cohesive element。嗯,这部分我不知道我是否可以用文字解释的清楚,所以我大概说一下,大家对照着源码看。

首先,我们需要知道,哪些单元的节点和哪些节点的需要连接起来。这里需要用到了一个对象,elementFace,其实就是单元的面,比如一个六面体单元会有6个elementFace,然后呢,这个elementFace对象有两个方法,一个是getNodes(),另一个是getElements(),这两个返回的分别是elementFace的四个node,以及elementFace所在的单元,呃........,不知道你们理解了没,大家可以自己敲一敲。

现在问题来了,怎么利用这两个工具,去找到交界面上需要连接的单元。想法是,利用getElements()去找elementFace对象的单元,如果这个elementFace对象属于两个单元,那么这个一定是交界面,对吧。

partBase = model.parts["Part-1"]
for elemFace in partBase.elementFaces:
    elements = elemFace.getElements()
    if len(elements)==2:
         pass

当找到交界面的时候,再利用getNodes()获得坐标,并在重构的part里定位相应的节点,再利用part里的Element函数,就能实现单元连接了。

如果有明白的,大家可以对照着源码看一下,或者,以后有机会出个视频讲解一下。最后,我觉得大家可以应用的比较多,实在难以理解的,咱算了。

# create cohesive
partElements = part.elements
partNodes = part.nodes

# 储存连接单元的节点信息
elementsNode = []

for elemFace in partBase.elementFaces:
    elements = elemFace.getElements()
    if len(elements)==2:
        label1 = elements[0].label
        label2 = elements[1].label
        coords = [node.coordinates for node in elemFace.getNodes()]
        tempNodes = []
        for coord in coords:
            for index in partElements[label1-1].connectivity:
                if partNodes[index].coordinates==coord:
                    tempNodes.append(partNodes[index])
        for coord in coords:
            for index in partElements[label2-1].connectivity:
                if partNodes[index].coordinates==coord:
                    tempNodes.append(partNodes[index])
        elementsNode.append(tuple(tempNodes))

cohesiveEleLabel = []
for tupleNodes in elementsNode:
    ele = part.Element(nodes=tupleNodes, elemShape=HEX8)
    cohesiveEleLabel.append(ele.label)


# create set
# 把新建的cohesive单元建立set,方便赋予属性
part.Set(elements=part.elements.sequenceFromLabels(cohesiveEleLabel), name='Set-cohesive')

最后测试脚本的部分,当然不能少,应用的话,我把整个脚本部分封装成了一个函数,大家在使用过程中,只需要输入modelName 和partName就行,比如下面这种:

createCohesiveHex(modelName="Model-1", partBaseName="Part-1")

随便测试一组,我觉得是没多大问题的。

当然最好是做一组计算测试一下,我就不测试了,如果大家在做计算的过程中,出现了单元的问题,可以告诉我一下。

源码丢这了:

# encoding=utf-8
# code by wuHui
from abaqus import *
from abaqusConstants import *

def createCohesiveHex(modelName, partBaseName):
    '''
    :param modelName: name of model
    :param partBaseName: name of part
    :return:
    '''
    model = mdb.models[modelName]
    partBase = model.parts[partBaseName]
    if model.parts.has_key("Part-cohesive_test3"):
        del model.parts["Part-cohesive_test3"]
    part = model.Part(name="Part-cohesive_test3", dimensionality=THREE_D, type=DEFORMABLE_BODY)

    baseNoses = partBase.nodes

    for ele in partBase.elements:
        connectivity = ele.connectivity
        eleNode = []
        for index in connectivity:
            coord = baseNoses[index].coordinates
            node = part.Node(coordinates = coord)
            eleNode.append(node)
        part.Element(nodes=tuple(eleNode), elemShape=HEX8)


    # 存储节点
    nodes = [node for node in part.nodes]

    #

    # create cohesive
    partElements = part.elements
    partNodes = part.nodes

    elementsNode = []

    for elemFace in partBase.elementFaces:
        elements = elemFace.getElements()
        if len(elements)==2:
            label1 = elements[0].label
            label2 = elements[1].label
            coords = [node.coordinates for node in elemFace.getNodes()]
            tempNodes = []
            for coord in coords:
                for index in partElements[label1-1].connectivity:
                    if partNodes[index].coordinates==coord:
                        tempNodes.append(partNodes[index])
            for coord in coords:
                for index in partElements[label2-1].connectivity:
                    if partNodes[index].coordinates==coord:
                        tempNodes.append(partNodes[index])
            elementsNode.append(tuple(tempNodes))

    cohesiveEleLabel = []
    for tupleNodes in elementsNode:
        ele = part.Element(nodes=tupleNodes, elemShape=HEX8)
        cohesiveEleLabel.append(ele.label)


    # create set
    part.Set(elements=part.elements.sequenceFromLabels(cohesiveEleLabel), name='Set-cohesive')


createCohesiveHex(modelName="Model-1", partBaseName="Part-3")

最后再说一句题外话,我承认我最近是没有上传到github上去,但是我不信大家在公众号或者bilibili的复制的能力都丧失了吧,我写了的,肯定都发出去了,在文章里找找就好,感谢理解。

另外,特别感谢一下小伙伴的赞赏和充电,谢谢大家。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空