news 2026/10/18 2:20:20

CMG STARS热采与泡沫模拟:数据体构建与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMG STARS热采与泡沫模拟:数据体构建与避坑指南

简介:这是一份CMG数模软件SRS模块的入门教程PPT,聚焦油藏数值模拟中的热采与泡沫模拟场景,适合石油工程相关专业学生、科研人员及现场工程师快速上手。内容从STARS模块的关键字设置入手,系统梳理了输入输出控制、网格与油藏定义、流体组分定义、岩石流体特性、初始条件及井定义等数据体构成,并结合氮气及氮气泡沫压水锥数值模拟案例,讲解模型建立、运行和结果后处理要点。整套资源共1个pptx文件,压缩包大小5.48MB,便于直接查看学习;目前已有825人学习。通过该教程可以清晰了解SRS模块的模拟流程、常用关键字含义以及油藏热采模型从数据准备到结果分析的完整路径,有助于降低上手门槛并为实际项目建模提供参考。

1. 从SRS到STARS:这份热采与泡沫模拟入门资源能解决什么

拿到这份PPT资料的人多半会有个疑问:标题写着“CMG数模软件SRS模块”,翻到第二页看到的却是满屏的STARS关键字。SRS不是笔误,而是不少人对CMG数模软件里STARS模块的通俗叫法。STARS是热采与添加剂模拟模块,常用于稠油蒸汽吞吐、蒸汽驱、氮气泡沫压水锥、化学剂驱替等场景。这份入门教程的价值在于把数据体(Dataset)的七个区块从关键字到填法完整串了一遍,并且对泡沫模拟给出了从组分定义到注入参数的完整链路。适合刚接触数值模拟、被关键字和单位制绕晕的新手,也适合从黑油模拟转向热采模拟、想快速建立建模思路的工程师。

2. STARS数据体七区块:先看懂关键字,再动手写数据体

STARS的数据体就是一个带大量星号关键字的文本档案,看起来吓人,实际上是按固定顺序堆叠的。第一层是输入输出控制,第二层是网格与油藏定义,第三层是流体与组分定义,第四层是岩石流体特性,第五层是初始条件,第六层是数值方法控制,第七层是井与动态数据。很多新手拿到模板后直接在中间加井位、改渗透率,却忽略了头部的单位制控制,结果算出来的注入量差了百万倍还不知道问题在哪。

2.1 INPUT/OUTPUT CONTROL:单位制与输出频率是第一个分水岭

数据体文件头部的INUNIT和OUTUNIT决定了整个算例的单位体系。STARS常用的是SI(SI制)和FIELD(矿场制),FIELD制下压力单位是psi、温度单位是华氏度,而SI制下压力是kPa、温度是摄氏度。从模板复制数据体时最容易翻车的地方就在这里,模板里是FIELD,你只改了网格和井参数就提交运行,输出的压力和温度全部对不上现场实测。

OUT文件写入频率WPRN和SR2结果写入频率WSRF也是新手容易忽略的。*WPRN决定打印到.out文本文件的迭代信息详略,*WSRF决定写二进制结果文件(SR2文件)的频率。如果你要跑一个几百口井、几十万网格的热采模型,WSRF FREQ设成1意味着每个时间步都写完整结果,磁盘很快就满了;但设得太大又会导致想看中间过程时结果缺失。我一般前期用粗网格调试时把WSRF FREQ设成10或20,确认模型没问题再加密网格、加密输出。

一个典型的数据体头部长这样:

-- 数据体头部的输入输出控制段 *TITLE1 'FOAM FLOOD PRELIMINARY MODEL' *TITLE2 'SECTOR MODEL - X WELL GROUP' *INUNIT SI *OUTUNIT SI *MAXERROR 20 *WPRN ITER 10 *WSRF FREQ 10 *WSRF RST 1 *RESTART 1 *MAXSTEPS 5000

