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

📄 libwellcurve.bas

📁 本系统是给大庆油田做的一个示例程序
💻 BAS
📖 第 1 页 / 共 2 页
字号:
Attribute VB_Name = "LibWellCurve"
Option Explicit
Rem 读井眼测斜数据
Sub DrillingDatas(jh As String, WellType As String, NcalWell As Integer, XWell() As Single, _
                 SetWell() As Single, FaiWell() As Single)
    Dim i As Integer
       Dim jgstr As String, xsstr As String, jxjstr As String, fwjstr As String
    Dim XWell1(200) As Single, SetWell1(200) As Single, FaiWell1(200) As Single
    
    Call Read_WellStructure(jh, jgstr, xsstr, jxjstr, fwjstr)
    
    WellType = jgstr
    
    NcalWell = Str_To_Arr(xsstr, XWell1) 'XWell1()的下标是由0开始的
    Call Str_To_Arr(jxjstr, SetWell1)
    Call Str_To_Arr(fwjstr, FaiWell1)
    
    For i = 1 To NcalWell '井身结构数据下标由1开始
        XWell(i) = XWell1(i - 1)
        SetWell(i) = SetWell1(i - 1)
        FaiWell(i) = FaiWell1(i - 1)
    Next i
End Sub
Rem 井身结构数据处理(过滤斜深相同的测试点)
Sub WellStructureDatas_Treat(xsstr As String, jxjstr As String, fwjstr As String)
    
    Dim i As Integer, j As Integer, NcalWell As Integer
    Dim XWell(300) As Single, SetWell(300) As Single, FaiWell(300) As Single
    Dim XWell1(300) As Single, SetWell1(300) As Single, FaiWell1(300) As Single
    
    NcalWell = Str_To_Arr(xsstr, XWell1) 'XWell1()的下标是由0开始的
    Call Str_To_Arr(jxjstr, SetWell1)
    Call Str_To_Arr(fwjstr, FaiWell1)
    
    For i = 1 To NcalWell '井身结构数据下标由1开始
        XWell(i) = XWell1(i - 1)
        SetWell(i) = SetWell1(i - 1)
        FaiWell(i) = FaiWell1(i - 1)
    Next i
    
    XWell1(1) = XWell(1)
    SetWell1(1) = SetWell(1)
    FaiWell1(1) = FaiWell(1)
    j = 1
    For i = 2 To NcalWell
        If XWell(i) = XWell(i - 1) Then
        Else
            j = j + 1
            XWell1(j) = XWell(i)
            SetWell1(j) = SetWell(i)
            FaiWell1(j) = FaiWell(i)
        End If
    Next i
    
    NcalWell = j
    xsstr = str(XWell1(1))
    jxjstr = str(SetWell1(1))
    fwjstr = str(FaiWell1(1))
    
    For i = 2 To NcalWell
        xsstr = xsstr & "," & str(XWell1(i))
        jxjstr = jxjstr & "," & str(SetWell1(i))
        fwjstr = fwjstr & "," & str(FaiWell1(i))
    Next i
