一、模型构建核心流程
混凝土二维随机骨料模型的构建需遵循 骨料生成→随机投放→碰撞检测→模型导出 的流程,其核心难点在于 骨料形状控制 和 空间分布合理性。
二、关键技术与代码实现
1. 骨料形状生成
-
多边形基骨料生成
以随机圆为基础,通过极角控制生成凸多边形,控制边数范围(4-10边)和边长波动(±10%):
matlabfunction poly = generate_polygon(center, radius) num_sides = randi([4,10]); % 随机边数angles = linspace(0, 2*pi, num_sides+1); % 顶点坐标扰动(极角随机偏移±0.5rad) theta = angles(1:end-1) + 0.5*randn(1,num_sides); x = center(1) + radius*(1+0.1*randn(1,num_sides)).*cos(theta); y = center(2) + radius*(1+0.1*randn(1,num_sides)).*sin(theta); poly = polyshape(x, y); end -
界面过渡区(ITZ)模拟
在骨料表面生成厚度为骨料半径5%的过渡区,通过偏移多边形边界实现:
matlabfunction ITZ = create_ITZ(poly, thickness) [vertices, ~] = vertices(poly); offset = thickness*mean(vecnorm(vertices - mean(vertices), 2, 2)); ITZ = offset(poly, offset, 'inward'); end
2. 随机投放算法
-
蒙特卡罗投放策略
基于面积分数(如骨料体积占比30%)生成随机位置,采用 空间网格划分法 加速碰撞检测:
matlabfunction positions = random_packing(model_size, agg_size, area_frac) grid_size = max(agg_size)*2; % 网格尺寸为骨料最大尺寸的2倍 [X, Y] = meshgrid(0:grid_size:model_size(2), 0:grid_size:model_size(1)); occupied = false(size(X)); while true x = rand*model_size(2); y = rand*model_size(1); idx = sub2ind(size(X), round(y/grid_size)+1, round(x/grid_size)+1); if ~occupied(idx) % 生成骨料并检查重叠 agg = generate_polygon([x,y], agg_size); if all(~doOverlap(agg, agg)) occupied(idx) = true; positions = [positions; x, y]; end end if sum(occupied(:)) >= area_frac*model_size(1)*model_size(2) break end end end
3. 碰撞检测优化
-
快速重叠判断函数
基于包围盒(Bounding Box)的快速初步筛选,结合精确多边形相交检测:
matlabfunction overlap = doOverlap(poly1, poly2) % 包围盒快速筛选 min1 = min(poly1.Vertices(:,1)); max1 = max(poly1.Vertices(:,1)); min2 = min(poly2.Vertices(:,1)); max2 = max(poly2.Vertices(:,1)); if max1 < min2 || max2 < min1, overlap = false; return; end % 精确相交检测(调用MATLAB内置函数) overlap = ~isempty(intersect(poly1, poly2, 'rows')); end
三、模型参数控制与可视化
1. 关键参数设置
| 参数 | 典型值 | 控制方法 |
|---|---|---|
| 骨料面积分数 | 30%-40% | 调整投放终止条件 |
| 最大骨料尺寸 | 80mm | 限制生成多边形的最大半径 |
| ITZ厚度 | 骨料半径5% | 基于半径比例动态计算 |
| 界面过渡区弹性模量 | 降低30% | 通过属性映射实现 |
2. 可视化与导出
-
图形绘制
使用
pcolor和fill函数分层显示骨料、砂浆和界面:matlabfigure; hold on; p = pcolor(model_size(2), model_size(1), agg_mask); shading interp; colormap(gray); hold on; fill(poly.Vertices(:,1), poly.Vertices(:,2), 'r', 'FaceAlpha', 0.5); -
有限元模型导出
将MATLAB图形转换为DXF格式供COMSOL/ANSYS调用:
matlabdxf_export('concrete_model.dxf', agg_poly, ITZ_poly);
四、模型验证与应用案例
1. 验证方法
-
面积分数验证
对比实际截面骨料面积占比(如文献中再生骨料占比28%-48%)与模拟值,误差应<5%。
-
断裂模式对比
通过COMSOL模拟轴拉试验,裂缝扩展路径需与文献中描述的"多分支裂缝"一致。
2. 工程应用
-
配合比优化
调整骨料级配(如三级配:3:3:4)模拟不同强度等级混凝土(C30-C50)。
-
耐久性分析
在ITZ区域设置腐蚀介质渗透率(如1e-12 m/s),模拟氯离子侵蚀过程。
五、改进方向与挑战
-
三维扩展
需解决三维空间碰撞检测效率问题(如八叉树算法)。
-
动态加载模拟
结合显式动力学模块(如ABAQUS/Explicit)分析冲击荷载下的骨料破碎。
-
机器学习辅助
使用GAN生成更符合真实骨料分布的形态(参考文献的随机边数生成策略)。
六、完整代码示例
matlab
%% 参数设置
model_size = [100, 100]; % 模型尺寸(mm)
agg_min_rad = 5; agg_max_rad = 20; % 骨料半径范围
area_frac = 0.35; % 骨料面积分数
%% 生成骨料群
positions = [];
while true
% 随机生成骨料参数
radius = agg_min_rad + (agg_max_rad - agg_min_rad)*rand;
center = [rand*model_size(2), rand*model_size(1)];
poly = generate_polygon(center, radius);
% 碰撞检测
if isempty(find_overlapping(positions, poly))
positions = [positions; struct('center', center, 'poly', poly)];
end
if sum(cellfun(@(p) polyarea(p.poly.Vertices(:,1), p.poly.Vertices(:,2)), positions)) / (model_size(1)*model_size(2)) > area_frac
break
end
end
%% 可视化
figure; hold on;
for i = 1:length(positions)
fill(positions(i).poly.Vertices(:,1), positions(i).poly.Vertices(:,2), 'r', 'FaceAlpha', 0.4);
end
axis equal; title('二维随机骨料模型'); xlabel('X (mm)'); ylabel('Y (mm)');
参考代码 混凝土二维随机骨料模型 www.youwenfan.com/contentcsq/50692.html
七、参考文献与工具
- 核心文献
- 王菁等. 三级配混凝土二维随机多边形骨料模型数值模拟[J]. 人民长江,2015.
- 胡大琳等. 二维细观随机混凝土模型的建立和应用[J]. 长安大学学报,2017.
- 工具包
- Comsol-Matlab联合建模工具 :支持直接导出
.mph文件进行有限元分析。 - OpenFOAM骨料生成插件:适用于多尺度耦合模拟。
- Comsol-Matlab联合建模工具 :支持直接导出