65.9K
CodeProject 正在变化。 阅读更多。
Home

Black-Oil MSV

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2014年4月21日

GPL3

10分钟阅读

viewsIcon

37273

downloadIcon

1284

此应用程序集成了油藏黑油模型的修改、模拟和可视化功能。

下载 VB.Net 2012 源代码

免责声明

此软件包不应以任何方式用于任何类型的严肃项目。因使用此软件包而产生的任何潜在损失或损害,用户将自行承担责任。欲了解更多信息,请参阅自由软件基金会发布的 GNU 通用公共许可证第 15 和 16 节。

引言

Black-Oil MSV 是一款基于 .Net 的桌面应用程序,它集成了对碳氢化合物储层黑油模型的修改、模拟和可视化功能,该模型采用 Turgay Ertekin、J.H. Abou-Kassem 和 G.R. King 在其著作《基本应用油藏模拟》中提出的有限差分全隐式和 IMPES 公式。

非石油工程师入门

如果你不是石油工程师,你可能会想知道什么是油藏模拟器,以及石油工程师为什么需要它。如今,油藏模拟器是指一种计算机程序,它能预测地下含烃地层(即油藏)在特定情况下的行为。石油工程师使用模拟器来增进他们对油藏的了解,最终提出一个能带来最大经济效益的优化生产方案。Black-Oil MSV 是一款开源油藏模拟器,对石油工程师和软件开发人员都有帮助。

石油工程师入门

石油工程师,特别是那些从事油藏评估和表征工作的工程师,大多熟悉常见的油藏模拟工具,例如 SCHLUMGUERGER® ECLIPSE™ 和 CMG® IMEX™。首先必须指出,Black-Oil MSV 并非旨在挑战这些强大的工业工具,而是一个石油工程师可以研究和评估各种模拟方法的实验室。Black-Oil MSV 源代码是用 VB.Net 编写的,对于编程知识有限的人来说,易于阅读和理解。数据结构灵活,易于遵循和修改。可视化控件编写清晰,尽可能简化。基于 Ertekin 公式的模拟核心代码少于 1400 行。此外,Visual Studio 的功能足以满足计算代码的调试需求。

程序员入门

并非所有普通程序员都有机会为油藏模拟器编写代码。因此,对于不了解什么是油藏以及为什么以及如何模拟油藏的软件开发人员来说,需要介绍一下这段代码。如前所述,油藏是地球的一部分,通常位于地下数千英尺,含有石油和天然气等碳氢化合物。油藏是自然形成的,这意味着它是非均质的,因此它在不同位置表现出不同的行为。因此,考虑到它是非均质的,位于地下数千英尺,并且形状各异,我们可以得出结论,油藏是一个极其神秘的物体。另一方面,油藏是能源最丰富和最有价值的资源之一。不仅是能源,各种材料都来源于石油。看看你的键盘,它主要由石油制成,你的鼠标,鼠标线,随处可见的大部分颜色,你的衣服和我们使用的许多配件,它们都来源于石油。油藏是一个复杂的自然系统,同时又蕴藏着宝贵的石油和天然气资源,这一事实使油藏模拟器的作用和责任倍增。实际上,油藏模拟可以归类为一项繁重的计算任务,对于普通计算机来说甚至可能需要几天时间。与这种时间浪费相反,石油工程师对尝试各种生产方案和研究结果非常感兴趣。因此,最大的挑战是以优化的方式编写代码,使其占用最少的 CPU 时间。在大多数情况下,这种计算都是关于一个巨大的方程矩阵,需要求解。一些模拟器提供并行处理,另一些通过一些简化假设来降低矩阵复杂性,还有一些利用 GPU 处理能力来提高速度。程序员面临的第二个挑战是油藏参数的可视化,无论是在油藏网格的 3D 表示上,还是在 2D 截面上。作为程序员,您还将被要求开发高度交互的图形。最后,开发人员应该设计一个易于理解和直接的用户界面。这一最后一个功能是许多工业油藏模拟器的一大缺陷。在大多数情况下,模拟器不以有组织的方式读取数据,它们的输出需要另一个应用程序才能打开并可视化。它们使用过时的框架和技术,导致用户界面非常僵硬。Black-Oil MSV 声称它解决了第三个挑战,但第一个和第二个挑战的解决方案取决于代码的未来开发人员。

