54 lines
1.8 KiB
C#
54 lines
1.8 KiB
C#
using System;
|
|
|
|
namespace HydraulicSimulator.Models
|
|
{
|
|
/// <summary>
|
|
/// Tubería con ecuación de Darcy-Weisbach y factor de fricción por Swamee-Jain
|
|
/// </summary>
|
|
public class Pipe : Element
|
|
{
|
|
public double L { get; set; } // m - longitud
|
|
public double D { get; set; } // m - diámetro
|
|
public double Rough { get; set; } = 4.5e-5; // m - rugosidad (acero comercial ~45 micrones)
|
|
|
|
public Pipe(double length, double diameter, double roughness = 4.5e-5)
|
|
{
|
|
L = length;
|
|
D = diameter;
|
|
Rough = roughness;
|
|
}
|
|
|
|
private double Area => Math.PI * (D * D) / 4.0;
|
|
|
|
private double FrictionFactor(double q, Fluid fluid)
|
|
{
|
|
var area = Area;
|
|
var v = Math.Abs(q) / area;
|
|
var re = Math.Max(4000.0, fluid.Rho * v * D / fluid.Mu); // forzamos turbulento
|
|
var epsRel = Rough / D;
|
|
// Swamee-Jain
|
|
var f = 0.25 / Math.Pow(Math.Log10(epsRel / 3.7 + 5.74 / Math.Pow(re, 0.9)), 2);
|
|
return f;
|
|
}
|
|
|
|
public override double Dp(double q, Fluid fluid)
|
|
{
|
|
var area = Area;
|
|
var f = FrictionFactor(q, fluid);
|
|
var k = f * (L / D) * 0.5 * fluid.Rho / (area * area);
|
|
return k * q * Math.Abs(q); // signo
|
|
}
|
|
|
|
public override double DdpDq(double q, Fluid fluid)
|
|
{
|
|
// Ignoramos df/dq para estabilidad/simplicidad (funciona muy bien).
|
|
var area = Area;
|
|
var qAbs = Math.Max(Math.Abs(q), 1e-9);
|
|
var qSign = q >= 0 ? 1 : -1;
|
|
var f = FrictionFactor(qAbs * qSign, fluid);
|
|
var k = f * (L / D) * 0.5 * fluid.Rho / (area * area);
|
|
return 2.0 * k * Math.Abs(q) + 1e-12; // evita 0
|
|
}
|
|
}
|
|
}
|