Величина потерь давления (напора) при движении в трубе потока рабочей среды характеризуется коэффициентом сопротивления трения единицы относительной длины. В прямой трубе имеются потери давления только от трения, поэтому коэффициент гидравлического сопротивления равен коэффициенту сопротивления трения:
$$\zeta = \zeta_{тр} = \lambda \bar{l};\,\bar{l} = l / D;\,\Delta H = \zeta \frac{w^2}{2g};\,\,\, \Delta p = \zeta \frac{\rho w^2}{2}$$
где $\lambda$ - коэффициент сопротивления трения единицы относительной длины, $l$ - длина трубы, м; $D$ - внутренний диаметр трубы, м, $\Delta H$, $\Delta p$ - потери даления в метрах столба жидкости и в Па соответственно, $w$ - скорость движения рабочей среды, м/с; $\rho$ - плотность рабочей среды $кг/м^3$; $g = 9.80665\, м/с^2$ - ускорение свободного падения.
Потери давления от трения зависят от шероховатости внутренних стенок трубы, вязкости рабочей среды, скорости движения рабочей среды и режима течения в трубе.
Шероховатость задаётся значением относительной шероховатости: $$\bar{\Delta} = \Delta / D,$$ где $\Delta$ - абсолютная шероховатость, м.
Режим течения в трубе определяется числом Рейнольдса:
$$Re = \frac{wD}{\nu},$$ где $w$ - скорость, м/с; $\nu$ - кинематическая вязкость, $м^2/с$.
При реализации приведённой в [1] расчётной методики приняты следующие допущения:
Все созданные для реализации данной расчётной методики функции включены в модуль hydrcalc
(скачать версию 1).
Пример использования основной расчётной функции calc_dH
см.здесь. Описание всех функций модуля hydrcalc
приведены здесь.
import numpy as np
from hydrcalc import calc_lambda
#Функция для тестирования и сравнения полученных результатов с данными из [1] стр. 91 - 92
def test_lamb(Re, delta):
w = 3 #скорость, м/с
kvisc = 1e-6 #кинематическая вязкость воды при t = 20 C, м2/с
D = Re * kvisc / w #внутренний диаметр трубы, м
Delta = delta * D #шероховатость стенок трубы, м
return calc_lambda(w, D, Delta)
#Набор чисел Рейнольдса
Res = np.array([3e3, 4e3, 6e3, 1e4, 2e4, 4e4, 6e4, 1e5, 2e5, 4e5, 6e5, 1e6, 2e6, 4e6, 1e7, 2e7, 1e8])
#Набор относительных шероховатостей
deltas = np.array([.05, .04, .03, .02, .015, .01, .008, .006, .004, .002, .001,
.0008, .0006, .0004, .0002, .0001, .00005, .00001, .000005 ])
lambs = np.zeros([deltas.shape[0], Res.shape[0]]) #массив для хранения результатов вычисления
for i, delta in enumerate(deltas):
for j, Re in enumerate(Res):
try: #чтобы не вызывать остановку выполнения при выпадении Re из допустимого диапазона
#вычисляем коэффициент сопротивления трения единицы относительной длины
lambs[i,j] = test_lamb(Re, delta)
except ValueError: #если Re вне допустимого диапазона
lambs[i,j] = None
#Создандим таблицу для сравнения с таблицей в [1] стр. 91 - 92
import pandas as pd
columns =[]
myformat = "{:.0e}"
for Re in Res:
columns.append(myformat.format(Re))
table = pd.DataFrame(np.round(lambs,3), index = deltas, columns = columns)
table
#Заголовки строк - относительная шероховатость, заголовки столбцов - число Рейнольдса
3e+03 | 4e+03 | 6e+03 | 1e+04 | 2e+04 | 4e+04 | 6e+04 | 1e+05 | 2e+05 | 4e+05 | 6e+05 | 1e+06 | 2e+06 | 4e+06 | 1e+07 | 2e+07 | 1e+08 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.050000 | 0.079 | 0.077 | 0.075 | 0.074 | 0.073 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 | 0.072 |
0.040000 | 0.073 | 0.071 | 0.069 | 0.067 | 0.066 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 | 0.065 |
0.030000 | 0.066 | 0.064 | 0.062 | 0.060 | 0.059 | 0.058 | 0.058 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 | 0.057 |
0.020000 | 0.059 | 0.057 | 0.054 | 0.052 | 0.051 | 0.050 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 | 0.049 |
0.015000 | 0.056 | 0.053 | 0.050 | 0.048 | 0.046 | 0.045 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 | 0.044 |
0.010000 | 0.052 | 0.049 | 0.046 | 0.043 | 0.041 | 0.039 | 0.039 | 0.039 | 0.038 | 0.038 | 0.038 | 0.038 | 0.038 | 0.038 | 0.038 | 0.038 | 0.038 |
0.008000 | 0.050 | 0.047 | 0.044 | 0.041 | 0.038 | 0.037 | 0.036 | 0.036 | 0.036 | 0.035 | 0.035 | 0.035 | 0.035 | 0.035 | 0.035 | 0.035 | 0.035 |
0.006000 | 0.049 | 0.046 | 0.042 | 0.039 | 0.036 | 0.034 | 0.033 | 0.033 | 0.033 | 0.032 | 0.032 | 0.032 | 0.032 | 0.032 | 0.032 | 0.032 | 0.032 |
0.004000 | 0.047 | 0.044 | 0.040 | 0.036 | 0.033 | 0.031 | 0.030 | 0.030 | 0.029 | 0.029 | 0.029 | 0.029 | 0.028 | 0.028 | 0.028 | 0.028 | 0.028 |
0.002000 | NaN | 0.042 | 0.038 | 0.034 | 0.030 | 0.027 | 0.026 | 0.025 | 0.024 | 0.024 | 0.024 | 0.024 | 0.024 | 0.023 | 0.023 | 0.023 | 0.023 |
0.001000 | NaN | 0.041 | 0.037 | 0.032 | 0.028 | 0.025 | 0.023 | 0.022 | 0.021 | 0.020 | 0.020 | 0.020 | 0.020 | 0.020 | 0.020 | 0.020 | 0.020 |
0.000800 | NaN | 0.041 | 0.036 | 0.032 | 0.028 | 0.024 | 0.023 | 0.021 | 0.020 | 0.019 | 0.019 | 0.019 | 0.019 | 0.019 | 0.019 | 0.019 | 0.019 |
0.000600 | NaN | 0.041 | 0.036 | 0.032 | 0.027 | 0.024 | 0.022 | 0.021 | 0.019 | 0.018 | 0.018 | 0.018 | 0.018 | 0.018 | 0.017 | 0.017 | 0.017 |
0.000400 | NaN | 0.040 | 0.036 | 0.031 | 0.027 | 0.023 | 0.022 | 0.020 | 0.018 | 0.017 | 0.017 | 0.016 | 0.016 | 0.016 | 0.016 | 0.016 | 0.016 |
0.000200 | NaN | 0.040 | 0.036 | 0.031 | 0.026 | 0.023 | 0.021 | 0.019 | 0.017 | 0.016 | 0.015 | 0.015 | 0.014 | 0.014 | 0.014 | 0.014 | 0.014 |
0.000100 | NaN | 0.040 | 0.036 | 0.031 | 0.026 | 0.022 | 0.020 | 0.019 | 0.016 | 0.015 | 0.014 | 0.013 | 0.013 | 0.012 | 0.012 | 0.012 | 0.012 |
0.000050 | NaN | 0.040 | 0.036 | 0.031 | 0.026 | 0.022 | 0.020 | 0.018 | 0.016 | 0.014 | 0.013 | 0.013 | 0.012 | 0.011 | 0.011 | 0.011 | 0.011 |
0.000010 | NaN | NaN | 0.036 | 0.031 | 0.026 | 0.022 | 0.020 | 0.018 | 0.016 | 0.014 | 0.013 | 0.012 | 0.011 | 0.010 | 0.009 | 0.009 | 0.008 |
0.000005 | NaN | NaN | 0.036 | 0.031 | 0.026 | 0.022 | 0.020 | 0.018 | 0.016 | 0.014 | 0.013 | 0.012 | 0.011 | 0.010 | 0.009 | 0.008 | 0.007 |
import matplotlib.pyplot as plt
#Настройки, общие для всех графиков
plt.rcParams['font.size'] = 12
plt.rcParams['axes.grid'] = True
plt.rcParams['legend.shadow'] = False
plt.rcParams['figure.figsize'] = (11,5)
#Построим зависимость коэффициента сопротивления трения единицы
#относительной длины от внутреннего диаметра трубы
Deltas = np.array([0, 0.1, 0.2, 0.3, 0.4, 0.5]) * 1e-3 #абсолютная шероховатость труб, м
kvisc = 1e-6 #кинематическая вязкость (вода при 20 С)
w = 2 #скорость рабочей среды
Ds = np.linspace(40, 200, 101)
lambs = np.zeros((Deltas.shape[0], Ds.shape[0]), dtype = float)
for i, Delta in enumerate(Deltas):
for j, D in enumerate(Ds):
D /= 1e3
lambs[i,j] = calc_lambda(w, D, Delta)
fig, ax = plt.subplots(figsize = (11,5))
for i, Delta in enumerate(Deltas):
ax.plot(Ds, lambs[i,:], label = Delta * 1e3)
ax.set_xlim(40, 200); ax.set_ylim(0,)
ax.set_xlabel("$D$, мм"); ax.set_ylabel("$\lambda$")
ax.legend(ncol=2, title="Шероховатость, мм")
ax.set_title('Зависимость коэффициента сопротивления трения единицы \n \
относительной длины от внутреннего диаметра трубы (скорость потока 2 м/с)');
#Построим зависимость коэффициента сопротивления трения единицы
#относительной длины от скорости движения воды в трубе
Delta = 0.3e-3
ws = np.linspace(0.5, 3, 51)
Ds = np.array([50, 100, 200, 400, 800])
#deltas = Delta / (Ds / 1000)
lambs = np.zeros((Ds.shape[0], ws.shape[0]), dtype = float)
for i, D in enumerate(Ds):
D /= 1e3
for j, w in enumerate(ws):
lambs[i,j] = calc_lambda(w, D, Delta)
#Re[i,j] = fRe(w, D, kvisc)
fig, ax = plt.subplots()
for i, D in enumerate(Ds):
ax.plot(ws, lambs[i,:], label = D)
ax.set_xlim(0.5, 3); ax.set_ylim(0.015,0.04)
ax.legend(ncol=5, title = 'Внутренний диаметр трубы, мм')
ax.set_xlabel("$w$, м/c"); ax.set_ylabel("$\lambda$")
ax.set_title("Зависимость коэффициента сопротивления трения единицы относительной \n \
длины от скорости движения воды в трубе (шероховатость 0,3 мм)");
Согласно стр. 92 в [1] при $Re > 560 / \bar{\Delta}$ течение жидкости переходит в режим квадратичного закона сопротивления.
#Построим зависимость коэффициента сопротивления трения единицы
#относительной длины от скорости движения воды в трубе с параметром функции calc_lambda
#quadr со значением False (без перехода к квадратичному закону сопротивления,
#по умолчанию) и quadr=True (с переходом к квадратичному закону сопротивления)
D = 50e-3 # внутренний диаметр трубы, м
Delta = 0.3e-3 # шероховатость, м
lambs = np.zeros_like(ws) #результат расчёта без перемены формулы при Re>Re_кв (стр. 90 в [1])
lambqs = np.zeros_like(ws) #результат расчёта с переменой формулы при Re>Re_кв (стр. 92 в [1])
for i, w in enumerate(ws):
lambs[i] = calc_lambda(w, D, Delta)
lambqs[i] = calc_lambda(w, D, Delta, quadr = True)
fig, ax = plt.subplots()
ax.plot(ws, lambs, label = 'Без перехода к квадратичному закону сопротивления')
ax.plot(ws, lambqs, label = 'С переходом к квадратичному закону сопротивления')
ax.set_xlim(0.5, 3); ax.set_ylim(0.032, )
ax.set_xlabel("$w$, м/c"); ax.set_ylabel("$\lambda$")
plt.legend();
Режим квадратичного закона сопротивления возникает при $$Re_{кв} = \frac{560}{\bar{\Delta}} $$ Найдём выражение для скорости, при которой возникает режим квадратичного закона сопротивления
$$Re_{кв} = \frac{560 D}{\Delta};\, Re_{кв} = \frac{w_{кв}D}{\nu};\, w_{кв} = \frac{560\nu}{\Delta}$$В модуле hydrcalc
есть функция calc_w_q(Delta, kvisc)
, которая возвращает значение скорости, при котором течение переходит в режим квадратичного закона сопротивления.
from hydrcalc import calc_w_q
#Определим относительную разницу в результах расчёта по разным формулам при Re > Re_кв
Deltas = np.array([0.1, 0.2, 0.3, 0.4, 0.5]) * 1e-3 #абсолютная шероховатость стенок, м
kvisc = 1e-6 #кинематическая вязкость (вода при 20 С), м/с2
Ds = np.linspace(20, 1400, 101) #внутренние диаметры труб, мм
#Относительная разница результатов расчётов в процентах
errs = np.zeros((Deltas.shape[0], Ds.shape[0]), dtype = float)
for i, Delta in enumerate(Deltas):
wq = calc_w_q(Delta, kvisc) * 1.0001
for j, D in enumerate(Ds):
D /= 1e3 # перевод в метры
lamb = calc_lambda(wq, D, Delta)
lambq = calc_lambda(wq, D, Delta, quadr = True)
errs[i,j] = (lamb/lambq -1 ) * 100
fig, ax = plt.subplots()
for i, Delta in enumerate(Deltas):
ax.plot(Ds, errs[i][:], label = Delta * 1e3)
ax.set_xlim(0, 1400); ax.set_ylim(2.68, )
ax.legend(title="Шероховатость, мм")
ax.set_xlabel("$D$, мм"); ax.set_ylabel("$\delta$, %");
С параметром quadr = False
(по умолчанию) функция calc_lambda
при $Re > 560 D/\bar{\Delta}$ будет возвращать значение $\lambda$ на 3% больше по сравнению с формулой на стр. 92 в [1] для режима квадратичного закона сопротивления.
deltas = [.00005, .0001, .0002, .0003, .0004, .0005, .0006, .0007, .0008, .0009, .001, .002, .003,
.004, .005, .006, .008, .01, .015, .020, .025, .03, .035, .04, .045, .05]
lambs = []
lambsq = []
D = 100.
for i, delta in enumerate(deltas):
Delta = delta * D
wq = calc_w_q(Delta, kvisc) * 1.0001
lambs.append(calc_lambda(wq, D, Delta))
lambsq.append(calc_lambda(wq, D, Delta, quadr = True))
fig, ax = plt.subplots()
ax.set_xlim(0., .05); ax.set_ylim(0.,lambs[-1])
ax.plot(deltas, lambs, label = 'False')
ax.plot(deltas, lambsq, label = 'True')
ax.legend(title="Значение параметра quadr\nв функции calc_lambda")
ax.set_xlabel("$\overline{\Delta}$"); ax.set_ylabel("$\lambda$")
ax.set_title("Режим квадратичного закона сопротивления");
calc_dH
¶from hydrcalc import calc_dH
D_внешн = 89 #внешний диаметр трубы, мм
h = 3.5 #толщина стенки трубы, мм
D = D_внешн - 2 * h #внутренний диаметр, мм
D *= 1e-3 #перевод в метры
Q = 50 #объёмный расход, м3/ч
L = 100 #длина трубопровода, м
Delta=0.3e-3 #шероховатость стенок трубы, м
dH = calc_dH(Q, D, L, Delta=0)
print(f"Потери давления на {L} метрах трубы {D_внешн}х{h} с шероховатостью стенок {Delta*1e3} мм " +
f"при расходе {Q} м3/ч составляют {round(dH, 1)} метров водяного столба.")
Потери давления на 100 метрах трубы 89х3.5 с шероховатостью стенок 0.3 мм при расходе 50 м3/ч составляют 6.8 метров водяного столба.
hydrcalc
¶import hydrcalc
help(hydrcalc)
Help on module hydrcalc: NAME hydrcalc DESCRIPTION В модуле размещёны функции для расчёта коэффициентов гидравлического сопротивления следующих элементов трубопровода: 1. Прямые круглые трубы (гладкие и с неравномерной шероховатостью) FUNCTIONS calc_Re(w, D, kvisc=1e-06) Вычисление числа Рейнольдса w: скорость, м/с D: внутренний диаметр трубы, м kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) calc_dH(Q, D, L, Delta=0, kvisc=1e-06, quadr=False) Расчёт потерь давления, метры столба жидкости Q: объёмный расход, м3/ч D: внутренний диаметр трубы, м L: длина трубы, м Delta: абсолютная шероховатость, м (по умолчанию - отсутствие шероховатости, гладкая труба) kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) quadr: False (по умолчанию) - не происходит смены формулы при Re>560/delta, True - при Re>560/delta применяется формула для квадратичного закона сопротивления calc_frc(Q, D, L, Delta=0, kvisc=1e-06, quadr=False) Расчёт коэффициента сопротивления трения Q: объёмный расход, м3/ч D: внутренний диаметр трубы, м L: длина трубы, м Delta: абсолютная шероховатость, м (по умолчанию - отсутствие шероховатости, гладкая труба) kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) quadr: False (по умолчанию) - не происходит смены формулы при Re>560/delta, True - при Re>560/delta применяется формула для квадратичного закона сопротивления calc_frc_w(w, D, L, Delta=0, kvisc=1e-06, quadr=False) Расчёт коэффициента сопротивления трения w: скорость, м/с D: внутренний диаметр трубы, м L: длина трубы, м Delta: абсолютная шероховатость, м (по умолчанию - отсутствие шероховатости, гладкая труба) kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) quadr: False (по умолчанию) - не происходит смены формулы при Re>560/delta, True - при Re>560/delta применяется формула для квадратичного закона сопротивления calc_lambda(w, D, Delta=0, kvisc=1e-06, quadr=False) Расчёт коэффициента сопротивления трения единицы относительной длины w: скорость, м/с D: внутренний диаметр трубы, м Delta: абсолютная шероховатость, м (по умолчанию - отсутствие шероховатости, гладкая труба) kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) quadr: False (по умолчанию) - не происходит смены формулы при Re>560/delta, True - при Re>560/delta применяется формула для квадратичного закона сопротивления calc_w(Q, D) Определение скорости по объёмному расходу Q: объёмный расход, м3/ч D: внутренний диаметр трубы, м calc_w_q(Delta, kvisc) Возвращает скорость, при которой течение переходит в режим квадратичного закона сопротивления Delta: абсолютная шероховатость, м kvisc: кинематическая вязкость, м2/с fRe_lowmarg_pipe(delta) Определение нижней границы допустимого диапазона числа Re расчётной модели для труб delta: относительная шероховатость log10(x, /) Return the base 10 logarithm of x. sqrt(x, /) Return the square root of x. DATA __copyright__ = 'Сергей Медведев, 2020' __email__ = 'medsv@yandex.ru' __license__ = 'GPL' __maintainer__ = 'Сергей Медведев' __status__ = 'Production' g = 9.80665 pi = 3.141592653589793 VERSION 1.0 AUTHOR Сергей Медведев FILE /home/medsv/dzen/0023_Сопротивление_труб/hydrcalc.py
Инженерные расчёты на Python, С.В. Медведев, 2020
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020