小伙伴们大家好,我是无悔果,今天是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的复制的能力都丧失了吧,我写了的,肯定都发出去了,在文章里找找就好,感谢理解。
另外,特别感谢一下小伙伴的赞赏和充电,谢谢大家。