本论文发表于《计算机应用研究》2013年12月增刊。
摘 要
在油气田开发过程中,油藏数值模拟和模型后处理是预测油田开发动态的重要手段,在后处理模块的设计中,解析Eclipse等不同数模软件的模拟结果严重影响软件的运行效率。本文通过对比分析大量Eclipse模型的二进制数据,结合油藏模型的相关参数和可视化效果,彻底解析了Eclipse模型的详细组织规则,利用该算法实现的C#程序通过了大量Eclipse模型试验,可解析所有二进制格式的Eclipse角点模型,该程序已成功应用于报表显示和三维可视化展示等模型后处理模块中,试验结果表明该二进制解析方法比常规的文本格式解析算法提升10倍。
关键词
油藏数值模拟;模型后处理;油藏模型;格式解析;角点模型
0 引言
在油气田的开发过程中,需要综合地球物理、地质、油藏工程、钻井工程、采油工程、经济评价等多学科知识,来准确预测不同条件下油藏开发动态。在国内外的油公司中,大多采用斯伦贝谢公司的Petrel软件进行油藏建模,用Eclipse软件来进行油气藏动态特征的模拟分析,利用Eclipse 100、300等模拟器可以进行黑油、干气、凝析气藏或挥发性油藏等油气藏开采过程的模拟,通过前处理器(例如FloGrid、PVTi、Scal、Schedule或VFPi等)和主模拟器,可以分析得到油气藏的模拟结果,但还需要后处理器模块来对模拟结果进行分析和展示,Eclipse中提供了FloViz模块来进行二、三维可视化展示,但很多油田通常想用自己开发的后处理软件进行集成展示和分析,将大量数据资料解释成各种形象生动、信息丰富的图像信息,以大大提高对模拟结果的分析效率及降低分析难度[1]。
在后处理软件设计中数据文件解析是技术难点之一,这是因为一方面常用的VIP、Eclipse、CMG等油藏数值模拟软件都有各自不同的格式[2],另一方面公司为了保护商业利益不对外公开其内部格式,国内外文献中都无法查到其格式的细节说明,所以通常的后处理软件只能被迫采用低效的文本交换格式作为输入文件,从而大大降低了后处理软件的分析效率。
本文通过分析对比大量Eclipse模型的二进制数据,结合油藏模型的相关参数和可视化效果,彻底解析了Eclipse模型的数据块、关键字块、参数信息块的组织规则,并进一步分析出了Eclipse角点网格模型中坐标的排列方式,再通过编程验证,从而彻底地解析了不为公开的Eclipse二进制数据模型,大幅提高了后处理软件中的报表生成和三维展示的运行效率,在油田的开发方案设计、中后期综合调整等多个环节发挥了重要作用。
另外,本技术也是多学科油藏研究一体化平台中的基础技术之一,例如大庆油田在2003年开始研发的IRSP软件,能够导入各类建模软件生成的油藏模型是必须具备的基础功能之一[3]。
1 Eclipse数据文件简介
Eclipse软件本身默认是以非格式化文件(二进制格式)作为内部存储格式,为了与其它软件进行数据交换,也提供了格式化文本文件的输出功能,但文本文件会占用大量的磁盘空间,并且读取和输出的效率都非常低。
Petrel油藏建模软件与Eclipse软件出自同一公司,其格式完全兼容,因此解析Eclipse模型的方法同样适用于Petrel软件。
Eclipse计算输出文件主要由网格文件、属性文件和动态结果文件三部分组成。
1)网格文件
扩展名为GRID或EGRID,GRID是按网格编号顺序依次存储每一个网格的8个角点坐标的,要重复记录大量重合的坐标点,所以文件很大,而EGRID是用坐标线和深度值的方法记录网格模型,比GRID要小得多,在后面将详细介绍。
2)属性文件
扩展名为INIT,用于描述孔隙度、渗透率和净毛比(NTG)等静态参数。
3)动态结果文件
保存了油藏数值模拟每个时间步的结果,为了能够从任何一个时间步重新模拟计算,所以也称为重启文件,记录了每个时间步模型的压力场、油气水饱和度场以及溶解油气比等数据场,同时也记录所有井的井位射孔位置、产量控制等。当采用关键字UNIFOUT控制时,输出一个扩展名为UNRST的文件,否则输出为扩展名为X0000、X0001、……的一组文件。
2 Eclipse数据块解析
由于Eclipse的官方技术手册中涉及二进制格式的部分只有一页关于数据类型的说明,在格式解析过程中遇到的困难主要是无其它任何资料可参考,研究方法只能依靠查看文件的二进制数据,对比模型的已知参数信息等来一步步推测和验证得到。
2.1 Eclipse中的数据类型
由于Eclipse软件最早是用Fortran语言写的,所以其采用的数据类型只有整型、单精度浮点型、布尔型、双精度浮点型和字符型5种数据类型,分别用INTE、REAL、LOGI、DOUB和CHAR来表示,占用的字节数也有严格的规定(表1),需要注意的是字符型是以8个字符为一组来计算的。
类型标识符 | 类型 | 占用字节数 | 备注 |
---|---|---|---|
INTE | 整型 | 4 | |
REAL | 单精度浮点型 | 4 | |
LOGI | 布尔型 | 4 | 只能是0或1 |
DOUB | 双精度浮点型 | 8 | |
CHAR | 字符型 | 8 | 8个为一组,不足的补空格 |
2.2 Eclipse基本数据块
用EmEditor等软件查看多个EGRID文件后,发现所有二进制文件的前24个字节的内容全部一样,内容见表2。
偏移量 | 十六进制数值 | 十进制数值 | 字符串表示 | 备注 |
---|---|---|---|---|
0~3 | 00 00 00 10 | 16 | 块首 | |
4~7 | 46 49 4C 45 | FILE | 关键字名称 | |
8~11 | 48 45 41 44 | HEAD | 关键字名称 | |
12~15 | 00 00 00 64 | 100 | 后续参数个数 | |
16~19 | 49 4E 54 45 | INTE | 后续参数的类型 | |
20~23 | 00 00 00 10 | 16 | 块尾 |
再对比查看UNRST、INIT等其它二进制文件,也可以发现类似的数据结构,只是偏移量4~15里的字符和数值有所变化,继续读取二进制文件后面的数据块,还能发现大量类似的现象,根据这种现象推测并证实,一个Eclipse数据块的头部用4个字节来说明这个块的长度,这里的16表示数据块中共有16个字节的内容,也就是说偏移量4~19中正好是16字节,在数据块尾部还要重复记录一次头部的内容。
2.3 关键字块
用这种方法读取数据后,发现除了FILEHEAD这类字符以外,还有INTEHEAD、MAPAXES、PORV、PERMX、PRESSURE、SWAT等等的字符串,由于Eclipse有一千多个关键字的列表,这些字符串正好与其对应,所以这个数据块就是关键字块,与格式化文本格式中的数据记录正好吻合,下面几行文本是eclipse模拟输入的参数文件中有关坐标轴定义的信息。
MAPAXES
0.58700000E+06 0.59464000E+07 0.58700000E+06 0.59465000E+07
0.58710000E+06 0.59465000E+07
/
从二进制文件中也同样可以读取MAPAXES这个关键字块,因此关键字块是由块首、后续参数个数、参数类型和块尾4个部分构成的,正好占用16个字节。见表2中的备注说明。
2.4 参数信息块
在关键字块之后,紧接着就是参数信息块, 参数信息块是由块头、参数数据和块尾3部分组成的。由于在关键字块中已经说明了参数的个数和参数的类型,这里只需将这些参数信息按顺序存放起来即可。以表2中数据为例,12~15偏移量的数据为100,在参数信息块的块头和块尾之间就应该出现100个整数。
3 角点网格模型解析
虽然Eclipse支持块中心网格(Block Centered Geometry)和角点网格(Corner Point Geometry),但现在多使用角点网格建模,因此本文中以角点网格来说明Eclipse的模型结构。
EGRID这种记录格式比GRID格式更节省空间,因为它只记录坐标线和深度坐标信息,不再重复保存大量重合的角点坐标,在EGRID文件中主要由COORD和ZCORN两个关键字来描述。
在COORD关键字后,会有大量的数据来描述模型的坐标信息。由于EGRID格式采用了紧凑的格式来表示模型,所以EGRID格式比以前的GRID格式的文件减小许多,它只记录了模型的顶底坐标、各结点网格8个结点的深度值,根据这些基本信息内插后就可以得到所有网格结点的坐标值。
由于不同EGRID中的角点数量从几万到几百万不等,如果不了解这些数据的存放顺序和规则,同样不能得到正确的角点网格模型。通过对比Eclipse的格式化文本输出和二进制文件,得到如下的规则描述:
EGRID文件中主要用COORD、ZCORN和ACTNUM三个关键字来描述角点网格模型。
Eclipse模型的COORD关键字来描述坐标线的顶底坐标的,共有(NX+1)*(NY+1)*6个值,是每个结点相对应的顶、底坐标(X,Y,Z),其中,NX、NY、NZ分别为数模结果的X、Y、Z方向的网格数(各个方向的数目NX、NY、NZ是在Eclipse的RUNSPEC文件中用关键字DIMENS来设置的)。对于20*10的网格模型,需要21*11条坐标线,即231条,顶底坐标有6个数值,所有它的COORD后有1386个数。顶底坐标数据的排列顺序是I下标变化最快,其次是J下标,K下标最慢,如图1所示。

