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