using System;
using System.Collections.Generic;
using HydraulicSimulator.Models;
using CtrEditor.HydraulicSimulator;
using CtrEditor.ObjetosSim.HydraulicComponents;
namespace CtrEditor.HydraulicSimulator.Examples
{
///
/// Ejemplo de uso de los componentes hidráulicos según la documentación
/// Muestra cómo crear una red simple: Bomba -> Tubería -> Tanque de Descarga
///
public class SimpleHydraulicSystemExample
{
///
/// Crea un sistema hidráulico simple con bomba, tubería y tanque
///
public static void RunExample()
{
Console.WriteLine("🚀 Iniciando ejemplo de sistema hidráulico simple");
Console.WriteLine("Sistema: Bomba -> Tubería -> Tanque de Descarga");
Console.WriteLine();
// 1. Crear la red hidráulica
var network = new HydraulicNetwork();
// 2. Agregar nodos según la documentación
network.AddNode("SUMINISTRO", 0); // Tanque de suministro a presión atmosférica
network.AddNode("BOMBA_OUT"); // Salida de bomba (presión calculada)
network.AddNode("TANQUE_DESCARGA", 0); // Tanque de descarga libre
// 3. Crear elementos hidráulicos
var pump = new PumpHQ(
h0: 80, // Cabeza a caudal cero: 80 metros
q0: 0.01, // Caudal a cabeza cero: 0.01 m³/s (36 m³/h)
speedRel: 1.0, // Velocidad nominal
direction: 1 // Dirección normal
);
var pipe = new Pipe(
length: 50, // 50 metros de longitud
diameter: 0.08, // 80mm de diámetro
roughness: 0.0015 // Rugosidad del acero comercial
);
// 4. Conectar elementos en ramas según la documentación
network.AddBranch("SUMINISTRO", "BOMBA_OUT",
new List { pump }, "Bomba_Principal");
network.AddBranch("BOMBA_OUT", "TANQUE_DESCARGA",
new List { pipe }, "Tuberia_Descarga");
// 5. Resolver la red
Console.WriteLine("⚙️ Resolviendo red hidráulica...");
var result = network.Solve(
maxIterations: 200,
tolerance: 1e-4,
verbose: true
);
// 6. Mostrar resultados
if (result.Converged)
{
Console.WriteLine("✅ Simulación exitosa!");
Console.WriteLine($"Convergió en {result.Iterations} iteraciones");
Console.WriteLine();
ShowResults(result);
ShowComponentAnalysis(result, pump, pipe);
}
else
{
Console.WriteLine($"❌ No convergió después de {result.Iterations} iteraciones");
Console.WriteLine($"Error final: {result.Residual:E6}");
}
}
private static void ShowResults(SolutionResult result)
{
Console.WriteLine("📊 RESULTADOS DE LA SIMULACIÓN:");
Console.WriteLine("═══════════════════════════════");
// Flujos
Console.WriteLine("🌊 Flujos:");
foreach (var flow in result.Flows)
{
double flowM3h = flow.Value * 3600; // Convertir a m³/h
double flowLmin = flow.Value * 60000; // Convertir a L/min
Console.WriteLine($" {flow.Key}:");
Console.WriteLine($" {flow.Value:F6} m³/s = {flowM3h:F2} m³/h = {flowLmin:F1} L/min");
}
Console.WriteLine();
// Presiones
Console.WriteLine("📈 Presiones:");
foreach (var pressure in result.Pressures)
{
double pressureBar = pressure.Value / 100000.0; // Convertir a bar
double pressureKPa = pressure.Value / 1000.0; // Convertir a kPa
Console.WriteLine($" {pressure.Key}:");
Console.WriteLine($" {pressure.Value:F0} Pa = {pressureKPa:F1} kPa = {pressureBar:F3} bar");
}
}
private static void ShowComponentAnalysis(SolutionResult result, PumpHQ pump, Pipe pipe)
{
Console.WriteLine();
Console.WriteLine("🔧 ANÁLISIS DE COMPONENTES:");
Console.WriteLine("═══════════════════════════");
// Análisis de la bomba
if (result.Flows.TryGetValue("Bomba_Principal", out double pumpFlow))
{
double pumpFlowM3h = pumpFlow * 3600;
double pumpHead = pump.Dp(pumpFlow, Fluid.Water20C) / (1000 * 9.81); // Convertir Pa a metros
double pumpPower = pumpFlow * pump.Dp(pumpFlow, Fluid.Water20C) / 1000; // Potencia hidráulica en kW
Console.WriteLine("💨 Bomba:");
Console.WriteLine($" Caudal: {pumpFlowM3h:F1} m³/h");
Console.WriteLine($" Cabeza: {pumpHead:F1} m");
Console.WriteLine($" Potencia hidráulica: {pumpPower:F2} kW");
}
// Análisis de la tubería
if (result.Flows.TryGetValue("Tuberia_Descarga", out double pipeFlow))
{
double pipePressureDrop = pipe.Dp(pipeFlow, Fluid.Water20C);
double pipeHeadLoss = pipePressureDrop / (1000 * 9.81); // Convertir Pa a metros
double velocity = Math.Abs(pipeFlow) / (Math.PI * (pipe.D * pipe.D) / 4.0);
Console.WriteLine();
Console.WriteLine("🚰 Tubería:");
Console.WriteLine($" Caudal: {pipeFlow * 3600:F1} m³/h");
Console.WriteLine($" Velocidad: {velocity:F2} m/s");
Console.WriteLine($" Pérdida de carga: {pipeHeadLoss:F2} m");
Console.WriteLine($" Pérdida de presión: {pipePressureDrop / 1000:F1} kPa");
}
}
///
/// Ejemplo de cómo los objetos gráficos osHyd* se integrarían en la simulación
///
public static void ShowGraphicObjectsIntegration()
{
Console.WriteLine();
Console.WriteLine("🎨 INTEGRACIÓN CON OBJETOS GRÁFICOS:");
Console.WriteLine("═══════════════════════════════════");
Console.WriteLine();
Console.WriteLine("Los objetos creados (osHydPump, osHydPipe, osHydDischargeTank)");
Console.WriteLine("se integran automáticamente en el sistema de la siguiente manera:");
Console.WriteLine();
Console.WriteLine("1. 📋 Registro automático:");
Console.WriteLine(" - Se registran por reflexión usando NombreCategoria() = \"Hidráulicos\"");
Console.WriteLine(" - Aparecen en la categoría \"Hidráulicos\" del editor");
Console.WriteLine();
Console.WriteLine("2. 🔗 Sistema de conexiones:");
Console.WriteLine(" - Usan ItemsSource para filtrar componentes");
Console.WriteLine(" - Similar al sistema Motor/Transporte existente");
Console.WriteLine(" - Conexiones: Id_InletComponent, Id_OutletComponent");
Console.WriteLine();
Console.WriteLine("3. 🚫 No participan en Bepu:");
Console.WriteLine(" - Override Start() sin crear geometrías Bepu");
Console.WriteLine(" - Solo participan en el simulador hidráulico");
Console.WriteLine();
Console.WriteLine("4. 📊 Integración con HydraulicSimulationManager:");
Console.WriteLine(" - Implementan IHydraulicComponent para GetHydraulicNodes()");
Console.WriteLine(" - Implementan GetHydraulicElements() para el solver");
Console.WriteLine(" - Reciben resultados via ApplyHydraulicResults()");
Console.WriteLine();
Console.WriteLine("5. 🎯 Ejemplo de configuración:");
Console.WriteLine(" osHydPump (Nombre=\"Bomba_01\", H0=80m, Q0=36m³/h)");
Console.WriteLine(" ↓ (Id_OutletComponent=\"Tuberia_01\")");
Console.WriteLine(" osHydPipe (Nombre=\"Tuberia_01\", L=50m, D=80mm)");
Console.WriteLine(" ↓ (Id_OutletComponent=\"Tanque_01\")");
Console.WriteLine(" osHydDischargeTank (Nombre=\"Tanque_01\", Area=1m²)");
}
}
}