Introduction

This page provides a guide for the use of GIFT for conducting instream flow assessments. Generally, the intent of instream flow assessments is to quantify available fish habitat at different flow levels using a metric called weighted usable area (WUA). The results of instream flow assessments are often used to support water allocation and management decisions.

There are two main components for determining the WUA of a stream: (1) hydraulic data to characterize the depth and velocity characteristics of the stream, and (2) a biological model that describe the relevant species’ preference for those hydraulic characteristics, known as habitat suitability curves (HSCs). Observations that characterize the substrate and cover characteristics and the associated fish preferences may also be used to calculate WUA.

Instream flow assessments using conventional methods are time consuming and expensive to implement and they only represent static channel conditions that represent a snapshot in time. GIFT has been designed to address these limitations by improving the hydraulic components of instream flow assessments. It can be implemented using minimal field data, and requires significantly less data processing and computing time compared to conventional methods. In addition, GIFT can be implemented alongside geomorphic regime models to evaluate dynamic channel conditions and fish habitat.

GIFT has two distinct components:

  1. A reach-averaged hydraulic simulation approach
  2. statistical distributions of depths and velocity that are used to calculate WUA

This guidance is focused on the implementation of the hydraulic simulator and statistical distribution components of GIFT. Readers who are interested in the theoretical underpinnings of the this approach are referred to Gronsdahl et al. (2021) for an evaluation of GIFT in eight streams located in western Canada. In addition, McParland et al. (2016) for information on the hydraulic simulator, Saraeva and Hardy (2009) and Schweizer et al. (2007) for information on the statistical distributions, and Eaton et al. (2004) for information on a geomorphic regime model that can easily be implemented alongside GIFT. Please check out the References tab for more links to these studies.


Model Overview

The hydraulic data necessary to execute GIFT can be collected during one field visit that does not have to coincide with specific flow conditions. To calculate WUA, users must define their own HSCs. GIFT produces distributions of channel hydraulics at the reach scale. Currently, GIFT is unable to model the habitat conditions of individual channel units, such as pools or riffles.

The hydraulic simulation component of GIFT uses a reach-averaged channel cross section of bankfull geometry. Using the input data, an index of bankfull channel shape (b) is calculated that ranges from 0 (rectangular channel) to 1 (highly skewed channel). To simulate the hydraulics of flows below bankfull, the model iteratively drops the water level until the point of zero discharge. For each modelled water level, mean velocity and depth is calculated.

Following the prediction of reach-averaged hydraulics, the next step is to apply statistical frequency distributions to represent reach-averaged variability. The resultant depth and velocity distributions can then be paired with user-specified habitat suitability curves to determine WUA.

The third component of GIFT is the application of the UBC Regime Model (UBCRM). This model can be used to evaluate how environmental pertubations, such as climate and land-use change, are likely to affect bankfull parameters. The predicted channel geometry can then be used with the hydraulic simulator and the statistical frequency distributions to estimate the subsequent changes to fish habitat due to various environmental perturbations (i.e. ‘what-if’ scenarios). The UBCRM may also be used to estimate input parameters if field observations are limited.


Applying GIFT


Field Considerations

There are many ways GIFT could be implemented. Field programs should be designed around project objectives. This section is intended to provide considerations for designing a field program, it is not a step-by-step guide for collecting field data.

When planning a field trip to collect data to run GIFT, it is necessary to identify the study reach. Then, channel geometry can be characterized by collecting survey data along a series of transects. The location and the appropriate number of transects are dependent on factors such as desired accuracy, access, and time. Ideally, surveys of at least 10 channel cross sections would be conducted that demarcate the top of bank, bottom of bank, edge of vegetation, indicators of bankfull elevation, the water’s edge at the time of survey, and the thalweg location. Accurate measurements of channel gradient are also necessary. The data that are collected should be sufficient to faithfully reproduce the general cross-sectional shape of the study reach, but there is little to be gained by conducting a hyper-detailed survey of cross-sectional topography.

A robust approach is to identify cross sections randomly within the reach, but that is not always practical. Another option is to characterize the study reach by channel units (mesohabitats), and then identify transects within those classifications using a stratified random approach. When collecting cross sections, be sure to note the estimated bankfull elevations on either side of the channel.

Another key data requirement to execute GIFT is a representative grain size distribution, which is used to evaluate channel roughness and estimate velocity. This can be conducted using a Wolman pebble count, analysis of photographs, or visual estimation. Because the field work does not need to coincide with any particular flow, these data are most easily collected during open-water, low flow conditions. Coordinating a field visit during low flows would also likely coincide with the safest conditions for wading.


Data Requirements

The input parameters for GIFT are as follows:

  • Channel gradient, \(S\) (m/m). This field is mandatory.
  • Bankfull width, \(W_b\) (m). This field is mandatory.
  • Mean bankfull depth, \(d_b\) (m). This field is mandatory.
  • Maximum bankfull depth, \(d_{max}\) (m). This field is optional.
  • 84th percentile grain size, \(D_{84}\) (mm) (the grain size of which 84% of the bed is finer).
  • Habitat Suitability Curves. These are required to calculate WUA. Further information regarding the format that these curves should be in is included in the description of the Habitat function, below.
  • Bankfull discharge, \(Q_{bf}\), is recommended, but is not required to run the hydraulic simulator. However, \(Q_{bf}\) can be used to check that the bankfull dimensions generated by the model reflect empirical measurements. \(Q_{bf}\) is necessary to run UBCRM.

The channel dimensions are used to generate an index of channel shape, b. If only db is provided, then b is calculated as follows: \[b = (W_b / d_b)\] If \(d_{max}\) is provided, then b is calculated as follows: \[b = 1 - (d_b/d_{max})\] Alternatively, the R function allows the user to specify b, directly over-riding these functions.


Using the App

One option for evaluating the hydraulic simulator and statistical distribution components of GIFT is to use the interactive App. Input data can be interactively entered and reach-averaged hydraulics and WUA outputs can be visualized and downloaded.


Using the R Package

For users familiar with R, GIFT is available as a package from GitHub. The below code snippet uses the ‘devtools’ package to install the package. Currently, there are two functions in the package, one to execute the hydraulic simulator and another to execute the statistical distributions and calculate WUA. The below code should be un-commented (hash-tags at the start of each line removed) out where necessary to install the package for the first time.

# Note: the package requires that dplyr and zoo packages installed.
# install.packages(dplyr)
# install.packages(zoo)
library(dplyr)
library(zoo)


## install and load devtools to install GIFT from GitHub
# install.packages(devtools)
# library(devtools)

## install and load package
# install_github("SGronsdahl/GIFT")
 library(GIFT)


Executing the Hydraulic Simulator

The first function in GIFT package is the ‘AvgHydraulics’ function that executes the hydraulic simulator and produces a data frame of outputs. The below code snippet provides an example of how to run the model. The following code snippets showcase the execution of the AvgHydraulics function. In this scenario, \(d_{max}\) is not specified, so the function assumes \(b = (W_b / d_b)\)

hydraulics = AvgHydraulics(S = 0.01, wb = 10, db = 0.5, D84 = 100)
head(hydraulics)
##       Q         Ai       Wi         di         Ui
## 1 0.001 0.04809630 2.469268 0.01947684 0.02078792
## 2 0.002 0.07151588 3.010765 0.02375331 0.02796553
## 3 0.003 0.09024328 3.381748 0.02668452 0.03324022
## 4 0.004 0.10648644 3.673706 0.02898549 0.03756106
## 5 0.005 0.12094234 3.914475 0.03089580 0.04134046
## 6 0.006 0.13439002 4.127162 0.03256184 0.04464409


The cumulative depth distribution is generated by this analysis is as follows:


Here, the \(d_{max}\) term is specified within the AvgHydraulics function call, so the function assumes \(b = 1 - (d_b/d_{max})\)

hydraulics = AvgHydraulics(S = 0.01, wb = 10, db = 0.5, db_max = 0.75, D84 = 100)
head(hydraulics)
##       Q         Ai       Wi         di         Ui
## 1 0.001 0.03354854 1.330329 0.02521728 0.02980415
## 2 0.002 0.05007830 1.626481 0.03078886 0.03993549
## 3 0.003 0.06321439 1.827366 0.03459238 0.04745422
## 4 0.004 0.07463971 1.985960 0.03758297 0.05358751
## 5 0.005 0.08468275 2.114073 0.04005611 0.05904123
## 6 0.006 0.09419307 2.230608 0.04222676 0.06369544


The cumulative depth distribution is generated by this analysis is as follows:


Users may also specify a b-value, thereby over-riding either formula.

hydraulics = AvgHydraulics(S = 0.01, wb = 10, db = 0.5, db_max = 0.75, D84 = 100, b_value = 0.2)


This function outputs a figure of the cumulative depth distribution and a .csv file of the simluated reach-averaged hydraulics. This feature may be turned off by specifying xs_ouput = FALSE, like so:

