弹窗一出来先看Timeout设了多少,10000经常不够,球形骨料随机投放体积比上到40%以上等待时间指数级涨,45%左右还能磨,50%基本投不进去,硬塞就靠放宽minGap或者加大Timeout,效果也就那样。气泡反过来,体积比低,5%到15%随便投,投的是空腔,布尔差集从基体里挖掉。
体积比是目标不是结果,脚本里得手动换算,给定长方体尺寸L W H和体积分数vf,骨料总体积Vagg=vf×L×W×H,按级配比例把Vagg分配到各粒径区间,比如5-10占0.3,10-15占0.5,15-20占0.2,加起来是1,再用区间中值半径算单球体积,N=区间体积除以单球体积取整,这是估算,实际投放过程中重叠判定被拒的球一直重试,最终体积比取决于Timeout给不给够,半径范围min_radius和max_radius控制大小。
位置生成和重叠判定最耗时,三重循环外层待投放球列表,内层遍历已放置球逐个算中心距,距离小于两球半径之和判定重叠,标记invalid继续投下一个位置,全遍历完没重叠才append进已放置列表。球心坐标random.uniform在0到L区间取,半径按级配随机。O(N²)复杂度,N超过两三百之后明显卡,边长100mm骨料N=200跑五分钟。球心到六个面距离都必须大于自身半径,不然球体穿透基体边界,网格划出来是破的。

Abaqus建模分两段,第一段纯Python不开CAE,把球心坐标半径有效性全部算完,输出文本或存列表。第二段在Abaqus里跑,用Part和BaseSolidExtrude建球,效率陷阱是不要每生成一个球就调一次Part,批量生成所有球部件再统一装配,更快是把球体全部画在一个part里作为独立solid cell,后面布尔运算切。装配用Instance定位到随机坐标,Merge/cut做布尔差集,差集出来基体带球形孔洞,球体单独保留作为骨料part,分别赋材料属性,砂浆和骨料。
气泡生成和骨料共用同一套位置投放算法,区别只在布尔运算方向。骨料从基体切掉球体后保留球体实体,气泡从基体切掉球体后丢掉球体,基体上留空腔。气泡半径通常比骨料小,min_radius到max_radius给0.5到2,数量多但体积小。随机气泡级配曲线简化成单一区间,直径正态分布,均值和方差手调。
Mesh这块球体和基体分别画网格,球体用Tet自由网格,基体也用Tet,球形空腔形状规整程度不够做Hex,强行structured hex会失败。网格尺寸控制在骨料最小半径的0.3到0.5倍,太小网格量爆炸。接触或Tie绑定,骨料砂浆界面用surface-to-surface tie,主面选基体内球面,从面选骨料外球面,容差0.1左右。气泡内表面是自由面不绑任何东西,载荷直接加基体。
random.seed设固定值,参数化分析保证骨料分布可复现,改一个参数变一次分布没法做对照,seed放脚本开头每个case换一个,记录在文件名或log。跑批量用cmd提交abaqus cae noGUI=script.py,参数从命令行传,vf=0.35 radius_min=3 radius_max=8,不用每次手动改脚本。工作目录输出脚本.py生成的inp以及record.txt记录seed和实际投放骨料数量和体积比。实测实际体积比一般比目标低两三个百分点,最后几个球塞不进去Timeout就停,差太多把Timeout从10000提到50000再试。气泡和骨料混在一起投,气泡先投还是后投影响很大,气泡先投占位小容易通过,骨料先投再插气泡基本全被拒,先试气泡占位然后骨料让路,冲突解决用……
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删