这段里面*MAXERROR 20表示最多允许20个错误就终止运行,防止数据体有大量错误时白跑几个小时;*MAXSTEPS 5000是最大时间步数限制,避免模型不收敛时无限迭代下去。WSRF RST 1和RESTART 1配合使用,表示定期写重启文件,这样算到一半断电或者磁盘满了,不用从头再跑,直接从最近的重启点接着算。这几个关键字说起来简单,但实际项目里很多人就是忘了配重启文件,导致一次崩溃损失几天计算时间。

INPUT/OUTPUT CONTROL段落里还有一个容易混淆的选项:OUTSRFF。它控制SR2文件里存哪些结果场,默认是常规的饱和度、压力、温度场。如果你要分析泡沫组分浓度或化学反应产物分布,必须在OUTSRFF里显式加上这些组分,否则后处理时找不到对应结果,又要重跑一遍。

2.2 GRID AND RESERVOIR DEFINITION:网格方向、深度与无效网格

网格定义是数据体里信息量最大的段落,也是最容易出错的部分。STARS用GRID声明网格类型,用DI、*DJ、*DK三个关键字分别声明I、J、K三个方向的网格步长。这里有个工程经验:I、J方向并不天然对应地质模型的X、Y方向,从角点网格或地质建模软件导出的数据,必须确认I方向与X轴的对应关系,否则井位坐标会全部错位,模拟出来的饱和度场就像镜像翻转一样。

DTOP定义网格顶部深度,DEPTH定义网格中心深度,PAYDEPTH定义油层中部深度。对于水平或近水平油藏,用DTOP加DI、DK就可以;对于带倾角的油藏,要配合DIP关键字逐层给倾角数据。很多新手把DTOP当成每个网格的深度逐层给数据,其实DTOP通常只需要给第一层的顶深,其余层会按DK自动累加。

无效网格的处理也在这个段落里。*NULL CON 1表示1号岩石类型全部无效,*PVCUTOFF是孔隙体积截断值,当某个网格的孔隙体积小于该值时自动置为无效网格。这个参数在实际项目中非常有用,可以让模型自动剔除那些孔隙度极小、对流动没有贡献的网格,节省计算量。

一个简化的网格定义片段:

-- 网格与油藏定义段 *GRID 'CART' *DI CON 25.0 *DJ CON 25.0 *DK CON 5.0 *DTOP 1500.0 *POR CON 0.30 *PERMI CON 1500.0 *PERMJ CON 1500.0 *PERMK CON 300.0 *NULL CON 1 *PVCUTOFF 5.0E-5 *END-GRID

*POR CON 0.30表示所有网格孔隙度都为0.30,*PERMI、*PERMJ、PERMK分别给I、J、K三个方向的渗透率。垂直渗透率PERMK通常比水平渗透率低一个数量级,这个比例关系对热采模拟尤其重要,蒸汽超覆现象就是垂向渗透率与重力平衡的结果。如果你手头有小层数据表或等值线图,应该把这些值分区域赋值,而不是全模型一个常数——常数网格只能用来调试代码逻辑,不能用来做开发方案。

2.3 FLUID AND COMPONENT DEFINITIONS:组分与K值是热采控制方程的地基

流体组分定义是STARS与黑油模拟器最大的区别。黑油模拟只有油、气、水三相,而STARS允许你自定义多个组分,比如水、表活剂、溶解气、氮气、泡沫液膜等。组分定义用MODEL开头,后面跟组分总数、相总数、水相组分总数、油相组分总数。组分的物性参数包括摩尔质量CMM、质量密度MASSDEN、临界压力PCRIT、临界温度*TCRIT,这些参数直接参与闪蒸计算和物性计算。

PPT中的一个标准六组分例子是这样写的:

-- 流体与组分定义段 *MODEL 6 6 4 2 *COMPNAME 'WATER' 'SURFACT' 'OIL' 'SOL_GAS' 'N2' 'LAMELLA' *CMM 0.018 0.308 0.4 0.018 0.028 0.018 *MASSDEN 1000.0 1137.0 965.0 14.46 *PCRIT 22048.0 992.8 1475.5 4544.0 3394.0 3394.0 *TCRIT 374.0 527.0 434.0 -82.72 -147.0 -147.0

