diff --git a/.scripts/fix_format.py b/.scripts/fix_format.py new file mode 100644 index 0000000..6072fc3 --- /dev/null +++ b/.scripts/fix_format.py @@ -0,0 +1,9 @@ +import subprocess + +cmd = ("ruff", "format", "../") +proc = subprocess.run(cmd) +assert proc.returncode == 0, f"Error running command: {' '.join(cmd)}" + +cmd = ("ruff", "check", "../", "--fix") +proc = subprocess.run(cmd) +assert proc.returncode == 0, f"Error running command: {' '.join(cmd)}" diff --git a/base/watershed/build_base_watershed.ipynb b/base/watershed/build_base_watershed.ipynb index da3920b..0a7b20a 100644 --- a/base/watershed/build_base_watershed.ipynb +++ b/base/watershed/build_base_watershed.ipynb @@ -4,7 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Build the watershed model" + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "## Build the watershed model" ] }, { @@ -66,7 +73,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Load the topology" + "### Develop the data for the watershed model\n", + "\n", + "#### Load the topology" ] }, { @@ -94,7 +103,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Structured grid parameters" + "#### Structured grid parameters" ] }, { @@ -119,7 +128,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Read in boundary data\n", + "#### Read in boundary data\n", "\n", "Load the boundary data from `defaults.py` and plot" ] @@ -158,7 +167,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create a structured grid" + "#### Create a structured grid" ] }, { @@ -185,7 +194,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Sample the raw topographic data" + "#### Sample the raw topographic data" ] }, { @@ -206,7 +215,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Intersect river segments with grid" + "#### Intersect river segments with grid" ] }, { @@ -222,7 +231,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Plot the river intersection" + "#### Plot the river intersection" ] }, { @@ -267,7 +276,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Set the idomain value to 2 where the river intersects the grid" + "#### Set the idomain value to 2 where the river intersects the grid" ] }, { @@ -288,7 +297,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Define the number of layers and the thickness of layer 1" + "#### Define the number of layers and the thickness of layer 1" ] }, { @@ -305,7 +314,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create the drain data for the river segments" + "#### Create the drain data for the river segments" ] }, { @@ -329,7 +338,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create the groundwater discharge drain data" + "#### Create the groundwater discharge drain data" ] }, { @@ -350,7 +359,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create the top and bottom arrays.\n", + "#### Create the top and bottom arrays.\n", "\n", "Top array is not used by the model." ] @@ -393,7 +402,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create idomain and starting head data" + "#### Create idomain and starting head data" ] }, { @@ -410,7 +419,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Build the model files using FloPy\n", + "### Build the model files using FloPy\n", "Note that the CSV solver output is enabled. We will use that in one of the other notebooks." ] }, @@ -502,7 +511,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Count the number of active cells" + "#### Count the number of active cells" ] }, { @@ -519,7 +528,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Write the model files" + "#### Write the model files" ] }, { diff --git a/exercises-completed/flopy/flopy_getting_started.ipynb b/exercises-completed/flopy/flopy_getting_started.ipynb index 9717a1d..28d5ffd 100644 --- a/exercises-completed/flopy/flopy_getting_started.ipynb +++ b/exercises-completed/flopy/flopy_getting_started.ipynb @@ -1,5 +1,19 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "## Building and post-processing a MODFLOW 6 model" + ] + }, { "attachments": { "ex01a.png": { @@ -16,8 +30,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Building and post-processing a MODFLOW 6 model\n", - "\n", "A MODFLOW 6 model will be developed of the domain shown above. This model simulation is based on example 1 in [Pollock, D.W., 2016, User guide for MODPATH Version 7—A particle-tracking model for MODFLOW: U.S. Geological Survey Open-File Report 2016–1086, 35 p., http://dx.doi.org/10.3133/ofr20161086](https://doi.org/10.3133/ofr20161086).\n", "\n", "The model domain will be discretized into 3 layers, 21 rows, and 20 columns. A constant value of 500 ft will be specified for `delr` and `delc`. The top (`TOP`) of the model should be set to 400 ft and the bottom of the three layers (`BOTM`) should be set to 220 ft, 200 ft, and 0 ft, respectively. The model has one steady-state stress period. \n", @@ -112,6 +124,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "### Build the model\n", + "\n", "Create a simulation object, a temporal discretization object, and a iterative model solution object using `flopy.mf6.MFSimulation()`, `flopy.mf6.ModflowTdis()`, and `flopy.mf6.ModflowIms()`, respectively. Set the `sim_name` to `name` and `sim_ws` to `ws` in the simulation object. Use default values for all temporal discretization and iterative model solution variables. Make sure to include the simulation object (`sim`) as the first variable in the temporal discretization and iterative model solution objects." ] }, @@ -440,7 +454,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Post-process the results\n", + "### Post-process the results\n", "\n", "Load the heads and face flows from the hds and cbc files. The head file can be loaded with the `gwf.output.head()` method. The cell-by-cell file can be loaded with the `gwf.output.budget()` method. \n", "\n", diff --git a/exercises-completed/gwt/ex1.ipynb b/exercises-completed/gwt/ex1.ipynb index a9f2dea..36dc553 100644 --- a/exercises-completed/gwt/ex1.ipynb +++ b/exercises-completed/gwt/ex1.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)" + ] + }, { "attachments": { "image.png": { diff --git a/exercises-completed/netcdf/step0_netcdf_output.ipynb b/exercises-completed/netcdf/step0_netcdf_output.ipynb index acfe69e..025479a 100644 --- a/exercises-completed/netcdf/step0_netcdf_output.ipynb +++ b/exercises-completed/netcdf/step0_netcdf_output.ipynb @@ -1,5 +1,20 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "eb8afb07-3737-4c0d-9c58-528be7dcbade", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# NetCDF Output" + ] + }, { "cell_type": "code", "execution_count": null, @@ -20,7 +35,7 @@ "id": "da70620c-e003-40cd-8d78-7c70eb83dc3e", "metadata": {}, "source": [ - "# Load the base watershed model\n", + "## Load the base watershed model\n", "\n", "We will use the base watershed model to demonstrate MODFLOW NetCDF output functionality. " ] @@ -38,22 +53,12 @@ ")" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "053b01cc-1e53-435f-9b0a-3fc30abd7874", - "metadata": {}, - "outputs": [], - "source": [ - "!which mf6" - ] - }, { "cell_type": "markdown", "id": "9fc6cdca-3668-4bd8-a901-91a3651a94c2", "metadata": {}, "source": [ - "# Modify the model to save NetCDF output\n", + "## Modify the model to save structured NetCDF output\n", "\n", "We need to set the `start_date_time` variable in the TDIS file and define the `export_netcdf` variable in the groundwater flow model `name_file`. We will create `structured` NetCDF output first. " ] @@ -84,7 +89,7 @@ "id": "69932909-d442-411c-a9ab-c2795038ccb4", "metadata": {}, "source": [ - "# Change the simulation workspace, write the model files, and run the model" + "### Change the simulation workspace, write the model files, and run the model" ] }, { @@ -123,7 +128,7 @@ "id": "82c2eba0-5d6b-49b4-9f10-51e140529b58", "metadata": {}, "source": [ - "# Load the structured NetCDF file with `xarray` and plot the results" + "### Load the structured NetCDF file with `xarray` and plot the results" ] }, { @@ -173,7 +178,7 @@ "id": "d74dcd66-4763-43c2-a1ec-700cc1ecd71b", "metadata": {}, "source": [ - "# Modify the model to save mesh NetCDF output\n", + "## Modify the model to save mesh NetCDF output\n", "\n", "We need modufy the `export_netcdf` variable in the groundwater flow model `name_file` to `ugrid` to create mesh NetCDF output." ] @@ -193,7 +198,7 @@ "id": "334eb752-77a6-4bf7-b877-772aa19b1f54", "metadata": {}, "source": [ - "# Change the simulation workspace, write the model files, and run the model" + "### Change the simulation workspace, write the model files, and run the model" ] }, { @@ -232,7 +237,7 @@ "id": "ad61cea1-384a-4245-9cbd-3b66b8c7cae9", "metadata": {}, "source": [ - "# Load the mesh NetCDF file with `xugrid` and plot the results" + "### Load the mesh NetCDF file with `xugrid` and plot the results" ] }, { @@ -272,7 +277,7 @@ "id": "c01f168d-5019-4c49-b30b-76fc3e4343a3", "metadata": {}, "source": [ - "# Create cross-sections using `xugrid`\n", + "### Create cross-sections using `xugrid`\n", "\n", "First, we will create a cross-section along a column (y-direction)." ] diff --git a/exercises-completed/notebook_template.ipynb b/exercises-completed/notebook_template.ipynb new file mode 100644 index 0000000..0013790 --- /dev/null +++ b/exercises-completed/notebook_template.ipynb @@ -0,0 +1,130 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "74c4071a-e428-47dd-b8ec-4733d09f80b8", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# Notebook that demonstrates some thing" + ] + }, + { + "cell_type": "markdown", + "id": "eda5391a-3b1d-4935-b5f7-487fb5144e4e", + "metadata": {}, + "source": [ + "Maybe a description of the problem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37f3bbd3-9df3-4628-b97b-22ebf85dc7c1", + "metadata": {}, + "outputs": [], + "source": [ + "import pathlib as pl\n", + "\n", + "import flopy\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "72a8f9d0-4be2-4540-bc83-66642ff63074", + "metadata": { + "execution": { + "iopub.execute_input": "2024-08-29T17:25:46.778581Z", + "iopub.status.busy": "2024-08-29T17:25:46.778254Z", + "iopub.status.idle": "2024-08-29T17:25:46.789059Z", + "shell.execute_reply": "2024-08-29T17:25:46.788022Z", + "shell.execute_reply.started": "2024-08-29T17:25:46.778555Z" + } + }, + "source": [ + "## Heading\n", + "\n", + "A section" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93d6ad42-db1d-416a-af5e-7e40d116ec18", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3f91c303-9a21-4f7e-8d19-10863e7068ef", + "metadata": {}, + "source": [ + "## Heading\n", + "\n", + "Another section" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60717283-79f0-4aac-b364-65aefe81bf1b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3bac2b6c-fb6d-46d6-bde9-13d641357869", + "metadata": {}, + "source": [ + "### Subheading" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "142cf91e-fc32-40b0-9357-f6629fb02f93", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6881a56f-197a-44cc-8414-ba13b704740c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/exercises-completed/parallel/step0_introduction.ipynb b/exercises-completed/parallel/step0_introduction.ipynb index e2c4f49..a2d07d1 100644 --- a/exercises-completed/parallel/step0_introduction.ipynb +++ b/exercises-completed/parallel/step0_introduction.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -21,13 +33,6 @@ "\n", "To get a feeling for the performance behavior, you can run steps 2 and 3 repeatedly while changing the number of domains into which the serial model is partitioned. Another variation is to switch between a partitioning in rectangular domains and using the graph partitioning algorithm from the Metis library. The base model is dimensioned to a small number of nodes: ~10k. This will keep processing times acceptable when working through the notebooks. However, for a serious test of performance the number of nodes should be much larger: at least 25k per domain would be a reasonable lower limit." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -46,7 +51,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/exercises-completed/parallel/step1_run_base_watershed.ipynb b/exercises-completed/parallel/step1_run_base_watershed.ipynb index bb3edbd..5ef5115 100644 --- a/exercises-completed/parallel/step1_run_base_watershed.ipynb +++ b/exercises-completed/parallel/step1_run_base_watershed.ipynb @@ -4,7 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Run the base watershed model" + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# Run the base watershed model with PETSc on one processor" ] }, { @@ -52,9 +59,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Parallel settings\n", + "## Parallel settings\n", "\n", - "1. Set `path_to_mf6` to the path of parallel MODFLOW 6 (`path\\to\\mf6`) if it is not in your `PATH` otherwise set to `None`." + "Set `path_to_mf6` to the path of parallel MODFLOW 6 (`path\\to\\mf6`) if it is not in your `PATH` otherwise set to `None`." ] }, { @@ -106,7 +113,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Change the model directory and write the base watershed model files" + "### Change the model directory and write the base watershed model files" ] }, { @@ -141,7 +148,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run the base watershed model" + "## Run the base watershed model" ] }, { @@ -157,7 +164,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Plot results" + "### Plot the results" ] }, { diff --git a/exercises-completed/parallel/step2_split_watershed.ipynb b/exercises-completed/parallel/step2_split_watershed.ipynb index 65f6cde..a30a859 100644 --- a/exercises-completed/parallel/step2_split_watershed.ipynb +++ b/exercises-completed/parallel/step2_split_watershed.ipynb @@ -4,7 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Split the watershed" + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# Split the watershed model into multiple domains" ] }, { @@ -21,6 +28,17 @@ "from flopy.mf6.utils import Mf6Splitter" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\", category=DeprecationWarning)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -52,7 +70,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Load base simulation data" + "## Load the base watershed model" ] }, { @@ -70,7 +88,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "there is only one model in there:" + "**NOTE**: there is only one model so can get the model directly with `.get_model()`" ] }, { @@ -88,7 +106,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Split into domains" + "## Split the watershed model" ] }, { @@ -116,7 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Create the FloPy Model Splitter" + "Create the FloPy Model Splitter object" ] }, { @@ -159,17 +177,6 @@ "Plot the splitting array as a plan view and cut the inactive cells out" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "\n", - "warnings.filterwarnings(\"ignore\", category=DeprecationWarning)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -188,7 +195,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Split the simulation into domains" + "### Split the simulation into multiple domains" ] }, { @@ -204,7 +211,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### HPC file\n", + "## Create a HPC file\n", "Get the models from the splitted simulation" ] }, @@ -335,7 +342,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/exercises-completed/parallel/step3_parallel_watershed.ipynb b/exercises-completed/parallel/step3_parallel_watershed.ipynb index 415a182..d914d7a 100644 --- a/exercises-completed/parallel/step3_parallel_watershed.ipynb +++ b/exercises-completed/parallel/step3_parallel_watershed.ipynb @@ -1,5 +1,19 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# Run the split watershed model on multiple processors" + ] + }, { "cell_type": "code", "execution_count": null, @@ -61,7 +75,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Load the simulation data for both runs" + "## Load the simulation data for both runs" ] }, { @@ -78,7 +92,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run the splitted simulation in parallel" + "## Run the split simulation in parallel with PETSc" ] }, { @@ -114,7 +128,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Reconstruct the data\n", + "## Reconstruct the data\n", + "\n", "The Model Splitter reconstruction functionality takes the following dictonary to merge the result back into one" ] }, @@ -131,7 +146,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Reconstruct" + "Reconstruct the head data for the parallel run into a single array" ] }, { @@ -167,7 +182,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Plot parallel versus serial" + "## Plot parallel versus serial simulated output" ] }, { diff --git a/exercises-completed/parallel/step4_parallel_solution.ipynb b/exercises-completed/parallel/step4_parallel_solution.ipynb index 78cba39..7aa26ee 100644 --- a/exercises-completed/parallel/step4_parallel_solution.ipynb +++ b/exercises-completed/parallel/step4_parallel_solution.ipynb @@ -1,5 +1,19 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# U.S. Geological Survey Class GW3099\n", + "Advanced Modeling of Groundwater Flow (GW3099)\\\n", + "Boise, Idaho\\\n", + "September 16 - 20, 2024\n", + "\n", + "![title](../../images/ClassLocation.jpg)\n", + "\n", + "# Evaluate the convergence properties of the parallel model simulation" + ] + }, { "cell_type": "code", "execution_count": null, @@ -65,7 +79,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Read the convergence data from the CSVs" + "## Read the convergence data from the CSVs" ] }, { @@ -166,7 +180,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Plot the convergence behavior\n", + "## Plot the convergence behavior\n", "Include DVClose and the total nr. of inners from the base simulation to plot as a reference in the figure" ] }, @@ -218,7 +232,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Possible next steps\n", + "## Possible next steps\n", "* Demo: new files and diagnostics with parallel MODFLOW\n", "* Start from the splitting in [notebook 2](./step2_split_watershed.ipynb) and change the method to using the Metis library and run all subsequent notebooks\n", "* Change the number of domains in [notebook 1](./step1_watershed.ipynb) and run everything after again\n", @@ -250,7 +264,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.9.19" } }, "nbformat": 4,