Eclipse油藏模型解析程序

2010年的时候,三维可视化项目中要读取eclipse建模软件产生的三维模型网格数据,经过连续多天的奋战,终于搞明白eclipse数模软件输出的egrid、init、unrst等二进制输出文件的格式了。在egrid文件中看到了下面这些关键词和相关的参数,真是高兴啊:

FILEHEAD
3 2005
MAPUNITS
METRES
MAPAXES
775209.9 632416.1 774800.4 632811.8 775196.1 633221.4
GRIDUNIT
METRES
GRIDHEAD
1 100 50 19
COORD
-108.4868 356.3878 1930.576 -108.4868 ...
ZCORN
1935.727 1934.945 1934.945 1933.606 1933.606 ...
ACTNUM
0 0 0 0 0 0 0 0 ...
ENDGRID

根据对格式的了解,用C#编写了EclipseParser库,可以验证、读取所有Eclipse二进制文件中的内容。

EclipseBinaryFileStruct.cs中的代码片段:

/// <summary>/// Eclipse二进制文件中支持的五种数据类型,用枚举表示<br> /// </summary>public enum EclipseDataType{ INTE, // 4字节,整数 REAL, // 4字节,单精度浮点数 LOGI, // 4字节,布尔值 DOUB, // 8字节,双精度浮点数 CHAR // 字符型} /// <summary>/// eclipse的关键字块,eclipse使用几百个关键字来进行输入和输出的控制/// 关键字相当于命令,关键字后面会出现0个或多个EclipseDataBlock块,相当于命令所带的参数<br> /// </summary>public struct EclipseKeywordBlock{ public int lenBlockHead; // 首先是4字节的整数,用来记录块的长度,一定是16 // 也就是说后面的keyword, lenData和type三项一共占16个字节 public string keyword; // 8个字节,用来记录eclipse的关键字,不足8个字符的关键字要补空格 public int lenData; // 4字节,表示关键字后面出现的数据块(分为整型、浮点、布尔、字符等)的个数 public EclipseDataType type; // 4字节,表示关键字块后面出现的数据块中各个数据的类型 public int lenBlockTail; // 在块的结尾处还是4字节的整数,与前面的lenBlockHead是相等的,也一定是16}

基于EclipseParser库,写了个ecldump程序,可以dump出二进制文件内容的细节信息,dump出来的结果如下:

keyword block: [16] FILEHEAD 100 INTE [16]
data block(1): [400] 320010000000000000000 ...  [400]

keyword block: [16] MAPAXES 6 REAL [16]
data block(1): [24] 587000594640058700059465005871005946500  [24]

keyword block: [16] GRIDUNIT 2 CHAR [16]
data block(1): [16] "METRES          " [16]

keyword block: [16] GRIDHEAD 100 INTE [16]
data block(1): [400] 15050600000000000000 ... [400]

keyword block: [16] COORD 15606 REAL [16]
data block(1): [4000] 01000002444.32601000002588.396...  [4000]

另外,写了ecl2txt程序(Eclipse二进制文件转换程序),可以把静态属性和动态属性按层、时间步导出为文本文件,当前版本为1.2。主要功能有:

(1)可读取E100、E300生成的EGRID、INIT、UNRST文件,把静态属性和动态属性以文本格式输出。

(2)UNRST文件不存在时,也支持读取X0000、X0001...这些按时间步输出的属性文件

(3)三种文本格式输出,XYZ,XYZV,XYZVIJK

(4)可按指定值输出无效网格

(5)中英文属性名称显示

(6)随时可取消转换过程

(7)一键删除大量的临时性输出文件

读出模型后,可以用OpenInventor可视化出来,效果如下:

点击文末左下角“阅读原文”,可下载试用版软件。

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2016-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李海辰的专栏

Unity引擎资源管理代码分析 ( 2 )

上一篇《Unity 引擎资源管理代码分析 ( 1 ) 》讲解了 Unity 引擎资源管理代码的类型设计架构和 Resources.Load 接口的实现,本文将...

6174
来自专栏运维小白

linux基础(day28)

9.6 awk(上) awk工具 head -n2 test.txt|awk -F ':' '{print $1}' head -n2 test.txt|awk...

2046
来自专栏开发与安全

从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)

首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(me...

2140
来自专栏企鹅号快讯

Python模块知识4:序列化Json/pickle

序列化与反序列化 序列化:把Python的基本数据类型转为字符串 反序列化:把字符串转为Python的基本数据类型 Python中用于序列化的两个模块: jso...

2109
来自专栏犀利豆的技术空间

Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表

上篇文章写了 Redis 基础数据结构的可变字符串、链表、字典。大家可以点击链接查看。今天我们继续研究 Redis 的基础数据结构。

843
来自专栏机器学习实践二三事

Numpy使用4

上篇博客写到了numpy的索引与切片,这篇博客介绍numpy的一些数学统计上的使用和如何结合numpy实现对结构化文本的处理 通用函数 所谓的通用函数(ufun...

1985
来自专栏mathor

LeetCode55. 跳跃游戏

 首先创建一个index数组,存储当前位置最大可达的数组下标,就以样例1来举例,输入是[2,3,1,1,4],那么对应的这个index数组就是[2,4,3...

1552
来自专栏Phoenix的Android之旅

哈希碰撞是什么,怎么解决

Hash是一种校验方法, 其中应用最广为人知的就是 HashMap。 当然Hash算法并不完美,有可能两个不同的原始值在经过哈希运算后得到同样的结果, 这样就是...

1182
来自专栏灯塔大数据

每周学点大数据 | No.23 外排序(二)

No.23期 外排序(二) Mr. 王:接下来我们用一个例子对磁盘归并排序进行说明。先来约定讨论的参数:N=24,M=8,B=2。 小可:嗯,一共有2...

3346
来自专栏闻道于事

Java异常处理中的恢复模型

2594

扫码关注云+社区