2. SimRes模块用户手册#

警告

本网站提供内容仅供学习和科研使用,未经许可,请勿用于任何商业或盈利用途。

2.1. 安装#

2.1.1. 必要组件#

  • 需要安装Python 3.7.x(或更高版本)。SIMRES在3.7.x版本上开发,它自身的调用不需要任何其他Python模块。

  • 如果需要进行数据分析或者绘制图形进行展示,可以使用Numpy, Matplotlib等库。

2.1.2. 开始安装(待完善)#

simres.pyd 复制到Python安装目录下的 Dlls 目录下.

升级时只需要用新的 simres.pyd 文件替换旧版文件即可.

2.2. 函数说明#

2.2.1. 技术定义#

SIMRES可以加载与ECLIPSE数值模拟软件兼容的模拟器输出文件,并对结果进行一些处理。最新导入的结果被设置为 当前模型 (或 默认模型 ), 使用 as_default() 函数可以切换当前的默认模型.

建议使用 import 将 simres 导入为 sim 来简化调用,示例如下:

import simres as sim

2.2.2. 文件IO函数#

2.2.2.1. load_result()#

  • ret = load_result(path, flag, option)

加载ECLIPSE油藏数值模拟软件的结果。通过设置不同的 option 选项来控制不同数据的加载。

path :DATA文件的全路径文件名.

flag : 设置 ‘u’ 对于UNIFOUT输出的文件,设置为其他的符号表示加载MULTOUT输出的文件。

option :目前支持加载的类型有: g(GRID),e(EGRID), i(INIT),s(SUMMARY),x(RESTART),l(StreamLine).

不过对于GRID文件的加载目前只能处理角点网格的数据。

ret :返回值 <0 表示出错。 >=0 为当前模型数据的索引 id .

示例:

# Load all result.
simres.load_result("d:\filepath\case1.data", "u","gisx")

# Load summary data only
sim.load_result(r'd:\filepath\case2.data','m','s')

2.2.2.2. load_rsm()#

  • ret = load_rsm(path)

加载*.RSM文件,该文件为ECLIPSE的RUNSUM格式的输出文件。

path :RSM文件的全路径。

ret :返回值 <0 表示出错。 >=0 为当前模型数据的索引。

2.2.2.3. get_ids()#

  • id[] = get_ids()

id[] : 返回全部已经导入数据的索引数组 id

2.2.2.4. reload()#

  • ret = reload(flag)

按照 flag 设置的选项重新加载结果数据到当前 默认模型 中。

ret : 返回值 <0 表示出错,如没有错误则返回 =0

2.2.2.5. default()#

  • id = default()

id : 返回当前模型的索引 id 。如返回 -1 则表示出错或当前没有加载任何的模型数据。

2.2.2.6. get_label()#

  • n = get_label()

n : 返回当前模型数据的标签名称,该名称通常就是被导入的DATA文件的根名,并且SIMRES会自动将相同根名的模型标签后加入一个自动编号。

2.2.2.7. as_default()#

  • ret = as_default(id)

将索引等于 id 的模型设置为当前模型。SIMRES中的默认函数操作都是针对当前模型的。

id :需要设置为当前模型的索引 id ,整型数.

ret : 返回跟设置的 id 相同的值则表示调用成功,如果返回值 <0 表示设置出错;出错时模块的设置保持不变。

2.2.2.8. remove()#

  • ret = remove(id)

删除所以为 id 的模型。

如果 id 是当前模型的索引,则删除当前模型,并且当前模型之后的模型被设置为当前模型。如果当前模型是最后一个模型,则当前模型被删除后原来这个模型之前的那个模型会被设置为当前模型。

如果当前没有加载模型,则会返回固定值 -1 .

ret :返回值 <0 表示出错;而返回 >=0 的值为新的当前模型索引.

2.2.2.9. clear()#

  • clear()

清除模块内加载的全部数据,并且重置所有内部参数。

2.2.2.10. debug()#

  • debug(n)

    设置调试级别;如果设置为0表示清除所有调试级别。

    n=1 : 输出基本的调试信息。

2.2.3. 地质模型结果数据#

