☰
CMG SRS随机油藏模拟实操:从CMOST参数设置到P10/P90产量预测
2026/10/17 19:28:50 网站建设 项目流程

简介:CMG数模软件SRS模块使用入门教程以一份PPT课件形式呈现,面向油藏数值模拟工程师与石油工程专业学生,旨在帮助初学者快速理解SRS(STARS)模块的模拟逻辑与操作要点。课件内容系统覆盖软件简介、STARS模块主要关键字(如输入输出文件名控制、网格和油藏定义、流体组分定义、岩石流体特性、初始条件、数值方法控制及井定义等)、所需数据的准备与处理、油藏热采模型的建立与运行、结果后处理,并专门给出氮气及氮气泡沫压水锥数值模拟案例,涵盖泡沫过程模拟的关键思路。资源共1个pptx演示文稿文件,压缩包大小5.48MB,结构紧凑、侧重概念串联,便于对照软件界面边看边学。已有825人学习,读者可以借此快速掌握SRS模块从数据准备、模型搭建到结果分析的整体工作流,为后续独立开展热采或泡沫模拟打下基础。

1. SRS模块是CMG里哪个环节:先搞清楚它解决什么

历史拟合做完那一刻,很多油藏工程师刚松一口气,就撞上更难的追问:甲方问你这模型预测的五年产量有几成把握?确定性模型只能给一条曲线,给不出区间。CMG数模软件里的SRS模块就是解决这个的,中文语境下叫随机油藏模拟,工程落地由CMOST调度批量算例完成。

SRS做的事可以概括成一句话:把模型里靠不住的地质、流体参数设成带范围和分布的不确定变量,采样生成一批算例跑完,再把产量曲线汇总成概率分布,输出P10、P50、P90三条预测线。有了这个区间,开发方案的产量承诺才有置信度,经济评价的风险折减才有依据。

这篇教程适合两类人:会跑CMG单算例、想跨到概率预测的油藏工程师,以及想用SRS出方案报告的研究生。下面按“备什么、怎么搭、参数怎么给、结果怎么读、哪里翻车”展开,每步给可直接照做的参数。

2. SRS跑之前:模型基线、参数清单和输出指标

很多新手拿到SRS第一件事就是往CMOST里塞参数,盼着跑出来一条漂亮的P10-P90曲线。我见过太多这样的案例:模型本身没收敛,参数清单堆了十几个变量,跑完的龙卷风图完全没法解释。SRS不是点击就出图的按钮,它是一台榨汁机,放进去的是烂苹果,出来的不可能是好果汁。所以在按“运行”之前,三件事必须定下来:基线模型能不能站住、哪些参数值得设为不确定变量、用什么指标衡量结果。

2.1 基线模型三项检查:收敛、储量与历史拟合

SRS里的每一个算例,都是在这个基线模型上乘一个扰动系数生成的。基线模型带病,所有算例都会带着同一个病灶,而且SRS的大批量运行会把问题放大:本来单个算例勉强跑完的病态网格,在100个算例里可能直接崩掉三成。所以基线检查不是走过场,我一般按三个层次查。

第一项是数值收敛。用模型中后段一天的实际生产制度跑完一个完整算例,打开日志文件查三件事:有没有负饱和度、压力有没有越界、时间步有没有频繁回退。CMG日志里时间步反复缩短又回退,通常意味着数值网格有问题,这类模型在SRS批量运行里会成批失败。

第二项是储量匹配。把模型的STOIIP或GIIP与地质建模的量版对比,偏差一般控制在5%以内。这一步常被跳过,因为默认建模阶段已经对过。但实际上从地质模型粗化到模拟网格,储量损失5%到10%很常见。SRS参数里如果还有孔隙度乘子、含油饱和度,储量偏差会被再次放大,预测曲线的区间宽度会失真。

