|
|
|
|
@ -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");
|
|
|
|
|
|