增加可选性能埋点并完成物性效率评估
This commit is contained in:
1 parent
4e0b9fd8cc
commit
57b459bc72
21 files changed
+2029
-179
No files matched your search
@@ -4,6 +4,7 @@ from dataclasses import dataclass
|
||||
from typing import Protocol
|
||||
|
||||
from app.simulation.core.errors import RecoverableTrialStateError
|
||||
from app.simulation.performance import profile_property
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -108,9 +109,11 @@ class IdealGasMedium:
|
||||
def cv_at_temperature(self, T: float) -> float:
|
||||
return self.cp_at_temperature(T) - self.R_gas
|
||||
|
||||
@profile_property("density")
|
||||
def density(self, p: float, T: float) -> float:
|
||||
return p / (self.R_gas * T)
|
||||
|
||||
@profile_property("isentropic_density_pressure_factor")
|
||||
def isentropic_density_pressure_factor(
|
||||
self,
|
||||
p: float,
|
||||
@@ -123,6 +126,7 @@ class IdealGasMedium:
|
||||
cv = self.cv_at_temperature(T)
|
||||
return cv / cp
|
||||
|
||||
@profile_property("dynamic_viscosity")
|
||||
def dynamic_viscosity(self, T: float) -> float:
|
||||
"""Return dynamic viscosity using the default air Sutherland law."""
|
||||
|
||||
@@ -135,6 +139,7 @@ class IdealGasMedium:
|
||||
/ (T + self.sutherland_constant)
|
||||
)
|
||||
|
||||
@profile_property("specific_internal_energy")
|
||||
def specific_internal_energy(self, T: float) -> float:
|
||||
delta_T = T - self.T_ref
|
||||
return (
|
||||
@@ -143,10 +148,12 @@ class IdealGasMedium:
|
||||
+ 0.5 * self.cp_slope * delta_T * delta_T
|
||||
)
|
||||
|
||||
@profile_property("specific_internal_energy_at_pressure")
|
||||
def specific_internal_energy_at_pressure(self, p: float, T: float) -> float:
|
||||
del p
|
||||
return self.specific_internal_energy(T)
|
||||
|
||||
@profile_property("specific_enthalpy")
|
||||
def specific_enthalpy(self, T: float) -> float:
|
||||
delta_T = T - self.T_ref
|
||||
return (
|
||||
@@ -155,6 +162,7 @@ class IdealGasMedium:
|
||||
+ 0.5 * self.cp_slope * delta_T * delta_T
|
||||
)
|
||||
|
||||
@profile_property("specific_enthalpy_at_pressure")
|
||||
def specific_enthalpy_at_pressure(self, p: float, T: float) -> float:
|
||||
del p
|
||||
return self.specific_enthalpy(T)
|
||||
@@ -191,6 +199,7 @@ class IdealGasMedium:
|
||||
delta_T = positive_root if abs(positive_root) <= abs(negative_root) else negative_root
|
||||
return self.T_ref + delta_T
|
||||
|
||||
@profile_property("temperature_from_pressure_enthalpy")
|
||||
def temperature_from_pressure_enthalpy(self, p: float, h: float) -> float:
|
||||
del p
|
||||
return self.temperature_from_enthalpy(h)
|
||||
@@ -207,6 +216,7 @@ class IdealGasMedium:
|
||||
raise ValueError("Volume must stay positive.")
|
||||
return m * self.R_gas * T / V
|
||||
|
||||
@profile_property("properties_from_mU")
|
||||
def properties_from_mU(self, m: float, U: float, V: float) -> ThermodynamicProperties:
|
||||
T = self.temperature_from_mass_internal_energy(m, U)
|
||||
p = self.pressure(m, T, V)
|
||||
|
||||
@@ -5,6 +5,8 @@ from app.simulation.core.errors import RecoverableTrialStateError
|
||||
from dataclasses import dataclass
|
||||
from math import acos, cos, isfinite, log, pi, sqrt
|
||||
|
||||
from app.simulation.performance import profile_property
|
||||
|
||||
UNIVERSAL_GAS_CONSTANT = 8.31446261815324
|
||||
# Simcenter Amesim 2404 ``sag_reinit_eos_`` keeps more digits than the
|
||||
# commonly printed Peng-Robinson constants 0.45724 and 0.07780.
|
||||
@@ -97,6 +99,11 @@ class PengRobinsonFluid:
|
||||
) -> float:
|
||||
return self.a_parameter * self.alpha_temperature_second_derivative(temperature)
|
||||
|
||||
@profile_property(
|
||||
"pressure_from_molar_volume",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def pressure_from_molar_volume(self, temperature: float, molar_volume: float) -> float:
|
||||
self._validate_temperature(temperature)
|
||||
if molar_volume <= self.b_parameter:
|
||||
@@ -107,11 +114,21 @@ class PengRobinsonFluid:
|
||||
attractive = a_alpha / (molar_volume * (molar_volume + b) + b * (molar_volume - b))
|
||||
return repulsive - attractive
|
||||
|
||||
@profile_property(
|
||||
"pressure_from_density",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def pressure_from_density(self, temperature: float, density: float) -> float:
|
||||
if density <= 0.0:
|
||||
raise ValueError("Density must be positive.")
|
||||
return self.pressure_from_molar_volume(temperature, self.molar_mass / density)
|
||||
|
||||
@profile_property(
|
||||
"pressure_temperature_derivative_at_density",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def pressure_temperature_derivative_at_density(
|
||||
self,
|
||||
temperature: float,
|
||||
@@ -132,6 +149,11 @@ class PengRobinsonFluid:
|
||||
- self.attractive_parameter_temperature_derivative(temperature) / denominator
|
||||
)
|
||||
|
||||
@profile_property(
|
||||
"pressure_density_derivative_at_temperature",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def pressure_density_derivative_at_temperature(
|
||||
self,
|
||||
temperature: float,
|
||||
@@ -165,6 +187,11 @@ class PengRobinsonFluid:
|
||||
B = b * pressure / (UNIVERSAL_GAS_CONSTANT * temperature)
|
||||
return A, B
|
||||
|
||||
@profile_property(
|
||||
"compressibility_roots",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def compressibility_roots(self, pressure: float, temperature: float) -> tuple[float, ...]:
|
||||
A, B = self.reduced_parameters(pressure, temperature)
|
||||
coefficients = (
|
||||
@@ -178,6 +205,11 @@ class PengRobinsonFluid:
|
||||
raise ValueError("Peng-Robinson cubic produced no physical compressibility root.")
|
||||
return physical_roots
|
||||
|
||||
@profile_property(
|
||||
"compressibility_factor",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def compressibility_factor(
|
||||
self,
|
||||
pressure: float,
|
||||
@@ -193,6 +225,11 @@ class PengRobinsonFluid:
|
||||
return roots[-1]
|
||||
raise ValueError(f"Unsupported phase selector: {phase!r}")
|
||||
|
||||
@profile_property(
|
||||
"molar_volume",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def molar_volume(
|
||||
self,
|
||||
pressure: float,
|
||||
@@ -202,6 +239,7 @@ class PengRobinsonFluid:
|
||||
z = self.compressibility_factor(pressure, temperature, phase=phase)
|
||||
return z * UNIVERSAL_GAS_CONSTANT * temperature / pressure
|
||||
|
||||
@profile_property("density", layer="kernel", minimum_mode="audit")
|
||||
def density(
|
||||
self,
|
||||
pressure: float,
|
||||
@@ -210,6 +248,11 @@ class PengRobinsonFluid:
|
||||
) -> float:
|
||||
return self.molar_mass / self.molar_volume(pressure, temperature, phase=phase)
|
||||
|
||||
@profile_property(
|
||||
"residual_specific_enthalpy",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def residual_specific_enthalpy(
|
||||
self,
|
||||
pressure: float,
|
||||
@@ -239,6 +282,11 @@ class PengRobinsonFluid:
|
||||
)
|
||||
return residual_molar_enthalpy / self.molar_mass
|
||||
|
||||
@profile_property(
|
||||
"residual_specific_internal_energy_at_density",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def residual_specific_internal_energy_at_density(
|
||||
self,
|
||||
temperature: float,
|
||||
@@ -268,6 +316,11 @@ class PengRobinsonFluid:
|
||||
) * log(log_argument) / (2.0 * sqrt(2.0) * b)
|
||||
return residual_molar_internal_energy / self.molar_mass
|
||||
|
||||
@profile_property(
|
||||
"residual_isochoric_heat_capacity_at_density",
|
||||
layer="kernel",
|
||||
minimum_mode="audit",
|
||||
)
|
||||
def residual_isochoric_heat_capacity_at_density(
|
||||
self,
|
||||
temperature: float,
|
||||
|
||||
Reference in new issue
Block a user