更新求解器

feature/Model-20260625
lvjunjie 4 months ago
parent 2ede9c2410
commit aa28668d9a

@ -1,4 +1,4 @@
#pragma once #pragma once
#ifndef PCH_H #ifndef PCH_H
#define PCH_H #define PCH_H
#include "framework.h" #include "framework.h"
@ -15,12 +15,14 @@
#include <unordered_set> #include <unordered_set>
#include <Windows.h> #include <Windows.h>
//const double M_PI = acos(-1.0); #ifndef M_PI
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double const double M_PI = acos(-1.0);
typedef std::vector<std::vector<double>>dVec2; //二维数组:double #endif
typedef std::vector<std::vector<int>>iVec2; //二维数组:int typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<double>dVec1; //一维数组:double typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<int>iVec1; //一维数组:int typedef std::vector<std::vector<int>>iVec2; //二维数组:int
typedef std::vector<double>dVec1; //一维数组:double
typedef std::vector<int>iVec1; //一维数组:int
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0) template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0)
{ {
@ -95,11 +97,11 @@ template<class T> void HX_copy(std::vector<T>& p1, T* p0, int m)
} }
} }
//点结构体 //点结构体
struct point struct point
{ {
//点结构体 //点结构体
double x; double y; //点坐标 double x; double y; //点坐标
point() { x = 0; y = 0; } point() { x = 0; y = 0; }
~point() {} ~point() {}
void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; } void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; }
@ -117,10 +119,10 @@ struct point3
void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; } void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; }
void set(const point3&p) { x = p.x; y = p.y; z = p.z; } void set(const point3&p) { x = p.x; y = p.y; z = p.z; }
}; };
//网格结构体 //网格结构体
struct cell struct cell
{ {
//网格单元结构体 //网格单元结构体
std::vector<point> p; std::vector<point> p;
iVec2 pindex; iVec2 pindex;
iVec1 isplot; iVec1 isplot;
@ -129,24 +131,24 @@ struct cell
}; };
//网格算法输入参数结构体 //网格算法输入参数结构体
struct HX_NWTM_GRID_INPUT struct HX_NWTM_GRID_INPUT
{ {
// 网格划分算法输入参数结构体 // 网格划分算法输入参数结构体
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据 dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据
dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据 dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据
dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据 dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据
dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 压裂直井数据 dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 压裂直井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流,大于0时为有限导流))
dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 多级压裂水平井数据 dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流,大于0时为有限导流))
dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据 dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数 double GridControl; // 网格大小控制参数
int D; // 维数 int D; // 维数
//默认初始化 //默认初始化
HX_NWTM_GRID_INPUT() HX_NWTM_GRID_INPUT()
{ {
dVec1 a(3), b(4), c(5); dVec1 a(3), b(4), c(5), d(6);
Boundary.resize(4); Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; Boundary[1] = b;
@ -161,18 +163,18 @@ struct HX_NWTM_GRID_INPUT
HorizontalWell.resize(0); HorizontalWell.resize(0);
FractureVerticalWell.resize(1); FractureVerticalWell.resize(1);
c[0] = -200; c[1] = -200; c[2] = 200; c[3] = -200; c[4] = 0.05; FractureVerticalWell[0] = c; d[0] = -200; d[1] = -200; d[2] = 200; d[3] = -200; d[4] = 0.05; d[5] = 0; FractureVerticalWell[0] = d;
MultistageFracturedHorizontalWell.resize(1); MultistageFracturedHorizontalWell.resize(1);
MultistageFracturedHorizontalWell[0].resize(3, dVec1(5)); MultistageFracturedHorizontalWell[0].resize(3, dVec1(5));
c[0] = -600; c[1] = 600; c[2] = -400; c[3] = 600; c[4] = 0.1; MultistageFracturedHorizontalWell[0][0] = c; d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; MultistageFracturedHorizontalWell[0][1] = c; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; MultistageFracturedHorizontalWell[0][2] = c; d[0] = -600; d[1] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][2] = d;
InclinedWell.resize(0); InclinedWell.resize(0);
Fault.resize(1); Fault.resize(1);
c[0] = -500; c[1] = 1000; c[2] = 500; c[3] = 500; Fault[0] = c; b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; Fault[0] = b;
GridControl = 150.0; GridControl = 150.0;
@ -181,17 +183,17 @@ struct HX_NWTM_GRID_INPUT
~HX_NWTM_GRID_INPUT() {} ~HX_NWTM_GRID_INPUT() {}
}; };
//网格算法输出参数结构体(绘图用) //网格算法输出参数结构体(绘图用)
struct HX_NWTM_GRID_OUTPUT1 struct HX_NWTM_GRID_OUTPUT1
{ {
cell TRI_cell; //三角形网格 cell TRI_cell; //三角形网格
cell PEBI_cell; //PEBI网格 cell PEBI_cell; //PEBI网格
HX_NWTM_GRID_OUTPUT1() {} HX_NWTM_GRID_OUTPUT1() {}
~HX_NWTM_GRID_OUTPUT1() {} ~HX_NWTM_GRID_OUTPUT1() {}
}; };
//网格算法输出参数结构体(模型用) //网格算法输出参数结构体(模型用)
struct HX_NWTM_GRID_OUTPUT2 struct HX_NWTM_GRID_OUTPUT2
{ {
dVec2 Trinodexy; dVec2 Trinodexy;
@ -213,6 +215,13 @@ struct HX_NWTM_GRID_OUTPUT2
dVec2 df; dVec2 df;
dVec1 xf; dVec1 xf;
iVec2 infra; iVec2 infra;
iVec1 nf;
iVec1 jjf;
iVec1 jjfl;
dVec1 lfcd;
iVec2 infra1;
dVec2 lf1;
dVec2 df1;
} LieFengJingNeiBianJie; } LieFengJingNeiBianJie;
struct { struct {
int n; int n;
@ -222,6 +231,16 @@ struct HX_NWTM_GRID_OUTPUT2
dVec2 dsxf; dVec2 dsxf;
iVec2 inhor; iVec2 inhor;
iVec1 nhor; iVec1 nhor;
dVec2 areah;
iVec2 inhor1;
iVec2 nh;
iVec2 jjh;
dVec2 hfcd;
iVec2 jjhl;
iVec2 jjh2;
iVec2 inhor2;
dVec2 lh1;
dVec2 dh1;
} DuoJiYaLieShuiPingJingNeiBianJie; } DuoJiYaLieShuiPingJingNeiBianJie;
struct { struct {
int n; int n;
@ -247,17 +266,17 @@ struct HX_NWTM_GRID_OUTPUT2
}; };
//KRINGING插值输入参数结构体 //KRINGING插值输入参数结构体
struct HX_KRING_INPUT struct HX_KRING_INPUT
{ {
double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和 double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和
double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度 double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度
double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性 double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性
double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , } double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , }
//高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量 //高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量
//指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量 //指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量
//球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零 //球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零
dVec2 p; //插值点 dVec2 p; //插值点
dVec2 v; // dVec2 v; //
~HX_KRING_INPUT() {} ~HX_KRING_INPUT() {}
HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0) HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0)
@ -268,7 +287,7 @@ struct HX_KRING_INPUT
} }
}; };
//KRINGING插值输出参数结构体 //KRINGING插值输出参数结构体
struct HX_KRING_OUTPUT struct HX_KRING_OUTPUT
{ {
dVec1 v; dVec1 v;
@ -276,75 +295,75 @@ struct HX_KRING_OUTPUT
~HX_KRING_OUTPUT() {} ~HX_KRING_OUTPUT() {}
}; };
//数值试井模型求解器输入参数结构体 //数值试井模型求解器输入参数结构体
struct HX_NWTM_MODEL_INPUT struct HX_NWTM_MODEL_INPUT
{ {
int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相 int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相
HX_NWTM_GRID_OUTPUT2 GRID; HX_NWTM_GRID_OUTPUT2 GRID;
struct Rate //流量数据 struct Rate //流量数据
{ {
dVec2 t; //时间, h [一口井一组数] dVec2 t; //时间, h [一口井一组数]
dVec2 qo; //油流量,m^3/d [一口井一组数] dVec2 qo; //油流量,m^3/d [一口井一组数]
dVec2 qg; //气流量,m^3/d [一口井一组数] dVec2 qg; //气流量,m^3/d [一口井一组数]
dVec2 qw; //水流量,m^3/d [一口井一组数] dVec2 qw; //水流量,m^3/d [一口井一组数]
}Rate; }Rate;
struct Pressure //压力数据 struct Pressure //压力数据
{ {
dVec2 t; //时间, h [一口井一组数] dVec2 t; //时间, h [一口井一组数]
dVec2 p; //压力, MPa [一口井一组数] dVec2 p; //压力, MPa [一口井一组数]
}Pressure; }Pressure;
struct CS //井储表皮数据 struct CS //井储表皮数据
{ {
dVec1 C; //井储, m^3/MPa [一口井一个数] dVec1 C; //井储, m^3/MPa [一口井一个数]
dVec1 S; //表皮, [一口井一个数] dVec1 S; //表皮, [一口井一个数]
}CS; }CS;
struct PVT //流体性质数据 struct PVT //流体性质数据
{ {
dVec1 p; //压力, MPa dVec1 p; //压力, MPa
double pb; //饱和压力, MPa double pb; //饱和压力, MPa
dVec1 Rso; //溶解气油比, m^3/m^3 dVec1 Rso; //溶解气油比, m^3/m^3
dVec1 Bo; //油体积系数, m^3/m^3 dVec1 Bo; //油体积系数, m^3/m^3
dVec1 Co; //油压缩系数, 1/MPa dVec1 Co; //油压缩系数, 1/MPa
dVec1 miuo; //油粘度, mPa·s dVec1 miuo; //油粘度, mPa·s
dVec1 rouo; //油密度, kg/m^3 dVec1 rouo; //油密度, kg/m^3
dVec1 Rv; //凝析油气比, m^3/m^3 dVec1 Rv; //凝析油气比, m^3/m^3
dVec1 Bg; //气体积系数, m^3/m^3 dVec1 Bg; //气体积系数, m^3/m^3
dVec1 Cg; //气压缩系数, 1/MPa dVec1 Cg; //气压缩系数, 1/MPa
dVec1 miug; //气粘度, mPa·s dVec1 miug; //气粘度, mPa·s
dVec1 roug; //气密度, kg/m^3 dVec1 roug; //气密度, kg/m^3
dVec1 Z; //气偏差因子, 1 dVec1 Z; //气偏差因子, 1
dVec1 Rsw; //溶解气水比, m^3/m^3 dVec1 Rsw; //溶解气水比, m^3/m^3
dVec1 Bw; //水体积系数, m^3/m^3 dVec1 Bw; //水体积系数, m^3/m^3
dVec1 Cw; //水压缩系数, 1/MPa dVec1 Cw; //水压缩系数, 1/MPa
dVec1 miuw; //水粘度, mPa·s dVec1 miuw; //水粘度, mPa·s
dVec1 rouw; //水密度, kg/m^3 dVec1 rouw; //水密度, kg/m^3
dVec1 V; //吸附气量, m^3/kg dVec1 V; //吸附气量, m^3/kg
dVec1 k_kinitial; //渗透率比, 1 dVec1 k_kinitial; //渗透率比, 1
dVec1 Cf_Cfinitial; //岩石压缩系数比, 1 dVec1 Cf_Cfinitial; //岩石压缩系数比, 1
dVec1 So; //油饱和度 dVec1 So; //油饱和度
dVec1 Kro; //油相对渗透率 dVec1 Kro; //油相对渗透率
dVec1 Sg; //气饱和度 dVec1 Sg; //气饱和度
dVec1 Krg; //气相对渗透率 dVec1 Krg; //气相对渗透率
dVec1 Sw; //水饱和度 dVec1 Sw; //水饱和度
dVec1 Krw; //水相对渗透率 dVec1 Krw; //水相对渗透率
}PVT; }PVT;
struct Base //基础数据 struct Base //基础数据
{ {
double Pi; //初始压力, MPa double Pi; //初始压力, MPa
double Cti; //综合压缩系数, 1/MPa double Cti; //综合压缩系数, 1/MPa
double Cf; //岩石压缩系数, 1/MPa double Cf; //岩石压缩系数, 1/MPa
double Soi; //初始含油饱和度 double Soi; //初始含油饱和度
double Sgi; //初始含气饱和度 double Sgi; //初始含气饱和度
double Swi; //初始含水饱和度 double Swi; //初始含水饱和度
dVec1 k; //渗透率, D [一个网格单元一个值] dVec1 k; //渗透率, D [一个网格单元一个值]
dVec1 phi; //孔隙度, 1 [一个网格单元一个值] dVec1 phi; //孔隙度, 1 [一个网格单元一个值]
dVec1 h; //储层厚度, m [一个网格单元一个值] dVec1 h; //储层厚度, m [一个网格单元一个值]
double d; //时间增长指数 double d; //时间增长指数
double dt_Min; //最小时间间隔, h double dt_Min; //最小时间间隔, h
double dt_Max; //最大时间间隔, h double dt_Max; //最大时间间隔, h
}Base; }Base;
//初始化 //初始化
HX_NWTM_MODEL_INPUT() {} HX_NWTM_MODEL_INPUT() {}
~HX_NWTM_MODEL_INPUT() {} ~HX_NWTM_MODEL_INPUT() {}
HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0)
@ -437,23 +456,23 @@ struct HX_NWTM_MODEL_INPUT
} }
}; };
//数值试井模型求解器输出参数结构体 //数值试井模型求解器输出参数结构体
struct HX_NWTM_MODEL_OUTPUT struct HX_NWTM_MODEL_OUTPUT
{ {
dVec1 t; //时间, h dVec1 t; //时间, h
dVec2 pw; //井底压力, MPa [一口井一组数] dVec2 pw; //井底压力, MPa [一口井一组数]
dVec2 p; //压力分布, MPa [一个时间一组数] dVec2 p; //压力分布, MPa [一个时间一组数]
dVec2 So; //油饱和度分布 [一个时间一组数] dVec2 So; //油饱和度分布 [一个时间一组数]
dVec2 Sg; //气饱和度分布 [一个时间一组数] dVec2 Sg; //气饱和度分布 [一个时间一组数]
dVec2 Sw; //水饱和度分布 [一个时间一组数] dVec2 Sw; //水饱和度分布 [一个时间一组数]
dVec2 k; //渗透率分布,mD [一个时间一组数] dVec2 k; //渗透率分布,mD [一个时间一组数]
HX_NWTM_MODEL_OUTPUT() {} HX_NWTM_MODEL_OUTPUT() {}
~HX_NWTM_MODEL_OUTPUT() {} ~HX_NWTM_MODEL_OUTPUT() {}
}; };
HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口 HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口
HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //数值试井非均质性计算接口 HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //数值试井非均质性计算接口
HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //数值试井模型求解器接口 HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //数值试井模型求解器接口

