完善 PNL00R 摩擦模型与八路回归

This commit is contained in:
huojiarong committed 2026-08-18 09:30:29 +00:00
1 parent 684d28752a
commit f725f038b6
10 files changed
+498 -98

No files matched your search

@@ -7,6 +7,7 @@ from unittest.mock import patch
from app.simulation.components.amesim.boundary.sources import AmesimPnpl01
from app.simulation.components.amesim.flow.orifices import (
AmesimPnor001,
AmesimPnvo001FixedOpening,
AmesimPnvo001SignalOpening,
)
from app.simulation.components.amesim.flow.pipes import AmesimPnl00r
@@ -110,6 +111,62 @@ class PressureFlowSolverInitializationTests(unittest.TestCase):
self.assertAlmostEqual(valve.port_2.p, pipe.port_1.p)
self.assertAlmostEqual(-valve.port_2.m_flow, pipe.port_1.m_flow)
def test_pnvo_pnl00r_series_pressure_is_seeded_by_flow_balance(self) -> None:
medium = IdealGasMedium()
source = Cylinder(
"source",
medium,
V=0.01,
p0=150_000.0,
T0=300.0,
)
valve = AmesimPnvo001FixedOpening(
"valve",
medium,
opening=0.5,
)
pipe = AmesimPnl00r(
"pipe",
medium,
diam=0.02,
le=1.0,
rr=1.0e-5,
)
sink = Tank(
"sink",
medium,
V=0.1,
p0=100_000.0,
T0=300.0,
)
network = SimulationNetwork("pnvo-pnl00r-series")
for component in (source, valve, pipe, sink):
network.add_component(component)
network.connect("source", "port_b", "valve", "port_2")
network.connect("valve", "port_3", "pipe", "port_1")
network.connect("pipe", "port_2", "sink", "port_a")
source.refresh_thermodynamic_ports()
sink.refresh_thermodynamic_ports()
solver = PressureFlowSolver(network)
result = solver.solve()
self.assertTrue(result.success)
self.assertEqual(result.evaluations, 0)
self.assertGreater(valve.port_3.p, pipe.port_2.p)
self.assertLess(valve.port_3.p, source.port_b.p)
self.assertAlmostEqual(valve.port_3.p, pipe.port_1.p)
self.assertAlmostEqual(
-valve.port_3.m_flow,
pipe.port_1.m_flow,
delta=1.0e-10,
)
self.assertFalse(solver.causal_fast_path_eligible)
self.assertEqual(
solver.causal_execution_diagnostics()["fallbackReason"],
"specialSeriesPressureSeed",
)
def test_dead_ended_pnl00r_is_seeded_at_zero_flow_pressure(self) -> None:
medium = IdealGasMedium()
pipe = AmesimPnl00r("resistance", medium)