"""Ideal-gas calculator"""
import os
from typing import Union, Any
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
else:
import numpy as np
from .calculator import G3DCalculator
from g3d.defs import CFlowVariableType
[docs]
class G3DIdealGasCalculator(G3DCalculator):
"""Class collecting functions related to the thermodynamics state"""
def __init__(self, *args: Any, **kwargs: Any) -> None:
"""Initialize calculator parameters"""
super().__init__(*args, **kwargs)
def _set_default(self) -> None:
super()._set_default()
self.__P = self._vars.add(name="P", long_name="Pressure", type=CFlowVariableType.PRESSURE)
self.__T = self._vars.add(name="T", long_name="Temperature", type=CFlowVariableType.TEMPERATURE)
self.__RO = self._vars.add(name="RO", long_name="Density", type=CFlowVariableType.DENSITY)
self.__C = self._vars.add(name="C", long_name="Speed of sound", type=CFlowVariableType.VELOCITY)
@property
def P(self) -> float:
"""Pressure [Pa]"""
return self.__P.value
@P.setter
def P(self, val: float) -> None:
self.__P.value = val
@property
def T(self) -> float:
"""Temperature [K]"""
return self.__T.value
@T.setter
def T(self, val: float) -> None:
self.__T.value = val
@property
def RO(self) -> float:
"""Density [kg/m^3]"""
return self.__RO.value
@RO.setter
def RO(self, val: float) -> None:
self.__RO.value = val
@property
def C(self) -> float:
"""Speed of sound [m/s]"""
return self.__C.value
@C.setter
def C(self, val: float) -> None:
self.__C.value = val
[docs]
def get_pressure(self, *args: Any, **kwargs: Any) -> Union[Union[tuple[Any, ...], list[Any]], Any]:
"""
calculates pressure (P [Pa]) using the ideal gas law
input: temperature (T [K]) and density (RO [kg/m^3])
example: P = get_pressure(T=T, RO=RO)
"""
return self._eval(["T", "RO"], self.__get_pressure, *args, **kwargs)
def __get_pressure(self, T: float = None, RO: float = None) -> float:
if T is None:
T = self.__T.value
if RO is None:
RO = self.__RO.value
return self._gas.get_pressure(T, RO)
[docs]
def get_temperature(self, *args: Any, **kwargs: Any) -> Union[Union[tuple[Any, ...], list[Any]], Any]:
"""
calculates temperature (T [K]) using the ideal gas law
input: pressure (P [Pa]) and density (RO [kg/m^3])
example: T = get_temperature(P=P, RO=RO)
"""
return self._eval(["P", "RO"], self.__get_temperature, *args, **kwargs)
def __get_temperature(self, P: float = None, RO: float = None) -> float:
if P is None:
P = self.__P.value
if RO is None:
RO = self.__RO.value
return self._gas.get_temperature(P, RO)
[docs]
def get_density(self, *args: Any, **kwargs: Any) -> Union[Union[tuple[Any, ...], list[Any]], Any]:
"""
calculates density (RO [kg/m^3]) using the ideal gas law
input: pressure (P [Pa]) and temperature (T [K])
example: RO = get_density(P=P, T=T)
"""
return self._eval(["P", "T"], self.__get_density, *args, **kwargs)
def __get_density(self, P: float = None, T: float = None) -> float:
if P is None:
P = self.__P.value
if T is None:
T = self.__T.value
return self._gas.get_density(P, T)
[docs]
def get_speed_of_sound(self, *args: Any, **kwargs: Any) -> Union[Union[tuple[Any, ...], list[Any]], Any]:
"""
calculates speed of sound (C [m/s])
input: temperature (T [K])
example: C = get_speed_of_sound(T=T)
"""
return self._eval(["T"], self.__get_speed_of_sound, *args, **kwargs)
def __get_speed_of_sound(self, T: float = None) -> float:
if T is None:
T = self.__T.value
return self._gas.get_speed_of_sound(T)
[docs]
def get_temperature_from_speed_of_sound(self, *args: Any, **kwargs: Any) \
-> Union[np.float64, list[np.float64], float]:
"""
calculates temperature (T [K]) from speed of sound (C [m/s])
input: speed of sound (C [m/s])
example: T = get_temperature_from_speed_of_sound(C=C)
"""
return self._eval(["C"], self.__get_temperature_from_speed_of_sound, *args, **kwargs)
def __get_temperature_from_speed_of_sound(self, C: float = None) -> float:
if C is None:
C = self.__C.value
return self._gas.get_temperature_from_speed_of_sound(C)