using System; namespace FluidSim.Components { public class Volume0D { public double Mass { get; set; } public double InternalEnergy { get; set; } public double Gamma { get; set; } = 1.4; public double GasConstant { get; set; } = 287.0; public double Volume { get; set; } public double Dvdt { get; set; } private double _dt; public double Density => Mass / Volume; public double Pressure => (Gamma - 1.0) * InternalEnergy / Volume; public double Temperature => Pressure / (Density * GasConstant); public double SpecificEnthalpy => Gamma / (Gamma - 1.0) * Pressure / Density; public double MassFlowRateIn { get; set; } public double SpecificEnthalpyIn { get; set; } public Volume0D(double initialVolume, double initialPressure, double initialTemperature, int sampleRate, double gasConstant = 287.0, double gamma = 1.4) { GasConstant = gasConstant; Gamma = gamma; Volume = initialVolume; Dvdt = 0.0; _dt = 1.0 / sampleRate; double rho0 = initialPressure / (GasConstant * initialTemperature); Mass = rho0 * Volume; InternalEnergy = (initialPressure * Volume) / (Gamma - 1.0); } public void Integrate(double dtOverride) { double dm = MassFlowRateIn * dtOverride; double dE = (MassFlowRateIn * SpecificEnthalpyIn) * dtOverride - Pressure * Dvdt * dtOverride; Mass += dm; InternalEnergy += dE; // Safety: if mass becomes extremely small, reset internal energy to zero if (Mass < 1e-12) { Mass = 0.0; InternalEnergy = 0.0; } else if (InternalEnergy < 1e-12) { InternalEnergy = 0.0; } // Avoid negative mass/energy if (Mass < 0.0) Mass = 0.0; if (InternalEnergy < 0.0) InternalEnergy = 0.0; } public void Integrate() => Integrate(_dt); } }