using System;
public class Program
{
public static void Main(string[] args)
{
// 示例输入参数
float[] parameters = new float[17];
parameters[0] = 1000.0f; // hf
parameters[1] = 1500.0f; // h_pipe
parameters[2] = 2000.0f; // p_case
parameters[3] = 0.2f; // fw
parameters[4] = 0.15f; // Rp
parameters[5] = 200.0f; // qpl
parameters[6] = 0.1f; // dco
parameters[7] = 0.08f; // dci
parameters[8] = 0.15f; // dto
parameters[9] = 0.12f; // dti
parameters[10] = 25.0f; // tr
parameters[11] = 100; // points
parameters[12] = 0.02f; // gg
parameters[13] = 0.018f; // gw
parameters[14] = 0.015f; // go1
parameters[15] = 1800.0f; // pb
parameters[16] = 1500.0f; // h_pump
// 管道直径数据
float[] outerDiameter = { 0.2f, 0.25f }; // do_tube
float[] innerDiameter = { 0.15f, 0.2f }; // di_tube
float[] tubeLength = { 2000.0f }; // l_tube
// 井深度数据
float[] wellDepths = { 0.0f, 500.0f, 1500.0f }; // hhh
float[] angles = { 0.0f, 0.1f, 0.2f }; // angle1
// 调用流体动力学计算
float[] results = new float[1];
CalculateHfPwf(parameters, wellDepths, angles, 1, outerDiameter, innerDiameter, tubeLength, results);
// 输出计算结果
float calculatedPwf = results[0];
Console.WriteLine($"Calculated Pwf: {calculatedPwf} psi");
}
public static void CalculateHfPwf(float[] pq, float[] hhh, float[] angle1, int tubejs, float[] do_tube, float[] di_tube, float[] l_tube, float[] result)
{
float Pwf = 0.0f;
int ii2, ii3, ii1;
float ro, ro1, yalitidu;
float prz, ttz, r5, z1;
float pav_g, tcz, pcz;
float h_vertical_r, drt_h, angle, tav_g, z;
float[] h = new float[200];
float[] h_vertical = new float[200];
float[] p = new float[200];
float[] T = new float[200];
float[] ttt = new float[20];
float hf, h_pipe, p_case;
float fw, Rp, qpl;
float dci, dco, dti, dto;
float tr;
int points;
float gg, gw, go1;
float pb, h_well;
float drt_h1;
int i, j;
float h_pump, t_pumpintake;
float do_rod, di_rod;
hf = pq[0];
h_pipe = pq[1];
p_case = pq[2];
fw = pq[3];
Rp = pq[4];
qpl = pq[5];
dco = pq[6];
dci = pq[7];
dto = pq[8];
dti = pq[9];
tr = pq[10];
points = (int)pq[11];
gg = pq[12];
gw = pq[13];
go1 = pq[14];
pb = pq[15];
h_pump = pq[16];
h_well = hhh[points];
if (h_well < h_pipe)
h_pipe = h_well;
// 计算井底流动压力 Pwf
hhh[0] = 0;
h_vertical_r = 0;
for (j = 1; j < points; j++)
{
h_vertical_r += (float)((hhh[j] - hhh[j - 1]) * Math.Sin((double)angle1[j]));
}
drt_h1 = 50;
if (Math.Abs(hf / drt_h1 - Convert.ToInt32(hf / drt_h1)) > 0.01)
{
ii1 = Convert.ToInt32(hf / drt_h1) + 1;
for (i = 0; i < ii1; i++)
{
h[i] = i * drt_h1;
}
h[ii1] = hf;
}
else
{
ii1 = Convert.ToInt32(hf / drt_h1 + 0.5);
for (i = 0; i <= ii1; i++)
{
h[i] = drt_h1 * i;
}
}
if (Math.Abs((h_pipe - hf) / drt_h1 - Convert.ToInt32((h_pipe - hf) / drt_h1)) > 0.01)
{
ii2 = Convert.ToInt32((h_pipe - hf) / drt_h1) + 1;
for (i = 1; i < ii2; i++)
{
h[ii1 + i] = hf + i * drt_h1;
}
h[ii1 + ii2] = h_pipe;
}
else
{
ii2 = Convert.ToInt32((h_pipe - hf) / drt_h1 + 0.5);
for (i = 1; i <= ii2; i++)
{
h[ii1 + i] = hf + drt_h1 * i;
}
}
if (Math.Abs((h_well - h_pipe) / drt_h1 - Convert.ToInt32((h_well - h_pipe) / drt_h1)) > 0.01)
{
ii3 = Convert.ToInt32((h_well - h_pipe) / drt_h1) + 1;
for (i = 1; i < ii3; i++)
{
h[ii1 + ii2 + i] = h_pipe + i * drt_h1;
}
h[ii1 + ii2 + ii3] = h_well;
}
else
{
ii3 = Convert.ToInt32((h_well - h_pipe) / drt_h1 + 0.5);
for (i = 1; i <= ii3; i++)
{
h[ii1 + ii2 + i] = h_pipe + drt_h1 * i;
}
}
h_vertical[0] = 0;
for (i = 1; i <= ii1 + ii2 + ii3; i++)
{
drt_h = h[i] - h[i - 1];
for (j = 1; j < points; j++)
{
if (h[i] >= hhh[j - 1] && h[i] <= hhh[j])
{
angle = angle1[j - 1];
}
}
h_vertical[i] = h_vertical[i - 1] + drt_h * (float)Math.Sin((double)angle);
}
if (tubejs == 1)
{
dto = do_tube[0];
dti = di_tube[0];
}
else if (tubejs == 2)
{
dto = do_tube[1];
dti = di_tube[1];
}
T[ii1 + ii2 + ii3] = Temperature(fw, Rp, qpl, dco, dci, dto, dti, tr, h_vertical[ii1 + ii2 + ii3], h_vertical_r);
// 井底到尾管处
for (i = ii1 + ii2 + ii3 - 1; i >= ii1 + ii2; i--)
{
T[i] = Temperature(fw, Rp, qpl, dco, dci, dto, dti, tr, h_vertical[i], h_vertical_r);
}
// 尾管到泵吸入口
if (h_pump == h_pipe)
{
t_pumpintake = T[ii1 + ii2];
}
for (i = ii1 + ii2 - 1; i >= 0; i--)
{
T[i] = Temperature(fw, Rp, qpl, dco, dci, dto, dti, tr, h_vertical[i], h_vertical_r);
}
p[0] = p_case;
for (i = 1; i <= ii1; i++)
{
if (h[i] <= l_tube[0])
{
dto = do_tube[0];
dti = di_tube[0];
}
else
{
dto = do_tube[1];
dti = di_tube[1];
}
drt_h = h[i] - h[i - 1];
tav_g = (T[i - 1] + T[i]) / 2;
for (j = 1; j < points; j++)
{
if (h[i] >= hhh[j - 1] && h[i] <= hhh[j])
{
angle = angle1[j - 1];
}
}
z = 1;
do
{
p[i] = p[i - 1] * (float)Math.Exp(0.03416 * gg * drt_h * (float)Math.Sin((double)angle) / (tav_g + 273) / z);
pav_g = (p[i - 1] + p[i]) / 2;
ttt[0] = go1;
ttt[1] = gg;
ttt[2] = pav_g;
ttt[3] = tav_g;
ttt[4] = Rp;
ttt[5] = fw;
ttt[6] = gw;
ttt[7] = qpl;
Pvtpara(ttt); // 调用 Pvtpara 方法
ro1 = ttt[2];
if (Math.Abs((ro - ro1) / ro) < 0.005)
{
break;
}
else
{
ro = (ro + ro1) / 2;
}
} while (true);
}
for (i = ii1 + 1; i <= ii1 + ii2; i++)
{
if (h[i] <= l_tube[0])
{
dto = do_tube[0];
dti = di_tube[0];
}
else
{
dto = do_tube[1];
dti = di_tube[1];
}
drt_h = h[i] - h[i - 1];
tav_g = (T[i - 1] + T[i]) / 2;
for (j = 1; j < points; j++)
{
if (h[i] >= hhh[j - 1] && h[i] <= hhh[j])
{
angle = angle1[j - 1];
}
}
ro = 1000;
do
{
p[i] = p[i - 1] + ro * 9.8f * drt_h * (float)Math.Sin((double)angle) / 100000;
pav_g = (p[i - 1] + p[i]) / 2;
ttt[0] = go1;
ttt[1] = gg;
ttt[2] = pav_g;
ttt[3] = tav_g;
ttt[4] = Rp;
ttt[5] = fw;
ttt[6] = gw;
ttt[7] = qpl;
Pvtpara(ttt); // 调用 Pvtpara 方法
ro1 = ttt[2];
if (Math.Abs((ro - ro1) / ro) < 0.005)
{
break;
}
else
{
ro = (ro + ro1) / 2;
}
} while (true);
}
Pwf = p[ii1 + ii2 + ii3];
result[0] = Pwf;
}
// Pvtpara 方法的声明
public static void Pvtpara(float[] ttt)
{
// 在这里添加 Pvtpara 方法的具体实现
// 可以根据 ttt 中的参数计算油气物性参数
}
// Temperature 方法的声明
public static float Temperature(float fw, float Rp, float qpl, float dco, float dci, float dto, float dti, float tr, float h_vertical, float h_vertical_r)
{
// 在这里添加 Temperature 方法的具体实现
// 根据给定的参数计算温度
return 0.0f; // 这里需要替换为实际的返回值
}
}