"""G3DScheme static class"""
import os
from typing import Any
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
else:
import numpy as np
from g3d.defs import NUMTypes
from g3d.defs import ShockDampingMode
[docs]
class G3DScheme:
"""G3D numerical scheme placeholder"""
__shock_damp_coef = 0.
__entropy_damp_coef = 0.
__shock_damping_mode = ShockDampingMode.JAMESON
__coef_1 = -(1. / 12. + 1. / 12.)
__coef_2 = (7. / 12. + 3. / 12.)
__coef_3 = (7. / 12. - 3. / 12.)
__coef_4 = 0.
__convective_scheme = NUMTypes.THIRD_ORDER_UPWIND
__use_density_tvd_limiter = False
__use_turbulence_model_tvd_limiter = False
# artificial damping
@property
def shock_damp_coef(self) -> float:
"""shock damping coefficient (default value = 0.0)"""
return type(self).__shock_damp_coef
@shock_damp_coef.setter
def shock_damp_coef(self, val: float) -> None:
type(self).__shock_damp_coef = val
@property
def entropy_damp_coef(self) -> float:
"""entropy damping coefficient (default value = 0.0)"""
return type(self).__entropy_damp_coef
@entropy_damp_coef.setter
def entropy_damp_coef(self, val: float) -> None:
type(self).__entropy_damp_coef = val
# shock damping mode
@property
def shock_damping_mode(self) -> Any:
"""
shock damping mode (Enum, default value = ShockDampingMode.JAMESON)
valid options: JAMESON, DUCROSS_FACE_GRADIENTS, DUCROSS_CELL_GRADIENTS
"""
return self.__shock_damping_mode
@shock_damping_mode.setter
def shock_damping_mode(self, m: Any):
if type(m) is ShockDampingMode:
type(self).__shock_damping_mode = m
# TVD limiters
@property
def use_density_tvd_limiter(self) -> bool:
"""use density TVD limiter (default value = False)"""
return self.__use_density_tvd_limiter
@use_density_tvd_limiter.setter
def use_density_tvd_limiter(self, b: bool) -> None:
type(self).__use_density_tvd_limiter = b
@property
def use_turbulence_model_tvd_limiter(self) -> bool:
"""use turbulence model TVD limiter (default value = False)"""
return self.__use_turbulence_model_tvd_limiter
@use_turbulence_model_tvd_limiter.setter
def use_turbulence_model_tvd_limiter(self, b: bool) -> None:
type(self).__use_turbulence_model_tvd_limiter = b
# numerical scheme
@property
def convective_scheme(self) -> Any:
"""convective scheme of G3DFlow cfd solver"""
return type(self).__convective_scheme
@convective_scheme.setter
def convective_scheme(self, it: Any) -> None:
"""
specify convective scheme
input: it (Enum, default value = NUMTypes.THIRD_ORDER_UPWIND)
valid options: FIRST_ORDER_UPWIND, SECOND_ORDER_CENTRAL,
SECOND_ORDER_UPWIND, THIRD_ORDER_UPWIND, FOURTH_ORDER_CENTRAL,
LOW_DISSIPATION_THIRD_ORDER_UPWIND, ULTRA_LOW_DISSIPATION_THIRD_ORDER_UPWIND,
USER_DEFINED
"""
if type(it) is NUMTypes:
type(self).__convective_scheme = it
if it is NUMTypes.FIRST_ORDER_UPWIND:
type(self).__coef_1 = 0.
type(self).__coef_2 = 1.
type(self).__coef_3 = 0.
type(self).__coef_4 = 0.
elif it is NUMTypes.SECOND_ORDER_CENTRAL:
type(self).__coef_1 = 0.
type(self).__coef_2 = 0.5
type(self).__coef_3 = 0.5
type(self).__coef_4 = 0.
elif it is NUMTypes.SECOND_ORDER_UPWIND:
type(self).__coef_1 = -1. / 8.
type(self).__coef_2 = 6. / 8.
type(self).__coef_3 = 3. / 8.
type(self).__coef_4 = 0.
elif it is NUMTypes.THIRD_ORDER_UPWIND:
type(self).__coef_1 = -(1. / 12. + 1. / 12.)
type(self).__coef_2 = (7. / 12. + 3. / 12.)
type(self).__coef_3 = (7. / 12. - 3. / 12.)
type(self).__coef_4 = 0.
elif it is NUMTypes.FOURTH_ORDER_CENTRAL:
type(self).__coef_1 = -1. / 12.
type(self).__coef_2 = 7. / 12.
type(self).__coef_3 = 7. / 12.
type(self).__coef_4 = -1. / 12.
elif it is NUMTypes.LOW_DISSIPATION_THIRD_ORDER_UPWIND:
type(self).__coef_1 = -(1. / 12. + 1. / 96.)
type(self).__coef_2 = (7. / 12. + 3. / 96.)
type(self).__coef_3 = (7. / 12. - 3. / 96.)
type(self).__coef_4 = -(1. / 12. - 1. / 96.)
elif it is NUMTypes.ULTRA_LOW_DISSIPATION_THIRD_ORDER_UPWIND:
type(self).__coef_1 = -(1. / 12. + 1. / 384.)
type(self).__coef_2 = (7. / 12. + 3. / 384.)
type(self).__coef_3 = (7. / 12. - 3. / 384.)
type(self).__coef_4 = -(1. / 12. - 1. / 384.)
@property
def coef_1(self) -> float:
"""convective scheme coefficient 1 (of four coefficients defining the scheme)"""
return type(self).__coef_1
@coef_1.setter
def coef_1(self, val: float) -> None:
type(self).__coef_1 = val
type(self).__convective_scheme = NUMTypes.USER_DEFINED
@property
def coef_2(self) -> float:
"""convective scheme coefficient 2 (of four coefficients defining the scheme)"""
return type(self).__coef_2
@coef_2.setter
def coef_2(self, val: float) -> None:
type(self).__coef_2 = val
type(self).__convective_scheme = NUMTypes.USER_DEFINED
@property
def coef_3(self) -> float:
"""convective scheme coefficient 3 (of four coefficients defining the scheme)"""
return type(self).__coef_3
@coef_3.setter
def coef_3(self, val: float) -> None:
type(self).__coef_3 = val
type(self).__convective_scheme = NUMTypes.USER_DEFINED
@property
def coef_4(self) -> float:
"""convective scheme coefficient 4 (of four coefficients defining the scheme)"""
return type(self).__coef_4
@coef_4.setter
def coef_4(self, val: float) -> None:
type(self).__coef_4 = val
type(self).__convective_scheme = NUMTypes.USER_DEFINED
[docs]
def set_coefs(self, c1: float, c2: float, c3: float, c4: float) -> None:
"""
defining convective scheme by specifying four coefficients
input: coefficients (c1, c2, c3, c4)
"""
type(self).__coef_1 = c1
type(self).__coef_2 = c2
type(self).__coef_3 = c3
type(self).__coef_4 = c4
type(self).__convective_scheme = NUMTypes.USER_DEFINED
[docs]
def get_coefs(self) -> np.ndarray:
"""
returns an array with coefficients of the convective scheme
input: no input
example: [c1, c2, c3, c4] = get_coefs()
"""
return np.array([type(self).__coef_1, type(self).__coef_2, type(self).__coef_3, type(self).__coef_4])
[docs]
def numerical_scheme_report(self) -> None:
"""
prints solver convective scheme
input: no input
"""
print('-' * 80)
print(' numerical scheme:')
print('-' * 80)
print(' scheme type: %s' % type(self).__convective_scheme.name)
print(' coefficients: %10.5E, %10.5E, %10.5E, %10.5E' % (type(self).__coef_1, type(self).__coef_2,
type(self).__coef_3, type(self).__coef_4))
print(' extra artificial numerical damping:')
print(' pressure: %10.5E' % type(self).__shock_damp_coef)
print(' density: %10.5E' % type(self).__entropy_damp_coef)