Title: | A Hydraulics Package to Compute Open-Channel Flow over Weirs |
---|---|
Description: | Provides computational support for flow over weirs, such as sharp-crested, broad-crested, and embankments. Initially, the package supports broad- and sharp-crested weirs. |
Authors: | William Asquith |
Maintainer: | William Asquith <[email protected]> |
License: | GPL-2 |
Version: | 0.25 |
Built: | 2025-02-17 04:44:41 UTC |
Source: | https://github.com/cran/weirs |
Parent function for broad-crested weir functions of the weirs package. This simply named function is set to dispatch to subordinate functions according to the supported procedure types for broad-crested weir flow. The supported procedure types are:
TWRI3A5, which represents the implementation in weir3a5.broadcrest()
the procedures of 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/
BOS, which represents the implementation in weirbos.broadcrest()
the procedures of Bos, M.G., 1989, Discharge measurement structures: International Institute for Land Reclamation and Improvement Publication 20, Wageningen, The Netherlands, 401 p. http://content.alterra.wur.nl/Internet/webdocs/ilri-publicaties/publicaties/Pub20/pub20.pdf
NA
is the empty set and will error out.
weir.broadcrest(..., type=c("TWRI3A5", "BOS", NA))
weir.broadcrest(..., type=c("TWRI3A5", "BOS", NA))
... |
Arguments for subordinate broad-crested weir functions; and |
type |
Identify the broad-crested weir function to dispatch too. |
An R data.frame()
is returned.
W. Asquith
weir3a5.broadcrest
, weirbos.broadcrest
Parent function for sharp-crested weir functions of the weirs package. This simply named function is set to dispatch to subordinate functions according to the supported procedure types for sharp-crested weir flow. The supported procedural types are:
TWRI3A5, which represents the implementation in weir3a5.sharpcrest()
the procedures of 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/
NA
is the empty set and will error out.
weir.sharpcrest(..., type=c("TWRI3A5", NA))
weir.sharpcrest(..., type=c("TWRI3A5", NA))
... |
Arguments for subordinate sharp-crested weir functions; and |
type |
Identify the sharp-crested weir function to dispatch too. |
An R data.frame()
is returned.
W. Asquith
Compute open-channel flow (discharge) over a broad-crested weir in accordance with Hulsing (1967) [TWRI3A5]. The weir crest of opening (width) in feet is
feet above the channel bottom and
feet long in the flow direction. A rectangular approach channel is specified by width
, but the area of the channel (and hence rectangular assumption) can be bypassed by function arguments, although
is used in the contraction ratio
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 is
where is discharge in cubic feet per second,
is the contraction coefficient that also is a function of the abutment rounding
,
is the approach rounding coefficient that is a function of the approach crest rounding
,
is the downstream embankment slope coefficient,
is the discharge coefficient,
is the width in feet of the weir crest, and
is total head in feet on the weir, which is computed by
where is static head in feet on the weir,
is velocity head in feet in the approach section,
is mean velocity in feet per second in the section computed by
for cross section area
in square feet, which by default is computed by
, but can be superceded. The quantity
is the acceleration of gravity and is hardwired to 32.2 feet per square second. The dimensionless quantity
permits accommodation of a velocity head correction that is often attributable to cross section subdivision. The
is outside the scope of this documentation, is almost always
, and is made available as an argument for advanced users.
The weir3a5.broadcrest()
function is vectorized meaning that optional vectors of can be specified along with an optional and equal length vector
. The function assumes rectangular approach conditions to compute approach area
if not superceded by the optional
A
argument, which also can be a vector.
The weir3a5.broadcrest()
function also permits optional vectors of and
(by the argument
contractratio
) so that tuning of the weir-computed discharge to a measured discharge potentially can be made. The crest length 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
can be used to decrease discharge by decreasing
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
and
can be vectorized as optional arguments shows a mechanism by which tuning of the computational results to measured
values can occur without replacing the fundamental nomographs and lookup tables of TWRI3A5 for
,
,
, and
. In all cases, these coefficients can be superceded by user-specified scalars or vectors in various combinations.
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)
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)
h |
Mandatory scalar or vector of static heads |
ht |
Optional scalar or vector of tail water heads |
b |
Mandatory scalar width of weir crest |
B |
Mandatory scalar width (or top width) of approach channel |
P |
Mandatory scalar height of weir crest |
L |
Optional scalar or vector of lengths |
R |
Optional scalar radius of curvature |
r |
Optional scalar radius of curvature |
A |
Optional scalar or vector of approach cross-section area |
alpha |
Optional scalar or vector of velocity head correction term |
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 |
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 |
kc |
Contraction coefficient |
kr |
Rounding coefficient |
ks |
Downstream embankment slope coefficient |
C |
Discharge coefficient, if provided, supercedes nomograph lookup and interpolation by |
low.head.class |
For |
contractratio |
Optional vector of user specified contraction ratios, if provided, supercedes use of |
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 |
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 |
An R data.frame()
is returned and the extended=TRUE
version is described below:
head |
Echoed |
flow |
Flow |
delta |
First order difference of |
flowo |
Flow |
error |
Absolute convergence error |
velhead |
Velocity head |
ht |
Echoed |
H |
Total head |
L |
Echoed |
b.over.B |
Echoed |
h.over.L |
Echoed |
h.over.P |
Echoed |
C |
Discharge coefficient |
kc |
Contraction coefficient |
kr |
Rounding coefficient |
ks |
Downstream slope coefficient |
message |
Messages concerning the computation of |
source |
|
The extended=FALSE
version is restricted to the most salient items including ,
,
,
,
,
, and
.
The weir3a5.broadcrest()
function will stop()
under conditions of unspecified or implausible ,
, and
as well as incompatibility of
and
, such as
. This function will also
stop()
if the length of the vector arguments or optional vector arguments do not match the length of . The only exception is that if
is not specified, then internally it is treated a vector of length
having values of zero. There are other conditions that will cause the function to stop and consultation of the
if()
statements at the beginning of the function is recommended.
When the weir3a5.broadcrest()
function encounters non-stopping errors or warnings, it silently continues with error reporting in the message
item in the returned data frame. This behavior is considered a feature and necessary to support the return of the data frame. The message states are:
If is too large, then submergence is assumed and
NA
is returned for all items. The evaluation of submergence is made if ;
If is zero, then zero is returned for
,
,
, and
and
NA
is returned for others;
If a given tests as too high for broad-crested weir flow and hence the weir is functioning as sharp-crested, then
NA
is returned for all items; however, for very shallow approach embankment slopes (), then critical
is used for all
and such weirs with
are treated as broad-crested;
If the contraction ratio is too small (
), then too much contraction is concluded and
NA
is returned for all items;
If the upstream embankment slope is too shallow (), then
is indeterminant and
NA
is returned for all items;
If the downstream embankment slope is too shallow (, then
is indeterminant and only the values for
,
, and
are returned;
If nonconvergence occurs or estimated goes to infinity (supercritical approach or choking), then
NA
is returned for all ,
, and
, but the estimated
,
,
, and
are returned; and
If no problems were detected, then ok
is the message.
The influence of abutment rounding by the ratio on
is accommodated by prorating between (1)
from
and
or user-specified
and (2)
unless
for which
.
Nomograph and tabular lookup and interpolation is made throughout the computations. The linear interpolating approx()
function is used for all interpolation. Most commonly, a form of bilinear interpolation is made. First, the two bounding curves for a given condition are interpolated in the horizontal direction and then the resulting two values are interpolated in the vertical. The horizontal interpolation by approx()
explicitly uses the rule=2
, which means that extrapolation to the left and right using the respective end point is made. In other words, the nomographs (and tables) are flat lined when extrapolation is needed. Within the code, the horizontal interpolations can be identified by rule=2
and the vertical interpolations lack the rule
argument. Finally, the nomographs are in the hashed environment .weir.nomographs, which sources from the file ‘sysdata.rda’ of the package. The file ‘./inst/Nomographs4R/nomographs.R’ is used to create the ‘sysdata.rda’ file.
W. Asquith with digitizing of nomograph contributions by W. Miller
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/
# 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.
# 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.
Compute open-channel flow (discharge) over a sharp-crested weir in general accordance with Hulsing (1967) [TWRI3A5]. The weir crest of opening (width) in feet is
feet above the channel bottom and
feet long in the flow direction. A rectangular approach channel is specified by width
, but the area of the channel (and hence rectangular assumption) can be bypassed by function arguments, although
is used in the contraction ratio
unless this ratio is superceded. For the
weir3a5.sharpcrest()
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 is
where is discharge in cubic feet per second,
is the contraction coefficient that also is a function of the abutment rounding
,
is the submergence adjustment coefficient,
is the discharge coefficient,
is the width in feet of the weir crest, and
is total free-flow head in feet on the weir assuming
, which is computed by
where is static head in feet on the weir,
is velocity head in feet in the approach section,
is mean velocity in feet per second in the section computed by
for cross section area
in square feet, which by default is computed by
, but can be superceded. The quantity
is the acceleration of gravity and is hardwired to 32.2 feet per square second. The dimensionless quantity
permits accommodation of a velocity head correction that is often attributable to cross section subdivision. The
is outside the scope of this documentation, is almost always
, and is made available as an argument for advanced users.
The weir3a5.sharpcrest()
function is vectorized meaning that optional vectors of can be specified along with an optional and equal length vector
. The function assumes rectangular approach conditions to compute approach area
if not superceded by the optional
A
argument, which also can be a vector.
The weir3a5.sharpcrest()
function also permits optional vectors of and
(by the argument
contractratio
) so that tuning of the weir-computed discharge to a measured discharge potentially can be made. The crest length can be used to increase discharge slightly by shortening in say the circumstances of a slightly downward sloping crest. The
can be used to decrease discharge by decreasing
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
and
can be vectorized as optional arguments shows a mechanism by which tuning of the computational results to measured
values can occur without replacing the fundamental nomographs and lookup tables of TWRI3A5 for
,
, and
. In all cases, these coefficients can be superceded by user-specified scalars or vectors in various combinations.
weir3a5.sharpcrest(h, ht=NULL, b=NULL, B=NULL, P=NULL, L=NULL, r=0, A=NULL, alpha=1, slopeus="vertical", kc=NULL, kt=NULL, C=NULL, contractratio=NULL, extended=TRUE, header="", resetkts=TRUE, flowdigits=2, coedigits=3, verbose=FALSE, eps=0.001, maxit=20)
weir3a5.sharpcrest(h, ht=NULL, b=NULL, B=NULL, P=NULL, L=NULL, r=0, A=NULL, alpha=1, slopeus="vertical", kc=NULL, kt=NULL, C=NULL, contractratio=NULL, extended=TRUE, header="", resetkts=TRUE, flowdigits=2, coedigits=3, verbose=FALSE, eps=0.001, maxit=20)
h |
Mandatory scalar or vector of static heads |
ht |
Optional scalar or vector of tail water heads |
b |
Mandatory scalar width of weir crest |
B |
Mandatory scalar width (or top width) of approach channel |
P |
Mandatory scalar height of weir crest |
L |
Optional scalar or vector of lengths |
r |
Optional scalar radius of curvature |
A |
Optional scalar or vector of approach cross-section area |
alpha |
Optional scalar or vector of velocity head correction term |
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 |
kc |
Contraction coefficient |
kt |
Coefficient for submergence adjustment, if provided, supercedes nomograph lookup and interpolation by |
C |
Discharge coefficient, if provided, supercedes nomograph lookup and interpolation by |
contractratio |
Optional vector of user specified contraction ratios, if provided, supercedes use of |
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 |
resetkts |
A logical controlling whether interpolated |
flowdigits |
The number of digits to report on flow, velocity head, total head, computed |
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 |
An R data.frame()
is returned and the extended=TRUE
version is described below:
head |
Echoed |
flow |
Flow |
delta |
First order difference of |
flowfree |
Flow |
flowo |
Flow |
error |
Absolute convergence error |
velhead |
Velocity head |
Hfree |
Total head |
ht |
Echoed |
L |
Echoed |
b.over.B |
Echoed |
h.over.L |
Echoed |
h.over.P |
Echoed |
ht.over.H |
Computed |
H.over.P |
Computed |
C |
Discharge coefficient |
kc |
Contraction coefficient |
kt |
Coefficient to adjust for submergence |
message |
Messages concerning the computation of |
source |
|
The extended=FALSE
version is restricted to the most salient items including ,
,
,
,
,
, and
.
The weir3a5.sharpcrest()
function will stop()
under conditions of unspecified or implausible ,
, and
as well as incompatibility of
and
, such as
. This function will also
stop()
if the length of the vector arguments or optional vector arguments do not match the length of . The only exception is that if
is not specified, then internally it is treated a vector of length
having values of zero. There are other conditions that will cause the function to stop and consultation of the
if()
statements at the beginning of the function is recommended.
When the weir3a5.sharpcrest()
function encounters non-stopping errors or warnings, it silently continues with error reporting in the message
item in the returned data frame. This behavior is considered a feature and necessary to support the return of the data frame. The message states are:
If , then
has much uncertainty and
NA
is returned for all items;
If is zero, then zero is returned for all
,
, and
and
NA
is returned for others;
If a given tests as too low for sharp-crested weir flow and hence the weir is functioning as broad-crested, then
NA
is returned for all items; however, for very shallow approach embankment slopes (), then critical
is used for all
and such weirs with
are treated as broad-crested;
If the contraction ratio is too small (
), then too much contraction is concluded and
NA
is returned for all items;
If the upstream embankment slope is too shallow (), then
is indeterminant and
NA
is returned for all items;
If nonconvergence occurs or estimated goes to infinity (supercritical approach or choking), then
NA
is returned for all ,
, and
, but the estimated
,
, and
are returned;
If by
from free flow conditions, then too much submergence for
computation, and;
If no problems were detected, then ok
is the message.
The conditions important for computation are:
If for total
for free-flow (
) conditions, then too much submergence is concluded and
is
NA
and hence flow
is NA
;
If , then
and
flow
is equal to flowfree
;
If , then
can not be computed and is
NA
and hence flow
is equal to NA
;
If , then
can not be computed and is
NA
and hence flow
is equal to NA
;
If , then
by resetting dependent on the
resetkts
logical argument. This practice differs from
TWRI3A5, but prevents submergence from producing more than free-flow conditions. The difference is that this function uses iteration to solve for the total head for the free-flow conditions and not a single computation step as seemingly implied in TWRI3A5.
The influence of abutment rounding by the ratio on
is accommodated by prorating between (1)
from
and
or user-specified
and (2)
unless
for which
.
Nomograph lookup and interpolation is made throughout the computations. The linear interpolating approx()
function is used for all interpolation. Most commonly, a form of bilinear interpolation is made. First, the two bounding curves for a given condition are interpolated in the horizontal direction and then the resulting two values are interpolated in the vertical. The horizontal interpolation by approx()
explicitly uses the rule=2
, which means that extrapolation to the left and right using the respective end point is made. In other words, the nomographs (and tables) are flat lined when extrapolation is needed. Within the code, the horizontal interpolations can be identified by rule=2
and the vertical interpolations lack the rule
argument. Finally, the nomographs are in the hashed environment .weir.nomographs, which sources from the file ‘sysdata.rda’ of the package. The file ‘./inst/Nomographs4R/nomographs.R’ is used to create the ‘sysdata.rda’ file.
W. Asquith with digitizing of nomograph contributions by W. Miller
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/
weir3a5.sharpcrest(0.45, L=0.125, P=0.32, b=5.81, B=5.81) h <- seq(0.15,0.64,by=.01) Qo <- weir3a5.sharpcrest(h, L=0.125, P=0.32, b=5.81, B=5.81) print(Qo) ht <- seq(0.15,0.64,by=.01)/2 weir3a5.sharpcrest(h, ht=ht, L=0.125, P=0.32, b=5.81, B=5.81) plot(Qo$flow, Qo$head, type="l", log="xy") Q <- weir3a5.sharpcrest(h, ht=0.21*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.4*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.6*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.8*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2)
weir3a5.sharpcrest(0.45, L=0.125, P=0.32, b=5.81, B=5.81) h <- seq(0.15,0.64,by=.01) Qo <- weir3a5.sharpcrest(h, L=0.125, P=0.32, b=5.81, B=5.81) print(Qo) ht <- seq(0.15,0.64,by=.01)/2 weir3a5.sharpcrest(h, ht=ht, L=0.125, P=0.32, b=5.81, B=5.81) plot(Qo$flow, Qo$head, type="l", log="xy") Q <- weir3a5.sharpcrest(h, ht=0.21*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.4*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.6*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2) Q <- weir3a5.sharpcrest(h, ht=0.8*h, L=0.125, P=0.32, b=5.81, B=5.81) lines(Q$flow, Q$head, lty=2)
Compute open-channel flow (discharge) over a broad-crested weir in accordance with Bos (1989) [BOS] with extension into the coefficients ,
, and
from Hulsing (1967). The weir crest of opening (width)
in feet is
feet above the channel bottom and
feet long in the flow direction. A rectangular approach channel is specified by width
, but the area of the channel (and hence rectangular assumption) can be bypassed by function arguments, although
is used in the contraction ratio
unless this ratio is superceded. For the
weirbos.broadcrest()
function, the computations are exclusively based on the foot-second unit system and careful adherance by the user is required.
The discharge equation for an acceptable tail-water condition is
where is discharge in cubic feet per second,
is the contraction coefficient that also is a function of the abutment rounding
,
is the approach rounding coefficient that is a function of the approach crest rounding
,
is the downstream embankment slope coefficient,
is the approach velocity coefficient,
is the discharge coefficient,
is the width in feet of the weir crest, and
is total head in feet on the weir, which is computed by
where is static head in feet on the weir,
is velocity head in feet in the approach section,
is mean velocity in feet per second in the section computed by
for cross section area
in square feet, which by default is computed by
, but can be superceded. The quantity
is the acceleration of gravity and is hardwired to 32.2 feet per square second. The dimensionless quantity
permits accommodation of a velocity head correction that is often attributable to cross section subdivision. The
is outside the scope of this documentation, is almost always
, and is made available as an argument for advanced users.
The discharge equation is solved for two conditions that consider the approach velocity head. First, the equation is solved as shown above for through iteration and
. Second, the equation is solved using
and
, which is determined by nomograph lookup.
The weirbos.broadcrest()
function is vectorized meaning that optional vectors of can be specified along with an optional and equal length vector
. The function assumes rectangular approach conditions to compute approach area
if not superceded by the optional
A
argument, which also can be a vector.
The weirbos.broadcrest()
function also permits optional vectors of and
(by the argument
contractratio
) so that tuning of the weir-computed discharge to a measured discharge potentially can be made. The crest length 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
can be used to decrease discharge by decreasing
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
and
can be vectorized as optional arguments shows a mechanism by which tuning of the computational results to measured
values can occur without replacing the fundamental
and
nomographs of BOS and nomograph and lookup tables for
,
, and
of TWRI3A5 (Hulsing, 1967). In all cases, these coefficients can be superceded by user-specified scalars or vectors in various combinations.
weirbos.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, contractratio=NULL, hhptest=TRUE, extended=TRUE, header="", flowdigits=2, coedigits=3, verbose=FALSE, eps=0.001, maxit=20)
weirbos.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, contractratio=NULL, hhptest=TRUE, extended=TRUE, header="", flowdigits=2, coedigits=3, verbose=FALSE, eps=0.001, maxit=20)
h |
Mandatory scalar or vector of static heads |
ht |
Optional scalar or vector of tail water heads |
b |
Mandatory scalar width of weir crest |
B |
Mandatory scalar width (or top width) of approach channel |
P |
Mandatory scalar height of weir crest |
L |
Optional scalar or vector of lengths |
R |
Optional scalar radius of curvature |
r |
Optional scalar radius of curvature |
A |
Optional scalar or vector of approach cross-section area |
alpha |
Optional scalar or vector of velocity head correction term |
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 |
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 |
kc |
Contraction coefficient |
kr |
Rounding coefficient |
ks |
Downstream embankment slope coefficient |
C |
Discharge coefficient, if provided, supercedes nomograph lookup and interpolation by |
hhptest |
Logical for test of |
contractratio |
Optional vector of user specified contraction ratios, if provided, supercedes use of |
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 |
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 |
An R data.frame()
is returned and the extended=TRUE
version is described below:
head |
Echoed |
flow |
Flow |
delta |
First order difference of |
flowo |
Flow |
flowcv |
Flow |
error |
Absolute convergence error |
velhead |
Velocity head |
H |
Total head |
ht |
Echoed |
L |
Echoed |
b.over.B |
Echoed |
h.over.L |
Echoed |
h.over.P |
Echoed |
C |
Discharge coefficient |
Cv |
Approach velocity coefficient; |
kc |
Contraction coefficient |
kr |
Rounding coefficient |
ks |
Downstream slope coefficient |
message |
Messages concerning the computation of |
source |
|
The extended=FALSE
version is restricted to the most salient items including ,
,
,
,
,
,
,
, and
.
The weirbos.broadcrest()
function will stop()
under conditions of unspecified or implausible ,
, and
as well as incompatibility of
and
, such as
. This function will also
stop()
if the length of the vector arguments or optional vector arguments do not match the length of . The only exception is that if
is not specified, then internally it is treated a vector of length
having values of zero. There are other conditions that will cause the function to stop and consultation of the
if()
statements at the beginning of the function is recommended.
When the weirbos.broadcrest()
function encounters non-stopping errors or warnings, it silently continues with error reporting in the message
item in the returned data frame. This behavior is considered a feature and necessary to support the return of the data frame. The message states are:
If is too large, then submergence is assumed and
NA
is returned for all items. The evaluation of submergence is made if ;
If then
can be determined and computation progress, otherwise
NA
is returned for all items;
If is zero, then zero is returned for
,
,
,
, and
and
NA
is returned for others;
If a given tests as too high (
) for broad-crested weir flow and hence the weir is functioning as sharp-crested, then
NA
is returned for all items. Weirs with are treated as low head, then
NA
is returned for all items;
If the contraction ratio is too small (
), then too much contraction is concluded and
NA
is returned for all items;
If the downstream embankment slope is too shallow (, then
is indeterminant and only the values for
,
, and
are returned;
If nonconvergence occurs or estimated goes to infinity (supercritical approach or choking), then
NA
is returned for all ,
, and
, but the estimated
,
,
, and
are returned, and;
If no problems were detected, then ok
is the message.
The influence of abutment rounding by the ratio on
is accommodated by prorating between (1)
from
and
or user-specified
and (2)
unless
for which
.
Nomograph and tabular lookup and interpolation is made throughout the computations. The linear interpolating approx()
function is used for all interpolation. Most commonly, a form of bilinear interpolation is made. First, the two bounding curves for a given condition are interpolated in the horizontal direction and then the resulting two values are interpolated in the vertical. The horizontal interpolation by approx()
explicitly uses the rule=2
, which means that extrapolation to the left and right using the respective end point is made. In other words, the nomographs (and tables) are flat lined when extrapolation is needed. Within the code, the horizontal interpolations can be identified by rule=2
and the vertical interpolations lack the rule
argument. Finally, the nomographs are in the hashed environment .weir.nomographs, which sources from the file ‘sysdata.rda’ of the package. The file ‘./inst/Nomographs4R/nomographs.R’ is used to create the ‘sysdata.rda’ file.
W. Asquith with digitizing of nomograph contributions by W. Miller
Bos, M.G., 1989, Discharge measurement structures: International Institute for Land Reclamation and Improvement Publication 20, Wageningen, The Netherlands, 401 p. http://content.alterra.wur.nl/Internet/webdocs/ilri-publicaties/publicaties/Pub20/pub20.pdf
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/
# Simple, scalar inputs and results weir.broadcrest(type="BOS", 0.5, b=8, B=11, P=6, L=3.25); # Vector of heads weir.broadcrest(type="BOS", c(0.5,0.4,0.3), b=8, B=11, P=6, L=3.25); # Now compare two solutions by weirbos.broadcrest() to weir3a5.broadcrest() h <- seq(0.01,1.5, by=0.001) Qtank <- weir3a5.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, flowdigits=4) QtankbosA <- weirbos.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, flowdigits=4) QtankbosB <- weirbos.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, hhptest=FALSE, flowdigits=4) plot(Qtank$flow, h, type="l", col=8, lwd=6, xlab="FLOW, CFS", ylab="HEAD, FEET") lines(QtankbosA$flow, h, col=2, lwd=4) # see the trunction in the red line lines(QtankbosB$flow, h, col=3, lwd=2) # See examples for weir3a5.broadcrest() for additional examples that # explore higher complexity of argument settings, which test the # nomographs for k_c, k_R, and k_s
# Simple, scalar inputs and results weir.broadcrest(type="BOS", 0.5, b=8, B=11, P=6, L=3.25); # Vector of heads weir.broadcrest(type="BOS", c(0.5,0.4,0.3), b=8, B=11, P=6, L=3.25); # Now compare two solutions by weirbos.broadcrest() to weir3a5.broadcrest() h <- seq(0.01,1.5, by=0.001) Qtank <- weir3a5.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, flowdigits=4) QtankbosA <- weirbos.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, flowdigits=4) QtankbosB <- weirbos.broadcrest(h, b=7.97, B=10.97, P=1.125, L=3.76, hhptest=FALSE, flowdigits=4) plot(Qtank$flow, h, type="l", col=8, lwd=6, xlab="FLOW, CFS", ylab="HEAD, FEET") lines(QtankbosA$flow, h, col=2, lwd=4) # see the trunction in the red line lines(QtankbosB$flow, h, col=3, lwd=2) # See examples for weir3a5.broadcrest() for additional examples that # explore higher complexity of argument settings, which test the # nomographs for k_c, k_R, and k_s