"""postprocessing variable entity (Post class definition)"""
from typing import Any
import os
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
from cupy import ndarray
else:
import numpy as np
from numpy import ndarray
from g3d.defs import G3DEntity
from g3d.defs import FunctionByPass
from g3d.gas import Gas
from g3d.flow.vars import Auxv, Cons
[docs]
class Post(G3DEntity):
def __init__(self, *args: Any, **kwargs: Any) -> None:
self._p0 = 101325.
self._t0 = 293.
self._M = 0.
self._s = 0.
super().__init__(*args, **kwargs)
def _set_default(self) -> None:
super()._set_default()
self._tag = 'g3d_post'
def _set_from_args(self, *args: Any, **kwargs: Any) -> ndarray:
bps = self._get_function_evaluate_status(**kwargs)
if bps is FunctionByPass.SELF:
args_stat = np.ones(len(args))
else:
args_stat = super()._set_from_args(*args)
if bps in [FunctionByPass.EVALUATE, FunctionByPass.SELF]:
if np.sum(args_stat) > 0:
flow_data = []
gas = None
auxv = None
cons = None
for i in range(len(args)):
if args_stat[i] == 1:
arg = args[i]
if type(arg) is Post:
args_stat[i] = 0
self.copy(arg)
elif type(arg) is Gas:
args_stat[i] = 0
gas = arg
elif type(arg) is Auxv:
args_stat[i] = 0
auxv = arg
elif type(arg) is Cons:
args_stat[i] = 0
cons = arg
elif type(arg) is list:
args_stat[i] = 0
if self._list_is_all_floats(arg) and len(arg) == 4:
self._p0, self._t0, self._M, self._s = arg
elif type(arg) in [float, np.float64, np.float32, int, np.int64, np.int32]:
args_stat[i] = 0
flow_data.append(np.float64(arg))
if cons is not None and auxv is not None and gas is not None:
self.update(cons, auxv, gas)
elif len(flow_data) == 3:
self._set_from_args(flow_data, bps=FunctionByPass.SELF)
return args_stat
[docs]
def set_from_key_value(self, key: str, value: Any) -> bool:
if super().set_from_key_value(key, value):
return True
elif key == 'p0':
self._p0 = value
return True
elif key == 't0':
self._t0 = value
return True
elif key == 'M':
self._M = value
return True
elif key == 's':
self._s = value
return True
return False
@property
def p0(self) -> float:
"""
:return:
"""
return self._p0
@p0.setter
def p0(self, val: float) -> None:
self._p0 = val
@property
def t0(self) -> float:
"""
:return:
"""
return self._t0
@t0.setter
def t0(self, val: float) -> None:
self._t0 = val
@property
def M(self) -> float:
"""
:return:
"""
return self._M
@M.setter
def M(self, val: float) -> None:
self._M = val
@property
def s(self) -> float:
"""
:return:
"""
return self._s
@s.setter
def s(self, val: float) -> None:
self._s = val
[docs]
def copy(self, post: 'Post') -> None:
super().copy(post)
self._p0 = post.p0
self._t0 = post.t0
self._M = post.M
self._s = post.s
[docs]
def update(self, cons: Cons, auxv: Auxv, gas: Gas) -> None:
"""
:param cons:
:param auxv:
:param gas:
"""
self._M = ((auxv.u ** 2 + auxv.v ** 2 + auxv.w ** 2) ** 0.5) / auxv.c
self._t0 = auxv.t * (1. + 0.5 * gas.gm1 * self._M ** 2)
self._p0 = auxv.p * (1. + 0.5 * gas.gm1 * self._M ** 2) ** gas.g_over_gm1
self._s = auxv.p / cons.ro ** gas.gamma
[docs]
def print(self) -> None:
print(' total pressure %11.5E [Pa] ' % self._p0)
print(' total temperature %11.5E [K] ' % self._t0)
print(' Mach number %11.5E [m/s]' % self._M)
print(' entropy %11.5E [J/K]' % self._s)