生成单颗10mm级配的cluster骨料
PFC5.0代码可以破碎的cluster可模拟碎石、矿渣混凝土材料ball与cluster颗粒单轴压缩实验内涵声发射事件数代码分析统计ball与ball直接的裂纹数目cluster内部破碎的裂纹数目上周帮同门调PFC5.0的矿渣混凝土单轴压缩模拟本来以为就是套个现成的代码改改参数结果栽在cluster内部裂纹统计和声发射计数上折腾了快两天现在终于把坑填完了顺手把整理好的代码和踩过的雷分享出来。咱先唠唠为啥要用cluster平时模拟素混凝土用ball堆就行但矿渣混凝土的骨料都是大块的碎石单个ball太假了得把一堆小ball绑成一个大颗粒当骨料也就是cluster。这样碎的时候能从骨料内部裂开比单个ball真实多了。比如要做一个10mm的碎石骨料就先扔20个半径2-5mm的小ball在一个小区域里再用clump命令把它们捆成一个整体。先贴一段生成cluster骨料的代码set aggregate_rad 5.0 ;# 大颗粒的包络半径 set sub_ball_num 20 ;# 组成cluster的小ball数量 set gap 0.1 ;# 小ball之间的间隙防止太挤 set clump_id [clump create rad$aggregate_rad num$sub_ball_num gap$gap] # 给cluster赋值物理参数和矿渣骨料匹配 clump attribute density2800 young3.5e10 poisson0.22 range id $clump_id # 随机扔一堆骨料和砂浆用的小ball ball distribute porosity0.32 rad1.0 3.0 density2100 young2.5e10 poisson0.2 range x-0.5 0.5 y-0.5 0.5 z-0.5 0.5这段代码一开始我把gap设成0了结果生成的cluster直接挤成一团导入模型的时候直接报错后来加了gap0.1才好而且porosity设0.32是模拟混凝土的孔隙率这个参数得根据实际级配调。接下来是单轴压缩的加载墙别用固定墙伺服墙才是做准静态加载的正道# 生成上下伺服加载墙尺寸和模型域匹配 wall create position 0 0 -0.48 size 0.96 0.96 id 1001 wall create position 0 0 0.48 size 0.96 0.96 id 1002 # 设置加载速率别太快不然惯性炸模型 wall servo velocity 0.008 range id 1001 wall servo velocity -0.008 range id 1002 wall servo on我一开始手滑把速率设成0.1结果模型刚加载就被弹飞了后来查了PFC官方文档才知道准静态加载的速率要足够慢让每个步长的位移都小于颗粒的半径量级。PFC5.0代码可以破碎的cluster可模拟碎石、矿渣混凝土材料ball与cluster颗粒单轴压缩实验内涵声发射事件数代码分析统计ball与ball直接的裂纹数目cluster内部破碎的裂纹数目然后是声发射计数PFC里声发射本质就是接触破坏的次数不管是拉伸还是剪切破坏只要接触的状态变了就算一次事件。一开始我抄了网上的代码结果跑出来一直是0后来才发现把contact.state的数值记错了——PFC5.0里contact.state(c)2是拉伸断裂3是剪切断裂修正之后就对了fish define count_ae_events local ae_total 0 loop foreach c contact.list ;# 跳过还没破坏的接触 if contact.state(c) 2 continue ae_total ae_total 1 endloop global total_ae ae_total end ;# 每100个计算步调用一次省点算力 history add total_ae这里加了continue跳过未破坏的接触比原来的多层if判断看着清爽点要是模型颗粒多的话甚至可以隔500步再算省算力。最后是裂纹统计的重头戏区分ball-ball之间的裂纹和cluster内部的裂纹。ball-ball就是砂浆里两个独立小颗粒之间的接触破坏cluster内部的就是同一个骨料包里的小ball之间的开裂这个得靠clump.id来判断——同一个cluster里的所有ball的id都属于同一个clump的编号fish define count_crack_types local bb_crack 0 ;# ball-ball之间的裂纹数 local ci_crack 0 ;# cluster内部的裂纹数 loop foreach c contact.list if contact.state(c) 2 continue local id1 contact.id1(c) local id2 contact.id2(c) ;# 先判断是不是两个独立的ball都不属于任何cluster if [ball exists id1] and [ball exists id2] if not [clump exists id1] and not [clump exists id2] bb_crack bb_crack 1 endif endif ;# 再判断是不是同一个cluster内部的接触 if [clump exists id1] and [clump exists id2] if [clump id id1] [clump id id2] ci_crack ci_crack 1 endif endif endloop global crack_bb bb_crack global crack_ci ci_crack end fish call count_crack_types这段代码一开始我没加clump exists的判断结果把cluster和普通ball之间的接触也算进去了比如骨料和砂浆颗粒的接触那显然不算内部裂纹后来加了之后统计就准确了。跑起来之后的效果还挺直观的加载初期声发射数很少都是一些微小的接触调整到接近峰值应力的时候声发射数突然暴涨cluster内部的裂纹先变多然后ball-ball之间的裂纹开始激增对应实际混凝土里骨料先碎然后砂浆和骨料之间的界面开裂最后整体垮掉。对了要是想实时看这些数据可以开个绘图窗口把totalae、crackbb、crack_ci都加进去调参数的时候不用等跑完就能看到效果省了好多时间。这次折腾下来才发现PFC的代码看似简单但是细节坑特别多比如接触状态的数值、cluster的id判断、加载速率这些都是抄现成代码容易踩的雷还是得自己捋一遍逻辑才好用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470287.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!