using System; using FluidSim.Components; using FluidSim.Utils; namespace FluidSim.Core { public static class Simulation { private static Solver solver; private static Volume0D volA, volB; private static Pipe1D pipe; private static Connection connA, connB; private static int stepCount; private static double time; private static double dt; public static void Initialize(int sampleRate) { dt = 1.0 / sampleRate; double V = 5.0 * Units.L; volA = new Volume0D(V, 1.1 * Units.atm, Units.Celsius(20), sampleRate); volB = new Volume0D(V, 1.0 * Units.atm, Units.Celsius(20), sampleRate); double length = 150 * Units.mm; double diameter = 25 * Units.mm; double area = Units.AreaFromDiameter(25, Units.mm); int nCells = 10; pipe = new Pipe1D(length, area, nCells, sampleRate); pipe.SetUniformState(volA.Density, 0.0, volA.Pressure); pipe.FrictionFactor = 0.02; // Connections with orifice area equal to pipe area (flange joint) connA = new Connection(volA.Port, pipe.PortA) { Area = area, DischargeCoefficient = 1.0, Gamma = 1.4 }; connB = new Connection(pipe.PortB, volB.Port) { Area = area, DischargeCoefficient = 1.0, Gamma = 1.4 }; solver = new Solver(); solver.AddVolume(volA); solver.AddVolume(volB); solver.AddPipe(pipe); solver.AddConnection(connA); solver.AddConnection(connB); } public static float Process() { solver.Step(); time += dt; stepCount++; Log(); return 0f; } public static void Log() { if (stepCount <= 50 || stepCount % 200 == 0) { Console.WriteLine( $"t = {time * 1e3:F3} ms Step {stepCount:D4}: " + $"PA = {volA.Pressure / 1e5:F6} bar, " + $"PB = {volB.Pressure / 1e5:F6} bar, " + $"FlowA = {pipe.PortA.MassFlowRate * 1e3:F2} g/s"); } } } }