六个组分分别是水、表活剂、油、溶解气、氮气和泡沫液膜(LAMELLA)。注意*CMM的单位是kg/mol,水的摩尔质量0.018 kg/mol对应18 g/mol;*MASSDEN的单位是kg/m³,表活剂质量密度1137 kg/m³是通过原液密度换算出来的,这个换算过程在泡沫模拟章节会详细展开。*PCRIT单位是kPa,*TCRIT单位是摄氏度,填表时千万不要把温度填成开尔文,否则临界性质全部错乱。

热采模型里还有一个经常被跳过的参数是流体焓系数CPL1到CPL4、CPG1到CPG4。焓系数决定蒸汽在不同温度下的热焓,直接影响蒸汽干度和热损失计算。PPT里专门提到如果做热采而不给焓系数,蒸汽的注入热量会被严重低估。此外,固相组分需要给SOLID_DEN和SOLID_CP,这是焦炭沉积和燃烧反应模拟时必须要用的,火烧油层模型里这两个参数缺一不可。

3. 泡沫模拟四个关键设置:组分、相渗插值、吸附与注入参数

泡沫模拟是STARS模块里最具特色也最容易做错的部分。STARS并不把泡沫当成单独的相来模拟,而是把气泡和液膜看作一种稳定的分散组分,这个分散组分存在于气相或液相中。泡沫的所有特征——吸附特性、封堵孔道的特性、非线性粘度特性、扩散传播——都是通过分散组分的参数来描述的。理解了这一点,再看PPT里那一堆泡沫关键字就不会晕了。

3.1 发泡剂密度换算:从原液密度到MASSDEN的完整推导

泡沫模拟第一步是确定表活剂组分的物性参数。PPT里给了一个经典例题:发泡剂原液密度为1.044 g/cm³,有效浓度为35%,发泡剂摩尔质量为0.308 kg/mol,水的摩尔质量为0.018 kg/mol。让你求纯发泡剂的质量密度*MASSDEN。

很多人在这一步直接用1.044乘以35%得到0.3654 g/cm³,这是错的。原液是“表活剂+水”的混合溶液,35%是表活剂在溶液中的质量分数,不是体积分数。正确思路是利用体积叠加关系:单位体积原液中,表活剂占的体积加上水占的体积等于1。写成公式就是:

1 / 原液密度 = 表活剂质量分数 / 纯表活剂密度 + 水质量分数 / 水的密度

用Python把这个换算写出来:

# 发泡剂原液物性换算 rho_solution = 1.044 * 1000 # 原液密度:1.044 g/cm3 -> 1044 kg/m3 w_surf = 0.35 # 有效浓度(质量分数) w_water = 1 - w_surf # 水的质量分数 rho_water = 1000.0 # 水的密度,kg/m3 # 体积叠加关系求纯表活剂密度 # w_surf/rho_surf + w_water/rho_water = 1/rho_solution rho_surf = w_surf / (1.0/rho_solution - w_water/rho_water) print("纯发泡剂质量密度: %.1f kg/m3" % rho_surf) # 摩尔密度 = 质量密度 / 摩尔质量 MW_surf = 0.308 # 表活剂摩尔质量,kg/mol MOLDEN_surf = rho_surf / MW_surf print("纯发泡剂摩尔密度: %.1f mol/m3" % MOLDEN_surf)

运行这个脚本会得到纯发泡剂质量密度约1137 kg/m³,正好是上一章*MASSDEN数据表里表活剂那列的数值。摩尔密度约3691.6 mol/m³。这个换算的工程背景是:矿场上拿到的表活剂通常是稀释好的原液,而STARS数据体里要填的是纯组分的物性,不是原液的物性。如果直接把原液密度填进去,表活剂组分的质量就会偏大,导致注入浓度、吸附量等所有参数全部失真。

**提示:**这个换算默认忽略表活剂与水混合时的体积收缩效应。对大多数矿场用的表面活性剂体系,这个误差在可接受范围内;但如果做的是高浓度表活剂段的精细实验模拟,需要用实验测定的混合密度数据来修正。

3.2 相渗内插:DDTRAPW/DDTRAPN与高、低界面张力相渗的插值逻辑

