Learn R Programming

weirs (version 0.25)

weir3a5.broadcrest: Compute Open-Channel Flow over Broad-Crested Weir by TWRI3A5

Description

Compute open-channel flow (discharge) over a broad-crested weir in accordance with Hulsing (1967) [TWRI3A5]. The weir crest of opening (width) $b$ in feet is $P$ feet above the channel bottom and $L$ feet long in the flow direction. A rectangular approach channel is specified by width $B$, but the area of the channel (and hence rectangular assumption) can be bypassed by function arguments, although $B$ is used in the contraction ratio $b/B$ unless this ratio is superceded. For the weir3a5.broadcrest() function, the computations are exclusively based on the foot-second unit system and careful adherance by the user is required as not all “coefficients” are dimensionless.

The discharge equation for an acceptable tail-water condition $h_t$ is $$Q = k_c k_R k_s C b H^{1.5}$$ where $Q$ is discharge in cubic feet per second, $k_c$ is the contraction coefficient that also is a function of the abutment rounding $r$, $k_R$ is the approach rounding coefficient that is a function of the approach crest rounding $R$, $k_s$ is the downstream embankment slope coefficient, $C$ is the discharge coefficient, $b$ is the width in feet of the weir crest, and $H$ is total head in feet on the weir, which is computed by $$H = h + v_o = h + \alpha v^2/2g$$ where $h$ is static head in feet on the weir, $v_o$ is velocity head in feet in the approach section, $v$ is mean velocity in feet per second in the section computed by $v=Q/A$ for cross section area $A$ in square feet, which by default is computed by $A=(h + P)B$, but can be superceded. The quantity $g$ is the acceleration of gravity and is hardwired to 32.2 feet per square second. The dimensionless quantity $\alpha$ permits accommodation of a velocity head correction that is often attributable to cross section subdivision. The $\alpha$ is outside the scope of this documentation, is almost always $\alpha=1$, and is made available as an argument for advanced users.

The weir3a5.broadcrest() function is vectorized meaning that optional vectors of $h$ can be specified along with an optional and equal length vector $h_t$. The function assumes rectangular approach conditions to compute approach area $A$ if not superceded by the optional A argument, which also can be a vector.

The weir3a5.broadcrest() function also permits optional vectors of $L$ and $b/B$ (by the argument contractratio) so that tuning of the weir-computed discharge to a measured discharge potentially can be made. The crest length $L$ can be used to increase discharge slightly by shortening in say the circumstances of a slightly downward sloping crest. (Such potential “crest” sloping is distinct from the downstream embankment slope---do not confuse the two.) The $b/B$ can be used to decrease discharge by decreasing $k_c$ in say the circumstance of an inlet that is rougher or has asperities that slightly increase the expected contraction and reduce flow efficiency. To clarify, the fact that $L$ and $b/B$ can be vectorized as optional arguments shows a mechanism by which tuning of the computational results to measured $Q$ values can occur without replacing the fundamental nomographs and lookup tables of TWRI3A5 for $k_c$, $k_R$, $k_s$, and $C$. In all cases, these coefficients can be superceded by user-specified scalars or vectors in various combinations.

Usage

weir3a5.broadcrest(h, ht=NULL, b=NULL, B=NULL, P=NULL, L=NULL, R=0, r=0, A=NULL, alpha=1, slopeus="vertical", slopeds="vertical", kc=NULL, kr=NULL, ks=NULL, C=NULL, low.head.class=c("paved", "gravel"), contractratio=NULL, extended=TRUE, header="", flowdigits=2, coedigits=3, verbose=FALSE, eps=0.001, maxit=20)

Arguments

