109 lines
3.7 KiB
Python
109 lines
3.7 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from app.simulation.components.amesim.flow.pipes import AmesimPnl0002
|
|
from app.simulation.core.medium import IdealGasMedium
|
|
from app.simulation.reporting.amesim_results import AmesimResults
|
|
from app.simulation.reporting.pnl0002_replay import (
|
|
Pnl0002ReplayPaths,
|
|
replay_pnl0002_amesim_states,
|
|
)
|
|
|
|
|
|
class Pnl0002ReplayTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.pipe = AmesimPnl0002(
|
|
"pneumatic_83",
|
|
IdealGasMedium(),
|
|
diam=0.02,
|
|
le=2.0,
|
|
rr=0.00225,
|
|
)
|
|
self.paths = Pnl0002ReplayPaths(
|
|
center_pressure="center_p",
|
|
center_temperature="center_T",
|
|
port_1_pressure="port_1_p",
|
|
port_1_temperature="port_1_T",
|
|
port_1_mass_flow="port_1_dm",
|
|
port_2_pressure="port_2_p",
|
|
port_2_temperature="port_2_T",
|
|
port_2_mass_flow="port_2_dm",
|
|
reynolds="re",
|
|
friction_factor="ff",
|
|
)
|
|
|
|
def _matching_results(self) -> AmesimResults:
|
|
center_pressure = 300000.0
|
|
center_temperature = 320.0
|
|
port_1_pressure = 500000.0
|
|
port_1_temperature = 330.0
|
|
port_2_pressure = 100000.0
|
|
port_2_temperature = 310.0
|
|
flow_1 = self.pipe.mass_flow(
|
|
port_1_pressure,
|
|
center_pressure,
|
|
port_1_temperature,
|
|
)
|
|
flow_2 = self.pipe.mass_flow(
|
|
port_2_pressure,
|
|
center_pressure,
|
|
center_temperature,
|
|
)
|
|
reynolds_1 = self.pipe.reynolds_number(flow_1, port_1_temperature)
|
|
reynolds_2 = self.pipe.reynolds_number(flow_2, center_temperature)
|
|
friction = 0.5 * (
|
|
self.pipe.friction_factor(reynolds_1)
|
|
+ self.pipe.friction_factor(reynolds_2)
|
|
)
|
|
return AmesimResults(
|
|
times=(0.0,),
|
|
variables=(),
|
|
saved_variable_indices=(),
|
|
series_by_data_path={
|
|
"center_p": (center_pressure,),
|
|
"center_T": (center_temperature,),
|
|
"port_1_p": (port_1_pressure,),
|
|
"port_1_T": (port_1_temperature,),
|
|
"port_1_dm": (flow_1 / -1.0e-3,),
|
|
"port_2_p": (port_2_pressure,),
|
|
"port_2_T": (port_2_temperature,),
|
|
"port_2_dm": (flow_2 / -1.0e-3,),
|
|
"re": (0.5 * (reynolds_1 + reynolds_2),),
|
|
"ff": (friction,),
|
|
},
|
|
final_values_by_data_path={},
|
|
)
|
|
|
|
def test_matching_saved_states_replay_without_integration(self) -> None:
|
|
initial_state = self.pipe.get_state_vector()
|
|
|
|
report = replay_pnl0002_amesim_states(
|
|
self.pipe,
|
|
self._matching_results(),
|
|
self.paths,
|
|
)
|
|
|
|
self.assertEqual(report["mode"], "amesim-state-replay-no-integration")
|
|
self.assertEqual(report["pointCount"], 1)
|
|
self.assertEqual(self.pipe.get_state_vector(), initial_state)
|
|
row = report["rows"][0]
|
|
self.assertAlmostEqual(row["port1MassFlowError"], 0.0, places=15)
|
|
self.assertAlmostEqual(row["port2MassFlowError"], 0.0, places=15)
|
|
self.assertAlmostEqual(row["reynoldsError"], 0.0, places=12)
|
|
self.assertAlmostEqual(row["frictionFactorError"], 0.0, places=15)
|
|
|
|
def test_missing_saved_variable_has_actionable_error(self) -> None:
|
|
results = self._matching_results()
|
|
results.series_by_data_path.pop("ff")
|
|
|
|
with self.assertRaisesRegex(
|
|
ValueError,
|
|
"AMESim replay variable is not saved: ff",
|
|
):
|
|
replay_pnl0002_amesim_states(self.pipe, results, self.paths)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|