config tuning
This commit is contained in:
@@ -25,8 +25,7 @@ namespace FluidSim.Core
|
||||
public float EffectiveLength;
|
||||
public float CurrentMdot; // kg/s, positive = volume → pipe
|
||||
|
||||
// --- Loss coefficient (linear resistance) – inertance only ---
|
||||
// If 0 when UseInertance is true, a stable default is auto‑computed at runtime.
|
||||
// --- Loss coefficient (linear resistance) ---
|
||||
public float LossCoefficient; // N·s/m⁵ or kg/(m⁴·s)
|
||||
}
|
||||
|
||||
@@ -58,10 +57,9 @@ namespace FluidSim.Core
|
||||
public int OpenEndCount { get; private set; }
|
||||
|
||||
// ---------- Add orifice (no inertance) ----------
|
||||
// Simple isentropic nozzle – no built‑in loss. For dissipation use pipe damping
|
||||
// or the inertance model if you need a damped resonator.
|
||||
public void AddOrifice(Port volumePort, int pipeIndex, bool isLeftEnd,
|
||||
int areaIndex, float dischargeCoeff = 1f)
|
||||
int areaIndex, float dischargeCoeff = 1f,
|
||||
float lossCoefficient = 0f)
|
||||
{
|
||||
_orifices[OrificeCount] = new OrificeDesc
|
||||
{
|
||||
@@ -73,24 +71,22 @@ namespace FluidSim.Core
|
||||
UseInertance = false,
|
||||
EffectiveLength = 0f,
|
||||
CurrentMdot = 0f,
|
||||
LossCoefficient = 0f
|
||||
LossCoefficient = lossCoefficient
|
||||
};
|
||||
OrificeCount++;
|
||||
}
|
||||
|
||||
// ---------- Add orifice with inertance ----------
|
||||
// effectiveLength – length of the inertial slug (m), typically the physical neck length.
|
||||
// lossCoefficient – linear resistance (N·s/m⁵). If 0 (or omitted) an automatic stable
|
||||
// value will be computed from the pipe's characteristic impedance.
|
||||
public void AddOrificeWithInertance(Port volumePort, int pipeIndex, bool isLeftEnd,
|
||||
int areaIndex, float dischargeCoeff,
|
||||
float effectiveLength, float lossCoefficient = 0f)
|
||||
{
|
||||
AddOrifice(volumePort, pipeIndex, isLeftEnd, areaIndex, dischargeCoeff);
|
||||
// Reuse the base AddOrifice and then override fields
|
||||
AddOrifice(volumePort, pipeIndex, isLeftEnd, areaIndex, dischargeCoeff, lossCoefficient);
|
||||
ref var d = ref _orifices[OrificeCount - 1];
|
||||
d.UseInertance = true;
|
||||
d.EffectiveLength = effectiveLength;
|
||||
d.LossCoefficient = lossCoefficient;
|
||||
d.LossCoefficient = lossCoefficient; // store the linear resistance
|
||||
}
|
||||
|
||||
public void AddOpenEnd(int pipeIndex, bool isLeftEnd,
|
||||
@@ -150,7 +146,7 @@ namespace FluidSim.Core
|
||||
? _pipeSystem.GetInteriorAirFractionLeft(d.PipeIndex)
|
||||
: _pipeSystem.GetInteriorAirFractionRight(d.PipeIndex);
|
||||
|
||||
// ---- Handle closed orifice as a wall ----
|
||||
// ---- Handle closed orifice (area ≈ 0) as a wall ----
|
||||
if (area < 1e-12f || d.VolumePort == null)
|
||||
{
|
||||
var (rInt, uInt, pInt) = d.IsLeftEnd
|
||||
@@ -188,10 +184,10 @@ namespace FluidSim.Core
|
||||
|
||||
if (d.UseInertance)
|
||||
{
|
||||
// ---- Inertance ODE with (possibly automatic) linear loss ----
|
||||
float rhoUp = d.CurrentMdot >= 0 ? volRho : pipeRho;
|
||||
float inertance = rhoUp * d.EffectiveLength / MathF.Max(area, 1e-12f);
|
||||
float dp = volP - pipeP;
|
||||
float Rlin = d.LossCoefficient;
|
||||
|
||||
float dmdot_dt = (dp - Rlin * d.CurrentMdot) / MathF.Max(inertance, 1e-12f);
|
||||
float mdotNew = d.CurrentMdot + dmdot_dt * dt;
|
||||
|
||||
Reference in New Issue
Block a user