第三项是历史拟合。SRS做不确定性分两种场景:历史拟合之前评估模型不确定性,历史拟合之后做预测风险分析。绝大多数人碰到的是后一种。此时区块级历史拟合至少要达到趋势一致、产油和含水率总体偏差在可接受范围内,否则SRS输出的P50曲线会偏离实测数据,甲方一眼就能发现。检查项和及格线整理成下面这张表,直接对着打勾就行。

检查项做法及格线
数值收敛用实际生产制度跑通算例,查日志无负饱和度,时间步不反复回退
储量匹配模拟储量对比地质建模量版偏差5%以内
历史拟合至少完成区块级拟合产油、含水趋势一致,总体偏差10%以内

2.2 不确定性参数清单:地质、流体、动态三类怎么列

参数清单是SRS方案里最容易被做极端的一步。新手倾向多列,觉得变量越全越科学,结果算例数爆炸、结果解释困难;熟手倾向少列,只留自己熟悉的那几个,结果区间过窄、预测过度自信。我一般控制在6到10个参数,按三个类别分好。

地质类参数包括孔隙度乘子、水平渗透率乘子、垂向渗透率乘子、净毛比、含水饱和度。这类参数在模型文件里通常以乘子形式作用在整层或某个区域,注意渗透率一定要分方向,因为水平与垂向渗透率对产量的影响机制完全不同,合并成一个变量会掩盖真实的敏感性差异。

流体类参数指相对渗透率曲线的端点值和Corey指数。端点值包括油相最大相对渗透率、水相最大相对渗透率,决定两相流动的最终产液能力;Corey指数决定过渡带形态。流体参数的取值范围必须来自岩心实验或PVT报告,不能靠经验拍脑袋,因为它们对含水率的影响极其敏感,范围稍大含水率曲线直接失控。

动态井类参数包括井指数乘子、表皮系数、定压生产时的井底压力。这类参数影响近井流动效率,历史拟合阶段通常是主力调整对象。如果目标是评估未来预测的不确定性,这类参数仍然要留,但范围可以比地质类小一个量级。

这里有一条关键原则:相关性强的参数不要同时给大范围。孔隙度乘子与含水饱和度乘子同时大范围浮动,可能组合出“高孔隙、高含水饱和度”这种对储量影响互相抵消但物理上别扭的组合。更好的做法是先做单参数敏感性扫描,识别主控参数,再把次要参数固定在基准值附近。

类别典型参数表达方式常用范围参考
地质孔隙度乘子无因次乘子0.9~1.1
地质水平渗透率乘子无因次乘子0.5~2.0
流体油相相对渗透率端点0~1基准值±20%
流体Corey指数指数,常见2~4基准值±30%
动态井指数乘子无因次乘子0.8~1.2

2.3 输出指标怎么定:累产油、含水率还是地层压力

SRS每次运行都会输出海量结果,但真正进入后续分析的一般就几样:预测期末的区块累积产油量、某个关键时间点的含水率、区块平均压力。这几个指标对参数变化的敏感度差异很大。累产油对储量类参数敏感,含水率对相对渗透率参数敏感,地层压力对水体规模和传导率敏感。如果只定义累产油一个指标,你会得到一个看起来不错的区间,却说不清它到底被地质储量还是流动参数主导。

在CMOST里定义输出指标时,我的习惯是建两套:一套是历史拟合阶段的误差目标函数,模拟结果与实测数据做差;另一套是预测阶段的输出指标,取未来某个时间点的累积产量和含水率。这样SRS跑完一轮,既能看参数对历史的主导作用,又能看对未来的不确定性贡献,一张龙卷风图把两件事都讲清楚。

一个容易被忽略的细节是输出频率。SRS算例默认按模型自带的输出控制写结果文件,如果原模型设置了每步都写重启文件,100个算例能把磁盘撑爆。设置指标时顺便把输出频率改成按季度或半年输出,预测阶段足够用了。

提示:SRS批量跑之前,先拿基线模型单独跑一遍并确认输出全部正常。这一步能省掉后面一半的排障时间。

3. 搭一个能跑的SRS最小闭环:BUILDER导出、CMOST调度、Results回看

SRS的算例流程不是黑匣子,数据流很清晰:BUILDER建的模型文件是输入,CMOST负责生成参数组合并调度模拟器执行,模拟器把每个算例的结果写回指定目录,最后在Results里汇总可视化。我第一次在这条链路上卡了好几次,主要是不清楚CMOST到底改了什么、不改什么。把最小闭环完整跑通一次,后面就全顺了。

3.1 从BUILDER导出模型:先确认数据文件里的关键字

BUILDER导出的模型数据文件是文本格式。SRS要作为不确定性参数的孔隙度、渗透率、相对渗透率曲线,都以特定关键字存在这个文件里,CMOST改的是关键字后面的值,不动模型结构。所以做SRS之前,先确认这些关键字在不在、拼写符不符合当前模拟器的规范。

# 检查模型数据文件里的孔隙度、渗透率关键字是否存在 grep -ni "^PORO\|^PERMI\|^PERMJ" model.dat | head -5 # 检查相对渗透率表关键字,确认有可用的相渗数据 grep -ni "^KRO\|^KRW\|^SW" model.dat | head -10 # 检查水体关键字,水体对压力类指标影响很大 grep -ni "aquifer\|water body" model.dat | head -5

这段检查的意义在于:如果模型里没有独立的孔隙度分布,而是通过区域乘子统一控制,那SRS里对应的参数就应该设为区域乘子而不是全局孔隙度关键字。很多新手直接照教程在CMOST里添加孔隙度参数,运行时却报关键字不存在,第一轮就失败。另外,CMG关键字识别不区分大小写,但IMEX、GEM、STARS之间的关键字语法有差异,换模拟器后数据文件要做相应转换,这个坑在第5章会再提到。

3.2 在CMOST里建SRS算例:从导入到提交的六个步骤

CMOST是SRS调度的执行引擎,界面上的概念叫Study,本质是个参数试验管理工具。我一般按六步走,每一步对应一个必须想清楚的问题。

第一步,新建Study,选择模拟器类型,导入模型文件。这里要确认模拟器类型与模型文件匹配,导入后CMOST会解析模型并列出所有可用关键字参数,并做语法检查,有错直接标红。

第二步,在参数列表里添加不确定性参数。这一步对应第2章讲的参数清单,把参数映射到具体关键字。注意CMOST里参数名可以自定义,建议用带语义的命名,比如PermX_mult,跑完以后看结果不用猜。

第三步,设置每个参数的取值范围、分布类型和相关性。范围的设定方法下一章细讲,这里先记住一条:范围是给CMOST做采样用的,不是拍脑袋定的,每个范围都要能说出来源。

第四步,定义目标指标。历史拟合场景选误差函数,预测场景选未来节点的累积产量或含水率值。一个Study里可以建多个指标,建议至少建两个,一个对应历史拟合误差,一个对应预测结果。

第五步,设置采样方法和算例数。新手直接用默认的拉丁超立方采样,算例数先给50个做试跑,确认链路通顺后再加到正式数量。

第六步,选择运行环境提交。单机多核、集群都支持,按手头资源定。提交前确认输出频率已经调低,不然结果文件会撑爆磁盘。

设置项新手推荐值备注
采样方法拉丁超立方覆盖均匀,比纯随机稳定
试跑算例数50先验证链路,再加大
正式算例数100~300按单算例时长与资源预算定
指标个数2个以上历史误差 + 预测指标
输出频率季度或半年防止结果文件膨胀

3.3 批量运算与进度监控:别等跑完才发现失败

算例提交后不能放着不管。CMOST界面会显示每个算例的状态,但本地跑大算例时,我习惯开一个终端窗口实时看目录,避免界面卡顿耽误判断。

# 每分钟刷新一次,统计已完成的算例目录数量 watch -n 60 "find cases -maxdepth 1 -type d -name 'case_*' | wc -l" # 抽查某个算例日志的末尾,WARNING和ERROR是重点 tail -50 cases/case_037/model.log | grep -Ei "error|warning|blocked"

