Created
October 13, 2021 14:16
-
-
Save benbovy/e1453347eb898fa43a6d9e7ada41b6b6 to your computer and use it in GitHub Desktop.
Fastscape - Drainage area - Coarse grids
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: fastscape-demo | |
channels: | |
- conda-forge | |
- defaults | |
dependencies: | |
- aiohttp=3.6.2=py38h0b31af3_0 | |
- ansiwrap=0.8.4=py_0 | |
- anyio=2.2.0=py38h50d1736_0 | |
- appdirs=1.4.4=pyh9f0ad1d_0 | |
- appnope=0.1.0=py38h32f6830_1001 | |
- argon2-cffi=20.1.0=py38h4d0b108_1 | |
- asciitree=0.3.3=py_2 | |
- async-timeout=3.0.1=py_1000 | |
- async_generator=1.10=py_0 | |
- atk=2.36.0=2 | |
- atk-1.0=2.36.0=haf1e3a3_2 | |
- attrs=20.2.0=pyh9f0ad1d_0 | |
- babel=2.9.0=pyhd3deb0d_0 | |
- backcall=0.2.0=pyh9f0ad1d_0 | |
- backports=1.0=py_2 | |
- backports.functools_lru_cache=1.6.1=py_0 | |
- black=20.8b1=py_1 | |
- bleach=3.2.1=pyh9f0ad1d_0 | |
- bokeh=2.2.1=py38h32f6830_0 | |
- brotlipy=0.7.0=py38h64e0658_1000 | |
- bzip2=1.0.8=hc929b4f_4 | |
- c-ares=1.17.1=hc929b4f_0 | |
- ca-certificates=2021.5.30=h033912b_0 | |
- cairo=1.16.0=ha8983da_1005 | |
- cartopy=0.18.0=py38h6c003aa_5 | |
- certifi=2021.5.30=py38h50d1736_0 | |
- cffi=1.14.3=py38hc4dd44e_0 | |
- cfgv=3.2.0=py_0 | |
- cftime=1.3.0=py38hfb243c8_0 | |
- chardet=3.0.4=py38h32f6830_1007 | |
- click=7.1.2=pyh9f0ad1d_0 | |
- cloudpickle=1.6.0=py_0 | |
- colorcet=2.0.1=py_0 | |
- cryptography=3.1.1=py38h52adbb4_0 | |
- curl=7.71.1=hcb81553_8 | |
- cycler=0.10.0=py_2 | |
- cytoolz=0.11.0=py38h4d0b108_0 | |
- dask=2021.6.0=pyhd8ed1ab_0 | |
- dask-core=2021.6.0=pyhd8ed1ab_0 | |
- dask-labextension=3.0.0=py_0 | |
- dataclasses=0.7=py38_0 | |
- datashader=0.11.1=pyh9f0ad1d_0 | |
- datashape=0.5.4=py_1 | |
- dbus=1.13.6=h2f22bb5_0 | |
- decorator=4.4.2=py_0 | |
- defusedxml=0.6.0=py_0 | |
- deprecation=2.1.0=pyh9f0ad1d_0 | |
- distlib=0.3.1=pyh9f0ad1d_0 | |
- distributed=2021.6.0=py38h50d1736_0 | |
- editdistance=0.5.3=py38h11c0d25_2 | |
- entrypoints=0.3=py38h32f6830_1001 | |
- expat=2.2.9=hb1e8313_2 | |
- fasteners=0.14.1=py_3 | |
- fastscapelib-f2py=2.8.2=py38hcf7560d_0 | |
- filelock=3.0.12=pyh9f0ad1d_0 | |
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0 | |
- font-ttf-inconsolata=2.001=hab24e00_0 | |
- font-ttf-source-code-pro=2.030=hab24e00_0 | |
- font-ttf-ubuntu=0.83=hab24e00_0 | |
- fontconfig=2.13.1=h79c0d67_1002 | |
- fonts-conda-ecosystem=1=0 | |
- fonts-conda-forge=1=0 | |
- freetype=2.10.4=h4cff582_1 | |
- fribidi=1.0.10=h0b31af3_0 | |
- fsspec=0.8.3=py_0 | |
- gdk-pixbuf=2.38.2=h306395f_4 | |
- geos=3.8.1=h4a8c4bd_0 | |
- gettext=0.19.8.1=h46ab8bc_1002 | |
- giflib=5.2.1=h0b31af3_2 | |
- glib=2.66.1=h39b9ebd_0 | |
- gobject-introspection=1.66.1=py38h8ccf991_0 | |
- graphite2=1.3.13=h12caacf_1001 | |
- graphviz=2.42.3=h055b950_1 | |
- gtk2=2.24.32=hc8e9e3f_3 | |
- gts=0.7.6=h2684ab5_0 | |
- harfbuzz=2.7.2=h8810732_0 | |
- hdf4=4.2.13=h84186c3_1003 | |
- hdf5=1.10.6=nompi_hc457bb4_1110 | |
- heapdict=1.0.1=py_0 | |
- holoviews=1.14.2=pyhd8ed1ab_0 | |
- hvplot=0.7.0=pyhd3deb0d_0 | |
- icu=67.1=hb1e8313_0 | |
- identify=1.5.11=pyhd3deb0d_0 | |
- idna=2.10=pyh9f0ad1d_0 | |
- importlib-metadata=2.0.0=py38h32f6830_0 | |
- importlib_metadata=2.0.0=0 | |
- ipydatawidgets=4.2.0=pyhd3deb0d_0 | |
- ipyfastscape=0.2.0=pyhd8ed1ab_0 | |
- ipygany=0.5.0=pyhd8ed1ab_0 | |
- ipykernel=5.5.0=py38h9bb44b7_1 | |
- ipython=7.10.2=py38h5ca1d4c_0 | |
- ipython_genutils=0.2.0=py_1 | |
- ipywidgets=7.6.3=pyhd3deb0d_0 | |
- jedi=0.17.2=py38h32f6830_0 | |
- jinja2=2.11.2=pyh9f0ad1d_0 | |
- jpeg=9d=h0b31af3_0 | |
- json5=0.9.5=pyh9f0ad1d_0 | |
- jsonschema=3.2.0=py38h32f6830_1 | |
- jupyter=1.0.0=py_2 | |
- jupyter-packaging=0.9.2=pyhd8ed1ab_0 | |
- jupyter-server-proxy=1.5.0=py_0 | |
- jupyter_client=6.1.7=py_0 | |
- jupyter_console=6.2.0=py_0 | |
- jupyter_core=4.6.3=py38h32f6830_1 | |
- jupyter_server=1.6.2=py38h50d1736_0 | |
- jupyterlab=3.0.14=pyhd8ed1ab_0 | |
- jupyterlab_pygments=0.1.2=pyh9f0ad1d_0 | |
- jupyterlab_server=2.4.0=pyhd8ed1ab_0 | |
- jupyterlab_widgets=1.0.0=pyhd8ed1ab_1 | |
- kiwisolver=1.2.0=py38ha0d09dd_0 | |
- krb5=1.17.1=h75d18d8_3 | |
- lcms2=2.11=h174193d_0 | |
- libblas=3.8.0=17_openblas | |
- libcblas=3.8.0=17_openblas | |
- libclang=10.0.1=default_hf57f61e_1 | |
- libcurl=7.71.1=h9bf37e3_8 | |
- libcxx=10.0.1=h5f48129_0 | |
- libedit=3.1.20191231=hed1e85f_2 | |
- libev=4.33=haf1e3a3_1 | |
- libffi=3.2.1=hb1e8313_1007 | |
- libgfortran=4.0.0=h2d743fc_11 | |
- libgfortran4=7.5.0=h2d743fc_11 | |
- libiconv=1.16=haf1e3a3_0 | |
- liblapack=3.8.0=17_openblas | |
- libllvm10=10.0.1=h009f743_3 | |
- libnetcdf=4.7.4=nompi_h9d8a93f_107 | |
- libnghttp2=1.41.0=h7580e61_2 | |
- libopenblas=0.3.10=openmp_h63d9170_4 | |
- libpng=1.6.37=hb0a8c7a_2 | |
- libpq=12.3=h489d428_0 | |
- libsodium=1.0.18=haf1e3a3_1 | |
- libssh2=1.9.0=h39bdce6_5 | |
- libtiff=4.1.0=h2ae36a8_6 | |
- libuv=1.40.0=haf1e3a3_0 | |
- libwebp=1.1.0=hd3bf737_4 | |
- libwebp-base=1.1.0=h0b31af3_3 | |
- libxml2=2.9.10=h7fdee97_2 | |
- llvm-openmp=10.0.1=h28b9765_0 | |
- llvmlite=0.34.0=py38h3707e27_1 | |
- locket=0.2.0=py_2 | |
- lz4-c=1.9.2=hb1e8313_3 | |
- markdown=3.2.2=py_0 | |
- markupsafe=1.1.1=py38h64e0658_1 | |
- matplotlib=3.3.4=py38h50d1736_0 | |
- matplotlib-base=3.3.4=py38h8b3ea08_0 | |
- mistune=0.8.4=py38h64e0658_1001 | |
- monotonic=1.5=py_0 | |
- msgpack-python=1.0.0=py38ha0d09dd_1 | |
- multidict=4.7.5=py38h64e0658_1 | |
- multipledispatch=0.6.0=py_0 | |
- mypy_extensions=0.4.3=py38h50d1736_2 | |
- mysql-common=8.0.21=2 | |
- mysql-libs=8.0.21=hfb8f7af_2 | |
- nbclassic=0.2.7=pyhd8ed1ab_0 | |
- nbclient=0.5.0=py_0 | |
- nbconvert=6.0.7=py38h32f6830_0 | |
- nbformat=5.0.7=py_0 | |
- ncurses=6.2=hb1e8313_1 | |
- nest-asyncio=1.4.1=py_0 | |
- netcdf4=1.5.5.1=nompi_py38h0bc7383_100 | |
- nodeenv=1.5.0=pyh9f0ad1d_0 | |
- nodejs=14.13.0=hdde0ff8_0 | |
- notebook=6.1.4=py38h32f6830_0 | |
- nspr=4.20=h0a44026_1000 | |
- nss=3.47=hcec2283_0 | |
- numba=0.51.2=py38h6be0db6_0 | |
- numcodecs=0.7.2=py38h11c0d25_0 | |
- numpy=1.19.1=py38h8ccc501_2 | |
- olefile=0.46=py_0 | |
- openssl=1.1.1k=h0d85af4_0 | |
- packaging=20.4=pyh9f0ad1d_0 | |
- pandas=1.1.2=py38h11c0d25_0 | |
- pandoc=2.10.1=haf1e3a3_0 | |
- pandocfilters=1.4.2=py_1 | |
- panel=0.9.7=py_0 | |
- pango=1.42.4=haa940fe_4 | |
- papermill=2.2.2=pyhd8ed1ab_0 | |
- param=1.9.3=py_0 | |
- parso=0.7.1=pyh9f0ad1d_0 | |
- partd=1.1.0=py_0 | |
- pathspec=0.8.1=pyhd3deb0d_0 | |
- pcre=8.44=h4a8c4bd_0 | |
- pexpect=4.8.0=py38h32f6830_1 | |
- pickleshare=0.7.5=py38h32f6830_1001 | |
- pillow=7.2.0=py38h83dc5e5_1 | |
- pip=20.2.3=py_0 | |
- pixman=0.38.0=h01d97ff_1003 | |
- pre-commit=2.9.3=py38h50d1736_0 | |
- proj=7.1.1=h45baca5_3 | |
- prometheus_client=0.8.0=pyh9f0ad1d_0 | |
- prompt-toolkit=3.0.7=py_0 | |
- prompt_toolkit=3.0.7=0 | |
- psutil=5.7.2=py38h4d0b108_0 | |
- ptyprocess=0.6.0=py_1001 | |
- pycparser=2.20=pyh9f0ad1d_2 | |
- pyct=0.4.6=py_0 | |
- pyct-core=0.4.6=py_0 | |
- pygments=2.7.1=py_0 | |
- pyopenssl=19.1.0=py38_0 | |
- pyparsing=2.4.7=pyh9f0ad1d_0 | |
- pyqt=5.12.3=py38hf180056_3 | |
- pyrsistent=0.17.3=py38h4d0b108_0 | |
- pyshp=2.1.3=pyh44b312d_0 | |
- pysocks=1.7.1=py38h32f6830_1 | |
- python=3.8.5=h0ed32c4_9_cpython | |
- python-dateutil=2.8.1=py_0 | |
- python-graphviz=0.14.1=pyh9f0ad1d_0 | |
- python_abi=3.8=1_cp38 | |
- pytz=2020.1=pyh9f0ad1d_0 | |
- pyviz_comms=2.0.1=pyhd3deb0d_0 | |
- pyyaml=5.3.1=py38h64e0658_0 | |
- pyzmq=19.0.2=py38h2c785a9_1 | |
- qt=5.12.9=h717870c_0 | |
- qtconsole=4.7.7=pyh9f0ad1d_0 | |
- qtpy=1.9.0=py_0 | |
- readline=8.0=h0678c8f_2 | |
- regex=2020.11.13=py38h5406a74_0 | |
- requests=2.24.0=pyh9f0ad1d_0 | |
- scipy=1.5.2=py38h1402333_0 | |
- selenium=3.141.0=py38h5406a74_1002 | |
- send2trash=1.5.0=py_0 | |
- setuptools=49.6.0=py38h32f6830_1 | |
- shapely=1.7.1=py38h8918236_1 | |
- simpervisor=0.3=py_1 | |
- six=1.15.0=pyh9f0ad1d_0 | |
- sniffio=1.2.0=py38h50d1736_1 | |
- sortedcontainers=2.2.2=pyh9f0ad1d_0 | |
- sqlite=3.33.0=h960bd1c_0 | |
- tblib=1.6.0=py_0 | |
- tenacity=6.3.1=pyhd8ed1ab_0 | |
- terminado=0.9.1=py38h32f6830_0 | |
- testpath=0.4.4=py_0 | |
- textwrap3=0.9.2=py_0 | |
- tk=8.6.10=hbbe82c9_0 | |
- toml=0.10.2=pyhd8ed1ab_0 | |
- tomlkit=0.7.0=py38h50d1736_3 | |
- toolz=0.11.1=py_0 | |
- tornado=6.1=py38h5406a74_1 | |
- tqdm=4.50.0=pyh9f0ad1d_0 | |
- traitlets=5.0.4=py_1 | |
- traittypes=0.2.1=pyh9f0ad1d_2 | |
- typed-ast=1.4.2=py38h5406a74_0 | |
- typing_extensions=3.7.4.2=py_0 | |
- urllib3=1.25.10=py_0 | |
- virtualenv=20.2.2=py38h50d1736_0 | |
- wcwidth=0.2.5=pyh9f0ad1d_2 | |
- webencodings=0.5.1=py_1 | |
- wheel=0.35.1=pyh9f0ad1d_0 | |
- widgetsnbextension=3.5.1=py38h32f6830_1 | |
- xarray=0.18.2=pyhd8ed1ab_0 | |
- xarray-simlab=0.5.0=pyhd8ed1ab_0 | |
- xarray-spatial=0.1.2=pyhd3deb0d_0 | |
- xmovie=0.2.2=pyhd8ed1ab_0 | |
- xz=5.2.5=haf1e3a3_1 | |
- yaml=0.2.5=haf1e3a3_0 | |
- yarl=1.3.0=py38h0b31af3_1000 | |
- zarr=2.4.0=py_0 | |
- zeromq=4.3.3=hb1e8313_1 | |
- zict=2.0.0=py_0 | |
- zipp=3.3.0=py_0 | |
- zlib=1.2.11=h7795811_1009 | |
- zstd=1.4.5=h0384e3a_2 | |
- pip: | |
- fastscape==0.1.0b2+1.g63b0f13 | |
- pyqt5-sip==4.19.18 | |
- pyqtchart==5.12 | |
- pyqtwebengine==5.12.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""A set of utility functions for flow routing. | |
Note: | |
- single flow direction only (on a regular grid with 8 neighbors connectivity) | |
- no handling of closed depression areas | |
""" | |
import numba | |
import numpy as np | |
@numba.njit | |
def reset_receivers(receivers, nnodes): | |
for inode in range(nnodes): | |
receivers[inode] = inode | |
@numba.njit | |
def compute_receivers_d8(receivers, dist2receivers, elevation, | |
nx, ny, dx, dy): | |
# queen (D8) neighbor lookup | |
dr = np.array([-1, -1, -1, 0, 0, 1, 1, 1], dtype=np.intp) | |
dc = np.array([-1, 0, 1, -1, 1, -1, 0, 1], dtype=np.intp) | |
length = np.sqrt((dy * dr)**2 + (dx * dc)**2) | |
tiny = np.finfo(elevation.dtype).tiny | |
for r in range(1, ny - 1): | |
for c in range(1, nx - 1): | |
inode = r * nx + c | |
slope_max = tiny | |
for k in range(8): | |
ineighbor = (r + dr[k]) * nx + (c + dc[k]) | |
slope = (elevation[inode] - elevation[ineighbor]) / length[k] | |
if slope > slope_max: | |
slope_max = slope | |
receivers[inode] = ineighbor | |
dist2receivers[inode] = length[k] | |
@numba.njit | |
def compute_donors(ndonors, donors, receivers, nnodes): | |
ndonors[:] = 0 | |
for inode in range(nnodes): | |
if receivers[inode] != inode: | |
irec = receivers[inode] | |
donors[irec, ndonors[irec]] = inode | |
ndonors[irec] += 1 | |
@numba.njit | |
def _add2stack(inode, ndonors, donors, stack, istack): | |
for k in range(ndonors[inode]): | |
idonor = donors[inode, k] | |
stack[istack] = idonor | |
istack += 1 | |
istack = _add2stack(idonor, ndonors, donors, stack, istack) | |
return istack | |
@numba.njit | |
def compute_stack(stack, ndonors, donors, receivers, nnodes): | |
istack = 0 | |
for inode in range(nnodes): | |
if receivers[inode] == inode: | |
stack[istack] = inode | |
istack += 1 | |
istack = _add2stack(inode, ndonors, donors, | |
stack, istack) | |
@numba.njit | |
def propagate_area(area, stack, receiver): | |
for inode in stack[-1::-1]: | |
if receiver[inode] != inode: | |
area[receiver[inode]] += area[inode] | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment