This script was created to document the changes seen at LD25 with various gate settings during the following flow events to document deviation request during construction of new features at Lock & Dam 25:
library(dplyr)
library(sf)
library(fs)
library(ggplot2)
library(raster)
library(viridis)
library(broom)
library(purrr)
library(tools)
library(terra)
library(stars)
library(contourPlot)
library(akima)
library(plotly)
library(sp)
library(tidyterra)
library(plotly)
library(ggmap)
library(lattice)
library(rasterVis)
# Desired shapefiles that will be in plots
lock <- st_read("F:/LD25/Gate Manipulation/Lock Shapefile/Lock_Layout_New.shp")
dike <- st_read("F:/LD25/Gate Manipulation/Lock Shapefile/Dike_Centerline.shp")
Bank <- st_read("F:/LD25/Gate Manipulation/Lock Shapefile/River_Bank.shp")
island <- st_read("F:/LD25/Gate Manipulation/Lock Shapefile/Islands.shp")
river_mile <- st_read("F:/LD25/Gate Manipulation/Lock Shapefile/river_mile.shp")
# State Plane Missouri East NAD83 (Meters)
state <- CRS("+proj=tmerc +lat_0=35.8333333333333 +lon_0=-90.5 +k=0.999933333 +
x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs")
# Standard Geographical lat/lon
wgs84_proj <- CRS("+init=epsg:4326")
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Transform To State Plane~~~~~~~~~~~~~~~~~~~~~~
lock_transform <- st_transform(lock, state)
dike_transform <- st_transform(dike, state)
bank_transform <- st_transform(Bank, state)
island_transform <- st_transform(island, state)
river_mile_transform <- st_transform(river_mile, state)
# Assign 3dm with base mesh
Base_Mesh <- "F:/LD25/Gate Manipulation/WSE Comparison/Base_165_Normal.3dm"
RockCut_Mesh <- "F:/LD25/Gate Manipulation/WSE Comparison/RockCut_165_Normal.3dm"
# Extract the file name
Base_Mesh_Name <- basename(Base_Mesh)
RockCut_Mesh_Name <- basename(RockCut_Mesh)
# remove file extension
Base_Mesh_Name <- stringr::str_remove(Base_Mesh_Name, ".3dm")
RockCut_Mesh_Name <- stringr::str_remove(RockCut_Mesh_Name, ".3dm")
#file names that are being processed as base .3dm scenario
print(Base_Mesh)
print(RockCut_Mesh)
################################################################################
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~Rip out text lines in .3dm~~~~~~~~~~~~~~~~~~~~~~~~#
################################################################################
# Read the .3dm file
Base_Mesh <- readLines(Base_Mesh)
RockCut_Mesh <- readLines(RockCut_Mesh)
a=grep("ND", Base_Mesh)-1 # line number where Physics starts
b=grep("ND", RockCut_Mesh)-1 # line number where Physics starts
a_dat <- Base_Mesh[-(1:a[1])] # delete all the lines before Physics
b_dat <- RockCut_Mesh[-(1:b[1])] # delete all the lines before Physics
Base_Mesh_Nodes <- read.table(text = a_dat) #break out into columns
RockCut_Mesh_Nodes <- read.table(text = b_dat) #break out into columns
# add column names to table
colnames(Base_Mesh_Nodes) = c("ND", "Node ID", "X", "Y", "Nodal Elevation (Z) - Meters")
colnames(RockCut_Mesh_Nodes) = c("ND", "Node ID", "X", "Y", "Nodal Elevation (Z) - Meters")
X <- data.frame(length(Base_Mesh_Nodes))
Y <- data.frame(length(Base_Mesh_Nodes))
# Save out X & Y dataframes for later in the process of plotting.
X <- Base_Mesh_Nodes$X
Y <- Base_Mesh_Nodes$Y
################################################################################
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Interested Mesh Nodes ~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################################################
tail_25 <- 173842
pool_25 <- 115615
rm_242 <- 72471
rm_243 <- 29355
rm_244 <- 23132
rm_245 <- 31990
rm_246 <- 17122
rm_247 <- 5221
rm_248 <- 2980
rm_249 <- 2569
rm_250 <- 6269
# read in base condition dep files for base meshes and make WSE table to use
Base_165kcfs_Dep <- readLines("F:/LD25/Gate Manipulation/165kcfs/NormalOperation/Base/Base_165_Normal_dep.dat")
TS <- grep("TS",Base_165kcfs_Dep)
TS[length(TS)] # returns the row number for last timestep import
Base_165kcfs_Dep <- Base_165kcfs_Dep[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
Base_165kcfs_Dep <- head(Base_165kcfs_Dep, -1) # delete last row in file that has the word "ENDDS"
temp <- read.table(text = Base_165kcfs_Dep) # create table to reference indexed depth values in model
Base_165kcfs_WSE <- temp + Base_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
Base_165kcfs_WSE <- Base_165kcfs_WSE * 3.28084 # convert to WSE (feet)
RockCut_165kcfs_Dep <- readLines("F:/LD25/Gate Manipulation/165kcfs/NormalOperation/RockCut/RockCut_165_Normal_dep.dat")
TS <- grep("TS",RockCut_165kcfs_Dep)
TS[length(TS)] # returns the row number for last timestep import
RockCut_165kcfs_Dep <- RockCut_165kcfs_Dep[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
RockCut_165kcfs_Dep <- head(RockCut_165kcfs_Dep, -1) # delete last row in file that has the word "ENDDS"
temp <- read.table(text = RockCut_165kcfs_Dep) # create table to reference indexed depth values in model
RockCut_165kcfs_WSE <- temp + RockCut_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
RockCut_165kcfs_WSE <- RockCut_165kcfs_WSE * 3.28084 # convert to WSE (feet)
root_directory <- "F:/LD25/Gate Manipulation" # Folder that contains all model runs
destination_dir <- "F:/LD25/Gate Manipulation/WSE Comparison/Dep_Files" # Folder I want data copied to
search_string <- "dep.dat" # string that I'm searching for in file name
# Delete files currently in the directory and ready it for new files
delete_files <- list.files(destination_dir)
#print(delete_files)
file.remove(delete_files)
if (!file.exists(destination_dir)) {
# If folder doesn't exist, create it
dir_create(destination_dir, recursive = TRUE)
} else{
#If folder exists, do nothing
message("Folder already exists, no action taken")
}
# Search files that have string _dep.dat in it and save to destination_directory
files <- list.files(root_directory, pattern = "_dep.dat", recursive = TRUE, full.names = TRUE)
file.copy(files, file.path(destination_dir, basename(files)))
files <- list.files(destination_dir)
#print(files)
# files have illegal characters in them and some need to be replaced
# remove file extension
temp <- stringr::str_remove(files, ".dat")
#print(temp)
#remove hyphens from files and replace with underscore
temp_clean <- gsub("-", "_", temp)
#print(temp_clean)
# return new file name
temp_final_name <- paste0(temp_clean, ".dat")
#print(temp_final_name)
files <- paste0(destination_dir, "/", files)
temp_final_name <- paste0(destination_dir, "/", temp_final_name)
file.rename(files, temp_final_name)
test <- list.files(destination_dir)
#print(test)
# files have illegal characters in them and some need to be replaced
# remove file extension
temp <- stringr::str_remove(test, ".dat")
#print(test)
#remove hyphens from files and replace with underscore
temp_clean <- gsub("OR", "Normal", test)
#print(temp_clean)
#files <- paste0(destination_dir, "/", files)
temp_final_name <- paste0(destination_dir, "/", temp_clean)
file.rename(files, temp_final_name)
test <- list.files(destination_dir)
#print(test)
# Sort files based on either Base or RockCut along with discharge
Base_Files <- list()
Base_100kcfs_Files <- list.files(destination_dir, pattern = "Base.*100", recursive = TRUE, full.names = TRUE)
Base_165kcfs_Files <- list.files(destination_dir, pattern = "Base.*165", recursive = TRUE, full.names = TRUE)
Base_177kcfs_Files <- list.files(destination_dir, pattern = "Base.*177", recursive = TRUE, full.names = TRUE)
Base_200kcfs_Files <- list.files(destination_dir, pattern = "Base.*200", recursive = TRUE, full.names = TRUE)
Base_225kcfs_Files <- list.files(destination_dir, pattern = "Base.*225", recursive = TRUE, full.names = TRUE)
Base_250kcfs_Files <- list.files(destination_dir, pattern = "Base.*250", recursive = TRUE, full.names = TRUE)
Base_269kcfs_Files <- list.files(destination_dir, pattern = "Base.*269", recursive = TRUE, full.names = TRUE)
Base_294kcfs_Files <- list.files(destination_dir, pattern = "Base.*294", recursive = TRUE, full.names = TRUE)
Base_NormalOperating_Files <- list.files(destination_dir, pattern = "Base.*Normal", recursive = TRUE, full.names = TRUE)
Rock_Files <- list()
Rock_100kcfs_Files <- list.files(destination_dir, pattern = "Rock.*100", recursive = TRUE, full.names = TRUE)
Rock_165kcfs_Files <- list.files(destination_dir, pattern = "Rock.*165", recursive = TRUE, full.names = TRUE)
Rock_177kcfs_Files <- list.files(destination_dir, pattern = "Rock.*177", recursive = TRUE, full.names = TRUE)
Rock_200kcfs_Files <- list.files(destination_dir, pattern = "Rock.*200", recursive = TRUE, full.names = TRUE)
Rock_225kcfs_Files <- list.files(destination_dir, pattern = "Rock.*225", recursive = TRUE, full.names = TRUE)
Rock_250kcfs_Files <- list.files(destination_dir, pattern = "Rock.*250", recursive = TRUE, full.names = TRUE)
Rock_269kcfs_Files <- list.files(destination_dir, pattern = "Rock.*269", recursive = TRUE, full.names = TRUE)
Rock_294kcfs_Files <- list.files(destination_dir, pattern = "Rock.*294", recursive = TRUE, full.names = TRUE)
Rock_NormalOperating_Files <- list.files(destination_dir, pattern = "Rock.*Normal", recursive = TRUE, full.names = TRUE)
################################################################################
#~~~~~~~~~~~~~~~~~~~~~~~~Read in Normal Operating Flows To Compare Against~~~~~~
################################################################################
for (i in 1:length(Base_NormalOperating_Files)) {
temp <- readLines(Base_NormalOperating_Files[i])
TS <- grep("TS",temp) #use grep to look for "TS" in the document
TS[length(TS)] # returns the row number for last timestep import
temp <- temp[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
temp <- head(temp, -1) # delete last row in file that has the word "ENDDS"
temp_dep <- read.table(text = temp) # create table to reference indexed depth values in model
temp_dep <- mutate_all(temp_dep, function(x) ifelse(x < 0, NA, x)) # remove all negative values and replace with zero
temp <- temp_dep + Base_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
temp <- temp * 3.28084 # convert to WSE (feet)
fileName <- basename(Base_NormalOperating_Files[i]) #return file basename
fileName <- stringr::str_remove(fileName, ".dat") #remove .dat from file basename
fileName <- paste0(fileName, "_Base_WSE") #add _BASE_WSE to filename
assign (fileName, temp, envir=.GlobalEnv) # assign the results of file to the data name
}
for (i in 1:length(Rock_NormalOperating_Files)) {
temp <- readLines(Rock_NormalOperating_Files[i])
TS <- grep("TS",temp) #use grep to look for "TS" in the document
TS[length(TS)] # returns the row number for last timestep import
temp <- temp[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
temp <- head(temp, -1) # delete last row in file that has the word "ENDDS"
temp_dep <- read.table(text = temp) # create table to reference indexed depth values in model
temp_dep <- mutate_all(temp_dep, function(x) ifelse(x < 0, NA, x)) # remove all negative values and replace with zero
temp <- temp_dep + RockCut_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
temp <- temp * 3.28084 # convert to WSE (feet)
fileName <- basename(Rock_NormalOperating_Files[i]) #return file basename
fileName <- stringr::str_remove(fileName, ".dat") #remove .dat from file basename
fileName <- paste0(fileName, "_Base_WSE") #add _BASE_WSE to filename
assign (fileName, temp, envir=.GlobalEnv) # assign the results of file to the data name
}
################################################################################
#~~~~~~~~~~~~~~~~~~~~~~~~Read in 100kcfs and process results~~~~~~~~~~~~~~~~~~~~
################################################################################
Base_100kcfs_WSE <- data.frame(length(Base_100kcfs_Files))
Base_100kcfs_Diff <- data.frame(length(Base_100kcfs_Files))
Base_100kcfs_RiverMiles <- matrix(1:6, ncol = 11)
Base_100kcfs_RiverMiles <- as.data.frame(Base_100kcfs_RiverMiles)
Base_100kcfs_RiverMiles_diff <- matrix(1:6, ncol = 11)
Base_100kcfs_RiverMiles_diff <- as.data.frame(Base_100kcfs_RiverMiles_diff)
rm <- c(241.7, 241.8, 242, 243, 244, 245, 246, 247, 248, 249, 250)
indices <- c(tail_25, pool_25, rm_242, rm_243, rm_244, rm_245, rm_246, rm_247, rm_248, rm_249, rm_250)
for (i in 1:length(Base_100kcfs_Files)) {
temp <- readLines(Base_100kcfs_Files[i])
TS <- grep("TS",temp)
TS[length(TS)] # returns the row number for last timestep import
temp <- temp[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
temp <- head(temp, -1) # delete last row in file that has the word "ENDDS"
temp_dep <- read.table(text = temp) # create table to reference indexed depth values in model
temp_dep <- mutate_all(temp_dep, function(x) ifelse(x < 0, NA, x)) # remove all negative values and replace with zero
temp <- temp_dep + Base_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
temp_wse <- temp * 3.28084 # convert to WSE (feet)
temp_wse_1 <- temp_wse
temp_diff <- temp_wse_1 - Base_100_Normal_dep_Base_WSE #Difference in WSE between base and alternative
row_wse <- c(temp_wse[tail_25,], temp_wse[pool_25,], temp_wse[rm_242,], temp_wse[rm_243,],
temp_wse[rm_244,], temp_wse[rm_245,], temp_wse[rm_246,], temp_wse[rm_247,], temp_wse[rm_248,],
temp_wse[rm_249,], temp_wse[rm_250,])
row_diff <- c(temp_diff[tail_25,], temp_diff[pool_25,], temp_diff[rm_242,], temp_diff[rm_243,],
temp_diff[rm_244,], temp_diff[rm_245,], temp_diff[rm_246,], temp_diff[rm_247,], temp_diff[rm_248,],
temp_diff[rm_249,], temp_diff[rm_250,])
Base_100kcfs_RiverMiles <- cbind(Base_100kcfs_RiverMiles, row_wse)
Base_100kcfs_RiverMiles_diff <- cbind(Base_100kcfs_RiverMiles_diff, row_diff)
}
row_names <- c("LD25 Tailwater WSE", "LD25 Pool WSE", "RM 242 WSE", "RM 243 WSE",
"RM 244 WSE", "RM 245 WSE", "RM 246 WSE", "RM 247 WSE", "RM 248 WSE",
"RM 249 WSE", "RM 250 WSE")
column_names <- basename(Base_100kcfs_Files)
column_names <- stringr::str_remove(column_names,"_dep.dat")
Base_100kcfs_RiverMiles <- Base_100kcfs_RiverMiles[,c(12,13,14,15,16,17)]
Base_100kcfs_RiverMiles_diff <- Base_100kcfs_RiverMiles_diff[,c(12,13,14,15,16,17)]
colnames(Base_100kcfs_RiverMiles) <- c(column_names)
colnames(Base_100kcfs_RiverMiles_diff) <- c(column_names)
rm <- as.data.frame(rm)
colnames(rm) <- c("RiverMiles")
Base_100kcfs_RiverMiles <- cbind(Base_100kcfs_RiverMiles,rm)
Base_100kcfs_RiverMiles_diff <- cbind(Base_100kcfs_RiverMiles_diff, rm)
row.names(Base_100kcfs_RiverMiles) <- c(row_names)
row.names(Base_100kcfs_RiverMiles_diff) <- c(row_names)
save(Base_100kcfs_RiverMiles, file = "F:\\LD25\\Gate Manipulation\\WSE Comparison\\Processed_Data\\Base_100kcfs_RiverMiles.RData")
save(Base_100kcfs_RiverMiles_diff, file = "F:\\LD25\\Gate Manipulation\\WSE Comparison\\Processed_Data\\Base_100kcfs_RiverMiles_diff.RData")
#save(LD25_Rating_Curve, file = "F:\\LD25\\Gate Manipulation\\WSE Comparison\\Processed_Data\\LD25_Rating_Curve.RData")
################################################################################
#~~~~~~~~~~~~~~~~~~~~~~~~Process Rock Cut Results~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################################################
Rock_100kcfs_WSE <- data.frame(length(Rock_100kcfs_Files)) # create new data frame
Rock_100kcfs_Diff <- data.frame(length(Rock_100kcfs_Files))
Rock_100kcfs_RiverMiles <- matrix(1:6, ncol = 11)
Rock_100kcfs_RiverMiles <- as.data.frame(Rock_100kcfs_RiverMiles)
Rock_100kcfs_RiverMiles_diff <- matrix(1:6, ncol = 11)
Rock_100kcfs_RiverMiles_diff <- as.data.frame(Rock_100kcfs_RiverMiles_diff)
for (i in 1:length(Rock_100kcfs_Files)) {
temp <- readLines(Rock_100kcfs_Files[i])
TS <- grep("TS",temp)
TS[length(TS)] # returns the row number for last timestep import
temp <- temp[-(1:TS[length(TS)])] # delete all data before the last time step in the dat file
temp <- head(temp, -1) # delete last row in file that has the word "ENDDS"
temp_dep <- read.table(text = temp) # create table to reference indexed depth values in model
temp_dep <- mutate_all(temp_dep, function(x) ifelse(x < 0, NA, x)) # remove all negative values and replace with zero
temp <- temp_dep + RockCut_Mesh_Nodes$`Nodal Elevation (Z) - Meters` # add nodal elevation & depth to get WSE
temp_wse <- temp * 3.28084 # convert to WSE (feet)
temp_wse_1 <- temp_wse
temp_diff <- temp_wse_1 - RockCut_100_Normal_dep_Base_WSE #Difference in WSE between base and alternative
row_wse <- c(temp_wse[tail_25,], temp_wse[pool_25,], temp_wse[rm_242,], temp_wse[rm_243,],
temp_wse[rm_244,], temp_wse[rm_245,], temp_wse[rm_246,], temp_wse[rm_247,], temp_wse[rm_248,],
temp_wse[rm_249,], temp_wse[rm_250,])
row_diff <- c(temp_diff[tail_25,], temp_diff[pool_25,], temp_diff[rm_242,], temp_diff[rm_243,],
temp_diff[rm_244,], temp_diff[rm_245,], temp_diff[rm_246,], temp_diff[rm_247,], temp_diff[rm_248,],
temp_diff[rm_249,], temp_diff[rm_250,])
Rock_100kcfs_RiverMiles <- cbind(Rock_100kcfs_RiverMiles, row_wse)
Rock_100kcfs_RiverMiles_diff <- cbind(Rock_100kcfs_RiverMiles_diff, row_diff)
}
row_names <- c("LD25 Tailwater WSE", "LD25 Pool WSE", "RM 242 WSE", "RM 243 WSE",
"RM 244 WSE", "RM 245 WSE", "RM 246 WSE", "RM 247 WSE", "RM 248 WSE",
"RM 249 WSE", "RM 250 WSE")
column_names <- basename(Rock_100kcfs_Files)
column_names <- stringr::str_remove(column_names,"_dep.dat")
Rock_100kcfs_RiverMiles <- Rock_100kcfs_RiverMiles[,c(12,13,14,15,16,17)]
Rock_100kcfs_RiverMiles_diff <- Rock_100kcfs_RiverMiles_diff[,c(12,13,14,15,16,17)]
colnames(Rock_100kcfs_RiverMiles) <- c(column_names)
colnames(Rock_100kcfs_RiverMiles_diff) <- c(column_names)
rm <- as.data.frame(rm)
colnames(rm) <- c("RiverMiles")
Rock_100kcfs_RiverMiles <- cbind(Rock_100kcfs_RiverMiles,rm)
Rock_100kcfs_RiverMiles_diff <- cbind(Rock_100kcfs_RiverMiles_diff, rm)
row.names(Rock_100kcfs_RiverMiles) <- c(row_names)
row.names(Rock_100kcfs_RiverMiles_diff) <- c(row_names)
save(Rock_100kcfs_RiverMiles, file = "F:\\LD25\\Gate Manipulation\\WSE Comparison\\Processed_Data\\Rock_100kcfs_RiverMiles.RData")
save(Rock_100kcfs_RiverMiles_diff, file = "F:\\LD25\\Gate Manipulation\\WSE Comparison\\Processed_Data\\Rock_100kcfs_RiverMiles_diff.RData")
| Base_100_Gates1_2_Closed | Base_100_Gates1_3_Closed | Base_100_Gates1_5_Closed | Base_100_Gates13_17_Closed | Base_100_Normal | BaseCond_100_G1_3_2ftOpen | RiverMiles | |
|---|---|---|---|---|---|---|---|
| LD25 Tailwater WSE | 424.40 | 424.37 | 424.35 | 424.59 | 424.54 | 424.43 | 241.7 |
| LD25 Pool WSE | 429.39 | 429.26 | 429.38 | 429.95 | 429.55 | 429.55 | 241.8 |
| RM 242 WSE | 429.41 | 429.27 | 429.39 | 429.99 | 429.57 | 429.57 | 242.0 |
| RM 243 WSE | 429.90 | 429.78 | 429.88 | 430.41 | 430.04 | 430.03 | 243.0 |
| RM 244 WSE | 430.07 | 429.96 | 430.05 | 430.56 | 430.20 | 430.20 | 244.0 |
| RM 245 WSE | 430.29 | 430.18 | 430.27 | 430.77 | 430.42 | 430.41 | 245.0 |
| RM 246 WSE | 430.57 | 430.47 | 430.57 | 431.04 | 430.70 | 430.70 | 246.0 |
| RM 247 WSE | 430.80 | 430.70 | 430.80 | 431.25 | 430.92 | 430.92 | 247.0 |
| RM 248 WSE | 431.06 | 430.97 | 431.07 | 431.49 | 431.18 | 431.18 | 248.0 |
| RM 249 WSE | 431.38 | 431.29 | 431.39 | 431.78 | 431.49 | 431.49 | 249.0 |
| RM 250 WSE | 431.74 | 431.66 | 431.75 | 432.10 | 431.84 | 431.84 | 250.0 |
| RockCut_100_G1_3_2ftOpen | RockCut_100_Gates1_2_Closed | RockCut_100_Gates1_3_Closed | RockCut_100_Gates1_5_Closed | RockCut_100_Gates13_17_Closed | RockCut_100_Normal | RiverMiles | |
|---|---|---|---|---|---|---|---|
| LD25 Tailwater WSE | 424.47 | 424.48 | 424.49 | 424.41 | 424.36 | 424.46 | 241.7 |
| LD25 Pool WSE | 429.52 | 429.40 | 429.31 | 429.54 | 429.87 | 429.61 | 241.8 |
| RM 242 WSE | 429.54 | 429.42 | 429.33 | 429.54 | 429.91 | 429.63 | 242.0 |
| RM 243 WSE | 430.01 | 429.90 | 429.83 | 430.01 | 430.33 | 430.09 | 243.0 |
| RM 244 WSE | 430.18 | 430.07 | 430.01 | 430.17 | 430.49 | 430.26 | 244.0 |
| RM 245 WSE | 430.39 | 430.29 | 430.23 | 430.39 | 430.70 | 430.47 | 245.0 |
| RM 246 WSE | 430.68 | 430.58 | 430.53 | 430.68 | 430.97 | 430.75 | 246.0 |
| RM 247 WSE | 430.91 | 430.80 | 430.76 | 430.91 | 431.19 | 430.98 | 247.0 |
| RM 248 WSE | 431.16 | 431.06 | 431.02 | 431.16 | 431.44 | 431.23 | 248.0 |
| RM 249 WSE | 431.48 | 431.37 | 431.35 | 431.48 | 431.74 | 431.54 | 249.0 |
| RM 250 WSE | 431.83 | 431.73 | 431.71 | 431.83 | 432.06 | 431.89 | 250.0 |
| Base_100_Gates1_2_Closed | Base_100_Gates1_3_Closed | Base_100_Gates1_5_Closed | Base_100_Gates13_17_Closed | Base_100_Normal | BaseCond_100_G1_3_2ftOpen | RiverMiles | |
|---|---|---|---|---|---|---|---|
| LD25 Tailwater WSE | -0.14 | -0.17 | -0.18 | 0.05 | 0 | -0.11 | 241.7 |
| LD25 Pool WSE | -0.16 | -0.30 | -0.18 | 0.40 | 0 | -0.01 | 241.8 |
| RM 242 WSE | -0.16 | -0.30 | -0.18 | 0.41 | 0 | -0.01 | 242.0 |
| RM 243 WSE | -0.14 | -0.25 | -0.16 | 0.37 | 0 | 0.00 | 243.0 |
| RM 244 WSE | -0.13 | -0.24 | -0.15 | 0.36 | 0 | 0.00 | 244.0 |
| RM 245 WSE | -0.13 | -0.24 | -0.14 | 0.35 | 0 | 0.00 | 245.0 |
| RM 246 WSE | -0.13 | -0.23 | -0.13 | 0.34 | 0 | 0.00 | 246.0 |
| RM 247 WSE | -0.12 | -0.22 | -0.12 | 0.33 | 0 | 0.00 | 247.0 |
| RM 248 WSE | -0.12 | -0.21 | -0.11 | 0.31 | 0 | 0.00 | 248.0 |
| RM 249 WSE | -0.11 | -0.20 | -0.10 | 0.30 | 0 | 0.01 | 249.0 |
| RM 250 WSE | -0.10 | -0.17 | -0.09 | 0.27 | 0 | 0.01 | 250.0 |
| RockCut_100_G1_3_2ftOpen | RockCut_100_Gates1_2_Closed | RockCut_100_Gates1_3_Closed | RockCut_100_Gates1_5_Closed | RockCut_100_Gates13_17_Closed | RockCut_100_Normal | RiverMiles | |
|---|---|---|---|---|---|---|---|
| LD25 Tailwater WSE | 0.01 | 0.01 | 0.02 | -0.05 | -0.10 | 0 | 241.7 |
| LD25 Pool WSE | -0.09 | -0.21 | -0.30 | -0.07 | 0.26 | 0 | 241.8 |
| RM 242 WSE | -0.09 | -0.21 | -0.30 | -0.09 | 0.28 | 0 | 242.0 |
| RM 243 WSE | -0.08 | -0.19 | -0.26 | -0.08 | 0.24 | 0 | 243.0 |
| RM 244 WSE | -0.08 | -0.18 | -0.25 | -0.08 | 0.24 | 0 | 244.0 |
| RM 245 WSE | -0.07 | -0.18 | -0.24 | -0.08 | 0.23 | 0 | 245.0 |
| RM 246 WSE | -0.07 | -0.18 | -0.23 | -0.07 | 0.22 | 0 | 246.0 |
| RM 247 WSE | -0.07 | -0.18 | -0.22 | -0.07 | 0.21 | 0 | 247.0 |
| RM 248 WSE | -0.07 | -0.18 | -0.21 | -0.07 | 0.20 | 0 | 248.0 |
| RM 249 WSE | -0.06 | -0.17 | -0.20 | -0.07 | 0.19 | 0 | 249.0 |
| RM 250 WSE | -0.06 | -0.16 | -0.18 | -0.06 | 0.17 | 0 | 250.0 |