2.2.3.1. gm_dims()#

  • d[] = gm_dims()

d[] : 返回模型的维数定义,为 List 类型。上标一般为3,分别是XYZ三个方向的网格维数。

Example:

>>>simres.gm_dims()
[199, 201, 16]

2.2.3.2. gm_is_dpgrid#

  • q = gm_is_dpgrid()

q : 如果是双重介质网格则返回True,否则返回False。

2.2.3.3. gm_getn_gp()#

  • n[] = gm_getn_gp()

n[] : 返回地质模型属性(浮点数)列表。

Example:

>>> sim.gm_getn_gp()
['DX', 'DY', 'DZ', 'PERMX', 'PERMY', 'PERMZ', 'MULTX', 'MULTY', 'MULTZ', 'PORO', 'NTG', 'TOPS', 'DEPTH', 'TRANX', 'TRANY', 'TRANZ', 'MINPVV', 'MULTPV']

2.2.3.4. gm_getn_rp()#

  • n[] = gm_getn_rp()

n[] : 返回地质模型中分区属性(整型)的列表。

Example:

>>> sim.gm_getn_rp()
['PVTNUM', 'SATNUM', 'EQLNUM', 'FIPNUM', 'AQUIFERA']

2.2.3.5. gm_getv_a2o()#

  • v[] = gm_getv_a2o()

v[] : 返回每个有效网格与原始网格编号对应关系的数组。

Example:

>>> sim.gm_getv_a2o()
[0, 1, 2, 3, ,..., 10, 11, 12, 13, ..., 400]

2.2.3.6. gm_getv_o2a()#

  • v[] = gm_getv_o2a()

v[] : 返回每个原始网格对应有效网格编号的数据,如果数组中的值小于0则表示该网格为无效网格。

Example:

>>> sim.gm_getv_o2a()
[0, 1, 2, 3, ,..., 10, 11, 12, 13, ..., 400]

2.2.3.7. gm_getv_coords()#

  • vv[] = gm_getv_coords()

vv[] : 返回角点网格下的网格坐标点数组,网格的排序方式按照ECLIPSE模拟器的ZCORN关键字中所约定的顺序。

每个点为一个 List[x,y,z] 类型,包括点的坐标值;每一个网格包括8个点。

  • 目前还不支持ECLIPSE下的非结构化网格格式,可以用其他方式间接支持。

Example:

>>> sim.gm_getv_coords()
[[[-0.17024141550064087, -13.524370193481445, 3084.14990234375], [493.5873107910156, -13.524370193481445,
3087.7099609375], [-0.17019735276699066, -517.5015258789062, 3089.406005859375], [493.58734130859375,
-517.5015258789062, 3075.333984375],..., [-0.17024141550064087, -13.524370193481445, 3089.14990234375],
[493.5873107910156, -13.524370193481445, 3092.7099609375], [-0.17019735276699066, -517.5015258789062,
3094.406005859375], [493.58734130859375, -517.5015258789062, 3080.333984375]]]

2.2.3.8. gm_getv_gp()#

  • v[] = gm_getv_gp(propertyname)

返回属性名为 propertyname 的地质属性值的数组。按照有效网格编号排序。

Example:

>>> sim.gm_getv_gp('PERMX')
[1000.0, 1000.0, 1000.0, 1000.0, 1000.0, ... , 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0]

# 将值返回到一个数组里.
>>> property = sim.gm_getv_gp('PERMX')

2.2.3.9. gm_getv_rp()#

  • v[] = gm_getv_rp(propertyname)

返回属性名为 propertyname 的分区属性值的数组。按照有效网格编号排序。

Example:

>>> sim.gm_getv_rp('SATNUM')
[1, 1, 1, 1, 1, 1, ..., 2, 2, 2, 2, 2, 2 ]

2.2.3.10. gm_index2ijk()#

  • i[] = gm_index2ijk(nx,ny,nz,index)

返回一个 index 值的网格编号 List[I,J,K], 需要给出模型的XYZ三个方向的维数(nx ny nz).

Example:

# Convert a cell index 1020 to its IJK location in a grid (24 X 25 X 12)
>>> sim.gm_index2ijk(24,25,12,1020)
[12, 18, 2]

