merge/model-development-into-main #2
No files matched your search
@@ -6,6 +6,7 @@ from math import log10, pi, sqrt
|
|||||||
from PythonModels.components.amesim_pneumatic import (
|
from PythonModels.components.amesim_pneumatic import (
|
||||||
HELIUM_PNEUMATIC_GAS,
|
HELIUM_PNEUMATIC_GAS,
|
||||||
AmesimPneumaticGas,
|
AmesimPneumaticGas,
|
||||||
|
compressible_orifice_mass_flow,
|
||||||
diameter_mm_to_area_m2,
|
diameter_mm_to_area_m2,
|
||||||
)
|
)
|
||||||
from PythonModels.core.base import AlgebraicComponent, DynamicComponent
|
from PythonModels.core.base import AlgebraicComponent, DynamicComponent
|
||||||
@@ -60,6 +61,61 @@ class _DarcyPipeResistanceMixin:
|
|||||||
upper = middle
|
upper = middle
|
||||||
return 0.5 * (lower + upper)
|
return 0.5 * (lower + upper)
|
||||||
|
|
||||||
|
def pn2pipefr_mass_flow(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
port_1_pressure_pa: float,
|
||||||
|
port_1_temperature_k: float,
|
||||||
|
port_2_pressure_pa: float,
|
||||||
|
port_2_temperature_k: float,
|
||||||
|
length: float | None = None,
|
||||||
|
) -> float:
|
||||||
|
pressure_difference = port_1_pressure_pa - port_2_pressure_pa
|
||||||
|
if pressure_difference == 0.0:
|
||||||
|
return 0.0
|
||||||
|
upstream_pressure = max(port_1_pressure_pa, port_2_pressure_pa)
|
||||||
|
downstream_pressure = min(port_1_pressure_pa, port_2_pressure_pa)
|
||||||
|
upstream_temperature = (
|
||||||
|
port_1_temperature_k
|
||||||
|
if pressure_difference > 0.0
|
||||||
|
else port_2_temperature_k
|
||||||
|
)
|
||||||
|
resistance_length = self.length if length is None else length
|
||||||
|
if resistance_length <= 0.0:
|
||||||
|
raise ValueError("length must be positive")
|
||||||
|
|
||||||
|
def target_flow(mass_flow_kg_s: float) -> float:
|
||||||
|
reynolds = self._reynolds_number(mass_flow_kg_s, upstream_temperature)
|
||||||
|
friction_factor = self._friction_factor(reynolds)
|
||||||
|
flow_coefficient = sqrt(
|
||||||
|
self.diameter / (resistance_length * friction_factor)
|
||||||
|
)
|
||||||
|
return compressible_orifice_mass_flow(
|
||||||
|
upstream_pressure=upstream_pressure,
|
||||||
|
downstream_pressure=downstream_pressure,
|
||||||
|
upstream_temperature=upstream_temperature,
|
||||||
|
area=self.area,
|
||||||
|
flow_coefficient=flow_coefficient,
|
||||||
|
gas=self.gas,
|
||||||
|
)
|
||||||
|
|
||||||
|
flow_coefficient = sqrt(self.diameter / (resistance_length * 0.02))
|
||||||
|
magnitude = compressible_orifice_mass_flow(
|
||||||
|
upstream_pressure=upstream_pressure,
|
||||||
|
downstream_pressure=downstream_pressure,
|
||||||
|
upstream_temperature=upstream_temperature,
|
||||||
|
area=self.area,
|
||||||
|
flow_coefficient=flow_coefficient,
|
||||||
|
gas=self.gas,
|
||||||
|
)
|
||||||
|
for _ in range(12):
|
||||||
|
next_magnitude = target_flow(magnitude)
|
||||||
|
if abs(next_magnitude - magnitude) <= max(1.0e-12, abs(magnitude) * 1.0e-9):
|
||||||
|
magnitude = next_magnitude
|
||||||
|
break
|
||||||
|
magnitude = 0.5 * (magnitude + next_magnitude)
|
||||||
|
return magnitude if pressure_difference > 0.0 else -magnitude
|
||||||
|
|
||||||
def _darcy_pressure_drop(
|
def _darcy_pressure_drop(
|
||||||
self,
|
self,
|
||||||
mass_flow_kg_s: float,
|
mass_flow_kg_s: float,
|
||||||
|
|||||||
@@ -280,6 +280,8 @@ class TestMqlPnl0001PressureLossCalibrationDiagnostic:
|
|||||||
amesim_pressure_drop_pa: float
|
amesim_pressure_drop_pa: float
|
||||||
current_darcy_pressure_drop_pa: float
|
current_darcy_pressure_drop_pa: float
|
||||||
pressure_drop_multiplier: float
|
pressure_drop_multiplier: float
|
||||||
|
candidate_pn2pipefr_dm1_g_s: float
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio: float
|
||||||
amesim_linear_conductance_kg_s_sqrt_k_per_pa: float
|
amesim_linear_conductance_kg_s_sqrt_k_per_pa: float
|
||||||
python_linear_conductance_kg_s_sqrt_k_per_pa: float
|
python_linear_conductance_kg_s_sqrt_k_per_pa: float
|
||||||
python_to_amesim_linear_conductance_ratio: float
|
python_to_amesim_linear_conductance_ratio: float
|
||||||
@@ -580,6 +582,7 @@ def _pnl0001_pressure_loss_calibration_diagnostic(
|
|||||||
amesim_line_gauge_pressure_pa = amesim_value(f"p2@{line_alias}")
|
amesim_line_gauge_pressure_pa = amesim_value(f"p2@{line_alias}")
|
||||||
amesim_chamber_gauge_pressure_pa = amesim_value(f"press@{chamber_alias}")
|
amesim_chamber_gauge_pressure_pa = amesim_value(f"press@{chamber_alias}")
|
||||||
amesim_line_temperature_k = amesim_value(f"t2@{line_alias}")
|
amesim_line_temperature_k = amesim_value(f"t2@{line_alias}")
|
||||||
|
amesim_chamber_temperature_k = amesim_value(f"temp@{chamber_alias}")
|
||||||
mass_flow_magnitude_kg_s = abs(amesim_dm1_g_s) * 1.0e-3
|
mass_flow_magnitude_kg_s = abs(amesim_dm1_g_s) * 1.0e-3
|
||||||
amesim_pressure_drop_pa = abs(
|
amesim_pressure_drop_pa = abs(
|
||||||
amesim_line_gauge_pressure_pa - amesim_chamber_gauge_pressure_pa
|
amesim_line_gauge_pressure_pa - amesim_chamber_gauge_pressure_pa
|
||||||
@@ -601,6 +604,25 @@ def _pnl0001_pressure_loss_calibration_diagnostic(
|
|||||||
pressure_drop_multiplier = (
|
pressure_drop_multiplier = (
|
||||||
float("inf") if amesim_pressure_drop_pa > 0.0 else 1.0
|
float("inf") if amesim_pressure_drop_pa > 0.0 else 1.0
|
||||||
)
|
)
|
||||||
|
candidate_port1_to_port2_kg_s = line.pn2pipefr_mass_flow(
|
||||||
|
port_1_pressure_pa=(
|
||||||
|
amesim_chamber_gauge_pressure_pa + AMESIM_REFERENCE_PRESSURE_PA
|
||||||
|
),
|
||||||
|
port_1_temperature_k=amesim_chamber_temperature_k,
|
||||||
|
port_2_pressure_pa=(
|
||||||
|
amesim_line_gauge_pressure_pa + AMESIM_REFERENCE_PRESSURE_PA
|
||||||
|
),
|
||||||
|
port_2_temperature_k=amesim_line_temperature_k,
|
||||||
|
)
|
||||||
|
candidate_pn2pipefr_dm1_g_s = -candidate_port1_to_port2_kg_s * 1.0e3
|
||||||
|
if amesim_dm1_g_s != 0.0:
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio = (
|
||||||
|
candidate_pn2pipefr_dm1_g_s / amesim_dm1_g_s
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio = (
|
||||||
|
float("inf") if candidate_pn2pipefr_dm1_g_s != 0.0 else 1.0
|
||||||
|
)
|
||||||
amesim_linear_conductance = _pnl0001_linear_conductance(
|
amesim_linear_conductance = _pnl0001_linear_conductance(
|
||||||
dm1_g_s=amesim_dm1_g_s,
|
dm1_g_s=amesim_dm1_g_s,
|
||||||
temperature_k=amesim_line_temperature_k,
|
temperature_k=amesim_line_temperature_k,
|
||||||
@@ -634,6 +656,10 @@ def _pnl0001_pressure_loss_calibration_diagnostic(
|
|||||||
amesim_pressure_drop_pa=amesim_pressure_drop_pa,
|
amesim_pressure_drop_pa=amesim_pressure_drop_pa,
|
||||||
current_darcy_pressure_drop_pa=current_darcy_pressure_drop_pa,
|
current_darcy_pressure_drop_pa=current_darcy_pressure_drop_pa,
|
||||||
pressure_drop_multiplier=pressure_drop_multiplier,
|
pressure_drop_multiplier=pressure_drop_multiplier,
|
||||||
|
candidate_pn2pipefr_dm1_g_s=candidate_pn2pipefr_dm1_g_s,
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio=(
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio
|
||||||
|
),
|
||||||
amesim_linear_conductance_kg_s_sqrt_k_per_pa=(
|
amesim_linear_conductance_kg_s_sqrt_k_per_pa=(
|
||||||
amesim_linear_conductance
|
amesim_linear_conductance
|
||||||
),
|
),
|
||||||
@@ -984,6 +1010,10 @@ def format_test_mql_pnvo_event_window_summary(
|
|||||||
f"amesim_dp={pressure_loss.amesim_pressure_drop_pa}, "
|
f"amesim_dp={pressure_loss.amesim_pressure_drop_pa}, "
|
||||||
f"darcy_dp={pressure_loss.current_darcy_pressure_drop_pa}, "
|
f"darcy_dp={pressure_loss.current_darcy_pressure_drop_pa}, "
|
||||||
f"dp_multiplier={pressure_loss.pressure_drop_multiplier}, "
|
f"dp_multiplier={pressure_loss.pressure_drop_multiplier}, "
|
||||||
|
f"candidate_pn2pipefr_dm1="
|
||||||
|
f"{pressure_loss.candidate_pn2pipefr_dm1_g_s}, "
|
||||||
|
f"candidate_pn2pipefr_ratio="
|
||||||
|
f"{pressure_loss.candidate_pn2pipefr_to_amesim_dm1_ratio}, "
|
||||||
f"amesim_linear_k="
|
f"amesim_linear_k="
|
||||||
f"{pressure_loss.amesim_linear_conductance_kg_s_sqrt_k_per_pa}, "
|
f"{pressure_loss.amesim_linear_conductance_kg_s_sqrt_k_per_pa}, "
|
||||||
f"python_linear_k="
|
f"python_linear_k="
|
||||||
|
|||||||
@@ -39,6 +39,24 @@ class AmesimPnl0001PipeTests(unittest.TestCase):
|
|||||||
self.assertLess(reverse, 0.0)
|
self.assertLess(reverse, 0.0)
|
||||||
self.assertAlmostEqual(abs(forward), abs(reverse), delta=abs(forward) * 0.01)
|
self.assertAlmostEqual(abs(forward), abs(reverse), delta=abs(forward) * 0.01)
|
||||||
|
|
||||||
|
def test_pn2pipefr_candidate_flow_follows_pressure_gradient(self) -> None:
|
||||||
|
forward = self.pipe.pn2pipefr_mass_flow(
|
||||||
|
port_1_pressure_pa=15.31e6,
|
||||||
|
port_1_temperature_k=293.15,
|
||||||
|
port_2_pressure_pa=15.3e6,
|
||||||
|
port_2_temperature_k=293.15,
|
||||||
|
)
|
||||||
|
reverse = self.pipe.pn2pipefr_mass_flow(
|
||||||
|
port_1_pressure_pa=15.29e6,
|
||||||
|
port_1_temperature_k=293.15,
|
||||||
|
port_2_pressure_pa=15.3e6,
|
||||||
|
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_calibrated_linear_conductance_overrides_darcy_flow(self) -> None:
|
def test_calibrated_linear_conductance_overrides_darcy_flow(self) -> None:
|
||||||
pipe = AmesimPnl0001Pipe(
|
pipe = AmesimPnl0001Pipe(
|
||||||
name="linear",
|
name="linear",
|
||||||
|
|||||||
@@ -257,6 +257,8 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
|||||||
amesim_pressure_drop_pa=1297629.6,
|
amesim_pressure_drop_pa=1297629.6,
|
||||||
current_darcy_pressure_drop_pa=422633.2,
|
current_darcy_pressure_drop_pa=422633.2,
|
||||||
pressure_drop_multiplier=3.07,
|
pressure_drop_multiplier=3.07,
|
||||||
|
candidate_pn2pipefr_dm1_g_s=424.2,
|
||||||
|
candidate_pn2pipefr_to_amesim_dm1_ratio=1.01,
|
||||||
amesim_linear_conductance_kg_s_sqrt_k_per_pa=5.56e-6,
|
amesim_linear_conductance_kg_s_sqrt_k_per_pa=5.56e-6,
|
||||||
python_linear_conductance_kg_s_sqrt_k_per_pa=1.06e-5,
|
python_linear_conductance_kg_s_sqrt_k_per_pa=1.06e-5,
|
||||||
python_to_amesim_linear_conductance_ratio=1.91,
|
python_to_amesim_linear_conductance_ratio=1.91,
|
||||||
@@ -319,6 +321,8 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
|||||||
self.assertIn("pressure_loss@pneumatic_69", summary)
|
self.assertIn("pressure_loss@pneumatic_69", summary)
|
||||||
self.assertIn("cm=0.0159", summary)
|
self.assertIn("cm=0.0159", summary)
|
||||||
self.assertIn("dp_multiplier=3.07", summary)
|
self.assertIn("dp_multiplier=3.07", summary)
|
||||||
|
self.assertIn("candidate_pn2pipefr_dm1=424.2", summary)
|
||||||
|
self.assertIn("candidate_pn2pipefr_ratio=1.01", summary)
|
||||||
self.assertIn("amesim_linear_k=5.56e-06", summary)
|
self.assertIn("amesim_linear_k=5.56e-06", summary)
|
||||||
self.assertIn("python_linear_k=1.06e-05", summary)
|
self.assertIn("python_linear_k=1.06e-05", summary)
|
||||||
self.assertIn("linear_k_ratio=1.91", summary)
|
self.assertIn("linear_k_ratio=1.91", summary)
|
||||||
|
|||||||
Reference in new issue
Block a user