表活剂进入油藏后会大幅降低油水界面张力,界面张力降低又会导致毛细管力减小、残余油饱和度降低、相对渗透率曲线趋于直线。STARS中处理这个现象的方式是:在一个岩石类型里定义两套相渗端点,高界面张力对应无表活剂时的常规相渗曲线,低界面张力对应高表活剂浓度时的极限相渗曲线,然后用插值函数按界面张力大小在两者之间插值。

PPT里给出的插值参数是DDTRAPW和DDTRAPN,其中*DDTRAPW控制水-油相对渗透率随界面张力的插值,*DDTRAPN控制气-液相渗随界面张力的插值。插值所需的输入包括插值组分(*INCOMP)、界面张力数据(*IFTTABLE)、泡沫插值函数(*FMSURF)以及两套相渗表(SWTT和SSLT)。

示意性的相渗端点设置如下:

-- 岩石流体特性段中的相渗插值设置 *ROCKFLUID *RPT 1 *INCOMP SURFACT *IFTTABLE -- 界面张力随表活剂浓度的变化 0.0 35.0 0.001 5.0 0.01 1.0 *DDTRAPW -- 高界面张力(无表活剂)时的油水相渗表 *SWTT *SW *KRW *KROW 0.25 0.0 0.9 0.40 0.03 0.6 0.60 0.10 0.3 1.00 0.50 0.0 -- 低界面张力(高表活剂浓度)时的油水相渗表 *SLT *SW *KRW *KROW 0.15 0.0 1.0 0.40 0.10 0.7 0.60 0.25 0.4 1.00 0.85 0.0

这里*IFTTABLE给出了界面张力从35 mN/m降到1 mN/m的过程,*DDTRAPW在高界面张力相渗表和低界面张力相渗表之间做线性或对数插值。注意低界面张力相渗表的残余油饱和度从0.25降到了0.15,水相相对渗透率端点从0.5升到了0.85,这就是表活剂驱提高采收率的核心机理在数值模型里的体现。

实际项目中,这两套相渗表来自室内实验的驱替测试。如果你只有常规相渗数据而没有低界面张力相渗数据,可以先用“残余油饱和度降低一半、相渗曲线变直”的规律构造一套初始估计值,跑通模型后再用实验数据校准。不要因为这个参数看起来复杂就直接放弃泡沫模拟选项,那是把STARS最核心的功能白白浪费了。

3.3 泡沫特征与吸附参数:FMMOB、FMCAP、ADMAXT的物理意义与实际取值

泡沫在STARS中通过影响气相的相对渗透率来实现“封堵”效果。具体来说,泡沫液膜以分散组分(如LAMELLA)的形式存在,当气相想流动时,液膜会堵塞孔隙喉道,导致气相相对渗透率成倍下降。泡沫阻力因子*FMMOB就是控制这个下降幅度的关键参数。*FMMOB取50意味着气相相对渗透率降为原来的1/50,取200则降为1/200。矿场泡沫驱模拟中,*FMMOB常见的取值区间是50到200,具体数值需要用岩心泡沫驱替实验的历史拟合来校准。

泡沫并不是在任何条件下都能稳定存在的。*FMSURF是形成泡沫所需的最低表活剂浓度,低于这个浓度泡沫不生成;*FMCAP是临界毛管压力,毛管压力超过这个值液膜破裂、泡沫消失;FMOIL是临界含油率,含油饱和度太高时泡沫会被油相“杀死”。这三个参数一起构成了泡沫稳定存在的相态边界。实际设置时需要注意:如果模型里含油饱和度本来就高于FMOIL,泡沫会在油区附近全部消泡,模拟出来的泡沫前缘会明显滞后于实验观察到的现象。

