解决乱码

develop
lvjunjie 3 days ago
parent 4e4ccd9462
commit f87ffafad9

@ -97,11 +97,11 @@ template<class T> void HX_copy(std::vector<T>& 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_; }
@ -119,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<point> p;
iVec2 pindex;
iVec1 isplot;
@ -131,7 +131,7 @@ struct cell
};
//Íř¸ńË㡨ĘäČë˛ÎĘý˝áššĚĺ
//网格算法输入参数结构体
struct HX_NWTM_GRID_INPUT
{
// 网格划分算法输入参数结构体
@ -145,7 +145,7 @@ struct HX_NWTM_GRID_INPUT
double GridControl; // 网格大小控制参数
int D; // 维数
//ÄŹČĎłőĘźťŻ
//默认初始化
HX_NWTM_GRID_INPUT()
{
dVec1 a(3), b(4), c(5), d(6);
@ -183,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;
@ -266,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)
@ -287,7 +287,7 @@ struct HX_KRING_INPUT
}
};
//KRINGING˛ĺÖľĘäłö˛ÎĘý˝áššĚĺ
//KRINGING插值输出参数结构体
struct HX_KRING_OUTPUT
{
dVec1 v;
@ -295,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; //油粘度, 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 //ťů´ĄĘýžÝ
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)
@ -456,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); //数值试井模型求解器接口

@ -2,18 +2,18 @@
#include <sstream>
#include <string>
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()) {
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();
}
@ -23,7 +23,7 @@ void Write1DVectorToCSV(const std::vector<double>& 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();
}
@ -31,32 +31,32 @@ void Write1DVectorToCSV(const std::vector<double>& data, const std::string& file
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;
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
// 转换为double并添加到vector
data.push_back(std::stod(cell));
}
catch (const std::invalid_argument& e) {
std::cerr << "转换错误: " << cell << " 不是有效的数字" << std::endl;
std::cerr << "转换错误: " << cell << " 不是有效的数字" << std::endl;
return false;
}
columnFound = true;
@ -65,9 +65,9 @@ bool readCSVColumn(const std::string& filename, int columnIndex, std::vector<dou
currentColumn++;
}
// 如果指定列不存在,给出警告
// 如果指定列不存在,给出警告
if (!columnFound) {
std::cerr << "警告: 行 " << data.size() + 1 << " 不包含列 " << columnIndex << std::endl;
std::cerr << "警告: 行 " << data.size() + 1 << " 不包含列 " << columnIndex << std::endl;
}
}
@ -83,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), 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;
@ -110,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;
@ -125,7 +125,7 @@ int main()
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;
@ -145,7 +145,7 @@ int main()
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;
@ -168,7 +168,7 @@ int main()
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;
@ -234,14 +234,14 @@ 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);
@ -252,8 +252,8 @@ int main()
p3.CS.S.resize(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);
@ -264,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);
@ -287,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);
@ -299,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);
@ -320,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);
@ -332,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);
@ -343,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);
@ -356,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);
@ -367,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);
@ -379,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);
@ -390,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);
@ -403,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);
@ -414,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);
@ -427,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);
@ -438,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);
@ -451,18 +451,18 @@ 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] = 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] = 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] = -20; p3.Rate.qw[0][1] = 0;
@ -471,10 +471,10 @@ 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.Bw = dVec1(200, 1.05);//数值随压力变化
//p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
//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); }
@ -499,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);
@ -540,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");

Loading…
Cancel
Save