From aa28668d9a3235a04a802113ce9bf04da04fbc4f Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Mon, 13 Jul 2026 17:18:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B1=82=E8=A7=A3=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rd/Pebi/include/pch.h | 241 ++++---- 3rd/Pebi/src/main.cpp | 228 +++++--- Bin/Res/license/HXNWTM_license.dat | 2 +- ML/Training/include/pch.h | 856 +++++++++++++---------------- 4 files changed, 655 insertions(+), 672 deletions(-) diff --git a/3rd/Pebi/include/pch.h b/3rd/Pebi/include/pch.h index 09dee7b..06fdabf 100644 --- a/3rd/Pebi/include/pch.h +++ b/3rd/Pebi/include/pch.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #ifndef PCH_H #define PCH_H #include "framework.h" @@ -15,12 +15,14 @@ #include #include -//const double M_PI = acos(-1.0); -typedef std::vector>>dVec3; //三维数组:double -typedef std::vector>dVec2; //二维数组:double -typedef std::vector>iVec2; //二维数组:int -typedef std::vectordVec1; //一维数组:double -typedef std::vectoriVec1; //一维数组:int +#ifndef M_PI +const double M_PI = acos(-1.0); +#endif +typedef std::vector>>dVec3; //ά:double +typedef std::vector>dVec2; //ά:double +typedef std::vector>iVec2; //ά:int +typedef std::vectordVec1; //һά:double +typedef std::vectoriVec1; //һά:int template void HX_copy(std::vector>>& p1, const std::vector>>& p0) { @@ -95,11 +97,11 @@ template void HX_copy(std::vector& p1, T* p0, int m) } } -//点结构体 +//ṹ struct point { - //点结构体 - double x; double y; //点坐标 + //ṹ + double x; double y; // point() { x = 0; y = 0; } ~point() {} 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 point3&p) { x = p.x; y = p.y; z = p.z; } }; -//网格结构体 +//ṹ struct cell { - //网格单元结构体 + //Ԫṹ std::vector p; iVec2 pindex; iVec1 isplot; @@ -129,24 +131,24 @@ struct cell }; -//网格算法输入参数结构体 +//㷨ṹ struct HX_NWTM_GRID_INPUT { - // 网格划分算法输入参数结构体 - 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 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} 压裂直井数据 - dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 多级压裂水平井数据 - dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据 - dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 - double GridControl; // 网格大小控制参数 - int D; // 维数 - - //默认初始化 + // 񻮷㷨ṹ + 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 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, 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, FC} ༶ѹˮƽ(wfѷ,m,FC,ѷ쵼,mD.m(FCΪ0ʱΪ޵0ʱΪ޵)) + dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} б + dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} ϲ + double GridControl; // СƲ + int D; // ά + + //Ĭϳʼ HX_NWTM_GRID_INPUT() { - dVec1 a(3), b(4), c(5); + dVec1 a(3), b(4), c(5), d(6); 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[1] = b; @@ -161,18 +163,18 @@ struct HX_NWTM_GRID_INPUT HorizontalWell.resize(0); 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[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; - c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; MultistageFracturedHorizontalWell[0][1] = c; - 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] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d; + d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d; + 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); 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; @@ -181,17 +183,17 @@ struct HX_NWTM_GRID_INPUT ~HX_NWTM_GRID_INPUT() {} }; -//网格算法输出参数结构体(绘图用) +//㷨ṹ(ͼ) struct HX_NWTM_GRID_OUTPUT1 { - cell TRI_cell; //三角形网格 - cell PEBI_cell; //PEBI网格 + cell TRI_cell; // + cell PEBI_cell; //PEBI HX_NWTM_GRID_OUTPUT1() {} ~HX_NWTM_GRID_OUTPUT1() {} }; -//网格算法输出参数结构体(模型用) +//㷨ṹ(ģ) struct HX_NWTM_GRID_OUTPUT2 { dVec2 Trinodexy; @@ -213,6 +215,13 @@ struct HX_NWTM_GRID_OUTPUT2 dVec2 df; dVec1 xf; iVec2 infra; + iVec1 nf; + iVec1 jjf; + iVec1 jjfl; + dVec1 lfcd; + iVec2 infra1; + dVec2 lf1; + dVec2 df1; } LieFengJingNeiBianJie; struct { int n; @@ -222,6 +231,16 @@ struct HX_NWTM_GRID_OUTPUT2 dVec2 dsxf; iVec2 inhor; iVec1 nhor; + dVec2 areah; + iVec2 inhor1; + iVec2 nh; + iVec2 jjh; + dVec2 hfcd; + iVec2 jjhl; + iVec2 jjh2; + iVec2 inhor2; + dVec2 lh1; + dVec2 dh1; } DuoJiYaLieShuiPingJingNeiBianJie; struct { int n; @@ -247,17 +266,17 @@ struct HX_NWTM_GRID_OUTPUT2 }; -//KRINGING插值输入参数结构体 +//KRINGINGֵṹ struct HX_KRING_INPUT { - double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和 - double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度 - double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性 - double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , } - //高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量 - //指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量 - //球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零 - dVec2 p; //插值点 + double nugget; //ֵ:ʾռ봦ı̶ȣСڲ߶ȵ֮ + double sill; //ֵ̨:ʾӶȶļֵӳ򻯱̶ܱ + double range; //:ʾռԵЧ롣볬 range ʱ֮䲻پпռ + double model; //ģ:ָѧʽռı仯{, , } + //˹ģSPHERICAL(0)ӳָ˥Խǿı + //ָģEXPONENTIAL(1)Կ˥ھֲԽϴı + //״ģGAUSSIAN(2)ڱڳ߱仯̺Ϊ + dVec2 p; //ֵ dVec2 v; // ~HX_KRING_INPUT() {} 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 { dVec1 v; @@ -276,75 +295,75 @@ struct HX_KRING_OUTPUT ~HX_KRING_OUTPUT() {} }; -//数值试井模型求解器输入参数结构体 +//ֵԾģṹ 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; - struct Rate //流量数据 + struct Rate // { - dVec2 t; //时间, h [一口井一组数] - dVec2 qo; //油流量,m^3/d [一口井一组数] - dVec2 qg; //气流量,m^3/d [一口井一组数] - dVec2 qw; //水流量,m^3/d [一口井一组数] + dVec2 t; //ʱ, h [һھһ] + dVec2 qo; //,m^3/d [һھһ] + dVec2 qg; //,m^3/d [һھһ] + dVec2 qw; //ˮ,m^3/d [һھһ] }Rate; - struct Pressure //压力数据 + struct Pressure //ѹ { - dVec2 t; //时间, h [一口井一组数] - dVec2 p; //压力, MPa [一口井一组数] + dVec2 t; //ʱ, h [һھһ] + dVec2 p; //ѹ, MPa [һھһ] }Pressure; - struct CS //井储表皮数据 + struct CS //Ƥ { - dVec1 C; //井储, m^3/MPa [一口井一个数] - dVec1 S; //表皮, [一口井一个数] + dVec1 C; //, m^3/MPa [һھһ] + dVec1 S; //Ƥ, [һھһ] }CS; - struct PVT //流体性质数据 + struct PVT // { - dVec1 p; //压力, MPa - double pb; //饱和压力, MPa - dVec1 Rso; //溶解气油比, m^3/m^3 - dVec1 Bo; //油体积系数, m^3/m^3 - dVec1 Co; //油压缩系数, 1/MPa - dVec1 miuo; //油粘度, mPa·s - dVec1 rouo; //油密度, kg/m^3 - dVec1 Rv; //凝析油气比, m^3/m^3 - dVec1 Bg; //气体积系数, m^3/m^3 - dVec1 Cg; //气压缩系数, 1/MPa - dVec1 miug; //气粘度, mPa·s - dVec1 roug; //气密度, kg/m^3 - dVec1 Z; //气偏差因子, 1 - dVec1 Rsw; //溶解气水比, m^3/m^3 - dVec1 Bw; //水体积系数, m^3/m^3 - dVec1 Cw; //水压缩系数, 1/MPa - dVec1 miuw; //水粘度, mPa·s - dVec1 rouw; //水密度, kg/m^3 - dVec1 V; //吸附气量, m^3/kg - dVec1 k_kinitial; //渗透率比, 1 - dVec1 Cf_Cfinitial; //岩石压缩系数比, 1 - dVec1 So; //油饱和度 - dVec1 Kro; //油相对渗透率 - dVec1 Sg; //气饱和度 - dVec1 Krg; //气相对渗透率 - dVec1 Sw; //水饱和度 - dVec1 Krw; //水相对渗透率 + dVec1 p; //ѹ, MPa + double pb; //ѹ, MPa + dVec1 Rso; //ܽͱ, m^3/m^3 + dVec1 Bo; //ϵ, m^3/m^3 + dVec1 Co; //ѹϵ, 1/MPa + dVec1 miuo; //ճ, mPas + dVec1 rouo; //ܶ, kg/m^3 + dVec1 Rv; //, m^3/m^3 + dVec1 Bg; //ϵ, m^3/m^3 + dVec1 Cg; //ѹϵ, 1/MPa + dVec1 miug; //ճ, mPas + dVec1 roug; //ܶ, kg/m^3 + dVec1 Z; //ƫ, 1 + dVec1 Rsw; //ܽˮ, m^3/m^3 + dVec1 Bw; //ˮϵ, m^3/m^3 + dVec1 Cw; //ˮѹϵ, 1/MPa + dVec1 miuw; //ˮճ, mPas + dVec1 rouw; //ˮܶ, kg/m^3 + dVec1 V; //, m^3/kg + dVec1 k_kinitial; //͸ʱ, 1 + dVec1 Cf_Cfinitial; //ʯѹϵ, 1 + dVec1 So; //ͱͶ + dVec1 Kro; //͸ + dVec1 Sg; //Ͷ + dVec1 Krg; //͸ + dVec1 Sw; //ˮͶ + dVec1 Krw; //ˮ͸ }PVT; - struct Base //基础数据 + struct Base // { - double Pi; //初始压力, MPa - double Cti; //综合压缩系数, 1/MPa - double Cf; //岩石压缩系数, 1/MPa - double Soi; //初始含油饱和度 - double Sgi; //初始含气饱和度 - double Swi; //初始含水饱和度 - dVec1 k; //渗透率, D [一个网格单元一个值] - dVec1 phi; //孔隙度, 1 [一个网格单元一个值] - dVec1 h; //储层厚度, m [一个网格单元一个值] - double d; //时间增长指数 - double dt_Min; //最小时间间隔, h - double dt_Max; //最大时间间隔, h + double Pi; //ʼѹ, MPa + double Cti; //ۺѹϵ, 1/MPa + double Cf; //ʯѹϵ, 1/MPa + double Soi; //ʼͱͶ + double Sgi; //ʼͶ + double Swi; //ʼˮͶ + dVec1 k; //͸, D [һԪһֵ] + dVec1 phi; //϶, 1 [һԪһֵ] + dVec1 h; //, m [һԪһֵ] + double d; //ʱָ + double dt_Min; //Сʱ, h + double dt_Max; //ʱ, h }Base; - //初始化 + //ʼ HX_NWTM_MODEL_INPUT() {} ~HX_NWTM_MODEL_INPUT() {} HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) @@ -437,23 +456,23 @@ struct HX_NWTM_MODEL_INPUT } }; -//数值试井模型求解器输出参数结构体 +//ֵԾģṹ struct HX_NWTM_MODEL_OUTPUT { - dVec1 t; //时间, h - dVec2 pw; //井底压力, MPa [一口井一组数] - dVec2 p; //压力分布, MPa [一个时间一组数] - dVec2 So; //油饱和度分布 [一个时间一组数] - dVec2 Sg; //气饱和度分布 [一个时间一组数] - dVec2 Sw; //水饱和度分布 [一个时间一组数] - dVec2 k; //渗透率分布,mD [一个时间一组数] + dVec1 t; //ʱ, h + dVec2 pw; //ѹ, MPa [һھһ] + dVec2 p; //ѹֲ, MPa [һʱһ] + dVec2 So; //ͱͶȷֲ [һʱһ] + dVec2 Sg; //Ͷȷֲ [һʱһ] + dVec2 Sw; //ˮͶȷֲ [һʱһ] + dVec2 k; //͸ʷֲ,mD [һʱһ] 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_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_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_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //ֵԾģӿ diff --git a/3rd/Pebi/src/main.cpp b/3rd/Pebi/src/main.cpp index 2a83143..6fcecc5 100644 --- a/3rd/Pebi/src/main.cpp +++ b/3rd/Pebi/src/main.cpp @@ -1,17 +1,19 @@ #include"pch.h" +#include +#include void Write2DVectorToCSV(const std::vector>& 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()) { for (size_t row = 0; row < data.size(); ++row) { for (size_t col = 0; col < data[row].size(); ++col) { - // 设置固定小数格式和精度 + // ù̶Сʽ; file << std::fixed << std::setprecision(15) << data[row][col]; - // 非最后一列时添加逗号 + // һʱӶ if (col != data[row].size() - 1) { file << ","; } } - file << "\n"; // 换行符 + file << "\n"; // з } file.close(); } @@ -21,11 +23,57 @@ void Write1DVectorToCSV(const std::vector& data, const std::string& file if (file.is_open()) { file << std::fixed << std::setprecision(precision); for (size_t i = 0; i < data.size(); ++i) { - file << data[i] << "\n"; // 每个元素单独一行 + file << data[i] << "\n"; // ÿԪصһ } file.close(); } } +bool readCSVColumn(const std::string& filename, int columnIndex, std::vector& 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() { @@ -35,19 +83,19 @@ int main() HX_NWTM_GRID_OUTPUT2 p2; - //不同井型算例 - int welltype;//1为一口直井,2为一口压裂直井,3为一口多段压裂水平井,4为五口井(含直井,压裂直井,多段压裂水平井,断层),5为50口直井 + //ͬ + int welltype;//1Ϊһֱ2Ϊһѹֱ3Ϊһڶѹˮƽ4Ϊھ(ֱѹֱѹˮƽϲ)5Ϊ50ֱ 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; - //非均质性 - 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) { - //一口直井 + //һֱ 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[1] = b; @@ -62,7 +110,7 @@ int main() p0.Fault.resize(0); } else if (welltype == 2) { - //一口压裂直井 + //һѹֱ 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[1] = b; @@ -71,13 +119,13 @@ int main() p0.VerticalWell.resize(0); p0.HorizontalWell.resize(0); 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.InclinedWell.resize(0); p0.Fault.resize(0); } else if (welltype == 3) { - //一口多段压裂水平井 + //һڶѹˮƽ 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[1] = b; @@ -87,19 +135,17 @@ int main() p0.HorizontalWell.resize(0); p0.FractureVerticalWell.resize(0); p0.MultistageFracturedHorizontalWell.resize(1); - p0.MultistageFracturedHorizontalWell[0].resize(7, dVec1(5)); - c[0] = -600; c[1] = -200; c[2] = -600; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][0] = c; - c[0] = -400; c[1] = -200; c[2] = -400; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][1] = c; - c[0] = -200; c[1] = -200; c[2] = -200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][2] = c; - c[0] = 0; c[1] = -200; c[2] =0; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][3] = c; - c[0] = 200; c[1] = -200; c[2] = 200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][4] = c; - 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.MultistageFracturedHorizontalWell[0].resize(5, dVec1(6)); + d[0] = -400; d[1] = -200; d[2] = -400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][0] = d; + d[0] = -200; d[1] = -200; d[2] = -200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][1] = d; + d[0] = 0; d[1] = -200; d[2] =0; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][2] = d; + d[0] = 200; d[1] = -200; d[2] = 200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][3] = d; + d[0] = 400; d[1] = -200; d[2] = 400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][4] = d; p0.InclinedWell.resize(0); p0.Fault.resize(0); } else if (welltype == 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[1] = b; @@ -111,18 +157,18 @@ int main() a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a; p0.HorizontalWell.resize(0); 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[0].resize(3, dVec1(5)); - c[0] = -600; c[1] = 600; c[2] = -400; c[3] = 600; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][0] = c; - c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][1] = c; - c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][2] = c; + p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(6)); + d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][0] = d; + d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][1] = d; + 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.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) { - //50口直井 + //50ֱ 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[1] = b; @@ -188,26 +234,26 @@ int main() p0.GridControl = 150.0; p0.D = 2; - //网格计算 + // HX_NWTM_GRID(p1, p2, p0, "HX_license.dat"); HX_NWTM_MODEL_INPUT p3(p2); HX_NWTM_MODEL_OUTPUT p4; - //模型设置 + //ģ if (flowtype == 1) { - //油单相常数pvt(一口井) + //͵ೣpvtһھ p3.T = 1; p3.Rate.t.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.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[0] = 0.1; + p3.CS.C[0] = 0; 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.Bo = dVec1(200, 1.2);//所有数为一个值 - p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值 + p3.PVT.Bo = dVec1(200, 1.2);//Ϊһֵ + p3.PVT.miuo = dVec1(200, 0.5);//Ϊһֵ p3.Base.Pi = 40.0; p3.Base.Cti = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -218,7 +264,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 2) { - //油单相常数pvt(五口井) + //͵ೣpvtھ p3.T = 1; p3.Rate.t.resize(5); p3.Rate.qo.resize(5); @@ -241,8 +287,8 @@ int main() 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.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.miuo = dVec1(200, 0.5);//所有数为一个值 + p3.PVT.Bo = dVec1(200, 1.2);//Ϊһֵ + p3.PVT.miuo = dVec1(200, 0.5);//Ϊһֵ p3.Base.Pi = 40.0; p3.Base.Cti = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -253,7 +299,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 3) { - //油单相常数pvt(五十口井) + //͵ೣpvtʮھ p3.T = 1; dVec1 t; 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.Bo = dVec1(200, 1.07);//所有数为一个值 - p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值 + p3.PVT.Bo = dVec1(200, 1.07);//Ϊһֵ + p3.PVT.miuo = dVec1(200, 0.79);//Ϊһֵ p3.Base.Pi = 40; p3.Base.Cti = 0.43e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025); @@ -286,7 +332,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 4) { - //油单相变化pvt(一口井) + //͵仯pvtһھ p3.T = 2; p3.Rate.t.resize(1); p3.Rate.qo.resize(1); @@ -297,9 +343,9 @@ int main() p3.CS.S.resize(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.Bo = dVec1(200, 1.2);//数值随压力变化 - p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 - p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化 + p3.PVT.Bo = dVec1(200, 1.2);//ֵѹ仯 + p3.PVT.miuo = dVec1(200, 0.5);//ֵѹ仯 + p3.PVT.Co = dVec1(200, 0.001);//ֵѹ仯 p3.Base.Pi = 40.0; p3.Base.Cf = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -310,7 +356,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 5) { - //水单相常数pvt(一口井) + //ˮೣpvtһھ p3.T = 3; p3.Rate.t.resize(1); p3.Rate.qw.resize(1); @@ -321,8 +367,8 @@ int main() p3.CS.S.resize(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.Bw = dVec1(200, 1.05);//所有数为一个值 - p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值 + p3.PVT.Bw = dVec1(200, 1.05);//Ϊһֵ + p3.PVT.miuw = dVec1(200, 0.8);//Ϊһֵ p3.Base.Pi = 40.0; p3.Base.Cti = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -333,7 +379,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 6) { - //水单相变化pvt(一口井) + //ˮ仯pvtһھ p3.T = 4; p3.Rate.t.resize(1); p3.Rate.qw.resize(1); @@ -344,9 +390,9 @@ int main() p3.CS.S.resize(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.Bw = dVec1(200, 1.05);//数值随压力变化 - p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化 - p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化 + p3.PVT.Bw = dVec1(200, 1.05);//ֵѹ仯 + p3.PVT.miuw = dVec1(200, 0.8);//ֵѹ仯 + p3.PVT.Cw = dVec1(200, 0.0001);//ֵѹ仯 p3.Base.Pi = 40.0; p3.Base.Cf = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -357,7 +403,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 7) { - //气单相变化pvt(一口井) + //仯pvtһھ p3.T = 5; p3.Rate.t.resize(1); p3.Rate.qg.resize(1); @@ -368,9 +414,9 @@ int main() p3.CS.S.resize(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.Bg = dVec1(200, 5e-3);//数值随压力变化 - p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 - p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 + p3.PVT.Bg = dVec1(200, 5e-3);//ֵѹ仯 + p3.PVT.miug = dVec1(200, 2e-2);//ֵѹ仯 + p3.PVT.Cg = dVec1(200, 2e-2);//ֵѹ仯 p3.Base.Pi = 40.0; p3.Base.Cf = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -381,7 +427,7 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 8) { - //气单相拟压力(一口井) + //ѹһھ p3.T = 6; p3.Rate.t.resize(1); p3.Rate.qg.resize(1); @@ -392,9 +438,9 @@ int main() p3.CS.S.resize(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.Bg = dVec1(200, 5e-3);//数值随压力变化 - p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 - p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 + p3.PVT.Bg = dVec1(200, 5e-3);//ֵѹ仯 + p3.PVT.miug = dVec1(200, 2e-2);//ֵѹ仯 + p3.PVT.Cg = dVec1(200, 2e-2);//ֵѹ仯 p3.Base.Pi = 40.0; p3.Base.Cf = 1e-3; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); @@ -405,35 +451,45 @@ int main() p3.Base.dt_Max = 12.5; } else if (flowtype == 9) { - //油水两相(一口井) + //ˮࣨһھ p3.T = 8; p3.Rate.t.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.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.qo[0].resize(2); p3.Rate.qo[0][0] = 10; 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.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] = 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.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[0] = 0.1; p3.CS.S.resize(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.Bo = dVec1(200, 1.2);//数值随压力变化 - p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 - p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化 - 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.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.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.miuo = dVec1(200, 0.5);//ֵѹ仯 + //p3.PVT.Bw = dVec1(200, 1.05);//ֵѹ仯 + //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.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); } + + 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.Cf = 1e-3; + p3.Base.Cf = 1e-4; p3.Base.Swi = 0.2; p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1); @@ -443,7 +499,7 @@ int main() p3.Base.dt_Max = 12.5; } - //非均质性设置 + //Ǿ if (feijunzhi == 1) { dVec2 k; a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a); @@ -484,11 +540,11 @@ int main() file.close();*/ } - //模型计算 + //ģͼ HX_NWTM_MODEL(p4, p3, "HX_license.dat"); - //数据导出 + //ݵ Write1DVectorToCSV(p4.t, "t.csv"); Write2DVectorToCSV(p4.pw, "pw.csv"); Write2DVectorToCSV(p4.p, "C2.csv"); diff --git a/Bin/Res/license/HXNWTM_license.dat b/Bin/Res/license/HXNWTM_license.dat index 98362c9..5e45563 100644 --- a/Bin/Res/license/HXNWTM_license.dat +++ b/Bin/Res/license/HXNWTM_license.dat @@ -1 +1 @@ -7d534fb716ec6521f938 \ No newline at end of file +7d534fb716ed6121f939 \ No newline at end of file diff --git a/ML/Training/include/pch.h b/ML/Training/include/pch.h index 1fa98bc..3e8eeab 100644 --- a/ML/Training/include/pch.h +++ b/ML/Training/include/pch.h @@ -4,18 +4,20 @@ #include "framework.h" #endif //PCH_H -#define HX_API extern "C" _declspec(dllexport) +#define HX_API extern "C" _declspec(dllexport) #include #include #include #include #include #include -#include +#include #include #include -//const double M_PI = acos(-1.0); +#ifndef M_PI +const double M_PI = acos(-1.0); +#endif typedef std::vector>>dVec3; //三维数组:double typedef std::vector>dVec2; //二维数组:double typedef std::vector>iVec2; //二维数组:int @@ -24,542 +26,448 @@ typedef std::vectoriVec1; //一维数组:int template void HX_copy(std::vector>>& p1, const std::vector>>& p0) { - int m = p0.size(); p1.resize(m); - for (int i = 0; i < m; ++i) - { - int n = p0[i].size(); p1[i].resize(n); - for (int j = 0; j < n; ++j) - { - int l = p0[i][j].size(); p1[i][j].resize(l); - for (int k = 0; k < l; ++k) - { - p1[i][j][k] = p0[i][j][k]; - } - } - } + int m = p0.size(); p1.resize(m); + for (int i = 0; i < m; ++i) + { + int n = p0[i].size(); p1[i].resize(n); + for (int j = 0; j < n; ++j) + { + int l = p0[i][j].size(); p1[i][j].resize(l); + for (int k = 0; k < l; ++k) + { + p1[i][j][k] = p0[i][j][k]; + } + } + } } template void HX_copy(std::vector>& p1, const std::vector>& p0) { - int m = p0.size(); p1.resize(m); - for (int i = 0; i < m; ++i) - { - int n = p0[i].size(); p1[i].resize(n); - for (int j = 0; j < n; ++j) - { - p1[i][j] = p0[i][j]; - } - } + int m = p0.size(); p1.resize(m); + for (int i = 0; i < m; ++i) + { + int n = p0[i].size(); p1[i].resize(n); + for (int j = 0; j < n; ++j) + { + p1[i][j] = p0[i][j]; + } + } } template void HX_copy(std::vector& p1, const std::vector& p0) { - int m = p0.size(); p1.resize(m); - for (int i = 0; i < m; ++i) - { - p1[i] = p0[i]; - } + int m = p0.size(); p1.resize(m); + for (int i = 0; i < m; ++i) + { + p1[i] = p0[i]; + } } template void HX_copy(std::vector>>& p1, T*** p0, int m, int* n, int l) { - p1.resize(m); - for (int i = 0; i < m; ++i) - { - p1[i].resize(n[i]); - for (int j = 0; j < n[i]; ++j) - { - p1[i][j].resize(l); - for (int k = 0; k < l; ++k) - { - p1[i][j][k] = p0[i][j][k]; - } - } - } + p1.resize(m); + for (int i = 0; i < m; ++i) + { + p1[i].resize(n[i]); + for (int j = 0; j < n[i]; ++j) + { + p1[i][j].resize(l); + for (int k = 0; k < l; ++k) + { + p1[i][j][k] = p0[i][j][k]; + } + } + } } template void HX_copy(std::vector>& p1, T** p0, int m, int n) { - p1.resize(m); - for (int i = 0; i < m; ++i) - { - p1[i].resize(n); - for (int j = 0; j < n; ++j) - { - p1[i][j] = p0[i][j]; - } - } + p1.resize(m); + for (int i = 0; i < m; ++i) + { + p1[i].resize(n); + for (int j = 0; j < n; ++j) + { + p1[i][j] = p0[i][j]; + } + } } template void HX_copy(std::vector& p1, T* p0, int m) { - p1.resize(m); - for (int i = 0; i < m; ++i) - { - p1[i] = p0[i]; - } + p1.resize(m); + for (int i = 0; i < m; ++i) + { + p1[i] = p0[i]; + } } //点结构体 struct point { - //点结构体 - double x; double y; //点坐标 - point() { x = 0; y = 0; } - ~point() {} - 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; } + //点结构体 + double x; double y; //点坐标 + point() { x = 0; y = 0; } + ~point() {} + 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; } }; struct point3 { - double x; - double y; - double z; - point3() { x = 0; y = 0; z = 0; } - ~point3() {} - 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_;} - 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; } + double x; + double y; + double z; + point3() { x = 0; y = 0; z = 0; } + ~point3() {} + 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_;} + 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; } }; //网格结构体 struct cell { - //网格单元结构体 - std::vector p; - iVec2 pindex; - iVec1 isplot; - cell() {} - ~cell() {} + //网格单元结构体 + std::vector p; + iVec2 pindex; + iVec1 isplot; + cell() {} + ~cell() {} }; //网格算法输入参数结构体 struct HX_NWTM_GRID_INPUT { - // 网格划分算法输入参数结构体 - 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 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} 压裂直井数据 - dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf} 多级压裂水平井数据 - dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据 - dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 - double GridControl; // 网格大小控制参数 - int D; // 维数 - - //默认初始化 - HX_NWTM_GRID_INPUT() - { - dVec1 a(3), b(4), c(5); - 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[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[3] = b; - - /*VerticalWell.resize(3); - 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[2] = a; - - HorizontalWell.resize(0); - - FractureVerticalWell.resize(1); - c[0] = -200; c[1] = -200; c[2] = 200; c[3] = -200; c[4] = 0.05; FractureVerticalWell[0] = c; - - MultistageFracturedHorizontalWell.resize(1); - 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; - c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; MultistageFracturedHorizontalWell[0][1] = c; - c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; MultistageFracturedHorizontalWell[0][2] = c; - - InclinedWell.resize(0); - - Fault.resize(1); - c[0] = -500; c[1] = 1000; c[2] = 500; c[3] = 500; Fault[0] = c;*/ - //单一直井 - 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(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() {} + // 网格划分算法输入参数结构体 + 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 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, 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, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流,大于0时为有限导流)) + dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据 + dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 + double GridControl; // 网格大小控制参数 + int D; // 维数 + + //默认初始化 + HX_NWTM_GRID_INPUT() + { + dVec1 a(3), b(4), c(5), d(6); + 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[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[3] = b; + + VerticalWell.resize(3); + 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[2] = a; + + HorizontalWell.resize(0); + + FractureVerticalWell.resize(1); + 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[0].resize(3, dVec1(5)); + d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d; + d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d; + 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); + + Fault.resize(1); + b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; Fault[0] = b; + + GridControl = 150.0; + + D = 2; + } + ~HX_NWTM_GRID_INPUT() {} }; //网格算法输出参数结构体(绘图用) struct HX_NWTM_GRID_OUTPUT1 { - cell TRI_cell; //三角形网格 - cell PEBI_cell; //PEBI网格 + cell TRI_cell; //三角形网格 + 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 { - dVec2 Trinodexy; - dVec1 Area; - dVec2 D; - struct { - int n; - dVec2 XiLinw; - dVec2 lw; - dVec2 dw; - dVec1 rw; - iVec2 inwell; - } ZhiJingNeiBianJie; - struct { - int n; - dVec2 XiLinf; - dVec2 lf; - dVec2 df; - dVec1 xf; - iVec2 infra; - } LieFengJingNeiBianJie; - struct { - int n; - dVec2 XiLinh; - dVec2 lh; - dVec2 dh; - dVec2 dsxf; - iVec2 inhor; - iVec1 nhor; - } DuoJiYaLieShuiPingJingNeiBianJie; - struct { - int n; - 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() {} + dVec2 Trinodexy; + dVec1 Area; + dVec2 D; + struct { + int n; + dVec2 XiLinw; + dVec2 lw; + dVec2 dw; + dVec1 rw; + iVec2 inwell; + dVec1 dwell; + } ZhiJingNeiBianJie; + struct { + int n; + dVec2 XiLinf; + dVec2 lf; + dVec2 df; + dVec1 xf; + iVec2 infra; + iVec1 nf; + iVec1 jjf; + iVec1 jjfl; + dVec1 lfcd; + iVec2 infra1; + dVec2 lf1; + dVec2 df1; + } LieFengJingNeiBianJie; + struct { + int n; + dVec2 XiLinh; + dVec2 lh; + dVec2 dh; + dVec2 dsxf; + iVec2 inhor; + iVec1 nhor; + dVec2 areah; + iVec2 inhor1; + iVec2 nh; + iVec2 jjh; + dVec2 hfcd; + iVec2 jjhl; + iVec2 jjh2; + iVec2 inhor2; + dVec2 lh1; + dVec2 dh1; + } DuoJiYaLieShuiPingJingNeiBianJie; + struct { + int n; + 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插值输入参数结构体 struct HX_KRING_INPUT { - double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和 - double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度 - double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性 - double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , } - //高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量 - //指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量 - //球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零 - dVec2 p; //插值点 - dVec2 v; // - ~HX_KRING_INPUT() {} - 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; - p = p0; - v = v0; - } + double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和 + double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度 + double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性 + double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , } + //高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量 + //指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量 + //球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零 + dVec2 p; //插值点 + dVec2 v; // + ~HX_KRING_INPUT() {} + 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; + p = p0; + v = v0; + } }; //KRINGING插值输出参数结构体 struct HX_KRING_OUTPUT { - dVec1 v; - HX_KRING_OUTPUT() {} - ~HX_KRING_OUTPUT() {} + dVec1 v; + HX_KRING_OUTPUT() {} + ~HX_KRING_OUTPUT() {} }; //数值试井模型求解器输入参数结构体 struct HX_NWTM_MODEL_INPUT { - int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相 - HX_NWTM_GRID_OUTPUT2 GRID; - struct Rate //流量数据 - { - dVec2 t; //时间, h [一口井一组数] - dVec2 qo; //油流量,m^3/d [一口井一组数] - dVec2 qg; //气流量,m^3/d [一口井一组数] - dVec2 qw; //水流量,m^3/d [一口井一组数] - }Rate; - struct Pressure //压力数据 - { - dVec2 t; //时间, h [一口井一组数] - dVec2 p; //压力, MPa [一口井一组数] - }Pressure; - struct CS //井储表皮数据 - { - dVec1 C; //井储, m^3/MPa [一口井一个数] - dVec1 S; //表皮, [一口井一个数] - }CS; - struct PVT //流体性质数据 - { - dVec1 p; //压力, MPa - double pb; //饱和压力, MPa - dVec1 Rso; //溶解气油比, m^3/m^3 - dVec1 Bo; //油体积系数, m^3/m^3 - dVec1 Co; //油压缩系数, 1/MPa - dVec1 miuo; //油粘度, mPa·s - dVec1 rouo; //油密度, kg/m^3 - dVec1 Rv; //凝析油气比, m^3/m^3 - dVec1 Bg; //气体积系数, m^3/m^3 - dVec1 Cg; //气压缩系数, 1/MPa - dVec1 miug; //气粘度, mPa·s - dVec1 roug; //气密度, kg/m^3 - dVec1 Z; //气偏差因子, 1 - dVec1 Rsw; //溶解气水比, m^3/m^3 - dVec1 Bw; //水体积系数, m^3/m^3 - dVec1 Cw; //水压缩系数, 1/MPa - dVec1 miuw; //水粘度, mPa·s - dVec1 rouw; //水密度, kg/m^3 - dVec1 V; //吸附气量, m^3/kg - dVec1 k_kinitial; //渗透率比, 1 - dVec1 Cf_Cfinitial; //岩石压缩系数比, 1 - dVec1 So; //油饱和度 - dVec1 Kro; //油相对渗透率 - dVec1 Sg; //气饱和度 - dVec1 Krg; //气相对渗透率 - dVec1 Sw; //水饱和度 - dVec1 Krw; //水相对渗透率 - }PVT; - struct Base //基础数据 - { - double Pi; //初始压力, MPa - double Cti; //综合压缩系数, 1/MPa - double Cf; //岩石压缩系数, 1/MPa - double Soi; //初始含油饱和度 - double Sgi; //初始含气饱和度 - double Swi; //初始含水饱和度 - dVec1 k; //渗透率, D [一个网格单元一个值] - dVec1 phi; //孔隙度, 1 [一个网格单元一个值] - dVec1 h; //储层厚度, m [一个网格单元一个值] - double d; //时间增长指数 - double dt_Min; //最小时间间隔, h - double dt_Max; //最大时间间隔, h - }Base; - - //初始化 - HX_NWTM_MODEL_INPUT() {} - ~HX_NWTM_MODEL_INPUT() {} - HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) - { - T =1; - GRID = p0; - - /*Rate.t.resize(5); - Rate.qo.resize(5); - Rate.qw.resize(5); - Rate.qg.resize(5); - - 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.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.t[1].resize(0); - Rate.qo[1].resize(0); - Rate.qw[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.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.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.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.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.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.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000; - - Pressure.t.resize(0); - Pressure.p.resize(0); - - 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.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;*/ - - - Rate.t.resize(1); - Rate.qo.resize(1); - Rate.qw.resize(1); - Rate.qg.resize(1); - - 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.qw[0].resize(2); Rate.qw[0][0] =-10; Rate.qw[0][1] = 0; - Rate.qg[0].resize(2); Rate.qg[0][0] = 50000; Rate.qg[0][1] = 0; - Pressure.t.resize(0); - Pressure.p.resize(0); - - CS.C.resize(1); - CS.C[0] = 0.1; - CS.S.resize(1); - CS.S[0] = 0.1; - - PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); } - PVT.pb = 40.0; - PVT.Rso = dVec1(200, 0); - PVT.Bo = dVec1(200, 1.2); - PVT.Co = dVec1(200, 5e-4); - PVT.miuo = dVec1(200, 0.5); - PVT.rouo = dVec1(200, 800); - PVT.Rv = dVec1(200, 0); - PVT.Bg = dVec1(200, 5e-3); - PVT.Cg = dVec1(200, 2e-2); - PVT.miug = dVec1(200, 2e-2); - PVT.roug = dVec1(200, 200); - PVT.Z = dVec1(200, 1); - PVT.Rsw = dVec1(200, 0); - PVT.Bw = dVec1(200, 1.05); - PVT.Cw = dVec1(200, 1e-4); - PVT.miuw = dVec1(200, 0.8); - PVT.rouw = dVec1(200, 1000); - PVT.V = dVec1(200, 0); - - PVT.k_kinitial = dVec1(200, 1); - PVT.Cf_Cfinitial = dVec1(200, 1); - - PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); } - PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); } - PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); } - PVT.Sg = dVec1(100, 0); - 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; - } + int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相 + HX_NWTM_GRID_OUTPUT2 GRID; + struct Rate //流量数据 + { + dVec2 t; //时间, h [一口井一组数] + dVec2 qo; //油流量,m^3/d [一口井一组数] + dVec2 qg; //气流量,m^3/d [一口井一组数] + dVec2 qw; //水流量,m^3/d [一口井一组数] + }Rate; + struct Pressure //压力数据 + { + dVec2 t; //时间, h [一口井一组数] + dVec2 p; //压力, MPa [一口井一组数] + }Pressure; + struct CS //井储表皮数据 + { + dVec1 C; //井储, m^3/MPa [一口井一个数] + dVec1 S; //表皮, [一口井一个数] + }CS; + struct PVT //流体性质数据 + { + dVec1 p; //压力, MPa + double pb; //饱和压力, MPa + dVec1 Rso; //溶解气油比, m^3/m^3 + dVec1 Bo; //油体积系数, m^3/m^3 + dVec1 Co; //油压缩系数, 1/MPa + dVec1 miuo; //油粘度, mPa·s + dVec1 rouo; //油密度, kg/m^3 + dVec1 Rv; //凝析油气比, m^3/m^3 + dVec1 Bg; //气体积系数, m^3/m^3 + dVec1 Cg; //气压缩系数, 1/MPa + dVec1 miug; //气粘度, mPa·s + dVec1 roug; //气密度, kg/m^3 + dVec1 Z; //气偏差因子, 1 + dVec1 Rsw; //溶解气水比, m^3/m^3 + dVec1 Bw; //水体积系数, m^3/m^3 + dVec1 Cw; //水压缩系数, 1/MPa + dVec1 miuw; //水粘度, mPa·s + dVec1 rouw; //水密度, kg/m^3 + dVec1 V; //吸附气量, m^3/kg + dVec1 k_kinitial; //渗透率比, 1 + dVec1 Cf_Cfinitial; //岩石压缩系数比, 1 + dVec1 So; //油饱和度 + dVec1 Kro; //油相对渗透率 + dVec1 Sg; //气饱和度 + dVec1 Krg; //气相对渗透率 + dVec1 Sw; //水饱和度 + dVec1 Krw; //水相对渗透率 + }PVT; + struct Base //基础数据 + { + double Pi; //初始压力, MPa + double Cti; //综合压缩系数, 1/MPa + double Cf; //岩石压缩系数, 1/MPa + double Soi; //初始含油饱和度 + double Sgi; //初始含气饱和度 + double Swi; //初始含水饱和度 + dVec1 k; //渗透率, D [一个网格单元一个值] + dVec1 phi; //孔隙度, 1 [一个网格单元一个值] + dVec1 h; //储层厚度, m [一个网格单元一个值] + double d; //时间增长指数 + double dt_Min; //最小时间间隔, h + double dt_Max; //最大时间间隔, h + }Base; + + //初始化 + HX_NWTM_MODEL_INPUT() {} + ~HX_NWTM_MODEL_INPUT() {} + HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) + { + T =1; + GRID = p0; + + Rate.t.resize(5); + Rate.qo.resize(5); + Rate.qw.resize(5); + Rate.qg.resize(5); + + 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.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.t[1].resize(0); + Rate.qo[1].resize(0); + Rate.qw[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.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.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.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.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.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.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000; + + Pressure.t.resize(0); + Pressure.p.resize(0); + + 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.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; + + + PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); } + PVT.pb = 40.0; + PVT.Rso = dVec1(200, 0); + PVT.Bo = dVec1(200, 1.2); + PVT.Co = dVec1(200, 5e-4); + PVT.miuo = dVec1(200, 0.5); + PVT.rouo = dVec1(200, 800); + PVT.Rv = dVec1(200, 0); + PVT.Bg = dVec1(200, 5e-3); + PVT.Cg = dVec1(200, 2e-2); + PVT.miug = dVec1(200, 2e-2); + PVT.roug = dVec1(200, 200); + PVT.Z = dVec1(200, 1); + PVT.Rsw = dVec1(200, 0); + PVT.Bw = dVec1(200, 1.05); + PVT.Cw = dVec1(200, 1e-4); + PVT.miuw = dVec1(200, 0.8); + PVT.rouw = dVec1(200, 1000); + PVT.V = dVec1(200, 0); + + PVT.k_kinitial = dVec1(200, 1); + PVT.Cf_Cfinitial = dVec1(200, 1); + + PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); } + PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); } + PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); } + PVT.Sg = dVec1(100, 0); + 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 { - dVec1 t; //时间, h - dVec2 pw; //井底压力, MPa [一口井一组数] - dVec2 p; //压力分布, MPa [一个时间一组数] - dVec2 So; //油饱和度分布 [一个时间一组数] - dVec2 Sg; //气饱和度分布 [一个时间一组数] - dVec2 Sw; //水饱和度分布 [一个时间一组数] - dVec2 k; //渗透率分布,mD [一个时间一组数] - HX_NWTM_MODEL_OUTPUT() {} - ~HX_NWTM_MODEL_OUTPUT() {} + dVec1 t; //时间, h + dVec2 pw; //井底压力, MPa [一口井一组数] + dVec2 p; //压力分布, MPa [一个时间一组数] + dVec2 So; //油饱和度分布 [一个时间一组数] + dVec2 Sg; //气饱和度分布 [一个时间一组数] + dVec2 Sw; //水饱和度分布 [一个时间一组数] + dVec2 k; //渗透率分布,mD [一个时间一组数] + 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); //数值试井网格接口