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

📄 uclass.pas

📁 测井储层敏感指数计算-对某一测井数据进行相应井段储层敏感性指数计算
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  Begin
    DiferAxis:=(Maximum-Minimum)*0.8;
    NewMin:=Chart1.MinYValue(Chart1.LeftAxis)+ScrollBar1.Position*DiferChart/100.0;
    NewMax:=Minimum+DiferAxis;
  end;
  for i:=1 to 84 do
   begin
      TmpChart:= FindComponent('chart'+IntToStr(i));
      if ( TmpChart <> nil ) then
      begin
         TChart(TmpChart).LeftAxis.SetMinMax(NewMin,NewMax);
      end
  end;

  ScrollBar1.Enabled:=true;
  BitBtn4.Enabled:=true;
  BitBtn6.Enabled:=true;
  if DiferChart/DiferAxis > 100  then
  BitBtn3.Enabled:=false;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
var i :longint;
var TmpChart :TComponent;
begin
  ScrollBar1.Position:=0;
  ScrollBar1.Enabled:=false;
  for i:=1 to 12 do
   begin
      TmpChart:= FindComponent('chart'+IntToStr(i));
      if ( TmpChart <> nil ) then
      begin
         TChart(TmpChart).LeftAxis.Automatic:=true;
      end
  end;

  BitBtn6.Enabled:=false;
  BitBtn4.Enabled:=false;
  BitBtn3.Enabled:=true;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
    s,str,WellTop,WellBottom,SqlString:string;
    ts:TStringList;
    i,j:integer;
