Source code for rafem.diffuse

#! /usr/local/bin/python

import numpy as np

from .avulsion_utils import find_beach_length_riv_cell, get_channel_distance


[docs]def solve_second_derivative(x, y): """Solve the second derivative of y with respect to x. Use finite difference to solve the second derivative of *y* with respect to *x* where *x* can be unevenly spaced. Examples -------- Values can be evenly spaced. >>> import numpy as np >>> x = np.array([2., 3., 4.]) >>> y = np.array([4., 9., 16.]) >>> solve_second_derivative(x, y) array([ 2.]) Values are unevenly spaced. >>> x = np.array([2., 3., 5.]) >>> y = np.array([4., 9., 25.]) >>> solve_second_derivative(x, y) array([ 2.]) """ x2_minus_x1 = x[1:-1] - x[:-2] x3_minus_x2 = x[2:] - x[1:-1] x3_minus_x1 = x[2:] - x[:-2] return 2 * ( y[:-2] / (x2_minus_x1 * x3_minus_x1) - y[1:-1] / (x3_minus_x2 * x2_minus_x1) + y[2:] / (x3_minus_x2 * x3_minus_x1) )
[docs]def smooth_rc(dx, dy, nu, dt, ch_depth, riv_i, riv_j, n, sea_level, slope): """Smooth river channel elevations using the diffusion equation. Parameters ---------- dx : float Spacing of grid columns. dy : float Spacing of grid rows. nu : float Diffusion coefficient. dt : float Time step (in seconds). riv_i : ndarray Row indices for the river path. riv_j : ndarray Column indices for the river path. n : ndarray 2D array of grid elevations. """ beach_len = find_beach_length_riv_cell( n, (riv_i[-2], riv_j[-2]), (riv_i[-1], riv_j[-1]), sea_level, ch_depth, slope, dx=dx, dy=dy, ) n_river = n[riv_i, riv_j] n_river[-1] = sea_level - ch_depth s_river = get_channel_distance((riv_i, riv_j), dx=dx, dy=dy) s_river[-1] += beach_len dn_rc = (nu * dt) * solve_second_derivative(s_river, n_river) n[riv_i[1:-1], riv_j[1:-1]] += dn_rc return dn_rc
[docs]def calc_crevasse_dep(dx, dy, nu, dt, ch_depth, riv_i, riv_j, n, sea_level, slope, loc): """Calculate crevasse splay deposition rate.""" beach_len = find_beach_length_riv_cell( n, (riv_i[-2], riv_j[-2]), (riv_i[-1], riv_j[-1]), sea_level, ch_depth, slope, dx=dx, dy=dy, ) n_river = n[riv_i, riv_j] n_river[-1] = sea_level - ch_depth s_river = get_channel_distance((riv_i, riv_j), dx=dx, dy=dy) s_river[-1] += beach_len dn_rc = (nu * dt) * solve_second_derivative(s_river, n_river) # average deposition in 3 cells above 'breach' to find # crevasse splay deposition rate if len(dn_rc[:loc]) >= 3: splay_dep = np.average(dn_rc[loc - 3 : loc]) else: splay_dep = dn_rc[loc - 1] if splay_dep < 0: splay_dep = 0 return splay_dep