#include"pch.h" void Write2DVectorToCSV(const std::vector>& 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& 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(); } } int main() { HX_NWTM_GRID_INPUT p0; HX_NWTM_GRID_OUTPUT1 p1; HX_NWTM_GRID_OUTPUT2 p2; //不同井型算例 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; //非均质性 int feijunzhi = 0;//0为不考虑储层非均质,1为考虑储层非均质 //不同井型设置 dVec1 a(3), b(4), c(5); 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); c[0] = -200; c[1] = 0; c[2] = 200; c[3] = 0; c[4] = 0.05; p0.FractureVerticalWell[0] = c; 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(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.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); c[0] = -200; c[1] = -200; c[2] = 200; c[3] = -200; c[4] = 0.05; p0.FractureVerticalWell[0] = c; 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.InclinedWell.resize(0); p0.Fault.resize(1); c[0] = -500; c[1] = 1000; c[2] = 500; c[3] = 500; p0.Fault[0] = c; } 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; //网格计算 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] = 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.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] = 10; 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] = 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.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.Base.Pi = 40.0; p3.Base.Cf = 1e-3; 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"); //数据导出 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; }