公开更多 AMESim 组件并接入信号机械闭环
This commit is contained in:
1 parent
db4bdb4b70
commit
3f51a124d6
28 files changed
+3397
-58
No files matched your search
@@ -0,0 +1,160 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from app.simulation.components.amesim.flow.pipes import AmesimPnl0002, AmesimPnl0003
|
||||
from app.simulation.core.medium import IdealGasMedium
|
||||
from app.simulation.registry import COMPONENT_MODEL_REGISTRY
|
||||
|
||||
|
||||
class AmesimPnl0002ComponentTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.medium = IdealGasMedium()
|
||||
|
||||
def test_default_create_preserves_contract(self) -> None:
|
||||
pipe = COMPONENT_MODEL_REGISTRY["amesim_pnl0002"].create("pnl_2", self.medium, {})
|
||||
|
||||
self.assertIsInstance(pipe, AmesimPnl0002)
|
||||
self.assertEqual(set(pipe.ports), {"port_1", "port_2"})
|
||||
self.assertEqual(len(pipe.get_state_vector()), 2)
|
||||
self.assertAlmostEqual(pipe.resistance_length, pipe.le / 2.0)
|
||||
|
||||
def test_center_compliance_initial_state(self) -> None:
|
||||
pipe = AmesimPnl0002(
|
||||
"pnl_2",
|
||||
self.medium,
|
||||
diam=0.02,
|
||||
le=2.0,
|
||||
rr=0.045 / 20.0,
|
||||
p0=100000.0,
|
||||
T0=293.15,
|
||||
)
|
||||
props = pipe.properties()
|
||||
|
||||
self.assertAlmostEqual(pipe.volume, 6.283185307179586e-4)
|
||||
self.assertAlmostEqual(props.p, 100000.0, delta=1.0e-6)
|
||||
self.assertAlmostEqual(props.T, 293.15)
|
||||
|
||||
def test_port_flows_enter_center_from_higher_external_pressure(self) -> None:
|
||||
pipe = AmesimPnl0002("pnl_2", self.medium, p0=100000.0, T0=293.15)
|
||||
center = pipe.properties()
|
||||
|
||||
forward = pipe.port_mass_flow(101000.0, center.p, center.T)
|
||||
reverse = pipe.port_mass_flow(99000.0, center.p, center.T)
|
||||
|
||||
self.assertGreater(forward, 0.0)
|
||||
self.assertLess(reverse, 0.0)
|
||||
|
||||
def test_pressure_flow_residuals_use_two_port_resistances(self) -> None:
|
||||
pipe = AmesimPnl0002("pnl_2", self.medium, p0=100000.0, T0=293.15)
|
||||
center = pipe.properties()
|
||||
pipe.port_1.p = 101000.0
|
||||
pipe.port_2.p = 99000.0
|
||||
pipe.port_1.m_flow = pipe.port_mass_flow(pipe.port_1.p, center.p, center.T)
|
||||
pipe.port_2.m_flow = pipe.port_mass_flow(pipe.port_2.p, center.p, center.T)
|
||||
|
||||
residuals = {
|
||||
residual.id.rsplit(":", 1)[1]: residual
|
||||
for residual in pipe.pressure_flow_equation_residuals()
|
||||
}
|
||||
|
||||
self.assertEqual(
|
||||
set(residuals),
|
||||
{"port_1_pressure_flow_relation", "port_2_pressure_flow_relation"},
|
||||
)
|
||||
self.assertAlmostEqual(residuals["port_1_pressure_flow_relation"].value, 0.0)
|
||||
self.assertAlmostEqual(residuals["port_2_pressure_flow_relation"].value, 0.0)
|
||||
|
||||
def test_connection_derivative_accumulates_two_external_flows(self) -> None:
|
||||
pipe = AmesimPnl0002("pnl_2", self.medium)
|
||||
props = pipe.properties()
|
||||
pipe.port_1.m_flow = 0.2
|
||||
pipe.port_2.m_flow = -0.1
|
||||
|
||||
derivative = pipe.state_derivative_from_ports(
|
||||
{"port_1": props.h + 1000.0, "port_2": props.h - 1000.0}
|
||||
)
|
||||
|
||||
self.assertAlmostEqual(derivative[0], 0.1)
|
||||
|
||||
|
||||
class AmesimPnl0003ComponentTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.medium = IdealGasMedium()
|
||||
|
||||
def test_default_create_preserves_contract(self) -> None:
|
||||
pipe = COMPONENT_MODEL_REGISTRY["amesim_pnl0003"].create("pnl_3", self.medium, {})
|
||||
|
||||
self.assertIsInstance(pipe, AmesimPnl0003)
|
||||
self.assertEqual(set(pipe.ports), {"port_1", "port_2"})
|
||||
self.assertEqual(len(pipe.get_state_vector()), 4)
|
||||
|
||||
def test_initial_state_uses_two_half_volume_compliances(self) -> None:
|
||||
pipe = AmesimPnl0003(
|
||||
"pnl_3",
|
||||
self.medium,
|
||||
diam=0.02,
|
||||
le=0.3,
|
||||
rr=0.045 / 20.0,
|
||||
p1_0=15.3e6,
|
||||
T1_0=293.15,
|
||||
p2_0=15.3e6,
|
||||
T2_0=293.15,
|
||||
)
|
||||
port_1 = pipe.properties_1()
|
||||
port_2 = pipe.properties_2()
|
||||
|
||||
self.assertAlmostEqual(pipe.volume, 9.424777960769381e-5)
|
||||
self.assertAlmostEqual(pipe.compliance_volume, pipe.volume / 2.0)
|
||||
self.assertAlmostEqual(port_1.p, 15.3e6, delta=1.0e-5)
|
||||
self.assertAlmostEqual(port_2.p, 15.3e6, delta=1.0e-5)
|
||||
|
||||
def test_center_resistance_flow_follows_end_pressure_gradient(self) -> None:
|
||||
pipe = AmesimPnl0003("pnl_3", self.medium, p1_0=101000.0, p2_0=100000.0)
|
||||
forward = pipe.resistance_mass_flow()
|
||||
pipe = AmesimPnl0003("pnl_3", self.medium, p1_0=100000.0, p2_0=101000.0)
|
||||
reverse = pipe.resistance_mass_flow()
|
||||
|
||||
self.assertGreater(forward, 0.0)
|
||||
self.assertLess(reverse, 0.0)
|
||||
|
||||
def test_pressure_flow_residuals_bind_both_port_pressures_to_states(self) -> None:
|
||||
pipe = AmesimPnl0003("pnl_3", self.medium)
|
||||
pipe.properties_1()
|
||||
pipe.properties_2()
|
||||
|
||||
residuals = {
|
||||
residual.id.rsplit(":", 1)[1]: residual
|
||||
for residual in pipe.pressure_flow_equation_residuals()
|
||||
}
|
||||
|
||||
self.assertEqual(set(residuals), {"port_1_pressure_state", "port_2_pressure_state"})
|
||||
self.assertAlmostEqual(residuals["port_1_pressure_state"].value, 0.0)
|
||||
self.assertAlmostEqual(residuals["port_2_pressure_state"].value, 0.0)
|
||||
|
||||
def test_connection_derivative_conserves_external_and_center_flows(self) -> None:
|
||||
pipe = AmesimPnl0003("pnl_3", self.medium, p1_0=101000.0, p2_0=100000.0)
|
||||
port_1 = pipe.properties_1()
|
||||
port_2 = pipe.properties_2()
|
||||
pipe.port_1.m_flow = 0.2
|
||||
pipe.port_2.m_flow = -0.1
|
||||
|
||||
derivative = pipe.state_derivative_from_ports(
|
||||
{"port_1": port_1.h + 1000.0, "port_2": port_2.h - 1000.0}
|
||||
)
|
||||
|
||||
self.assertAlmostEqual(derivative[0] + derivative[2], 0.1)
|
||||
|
||||
def test_results_include_two_thermodynamic_sides_and_center_flow(self) -> None:
|
||||
pipe = AmesimPnl0003("pnl_3", self.medium, p1_0=101000.0, p2_0=100000.0)
|
||||
|
||||
values = pipe.component_result_values()
|
||||
|
||||
self.assertIn("m1", values)
|
||||
self.assertIn("m2", values)
|
||||
self.assertIn("dmctr", values)
|
||||
self.assertIn("re", values)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user