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 hidden or 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 hidden or 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