📄 boastview.cpp
字号:
facz=1.0;
if(i>1 && i<ii)
facx=4.*dx[i][j][k]/(2.*dx[i][j][k]+dx[i+1][j][k]+dx[i-1][j][k]);
if(j>1 && j<jj)
facy=4.*dy[i][j][k]/(2.*dy[i][j][k]+dy[i][j+1][k]+dy[i][j-1][k]);
if(k>1 && k<kk)
facz=4.*dz[i][j][k]/(2.*dz[i][j][k]+dz[i][j][k+1]+dz[i][j][k-1]);
a1[i][j][k]=facx*kx[i][j][k]*dy[i][j][k]*dz[i][j][k];
a2[i][j][k]=facy*ky[i][j][k]*dx[i][j][k]*dz[i][j][k];
a3[i][j][k]=facz*kz[i][j][k]*dx[i][j][k]*dy[i][j][k];
}
if(ii==1) goto Mark501;
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=2;i<=ii;i++)
tx[i][j][k]=.012656*a1[i-1][j][k]*a1[i][j][k]/(dx[i-1][j][k]*a1[i][j][k]
+dx[i][j][k]*a1[i-1][j][k]);
Mark501:
if(jj==1) goto Mark551;
for(k=1;k<=kk;k++)
for(j=2;j<=jj;j++)
for(i=1;i<=ii;i++)
ty[i][j][k]=.012656*a2[i][j-1][k]*a2[i][j][k]/(dy[i][j-1][k]*a2[i][j][k]
+dy[i][j][k]*a2[i][j-1][k]);
Mark551:
if(kk==1) goto Mark660;
for(k=2;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=1;i<=ii;i++)
tz[i][j][k]=.012656*a3[i][j][k-1]*a3[i][j][k]/(dz[i][j][k-1]*a3[i][j][k]
+dz[i][j][k]*a3[i][j][k-1]);
Mark660:
/*
fprintf(fw," i j k a1 a2 a3 tx ty tz\n");
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=1;i<=ii;i++)
fprintf(fw,"%5d%5d%5d %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n",i,j,k,a1[i][j][k],
a2[i][j][k],a3[i][j][k],tx[i][j][k],ty[i][j][k],tz[i][j][k]);
*/
int NUMTX,NUMTY,NUMTZ,ITCODE,I,J,K,L;
fscanf(fr,"%s",ssn);
fprintf(fw,"%s\n",ssn);
fscanf(fr,"%d",&NUMTX);
fscanf(fr,"%d",&NUMTY);
fscanf(fr,"%d",&NUMTZ);
fscanf(fr,"%d",&ITCODE);
if(NUMTX==0) goto M100;
fprintf(fw,"**********TRANSMISSIBILITY (TX) NODE MODIFICATIONS\n");
fprintf(fw,"********** I J K NEW TX VALUE\n");
for( L=1;L<=NUMTX;L++)
{
fscanf(fr,"%d",&I);
fscanf(fr,"%d",&J);
fscanf(fr,"%d",&K);
fscanf(fr,"%f",&tx[I][J][K]);
fprintf(fw,"%d %d %d %f\n",I,J,K,tx[I][J][K]);
}
M100:
if(NUMTY==0)goto lgz110;
fprintf(fw,"**********TRANSMISSIBILITY (TY) NODE MODIFICATIONS\n");
fprintf(fw,"********** I J K NEW TX VALUE\n");
for(L=1;L<=NUMTY;L++)
{
fscanf(fr,"%d",&I);
fscanf(fr,"%d",&J);
fscanf(fr,"%d",&K);
fscanf(fr,"%f",&ty[I][J][K]);
fprintf(fw,"%d %d %d %f\n",I,J,K,ty[I][J][K]);
}
lgz110:
if(NUMTZ==0)goto lgz120;
fprintf(fw,"**********TRANSMISSIBILITY (TZ) NODE MODIFICATIONS\n");
fprintf(fw,"********** I J K NEW TX VALUE\n");
for(L=1;L<=NUMTY;L++)
{
fscanf(fr,"%d",&I);
fscanf(fr,"%d",&J);
fscanf(fr,"%d",&K);
fscanf(fr,"%f",&tz[I][J][K]);
fprintf(fw,"%d %d %d %f\n",I,J,K,tz[I][J][K]);
}
lgz120:
return;
}
/*------------------- pvt data ---------------------*/
void CBOASTView::table(float sat[maxpvt],float krot[maxpvt],float krwt[maxpvt]
,float krgt[maxpvt],float pcowt[maxpvt],float pcgot[maxpvt],float pot[maxpvt]
,float muot[maxpvt],float bot[maxpvt],float bopt[maxpvt],float rsot[maxpvt],
float rsopt[maxpvt],float pwt[maxpvt],float muwt[maxpvt],float bwt[maxpvt],float bwpt[maxpvt],
float rswt[maxpvt],float rswpt[maxpvt],
float pgt[maxpvt],float mugt[maxpvt],float bgt[maxpvt],float bgpt[maxpvt],float crt[maxpvt])
{
int i,j,k;
char words[maxword];
float cpress=(float)0.0068948,div;
/**** relative permeability & capillary pressure table--*/
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
for(i=1;i<=25;i++)
{
fscanf(fr,"%f%f%f%f%f%f",&sat[i],&krot[i],&krwt[i],&krgt[i],&pcowt[i],&pcgot[i]);
fprintf(fw,"%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n",sat[i],krot[i],krwt[i],krgt[i],pcowt[i],pcgot[i]);
pcowt[i]=pcowt[i]/cpress;
pcgot[i]=pcgot[i]/cpress;
if(sat[i]>=1.10) { msat=i; break; }
}
/**** bubble point & maximum pressures------------*/
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
fscanf(fr,"%f%f%f%f%f%d",&pbo,&vslope,&bslope,&rslope,&pmaxt,&ireprs);
fprintf(fw,"%8.4f%8.4f%8.4f%8.4f%8.4f%5d\n",pbo,vslope,bslope,rslope,pmaxt,ireprs);
pbo=pbo/cpress;
pmaxt=pmaxt/cpress;
vslope=vslope*cpress;
bslope=bslope*cpress;
rslope=rslope*cpress;
/*--------------- oil data table-------------------------*/
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
for(i=1;i<=25;i++)
{ fscanf(fr,"%f%f%f%f",&pot[i],&muot[i],&bot[i],&rsot[i]);
fprintf(fw,"%10.4f%10.4f%10.4f%10.4f\n",pot[i],muot[i],bot[i],rsot[i]);
rsot[i]=0.17809*rsot[i];
pot[i]=pot[i]/cpress;
if(pot[i]>=pmaxt) { mpot=i; break;}
}
/*--------------- water data table-------------------------*/
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
for(i=1;i<=25;i++)
{ fscanf(fr,"%f%f%f%f",&pwt[i],&muwt[i],&bwt[i],&rswt[i]);
fprintf(fw,"%10.4f%10.4f%10.4f%10.4f\n",pwt[i],muwt[i],bwt[i],rswt[i]);
rswt[i]=0.17809*rswt[i];
pwt[i]=pwt[i]/cpress;
if(pwt[i]>=pmaxt) { mpwt=i; break;}
}
/*--------------- water data table-------------------------*/
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
for(i=1;i<=25;i++)
{ fscanf(fr,"%f%f%f%f",&pgt[i],&mugt[i],&bgt[i],&crt[i]);
fprintf(fw,"%10.4f%10.4f%10.4f%10.4f\n",pgt[i],mugt[i],bgt[i],crt[i]);
pgt[i]=pgt[i]/cpress;
crt[i]=crt[i]*cpress;
if(pgt[i]>=pmaxt) { mpgt=i; break;}
}
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
fscanf(fr,"%f%f%f",&rhosco,&rhoscw,&rhoscg);
fprintf(fw,"%10.4f%10.4f%10.4f%\n",rhosco,rhoscw,rhoscg);
rhosco=rhosco/0.01602;
rhoscw=rhoscw/0.01602;
rhoscg=rhoscg/0.01602;
/**** calculate slopes dbo/dp, drso/dp, dbw/dp, drsw/dp, dbg/dp */
fprintf(fw,"%s\n","calculate slopes oil p B dbo/dp, drsot/dp");
for(i=2;i<=mpot;i++)
{
div=1.0/(pot[i]-pot[i-1]);
bopt[i]=(bot[i]-bot[i-1])*div;
rsopt[i]=(rsot[i]-rsot[i-1])*div;
fprintf(fw,"%10.4f%10.4f%10.4f%10.4f%10.4f\n",pot[i]*cpress,bot[i],bopt[i]/cpress,
rsot[i],rsopt[i]/cpress );
}
fprintf(fw,"%s\n","calculate slopes water p B dbo/dp, rso drsot/dp");
for(i=2;i<=mpwt;i++)
{
div=1.0/(pwt[i]-pwt[i-1]);
bwpt[i]=(bwt[i]-bwt[i-1])*div;
rswpt[i]=(rswt[i]-rswt[i-1])*div;
fprintf(fw,"%10.4f%10.4f%10.4f%10.4f%10.4f\n",pwt[i]*cpress,bwt[i],bwpt[i]/cpress,
rswt[i],rswpt[i]/cpress);
}
fprintf(fw,"%s\n","calculate slopes water p B dbo/dp");
for(i=2;i<=mpgt;i++)
{
bgpt[i]=(bgt[i]-bgt[i-1])/(pgt[i]-pgt[i-1]);
fprintf(fw,"%10.4f%10.4f%10.4f\n",pgt[i]*cpress,bgt[i],bgpt[i]/cpress);
}
bgpt[1]=bgpt[2];
bopt[1]=bopt[2];
bwpt[1]=bwpt[2];
rswpt[1]=rswpt[2];
rsopt[1]=rsopt[2];
/* initialize bubble point pressure array */
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=1;i<=ii;i++)
pbot[i][j][k]=pbo;
return;
}
/**** establish initial conditions */
void CBOASTView::uinit1()
{
int i,j,k;
char words[maxword];
float cpress=(float)0.0068948;
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++) {
for(i=1;i<=ii;i++)
{ fscanf(fr,"%f",&pn[i][j][k]);
fprintf(fw,"%8.2f",pn[i][j][k]);
if(i%10==0) fprintf(fw,"\n");
pn[i][j][k]=pn[i][j][k]/cpress;
}
fprintf(fw,"\n");
}
/**** initialize n+1 pressure array. */
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=1;i<=ii;i++)
p[i][j][k]=pn[i][j][k];
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++) {
for(i=1;i<=ii;i++)
{ fscanf(fr,"%f",&so[i][j][k]);
fprintf(fw,"%8.2f",so[i][j][k]);
if(i%10==0) fprintf(fw,"\n");
}
fprintf(fw,"\n");
}
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++) {
for(i=1;i<=ii;i++)
{ fscanf(fr,"%f",&sw[i][j][k]);
fprintf(fw,"%8.2f",sw[i][j][k]);
if(i%10==0) fprintf(fw,"\n");
}
fprintf(fw,"\n");
}
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++) {
for(i=1;i<=ii;i++)
{ sg[i][j][k]=1.0-so[i][j][k]-sw[i][j][k];
if(sg[i][j][k]<0.0) sg[i][j][k]=0.0;
fprintf(fw,"%8.2f",sg[i][j][k]);
if(i%10==0) fprintf(fw,"\n");
son[i][j][k]=so[i][j][k];
swn[i][j][k]=sw[i][j][k];
sgn[i][j][k]=sg[i][j][k];
}
fprintf(fw,"\n");
}
return;
}
/*----------------- read well data ---------------*/
void CBOASTView::nodes()
{
int j,k,iq3,lay;
char words[maxword];
fscanf(fr,"%s",words);
fprintf(fw,"%s\n",words);
fscanf(fr,"%d",&nvqn);
if(nvqn==0) return;
for(j=1;j<=nvqn;j++)
{
fscanf(fr,"%s%d%d%d%d%d%f%f%f%f",wellid[j],&iqn1[j],&iqn2[j],&iqn3[j],&layer[j],&kip[j],
&qvo[j],&qvw[j],&qvg[j],&qvt[j]);
/* fprintf(fw,"%10s%5d%5d%5d%5d%5d%10.2f%10.2f%10.2f%10.2f\n",wellid[j],iqn1[j],iqn2[j],
iqn3[j],layer[j],kip[j],qvo[j],qvw[j],qvg[j],qvt[j]);
*/
iq3=iqn3[j];
lay=iq3+(layer[j]-1);
for(k=iq3;k<=lay;k++)
{ fscanf(fr,"%f%f",&pid[j][k],&pwf[j][k]);
fprintf(fw,"%5d%5d%5d%10.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n",iqn1[j],iqn2[j],k,
qvo[j],qvw[j],qvg[j],qvt[j],pwf[j][k],pid[j][k]);
pid[j][k]=pid[j][k]/0.3048;
pwf[j][k]=pwf[j][k]/0.0068948;
}
qvo[j]=qvo[j]*1000./(158.988);
// qvo[j]=qvo[j]*1000./(158.988*rhosco*0.01602);
qvw[j]=qvw[j]*1000./(158.988*rhoscw*0.01602);
qvg[j]=qvg[j]/0.02832;
qvt[j]=qvt[j]*1000/158.988;
}
return;
}
/*.... ......................................................interp--*/
float CBOASTView::interp(float x[maxpvt],float y[maxpvt],int n,float xo,float yo)
/* float x[maxpvt],y[maxpvt],xo,yo;
int n; */
{
int i;
if(xo>=x[n]){ yo=y[n]; return(yo);}
for(i=2;i<=n;i++)
{
if(xo>=x[i]) continue;
yo=y[i-1]+(xo-x[i-1])*(y[i]-y[i-1])/(x[i]-x[i-1]);
break;
}
return(yo);
}
/*.... ........................................................intpvt--*/
float CBOASTView::intpvt(float bpt,float rm,float x[maxpvt],float y[maxpvt],
int n,float xo,float yo)
/*
float bpt,x[maxpvt],y[maxpvt],xo,yo,rm;
int n; */
{
int i;
float yobp;
if(xo>bpt) goto M100;
if(xo>=x[n]) {yo=y[n]; return(yo);}
for(i=2;i<=n;i++)
{
if(xo>=x[i]) continue;
yo=y[i-1]+(xo-x[i-1])*(y[i]-y[i-1])/(x[i]-x[i-1]);
break;
}
return(yo);
M100:
for(i=2;i<=n;i++)
{
if(bpt>=x[i]) continue;
yobp=y[i-1]+(bpt-x[i-1])*(y[i]-y[i-1])/(x[i]-x[i-1]);
yo=yobp+rm*(xo-bpt);
break;
}
return(yo);
}
/*.... ..........................................................prt*/
void CBOASTView::prtps(int nloop,int ipmap,int isomap,int iswmap,int isgmap,int ipbmap,
float delt0,float eti)
/*int nloop,ipmap,isomap,iswmap,isgmap,ipbmap;
float delt0,eti; */
{
float ppm=0.;
float som=0.;
float swm=0.;
float sgm=0.;
float dpo,dso,dsw,dsg,gorm;
int ipm=0,jpm=0,kpm=0;
int iom=0,jom=0,kom=0;
int iwm=0,jwm=0,kwm=0;
int igm=0,jgm=0,kgm=0;
int i,j,k,nlm;
for(k=1;k<=kk;k++)
for(j=1;j<=jj;j++)
for(i=1;i<=ii;i++)
{
dpo=p[i][j][k]-pn[i][j][k];
dso=so[i][j][k]-son[i][j][k];
dsw=sw[i][j][k]-swn[i][j][k];
dsg=sg[i][j][k]-sgn[i][j][k];
if(fabs(dpo)<=fabs(ppm)) goto M210;
ppm=dpo;
ipm=i;
jpm=j;
kpm=k;
M210:
if(fabs(dso)<=fabs(som)) goto M220;
som=dso;
iom=i;
jom=j;
kom=k;
M220:
if(fabs(dsw)<=fabs(swm)) goto M230;
swm=dsw;
iwm=i;
jwm=j;
kwm=k;
M230:
if(fabs(dsg)<=fabs(sgm)) continue;
sgm=dsg;
igm=i;
jgm=j;
kgm=k;
}
nlm=nloop-1;
gorm=1000.*gor;
fprintf(fw,"\n\n");
fprintf(fw,"----------------------------the--summary--report--------------------------------\n\n");
fprintf(fw,"elapsed time (days) : %8.2f, time step number : %8d time step size : %8.2f\n\n",eti,nlm,delt0);
fprintf(fw,"current avg pressure: %8.2f, previous pressure: %8.2f max place:(%2d %2d %2d)%8.4f\n\n",
pavg*0.0068948,pavg0*0.0068948,ipm,jpm,kpm,ppm*0.0068948);
fprintf(fw,"oil dsmax:(%2d %2d %2d):%8.4f water dsmax:(%2d %2d %2d):%8.4f gas dsmax:(%2d %2d %2d):%8.4f\n\n",
iom,jom,kom,som,iwm,jwm,kwm,swm,igm,jgm,kgm,sgm);
fprintf(fw,"oil production rate: %8.2f cum oil production : %8.2e\n",opr*158.988*rhosco*0.01602/1000.,
cop*158.988*rhosco*0.01602/1000.);
fprintf(fw,"water product rate: %8.2f cum water product : %8.2e\n",wpr*158.988*rhoscw*0.01602/1000.,
cwp*158.988*rhoscw*0.01602/1000.);
fprintf(fw,"gas production rate: %8.2f cum gas production : %8.2e\n\n",gpr*0.02832,cgp*0.02832);
fprintf(fw,"gas injection rate: %10.2f cum gas injection : %10.2e\n",gir*0.02832,cgi*0.02832);
fprintf(fw,"water injection rate: %10.2f cum water injection : %10.2e\n\n",wir*158.988*rhoscw*0.01602/1000.,
cwi*rhoscw*0.01602*158.988/1000.);
fprintf(fw,"oil material balance: %10.4f water mater balance : %10.4f gas material balance:%10.4f\n\n",
mbeo,mbew,mbeg);
fprintf(fw,"production wor (m^3): %10.4f cum wor : %10.4f\n",wor,cwor);
fprintf(fw,"production gor (m^3): %10.4f cum gor : %10.4f\n\n\n",gorm*0.1781,cgor*0.1781);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -