The eight tabulated closed conduits, straight from
xsect.dat and xsect.c. Area, hydraulic radius, top width and
section factor are computed the way the engine computes them — including the four
shapes that ship no area or radius table at all.
Section outline, drawn from the width table
Part-full curves — everything relative to its brim-full value
The flow curve crossing 1.0 before the crown is the reason a sewer carries
more than its full-bore flow when running just under the soffit. The engine stores that
peak separately as sMax rather than recomputing it.
Full-section constants — xsect_setParams()
Multiply by the full height, or its square for area. These are assigned directly, not derived from the width table — which is why a CUSTOM curve copied from one of these shapes does not route identically to the built-in shape.
Raw tables
Five tables, three different index variables. W, A and
R are indexed by depth. S is indexed by area, and
Y is indexed by section factor. They are read with
lookup(), which is linear except for a quadratic correction across the first
two intervals, where a circular section's width changes fastest.
Four shapes ship no area or radius table. Gothic, catenary, semi-elliptical and
semi-circular have only W, S and Y. The engine gets
area by inverting the Y table, then falls through
xsect_getRofA()'s default to recover the radius as
R = (S/A)^(3/2) — which is exactly consistent with
S = A·R^(2/3). This app does the same, so all eight shapes reproduce
their published aFull and rFull at full depth.
Resolution is not uniform. Circular is tabulated at 51 points, egg, horseshoe and
basket handle at 26, the rest at 21. Integrating the coarse tables trapezoidally lands a
few percent below the published aFull, which is why the constants are stored
separately rather than derived.
A casing quirk in EPA's own source. The area and radius tables are
A_Baskethandle and R_Baskethandle, while the section-factor and
depth tables are S_BasketHandle and Y_BasketHandle — lower-case
h in one pair, upper-case in the other. Any parser assuming a consistent name silently
finds nothing.
Not covered here. Horizontal ellipse, vertical ellipse and arch are also tabulated, but they are selected from standard size catalogues rather than scaled from a single full height, so their constants come from a size index instead of a formula.