网格求解算法库更新

feature/nm-para-property-20260615
lvjunjie 1 week ago
parent 215d089e44
commit 526bacde40

@ -15,7 +15,9 @@
#include <unordered_set> #include <unordered_set>
#include <Windows.h> #include <Windows.h>
//const double M_PI = acos(-1.0); #ifndef M_PI
const double M_PI = acos(-1.0);
#endif
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<std::vector<double>>dVec2; //二维数组:double typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<std::vector<int>>iVec2; //二维数组:int typedef std::vector<std::vector<int>>iVec2; //二维数组:int
@ -136,8 +138,8 @@ struct HX_NWTM_GRID_INPUT
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据 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 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 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} 压裂直井数据 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} 多级压裂水平井数据 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 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据 dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数 double GridControl; // 网格大小控制参数
@ -146,7 +148,7 @@ struct HX_NWTM_GRID_INPUT
//默认初始化 //默认初始化
HX_NWTM_GRID_INPUT() HX_NWTM_GRID_INPUT()
{ {
dVec1 a(3), b(4), c(5); dVec1 a(3), b(4), c(5), d(6);
Boundary.resize(4); 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[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[1] = b;
@ -161,18 +163,18 @@ struct HX_NWTM_GRID_INPUT
HorizontalWell.resize(0); HorizontalWell.resize(0);
FractureVerticalWell.resize(1); 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.resize(1);
MultistageFracturedHorizontalWell[0].resize(3, dVec1(5)); 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; d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; MultistageFracturedHorizontalWell[0][1] = c; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d;
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] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][2] = d;
InclinedWell.resize(0); InclinedWell.resize(0);
Fault.resize(1); 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; GridControl = 150.0;
@ -213,6 +215,13 @@ struct HX_NWTM_GRID_OUTPUT2
dVec2 df; dVec2 df;
dVec1 xf; dVec1 xf;
iVec2 infra; iVec2 infra;
iVec1 nf;
iVec1 jjf;
iVec1 jjfl;
dVec1 lfcd;
iVec2 infra1;
dVec2 lf1;
dVec2 df1;
} LieFengJingNeiBianJie; } LieFengJingNeiBianJie;
struct { struct {
int n; int n;
@ -222,6 +231,16 @@ struct HX_NWTM_GRID_OUTPUT2
dVec2 dsxf; dVec2 dsxf;
iVec2 inhor; iVec2 inhor;
iVec1 nhor; iVec1 nhor;
dVec2 areah;
iVec2 inhor1;
iVec2 nh;
iVec2 jjh;
dVec2 hfcd;
iVec2 jjhl;
iVec2 jjh2;
iVec2 inhor2;
dVec2 lh1;
dVec2 dh1;
} DuoJiYaLieShuiPingJingNeiBianJie; } DuoJiYaLieShuiPingJingNeiBianJie;
struct { struct {
int n; int n;

@ -1,17 +1,19 @@
#include"pch.h" #include"pch.h"
#include <sstream>
#include <string>
void Write2DVectorToCSV(const std::vector<std::vector<double>>& data, const std::string& filename) { 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()) { if (file.is_open()) {
for (size_t row = 0; row < data.size(); ++row) { for (size_t row = 0; row < data.size(); ++row) {
for (size_t col = 0; col < data[row].size(); ++col) { for (size_t col = 0; col < data[row].size(); ++col) {
// 设置固定小数格式和精度 // 设置固定小数格式和精度
file << std::fixed << std::setprecision(15) << data[row][col]; file << std::fixed << std::setprecision(15) << data[row][col];
// 非最后一列时添加逗号 // 非最后一列时添加逗号
if (col != data[row].size() - 1) { if (col != data[row].size() - 1) {
file << ","; file << ",";
} }
} }
file << "\n"; // 换行符 file << "\n"; // 换行符
} }
file.close(); file.close();
} }
@ -21,11 +23,57 @@ void Write1DVectorToCSV(const std::vector<double>& data, const std::string& file
if (file.is_open()) { if (file.is_open()) {
file << std::fixed << std::setprecision(precision); file << std::fixed << std::setprecision(precision);
for (size_t i = 0; i < data.size(); ++i) { for (size_t i = 0; i < data.size(); ++i) {
file << data[i] << "\n"; // 每个元素单独一行 file << data[i] << "\n"; // 每个元素单独一行
} }
file.close(); 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() int main()
{ {
@ -35,19 +83,19 @@ int main()
HX_NWTM_GRID_OUTPUT2 p2; HX_NWTM_GRID_OUTPUT2 p2;
//不同井型算例 //不同井型算例
int welltype;//1为一口直井2为一口压裂直井3为一口多段压裂水平井4为五口井(含直井,压裂直井,多段压裂水平井,断层)5为50口直井 int welltype;//1为一口直井2为一口压裂直井3为一口多段压裂水平井4为五口井(含直井,压裂直井,多段压裂水平井,断层)5为50口直井
welltype = 1; 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; 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) { if (welltype == 1) {
//一口直井 //一口直井
p0.Boundary.resize(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[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = 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); p0.Fault.resize(0);
} }
else if (welltype == 2) { else if (welltype == 2) {
//一口压裂直井 //一口压裂直井
p0.Boundary.resize(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[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = 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.VerticalWell.resize(0);
p0.HorizontalWell.resize(0); p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1); 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.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0); p0.InclinedWell.resize(0);
p0.Fault.resize(0); p0.Fault.resize(0);
} }
else if (welltype == 3) { else if (welltype == 3) {
//一口多段压裂水平井 //一口多段压裂水平井
p0.Boundary.resize(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[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = 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.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0); p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(1); p0.MultistageFracturedHorizontalWell.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(7, dVec1(5)); p0.MultistageFracturedHorizontalWell[0].resize(5, dVec1(6));
c[0] = -600; c[1] = -200; c[2] = -600; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][0] = c; d[0] = -400; d[1] = -200; d[2] = -400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -400; c[1] = -200; c[2] = -400; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][1] = c; d[0] = -200; d[1] = -200; d[2] = -200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -200; c[1] = -200; c[2] = -200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][2] = c; d[0] = 0; d[1] = -200; d[2] =0; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][2] = d;
c[0] = 0; c[1] = -200; c[2] =0; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][3] = c; d[0] = 200; d[1] = -200; d[2] = 200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][3] = d;
c[0] = 200; c[1] = -200; c[2] = 200; c[3] = 200; c[4] = 0.05; p0.MultistageFracturedHorizontalWell[0][4] = c; d[0] = 400; d[1] = -200; d[2] = 400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][4] = d;
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.InclinedWell.resize(0); p0.InclinedWell.resize(0);
p0.Fault.resize(0); p0.Fault.resize(0);
} }
else if (welltype == 4) { else if (welltype == 4) {
//五口井(含直井,压裂直井,多段压裂水平井,断层) //五口井(含直井,压裂直井,多段压裂水平井,断层)
p0.Boundary.resize(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[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = 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; a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a;
p0.HorizontalWell.resize(0); p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1); 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.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(5)); p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(6));
c[0] = -600; c[1] = 600; c[2] = -400; c[3] = 600; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][0] = c; d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][0] = d;
c[0] = -600; c[1] = 400; c[2] = -400; c[3] = 400; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][1] = c; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][1] = d;
c[0] = -600; c[1] = 200; c[2] = -400; c[3] = 200; c[4] = 0.1; p0.MultistageFracturedHorizontalWell[0][2] = c; 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.InclinedWell.resize(0);
p0.Fault.resize(1); 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) { else if (welltype == 5) {
//50口直井 //50口直井
p0.Boundary.resize(4); 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[0] = b;
b[0] = -1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = 1000.0; p0.Boundary[1] = 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.GridControl = 150.0;
p0.D = 2; p0.D = 2;
//网格计算 //网格计算
HX_NWTM_GRID(p1, p2, p0, "HX_license.dat"); HX_NWTM_GRID(p1, p2, p0, "HX_license.dat");
HX_NWTM_MODEL_INPUT p3(p2); HX_NWTM_MODEL_INPUT p3(p2);
HX_NWTM_MODEL_OUTPUT p4; HX_NWTM_MODEL_OUTPUT p4;
//模型设置 //模型设置
if (flowtype == 1) { if (flowtype == 1) {
//油单相常数pvt一口井 //油单相常数pvt一口井
p3.T = 1; p3.T = 1;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qo.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.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.resize(1);
p3.CS.C[0] = 0.1; p3.CS.C[0] = 0;
p3.CS.S.resize(1); 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.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.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -218,7 +264,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 2) { else if (flowtype == 2) {
//油单相常数pvt五口井 //油单相常数pvt五口井
p3.T = 1; p3.T = 1;
p3.Rate.t.resize(5); p3.Rate.t.resize(5);
p3.Rate.qo.resize(5); p3.Rate.qo.resize(5);
@ -241,8 +287,8 @@ int main()
p3.CS.S.resize(5); 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.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.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.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -253,7 +299,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 3) { else if (flowtype == 3) {
//油单相常数pvt五十口井 //油单相常数pvt五十口井
p3.T = 1; p3.T = 1;
dVec1 t; dVec1 t;
t.push_back(12); 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.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.Bo = dVec1(200, 1.07);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值 p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值
p3.Base.Pi = 40; p3.Base.Pi = 40;
p3.Base.Cti = 0.43e-3; p3.Base.Cti = 0.43e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025);
@ -286,7 +332,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 4) { else if (flowtype == 4) {
//油单相变化pvt一口井 //油单相变化pvt一口井
p3.T = 2; p3.T = 2;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qo.resize(1); p3.Rate.qo.resize(1);
@ -297,9 +343,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bo = dVec1(200, 1.2);//数值随压力变化
p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化 p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -310,7 +356,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 5) { else if (flowtype == 5) {
//水单相常数pvt一口井 //水单相常数pvt一口井
p3.T = 3; p3.T = 3;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qw.resize(1); p3.Rate.qw.resize(1);
@ -321,8 +367,8 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bw = dVec1(200, 1.05);//所有数为一个值
p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值 p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3; p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -333,7 +379,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 6) { else if (flowtype == 6) {
//水单相变化pvt一口井 //水单相变化pvt一口井
p3.T = 4; p3.T = 4;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qw.resize(1); p3.Rate.qw.resize(1);
@ -344,9 +390,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bw = dVec1(200, 1.05);//数值随压力变化
p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化 p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化 p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -357,7 +403,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 7) { else if (flowtype == 7) {
//气单相变化pvt一口井 //气单相变化pvt一口井
p3.T = 5; p3.T = 5;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.resize(1); p3.Rate.qg.resize(1);
@ -368,9 +414,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -381,7 +427,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 8) { else if (flowtype == 8) {
//气单相拟压力(一口井) //气单相拟压力(一口井)
p3.T = 6; p3.T = 6;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.resize(1); p3.Rate.qg.resize(1);
@ -392,9 +438,9 @@ int main()
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化 p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0; p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
@ -405,35 +451,45 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
else if (flowtype == 9) { else if (flowtype == 9) {
//油水两相(一口井) //油水两相(一口井)
p3.T = 8; p3.T = 8;
p3.Rate.t.resize(1); p3.Rate.t.resize(1);
p3.Rate.qg.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.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.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.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] = 10; p3.Rate.qw[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.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.resize(1);
p3.CS.C[0] = 0.1; p3.CS.C[0] = 0.1;
p3.CS.S.resize(1); p3.CS.S.resize(1);
p3.CS.S[0] = 0.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.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.Bo = dVec1(200, 1.2);//数值随压力变化
p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化 //p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化 //p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化
p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化 //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.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.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.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.Pi = 40.0;
p3.Base.Cf = 1e-3; p3.Base.Cf = 1e-4;
p3.Base.Swi = 0.2; p3.Base.Swi = 0.2;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001); p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1); p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
@ -443,7 +499,7 @@ int main()
p3.Base.dt_Max = 12.5; p3.Base.dt_Max = 12.5;
} }
//非均质性设置 //非均质性设置
if (feijunzhi == 1) { if (feijunzhi == 1) {
dVec2 k; dVec2 k;
a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a); a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a);
@ -484,11 +540,11 @@ int main()
file.close();*/ file.close();*/
} }
//模型计算 //模型计算
HX_NWTM_MODEL(p4, p3, "HX_license.dat"); HX_NWTM_MODEL(p4, p3, "HX_license.dat");
//数据导出 //数据导出
Write1DVectorToCSV(p4.t, "t.csv"); Write1DVectorToCSV(p4.t, "t.csv");
Write2DVectorToCSV(p4.pw, "pw.csv"); Write2DVectorToCSV(p4.pw, "pw.csv");
Write2DVectorToCSV(p4.p, "C2.csv"); Write2DVectorToCSV(p4.p, "C2.csv");

@ -1 +1 @@
7d534fb716ec6521f938 7d534fb716ed6121f939
Loading…
Cancel
Save