优化仿真求解性能并修复流量闭合问题(初版)
This commit is contained in:
1 parent
57b459bc72
commit
5332a788f3
55 files changed
+8973
-549
No files matched your search
@@ -44,13 +44,19 @@ class PressureFlowSolverInitializationTests(unittest.TestCase):
|
||||
chamber.refresh_thermodynamic_ports()
|
||||
pipe.refresh_thermodynamic_ports()
|
||||
|
||||
result = PressureFlowSolver(network).solve()
|
||||
solver = PressureFlowSolver(network)
|
||||
result = solver.solve()
|
||||
|
||||
self.assertTrue(result.success)
|
||||
self.assertGreater(orifice.port_2.p, pipe.port_2.p)
|
||||
self.assertLess(orifice.port_2.p, chamber.port_2.p)
|
||||
self.assertAlmostEqual(orifice.port_2.p, pipe.port_1.p)
|
||||
self.assertAlmostEqual(-orifice.port_2.m_flow, pipe.port_1.m_flow)
|
||||
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()
|
||||
@@ -63,13 +69,19 @@ class PressureFlowSolverInitializationTests(unittest.TestCase):
|
||||
network.add_component(plug)
|
||||
network.connect("resistance", "port_2", "closed", "port_1")
|
||||
|
||||
result = PressureFlowSolver(network).solve()
|
||||
solver = PressureFlowSolver(network)
|
||||
result = solver.solve()
|
||||
|
||||
self.assertTrue(result.success)
|
||||
self.assertEqual(result.evaluations, 0)
|
||||
self.assertAlmostEqual(pipe.port_2.p, pipe.port_1.p)
|
||||
self.assertEqual(pipe.port_1.m_flow, 0.0)
|
||||
self.assertEqual(pipe.port_2.m_flow, 0.0)
|
||||
self.assertFalse(solver.causal_fast_path_eligible)
|
||||
self.assertEqual(
|
||||
solver.causal_execution_diagnostics()["fallbackReason"],
|
||||
"specialClosedResistancePressureSeed",
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _near_equal_pressure_network() -> tuple[
|
||||
@@ -338,6 +350,48 @@ class PressureFlowSolverInitializationTests(unittest.TestCase):
|
||||
self.assertIsNotNone(solver.last_diagnostics)
|
||||
self.assertFalse(solver.last_diagnostics.success)
|
||||
|
||||
def test_positive_sub_pascal_seed_uses_the_exact_pressure_without_optimizer(
|
||||
self,
|
||||
) -> None:
|
||||
medium = IdealGasMedium()
|
||||
pressure = 0.43301848566882734
|
||||
temperature = pressure / medium.R_gas
|
||||
tank = Tank("tank", medium, V=1.0)
|
||||
plug = AmesimPnpl01("plug")
|
||||
network = SimulationNetwork("positive-sub-pascal-pressure")
|
||||
network.add_component(tank)
|
||||
network.add_component(plug)
|
||||
network.connect("tank", "port_a", "plug", "port_1")
|
||||
|
||||
tank.state = VolumeState(
|
||||
m=1.0,
|
||||
U=medium.specific_internal_energy(temperature),
|
||||
)
|
||||
tank.refresh_thermodynamic_ports()
|
||||
self.assertAlmostEqual(
|
||||
tank.port_a.p,
|
||||
pressure,
|
||||
delta=pressure * 1.0e-11,
|
||||
)
|
||||
|
||||
solver = PressureFlowSolver(network, max_evaluations=10)
|
||||
with patch(
|
||||
"scipy.optimize.least_squares",
|
||||
side_effect=AssertionError(
|
||||
"A finite positive pressure seed must stay on the fast path."
|
||||
),
|
||||
) as least_squares:
|
||||
diagnostics = solver.solve()
|
||||
|
||||
self.assertTrue(diagnostics.success)
|
||||
self.assertEqual(diagnostics.evaluations, 0)
|
||||
self.assertAlmostEqual(
|
||||
tank.port_a.p,
|
||||
pressure,
|
||||
delta=pressure * 1.0e-11,
|
||||
)
|
||||
least_squares.assert_not_called()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user