离散元后处理将PFC数据写出并导入到matlab中形成云图。 支持二维三维绘图。 内容包括案例文件fish代码和matlab代码。 pfc2d、3d_to_matlab.最近在折腾离散元后处理发现PFC自带的绘图功能实在不够用。刚好手头有个边坡破坏的案例咱们试试用Matlab搞点炫酷的云图。先上效果图镇楼此处假装有图——从颗粒级应力场到速度场的动态可视化Matlab玩起来是真的香。先说二维情况。在PFC里跑模型的时候记得在Fish脚本里加个数据记录器; 颗粒应力记录器 def save_stress fopen stress_data.txt write ; 每次运行覆盖写入 loop foreach local gp ball.list ; 遍历所有颗粒 local pos ball.pos(gp) local stress ball.extra(gp,1) ; 假设应力存在extra 1 fprintf string.format(%.4f %.4f %.4f\n,pos.x,pos.y,stress) end_loop fclose end save_stress ; 记得在需要时调用这坨代码会把每个颗粒的坐标和应力值存成文本文件。注意文件路径别翻车建议用绝对路径更稳妥。数据量大的时候记得分块保存别一股脑全塞内存里。离散元后处理将PFC数据写出并导入到matlab中形成云图。 支持二维三维绘图。 内容包括案例文件fish代码和matlab代码。 pfc2d、3d_to_matlab.转到Matlab这边先整个暴力读取data load(stress_data.txt); x data(:,1); y data(:,2); stress data(:,3); % 生成网格 xi linspace(min(x),max(x),100); yi linspace(min(y),max(y),100); [XI,YI] meshgrid(xi,yi); % 插值上色 ZI griddata(x,y,stress,XI,YI,natural); % 画图 figure(Color,white) pcolor(XI,YI,ZI) shading interp colorbar hold on contour(XI,YI,ZI,20,k-)这里有个坑——griddata插值遇到不规则区域会抽风。遇到这种情况建议上scatter直接画散点云图加点透明度更带感scatter(x,y,30,stress,filled,MarkerEdgeAlpha,0.3)三维版本更刺激。PFC3D的Fish代码改改就能用def save_3d_stress fopen stress3d.txt write loop foreach gp ball.list pos ball.pos(gp) stress ball.prop(gp,stress_zz) fprintf string.format(%.4f %.4f %.4f %.4f\n,pos.x,pos.y,pos.z,stress) end_loop fclose endMatlab这边处理三维数据得用点骚操作data3d importdata(stress3d.txt); x data3d(:,1); y data3d(:,2); z data3d(:,3); s data3d(:,4); % 三维插值 [XI,YI,ZI] meshgrid(linspace(min(x),max(x),50),... linspace(min(y),max(y),50),... linspace(min(z),max(z),50)); VI griddata(x,y,z,s,XI,YI,ZI); % 切片可视化 slice(XI,YI,ZI,VI,[],[],linspace(min(z),max(z),5)) shading interp colormap jet遇到百万级颗粒数据时建议上bin文件读写。Fish里用file.write写二进制Matlab用fread读取速度能快十倍。不过小心字节顺序问题跨平台读写建议用同款操作系统。最后甩个自用的PFC-Matlab直连工具假装此处有GitHub链接。这玩意儿能自动同步模型边界和颗粒数据支持实时可视化更新。下次准备搞个GPU加速版本有兴趣的可以留言区扣1笑。