diff --git a/3rd/Pebi/include/pch.h b/3rd/Pebi/include/pch.h index 09d280c..455979c 100644 --- a/3rd/Pebi/include/pch.h +++ b/3rd/Pebi/include/pch.h @@ -97,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_; } @@ -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 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); //数值试井模型求解器接口 diff --git a/3rd/Pebi/src/main.cpp b/3rd/Pebi/src/main.cpp index 6fcecc5..aa97cba 100644 --- a/3rd/Pebi/src/main.cpp +++ b/3rd/Pebi/src/main.cpp @@ -2,18 +2,18 @@ #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(); } @@ -23,7 +23,7 @@ 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(); } @@ -31,32 +31,32 @@ void Write1DVectorToCSV(const std::vector& data, const std::string& file bool readCSVColumn(const std::string& filename, int columnIndex, std::vector& 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