Source code for g3d.flow.vars.post

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