多孔介质多相流,水驱油模型,达西两相流模型comsol
多孔介质里水和油的博弈挺有意思的。想象下往沙子里倒水把油挤出来的场景,这背后就是典型的水驱油模型。搞过地下油藏模拟的都知道,达西定律是这里的祖宗规矩,不过当油水两相搅和在一起时,事情就变得微妙了。
咱们先别急着上代码,说个接地气的比方。就像用吸管喝珍珠奶茶,吸的时候奶茶液体流动(水相),珍珠颗粒相对运动(油相),多孔介质就是那根吸管的结构。COMSOL里搞这个,得先明白相对渗透率曲线和毛细管压力曲线这俩活宝,它们决定了油水怎么在孔隙里较劲。
来段COMSOL的模型设置代码尝尝鲜:
model = Model() model.component("comp1").physics("spf").create("wp", "WaterProperties") model.component("comp1").physics("spf").feature("wp").set("k_rw", "s_w^3") model.component("comp1").physics("spf").feature("wp").set("k_ro", "(1-s_w)^2")这段代码定义了水相的相对渗透率krw随含水饱和度sw的三次方变化,油相的k_ro随含水饱和度的平方衰减。实际工程中这个指数可能要现场数据校准,但教学模型用幂律关系式足够说明问题。
毛细管压力处理更讲究,COMSOL里可以直接调用内置的Brooks-Corey模型:
model.component("comp1").physics("spf").feature("pc").set("model", "BrooksCorey") model.component("comp1").physics("spf").feature("pc").set("lambda", 2.5) model.component("comp1").physics("spf").feature("pc").set("s_wr", 0.2)这里lambda是孔隙尺寸分布参数,s_wr是残余水饱和度。设置这些参数时得盯着实验数据,不然模拟结果和实际油井产能对不上号就尴尬了。
边界条件设置是重头戏。比如在二维模型中,左边设注水井,右边设生产井:
model.component("comp1").physics("spf").boundaryCondition("inject").set("p0", 2e6) model.component("comp1").physics("spf").boundaryCondition("produce").set("p0", 1e6)压力差驱动流体运动这个设定看似简单,但实际运行时经常遇到数值震荡。这时候得在求解器设置里调时间步长策略,或者打开自适应网格细化功能。
结果后处理阶段,用切面图看含水饱和度分布最直观。某次模拟结果发现前缘推进出现指进现象,修改相对渗透率曲线的指数后明显改善。这说明模型参数对流动形态影响比想象中敏感,调参时得准备三套数据:实验室数据、现场数据和专家经验值。
遇到过最坑的情况是达西速度场和饱和度场耦合计算时发散。后来改用分离式求解器,把压力方程和饱和度方程拆开迭代,配合Line Search算法才稳住。这种数值计算的花式操作,教科书里可不会告诉你。
最后说个冷知识:COMSOL的多物理场耦合计算其实可以偷懒——先算单相流场,再把这个速度场冻结住,用来计算两相运移。虽然物理上不够严谨,但对快速评估方案可行性特别管用,毕竟油藏工程师的时间比CPU时间贵多了。