为什么选择 MSV?

MSV 代表修改(Modification)、模拟(Simulation)和可视化(Visualization)。顾名思义,Black-Oil MSV 通过一个桌面应用程序集成了这些功能。Black-Oil MSV 旨在提供一个用户界面,用户可以通过它实现:

1. 修改模拟任务所需的所有参数,例如网格尺寸和位置、在油藏条件下流体行为表(称为 PVT)、通过 SCAL 岩石类型描述的岩石-流体相互作用和特性、每个网格的压力和生产计划以及模拟控制参数。

2. 使用全隐式或 IMPES 公式在指定时间段内模拟油藏。

3. 在模拟进行中或完成后,通过 3D 图形控件可视化油藏参数。

特点

功能可以分为两类:模拟器功能和代码功能。

模拟器功能

  • 方法论
    • 3D-3 相黑油模型
    • 牛顿全隐式公式
    • 有限差分法
    • 时间步长调度/校正
  • 模型
    • 多尺寸、多邻域、块中心网格划分
    • 网格岩石类型
    • 压力和流量计划
    • 3D-3 相渗透率(用户界面中为 2 相)
    • 毛管压力滞后

代码功能

  • 集成修改、模拟和可视化
  • 使用 WPF 技术进行 3D 可视化
  • 同步模拟/可视化
  • 模拟对象的 XML I/O
  • 模拟器核心代码少于 1400 行
  • 全部采用 VB.Net 2012

使用应用程序

Black-Oil MSV 执行后,主窗口如下图所示。用户模拟油藏所需的所有功能都可通过主窗口获得。如下图所示的模拟树包括模型(Model)、PVT、岩石类型(RockType)和计划(Schedule),这些对于任何常规模拟工作都至关重要。

模拟页面包含参数(Parameters)和运行(Run)选项卡。参数选项卡包括系统(System)、时间(Timing)、精确度(Exactness)、方法论(Methodology)和选项(Options)选项卡。在如下所示的系统选项卡中,用户可以选择模拟工作的单位系统,可以是公制或英制。用户还可以选择模型中可用的相。这不一定会影响模拟结果,但可以防止模拟器在相应相参数为零时执行额外的计算。

在“时间”选项卡中,用户可以确定模拟器的时间步长和最终化标准。时间步长可以相等,也可以从下表读取。模拟在达到“最终步长”或“结束时间”时结束。

计算和迭代应满足预定义的验证标准。在“精确度”选项卡中,用户可以指定这些标准。可以指定求解器 MSE(线性方程 MSE),它表示求解器的精度。最大迭代次数确定了全隐式公式中每个时间步的最大迭代次数。Orthomin 求解器是一种迭代方法。Orthomin 的迭代次数也已确定。开发人员可以为模拟器定义自己的求解器。迭代终止值应用于全隐式迭代。一旦计算值足够接近上次迭代值,迭代就应停止并继续到下一个时间步。此处用户定义此标准。

在方法论选项卡中,用户可以指定公式和计算方法。目前支持全隐式和 IMPES 方法。部分计算需要根据相饱和度和压力对参数进行求导。用户可以在此处定义用于计算求导的 epsilon。参考书中解释了几种平均渗透率的方法。

点击“模型”用户将可以访问模型数据,包括网格及其参数。在这里,用户可以通过编辑网格框或点击“规则”按钮来定义新网格,从而为模型创建规则网格。同时,用户可以在 WPF 3D 控件中观察最终模型。

网格是根据其中心(而非角点)定义的。Sw、Sg 和 Po 的初始值应指定。岩石类型和计划根据其 ID 确定。

点击“规则”按钮,用户可以创建自定义大小和精度的规则模型。

PVT 表可在 PVT 面板中编辑。

PVT 表包含黑油模型模拟所需的所有参数。用户应仔细确保根据定义的单位系统,使用具有正确单位的适当值。

通过点击树形视图中的“RockTypes”,用户可以定义和编辑岩石类型。点击“New”将生成一个具有唯一 ID 的新岩石类型,然后可以在“Model”部分中使用,如前所述。

在“岩石类型”选项卡中,用户可以编辑 3D 和 3 相系统岩石类型的绝对值和相对值。

例如,在水-油选项卡中,用户可以确定相对渗透率和毛管压力数据。当 Pc 可用于渗吸和驱替过程中的 Pc 滞后时,应确定润湿性。

在“计划”面板中——类似于“岩石类型”——用户可以创建和编辑计划数据。每个计划都有其唯一的 ID,可以在模型面板的“计划”列下应用于网格。

计划可以是静态的或动态的(时间相关的)。

动态值将通过插值用户提供的表中的值来计算,如下所示。

现在模拟模型和参数都已完成,我们可以回到“模拟”面板并打开“运行”选项卡。点击播放按钮,模拟开始,指定参数的变化将在 3D 图中可视化。

在面板的左上角,用户可以看到模拟的时间步长和迭代统计信息。

在下方面板中,用户可以定义模型将可视化和着色的参数和参数边界。

在日志面板中,用户可以选择自定义时间步,并查看该时间的结果和参数。

整个模拟结构和网格可以根据开发人员的需求轻松导出并保存到硬盘。

开发代码

重要提示:在对代码进行任何更改之前,请学习 Turgey Ertekin 等人撰写的《基础应用油藏模拟》。Black-Oil MSV 参数的命名大多基于该文本中的等效参数。因此,如果您熟悉其中的概念,您将很容易对代码进行适当的修改。

建议

致程序员

  • Black-Oil MSV 采用 Orthomin 求解器,对于较小的模型效果很好。建议使用其他代数求解器,例如双共轭梯度法来提高性能。
  • WPF 可视化组件编写得非常清晰明了,开发人员可以轻松编辑和升级其功能。建议根据用户需求改进可视化组件。
  • 对于大型模型,有必要将模拟历史保存在硬盘上,而不是内存中。同时,还需要对可视化组件应用一些优化方法。
  • 所有插值都是线性的。您可以利用更稳定的算法,具有更平滑的插值曲线。
  • 尝试使用 Parallel 类(.net 框架中的新增功能)和兼容的线性求解器算法。我个人尝试过这个类,它可以将性能提升很多倍。
  • 利用多线程来提高用户界面性能。这可以通过分离仿真模块中的 Run 子程序并在类中调用它来实现。
  • 此代码缺少导出到 Excel 的功能。您可以简单地为模拟对象添加此功能。

致石油工程师

  • 目前无法单独定义油井。只需定义井筒路径,并将压力/生产计划应用于每口井路径上的网格块即可轻松实现。
  • 目前还没有网格细化算法。您可以在“模型”面板中添加此功能。或者,您可以添加动态网格,使其在高变化区域自行细化。
  • 除了全隐式和 IMPES 之外,您还可以使用 SEQ 方法。目前这些公式应用于整个模型。有人会选择对模型中不同区域使用混合解决方案。
  • 此应用程序也适用于历史拟合任务,特别是在核心尺度上。您只需在树形视图的“组件”节点下添加一个历史拟合组件即可。
  • 由于树形视图中的每个节点(PVT、岩石类型、调度和模型)都需要来自预处理程序的数据,因此您可以开发适当的预处理程序应用程序并将其链接到其树节点。
© . All rights reserved.