吸附参数是另一个容易出问题的地方。表活剂在岩石表面会吸附,ADMAXT是最大吸附量,单位是每单位岩石体积吸附的摩尔数;ADRT是吸附速率。实际油藏中表活剂吸附量可达几毫克每克岩石,这意味着注入的表活剂有一部分被岩石“吃掉”了,必须提高注入浓度来补偿吸附损耗。PPT中给出的参数设置建议是:先按室内静态吸附实验得到的吸附等温线设置ADSLANG和ADMAXT,然后通过历史拟合微调。一个常见的坑是忘记设置吸附参数,导致表活剂推进过快、泡沫段塞过早突破,生产曲线失真。

3.4 注入井参数:蒸汽干度、注入浓度与井控制

泡沫模拟的最后一个关键设置在注入井上。注泡沫通常分三段:前段注表活剂溶液建立泡沫段塞,中段注氮气或烟道气形成泡沫,后段注水驱替泡沫前缘向前推进。在STARS中,注入井用*INJECTOR定义,*INCOMP指定注入流体的组分摩尔分数,*STINTW指定注入蒸汽温度,*QUAL指定蒸汽干度。

一个注氮气泡沫的注入井数据体片段:

-- 注入井定义与注入参数 *INJECTOR 'INJ1' *INCOMP WATER 0.997 SURFACT 0.003 N2 0.0 *TINJW 200.0 *QUAL 0.0 *OPERATE DIFF 5.0E-5 *WELL 1 *PERF *GEO 'INJ1' *LAYER 1 1 1 1 1

*INCOMP后面的数字是注入流体各组分的摩尔分数。这里给的是水和表活剂两组分,实际注入时通常同时注入氮气,*INCOMP里要加上N2的摩尔分数。TINJW是注入温度,QUAL是蒸汽干度,注冷泡沫时QUAL为0,注蒸汽泡沫时QUAL取0.7到0.8。*OPERATE DIFF 5.0E-5表示井底压差控制模式下最大注入压差为50 kPa,防止注入压力超过地层破裂压力。

注入浓度的换算必须单独说一句。现场通常给出的是表活剂在注入水中的质量浓度(如0.3%),而*INCOMP需要的是摩尔分数。两者之间的换算要用表活剂和水的摩尔质量来折算,0.3%质量分数对应的摩尔分数大约是0.0017。直接把质量分数当成摩尔分数填进去,会导致实际注入的表活剂量比设计量少一个数量级,泡沫根本形不成。

4. 热采模型从建立到运行:初始条件、井定义与后处理

泡沫模拟只是STARS能力的一部分,大部分应用场景还是稠油热采:蒸汽吞吐、蒸汽驱、SAGD。PPT把这部分安排在了泡沫模拟之后,从初始条件讲起,再到井定义、生产动态设置,最后是运行与后处理。这几个环节环环相扣,任何一个环节出错都会让前面所有工作白费。

4.1 初始条件:垂直平衡、参考压力与温度场

初始条件段用*INITIAL开头,*VERTICAL声明垂直平衡初始化。垂直平衡的含义是:模型在初始条件下处于重力-毛管力平衡状态,压力和饱和度随深度自然分布。REFPRES和REFDEPTH给参考压力及参考深度,其余网格的压力按流体静压力自动计算。*TEMP给初始温度场,热采模型中这个参数必须与实际油藏温度一致,否则蒸汽注入后的热损失计算全部偏大。

饱和度初始化有两种方式:直接给各网格的饱和度值,或者给油水界面、油气界面的深度。*SW、*SO、*SG分别给水、油、气饱和度,*DWOC给油水界面深度,*DGOC给油气界面深度。原油油藏通常用界面深度方式初始化,界面深度以上的网格含油,以下网格含水。如果界面的设定与地质储量报告不一致,计算出的原始地质储量就会偏差很大。

一个典型的热采模型初始条件设置:

-- 初始条件段 *INITIAL *VERTICAL *REFPRES 15000.0 *REFDEPTH 1500.0 *TEMP 45.0 *DWOC 1650.0 *DGOC 1450.0 *SW *EQUIL *SO *EQUIL *SG *EQUIL

*SW *EQUIL表示水的饱和度按垂向平衡自动计算,油、气饱和度同理。TEMP 45.0是原始油藏温度,单位是摄氏度。热采模型里TEMP填错是致命的——如果你把45°C填成45K,蒸汽注入温度200°C和油藏温度的温差会偏差近200摄氏度,热损失和加热半径完全失真。

