1. 深层咸水层CO₂封存模拟概述
作为一名在地下碳封存领域摸爬滚打多年的工程师,我深知数值模拟对于评估封存方案可行性的重要性。COMSOL Multiphysics作为一款强大的多物理场仿真平台,特别适合处理咸水层封存中涉及的多相流、化学反应和热力学耦合问题。这次我们要模拟的是2000米深度的咸水层场景,这个深度下CO₂通常处于超临界状态,密度接近液态但粘度类似气体,这种特殊物性使得其在地下运移行为极具挑战性。
深层咸水层封存模拟的核心在于准确捕捉三个关键过程:CO₂在多孔介质中的渗流、溶解于地层水的过程以及与矿物的化学反应。这三个过程的时间尺度差异巨大——渗流发生在数月到数年尺度,溶解过程需要数年到数十年,而矿物反应则可能持续数百年。这种多尺度特性使得模拟工作既需要精细的物理场设置,又需要合理的求解策略。
2. 几何建模与地层参数化
2.1 轴对称模型构建
对于深层咸水层这种大尺度问题,采用全三维模型计算成本过高,而轴对称模型在保证精度的前提下能显著提高计算效率。在COMSOL中,我推荐使用"二维轴对称"空间维度,这相当于自动考虑了第三维的旋转对称性。
实际操作中,先在"几何"界面选择"二维轴对称",然后通过参数化曲线定义地层结构。这里分享一个实用技巧:将地层倾角、厚度等关键参数设为全局参数,方便后续参数化研究。例如:
code复制% 全局参数定义
depth = 2000; % 储层顶部深度(m)
thickness = 100; % 储层厚度(m)
dip_angle = 10; % 地层倾角(度)
2.2 地层参数化建模
使用参数化曲线而非直接绘制的好处在于,当需要调整地层倾角时,只需修改dip_angle参数值,整个几何会自动更新。具体实现如下:
code复制curve1 = model.geom.create('curve1', 'ParametricCurve');
curve1.set('parmin', '0');
curve1.set('parmax', num2str(thickness/cos(dip_angle*pi/180)));
curve1.set('x', 's*cos(dip_angle*pi/180)');
curve1.set('y', depth+'-s*sin(dip_angle*pi/180)');
这种参数化方法特别适合进行敏感性分析,比如研究不同地层倾角对CO₂运移路径的影响。需要注意的是,在定义曲线参数范围时,要考虑倾角引起的斜边效应(除以cosθ),确保实际垂直厚度符合预期。
3. 多物理场耦合设置
3.1 达西流与溶质运移耦合
在"多物理场"节点下,需要同时添加"多孔介质中的达西流"和"溶质运移"接口。关键设置包括:
- 流体属性定义:
code复制rho = rho_water*(1 - S_co2) + rho_co2*S_co2
mu = mu_water*(1 - S_co2)^2.5 + mu_co2*S_co2^2.5
这里采用了混合流体模型,其中S_co2是CO₂的饱和度。注意粘度模型采用了幂律混合规则,这比简单的线性混合更符合实验观测。
- 相对渗透率模型:
code复制krw = (S_w - Swr)^nw / (1 - Swr)^nw
krg = (S_g - Sgr)^ng / (1 - Sgr)^ng
其中Swr和Sgr分别是水和气的残余饱和度,nw和ng是经验指数。对于咸水层系统,推荐Swr=0.25,Sgr=0.05,nw=ng=2。
3.2 矿物反应动力学
在"化学反应"节点下添加矿物反应,以方解石沉淀为例,反应速率采用TST(过渡态理论)表达式:
code复制rate = A*exp(-Ea/R*(1/T-1/Tref))*(1 - Ω/Keq)
其中:
- A指前因子:1e-4 mol/(m²·s)
- Ea活化能:35 kJ/mol
- Ω离子活度积:Ω = a_Ca2+ * a_CO32- / γ±²
- Keq平衡常数:温度函数
特别注意在高盐度条件下(>1mol/kg),必须考虑活度系数γ±的影响。建议启用Debye-Hückel修正:
code复制logγ± = -A|z+z-|√I / (1 + Ba√I) + CI
其中I是离子强度,A、B、C是经验参数。
4. 材料属性与初始条件
4.1 多孔介质参数
咸水层的关键参数包括:
- 孔隙度:0.1-0.3(典型值0.15)
- 渗透率:10-100mD(各向异性比kz/kr=0.1-10)
- 毛细压力:采用van Genuchten模型
code复制Pc = P0*(Se^(-1/m) - 1)^(1-m)
Se = (Sw - Swr)/(1 - Swr)
其中P0=5kPa,m=0.5是典型参数。
4.2 初始条件设置
合理的初始条件对模拟结果影响巨大:
- 压力场:静水压力梯度
code复制P_init = rho_water*g*depth + rho_water*g*(y-depth)
- 盐度分布:真实地层通常具有盐度梯度
code复制c_salt = c0 + grad_c*(y-depth)
建议grad_c=0.1kg/m³/m,这会导致盐度差约10kg/m³在100m厚储层中。
5. 求解器配置技巧
5.1 时间步长策略
CO₂注入过程涉及快速压力传播和缓慢的溶解/反应过程,需要智能时间步长控制。推荐采用分段策略:
code复制tsteps = [0 logspace(-3,1,50) linspace(10,365*10,100)];
solver.autoStep = 'off';
solver.tlist = tsteps;
这种设置可以在初期(0-10天)用密集步长捕捉压力波传播,后期用稀疏步长跟踪长期过程。
5.2 非线性求解器设置
多物理场耦合容易导致收敛困难,建议调整:
- 启用"常数牛顿迭代"选项
- 设置阻尼因子0.7-0.9
- 最大迭代次数增加到50
- 相对容差放宽到1e-4
对于强非线性问题,可以先用稳态求解器获得初始解,再切换到瞬态求解。
6. 后处理与结果分析
6.1 封存效率评估
定义三个关键指标监控封存效果:
- 结构封存占比:捕集在盖层下的自由相CO₂
code复制eta_struct = intop1(S_co2>0.05)/V_total
- 溶解封存占比:溶解于咸水中的CO₂
code复制eta_diss = intop1(c_co2aq)/m_injected
- 矿物封存占比:转化为碳酸盐矿物的CO₂
code复制eta_min = intop1(rho_calcite*V_calcite)/m_injected
6.2 泄漏风险评估
关键监测指标:
- 盖层突破时间:CO₂饱和度前锋到达盖层的时间
- 最大上浮高度:CO₂羽流顶部到达的最高位置
- 井周压力:注入井周围1m处的压力变化
建议设置派生变量自动监测这些指标:
code复制breakthrough = maxval(S_co2@top_boundary)>0.1
max_height = max(y*(S_co2>0.1))
P_well = P@r=1m
7. 网格敏感性分析与验证
7.1 网格收敛性测试
进行网格独立性验证的步骤:
- 创建3套不同密度的网格(粗/中/细)
- 比较关键输出变量(如累计注入量、前锋位置)
- 确保相对差异<5%
推荐使用边界层网格强化近井区域分辨率:
code复制mesh1 = model.mesh.create('mesh1', 'geom');
mesh1.feature.create('bl1', 'BoundaryLayer');
bl1.set('nlayers', 5);
bl1.set('thickness', 0.1);
7.2 参数敏感性分析
必须考察的关键参数:
- 渗透率各向异性比(kz/kr)
- 毛细压力参数(P0,m)
- 盐度梯度(grad_c)
- 矿物反应速率常数
使用COMSOL的参数扫描功能:
code复制study = model.study.create('sens');
study.set('param', {'kz_kr','P0','grad_c'}, 'plistarr', {[0.1,1,10], [1,5,10], [0,0.1,0.5]});
8. 实际工程经验分享
8.1 常见错误排查
- 质量不守恒问题:
- 检查边界条件是否闭合
- 验证材料密度定义
- 增加网格密度
- 求解发散处理:
- 减小初始时间步长
- 调整非线性求解器设置
- 简化物理模型(如先忽略化学反应)
8.2 计算效率优化
- 使用对称性简化模型
- 对长期模拟采用粗网格+大时间步
- 并行计算设置:
code复制solver.feature('p1').set('nproc', 4);
solver.feature('p1').set('nthreads', 8);
- 结果存储策略:
- 仅存储关键时间步
- 使用压缩格式
- 禁用不必要的变量输出
经过多次项目实践,我发现盐度梯度对CO₂溶解速率的影响往往被低估。一个实用的经验法则是:当盐度差超过20kg/m³时,自然对流会使溶解速率提高2-5倍。因此在实际建模中,务必进行详细的盐度分布调查。