You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/Pebi/V3/main.cpp

652 lines
27 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include"pch.h"
#include <sstream>
#include <string>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
static int g_orgStdout = -1;
static FILE* g_nulPipe = nullptr;
void EnterSilentDllMode()
{
// 备份原始标准输出句柄
g_orgStdout = _dup(_fileno(stdout));
// fopen_s 替代 fopen打开空设备 NUL
errno_t err;
err = fopen_s(&g_nulPipe, "NUL", "w");
if (err == 0 && g_nulPipe != nullptr)
{
_dup2(_fileno(g_nulPipe), _fileno(stdout));
_dup2(_fileno(g_nulPipe), _fileno(stderr));
}
}
void LeaveSilentDllMode()
{
// 恢复原始控制台输出
if (g_orgStdout != -1)
{
_dup2(g_orgStdout, _fileno(stdout));
_dup2(g_orgStdout, _fileno(stderr));
_close(g_orgStdout);
g_orgStdout = -1;
}
// 关闭空文件流
if (g_nulPipe != nullptr)
{
fclose(g_nulPipe);
g_nulPipe = nullptr;
}
}
void Write2DVectorToCSV(const std::vector<std::vector<double>>& data, const std::string& filename) {
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.close();
}
}
void Write1DVectorToCSV(const std::vector<double>& data, const std::string& filename, int precision = 15) {
std::ofstream file(filename.c_str());
if (file.is_open()) {
file << std::fixed << std::setprecision(precision);
for (size_t i = 0; i < data.size(); ++i) {
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()
{
set_ilu_reuse_steps(5);
int solvetype[] = { 1,2 };
std::string solvetypename[] = {"新库","原库"};
int omp_threads[] = { 1, 2, 4, 8, 16 };
//不同井型算例
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为油水两相一口井
flowtype = 1;
const int WT[] = { 1,1,2,2,3,3,4,5 };
const int FT[] = { 1,9,1,9,1,9,2,3 };
std::string name[] =
{
"1-1油单相常数pvt(1口直井)",
"1-9油水两相 (1口直井)",
"2-1油单相常数pvt(1口压裂直井)",
"2-9油水两相 (1口压裂直井)",
"3-1油单相常数pvt(1口多段压裂水平井)",
"3-9油水两相 (1口多段压裂水平井)",
"4-2油单相常数pvt(5口井)",
"5-3油单相常数pvt(50口直井)"
};
for (int type = 0; type < 2; ++type){
set_solvetype(solvetype[type]);
std::cout << solvetypename[type] << "\n";
int threads ;
if (solvetype[type] == 1) {
threads = 5;
}
else if (solvetype[type] == 2) {
threads = 1;
}
for (int thr = 0; thr < threads; ++thr)
{
set_omp_threads(omp_threads[thr]);
std::cout << omp_threads[thr] << "线程测试\n";
for (int iiii = 0; iiii < 8; ++iiii)
{
welltype = WT[iiii];
flowtype = FT[iiii];
//非均质性
int feijunzhi = 0;//0为不考虑储层非均质1为考虑储层非均质
HX_NWTM_GRID_INPUT p0;
HX_NWTM_GRID_OUTPUT1 p1;
HX_NWTM_GRID_OUTPUT2 p2;
//不同井型设置
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;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(1);
a[0] = 0; a[1] = 0; a[2] = 0.1; p0.VerticalWell[0] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0);
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;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(0);
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1);
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;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(0);
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(1);
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;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(3);
a[0] = 0; a[1] = 0; a[2] = 0.1; p0.VerticalWell[0] = a;
a[0] = 1000; a[1] = 1000; a[2] = 0.1; p0.VerticalWell[1] = a;
a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1);
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(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);
b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; p0.Fault[0] = b;
}
else if (welltype == 5) {
//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;
b[0] = 1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = -1000.0; p0.Boundary[2] = b;
b[0] = 1000.0; b[1] = -1000.0; b[2] = -1000.0; b[3] = -1000.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(50);
a[0] = 766.32207856101854; a[1] = -408.4253100821785; a[2] = 0.108; p0.VerticalWell[0] = a;
a[0] = -359.11086885711029; a[1] = -242.17185988435722; a[2] = 0.108; p0.VerticalWell[1] = a;
a[0] = -396.28113134064483; a[1] = 618.18974488936828; a[2] = 0.108; p0.VerticalWell[2] = a;
a[0] = -844.38929572547772; a[1] = 859.25724767620932; a[2] = 0.108; p0.VerticalWell[3] = a;
a[0] = -631.69279373636357; a[1] = 620.26791301684102; a[2] = 0.108; p0.VerticalWell[4] = a;
a[0] = -858.84439780240791; a[1] = 333.48071142559911; a[2] = 0.108; p0.VerticalWell[5] = a;
a[0] = -844.38929572547772; a[1] = 609.87707237947734; a[2] = 0.108; p0.VerticalWell[6] = a;
a[0] = -639.95285206603785; a[1] = 867.56992018610026; a[2] = 0.108; p0.VerticalWell[7] = a;
a[0] = 764.25706397860017; a[1] = -190.2176566975379; a[2] = 0.108; p0.VerticalWell[8] = a;
a[0] = -410.73623341757479; a[1] = 867.56992018610026; a[2] = 0.108; p0.VerticalWell[9] = a;
a[0] = -121.63419187897284; a[1] = 98.647713021176514; a[2] = 0.108; p0.VerticalWell[10] = a;
a[0] = -152.6094106152517; a[1] = 364.65323333769061; a[2] = 0.108; p0.VerticalWell[11] = a;
a[0] = -152.6094106152517; a[1] = 620.26791301684102; a[2] = 0.108; p0.VerticalWell[12] = a;
a[0] = -361.17588343952877; a[1] = 102.80404927612199; a[2] = 0.108; p0.VerticalWell[13] = a;
a[0] = -844.38929572547772; a[1] = -231.78101924699342; a[2] = 0.108; p0.VerticalWell[14] = a;
a[0] = -156.73943978008879; a[1] = 875.88259269599121; a[2] = 0.108; p0.VerticalWell[15] = a;
a[0] = 138.55764550576896; a[1] = 890.42976958830059; a[2] = 0.108; p0.VerticalWell[16] = a;
a[0] = 446.24481828613784; a[1] = -439.59783199426988; a[2] = 0.108; p0.VerticalWell[17] = a;
a[0] = -846.45431030789632; a[1] = 61.240686726666581; a[2] = 0.108; p0.VerticalWell[18] = a;
a[0] = -142.28433770315883; a[1] = -223.46834673710214; a[2] = 0.108; p0.VerticalWell[19] = a;
a[0] = -375.63098551645885; a[1] = -472.84852203383423; a[2] = 0.108; p0.VerticalWell[20] = a;
a[0] = -602.78258958250342; a[1] = 354.2623927003267; a[2] = 0.108; p0.VerticalWell[21] = a;
a[0] = 431.78971620920788; a[1] = 624.42424927178672; a[2] = 0.108; p0.VerticalWell[22] = a;
a[0] = -834.06422281338484; a[1] = -474.92669016130685; a[2] = 0.108; p0.VerticalWell[23] = a;
a[0] = -836.12923739580344; a[1] = -747.16671486023938; a[2] = 0.108; p0.VerticalWell[24] = a;
a[0] = 813.81741395664631; a[1] = -693.13434354594744; a[2] = 0.108; p0.VerticalWell[25] = a;
a[0] = 458.63490578064966; a[1] = -718.07236107562062; a[2] = 0.108; p0.VerticalWell[26] = a;
a[0] = 409.07455580260353; a[1] = 873.80442456851847; a[2] = 0.108; p0.VerticalWell[27] = a;
a[0] = 124.10254342883854; a[1] = -454.14500888657915; a[2] = 0.108; p0.VerticalWell[28] = a;
a[0] = 138.55764550576896; a[1] = 96.569544893703778; a[2] = 0.108; p0.VerticalWell[29] = a;
a[0] = 101.38738302223419; a[1] = 611.95524050694985; a[2] = 0.108; p0.VerticalWell[30] = a;
a[0] = -373.56597093404037; a[1] = 360.49689708274514; a[2] = 0.108; p0.VerticalWell[31] = a;
a[0] = -604.8476041649219; a[1] = 79.944199873921661; a[2] = 0.108; p0.VerticalWell[32] = a;
a[0] = -611.0426479121777; a[1] = -219.31201048215667; a[2] = 0.108; p0.VerticalWell[33] = a;
a[0] = 448.30983286855667; a[1] = -202.68666546237455; a[2] = 0.108; p0.VerticalWell[34] = a;
a[0] = 735.34685982474002; a[1] = 880.03892895093713; a[2] = 0.108; p0.VerticalWell[35] = a;
a[0] = 107.58242676948976; a[1] = -724.30686545803894; a[2] = 0.108; p0.VerticalWell[36] = a;
a[0] = 150.94773300028032; a[1] = -196.45216107995623; a[2] = 0.108; p0.VerticalWell[37] = a;
a[0] = 762.19204939618135; a[1] = 113.19488991348589; a[2] = 0.108; p0.VerticalWell[38] = a;
a[0] = -125.76422104381015; a[1] = -470.77035390636138; a[2] = 0.108; p0.VerticalWell[39] = a;
a[0] = 452.43986203339387; a[1] = 366.73140146516357; a[2] = 0.108; p0.VerticalWell[40] = a;
a[0] = -350.85081052743578; a[1] = -751.32305111518485; a[2] = 0.108; p0.VerticalWell[41] = a;
a[0] = 122.03752884641995; a[1] = 354.2623927003267; a[2] = 0.108; p0.VerticalWell[42] = a;
a[0] = -608.9776333297591; a[1] = -447.91050450416094; a[2] = 0.108; p0.VerticalWell[43] = a;
a[0] = 407.0095412201847; a[1] = 113.19488991348589; a[2] = 0.108; p0.VerticalWell[44] = a;
a[0] = 731.21683065990283; a[1] = 636.89325803662314; a[2] = 0.108; p0.VerticalWell[45] = a;
a[0] = -121.63419187897284; a[1] = -724.30686545803894; a[2] = 0.108; p0.VerticalWell[46] = a;
a[0] = 289.3037100223255; a[1] = -925.88917382289742; a[2] = 0.108; p0.VerticalWell[47] = a;
a[0] = 737.41187440715862; a[1] = 366.73140146516357; a[2] = 0.108; p0.VerticalWell[48] = a;
a[0] = -611.0426479121777; a[1] = -730.54136984045726; a[2] = 0.108; p0.VerticalWell[49] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0);
p0.Fault.resize(0);
}
p0.GridControl = 150.0;
p0.D = 2;
EnterSilentDllMode();
//网格计算
HX_NWTM_GRID(p1, p2, p0, "HX_license.dat");
HX_NWTM_MODEL_INPUT p3(p2);
HX_NWTM_MODEL_OUTPUT p4;
//模型设置
if (flowtype == 1) {
//油单相常数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] = 20; p3.Rate.qo[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0;
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.Base.Pi = 40.0;
p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 2) {
//油单相常数pvt五口井
p3.T = 1;
p3.Rate.t.resize(5);
p3.Rate.qo.resize(5);
p3.Rate.qw.resize(5);
p3.Rate.qg.resize(5);
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.t[1].resize(0);
p3.Rate.qo[1].resize(0);
p3.Rate.t[2].resize(3); p3.Rate.t[2][0] = 1000; p3.Rate.t[2][1] = 1000; p3.Rate.t[2][2] = 500;
p3.Rate.qo[2].resize(3); p3.Rate.qo[2][0] = 30; p3.Rate.qo[2][1] = 40; p3.Rate.qo[2][2] = 20;
p3.Rate.t[3].resize(2); p3.Rate.t[3][0] = 1500; p3.Rate.t[3][1] = 1000;
p3.Rate.qo[3].resize(2); p3.Rate.qo[3][0] = 30; p3.Rate.qo[3][1] = 20;
p3.Rate.t[4].resize(2); p3.Rate.t[4][0] = 1000; p3.Rate.t[4][1] = 1500;
p3.Rate.qo[4].resize(2); p3.Rate.qo[4][0] = -50; p3.Rate.qo[4][1] = -60;
p3.Pressure.t.resize(0);
p3.Pressure.p.resize(0);
p3.CS.C.resize(5);
p3.CS.C[0] = 0.1; p3.CS.C[1] = 0.1; p3.CS.C[2] = 0.1; p3.CS.C[3] = 0.1; p3.CS.C[4] = 0.1;
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.Base.Pi = 40.0;
p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 3) {
//油单相常数pvt五十口井
p3.T = 1;
dVec1 t;
t.push_back(12);
t.push_back(12);
t.push_back(12);
t.push_back(48);
t.push_back(72);
p3.Rate.t.assign(50, t);
dVec1 q;
q.push_back(158.98699999999999);
q.push_back(190.785);
q.push_back(222.58199999999999);
q.push_back(238.48099999999999);
q.push_back(0.0);
p3.Rate.qo.assign(50, q);
p3.CS.C = dVec1(50, 0.01);
p3.CS.S = dVec1(50, 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.miuo = dVec1(200, 0.79);//所有数为一个值
p3.Base.Pi = 40;
p3.Base.Cti = 0.43e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 4) {
//油单相变化pvt一口井
p3.T = 2;
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.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.Co = dVec1(200, 0.001);//数值随压力变化
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 5) {
//水单相常数pvt一口井
p3.T = 3;
p3.Rate.t.resize(1);
p3.Rate.qw.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -10; 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.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);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 6) {
//水单相变化pvt一口井
p3.T = 4;
p3.Rate.t.resize(1);
p3.Rate.qw.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -10; 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.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);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 7) {
//气单相变化pvt一口井
p3.T = 5;
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.qg[0].resize(2); p3.Rate.qg[0][0] = 50000; p3.Rate.qg[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.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);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 8) {
//气单相拟压力(一口井)
p3.T = 6;
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.qg[0].resize(2); p3.Rate.qg[0][0] = 50000; p3.Rate.qg[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.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);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
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;
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); }
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-4;
p3.Base.Swi = 0.2;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
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);
a[0] = -800; a[1] = 1000; a[2] = 0.01; k.push_back(a);
a[0] = 0; a[1] = 100; a[2] = 0.005; k.push_back(a);
a[0] = 500; a[1] = -1000; a[2] = 0.008; k.push_back(a);
a[0] = 1000; a[1] = 800; a[2] = 0.02; k.push_back(a);
HX_KRING_INPUT k0(0.01, 100, 1000, 0, p2.Trinodexy, k);
HX_KRING_OUTPUT k1;
HX_NWTM_KRINGING(k1, k0, "HX_license.dat");
p3.Base.k = k1.v;
dVec2 phi;
a[0] = -600; a[1] = 0; a[2] = 0.1; phi.push_back(a);
a[0] = 0; a[1] = 100; a[2] = 0.2; phi.push_back(a);
a[0] = 1000; a[1] = -200; a[2] = 0.05; phi.push_back(a);
HX_KRING_INPUT phi0(0.01, 100, 1000, 0, p2.Trinodexy, phi);
HX_KRING_OUTPUT phi1;
HX_NWTM_KRINGING(phi1, phi0, "HX_license.dat");
p3.Base.phi = phi1.v;
dVec2 h;
a[0] = -1000; a[1] = 100; a[2] = 10; h.push_back(a);
a[0] = 0; a[1] = 0; a[2] = 5; h.push_back(a);
a[0] = 1000; a[1] = 300; a[2] = 12; h.push_back(a);
HX_KRING_INPUT h0(0.01, 100, 1000, 0, p2.Trinodexy, h);
HX_KRING_OUTPUT h1;
HX_NWTM_KRINGING(h1, h0, "HX_license.dat");
p3.Base.h = h1.v;
/* std::ofstream file("k_phi_h.csv");
file << std::fixed << std::setprecision(15);
for (int i = 0; i < p2.Trinodexy.size(); ++i)
{
file << p2.Trinodexy[i][0] << "," << p2.Trinodexy[i][1] << "," << p3.Base.k[i] << "," << p3.Base.phi[i] << "," << p3.Base.h[i] <<"\n";
}
file.close();*/
}
//模型计算
HX_NWTM_MODEL(p4, p3, "HX_license.dat");
LeaveSilentDllMode();
std::cout << " " << name[iiii] << ":" << getPEBInum() << "," << getsolvetime() << "ms\n";
//数据导出
/*dVec2 pwf;
for (int i = 0; i < p4.t.size(); ++i) {
dVec1 a;
a.resize(p4.pw.size() + 1);
a[0] = p4.t[i];
for (int j = 1; j < a.size(); ++j) {
a[j] = p4.pw[j - 1][i];
}
pwf.push_back(a);
}
std::string filename = solvetypename[type] + name[iiii] + "pwf.csv";
Write2DVectorToCSV(pwf, filename);*/
/* Write1DVectorToCSV(p4.t, "t.csv");
Write2DVectorToCSV(p4.pw, "pw.csv");
Write2DVectorToCSV(p4.p, "C2.csv");
if (p3.T == 8) {
Write2DVectorToCSV(p4.So, "So.csv");
}*/
}
}
}
return 0;
}