初始条件段还有一个容易被忽略的点:对于泡沫模拟,初始时油藏中不应该有表活剂和泡沫液膜组分。如果从其他算例复制数据体,要检查是否有残留的组分初始浓度赋值,否则模型一开始就带着高浓度表活剂,注入压力、含水率等指标全部异常。这个问题在第5章的避坑部分会专门展开。

4.2 井定义与射孔:WELL、OPERATE、PERF的关键顺序

STARS中井定义的关键字顺序非常重要,必须先定义井名和井类型,再设置操作条件,最后射孔。井定义段从RUN开始,用WELL声明井名,*PRODUCER声明生产井,*INJECTOR声明注入井。*OPERATE设置工作制度,生产井可用定液量、定油量或定井底流压控制,注入井可用定注入量或定注入压力控制。

蒸汽吞吐模型还有一个特殊阶段:焖井。焖井阶段不需要注入也不需要生产,只需要让井关闭一段时间模拟热量扩散。STARS中使用*SHUTIN命令将井关闭,按时间步继续推进,等焖井结束后再恢复生产。这个逻辑看似简单,实际操作时很多新手把焖井阶段的井底流压设成0,导致模型在焖井期间持续回流,模拟出的生产动态严重偏离实际。

井筒几何参数*GEOMETRY对热采模拟的影响也很显著。*GEOMETRY K 0.15 0.0 表示井筒半径为0.15米、表皮系数为0,后续还需要给定井筒传热系数来计算井筒热损失。实际项目中,井筒热损失参数需要与矿场的井口温度和井底温度测试数据做匹配,否则注入蒸汽到达井底时的干度可能与设计值相差很大。

4.3 运行与结果后处理:OUT文件里看什么、SR2文件里查什么

模型运行后会产生两类结果文件:.out文本文件和SR2二进制文件。.out文件记录了每步的迭代信息、物质平衡误差、警告和错误信息;SR2文件保存了压力场、温度场、饱和度场等动态结果,供可视化后处理软件读取。判断一个模型是否算“成功”,不是看程序有没有跑完,而是看.out文件里的物质平衡误差和收敛行为。

检查.out文件的基本操作:

# 快速扫描 out 文件中的警告与错误 grep -E "WARNING|ERROR" model.out | head -30 # 查看物质平衡汇总 grep -A 5 "MATERIAL BALANCE" model.out | tail -30

grep输出中,如果ERROR行数超过*MAXERROR设置的值,程序会提前终止;如果只有少数WARNING,通常不影响结果。物质平衡误差是更重要的指标,STARS默认的物质平衡容差在1e-5量级,但工程上物质平衡误差小于0.1%就认为可以接受。如果误差持续增大,通常是时间步长过大或网格太粗造成的。

SR2文件的后处理通常在可视化软件中完成。需要重点检查的场包括:温度场(蒸汽腔扩展范围)、含油饱和度场(热驱波及效率)、压力场(注入井周边压力响应),以及泡沫组分浓度场(泡沫前缘推进位置)。对于氮气泡沫压水锥模拟,还要关注含水率随时间的变化曲线上是否出现了泡沫段塞到达生产井时的含水率下降台阶。

5. 避坑指南:STARS建模与运行中的六个高频问题

STARS模块的参数体系庞大,真正跑起来之后出问题的位置高度集中。我把实际项目中遇到最多的问题整理成六条,按“现象、原因、解决”的方式列出来,这些坑基本覆盖了从建模到运行的主要环节。

5.1 建模与数据准备阶段:三个高频坑

坑一:单位制混用导致注入量差百万倍

现象是模型能跑通,但注入井的累积注入量、产出液量等指标和矿场报表对不上,甚至差出几个数量级。原因多半是数据体头部写的是*INUNIT SI,但后面某个区块的密度、深度数据是从FIELD单位模板里直接复制过来的。比如深度填了英尺,压力填了psi,而单位制声明的是SI,模型内部换算后网格深度和压力全部错乱。

