导读:本文基于9月20日我给PFC5.0/6.0订阅用户加餐直播时的测试内容,完善后得到的结果。该直播回放已收录在我的仿真秀专栏课程板块《与lobby一起学:离散元PFC5.0&6.0分析应用》,欢迎读者朋友订阅。
自2024年4月起,我决定与仿真秀独家合作,对我的所有PFC5.0/6.0课程用户,策划每周五直播加餐,截至到目前已组织了16期直播,每期1小时左右。旨在更好的帮助用户更高效,更实用的学号PFC软件与应用,深受用户好评(我被lobby的离散元PFC功底折服)。以下是正文:
在PFC中,微裂纹的产生机理是在每个接触破坏的时候,根据接触两端的颗粒或者墙体,提取位置信息生成一个线段(二维)或者圆盘(三维)作为一个微裂纹。大部分情况下裂纹都是有一些中心,然后会在中心进行分散分布,所以可视化效果不是很好。
对裂纹的展示进行降噪,是一直想研究的点,PFC自带的科学计算库scipy中就恰好有这么一个机器学习的算法库cluster。里面包含了常见的聚类算法,最常用的k临近算法可以利用距离特性对数据点进行分类。但是需要提前指定中心点个数。
技术路线分为两步:
(1)采集所有裂纹的中心点坐标,这里还添加了age的数据,用于把生成时间相近的裂纹也归在一起。传入kmeanss算法中,获取分类后的数据点:
这里涉及到一个参数k_num作为中心点的个数。这里的返回值,一个是各个cluster的中心点坐标,一个是所有数据点所在的cluster组索引。
(2)对每个簇计算平均法向方向
(3)收集簇中每个裂纹距离中心点的法向和切向的距离
for singleFrac in factList:
singleFrac.set_group("label"+str(labelCount))
vertexs=singleFrac.vertices()
for singleVert in vertexs:
pos_x=singleVert.pos_x()
pos_y=singleVert.pos_y()
singleDist_Normal=math.fabs((pos_x-pos[0])*normal_direct[0]+(pos_y-pos[1])*normal_direct[1])/math.sqrt(normal_direct[0]**2+normal_direct[1]**2)
singleDist_Direct=math.fabs((pos_x-pos[0])*normal_direct[1]-(pos_y-pos[1])*normal_direct[0])/math.sqrt(normal_direct[0]**2+normal_direct[1]**2)
DirectDist.append(length_fac*singleDist_Direct)
NormalDist.append(singleDist_Normal*math.exp(-width_fac*singleDist_Normal)/math.exp(0))
为了使得cluster的降噪后的形状有定向性,并且裂纹发育一般也是沿着一定方向延申的。这里法向的距离用exp函数进行降低,width_fac这个值就是距离系数,这个值越大,远端的颗粒就影响越小。切向的距离也用一个length_fac来进行调整
(4)绘制降噪后的裂纹形状
这个绘制方案有很多,可以用geometry,也可以用rbock,但是我这里想把fracture的age也继承过来,用rblock这个有extra设置参数的就更加适合了。这个功能用fish做,然后在python中进行调用
最原始的破坏结果是这样的,裂纹分布比较零散。
从破坏时间上可以看出是自上到下的破坏过程
运用本算法后,给到几个参数下的结果
(1)width_fac=100;k_num=20
(2)width_fac=100;k_num=50
(3)width_fac=100;k_num=70
(4)width_fac=100;k_num=100
中心数越多,数据的视觉效果也就越逼近原有的裂纹数据。
而我们既有的目标是进行降噪或者说是进行特性提取,所以中心数不能太多,其次法向厚度不能太大。
这里给到参数为:
k_num=5
的效果
这个把原有的390个微裂纹降低到了7个裂纹特征。
同样的原理适用一下巴西劈裂,也可以得到比较好的裂纹效果:
调整参数也可以获取如图的裂纹特性,可以分析出主发展方向是从两端到中间,然后在左上角有一个次生裂隙。
总结
本文基于最简单的kmean分类方法获取得到降噪结果,分类的合理性还需要更多的验证,并且还有很多高级的cluster方法可以用于分类处理。后续的3d版本也会适配推出。若有引用本文处理方法,可直接在引用中以网络文章的引用格式增加引用。
欢迎大家订阅lobby主讲的6.0的入门课程
欢迎订阅用户免费加入每周五lobby直播加餐