Source code for g3d.flow.solver.limiters.p_max

"""max 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 PMax(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_max_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_max': 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_max 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.minimum(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]))