看日志的意义是提前发现趋势性问题。如果前20个算例里已经有3个报同一个关键字错误,后面80个大概率也错,应该停掉批量任务回去修参数或模型,而不是让几百个算例继续空跑。这个亏我吃过一次:夜里批量跑了400个算例,早上起来发现失败原因全是同一个相渗表引用错误,一半算例白跑。

3.4 第一轮跑完看什么:完成率、目标函数与异常算例

第一轮50个算例跑完后,先别急着打开Results看曲线。按顺序做三件事:看完成率、看目标函数分布、抽查异常算例。

完成率低于80%先排查失败原因。目标函数分布如果呈现明显双峰,说明参数空间里有某个参数把结果分成两个物理上不同的群体,通常是水体参数或相对渗透率端点在某个临界值两侧行为突变。抽查异常算例时看它的参数组合是不是落在范围边缘,如果大量失败算例集中在边缘,说明范围定宽了,下一轮要收窄。

至于画P10/P50/P90曲线,Results里可以直接加载多个算例的汇总文件做统计。这里有个细节:统计结果基于你选中参与统计的算例集合,如果混入失败算例的默认值,曲线会被污染。统计前确认加入集合的每个算例都是正常完成的。

4. SRS参数范围与分布:结果靠不靠谱全看这一步

SRS跑出来的区间宽度,几乎完全由参数范围和分布决定。给窄了,P10到P90区间窄得像一根线,甲方会问“不确定性就这么点?”;给宽了,区间宽到没有任何决策意义。参数范围设置是SRS里最像“玄学”的一步,其实有方法可循。我见过太多人在这里靠感觉拍板,结果整轮SRS变成自欺欺人的数字游戏。

4.1 参数范围三种定法:数据分位、单参数扫描、文献类比

第一种是数据分位法,最扎实。把岩心分析、测井解释的孔隙度和渗透率数据拿出来,统计P10和P90分位值,直接作为参数范围。比如某个层段测井解释渗透率P10是30毫达西、P90是300毫达西,那渗透率乘子的范围就按这个倍数关系设定。这个方法的好处是每个范围都有数据支撑,汇报时经得起问。

第二种是单参数扫描法,最实用。在基准值附近取±10%、±20%、±30%各跑一个算例,看目标指标的变化幅度。如果±10%就能让累产油变化5%以上,说明这个参数很敏感,范围要谨慎;如果±30%都看不出明显变化,说明它不敏感,可以考虑固定。这个方法也顺带回答了2.2节里“哪些参数值得保留”的问题。

第三种是文献类比法,用于冷门参数初期取值。同类油藏、类似开发方式公开发表的不确定性参数范围可以当起始值,但必须在第一轮SRS跑完后用前两种方法修正。直接用文献值交差是最容易翻车的,因为不同油藏的储层非均质性差异太大。

三种方法不是三选一,正确的姿势是组合:先文献类比或数据分位定初值,再用单参数扫描筛选和收窄,最后才进入正式随机采样。

4.2 分布类型怎么选:均匀、三角还是对数正态

参数范围定了之后,还要回答一个问题:在范围内怎么分布。这一步新手经常忽略,直接用默认均匀分布,结果P10和P90的预测区间往往偏宽,因为均匀分布假设每个取值等概率,这在真实储层里很少成立。

均匀分布适合没有先验信息、只知道上下限的参数。三角分布适合知道最可能值的情况,比如某个层的净毛比地质上判断大概率在0.75附近,那用三角分布把众数设在0.75,比均匀分布更接近真实。对数正态分布适合渗透率这类在数量级上波动的参数,渗透率实测值通常服从对数正态,直接用正态分布会出现负值这种物理上不可能的采样结果。

渗透率的对数正态参数可以用简单计算从P10/P90反推:

import numpy as np p10, p90 = 50, 300 # 渗透率P10与P90,单位mD # 对数正态分布下 ln(P10)=mu-1.2816*sigma,ln(P90)=mu+1.2816*sigma sigma = (np.log(p90) - np.log(p10)) / (2 * 1.2816) mu = np.log(p90) - 1.2816 * sigma print(f'sigma={sigma:.3f}, mu={mu:.3f}')

这段代码算出的mu和sigma可以直接填进CMOST的对数正态分布参数里。注意如果油藏的渗透率跨度超过一个数量级,对数正态几乎是必须的选择,均匀分布会让低渗组合和高渗组合各占一半概率,明显高估不确定性。

分布类型适合场景注意点
均匀只有上下限,无先验信息尾部概率偏高,区间偏宽
三角知道最可能值众数要有数据支撑
对数正态渗透率等数量级波动参数避免负采样值
正态孔隙度等对称分布参数标准差不要超过均值一半

4.3 采样策略与算例配比:先敏感性后随机

算例怎么采样、配多少个数,直接决定SRS的总机时和结果可信度。我的建议是分两阶段。第一阶段做敏感性分析,用实验设计方法生成少量算例,比如Plackett-Burman或者部分因子设计,算例数通常是参数数量的两倍左右。这一阶段的目的是筛选主控参数,把不敏感参数固定下来,同时检查参数范围有没有导致批量不收敛的极端组合。

第二阶段做随机采样,对筛选后的主控参数用拉丁超立方生成正式算例。拉丁超立方的特点是保证每个参数的全范围都被覆盖,比纯随机采样收敛快,尤其在算例数只有100左右时优势明显。正式算例数没有一个万能值,我用过一条粗略的预算公式:单算例运行时长×算例数=可接受的总机时。单算例跑10分钟,300个算例就是50小时,一个晚上加一个白天能跑完,可以接受;单算例跑1小时,300个就太多了,建议降到100并接受略粗的分布。

如果CMOST版本支持,最好在参数之间设定相关性约束。比如渗透率与孔隙度在测井解释里常有正相关,直接设一个相关系数可以避免采样出“高孔隙但超低渗透”这种物性上不成立的组合。相关性设在前,采样结果落在物理合理区间内,后面结果解读能省很多口舌。

注意:不同版本的CMG对CMOST界面布局差异较大,但参数、分布、目标函数、采样这些核心概念是通用的。版本升级后先跑一轮50算例试跑,别直接上量产。

5. SRS使用避坑:五个高频翻车点与处理办法

这一章把我实际遇到过的、也最常见别人踩到的高频问题按“现象、原因、解决”写出来。每一条都是真金白银换来的经验,对照着排查能省不少时间。

5.1 算例成批不收敛,完成率掉到六成

现象:100个算例跑了一半,CMOST显示完成率只有六成,剩下的全标Failed,日志里大量时间步回退和饱和度越界报错。

原因:最常见的元凶是参数范围给太大。渗透率乘子范围给到0.1到10倍,某些采样组合会让相邻网格传导率差异过大,模拟器把时间步压到极小仍然无法收敛。另一个隐蔽原因:模型初始化平衡在扰动后不再成立,体系刚启动就报饱和度越界。

解决:先把范围收窄到0.5到2.0倍,再用对数正态分布替代均匀分布,避免极端尾部的采样组合。同时把模型里关键的收敛控制参数调松一档。收窄范围不是投机取巧,而是让参数组合落在物理可接受的区间里,这是SRS设计的一部分,不是退让。

5.2 龙卷风图全是渗透率,其他参数没贡献

现象:敏感性分析出来的龙卷风图,渗透率相关条带占了80%,孔隙度、相渗端点几乎看不见,看起来像只有渗透率重要。

原因:这多半是取值范围量纲不一致造成的假象。渗透率乘子范围给的是0.1到10倍,孔隙度乘子只有0.95到1.05,两个参数对产量的影响当然不在一个数量级。这不是真实的敏感性,是范围设计的问题。

