TheAlgorithms/Python · error · ValueError

please ensure that density, diameter and viscosity are posit

Error message

please ensure that density, diameter and viscosity are positive

What it means

Raised by reynolds_number(density, velocity, diameter, viscosity) in physics/reynolds_number.py when density <= 0, diameter <= 0, or viscosity <= 0. Re = density*|velocity|*diameter/viscosity needs positive fluid properties and pipe diameter; velocity may be negative (abs() is applied) but the other three must be strictly positive.

Source

Thrown at physics/reynolds_number.py:54

    """
    >>> reynolds_number(900, 2.5, 0.05, 0.4)
    281.25
    >>> reynolds_number(450, 3.86, 0.078, 0.23)
    589.0695652173912
    >>> reynolds_number(234, -4.5, 0.3, 0.44)
    717.9545454545454
    >>> reynolds_number(-90, 2, 0.045, 1)
    Traceback (most recent call last):
        ...
    ValueError: please ensure that density, diameter and viscosity are positive
    >>> reynolds_number(0, 2, -0.4, -2)
    Traceback (most recent call last):
        ...
    ValueError: please ensure that density, diameter and viscosity are positive
    """

    if density <= 0 or diameter <= 0 or viscosity <= 0:
        raise ValueError(
            "please ensure that density, diameter and viscosity are positive"
        )
    return (density * abs(velocity) * diameter) / viscosity


if __name__ == "__main__":
    import doctest

    doctest.testmod()

View on GitHub (pinned to f5988cc097)

Solutions

  1. Supply positive SI values: density in kg/m^3 (e.g. 1000 for water), diameter in m (e.g. 0.045), viscosity in Pa*s (e.g. 0.001)
  2. Guard fluid-property lookups so they never return 0/undefined outside the fitted range
  3. If velocity sign varies, keep it — the function applies abs() — but check the other three with a pre-call assertion

Example fix

# before
reynolds_number(-90, 2, 0.045, 1)
# ValueError: please ensure that density, diameter and viscosity are positive

# after
assert 0 < 0.045 and 0 < 1 and 0 < 1000
reynolds_number(1000, 2, 0.045, 1)
Defensive patterns

Strategy: validation

Validate before calling

if density <= 0 or diameter <= 0 or viscosity <= 0:
    raise ValueError(f"need positive density/diameter/viscosity, got {density}/{diameter}/{viscosity}")
reynolds_number(density, velocity, diameter, viscosity)  # velocity may be negative

Try / catch

try:
    re = reynolds_number(density, velocity, diameter, viscosity)
except ValueError as e:
    if "positive" in str(e):
        raise ValueError("check SI units: kg/m^3, m, Pa*s") from e
    raise

Prevention

When it happens

Trigger: reynolds_number(-90, 2, 0.045, 1) — negative density, as in the doctest; reynolds_number(0, 2, -0.4, -2) — zero density with negative diameter and viscosity; any call with diameter=0 (a collapsed/zero-size duct) or viscosity=0 (division by zero avoided).

Common situations: Unit mistakes such as diameter given as 0 (unitless) or in the wrong scale; viscosity entered as 0 for 'frictionless' idealization; property tables returning 0 outside their valid temperature range; sign conventions where density is stored signed after a pressure delta.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/8f169ad2d39ac10b. Report an issue: GitHub.