解决方法是建模完成后花10分钟做一次单位自查:检查深度数据是否在几百到几千米量级、压力是否在几千到几万kPa量级、密度是否在几百到一千多kg/m³量级。发现任何一位数偏离这个范围,先查单位制,再看数据本身。这个习惯能避免绝大多数单位制陷阱。

坑二:网格方向与地质模型不一致导致井位错位

现象是井的定义坐标看起来没问题,但后处理中井的轨迹明显偏离了地质模型中的实际位置,饱和度场看起来像是镜像翻转。原因通常是*DI、*DJ方向与地质建模软件导出的X、Y方向没有对应起来。角点网格导出时I方向可能对应X方向也可能对应Y方向,不同软件处理方式不同。

解决方法是建模前画一个很小的网格几何做方向标定:在一个粗网格模型里定义一口井,看井落在哪个网格块,再和地质模型的坐标对比。确认方向一致后再进行大规模数据导入。我一般会在模型正式计算前先跑一个1到2个时间步的诊断算例,检查井位、网格体积和初始储量,确认无误后再跑完整模型。

坑三:泡沫组分初始化不为零导致泡沫“凭空出现”

现象是注泡沫模拟的初始阶段注入压力异常偏高,或者含水率曲线一开始就异常下降,仿佛油藏里本来就有泡沫。原因是从其他泡沫算例复制数据体时,初始条件段残留了表活剂或LAMELLA组分的浓度赋值,新建模型没有将这些值清零。

解决方法是检查初始条件段和组分定义段,确认表活剂和LAMELLA的初始浓度为零。具体做法是在*INITIAL段显式写出所有组分的初始摩尔分数,不写就可能沿用上一个算例的残留数据。这个坑特别隐蔽,因为.out文件不会报错,只有查看初始组分的分布云图时才能发现异常。

5.2 运行与收敛控制阶段:三个高频坑

坑四:迭代不收敛时盲目缩小DTMAX

现象是模型运行中时间步反复被截断,迭代次数持续飙升,日志里频繁出现不收敛的提示。很多人的第一反应是把*DTMAX从10改成0.1,结果模型倒是能算过去,但计算量暴增,一个原本几小时的算例变成几天都跑不完。

实际上,不收敛的原因多数不在时间步长,而在物性和控制参数。正确排查顺序是:先检查NORM设置是否过严,NORM的默认值是每一时间步内压力的最大允许变化量,设得太小会让模拟器频繁截断时间步;再检查NEWTONCYC是否过小,牛顿迭代次数不够就无法在单个时间步内收敛;最后看AIM自适应隐式选项是否开启,没有开启时全显式计算在热采模型中很容易发散。这些都检查过后,才轮到调整*DTMAX。

坑五:重启文件没配置导致算例白跑

现象是算例跑了三天,剩最后一步时机器断电或磁盘写满,整个算例从头开始重新计算。原因很简单:数据体里没有写WSRF RST和RESTART,模拟器从头到尾只保留一份输出文件,没有保存任何中间状态。

解决方法是任何超过12小时的算例都必须配置重启机制。数据体头部加WSRF RST 1让模拟器按固定时间间隔写入重启文件,再加RESTART 1让模拟器在重启时读取最近的存档点。配置一次成本极低,但能省下大量重复计算时间。我的习惯是所有正式方案算例都设成每5个时间步写一次重启文件,即便出问题最多丢失几分钟的计算进度。

坑六:相渗插值端点不全导致泡沫不起作用

现象是最气人的:注泡沫算例和注纯气算例的生产曲线几乎重合,泡沫阻力完全没有体现。原因是相渗插值设置不完整:*DDTRAPW定义了插值函数,但高界面张力相渗表和低界面张力相渗表只给了一套,插值没有终点可插,模拟器只能退回到同一套相渗。

解决方法是检查SWTT和SLT两套相渗表是否都给了数据,并且高低界面张力端点之间的差异是否合理。还有一个隐藏参数FMSURF,如果设置了泡沫最低浓度但注入浓度远低于该值,泡沫也永远不会生成。排查时先确认注入浓度大于FMSURF,再确认两套相渗表都有效,最后看*FMMOB是否给成了默认值1——*FMMOB等于1意味着泡沫阻力因子为1,气相渗透率没有被任何折减,泡沫自然不起作用。

