diff --git a/lessons/landlab/landlab/bedrock_landslides_on_dems.ipynb b/lessons/landlab/landlab/bedrock_landslides_on_dems.ipynb
index 487567e..5e5d16d 100644
--- a/lessons/landlab/landlab/bedrock_landslides_on_dems.ipynb
+++ b/lessons/landlab/landlab/bedrock_landslides_on_dems.ipynb
@@ -35,26 +35,12 @@
"metadata": {},
"outputs": [],
"source": [
- "import sys, time, os\n",
- "from pathlib import Path\n",
- "import copy\n",
- "import numpy as np\n",
- "import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
- "\n",
- "from landlab.components import (\n",
- " FlowAccumulator,\n",
- " PriorityFloodFlowRouter,\n",
- " ChannelProfiler,\n",
- " BedrockLandslider,\n",
- ")\n",
- "from landlab.io.netcdf import read_netcdf\n",
- "from landlab.utils import get_watershed_mask\n",
- "from landlab import imshowhs_grid, imshow_grid\n",
- "from landlab.io import read_esri_ascii, write_esri_ascii\n",
- "from landlab import RasterModelGrid\n",
- "\n",
- "from bmi_topography import Topography"
+ "import numpy as np\n",
+ "from bmi_topography import Topography\n",
+ "from landlab import RasterModelGrid, imshow_grid, imshowhs_grid\n",
+ "from landlab.components import BedrockLandslider, PriorityFloodFlowRouter\n",
+ "from landlab.io import read_esri_ascii"
]
},
{
@@ -194,19 +180,15 @@
"metadata": {},
"outputs": [],
"source": [
- "# Read DEM as Lanlab grid\n",
+ "# Read DEM as Landlab grid\n",
"grid_geog, elev = read_esri_ascii(fname, name=\"topographic__elevation\")\n",
- "# Show dem\n",
- "plt.figure()\n",
- "cmap = copy.copy(mpl.cm.get_cmap(\"terrain\"))\n",
- "imshow_grid(\n",
- " grid_geog,\n",
+ "\n",
+ "grid_geog.imshow(\n",
" \"topographic__elevation\",\n",
- " cmap=cmap,\n",
+ " cmap=\"terrain\",\n",
" grid_units=(\"deg\", \"deg\"),\n",
" colorbar_label=\"Elevation (m)\",\n",
- ")\n",
- "plt.show()"
+ ")"
]
},
{
@@ -245,9 +227,8 @@
"outputs": [],
"source": [
"# make a new grid with RasterModelGrid, use the dimensions of grid_geog\n",
- "\n",
- "# grid =\n",
- "# grid.add_field(..."
+ "grid = RasterModelGrid(grid_geog.shape, xy_spacing=30.0)\n",
+ "grid.at_node[\"topographic__elevation\"] = grid_geog.at_node[\"topographic__elevation\"]"
]
},
{
@@ -257,7 +238,8 @@
"metadata": {},
"outputs": [],
"source": [
- "# Plot this one with imshowhs_grid"
+ "# Plot this one with imshowhs_grid\n",
+ "imshowhs_grid(grid, \"topographic__elevation\")"
]
},
{
@@ -272,7 +254,6 @@
" grid, topo=True, DA=True, hill_DA=False, flow_metric=\"D8\", hill_flow_metric=\"Quinn\"\n",
"):\n",
" if topo:\n",
- " cmap = copy.copy(mpl.cm.get_cmap(\"terrain\"))\n",
" azdeg = 200\n",
" altdeg = 20\n",
" ve = 1\n",
@@ -283,7 +264,7 @@
" \"topographic__elevation\",\n",
" grid_units=(\"deg\", \"deg\"),\n",
" var_name=\"Topo, m\",\n",
- " cmap=cmap,\n",
+ " cmap=\"terrain\",\n",
" plot_type=plot_type,\n",
" vertical_exa=ve,\n",
" azdeg=azdeg,\n",
@@ -309,13 +290,11 @@
" drape1 = plot_DA\n",
" thres_drape1 = None\n",
" alpha = 0.5\n",
- " myfile1 = \"temperature.cpt\"\n",
- " cmap1 = copy.copy(mpl.cm.get_cmap(\"terrain\"))\n",
" ax = imshowhs_grid(\n",
" grid,\n",
" \"topographic__elevation\",\n",
" grid_units=(\"deg\", \"deg\"),\n",
- " cmap=cmap1,\n",
+ " cmap=\"terrain\",\n",
" plot_type=plot_type,\n",
" drape1=drape1,\n",
" vertical_exa=ve,\n",
@@ -351,7 +330,7 @@
" grid.at_node[\"hill_drainage_area\"][grid.at_node[\"hill_drainage_area\"] == 0] = (\n",
" grid.dx * grid.dx\n",
" )\n",
- " plotDA = np.log10(grid.at_node[\"hill_drainage_area\"] * 111e3 * 111e3)\n",
+ " # plotDA = np.log10(grid.at_node[\"hill_drainage_area\"] * 111e3 * 111e3)\n",
" # plt.figure()\n",
" # imshow_grid(grid, plotDA,grid_units=(\"m\", \"m\"), var_name=\"Elevation (m)\", cmap='terrain')\n",
"\n",
@@ -361,13 +340,11 @@
" drape1 = np.log10(grid.at_node[\"hill_drainage_area\"])\n",
" thres_drape1 = None\n",
" alpha = 0.5\n",
- " myfile1 = \"temperature.cpt\"\n",
- " cmap1 = copy.copy(mpl.cm.get_cmap(\"terrain\"))\n",
" ax = imshowhs_grid(\n",
" grid,\n",
" \"topographic__elevation\",\n",
" grid_units=(\"deg\", \"deg\"),\n",
- " cmap=cmap1,\n",
+ " cmap=\"terrain\",\n",
" plot_type=plot_type,\n",
" drape1=drape1,\n",
" vertical_exa=ve,\n",
@@ -460,7 +437,7 @@
"metadata": {},
"outputs": [],
"source": [
- "_ = grid.add_zeros(\"soil__depth\", at=\"node\")"
+ "grid.add_zeros(\"soil__depth\", at=\"node\")"
]
},
{
@@ -495,7 +472,6 @@
"metadata": {},
"outputs": [],
"source": [
- "plt.figure()\n",
"LS_size = np.array(ls.landslides_size) * grid.dx**2\n",
"counts, bins = np.histogram(np.log10(LS_size), 8)\n",
"plt.hist(np.log10(LS_size), log=True, bins=bins, density=True)\n",
@@ -524,29 +500,33 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "e6d6b71c",
+ "id": "9d7a51ac",
"metadata": {},
"outputs": [],
"source": [
"# Landslide Erosion\n",
- "cmap = copy.copy(mpl.cm.get_cmap(\"hot_r\"))\n",
"imshow_grid(\n",
" grid,\n",
" np.sqrt(grid.at_node[\"landslide__erosion\"]),\n",
" colorbar_label=\"SQRT( Landslide erosion, m) \",\n",
- " cmap=cmap,\n",
- ")\n",
- "plt.show()\n",
- "\n",
+ " cmap=\"hot_r\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e6d6b71c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
"# Landslide Deposition\n",
- "cmap = copy.copy(mpl.cm.get_cmap(\"winter_r\"))\n",
"imshow_grid(\n",
" grid,\n",
" np.sqrt(grid.at_node[\"landslide__deposition\"]),\n",
" colorbar_label=\"SQRT( Landslide deposition, m) \",\n",
- " cmap=cmap,\n",
- ")\n",
- "plt.show()"
+ " cmap=\"winter_r\",\n",
+ ")"
]
},
{
@@ -557,7 +537,6 @@
"outputs": [],
"source": [
"# Show Landslide Erosion draped over the shaded topographic relief\n",
- "cmap1 = copy.copy(mpl.cm.get_cmap(\"hot_r\"))\n",
"imshowhs_grid(\n",
" grid,\n",
" \"topographic__elevation\",\n",
@@ -566,7 +545,7 @@
" var_name=\"LS \\n erosion\",\n",
" var_units=r\"m\",\n",
" grid_units=(\"m\", \"m\"),\n",
- " cmap=cmap1,\n",
+ " cmap=\"hot_r\",\n",
" ticks_km=False,\n",
" colorbar_label_y=-55,\n",
" add_label_bbox=True,\n",
@@ -574,7 +553,6 @@
")\n",
"plt.show()\n",
"# Show Landslide deposition draped over the shaded topographic relief\n",
- "cmap1 = copy.copy(mpl.cm.get_cmap(\"winter_r\"))\n",
"imshowhs_grid(\n",
" grid,\n",
" \"topographic__elevation\",\n",
@@ -583,7 +561,7 @@
" var_name=\"LS \\n deposition\",\n",
" var_units=r\"m\",\n",
" grid_units=(\"m\", \"m\"),\n",
- " cmap=cmap1,\n",
+ " cmap=\"winter_r\",\n",
" ticks_km=False,\n",
" colorbar_label_y=-55,\n",
" add_label_bbox=True,\n",
@@ -600,26 +578,24 @@
"outputs": [],
"source": [
"# Show Landslide erosion and deposition draped over the shaded topographic relief\n",
- "cmap1 = copy.copy(mpl.cm.get_cmap(\"Blues\"))\n",
"thres_drape1 = 0.01\n",
"thres_drape2 = 0.01\n",
"alpha = 0.8\n",
"alpha2 = 0.8\n",
"drape1 = np.sqrt(grid.at_node[\"landslide__erosion\"])\n",
"drape2 = np.sqrt(grid.at_node[\"landslide__deposition\"])\n",
- "cmap1 = copy.copy(mpl.cm.get_cmap(\"hot_r\"))\n",
- "cmap2 = copy.copy(mpl.cm.get_cmap(\"winter_r\"))\n",
"plt.figure(figsize=(15, 15))\n",
+ "\n",
"imshowhs_grid(\n",
" grid,\n",
" \"topographic__elevation\",\n",
" plot_type=\"Drape2\",\n",
" drape1=drape1,\n",
- " cmap=cmap1,\n",
+ " cmap=\"hot_r\",\n",
" thres_drape1=thres_drape1,\n",
" alpha=alpha,\n",
" drape2=drape2,\n",
- " cmap2=cmap2,\n",
+ " cmap2=\"winter_r\",\n",
" thres_drape2=thres_drape2,\n",
" alpha2=alpha2,\n",
" add_double_colorbar=True,\n",
@@ -627,9 +603,7 @@
" cbar_label_color=\"red\",\n",
" cbar_label_fontweight=\"normal\",\n",
" add_label_bbox=True,\n",
- ")\n",
- "\n",
- "plt.show()"
+ ")"
]
},
{
@@ -668,7 +642,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.0"
+ "version": "3.11.0"
}
},
"nbformat": 4,
diff --git a/lessons/landlab/landlab/fault-scarp.ipynb b/lessons/landlab/landlab/fault-scarp.ipynb
index b567b28..391da04 100644
--- a/lessons/landlab/landlab/fault-scarp.ipynb
+++ b/lessons/landlab/landlab/fault-scarp.ipynb
@@ -39,9 +39,7 @@
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "\n",
- "%matplotlib inline"
+ "import numpy as np"
]
},
{
@@ -156,8 +154,13 @@
"\n",
"In Part 3 we will use the HexagonalModelGrid. \n",
"\n",
- "In Part 4 we will use the LinearDiffuser component. \n",
- "\n",
+ "In Part 4 we will use the LinearDiffuser component. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
"## Part 2: 2D version using Landlab's Model Grids\n",
"\n",
"The Landlab model grids are data structures that represent the model domain (the variable `x` in our prior example). Here we will use `RasterModelGrid` which creates a grid with regularly spaced square grid elements. The RasterModelGrid knows how the elements are connected and how far apart they are.\n",
@@ -251,7 +254,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### *Exercises for section 2a*\n",
+ "#### Exercises for section 2a\n",
"\n",
"(2a.1) Create an instance of a `RasterModelGrid` with 5 rows and 7 columns, with a spacing between nodes of 10 units. Plot the node layout, and identify the ID number of the center-most node."
]
@@ -560,7 +563,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### *Exercises for section 2b*\n",
+ "#### Exercises for section 2b\n",
"\n",
"(2b .1) Create an instance of a `RasterModelGrid` called `mygrid`, with 16 rows and 25 columns, with a spacing between nodes of 5 meters. Use the `plot` function in the `matplotlib` library to make a plot that shows the position of each node marked with a dot (hint: see the plt.plot() example above)."
]
@@ -752,7 +755,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### *Exercises for section 2c*\n",
+ "#### Exercises for section 2c\n",
"\n",
"(2c.1) Make a 3x3 `RasterModelGrid` called `tinygrid`, with a cell spacing of 2 m. Use the `plot_graph` function to display the nodes and their ID numbers."
]
@@ -937,7 +940,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### *Exercises for section 3*\n",
+ "#### Exercises for section 3\n",
"\n",
"(3.1-6) Repeat the exercises from section 2c, but this time using a hexagonal tiny grid called `tinyhex`. Your grid should have 7 nodes: one core node and 6 perimeter nodes. (Hints: use `node_layout = 'hex'`, and make a grid with 3 rows and 2 base-row columns.)"
]
@@ -1085,7 +1088,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### *Exercises for section 4*\n",
+ "### Exercises for section 4\n",
"\n",
"(4.1) Repeat the steps above that instantiate and run a `LinearDiffuser` component, but this time give it a `RasterModelGrid`. Use `imshow_grid` to display the topography below."
]
@@ -1167,7 +1170,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "#### *SOLUTION (derivation)*\n",
+ "#### SOLUTION (derivation)\n",
"\n",
"##### Derivation of the original governing equation\n",
"\n",
@@ -1302,8 +1305,15 @@
"source": [
"Congratulations on making it to the end of this tutorial!\n",
"\n",
- "### Click here for more Landlab tutorials"
+ "**Click here for more** Landlab tutorials"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
@@ -1323,7 +1333,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.0"
+ "version": "3.11.0"
}
},
"nbformat": 4,
diff --git a/lessons/landlab/landlab/intro-to-grids.ipynb b/lessons/landlab/landlab/intro-to-grids.ipynb
index df471e0..6d98817 100644
--- a/lessons/landlab/landlab/intro-to-grids.ipynb
+++ b/lessons/landlab/landlab/intro-to-grids.ipynb
@@ -7,6 +7,25 @@
""
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [
+ "toc"
+ ]
+ },
+ "source": [
+ "# Table of Contents\n",
+ "* [Introduction to Landlab: Grids and simple 2D models](#Introduction-to-Landlab:-Grids-and-simple-2D-models)\n",
+ " * [What types of problems can Landlab solve?](#What-types-of-problems-can-Landlab-solve?)\n",
+ " * [What you need to know about Landlab grids](#What-you-need-to-know-about-Landlab-grids)\n",
+ " * [Explore the Landlab grids](#Explore-the-Landlab-grids)\n",
+ " * [Add fields and manipulate boundaries](#Add-fields-and-manipulate-boundaries)\n",
+ " * [Gradients](#Gradients)\n",
+ " * [Sediment diffusion](#Sediment-diffusion)\n",
+ " * [Sediment diffusion with a Landlab component](#Sediment-diffusion-with-a-Landlab-component)"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -72,21 +91,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### (a) Explore the Landlab grids\n",
+ "### Explore the Landlab grids\n",
"\n",
"First let's visualize the types of grids that Landlab supports. The most common is the `RasterModelGrid`, but different grid types are useful for different applications. We'll start by importing a couple different grid libraries, plus some tools that will help us visualize the grids."
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "# import libraries\n",
- "from landlab import RasterModelGrid, HexModelGrid\n",
- "from landlab.plot.graph import plot_graph\n",
- "from landlab import imshow_grid"
+ "from landlab import HexModelGrid, RasterModelGrid, imshow_grid\n",
+ "from landlab.plot.graph import plot_graph"
]
},
{
@@ -98,19 +115,19 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# get info on RasterModelGrid\n",
- "?RasterModelGrid"
+ "RasterModelGrid?"
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -127,30 +144,9 @@
},
{
"cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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VMYY3X333VqyZIk++OADtWzZMmB5y5YtFRMTozVr1vjn5efnKy0tTb179w76vL169QrYRpJWr14ddBu32+0/51SJ556aNu1UN6N0qvtx2rQyvFvAJtofnET7g5OqQvsrxyFjZ+3OO+80Ho/HpKammpycHP909OhR/zrJycnG4/GYJUuWmB07dpgbb7zRxMbGGp/P519n3Lhx5sEHH/Q//uijj0zt2rVNcnKy2bVrl0lOTjZ16tQxm848EiqIUo/yS0iwBqEnJBizZMm5vn3g7NH+4CTaH5xUhvZX4u93BXMZUwE7Esso2Jim+fPna8KECZKsXqwZM2bo+eef188//6wePXpozpw5/oHrktS/f3+1aNFCCxYs8M9bvHixpk6dqj179qh169Z6/PHHNWrUqDLVVaZ9sAAAIKQ4+fvtaKAKVQQqAACqHid/v0NiUDoAAEBVRqACAACwiUAFAABgE4EKAADAJgIVAACATQQqAAAAmwhUAAAANhGoAAAAbCJQAQAA2ESgAgAAsIlABQAAYBOBCgAAwCYCFQAAgE0EKgAAAJsIVAAAADYRqAAAAGwiUAEAANhEoAIAALCJQAUAAGATgQoAAMAmAhUAAIBNBCoAAACbCFQAAAA2EagAAABsIlABAADYRKACAACwiUAFAABgE4EKAADAJgIVAACATY4GqvXr12v48OGKi4uTy+XSsmXLApa7XK5ip7/97W9Bn3PBggXFbnPs2LEKfjcAAKCmcjRQHTlyRAkJCZo9e3axy3NycgKml156SS6XS6NHjy7xeaOioopsGxERURFvAQAAQHWcfPEhQ4ZoyJAhQZfHxMQEPH777bc1YMAAtWrVqsTndblcRbYFAACoKFVmDNX333+vFStW6JZbbil13cOHDys+Pl5NmzbVsGHDlJ6eXgkVAgCAmqrKBKqXX35ZkZGRGjVqVInrtWvXTgsWLNDy5cv1xhtvKCIiQn369FFGRkbQbfLy8uTz+QImAACAsqoygeqll17SH/7wh1LHQvXs2VM33XSTEhIS1LdvX/3rX/9S27Zt9cwzzwTdJikpSR6Pxz81a9asvMsHAADVWJUIVB9++KF2796tW2+99ay3rVWrlrp161ZiD9WUKVPk9Xr9U3Z2tp1yAQBADePooPSymjdvnrp06aKEhISz3tYYo23btqlTp05B13G73XK73XZKBAAA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",
- "text/plain": [
- "