解决:把所有参数统一改成相对变化百分比,比如都在±20%、±30%的相对尺度下重新跑一轮敏感性。如果此时孔隙度仍然不重要,那它确实不重要,可以固定为基准值,减少正式随机采样的维度,还能省机时。

5.3 P50曲线和手工预测对不上

现象:SRS输出的P50曲线,和当初用参数中值手工跑的单个算例差了10%以上,用户第一反应是结果不可信。

原因:P50是结果的概率中值,不是输入参数取中值时对应的输出。模型对参数是非线性的,参数分布偏斜加上参数间的交互作用,会让P50明显偏离“中间输入”的输出。很多新手把这个当Bug,其实恰恰是SRS的价值所在——它告诉你中间输入不代表中间结果。

解决:不要拿手工中值对比。正确的验证方法是取出P50算例的参数组合,回写模型单独跑一遍,如果和CMOST的P50输出一致,说明计算链路没问题;如果不一致,才需要检查CMOST代理模型是否有误差。

5.4 预测期含水率出现平台震荡

现象:部分算例的含水率曲线在预测后段出现锯齿状平台震荡,既不像真实动态,也和邻井生产数据矛盾。

原因:参数组合里出现了物理上不合理的搭配。比如相对渗透率端点与Corey指数同时取极端值,组合出过陡的过渡带,加上输出节点太稀疏,产生了数值振荡。另一个可能是井在预测期射孔层位变化与网格划分不匹配。

解决:把震荡算例的参数组合导出来,定位是哪两个参数的同时极端取值导致的,收窄对应范围或加相关性约束。如果是个别井的问题,检查该井射孔和完井定义在扰动过程中有没有被意外改动。

5.5 算例输出把磁盘写满

现象:跑到第300个算例时磁盘剩余空间归零,整个批次中断,前面几百个算例白跑。

原因:模型文件里设置了高频输出,每个时间步都写重启文件和完整结果,单个算例几个GB,乘以300个算例轻松撑爆磁盘。

解决:批量运行前先跑一个算例,du -sh看一下结果目录大小,乘以算例数估算总量。预测期把输出频率改成按季度或半年,关闭中间重启文件的保存。还可以分批发:先跑100个验证稳定,再放剩下200个,风险摊开。

6. 让SRS结果真正被采纳:用P50算例反推新基准模型

SRS跑完拿到P10/P50/P90三组曲线,很多人直接贴进报告交差。但P50曲线只是一个统计结果,它对应的算例才是有价值的资产。把P50算例的参数组合提取出来写回模型文件重新跑一遍,你就得到一个经过成百上千次扰动验证的新基准模型。这个模型比最初的历史拟合模型更可信,因为P50参数组合代表了在给定参数分布下最可能的地层状态。

具体做法分四步。第一步,在CMOST的结果列表里找到P50对应的算例,记录它所有参数的取值。第二步,把这些取值换算成乘子,写回原始模型文件里对应的关键字,另存为新文件,千万别覆盖原模型。这里可以用脚本批量替换,也可以直接在BUILDER里打开修改,两种方式都行,关键是保留原始模型作为对照。第三步,用这个新模型单独跑一遍,对比CMOST里P50算例的输出曲线,两者一致说明链路无误、可以信任。第四步,把新基准模型用于后续的开发方案计算、井位部署论证和经济评价。

我自己养成的习惯是每个SRS项目都在固定目录里保留一份“P50回写”模型,下一轮更新参数范围时直接在这个模型上迭代,而不是回到最初的历史拟合模型。这样SRS就不只是一次性分析,而是一套持续更新的模型管理流程。这个习惯帮我省过好几次返工:有一口调整井的方案,我直接拿P50模型验证,省掉一整轮重新拟合的时间。

如果你刚接触SRS,先别追求算例数量和花哨的分布,把第2章的基线检查、第3章的最小闭环、第4章的范围确定老老实实做一遍,再跑一轮50算例试水,比直接上500算例产出的结果更有说服力。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询