Source code for encomp.conversion

from typing import Any, assert_never, overload

from .misc import isinstance_types
from .units import Quantity
from .utypes import MT, Density, Mass, MassFlow, Volume, VolumeFlow


@overload
def convert_volume_mass(
    inp: Quantity[Mass, MT], rho: Quantity[Density, MT] | Quantity[Density, float] | None = None
) -> Quantity[Volume, MT]: ...


@overload
def convert_volume_mass(
    inp: Quantity[MassFlow, MT], rho: Quantity[Density, MT] | Quantity[Density, float] | None = None
) -> Quantity[VolumeFlow, MT]: ...


@overload
def convert_volume_mass(
    inp: Quantity[Volume, MT], rho: Quantity[Density, MT] | Quantity[Density, float] | None = None
) -> Quantity[Mass, MT]: ...


@overload
def convert_volume_mass(
    inp: Quantity[VolumeFlow, MT], rho: Quantity[Density, MT] | Quantity[Density, float] | None = None
) -> Quantity[MassFlow, MT]: ...


@overload
def convert_volume_mass(
    inp: (Quantity[Mass, MT] | Quantity[MassFlow, MT] | Quantity[Volume, MT] | Quantity[VolumeFlow, MT]),
    rho: Quantity[Density, MT] | Quantity[Density, float] | None = None,
) -> Quantity[Mass, MT] | Quantity[MassFlow, MT] | Quantity[Volume, MT] | Quantity[VolumeFlow, MT]: ...


[docs] def convert_volume_mass( inp: (Quantity[Mass, MT] | Quantity[MassFlow, MT] | Quantity[Volume, MT] | Quantity[VolumeFlow, MT]), rho: Quantity[Density, MT] | Quantity[Density, float] | None = None, ) -> Quantity[Mass, MT] | Quantity[MassFlow, MT] | Quantity[Volume, MT] | Quantity[VolumeFlow, MT]: """ Converts mass to volume or vice versa. Parameters ---------- inp : M | V Input mass or volume (or flow) rho : Quantity[Density, MT], optional Density, by default 997 kg/m³ Returns ------- M | V Calculated volume or mass (or flow) """ if rho is None: rho = Quantity(997, "kg/m³") if not isinstance_types(rho, Quantity[Density, Any]): assert_never(rho) if isinstance_types(inp, Quantity[Mass, Any]): return (inp / rho).to_reduced_units().asdim(Volume) elif isinstance_types(inp, Quantity[MassFlow, Any]): return (inp / rho).to_reduced_units().asdim(VolumeFlow) elif isinstance_types(inp, Quantity[Volume, Any]): return (inp * rho).to_reduced_units().asdim(Mass) elif isinstance_types(inp, Quantity[VolumeFlow, Any]): return (inp * rho).to_reduced_units().asdim(MassFlow) else: assert_never(inp)