---
title: "Channel HRU"
output:
bookdown::html_document2:
base_format: rmarkdown::html_vignette
number_sections: false
toc: true
toc_depth: 2
pkgdown:
as_is: true
vignette: >
%\VignetteIndexEntry{Channel HRU}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
The `dynatop` function in the dynamic TOPMODEL R package implements a set of numerical solutions to the
governing equations of the dynamic TOPMODEL hillslope formulation. This
returns the inflow to the channel reaches specified in the model.
This vignette documents the formulation and the numerical solution used to
route these channel inflows, along with other diffuse and point inputs to the
model.
# Notation and nomenclature
Table \@ref(tab:ch-notation} outlines the notation used in this document.
| Quantity type | Symbol | Description | unit |
| ------- | :---: | ----------------------------- | :---: |
| Discharge from a reach at time $t$ | $q\left(t\right)$ | Instantaneous discharge | m$^3$/s |
| Discharge from a reach at time $t$ | $g\left(t\right)$ | Instantaneous discharge | m$^3$/s |
| Diffuse inflow | $d\left(t\right)$ | Instantaneous inflow from diffuse inputs to the channel HRU | m$^3$/s |
| Point inflow | $p\left(t\right)$ | Instantaneous inflow from a point source to the head of the Channel HRU | m$^3$/s |
| Velocity | $v_{ch}$ | Effective velocity of water conveyance within the Channel HRU network | m/s |
Table: (\#tab:ch-notation) Outline of notation for describing the Channel HRU
section of the hillslope HRU
# Inputs to a Channel HRU
A Channel HRU is considered as representing a channel reach of length
$L$. Each Channel HRU has two types of inflow, labelled diffuse
and point. Diffuse inflows are external inputs which occur at a
constant rate over the length of the reach. These include precipitation, the
inflow from Hillslope HRUs and time series specified in the `diffuse_inputs`
table.
Point inflows are considered to occur at the head of the channel reach. These
consist of the inflow from upstream channel HRUs and time series specified in the `point_inputs` table.
# Time Delay Channel Routing
The time delay channel routing is selected by setting the `channel_solver`
value in the model options vector to `histogram`. The method offers a basic representation of the movement of
water in which a constant velocity to assigned to each channel reach.
For the diffuse inputs to a single channel reach of length $L$ the
contribution to the outflow at time $t$ is given by
\[
\frac{1}{L} \int\limits_{l=0}^{L} d\left(t - \frac{l}{v_{ch}}\right) dl
\]
where as for a point input to the same channel the contribution is
\[
p\left(t - \frac{L}{v_{ch}}\right)
\]
such that
\[
q\left(t\right) = \frac{1}{L} \int\limits_{l=0}^{L} d\left(t -
\frac{l}{v_{ch}}\right) dl + p\left(t - \frac{L}{v_{ch}}\right)
\]
Consider next a change of variables by taking $\tau = l/v_{ch}$ and defining
$\tau_{L} = L/v_{ch}$ so that
\[
q\left(t\right) =
\frac{v_{ch}}{L} \int\limits_{\tau=0}^{\tau_{L}} d\left(t - \tau\right) d\tau +
p\left(t - \tau_{L}\right)
\]
Since the action on the point inputs is purely advective the flow at a gauged
location can be written as the summation of the diffuse and external point
inflows to the Channel
HRUs (reaches) above the location. For the $k$th Channel HRU above the gauge let
$\tau_{0}^{\left[k\right]}$ be the advective time delay between water leaving the reach and
arriving at the gauge. This is readily computed from the channel HRU
connectivity, reach lengths and velocities. The gauged flow can thus be
expressed as
\[
g\left(t\right) = \sum_{k}
\frac{v_{ch}^{\left[k\right]}}{L^{\left[k\right]}}
\int\limits_{\tau_{0}^{\left[k\right]}}^{\tau_{0}^{\left[k\right]} + \tau_{L}^{\left[k\right]}} d\left(t -
\tau \right) d\tau +
\hat{p}\left(t - \tau_{0}^{\left[k\right]} - \tau_{L}^{\left[k\right]}\right)
\]
To solve for the gauge flow on a discrete time step $\Delta t$ suppose that
$t = i\Delta t$ and that the flow index by the time subscript is valid over
the preceding time step; for example
\[
d\left(t\right) = d_{i\Delta t} \quad \left(i-1\right)\Delta t \leq t r_{0}$ the intervals are given by
\[
\left(\tau_0,\left(r_{0}+1\right)\Delta t\right),
\left(\left(r_{0}+1\right)\Delta t,\left(r_{0}+2\right)\Delta t\right),
\ldots,
\left(\left(r_{0}+n\right)\Delta t,\tau_{0}+\tau_{L}\right)
\]
For $j=1,\ldots,n-1$ the integral over an interval of $\Delta t$ gives
\[
\int\limits_{\left(r_{0}+j\right)\Delta t}^{\left(r_{0}+j+1\right)\Delta t}
\frac{\left(r_{0}+j+1\right)\Delta t - \tau}{\Delta t}
d_{\left(i-r_{0}-j\right)\Delta t} +
\frac{\tau- \left(r_{0}+j\right) \Delta t}{\Delta t}
d_{\left(i-r_{0}-j-1\right)\Delta t} d\tau \\
= \frac{\Delta t}{2}
\left(\left(r_{0}+j+1\right)-\left(r_{0}+j\right)\right)^2
d_{\left(i-r-j\right)\Delta t} +
\frac{\Delta t}{2}
\left(\left(r_{0}+j+1\right)-\left(r_{0}+j\right)\right)^2
d_{\left(i-r-j-1\right)\Delta t} \\
= \frac{\Delta t}{2} d_{\left(i-r_{0}-j\right)\Delta t} +
\frac{\Delta t}{2} d_{\left(i-r_{0}-j-1\right)\Delta t}
\]
For the initial interval
\[
\int\limits_{\tau_{0}}^{\left(r_{0}+1\right)\Delta t}
\frac{\left(r_{0}+1\right)\Delta t - \tau}{\Delta t}
d_{\left(i-r_{0}\right)\Delta t} +
\frac{\tau- r_{0}\Delta t}{\Delta t}
d_{\left(i-r_{0}-1\right)\Delta t} d\tau \\
= \frac{1}{2\Delta t} \left(\left(r_0+1\right)\Delta t - \tau_{0}\right)^2
d_{\left(i-r_{0}\right)\Delta t} +
\left\{
\frac{1}{2\Delta t} \left(\left(r_0+1\right)\Delta t - \tau_{0}\right)^2 +
\frac{ \left(\tau_{0} - r_{0}\Delta t\right)\left(\left(r_0+1\right)\Delta t -
\tau_{0}\right)}{\Delta t} \right\}
d_{\left(i-r_{0}-1\right)\Delta t}
\]
and the final interval and noting that $r_{0}+n = r_{L}$
\[
\int\limits_{r_{L}\Delta t}^{\tau_0+\tau_L}
\frac{\left(r_{L}+1\right)\Delta t - \tau}{\Delta t}
d_{\left(i-r_{L}\right)\Delta t} +
\frac{\tau- r_{L} \Delta t}{\Delta t}
d_{\left(i-r_{L}-1\right)\Delta t} d\tau \\
=
\left\{
\frac{1}{2\Delta t} \left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2 +
\frac{ \left(\tau_0 + \tau_{L} - r_L\Delta t\right)\left(\left(r_L + 1
\right)\Delta t - \tau_{0} - \tau_L\right)}{\Delta t}
\right\}d_{\left(i-r_{L}\right)\Delta t} +
\frac{1}{2\Delta t} \left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2
d_{\left(i-r_{L}-1\right)\Delta t}
\]
By grouping the terms for the individual inputs together and multiply through
by $v_{ch}/L$ time delay histograms
can be constructed for each HRU draining to the gauge. Table \@ref(tab:table-full) shows the solution for
$r_{L}>r_0+1$ and Table \@ref(tab:table-three) for the case $r_{L}=r_0+1$.
| Delay | Inflow | Weight |
| ---- | ----- | ---- |
| $r=0,\ldots,r_0-1$ | $d_{\left(i-r\right)\Delta t}$ | 0 |
| $r_0$ | $d_{\left(i-r_0\right)\Delta t}$ | $\frac{v_{ch}}{2L\Delta t} \left(\left(r_0+1\right)\Delta t - \tau_{0}\right)^2$ |
| $r_0+1$ | $d_{\left(i-r_0-1\right)\Delta t}$ | $\frac{v_{ch}\Delta t}{2L} + \frac{v_{ch}}{2L\Delta t} \left(\left(r_0+1\right)\Delta t - \tau_{0}\right)^2 + \frac{ v_{ch}\left(\tau_{0} - r_{0}\Delta t\right)\left(\left(r_0+1\right)\Delta t - \tau_{0}\right)}{L\Delta t}$ |
| $r=r_{0}+2,\ldots,r_{L}-1$ | $d_{\left(i-r\right)\Delta t}$ | $\frac{v_{ch}\Delta t}{L}$ |
| $r_{L}$ | $d_{\left(i-r_{L}\right)\Delta t}$ | $\frac{v_{ch}\Delta t}{2L} + \frac{v_{ch}}{2L\Delta t} \left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2 + \frac{ v_{ch}\left(\tau_0 + \tau_{L} - r_L\Delta t\right)\left(\left(r_L + 1 \right)\Delta t - \tau_{0} - \tau_L\right)}{L\Delta t}$ |
| $r_{L}+1$ | $d_{\left(i-r_{L}-1\right)\Delta t}$ | $\frac{v_{ch}}{2L\Delta t} \left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2$|
Table: (\#tab:table-full) Outline of the time delay histogram for the diffuse input in the case $r_{L}>r_0+1$
| Delay | Inflow | Weight |
| ---- | ----- | ---- |
| $r=0,\ldots,r_0-1$ | $d_{\left(i-r\right)\Delta t}$ | 0 |
| $r_0$ | $d_{\left(i-r_0\right)\Delta t}$ | $\frac{v_{ch}}{2L\Delta t} \left(\left(r_0+1\right)\Delta t - \tau_{0}\right)^2$ |
| $r_0+1 = r_{L}$ | $d_{\left(i-r_0-1\right)\Delta t}$ | \[\frac{v_{ch}}{2L\Delta t}\left(\left(r_0+1\right)\Delta t -
\tau_{0}\right)^2
+
\frac{v_{ch}\left(\tau_{0} - r_{0}\Delta
t\right)\left(\left(r_0+1\right)\Delta t- \tau_{0}\right)}{L\Delta t}
+\\
\frac{v_{ch}}{L\Delta t}\left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2
+
\frac{
v_{ch}\left(\tau_0 + \tau_{L} - r_L\Delta t\right)\left(\left(r_L + 1
\right)\Delta t - \tau_{0} - \tau_L\right)}{L\Delta t}\] |
| $r_{L}+1$ | $d_{\left(i-r_{L}-1\right)\Delta t}$ | $\frac{v_{ch}}{2L\Delta t} \left(\tau_0 + \tau_{L} - r_L\Delta t\right)^2$ |
Table: (\#tab:table-three) Outline of the time delay histogram for the diffuse input in the case $r_{L}=r_0+1$
The final case to consider is $r_{0} = r_{L}$. In this case there is a single
integral to evaluate:
\[
\int\limits_{\tau_{0}}^{\tau_{0}+\tau_{L}}
\frac{\left(r_{0}+1\right)\Delta t - \tau}{\Delta t}
d_{\left(i-r_{0}\right)\Delta t} +
\frac{\tau- r_{0} \Delta t}{\Delta t}
d_{\left(i-r_{0}-1\right)\Delta t} d\tau \\
= \frac{\tau_{L}}{\Delta t}
\left(\left(r_{0}+1\right)\Delta t - \tau_{0} - \tau_{L}/2 \right)
d_{\left(i-r_{0}\right)\Delta t} +
\frac{\tau_{L}}{\Delta t}
\left(\tau_{)} + \tau_{L}/2 - r_{0}\Delta t\right)
d_{\left(i-r_{0}-1\right)\Delta t}
\]
## Examples
In this section some example histograms are generated based upon the length,
velocity and $\tau_0$ of the Channel HRU along with the time step $\Delta t$.
### Point input
First a function for defining the histogram for a point inflow can be coded
as follows:
```{r}
## L is length of channel
## vch is channel velocity
## Dt is the time step
## tau0 is the time delay between the gauge and foot of the reach
fp <- function(L,vch,Dt,tau0){
tauL <- L/vch
rL <- floor((tau0+tauL)/Dt)
irL <- rL+1 ## index in vector since R starts at 1 not zero
b <- rep(0,irL+1)
b[irL] <- ((rL+1)*Dt - tau0-tauL)/Dt
b[irL+1] <- (tau0+tauL - rL*Dt)/Dt
return(b)
}
```
For the first example all the input should occur with one time step delay
(second element in output vector) since $L/v_ch$ exactly matches the time step
and $\tau_{0}=0$
```{r}
fp(L=100,vch=0.5,Dt=200,tau0=0)
```
In this example $\tau_{0}+L/v_ch = \frac{7}{2}\Delta t$; so the first non zero
value of the vector should be the 4th element with the 4th and 5th
elements being equal.
```{r}
fp(L=100,vch=1,Dt=200,tau0=600)
```
This build upon the above example, altering the velocity such that the only
non-zero elements are the 4th and 5th, but with the 4th being larger then the 5th.
```{r}
fp(L=100,vch=1.5,Dt=200,tau0=600)
```
### Diffuse inflow
The function for the diffuse inflow is more complex since the special cases
have to be handled:
```{r}
fd <- function(L,vch,Dt,tau0){
tauL <- L/vch
r0 <- floor(tau0/Dt)
ir0 <- r0+1 ## index in vector since R starts at 1 not zero
rL <- floor((tau0+tauL)/Dt)
irL <- rL+1 ## index in vector since R starts at 1 not zero
b <- rep(0,irL+1)
if(rL>r0){
b[ir0:(irL-1)] <- Dt # inital values valid unless over written
b[ir0] <- ( ((r0+1)*Dt - tau0)^2 ) / (2*Dt)
b[ir0+1] <- b[ir0] + ( ((r0+1)*Dt - tau0)*(tau0 - (r0*Dt)) ) / Dt
b[irL+1] <- ( (tau0+tauL - (rL*Dt))^2 ) / (2*Dt)
b[irL] <- b[irL] + b[irL+1] + ( ((tau0+tauL - (rL*Dt))*((rL+1)*Dt - tau0-tauL)) / Dt ) ## added to self since rL could equal r0+1
if( rL > (r0+1) ){
b[ir0+1] <- b[ir0+1] + Dt/2
b[irL] <- b[irL] + Dt/2
}
}else{
b[ir0] <- (tauL/Dt)*( (r0+1)*Dt - tau0 - (tauL/2) )
b[ir0+1] <- (tauL/Dt)*(tau0 + (tauL/2) - r0*Dt )
}
return(b*vch/L)
}
```
In the first example there is no advective time delay and
$L/v_{ch} = \Delta t$. This results in time delay histogram in which the
first two values equal 0.5. This is an example of the case $r_{L}=r_{0}+1$
```{r}
b <- fd(L=200,vch=1,Dt=200,tau0=0)
sum(b)
barplot(b)
```
Extending the previous example the velocity now altered to that
$r_{L}=r_{0}$. The resulting non-negative histogram values are now the first
two in the vector.
```{r}
b <- fd(L=200,vch=1.5,Dt=200,tau0=0)
sum(b)
barplot(b)
```
In contrast decreasing the channel velocity produces a more delayed
histogram. In this case $r_{L}>r_{0}+1$.
```{r}
b <- fd(L=200,vch=0.5,Dt=200,tau0=0)
sum(b)
barplot(b)
```
Finally we look at two cases where $\tau_0$ is positive; being either a
direct multiple of the time step
```{r}
b <- fd(L=600,vch=1,Dt=200,tau0=800)
sum(b)
barplot(b)
```
or not
```{r}
b <- fd(L=600,vch=1,Dt=200,tau0=850)
sum(b)
barplot(b)
```