Quickstart

A single long profile

Build a LongProfile, bring it to steady state, then perturb its upstream sediment supply and watch the profile respond. This mirrors examples/one_dimensional/Basic1D.py.

import numpy as np
import grlp

# --- Physical setup (Río Santa Cruz-like numbers) --------------------------
Q  = 700.          # m3/s, channel-forming water discharge
z0 = 180.          # m, elevation at the upstream end
z1 = 0.            # m, base level
L  = 250e3         # m, valley length
S0 = (z0 - z1) / L # equilibrium slope
B  = 10000.        # m, valley width
U  = 1e-4 / 3.15e7 # m/s, uplift rate

# --- Build the profile -----------------------------------------------------
lp = grlp.LongProfile()
lp.basic_constants()
lp.bedload_lumped_constants()
lp.set_hydrologic_constants()

lp.set_x(dx=1000, nx=251, x0=0)   # downstream distance grid
lp.set_z(S0=S0, z1=z1)            # initial (linear) profile
lp.set_Q(Q)                       # water discharge
lp.set_B(B)                       # valley width
lp.set_niter(3)                   # Picard iterations per step
lp.set_z_bl(z1)                   # downstream base level (Dirichlet BC)
lp.set_uplift_rate(U)

# Upstream sediment-supply boundary (Neumann): the supply consistent with S0
Qs0 = lp.k_Qs * lp.Q[0] * S0 ** (7 / 6.)
lp.set_Qs_input_upstream(Qs0)

# --- Evolve to steady state, then perturb ----------------------------------
lp.evolve_threshold_width_river(10, 1e14)   # long steps -> equilibrium
z_eq = lp.z.copy()

lp.set_Qs_input_upstream(Qs0 * 4)           # quadruple the sediment supply
for _ in range(50):
    lp.evolve_threshold_width_river(1, 1000 * 3.15e7)  # 1000-yr steps

# lp.z now holds the transiently aggraded profile; compare with z_eq.

evolve_threshold_width_river(nt, dt) advances nt steps of size dt seconds. The upstream boundary can be forced by sediment supply (set_Qs_input_upstream) or directly by slope (set_S0); the downstream boundary is base level (set_z_bl), which may also be moved horizontally with set_x_bl (e.g. to track a shoreline along a continental shelf — see the RioSantaCruz_set_S0_set_x_bl example).

A river network

Every GRLP solution is a network solution; a single long profile is the trivial one-edge case. Generate a random Shreve network, evolve it, and plot it:

import grlp

# generate_random_network returns (network, topology).
#   magnitude     : number of channel heads (network size)
#   max_length    : length of the longest source-to-outlet path [m]
#   mean_discharge: sets segment discharges from drainage area
net, topo = grlp.generate_random_network(
    magnitude=8,
    max_length=2.0e4,
    mean_discharge=10.,
)
net.set_niter(3)
net.evolve_threshold_width_river_network(nt=200, dt=3.15e11)
net.plot()   # branching planform

See Examples for point-source (landslide) forcing, base-level change, and network analysis (Hack parameters, Strahler orders, Horton ratios).