Engine working
This commit is contained in:
@@ -46,16 +46,21 @@ namespace FluidSim.Core
|
||||
double volRho = VolumePort.Density;
|
||||
double volT = VolumePort.Temperature;
|
||||
double volH = VolumePort.SpecificEnthalpy;
|
||||
double volAF = VolumePort.AirFraction;
|
||||
|
||||
(double pipeRho, double pipeU, double pipeP) = IsPipeLeftEnd
|
||||
? Pipe.GetInteriorStateLeft()
|
||||
: Pipe.GetInteriorStateRight();
|
||||
|
||||
double pipeT = pipeP / Math.Max(pipeRho * 287.0, 1e-12);
|
||||
double pipeAF = IsPipeLeftEnd
|
||||
? Pipe.GetInteriorAirFractionLeft()
|
||||
: Pipe.GetInteriorAirFractionRight();
|
||||
|
||||
double gamma = 1.4;
|
||||
double R = 287.0;
|
||||
|
||||
// ---- Steady‑state nozzle solution (gives correct exit state) ----
|
||||
// ---- Steady‑state nozzle solution ----
|
||||
double mdotSS; // positive = volume → pipe
|
||||
double rhoFace0, uFace0, pFace0;
|
||||
if (volP >= pipeP)
|
||||
@@ -71,15 +76,6 @@ namespace FluidSim.Core
|
||||
mdotSS = -mdotUpToDown;
|
||||
}
|
||||
|
||||
// ====== Hard physical cap: max sonic flow × 1.1 ======
|
||||
double upRho = mdotSS >= 0 ? volRho : pipeRho;
|
||||
double upT = mdotSS >= 0 ? volT : pipeT;
|
||||
double upC = Math.Sqrt(gamma * R * upT);
|
||||
double maxFlow = upRho * upC * area * 1.1;
|
||||
if (Math.Abs(mdotSS) > maxFlow)
|
||||
mdotSS = Math.Sign(mdotSS) * maxFlow;
|
||||
// ====================================================
|
||||
|
||||
// ---- Dynamic update ----
|
||||
if (UseInertance)
|
||||
{
|
||||
@@ -102,21 +98,38 @@ namespace FluidSim.Core
|
||||
if (_mdot > maxOut) _mdot = maxOut;
|
||||
}
|
||||
|
||||
// ---- Ghost state ----
|
||||
// ---- Ghost state with air fraction ----
|
||||
double rhoFace = _mdot >= 0 ? volRho : pipeRho;
|
||||
double pFace = pFace0;
|
||||
double mdotMag = Math.Abs(_mdot);
|
||||
double uFace = mdotMag / (rhoFace * area);
|
||||
|
||||
// Determine air fraction for ghost and for volume port
|
||||
double airFracGhost; // air fraction of ghost cell (at pipe end)
|
||||
double airFracForVolume; // if flow reverses into volume, this is the air fraction entering volume
|
||||
|
||||
if (_mdot >= 0) // volume → pipe
|
||||
{
|
||||
airFracGhost = volAF;
|
||||
// Flow enters pipe; no need to set volume's air fraction (port already has its own)
|
||||
airFracForVolume = volAF; // unused
|
||||
}
|
||||
else // pipe → volume
|
||||
{
|
||||
airFracGhost = pipeAF;
|
||||
airFracForVolume = pipeAF;
|
||||
VolumePort.AirFraction = airFracForVolume;
|
||||
}
|
||||
|
||||
if (IsPipeLeftEnd)
|
||||
uFace = _mdot >= 0 ? uFace : -uFace;
|
||||
else
|
||||
uFace = _mdot >= 0 ? -uFace : uFace;
|
||||
|
||||
if (IsPipeLeftEnd)
|
||||
Pipe.SetGhostLeft(rhoFace, uFace, pFace);
|
||||
Pipe.SetGhostLeft(rhoFace, uFace, pFace, airFracGhost);
|
||||
else
|
||||
Pipe.SetGhostRight(rhoFace, uFace, pFace);
|
||||
Pipe.SetGhostRight(rhoFace, uFace, pFace, airFracGhost);
|
||||
|
||||
// Store results (positive = into volume)
|
||||
LastMassFlowRate = -_mdot;
|
||||
@@ -145,9 +158,9 @@ namespace FluidSim.Core
|
||||
: Pipe.GetInteriorStateRight();
|
||||
|
||||
if (IsPipeLeftEnd)
|
||||
Pipe.SetGhostLeft(rInt, -uInt, pInt);
|
||||
Pipe.SetGhostLeft(rInt, -uInt, pInt, IsPipeLeftEnd ? Pipe.GetInteriorAirFractionLeft() : Pipe.GetInteriorAirFractionRight());
|
||||
else
|
||||
Pipe.SetGhostRight(rInt, -uInt, pInt);
|
||||
Pipe.SetGhostRight(rInt, -uInt, pInt, IsPipeLeftEnd ? Pipe.GetInteriorAirFractionLeft() : Pipe.GetInteriorAirFractionRight());
|
||||
|
||||
LastMassFlowRate = 0.0;
|
||||
LastFaceDensity = rInt;
|
||||
|
||||
Reference in New Issue
Block a user