using System; namespace FluidSim.Core { /// /// Compressible flow through an orifice, modelled as an isentropic nozzle. /// Supports choked and unchoked flow, forward and reverse. /// public static class IsentropicOrifice { /// /// Compute mass flow and face primitive state for an orifice. /// /// Upstream stagnation pressure (Pa). /// Upstream stagnation density (kg/m³). /// Ratio of specific heats. /// Specific gas constant (J/kg·K). /// Downstream static pressure (Pa). /// Effective orifice area (m²). /// Discharge coefficient (default 0.62). /// Mass flow rate (kg/s), positive from upstream to downstream. /// Face density (kg/m³). /// Face velocity (m/s). /// Face pressure (Pa). public static void Compute(double pUp, double rhoUp, double TUp, double gamma, double R, double pDown, double area, double Cd, out double mdot, out double rhoFace, out double uFace, out double pFace) { // mdot is positive from upstream to downstream. double pr = Math.Max(pDown / pUp, 1e-6); double prCrit = Math.Pow(2.0 / (gamma + 1.0), gamma / (gamma - 1.0)); if (pr < prCrit) pr = prCrit; double M = Math.Sqrt((2.0 / (gamma - 1.0)) * (Math.Pow(pr, -(gamma - 1.0) / gamma) - 1.0)); uFace = M * Math.Sqrt(gamma * R * TUp); rhoFace = rhoUp * Math.Pow(pr, 1.0 / gamma); pFace = pUp * pr; mdot = rhoFace * uFace * area * Cd; // mass flow from upstream to downstream } } }