COMSOL含裂缝地层流动和传热耦合,油藏数值模拟,COMSOL裂缝流动,包含注入井与生产井,考虑裂缝交叉。
裂缝性地层的渗流问题总能让人血压拉满——注入井和生产井之间那些歪七扭八的裂缝网络,活像被熊孩子扯烂的蜘蛛网。最近用COMSOL折腾了个裂缝交叉的油藏模型,带传热耦合的那种,记录几个实战要点。
先看裂缝建模这个老大难。COMSOL里处理交叉裂缝有个骚操作:用二维线段模拟裂缝网络,再通过"线到面的升维"生成裂缝单元。比如下面这段代码定义裂缝交叉点:
% 创建裂缝交叉拓扑 frac_lines = [0.2 0.8; 0.5 0.5; 0.8 0.2]; % 裂缝线坐标 intersect_point = [0.5, 0.5]; % 强制设置交叉点 model.geom('geom1').feature().create('frac1', 'Line'); model.geom('geom1').feature('frac1').set('p', [0.2 0.8; 0.5 0.5]);注意这里手动指定交叉点坐标,避免自动检测可能出现的拓扑错误。毕竟地层裂缝可不是数学课上那种完美交叉的直线,野外实测数据里经常出现"藕断丝连"型的局部连通。
传热耦合的核心在于设置多物理场接口。达西流模块和热传导模块的联姻代码长这样:
physics('darcy').link(therm); % 物理场耦合 physics('darcy').prop('rho').set('expression', '1000*(1-0.0002*(T-293))'); % 温度影响流体密度这里有个魔鬼细节——流体密度随温度变化的非线性关系直接影响压力场分布。实际跑模拟时遇到过温度变化导致迭代不收敛的情况,后来在求解器设置里勾选"非线性增强"才搞定。
生产井和注入井的边界条件设置是另一个深坑。比如生产井的井底流压约束:
% 生产井边界条件 bnd_cond = model.physics('darcy').feature.create('prod_well', 'Pressure', 1); bnd_cond.selection.set([3]); % 选择井边界 bnd_cond.set('p0', '50*bar'); % 井底流压注意单位换算这个隐形杀手!COMSOL默认用国际单位制,但油藏工程常用bar或psi。有次手滑写成50没带单位,结果模拟出的产量比中东油田还夸张...
裂缝渗透率的各向异性设置更是个玄学问题。实测数据表明裂缝内渗透率可能比基质高3-5个数量级:
mat = model.material.create('frac_material'); mat.propertyGroup('def').set('k', [1e-12, 0; 0, 1e-15]); % 裂缝主方向渗透率1D,垂直方向1mD这种量级差异容易导致数值震荡,建议在求解器里开启自适应网格细化。有个取巧办法:先在粗网格上跑出压力场趋势,再用该结果作为细网格初始值。
后处理阶段建议重点关注温度场与压力场的相互影响。比如这张温度云图显示注入冷水导致近井地带出现明显的温度漏斗(配图示意),这种热应力反过来又会影响裂缝开度——典型的鸡生蛋蛋生鸡问题。
最后给个忠告:跑这种耦合模型前务必检查工作站电源插头。上次隔壁老王忘保存结果,恰逢保洁大妈拔了插头做清洁,他盯着黑屏的表情比看到油价暴跌还精彩...