Source code for flow360.component.flow360_params.turbulence_quantities

"""
Turbulence quantities parameters
"""

# pylint: disable=unused-import
from abc import ABCMeta
from typing import Literal, Optional, Union

import pydantic as pd

from ..types import NonNegativeFloat, PositiveFloat
from .params_base import Flow360BaseModel


class TurbulentKineticEnergy(Flow360BaseModel):
    """
    turbulentKineticEnergy : non-dimensional [`C_inf^2`]
        Turbulent kinetic energy. Applicable only when using SST model.
    """

    model_type: Literal["TurbulentKineticEnergy"] = pd.Field(
        "TurbulentKineticEnergy", alias="modelType", const=True
    )
    turbulent_kinetic_energy: Optional[NonNegativeFloat] = pd.Field(alias="turbulentKineticEnergy")


class TurbulentIntensity(Flow360BaseModel):
    """
    turbulentIntensity : non-dimensional [`-`]
        Turbulent intensity. Applicable only when using SST model.
        This is related to turbulent kinetic energy as:
        `turbulentKineticEnergy = 1.5*pow(U_ref * turbulentIntensity, 2)`.
        Note the use of the freestream velocity U_ref instead of C_inf.
    """

    model_type: Literal["TurbulentIntensity"] = pd.Field(
        "TurbulentIntensity", alias="modelType", const=True
    )
    turbulent_intensity: Optional[NonNegativeFloat] = pd.Field(alias="turbulentIntensity")


class _SpecificDissipationRate(Flow360BaseModel, metaclass=ABCMeta):
    """
    specificDissipationRate : non-dimensional [`C_inf/L_gridUnit`]
        Turbulent specific dissipation rate. Applicable only when using SST model.
    """

    model_type: Literal["SpecificDissipationRate"] = pd.Field(
        "SpecificDissipationRate", alias="modelType", const=True
    )
    specific_dissipation_rate: Optional[NonNegativeFloat] = pd.Field(
        alias="specificDissipationRate"
    )


class TurbulentViscosityRatio(Flow360BaseModel):
    """
    turbulentViscosityRatio : non-dimensional [`-`]
        The ratio of turbulent eddy viscosity over the freestream viscosity. Applicable for both SA and SST model.
    """

    model_type: Literal["TurbulentViscosityRatio"] = pd.Field(
        "TurbulentViscosityRatio", alias="modelType", const=True
    )
    turbulent_viscosity_ratio: Optional[NonNegativeFloat] = pd.Field(
        alias="turbulentViscosityRatio"
    )


class TurbulentLengthScale(Flow360BaseModel, metaclass=ABCMeta):
    """
    turbulentLengthScale : non-dimensional [`L_gridUnit`]
        The turbulent length scale is an estimation of the size of the eddies that are modeled/not resolved.
        Applicable only when using SST model. This is related to the turbulent kinetic energy and turbulent
        specific dissipation rate as: `L_T = sqrt(k)/(pow(beta_0^*, 0.25)*w)` where `L_T` is turbulent length scale,
        `k` is turbulent kinetic energy, `beta_0^*` is 0.09 and `w` is turbulent specific dissipation rate.
        Applicable only when using SST model.
    """

    model_type: Literal["TurbulentLengthScale"] = pd.Field(
        "TurbulentLengthScale", alias="modelType", const=True
    )
    turbulent_length_scale: Optional[PositiveFloat] = pd.Field(alias="turbulentLengthScale")


class ModifiedTurbulentViscosityRatio(Flow360BaseModel):
    """
    modifiedTurbulentViscosityRatio : non-dimensional [`-`]
        The ratio of modified turbulent eddy viscosity (SA) over the freestream viscosity.
        Applicable only when using SA model.
    """

    model_type: Literal["ModifiedTurbulentViscosityRatio"] = pd.Field(
        "ModifiedTurbulentViscosityRatio", alias="modelType", const=True
    )
    modified_turbulent_viscosity_ratio: Optional[PositiveFloat] = pd.Field(
        alias="modifiedTurbulentViscosityRatio"
    )


