📄 skindoc.cpp
字号:
// SkinDoc.cpp : implementation of the CMyDoc class
//
#include "stdafx.h"
#include "储层损害矿场评价软件.h"
#include "SkinDoc.h"
#include "InputControl.h"
#include "FormationParameter.h"
#include "FluidParameter.h"
#include "shotParameter.h"
#include "WellParameter.h"
#include "ProduceParameter.h"
#include "ProduceDlg.h"
#include "PageSetupDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyDoc
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
//{{AFX_MSG_MAP(CMyDoc)
ON_COMMAND(ID_INPUTDATA_CONTROL, OnInputdataControl)
ON_COMMAND(ID_INPUTDATA_DICENG, OnInputdataDiceng)
ON_COMMAND(ID_INPUTDATA_JINGSHEN, OnInputdataJingshen)
ON_COMMAND(ID_INPUTDATA_LIUTI, OnInputdataLiuti)
ON_COMMAND(ID_INPUTDATA_SHENGCHAN, OnInputdataShengchan)
ON_COMMAND(ID_INPUTDATA_SHEKONG, OnInputdataShekong)
ON_COMMAND(ID_INPUTDATA_CHANLIANG, OnInputdataChanliang)
ON_UPDATE_COMMAND_UI(ID_INPUTDATA_CHANLIANG, OnUpdateInputdataChanliang)
ON_COMMAND(ID_SUNHAI_BIAOPI, OnSunhaiBiaopi)
ON_COMMAND(ID_SUNHAI_SHENDU, OnSunhaiShendu)
ON_COMMAND(ID_SUNHAI_ZENGCHAN, OnSunhaiZengchan)
ON_UPDATE_COMMAND_UI(ID_SUNHAI_ZENGCHAN, OnUpdateSunhaiZengchan)
ON_UPDATE_COMMAND_UI(ID_SUNHAI_SHENDU, OnUpdateSunhaiShendu)
ON_UPDATE_COMMAND_UI(ID_SUNHAI_BIAOPI, OnUpdateSunhaiBiaopi)
ON_COMMAND(ID_FILE_PAGE_SETUP, OnFilePageSetup)
ON_UPDATE_COMMAND_UI(ID_INPUTDATA_SHEKONG, OnUpdateInputdataShekong)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDoc construction/destruction
CMyDoc::CMyDoc()
{
// TODO: add one-time construction code here
bCtlPara=bFluidPara=bWellPara=bProducePara=bProductPara=FALSE;
bShotPara=bFormPara=FALSE;
for(int i=0; i<50; i++)
t[i]=q[i]=0;
nq = 1;
OPER = 0;
GraphRect.SetRect(300, 500, 1700, 1200);
}
CMyDoc::~CMyDoc()
{
}
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
// 初始化所有变量
bCtlPara=bFluidPara=bWellPara=bProducePara=bProductPara=FALSE;
bShotPara=bFormPara=FALSE;
s=wsl=0;
rb=rw=0;
rkfpc=1;
h=hp=0;
phi=0.2;
ct=0.001;
alf=0.001;
ca=31.62;
dwtob1=dwtob2=0;
hkx=hky=vk=hkout=hk=0.0;
md=npf=n1b=n2b=nvq=nan=0;
nq=2;
d=belt=0;
rhls=vis=bfv=0;
n=0;
lphi=90;
flp=0.5;
rp=0.006;
gk=10000;
fls=0;
hnslop=0;
qc=0;
tp=0;
pwf=0;
pi=0;
sd=rs=dpr0=spt=spf=snd= sca=s1b=s2b=scp= sws=san=svq=0;
for(int i=0; i<50; i++)
dt[i]=t[i]=q[i]=0;
for(i=0; i<50; i++)
Wellname[i]=0;
OPER = 0; // 未做任何操作
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMyDoc serialization
void CMyDoc::Serialize(CArchive& ar)
{
double tsum;
char line[256];
char lines[][100] = {
"md npf n1b n2b nan nvq nq\n",
"mhorner(MP/cyc) qc(m3/d) tp(hr) pwf(MPa) pi(MPa)\n",
"h(m) hp(m) phi ct(1/Mpa) alf(1/Mpa)\n",
"s wsl rw(m) rb(m) rkfpc\n",
"D(d/m3) belt(1/m) rhs(g/cm3), vis(mPa.s), bfv\n",
"CA d1(m) d2(m)\n",
"N, lphi, lp(m), rp(m) kg(um2)\n",
"kx(um2) ky(um2) kz(um2) kout(um2)\n",
"dt(i)(hr) q(i)(m3/d) (i=1,nq)\n",
"wellname\n"
};
if (ar.IsStoring())
{
// TODO: add storing code here
ar.WriteString(lines[0]);
sprintf(line,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n", md, npf,
n1b, n2b, nan, nvq, nq);
ar.WriteString(line);
ar.WriteString(lines[1]);
sprintf(line,"%lf\t%lf\t%lf\t%lf\t%lf\n", hnslop,
qc, tp, pwf, pi);
ar.WriteString(line);
ar.WriteString(lines[2]);
sprintf(line,"%lf\t%lf\t%lf\t%lf\t%lf\n", h, hp, phi, ct,alf); //
ar.WriteString(line);
ar.WriteString(lines[3]);
double wslo=wsl/3.1415926*180.0;
sprintf(line,"%lf\t%lf\t%lf\t%lf\t%lf\n", s, wslo, rw,
rb, rkfpc);
ar.WriteString(line);
ar.WriteString(lines[4]);
sprintf(line,"%lf\t%le\t%lf\t%lf\t%lf\n", d, belt,
rhls, vis, bfv);
ar.WriteString(line);
ar.WriteString(lines[5]);
sprintf(line,"%lf\t%lf\t%lf\n", ca, dwtob1, dwtob2);
ar.WriteString(line);
ar.WriteString(lines[6]);
sprintf(line,"%lf\t%lf\t%lf\t%lf\t%lf\n", n, lphi, flp, rp, gk);
ar.WriteString(line);
ar.WriteString(lines[7]);
sprintf(line,"%lf\t%lf\t%lf\t%lf\n", hkx, hky, vk,
hkout);
ar.WriteString(line);
ar.WriteString(lines[8]);
for(int i=1; i<=nq; i++)
{
sprintf(line,"%lf\t%lf\n", dt[i], q[i]);
ar.WriteString(line);
}
ar.WriteString(lines[9]);
sprintf(line, "%s\n", Wellname);
ar.WriteString(line);
}
else
{
// TODO: add loading code here
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%d%d%d%d%d%d%d", &md, &npf,
&n1b, &n2b, &nan, &nvq, &nq);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf%lf", &hnslop,
&qc, &tp, &pwf, &pi);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf%lf", &h, &hp, &phi, &ct, &alf);//, ;
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf%lf", &s, &wsl,
&rw, &rb, &rkfpc);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf%lf", &d, &belt,
&rhls, &vis, &bfv);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf", &ca, &dwtob1, &dwtob2);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf%lf", &n, &lphi,
&flp, &rp, &gk);
ar.ReadString(line, 255);
ar.ReadString(line, 255);
sscanf(line,"%lf%lf%lf%lf", &hkx, &hky, &vk, &hkout);
ar.ReadString(line, 255);
tsum=0.0;
for(int i=1; i<=nq; i++)
{
ar.ReadString(line, 255);
sscanf(line,"%lf%lf",&dt[i], &q[i]);
tsum=tsum+dt[i];
t[i]=tsum;
}
Wellname[0]=0;
if(ar.ReadString(line, 255))
{
if(ar.ReadString(line, 255))
sscanf(line, "%s", Wellname);
}
bCtlPara=bFluidPara=bWellPara=bProducePara=bProductPara=TRUE;
bShotPara=bFormPara=TRUE;
t[0]=0.0;
q[0]=0.0;
dt[0]=0.0;
wsl=wsl*3.1415926/180.0;
hk=sqrt(hkx*hky);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMyDoc diagnostics
#ifdef _DEBUG
void CMyDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CMyDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyDoc commands
void CMyDoc::OnProperties()
{
// TODO: The property sheet attached to your project
// via this function is not hooked up to any message
// handler. In order to actually use the property sheet,
// you will need to associate this function with a control
// in your project such as a menu item or tool bar button.
CInputControl propSheet;
propSheet.DoModal();
// This is where you would retrieve information from the property
// sheet if propSheet.DoModal() returned IDOK. We aren't doing
// anything for simplicity.
}
void CMyDoc::OnInputdataControl()
{
// TODO: Add your command handler code here
CInputControl myDlg;
if(bCtlPara) //控制数据
{
myDlg.m_Page1.m_md = md; //非达西流系数的取值方式
myDlg.m_Page1.m_npf = npf; //井的类型
myDlg.m_Page1.m_Wellname = Wellname;
myDlg.m_Page2.m_n1b = n1b; //边界类型
myDlg.m_Page2.m_n2b = n2b; //边界类型
myDlg.m_Page3.m_nq = nq; //产量变化次数
// myDlg.m_Page4.m_nrs = (BOOL) nrs;
myDlg.m_Page3.m_nvq = nvq; //是否考虑产量变化
myDlg.m_Page3.m_nan = nan; //地层特性
}
if(myDlg.DoModal()==IDOK)
{
md = myDlg.m_Page1.m_md;
npf = myDlg.m_Page1.m_npf;
strcpy(Wellname, myDlg.m_Page1.m_Wellname);
n1b = myDlg.m_Page2.m_n1b;
n2b = myDlg.m_Page2.m_n2b;
nq = myDlg.m_Page3.m_nq;
// nrs = (int) myDlg.m_Page4.m_nrs;
nvq = myDlg.m_Page3.m_nvq;
nan = myDlg.m_Page3.m_nan;
bCtlPara = TRUE;
if(npf==0) // 裸眼井
bShotPara = TRUE;
else
bShotPara = FALSE;
}
}
void CMyDoc::OnInputdataDiceng()
{
// TODO: Add your command handler code here
CFormationParameter myDlg;
// common/formp/h,hp,phi,ct,ca,dwtob1,dwtob2,
if(bFormPara) //地层参数
{
myDlg.m_ca = ca; // 形状系数
myDlg.m_ct = ct; //地层综合压缩系数
myDlg.m_d1 = dwtob1; //边界距离1
myDlg.m_d2 = dwtob2; //边界距离2
myDlg.m_h = h; //地层厚度
myDlg.m_hkout = hkout; //外圈渗透率
myDlg.m_hkx = hkx; //X方向渗透率
myDlg.m_hky = hky; //Y方向渗透率
myDlg.m_hkz = vk; //Z方向渗透率
myDlg.m_phi = phi; //孔隙度
myDlg.m_hp = hp; //部分打开厚度
myDlg.m_alf = alf; //储层压力敏感系数
}
myDlg.bBound1 = (BOOL)n1b;
myDlg.bBound2 = (BOOL)n2b;
if(myDlg.DoModal()==IDOK)
{
dwtob1 = myDlg.m_d1;
dwtob2 = myDlg.m_d2;
hkout = myDlg.m_hkout;
hkx = myDlg.m_hkx;
hky = myDlg.m_hky;
vk = myDlg.m_hkz;
ca = myDlg.m_ca;
ct = myDlg.m_ct;
alf = myDlg.m_alf;
h = myDlg.m_h;
phi = myDlg.m_phi;
hp = myDlg.m_hp;
bFormPara = TRUE;
hk=sqrt(hkx*hky); //水平渗透率
}
}
void CMyDoc::OnInputdataJingshen()
{
// TODO: Add your command handler code here
CWellParameter myDlg;
if(bWellPara)
{
myDlg.m_ro = rb; //两相区外半径
myDlg.m_rw = rw; //井筒半径
myDlg.m_s = s; //总表皮系数
myDlg.m_wsc = wsl/3.1415926*180.0;
myDlg.m_rkfpc = rkfpc; //两相与单相渗透率比值
}
if(myDlg.DoModal()==IDOK)
{
rb = myDlg.m_ro;
rkfpc = myDlg.m_rkfpc;
rw = myDlg.m_rw;
s = myDlg.m_s;
wsl = myDlg.m_wsc*3.1415926/180.0; //井斜角,单位度
bWellPara = TRUE;
}
}
void CMyDoc::OnInputdataLiuti()
{
// TODO: Add your command handler code here
CFluidParameter myDlg;
if(bFluidPara) //流体参数
{
myDlg.m_belt = belt; //紊流系数
myDlg.m_B = bfv; //体积系数
myDlg.m_D = d ; //非达西流系数
myDlg.m_rhs = rhls; //密度
myDlg.m_vis = vis; //粘度
}
if(myDlg.DoModal()==IDOK)
{
belt = myDlg.m_belt;
bfv = myDlg.m_B;
d = myDlg.m_D;
rhls = myDlg.m_rhs;
vis = myDlg.m_vis;
bFluidPara = TRUE;
}
}
void CMyDoc::OnInputdataShengchan()
{
// TODO: Add your command handler code here
CProduceParameter myDlg;
if(bProducePara) //产量数据
{
myDlg.m_hnslop = hnslop; //霍纳斜率
myDlg.m_tp = tp; //生产时间,单位小时
myDlg.m_pi = pi; //地层静压力 Mpa
myDlg.m_pwf = pwf; // 井底流压
myDlg.m_qc = qc; //不考虑产量变化时的恒定产量
}
if(nvq==0)
myDlg.bDingChan = TRUE;
else
myDlg.bDingChan = FALSE;
if(myDlg.DoModal()==IDOK)
{
hnslop = myDlg.m_hnslop;
tp = myDlg.m_tp;
pi = myDlg.m_pi;
pwf = myDlg.m_pwf;
qc = myDlg.m_qc;
bProducePara = TRUE;
if(nvq == 0) // 若为常产量,则已输入产量数据
bProductPara = TRUE;
}
}
void CMyDoc::OnInputdataShekong()
{
// TODO: Add your command handler code here
CShotParameter myDlg;
if(bShotPara) //射孔参数
{
myDlg.m_lp = flp; //射孔深度
myDlg.m_gk = gk; //砾石渗透率
myDlg.m_lphi = lphi; //相位角
myDlg.m_N = n; //射孔总数
myDlg.m_rp = rp; //子弹半径
}
if(myDlg.DoModal()==IDOK)
{
flp = myDlg.m_lp;
gk = myDlg.m_gk;
lphi = myDlg.m_lphi;
n = myDlg.m_N;
rp = myDlg.m_rp;
bShotPara = TRUE;
}
}
void CMyDoc::OnInputdataChanliang()
{
// TODO: Add your command handler code here
CProduceDlg myDlg;
BeginWaitCursor();
myDlg.RowNumber = (long)nq;
if(bProductPara)
{
myDlg.bProdData = TRUE;
for(int i=1; i<=nq; i++)
{
myDlg.t[i] = dt[i];
myDlg.q[i] = q[i];
}
}
if(myDlg.DoModal()==IDOK)
{
double tsum=0;
for(int i=1; i<=nq; i++)
{
dt[i] = myDlg.t[i];
q[i] = myDlg.q[i];
tsum=tsum+dt[i];
t[i]=tsum;
}
bProductPara = TRUE;
}
EndWaitCursor();
}
void CMyDoc::OnUpdateInputdataChanliang(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(nvq==0)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CMyDoc::OnSunhaiBiaopi() // 表皮系数分解
{
// TODO: Add your command handler code here
deskin();
calrs();
qvsds();
OPER=BIAOPI;
UpdateAllViews(NULL);
}
void CMyDoc::OnSunhaiShendu() // 损害半径
{
// TODO: Add your command handler code here
OPER=SHENDU;
UpdateAllViews(NULL);
}
void CMyDoc::OnSunhaiZengchan() // 计算增产率
{
// TODO: Add your command handler code here
OPER=ZENGCHAN;
UpdateAllViews(NULL);
}
void CMyDoc::OnUpdateSunhaiZengchan(CCmdUI* pCmdUI) // 计算增产率
{
// TODO: Add your command update UI handler code here
if( OPER >= BIAOPI)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CMyDoc::OnUpdateSunhaiShendu(CCmdUI* pCmdUI) // 损害半径
{
// TODO: Add your command update UI handler code here
if( OPER >= BIAOPI && sd > 0)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
OPER = 0; // 未做任何操作
return TRUE;
}
void CMyDoc::OnUpdateSunhaiBiaopi(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if( bCtlPara && bFluidPara && bWellPara && bProducePara
&& bProductPara && bShotPara && bFormPara )
pCmdUI->Enable(TRUE);
else
{
OPER = 0;
pCmdUI->Enable(FALSE);
}
}
void CMyDoc::OnFilePageSetup()
{
// TODO: Add your command handler code here
CPageSetupDlg myDlg;
myDlg.m_Left = GraphRect.left/10;
myDlg.m_Top = GraphRect.top/10;
myDlg.m_Right = GraphRect.right/10;
myDlg.m_Bottom = GraphRect.bottom/10;
if( myDlg.DoModal() == IDOK)
{
GraphRect.left = myDlg.m_Left * 10;
GraphRect.top = myDlg.m_Top * 10;
GraphRect.right = myDlg.m_Right * 10;
GraphRect.bottom = myDlg.m_Bottom * 10;
}
}
void CMyDoc::OnUpdateInputdataShekong(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(npf==0)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -