User-Defined Fluid

Provides a fluid implementation where applications supply the core property values directly. Prefer creating this fluid with scp.get_fluid("user_defined", ...). Viscosity, specific heat, density, and conductivity are required. Each property can be a constant value or a callable that accepts temperature in Celsius. Freeze point is optional and defaults to 0 C.

Example with inline property values:

from scp import get_fluid

if __name__ == "__main__":
    custom_fluid = get_fluid(
        "user_defined",
        name="CustomFluid",
        viscosity=lambda temp: 0.003 - 1.0e-5 * temp,
        specific_heat=3200.0,
        density=lambda temp: 1000.0 - 0.5 * temp,
        conductivity=0.42,
        freeze_point=-12.0,
        t_min=-20.0,
        t_max=80.0,
    )

    temp = 20.0  # Celsius
    viscosity = custom_fluid.viscosity(temp)
    density = custom_fluid.density(temp)
    specific_heat = custom_fluid.specific_heat(temp)
    conductivity = custom_fluid.conductivity(temp)
    prandtl = custom_fluid.prandtl(temp)
    thermal_diffusivity = custom_fluid.thermal_diffusivity(temp)
    freeze_point = custom_fluid.freeze_point()

    print(f"Viscosity: {viscosity} {custom_fluid.viscosity_units()}")
    print(f"Density: {density} {custom_fluid.density_units()}")
    print(f"Specific heat: {specific_heat} {custom_fluid.specific_heat_units()}")
    print(f"Conductivity: {conductivity} {custom_fluid.conductivity_units()}")
    print(f"Prandtl number: {prandtl} {custom_fluid.prandtl_units()}")
    print(f"Thermal diffusivity: {thermal_diffusivity} {custom_fluid.thermal_diffusivity_units()}")
    print(f"Freeze point: {freeze_point} {custom_fluid.freeze_point_units()}")

Example using a reusable property object:

from scp import UserDefinedProperties, get_fluid

properties = UserDefinedProperties(
    viscosity=0.002,
    specific_heat=3200.0,
    density=1050.0,
    conductivity=0.42,
    freeze_point=-12.0,
)

custom_fluid = get_fluid(
    "user_defined",
    name="CustomFluid",
    properties=properties,
    t_min=-20.0,
    t_max=80.0,
)
class scp.user_defined.UserDefinedFluid(properties: UserDefinedProperties, *, name: str = 'UserDefinedFluid', t_min: float = -273.15, t_max: float = 1000.0)[source]

Bases: BaseFluid

A fluid whose core properties are provided by the user.

Each temperature-dependent property may be supplied as either a constant value or a callable that accepts temperature in Celsius and returns the property value in the same units used by scp.base_fluid.BaseFluid.

conductivity(temp: float) float[source]

Returns the user-defined thermal conductivity.

@param temp: Fluid temperature, in degrees Celsius @return: Thermal conductivity in [W/m-K]

density(temp: float) float[source]

Returns the user-defined density.

@param temp: Fluid temperature, in degrees Celsius @return: Density in [kg/m3]

property fluid_name: str

Returns the descriptive fluid name.

@return: Fluid name

freeze_point(x: float | None = None) float[source]

Returns the user-defined freezing point.

@param x: Optional concentration fraction @return: Freezing point temperature in Celsius

specific_heat(temp: float) float[source]

Returns the user-defined specific heat.

@param temp: Fluid temperature, in degrees Celsius @return: Specific heat in [J/kg-K]

viscosity(temp: float) float[source]

Returns the user-defined dynamic viscosity.

@param temp: Fluid temperature, in degrees Celsius @return: Dynamic viscosity in [Pa-s]

class scp.user_defined.UserDefinedProperties(viscosity: float | Callable[[float], float], specific_heat: float | Callable[[float], float], density: float | Callable[[float], float], conductivity: float | Callable[[float], float], freeze_point: float | Callable[[float | None], float] = 0.0)[source]

Bases: object

Core user-defined fluid properties.

conductivity: float | Callable[[float], float]
density: float | Callable[[float], float]
freeze_point: float | Callable[[float | None], float] = 0.0
specific_heat: float | Callable[[float], float]
viscosity: float | Callable[[float], float]