Source code for g3d.calc.calculators.ideal_gas

"""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)