code: def f_tr_Haaland(Re_D, ɛ, D, warn=True):
      
      if warn:
          try:
              if (ɛ / D) < 0.0 or (ɛ / D) > 0.05:
                  raise Warning(
                      f"ɛ/D '{ɛ / D:.3e}' out of range 0.0 <= ɛ/D <= 0.05.")
          except Warning as w:
              ex_type, ex_value, ex_traceback = sys.exc_info()
              print(color_warn("WARNING: "), ex_value)
  
          try:
              if Re_D < 4000.0 or Re_D > 1.0E8:
                  raise Warning(
                      f"Reynolds number '{Re_D:.3e}' out of range "
                      "4000 <= Re_D <= 1E8.")
          except Warning as w:
              ex_type, ex_value, ex_traceback = sys.exc_info()
              print(color_warn("WARNING: "), ex_value)
  
      return 1 / (1.8 * log10((6.9 / Re_D) + (ɛ / D / 3.7)**1.11))**2
docs: Calculate the friction factor of turbulent flow (t) in a rough duct (r) for
      the provided conditions with Haaland's equation.
  
      :param Re_D: Reynolds number for the specified hydraulic diameter.
      :param ɛ: [m] Surface roughness.
      :param D: [m] Duct hydraulic diameter.
      :return: Friction factor.
  
      Source: lienhard2018, Eq. 7.50.