195 lines
5.7 KiB
Python
195 lines
5.7 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
from app.simulation.examples.test_mql.primitives.pneumatic import (
|
|
HELIUM_PNEUMATIC_GAS,
|
|
AmesimPneumaticGas,
|
|
)
|
|
from app.simulation.examples.test_mql.primitives.pneumatic_lines import (
|
|
AmesimPnl0001Pipe,
|
|
AmesimPnl0002Pipe,
|
|
AmesimPnl0003Pipe,
|
|
AmesimPnl00rPipe,
|
|
)
|
|
from app.simulation.examples.test_mql.line_parameters import (
|
|
TestMqlPnl0001Spec,
|
|
TestMqlPnl0002Spec,
|
|
TestMqlPnl0003Spec,
|
|
TestMqlPnl00rSpec,
|
|
load_test_mql_pnl0001_specs,
|
|
load_test_mql_pnl0002_specs,
|
|
load_test_mql_pnl0003_specs,
|
|
load_test_mql_pnl00r_specs,
|
|
)
|
|
|
|
|
|
TEST_MQL_PNL0001_D20_L1_LINEAR_CONDUCTANCE = 5.5636e-6
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlPnl0001Assembly:
|
|
specs: tuple[TestMqlPnl0001Spec, ...]
|
|
lines: dict[str, AmesimPnl0001Pipe]
|
|
|
|
def spec(self, alias: str) -> TestMqlPnl0001Spec:
|
|
for spec in self.specs:
|
|
if spec.alias == alias:
|
|
return spec
|
|
raise KeyError(alias)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlPnl0002Assembly:
|
|
specs: tuple[TestMqlPnl0002Spec, ...]
|
|
lines: dict[str, AmesimPnl0002Pipe]
|
|
|
|
def spec(self, alias: str) -> TestMqlPnl0002Spec:
|
|
for spec in self.specs:
|
|
if spec.alias == alias:
|
|
return spec
|
|
raise KeyError(alias)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlPnl0003Assembly:
|
|
specs: tuple[TestMqlPnl0003Spec, ...]
|
|
lines: dict[str, AmesimPnl0003Pipe]
|
|
|
|
def spec(self, alias: str) -> TestMqlPnl0003Spec:
|
|
for spec in self.specs:
|
|
if spec.alias == alias:
|
|
return spec
|
|
raise KeyError(alias)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlPnl00rAssembly:
|
|
specs: tuple[TestMqlPnl00rSpec, ...]
|
|
lines: dict[str, AmesimPnl00rPipe]
|
|
|
|
def spec(self, alias: str) -> TestMqlPnl00rSpec:
|
|
for spec in self.specs:
|
|
if spec.alias == alias:
|
|
return spec
|
|
raise KeyError(alias)
|
|
|
|
|
|
def build_test_mql_pnl0001_assembly(
|
|
archive_path: str | Path,
|
|
*,
|
|
gas: AmesimPneumaticGas = HELIUM_PNEUMATIC_GAS,
|
|
) -> TestMqlPnl0001Assembly:
|
|
specs = load_test_mql_pnl0001_specs(archive_path)
|
|
lines = {
|
|
spec.alias: AmesimPnl0001Pipe(
|
|
name=spec.alias,
|
|
diameter_mm=spec.diameter_mm,
|
|
length_m=spec.length_m,
|
|
relative_roughness=spec.relative_roughness,
|
|
polytropic_constant=spec.polytropic_constant,
|
|
heat_transfer_coefficient=spec.heat_transfer_coefficient,
|
|
external_temperature_k=spec.external_temperature_k,
|
|
calibrated_linear_conductance=(
|
|
_test_mql_pnl0001_calibrated_linear_conductance(spec)
|
|
),
|
|
gas=gas,
|
|
p0=spec.initial_absolute_pressure_pa,
|
|
T0=spec.initial_temperature_k,
|
|
)
|
|
for spec in specs
|
|
}
|
|
return TestMqlPnl0001Assembly(specs=specs, lines=lines)
|
|
|
|
|
|
def _test_mql_pnl0001_calibrated_linear_conductance(
|
|
spec: TestMqlPnl0001Spec,
|
|
) -> float | None:
|
|
if spec.target_component.startswith("pn_c1_") and _matches_geometry(
|
|
spec, diameter_mm=20.0, length_m=1.0
|
|
):
|
|
return TEST_MQL_PNL0001_D20_L1_LINEAR_CONDUCTANCE
|
|
return None
|
|
|
|
|
|
def _matches_geometry(
|
|
spec: TestMqlPnl0001Spec,
|
|
*,
|
|
diameter_mm: float,
|
|
length_m: float,
|
|
) -> bool:
|
|
return (
|
|
abs(spec.diameter_mm - diameter_mm) < 1.0e-12
|
|
and abs(spec.length_m - length_m) < 1.0e-12
|
|
)
|
|
|
|
|
|
def build_test_mql_pnl0002_assembly(
|
|
archive_path: str | Path,
|
|
*,
|
|
gas: AmesimPneumaticGas = HELIUM_PNEUMATIC_GAS,
|
|
) -> TestMqlPnl0002Assembly:
|
|
specs = load_test_mql_pnl0002_specs(archive_path)
|
|
lines = {
|
|
spec.alias: AmesimPnl0002Pipe(
|
|
name=spec.alias,
|
|
diameter_mm=spec.diameter_mm,
|
|
length_m=spec.length_m,
|
|
relative_roughness=spec.relative_roughness,
|
|
polytropic_constant=spec.polytropic_constant,
|
|
heat_transfer_coefficient=spec.heat_transfer_coefficient,
|
|
external_temperature_k=spec.external_temperature_k,
|
|
gas=gas,
|
|
pctr_0=spec.initial_center_absolute_pressure_pa,
|
|
Tctr_0=spec.initial_center_temperature_k,
|
|
)
|
|
for spec in specs
|
|
}
|
|
return TestMqlPnl0002Assembly(specs=specs, lines=lines)
|
|
|
|
|
|
def build_test_mql_pnl0003_assembly(
|
|
archive_path: str | Path,
|
|
*,
|
|
gas: AmesimPneumaticGas = HELIUM_PNEUMATIC_GAS,
|
|
) -> TestMqlPnl0003Assembly:
|
|
specs = load_test_mql_pnl0003_specs(archive_path)
|
|
lines = {
|
|
spec.alias: AmesimPnl0003Pipe(
|
|
name=spec.alias,
|
|
diameter_mm=spec.diameter_mm,
|
|
length_m=spec.length_m,
|
|
relative_roughness=spec.relative_roughness,
|
|
polytropic_constant=spec.polytropic_constant,
|
|
heat_transfer_coefficient=spec.heat_transfer_coefficient,
|
|
external_temperature_k=spec.external_temperature_k,
|
|
gas=gas,
|
|
p1_0=spec.initial_absolute_pressure_1_pa,
|
|
T1_0=spec.initial_temperature_1_k,
|
|
p2_0=spec.initial_absolute_pressure_2_pa,
|
|
T2_0=spec.initial_temperature_2_k,
|
|
)
|
|
for spec in specs
|
|
}
|
|
return TestMqlPnl0003Assembly(specs=specs, lines=lines)
|
|
|
|
|
|
def build_test_mql_pnl00r_assembly(
|
|
archive_path: str | Path,
|
|
*,
|
|
gas: AmesimPneumaticGas = HELIUM_PNEUMATIC_GAS,
|
|
) -> TestMqlPnl00rAssembly:
|
|
specs = load_test_mql_pnl00r_specs(archive_path)
|
|
lines = {
|
|
spec.alias: AmesimPnl00rPipe(
|
|
name=spec.alias,
|
|
diameter_mm=spec.diameter_mm,
|
|
length_m=spec.length_m,
|
|
relative_roughness=spec.relative_roughness,
|
|
gas=gas,
|
|
)
|
|
for spec in specs
|
|
}
|
|
return TestMqlPnl00rAssembly(specs=specs, lines=lines)
|