历史拟合结果对比#
说明#
手工对比大模型的历史结果会耗费很大的精力,通过自动化的脚本可以极大地减少工作量,提高效率。
自动对比分析需要在Python中安装SimRes的Python模块,详见 SimRes油藏数模后处理库 。
数模结果需要是兼容ECLIPSE软件的二进制格式或者RSM文本格式。
SimRes封装了读取数模结果的功能,在Python中只需要少量代码即可使用,使用者可以把精力放到研究计算结果误差和对数据结果的分析上。本示例模型约有100口井,统计WOPR、WWCT、WBHP等这些常用指标的误差并输出结果基本上只需要不到2秒钟。
import sys
import math
import simres as sim
if __name__ == "__main__":
ret = sim.load_result(r'D:\your\model\name.DATA','u','s')
if ret!=0:
if ret>0:
print(ret)
else:
print("Error code:"+ret)
sn = sim.sm_getn_wells()
#print(sn)
if len(sn)==0:
print("There is no wells.")
sim.clear()
sys.exit()
### Below few lines used for DEBUG.
#wvn = sim.sm_getn_wvectors(sn[0])
#print(wvn)
tv = sim.sm_getv_time()
print("Number of Time Steps:",len(tv))
###******************
# Set vector names *
###******************
vc=["WBHP","WWCT"]
for i in range(0,len(vc)):
vn = vc[i]
print("------------------------------------------------")
print("*** Checking history-matching result:"+vn)
print("------------------------------------------------")
for j in range(0, len(sn)):
wn = sn[j]
wv0 = sim.sm_getv_well(wn,vn+"H")
wv1 = sim.sm_getv_well(wn,vn)
rms = 0
###******************************************
# 这里使用了均方根误差,可以替换为其它算法 *
###******************************************
for k in range(0,len(wv0)):
if abs(wv0[k])>0.00001:
rms += pow((wv0[k]-wv1[k])/wv0[k],2)
else:
rms += pow((wv0[k]-wv1[k])/0.00001,2)
rms /=len(wv0)
rms = math.sqrt(rms)
print("{0: >8} : {1:.3f}%".format(wn,rms))
sim.clear()
示例文件请点击 下载 。
备注
这个方法也可以用来进行油藏数值模拟器研发时需要进行大量模型的回归测试中。