📄 libwellcurve.bas
字号:
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 + -