Гидравлическая модель сети и формулы
> Кратко. Сеть представляется ориентированным графом: каждый узел раздвоен на «подающий» и «обратный», каждый элемент (труба, задвижка, насос, регулятор, потребитель) — ветвь графа. Для каждого узла пишется баланс расходов (1-й закон Кирхгофа), для каждой ветви — связь перепада напора и расхода (2-й закон), для узлов ЗН — известный напор. Нелинейная система решается методом Ньютона. Ниже — все формулы с примерами.
Источник: движок itwin-api/heatnet — solve/hydraulic.py, solve/subnet.py (Ньютон, сходимость), solve/regulators.py, physics/resistance.py, io/reader.py; исходный десктопный sety — w_calc.py, sopr.py. Отличия веба от десктопа — Расчётный движок.
6.1. Граф сети
- Каждый узел сети
idдаёт две вершины графа:(id, 1)— на подающем трубопроводе и(id, 2)— на обратном. - Участок с признаком 1 (общий) порождает две ветви: подающую
(n1,1)→(n2,1)и обратную(n1,2)→(n2,2). Признаки 2/3 — по одной ветви; 4/5 — переходы подача↔обратка. - Потребитель соединяет подающую и обратную вершины своего узла.
- Отключённые элементы (состояние «закрыт», отключённые трубы) в граф не включаются.
- Расчёт выполняется по каждой связной подсети отдельно. Подсеть, в которой нет ни одного узла с заданным напором, не считается — в протоколе появится сообщение «Подсеть из N узлов…» в категории «Подсети без узла с ЗН».
Неизвестные системы: напор H в каждой вершине (полный, с учётом отметки), расход G в каждой ветви и вспомогательная переменная для каждого узла ЗН.
6.2. Уравнения
1-й закон Кирхгофа (баланс узла):
Σ G(входящих ветвей) − Σ G(выходящих ветвей) = Gузл
Gузл — отбор (или подкачка) в узле: расход потребителя, утечка, подпитка. Для потребителя в плановом режиме:
- в подающем узле отбирается
Gз + Gп(закрытая часть + открытый водоразбор из подачи); - в обратный узел возвращается
Gз − Gо(минус водоразбор из обратки).
2-й закон (ветвь n1 → n2):
H1 − H2 = S · G · |G|
Узел с заданным напором:
H = Hзад + z (z — отметка верха трубы)
6.3. Метод Ньютона
- Начальное приближение: напоры = отметкам, расходы = 10 т/ч.
- На каждой итерации строится матрица Якоби и невязка, решается линейная система (разреженный решатель), решение уточняется:
x ← x + Δx. - Чтобы матрица не вырождалась при нулевом расходе, вместо
|G|используется сглаженноеsqrt(G² + ε²),ε = 10⁻⁶ т/ч. Производная потерь:−S·(2G² + ε²)/sqrt(G² + ε²). - Значения
|x| < 10⁻⁵обнуляются. - Критерий сходимости: шаг
max|Δx| / max(1, |x|) < 10⁻⁷и невязка уравнений< 10⁻⁴(т/ч, м). Не более 100 итераций Ньютона на один проход. Если не сошлось — в протоколе красное сообщение «Гидравлический расчет подсети … не сошелся за 100 итераций: шаг …, невязка …; результат приближенный». В десктопе (и в профиле legacy) критерий другой —Σ|Δx| < 0,001без проверки невязки и без сообщения.
Внешние циклы (вложенность):
для m = 1 … n_potr (n_potr = 4 при расчёте по графику с теплопотерями, иначе 1)
для j = 1 … 5 (регуляторы расхода и обратные клапаны: до 5 проходов)
регуляторы давления — уравнениями в системе Ньютона (до 10 проходов)
[если не сошлось — старый метод: подбор сопротивлений, до iter = 20 итераций]
проверка регуляторов расхода и обратных клапанов → при смене состояния пересборка матрицы
тепловой расчёт (температуры), пересчёт расходов потребителей с учётом потерь
финальный тепловой расчёт при заданной tн, нагрузки участков
Если состояние клапанов и регуляторов не установилось за 5 проходов, в протоколе: «Обратные клапаны и регуляторы расхода: состояние не установилось за 5 проходов, взято последнее».
6.4. Сопротивление участка трубопровода
Формула ТГИД (по умолчанию)
Коэффициент трения — квадратичная зона (формула Прандтля–Никурадзе):
λ = 1 / (4 · (lg(3,715 · d / kэ))²) d — внутренний диаметр, мм; kэ — шероховатость, мм (0 → 0,5)
Удельное сопротивление (на 1 м трубы):
s = 6,94988·10⁶ · λ / d⁵ [м / (т/ч)² на 1 м], d в мм
Коэффициент 6,94988·10⁶ соответствует формуле Дарси–Вейсбаха при плотности воды ≈ 958 кг/м³.
Если в участке n параллельных труб (truba): s = s / n².
Полное сопротивление с местными потерями — два способа (как задано в паспорте):
если задана «доля местных потерь» δ: S = s · L · (1 + δ)
иначе по сумме коэффициентов Σξ: S = s · (L + d · Σξ / (λ · 1000))
Второе слагаемое — эквивалентная длина местных сопротивлений Lэкв = d·Σξ/(λ·1000), м.
Если в паспорте задано готовое сопротивление участка sopr > 0, оно используется как есть.
Пример 1. Участок Ду300
d = 309 мм, kэ = 0,5 мм, L = 125,4 м, G = 300 т/ч, местных сопротивлений нет.
lg(3,715·309/0,5) = lg(2295,9) = 3,3609
λ = 1 / (4 · 3,3609²) = 0,02213
s = 6,94988·10⁶ · 0,02213 / 309⁵ = 5,460·10⁻⁸
S = 5,460·10⁻⁸ · 125,4 = 6,847·10⁻⁶
ΔH = S·G² = 6,847·10⁻⁶ · 300² = 0,616 м
R = ΔH / L · 1000 = 4,91 мм вод. ст./м ≈ 48 Па/м
v = 353,86 · 300 / 309² = 1,11 м/с
С местными сопротивлениями Σξ = 2,0: Lэкв = 309·2,0/(0,02213·1000) = 27,9 м, S = 8,372·10⁻⁶, ΔH = 0,753 м. С долей местных потерь δ = 0,3: S = 8,901·10⁻⁶.
Ориентиры удельных потерь (kэ = 0,5 мм)
| Dвн, мм | G, т/ч | λ | R, мм/м | v, м/с |
|---|---|---|---|---|
| 100 | 20 | 0,0303 | 8,4 | 0,71 |
| 207 | 80 | 0,0246 | 2,9 | 0,66 |
| 309 | 300 | 0,0221 | 4,9 | 1,11 |
| 512 | 1000 | 0,0195 | 3,9 | 1,35 |
Альтернативные формулы трения (параметр сервера sopr)
При sopr ≠ 0 сопротивление участка пересчитывается на каждой итерации по текущему расходу, скорости и числу Рейнольдса при температуре источника (подача — t1_r, обратка — t2_r; если источник неизвестен — 150/70 °C):
v = скорость, м/с; ν = μ(t)/ρ(t) — кинематическая вязкость; Re = v·d/ν
1 — Альтшуль: λ = 0,11 · (kэ/d + 68/Re)^0,25
2 — Никурадзе: λ = 1 / (2·lg(d/kэ) + 1,14)²
3 — Шифринсон: λ = 0,11 · (kэ/d)^0,25
4 — Колбрук–Уайт: 1/√λ = −2·lg( (kэ/d)/3,7 + 2,51/(Re·√λ) ) (итерации от λ Шифринсона)
Плотность: постоянная ρп = ρо = 0,975 т/м³ (подача при t > 79 °C, иначе обратка) либо полином по температуре (-ro_temp): ρ = 1,0004 − 2,757·10⁻⁵·t − 4,761·10⁻⁶·t² + 8,247·10⁻⁹·t³.
6.5. Задвижка
Сопротивление по условному диаметру Ду (мм) и степени открытия:
Fпр = π/4 · (Ду² / 100) · 0,95 [см²], 0,95 — поправка на проходное сечение
ξ = 0,35 (открыта)
ξ = ξ(%открытия) по таблице (частично открыта)
kv = 5,04 · Fпр / √ξ
S = 10 / kv²
Таблица ξ по проценту открытия:
| % | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95–100 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ξ | 1300 | 433,7 | 80,2 | 23,8 | 17,9 | 13,1 | 9,4 | 6,55 | 4,45 | 3,0 | 2,05 | 2,05 | 1,5 | 1,25 | 1,1 | 1,0 | 0,8 | 0,35 |
Правило выбора: берётся значение ближайшей табличной точки, меньшей заданного процента (консервативно): при 30 % — ξ точки 25 % (23,8), при 31 % — ξ точки 30 % (17,9). При ≥ 100 % — 0,35, при ≤ 10 % — 1300. Если диаметр задвижки не задан — сопротивление считается нулевым (10⁻²⁰).
Пример 2. Задвижка Ду300, открыта: Fпр = 671,5 см², kv = 5720,7, S = 3,056·10⁻⁷; при 300 т/ч потеря 0,028 м. Открыта на 30 % (ξ = 23,8): S = 2,078·10⁻⁵, потеря 1,87 м.
6.6. Байпас, диафрагма, регулирующая арматура
Байпас — как труба: диаметр d (умолчание 400 мм), длина L (умолчание 1 м), шероховатость (умолчание 0,5 мм), сумма местных сопротивлений:
λ = 1 / (4·(lg(3,715·d/kэ))²); S = 6,94988·10⁶·λ/d⁵ · (L + d·Σξ/(λ·1000))
Дроссельная диафрагма (шайба) диаметром отверстия d0, мм, количество n:
S = 10⁴ · n / d0⁴ (если d0 = 0, S = 1)
Это та же зависимость, что в формуле подбора шайбы d = 10·(G²/H)^(1/4) (Калькулятор дросселирования). Пример: шайба 60 мм, 30 т/ч → S = 7,72·10⁻⁴, гасит 0,69 м.
Регулирующая арматура (тип ZD2) — постоянный перепад:
H1 − H2 = r1 · sign(G)
6.7. Насос
Ветвь насоса повышает напор:
H2 − H1 = h (задан постоянный напор h)
H2 − H1 = r0 + r1·G + r2·G² (задана характеристика H(Q), если h = 0)
Коэффициенты характеристики берутся из карточки насосного агрегата (реестр «Насосное оборудование»). Если поток через насос идёт против направления установки — в протоколе «Направление потока воды через насос … противоположно заданному»; если расход превышает пропускную способность — «Расход через насос … превышает его пропускную способность».
6.8. Обратный клапан, регуляторы
Обратный клапан:
- открыт — идеальная ветвь без потерь:
H1 = H2; - если расход стал отрицательным — клапан закрывается: уравнение
G = 0; - закрытый клапан открывается снова, если напор перед ним выше, чем за ним, больше чем на 0,01 м;
- не более 4 переключений одного клапана, далее он остаётся закрытым.
Регулятор давления (РД) поддерживает напор в «узле импульса» (nodeID, подача или обратка):
- работающий регулятор даёт уравнение
H(узла импульса) = Z + z; - после решения вычисляется его сопротивление
S = (H1 − H2)/(G·|G|); - если
Sвышел за пределы[r1, r2](r1 — минимальное сопротивление полностью открытого, r2 — максимальное, «протечка» закрытого), регулятор фиксируется на границе и в протоколе появляется «… не может обеспечить давление в узле …»; - допуск по напору —
deltaиз карточки, иначе 0,01 м; не более 3 переключений; до 10 проходов. - Если регулятор не может управлять узлом (почти нулевой расход), он считается фиксированным сопротивлением.
- Если новый метод не сошёлся, используется прежний итерационный подбор сопротивлений (сообщение «Регуляторы давления: расчёт с уравнениями регуляторов не сошёлся, использован итерационный подбор сопротивлений»).
Регулятор расхода (РР) поддерживает расход Z:
- работающий: уравнение
G = Z, сопротивление после решенияS = (H1 − H2)/(Z·|Z|); - начальное состояние — полностью открыт (
S = r1); в работу включается, только если открытый регулятор пропускает большеZ; - если даже открытый не обеспечивает
Z— «… не может обеспечить заданный расход»; - допуск по расходу —
deltaиз карточки, не меньше 0,1 % уставки и 0,01 т/ч; не более 4 переключений.
Байпас с заданным узлом импульса (nodeID > 0) работает как регулятор давления, без него — как регулятор расхода.
Сообщения «Не заданы макс. сопр. или относительная протечка регулятора … Значение берётся по умолчанию» означают, что в карточке регулятора не заполнены r1/r2 — заполните их (Частые ошибки и вопросы).
6.9. Узлы с заданным напором (ЗН)
В карточке «Заданный напор» указываются давление (напор) в подающем Pп и в обратном Pо трубопроводах, м. Как это попадает в модель:
задано и Pп, и Pо: обратная вершина: H = Pо + z
между обратной и подающей вершинами — виртуальный насос с напором h = Pп − Pо
(это и есть располагаемый напор на выводах источника / в точке присоединения)
задано только Pо: H(обр) = Pо + z
задано только Pп: H(под) = Pп + z
Режим «Магистральный фрагмент». В карточке ЗН дополнительно задаются фрагмент магистрали (fragment_resultID), код и наименование узла на магистрали. При флажке Магистральный фрагмент напоры Pп, Pо (и температура подачи) берутся из последнего расчёта магистрального фрагмента в этом узле. Если фрагмент или узел не заданы или не найдены — протокол сообщает об этом, и расчёт идёт по заданному в карточке располагаемому напору.
Порядок: сначала рассчитайте магистраль, затем распределительные фрагменты с флажком «Магистральный фрагмент».
6.10. Утечки (дополнительная опция сервера)
При флаге нормируемых утечек (-zulu_utechki) к отбору каждого узла добавляется:
Gут = 0,25 % · V / 2, V = Σ L · π · d² / 4 по примыкающим участкам, м³
(деление на 2 — каждый участок делится между двумя узлами). В веб-окне эта опция не выведена.
6.11. Что записывается по участкам (таблица ut_out)
| Колонка | Величина | Формула |
|---|---|---|
| a7 | Длина, м | L |
| a8 | Внутренний диаметр, мм | d |
| a9 | Объём воды, м³ | V = 0,785·10⁻⁶ · d² · L · n |
| a10 | Скорость, м/с | `v = 353,86 · |
| a11 | Время прохождения, мин | t = L / v / 60 |
| a12 | Полное сопротивление | S |
| a13 | Расход, т/ч | G (знак — направление относительно линии) |
| a14 | Удельные линейные потери, мм вод. ст./м | R = (ΔHобщ − ΔHмест) / L · 1000 |
| a15 | Линейные потери, м | ΔHобщ − ΔHмест |
| a16 | Местные потери, м | ΔHмест = G² · Sмест, где Sмест = s·L·δ или s·d·Σξ/(λ·1000) |
| a17 | Общие потери, м | `ΔHобщ = |
| a18 | Располагаемый напор в конце, м | Hп − Hо в конечном узле |
| a19 | Пьезометрический напор в конце, м | Hп в конечном узле (напор обратки = a19 − a18) |
| a20 | Отметка в конце, м | z |
| a21 | Полный напор в конце, м | Hп + z |
Константа 353,86 = 4·10⁶/(π·3600): переводит т/ч и мм в м/с. Если |ΔH/(S·G²) − 1| > 0,01, в протокол пишется «Невязка …» — признак несошедшегося участка.
По узлам (us_out) пишутся пьезометрический напор pih и температура t для подающей (признак 1) и обратной (2) вершин, а также источник, от которого пришла вода (ist).
6.12. Типичные причины несходимости
| Причина | Как проявляется | Что делать |
|---|---|---|
| Нет узла ЗН в подсети | «Подсеть из N узлов…» | Назначить ЗН или соединить подсеть |
| Участок с нулевым диаметром/длиной | «Не задан внутренний диаметр в участке…» | Заполнить паспорт |
| Регулятор без пределов r1/r2 | «Не заданы макс. сопр. …» | Заполнить карточку регулятора |
| Закрыт единственный путь от источника | «Вода не течёт через источник…», нулевые расходы | Проверить задвижки и состояния труб |
| Неверные единицы нагрузки (ккал/ч вместо Гкал/ч) | Огромные расходы, «Невязка» | Проверка «Качество данных» → нагрузка > 50 Гкал/ч |
6.13. Проверка на реальных участках Алматы и Астаны
Чтобы убедиться, что формулы курса совпадают с тем, что считает программа, 24.10.2026 на стендах обоих городов взяты результаты последних расчётов по двум магистральным участкам и пересчитаны вручную:
| Величина | Астана, Ду 600 (dвн 610 мм, L 369,7 м, kэ 0,5, Σξ 1,0) | Алматы, Ду 500 (dвн 518 мм, L 135,6 м, Σξ 4,8) |
|---|---|---|
| λ по формуле ТГИД | 0,01870 | 0,01945 |
| s = 6,94988·10⁶·λ/d⁵ | 1,5388·10⁻⁹ | — |
| S линейное = s·L | 5,689·10⁻⁷ | — |
| S местное = s·d·Σξ/(λ·1000) | 5,02·10⁻⁸ | 4,633·10⁻⁷ |
| S полное (в карточке) | 6,19086·10⁻⁷ | 9,54782·10⁻⁷ |
| G, т/ч | 719,5 | 619,3 |
| ΔH = S·G², м | 0,3205 (в карточке 0,32049) | 0,3662 (0,36617) |
| ΔH местные, м | 0,0260 (0,0259849) | 0,1777 (0,177696) |
| R, мм/м | 0,797 (0,796606) | 1,390 (1,38993) |
| v = 353,86·G/d², м/с | 0,684 (0,684) | 0,817 (0,817) |
| t = L/v/60, мин | 9,005 (9,00522) | 2,767 (2,76724) |
| V = 0,785·10⁻⁶·d²·L, м³ | 107,99 (107,989) | 28,562 (28,562) |
Сумма коэффициентов местных сопротивлений, восстановленная из полного сопротивления, — 1,0 (Астана) и 4,8 (Алматы) — совпадает с полем «Местные сопротивления» паспорта.
