"""min pressure limiter"""
from typing import Any
import os
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
else:
import numpy as np
from g3d.defs import G3DWorld
from .limiter import Limiter
from g3d.flow.domain import Domain
[docs]
class PMin(Limiter):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
def _set_default(self) -> None:
super()._set_default()
self._tag = "g3d_p_min_limiter"
[docs]
def set_from_key_value(self, key: str, value: Any) -> bool:
if super().set_from_key_value(key, value):
return True
elif key == 'p_min':
self._limit = value
return True
return False
[docs]
def evaluate(self, dom: Domain) -> None:
"""
:param dom:
"""
g3d_world = G3DWorld()
if self._limit is None:
self._limit = g3d_world.num.limiters.p_min
p, u, v, w, t, c = dom.get_auxv_arrays()
ro, ru, rv, rw, et = dom.get_cons_arrays()
idx1 = 0
idx2 = g3d_world.sizes.n_cells
p[idx1:idx2] = np.maximum(self._limit, p[idx1:idx2])
t[idx1:idx2] = p[idx1:idx2] / (ro[idx1:idx2] * dom.gas.R)
c[idx1:idx2] = np.sqrt(dom.gas.gamma * dom.gas.R * t[idx1:idx2])
et[idx1:idx2] = ((p[idx1:idx2] / (dom.gas.gamma - 1.0)) +
0.5 * (ru[idx1:idx2] * u[idx1:idx2] +
rv[idx1:idx2] * v[idx1:idx2] +
rw[idx1:idx2] * w[idx1:idx2]))