6. 结果验证三板斧:OUT文件诊断、SR2后处理与粗化校验

模型算完不等于结果能用。我拿到任何STARS算例的最终结果,都会先做三件事:诊断OUT文件、检查SR2关键场、用粗化模型交叉验证。做完这三步,才有底气把模拟结果拿到方案讨论会上去讲。

第一板斧是OUT文件的收敛性体检。从.out文件中抽取“MATERIAL BALANCE”段落,检查累计物质平衡误差是否小于0.1%。同时统计每条警告的出现次数,特别关注与负饱和度、负压缩性相关的警告。用一行命令就能完成大部分检查:

# 汇总输出文件中的警告条目及出现次数 grep "WARNING" model.out | sort | uniq -c | sort -rn | head -10

如果热力学警告出现几十次,说明有局部网格的物性超出了有效范围,要定位到具体网格和时间步去查。

第二板斧是SR2后处理的关键场检查。泡沫模拟案例至少要看下面这几个场。

检查对象后处理中看什么判断标准
温度场蒸汽腔纵向扩展范围蒸汽腔前缘与射孔段对应,形态对称
含油饱和度热驱波及区含油饱和度下降幅度蒸汽腔波及区So明显下降,冷凝带可见
泡沫组分浓度泡沫前缘推进距离前缘到达生产井前含水率上升放缓
压力场注入井周围压力响应泡沫段塞期间注入压力升高但未超破裂压力

后处理中最有价值的是把含油饱和度场和泡沫浓度场叠加显示,能直观看出泡沫段塞是否有效封堵了高渗条带,让后续注入流体转向低渗区域。如果泡沫前缘推进速度过快,多半是吸附参数设小了或者泡沫阻力因子偏低。

第三板斧是网格粗化交叉验证。细节网格跑出来的结果如果和粗网格结果趋势矛盾,要先怀疑细网格模型的数值问题,而不是直接相信细网格更准。我的习惯是把同一模型在20×20的粗网格上跑一遍,调整参数观察响应趋势,确认物性和相对渗透率取值合理后,再上细网格做最终计算。粗网格跑一个算例可能只需要20分钟,细网格要跑三天,但粗网格已经把大部分参数错误过滤掉了。

有一个让我印象深刻的教训:某次接手一个氮气泡沫压水锥模拟项目,直接细网格跑了三天,出来含水率曲线和矿场实际动态完全相反,查了两天才发现是初始表活剂浓度没有清零,模型一开始就带着泡沫在跑。从那以后,我每次建模都强制走一遍固定流程:单位制检查、初始化浓度清零、OUT文件物质平衡验证、粗网格先行。这套流程帮我挡掉了至少一半的无效计算。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 2:20:18

智能硬件视频会议适配:算力、时延与协同的硬约束突破

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 2:18:58

PLC与单片机协同控制的工业分拣系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 2:17:50

车规MCU安全启动全解析:信任根、启动链与主流方案对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 2:17:36

CAS+SpringMVC+Shiro单点登录实战:解耦认证与权限

简介:本资源是一套基于CAS、SpringMVC与Shiro三者深度集成的单点登录(SSO)完整实践项目,面向Java Web开发中高级工程师及企业级权限系统构建者,解决多应用系统间统一身份认证与细粒度权限管控难题。压缩包共316个文件&…

作者头像 李华
网站建设 2026/10/18 2:17:13

FSoE黑通道原理与实操:功能安全通信的核心设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 2:16:29

RAG落地不踩坑:用R2R一键搭建知识库问答服务的实战指南

先说说我为什么盯上这个框架。之前做知识库问答,用通用编排框架把向量库、分块、检索、上下文组装、模型调用一层层串起来,代码能跑,可一旦要接文件上传、做多租户隔离、对外暴露REST接口、搞流式输出,那些跟RAG本身没关系的工程活…

作者头像 李华