@ -1,17 +1,19 @@
#include"pch.h" #include"pch.h"
#include <sstream>
#include <string>
void Write2DVectorToCSV(const std::vector<std::vector<double>>& data, const std::string& filename) { void Write2DVectorToCSV(const std::vector<std::vector<double>>& data, const std::string& filename) {
std::ofstream file(filename.c_str()); // VS2010需使用.c_str() std::ofstream file(filename.c_str()); // VS2010需使用.c_str()
if (file.is_open()) { if (file.is_open()) {
for (size_t row = 0; row < data.size(); ++row) { for (size_t row = 0; row < data.size(); ++row) {
for (size_t col = 0; col < data[row].size(); ++col) { for (size_t col = 0; col < data[row].size(); ++col) {
// 设置固定小数格式和精度 // 设置固定小数格式和精度
file << std::fixed << std::setprecision(15) << data[row][col]; file << std::fixed << std::setprecision(15) << data[row][col];
// 非最后一列时添加逗号 // 非最后一列时添加逗号
if (col != data[row].size() - 1) { if (col != data[row].size() - 1) {
file << ","; file << ",";
} }
} }
file << "\n"; // 换行符 file << "\n"; // 换行符
} }
file.close(); file.close();
} }
@ -21,11 +23,57 @@ void Write1DVectorToCSV(const std::vector<double>& data, const std::string& file
if (file.is_open()) { if (file.is_open()) {
file << std::fixed << std::setprecision(precision); file << std::fixed << std::setprecision(precision);
for (size_t i = 0; i < data.size(); ++i) { for (size_t i = 0; i < data.size(); ++i) {
file << data[i] << "\n"; // 每个元素单独一行 file << data[i] << "\n"; // 每个元素单独一行
} }
file.close(); file.close();
} }
} }
bool readCSVColumn(const std::string& filename, int columnIndex, std::vector<double>& data) {
std::ifstream file(filename);
if (!file.is_open()) {
std::cerr << "无法打开文件: " << filename << std::endl;
return false;
}
std::string line;
// 跳过标题行(如果有)
if (file.good()) {
std::getline(file, line);
}
data.resize(0);
// 逐行处理数据
while (std::getline(file, line)) {
std::istringstream ss(line);
std::string cell;
int currentColumn = 0;
bool columnFound = false;
// 处理当前行的每个单元格
while (std::getline(ss, cell, ',')) {
if (currentColumn == columnIndex) {
try {
// 转换为double并添加到vector
data.push_back(std::stod(cell));
}
catch (const std::invalid_argument& e) {
std::cerr << "转换错误: " << cell << " 不是有效的数字" << std::endl;
return false;
}
columnFound = true;
break;
}
currentColumn++;
}
// 如果指定列不存在,给出警告
if (!columnFound) {
std::cerr << "警告: 行 " << data.size() + 1 << " 不包含列 " << columnIndex << std::endl;
}
}
file.close();
return true;
}
int main() int main()
{ {
@ -35,19 +83,19 @@ int main()
HX_NWTM_GRID_OUTPUT2 p2; HX_NWTM_GRID_OUTPUT2 p2;
//不同井型算例 //不同井型算例
int welltype;//1为一口直井,2为一口压裂直井,3为一口多段压裂水平井,4为五口井(含直井,压裂直井,多段压裂水平井,断层),5为50口直井 int welltype;//1为一口直井,2为一口压裂直井,3为一口多段压裂水平井,4为五口井(含直井,压裂直井,多段压裂水平井,断层),5为50口直井
welltype = 1; welltype = 1;
//模型算例 //模型算例
int flowtype;//1为油单相常数pvt(一口井),2为油单相常数pvt(五口井),3为油单相常数pvt(五十口井),4为油单相变化pvt(一口井),5为水单相常数pvt(一口井),6为水单相变化pvt(一口井),7为气单相变化pvt(一口井),8为气单相拟压力(一口井),9为油水两相(一口井) int flowtype;//1为油单相常数pvt(一口井),2为油单相常数pvt(五口井),3为油单相常数pvt(五十口井),4为油单相变化pvt(一口井),5为水单相常数pvt(一口井),6为水单相变化pvt(一口井),7为气单相变化pvt(一口井),8为气单相拟压力(一口井),9为油水两相(一口井)
flowtype = 1; flowtype = 1;
//非均质性 //非均质性
int feijunzhi = 0;//0为不考虑储层非均质,1为考虑储层非均质 int feijunzhi = 0;//0为不考虑储层非均质,1为考虑储层非均质
//不同井型设置 //不同井型设置
dVec1 a(3), b(4), c(5); dVec1 a(3), b(4), c(5), d(6);
if (welltype == 1) { if (welltype == 1) {
//一口直井 //一口直井
p0.Boundary.resize(4); p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
@ -62,7 +110,7 @@ int main()
p0.Fault.resize(0); p0.Fault.resize(0);
} }
else if (welltype == 2) { else if (welltype == 2) {
//一口压裂直井 //一口压裂直井
p0.Boundary.resize(4); p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
@ -71,13 +119,13 @@ int main()
p0.VerticalWell.resize(0); p0.VerticalWell.resize(0);
p0.HorizontalWell.resize(0); p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1); p0.FractureVerticalWell.resize(1);
c[0] = -200; c[1] = 0; c[2] = 200; c[3] = 0; c[4] = 0.05; p0.FractureVerticalWell[0] = c; d[0] = -200; d[1] = 0; d[2] = 200; d[3] = 0; d[4] = 0.05; d[5] = 100.0; p0.FractureVerticalWell[0] = d;
p0.MultistageFracturedHorizontalWell.resize(0); p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0); p0.InclinedWell.resize(0);
p0.Fault.resize(0); p0.Fault.resize(0);
} }
else if (welltype == 3) { else if (welltype == 3) {
//一口多段压裂水平井 //一口多段压裂水平井
p0.Boundary.resize(4); p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
@ -87,19 +135,17 @@ int main()
p0.HorizontalWell.resize(0); p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0); p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(1); p0.MultistageFracturedHorizontalWell.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(7, dVec1(5)); p0.MultistageFracturedHorizontalWell[0].resize(5, dVec1(6));
c[0] = -600; c[1] = -200; c[2] = -600; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][0] = c; d[0] = -400; d[1] = -200; d[2] = -400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -400; c[1] = -200; c[2] = -400; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][1] = c; d[0] = -200; d[1] = -200; d[2] = -200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -200; c[1] = -200; c[2] = -200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][2] = c; d[0] = 0; d[1] = -200; d[2] =0; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][2] = d;
c[0] = 0; c[1] = -200; c[2] =0; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][3] = c; d[0] = 200; d[1] = -200; d[2] = 200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][3] = d;
c[0] = 200; c[1] = -200; c[2] = 200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][4] = c; d[0] = 400; d[1] = -200; d[2] = 400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][4] = d;
c[0] = 400; c[1] = -200; c[2] = 400; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][5] = c;
c[0] = 600; c[1] = -200; c[2] = 600; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][6] = c;
p0.InclinedWell.resize(0); p0.InclinedWell.resize(0);
p0.Fault.resize(0); p0.Fault.resize(0);
} }
else if (welltype == 4) { else if (welltype == 4) {
//五口井(含直井,压裂直井,多段压裂水平井,断层) //五口井(含直井,压裂直井,多段压裂水平井,断层)
p0.Boundary.resize(4); p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
@ -111,18 +157,18 @@ int main()
a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a; a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a;
p0.HorizontalWell.resize(0); p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1); p0.FractureVerticalWell.resize(1);
c[0] = -200; c[1] = -200; c[2] = 200; c[3] = -200; c[4] = 0.05; p0.FractureVerticalWell[0] = c; d[0] = -200; d[1] = -200; d[2] = 200; d[3] = -200; d[4] = 0.05; d[5] = 0; p0.FractureVerticalWell[0] = d;
p0.MultistageFracturedHorizontalWell.resize(1); p0.MultistageFracturedHorizontalWell.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(5)); p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(6));
c[0] = -600; c[1] = 600; c[2] = -400; c[3] = 600; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][0] = c; d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][1] = c; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][2] = c; d[0] = -600; d[1] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][2] = d;
p0.InclinedWell.resize(0); p0.InclinedWell.resize(0);
p0.Fault.resize(1); p0.Fault.resize(1);
c[0] = -500; c[1] = 1000; c[2] = 500; c[3] = 500; p0.Fault[0] = c; b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; p0.Fault[0] = b;
} }
else if (welltype == 5) { else if (welltype == 5) {
//50口直井 //50口直井
p0.Boundary.resize(4); p0.Boundary.resize(4);
b[0] = -1000.0; b[1] = -1000.0; b[2] = -1000.0; b[3] = 1000.0; p0.Boundary[0] = b; b[0] = -1000.0; b[1] = -1000.0; b[2] = -1000.0; b[3] = 1000.0; p0.Boundary[0] = b;
b[0] = -1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = 1000.0; p0.Boundary[1] = b; b[0] = -1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = 1000.0; p0.Boundary[1] = b;
@ -188,26 +234,26 @@ int main()
p0.GridControl = 150.0; p0.GridControl = 150.0;
p0.D = 2; p0.D = 2;
//网格计算 //网格计算
HX_NWTM_GRID(p1, p2, p0, "HX_license.dat"); HX_NWTM_GRID(p1, p2, p0, "HX_license.dat");
HX_NWTM_MODEL_INPUT p3(p2); HX_NWTM_MODEL_INPUT p3(p2);
HX_NWTM_MODEL_OUTPUT p4; HX_NWTM_MODEL_OUTPUT p4;
//模型设置 //模型设置
if (flowtype == 1) { if (flowtype == 1) {
//油单相常数pvt(一口井) //油单相常数pvt(一口井)
p3.T = 1; p3.T = 1;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qo.resize(1); p3.Rate.qo.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500; p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 10; p3.Rate.qo[0][1] = 0; p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 20; p3.Rate.qo[0][1] = 0;
p3.CS.C.resize(1); p3.CS.C.resize(1);
p3.CS.C[0] = 0.1; p3.CS.C[0] = 0;
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值 p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -218,7 +264,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 2) { else if (flowtype == 2) {
//油单相常数pvt(五口井) //油单相常数pvt(五口井)
p3.T = 1; p3.T = 1;
p3.Rate.t.resize(5); p3.Rate.t.resize(5);
p3.Rate.qo.resize(5); p3.Rate.qo.resize(5);
@ -241,8 +287,8 @@ int main()
p3.CS.S.resize(5); p3.CS.S.resize(5);
p3.CS.S[0] = 0.1; p3.CS.S[1] = 0.1; p3.CS.S[2] = 0.1; p3.CS.S[3] = 0.1; p3.CS.S[4] = 0.1; p3.CS.S[0] = 0.1; p3.CS.S[1] = 0.1; p3.CS.S[2] = 0.1; p3.CS.S[3] = 0.1; p3.CS.S[4] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值 p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -253,7 +299,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 3) { else if (flowtype == 3) {
//油单相常数pvt(五十口井) //油单相常数pvt(五十口井)
p3.T = 1; p3.T = 1;
dVec1 t; dVec1 t;
t.push_back(12); t.push_back(12);
@ -274,8 +320,8 @@ int main()
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.07);//所有数为一个值 p3.PVT.Bo = dVec1(200, 1.07);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值
p3.Base.Pi = 40; p3.Base.Pi = 40;
p3.Base.Cti = 0.43e-3; p3.Base.Cti = 0.43e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025);
@ -286,7 +332,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 4) { else if (flowtype == 4) {
//油单相变化pvt(一口井) //油单相变化pvt(一口井)
p3.T = 2; p3.T = 2;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qo.resize(1); p3.Rate.qo.resize(1);
@ -297,9 +343,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化 p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化
p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化 p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -310,7 +356,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 5) { else if (flowtype == 5) {
//水单相常数pvt(一口井) //水单相常数pvt(一口井)
p3.T = 3; p3.T = 3;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qw.resize(1); p3.Rate.qw.resize(1);
@ -321,8 +367,8 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bw = dVec1(200, 1.05);//所有数为一个值 p3.PVT.Bw = dVec1(200, 1.05);//所有数为一个值
p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值 p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -333,7 +379,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 6) { else if (flowtype == 6) {
//水单相变化pvt(一口井) //水单相变化pvt(一口井)
p3.T = 4; p3.T = 4;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qw.resize(1); p3.Rate.qw.resize(1);
@ -344,9 +390,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化 p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化
p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化 p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化 p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -357,7 +403,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 7) { else if (flowtype == 7) {
//气单相变化pvt(一口井) //气单相变化pvt(一口井)
p3.T = 5; p3.T = 5;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.resize(1); p3.Rate.qg.resize(1);
@ -368,9 +414,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化 p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -381,7 +427,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 8) { else if (flowtype == 8) {
//气单相拟压力(一口井) //气单相拟压力(一口井)
p3.T = 6; p3.T = 6;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.resize(1); p3.Rate.qg.resize(1);
@ -392,9 +438,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化 p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -405,35 +451,45 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 9) { else if (flowtype == 9) {
//油水两相(一口井) //油水两相(一口井)
p3.T = 8; p3.T = 8;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.resize(1); p3.Rate.qg.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500; p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
//定产油量 //定产油量
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 10; p3.Rate.qo[0][1] = 0; p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 20; p3.Rate.qo[0][1] = 0;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 0; p3.Rate.qw[0][1] = 0; p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 0; p3.Rate.qw[0][1] = 0;
////定产液量 ////定产液量
//p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 10; p3.Rate.qo[0][1] = 0; //p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 15; p3.Rate.qo[0][1] = 0;
//p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 10; p3.Rate.qw[0][1] = 0; //p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 5; p3.Rate.qw[0][1] = 0;
////定注水量 ////定注水量
//p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 0; p3.Rate.qo[0][1] = 0; //p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 0; p3.Rate.qo[0][1] = 0;
//p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -10; p3.Rate.qw[0][1] = 0; //p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -20; p3.Rate.qw[0][1] = 0;
p3.CS.C.resize(1); p3.CS.C.resize(1);
p3.CS.C[0] = 0.1; p3.CS.C[0] = 0.1;
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.1; p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); } //p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化 //p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化
p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 //p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化 //p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化
p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化 //p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
p3.PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.So[i] = (0.1 + i * 0.01); } //p3.PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.So[i] = (0.1 + i * 0.01); }
p3.PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Kro[i] = (i*0.0125); } //p3.PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Kro[i] = (i*0.0125); }
p3.PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Krw[i] = (1 - i * 0.0125); } //p3.PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Krw[i] = (1 - i * 0.0125); }
readCSVColumn("PVT_ow.csv", 5, p3.PVT.miuo);
readCSVColumn("PVT_ow.csv", 4, p3.PVT.Bo);
readCSVColumn("PVT_ow.csv", 2, p3.PVT.miuw);
readCSVColumn("PVT_ow.csv", 1, p3.PVT.Bw);
readCSVColumn("PVT_ow.csv", 0, p3.PVT.p);
readCSVColumn("Krow.csv", 0, p3.PVT.So);
readCSVColumn("Krow.csv", 2, p3.PVT.Kro);
readCSVColumn("Krow.csv", 1, p3.PVT.Krw);
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-4;
p3.Base.Swi = 0.2; p3.Base.Swi = 0.2;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1); p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
@ -443,7 +499,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
//非均质性设置 //非均质性设置
if (feijunzhi == 1) { if (feijunzhi == 1) {
dVec2 k; dVec2 k;
a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a); a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a);
@ -484,11 +540,11 @@ int main()
file.close();*/ file.close();*/
} }
//模型计算 //模型计算
HX_NWTM_MODEL(p4, p3, "HX_license.dat"); HX_NWTM_MODEL(p4, p3, "HX_license.dat");
//数据导出 //数据导出
Write1DVectorToCSV(p4.t, "t.csv"); Write1DVectorToCSV(p4.t, "t.csv");
Write2DVectorToCSV(p4.pw, "pw.csv"); Write2DVectorToCSV(p4.pw, "pw.csv");
Write2DVectorToCSV(p4.p, "C2.csv"); Write2DVectorToCSV(p4.p, "C2.csv");

@ -1 +1 @@
7d534fb716ec6521f938 7d534fb716ed6121f939

@ -4,18 +4,20 @@
#include "framework.h" #include "framework.h"
#endif //PCH_H #endif //PCH_H
#define HX_API extern "C" _declspec(dllexport) #define HX_API extern "C" _declspec(dllexport)
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include <cmath> #include <cmath>
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>
#include <ctime> #include <ctime>
#include <iomanip> #include <iomanip>
#include <unordered_set> #include <unordered_set>
#include <Windows.h> #include <Windows.h>
//const double M_PI = acos(-1.0); #ifndef M_PI
const double M_PI = acos(-1.0);
#endif
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<std::vector<double>>dVec2; //二维数组:double typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<std::vector<int>>iVec2; //二维数组:int typedef std::vector<std::vector<int>>iVec2; //二维数组:int
@ -24,542 +26,448 @@ typedef std::vector<int>iVec1; //一维数组:int
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0) template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0)
{ {
int m = p0.size(); p1.resize(m); int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
int n = p0[i].size(); p1[i].resize(n); int n = p0[i].size(); p1[i].resize(n);
for (int j = 0; j < n; ++j) for (int j = 0; j < n; ++j)
{ {
int l = p0[i][j].size(); p1[i][j].resize(l); int l = p0[i][j].size(); p1[i][j].resize(l);
for (int k = 0; k < l; ++k) for (int k = 0; k < l; ++k)
{ {
p1[i][j][k] = p0[i][j][k]; p1[i][j][k] = p0[i][j][k];
} }
} }
} }
} }
template<class T> void HX_copy(std::vector<std::vector<T>>& p1, const std::vector<std::vector<T>>& p0) template<class T> void HX_copy(std::vector<std::vector<T>>& p1, const std::vector<std::vector<T>>& p0)
{ {
int m = p0.size(); p1.resize(m); int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
int n = p0[i].size(); p1[i].resize(n); int n = p0[i].size(); p1[i].resize(n);
for (int j = 0; j < n; ++j) for (int j = 0; j < n; ++j)
{ {
p1[i][j] = p0[i][j]; p1[i][j] = p0[i][j];
} }
} }
} }
template<class T> void HX_copy(std::vector<T>& p1, const std::vector<T>& p0) template<class T> void HX_copy(std::vector<T>& p1, const std::vector<T>& p0)
{ {
int m = p0.size(); p1.resize(m); int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
p1[i] = p0[i]; p1[i] = p0[i];
} }
} }
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, T*** p0, int m, int* n, int l) template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, T*** p0, int m, int* n, int l)
{ {
p1.resize(m); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
p1[i].resize(n[i]); p1[i].resize(n[i]);
for (int j = 0; j < n[i]; ++j) for (int j = 0; j < n[i]; ++j)
{ {
p1[i][j].resize(l); p1[i][j].resize(l);
for (int k = 0; k < l; ++k) for (int k = 0; k < l; ++k)
{ {
p1[i][j][k] = p0[i][j][k]; p1[i][j][k] = p0[i][j][k];
} }
} }
} }
} }
template<class T> void HX_copy(std::vector<std::vector<T>>& p1, T** p0, int m, int n) template<class T> void HX_copy(std::vector<std::vector<T>>& p1, T** p0, int m, int n)
{ {
p1.resize(m); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
p1[i].resize(n); p1[i].resize(n);
for (int j = 0; j < n; ++j) for (int j = 0; j < n; ++j)
{ {
p1[i][j] = p0[i][j]; p1[i][j] = p0[i][j];
} }
} }
} }
template<class T> void HX_copy(std::vector<T>& p1, T* p0, int m) template<class T> void HX_copy(std::vector<T>& p1, T* p0, int m)
{ {
p1.resize(m); p1.resize(m);
for (int i = 0; i < m; ++i) for (int i = 0; i < m; ++i)
{ {
p1[i] = p0[i]; p1[i] = p0[i];
} }
} }
//点结构体 //点结构体
struct point struct point
{ {
//点结构体 //点结构体
double x; double y; //点坐标 double x; double y; //点坐标
point() { x = 0; y = 0; } point() { x = 0; y = 0; }
~point() {} ~point() {}
void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; } void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; }
void set(const point& p) { x = p.x; y = p.y; } void set(const point& p) { x = p.x; y = p.y; }
}; };
struct point3 struct point3
{ {
double x; double x;
double y; double y;
double z; double z;
point3() { x = 0; y = 0; z = 0; } point3() { x = 0; y = 0; z = 0; }
~point3() {} ~point3() {}
point3(const dVec1&p) { x = p[0]; y = p[1]; z = p[2]; } point3(const dVec1&p) { x = p[0]; y = p[1]; z = p[2]; }
point3(const double& x_ = 0, const double& y_ = 0, const double&z_ = 0) { x = x_; y = y_; z = z_;} point3(const double& x_ = 0, const double& y_ = 0, const double&z_ = 0) { x = x_; y = y_; z = z_;}
void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; } void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; }
void set(const point3&p) { x = p.x; y = p.y; z = p.z; } void set(const point3&p) { x = p.x; y = p.y; z = p.z; }
}; };
//网格结构体 //网格结构体
struct cell struct cell
{ {
//网格单元结构体 //网格单元结构体
std::vector<point> p; std::vector<point> p;
iVec2 pindex; iVec2 pindex;
iVec1 isplot; iVec1 isplot;
cell() {} cell() {}
~cell() {} ~cell() {}
}; };
//网格算法输入参数结构体 //网格算法输入参数结构体
struct HX_NWTM_GRID_INPUT struct HX_NWTM_GRID_INPUT
{ {
// 网格划分算法输入参数结构体 // 网格划分算法输入参数结构体
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据 dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据
dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据 dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据
dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据 dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据
dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 压裂直井数据 dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 压裂直井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流,大于0时为有限导流))
dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 多级压裂水平井数据 dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流,大于0时为有限导流))
dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据 dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数 double GridControl; // 网格大小控制参数
int D; // 维数 int D; // 维数
//默认初始化 //默认初始化
HX_NWTM_GRID_INPUT() HX_NWTM_GRID_INPUT()
{ {
dVec1 a(3), b(4), c(5); dVec1 a(3), b(4), c(5), d(6);
Boundary.resize(4); Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; Boundary[0] = b; b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; Boundary[1] = b; b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; Boundary[2] = b; b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; Boundary[3] = b; b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; Boundary[3] = b;
/*VerticalWell.resize(3); VerticalWell.resize(3);
a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a; a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a;
a[0] = 1000; a[1] = 1000; a[2] = 0.1; VerticalWell[1] = a; a[0] = 1000; a[1] = 1000; a[2] = 0.1; VerticalWell[1] = a;
a[0] = -1000; a[1] = -1000; a[2] = 0.1; VerticalWell[2] = a; a[0] = -1000; a[1] = -1000; a[2] = 0.1; VerticalWell[2] = a;
HorizontalWell.resize(0); HorizontalWell.resize(0);
FractureVerticalWell.resize(1); FractureVerticalWell.resize(1);
c[0] = -200; c[1] = -200; c[2] = 200; c[3] = -200; c[4] = 0.05; FractureVerticalWell[0] = c; d[0] = -200; d[1] = -200; d[2] = 200; d[3] = -200; d[4] = 0.05; d[5] = 0; FractureVerticalWell[0] = d;
MultistageFracturedHorizontalWell.resize(1); MultistageFracturedHorizontalWell.resize(1);
MultistageFracturedHorizontalWell[0].resize(3, dVec1(5)); MultistageFracturedHorizontalWell[0].resize(3, dVec1(5));
c[0] = -600; c[1] = 600; c[2] = -400; c[3] = 600; c[4] = 0.1; MultistageFracturedHorizontalWell[0][0] = c; d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; MultistageFracturedHorizontalWell[0][1] = c; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; MultistageFracturedHorizontalWell[0][2] = c; d[0] = -600; d[1] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][2] = d;
InclinedWell.resize(0); InclinedWell.resize(0);
Fault.resize(1); Fault.resize(1);
c[0] = -500; c[1] = 1000; c[2] = 500; c[3] = 500; Fault[0] = c;*/ b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; Fault[0] = b;
//单一直井
VerticalWell.resize(1); GridControl = 150.0;
a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a;
D = 2;
HorizontalWell.resize(0); }
~HX_NWTM_GRID_INPUT() {}
FractureVerticalWell.resize(0);
MultistageFracturedHorizontalWell.resize(0);
InclinedWell.resize(0);
Fault.resize(0);
//单一压裂直井
/*VerticalWell.resize(0);
HorizontalWell.resize(0);
FractureVerticalWell.resize(1);
c[0] = -200; c[1] = 0; c[2] = 200; c[3] = 0; c[4] = 0.05; FractureVerticalWell[0] = c;
MultistageFracturedHorizontalWell.resize(0);
InclinedWell.resize(0);
Fault.resize(0);*/
//单一多段压裂水平井
/*VerticalWell.resize(0);
HorizontalWell.resize(0);
FractureVerticalWell.resize(0);
MultistageFracturedHorizontalWell.resize(1);
MultistageFracturedHorizontalWell[0].resize(7, dVec1(5));
c[0] = -600; c[1] = -200; c[2] = -600; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][0] = c;
c[0] = -400; c[1] = -200; c[2] = -400; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][1] = c;
c[0] = -200; c[1] = -200; c[2] = -200; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][2] = c;
c[0] = 0; c[1] = -200; c[2] =0; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][3] = c;
c[0] = 200; c[1] = -200; c[2] = 200; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][4] = c;
c[0] = 400; c[1] = -200; c[2] = 400; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][5] = c;
c[0] = 600; c[1] = -200; c[2] = 600; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][6] = c;
InclinedWell.resize(0);
Fault.resize(0);*/
//单一直井+断层
/*VerticalWell.resize(1);
a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a;
HorizontalWell.resize(0);
FractureVerticalWell.resize(0);
MultistageFracturedHorizontalWell.resize(0);
InclinedWell.resize(0);
Fault.resize(1);
c[0] = -50; c[1] = -100; c[2] = -50; c[3] = 100; Fault[0] = c;*/
//单一压裂直井+断层
/*VerticalWell.resize(0);
HorizontalWell.resize(0);
FractureVerticalWell.resize(1);
c[0] = -200; c[1] = 0; c[2] = 200; c[3] = 0; c[4] = 0.05; FractureVerticalWell[0] = c;
MultistageFracturedHorizontalWell.resize(0);
InclinedWell.resize(0);
Fault.resize(1);
c[0] = -100; c[1] = 100; c[2] = 100; c[3] = 100; Fault[0] = c;*/
//单一多段压裂水平井+断层
/*VerticalWell.resize(0);
HorizontalWell.resize(0);
FractureVerticalWell.resize(0);
MultistageFracturedHorizontalWell.resize(1);
MultistageFracturedHorizontalWell[0].resize(7, dVec1(5));
c[0] = -600; c[1] = -200; c[2] = -600; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][0] = c;
c[0] = -400; c[1] = -200; c[2] = -400; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][1] = c;
c[0] = -200; c[1] = -200; c[2] = -200; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][2] = c;
c[0] = 0; c[1] = -200; c[2] =0; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][3] = c;
c[0] = 200; c[1] = -200; c[2] = 200; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][4] = c;
c[0] = 400; c[1] = -200; c[2] = 400; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][5] = c;
c[0] = 600; c[1] = -200; c[2] = 600; c[3] = 200; c[4] = 0.05; MultistageFracturedHorizontalWell[0][6] = c;
InclinedWell.resize(0);
Fault.resize(1);
c[0] = -300; c[1] = 300; c[2] = 300; c[3] = 300; Fault[0] = c;*/
GridControl = 150.0;
D = 2;
}
~HX_NWTM_GRID_INPUT() {}
}; };
//网格算法输出参数结构体(绘图用) //网格算法输出参数结构体(绘图用)
struct HX_NWTM_GRID_OUTPUT1 struct HX_NWTM_GRID_OUTPUT1
{ {
cell TRI_cell; //三角形网格 cell TRI_cell; //三角形网格
cell PEBI_cell; //PEBI网格 cell PEBI_cell; //PEBI网格
HX_NWTM_GRID_OUTPUT1() {} HX_NWTM_GRID_OUTPUT1() {}
~HX_NWTM_GRID_OUTPUT1() {} ~HX_NWTM_GRID_OUTPUT1() {}
}; };
//网格算法输出参数结构体(模型用) //网格算法输出参数结构体(模型用)
struct HX_NWTM_GRID_OUTPUT2 struct HX_NWTM_GRID_OUTPUT2
{ {
dVec2 Trinodexy; dVec2 Trinodexy;
dVec1 Area; dVec1 Area;
dVec2 D; dVec2 D;
struct { struct {
int n; int n;
dVec2 XiLinw; dVec2 XiLinw;
dVec2 lw; dVec2 lw;
dVec2 dw; dVec2 dw;
dVec1 rw; dVec1 rw;
iVec2 inwell; iVec2 inwell;
} ZhiJingNeiBianJie; dVec1 dwell;
struct { } ZhiJingNeiBianJie;
int n; struct {
dVec2 XiLinf; int n;
dVec2 lf; dVec2 XiLinf;
dVec2 df; dVec2 lf;
dVec1 xf; dVec2 df;
iVec2 infra; dVec1 xf;
} LieFengJingNeiBianJie; iVec2 infra;
struct { iVec1 nf;
int n; iVec1 jjf;
dVec2 XiLinh; iVec1 jjfl;
dVec2 lh; dVec1 lfcd;
dVec2 dh; iVec2 infra1;
dVec2 dsxf; dVec2 lf1;
iVec2 inhor; dVec2 df1;
iVec1 nhor; } LieFengJingNeiBianJie;
} DuoJiYaLieShuiPingJingNeiBianJie; struct {
struct { int n;
int n; dVec2 XiLinh;
dVec2 WaiBianh; dVec2 lh;
dVec2 WaiBianl; dVec2 dh;
dVec2 WaiBiand; dVec2 dsxf;
} WaiBianJie; iVec2 inhor;
struct { iVec1 nhor;
int n; dVec2 areah;
dVec2 faultb1; iVec2 inhor1;
dVec2 faultb2; iVec2 nh;
dVec2 faultl1; iVec2 jjh;
dVec2 faultd1; dVec2 hfcd;
} NeiBuDuanCeng; iVec2 jjhl;
struct { iVec2 jjh2;
iVec1 ia; iVec2 inhor2;
iVec1 ja; dVec2 lh1;
iVec2 nzeros; dVec2 dh1;
int numk; } DuoJiYaLieShuiPingJingNeiBianJie;
} YuChuLiJuZhen; struct {
HX_NWTM_GRID_OUTPUT2() {} int n;
~HX_NWTM_GRID_OUTPUT2() {} dVec2 WaiBianh;
dVec2 WaiBianl;
dVec2 WaiBiand;
} WaiBianJie;
struct {
int n;
dVec2 faultb1;
dVec2 faultb2;
dVec2 faultl1;
dVec2 faultd1;
} NeiBuDuanCeng;
struct {
iVec1 ia;
iVec1 ja;
iVec2 nzeros;
int numk;
} YuChuLiJuZhen;
HX_NWTM_GRID_OUTPUT2() {}
~HX_NWTM_GRID_OUTPUT2() {}
}; };
//KRINGING插值输入参数结构体 //KRINGING插值输入参数结构体
struct HX_KRING_INPUT struct HX_KRING_INPUT
{ {
double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和 double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和
double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度 double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度
double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性 double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性
double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , } double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , }
//高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量 //高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量
//指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量 //指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量
//球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零 //球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零
dVec2 p; //插值点 dVec2 p; //插值点
dVec2 v; // dVec2 v; //
~HX_KRING_INPUT() {} ~HX_KRING_INPUT() {}
HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0) HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0)
{ {
nugget = nugget0; sill = sill0; range = range0; model = model0; nugget = nugget0; sill = sill0; range = range0; model = model0;
p = p0; p = p0;
v = v0; v = v0;
} }
}; };
//KRINGING插值输出参数结构体 //KRINGING插值输出参数结构体
struct HX_KRING_OUTPUT struct HX_KRING_OUTPUT
{ {
dVec1 v; dVec1 v;
HX_KRING_OUTPUT() {} HX_KRING_OUTPUT() {}
~HX_KRING_OUTPUT() {} ~HX_KRING_OUTPUT() {}
}; };
//数值试井模型求解器输入参数结构体 //数值试井模型求解器输入参数结构体
struct HX_NWTM_MODEL_INPUT struct HX_NWTM_MODEL_INPUT
{ {
int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相 int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相
HX_NWTM_GRID_OUTPUT2 GRID; HX_NWTM_GRID_OUTPUT2 GRID;
struct Rate //流量数据 struct Rate //流量数据
{ {
dVec2 t; //时间, h [一口井一组数] dVec2 t; //时间, h [一口井一组数]
dVec2 qo; //油流量,m^3/d [一口井一组数] dVec2 qo; //油流量,m^3/d [一口井一组数]
dVec2 qg; //气流量,m^3/d [一口井一组数] dVec2 qg; //气流量,m^3/d [一口井一组数]
dVec2 qw; //水流量,m^3/d [一口井一组数] dVec2 qw; //水流量,m^3/d [一口井一组数]
}Rate; }Rate;
struct Pressure //压力数据 struct Pressure //压力数据
{ {
dVec2 t; //时间, h [一口井一组数] dVec2 t; //时间, h [一口井一组数]
dVec2 p; //压力, MPa [一口井一组数] dVec2 p; //压力, MPa [一口井一组数]
}Pressure; }Pressure;
struct CS //井储表皮数据 struct CS //井储表皮数据
{ {
dVec1 C; //井储, m^3/MPa [一口井一个数] dVec1 C; //井储, m^3/MPa [一口井一个数]
dVec1 S; //表皮, [一口井一个数] dVec1 S; //表皮, [一口井一个数]
}CS; }CS;
struct PVT //流体性质数据 struct PVT //流体性质数据
{ {
dVec1 p; //压力, MPa dVec1 p; //压力, MPa
double pb; //饱和压力, MPa double pb; //饱和压力, MPa
dVec1 Rso; //溶解气油比, m^3/m^3 dVec1 Rso; //溶解气油比, m^3/m^3
dVec1 Bo; //油体积系数, m^3/m^3 dVec1 Bo; //油体积系数, m^3/m^3
dVec1 Co; //油压缩系数, 1/MPa dVec1 Co; //油压缩系数, 1/MPa
dVec1 miuo; //油粘度, mPa·s dVec1 miuo; //油粘度, mPa·s
dVec1 rouo; //油密度, kg/m^3 dVec1 rouo; //油密度, kg/m^3
dVec1 Rv; //凝析油气比, m^3/m^3 dVec1 Rv; //凝析油气比, m^3/m^3
dVec1 Bg; //气体积系数, m^3/m^3 dVec1 Bg; //气体积系数, m^3/m^3
dVec1 Cg; //气压缩系数, 1/MPa dVec1 Cg; //气压缩系数, 1/MPa
dVec1 miug; //气粘度, mPa·s dVec1 miug; //气粘度, mPa·s
dVec1 roug; //气密度, kg/m^3 dVec1 roug; //气密度, kg/m^3
dVec1 Z; //气偏差因子, 1 dVec1 Z; //气偏差因子, 1
dVec1 Rsw; //溶解气水比, m^3/m^3 dVec1 Rsw; //溶解气水比, m^3/m^3
dVec1 Bw; //水体积系数, m^3/m^3 dVec1 Bw; //水体积系数, m^3/m^3
dVec1 Cw; //水压缩系数, 1/MPa dVec1 Cw; //水压缩系数, 1/MPa
dVec1 miuw; //水粘度, mPa·s dVec1 miuw; //水粘度, mPa·s
dVec1 rouw; //水密度, kg/m^3 dVec1 rouw; //水密度, kg/m^3
dVec1 V; //吸附气量, m^3/kg dVec1 V; //吸附气量, m^3/kg
dVec1 k_kinitial; //渗透率比, 1 dVec1 k_kinitial; //渗透率比, 1
dVec1 Cf_Cfinitial; //岩石压缩系数比, 1 dVec1 Cf_Cfinitial; //岩石压缩系数比, 1
dVec1 So; //油饱和度 dVec1 So; //油饱和度
dVec1 Kro; //油相对渗透率 dVec1 Kro; //油相对渗透率
dVec1 Sg; //气饱和度 dVec1 Sg; //气饱和度
dVec1 Krg; //气相对渗透率 dVec1 Krg; //气相对渗透率
dVec1 Sw; //水饱和度 dVec1 Sw; //水饱和度
dVec1 Krw; //水相对渗透率 dVec1 Krw; //水相对渗透率
}PVT; }PVT;
struct Base //基础数据 struct Base //基础数据
{ {
double Pi; //初始压力, MPa double Pi; //初始压力, MPa
double Cti; //综合压缩系数, 1/MPa double Cti; //综合压缩系数, 1/MPa
double Cf; //岩石压缩系数, 1/MPa double Cf; //岩石压缩系数, 1/MPa
double Soi; //初始含油饱和度 double Soi; //初始含油饱和度
double Sgi; //初始含气饱和度 double Sgi; //初始含气饱和度
double Swi; //初始含水饱和度 double Swi; //初始含水饱和度
dVec1 k; //渗透率, D [一个网格单元一个值] dVec1 k; //渗透率, D [一个网格单元一个值]
dVec1 phi; //孔隙度, 1 [一个网格单元一个值] dVec1 phi; //孔隙度, 1 [一个网格单元一个值]
dVec1 h; //储层厚度, m [一个网格单元一个值] dVec1 h; //储层厚度, m [一个网格单元一个值]
double d; //时间增长指数 double d; //时间增长指数
double dt_Min; //最小时间间隔, h double dt_Min; //最小时间间隔, h
double dt_Max; //最大时间间隔, h double dt_Max; //最大时间间隔, h
}Base; }Base;
//初始化 //初始化
HX_NWTM_MODEL_INPUT() {} HX_NWTM_MODEL_INPUT() {}
~HX_NWTM_MODEL_INPUT() {} ~HX_NWTM_MODEL_INPUT() {}
HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0)
{ {
T =1; T =1;
GRID = p0; GRID = p0;
/*Rate.t.resize(5); Rate.t.resize(5);
Rate.qo.resize(5); Rate.qo.resize(5);
Rate.qw.resize(5); Rate.qw.resize(5);
Rate.qg.resize(5); Rate.qg.resize(5);
Rate.t[0].resize(2); Rate.t[0][0] = 2000; Rate.t[0][1] = 500; Rate.t[0].resize(2); Rate.t[0][0] = 2000; Rate.t[0][1] = 500;
Rate.qo[0].resize(2); Rate.qo[0][0] = 10; Rate.qo[0][1] = 0; Rate.qo[0].resize(2); Rate.qo[0][0] = 10; Rate.qo[0][1] = 0;
Rate.qw[0].resize(2); Rate.qw[0][0] = 2; Rate.qw[0][1] = 0; Rate.qw[0].resize(2); Rate.qw[0][0] = 2; Rate.qw[0][1] = 0;
Rate.qg[0].resize(2); Rate.qg[0][0] = 20000; Rate.qg[0][1] = 0; Rate.qg[0].resize(2); Rate.qg[0][0] = 20000; Rate.qg[0][1] = 0;
Rate.t[1].resize(0); Rate.t[1].resize(0);
Rate.qo[1].resize(0); Rate.qo[1].resize(0);
Rate.qw[1].resize(0); Rate.qw[1].resize(0);
Rate.qg[1].resize(0); Rate.qg[1].resize(0);
Rate.t[2].resize(3); Rate.t[2][0] = 1000; Rate.t[2][1] = 1000; Rate.t[2][2] = 500; Rate.t[2].resize(3); Rate.t[2][0] = 1000; Rate.t[2][1] = 1000; Rate.t[2][2] = 500;
Rate.qo[2].resize(3); Rate.qo[2][0] = 30; Rate.qo[2][1] = 40; Rate.qo[2][2] = 20; Rate.qo[2].resize(3); Rate.qo[2][0] = 30; Rate.qo[2][1] = 40; Rate.qo[2][2] = 20;
Rate.qw[2].resize(3); Rate.qw[2][0] = 3; Rate.qw[2][1] = 4; Rate.qw[2][2] = 2; Rate.qw[2].resize(3); Rate.qw[2][0] = 3; Rate.qw[2][1] = 4; Rate.qw[2][2] = 2;
Rate.qg[2].resize(3); Rate.qg[2][0] = 30000; Rate.qg[2][1] = 40000; Rate.qg[2][2] = 20000; Rate.qg[2].resize(3); Rate.qg[2][0] = 30000; Rate.qg[2][1] = 40000; Rate.qg[2][2] = 20000;
Rate.t[3].resize(2); Rate.t[3][0] = 1500; Rate.t[3][1] = 1000; Rate.t[3].resize(2); Rate.t[3][0] = 1500; Rate.t[3][1] = 1000;
Rate.qo[3].resize(2); Rate.qo[3][0] = 30; Rate.qo[3][1] = 20; Rate.qo[3].resize(2); Rate.qo[3][0] = 30; Rate.qo[3][1] = 20;
Rate.qw[3].resize(2); Rate.qw[3][0] = 5; Rate.qw[3][1] = 2; Rate.qw[3].resize(2); Rate.qw[3][0] = 5; Rate.qw[3][1] = 2;
Rate.qg[3].resize(2); Rate.qg[3][0] = 50000; Rate.qg[3][1] = 20000; Rate.qg[3].resize(2); Rate.qg[3][0] = 50000; Rate.qg[3][1] = 20000;
Rate.t[4].resize(2); Rate.t[4][0] = 1000; Rate.t[4][1] = 1500; Rate.t[4].resize(2); Rate.t[4][0] = 1000; Rate.t[4][1] = 1500;
Rate.qo[4].resize(2); Rate.qo[4][0] = -50; Rate.qo[4][1] = -60; Rate.qo[4].resize(2); Rate.qo[4][0] = -50; Rate.qo[4][1] = -60;
Rate.qw[4].resize(2); Rate.qw[4][0] = -2; Rate.qw[4][1] = -5; Rate.qw[4].resize(2); Rate.qw[4][0] = -2; Rate.qw[4][1] = -5;
Rate.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000; Rate.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000;
Pressure.t.resize(0); Pressure.t.resize(0);
Pressure.p.resize(0); Pressure.p.resize(0);
CS.C.resize(5); CS.C.resize(5);
CS.C[0] = 0.1; CS.C[1] = 0.1; CS.C[2] = 0.1; CS.C[3] = 0.1; CS.C[4] = 0.1; CS.C[0] = 0.1; CS.C[1] = 0.1; CS.C[2] = 0.1; CS.C[3] = 0.1; CS.C[4] = 0.1;
CS.S.resize(5); CS.S.resize(5);
CS.S[0] = 0.1; CS.S[1] = 0.1; CS.S[2] = 0.1; CS.S[3] = 0.1; CS.S[4] = 0.1;*/ CS.S[0] = 0.1; CS.S[1] = 0.1; CS.S[2] = 0.1; CS.S[3] = 0.1; CS.S[4] = 0.1;
Rate.t.resize(1); PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); }
Rate.qo.resize(1); PVT.pb = 40.0;
Rate.qw.resize(1); PVT.Rso = dVec1(200, 0);
Rate.qg.resize(1); PVT.Bo = dVec1(200, 1.2);
PVT.Co = dVec1(200, 5e-4);
Rate.t[0].resize(2); Rate.t[0][0] = 2000; Rate.t[0][1] = 500; PVT.miuo = dVec1(200, 0.5);
Rate.qo[0].resize(2); Rate.qo[0][0] =10; Rate.qo[0][1] = 0; PVT.rouo = dVec1(200, 800);
Rate.qw[0].resize(2); Rate.qw[0][0] =-10; Rate.qw[0][1] = 0; PVT.Rv = dVec1(200, 0);
Rate.qg[0].resize(2); Rate.qg[0][0] = 50000; Rate.qg[0][1] = 0; PVT.Bg = dVec1(200, 5e-3);
Pressure.t.resize(0); PVT.Cg = dVec1(200, 2e-2);
Pressure.p.resize(0); PVT.miug = dVec1(200, 2e-2);
PVT.roug = dVec1(200, 200);
CS.C.resize(1); PVT.Z = dVec1(200, 1);
CS.C[0] = 0.1; PVT.Rsw = dVec1(200, 0);
CS.S.resize(1); PVT.Bw = dVec1(200, 1.05);
CS.S[0] = 0.1; PVT.Cw = dVec1(200, 1e-4);
PVT.miuw = dVec1(200, 0.8);
PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); } PVT.rouw = dVec1(200, 1000);
PVT.pb = 40.0; PVT.V = dVec1(200, 0);
PVT.Rso = dVec1(200, 0);
PVT.Bo = dVec1(200, 1.2); PVT.k_kinitial = dVec1(200, 1);
PVT.Co = dVec1(200, 5e-4); PVT.Cf_Cfinitial = dVec1(200, 1);
PVT.miuo = dVec1(200, 0.5);
PVT.rouo = dVec1(200, 800); PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); }
PVT.Rv = dVec1(200, 0); PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); }
PVT.Bg = dVec1(200, 5e-3); PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); }
PVT.Cg = dVec1(200, 2e-2); PVT.Sg = dVec1(100, 0);
PVT.miug = dVec1(200, 2e-2); PVT.Krg = dVec1(100, 0);
PVT.roug = dVec1(200, 200); PVT.Sw = dVec1(100, 0);
PVT.Z = dVec1(200, 1);
PVT.Rsw = dVec1(200, 0);
PVT.Bw = dVec1(200, 1.05);
PVT.Cw = dVec1(200, 1e-4); Base.Pi = 40.0;
PVT.miuw = dVec1(200, 0.8); Base.Cti = 1e-3;
PVT.rouw = dVec1(200, 1000); Base.Cf = 1e-4;
PVT.V = dVec1(200, 0); Base.Soi = 0.8;
Base.Sgi = 0.0;
PVT.k_kinitial = dVec1(200, 1); Base.Swi = 0.2;
PVT.Cf_Cfinitial = dVec1(200, 1); Base.k = dVec1(p0.Trinodexy.size(), 0.001);
Base.phi = dVec1(p0.Trinodexy.size(), 0.1);
PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); } Base.h = dVec1(p0.Trinodexy.size(), 10);
PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); } Base.d = 1.05;
PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); } Base.dt_Min = 0.0025;
PVT.Sg = dVec1(100, 0); Base.dt_Max = 12.5;
PVT.Krg = dVec1(100, 0); }
PVT.Sw = dVec1(100, 0);
Base.Pi = 40.0;
Base.Cti = 1e-3;
Base.Cf = 1e-4;
Base.Soi = 0.8;
Base.Sgi = 0.0;
Base.Swi = 0.2;
Base.k = dVec1(p0.Trinodexy.size(), 0.001);
Base.phi = dVec1(p0.Trinodexy.size(), 0.1);
Base.h = dVec1(p0.Trinodexy.size(), 10);
Base.d = 1.05;
Base.dt_Min = 0.0025;
Base.dt_Max = 12.5;
}
}; };
//数值试井模型求解器输出参数结构体 //数值试井模型求解器输出参数结构体
struct HX_NWTM_MODEL_OUTPUT struct HX_NWTM_MODEL_OUTPUT
{ {
dVec1 t; //时间, h dVec1 t; //时间, h
dVec2 pw; //井底压力, MPa [一口井一组数] dVec2 pw; //井底压力, MPa [一口井一组数]
dVec2 p; //压力分布, MPa [一个时间一组数] dVec2 p; //压力分布, MPa [一个时间一组数]
dVec2 So; //油饱和度分布 [一个时间一组数] dVec2 So; //油饱和度分布 [一个时间一组数]
dVec2 Sg; //气饱和度分布 [一个时间一组数] dVec2 Sg; //气饱和度分布 [一个时间一组数]
dVec2 Sw; //水饱和度分布 [一个时间一组数] dVec2 Sw; //水饱和度分布 [一个时间一组数]
dVec2 k; //渗透率分布,mD [一个时间一组数] dVec2 k; //渗透率分布,mD [一个时间一组数]
HX_NWTM_MODEL_OUTPUT() {} HX_NWTM_MODEL_OUTPUT() {}
~HX_NWTM_MODEL_OUTPUT() {} ~HX_NWTM_MODEL_OUTPUT() {}
}; };
HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口 HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口

Loading…
Cancel
Save