Source code for g3d.defs.world.numerics.scheme

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