def turbulent_Nunner(Re, Pr, fd, fd_smooth):
    """Calculates internal convection Nusselt number for turbulent flows
    in pipe according to [2]_ as shown in [1]_.

    .. math::
        Nu = \\frac{RePr(f/8)}{1 + 1.5Re^{-1/8}Pr^{-1/6}[Pr(f/f_s)-1]}

    Parameters
    ----------
    Re : float
        Reynolds number, [-]
    Pr : float
        Prandtl number, [-]
    fd : float
        Darcy friction factor [-]
    fd_smooth : float
        Darcy friction factor of a smooth pipe [-]

    Returns
    -------
    Nu : float
        Nusselt number, [-]

    Notes
    -----
    Valid for Pr ≅ 0.7; bad results for Pr > 1.

    Examples
    --------
    >>> turbulent_Nunner(Re=1E5, Pr=0.7, fd=0.0185, fd_smooth=0.005)
    101.15841010919947

    References
    ----------
    .. [1] Rohsenow, Warren and James Hartnett and Young Cho. Handbook of Heat
       Transfer, 3E. New York: McGraw-Hill, 1998.
    .. [2] W. Nunner, "Warmeiibergang und Druckabfall in Rauhen Rohren,"
       VDI-Forschungsheft 445, ser. B,(22): 5-39, 1956
    """
    return Re * Pr * fd / 8.0 / (1 + 1.5 * Re ** -0.125 * Pr ** (-1 / 6.0) *
        (Pr * fd / fd_smooth - 1.0))
