hello,大家晚上好。今天是2020-12-11,马上就到了双十二了,又是一天剁手节。大家都买了什么好东西啊。反正我跟我家的傻狍子一起已经剁手了,坐等凌晨付款了。等我的货到了,我跟你们说我买了什么,哈哈。
下面就说一下今天的内容吧。今天主要是把昨天没讲完的东西讲完,昨晚搞到凌晨,太困了,就睡了。我们就昨天的内容继续往下说。
以二维多晶体模型为例。就是我们之前写过的脚本。大家如果做分析画网格的时候,一般都是画出下面这种样子的:

这种网格也还可以的,好歹还是四边形的。但是对于三维的情况,三维的模型只能画四面体网格。按正常的画网格的方法是很难很难画成六面体网格的。不信大家自己可以试试看。所以就要换一种思路,先把网格画好了,然后再分区域,分别给材料。这种方法是个好办法。特别好的办法。
我还是展示一下三位的是个什么效果吧:
下面我们就来说说具体怎么做。做法上,算法上二维和三维的脚本都是一模一样的,只有写法上会有区别,比如二维的faces,在三维模型里就是cells。
1 生成多晶粒的模型
生成多晶粒的模型的脚本我给大家都写过了,二维和三维的都有,可以看之前的内容。生成好了之后,这个模型是用来参照的。然后在生成一个跟基体大小一模一样的Part,用来画高质量的网格。

这个脚本,只需要在之前咱们写的那个二维脚本里多加两句话:

2 生成网格
生成的网格的函数也很简单,定义种子大小,然后直接生成就行,两句代码搞定:


3 遍历单元,做判断
网格画好之后,现在只需要对每个单元做个判断就行,做什么判断,根据Part1画好的多晶体模型,去判断Part2里的单元所属的是哪个晶粒。大家没懵吧,缕一缕逻辑啊。我们把是属于同一晶粒的单元放在一起,建立一个set。在对set赋予材料。整个脚本就写完了。随机赋予材料的脚本我也讲过,前面的文章里有。这里我就不写了。
先是初始化一个列表,放属于同一晶粒的单元编号,注意这里是单元编号(label)。为什么不直接存单元呢,是因为后面的建立set的时候,需要用到单元编号。

初始化之后,遍历Part2的所有单元。判断每个单元的中心点坐标位置,利用findAt函数去查找,这个中心点坐标对应的晶粒是哪个(二维faces,三维cells)。findAt是个特别好用的函数,参数是坐标,返回值是一个对象(edges,faces,cells对象等),可以找到Part的边、面以及体。然后把这个单元的编号,放在初始化的数组里。对每个单元都操作一次,就可以按照Part1的晶粒划分方式区分开了。

区分完成后,所有的信息都储存再列表里,还需要在abaqus里实现,这就需要建立set。

运行一下脚本,按set划分之后的结果如下。

对于三维的情况也一样,大家可以根据我的脚本思考一下,想想应该怎么改。今天的源代码,老规矩,评论区置顶。
好啦,今天的内容稍微简单一点。但是还是有几点新东西值得学习的,比如findAt函数。有时间你们可以自己尝试尝试,咱们明天见。88啦(明天写子程序,VDLOAD,explicit的子程序)

百无禁忌