在COORD关键字后,是ZCORN关键字信息,里面记录了坐标线上的深度值,同样也是I下标变化最快,其次是J下标,K下标最慢。
在ZCORN关键字后是ACTNUM有效性信息,有效网格记为1,无效网格记为0,根据这些信息就可以完整地构建出Eclipse或Petrel的角点网格模型。
4 应用实例
以上完整地介绍了EGRID中包含的角点网格的坐标信息和网格有效性信息,对于INIT静态属性文件和UNRST动态属性文件也可用这种办法解析出来,里面主要是属性名称的关键字和属性数据,其数据的排列顺序也与EGRID的相似,由于篇幅所限不再赘述。
通过对Eclipse模型的深入剖析,只需提供Eclipse模型的INIT、EGRID和UNRST文件,就可以得到油藏的静态模型和动态模拟数据,从而进行属性数据的报表分析和可视化显示等后处理工作。笔者采用C#语言编程实现了EclipseParser动态链接库,可读取任意I、J、K方向上的油藏模型数据。
基于此解析库实现的数据转换程序,可以提取并绘制任意层、任意属性和任意时间步的属性数据的等值图(图2)。

二进制格式解析可以比普通的文本解析带来效率的很大提高,为此取了3套油藏模型分别进行数据读取的试验,试验环境为双CPU(Intel Xeon E5503 2GHz)、3G内存、32位Windows7操作系统,用c#编写的程序,统一用Release方式编译运行,得到一组试验数据(表3),对于几十万的网格模型,用二进制格式解析会比文本格式解析缩短了平均10倍的时间,模型越大这种效率的提升越显示。
油藏模型网格大小 | 网格总数 | 文本格式解析时间(ms) | 二进制格式解析时间(ms) | 比值 |
---|---|---|---|---|
50 * 50 * 6 | 15000 | 205 | 28 | 7.3 |
50 * 100 * 19 | 95000 | 1316 | 116 | 11.3 |
150 * 148 * 13 | 288600 | 4306 | 320 | 13.4 |
上述程序只是一个二维图表显示程序,一次只能得到一个时间步的一层属性的等值图,难以了解整个油藏的空间分布,所以早在20世纪90年代就开始研究油藏模拟后处理的三维科学显象技术[4],已经可以实现在X-Window上的油藏模型显示,但受限于当时的计算机能力,交互功能有限。如今的计算机图形处理能力比以前提高了几十倍,笔者用OpenInventor for .NET 8.0编程实现了EclViz油藏模型的三维展示模块。在解析得到了一个角点网格后,可使用6个SoFaceSet来构建角点网格的6个面,根据属性数据的不同,可以从调色板上选择相应的颜色来填充[5],从而在OpenInventor的三维场景中进行渲染,实现三维显示和交互,图3是CDXQ的G46块的中部深度属性的三维显示效果。

结束语
本文描述的网格模型中坐标都是(X,Y,Z)形式的笛卡尔坐标,对于径向坐标也同理可以解析出网格模型。解析Petrel和Eclipse的油藏模型,可以为油藏模型的后处理工作带来巨大便利,同时也可以与数字油气田等其它数据资源有效地集成,在统一的数据中心基础上进行三维展示分析,将大大提高油藏工程人员的研究效率。
本文中的解析方法可以应用于Eclipse软件的各种二进制输出文件上,但对于非INIT、EGRID和UNRST文件还需要进一步研究其关键字和参数的内容含义,本文中试验数据的网格数不超过100万,对于上千万网格的情况可能还需进一步的优化。
参考文献
[1] 唐亮,崔炯屏,陈汶滨.油藏数值模拟后处理软件的设计与实现[J].重庆文理学院学报(自然科学版),2010,29(6):58-60.
[2] 周辉,张焱,等.油藏工程数值模拟后处理软件设计问题探讨[J].河南石油,2002,16(1):48-49,52.
[3] 石亮.大庆油田多学科油藏研究一体化平台研制[J].内蒙古石油化工,2010,36(3):3-5.
[4] Sousa,MC 苏开科.油藏模拟后处理的三维科学显象[J].国外油气科技,1995(4):53-60.
[5] 闫锋欣等,Open Inventor程序设计从入门到精通[M],北京:清华大学出版社,2007:138-143.
最近更新情况
2024年7月,程序已经更新到V3.1,可以验证、读取所有Eclipse二进制文件中的内容。

主要功能:
(1)解析Eclipse二进制模型文件,可正确读取Eclipse的角点网格模型、静态属性、动态属性和时间步等信息。
(2)C#源代码基于.NET Framework 4.8,操作系统为Windows 10 64位。
(3)支持eclipse E100和E300两种二进制文件格式。
(4)可以读EGRID(或GRID)二进制文件,这里保存着网格体的坐标数据,仅支持eclipse的六面体模型,又称为pillar模型,即可以读出每个网格的八个角点坐标。
(5)可以读INIT文件,这里保存着网格体的静态属性。
(6)可以读取UNRST(多文件时为X????和S????系列文件,这里的?表示0-9的数字),这里保存着网格体的动态属性。
(7)可从数模结果文件中提取出指定时间步、指定属性的各层静态属性、动态属性,存放于C#中的数组中。
(8)写了一个ecl2txt程序,用于将二进制模型文件转换为文本格式,可导出模型到xyzv文本文件。
(9)还写了一个EclipseInspector小程序,用于检查Eclipse二进制文件的字节方式的内部布局。
