diff --git a/docs/notebooks/BMI_demo.ipynb b/docs/notebooks/BMI_demo.ipynb new file mode 100644 index 00000000..a2369c71 --- /dev/null +++ b/docs/notebooks/BMI_demo.ipynb @@ -0,0 +1,258 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# STEMMUS_SCOPE BMI demonstration\n", + "\n", + "We first have to add the matlab runtime compiler locations to PATH:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['LD_LIBRARY_PATH'] = (\n", + " \"/home/bart/matlab_runtime/R2023a/runtime/glnxa64:\"\n", + " \"/home/bart/matlab_runtime/R2023a/bin/glnxa64:\"\n", + " \"/home/bart/matlab_runtime/R2023a/sys/os/glnxa64:\"\n", + " \"/home/bart/matlab_runtime/R2023a/extern/bin/glnxa64:\"\n", + " \"/home/bart/matlab_runtime/R2023a/sys/opengl/lib/glnxa64\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can initialize the model with a prepared configuration file:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from PyStemmusScope.bmi import StemmusScopeBmi\n", + "from cftime import num2pydate\n", + "from rich import print\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "model = StemmusScopeBmi()\n", + "\n", + "model.initialize(\"/home/bart/tmp/stemmus_scope/input/ZA-Kru_2023-11-16-0728/ZA-Kru_2023-11-16-0728_config.txt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model has the following input and output variables exposed:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
('soil_temperature',)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m(\u001b[0m\u001b[32m'soil_temperature'\u001b[0m,\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
('soil_temperature', 'respiration')\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m(\u001b[0m\u001b[32m'soil_temperature'\u001b[0m, \u001b[32m'respiration'\u001b[0m\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(model.get_input_var_names())\n", + "print(model.get_output_var_names())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can update the model and request the data for the respiration:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
[3.6085965]\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m[\u001b[0m\u001b[1;36m3.6085965\u001b[0m\u001b[1m]\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.update()\n", + "\n", + "dest = np.array([0.])\n", + "model.get_value(\"respiration\", dest)\n", + "\n", + "print(dest)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an example, we can retrieve the soil temperature for every time step.\n", + "\n", + "To make it more interesting we set the temperature of a deeper soil layer to 50 deg C at time step 12:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "time = []\n", + "i=0\n", + "\n", + "while model.get_current_time() < model.get_end_time():\n", + " model.update()\n", + " dest = np.ones(55)\n", + " model.get_value(\"soil_temperature\", dest)\n", + " data.append(dest)\n", + "\n", + " time.append(num2pydate(model.get_current_time(), model.get_time_units()))\n", + "\n", + " if i == 12: # Set some of the soil to 50 degrees C at time step 12.\n", + " new_temp = dest.copy()\n", + " new_temp[10:12] = 50\n", + " model.set_value(\"soil_temperature\", new_temp)\n", + "\n", + " i+=1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "gs = model.get_grid_size(1)\n", + "depths = np.ones(gs)\n", + "model.get_grid_z(1, depths)\n", + "\n", + "da = xr.DataArray(\n", + " data=np.vstack(data),\n", + " dims=(\"time\", \"depth\"),\n", + " coords={\"time\": np.array(time), \"depth\": depths},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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GqF37944evQomjZtWq54mGQQEREp5MvJuCIjIz2SDD3jx4/HBx98gK+++goxMTFe79upUycAwJEjR5hkEBER2YKCybhEBBMmTMB7772HLVu24JZbbtEts3fvXgBAo0aNyn0dJhlERETVTGpqKtasWYONGzciIiICWVlZAICoqCjcdNNNOHr0KNasWYMBAwYgOjoa+/btw6RJk3DnnXciKSmp3NdhkkFERKSQirVLli5dCuDahFvXW7lyJVJSUhAcHIzPP/8cixYtQl5eHmJjYzF06FDMmDGjQtdhkkFERKSSglVYRef+sbGxSE9PNxIRACYZRERESvnzKqycjIuIiIhMwZoMourAor9yykszWpVsNoXhaXb/5xqkt9S9kZXqA4qq6Ln146XemWQQEREpxOYSIiIiogqyXZLhcDjQpk0baJrmnhiEiIjItlzim82CbJdk/PGPf0Tjxo1Vh0FEROQb4qPNgmyVZHz88cf49NNPsWDBAtWhEBERkQ7bdPw8c+YMxo4di3/9618ICwsrVxmHwwGHw+G+nZOTY1Z4RERElaLBBx0/fRKJ79miJkNEkJKSgnHjxqFDhw7lLjd37lxERUW5t9jYWBOjJCIiqoTiGT+NbhakNMmYPn06NE3zuh0+fBivvfYacnNzkZaWVqHzp6WlITs7271lZmaa9EiIiIjoRkqbS6ZMmYKUlBSv92nSpAm+/PJLbN26FSEhIR7HOnTogOHDh+Ott94qtWxISEiJMkRERFbiz/NkKE0y6tWrh3r16uneb/HixZgzZ4779qlTp9C3b1+888476NSpk5khEhERmYszfqoVFxfncTs8PBwA0LRpU8TExKgIiYiIyCc0EcNT51t16n1bdPwkIiIi+7FFTcaNEhISIBbN2oiIiCrE9d/N6DksyJZJBhGRpfA3jzJmNhNoVTRVN5tLiIiIiCqINRlEREQqcXQJERERmcIXM3ayuYSIiIiqE9ZkEBERKcQZP4mIiMgcbC4hIiIiqhjWZBARESmkua5tRs9hRUwyiIiIVPLj5hImGURERCr58TwZ7JNBREREpmBNBhERkUL+vHYJkwwiIiKV/LhPBptLiIiIyBSsySAiIlJJABgdgmrNigwmGURERCr5c58MNpcQERGRKViTQUREpJLABx0/fRKJzzHJICIiUsmPR5cwySAiIlLJBUDzwTksiH0y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ly5d0KxZM4SEhMDpdCIwMBAAcPz4cYwYMQKJiYl44YUXEB0d7XXdAm/HGL//xO7r+F0uFwICAlBYWIigoCDG78ex+zp+ADhw4ADi4+MRERFR5fE3adIEN910E65evVpiTZ0BAwaga9euePrpp6skLrIRNblN1Tl06JC0bt1aEhISJDExUeLi4kpMzlQ8zv+VV16RDh06yKpVq1SEWio7x2/n2EUYv0p2jl3E/+O/sXaiXbt2SjrPkvX5fZLxzDPPSK9eveTq1auSlZUl//jHPyQoKEjmz5/vbgctfrNfuXJF+vfvL8OGDXNPg1w8Na+qns92jt/OsTN+vnYYv/f4izt17tmzRyIjI93zYIiI0rVqyFr8Osm4evWqtGzZUl588UWP/QsWLJCIiAiPmSCL3/Dr16+Xjh07yqRJk+R3v/udREdHK5tO287x2zl2EcbP107lVaf4RUTmzJkjXbt2FRGR06dPy0MPPSRDhgyRS5cuVVnMZF1+m2QUZ9ndunWTMWPGiIjn9Me33XabjBgxosScBOfPn5e4uDjRNE0GDBigbM5/O8dv59hFGD9fO5VXHeMfNWqUvPjiizJv3jwJCwuT7t27S2ZmZtUGTpblt0mGyLXharNnz5Z27dq5qyGLp6Nev369BAUFyblz59z337Jli2iaJrfffru797dKdo7fzrGLMH6V7By7SPWK//Tp01KrVi3RNM1y0/iTNQSo7nhqlsLCQtSoUQPt27dHaGgoli9fDgAIDg4GAHTv3h0333wzPvroI3eZDh06YPHixThw4AC6deumJO5ido7fzrEDjJ+vncqrLvF/+OGH7jJt2rTBqlWrcOzYMfTt21dJ3GRhqrOcyiqegvnGjlE3rggpcm358rZt23r0ft63b5/UrVtXPv/88zLLmcnO8ds5dhHGz9dO5TF+z/hLOxfR9WyXZGzevFmaN28umqa5V+krba2HtWvXys033yxbtmyRH374QR566CFp1KiRfPrpp3L8+HF5/vnnpV27dvLTTz8x/moQO+Pna4fx2zd+si9bJRk7d+6UQYMGySOPPCLDhg2TW2+91eO4y+WSX375Rfr16yf169eXhQsXuhftOX36tAwaNEiaNm0qcXFxEhMTI59++injrwaxM36+dhi/feMne7NVkpGZmSkvv/yyHD58WA4dOiS1a9eWP//5zyLya1Z+9epV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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "da.plot(y=\"depth\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is important to call `finalize()` on the model when you're done, otherwise the model will stay running in the background:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.finalize()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyStemmusScope", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}