hydraulics = AvgHydraulics(S = 0.01, wb = 10, db = 0.5, db_max = 0.75, D84 = 100, xs_output = FALSE)


Execute the Habitat Function

The Habitat function applies statistical frequency distribution to the mean depths and velocities that are output by the hydraulic simulator function. These disitributions are then paired with user-specified habitat suitability curves to generate reach-averaged depth and velocity suitabilities. To estimate the WUA of the stream reach, these suitabilities are multiplied with the modelled stream width to develop a WUA value in m2 / m.

The input parameters for the Habitat function are as follows:

  • hydraulics, a data frame of outputs generated by the AvgHydraulics function. This field is mandatory.
  • d_curve, depth suitability curve. This should be a dataframe with two columns: ‘depth’ (m) and ‘suit’ (dimensionless suitability from 0-1). This field is mandatory.
  • v_curve, velocity suitability curve. This should be a dataframe with two columns: ‘velocity’ (m/s) and ‘suit’ (dimensionless suitability from 0-1). This field is mandatory.
  • s_curve, substrate suitability curve. This is a dataframe of substrate suitabilities with three columns: ‘lower’ (mm) and ‘upper’ (mm) of grain size classes and ‘suit’ (dimensionless suitability from 0-1). This field is optional.
  • gsd, vector of grain size distribution (mm). This field is optional.

Here are some example input data used for the subsequent examples. We will use rainbow trout parr suitability curves generated by Ron Ptolemy, Instream Flow Specialist, B.C. Ministry of Environment.

d_curve = read.csv("depth_suit_ptolemy.csv")%>% filter(species == "rainbow" & life_stage == "parr")
v_curve = read.csv("velocity_suit_ptolemy.csv")%>% filter(species == "rainbow" & life_stage == "parr")
s_curve = read.csv("substrate_suit_ptolemy.csv")%>% filter(species == "rainbow" & life_stage == "parr")


The grain size distribution should be specified as a vector of numerical observations, such as the observations of a Wolman Pebble Count. For illustration purposes only, we will use a simulated disribution will be generated:

gsd = rnorm(100, mean = 75, sd = 25)


And to refresh our memory, here is what the hydraulics data looks like that we generated earlier.

head(hydraulics)
##       Q         Ai       Wi         di         Ui
## 1 0.001 0.03354854 1.330329 0.02521728 0.02980415
## 2 0.002 0.05007830 1.626481 0.03078886 0.03993549
## 3 0.003 0.06321439 1.827366 0.03459238 0.04745422
## 4 0.004 0.07463971 1.985960 0.03758297 0.05358751
## 5 0.005 0.08468275 2.114073 0.04005611 0.05904123
## 6 0.006 0.09419307 2.230608 0.04222676 0.06369544


Here is an example of the execution of the Habitat function using just depth and velocity.

habitat = Habitat(hydraulics = hydraulics, d_curve = d_curve, v_curve = v_curve,)
head(habitat)
##       Q     d.suit    v.suit s.suit        w        WUA
## 1 0.001 0.07580115 0.1293719      1 1.330329 0.01304593
## 2 0.002 0.10185502 0.1765005      1 1.626481 0.02923999
## 3 0.003 0.11985860 0.2084220      1 1.827366 0.04564974
## 4 0.004 0.13483312 0.2351875      1 1.985960 0.06297691
## 5 0.005 0.14586234 0.2566764      1 2.114073 0.07914966
## 6 0.006 0.15651724 0.2779703      1 2.230608 0.09704739


It is also possible to define the grain size distribution and substrate suitability curves to include a reach-averaged substrate suitability. Both grain size distribution and substrate suitability curve must be specified to generate a substrate suitability value for the reach.

habitat = Habitat(hydraulics = hydraulics, d_curve = d_curve, 
                  v_curve = v_curve, s_curve = s_curve, gsd = gsd)
head(habitat)
##       Q     d.suit    v.suit s.suit        w         WUA
## 1 0.001 0.07580115 0.1293719  0.571 1.330329 0.007449224
## 2 0.002 0.10185502 0.1765005  0.571 1.626481 0.016696036
## 3 0.003 0.11985860 0.2084220  0.571 1.827366 0.026066001
## 4 0.004 0.13483312 0.2351875  0.571 1.985960 0.035959816
## 5 0.005 0.14586234 0.2566764  0.571 2.114073 0.045194453
## 6 0.006 0.15651724 0.2779703  0.571 2.230608 0.055414060


The Habitat function outputs a streamflow - habitat curve to the working directory as well. This functionality can be overridden if ‘wua_output = FALSE’ is specified.