#pragma once #ifndef PCH_H #define PCH_H #include "framework.h" #endif //PCH_H #define HX_API extern "C" _declspec(dllexport) #include #include #include #include #include #include #include #include #include #ifndef M_PI const double M_PI = acos(-1.0); #endif typedef std::vector>>dVec3; //ČýÎŹĘý×é:double typedef std::vector>dVec2; //śţÎŹĘý×é:double typedef std::vector>iVec2; //śţÎŹĘý×é:int typedef std::vectordVec1; //ҝΏĘý×é:double typedef std::vectoriVec1; //ҝΏĘý×é:int template void HX_copy(std::vector>>& p1, const std::vector>>& p0) { int m = p0.size(); p1.resize(m); for (int i = 0; i < m; ++i) { int n = p0[i].size(); p1[i].resize(n); for (int j = 0; j < n; ++j) { int l = p0[i][j].size(); p1[i][j].resize(l); for (int k = 0; k < l; ++k) { p1[i][j][k] = p0[i][j][k]; } } } } template void HX_copy(std::vector>& p1, const std::vector>& p0) { int m = p0.size(); p1.resize(m); for (int i = 0; i < m; ++i) { int n = p0[i].size(); p1[i].resize(n); for (int j = 0; j < n; ++j) { p1[i][j] = p0[i][j]; } } } template void HX_copy(std::vector& p1, const std::vector& p0) { int m = p0.size(); p1.resize(m); for (int i = 0; i < m; ++i) { p1[i] = p0[i]; } } template void HX_copy(std::vector>>& p1, T*** p0, int m, int* n, int l) { p1.resize(m); for (int i = 0; i < m; ++i) { p1[i].resize(n[i]); for (int j = 0; j < n[i]; ++j) { p1[i][j].resize(l); for (int k = 0; k < l; ++k) { p1[i][j][k] = p0[i][j][k]; } } } } template void HX_copy(std::vector>& p1, T** p0, int m, int n) { p1.resize(m); for (int i = 0; i < m; ++i) { p1[i].resize(n); for (int j = 0; j < n; ++j) { p1[i][j] = p0[i][j]; } } } template void HX_copy(std::vector& p1, T* p0, int m) { p1.resize(m); for (int i = 0; i < m; ++i) { p1[i] = p0[i]; } } //ľă˝áššĚĺ struct point { //ľă˝áššĚĺ double x; double y; //ľă×řąę point() { x = 0; y = 0; } ~point() {} void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; } void set(const point& p) { x = p.x; y = p.y; } }; struct point3 { double x; double y; double z; point3() { x = 0; y = 0; z = 0; } ~point3() {} point3(const dVec1&p) { x = p[0]; y = p[1]; z = p[2]; } point3(const double& x_ = 0, const double& y_ = 0, const double&z_ = 0) { x = x_; y = y_; z = z_;} void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; } void set(const point3&p) { x = p.x; y = p.y; z = p.z; } }; //Íř¸ń˝áššĚĺ struct cell { //Íř¸ńľĽÔŞ˝áššĚĺ std::vector p; iVec2 pindex; iVec1 isplot; cell() {} ~cell() {} }; //Íř¸ńË㡨ĘäČë˛ÎĘý˝áššĚĺ struct HX_NWTM_GRID_INPUT { // Íř¸ńťŽˇÖË㡨ĘäČë˛ÎĘý˝áššĚĺ 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 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, 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, FC} śŕźśŃšÁŃËŽĆ˝žŽĘýžÝ(wfÁѡě°ëżí,m,FC,Áѡ쾟Á÷ÄÜÁŚ,mD.m(FCÎŞ0ʹΪÎŢĎŢľźÁ÷ŁŹ´óÓÚ0ʹΪÓĐĎŢľźÁ÷)) dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} ĐąžŽĘýžÝ dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} śĎ˛ăĘýžÝ double GridControl; // Íř¸ń´óĐĄżŘÖƲÎĘý int D; // ÎŹĘý //ÄŹČĎłőĘźťŻ HX_NWTM_GRID_INPUT() { dVec1 a(3), b(4), c(5), d(6); 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[1] = b; b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; Boundary[2] = b; b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; Boundary[3] = b; VerticalWell.resize(3); a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a; a[0] = 1000; a[1] = 1000; a[2] = 0.1; VerticalWell[1] = a; a[0] = -1000; a[1] = -1000; a[2] = 0.1; VerticalWell[2] = a; HorizontalWell.resize(0); FractureVerticalWell.resize(1); 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[0].resize(3, dVec1(5)); d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d; d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d; 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); Fault.resize(1); b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; Fault[0] = b; GridControl = 150.0; D = 2; } ~HX_NWTM_GRID_INPUT() {} }; //Íř¸ńË㡨Ęäłö˛ÎĘý˝áššĚĺ(ťćÍźÓĂ) struct HX_NWTM_GRID_OUTPUT1 { cell TRI_cell; //Čý˝ÇĐÎÍř¸ń cell PEBI_cell; //PEBIÍř¸ń HX_NWTM_GRID_OUTPUT1() {} ~HX_NWTM_GRID_OUTPUT1() {} }; //Íř¸ńË㡨Ęäłö˛ÎĘý˝áššĚĺ(ÄŁĐÍÓĂ) struct HX_NWTM_GRID_OUTPUT2 { dVec2 Trinodexy; dVec1 Area; dVec2 D; struct { int n; dVec2 XiLinw; dVec2 lw; dVec2 dw; dVec1 rw; iVec2 inwell; dVec1 dwell; } ZhiJingNeiBianJie; struct { int n; dVec2 XiLinf; dVec2 lf; dVec2 df; dVec1 xf; iVec2 infra; iVec1 nf; iVec1 jjf; iVec1 jjfl; dVec1 lfcd; iVec2 infra1; dVec2 lf1; dVec2 df1; } LieFengJingNeiBianJie; struct { int n; dVec2 XiLinh; dVec2 lh; dVec2 dh; dVec2 dsxf; iVec2 inhor; iVec1 nhor; dVec2 areah; iVec2 inhor1; iVec2 nh; iVec2 jjh; dVec2 hfcd; iVec2 jjhl; iVec2 jjh2; iVec2 inhor2; dVec2 lh1; dVec2 dh1; } DuoJiYaLieShuiPingJingNeiBianJie; struct { int n; dVec2 WaiBianh; dVec2 WaiBianl; dVec2 WaiBiand; } WaiBianJie; struct { int n; dVec2 faultb1; dVec2 faultb2; dVec2 faultl1; dVec2 faultd1; } NeiBuDuanCeng; struct { iVec1 ia; iVec1 ja; iVec2 nzeros; int numk; } YuChuLiJuZhen; HX_NWTM_GRID_OUTPUT2() {} ~HX_NWTM_GRID_OUTPUT2() {} }; //KRINGING˛ĺÖľĘäČë˛ÎĘý˝áššĚĺ struct HX_KRING_INPUT { double nugget; //żé˝đÖľ:ąíĘžżŐźäľăÔÚÁăžŕŔë´ŚľÄąäŇěłĚśČŁŹź´˛âÁżÎó˛îşÍĐĄÓÚ˛ÉŃůłßśČľÄËćťúąäŇěÖŽşÍ double sill; //ťų̊־:ąíĘžąä˛îşŻĘýËćžŕŔëÔöźÓśřÇ÷ÓÚÎČś¨ľÄźŤĎŢÖľŁŹˇ´ÓłÇřÓňťŻąäÁżľÄ×ÜąäŇěłĚśČ double range; //ąäłĚ:ąíĘžżŐźäĎŕšŘĐÔľÄÓĐЧžŕŔ륣ľąÁ˝ľăźäžŕŔ볏šý range ĘąŁŹËüĂÇÖŽźä˛ťÔŮžßÓĐżŐźäĎŕšŘĐÔ double model; //ąä˛îşŻĘýÄŁĐÍ:Ö¸ś¨ąä˛îşŻĘýľÄĘýѧĐÎĘ˝ŁŹĂčĘöżŐźäĎŕšŘĐÔËćžŕŔëľÄąäťŻšćÂÉ{, , } //¸ß˚ģĐÍSPHERICAL(0)ŁşĎŕšŘĐÔËćžŕŔëÔöźÓłĘÖ¸ĘýËĽźőŁŹĘĘÓĂÓÚÁŹĐřĐÔ˝ĎÇżľÄąäÁż //Ö¸ĘýÄŁĐÍEXPONENTIAL(1)ŁşĎŕšŘĐÔżěËŮËĽźőŁŹĘĘÓĂÓÚžÖ˛żąäŇěĐԽϴóľÄąäÁż //Çň×´ÄŁĐÍGAUSSIAN(2)ŁşÔÚąäłĚÄÚłĘĹ×ÎďĎßąäťŻŁŹłŹšýąäłĚşóĎŕšŘĐÔÎŞÁă dVec2 p; //˛ĺÖľľă dVec2 v; // ~HX_KRING_INPUT() {} HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0) { nugget = nugget0; sill = sill0; range = range0; model = model0; p = p0; v = v0; } }; //KRINGING˛ĺÖľĘäłö˛ÎĘý˝áššĚĺ struct HX_KRING_OUTPUT { dVec1 v; HX_KRING_OUTPUT() {} ~HX_KRING_OUTPUT() {} }; //ĘýÖľĘÔžŽÄŁĐÍÇó˝âĆ÷ĘäČë˛ÎĘý˝áššĚĺ struct HX_NWTM_MODEL_INPUT { int T; //1:ÓÍľĽĎೣĘýpvt; 2:ÓÍľĽĎŕąäťŻpvt; 3:ËŽľĽĎೣĘýpvt; 4:ËŽľĽĎŕąäťŻpvt; 5:ĆřľĽĎŕąäťŻpvt; 6:ĆřľĽĎŕÄâŃšÁŚ; 7:ÓÍĆřÁ˝Ďŕ; 8:ÓÍËŽÁ˝Ďŕ; 9:ĆřËŽÁ˝Ďŕ; 10:ÓÍĆřËŽČýĎŕ HX_NWTM_GRID_OUTPUT2 GRID; struct Rate //Á÷ÁżĘýžÝ { dVec2 t; //Ęąźä, h [ŇťżÚžŽŇť×éĘý] dVec2 qo; //ÓÍÁ÷Áż,m^3/d [ŇťżÚžŽŇť×éĘý] dVec2 qg; //ĆřÁ÷Áż,m^3/d [ŇťżÚžŽŇť×éĘý] dVec2 qw; //ËŽÁ÷Áż,m^3/d [ŇťżÚžŽŇť×éĘý] }Rate; struct Pressure //ŃšÁŚĘýžÝ { dVec2 t; //Ęąźä, h [ŇťżÚžŽŇť×éĘý] dVec2 p; //ŃšÁŚ, MPa [ŇťżÚžŽŇť×éĘý] }Pressure; struct CS //žŽ´˘ąíƤĘýžÝ { dVec1 C; //žŽ´˘, m^3/MPa [ŇťżÚžŽŇť¸öĘý] dVec1 S; //ąíƤ, [ŇťżÚžŽŇť¸öĘý] }CS; struct PVT //Á÷ĚĺĐÔÖĘĘýžÝ { dVec1 p; //ŃšÁŚ, MPa double pb; //ąĽşÍŃšÁŚ, MPa dVec1 Rso; //ČÜ˝âĆřÓÍąČ, m^3/m^3 dVec1 Bo; //ÓÍĚĺťýĎľĘý, m^3/m^3 dVec1 Co; //ÓÍŃšËőĎľĘý, 1/MPa dVec1 miuo; //ÓÍŐłśČ, mPaĄ¤s dVec1 rouo; //ÓÍĂÜśČ, kg/m^3 dVec1 Rv; //ÄýÎöÓÍĆřąČ, m^3/m^3 dVec1 Bg; //ĆřĚĺťýĎľĘý, m^3/m^3 dVec1 Cg; //ĆřŃšËőĎľĘý, 1/MPa dVec1 miug; //ĆřŐłśČ, mPaĄ¤s dVec1 roug; //ĆřĂÜśČ, kg/m^3 dVec1 Z; //ĆřĆŤ˛îŇň×Ó, 1 dVec1 Rsw; //ČÜ˝âĆřËŽąČ, m^3/m^3 dVec1 Bw; //ËŽĚĺťýĎľĘý, m^3/m^3 dVec1 Cw; //ËŽŃšËőĎľĘý, 1/MPa dVec1 miuw; //ËŽŐłśČ, mPaĄ¤s dVec1 rouw; //ËŽĂÜśČ, kg/m^3 dVec1 V; //Îü¸˝ĆřÁż, m^3/kg dVec1 k_kinitial; //Éř͸ÂĘąČ, 1 dVec1 Cf_Cfinitial; //ŃŇĘŻŃšËőĎľĘýąČ, 1 dVec1 So; //ÓÍąĽşÍśČ dVec1 Kro; //ÓÍĎŕśÔÉř͸ÂĘ dVec1 Sg; //ĆřąĽşÍśČ dVec1 Krg; //ĆřĎŕśÔÉř͸ÂĘ dVec1 Sw; //ËŽąĽşÍśČ dVec1 Krw; //ËŽĎŕśÔÉř͸ÂĘ }PVT; struct Base //ťů´ĄĘýžÝ { double Pi; //łőʟњÁŚ, MPa double Cti; //×ŰşĎŃšËőĎľĘý, 1/MPa double Cf; //ŃŇĘŻŃšËőĎľĘý, 1/MPa double Soi; //łőĘźşŹÓÍąĽşÍśČ double Sgi; //łőĘźşŹĆřąĽşÍśČ double Swi; //łőĘźşŹËŽąĽşÍśČ dVec1 k; //Éř͸ÂĘ, D [Ňť¸öÍř¸ńľĽÔŞŇť¸öÖľ] dVec1 phi; //ż×ĎśśČ, 1 [Ňť¸öÍř¸ńľĽÔŞŇť¸öÖľ] dVec1 h; //´˘˛ăşńśČ, m [Ňť¸öÍř¸ńľĽÔŞŇť¸öÖľ] double d; //ĘąźäÔöł¤Ö¸Ęý double dt_Min; //×îĐĄĘąźäźä¸ô, h double dt_Max; //×î´óĘąźäźä¸ô, h }Base; //łőĘźťŻ HX_NWTM_MODEL_INPUT() {} ~HX_NWTM_MODEL_INPUT() {} HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0) { T =1; GRID = p0; Rate.t.resize(5); Rate.qo.resize(5); Rate.qw.resize(5); Rate.qg.resize(5); Rate.t[0].resize(2); Rate.t[0][0] = 2000; Rate.t[0][1] = 500; Rate.qo[0].resize(2); Rate.qo[0][0] = 10; Rate.qo[0][1] = 0; Rate.qw[0].resize(2); Rate.qw[0][0] = 2; Rate.qw[0][1] = 0; Rate.qg[0].resize(2); Rate.qg[0][0] = 20000; Rate.qg[0][1] = 0; Rate.t[1].resize(0); Rate.qo[1].resize(0); Rate.qw[1].resize(0); Rate.qg[1].resize(0); Rate.t[2].resize(3); Rate.t[2][0] = 1000; Rate.t[2][1] = 1000; Rate.t[2][2] = 500; Rate.qo[2].resize(3); Rate.qo[2][0] = 30; Rate.qo[2][1] = 40; Rate.qo[2][2] = 20; Rate.qw[2].resize(3); Rate.qw[2][0] = 3; Rate.qw[2][1] = 4; Rate.qw[2][2] = 2; Rate.qg[2].resize(3); Rate.qg[2][0] = 30000; Rate.qg[2][1] = 40000; Rate.qg[2][2] = 20000; Rate.t[3].resize(2); Rate.t[3][0] = 1500; Rate.t[3][1] = 1000; Rate.qo[3].resize(2); Rate.qo[3][0] = 30; Rate.qo[3][1] = 20; Rate.qw[3].resize(2); Rate.qw[3][0] = 5; Rate.qw[3][1] = 2; Rate.qg[3].resize(2); Rate.qg[3][0] = 50000; Rate.qg[3][1] = 20000; Rate.t[4].resize(2); Rate.t[4][0] = 1000; Rate.t[4][1] = 1500; Rate.qo[4].resize(2); Rate.qo[4][0] = -50; Rate.qo[4][1] = -60; Rate.qw[4].resize(2); Rate.qw[4][0] = -2; Rate.qw[4][1] = -5; Rate.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000; Pressure.t.resize(0); Pressure.p.resize(0); CS.C.resize(5); CS.C[0] = 0.1; CS.C[1] = 0.1; CS.C[2] = 0.1; CS.C[3] = 0.1; CS.C[4] = 0.1; CS.S.resize(5); CS.S[0] = 0.1; CS.S[1] = 0.1; CS.S[2] = 0.1; CS.S[3] = 0.1; CS.S[4] = 0.1; PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); } PVT.pb = 40.0; PVT.Rso = dVec1(200, 0); PVT.Bo = dVec1(200, 1.2); PVT.Co = dVec1(200, 5e-4); PVT.miuo = dVec1(200, 0.5); PVT.rouo = dVec1(200, 800); PVT.Rv = dVec1(200, 0); PVT.Bg = dVec1(200, 5e-3); PVT.Cg = dVec1(200, 2e-2); PVT.miug = dVec1(200, 2e-2); PVT.roug = dVec1(200, 200); PVT.Z = dVec1(200, 1); PVT.Rsw = dVec1(200, 0); PVT.Bw = dVec1(200, 1.05); PVT.Cw = dVec1(200, 1e-4); PVT.miuw = dVec1(200, 0.8); PVT.rouw = dVec1(200, 1000); PVT.V = dVec1(200, 0); PVT.k_kinitial = dVec1(200, 1); PVT.Cf_Cfinitial = dVec1(200, 1); PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); } PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); } PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); } PVT.Sg = dVec1(100, 0); PVT.Krg = dVec1(100, 0); PVT.Sw = dVec1(100, 0); Base.Pi = 40.0; Base.Cti = 1e-3; Base.Cf = 1e-4; Base.Soi = 0.8; Base.Sgi = 0.0; Base.Swi = 0.2; Base.k = dVec1(p0.Trinodexy.size(), 0.001); Base.phi = dVec1(p0.Trinodexy.size(), 0.1); Base.h = dVec1(p0.Trinodexy.size(), 10); Base.d = 1.05; Base.dt_Min = 0.0025; Base.dt_Max = 12.5; } }; //ĘýÖľĘÔžŽÄŁĐÍÇó˝âĆ÷Ęäłö˛ÎĘý˝áššĚĺ struct HX_NWTM_MODEL_OUTPUT { dVec1 t; //Ęąźä, h dVec2 pw; //žŽľ×ŃšÁŚ, MPa [ŇťżÚžŽŇť×éĘý] dVec2 p; //ŃšÁڎ֞ź, MPa [Ňť¸öĘąźäŇť×éĘý] dVec2 So; //ÓÍąĽşÍśČˇÖ˛ź [Ňť¸öĘąźäŇť×éĘý] dVec2 Sg; //ĆřąĽşÍśČˇÖ˛ź [Ňť¸öĘąźäŇť×éĘý] dVec2 Sw; //ËŽąĽşÍśČˇÖ˛ź [Ňť¸öĘąźäŇť×éĘý] dVec2 k; //Éř͸Âʡֲź,mD [Ňť¸öĘąźäŇť×éĘý] HX_NWTM_MODEL_OUTPUT() {} ~HX_NWTM_MODEL_OUTPUT() {} }; HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //ĘýÖľĘÔžŽÍř¸ń˝ÓżÚ HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //ĘýÖľĘÔžŽˇÇžůÖĘĐÔźĆËă˝ÓżÚ HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //ĘýÖľĘÔžŽÄŁĐÍÇó˝âĆ÷˝ÓżÚ