Files
SystemSimulationApp/tests/test_peng_robinson.py
T

111 lines
3.9 KiB
Python

from __future__ import annotations
import unittest
from app.simulation.core.peng_robinson import AIR_PR, HELIUM_PR, NITROGEN_PR, PengRobinsonFluid
class PengRobinsonTest(unittest.TestCase):
def test_helium_near_ideal_at_atmospheric_condition(self) -> None:
z = HELIUM_PR.compressibility_factor(101_325.0, 300.0)
density = HELIUM_PR.density(101_325.0, 300.0)
self.assertAlmostEqual(z, 1.0, delta=1.0e-3)
self.assertAlmostEqual(density, 0.1625, delta=0.002)
def test_helium_density_pressure_round_trip(self) -> None:
pressure = 15.3e6
temperature = 293.15
density = HELIUM_PR.density(pressure, temperature)
self.assertGreater(HELIUM_PR.compressibility_factor(pressure, temperature), 1.0)
self.assertAlmostEqual(
density,
24.114225444477153,
delta=1.0e-12,
)
self.assertAlmostEqual(
HELIUM_PR.pressure_from_density(temperature, density),
pressure,
delta=pressure * 1.0e-12,
)
def test_helium_residual_enthalpy_is_small_at_atmosphere(self) -> None:
self.assertAlmostEqual(
HELIUM_PR.residual_specific_enthalpy(101_300.0, 298.15),
25.3556466754,
delta=0.01,
)
def test_helium_residual_enthalpy_captures_high_pressure_departure(self) -> None:
self.assertAlmostEqual(
HELIUM_PR.residual_specific_enthalpy(13_839_965.0, 287.7322),
12788.0457342,
delta=0.1,
)
def test_residual_isochoric_heat_capacity_is_internal_energy_derivative(
self,
) -> None:
temperature = 292.3997890954483
density = 24.02697515640726
temperature_step = 1.0e-3
numerical_derivative = (
HELIUM_PR.residual_specific_internal_energy_at_density(
temperature + temperature_step,
density,
)
- HELIUM_PR.residual_specific_internal_energy_at_density(
temperature - temperature_step,
density,
)
) / (2.0 * temperature_step)
self.assertAlmostEqual(
HELIUM_PR.residual_isochoric_heat_capacity_at_density(
temperature,
density,
),
numerical_derivative,
delta=1.0e-6,
)
def test_air_reference_remains_available_for_other_models(self) -> None:
z = AIR_PR.compressibility_factor(101_325.0, 300.0)
density = AIR_PR.density(101_325.0, 300.0)
self.assertAlmostEqual(z, 1.0, delta=1.0e-3)
self.assertAlmostEqual(density, 1.177, delta=0.01)
def test_nitrogen_can_return_multiple_roots(self) -> None:
roots = NITROGEN_PR.compressibility_roots(1.0e6, 100.0)
self.assertEqual(len(roots), 3)
self.assertLess(roots[0], roots[-1])
self.assertEqual(NITROGEN_PR.compressibility_factor(1.0e6, 100.0, phase="liquid"), roots[0])
self.assertEqual(NITROGEN_PR.compressibility_factor(1.0e6, 100.0, phase="vapor"), roots[-1])
def test_custom_fluid_can_be_defined_explicitly(self) -> None:
fluid = PengRobinsonFluid(
name="custom_helium",
molar_mass=0.004002602,
critical_temperature=5.1953,
critical_pressure=227_460.0,
acentric_factor=-0.382,
)
self.assertAlmostEqual(fluid.specific_gas_constant, 2077.3, delta=0.5)
self.assertAlmostEqual(fluid.compressibility_factor(1.0e6, 298.15), HELIUM_PR.compressibility_factor(1.0e6, 298.15))
def test_rejects_invalid_states(self) -> None:
with self.assertRaises(ValueError):
HELIUM_PR.compressibility_factor(0.0, 300.0)
with self.assertRaises(ValueError):
HELIUM_PR.density(101_325.0, 0.0)
with self.assertRaises(ValueError):
HELIUM_PR.pressure_from_density(300.0, -1.0)
if __name__ == "__main__":
unittest.main()