End Sub
Rem NcalXpoint 在整个抽油杆柱上所取的计算点数
Rem 抽油杆柱上不同点处的井斜角、方位角、井斜角导数、方位角导数,轴向分布力
Sub Set_Fai_Q_Cal(WellType As String, NcalWell As Integer, XWell() As Single, SetWell() As Single, FaiWell() As Single, _
             nrod As Integer, drod() As Single, lrod() As Single, NcalRod() As Integer, _
             NcalXpoint As Integer, Xpoint() As Single, qpoint() As Single, _
             setxpoint() As Single, faixpoint() As Single, vsetxpoint() As Single, vfaixpoint() As Single)
          
    Dim qrod(5) As Single, lpump1 As Single
    Dim i As Integer, j As Integer, k As Integer
    Dim deltx As Single
    Dim n As Integer, M As Integer
     
    Dim x(1000) As Single, Y(1000) As Single, F(1000) As Single '300为测斜数据点数
    Dim F1(1000) As Single, F2(1000) As Single, t(1000) As Single
    Dim pi As Single
    
    pi = 3.14159265
    
    For i = 1 To nrod
       qrod(i) = pi / 4 * drod(i) ^ 2 * 7850 * 9.8 * 1.05
    Next i
    
    lpump1 = 0
    For i = 1 To nrod
       lpump1 = lpump1 + lrod(i)
    Next i
    
    NcalXpoint = 101
    deltx = lpump1 / (NcalXpoint - 1)
    
    NcalXpoint = 0
    NcalRod(0) = 0
    For i = 1 To nrod
        NcalRod(i) = Int(lrod(i) / deltx + 0.5)
        NcalXpoint = NcalXpoint + NcalRod(i) '等分数
    Next i
  
    For j = 0 To NcalXpoint
        If nrod = 1 Then
            Xpoint(j) = lrod(1) / NcalXpoint * j
            qpoint(j) = qrod(1)
        End If
        
        If nrod = 2 Then
            If j <= NcalRod(1) Then
                Xpoint(j) = lrod(1) / NcalRod(1) * j
                qpoint(j) = qrod(1)
            Else
                Xpoint(j) = lrod(1) + lrod(2) / NcalRod(2) * (j - NcalRod(1))
                qpoint(j) = qrod(2)
            End If
        End If
        
        If nrod = 3 Then
            If j <= NcalRod(1) Then
                Xpoint(j) = lrod(1) / NcalRod(1) * j
                qpoint(j) = qrod(1)
            ElseIf j > NcalRod(1) And j <= NcalRod(1) + NcalRod(2) Then
                Xpoint(j) = lrod(1) + lrod(2) / NcalRod(2) * (j - NcalRod(1))
                qpoint(j) = qrod(2)
            Else
                Xpoint(j) = lrod(1) + lrod(2) + lrod(3) / NcalRod(3) * (j - NcalRod(1) - NcalRod(2))
                qpoint(j) = qrod(3)
            End If
        End If
        
        If nrod = 4 Then
            If j <= NcalRod(1) Then
                Xpoint(j) = lrod(1) / NcalRod(1) * j
                qpoint(j) = qrod(1)
            ElseIf j > NcalRod(1) And j <= NcalRod(1) + NcalRod(2) Then
                Xpoint(j) = lrod(1) + lrod(2) / NcalRod(2) * (j - NcalRod(1))
                qpoint(j) = qrod(2)
            ElseIf j > NcalRod(1) + NcalRod(2) And j <= NcalRod(1) + NcalRod(2) + NcalRod(3) Then
                Xpoint(j) = lrod(1) + lrod(2) + lrod(3) / NcalRod(3) * (j - NcalRod(1) - NcalRod(2))
                qpoint(j) = qrod(3)
            Else
                Xpoint(j) = lrod(1) + lrod(2) + lrod(3) + lrod(4) / NcalRod(4) * (j - NcalRod(1) - NcalRod(2) - NcalRod(3))
                qpoint(j) = qrod(4)
            End If
        End If
    Next j
         
    n = NcalWell
    M = NcalXpoint
    
    For j = 1 To n
         x(j) = XWell(j)
         Y(j) = SetWell(j)
    Next j
    
    For j = 1 To M
        t(j) = Xpoint(j)
    Next j
    
    Call ChZh(n, x, Y, M, t, F, F1, F2)
    For j = 1 To M
       setxpoint(j) = F(j)
       vsetxpoint(j) = F1(j)
    Next j
    
    For j = 1 To n
         x(j) = XWell(j)
         Y(j) = FaiWell(j)
    Next j
    
    For j = 1 To M
        t(j) = Xpoint(j)
    Next j
    
    Call ChZh(n, x, Y, M, t, F, F1, F2)
    For j = 1 To M
       faixpoint(j) = F(j)
       vfaixpoint(j) = F1(j)
    Next j
     
    setxpoint(0) = SetWell(1)
    faixpoint(0) = FaiWell(1)
    vsetxpoint(0) = (SetWell(2) - SetWell(1)) / (XWell(2) - XWell(1))
    vfaixpoint(0) = (FaiWell(2) - FaiWell(1)) / (XWell(2) - XWell(1))
    For j = 0 To NcalXpoint
        setxpoint(j) = setxpoint(j) * pi / 180
        faixpoint(j) = faixpoint(j) * pi / 180
        vsetxpoint(j) = vsetxpoint(j) * pi / 180
        vfaixpoint(j) = vfaixpoint(j) * pi / 180
        'vfaixpoint(j) = 0.004 '井眼轨道评价给定相同的方位角变化率
        If Abs(vfaixpoint(j)) >= 0.005 Then vfaixpoint(j) = 0.005
    Next j
End Sub

Rem 井眼轴线上任意一点的井斜角、方位角、井斜角导数、方位角导数、曲率、曲率半径
Sub Set_Fai_Cal(WellType As String, NcalWell As Integer, XWell() As Single, SetWell() As Single, FaiWell() As Single, _
               xpoint_cal As Single, setxpoint_cal As Single, faixpoint_cal As Single, _
               vsetxpoint_cal As Single, vfaixpoint_cal As Single, K_Curve As Single, R_Curve As Single)
  
    Dim i As Integer, j As Integer, deltx As Single
    Dim n As Integer, M As Integer
    
    Dim x(300) As Single, Y(300) As Single, F(300) As Single
    Dim F1(300) As Single, F2(300) As Single, t(300) As Single
    Dim pi As Single
    
    pi = 3.14159265
    
    If xpoint_cal > XWell(1) And xpoint_cal < XWell(NcalWell) Then
        n = NcalWell
        M = 1
        
        For j = 1 To n
            x(j) = XWell(j)
            Y(j) = SetWell(j)
        Next j
        
        t(1) = xpoint_cal
        Call ChZh(n, x, Y, M, t, F, F1, F2)
        
        setxpoint_cal = F(1)
        vsetxpoint_cal = F1(1)
        
        For j = 1 To n
            x(j) = XWell(j)
            Y(j) = FaiWell(j)
        Next j
        
        t(1) = xpoint_cal
        
        Call ChZh(n, x, Y, M, t, F, F1, F2)
        

⌨️ 快捷键说明

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