基于Open Inventor的油藏饱和度场可视化技术研究
2014-10-20聂永丹李福庆张岩
聂永丹,李福庆,张岩
0 引言
油藏体饱和度场与等值图展示是油藏数模软件前后处理程序包的一个重要组成部分。利用油藏饱和度场可以有效反映油藏地层饱和度变化以及剩余油分布情况。研究油藏饱和度及等值图的绘制方法对提高数模结果展示技术有重要意义。Open Inventor是目前世界上使用最广泛的面向对象的绘图软件接口,允许用户通过搭积木的方式来构建复杂的三维场景,使得用户只需花费很少的时间就可以构造出复杂的三维场景[1]。Open Inventor中根据不同行业的需求提供了若干扩展模块,其中 MeshViz 扩展模块提供了强大的应用科学领域中模型网格绘制、提取和数据匹配功能,并且包含了高级的数据可视化设计组件,复杂曲面、三维统计图等多种可视化对象[2]。
1 Open Inventor二维饱和度场相关节点
MeshViz扩展模块提供了二维等值图相关的二维笛卡尔坐标网格、颜色映射、网格填充以及等值线等与饱和度场及等值图相关对象(节点)。
1.1 PoCartesianGrid2D节点:
二维笛卡尔坐标系网格节点,可以用来构建笛卡尔坐标系的平面网格[3],该网格的拓扑结构是规则的,但是其几何形状可以是不规则的,组成每个网格单元的4条边,相对的两条不要求平行,整个平面网格的拓扑由x方向和y方向的网格个数定义,x、y方向网格数均为4的PoCartesianGrid2D网格结构如图1所示:
图1 PoCartesianGrid2D网格结构图
1.2 PoNonLinearDataMapping2节点:
非线性颜色映射节点,为数据体表面提供色彩映射方式。首先根据一组浮点数值定义了相应的一组颜色值,颜色映射节点会根据一个数值的大小决定该数值对应的显示颜色,于是相应的颜色就会在一个数据集合对应的数据体表面上显示出来,颜色映射节点提供两种映射方式分别是:LINEAR_PER_LEVEL和 NON_LINEAR_PER_LEVEL。LINEAR_PER_LEVEL映射方式中如果一个数值f在区间[fi,fi+1]中,其相对应的映射颜色将是在[ci,ci+1]区间的线性内插得到的RGB或HLS颜色,因此这种映射方式必须提供与颜色数量相同数值个数。而NON_LINEAR_PER_LEVEL映射方式不进行插值,如果一个数值f在区间[fi,fi+1]中,其相对应的映射颜色将是ci+1对应的RGB或HLS颜色,如果f小于c1 则对应的颜色就是 f1, NON_LINEAR_PER_LEVEL映射方式必须提供数值个数是颜色数量加1。
此外 PoNonLinearDataMapping2颜色映射节点可以指定与颜色相关联的阈值,以过滤到无效数值。通过PoDataMapping:: minThresholdand指定最小阈值,PoDataMapping:: maxThresholdfields指定最大阈值,当启用阈值设定时,处于设定好的阈值之外的数值(小于等于最小阈值或大于等于最大阈值的数值)对应的颜色将使用预定义好的无效颜色。
1.3 PoMesh2D节点:
二维平面网格可视化节点包括:网格填充节点PoMeshFilled,根据预定义好的映射方式对平面网格进行填充;网格边界节点PoMeshLimit,绘制网格几何体的边界线;网格边线节点PoMeshLines,绘制网格几何体中的每个单元的线框;等值线节点PoMeshContouring,在二维平面网格中绘制等值线,同时可以选择是否加上数值注释,等值线分为主等值线和次等值线,数值注释只能加在主等值线上[4]。
1.4 PoNonLinearValueLegend2图例节点:
图例节点,以一个矩形的方式给出当前色谱的彩色图例,在这个矩形图例上可以设置图例的名称,最大值与最小值等,同时利用PoNonLinearValueLegend2提供的编程接口可以实现展示形状、方向、颜色映射类型的动态设定等功能。利用MeshViz模块创建一个图例需要首先初始化图例节点,通过指定图例大小,坐标以及标题和数值的位置,来定义图例节点;然后在场景中插入PoDataMapping类型对象;接着在场景中插入PoIsovaluesList类型对象并与和图例节点关联;最后指定图例中所要显示数据的最大值,最小值以及过渡数值。如果定义了数据颜色映射节点对象或者 PoIsovaluesList节点对象,可以通过这两类节点图例指定数值范围。
2 油藏含油饱和度场绘制:
2.1 油藏体数据加载
不同数模软件具有不同的油藏体数据文件格式,虽然文件的组织格式不同,但基本都包含了油藏体结构信息与属性信息。油藏体结构主要包括拓扑结构,以及每个网格的坐标和网格有效性等;属性信息包含了某个时间点下,每个网格的某种属性对应的数值。油藏体数模信息的数据量很大,特别的在大区块中包含网格数目多的情况下,频繁扫描读取油藏体数据会引起程序运行效率下降,降低用户体验。采用动态内存创建的方式将所需的数据一次加载到内存中[5],后续的处理直接在内存中操作,可以有效节约数据加载时间,提高程序运行效率。
2.1.1 模型结构数据加载
用动态3维数组model[i,j,k]存储模型结构,以当前国内外主流的油藏数模软件斯伦贝谢公司Eclipse的网格模型数据为例,其数据格式主要是一种柱状(pillar)模型,如图2所示:
图2 pillar模型网格结构图
一种点线结构:模型中i,j坐标相同且处于不同位置处所有网格同一方位的棱边位于一条直线上,其中100网格的“100-101”棱边和101网格的“100-101”棱边在三维空间内共线。根据目标网格某一方位棱边所在线段顶底点的三维坐标和该棱边某角点的 z坐标,就可以计算出该角点的三维坐标,按照i,j,k的顺序可以得到网格的属性值和有效性数据[6]。
2.1.2 网格属性数据加载
用 5维动态数组来存储油藏体属性数据,例如数组varray[t,p,i,j,k]中的下标 i,j,k分别表示油藏体中三维网格序号坐标,下标t表示时间点序号,下标p表示属性类别序号。后续处理就可以根据具体时间点、属性值、单层信息从varray[t,p,i,j,k]数组检索出用户所需要的属性值。
2.1.3 网格有效性标志加载
整个油藏体模型中有些网格是不需要关心的,定义为无效网格,在展示的时候需要忽略掉,因此每个网格对对应着一个有效标志数值,如果该标识为1则该网格是有效的,需要展示出来,反之如果该标识为0则该网格是无效的,展示时需要过滤掉。为避免频繁加载此标志信息,本文采用 1维动态数组m_actnum[m]的形式来存储网格有效性标志,后续程序判断网格 model[i,j,k]的有效性时,可以直接访问m_actnum[k*num_y*num_x +j*num_x+i]的值是1还是0。
2.2 含油饱和度场与等值图绘制
1)首先将油藏体模型结构数据与属性信息加载到内存中;
2)利用MeshViz中的PoCartesianGrid2D类创建节点笛卡尔坐标系的平面二维网格pmesh,设定拓扑结构,并将属性值添加到网格中;
3)再根据饱和度场数据定义数据映射,用PoNonLinearDataMapping2类创建节点pdataMapping,该节点定义一系列颜色和浮动的数值相对应,选择 LINEAR_PER_LEVEL方式,设置 PoDataMapping:: maxThresholdfields指定最大阈值,启用阈值设定,设置大于最大阈值的数值对应的颜色透明度为100%。判断每一个网格的有效性,若网格无效,则将该网格属性数值设定为最大阈值的数值,于是可以过滤掉该网格。
4)利用PoMeshFilled创建可视化填充节点pmeshFilled,应用数据到颜色的映射,填充二维实心饱和度场,选择COLOR_MAPPING作为颜色类型,网格的每一个属性值对应一种颜色,网格通过这些插值的颜色填满,描述的每一个
网格边或网格单元通过由 pDataMapping对象定义的“数据映射”的方法着色,该pDataMapping对象定义网格值(由值索引域关联)转变成颜色的方法;利用PoMeshContouring创建可视化节点 pmeshContouring与二维网格的属性值相关联绘制出二维等值线图,利用PoMeshLimit创建可视化节点 pmeshLimit网格边界节点,绘制网格几何体的边界线;利用PoMeshLines创建可视化节点 pmeshLines网格边线节点,绘制网格几何体中的每个单元的线框[7]。
5)最后通过定义图例来说明饱和度场中的颜色相对应的饱和度值,先通过 PoIsovaluesList 类创建节点 pisoValues,连接对象到可视化节点,两个连续等值之间的步进尺度是一个常数,再运用PoLinearValueLegend类创建节点plegend 绘制图例。将上述 pmesh、pdataMapping、pmeshFilled、pisoValues 和 plegend 节点依次添加到场景图节点 root中,然后创建渲染区域并显示场景[8]。
3 总结
本文基于Open Inventor中MeshViz 扩展模块研究油藏饱和度绘制方法,基于 VC++实现了油藏饱和度动态展示,该方法实现简便,便于用户直观理解油藏模型结构,分析剩余油分布情况。由于采用了模块化的设计思想因此具有较强的扩展性,可以方便的与其他业务模块集成。
[1]滕贻健,柴山,荆旭,等.基于 Open Inventor的虚拟驾驶仿真系统[J].计算机应用, 2009,29(s1):323-325
[2]阎锋欣,候增选,张定华,等.Open Inventor程序设计从入门到精通[M].北京:清华大学出版社,2007.
[3]孟鑫,张桦.Open Inventor开发的关键技术与应用[J].天津理工大学学报.2005,21(1):69-73.
[4]Open Inventor 8 User’s Guide.[M]Mercury Computer System Inc.2009.
[5]Josie Wernecke.The Inventor Mentor:Programming Object-Oriented 3D Graphics with Open Inventor,Release 2[M],Addison-Wesley Publishing Company,1994.
[6]白永良,刘展,魏合龙等.基于 Open Inventor油藏四维展示方法研究 [J].西安石油大学学报(自然科学版).2012,12(1):94-98.
[7]Alan Ezust,Paul Ezust.An Introduction to Design Patterns in C++ with Qt4[M]Prentice Hall,2006.
[8]胡贵华,朱文华 ,俞 涛,王 栋.PECVD 热流场数值模拟的可视化研究[J].系统仿真学报.2008,20(21):5885-5888.