|
|
|
|
@ -1,17 +1,19 @@
|
|
|
|
|
#include"pch.h"
|
|
|
|
|
#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();
|
|
|
|
|
}
|
|
|
|
|
@ -21,11 +23,57 @@ 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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
bool readCSVColumn(const std::string& filename, int columnIndex, std::vector<double>& data) {
|
|
|
|
|
std::ifstream file(filename);
|
|
|
|
|
if (!file.is_open()) {
|
|
|
|
|
std::cerr << "无法打开文件: " << filename << std::endl;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string line;
|
|
|
|
|
// 跳过标题行(如果有)
|
|
|
|
|
if (file.good()) {
|
|
|
|
|
std::getline(file, line);
|
|
|
|
|
}
|
|
|
|
|
data.resize(0);
|
|
|
|
|
// 逐行处理数据
|
|
|
|
|
while (std::getline(file, line)) {
|
|
|
|
|
std::istringstream ss(line);
|
|
|
|
|
std::string cell;
|
|
|
|
|
int currentColumn = 0;
|
|
|
|
|
bool columnFound = false;
|
|
|
|
|
|
|
|
|
|
// 处理当前行的每个单元格
|
|
|
|
|
while (std::getline(ss, cell, ',')) {
|
|
|
|
|
if (currentColumn == columnIndex) {
|
|
|
|
|
try {
|
|
|
|
|
// 转换为double并添加到vector
|
|
|
|
|
data.push_back(std::stod(cell));
|
|
|
|
|
}
|
|
|
|
|
catch (const std::invalid_argument& e) {
|
|
|
|
|
std::cerr << "转换错误: " << cell << " 不是有效的数字" << std::endl;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
columnFound = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
currentColumn++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果指定列不存在,给出警告
|
|
|
|
|
if (!columnFound) {
|
|
|
|
|
std::cerr << "警告: 行 " << data.size() + 1 << " 不包含列 " << columnIndex << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
file.close();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
@ -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");
|
|
|
|
|
|