⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skindoc.cpp

📁 石油行业油井损害软件,有详细的油井损害模型,对石油建模有重要帮助
💻 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 + -