简介:面向COMSOL仿真用户的THM热流固耦合两相流模型资源,适用于石油工程、地热开发等领域中饱和水与油流动的数值模拟,也可扩展至水与超临界二氧化碳两相流场景。模型完整涵盖热-流-固三场耦合,用户可根据实际需求自由修改几何、材料参数及边界条件,灵活性高。资源包共含14个文件,以8个Word文档为主体,详细讲解模型构建原理与结果分析,辅以4张示意图直观展示网格与云图,另有2个HTML页面方便浏览器快速查看关键结论,压缩包整体仅3.91MB,轻量易下载。已有133人学习使用,收敛性表现优异,计算速度快且鲁棒性强,能够稳定获取可靠结果。无论是初涉多场耦合的入门研究者,还是需要高效仿真工具的工程人员,这套模型都能显著节省建模调试时间,是实践THM两相流耦合分析的高效参考。
1. 为什么说THM两相流模型不只是一个“能跑的算例”
COMSOL两相流THM热流固耦合模型,听起来像是某个课题的定制算例,但它其实是地热开发、油藏工程、二氧化碳封存里最常用到的一类硬骨头。很多工程师在THM耦合上翻车,往往不是因为流体模块不会建,而是温度、压力、饱和度、应力四个场互相咬合,稍有设置不当就发散或结果明显失真。这个模型把饱和水和油的两相流动、热传导、固体变形放在一个耦合框架里,声称收敛性好、计算速度快、鲁棒性好,实际使用中确实能省去大量调试时间。适合正在做油藏热采、地热储层改造、核废料处置等方向的人,也适合想从单相流过渡到多场耦合的仿真用户。
2. 先拆物理:油水两相流与热流固三场耦合的数学结构
在动手设置COMSOL之前,我建议你先有控制方程在手边。不是说要手动推导整套公式,而是要知道你用的每个接口到底在解什么方程,哪些耦合项是内置的,哪些需要你手动加。这一章就把油水两相流、传热、固体力学三块拆开,再合到一起。
2.1 流场:饱和水和油的两相Darcy流动,怎么进COMSOL
饱和水和油的两相流动,在低渗多孔介质里通常用两相Darcy流动来描述。每一相的达西速度为
v_α = - (k_rα K / μ_α) (∇p_α - ρ_α g ∇z)
其中α代表水或油,k_rα是相对渗透率,K是绝对渗透率,μ_α是动力黏度。饱和度方程则是
∂(φ S_α)/∂t + ∇·v_α = q_α
并且有S_w + S_o = 1。毛管压力把两相压力联系起来:p_o - p_w = p_c(S_w)。水相压力通常作为主要求解变量,油相压力由毛管压力函数得到。
在COMSOL里,模型向导中选择“多孔介质多相流”接口,在两相情况下会直接以压力和饱和度为因变量。如果你用的版本里找不到这个接口,可以用一个“Darcy定律”接口加上一个对流-扩散PDE,把饱和度作为因变量,再自己定义相对渗透率和毛管压力。我一般会优先用现成的“多孔介质多相流”接口,因为它已经内置了饱和度约束、相流量公式和存储项,能少写很多容易出错的耦合项。
设置时要注意下面几点:
- 流体材料:水和油分别建材料,密度和黏度都可以写成温度的函数。油类物质在温度升高时黏度下降明显,这个变化对THM耦合影响很大,不要用常数凑合。
- 相对渗透率:最常用的是Corey模型。比如水相相对渗透率写成S_w的4次方,油相写成(1-S_w)^2,具体指数根据岩心实验标定。没有实验数据时,用这两个指数作为默认起点是常见的做法。
- 毛管压力:可以用van Genuchten模型,也可以用简单的指数函数。重点是毛管压力函数要单调,导函数不能为0,否则饱和度方程会出现退化,也是后面积分不收敛的原因之一。
- 初始饱和度:不要一拍脑袋给一个常数。最好先做一步“无流动初始化”,让饱和度和毛管压力在域内平衡,再开始瞬态求解。很多新手第一次跑就报饱和度越界,就是忽略了这一步。
这里我给出一个典型的参数起点表,适合尚未拿到实验数据时的快速验证,具体数值要按你的岩心或数值实验调整:
| 参数 | 建议值/范围 | 说明 |
|---|---|---|
| 水密度 | 1000 kg/m3 | 可按温度修正 |
| 油密度 | 850 kg/m3 | 可按温度修正 |
| 水黏度 | 1e-3 Pa·s | 随温度指数下降 |
| 油黏度 | 5e-3~0.1 Pa·s | 温度敏感,建议用插值函数 |
| 绝对渗透率 | 100 mD(约1e-13 m²) | 各向异性时可分列 |
| 孔隙度 | 0.2~0.3 | 会随有效应力变化 |
| 水相残余饱和度 | 0.2 | 经验值 |
| 油相残余饱和度 | 0.15 | 经验值 |
| Corey指数 | 水相4、油相2 | 非油藏实验时可用 |
注意,两相Darcy流动在COMSOL中的变量默认可能使用“多孔基体体积平均流速”或“Darcy流速”,这会影响你加载的速率边界条件和后处理。我习惯用Darcy流速,即单位面积体积流量,这样和井的注入量、采出量换算比较直观。后处理时如果发现速度量级不对,先检查这个单位约定。
2.2 温度场与应力场:THM三场耦合的耦合项在哪
温度场在多孔介质里的控制方程是能量守恒:
(ρC_p)_eff ∂T/∂t + (ρC_p)_fluid (u·∇)T - ∇·(k_eff ∇T) = Q
其中(ρC_p)_eff是基体和流体的体积平均热容,k_eff是有效导热系数,u是达西流速或者体积平均流速。注意,这个方程里的对流项不是通常的流速,而是多孔介质内的流体热容加权的速度。在COMSOL中,使用“多孔介质传热”接口时,它会自动把流体的速度场耦合进来,你只需要指定有效导热系数和串联/并联模型。
应力场部分就是线性弹性或弹塑性固体的力平衡方程:
∇·σ_eff + F = 0
σ_eff = σ - α_Biot p_w I
这里采用有效应力原理,α_Biot是Biot系数。温度的影响通过热应变进入本构方程,线弹性本构里Δε_th = α_T (T - T_ref)。热膨胀系数是体积热膨胀系数,各向同性情况下等于线膨胀系数的3倍,在COMSOL固体力学接口里按线膨胀系数输入。压力耦合则在多物理场“孔隙弹性”节点中自动加到应力张量上。
耦合关系实际上有三个方向:
- 流→固:孔隙压力和饱和度变化引起有效应力变化,产生变形。
- 热→流:温度影响流体黏度和密度,从而影响渗透和饱和度分布。
- 热→固:热应变产生位移,位移又会通过孔隙弹性改变体积应变,进而影响孔隙度和渗透率。
- 固→流:这步最容易被忽略。变形改变孔隙度,孔隙度变化又改变存储系数,对两相Darcy方程产生一个源项。如果在COMSOL里直接用一个“变量”把孔隙度改为有效应力的函数,而不在流体接口的“存储”项中增加∂φ/∂p项,会导致流体质量不守恒,这是后面会讲到的常见坑。
在COMSOL里实现三场耦合,通常是在同一域上叠加三个物理场接口:多孔介质多相流、多孔介质传热、固体力学。然后通过多物理场节点加入“孔隙弹性”和“非等温流动”或“热膨胀”耦合。如果你用的是较新版本的COMSOL,多孔介质多相流接口本身支持与固体力学耦合的“变形多孔介质”设置,确认在“多孔介质”节点下启用“孔隙率依赖于压力/应力”选项。
一个稳妥的设置顺序是:先单独跑通流动,再跑通传热,再挂上固体力学。三场全耦合容易把问题混在一起,出问题时不知道是哪个场在发散。先两两耦合,找到每个耦合节点的效果,再全耦合,是省时间的好习惯。
另外一个常见疑问是:“我能不能用用户自定义的PDE来写两相流,避免‘多孔介质多相流’接口的黑匣子?”我的看法是:如果你需要实现特殊相渗模型或非标准毛管压力,用PDE未必比现成接口慢。但PDE接口要自己处理保守形式和数值震荡,调试成本高。对于标题里提到的“收敛性好、计算速度快、鲁棒性好”,现成接口带来的帮助远大于损失。只有当你的流动方程与标准Darcy模型有本质区别时,才值得自写PDE。这个判断同样适用于COMSOL模型中的其他场。
3. 搭建模型:从几何到求解器的关键设置
物理拆完之后,我们开始搭模型。这一章按我常用的顺序走:几何与边界条件、物理场与耦合节点、求解器配置。每一步都直接影响你能不能真正“跑起来”,而不是只在概念上成立。
3.1 几何与边界条件:简化不是偷工减料
THM两相流模型本身已经够复杂,几何上没有必要一上来就还原真实储层形态。常见做法是先用二维矩形或轴对称圆筒验证可行性,再逐步增加断层、裂缝、夹层。一个经典的简化模型是:水平方向100米、垂向50米的矩形域,模拟一个注采井对,或者只在左侧设注入井,右侧设产层边界。这样的几何能让你先看清饱和度前锋、温度锋面和位移分布,再谈工程细节。
在COMSOL里创建几何时,建议直接在矩形域中挖掉井筒区域,而不是用点源/汇。因为井筒附近压力梯度大,用点源会在后处理和网格加密时带来奇异问题。挖掉一个半径0.1米的小圆作为井孔,然后用边界条件或汇项定义流量,效果稳定得多。根据地层对称性,可以使用轴对称模型,把三维问题降到二维,计算量少一个数量级,这也是“计算速度快”的一个重要来源。
边界条件的设置顺序是:
- 流动边界:注入井壁给定流量或压力,产层边界给定初始压力。如果模拟定压生产,外边界压力固定;如果模拟封闭油藏,外边界为零流量。
- 热边界:注入温度低于或高于地层温度时,井壁边界给固定温度;外边界可以用隔热(零热通量)或固定地层温度。这个选择会影响温度锋面传播。
- 力学边界:底部固定,左右两侧滚支,顶部自由。如果模型包含盖层,盖层顶面可以加一个自由面并受上覆压力。
需要注意,COMSOL中不同物理场对同一个几何实体可以使用不同的边界条件,例如井孔边界既是流体的流入边界,也是固体的自由表面边界。建立选择时建议为每个物理场单独命名边界选择,比如“注入井壁_流体”,防止后边调整几何时选错边界。
说到几何参数,我习惯把所有几何尺寸定义为参数,而不是直接在绘图界面输入数字。这样后面做参数化扫描(比如改变井距、水油比、注水量)会非常方便。COMSOL中的参数扫描可以自动创建一组衍生解,避免你手动复制模型。同一批参数还能在导入网格、设置材料时复用,减少改一处漏一处的尴尬。
3.2 物理场接口选择与耦合节点:先建流场,再挂温度与应力
在模型向导里,我一般按以下顺序添加物理场:
- 多孔介质多相流(两相,油和水)
- 多孔介质传热
- 固体力学
顺序不是必须的,但流场先建,因为温度和固体力学都需要用到速度场的表达。添加完成后,在“组件”下会看到三个物理场节点和一个“多物理场”节点。在多物理场节点中,加入以下耦合:
- 孔隙弹性:耦合固体力学与多孔介质多相流。这里COMSOL会要求选择一个压力变量,默认是流体压力。在多相流情况下,通常采用水相压力作为等效孔隙压力。如果你的问题要求两相压力的各自贡献,比如考虑毛管压力对应力的影响,需要自定义一个等效孔隙压力变量,比如p_eff = S_w * p_w + S_o * p_o。这个细节是决定THM模型是否精确的常见分歧点。
- 非等温流动或热-流耦合:耦合多孔介质传热与多孔介质多相流。它会自动把温度场中的流体热容项与流动速度结合,你只需要确保流体材料的密度和热容随温度变化是合理的。
- 热膨胀:耦合固体力学与多孔介质传热,把温度场作为热载荷。
在设置物理场时,最容易出错的是“界面条件”。比如注入井壁上的热边界,实际可能同时存在流体注入和热通量。COMSOL允许在同一个边界上叠加多个物理场的边界条件,但要避免“定义了流量又定义了固定压力”,这会让求解器无所适从。我的习惯是:边界上只对流动定义一个条件(流量或压力),热边界和力学边界各自独立设置,不互相影响。
材料设置上,流体材料建议用内置材料库中的常用流体,再修改为温度相关的属性。如果你已经有实测的黏温曲线,用插值函数是最佳选择。COMSOL中可以用“插值”函数导入一个文本表格,然后在材料属性里引用该函数。对于基体岩石,各向同性时只填密度、杨氏模量、泊松比、导热系数、热容和热膨胀系数。如果做正交各向异性,渗透率和弹性张量都要定义完整,复杂度会立刻翻倍,不建议新手一上来就挑战。
注意:两个物理场共享同一个几何域时,要确保网格域选择一致,尤其不要在一个物理场中选择“所有域”,另一个只选择部分域,这会在耦合时产生无效变量。
3.3 求解器配置:为什么默认求解器会卡,手动调什么
模型建完后,求解器默认会自动选择全耦合或分步。对于THM两相流,默认全耦合常常导致内存占用大、迭代发散。我一般会手动切到“分离式求解器”,自定义求解顺序:先解流体压力和饱和度,再解温度,最后解位移。这一步在哪里改取决于版本,大体上是求解器配置→分离步骤→添加三个分离步,分别选择对应的因变量。
分离式求解器还有几个参数值得调:
- 最大迭代次数:默认可能只有几次。两相流加THM耦合经常需要较多分离迭代,我通常设到25~50次,并在“高级”里开启“一致初始化”或“全局牛顿”选项。
- 阻尼因子:如果压力残差震荡,把阻尼从1改成0.7~0.9,能明显提高稳定性。但阻尼过小会让收敛变慢,建议从0.9开始往下试探。
- 因变量标度:压力和位移的量纲差异很大。COMSOL默认会自动标度,但如果残差提示“因变量标度不可靠”,手动把压力标度设为1e6(以Pa为单位),位移设为1e-3(以m为单位),流动时间按你的时间尺度标定。
- 时间步长:瞬态求解时,COMSOL的自适应时间步在THM耦合中容易“冒进”,导致某个时刻残差突然增加。建议设置最大时间步为总模拟时间的1/50或更小,再开启“恢复早期解”功能。这样可以避免前锋扫过时步长过大。
网格方面,三相耦合模型对网格质量很敏感。粗网格虽然快,但饱和度前锋和应力集中区会被抹平;细网格又会导致每个时间步的牛顿迭代代价剧增。我通常先跑一个粗网格+短时间(比如1小时)的模拟,检查场分布是否光滑、饱和度是否出界、位移是否合量级,再针对注入井附近做一层边界层网格加密。记住:网格无关性验证不是最后一刻才做的事,它要伴随参数调优的全过程。
4. 参数怎么设:物性、初始值、收敛判据的实用清单
THM模型的“玄学”很多时候不在模型结构,而在参数。参数给得不合理,求解器再强大也救不回来。这一章把油水两相流、热流固耦合里最关键的那些参数列出来,并说明它们对收敛和速度的真实影响。
4.1 油水两相流的相渗曲线与毛管压力参数
相渗曲线是两相流模型的灵魂。和单相渗流不同,两相流中每一相的有效渗透率都随饱和度变化,如果相对渗透率为零,该相在网格内的传输就关闭,容易造成数值不连续。COMSOL里可以用解析函数定义:
S_w_star = (S_w - S_wr)/(1 - S_wr - S_or) k_rw = (S_w_star)^nw k_ro = (1 - S_w_star)^no
其中S_wr和S_or分别是束缚水和残余油饱和度。这个模型的优点是简单,参数少,数值稳定;缺点是没有体现相渗曲线在低饱和度端的缓变特征。如果你手头有实验测得的曲线,建议用COMSOL的“插值”函数导入,并启用“端点外推”到零。
毛管压力函数常用van Genuchten形式:
p_c = (1/α_vG) (S_e^{-1/m} - 1)^(1-n_vG)
其中S_e是有效饱和度。需要注意,毛管压力函数的导数在饱和度趋近残余饱和度时会变得非常大,这会让线性化矩阵病态。一个规避方法是在饱和度接近端点时对p_c函数做平滑截断,或者给p_c加一个很小的最小斜率。工程上常说“毛管压力是两相流不收敛的主要来源之一”,我深有同感。
另一个容易忽略的是初始饱和度与毛管压力的协调。如果你给初始饱和度S_w=0.5,但按毛管压力函数,这个饱和度对应的两相压差为某个正值,而你又给初始压力为静水压,那么求解器要在一个极小时间步内把压力场和饱和度场重新平衡,很容易震荡。解决方案是先跑一个“无流动初始化”求解步:关闭注入流量,只让压力和饱和度在毛管压力平衡下稳定下来,然后用这个稳定解作为瞬态初值。
4.2 热-流-固耦合的关键物性:孔隙度、渗透率、热膨胀系数
三场耦合里,孔隙度是承上启下的枢纽。它不仅控制流体存储量,还影响导热系数和弹性模量。很多建模者把孔隙度设为常数,这简化了问题,但当压力变化大时,孔隙度的变化会显著影响有效应力;反过来,变形也会改变储层渗透性。在COMSOL中,你可以定义孔隙度随有效应力的线性变化:
φ = φ_0 - c_φ * (σ_eff - σ_eff0)
其中c_φ是孔隙度对应力的敏感系数。但要注意,这样定义后,质量守恒方程中的存储项必须包含∂φ/∂p贡献。更稳妥的方式是利用COMSOL的“孔隙弹性”节点自动生成的孔隙度表达式,而不是手动写变量。
渗透率与孔隙度的关系最常用的是Kozeny-Carman式:
K = K_0 * (φ/φ_0)^3 * ((1-φ_0)/(1-φ))^2
这式子虽是经验关系,但它能保证渗透率在孔隙度下降时快速下降,用于应力敏感储层建模很顺手。如果你观察到仿真结果中压力分布对渗透率极敏感,先检查这个关系是否在合理范围,而不是怀疑求解器。
热膨胀系数对THM耦合的稳定性影响很大。如果只做常温渗流,热膨胀系数对结果的影响可以忽略;但如果模拟热采或热流注入,温度变化几十度到几百度,线膨胀系数每增加1e-5 1/K,热应变就可能超过弹性应变,单元扭曲就不再是罕见事。所以,热膨胀系数不要取“典型岩石值”就完事,要根据你的岩性和温度变化范围来评估。另外,导热系数在干、湿状态下差异很大,建议使用饱和状态下的有效导热系数,用体积平均或串联并联平均,而不是用干岩值。
以下是常用物性参数表,数值用于初步估算:
| 参数 | 岩石骨架 | 水 | 油 |
|---|---|---|---|
| 密度 kg/m3 | 2600 | 1000 | 850 |
| 热导率 W/(m·K) | 2.5 | 0.6 | 0.15 |
| 比热容 J/(kg·K) | 900 | 4200 | 2000 |
| 线膨胀系数 1/K | 1e-5 | 2e-4 | 5e-4 |
注意流体的线膨胀系数在传热里通常不起主导作用,但如果你用“热膨胀”耦合固体力学,只用固体的热膨胀系数即可。
4.3 计算速度与鲁棒性:时间步长、迭代容差、网格粗化
标题里强调了模型收敛性好、计算速度快、鲁棒性好,这其实和求解器参数、网格策略密切相关。时间步长是最直接的调节开关。瞬态THM耦合中,饱和度前锋和温度锋面以不同速度传播,如果时间步长大于局部传播时间,就容易出现振荡或负的饱和度。建议采用最大时间步长限制,同时允许自适应步长在内缩。通常把最大时间步设为总模拟时长的1/1000作为起点,如果发现太慢,再逐步放宽到1/500。
迭代容差方面,相对容差设为1e-3通常足够工程应用,设为1e-4会明显增加迭代次数,且不一定让结果更准。不要一开始就追求1e-6,那是数值洁癖。我通常使用分离式求解器时,压力和饱和度步用1e-3,温度和位移步用1e-4,但COMSOL的容差设置是全局统一或分物理场,具体可以调整因变量的容差加权,新手建议保持默认。需要知道的是:若模型反复在“牛顿迭代不收敛”上报错,先把相对容差放宽到5e-3试跑,看是不是容差设得太苛刻。
网格粗化是“计算速度快”的重要来源,但盲目粗化会让结果失真。常见做法是:注入井附近用边界层网格或局部加密,远离井的区域可以按比例放粗。一个矩形100m*50m的域,井周围0.1m,网格用10~20个单元,中间区域用0.5~2m的最大单元,总单元数控制在几千到一两万之间,就足以跑通二维模型。三维模型则要小心,几十万单元在THM耦合下内存会爆炸,建议先用轴对称或薄层模型验证。
5. 避坑:THM两相流模型最常见的5个翻车点
这一章是血泪经验合集。每个问题我都按现象、原因、解决来写,方便你对照排查。翻车不可怕,怕的是不知道往哪个方向查。
5.1 油水两相流初始饱和度的“黑匣子”问题
现象:模型一开始就报错,或者饱和度在第一个时间步出现负值、大于1。
原因:初始饱和度与毛管压力、初始压力分布不协调。COMSOL在求解两相流动时,饱和度和压力必须同时满足毛管压力关系。如果给一个均匀饱和度值,但压力场又是静水压,那么在边界附近会强制产生一个压力突变,导致初始状态不是平衡态。
解决:先做“无流动初始化”求解步。具体做法是在瞬态求解前,先冻结注入/采出条件,用一个小时间步让流动场自行平衡。也可以在“多孔介质多相流”接口中开启“初始化”功能,自动求解静水平衡。另一个补救措施是把初始饱和度定义为随压力变化的毛管压力反函数,保证初始压力与饱和度在同一毛管压力曲线上。
5.2 流固耦合不收敛:孔隙度更新导致的水量不平衡
现象:分离式求解器在“流场”步迭代次数持续增加,压力残差不降,甚至提示“质量守恒残留超过容差”。
原因:固体力学更新了孔隙度,但流场方程的质量存储项没有同步更新。例如把孔隙度定义成位移的函数,却仍使用常数孔隙度的存储系数,那么压力变化引起的流体质量变化和力学变形不一致。
解决:不要在流体接口里手动把孔隙度写成位移函数。正确做法是使用“孔隙弹性”多物理场,它会自动引入Biot系数和体积应变对存储项的贡献。如果是新版COMSOL,在多孔介质多相流“多孔介质”子节点中开启“孔隙率表达式”并选择“应力相关”选项。改完后要重新检查流体物质平衡,方法是在后处理中计算域内平均饱和度变化与边界累计流量的差值。
5.3 热应力把单元拉成负体积:几何非线性忘开了
现象:传热求解正常,但固体力学在温度变化较大时出现“未定义结果”,或单元雅可比为负。
原因:线性几何假设下,当热应变和孔隙压力引起的变形超过小变形范围,仍使用未更新几何,就会导致应力应变关系失真,甚至单元畸变。
解决:在固体力学接口的设置中,把“几何非线性”选为“自动检测”或强制开启。开启大变形后,多孔介质流动区域是否需要移动网格取决于变形量级;如果变形超过几个百分点,最好把“变形”节点加到多孔介质多相流中,让流体区域跟随固体变形。否则,可以分步加载温度,例如每步只加20度,让求解器更容易收敛。
5.4 超临界CO2版本的特殊坑:状态方程与密度突变
现象:把油相换成超临界CO2后,瞬态求解在临界压力附近压力振荡,收敛情况和鲁棒性都劣于油相。
原因:超临界CO2的密度、黏度和焓在临界点附近随温度和压力变化剧烈。若用常数或者简单的线性插值,会导致控制方程的非线性过于强烈,线性化迭代一越界就发散。
解决:换用温压相关的真实气体物性。常见做法是在外部查询表中按温度、压力网格取密度和黏度,导入COMSOL作为插值函数;或者用解析的Peng-Robinson状态方程配合COMSOL“理想气体”之外的“真实气体”模块。如果临界点区域不重要,还可以在设置中将工作区限定在远离临界点的压力区间,减少非线性。注意CO2在水中的溶解度也会改变流体性质,但两相流模型如果不考虑组分溶解,先不要加这一项,否则模型复杂度会失控。
5.5 网格无关性验证不是形式主义
现象:把网格加密一倍后,关键点温度或位移变化较小,但饱和度锋面位置差出几个网格宽度,甚至压力云图差异明显。
原因:两相流方程具有迎风特性和锋面,在粗网格下数值扩散会自动抹平饱和度前锋。应力场在线弹性问题中往往受网格影响较小,所以只看应力结果会让网格无关性验证得到假阳性。
解决:做网格无关性验证时,同时监测:井底压力、生产端流量或含水率曲线、剖面饱和度曲线,而不是只看某个点。加密网格时采用等比细化,并保证井周边界层网格数同步增加。如果饱和度剖面在加密后仍有明显差异,检查毛管压力和重力数,可能问题处在物理参数,而不是网格。网格无关性从来不是一步就能完成,先跑粗网格、中等网格、细网格三个级别,再决定最终网格密度。
6. 验证与进阶:用解析解校准模型,再改成水+CO2
模型能跑不代表结果正确。在放大工程应用之前,我建议先用解析解或半解析解给模型“验身”。验证通过后,再改造成水+超临界CO2版本,才算把标题里的能力真正握在手里。
6.1 用一维Terzaghi固结解做热流固耦合验证
对于流固耦合,最经典的一维Terzaghi固结问题可以验证孔隙压力和位移的瞬态行为。构造一个宽度很窄的柱状域,顶部自由并施加压力载荷,底部固定且排水边界,时间演化中孔隙压力消散过程与固结解析解对比。在COMSOL中,关闭两相流,用一个Darcy接口和固体力学耦合,按有效应力原理求解,观测某点孔隙压力随时间变化。两者偏差在5%以内,说明“流固耦合”的核心路径正确。再做传热验证,可以加一个恒定热源或边界温度,对比一维热扩散解析解。只有这两步都通过,才允许自己继续调油水两相流参数。
6.2 从油水两相流扩展到水+超临界CO2两相流的改动清单
扩展时,不要复制整个模型再改流体材料。我一般会按以下清单操作:
- 将油的材料节点替换为CO2,定义密度和黏度作为温度和压力的插值函数或真实气体表达式。
- 检查相对渗透率和毛管压力曲线。水和CO2的相渗曲线与油水不同,尤其是在超临界条件下界面张力和润湿性变化明显,需要更换参数。
- 修正热物性:CO2的比热容、导热系数随温度和压力变化大,不能用常数。热容的插值尤其重要,否则能量方程可能不守恒。
- 关闭不适用的大变形假设。如果模拟的是封存场景,注入压力高,变形大,几何非线性要保留。
- 重新初始化饱和度场,避免用油水模型的初值。CO2密度低,重力作用和重力稳定性与油完全不同。
我在做这类模型时,有一个习惯:先不急着上全耦合,把每个物理场单独跑通,再两两耦合,最后三场全耦合。这个习惯让我少踩了很多坑。THM两相流模型不是一次就能跑得漂亮的“一键算例”,但只要你按本文的顺序拆解,用解析解验证每一环,再按避坑清单排查,收敛和鲁棒性是可以建立起来的。希望帮到你。
本文还有配套的精品资源,点击获取