▲点击蓝字「斯伦贝谢数字与一体化集团」设为【星标】,查看信息不“迷路”
在油气田开发研究中,油藏渗流或开发机理层出不穷,商业模拟器由于通用性及原理验证等各方面的原因,并不能及时把所有的新机理并入到模拟器里。INTERSECT模拟器提供了Python代码整合的功能,油藏研究人员可自行编写相关代码,将研究成果无缝嵌入到 INTERSECT模拟器中,保有自有知识产权,并且代码具备可移植性。INTERSECT自带脚本编辑器,代码结构清晰、可读性强,编程辅助且颜色标识,可以自动提示错误和避免语法错误。
INTERSECT模拟器可以使用Python语句自定义一些控制、变量设置等等,再结合Field management(简称FM)油田管理策略可以实现非常复杂和灵活的生产控制、油气藏机理模拟等。INTERSECT整合Python 代码实现相渗时变功能为例,油藏水驱开发后微粒发生迁移导致大孔道更集中,胶结物含量减少容易形成高渗流通道,水驱过程中渗透率会发生变化。INTERSECT模拟器可以输出过水倍数和驱替通量,用户可以结合这些动态参数自定义Python代码模拟相渗时变等复杂油藏开发机理。
INTERSECT_Python有不同的控制模式,例如CustomAction、CustomControl、CustomVariable、CustomScript等。
CustomAction用户自定义条件指令。例如井组控制时模拟器默认会根据单井潜能和约束条件自动分配产量,或者自定义产量劈分等;用户可以根据需要通过使用Python语句自己指定单井的产量分配方式,并且设置在什么情况下触发执行。如当油藏日产液量小于10000STB/d时,单井产液量=单井当前产液量*10000/油田当前产液量,这样可以维持油田产液量在指定目标下生产,并且单井产液量分配方式是根据单井当前生产水平进行分配。操作步骤如下:
1.数模模型采用FM策略,2008年1月1日开始预测,设置单井约束条件为定产液=3500STB/d、BHP=100psi;2010年1月1日关闭其中的3口井。
2.在Define simulation case界面的INTERSECT_User edits面板,右侧的Field management user edits插入一行,然后输入以下语句。3.Python_Script语句说明:自定义语句CustomAction "WULIQ"定义新变量New_LPR为单井当前产量entity.get_property(LIQUID_PRODUCTION_RATE).value *10000/油田当前产量Group('FIELD').get_property(LIQUID_PRODUCTION_RATE).value;针对entity实体对象的定产液量LIQUID_PRODUCTION_RATE= 变量New_LPR;entity实体对象为静态井列表EntityList = StaticList('All_PWELLS'),备注:也可以针对动态井列表操作;DATE为代码生效日期。Strategy策略里的Instruction触发条件为油田产液量小于10000,TriggerCriterion = "LIQUID_PRODUCTION_RATE(Group('FIELD')) < 10000",当达到触发条件时会对EntityList的井依次执行CustomAction操作。Python_Script语句详细如下:4.从结果曲线(如下图)上可以看出:2010年1月1日由于关了3口井,导致油田产液量小于10000STB/d,开始执行自定义语句CustomAction('WULIQ')的操作,剩余2口开着的井的按照当前产液水平(保持BHP约束)分配10000 STB/d,从图上可以看出油田日产液量能够维持10000 STB/d,但运算后2017年左右,由于单井BHP约束为100psi,导致单井和油田产液量都开始下降。
CustomControl用户自定义控制,可以实现非常复杂和灵活的生产控制,例如注CO2量=油田CO2产量回注+指定CO2气源量;井组回注时默认是把所有的产出气回注,我们可以用Python语句指定只回注某种组分。操作步骤如下:
1.数模模型采用FM策略,设置注气井的约束条件为BHP限制,Injection stream设置注入流体的组分组成(这里设置为CO2),注气量通过下节的Python_Script语句设置。
2.在Define simulation case界面的INTERSECT_User edits面板,右侧的Field management user edits插入一行,然后输入以下语句。3.Python_Script语句(详细如下)说明:定义新变量FUICO2为注气井PROD4的注入量=外来CO2起源量30000+油田的CO2产气量,油田的CO2产气量=油田的产气量Group('FIELD').get_property(GAS_PRODUCTION_RATE).value *CO2组分(流体组分的第二个成分)的气相摩尔分数Group('FIELD').get_property(VAPOR_COMPONENT_MOLE_FRACTION[2]).value。4.从结果曲线(如下图)上可以看出:黄色曲线为油田注气量(这个案例只含一口注气井PROD4)、绿色为油田产气量、红色为油田产气的CO2摩尔分数,油田注气量=30000+油田产气量*CO2摩尔分数,油田注气量随着油田产气量及CO2摩尔分数的变化而变化。
5.结果准确性可以通过曲线视图的计算器验证,计算器定义注气量变量FUICO2=30000+油田产气量*CO2摩尔分数,可以看出模拟器输出的注气量与计算器定义的注气量变量FUICO2完全重合。如下图:
CustomVariable用户自定义变量,例如计算PROD1井产量累计经济价值。
在Define simulation case界面的INTERSECT_User edits面板,右侧的Field management user edits插入一行,然后输入以下语句。
打开Charting window曲线视图,在Result charting and analysis窗口勾选对应CASE,Primary identifier勾选PROD1_Revenue、Property勾选Unknown的WREV属性即可查看计算结果,如下图。CustomScript用户自定义设置,例如根据井类型修改所有井的默认井底流压或井底流压约束条件。
在Define simulation case界面的INTERSECT_User edits面板,右侧的Field management user edits插入一行,然后输入以下语句。
打开Charting window曲线视图,在Result charting and analysis窗口勾选对应CASE和属性即可查看计算结果,如下图。