158 lines
5.2 KiB
Python
158 lines
5.2 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from PythonModels.components.amesim_pneumatic_line import (
|
|
AmesimPnl0002Pipe,
|
|
AmesimPnl0003Pipe,
|
|
AmesimPnl00rPipe,
|
|
)
|
|
|
|
|
|
class AmesimPnl0002PipeTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.pipe = AmesimPnl0002Pipe(
|
|
name="pneumatic_86",
|
|
diameter_mm=20.0,
|
|
length_m=2.0,
|
|
relative_roughness=0.045 / 20.0,
|
|
pctr_0=100_000.0,
|
|
Tctr_0=293.15,
|
|
)
|
|
|
|
def test_initial_state_uses_center_compliance(self) -> None:
|
|
properties = self.pipe.properties()
|
|
|
|
self.assertAlmostEqual(self.pipe.volume, 6.283185307179586e-4)
|
|
self.assertEqual(len(self.pipe.get_state_vector()), 2)
|
|
self.assertAlmostEqual(properties.p, 100_000.0, delta=1.0e-6)
|
|
self.assertAlmostEqual(properties.T, 293.15)
|
|
self.assertAlmostEqual(self.pipe.port_1.p, properties.p)
|
|
self.assertAlmostEqual(self.pipe.port_2.p, properties.p)
|
|
|
|
def test_port_flow_enters_center_from_higher_external_pressure(self) -> None:
|
|
forward = self.pipe.port_mass_flow(
|
|
port_pressure_pa=101_000.0,
|
|
port_temperature_k=293.15,
|
|
)
|
|
reverse = self.pipe.port_mass_flow(
|
|
port_pressure_pa=99_000.0,
|
|
port_temperature_k=293.15,
|
|
)
|
|
|
|
self.assertGreater(forward, 0.0)
|
|
self.assertLess(reverse, 0.0)
|
|
|
|
def test_connection_derivatives_conserve_two_external_port_flows(self) -> None:
|
|
properties = self.pipe.properties()
|
|
|
|
derivative = self.pipe.derivatives_from_connections(
|
|
port_1_m_flow=0.2,
|
|
connected_h_1=properties.h + 1000.0,
|
|
port_2_m_flow=-0.1,
|
|
connected_h_2=properties.h - 1000.0,
|
|
)
|
|
|
|
self.assertAlmostEqual(derivative.m, 0.1)
|
|
|
|
|
|
class AmesimPnl0003PipeTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.pipe = AmesimPnl0003Pipe(
|
|
name="pneumatic_88",
|
|
diameter_mm=20.0,
|
|
length_m=0.3,
|
|
relative_roughness=0.045 / 20.0,
|
|
p1_0=15.3e6,
|
|
p2_0=15.3e6,
|
|
T1_0=293.15,
|
|
T2_0=293.15,
|
|
)
|
|
|
|
def test_initial_state_uses_two_half_volume_compliances(self) -> None:
|
|
port_1 = self.pipe.properties_1()
|
|
port_2 = self.pipe.properties_2()
|
|
|
|
self.assertAlmostEqual(self.pipe.volume, 9.424777960769381e-5)
|
|
self.assertAlmostEqual(self.pipe.compliance_volume, self.pipe.volume / 2.0)
|
|
self.assertEqual(len(self.pipe.get_state_vector()), 4)
|
|
self.assertAlmostEqual(port_1.p, 15.3e6, delta=1.0e-5)
|
|
self.assertAlmostEqual(port_2.p, 15.3e6, delta=1.0e-5)
|
|
self.assertAlmostEqual(port_1.T, 293.15)
|
|
self.assertAlmostEqual(port_2.T, 293.15)
|
|
|
|
def test_center_resistance_flow_follows_end_pressure_gradient(self) -> None:
|
|
state = self.pipe.get_state_vector()
|
|
state[0] *= 1.01
|
|
state[1] *= 1.01
|
|
self.pipe.set_state_vector(state)
|
|
|
|
forward = self.pipe.resistance_mass_flow()
|
|
state[0] /= 1.01 * 1.01
|
|
state[1] /= 1.01 * 1.01
|
|
state[2] *= 1.01
|
|
state[3] *= 1.01
|
|
self.pipe.set_state_vector(state)
|
|
reverse = self.pipe.resistance_mass_flow()
|
|
|
|
self.assertGreater(forward, 0.0)
|
|
self.assertLess(reverse, 0.0)
|
|
|
|
def test_connection_derivatives_conserve_internal_center_flow_mass(self) -> None:
|
|
state = self.pipe.get_state_vector()
|
|
state[0] *= 1.01
|
|
state[1] *= 1.01
|
|
self.pipe.set_state_vector(state)
|
|
|
|
d1, d2 = self.pipe.derivatives_from_connections(
|
|
port_1_m_flow=0.2,
|
|
connected_h_1=self.pipe.properties_1().h + 1000.0,
|
|
port_2_m_flow=-0.1,
|
|
connected_h_2=self.pipe.properties_2().h - 1000.0,
|
|
)
|
|
|
|
self.assertAlmostEqual(d1.m + d2.m, 0.1)
|
|
|
|
|
|
class AmesimPnl00rPipeTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.pipe = AmesimPnl00rPipe(
|
|
name="pneumatic_100",
|
|
diameter_mm=14.0,
|
|
length_m=1.0,
|
|
relative_roughness=0.045 / 14.0,
|
|
)
|
|
|
|
def test_stateless_resistance_flow_follows_pressure_gradient(self) -> None:
|
|
forward = self.pipe.mass_flow(
|
|
port_1_pressure_pa=15.31e6,
|
|
port_1_temperature_k=293.15,
|
|
port_2_pressure_pa=15.29e6,
|
|
port_2_temperature_k=293.15,
|
|
)
|
|
reverse = self.pipe.mass_flow(
|
|
port_1_pressure_pa=15.29e6,
|
|
port_1_temperature_k=293.15,
|
|
port_2_pressure_pa=15.31e6,
|
|
port_2_temperature_k=293.15,
|
|
)
|
|
|
|
self.assertGreater(forward, 0.0)
|
|
self.assertLess(reverse, 0.0)
|
|
self.assertAlmostEqual(abs(forward), abs(reverse), delta=abs(forward) * 0.01)
|
|
|
|
def test_diagnostics_expose_darcy_terms(self) -> None:
|
|
diagnostics = self.pipe.diagnostics(
|
|
mass_flow_kg_s=1.0e-4,
|
|
pressure_pa=15.3e6,
|
|
temperature_k=293.15,
|
|
)
|
|
|
|
self.assertGreater(diagnostics.reynolds_number, 0.0)
|
|
self.assertGreater(diagnostics.gas_velocity_m_s, 0.0)
|
|
self.assertGreater(diagnostics.pressure_drop_pa, 0.0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|