h
Mandatory scalar or vector of static heads $h$ in feet on the weir;
ht
Optional scalar or vector of tail water heads $h_t$ in feet on the weir;
b
Mandatory scalar width of weir crest $b$ in feet normal to flow;
B
Mandatory scalar width (or top width) of approach channel $B$ in feet. Technically, it is possible with arguments contractratio and A to bypass any computations normally involving $B$. This would be the mechanism to bypass the $B$ restriction as a scalar requirement;
P
Mandatory scalar height of weir crest $P$ in feet above channel bed;
L
Optional scalar or vector of lengths $L$ in feet of broad-crested weir in direction of flow;
R
Optional scalar radius of curvature $R$ in feet of vertical upstream face;
r
Optional scalar radius of curvature $r$ in feet on the vertical abutments at inlet of weir crest;
A
Optional scalar or vector of approach cross-section area $A$ in square feet for each $h$ that supersedes the rectangular channel computation $A=(h+P)B$;
alpha
Optional scalar or vector of velocity head correction term $\alpha$ dimensionless. The default is unity ($\alpha=1$), which is most certainly appropriate for the vast majority of weir computations;
slopeus
String signifying the approach embankment slope in the format “hz:vt”, thus, slope is defined as the ratio of the horizontal hz to vertical distance vt. (This is opposite of the more common convention for the trigometric function tan().) The string “vertical” must be provided as the value for slopeus for vertical slopes;
slopeds
String signifying the downstream embankment slope in the format “hz:vt”, thus, slope is defined as the ratio of the horizontal hz to vertical distance vt. (This is opposite of the more common convention for the trigometric function tan().) The string “vertical” must be provided as the value for slopeds for vertical slopes;
kc
Contraction coefficient $k_c$, if provided, supercedes nomograph lookup and interpolation by $h/P$ and $b/B$. Optionally, this coefficient may be a vector;
kr
Rounding coefficient $k_R$, if provided, supercedes tabular lookup and interpolation by $R/h$. Optionally, this coefficient may be a vector;
ks
Downstream embankment slope coefficient $k_s$, if provided supercedes tabular lookup and interpolation by $h/L$ and downstream slope slopeds. Optionally, this coefficient may be a vector;
C
Discharge coefficient, if provided, supercedes nomograph lookup and interpolation by $h/L$ and slopeus. Optionally, this coefficient may be a vector;
low.head.class
For $h/L < 0.1$, low head on the weir is concluded and alternative $C$ nomograph and interpolation is made based on figure 23 of TWRI3A5. Use of the alternative $C$ requires a “paved” and “gravel” classification in which total head $H$ is used and not $h$ as in the primary $C$ nomographs. How well the paved classification applies to concrete, wood, and metal broad-crested weirs is not discussed in TWRI3A5. Finally, it is expected that most users can use (should use) the paved classification. More formal procedures for embankment flow are provided in TWRI3A5;
contractratio
Optional vector of user specified contraction ratios, if provided, supercedes use of $b/B$. For example, b.over.B[i] <- contractratio[i];
extended
A logical that controls the contents of the data frame on return;
header
A string (usually) or any other content to add to the attributes() of the returned data frame under the non-original label name of header;
flowdigits
The number of digits to report on flow, velocity head, and total head;
coedigits
The number of digits to report on weir coefficients;
verbose
A logical controlling intermediate messages. This might be reserved for development work and no verbose output in a released version of weirs could occur;
eps
An absolute error of discharge for convergence in cubic feet per second; and
maxit
Maximum number of iterations for the computation of the total head from summation of static and velocity head $H = h + \alpha v^2/2g$ for the final $Q_H$ in item flow of the returned data frame.

Value

An R data.frame() is returned and the extended=TRUE version is described below:
head
Echoed $h$ on the input in feet;
flow
Flow $Q_H$ in cubic feet per second based on total head $H$;
delta
First order difference of $Q_H$;
flowo
Flow $Q_h$ in cubic feet per second based on static head $h$;
error
Absolute convergence error $\epsilon$ of $Q_H$ in cubic feet per second;
velhead
Velocity head $v_o = v^2/2g = (Q_H/A)^2/2g$ in feet;
ht
Echoed $h_t$ on the input in feet;
H
Total head $H = h + v_o$;
L
Echoed $L$ in feet;
b.over.B
Echoed $b/B$;
h.over.L
Echoed $h/L$;
h.over.P
Echoed $h/P$;
C
Discharge coefficient $C$;
kc
Contraction coefficient $k_c$;
kr
Rounding coefficient $k_R$;
ks
Downstream slope coefficient $k_s$;
message
Messages concerning the computation of $Q$ for each value of $h$; and
source
weir3a5.broadcrest.
The extended=FALSE version is restricted to the most salient items including $Q_H$, $Q_h$, $v_o$, $C$, $k_c$, $k_R$, and $k_s$.

References

Hulsing, Harry, 1967, Measurement of peak discharge at dams by indirect methods: U.S. Geological Survey Techniques of Water-Resources Investigations, Book 3, Chapter A5, 29 p., http://pubs.usgs.gov/twri/twri3-a5/

See Also

weir.broadcrest

Examples

Run this code

# Simple, scalar inputs and results
weir.broadcrest(0.5, b=8, B=11, P=6, L=3.25);

# Vector of heads
weir.broadcrest(c(0.5,0.4,0.3), b=8, B=11, P=6, L=3.25);

# Vector of heads and "effective weir lengths"
# Nomograph TWRI3A5-fig7 is being tested here.
weir.broadcrest(  c(0.51, 0.53, 0.70),
                L=c(1,    1.1,  1.20), b=6.18, B=7.84, P=1.13);

# User specified contraction--superceds 8/11
# Nomograph TWRI3A5-fig3 is being tested here.
weir.broadcrest(0.5, b=8, B=11, contractratio=9/11, P=6, L=3.25);
weir.broadcrest(0.5, b=8, B=11, P=6, L=3.25); # compare to previous

# Randomly pick contraction ratios to span the nomograph
# Nomograph TWRI3A5-fig3 is being tested here.
n <- 30; bB <- sort(runif(n));
weir.broadcrest(rep(1,n), b=8, B=11, contractratio=bB, P=6, L=3.25);

# Randomly pick lengths and likely kick-off some sharp-crested messages
# Nomograph TWRI3A5-fig6 is being tested here.
L <- sort(runif(n, min=1, max=30));
weir.broadcrest(rep(10,n), b=8, B=11, P=6, L=L);

# Flow estimate in the non-low.head.classification
# Nomograph TWRI3A5-fig23 is being tested here.
weir.broadcrest(.1, b=6, B=6, P=4, L=1);
# Slighly lower are a realistic step change in h. See how the C
# changes dramatically by  (TWRI3A5-fig23), but at 0.01 feet there
#is some smoothness in the result.
weir.broadcrest(.09, b=6, B=6, P=4, L=1);
# Now try extremely close to 0.10 feet
weir.broadcrest(.0999999, b=6, B=6, P=4, L=1);
# Now try switching from "paved" to "gravel" nomograph (TWRI3A5-fig23)
weir.broadcrest(.09, b=6, B=6, P=4, L=1, low.head.class="gravel");

# Nomograph TWRI3A5-fig7 is being tested here for upstream slope
weir.broadcrest(0.5, slopeus="3:1",     b=8, B=11, P=6, L=3.25);
weir.broadcrest(0.5, slopeus="2:1",     b=8, B=11, P=6, L=3.25);
weir.broadcrest(0.5, slopeus="1.999:1", b=8, B=11, P=6, L=3.25);
weir.broadcrest(0.5, slopeus="0.51:1",  b=8, B=11, P=6, L=3.25);
weir.broadcrest(0.5, slopeus="0.50:1",  b=8, B=11, P=6, L=3.25);
weir.broadcrest(0.5, slopeus="0.49:1",  b=8, B=11, P=6, L=3.25);
try(weir.broadcrest(0.5, slopeus="force-error", b=8, B=11, P=6, L=3.25));

# Nomograph TWRI3A5-p9 (table) is being tested here for
# various downstream slopes
weir.broadcrest(3.5, slopeds="1:1",    b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="2:1",    b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="2.5:1",  b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="3:1",    b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="3.5:1",  b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="4.99:1", b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="5:1",    b=6, B=11, P=6, L=3.25);
weir.broadcrest(3.5, slopeds="5.1:1",  b=6, B=11, P=6, L=3.25);


# Now configure some weirs for which kc, kr, ks, and C are all
# looked up starting with some (R)ounding and then some more
# (r)ounding and note the changes to kr
weir.broadcrest(3.5, slopeds="3.5:1",  R=0, b=6, B=11, P=6, L=3.25);
# change kr by crest rounding
weir.broadcrest(3.5, slopeds="3.5:1",  R=1, b=6, B=11, P=6, L=3.25);
# change kc by abutment rounding
weir.broadcrest(3.5, slopeds="3.5:1",  R=1, r=.5, b=6, B=11, P=6, L=3.25);
# Now force override of all coefficients
weir.broadcrest(3.5, slopeds="3.5:1",  R=1, r=.5, b=6, B=11, P=6, L=3.25,
                kc=0.95, kr=1.01, ks=.94, C=3.1);


# Now vectorize the coefficients
weir.broadcrest(rep(0.5,3), b=8, B=11, P=6, L=3.25, C=c(3, 3.1, 3.2),
    kc=c(0.95, 1, 1.05), kr=c(1, 1.03, 1.08), ks=c(0.99, 0.95, 0.90));


# Now create a rating curve
h <- seq(0.01,2,by=.01);
Q <- weir.broadcrest(h, b=8, B=11, P=6, L=3.25);
plot(Q$flow, Q$head, type="l", col=8, lwd=7,
     xlab="DISCHARGE, IN CUBIC FEET PER SECOND",
     ylab="HEAD ON WEIR, IN FEET");
lines(sort(Q$flow), Q$head, col=2, lty=2, lwd=3);

# Now take the Q, repeat the sort and then recompute the delta
ii <- order(Q$flow);
Q <- Q[ii,]; # sort the entire data frame
Q$delta <- c(NA, diff(Q$flow)); # recompute deltas
# This insures a monotonic increasing relations between h and Q
# even though it might not be as smooth as hand-guided
# interpolation would provide.

Run the code above in your browser using DataLab