class ModifiedTurbulentViscosity(Flow360BaseModel):
    """
    modifiedTurbulentViscosity : non-dimensional [`C_inf*L_gridUnit`]
        The modified turbulent eddy viscosity (SA). Applicable only when using SA model.
    """

    model_type: Literal["ModifiedTurbulentViscosity"] = pd.Field(
        "ModifiedTurbulentViscosity", alias="modelType", const=True
    )
    modified_turbulent_viscosity: Optional[PositiveFloat] = pd.Field(
        alias="modifiedTurbulentViscosity"
    )


# pylint: disable=missing-class-docstring
class SpecificDissipationRateAndTurbulentKineticEnergy(
    _SpecificDissipationRate, TurbulentKineticEnergy
):
    model_type: Literal["SpecificDissipationRateAndTurbulentKineticEnergy"] = pd.Field(
        "SpecificDissipationRateAndTurbulentKineticEnergy", alias="modelType", const=True
    )


class TurbulentViscosityRatioAndTurbulentKineticEnergy(
    TurbulentViscosityRatio, TurbulentKineticEnergy
):
    model_type: Literal["TurbulentViscosityRatioAndTurbulentKineticEnergy"] = pd.Field(
        "TurbulentViscosityRatioAndTurbulentKineticEnergy", alias="modelType", const=True
    )


class TurbulentLengthScaleAndTurbulentKineticEnergy(TurbulentLengthScale, TurbulentKineticEnergy):
    model_type: Literal["TurbulentLengthScaleAndTurbulentKineticEnergy"] = pd.Field(
        "TurbulentLengthScaleAndTurbulentKineticEnergy", alias="modelType", const=True
    )


class TurbulentIntensityAndSpecificDissipationRate(TurbulentIntensity, _SpecificDissipationRate):
    model_type: Literal["TurbulentIntensityAndSpecificDissipationRate"] = pd.Field(
        "TurbulentIntensityAndSpecificDissipationRate", alias="modelType", const=True
    )


class TurbulentIntensityAndTurbulentViscosityRatio(TurbulentIntensity, TurbulentViscosityRatio):
    model_type: Literal["TurbulentIntensityAndTurbulentViscosityRatio"] = pd.Field(
        "TurbulentIntensityAndTurbulentViscosityRatio", alias="modelType", const=True
    )


class TurbulentIntensityAndTurbulentLengthScale(TurbulentIntensity, TurbulentLengthScale):
    model_type: Literal["TurbulentIntensityAndTurbulentLengthScale"] = pd.Field(
        "TurbulentIntensityAndTurbulentLengthScale", alias="modelType", const=True
    )


class SpecificDissipationRateAndTurbulentViscosityRatio(
    _SpecificDissipationRate, TurbulentViscosityRatio
):
    model_type: Literal["SpecificDissipationRateAndTurbulentViscosityRatio"] = pd.Field(
        "SpecificDissipationRateAndTurbulentViscosityRatio", alias="modelType", const=True
    )


class SpecificDissipationRateAndTurbulentLengthScale(
    _SpecificDissipationRate, TurbulentLengthScale
):
    model_type: Literal["SpecificDissipationRateAndTurbulentLengthScale"] = pd.Field(
        "SpecificDissipationRateAndTurbulentLengthScale", alias="modelType", const=True
    )


class TurbulentViscosityRatioAndTurbulentLengthScale(TurbulentViscosityRatio, TurbulentLengthScale):
    model_type: Literal["TurbulentViscosityRatioAndTurbulentLengthScale"] = pd.Field(
        "TurbulentViscosityRatioAndTurbulentLengthScale", alias="modelType", const=True
    )


# pylint: enable=missing-class-docstring

