67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
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);
|
|
}
|
|
} |