Source code for rafem.FP

#! /usr/local/bin/python
# -*- coding: utf-8 -*-

import numpy as np


[docs]def add_to_neighboring_cells(z, sub, inc, win=1): """Add a value to all neighboring cells. Parameters ---------- z : ndarray 2D array of values. sub : tuple of int Row/column subscripts into array. inc : float Value to increment *z* by. win : int Size of the window around *sub*. Examples -------- >>> x = np.zeros((4, 5)) >>> add_around_cell(x, (0, 0), 1) """ z[ max(0, sub[0] - win) : min(z.shape[0], sub[0] + win + 1), max(0, sub[1] - win) : min(z.shape[1], sub[1] + win + 1), ] += inc
[docs]def dep_blanket(current_SL, blanket_rate, n, riv_i, riv_j, ch_depth): depo_flag = np.ones(n.shape, dtype=np.int) # don't deposit in the river course depo_flag[riv_i, riv_j] = 0 # don't deposit if cell <= sea level # ASK BRAD ABOUT THIS (no cell is below SL right now) # but it might be when couple?? need to figure out if keeping up # with elevation RELATIVE to sea level or actual elevation?? depo_flag[n <= current_SL] = 0 # if cell elevation is above bankfull elev, don't deposit bankfull_elevation = n[riv_i, riv_j] + ch_depth for row in riv_i: depo_flag[row, n[row] >= bankfull_elevation[row]] = 0 # don't deposit on first two rows b/c inlet rise rate does that depo_flag[:2, :] = 0 # deposit "blanket" deposition on qualified cells n[depo_flag == 1] += blanket_rate
# dn_fp = depo_flag * blanket_rate # return n, dn_fp
[docs]def distance_to_river(y, y0): return np.absolute(y - y0)
[docs]def within_wetland(y, riv_ind, wetland_width=0.0): dy = distance_to_river(y, y[riv_ind]) is_wetland = dy <= wetland_width is_wetland[riv_ind] = False return is_wetland
[docs]def wetlands(current_SL, WL_Z, wetland_width, n, riv_i, riv_j, y, x): depo_wetland = np.zeros(n.shape, dtype=np.int) for row, col in zip(riv_i, riv_j): dist = within_wetland(y[row], col, wetland_width=wetland_width) elev = n[row] < current_SL + WL_Z cols = dist & elev & (depo_wetland[row] == 0) n[row, cols] = current_SL + WL_Z depo_wetland[row, cols] == 1
[docs]def dep_splay(n, ij_fail, splay_dep, splay_type=1): """Deposit around a failed river cell. Parameters ---------- n : ndarray Elevation array. ij_path : tuple of int Row and column of the river failure. old_path : tuple of array_like Row and column indices for the old river path. a : int River path index of the failure. splay_depth : float Deposition depth. splay_type : {1, 2}, optional Failure type USE DEPTH-DEPENDENCE IN THE FUTURE SE1 = (n[riv_x[a]/dx][riv_y[a]/dy] + ch_depth - \ n[new_riv_x[a]/dx][new_riv_y[a]/dy]) / ch_depth ADD LARGER SPLAY TYPE IN FUTURE? (could be first two failed river cells + surrounding) This could possibly be improved by comparing to find nearest beach routine (CEM) or using some sort of search radius """ if splay_type == 1: # splay deposition just at first failed river cell n[ij_fail] += splay_dep if splay_type == 2: # splay deposition at first failed river cell # and the adjacent cells add_to_neighboring_cells(n, ij_fail, splay_dep)
[docs]def dep_fines(n, riv_i, riv_j, dn_rc, frac_fines, SL): fine_dep = np.zeros_like(n) dn_rc = np.insert(dn_rc, [0], 0) dn_rc = np.append(dn_rc, dn_rc[-1]) for k in range(1, len(riv_i)): dep_rate = frac_fines * dn_rc[k] if dep_rate > 0: if riv_j[k] == 0 and riv_i[k] == 0: di, dj = np.array([1, 1, 0]), np.array([0, 1, 1]) elif riv_j[k] == 0 and riv_i[k] == n.shape[0] - 1: di, dj = np.array([-1, -1, 0]), np.array([0, 1, 1]) elif riv_j[k] == n.shape[1] - 1 and riv_i[k] == 0: di, dj = np.array([0, 1, 1]), np.array([-1, -1, 0]) elif riv_j[k] == n.shape[1] - 1 and riv_i[k] == n.shape[0] - 1: di, dj = np.array([0, -1, -1]), np.array([-1, -1, 0]) elif riv_j[k] == n.shape[1] - 1: di, dj = np.array([-1, -1, 0, 1, 1]), np.array([0, -1, -1, -1, 0]) elif riv_j[k] == 0: di, dj = np.array([-1, -1, 0, 1, 1]), np.array([0, 1, 1, 1, 0]) elif riv_i[k] == n.shape[0] - 1: di, dj = np.array([0, -1, -1, -1, 0]), np.array([-1, -1, 0, 1, 1]) elif riv_i[k] == 0: di, dj = np.array([0, 1, 1, 1, 0]), np.array([-1, -1, 0, 1, 1]) else: di, dj = ( np.array([0, -1, -1, -1, 0, 1, 1, 1]), np.array([-1, -1, 0, 1, 1, 1, 0, -1]), ) for m in range(len(di)): if (fine_dep[riv_i[k] + di[m], riv_j[k] + dj[m]] < dep_rate) and ( n[riv_i[k] + di[m], riv_j[k] + dj[m]] > SL ): fine_dep[riv_i[k] + di[m], riv_j[k] + dj[m]] = dep_rate fine_dep[riv_i, riv_j] = 0 n += fine_dep return