"""TVD limiters (density, turbulence model variables, generic)"""
from typing import Union
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
[docs]
class TVD:
"""
"""
def __init__(self) -> None:
pass
[docs]
def evaluate(self, ev, r, val_r, val_l):
"""
:param ev:
:param r:
:param val_r:
:param val_l:
"""
pass
[docs]
class TVDGeneric(TVD):
"""
"""
def __init__(self) -> None:
super().__init__()
self.__alpha = 0.
self.__beta = 0.
self.__div = 0.
self.reset()
[docs]
def reset(self) -> None:
"""
"""
self.__alpha = 0.
self.__beta = 0.
self.__div = 0.
def _limit_check(self) -> Union[float, None]:
if np.abs(self.__div) < 1.e-10:
if self.__div == 0.:
return 1.e-10
return 1.e-10 * np.sign(self.__div)
return None
def _update_beta(self) -> None:
self.__beta = np.max([self.__beta, self.__alpha])
if 0. <= self.__alpha < 1.0:
if self.__alpha < 0.1:
self.__beta = np.min([self.__beta, 10. * self.__alpha])
else:
self.__beta = np.min([self.__beta, 1.])
else:
self.__beta = np.min([self.__beta, self.__alpha])
[docs]
def evaluate(self, ev: float, r: Union[ndarray, list[float]], val_r: float, val_l: float) -> float:
"""
:param ev:
:param r:
:param val_r:
:param val_l:
:return:
"""
if ev < 0.:
self.__div = r[1] - r[3]
self._limit_check()
self.__alpha = (r[2] - r[3]) / self.__div
self.__beta = (val_r - r[3]) / self.__div
self._update_beta()
return r[3] + self.__beta * self.__div
else:
self.__div = r[2] - r[0]
self._limit_check()
self.__alpha = (r[1] - r[0]) / self.__div
self.__beta = (val_l - r[0]) / self.__div
self._update_beta()
return r[0] + self.__beta * self.__div
[docs]
class TVDro(TVDGeneric):
"""
"""
def __init__(self) -> None:
super().__init__()
[docs]
def evaluate(self, ev: float, r: Union[ndarray, list[float]], val_r: float, val_l: float) -> float:
"""
:param ev:
:param r:
:param val_r:
:param val_l:
"""
pass
[docs]
class TVDTurb(TVDGeneric):
"""
"""
def __init__(self):
super().__init__()
[docs]
def evaluate(self, ev: float, r: Union[ndarray, list[float]], val_r: float, val_l: float) -> float:
"""
:param ev:
:param r:
:param val_r:
:param val_l:
"""
pass