TurbulenceQuantitiesType = Union[
    TurbulentViscosityRatio,
    TurbulentKineticEnergy,
    TurbulentIntensity,
    TurbulentLengthScale,
    ModifiedTurbulentViscosityRatio,
    ModifiedTurbulentViscosity,
    SpecificDissipationRateAndTurbulentKineticEnergy,
    TurbulentViscosityRatioAndTurbulentKineticEnergy,
    TurbulentLengthScaleAndTurbulentKineticEnergy,
    TurbulentIntensityAndSpecificDissipationRate,
    TurbulentIntensityAndTurbulentViscosityRatio,
    TurbulentIntensityAndTurbulentLengthScale,
    SpecificDissipationRateAndTurbulentViscosityRatio,
    SpecificDissipationRateAndTurbulentLengthScale,
    TurbulentViscosityRatioAndTurbulentLengthScale,
]


# pylint: disable=too-many-arguments, too-many-return-statements, too-many-branches, invalid-name
# using class naming convetion here
[docs] def TurbulenceQuantities( viscosity_ratio=None, modified_viscosity_ratio=None, modified_viscosity=None, specific_dissipation_rate=None, turbulent_kinetic_energy=None, turbulent_length_scale=None, turbulent_intensity=None, ) -> TurbulenceQuantitiesType: """Return a matching tubulence specification object""" non_none_arg_count = sum(arg is not None for arg in locals().values()) if non_none_arg_count == 0: return None if viscosity_ratio is not None: if non_none_arg_count == 1: return TurbulentViscosityRatio(turbulent_viscosity_ratio=viscosity_ratio) if turbulent_kinetic_energy is not None: return TurbulentViscosityRatioAndTurbulentKineticEnergy( turbulent_viscosity_ratio=viscosity_ratio, turbulent_kinetic_energy=turbulent_kinetic_energy, ) if turbulent_intensity is not None: return TurbulentIntensityAndTurbulentViscosityRatio( turbulent_viscosity_ratio=viscosity_ratio, turbulent_intensity=turbulent_intensity, ) if specific_dissipation_rate is not None: return SpecificDissipationRateAndTurbulentViscosityRatio( turbulent_viscosity_ratio=viscosity_ratio, specific_dissipation_rate=specific_dissipation_rate, ) if turbulent_length_scale is not None: return TurbulentViscosityRatioAndTurbulentLengthScale( turbulent_viscosity_ratio=viscosity_ratio, turbulent_length_scale=turbulent_length_scale, ) if modified_viscosity_ratio is not None and non_none_arg_count == 1: return ModifiedTurbulentViscosityRatio( modified_turbulent_viscosity_ratio=modified_viscosity_ratio ) if modified_viscosity is not None and non_none_arg_count == 1: return ModifiedTurbulentViscosity(modified_turbulent_viscosity=modified_viscosity) if turbulent_intensity is not None: if non_none_arg_count == 1: return TurbulentIntensity(turbulent_intensity=turbulent_intensity) if specific_dissipation_rate is not None: return TurbulentIntensityAndSpecificDissipationRate( turbulent_intensity=turbulent_intensity, specific_dissipation_rate=specific_dissipation_rate, ) if turbulent_length_scale is not None: return TurbulentIntensityAndTurbulentLengthScale( turbulent_intensity=turbulent_intensity, turbulent_length_scale=turbulent_length_scale, ) if turbulent_kinetic_energy is not None: if non_none_arg_count == 1: return TurbulentKineticEnergy(turbulent_kinetic_energy=turbulent_kinetic_energy) if specific_dissipation_rate is not None: return SpecificDissipationRateAndTurbulentKineticEnergy( turbulent_kinetic_energy=turbulent_kinetic_energy, specific_dissipation_rate=specific_dissipation_rate, ) if turbulent_length_scale is not None: return TurbulentLengthScaleAndTurbulentKineticEnergy( turbulent_kinetic_energy=turbulent_kinetic_energy, turbulent_length_scale=turbulent_length_scale, ) if turbulent_length_scale is not None and non_none_arg_count == 1: return TurbulentLengthScale(turbulent_length_scale=turbulent_length_scale) if specific_dissipation_rate is not None: if turbulent_length_scale is not None: return SpecificDissipationRateAndTurbulentLengthScale( specific_dissipation_rate=specific_dissipation_rate, turbulent_length_scale=turbulent_length_scale, ) raise ValueError( "Please recheck TurbulenceQuantities inputs and make sure they represents a valid specification." )