////////////////////////////////////////////////////////////////// /// /// 测录井信息综合平台 /// /// 编制:王卫 /// /// 版权:中国石化集团石油工程技术研究院 /// /// 2010年10月- /// // Depth.cpp : implementation file // #include "DepPairs.h" #include "MemRdWt.h" #include "math.h" #include "BaseFun.h" #include "geometryutils.h" #include #include "qapplication.h" #include int GetDepPairs(float* curve1,float stdep1,float endep1,float rlev1, float* curve2,float stdep2,float endep2,float rlev2,float cmins, float winLength,float stepLength, float searchLength, float *FirstDep, float *SecondDep, float *corc) { DepPairs depPairs(curve1,stdep1,endep1,rlev1, curve2,stdep2,endep2,rlev2,cmins, winLength,stepLength,searchLength); depPairs.FirstDep=FirstDep; depPairs.SecondDep=SecondDep; depPairs.corc=corc; float stdep=FirstDep[0]; float endep=SecondDep[0]; if(stdep==endep){ stdep=stdep1; endep=endep1; stdep=stdep1; if(stdep>stdep2) stdep=stdep2; endep=endep1; if(endepstdep2) stdep=stdep2; endep=endep1; if(endep-1&&index1>-1) { Slf_CURVE curve,curve1; well.GetCurveInfo(index,&curve); int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; float *buffer=new float[count+1]; well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); well1.GetCurveInfo(index1,&curve1); int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; float *buffer1=new float[count1+1]; well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); int num=getDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, FirstDep, SecondDep ); delete buffer; delete buffer1; return num; } return 0; } int AutoComp(char *Filename,char *Filename1,char *CurveName1,char *CurveName2, float cmins, float winLength,float stepLength, float searchLength, float *FirstDep, float *SecondDep, float *corc) { CMemRdWt well; if(!well.Open(Filename,CMemRdWt::modeRead)) { return 0; }; CMemRdWt well1; if(!well1.Open(Filename1,CMemRdWt::modeRead)) { return 0; } int index=well.OpenCurve(CurveName1); int index1=well1.OpenCurve(CurveName2); if(index>-1&&index1>-1) { Slf_CURVE curve,curve1; well.GetCurveInfo(index,&curve); int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; float *buffer=new float[count+1]; well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); well1.GetCurveInfo(index1,&curve1); int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; float *buffer1=new float[count1+1]; well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); int num=GetDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, cmins, winLength, stepLength, searchLength, FirstDep, SecondDep, corc ); delete buffer; delete buffer1; return num; } return 0; } bool AutoCompute(char *Filename,char *Filename1,char *CurveName1,char *CurveName2) { CMemRdWt well; if(!well.Open(Filename,CMemRdWt::modeRead)) { return false; }; CMemRdWt well1; if(!well1.Open(Filename1)) { return false; } int iIndex=well.OpenTable("OG_RESULT"); if(iIndex<0) { return false; } int index=well.OpenCurve(CurveName1); int index1=well1.OpenCurve(CurveName2); if(index1>-1&&index1>-1) { Slf_CURVE curve,curve1; well.GetCurveInfo(index,&curve); well1.GetCurveInfo(index1,&curve1); int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; float *buffer=new float[count+1]; int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; float *buffer1=new float[count1+1]; well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); float cmins=0.9; float winLength=4; float stepLength=0.5; float searchLength=8; float* FirstDep=new float[5000]; float* SecondDep=new float[5000]; float* corc=new float[5000]; int num=GetDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, cmins, winLength, stepLength, searchLength, FirstDep, SecondDep, corc ); delete buffer; delete buffer1; char buf[80]; LAYER_DATA m_Result; int iIndex1=well1.OpenTable("RESULT"); int len=well.GetTableRecordLength(iIndex); if (iIndex1 < 0) { iIndex1=well1.Open_Set_Table("RESULT",0,35, "NO,SDEP,EDEP,ZONE,RESULTNO,THICK,TT,MDEPTH1,MDEPTH2,MDEPTH3,MDEPTH4,MDEPTH5,MDEPTH6,MDEPTH7,MDEPTH8,MDEPTH9,MDEPTH10,OIL,POOROIL,OILWATER,WATEROIL,GAS,POORGAS,GASWATER,WATERGAS,DEST1,DEST2,DEST3,DEST4,DEST5,DEST6,DEST7,DEST8,DEST9,DEST10,SDEP1,EDEP1,SDEP2,EDEP2,SDEP3,EDEP3,SDEP4,EDEP4,SDEP5,EDEP5,SDEP6,EDEP6,SDEP7,EDEP7,SDEP8,EDEP8,SDEP9,EDEP9,SDEP10,EDEP10", "4,4,4,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,48,48,48,48,48,48,48,48,48,48,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段长度 "1,4,4,6,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段类型 "0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");//字段备注 } int iIndex2=well.OpenTable("RESULT"); if (iIndex2 < 0) { iIndex2=well.Open_Set_Table("RESULT",0,35, "NO,SDEP,EDEP,ZONE,RESULTNO,THICK,TT,MDEPTH1,MDEPTH2,MDEPTH3,MDEPTH4,MDEPTH5,MDEPTH6,MDEPTH7,MDEPTH8,MDEPTH9,MDEPTH10,OIL,POOROIL,OILWATER,WATEROIL,GAS,POORGAS,GASWATER,WATERGAS,DEST1,DEST2,DEST3,DEST4,DEST5,DEST6,DEST7,DEST8,DEST9,DEST10,SDEP1,EDEP1,SDEP2,EDEP2,SDEP3,EDEP3,SDEP4,EDEP4,SDEP5,EDEP5,SDEP6,EDEP6,SDEP7,EDEP7,SDEP8,EDEP8,SDEP9,EDEP9,SDEP10,EDEP10", "4,4,4,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,48,48,48,48,48,48,48,48,48,48,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段长度 "1,4,4,6,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段类型 "0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");//字段备注 } count=well.GetTableRecordCount(iIndex); well.SetTableRecordCount(iIndex2,count); well1.SetTableRecordCount(iIndex1,count); int j=0; for(int k=0;kcurve.EndDepth) { continue; } if(m_Result.EndDepthcurve.EndDepth) { continue; } well1.WriteTable(iIndex1,j+1,&buf); j++; } well1.SetTableRecordCount(iIndex1,j); well.CloseTable(iIndex); well1.CloseTable(iIndex1); well.CloseTable(iIndex2); char strName[256]; memset(strName, 0, sizeof (strName)); strcat(strName,"OG_RESULT1"); well1.EShiftTableDepth(strName, num,FirstDep,SecondDep); delete FirstDep; delete SecondDep; delete corc; return true; } return false; } //////////////////////////////////////////////////////////////////////////// // DepPairs对象 // 显示边框 // 构造函数 DepPairs::DepPairs(float* curve1,float stdep1,float endep1,float rlev1, float* curve2,float stdep2,float endep2,float rlev2,float cmins, float winLength,float stepLength, float searchLength) { Curve1.stdep=stdep1; Curve1.endep=endep1; Curve1.rlev=rlev1; Curve1.val=curve1; Curve2.stdep=stdep2; Curve2.endep=endep2; Curve2.rlev=rlev2; Curve2.val=curve2; // num=i; DepLevel=rlev1; if(DepLevel>rlev2) DepLevel=rlev2; StartDepth=stdep1; if(StartDepth>stdep2) StartDepth=stdep2; EndDepth=endep1; if(EndDepthx&&j>left ) j--; if(i<=j) { y=datx[i];datx[i]=datx[j];datx[j]=y; y=daty[i];daty[i]=daty[j];daty[j]=y; y=datc[i];datc[i]=datc[j];datc[j]=y; i++;j--; } }while(i<=j); if(leftxmax1) xmax1=val; val=Curve2.GetValue(tempdep); if(valxmax2) xmax2=val; k++; tempdep=sdeps + k * DepLevel; } if(xmin1==xmax1) { xmin1=0.; xmax1=1.; } if(xmin2==xmax2) { xmin2=0.; xmax2=1.; } return; } float DepPairs::ampl(int n,float *x) { int i; float xmin,xmax; xmin=9999.; xmax=-9999.; for(i=0;ixmax)xmax=x[i]; } return xmax-xmin; } float DepPairs::corr(int n,float *x,float *y,int size,int emp) { float sx,sy,xave,yave,sqx,sqy,sxy,dp,dx,dy,c; float r1,r2,amp1,amp2,ratio; int i; sx=0.; sy=0.; for(i=0;i=r2)ratio=r1; if(r1amp2)ratio=amp2; c=c*ratio; } return c; } void DepPairs::cor(int iwl,int isl,float *x,float *y,float *c,int size,int emp) { int i,ix=isl,iy; for(i=0;i<2*isl;i++) { ix=isl; iy=i; c[i]=corr(iwl,&x[ix],&y[iy],size,emp); } } double DepPairs::fun(DPoint &p1, DPoint &p2, DPoint &p3) { double s; s= (p2.x-p1.x)*(p3.y-p1.y)+(p1.y-p2.y)*(p3.x-p1.x); return s; } float DepPairs::act(float *x,int n,int way) { int i,i1,i2; float sum,sq,ave,z,sqd; sum=0.; for(i=0;i=n/2&&x[i]>=ave)i1++; if(i>=n/2&&x[i]=ave)i2++; if(ii1)z=-z; if(way==2&&i2<=i1)z=-z; return z; } void DepPairs::actvty(int iwl,int isl,float *dr,int way,float *x,float *c) { int n,n2,i; n= (int)(*dr / DepLevel); n2=n/2; n=2*n2+1; for(i=0;i= c[1] ) idir1 = idown; for(i=1;i= c[i+1] )idir2=idown; if( idir1 == idown && idir2 == iup ) idir1=idir2; if( idir1 == iup && idir2 == idown ) { xdep=depth; ydep=depth+(i-isl)*DepLevel; if ( c[i] >= 0.5) { fprintf(fp_temp,"%8.3f %8.3f %5.3f\n",ydep,xdep,c[i]); // break; } idir1=idir2; } } return 1; } int DepPairs::MMax(float ydep,float dep0,int isl,float *c,float cmins) { float xdep; int ss=-1; int n=1.5*isl+1; float maxcor=-99999; for(int i=0;imaxcor) { maxcor=c[i]; ss=i; } } if(ss>-1&&c[ss]>cmins) { xdep=dep0+ss*DepLevel; fprintf(fp_temp,"%8.3f %8.3f %5.3f\n",xdep,ydep,c[ss]); } return 1; } int DepPairs::signum(float x) { int y; y=0; if(x<0.)y=-1; if(x>0.)y=1; return y; } int DepPairs::optim(int n,float *x1,float *y1,float *c1,float cmins,float elast) { float xmax=999999.; int xnull=0; float tfine=0,check,diff=0,fcrif=0,fine=0,fmin=0; int i,iw,j,ip1,ip2,imin,nd,ids,nd1; n=1; float a,b,d; int aa=0; rewind(fp_temp); while(!feof(fp_temp)) { fscanf(fp_temp,"%f%f%f\n",&a,&b,&d); if(ipar) aa++; else if(d>=cmins) aa++; } if(aa<=0) return -1; float *x=new float[aa+1000]; float *y=new float[aa+1000]; float *c=new float[aa+1000]; float *f=new float[aa+1000]; int *ncs=new int[aa+1000]; rewind(fp_temp); while(!feof(fp_temp)) { if(fscanf(fp_temp,"%f%f%f\n",&x[n],&y[n],&c[n])!=3) { break; }; if(ipar) n++; else if(c[n]>=cmins) n++; } fclose(fp_temp); QString dir=GetLogdataPath(); dir+="\\temp"; CreateDir((char *)dir.toStdString().c_str()); dir+="\\admtemp"; fp_temp=fopen(dir.toStdString().c_str(),"w+"); if(ipar) { for(ip1=0;ip10;j--) { if(x[i]<=x[j]){ ncs[i]=1; break; } } if(x[i]-x[i-1]>0&&x[i]-x[i-1]<0.5)ncs[i]=1; if(!ncs[i]) { for(j=i+1;j=x[j]){ ncs[i]=1; break; } } } } rewind(fp_temp); j=0; for(int i=1;i=xmax&&ip1!=n-1) goto l2100; fmin=xmax; tfine=0.; for(iw=0;iw=xmax&&ip2!=0) goto l1900; if(tfine>fmin) goto l2000; if(x[ip1]fmin) goto l1900; fmin=fcrif; imin=ip2; l1900:; } l2000:; f[ip1]=fmin; ncs[ip1]=imin; l2100:; } nd=0; ids=n-1; while(1) { ids=ncs[ids]; if(ids==0) break; f[nd++]=ids; } for(i=0;i0&&s2<0||s1>0&&s2>0||s1<0&&s2>0){ continue; } spos[kk]=spos[i]; kk++; } } if(n<=0) kk=k; for(int i=0;iisl) len=isl; for(int m=spos[i];m0){ spos[i]=ppos-1; } } for(int i=0; i=n1) break; } float xmax=999999.,disp1,disp2,disp; int i,k,j; if(n<3) { delete x; delete y; delete c; delete spos; return -1; } i=-1; float v1,v2,v3; fclose(fp_temp); QString dir=GetLogdataPath(); dir+="\\temp"; CreateDir((char *)dir.toStdString().c_str()); dir+="\\admtemp"; fp_temp=fopen(dir.toStdString().c_str(),"w+"); while(1) { i=i+1; if(i>=n) break; disp1=y[i]-x[i]; disp2=y[i+1]-x[i+1]; if(disp1==disp2) { i+=2; for(j=i;j xxx[j5]) { tempf5 = xxx[i5]; xxx[i5] = xxx[j5]; xxx[j5] = tempf5; } } int DepPairs::GetCompare(int datn,float sdeps,float edeps,float* datx1,float* daty1,float* datc1,float cmins,float xelast) { float *x=new float[datn+10]; float *y=new float[datn+10]; float *c=new float[datn+10]; rewind(fp_temp); float wl2,xdr2; int num1,number,numt,i,iwl,isl,iwl2,istep,jsize,ixdr2,idr,idr2; int n1,kno; int cccc; if(wl==0)wl=10.; if(sl==0)sl=4.; if(step==0)step=1; if(dr1==0)dr1=3.; if(dr2==0)dr2=3.; if(type!=0 &&sl=datn) break; } fclose(fp_temp); QString dir=GetLogdataPath(); dir+="\\temp"; CreateDir((char *)dir.toStdString().c_str()); dir+="\\admtemp"; fp_temp=fopen(dir.toStdString().c_str(),"w+"); number = maxnum + 2 * isl+2*ixdr2; float *datx=new float[number+1]; float *daty=new float[number+1]; float *datc=new float[number+1]; cccc = 0; for(int j=0;jedeps) datx[k++]=-9999.0; else datx[k++]=datx1[pos]; } else datx[k++]=Curve1.GetValue(dep); } k=0; for(float dep=x[j]-isl*DepLevel/2;depedeps) daty[k++]=-9999.0; else daty[k++]=daty1[pos]; } else daty[k++]=Curve2.GetValue(dep); } iwl=(x[j+1]-x[j])/DepLevel; cor(iwl,isl,datx,daty,datc,size,emp); MMax(x[j],x[j]-isl*DepLevel/2,isl,datc,cmins); } datn=optim(0,datx1,daty1,datc1,cmins,xelast); delete x; delete y; delete c; return datn; } int DepPairs::joincurve(float sdeps,float edeps,float *datx1,float *daty1,float *datc1, float wl,float sl,float step,float dr1,float dr2, int type,int size,int way,int emp,int ipar, float cmins,float xelast) { float depth,depth1,dept,deps; float wl2,xdr2; int num1,number,numt,i,iwl,isl,iwl2,istep,jsize,ixdr2,idr,idr2; int n1,kno; int cccc; if(wl==0)wl=10.; if(sl==0)sl=4.; if(step==0)step=1; if(dr1==0)dr1=3.; if(dr2==0)dr2=3.; if(type!=0 &&slsetVisible(true); // ::GetProgressBar()->setRange(sdeps,edeps); // ::GetProgressBarHint()->setVisible(true); char showname[200]; sprintf(showname,"自动产生深度对比线..."); int datn=0; if(ipar){ // ::GetProgressBarHint()->setText("查找层界面...."); QApplication::processEvents(); datn=GetDots(n1,sdeps,edeps,DepLevel,datx1,1); // ::GetProgressBar()->setValue(sdeps+(edeps-sdeps)*0.1); QApplication::processEvents(); // ::GetProgressBarHint()->setText("开始地层对比..."); // ::GetProgressBar()->setValue(sdeps+(edeps-sdeps)*0.3); QApplication::processEvents(); datn=GetCompare(datn,sdeps,edeps,datx1,daty1,datc1,cmins,xelast); // ::GetProgressBar()->setValue(edeps); QApplication::processEvents(); } else{ float *datx=new float[number+1]; float *daty=new float[number+1]; float *datc=new float[number+1]; cccc = 0; for (i=0; isetValue(depth); // ::GetProgressBarHint()->setText(showname); QApplication::processEvents(); if(depth>edeps-wl2-sl-xdr2) { break; } if ( depth > depth1 ) { if ( numt > 0 ) { for(i=0;i0)datn=paral(datn,datx1,daty1,datc1,ipar); } fclose(fp_temp); // ::GetProgressBar()->setVisible(false); // ::GetProgressBarHint()->setVisible(false); QApplication::processEvents(); return datn; } int DepPairs::adm(float stem,float etem ,float cmins, float winLength,float stepLength, float searchLength, float *datx1,float *daty1,float *datc1 ) { char str[120]; int i; int datn; cmin = cmins; datn = joincurve(stem,etem,datx1,daty1,datc1, winLength,searchLength,stepLength,dr1,dr2,type,size, way,emp,ipar,cmins,elast); if ( datn < 0 ) { sprintf(str,"%f--%f层段相关性太差,相关系数均小于截止值%f ",stem,etem,cmins); QMessageBox::warning(nullptr, "提示", str); } else { float *datx,*daty,*datc; m_nDepPairsNum=0; datx = new float[datn+100]; if ( datx == NULL ) { QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); return m_nDepPairsNum; } daty = new float[datn+100]; if ( daty == NULL ) { QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); delete datx; return m_nDepPairsNum; } datc = new float[datn+100]; if ( datc == NULL ) { QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); delete datx; delete daty; return m_nDepPairsNum; } QString dir=GetLogdataPath(); dir+="\\temp"; CreateDir((char *)dir.toStdString().c_str()); dir+="\\admtemp"; fp_temp=fopen(dir.toStdString().c_str(),"rt"); if(fp_temp==NULL) { QMessageBox::warning(nullptr, "提示", "Not create file :admtemp !\n"); delete [] datx; delete [] daty; delete [] datc; QDir r; r.remove(dir.toStdString().c_str()); return -1; } i=0; while(!feof(fp_temp)) { fscanf(fp_temp,"%f%f%f",&datx[i],&daty[i],&datc[i]); i++; if(i>=datn) break; } if(!i) { QMessageBox::warning(nullptr, "提示", "自动对比文件读写错误!"); fclose(fp_temp); delete [] datx; delete [] daty; delete [] datc; QDir r; r.remove(dir.toStdString().c_str()); return -1; } datn=i; fclose(fp_temp); qs(datx,daty,datc,0,datn-1); if(last_edep!=stem) { float ddep=0; if(datn) { ddep=datx[0]-stem; FirstDep[m_nDepPairsNum]=daty[0]-ddep; } else FirstDep[m_nDepPairsNum]=stem; SecondDep[m_nDepPairsNum]=stem; corc[m_nDepPairsNum]=1.; m_nDepPairsNum++; } for(i=0;i