129 lines
4.1 KiB
Python
129 lines
4.1 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from app.simulation.components.amesim.junctions.nodes import (
|
|
AmesimP4Node2,
|
|
AmesimPn3Node2,
|
|
)
|
|
from app.simulation.core.medium import IdealGasMedium
|
|
|
|
|
|
class AmesimPneumaticNodeComponentTests(unittest.TestCase):
|
|
def test_pn3node2_declares_bidirectional_pneumatic_ports(self) -> None:
|
|
node = AmesimPn3Node2.create(
|
|
name="pn3_1",
|
|
medium=IdealGasMedium(),
|
|
parameters={},
|
|
)
|
|
|
|
self.assertEqual(set(node.ports), {"port_1", "port_2", "port_3"})
|
|
self.assertTrue(
|
|
all(
|
|
definition.domain == "pneumatic"
|
|
and definition.nominal_role == "bidirectional"
|
|
for definition in node.port_definitions
|
|
)
|
|
)
|
|
self.assertEqual(node.parameter_values, {})
|
|
|
|
def test_pn3node2_residuals_use_port_2_as_pressure_reference(self) -> None:
|
|
node = AmesimPn3Node2("pn3_1")
|
|
node.port_1.p = 101000.0
|
|
node.port_2.p = 100000.0
|
|
node.port_3.p = 99000.0
|
|
node.port_1.m_flow = 0.2
|
|
node.port_2.m_flow = -0.3
|
|
node.port_3.m_flow = 0.1
|
|
|
|
residuals = {residual.id.rsplit(":", 1)[1]: residual for residual in node.pressure_flow_equation_residuals()}
|
|
|
|
self.assertEqual(set(residuals), {"port_1_pressure_reference", "port_3_pressure_reference", "mass_flow_balance"})
|
|
self.assertEqual(residuals["port_1_pressure_reference"].value, 1000.0)
|
|
self.assertEqual(residuals["port_3_pressure_reference"].value, -1000.0)
|
|
self.assertAlmostEqual(residuals["mass_flow_balance"].value, 0.0)
|
|
|
|
def test_p4node2_residuals_cover_four_ports(self) -> None:
|
|
node = AmesimP4Node2("p4_1")
|
|
node.port_1.p = 100000.0
|
|
node.port_2.p = 100000.0
|
|
node.port_3.p = 100000.0
|
|
node.port_4.p = 100000.0
|
|
node.port_1.m_flow = 0.1
|
|
node.port_2.m_flow = 0.2
|
|
node.port_3.m_flow = -0.4
|
|
node.port_4.m_flow = 0.1
|
|
|
|
residuals = node.pressure_flow_equation_residuals()
|
|
|
|
self.assertEqual(len(residuals), 4)
|
|
self.assertTrue(all(residual.value == 0.0 for residual in residuals))
|
|
self.assertEqual(
|
|
residuals[-1].variables,
|
|
(
|
|
"p4_1.port_1.m_flow",
|
|
"p4_1.port_2.m_flow",
|
|
"p4_1.port_3.m_flow",
|
|
"p4_1.port_4.m_flow",
|
|
),
|
|
)
|
|
|
|
def test_node_uses_port_2_temperature_for_non_reference_outlets(self) -> None:
|
|
node = AmesimP4Node2("p4_1")
|
|
node.port_1.m_flow = 0.25
|
|
node.port_2.m_flow = 0.75
|
|
node.port_3.m_flow = -0.5
|
|
node.port_4.m_flow = -0.5
|
|
|
|
node.update_stream_outflows(
|
|
{
|
|
"port_1": 100.0,
|
|
"port_2": 300.0,
|
|
"port_3": 900.0,
|
|
"port_4": 1200.0,
|
|
}
|
|
)
|
|
|
|
self.assertEqual(node.temperature_reference_h, 300.0)
|
|
self.assertEqual(node.port_1.h_outflow, 300.0)
|
|
self.assertEqual(node.port_2.h_outflow, 250.0)
|
|
self.assertEqual(node.port_3.h_outflow, 300.0)
|
|
self.assertEqual(node.port_4.h_outflow, 300.0)
|
|
|
|
def test_port_2_outlet_closes_node_energy_balance(self) -> None:
|
|
node = AmesimP4Node2("p4_1")
|
|
node.port_1.m_flow = -0.01823
|
|
node.port_2.m_flow = -2.56077
|
|
node.port_3.m_flow = 2.579
|
|
node.port_4.m_flow = 0.0
|
|
|
|
node.update_stream_outflows(
|
|
{
|
|
"port_1": 2_630_000.0,
|
|
"port_2": 140_900.0,
|
|
"port_3": 63_960.0,
|
|
"port_4": 0.0,
|
|
}
|
|
)
|
|
|
|
self.assertEqual(node.port_1.h_outflow, 140_900.0)
|
|
energy_flow = sum(
|
|
port.m_flow
|
|
* (
|
|
{
|
|
"port_1": 2_630_000.0,
|
|
"port_2": 140_900.0,
|
|
"port_3": 63_960.0,
|
|
"port_4": 0.0,
|
|
}[name]
|
|
if port.m_flow > 0.0
|
|
else port.h_outflow
|
|
)
|
|
for name, port in node.ports.items()
|
|
)
|
|
self.assertAlmostEqual(energy_flow, 0.0, places=10)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|