begin
try
    //或取当前WellID和WellTop 做为后面查询条件
    s:=ComboBox1.Text;
    ts:=TStringList.Create;
    while Pos( '-',s) >0 do
    begin
      j:=POS( '-',s);
      str:=Copy(s,1,j-1);
      ts.Add(str);
      Delete(s,1,j);
    end;
    ts.Add(s);

    WellTop:=ts[1];
    WellBottom:=ts[2];

    //连接数据库,获取记录条数
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    SqlString:='select * from TbParameterTable where WellID='+WellID+' and DepthTop='+WellTop;
    ADOQuery1.SQL.Add(SqlString);
    ADOQuery1.ExecSQL;
    ADOQuery1.Open;

    if ADOQuery1.RecordCount=0 then
    begin
      //application.MessageBox('该深度段不存在常用测井曲线数据!', '系统提示', 0);
      exit;
    end;

    ADOQuery1.Recordset.MoveFirst;

    //参数显示
    Edit16.Text:=WellTop;
    Edit17.Text:=WellBottom;
    Edit1.Text:= ADOQuery1.Recordset.Fields['FDC'].Value;
    Edit2.Text:= ADOQuery1.Recordset.Fields['DCLN'].Value;
    Edit3.Text:= ADOQuery1.Recordset.Fields['DCLM'].Value;
    Edit4.Text:= ADOQuery1.Recordset.Fields['NCLN'].Value*100;
    Edit5.Text:= ADOQuery1.Recordset.Fields['NCLM'].Value*100;
    Edit6.Text:= ADOQuery1.Recordset.Fields['DGCL'].Value;
    Edit7.Text:= ADOQuery1.Recordset.Fields['PMAX'].Value*100;
    Edit8.Text:= ADOQuery1.Recordset.Fields['RW'].Value;
    Edit9.Text:= ADOQuery1.Recordset.Fields['P'].Value;
    Edit10.Text:= ADOQuery1.Recordset.Fields['GRAD'].Value;
    Edit11.Text:= ADOQuery1.Recordset.Fields['RDEP'].Value;
    Edit12.Text:= ADOQuery1.Recordset.Fields['HIMX'].Value;
    Edit13.Text:= ADOQuery1.Recordset.Fields['HIMN'].Value;
    Edit14.Text:= ADOQuery1.Recordset.Fields['CECMN'].Value;
    Edit15.Text:= ADOQuery1.Recordset.Fields['CECMX'].Value;
    if ADOQuery1.Recordset.Fields['GRSP'].Value=1 then
    begin
      radiobutton1.Checked:=true;
      radiobutton2.Checked:=false;
    end
    else if ADOQuery1.Recordset.Fields['GRSP'].Value=2 then
    begin
      radiobutton2.Checked:=true;
      radiobutton1.Checked:=false;
    end;

    //参数赋值
    P:=ADOQuery1.Recordset.Fields['P'].Value;
    FDC:=ADOQuery1.Recordset.Fields['FDC'].Value;
    HIMX:=ADOQuery1.Recordset.Fields['HIMX'].Value;
    HIMN:=ADOQuery1.Recordset.Fields['HIMN'].Value;
    CECMN:=ADOQuery1.Recordset.Fields['CECMN'].Value;
    CECMX:=ADOQuery1.Recordset.Fields['CECMX'].Value;
  
    DCLM:=ADOQuery1.Recordset.Fields['DCLM'].Value;
    DCLN:=ADOQuery1.Recordset.Fields['DCLN'].Value;
    NCLM:=ADOQuery1.Recordset.Fields['NCLM'].Value;
    NCLN:=ADOQuery1.Recordset.Fields['NCLN'].Value;
    DGCL:=ADOQuery1.Recordset.Fields['DGCL'].Value;
    PMAX:=ADOQuery1.Recordset.Fields['PMAX'].Value;
    RW:=ADOQuery1.Recordset.Fields['RW'].Value;
    BHT:=ADOQuery1.Recordset.Fields['BHT'].Value;
    GRAD:=ADOQuery1.Recordset.Fields['GRAD'].Value;
    RDEP:=ADOQuery1.Recordset.Fields['RDEP'].Value;

    DG:=ADOQuery1.Recordset.Fields['DG'].Value;
    DSH:=ADOQuery1.Recordset.Fields['DSH'].Value;
    NSH:=ADOQuery1.Recordset.Fields['NSH'].Value;
    NCL:=ADOQuery1.Recordset.Fields['NCL'].Value;
    DCL:=ADOQuery1.Recordset.Fields['DCL'].Value;
    CLMX:=ADOQuery1.Recordset.Fields['CLMX'].Value;
    FDMN:=ADOQuery1.Recordset.Fields['FDMN'].Value;
    BWMX:=ADOQuery1.Recordset.Fields['BWMX'].Value;
    BWMN:=ADOQuery1.Recordset.Fields['BWMN'].Value;
    RWCL:=ADOQuery1.Recordset.Fields['RWCL'].Value;
    DWB:=ADOQuery1.Recordset.Fields['DWB'].Value;

    //连接数据库,获取记录条数
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    SqlString:='select * from TbParameterCyqx where WellID='+WellID+ ' and Depth>='+WellTop+' and Depth<='+WellBottom;
    ADOQuery1.SQL.Add(SqlString);
    ADOQuery1.ExecSQL;
    ADOQuery1.Open;
    acount:=ADOQuery1.RecordCount;
    if acount=0 then
    begin
      application.MessageBox('该深度段不存在常用测井曲线数据!', '系统提示', 0);
      exit;
    end;

    SetLength(DEPTH,acount);
    SetLength(SP,acount);
    SetLength(GR,acount);
    SetLength(DEN,acount);
    SetLength(CNL,acount);

    SetLength(TMON,acount);
    SetLength(TGL,acount);
    SetLength(TLN,acount);
    SetLength(TILL,acount);

    SetLength(mTMON,acount);
    SetLength(mTGL,acount);
    SetLength(mTLN,acount);
    SetLength(mTILL,acount);

    SetLength(VSH,acount);
    SetLength(SVCL,acount);
    SetLength(mSVCL,acount);

    //变量赋值
    ADOQuery1.Recordset.MoveFirst;
    for i:=0 to acount-1 do
    begin
      DEPTH[i]:= ADOQuery1.Recordset.Fields['Depth'].Value;
      GR[i]:= ADOQuery1.Recordset.Fields['GR'].Value;
      SP[i]:= ADOQuery1.Recordset.Fields['SP'].Value;
      DEN[i]:= ADOQuery1.Recordset.Fields['DEN'].Value;
      CNL[i]:= ADOQuery1.Recordset.Fields['CNL'].Value/100;
      ADOQuery1.Recordset.MoveNext ;
    end;

   //计算泥质相对体积
    if SHF1=1 then
    begin
    //保证第一个值为非法数据
    For i:= 0 To acount - 1   do
    begin
      if GR[i]=-9999 then continue
      else
      begin
       GMXI := GR[i];
       GMNI := GR[i];
       break;
      end;
    end;

    //计算最大值、最小值并排除非法数据
    For i:= 0 To acount - 1   do
    begin
      if GR[i]=-9999 then continue;
      If GR[i] > GMXI Then GMXI := GR[i];
      If GR[i] < GMNI Then GMNI := GR[i];
    end;

    end;
    if SHF1=2 then
    begin
    //保证第一个值为非法数据
    For i:= 0 To acount - 1   do
    begin
      if GR[i]=-9999 then continue
      else
      begin
       GMXI := SP[i];
       GMNI := SP[i];
       break;
      end;
    end;

    //计算最大值、最小值并排除非法数据
    For i:= 0 To acount - 1   do
    begin
      if GR[i]=-9999 then continue;
      If SP[i] > GMXI Then GMXI := SP[i];
      If SP[i] < GMNI Then GMNI := SP[i];
    end;
    end;

    //清空表格
    Chart1.Series[0].Clear ;
    Chart1.Series[1].Clear ;
    Chart2.Series[0].Clear ;
    Chart2.Series[1].Clear ;
    Chart3.Series[0].Clear ;
    Chart3.Series[1].Clear ;
    Chart4.Series[0].Clear ;
    Chart4.Series[1].Clear ;

    Chart1.Series[0].Active:=false;
    Chart1.Series[1].Active:=false;
    Chart2.Series[0].Active:=false;
    Chart2.Series[1].Active:=false;
    Chart3.Series[0].Active:=false;
    Chart3.Series[1].Active:=false;
    Chart4.Series[0].Active:=false;
    Chart4.Series[1].Active:=false;

    GroupBox5.Visible:=true;
    for i:=0 to acount-1 do
    begin
    //对曲线表中存在的非法数据项予以剔除
      if  (DEPTH[i] =-9999) or
          (GR[i]=-9999) or
          (SP[i]=-9999) or
          (DEN[i]=-9999) or
          (CNL[i]=-9999)  then continue;

      if SHF1=1 then
        VSH[i]:=(GR[i]-GMNI)/(GMXI-GMNI);
      if SHF1=2 then
        VSH[i]:=(SP[i]-GMNI)/(GMXI-GMNI);
      //敏感度指数计算
      //第一步:计算视流体密度
      DFA1:=DG*CNL[i]/(CNL[i]+DG-DEN[i]);    //1。DFA1
      DFA2:=DG*(CNL[i]-VSH[i]*NSH)/(CNL[i]-VSH[i]*NSH+DG-(DEN[i]+VSH[i]*(DG-DSH)));  //2。DFA2
      VCL:=((DG-1)*CNL[i]+DEN[i]-DG)/((DG-1)*NCL-DCL+DG); //3。粘土含量VCL初值
      DFMN:=DFA1-FDC*(DFA1-DFA2)*(VCL+0.1)/(VSH[i]+0.1); //4。经验性估算视流体密度最小值
      //5。由用户提供的粘土含量上限调整DFMN
      if VCL>CLMX then DFMN:=1;
      if (VCL>=0.01) and (VCL<=CLMX) then DFMN:=DFMN+(VCL-0.01)*(1-DFMN)/(CLMX-0.01);
      //6。由用户提供的流体密度最小值进一步调整DFMN
      if (DFMN<FDMN) then DFMN:=FDMN;
      if (DFA2<DFMN) then DFA2:=DFMN;

      //计算视流体密度
      DFA:=DFA2;

      //第二步:计算粘土点参数
      RNCL:=(CNL[i]-DFA*(DG-DEN[i]-VCL*(DG-DCLN))/(DG-DFA))/VCL;
      ENCL:=(CNL[i]-DFA*(DG-DEN[i]-VCL*(DG-DCLM))/(DG-DFA))/VCL;
      FAI:=(DG-DEN[i])/(DG-DFA)-VCL*(DG-DCLN)/(DG-DFA);
      SL2:=(DCLN-DCLM)/(RNCL-ENCL);//直线ER斜率
      SDCL:=SL2*(RNCL-ENCL)+DCLM;//计算出的粘土点参数
      BW:=VCL*(DGCL-SDCL)/(DGCL-DWB);
      SNCL:=NCLM+(BW-BWMN)*(NCLN-NCLM)/(BWMX-BWMN);

      //第三步:计算粘土含量
      SVCL[i]:=(DG*CNL[i]+(DEN[i]-2.65-CNL[i])*DFA)/((DG-DFA)*SNCL-(DG-DCL)*DFA);

      //第四步:计算粘土阳离子交换能力CEC
      //1. 计算粘土水化水含盐量
      PT:=(BW*VSH[i]+(1-VSH[i])*PMAX);
      PE:=PT-BW;
      RWE:=PT*RW*RWCL/(RWCL*PE+RW*BW);
      RTEMP:=BHT-GRAD*(DEPTH[i]-RDEP)/100;
      RF75:=RWE*(RTEMP+7)/82;
      C:=power(10,((3.526-Log10(RF75-0.012))/0.955))/(58.453*1000);
      //2. 计算粘土水化水质量
      SDG:=DGCL*SVCL[i]+(1-SVCL[i])*DG;
      BW:=BW*DWB/(SDG*(1-PT));
      CEC:=BW*1000/(0.084*power(C,-0.5)+0.22);

      //第五步:计算不同粘土矿物的相对含量  存储于粘土矿物分析数据表中
      //1、伊-蒙百分含量
      TMI:=(HIMX-FAI)/(HIMX-HIMN);
      //2、蒙脱石百分含量
      TMON[i]:=TMI*(CEC-CECMN)/(CECMX-CECMN);
      //3、伊利石百分含量
      TILL[i]:=TMI-TMON[i];
      //4、高岭石、绿泥石百分含量
      TCHK:=1-TMI;
      //5、高岭石百分含量
      TGL[i]:=P*TCHK/100;
      //6、绿泥石百分含量
      TLN[i]:=(1-P/100)*TCHK;

       //对于计算得到的非法数据跳过    折线中间断线
       if (TMON[i]<0) or (TMON[i]>1) then
       begin
         Chart1.Series[0].AddNullXY(trunc(TMON[i]*100),DEPTH[i],'');
         continue;
       end;
       if (TILL[i]<0) or (TILL[i]>1) then
       begin
         Chart2.Series[0].AddNullXY(trunc(TILL[i]*100),DEPTH[i],'');
         continue;
       end;
       if (TGL[i]<0)  or (TGL[i]>1) or (TLN[i]<0)  or (TLN[i]>1) then
       begin
         Chart3.Series[0].AddNullXY(trunc((TLN[i]+TGL[i])*100),DEPTH[i],'');
         continue;
       end;
       if (SVCL[i]<0) or (SVCL[i]>1) then
       begin
         Chart4.Series[0].AddNullXY(trunc(SVCL[i]*100),DEPTH[i],'');
         continue;
       end;
       

       if  (DEPTH[i] <= strtofloat(WellBottom)) and (DEPTH[i] >= strtofloat(WellTop))  then
       begin
        Chart1.Series[0].AddXY(trunc(TMON[i]*100),DEPTH[i]);
        Chart2.Series[0].AddXY(trunc(TILL[i]*100),DEPTH[i]);
        Chart3.Series[0].AddXY(trunc((TLN[i]+TGL[i])*100),DEPTH[i]);
        Chart4.Series[0].AddXY(trunc(SVCL[i]*100),DEPTH[i]);
       end ;
       
      //进度条显示
      ProgressBar1.Position := i ;

    end;

    GroupBox5.Visible:=false;

      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      SqlString:='select * from TbDataNtkw where WellID='+WellID+ ' and Depth>='+WellTop+' and Depth<='+WellBottom+ ' order by Depth';
      ADOQuery1.SQL.Add(SqlString);
      ADOQuery1.ExecSQL;
      ADOQuery1.Open;

      if ADOQuery1.RecordCount<>0 then
      begin
      //画实验分析数据
      ADOQuery1.Recordset.MoveFirst;
      for i:=0 to  ADOQuery1.RecordCount-1 do
      begin
        Chart1.Series[1].AddXY(trunc(strtofloat(ADOQuery1.Recordset.Fields['mtshl'].Value)),ADOQuery1.Recordset.Fields['Depth'].Value);
        Chart2.Series[1].AddXY(trunc(ADOQuery1.Recordset.Fields['ylshl'].Value),ADOQuery1.Recordset.Fields['Depth'].Value);
        Chart3.Series[1].AddXY(trunc((ADOQuery1.Recordset.Fields['glshl'].Value+ADOQuery1.Recordset.Fields['lnshl'].Value)),ADOQuery1.Recordset.Fields['Depth'].Value);
        Chart4.Series[1].AddXY(trunc(ADOQuery1.Recordset.Fields['ntzhl'].Value),ADOQuery1.Recordset.Fields['Depth'].Value);

        ADOQuery1.Recordset.MoveNext ;
      end;
      end;
    //激活显示
    Chart1.Series[0].Active:=true;
    Chart1.Series[1].Active:=true;
    Chart2.Series[0].Active:=true;
    Chart2.Series[1].Active:=true;
    Chart3.Series[0].Active:=true;
    Chart3.Series[1].Active:=true;
    Chart4.Series[0].Active:=true;
    Chart4.Series[1].Active:=true;

    ts.Free;
    
      except
         Application.HandleException(Self);
      end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
try
    //或取当前WellID和WellTop 做为后面查询条件
    if (Edit16.Text='') or (Edit17.Text='') then  exit   ;
    form2.WellID:=WellID;
    form2.WellTop:=Edit16.Text;
    form2.WellBottom:=Edit17.Text;
    form2.Show;

    except
       Application.HandleException(Self);
    end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -