Source code for g3d.flow.solver.rhs.moc

"""method of characteristics (MOC) operator (MOC class definition)"""
from g3d.gas import Gas


[docs] class MOC: """ """ def __init__(self) -> None: self._sx = 0. self._sy = 0. self._sz = 0. self._sl = 0. self._ro_a = 0. self._u_a = 0. self._v_a = 0. self._w_a = 0. self._c_a = 0. self._ro_l = 0. self._u_l = 0. self._v_l = 0. self._w_l = 0. self._p_l = 0. self._ro_r = 0. self._u_r = 0. self._v_r = 0. self._w_r = 0. self._p_r = 0. self._ro_m = 0. self._ru_m = 0. self._rv_m = 0. self._rw_m = 0. self._et_m = 0. self._u_m = 0. self._v_m = 0. self._w_m = 0. self._p_m = 0. self._c_m = 0. self.__r1 = 0. self.__r2 = 0. self.__r3 = 0. self.__r4 = 0. self.__r5 = 0. self.__gas = Gas() self.__initialize() def __initialize(self) -> None: # self.nullify() # primary metrics self._sx = 0. self._sy = 0. self._sz = 0. self._sl = 0. # secondary metrics self.__sh = 0. self.__sxh = 0. self.__syh = 0. self.__sxl = 0. self.__syl = 0. self.__szl = 0. self.__shl = 0. # average flow properties self._ro_a = 0. self._u_a = 0. self._v_a = 0. self._w_a = 0. self._c_a = 0. # left flow properties self._ro_l = 0. self._u_l = 0. self._v_l = 0. self._w_l = 0. self._p_l = 0. # right flow properties self._ro_r = 0. self._u_r = 0. self._v_r = 0. self._w_r = 0. self._p_r = 0. # eigenvalues self.__ev1 = 0. self.__ev4 = 0. self.__ev5 = 0. # characteristic variables self.__r1 = 0. self.__r2 = 0. self.__r3 = 0. self.__r4 = 0. self.__r5 = 0. # conservative variables self._ro_m = 0. self._ru_m = 0. self._rv_m = 0. self._rw_m = 0. self._et_m = 0. # primitive variables self._u_m = 0. self._v_m = 0. self._w_m = 0. self._p_m = 0. self._c_m = 0.
[docs] def associate(self, gas: Gas) -> None: """ :param gas: """ self.__gas = gas
# ======================================= # setters and getters # ======================================= # primary metrics @property def sx(self) -> float: """ :return: """ return self._sx @sx.setter def sx(self, val: float) -> None: self._sx = val @property def sy(self) -> float: """ :return: """ return self._sy @sy.setter def sy(self, val: float) -> None: self._sy = val @property def sz(self) -> float: """ :return: """ return self._sz @sz.setter def sz(self, val: float) -> None: self._sz = val @property def sl(self) -> float: """ :return: """ return self._sl @sl.setter def sl(self, val: float) -> None: self._sl = val # average flow properties @property def ro_a(self) -> float: """ :return: """ return self._ro_a @ro_a.setter def ro_a(self, val: float) -> None: self._ro_a = val @property def u_a(self) -> float: """ :return: """ return self._u_a @u_a.setter def u_a(self, val: float) -> None: self._u_a = val @property def v_a(self) -> float: """ :return: """ return self._v_a @v_a.setter def v_a(self, val: float) -> None: self._v_a = val @property def w_a(self) -> float: """ :return: """ return self._w_a @w_a.setter def w_a(self, val: float) -> None: self._w_a = val @property def c_a(self) -> float: """ :return: """ return self._c_a @c_a.setter def c_a(self, val: float) -> None: self._c_a = val # left flow properties @property def ro_l(self) -> float: """ :return: """ return self._ro_l @ro_l.setter def ro_l(self, val: float) -> None: self._ro_l = val @property def u_l(self) -> float: """ :return: """ return self._u_l @u_l.setter def u_l(self, val: float) -> None: self._u_l = val @property def v_l(self) -> float: """ :return: """ return self._v_l @v_l.setter def v_l(self, val: float) -> None: self._v_l = val @property def w_l(self) -> float: """ :return: """ return self._w_l @w_l.setter def w_l(self, val: float) -> None: self._w_l = val @property def p_l(self) -> float: """ :return: """ return self._p_l @p_l.setter def p_l(self, val: float) -> None: self._p_l = val # right flow properties @property def ro_r(self) -> float: """ :return: """ return self._ro_r @ro_r.setter def ro_r(self, val: float) -> None: self._ro_r = val @property def u_r(self) -> float: """ :return: """ return self._u_r @u_r.setter def u_r(self, val: float) -> None: self._u_r = val @property def v_r(self) -> float: """ :return: """ return self._v_r @v_r.setter def v_r(self, val: float) -> None: self._v_r = val @property def w_r(self) -> float: """ :return: """ return self._w_r @w_r.setter def w_r(self, val: float) -> None: self._w_r = val @property def p_r(self) -> float: """ :return: """ return self._p_r @p_r.setter def p_r(self, val: float) -> None: self._p_r = val # conservative variables @property def ro_m(self) -> float: """ :return: """ return self._ro_m @property def ru_m(self) -> float: """ :return: """ return self._ru_m @property def rv_m(self) -> float: """ :return: """ return self._rv_m @property def rw_m(self) -> float: """ :return: """ return self._rw_m @property def et_m(self) -> float: """ :return: """ return self._et_m # primitive variables @property def u_m(self) -> float: """ :return: """ return self._u_m @property def v_m(self) -> float: """ :return: """ return self._v_m @property def w_m(self) -> float: """ :return: """ return self._w_m @property def p_m(self) -> float: """ :return: """ return self._p_m @property def c_m(self) -> float: """ :return: """ return self._c_m
[docs] def update(self) -> None: """ """ self.__update_metrics() self.__calculate_eigenvalues()
def __update_metrics(self) -> None: self.__sh = (self._sx ** 2 + self._sy ** 2) ** 0.5 self.__sxh = 1. self.__syh = 0. if self.__sh != 0.: self.__sxh = self._sx / self.__sh self.__syh = self._sy / self.__sh self.__sxl = self._sx / self._sl self.__syl = self._sy / self._sl self.__szl = self._sz / self._sl self.__shl = self.__sh / self._sl def __calculate_eigenvalues(self) -> None: self.__ev1 = self._u_a * self._sx + self._v_a * self._sy + self._w_a * self._sz self.__ev4 = self.__ev1 + self._c_a * self._sl self.__ev5 = self.__ev1 - self._c_a * self._sl
[docs] def evaluate(self) -> None: """ """ c2i = 1.0 / (self._c_a * self._c_a) ro_over_c = 0.5 * self._ro_a / self._c_a c_over_ro = self._c_a / self._ro_a if self.__ev1 < 0.: self.__r1 = self._ro_r - self._p_r * c2i self.__r2 = -self.__syh * self._u_r + self.__sxh * self._v_r self.__r3 = -self.__szl * (self.__sxh * self._u_r + self.__syh * self._v_r) + self.__shl * self._w_r else: self.__r1 = self._ro_l - self._p_l * c2i self.__r2 = -self.__syh * self._u_l + self.__sxh * self._v_l self.__r3 = -self.__szl * (self.__sxh * self._u_l + self.__syh * self._v_l) + self.__shl * self._w_l if self.__ev4 < 0.: self.__r4 = (ro_over_c * (self._u_r * self.__sxl + self._v_r * self.__syl + self._w_r * self.__szl) + 0.5 * self._p_r * c2i) else: self.__r4 = (ro_over_c * (self._u_l * self.__sxl + self._v_l * self.__syl + self._w_l * self.__szl) + 0.5 * self._p_l * c2i) if self.__ev5 < 0.: self.__r5 = (-ro_over_c * (self._u_r * self.__sxl + self._v_r * self.__syl + self._w_r * self.__szl) + 0.5 * self._p_r * c2i) else: self.__r5 = (-ro_over_c * (self._u_l * self.__sxl + self._v_l * self.__syl + self._w_l * self.__szl) + 0.5 * self._p_l * c2i) self._ro_m = self.__r1 + self.__r4 + self.__r5 self._u_m = (-self.__syh * self.__r2 - self.__sxh * self.__szl * self.__r3 + c_over_ro * self.__sxl * (self.__r4 - self.__r5)) self._v_m = (self.__sxh * self.__r2 - self.__syh * self.__szl * self.__r3 + c_over_ro * self.__syl * (self.__r4 - self.__r5)) self._w_m = self.__shl * self.__r3 + c_over_ro * self.__szl * (self.__r4 - self.__r5) self._p_m = self._c_a * self._c_a * (self.__r4 + self.__r5) self._c_m = (self.__gas.gamma * self._p_m / self._ro_m) ** 0.5 self._ru_m = self._ro_m * self._u_m self._rv_m = self._ro_m * self._v_m self._rw_m = self._ro_m * self._w_m self._et_m = (self._p_m / self.__gas.gm1 + self._ro_m * 0.5 * (self._u_m * self._u_m + self._v_m * self._v_m + self._w_m * self._w_m))