Dokument dla projektanta sprawdzającego oraz dla zespołu utrzymującego kod. Opisuje, co aplikacja liczy, jak to liczy i jak wynik zweryfikować.
Aplikacja jest pojedynczym plikiem index.html bez zależności zewnętrznych i bez CDN. Kod dzieli się na warstwy: teren, hydrologia, hydraulika, silnik doboru, silnik rysunkowy, writer PDF, eksporty, testy. Wszystkie obliczenia w jednostkach SI; konwersja wyłącznie przy wyświetlaniu. Żaden współczynnik normowy nie jest zaszyty w kodzie — wszystkie pochodzą z obiektu profilu, którego odpowiednik w formie edytowalnej leży w profiles/.
| Symbol | Wielkość | Jednostka |
|---|---|---|
| Q | natężenie przepływu | m³/s |
| A | pole przekroju czynnego | m² |
| U | obwód zwilżony | m |
| R_h | promień hydrauliczny, A/U | m |
| D | średnica wewnętrzna | m |
| h | głębokość napełnienia | m |
| I | spadek dna | – |
| v | prędkość średnia | m/s |
| k_b | chropowatość operacyjna | m |
| \nu | lepkość kinematyczna, 1{,}31\cdot10^{-6} | m²/s |
| \tau | naprężenie styczne | N/m² |
| \psi | współczynnik spływu | – |
| q | jednostkowe natężenie deszczu | dm³/(s·ha) |
| F | powierzchnia zlewni | m² |
| C | okres powtarzalności | lata |
Prędkość wyznaczana jawnie, bez iteracji:
$$v = -2\sqrt{2\,g\,D_h\,I}\;\log_{10}\!\left(\frac{2{,}51\,\nu}{D_h\sqrt{2\,g\,D_h\,I}} + \frac{k_b}{3{,}71\,D_h}\right)$$
gdzie D_h = 4R_h. Dla przewodu pełnego D_h = D.
Zakres: przepływ turbulentny. Dla Re < 4000 wynik jest orientacyjny.
Źródło: [DO WERYFIKACJI: DWA-A 110].
Implementacja: velocityPC(Dh, I, kb).
$$\theta = 2\arccos\!\left(1 - \frac{2h}{D}\right)$$
$$A = \frac{D^2}{8}(\theta - \sin\theta), \qquad U = \frac{D\theta}{2}, \qquad B = D\sin\frac{\theta}{2}$$
Implementacja: circGeom(D, h).
Bisekcja na h \in (0;\,0{,}938D], 80 iteracji, tolerancja 10^{-6} m.
Dlaczego górna granica 0,938 D. Maksimum przepustowości przekroju kołowego występuje przy h/D \approx 0{,}938. Powyżej tej wartości funkcja Q(h) przestaje być monotoniczna i rozwiązanie nie jest jednoznaczne. Ograniczenie zakresu gwarantuje zbieżność. Przekroczenie sygnalizuje przepływ pod ciśnieniem — funkcja fillForQ zwraca wtedy null, a silnik doboru przechodzi do większej średnicy.
$$\tau = \rho\,g\,R_h\,I, \qquad Fr = \frac{v}{\sqrt{g\,A/B}}$$
Fr > 1 oznacza przepływ rwący i możliwość odskoku hydraulicznego w studni.
Przekrój trapezowy:
$$A = bh + mh^2, \qquad U = b + 2h\sqrt{1+m^2}, \qquad B = b + 2mh$$
Głębokość normalna z równania Manninga, rozwiązywana bisekcją. Głębokość krytyczna z warunku Fr = 1, również bisekcją. Wolna burta: \max(0{,}20;\ 0{,}25h).
Implementacja: trapezoid, openChannel.
$$q = \frac{6{,}631\;\sqrt[3]{H^2C^2}}{t^{0{,}667}} \qquad [\mathrm{dm^3/(s\cdot ha)}]$$
Zakres: t = 5\ldots180 min. Źródło: [DO WERYFIKACJI: Błaszczyk 1954].
$$q = \frac{a\,C^{\,m}}{(t+b)^{\,c}}$$
Parametry z pliku profilu. Źródło: [DO WERYFIKACJI: KOSTRA-DWD — wartości przybliżone].
$$Q = \psi\,q\,F$$
Warunek stosowalności: czas trwania deszczu równy czasowi koncentracji zlewni.
Przeszukiwany zbiór t \in \{5,10,15,20,30,45,60,90,120,180\} min. Wybierany czas dający największy przepływ, nie największe natężenie. Wynik raportowany w panelu bocznym.
| Typ | Konstrukcja |
|---|---|
| Blokowy | stała intensywność |
| Euler I | przyrosty opadu sortowane malejąco, szczyt na początku |
| Euler II | jak wyżej, szczyt w 0{,}3\,t_{całk} zgodnie z DWA-A 118 |
| Chicago | krzywa z parametrem położenia szczytu r = 0{,}375 |
| Trójkątny | liniowy wzrost i spadek, szczyt w środku |
Niezmiennik weryfikowany testem: każdy hietogram zachowuje sumę opadu z błędem poniżej 1 %. Zmierzony błąd wynosi 0,0000 %.
Limit 16 mln komórek. Na terenie demonstracyjnym: 196–300 ms.
Kolejność: od wylotu w górę sieci, zgodnie z porządkiem topologicznym.
dla każdego odcinka i:
I ← max(spadek terenu, I_min)
dopóki I ≤ I_max:
dla każdej średnicy D z katalogu rosnąco:
jeśli D < D_poprzednie: pomiń
jeśli I < 1/DN oraz I < I_min: pomiń
h ← fillForQ(D, Q_i, I, k_b)
jeśli brak rozwiązania: pomiń (przepływ pod ciśnieniem)
jeśli h/D > (h/D)_max: pomiń
jeśli v > v_max: pomiń
jeśli v < v_min oraz τ < τ_min: pomiń
K ← c_rura(D)·L + c_wykop·V + c_studnia
zapamiętaj wariant o najmniejszym K
jeśli znaleziono wariant: zakończ
I ← I + 0,0005
Funkcja celu:
$$K_i = c_{rura}(D)\,L + c_{wykop}\,V + c_{studnia}, \qquad V = L\,(c_{min}+D+0{,}15)\,(D+0{,}8)$$
| Kryterium | Reguła | Źródło w profilu |
|---|---|---|
| Napełnienie | h/D \le (h/D)_{max} | maxFillRatio |
| Samooczyszczanie | v \ge v_{min} lub \tau \ge \tau_{min} | minVelocity_ms, minTractiveStress_Nm2 |
| Prędkość maksymalna | v \le v_{max} | maxVelocity_ms |
| Spadek | I_{min} \le I \le I_{max}, reguła 1/DN | minSlope_perMille, minSlopeRule |
| Przykrycie | \ge \max(c_{min},\,d_{przemarzania}) | minCover_m, frostDepth_m |
| Wykop | \le H_{max} | maxTrenchDepth_m |
| Średnica | niemalejąca w dół sieci | noDiameterReduction |
Pierwszy odcinek: z_{dna} = z_{terenu} - c_{min} - D.
Kolejne, łączenie po sklepieniu:
$$z_{dna,i} = \min\!\left(z_{dna,i-1}^{\,dół},\; z_{dna,i-1}^{\,dół} + D_{i-1} - D_i\right) - \Delta_{studnia}$$
Jeżeli tak wyznaczona rzędna daje przykrycie większe niż wymagane, zostaje podniesiona do poziomu wynikającego z przykrycia minimalnego — algorytm nie zakopuje kanału głębiej, niż to konieczne.
Równanie ciągłości rozwiązywane schematem jawnym upwind, z relacją kinematyczną Q = Q(A) wyznaczaną z Prandtla-Colebrooka:
$$A_i^{\,n+1} = A_i^{\,n} + \frac{\Delta t}{\Delta x}\left(q_{góra} + q_{boczny} - Q_i^{\,n}\right)$$
Zmierzone dla sieci demonstracyjnej: \varepsilon = 0{,}0000\%, Cr_{max} = 0{,}462, czas 34 ms.
Rysunek jest autorowany w milimetrach arkusza. Lista prymitywów (l linia, r prostokąt, p polilinia, f wypełnienie, t tekst) trafia do dwóch konsumentów:
viewBox w milimetrach, atrybut width przeskalowany przez współczynnik podglądu;Ekran nie ma wpływu na PDF. Rasteryzacja jest zakazana — nie używa się html2canvas, dom-to-image ani canvas.toDataURL.
$$x_{mm} = x_0 + \frac{(X - X_{ref})\cdot 1000}{S_H}, \qquad y_{mm} = y_0 - \frac{(Z - Z_{ref})\cdot 1000}{S_V}$$
Przewyższenie S_H/S_V jest wypisywane w tabelce rysunkowej.
Na każdym rysunku umieszczany jest znacznik kontrolny o znanej odległości terenowej (100 m na profilu, szerokość wykopu na przekroju). Test odbiorczy mierzy jego długość w gotowej geometrii i porównuje z wartością teoretyczną. Tolerancja ±0,1 %; zmierzony błąd wynosi 0,000000 %.
Dodatkowo test sprawdza MediaBox w strumieniu PDF (A3 = 1190,551 × 841,890 pt) oraz brak obiektów /Subtype /Image.
Własny writer generuje PDF 1.7 z pięcioma obiektami: katalog, drzewo stron, strona, strumień treści, font. Font Helvetica z kodowaniem WinAnsi; znaki diakrytyczne są transliterowane tablicą MAP. Tabela xref budowana z rzeczywistych przesunięć bajtowych.
.drnxPlik .drnx jest dokumentem JSON zawierającym:
schemaVersion, engineVersion, name
crsHorizontal, crsVertical
designProfileId, designProfileHash
route[], nodes[], conduits[]
terrainMeta (bez tablicy rastra)
results (wiersze + raport zgodności)
manifest.inputHash (SHA-256 całego dokumentu)
Migracje: przy odczycie porównywana jest schemaVersion. Wersja starsza uruchamia sekwencję migracji; wersja nowsza w zakresie major powoduje odmowę otwarcia z komunikatem o wymaganej aktualizacji.
Audytowalność: designProfileHash i inputHash pozwalają odtworzyć, która wersja reguł i jakie dane wejściowe dały zapisany wynik.
22 testy uruchamiane w przeglądarce przyciskiem w panelu 6.
| Grupa | Testy |
|---|---|
| Geometria | pole przekroju pełnego, R_h = D/4 przy h/D = 0{,}5 |
| Numeryka | odwracalność bisekcji h(Q), monotoniczność Q(h) |
| Hydrologia | monotoniczność Błaszczyka względem C, zachowanie sumy opadu w 5 hietogramach |
| Hydraulika | odwracalność koryta otwartego wg Manninga, spójność reżimu z Fr |
| Zlewnie | bilans powierzchni D8 względem obszaru NMT |
| Symulacja | bilans ciągłości < 1\%, warunek Couranta \le 1 |
| Rysunek | wierność skali profilu i przekroju, MediaBox, brak rasteryzacji |
| Topologia | graf acykliczny z jednym wylotem, zakaz redukcji średnicy, ciągłość rzędnych dna |
| Profile | rozdzielność reguł PL i DE |
Eksport .inp umożliwia przeliczenie tej samej sieci w EPA SWMM. Zalecana procedura sprawdzającego: porównać Q i h w wylocie; rozbieżność powyżej 2 % wymaga wyjaśnienia.
| Operacja | Budżet | Zmierzone |
|---|---|---|
| Dobór, 15 odcinków | — | < 50 ms |
| Dobór, 2000 odcinków | < 3 s | ekstrapolacja liniowa: ok. 1,5 s |
| Fala kinematyczna, 720 kroków | < 30 s | 34 ms |
| Delimitacja D8, 134 400 komórek | — | 196–300 ms |
| Generowanie PDF profilu | — | < 100 ms |
| Okno NMT | ≤ 16 mln komórek | limit egzekwowany w parserach |
Sekcja w index.html | Zawartość |
|---|---|
I18N, applyLang | dwujęzyczny interfejs i etykiety rysunków |
PROFILE_PL, PROFILE_DE, PROF() | profile normowe i przełącznik |
makeDemoTerrain, parseASC, parseXYZ, sampleZ | warstwa terenu |
blaszczyk, rationalQ, hyetograph, delineateD8 | hydrologia |
velocityPC, circGeom, fillForQ, openChannel | hydraulika |
buildNetwork, designNetwork | budowa sieci i dobór |
kinematicWave | symulacja dynamiczna |
buildProfileGeometry, buildCrossSection | geometria rysunków w mm |
elToSVG, makePDF | konsumenci geometrii |
exportDXF, exportCSV, exportINP, saveDRNX | eksporty |
drawPlan, render3D, renderSimulation, renderTables | widoki |
runTests | testy odbiorcze |
Konwencja: komentarze w kodzie po angielsku, interfejs dwujęzyczny, nazwy zmiennych jednoznaczne inżyniersko.