2.2.3.11. gm_getv_roofcells()#

  • v[] = gm_getv_roofcells()

返回当前模型从顶面看下去所能看到顶层网格的有效网格编号数组(该编号是从0开始的),这些网格可能是在不同的K层上。

Example:

>>> sim.gm_getv_roofcells()
[0,1,2,7,8,9,11,..., 101,102,108,...]

2.2.4. Summary数据#

2.2.4.1. sm_getv_dims()#

  • v[] = sm_getv_dims()

v[] : 返回在SUMMARY文件中所保存的GRID部分的网格维数,一般同一个模型使用 gm_dims() 函数即可,该函数可以判断SUMMARY文件和所加载网格的数据是否一致。

Example:

>>> simres.sm_getv_dims()
[199, 201, 16]

2.2.4.2. sm_getv_time()#

  • v[] = getv_time()

返回时间值数组,该时间值可以作为所有曲线的默认时间X值。

Example:

>>> simres.sm_getv_time()
[0, 30, 31, 31, ... , 15, 16, 31]

2.2.4.3. sm_getn_wells()#

  • n[] = sm_getn_wells()

返回加载的SUMMARY数据中的全部井号数组。

Example:

>>> simres.sm_getn_wells()
["WELL1","WELL2","WELL3","WELL4"]

2.2.4.4. sm_getn_groups()#

  • n[] = sm_getn_groups()

返回加载的SUMMARY数据中的全部井组名数组。

Example:

>>> simres.sm_getn_groups()
["GROUP1","GROUP2","GROUP3","GROUP4"]

2.2.4.5. sm_getn_aquifers()#

  • a[] = sm_getn_aquifers()

返回加载的SUMMARY数据中的全部水体编号(水体名)数组。

Example:

>>> simres.sm_getn_aquifers()
['1','2','3','4']

2.2.4.6. sm_getn_completions()#

  • n[] = sm_getn_completions(wellname)

wellname : 井名.

n[] : 返回给定井名的射孔段编号(即射孔名称)数据。

Example:

>>> sim.sm_getn_completions('WELL1')
['3,15,1', '3,15,2']

2.2.4.7. sm_getn_regions()#

  • a[] = sm_getn_regions()

a[] : 返回加载的SUMMARY数据中的全部分区编号数组。

Example:

>>> sim.sm_getn_regions()
['1','2','3']

2.2.4.8. sm_getn_misc()#

  • a[] = sm_getn_misc()

a[] : 返回加载的SUMMARY数据中的未分类的参数名数组。

Example:

>>> sim.sm_getn_misc()
['TCPU','DATE']

2.2.4.9. sm_getn_all()#

  • a[] = sm_getn_all()

a[] : 返回加载的SUMMARY数据中所有的参数名数组,这些参数名按照一定规则组合。

Example:

>>> simres.sm_getn_all()
[[TIME', 'YEARS', 'DAY', 'MONTH', 'YEAR', 'FOE', ... , 'WBHP:P35', 'WWPR:INJW', 'AAQP:1']

2.2.4.10. sm_get_startdate#

  • a[] = sm_get_startdate()

a[] : 返回加载的SUMMARY数据定义文件中的模拟起始日期。

Example:

>>> simres.sm_get_startdate()
'2008-01-01 00:00:00.000000'

2.2.4.11. sm_getn_wvectors()#

  • vn[] = sm_getn_wvectors(well_name)

well_name :给定的井名。

vn[] :返回该井所包含的结果数据名称数组。

Example:

>>> simres.sm_getn_wvectors("WELL1")
["WBHP","WOPR","WWCT","WGOR"]

2.2.4.12. sm_getn_gvectors()#

  • n[] = sm_getn_gvectors(group_name)

group_name :给定的井组名。

n[] :返回该井组所包含的结果数据名称数组。

Example:

>>> simres.sm_getn_gvectors("WELL1")
["GLPR","GOPR","GWCT","GGOR"]

2.2.4.13. sm_getn_avectors()#

  • n[] = sm_getn_avectors(aquifername)

aquifername : 水体名;通常情况下是一个字符类型的整型数。

n[] : 返回该水体所包含的结果数据名称数组。

Example:

>>> simres.sm_getn_avectors('1')
['AAQR','AAQT','AAQP']

2.2.4.14. sm_getn_cvectors()#

  • n[] = sm_getn_cvectors(well,completion)

    well : 井名。

    completion : 井中的一个射孔段名称。

    n[] : 返回该井中该射孔段所包含的结果数据名称数组。

Example:

>>> simres.sm_getn_cvectors('WELL12','5,7,9')
['COPR','CWPR','CPR']

2.2.4.15. sm_getn_rvectors()#

  • n[] = sm_getn_rvectors(region)

region : 分区名称或编号,通常是一个字符型的整数。

n[] : 返回该分区所包含的结果数据名称数组。

Example:

>>> simres.sm_getn_rvectors('1')
['ROPR','RWPR','RGPR']

2.2.4.16. sm_getv_well()#

  • vv[] = sm_getv_well(well_name, vector_name)

well_name : 井名.

vector_name : 参数名.

vv[] : 返回给定井所对应参数的数值数组,如果没有数据则返回空数组。

Example:

>>> simres.sm_getv_well("WELL1", "WBHP")
[0, 92.4, 98.0, 130.3, ... , 150.6, 35.2, 1.0132]

2.2.4.17. sm_getv_group()#

  • vv[] = sm_getv_group(group_name, vector_name)

group_name : 井组名。注意 FIELD 是一个特殊的井组名,表示整个模型这个大井组。

vector_name : 参数名.

vv[] : 返回给定井组所对应参数的数值数组,如果没有数据则返回空数组。

Example:

>>> simres.sm_getv_group("GROUP1", "GLPR")
[0, 92.4, 98.0, 130.3, ... , 150.6, 35.2, 1.0132]

2.2.4.18. sm_getv_aquifer()#

  • v[] = sm_getv_aquifer(aquifername,vectorname)

aquifername : 水体名。

vectorname : 参数名。

v[] : 返回给定水体所对应参数的数值数组,如果没有数据则返回空数组。

Example:

>>> simres.sm_getv_aquifer('1', 'AAQP')
[0, 192.4, 198.0, 130.3, ... , 151.6, 135.2, 12.5]

2.2.4.19. sm_getv_completion()#

  • v[] = sm_getv_completion(well, completion, vector)

well : 井名。

completion : 井的射孔段名称,格式为 ‘I,J,K’,其中I、J、K分别为射孔段所在网格的IJK编号。

vector : 参数名.

v[] : 返回给定井中给定射孔段所对应参数的数值数组,如果没有数据则返回空数组。

Example:

>>> simres.sm_getv_completion('W1','2,3,5', 'COPR')
[0, 192.4, 198.0, 130.3, ... , 151.6, 135.2, 12.5]

2.2.4.20. sm_getv_region()#

  • v[] = sm_getv_region(region,vector)

region : 分区名。

vector : 参数名。

v[] : 返回给定分区所对应参数的数值数组,如果没有数据则返回空数组。

Example:

>>> simres.sm_getv_region('1','ROPR')
[0, 192.4, 198.0, 130.3, ... , 151.6, 135.2, 12.5]

2.2.5. 重启数据文件(三维结果)#

2.2.5.1. xn_getv_ts()#

  • v[] = xn_getv_ts()

v[] : 返回导入的结果数据全部的时间步数组,以“天”为单位。

Example:

>>> sim.xn_getv_ts()
[0.0, 30.0, 60.0, 90.0, ...,  180.0]

2.2.5.2. xn_getv_date()#

  • v[] = xn_getv_date()

v[] : 返回导入的结果数据全部的日期,这个日期与时间步数组是对应的。

Example:

>>> sim.xn_getv_date()
['1990-07-01 00:00:00.000000', '1991-01-01 00:00:00.000000', ... ,'1991-07-01 00:00:00.000000']

2.2.5.3. xn_getv_spts()#

  • v[] = xn_getv_spts(spname)

spname : 结果属性名。

v[] : 返回给定属性的时间步数组。

  • ECLIPSE模拟器允许在不同时间步设置不同的输出,这样会导致结果属性的时间步数组存在差异。

Example:

>>> sim.xn_getv_spts('SWAT')
[0.0, 30.0, 60.0, 90.0, ...,  180.0]

2.2.5.4. xn_getv_wellts()#

  • v[] = xn_getv_wellts(wname)

wname : 井名.

v[] : 返回给定井的所有时间步数组。

Example:

>>> sim.xn_getv_wellts('P35')
[0.0, 30.0, 60.0, 90.0, ...,  180.0]

2.2.5.5. xn_getn_sp()#

  • n[] = xn_getn_sp()

n[] : 返回所有属性名的数组。

Example:

>>> sim.xn_getn_sp()
['PRESSURE', 'SWAT', 'SGAS', 'RS', ... ,'FIPGAS', 'SFIPOIL', 'SFIPWAT', 'SFIPGAS']

2.2.5.6. xn_getn_wells()#

  • n[] = xn_getn_wells()

n[] : 返回重启数据中的所有井名数组。

Example:

>>> sim.xn_getn_wells()
['WELL1', 'WELL15', 'WELL16', 'WELLG']

2.2.5.7. xn_getc_comp_d()#

  • n = xn_getc_comp_d(wname,days)

wname : 井名。

days : 从开始时间步起始的时间天数(浮点数).

n : 返回给定井在某个时间步下所包含的射孔段数量。

Example:

>>> sim.xn_getc_comp_d('WELL3',120.0)
12

2.2.5.8. xn_getc_comp_i()#

  • n = xn_getc_comp_i(wname,ts_index)

wname : 井名。

index : 时间步序号(索引值)。

n : 返回给定井在某个时间步下所包含的射孔段数量。

Example:

>>> sim.xn_getc_comp_d('WELL3',13)
16

2.2.5.9. xn_getv_comp_d()#

  • v[] = xn_getv_comp_d(wname,days, comp_index)

wname : 井名。

days : 时间步,需要为浮点数类型,即设置 30.0 而不是 30,因为 30 会被认为是一个井号.

comp_index : 射孔段的索引号(zero-based).

v[] : 当前时间步该井中给定射孔段的生产动态。具体参数如下表所示:

参数名

类型

说明

location

List

井口坐标

activecell

Integer

有效网格序号

status

String

射孔状态

satnum

Integer

相渗曲线编号(驱替)

imbnum

Integer

相渗曲线编号(吸入)

flowtype

String

流动类型

direction

String

流动方向

segment

Integer

段编号(多段井)

cf

Float

连接因子

depth

Float

深度

rw

Float

井筒半径

kh

Float

底层系数

skin

Float

表皮系数

dfactor

Float

D因子

ro

Float

泄油半径

pres

Doule

压力

Example:

>>> sim.xn_getv_comp_d('P1',30.0 , 0)
{'grat': 0.0, 'segment': 0, 'orat': 8.786374620077607, 'activecell': 1, 'satnum': 0, 'cf': 17.94487762451172,
'wrat': 0.0, 'kh': 1000.0, 'depth': 0.0, 'pres': 155.72557427596632, 'imbnum': 0, 'direction': 'Z', 'skin': 0.
0, 'status': 'OPEN', 'rw': 0.10000000149011612, 'flowtype': 'inj', 'location': [1, 1, 1], 'ro': 0.100000001490
11612, 'bpr': 0.0, 'dfactor': 0.0, 'bpsat': 0.0}

返回的数据为Collection类型的数据,按照Collection使用名称进行访问,示例如下:

>>> cvv = sim.xn_getv_comp_d('P1',30.0 , 0)
>>> cvv['grat']
0.0
>>> cvv['location']
[1, 1, 1]
...
  • 这个功能还处于开发中,会根据用户的实际需要增加或者调整参数。

2.2.5.10. xn_getv_comp_i()#

  • v[] = xn_getv_comp_i(wname,ts_index, comp_index)

wname : 井名。

ts_index : 时间步编号(zero based)。

comp_index : 射孔段的索引号(zero-based)。

v[] : 当前时间步该井中给定射孔段的生产动态。请参考 xn_getv_comp_d() above.

2.2.5.11. xn_getv_sp()#

  • v[] = xn_getv_sp(spname, timestep)

spname : 属性名.

timestep : 时间步,为从开始日期算起的时间天数.

v[] : 给定时间步下的属性值数组。

Example:

>>> sim.xn_getv_sp('SWAT',0)
[0.2, 0.2, 0.3, 0.3, 0.4, ..., 0.2, 0.2, 0.3, 0.3, 0.4]

2.2.5.12. xn_getv_well_d()#

  • v[] = xn_getv_well_d(wname,days)

wname : 井名

days : 时间步,从起始时间开始算起的时间天数。

v[] : 返回给定时间步给定井的生产动态数据。返回的数据为Collection类型,说明见下表所示:

参数名

类型

说明

location

List

井口坐标

group

String

井组名

type

String

井类型

status

String

井状态

ctrlmode

String

井控方式

phase

String

井的主相

vfp

Integer

井筒VFP表号

crossflow

String

是否窜流

orat

Double

产油量

wrat

Double

产水量

grat

Double

产气量

lrat

Double

产液量

bhp

Double

井底流压

resv

Double

油藏体积产量

thp

Double

井口压力

deno

Double

油密度

denw

Double

水密度

deng

Double

气密度

wpimult

Double

井PI系数

histwell

String

true或者false

bhph

Double

历史井底流压

thph

Double

历史井口压力

示例:

2.2.5.13. xn_getv_well_i()#

  • v[] = xn_getv_well_i(wname,ts_index)

wname : 井名

ts_index : 时间步序号。

v[] : 返回给定时间步给定井的生产动态数据。返回的数据为Collection类型,数据格式请参考 xn_getv_well_d 函数。

2.2.6. 流线计算结果(FrontSim格式)#

2.2.6.1. sl_getc_ts()#

  • n = sl_getc_ts()

n : 返回流线计算结果中的时间步个数.

Example:

>>> sim.sl_getc_ts()
 12

2.2.6.2. sl_getn_ss()#

  • n[] = sl_getn_ss()

    n[] : 返回流线结果中所有的源汇点个数.

Example:

 >>> sim.sl_getn_ss()
['P6', 'I2', 'EXPAND', 'COMPRESS']

2.2.6.3. sl_getn_properties()#

  • v[] = sl_getn_properties()

    v[] : 返回流线结果中所有的属性名(包括所有的时间步).

Example:

>>> sim.sl_getn_properties()
 ['SWAT','SOIL']

2.2.6.4. sl_getc_tsbank()#

  • n = sl_getc_tsbank(ts,pn)

    n : 返回在给出的时间步 ts 下属性 pn 的流线组个数.

    ts : 对于流线模拟来说,初始的第0个时间步一般没有计算结果,所以流线的计算结果通常从1开始。但是编号仍然是从0开始,只是0时间步没有数据,会返回0。

Example:

>>> sim.sl_getc_tsbank(1,'SWAT')
 21

2.2.6.5. sl_getv_tsb2d()#

  • v[] = sl_getv_tsb2d(ts,pn,bn)

    bn : 流线组的索引.

    v[] : 返回给定 bn 的流线组在 ts 时间步对应属性 pnlinestrips,在2D模式下,会导出线中坐标点的(x,y)坐标值。

    linestrips = [linestrip1, linestrip2, … , linestrip(n) ]

    对于任何一个 linestrip(n) = [beg_end, points]. 在这个列表中:

    beg_end = [name_begin, name_end]

    points = [x1,y1,x2,y2, … ,xn, yn]

Example:

>>> sim.sl_getv_tsb2d(1,'SWAT', 0)
 [['W1','W18'], [2123.0123, 3869,21, ... , 9874.23, 6873,01]]

2.2.6.6. sl_getv_tsbp()#

  • v[] = sl_getv_tsbp(ts,bn,pn)

    v[] : 返回给定属性 pn 在时间步 ts 时对应 bn 流线组的流线数值数组.

    v[] = [property1, property2, … , property(n) ]

    对于任何的属性值 property(n) 是流线上对应的 pn 属性值.

    流线的输出结果取决于模拟器中设置的参数。