最近在进行油藏数值模拟相关的工作时,偶然发现了一个非常实用的 MATLAB 开源项目——嵌入式离散裂缝模型(EDFM),其代码托管于 GitHub 的 master 分支。下载解压后,第一时间查阅了附带的使用手册 EDFM_UserGuide,文档内容详实,甚至包含了清晰的网格生成示意图,可见开发者在细节上的用心程度颇高。
从项目结构来看,主目录下 matrix 和 fracture 两个文件夹尤为突出。进入 fracture 模块后可以发现,裂缝参数的设置方式类似于模块化搭建:通过结构体形式定义裂缝的位置、长度以及倾斜角度等关键信息,逻辑清晰,易于调整。
frac_info = struct('x', 50, 'y', 50, 'length', 100, 'angle', pi/6, 'perm', 100);
需要注意的是角度输入单位问题——初次尝试设置30度时程序报错,后来才意识到需要以弧度为单位,正确写法应为 π/6。这一点虽小,但对新手来说是个典型易错点。
核心流动模拟功能集中在 flow_simulation.m 文件中,其中有一段看似简单的代码却蕴含巧妙设计:
for t = 1:time_steps
pressure = pressure + dt*(K_matrix\Q_matrix + K_frac\Q_frac);
% 这里偷偷用了个混合网格算子
if mod(t,20)==0
contourf(reshape(pressure,grid_size));
title(['Time Step: ' num2str(t)]);
drawnow;
end
end
循环中使用的反斜杠运算符实际上同时求解了基质系统与裂缝系统的传导率矩阵方程,实现了高效的耦合计算。而在结果可视化方面,程序设定每20个时间步刷新一次压力场等高线图,动态效果如同心电图波动,非常适合用于组会汇报时的演示录屏。
项目自带的案例库实用性很强,尤其是二维测试案例中预设了交叉裂缝场景。出于好奇将裂缝渗透率由100mD提升至1000mD后,观察到流体前缘明显沿裂缝方向加速推进,这种直观的现象比教科书中的静态插图更具教学意义。不过需要注意的是,三维案例的数据加载较为耗资源,笔者在运行时曾导致16GB内存的笔记本卡顿近五分钟,建议在处理大规模模型前确保具备充足的计算能力。
手册第17页详细介绍了非结构化网格的生成方法,指导用户如何利用 distmesh 工具箱构建三角形网格系统。尝试自定义区域函数时发现:
fd = @(p) ddiff(drectangle(p,-100,100,-100,100), dcircle(p,0,0,50));
上述匿名函数实现了一个矩形区域内挖去圆形区域的操作,对于熟悉地质构造建模的研究者而言,这样的几何处理方式十分亲切。但在实际应用中若裂缝密度过高,可能出现网格剖分失败或出现奇异矩阵的问题,此时可参考手册第23页提供的故障排查表进行调试。
总体而言,尽管该 EDFM 实现基于纯 MATLAB 环境,界面风格偏传统,但其代码结构清晰、逻辑严谨,非常适合用于理解离散裂缝建模的基本原理。近期尝试将其压力求解模块提取出来,接入深度学习代理模型,结果显示出良好的兼容性。若后续能进一步开发图形化操作界面(GUI),相信会在工程应用领域获得更广泛的关注与使用。


雷达卡


京公网安备 11010802022788号







