83 lines
2.9 KiB
C#
83 lines
2.9 KiB
C#
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, 2.0 * 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);
|
||
|
||
pipe = new Pipe1D(length, area, 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()
|
||
{
|
||
bool logPipe = true;
|
||
|
||
if ((stepCount <= 10 || (stepCount <= 1000 && stepCount % 100 == 0)) || stepCount % 1000 == 0 && stepCount < 10000)
|
||
{
|
||
// Summary line
|
||
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");
|
||
|
||
// Per‑cell state
|
||
if (logPipe && stepCount <= 1000)
|
||
{
|
||
int n = pipe.GetCellCount();
|
||
for (int i = 0; i < n; i++)
|
||
{
|
||
double rho = pipe.GetCellDensity(i);
|
||
double p = pipe.GetCellPressure(i);
|
||
double u = pipe.GetCellVelocity(i);
|
||
Console.WriteLine(
|
||
$" Cell {i,2}: ρ={rho,8:F4} kg/m³, p={p,10:F2} Pa, u={u,8:F3} m/s");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |