From 8dfda6ce0f8f2b6dd7b7478a2522ac0caed89924 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Wed, 29 Apr 2020 10:10:46 +0200 Subject: [PATCH 01/21] update --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4124348..5883d46 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,18 @@ Changes ======= +``v0.4.2`` +---------- +*released 2019-11-20* + +Bug Fixes +~~~~~~~~~ + +- **utils:** Improve markdown representation of units (`PR #79 `__) + +- **variables:** Fix generate_metadata_table for selected variables (`PR #80 `__) + + ``v0.4.1`` ---------- *released 2019-11-20* From e70e2f2a5c8bc8e2b51567357614337623a134bd Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Wed, 29 Apr 2020 13:03:56 +0200 Subject: [PATCH 02/21] Delete unused equation and variable definitions. --- essm/equations/chamber/__init__.py | 20 -------------- essm/equations/chamber/insulation.py | 40 ---------------------------- essm/variables/leaf/water_vapour.py | 35 ------------------------ 3 files changed, 95 deletions(-) delete mode 100644 essm/equations/chamber/__init__.py delete mode 100644 essm/equations/chamber/insulation.py delete mode 100644 essm/variables/leaf/water_vapour.py diff --git a/essm/equations/chamber/__init__.py b/essm/equations/chamber/__init__.py deleted file mode 100644 index a04b32a..0000000 --- a/essm/equations/chamber/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of essm. -# Copyright (C) 2017 ETH Zurich, Swiss Data Science Center. -# -# essm is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# essm is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with essm; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307, USA. -"""Chamber.""" diff --git a/essm/equations/chamber/insulation.py b/essm/equations/chamber/insulation.py deleted file mode 100644 index d5d0829..0000000 --- a/essm/equations/chamber/insulation.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of essm. -# Copyright (C) 2017 ETH Zurich, Swiss Data Science Center. -# -# essm is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# essm is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with essm; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307, USA. -"""Chamber insulation.""" - -from __future__ import absolute_import - -from essm import Eq - -from ...variables.chamber.insulation import A_i, L_i, Q_i, dT_i, lambda_i -from .._core import Equation - - -class eq_Qi(Equation): - """Calculate .... - - :cite:`schymanski_leaf-scale_2017` - """ - - expr = Eq(Q_i, dT_i * lambda_i * A_i / L_i) - """Describe how you got the equation.""" - - -__all__ = ('eq_Qi', ) diff --git a/essm/variables/leaf/water_vapour.py b/essm/variables/leaf/water_vapour.py deleted file mode 100644 index 4c1c993..0000000 --- a/essm/variables/leaf/water_vapour.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of essm. -# Copyright (C) 2017 ETH Zurich, Swiss Data Science Center. -# -# essm is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# essm is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with essm; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307, USA. -"""Leaf water vapour exchange and energy balance.""" - -from __future__ import absolute_import - -from essm.variables.units import meter - -from .._core import Variable - - -class B_l(Variable): - """Boundary layer thickness.""" - - unit = meter - - -__all__ = ('B_l', ) From b4031adcaa5f5e2716179da8ca78c8ea0a38fadc Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Wed, 29 Apr 2020 16:49:01 +0200 Subject: [PATCH 03/21] Add examples and adjust sphinx settings. --- docs/api.rst | 12 + docs/conf.py | 3 +- docs/examples/api_features.ipynb | 641 +++--- docs/examples/api_features.rst | 1757 +++++++++++++++++ .../api_features_files/api_features_104_0.png | Bin 0 -> 1436 bytes .../api_features_files/api_features_111_0.png | Bin 0 -> 2025 bytes .../api_features_files/api_features_119_0.png | Bin 0 -> 2030 bytes .../api_features_files/api_features_124_1.png | Bin 0 -> 422 bytes .../api_features_files/api_features_125_1.png | Bin 0 -> 225 bytes .../api_features_files/api_features_13_0.png | Bin 0 -> 16681 bytes .../api_features_files/api_features_26_0.png | Bin 0 -> 699 bytes .../api_features_files/api_features_27_0.png | Bin 0 -> 1418 bytes .../api_features_files/api_features_38_0.png | Bin 0 -> 1682 bytes .../api_features_files/api_features_42_0.png | Bin 0 -> 2164 bytes .../api_features_files/api_features_44_0.png | Bin 0 -> 2399 bytes .../api_features_files/api_features_48_0.png | Bin 0 -> 2311 bytes .../api_features_files/api_features_52_2.png | Bin 0 -> 2164 bytes .../api_features_files/api_features_53_1.png | Bin 0 -> 1128 bytes .../api_features_files/api_features_54_1.png | Bin 0 -> 1128 bytes .../api_features_files/api_features_62_0.png | Bin 0 -> 3163 bytes .../api_features_files/api_features_64_1.png | Bin 0 -> 9773 bytes .../api_features_files/api_features_67_0.png | Bin 0 -> 6144 bytes .../api_features_files/api_features_68_0.png | Bin 0 -> 6144 bytes .../api_features_files/api_features_71_1.png | Bin 0 -> 1733 bytes .../api_features_files/api_features_73_0.png | Bin 0 -> 3163 bytes .../api_features_files/api_features_75_0.png | Bin 0 -> 5289 bytes .../api_features_files/api_features_75_1.png | Bin 0 -> 10644 bytes .../api_features_files/api_features_77_0.png | Bin 0 -> 3113 bytes .../api_features_files/api_features_78_0.png | Bin 0 -> 3687 bytes .../api_features_files/api_features_78_1.png | Bin 0 -> 9821 bytes .../api_features_files/api_features_91_0.png | Bin 0 -> 2278 bytes .../api_features_files/api_features_93_0.png | Bin 0 -> 2307 bytes .../importable_variables_equations.ipynb | 1043 ++++++++++ docs/examples/test_definitions.py | 80 + docs/index.rst | 21 + setup.py | 2 +- 36 files changed, 3206 insertions(+), 353 deletions(-) create mode 100644 docs/examples/api_features.rst create mode 100644 docs/examples/api_features_files/api_features_104_0.png create mode 100644 docs/examples/api_features_files/api_features_111_0.png create mode 100644 docs/examples/api_features_files/api_features_119_0.png create mode 100644 docs/examples/api_features_files/api_features_124_1.png create mode 100644 docs/examples/api_features_files/api_features_125_1.png create mode 100644 docs/examples/api_features_files/api_features_13_0.png create mode 100644 docs/examples/api_features_files/api_features_26_0.png create mode 100644 docs/examples/api_features_files/api_features_27_0.png create mode 100644 docs/examples/api_features_files/api_features_38_0.png create mode 100644 docs/examples/api_features_files/api_features_42_0.png create mode 100644 docs/examples/api_features_files/api_features_44_0.png create mode 100644 docs/examples/api_features_files/api_features_48_0.png create mode 100644 docs/examples/api_features_files/api_features_52_2.png create mode 100644 docs/examples/api_features_files/api_features_53_1.png create mode 100644 docs/examples/api_features_files/api_features_54_1.png create mode 100644 docs/examples/api_features_files/api_features_62_0.png create mode 100644 docs/examples/api_features_files/api_features_64_1.png create mode 100644 docs/examples/api_features_files/api_features_67_0.png create mode 100644 docs/examples/api_features_files/api_features_68_0.png create mode 100644 docs/examples/api_features_files/api_features_71_1.png create mode 100644 docs/examples/api_features_files/api_features_73_0.png create mode 100644 docs/examples/api_features_files/api_features_75_0.png create mode 100644 docs/examples/api_features_files/api_features_75_1.png create mode 100644 docs/examples/api_features_files/api_features_77_0.png create mode 100644 docs/examples/api_features_files/api_features_78_0.png create mode 100644 docs/examples/api_features_files/api_features_78_1.png create mode 100644 docs/examples/api_features_files/api_features_91_0.png create mode 100644 docs/examples/api_features_files/api_features_93_0.png create mode 100644 docs/examples/importable_variables_equations.ipynb create mode 100644 docs/examples/test_definitions.py diff --git a/docs/api.rst b/docs/api.rst index 9642cbb..9bce0f5 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2,6 +2,14 @@ API Docs ======== +Jupyter notebooks with API examples +=================================== +A jupyter notebook with tables of importable variables and equations can be found at +:doc:`examples/importable_variables_equations.rst` + +A jupyter notebook with use examples for the API can be found at +:doc:`examples/api_features.rst` + Variables ========= @@ -95,3 +103,7 @@ Internals .. automodule:: essm.equations._core :members: + +Bibliography +============ +.. bibliography:: refs.bib \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 163e0b0..b840c27 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -94,7 +94,8 @@ def get_attr(obj, value, *args, **kwargs): 'matplotlib.sphinxext.plot_directive', 'sphinxcontrib.bibtex', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', - 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages' + 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', + 'nbsphinx' ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/examples/api_features.ipynb b/docs/examples/api_features.ipynb index b00d199..4e06d87 100644 --- a/docs/examples/api_features.ipynb +++ b/docs/examples/api_features.ipynb @@ -4,35 +4,34 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Environmental Science for Symbolic Math \n", + "# API examples\n", "\n", - "(Stan Schymanski and Jiri Kuncar)\n", + "This jupyter notebook can be found at:\n", + "[https://github.com/environmentalscience/essm/blob/master/docs/examples/api_features.ipynb](https://github.com/environmentalscience/essm/blob/master/docs/examples/api_features.ipynb)\n", "\n", - "This notebook gives examples and common use cases for ESSM. The ESSM package documentation can be obtained from here:\n", - "https://essm.readthedocs.io/en/latest/\n", - "\n", - "The code is openly available here:\n", - "https://github.com/environmentalscience/essm\n", - "\n", - "# Installation \n", - "\n", - "See the documentation for different installation option, but the easiest is:\n", - "```\n", - "pip install essm\n", - "```\n", - " \n", - "# General Jupyter setup\n", - "We will first setup the IPython notebook to nicely render the results:\n" + "Below, we will import some generic python packages that are used in this notebook:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'0.4.2.dev2+dirty'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import sys\n", - "before = [str(m) for m in sys.modules] # This is to track what modules have been imported in this notebook" + "# Checking for essm version installed\n", + "import pkg_resources\n", + "pkg_resources.get_distribution(\"essm\").version" ] }, { @@ -42,7 +41,7 @@ "outputs": [], "source": [ "from IPython.display import display\n", - "from sympy import init_printing\n", + "from sympy import init_printing, latex\n", "init_printing() \n", "from sympy.printing import StrPrinter\n", "StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter)" @@ -54,127 +53,30 @@ "metadata": {}, "outputs": [], "source": [ - "import scipy as sc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Importing variables and equations" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ + "import scipy as sc\n", "# Import various functions from sympy\n", - "from sympy import Derivative, Eq, exp, log, solve, Symbol" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ + "from sympy import Derivative, Eq, exp, log, solve, Symbol\n", + "from essm.equations import Equation\n", "from essm.variables import Variable\n", - "from essm.variables.utils import generate_metadata_table" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import essm.variables.chamber.insulation as insulation_vars\n", - "import essm.equations.chamber.insulation as insulation_eqs" + "from essm.variables.utils import ListTable, generate_metadata_table" ] }, { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
SymbolNameDescriptionDefinitionDefault valueUnits
$A_i$A_iConducting area of insulation material.$$-m$^{2}$
$c_{pi}$c_piHeat capacity of insulation material.$$-J K$^{-1}$ kg$^{-1}$
$dT_i$dT_iTemperature increment of insulation material.$$-K
$L_i$L_iThickness of insulation material.$$-m
$lambda_i$lambda_iHeat conductivity of insulation material.$$-J K$^{-1}$ m$^{-1}$ s$^{-1}$
$Q_i$Q_iHeat conduction through insulation material.$$-J s$^{-1}$
$rho_i$rho_iDensity of insulation material.$$-kg m$^{-3}$
" - ], - "text/plain": [ - "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", - " ('$A_i$',\n", - " 'A_i',\n", - " 'Conducting area of insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'm$^{2}$'),\n", - " ('$c_{pi}$',\n", - " 'c_pi',\n", - " 'Heat capacity of insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'J K$^{-1}$ kg$^{-1}$'),\n", - " ('$dT_i$',\n", - " 'dT_i',\n", - " 'Temperature increment of insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'K'),\n", - " ('$L_i$', 'L_i', 'Thickness of insulation material.', '$$', '-', 'm'),\n", - " ('$lambda_i$',\n", - " 'lambda_i',\n", - " 'Heat conductivity of insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'J K$^{-1}$ m$^{-1}$ s$^{-1}$'),\n", - " ('$Q_i$',\n", - " 'Q_i',\n", - " 'Heat conduction through insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'J s$^{-1}$'),\n", - " ('$rho_i$',\n", - " 'rho_i',\n", - " 'Density of insulation material.',\n", - " '$$',\n", - " '-',\n", - " 'kg m$^{-3}$')]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vars = ['insulation_vars.' + name for name in insulation_vars.__all__]\n", - "generate_metadata_table([eval(name) for name in vars])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "eqs = ['insulation_eqs.' + name for name in insulation_eqs.__all__]\n", - "#generate_metadata_table([eval(name) for name in eqs])" + "## Importing variables and equations from essm" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from essm.variables.chamber import *\n", "from essm.variables.leaf import *\n", "from essm.variables.physics.thermodynamics import *\n", - "from essm.equations.chamber import *\n", "from essm.equations.leaf import * \n", "from essm.equations.physics.thermodynamics import *" ] @@ -183,12 +85,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Plotting" + "## Plotting\n", + "Below, we will define a function to make plotting of equations very easy, and then show an example:" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -197,7 +100,7 @@ "
" ] }, - "execution_count": 10, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -394,9 +297,16 @@ "plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To manipulate the figure later, we save the output to `fig` and then manipulate `fig`, e.g.:" + ] + }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -406,7 +316,7 @@ "
" ] }, - "execution_count": 11, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -424,13 +334,13 @@ "metadata": {}, "source": [ "\n", - "# Creating new variables\n", + "## Creating new variables\n", "To create custom variables, first import `Variable`:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -453,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -470,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -499,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -529,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -572,12 +482,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Variables with expressions as definitions" + "### Variables with expressions as definitions" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -589,14 +499,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAArCAYAAACNWyPFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACbUlEQVRYCe2X4XETMRBG7zIU4IEOTAcOdBA6AEowHYQaoIPQgukgoYOEDpIOIO7AvKdoPbJ8dnT2wA/GO7O30mq1n7S7d9L1XddN4S/wLLcR3Xf4N/wSnsDSYrVafXtqjnwysZMhQWzoLOlConMhj/Bd6MbIMyYGLaNRSxw+oPsMz/q+d9ejqAR5buJtNnj/nGE9PgYk5u7ccRjU8kWt2NO/yGNXpQ3hc2fmTHoF/yK8X1MvHpFA+hruSrwAJv4q7JWQAPfwNPS0XcRG8QztxOReYii5MsFN/DmOlDWVZe7YAr7GxwT7FNo+r6hDqTNXdYPuHbKZmGv5u1sX5Xs1h1/HooZ2wngbuVosf8C+uJ90mgEFWdNRIHgxNIblfO2xaLgIxpZnhe6QpiHyE1SSYQ96486OBTGx5qOkt7ljKAVMxWLDsjPp1mUqY+QlW934htV9bJxryJxvRfrJ0bntO3junHV1ofhrdGy4mhZ2AmkKUxidwhWRaJI9VulgaLI+wIiXsT+9jKMC9x+XMIfMFF7A9zClkdiLQVwuUqjoX8CPeVzpJ3+Y6jMi+ljH3fg6dLXEJp0jtb7u7zvjPfWkkE+9/GTlXhZcQH38btjZOSjxABi6hxaAg0AywE8AbnTQQvvCtTUfAHOwHAOgk+ZwAeAl4SM8p+1loZlaQCYZwF18gAXYXa5D0Gx98NqD7RT2C+1tvr61q0/XnV3zS/0ggAY6hm1s/AbkMYEdW4OXTut2S7jwtUWGTWoK20EgrNTy9Xe7/JcRdJjqrUUf65bPiiGTZzFvSG7lhAnmwkraezdm3FAFiNL+YI7+yfH7B6RLJOJ4TRnhAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAqBAMAAABSACYXAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABDUlEQVQoFWNgYBD6b6TkmsAAB18YGJjL4DyOnwwMXL/hXO4/DAzcQCEoYP7AwMAEFIICfgcGhvsBDLyR0WAD+icwcL1kYDh+gQWojIFhv+bM6AQGtkIGVgMQ1z4BRLJ+Y+DbAGL8AxEM7AYM+Q1AmuMriMeQP4FhPYgGWQsE+QsYVLguMDCwfANzmTcwPuIEGuH/CWwCm/aOS3vAEgNC/EcB1HbCpv9ODAz6Xxpg5gJjiWExMCgggAcYJYwLYDwGzj8MbHPhPAZg8HcieAz8DowBSNzzE/Y/QOLO3836C4nrL8ALsgoGPgPjrQHGYeABJozzCnAu5w8GBj5I1IDE+D4gp5VUUCzt+28LkgEAHQpRBYpNYdsAAAAASUVORK5CYII=\n", "text/latex": [ - "$\\displaystyle \\frac{\\text{Pa}}{\\text{K}}$" + "$$\\frac{Pa}{K}$$" ], "text/plain": [ "Pa\n", @@ -604,7 +514,7 @@ "K " ] }, - "execution_count": 18, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -615,14 +525,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAxCAYAAABnCd/9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFPElEQVRoBd2ai3ETSRCGEaUATBHB+TIwRwTYGRiI4CADqIuAMhn4HMFhMjAXAZgMTAY+nIHv+0bTWyOxkrWqWWlXXdWa96P/7e7pndXk/v7+UQ2aTCZHzHMG/wF/Yt63Nebd1RyTWsCEAAAk0i+Z93PUjTF9XHPTgHKc5/tSc95dzFUVGAQ4gX+gLXe7EKbmmrWBUWNGry0CPN0UZczmkLHvYbXjFhYQHfAHePS0ETDZl1wi/TPM5ocoUHeV0dgLjelsSgBwAACC8j5AyYAI0Pd98C/K0xkYxhirCM4nuKS98S8KtQkwrxj3pdSMrEX6nDAn5x41dQImA6C2fF+QWm15BFh74V+UpRMwDsj0NTI5fU2awAK8U1jtGTV1Aiabj1rRCA4Ibyh7TKfTifQ5/SJPcZzU+V0pm9MF4obWCJSxjE7ZOk+m0ZtUZ2AQfKuUNdJXjdO8cDyI2Ifa+w02fPABVaHBAxNSApBv7Wrjs6iLlDZPQ687fqsFTicfExvZdorg+jBpmYme0+Zpqb+rQqMABklTOEC6LE6Kw+BpFVSYZCzA6GNWxUnPMyDLgMvNHRJs0gUHzWICX7ftk3q1xfbztvZN6wavMav8C22eVGrJRwCoese80bUDG9kmhX85BAhjpSCd7Q3s1Ue1YzomH/xxDRhqhOA86QOAAGIxnVChfe6UENh9tBLAuD/vkX9v7dBT5XTVpnpac+1pAeWh+GXtubp2HLrzDf/ijeFKAsRj+B3c9CWvX7p2IOkBfGMaE+W6c9I0jvQanj0MNGawRzUCKJSmdPDQPulzZp+yP/l38FWMJe98x7lfOO+jXBaQZq1BagxPzaeoEGFKF5QVspVoM5b5QKqGld+1DPzKoO8f22HJE86byPLSrRk7TV0G9sNmO8Uk9E/CAsxLRCk/DQuU71FBT6MvFV7R/hkNpPZtQFqpMSx0BF/BP+G0AKl2e5/rbLvMbJ1c1mmz1pXxR7GX6lmFSxrCmpqK7JVE0K2Zoq0BgmpfO9y7vuhgLf/CAG3vFLRJkgome7YcTP1P+CbKkVInoG+i3GfKOsn8XAMyKiY72yN537wPi7L7TWXS8C8Cm/Y6JbOSQM/OUrzyO5kq2xB9tHGfzuInFfu42bBry32SpvGW/RgRu6Z5H0wqs+9yH8pwRru3jtb7VdU697vWJ1pVLDklJhHZ0pk5hxTgtbUtqvNsRA+/CK5prOWf6OuDjof9y25W+pjcW6GbCZjw719mmdmn1U2/os8ov07OvSuhEZrE4od6VWvlH4EYp73+B2hbDdsL8KtnGx+DcGqGUWOnD/UZzGX+pfqGtzVhMiWEUzBB2eRD/Sr/si05qq8TPsY4o+2pz/mXJavrnKU2/zJrGeFv8jHZR3zDR4SQEQTpO06yB28VL4/dK/+ioNNsRmpLGQXalkzkAVB01m2a5vg5Yh0DLJ3zbW7wU+5cPDQ3YMeFabG+gU5Jcx/qafDYLQMk+67lXwDFF8AGCMrGO4tzOd9gyIuqOzaqf/DpJ8pP12AutEihypez3DNFiuaX+hfmcl592OJR3hYMOtcgKHyM5nABh9Yo6B2sQNapLUl4BLVOYeW4FhBANeAr/T6SNpRB9rRrgKHOl5mt3uE2G1ozMxfgrTmmU7cAEmCSP6EsmP9SftJpoi13fryF9UILY6m/yCw1vei067R0vr3sBc34jJacwDpgvy1rgulup5cFK03auykt7hOAjI1eAFg49sUugyj3akqA4G3fZUhK3ssjrzAGDYr77d2UWENwDO48+TyZXsCDp/8BAYepedKchWwAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEUAAAAxBAMAAAB+EHnNAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMrvvmVREEIndzSJ2Zqtw62vAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB60lEQVQ4EYWUP0gjQRTGv90kbiSJW2ifA/sTrxCuONhOORC2FeQMWFmIKeyzhYU2oo12EkGuE7c7sDBR/HNwh7E4/FPd1iEkIkrEwtxsMjve7JuJr9n3/b43s5s3kwfwMEadKNU/bVfvRc5SMcr0zzW9JZw9kWmSzNTxk8YSeN4320KoE+sLkmW1JWiyjUFPKHWS+IBSQW0JWvIwJ4QmKbmop3yNybFZze2k+5fAahwfnb9TI9u51kOzPikzouwyMPrOEec9YK5KlkqgVgBqnoSIGGOkVSBYAi9A5lEiRBjPwIxHsASyr6srFxKhglylTizuAXuDrouTvMPIwCUOrW0sX+7G7a4O24O0XTzBd2vTUN/hg/AYfiyggV9Jx1C++GunEW43hQl4CTcbhEITW1Yb1ZJv3oS7go2Dyqdm52Od9e4tdlP3OT/h5xd7yHZXgc/A9FsFMHL25wwDjVkOl4pB94Cu/6+J5WvGFXLsv9zvAPYMYIj1oRBbKyQfBwllH3gVHwcVR6wiSTQO/rrEEiAaB61uqwSWkmgcsPZog4+D3v29/R2oCvk4CNuDbGA67EGCj4Pu/az4pvLLe+Ng/eCFXYg72H2+vLf9OobJe+LgG5pxRHTy5z5hFIxTJJNMkCrLhKrM/qnyZ/0Dg7KNiZG4tPAAAAAASUVORK5CYII=\n", "text/latex": [ - "$\\displaystyle \\frac{d}{d T_g} P_{wa}$" + "$$\\frac{d}{d T_g} P_{wa}$$" ], "text/plain": [ " d \n", @@ -630,7 +540,7 @@ "dT_g " ] }, - "execution_count": 19, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -641,13 +551,13 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
SymbolNameDescriptionDefinitionDefault valueUnits
$\\Delta$Delta_PwaSlope of saturated vapour pressure, $\\partial P_{wa} / \\partial T_g$$\\frac{d}{d T_g} P_{wa}$-K$^{-1}$ Pa
" + "
SymbolNameDescriptionDefinitionDefault valueUnits
$\\Delta$Delta_PwaSlope of saturated vapour pressure, $\\partial P_{wa} / \\partial T_g$$\\frac{d}{d T_g} P_{wa}$-Pa K$^{-1}$
" ], "text/plain": [ "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", @@ -656,10 +566,10 @@ " 'Slope of saturated vapour pressure, $\\\\partial P_{wa} / \\\\partial T_g$',\n", " '$\\\\frac{d}{d T_g} P_{wa}$',\n", " '-',\n", - " 'K$^{-1}$ Pa')]" + " 'Pa K$^{-1}$')]" ] }, - "execution_count": 20, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -672,13 +582,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Linking assumptions to variables\n", + "### Linking assumptions to variables\n", "We can specify if a given variable is a complex, real, integer etc. by using the `assumptions` property during variable definition:" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -701,16 +611,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Creating new equations\n", + "## Creating new equations\n", "Equations have a left hand side and a right hand side and if they contain variables with units, the units of each addend must be the same.\n", "\n", - "## Custom equation\n", + "### Custom equation\n", "To create custom equations, first import `Equation`:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -726,7 +636,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -745,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -775,14 +685,14 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAUBAMAAABhQvLIAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACm0lEQVQ4EXWTzWsTQRjGn2Tzsdl0u0v1ohS7BhFKkdb2INiDqVjwIkm9iZfFf6CioKEHya0HwSylCMFDg/9Al9aIRbB7Ey8SclDQQ3Lw4m3tl1+t8Z2d3c1kk7yQnd887/POzsy+ATDWmc0tmqB41bkKPPtZZNwbY53c3OVeCWg9zHVmL/yOysABID1icooIisEwGvvAZyMiVoEnwFJEBWR6h/LXkx/TM95nIEGmfPxXJGNAPQTGIyqQPaYf33iBkm/6DCRkT4BR+okh64j9AV6LmseSS2+nRSmmG1AtjyIP6T6wOdMrylR2BDi9Ks20PN1v0ZM3nMEnhmZAedBXiXTb1z5c+lq3fUbFgvKdTyZs4cTrN1gsepnK+a3DclDgjfdcGvx9ANacnQpvZHeyetfk5kpx8Imxa+K07+FOjLQJJmp8Jte+QQ2/2TWTq/Rcnhn4jYErdDNWaGOQYZc0bTKkfksdI8a27MW/AKioPd6diLRHxzNEAZJOU2pDHoqLeJ4jZOolijNvDeqMI7YNDwF+h9dZUv5BH7mI2NLTenarDLyoQmvAa0NuT+ah6SavZG1IjWZIRfrD7JsBMjGMLN3Php2KvdfTF7MGEk5cX6Uka0NembawaVp8kQT1Eh2oIdWAJFucIxPDSLi0Q/vLp3fQnKSF28gY25SUWKlnbzlYj5U9TBb2bJLPQTPplQYCJAiDPDoy8zamsIrRGlYgWfPAWuFgyrd/BJpn/UV42RpZ/RAwkIKxhG20ZJxguVwq99vFypfIBVUCBpI/qi7t8VQGNzEJl52LhWAXEMmdBZ6ni+xiIPnjiIFbaD5Hc6eGO44vCnYBKVnyDb3YFYfToErVUPJ+hYDD1+hmBLuAUBfqZrBgF7tlwyla+R/4trDIL59RwAAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle P_g V_g = R_{mol} T_g n_g$" + "$$P_g V_g = R_{mol} T_g n_g$$" ], "text/plain": [ "P_g⋅V_g = Rₘₒₗ⋅T_g⋅n_g" @@ -808,13 +718,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## New equation based on manipulation of previous equations\n", + "### New equation based on manipulation of previous equations\n", "We can use the above equation just as any Sympy expression, and e.g. solve it for pressure:" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -838,14 +748,14 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI8AAAAwBAMAAADa0TQAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADEUlEQVRIDb1W30sUURT+dsfVmVlnZ7EeiiSviwTig2ZEkA9pJPQSrhFB+DL0D6wklPUQ+yYU5CISiA8u0bvLmpEIuW+9ikRBELuvva0/+6Vt587M/pjVubOj0QF3zjnfd87eO/d+ZwVE1laKXbpYT8hPxEr9XT/r0+J4G/jM6ihzwFNgtC4rDuXfQPBHHYdB2wXa67LiMHwAROiv1uQoAr+At7U5T18aBxb7nDSZFrkH5JxZj0hnUB8c5rQUrFzrzNfVscPwEZnpzuxu0pG/X6QwH7dyijSAxLoDdwnWDJw2HFhrgcKOtJV7FhlEPmn54s8rgJ5yUBS+mF7DyhmJHDocsFuwRdtgDlCKUkjXyLJFoKvsi57yJh1aHIHR58vhbBKYn4NOr4RfI+DsKsMdYLMZgfmsqAthYbqLC5nmwIdoy4UwQ1MuGJ2iNL9GCDMpjsdQ9xRkcdmjUVORVpT58uk99FwohdtQ2BKVSHSNkF+X0to+lMEz2gGuihuFRraiUAYy6MEUImk8gZQaAGZGdnqA89ANOkKtMx0ogHcG2kr9sWHDdF0+JrGEvIwDJJKTSZszQ80tU5g8bnk7tNqHdvaoh1akNZ1ScBPdKGZsxivEbE9lQWa6Mo0WlWTuaq0Mt7DxEhsradzL2bTQylC5YGw2arrhfToDn3OKF06WG6ElaboSnU2QmvkyjamDdsEGXlueTpmyDG3M+6ENLRs26+O5u5Y3nYL6rVw6e4PbcDn09VzrnhszfFW4kK+5dSn5MHrP+OPyBX7TsqllU8xUar2j636bcD6/RraYuXN8azIVx8V8/B68kiTO5cPFzMMTW1XMglZvSjR4XnyPCyioilnAaqY5AZUJGLTDqpgFvEeEBQW4CVXF7M4cIeidO0xIjZhFvN51aCkRATViFvEWct47E9VXsI6Mx84qTA9nOu6xM4/6Cpzo8zyzClfo6IV2Id4wGNnjZ8Z/9U9o0rbxTwYFQnzknHxQ0P8hjBr930FBX+hpDQ0Kzy5EaGxQNNKp5le/IboLqcFB4VJdk3YZFH8BPKzacURMNHkAAAAASUVORK5CYII=\n", "text/latex": [ - "$\\displaystyle P_g = \\frac{R_{mol} T_g n_g}{V_g}$" + "$$P_g = \\frac{R_{mol} T_g n_g}{V_g}$$" ], "text/plain": [ " Rₘₒₗ⋅T_g⋅n_g\n", @@ -853,7 +763,7 @@ " V_g " ] }, - "execution_count": 27, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -875,14 +785,14 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAxCAYAAADEDXt+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJEUlEQVR4Ae2di3XVOBCGE04K4FHBQgewVEDSAbAVAB3AoQIOdABUwKMD2Ap4dABbAZAOsv+nq9GVZNnxfdm6ieYcX1nSSBqPfs2MZBMOz87ODhp1NXB4ePhYpSe67vvajz696lOSD9Lfmyg/+a3kvKlBf+g61fXVp0qC3J+jMnhv63oluZ8pnZUOG/iG9a/JZXV+lp4AYiA/6d9UQN2DUDHxjeR4yZA5mFT+R8W/VX4rFknlr5X/pvJZFw0yXYkFa/epBjRRWAno0yJZ/mryfiqHVbkf8S0Zpru7WQAeFg4LjXw5sWCQfXZq4BuegmNfbS435zZw4vImJw/6zsKQICZ3qQ5Q4p5npwa+4SnA1Z56K5dwauKJBbEwuN3ZLInGLrlPCxFKlu+72syyWBIFKtNivlwjUV4AI977qMlKYjoPvLeqmzXei0RNbiVfMd5LmM7JqA+sJyBmgdnmxDZfxJE/pJdXStemo7VbXvCGUr651APds/PFXd3VxQRgbe5J+d+VTkKSgfEB/H2Ne9g3qPgAC7zv+3hGlp9onGfqD9fNJuWTgc3L8kcpC3Ntq9/A1z8TFjc9koKDm5LCAeITXWYN+nvYYg0yaGxAEBZFT/cmdyne62mSFmscxvjiSwEzoUds5a77OkC+Nl1Zu+XFb2jxXgAej6xJwOoxOc/JT0zIVIrjYjGG4r2Yb+j+p57zo0AIuGK3a20cwMWzkeVv4DN1dlMU3JloTQiTAVm6yE3zC+g5Khki5AY8yaIZapDXRW0NZLkeAPhGwGPMo3zgltcubBnvlVwXAIB+L5Llr9rhku/oAiAcZ7jJU3pLE/pE9U91DxE7vihZDvFwaPxL1w1d+eEx/eHyi6S2LAis1bnxnpeVjQNjQXclT7KxUlkfyIh7nRzq5ypgVYps6Cb04+XhLdAd+FSHXu7Ar9Q9HA/YrkgHUgsgYad7O9eNygAHdU+tTvdMgJIDwMcksNt8HNWT/6DL+OifSUn0rjIm59jK4dHl+lHKxP6xulIKry4EYVOS9B3nVZ+Mr7zbVMQ83IuQ+2VcrjzAo9KexdUbX1bHOGxUnCy6T56vuV1ppED/UCallVyLBeKumV/dxz7F4gASXmvF52+s+tcqW6x4WULlk12i2rOZwF3GLg4ei+EA9XmHw2a54j7UbEleThZQvmFKrLznQ+6kXHmstjsrFA9gf+d5XyhFxtjlwxu3f0e9LkdHdtNS524BwN+6nGuVMrE8rNwAJN0TiLPzO1GqxIE07ARVhsLpx5Hy9HWagYpJyif/ocoeuUbLH9raAgCE8UQ6LvUPkHC3XE5upf+qnEn+onGDbMpDBpAAAl9mwHVM+qG/fDFQx7PdVP8Aj0Vm8hGu0Ef8Noixgi50f0P8y3GVScyzGOgUpWNauXhg8nZhOunQmd28/WXPSy+4quCudZ+7HiZVanJuLeajgPe05qKwOpQ5HqWuX8sb36qp2gPW4PLpT9egOx87hvrh6xoXNig1+QNOVBZCFfrsWD4VssrfCMU8OObVzL6yC1IdgPxP6V+qN1di1Zc2lT4AFsoO1kD53PVgDcwt4t6Nl5QJM3qrGz59snrXr8YAzFZmvKukX8SMnEbPdWPyWNm6KVj47RvznCwkhw/JjVGLrWIXfDQQo5nvPqGwfHROh7lZV9GlJSY1UbDylMUuFp3isrFAL3QZ4bJeqhxwsNN9p4mL+8Ig0KbjelU2muhT/TA+IGYc5Itd4+i+CoyEDezqsYC4V+7p2+U19tLlqjBxuao0k49gWL6w87I6UpHVJzuhmKfdp+FMrfrQXCZhwpRyXgFJBXKuVoL0WT5cCbTRKlx00X6n0oCsEBsFYndHuufYhE3FJm7c97Z60on5fBe41KJAPIDqEPrNADh9Ny2pUAO2UyW+5Mjn3lwydsAncPXGe36lEHfM8m8AND5jszBWoa9aJL1vBVbpaN95pQdiLt7AVEEd8Ekqm1xWCJNtxEohcFy+HrGaiVIpLw7cJxq1DbMrDXQ+JhXgiOMA4DVNttsm72rwmvrVc7udVE0yXXRZSuBjEghCiQcaNQ3sTAOJ29Xq7433cgnEi3WEf/xXDGJWO9w37hwXzq6ZDQwfbBY3OKoLpLbrxHwsJM7QGlWmgQR8kg1AQWE7vsgWf+0z6zMA5V00u2B3wk1e5bht3pW6IxsPPF7PPQBsygNe8unhowpKpDYt5ispZk/L8nM+XvdAXxdJ+VegwVqt/BWD2mC5+Ec3sZXDMl2a2LKs0ctZ6sAnML3WhQUyt/tWed5iFElgMcDgzuJXQFjOGFjpVwwHBw9VHx9M5/zF8VrhBdWAgFR8xTamXCohbhv1FYP4iPXYzMRfbgBE3g9TF75+GDP2ReeRPlj8GAR0xoWuOh+JqgyDwTzAw6syvhtce06nbLuRkHpQZy0RWES8p9vwfhhQBaB5HpTjypSiNBpi/cJXv9a+pU6ntmD52yq9cyX9ofvwmdQQb011naMWPcRokmsGQLw9YOWxabiuixN0l9eDxi6ZnS5Ag58vN+AnduRIp4o/XCM5qiPpjAUL8K71CScegLd3O/qNwNenjFa+PQ0IWOZdiv9QXPW453wTtz0BdthTvtvd4VCt6zU14I6hBDK8REK+jE1dvMlLeGrONPDVPDsL2ewMtAM+VfM95d6efTbw1Q8+4meI+DqQd7fxl9Chbl9uGvjqnyk78A/v2vfd3ZrKj+ympdVqoOR2cbd7t7vNNdwsX66RyvICmb16dDGfrB7np9v6Bz+zPm0D36zqHz24OxMV8Dh05u++9P3bmtEd1sDY3G4Ns3C+DA58YuNro0F36y0j8eEv32345M3nq0ka+KqZikFBLO4j1jM33Gkg4HHgHMCmPO+DrW2Hf+6CBr65Z2Dc+Lzl4E/Q9rpbAY2YkE/Wwq7Ydx1/ReSL6kja67U65mFjKby7fSaABvCpjK8Tqv23OG3DsfG0V9MBoAuv2QQ8DqVPh9z03JI38M09A9sbny+FYnquTK+bjhnnum8x31ya3/K4snC7/ANAW5Z20V2L+Xai1vk7ldvlO8BJ/6+QVZ+6ud1VNVYhv4BW1R8AGqui5nbHaqp+vmr+ANBYVf0P9gK4gnBlDdoAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAwBAMAAAD9f7XoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADMUlEQVRIDa1WTWjTYBh+0vQnada1TBH8/ywijCHODRXcYR0o7CLrPAjSg0HwIIgdijI8SG87iCyMIYwdrMObh5aOCUNw8SQiSCmiqIf24EFPm/tD3WZ902SypDZNtryQ5Huf93mffL9vAjS3tmq8+6SVVr4dr3Yd/WWFnflLwEdmoU4A94FBC+rMFdYA308LlyGyAhywoM5caQNopWurCTFwv4HnWzHHbX4IyHWa6QJ1ehVQzahDL8oQvlXPDVUM7M3xLzP5+nhjZPRIYSVjCl9dILecNDClOx+0zIiJXefMydgtm9CWCrmHszomZL8iYl0zPdTgfgaIKqaYqHXuhKxjweA6OK3Ljm2RhsdMbD5GLm1D3cIL8CX0pqO78IMWOQlu8MGMVMgAkxOIFlHbhsDeFwyBBKIx+S2LJG7KThQlmp/H+SD3OhY6JjH4VV9shPK0bQiJ8UmEFORkRVmVOv2qE0E/zU8u//nDS0TVgIKLENk05fG0DVEu8lmUVYxzD29UfHmJet7UAgOLMYg9eXRgBK1Z3AOv9ABjA8sdwCFEZbwDSvsQUEKqWFNrq3bFz8tNhTGMaZQFbCCdGc4Y9DF6iWGtalqW9PYy9f/uJt7wGVmgPu4S0Y92LOQN2hTimwn+TA4Ha45ARS1MBaWJtTBcQOkRSrNZXFYNcmC2bzNNSD1JZWuOtE6rtc1KCZqIOuNpFX0kug2LsHCiPi1K2L+DXh+2QyJ9M3J9fFRB+LsZFs/VLGlGnXpz7RMp2SnZCa/XXq3qymg98MfJW11wBPp4AUatuFbo1zxjDpnWdm3aNgT0WhH8JmhHfmfm1yQieq0IJIXKztQAKibawdRrRShLBc8b02tFusjvkZsKSgNLWQjzd2yJeq0IFUdf2dL0YDpBzyl7ol4rWjqeOfn9CQ2RGLMXdBXVPgpSxlWKPdlH/wmf7CnuoiJtXeYuxZ7NrXk7YtBp9XTECC55O2IqUJxqPyluo/PXKYObLLjNa8jvPU2hAk41JLgNXFGpQG3grNu8hvw2inAV7Lx2bn2DyATtSHtnYeZj3qlpSqnxmLeCCGU8FSzhqad6eL//0v8E/wKw2fO+j5j4zwAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle P_{wa} = \\frac{R_{mol} T_g n_w}{V_g}$" + "$$P_{wa} = \\frac{R_{mol} T_g n_w}{V_g}$$" ], "text/plain": [ " Rₘₒₗ⋅T_g⋅n_w\n", @@ -890,7 +800,7 @@ " V_g " ] }, - "execution_count": 28, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -907,13 +817,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Show inheritance of equations\n", - "To see the inheritance of the newly created equation:" + "### Show inheritance of equations\n", + "To see the inheritance (what other equations it depends on) of the newly created equation:" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -922,7 +832,7 @@ "(__main__.eq_Pg,)" ] }, - "execution_count": 29, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -933,7 +843,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -942,7 +852,7 @@ "['eq_Pg']" ] }, - "execution_count": 30, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -953,14 +863,14 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAyBAMAAAC0QsTeAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUIhAyZqu7zZl2RN1RZXl/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADgUlEQVRIDa2Xz2sTQRTHv90km2yTNtVi0YuGglCk0BzFSyNtoXhJjt6S4lVs8CBVrF0K0lAKrXiwYsEexIo9NAhSkR5CQUltsfE/CP4FUVv7yxrf7O5sshun2V36YDNv3nvz2Zmd3W92can6E6dkUrXagc7BoVPCITA40IGuJrSxau75M3tN8kKuOj/duDC5OQ8HwHXVBuwGLgKrtijggCf/AUK/bSNV+I+AcVvUES+yA7TTUW9yFsFfwKf6mOY7mJ/SAfTPWUfKNOVdoGSNUs8BL6rCd75hIFrKeqytZ3BrzUw74I1OFY8y5gDm3KzQTzKvxyRlAemE7jua33YKD1K8XmvbytRMxPXYrfZFJDO674j3BIjGeL3WSmxqs8Y5UukSJsy0g/Xu09pUcwBzlCz90O2nWz8wzX0H+yHv0fbmEVy9vRkpZoDebkQT0G4/4O6Wio/AXgDB3iKDNp9fhG7lvkIg+C3b8jiiorUUyo7QQHb7IaIqeZyFb1dCES+c8VorNL/CwNBXREvhGD5AUjdopEK3H5IJJe4/hrR4z7+Dp4544ZX9LKSFAmYwgvY4OqHEFoCelcMZ4BGiKdps/1Q8WAY7gbnesep8btnYMRZvtC5sICljB+lMV8ZI99A5dJNUunJk5vU7pCWcM5L/a/wVmuF9Ca8xiUrBqLiKnOH51JDKXM6TScp8JCRCa1PxCsOXMbwex7uSURZeX+ID1q5kmct5kWParUZ55NXCtibGLRlWxHlKhRSDmK7Mr/oWjQHDuKZ5nBelBH/CjZLmjX9pM2VU3Xj4XvM4bzQG33dOuPKW2TLvumk5b3uye42fy814ey3nvRTBqi6M9oDz/tpP5LFv8GT6syJjckGmX783zHVrBo/dfoZcuCVY6w1eq/YwM7mwpl33dB6JSIGGMrlwTbAOMOanB2tyYS2y9L5USeju/MhbgmbHwqvJhZlvdAKkRPCpjQktYuHVyYWgnIXP0BES5S08NH13Y5gVOj474dXJhaicxWcT8MdEBfXzq5MLUTmL95XEyzWft5MAttxEQbxcL7zRvHi5XnjpOeHu1vTFtqaTutHyuDhdvx/iKkumfTdGfUOKLBnqeOApB/SQa28udpg3Xphpm0iKPMwvqBJPJEUeeESj9yHzzUXrmj9eeSIp8soTSZFXnkiKiOfle1UgRdr3qpfvaYEUse/pf1is+IJ7vGmCAAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle \\left[ P_g = \\frac{R_{mol} T_g n_g}{V_g}\\right]$" + "$$\\left [ P_g = \\frac{R_{mol} T_g n_g}{V_g}\\right ]$$" ], "text/plain": [ "⎡ Rₘₒₗ⋅T_g⋅n_g⎤\n", @@ -968,7 +878,7 @@ "⎣ V_g ⎦" ] }, - "execution_count": 31, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -986,7 +896,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -995,7 +905,7 @@ "{'eq_Pg', 'eq_ideal_gas_law'}" ] }, - "execution_count": 32, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1017,13 +927,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Computational burden of deriving equations within class definition\n", + "### Computational burden of deriving equations within class definition\n", "If we solve for a variable to derive a new equation, is the solve() command performed every time this equation is used?" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1043,9 +953,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI4AAAAxCAYAAAAMYZGoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIJklEQVR4Ae2cjXHVOBDHE4YC4KjgQgdhqADSQRgqONIBmVTAQAchFXCkg9BBIB2Eq4AkHeT+P0WryLbk5/dhP/s9aUaR9bVarf7aXcl+2b2/v9/Z9LC7u/tBczxQPPRzPffpM5+SfJcsvkb5wR/F554GvVa8U/zpUyWB7x9RGW33Fb+I72Olg4bdbQCOSVQLwy75oTkDohD8gv1SAXXvQsXAD+LjM0PWgaDyWxXfqPxlzJLKT5X/pfLBAf8kZmSTnyVkdifh4iF5/CvB/1aO3XwYtXtsMNzTXgI0aBY0I/zVA2CH98HD1gBHkn3rpWtmqi5sAxZmYvDgAdsAtRgxvlN1AAqTNnjYJuBgnu68dqkIWouG78POxlStZQfDkMZOmRwzqymNc6U+6wG6BobnjQ8CBxM913wrPowHzZnq1urf5BZA/CX9m1z7VLlooLUAIJvDHGk7KOA3XUsuX5R2Dk87t5xwQwnOzNCOnjlhoeJfKyI8dvkbCe5K6SBBPDA+YD3UuLu5QdWOhabtv7k2HcsPNM6x6GHucKgvDCiel1ulbKrO2nYrgCNBmZ/wj4QTVLuEBYiOFG0X6rH/AA8amwUMgM6Manyn/JtMl2qxxmGMS18KEDHXsXb5y9cB0M7hSeeW025o/k0ADdORANE2CPaE/MABnlJ+S8xGm38Tt2t7/q15ngtAACM2VdbHgVNt5tK42wIchNNYJAkTQRIsfcgN8xfAcpxuC/DNwlcA39ahXhf1NYDU5QA45wINYzytD7Rpea+qmVZK3bN4hJuH5PGv+mHGXimyuBx5neCVvtRiHKn+o54J+EqfUjtWbbjQ+6P4QrF+sQc9zGQyqC9gRkvM9G88rzi5jEV4LX4qhwCV5QCCn+f4EJ1nEdDMH0zTVUMmtLFRQmGBOVHt1+epMhaWuo9Wp2eEp2QH4LC4nGo+RPXkvytaO+jzuqIiQ5UBuLdWThtFR0cpgL21ulRKW0UYwYGu0I7zqq+Mr7xzgOM2PCvA9+e4XHlAQ6XNJdSrrJXuxmscCeC9IoJPqWNzGmnCDmOX7yulLTudxeOqP75fQQucqszMBzuychpRfxxfTExsFmjDrocWgJx1cWcaI6ahbo/B8wv44SEOFe3q28F3pVx5tKW7C1Ib5vpN0eTQTleTy6J5ynWaP4vHrmdHEcOOj+elcgSEQNlhQfPQRoE+oUzPDU2hMl5KVrSC8uzuehljuB2t1I0X8+HHgxfGjPnmucKH9VM5i80dTFhD5YMGsXKVAdRKOz8eG8XJRWngV88z6YYBo0HoBDETOJMkb5GJsChOvVm/TUw1RwAQTJyeARd3IE5uekbwyjqQxe0o4L2TtWO3U+baKHV0LW/t5k3V3wHN+kEP2pZfNO1Ct2GqNBiq9KtUFxNFjdmRUNmHoDrA9J/Sv1VvKtuqNyLV3JxzqvnFJg7VztwtsJPNlGASrS0pYLFwpgc+f7B6Nt2VxgCIVmZt50kv1Rg+LXCtYPxY2SLpTLpPUlQ1ITtt5JhwGkd90U6bGliQ+gvRehny4TKPnf8pEgT+yQnA8HXfBJT4kpGNSZ9lQIM2g7+baBz4i4Gt7PyhE101cuo0TjUUOwGNE04Fmfrghcf15bkp0yFkovWqmNZVjZmim9Q4aujMkwbOaRxUNmFpdD+QKX/nlYC0zJ4ifqcLeuZozUluKS3WlW7Dx/F8YLuTDEBYde7lYAuwPJmS9CwBwIO7gD/FkfzNisabSbcBHDGS9W9UB2CwzUt/5ypa0AGg84SfAmv2tnUeQlNvKzlwL8TN9kpDV7oN4IgLW0xQx+JaANXcWbwS8aVPUqIRO4s2RkknIoHGx+oCC34L4Hm+CoCsQw6aA459CT1KIAUchI6TVb/G7pGNQnpqEqiYKu3UrH+Tm5j64JwBsj++TerNbKO7+i3i4wBo7khKWLMEKsARL+bfhGNeG39afO57AlCUx8xVXvjl+hcfJyeZaZTXgePeJIv1WW9uu71BnYYMCpcLSMBdAEpTnCry8tJM1ZnXJm0k0U6YjljDUJa7NGyjVeomJgEHHC3+kSLHbJxl4jvF+IPm1LTwa8IloYAG6O7Ub+mjemqwqZaxAdmUivc+XijlPqwSVMZ3QNe+Db864H3gaEPjVNWVU02Myb8HZPRR3vlFlu9KZxvaSTbcgfEeia8Nspd2dZmOWTYLA4dJaaLsCi4F+aYWM8WXcfHXcioqAQlIVgCHF8rPSVNBbfgEdRKnxqWAE0/eC2bQH7bF44/9WfJxPqSAkfwBnuo5ofJr0mD+xzyn3NvxVp41yV7ezLYOOv1Kd4hAdvWp+LIXUwEN/NeP4/U5teVnvkFt67yFdXb6BDj2bGLgu6ZJmChjeCHgaJJMPOvkGfGSViSAL0jg9BmuLLyJir8edI3G/mchUzX2SY2UP7tUDe8Ap2iiTLYLaRzrXNK5JGDmKfZxJmeibMZF45gkek5l3u1i1AFH2oaXw6O+5GsTSQFOm3RWX4fW4VDBhSC/QQ++zuqH6pdiMVX9yrdO3QFHhdyyt56ivEaa+3OV+oB95Qtw+pJsmq75Ofg2ZroaLQWahT9XaRDrqaAApyfBZshye8y/TMuaKIEGH4iP3MLpy9Ma1U+RVvbKwU+uJEtKwJuoY4ErAEdlfM47qm/Ai3O85EL30B3AhPdVAs0oP1cpwOlh5ZckeVnrf6J81rTV2g6WLT7OYKLuNpBMFP/o8UARB5nPVfB5RnffU3ycbuu5tlYCEN/xjO5zlWKq1gaJ5sACyWQ+Vymmqrl+6y6ZxOcq/wNVMt3bgUz/uQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI8AAAAwBAMAAADa0TQAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADEUlEQVRIDb1W30sUURT+dsfVmVlnZ7EeiiSviwTig2ZEkA9pJPQSrhFB+DL0D6wklPUQ+yYU5CISiA8u0bvLmpEIuW+9ikRBELuvva0/+6Vt587M/pjVubOj0QF3zjnfd87eO/d+ZwVE1laKXbpYT8hPxEr9XT/r0+J4G/jM6ihzwFNgtC4rDuXfQPBHHYdB2wXa67LiMHwAROiv1uQoAr+At7U5T18aBxb7nDSZFrkH5JxZj0hnUB8c5rQUrFzrzNfVscPwEZnpzuxu0pG/X6QwH7dyijSAxLoDdwnWDJw2HFhrgcKOtJV7FhlEPmn54s8rgJ5yUBS+mF7DyhmJHDocsFuwRdtgDlCKUkjXyLJFoKvsi57yJh1aHIHR58vhbBKYn4NOr4RfI+DsKsMdYLMZgfmsqAthYbqLC5nmwIdoy4UwQ1MuGJ2iNL9GCDMpjsdQ9xRkcdmjUVORVpT58uk99FwohdtQ2BKVSHSNkF+X0to+lMEz2gGuihuFRraiUAYy6MEUImk8gZQaAGZGdnqA89ANOkKtMx0ogHcG2kr9sWHDdF0+JrGEvIwDJJKTSZszQ80tU5g8bnk7tNqHdvaoh1akNZ1ScBPdKGZsxivEbE9lQWa6Mo0WlWTuaq0Mt7DxEhsradzL2bTQylC5YGw2arrhfToDn3OKF06WG6ElaboSnU2QmvkyjamDdsEGXlueTpmyDG3M+6ENLRs26+O5u5Y3nYL6rVw6e4PbcDn09VzrnhszfFW4kK+5dSn5MHrP+OPyBX7TsqllU8xUar2j636bcD6/RraYuXN8azIVx8V8/B68kiTO5cPFzMMTW1XMglZvSjR4XnyPCyioilnAaqY5AZUJGLTDqpgFvEeEBQW4CVXF7M4cIeidO0xIjZhFvN51aCkRATViFvEWct47E9VXsI6Mx84qTA9nOu6xM4/6Cpzo8zyzClfo6IV2Id4wGNnjZ8Z/9U9o0rbxTwYFQnzknHxQ0P8hjBr930FBX+hpDQ0Kzy5EaGxQNNKp5le/IboLqcFB4VJdk3YZFH8BPKzacURMNHkAAAAASUVORK5CYII=\n", "text/latex": [ - "$\\displaystyle P_g = \\frac{R_{mol} T_g n_g}{V_g}$" + "$$P_g = \\frac{R_{mol} T_g n_g}{V_g}$$" ], "text/plain": [ " Rₘₒₗ⋅T_g⋅n_g\n", @@ -1053,7 +963,7 @@ " V_g " ] }, - "execution_count": 33, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1069,28 +979,28 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2 µs, sys: 1 µs, total: 3 µs\n", - "Wall time: 9.3 µs\n" + "CPU times: user 4 µs, sys: 1 µs, total: 5 µs\n", + "Wall time: 11 µs\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGsAAAAUCAYAAACKy8MYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEGklEQVRoBe2YjVFbMQzHE44BUroBbADHBMAG/ZigsAEcI8AG0Al6ZIPSCQpsABu0sEH6/73aL/6Q3/MLTaG96M55tiRLsmTJscez2WwUwng8PtT4QO2dw1/r++T6fDbVbtRONDfEQ3sVoDVMZMiZMwZ7Aey9+921fzVvW5Qj8R2FHIE8v15kIu8h5KvtV+hBVG63FI6sJmaieFugfRXtUW1i0V8Sh01qV6ENGhM41rMf4tO+6Pdq6VzksdZDz68+jlx4/Zpb0pPqjuwuBYodxuLOvIHhV3iyDvpxiH8Nfdl0oZZtIuFw7mPJRtGOHU/qsCtrnnDgL0rySnjNKenptXtNky3Yd0gyyAKfom8t4gvjPkj/rWED5XyiEuRtb1kcjhJnlTU2poUHx5FRDT16eu0uBYszi6xjgRbsOmQpmNacv4XDiZtyDOXLAgvPOXWZMgcyfqY0jX+AcwEwyCbK1OM4e+1eN0WqtgtvHsbOOHbbZUcwC2KXj5ZNOwUtlHYgyhKth+ygBGUgWU+ik3EbGXE08lWFTI1kGrwEtagH/hq7s2BJqF9UllWiESQOvXMJP0HJoiBZyPHltlbMjfRG/9RqJkoXenAqduP8BoQnyzjfupxNxnHOpOBtz8pqylipJ51GgCO71zOOuQMpJTjUAwvjX8xOuGBPHPqVjGcFe6A+Mmdq6Dw1cJFo6PLDthp/ps4hqs+mZTOzsa0SKXQEvXoi7vkgstsKVnNeif+TjGt34Xz+v9WTY1nwtdYSZaRz+Jea1WjuAfxqlDI2LYHy53ZXVvrAVukJbbHstoJF6j38J4FqypcRKBy+K/w0dFBXP+WVM08dfzFY4hmsB5maZ9odBUtMxfOqtBDNYbdtqTX/jvTFCe9L/B6veYucWWyiXtnokHxK1Zb424wSzp8vrJMyT9aFEOLvNbcpeyFD0EcWpbWr+rDxB+nptFvK2ouxBBPR3pu+n+P420ukxvyVH3xR9PL+1Fc24PTsQi8c69ss6RGNi3O7HvgEbMbotUJj5EMsyirpcDIzPQ7faXeUWVL+UQ3g7a8T3C4lO8iqEF707uXs4nVhqj72AZSjDbVtOaUrWzwvXw/MbUudZDL+rMadKcUThDvhS9cHkVtATgtVdruIUg649bNbaCy28ylJdHYcpSLMTOZmTz0hz7L70h+uw6/HfyN7vS2aQ1DZZJ6P9YdvgdBp+IlmvjEKn735eR18BUU9ovXaPXZCEDQI3K6lDDRniMak8DeN3wwStGKu9sBaNWfO+D1BnWqcXaQTntXwGR5Iz6xqUcogzgTuHxzaPL3w74gSsYIleWDhMpjao6BxuO4piOabYsq/Gg/3wEJlUIHh7sAh3ID63Gm4A60C5XyyjM/CZVDGEDD//MLf971lGLiSOffAL5KxEIg+/qNsAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAUBAMAAACXJ7UVAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABpElEQVQ4EZ2Svy9DURzFT99ri/dCE5tIpGwGiZgkBm2DVUM6Wd7SQQyqksZoEenUhqkTsdksBhHhP1CTSTTdbAj123O+997kSWtoneG+ez7f873v3vsegH5/YmTWQ4uyi5PCtoBsZcxUxWiMJ8AutDRF49i7IK0juoZrT9dpDO5+A5wPTX+NEQ9dOcDNw8rBSqsKjcFwP1ljZ5O6arC+gKsUYgn03KsqjcGwSSx2NincgPUKlFNYHYfLforGYFkKt3oHqhQMfQ2Eqlye71KriqGIgVIZzp2J9swomTUuy1hBSrYXfpCAGIoYOB+tLHniWlTnniQ4hcN3KSojt0pNezL+oUgazqZ0OYNFntAYEFPffzQodAwsQ2/KkqMYQwx0P6vIwGmcT3MumcJJ4+Ygk3lZ4jwsRBvB/FTqety43XyNReCM2TxCBZSqnCkDjfkBqNuqvS/PQL13lYUa7TrcuWgSUf53YjSOzD8e0Q4h5gkOFPZ9vwbs+sOoZC70zdEYrHM72A4a2p4dYKTtbBCMnCQD08Fso4OsifbGncQ/upLHXgddP35BeqiFu0v3AAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle P_g = 249.42$" + "$$P_g = 249.42$$" ], "text/plain": [ "P_g = 249.42" ] }, - "execution_count": 34, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1102,28 +1012,28 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2 µs, sys: 1e+03 ns, total: 3 µs\n", - "Wall time: 9.54 µs\n" + "CPU times: user 3 µs, sys: 0 ns, total: 3 µs\n", + "Wall time: 7.87 µs\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGsAAAAUCAYAAACKy8MYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEGklEQVRoBe2YjVFbMQzHE44BUroBbADHBMAG/ZigsAEcI8AG0Al6ZIPSCQpsABu0sEH6/73aL/6Q3/MLTaG96M55tiRLsmTJscez2WwUwng8PtT4QO2dw1/r++T6fDbVbtRONDfEQ3sVoDVMZMiZMwZ7Aey9+921fzVvW5Qj8R2FHIE8v15kIu8h5KvtV+hBVG63FI6sJmaieFugfRXtUW1i0V8Sh01qV6ENGhM41rMf4tO+6Pdq6VzksdZDz68+jlx4/Zpb0pPqjuwuBYodxuLOvIHhV3iyDvpxiH8Nfdl0oZZtIuFw7mPJRtGOHU/qsCtrnnDgL0rySnjNKenptXtNky3Yd0gyyAKfom8t4gvjPkj/rWED5XyiEuRtb1kcjhJnlTU2poUHx5FRDT16eu0uBYszi6xjgRbsOmQpmNacv4XDiZtyDOXLAgvPOXWZMgcyfqY0jX+AcwEwyCbK1OM4e+1eN0WqtgtvHsbOOHbbZUcwC2KXj5ZNOwUtlHYgyhKth+ygBGUgWU+ik3EbGXE08lWFTI1kGrwEtagH/hq7s2BJqF9UllWiESQOvXMJP0HJoiBZyPHltlbMjfRG/9RqJkoXenAqduP8BoQnyzjfupxNxnHOpOBtz8pqylipJ51GgCO71zOOuQMpJTjUAwvjX8xOuGBPHPqVjGcFe6A+Mmdq6Dw1cJFo6PLDthp/ps4hqs+mZTOzsa0SKXQEvXoi7vkgstsKVnNeif+TjGt34Xz+v9WTY1nwtdYSZaRz+Jea1WjuAfxqlDI2LYHy53ZXVvrAVukJbbHstoJF6j38J4FqypcRKBy+K/w0dFBXP+WVM08dfzFY4hmsB5maZ9odBUtMxfOqtBDNYbdtqTX/jvTFCe9L/B6veYucWWyiXtnokHxK1Zb424wSzp8vrJMyT9aFEOLvNbcpeyFD0EcWpbWr+rDxB+nptFvK2ouxBBPR3pu+n+P420ukxvyVH3xR9PL+1Fc24PTsQi8c69ss6RGNi3O7HvgEbMbotUJj5EMsyirpcDIzPQ7faXeUWVL+UQ3g7a8T3C4lO8iqEF707uXs4nVhqj72AZSjDbVtOaUrWzwvXw/MbUudZDL+rMadKcUThDvhS9cHkVtATgtVdruIUg649bNbaCy28ylJdHYcpSLMTOZmTz0hz7L70h+uw6/HfyN7vS2aQ1DZZJ6P9YdvgdBp+IlmvjEKn735eR18BUU9ovXaPXZCEDQI3K6lDDRniMak8DeN3wwStGKu9sBaNWfO+D1BnWqcXaQTntXwGR5Iz6xqUcogzgTuHxzaPL3w74gSsYIleWDhMpjao6BxuO4piOabYsq/Gg/3wEJlUIHh7sAh3ID63Gm4A60C5XyyjM/CZVDGEDD//MLf971lGLiSOffAL5KxEIg+/qNsAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAUBAMAAACXJ7UVAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABpElEQVQ4EZ2Svy9DURzFT99ri/dCE5tIpGwGiZgkBm2DVUM6Wd7SQQyqksZoEenUhqkTsdksBhHhP1CTSTTdbAj123O+997kSWtoneG+ez7f873v3vsegH5/YmTWQ4uyi5PCtoBsZcxUxWiMJ8AutDRF49i7IK0juoZrT9dpDO5+A5wPTX+NEQ9dOcDNw8rBSqsKjcFwP1ljZ5O6arC+gKsUYgn03KsqjcGwSSx2NincgPUKlFNYHYfLforGYFkKt3oHqhQMfQ2Eqlye71KriqGIgVIZzp2J9swomTUuy1hBSrYXfpCAGIoYOB+tLHniWlTnniQ4hcN3KSojt0pNezL+oUgazqZ0OYNFntAYEFPffzQodAwsQ2/KkqMYQwx0P6vIwGmcT3MumcJJ4+Ygk3lZ4jwsRBvB/FTqety43XyNReCM2TxCBZSqnCkDjfkBqNuqvS/PQL13lYUa7TrcuWgSUf53YjSOzD8e0Q4h5gkOFPZ9vwbs+sOoZC70zdEYrHM72A4a2p4dYKTtbBCMnCQD08Fso4OsifbGncQ/upLHXgddP35BeqiFu0v3AAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle P_g = 249.42$" + "$$P_g = 249.42$$" ], "text/plain": [ "P_g = 249.42" ] }, - "execution_count": 35, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1144,14 +1054,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Empirical equations with internal variables\n", + "### Empirical equations with internal variables\n", "Empirical equations not only contain variables but also numbers. As an example, we will try to define the Clausius-Clapeyron equation for saturation vapour pressure in the following example, after defining a few additional variables used in this equation.\n", "$$ P_{wa} = 611 e^\\frac{-M_w \\lambda_E (1/T_g - 1/273)}{R_{mol}}$$\n" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1181,7 +1091,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1215,7 +1125,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -1251,14 +1161,14 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 34, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAAsBAMAAAC3ThhGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEg0lEQVRYCc1XXYgbVRT+ksn8ZfKnsNVaxeCDuLTiouiT0BG2UBA1LaZQd5Vr7VJE2cSXPvTFgSpSBZsVRddYmIoiZUVDoQ/rD5tSEaUgAZXqgzYvlvogrGILi7XruTOZycwkk0z+wAO593zf/c45c2bm5ibARCzV6J82Xe+vGVZxPkrgzVFEQ2nShShhKouiGkYjRAqSZiLJhhBt88Xc6UME4sxm3gsujAv7Gjt2OJBWeZvZzDOBhXFBJe/LdMmHCGSYzcQNex73qOZ8GUPrx2o+3eBA/RO4cLcdpzzixicarssdt77aop3+Fd9z8sVEA+kicJMjPe04kF3Pctz6Yot36qPsFw6MYi8hec6JkpnjLTqOPU+uvibjp1WnmFoAxI3lncAPDmXNr10xW7jVv7L2RItwr6yFB500wTB3OEEq7bNUE3HgqEP5ZrX4VNEp3FpovzI+ZWTwtHorO4xTtR9VE5jfD2j5tGb3v1AsFk1sto2S8v6zDrNOYNT636QelJr4uLAtlYNQvwAIteckoP38BbyOJ38pCPUPqJpVHwWlLNU4Ihvx/id/k/JHj0A0d9B5+y7EGuTpy5S2/f4nUIKhMgnLvJz1/M1YXjI4IuP3YHRLsD/oplt2EWaKvt88OT8BzgLHZjhlv39xp3tIukc4vJtcWv2yFU23mVyx7iaT6BHrhL7ijMIHZAxroiFZcLwxzcnZ5TfzQKzi5jvAQG+IhmzDpUrk/byV3wTRpGESpjtJpX3PIqXjEF5xGPtWXOIbBok2OV7PPdgzm9eRKiBWvcstoD5aQTIvMCK+pc9ErN/BnqxYW/SBiRSnpLF6n8x79pIgafZRDb98ondoEp+R4OXeolFWRdYzWriFdojU3iU9xf+/xdR9ZPTyOEfJCDM1d+PmvXfsYuFdVleN8MXuK+rGW/u6r3Rj/6Zzi87uEDtYF3XgI0bL1hAi89GKjjd8RC+gbNBW+CdUcT+EGWn6Hvoe5UM00yp4OJqSVNo1+tA1dLfUvxZ/O6PJGrrL/Gx86XHTz/RAwjr9I6Jr6G5C2eIHqy8zgVlh9vBrzgM63KwOXCx00C0iu7s6T65bX6qeaYRpXX4RCdMF9HYZHtDhHqfz4Hc/q85axi+q9BAypqf+d410xS/ugt6H/DVr83Lb7eKtTS/PecQBRWkdIm0Op3/pCBaMgKQDJmfr6hymTk69+g6wMoXvOxReYifzoqCfbSJ2rV0//sLnW4KSELyiy+Yp+o2j5baGKGz6es/VjI4Y/ctz+s/me6q9i3FjEfNIGGpu3ksHfeUKZ87n0/oiw8Lp3Ry1nn+e3HjZ13+2/8PnCbhl8CGaZoIdZE3TIroPfPsDlavaTKIuXVauBlREiOV2/xmqXwtIQuABfIHtDWXpBKqNEAmnE7xi+vlmvKY1xILS5JzXpnHIBNYYcTRoOhZ6ZfNGRvLFx/7i/YgVua5CNrV8MErdT7/d9r64K2cPZ27IBRXjwJl6iWkoNYQtbBzpBs6RMD7FbZAbx88OHDqWAGXu5JyJ1PaVPWNJFznJfzN3Py+JqTMaAAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle P_{wa} = 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}$" + "$$P_{wa} = 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}$$" ], "text/plain": [ " ⎛ 1 1 ⎞ \n", @@ -1269,7 +1179,7 @@ "P_wa = p_CC1⋅ℯ " ] }, - "execution_count": 39, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1287,7 +1197,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1321,27 +1231,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Deduction of correct units for internal variables\n", - "Sometimes, the correct units of internal variables in an empirical equation is not clear a priori. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Piecewise defined equations" + "### Piecewise defined equations" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ - "$\\displaystyle P_{wa} = \\begin{cases} 0 & \\text{for}\\: T_a < 0 \\\\611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}} & \\text{otherwise} \\end{cases}$" + "$$P_{wa} = \\begin{cases} 0 & \\text{for}\\: T_a < 0 \\\\611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}} & \\text{otherwise} \\end{cases}$$" ], "text/plain": [ " ⎧ 0 for Tₐ < 0\n", @@ -1355,7 +1257,7 @@ " ⎩ " ] }, - "execution_count": 41, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1368,14 +1270,14 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 37, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ - "$\\displaystyle P_{wa} = \\begin{cases} 0 & \\text{for}\\: T_a < 0 \\\\611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}} & \\text{otherwise} \\end{cases}$" + "$$P_{wa} = \\begin{cases} 0 & \\text{for}\\: T_a < 0 \\\\611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}} & \\text{otherwise} \\end{cases}$$" ], "text/plain": [ " ⎧ 0 for Tₐ < 0\n", @@ -1414,7 +1316,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Substituting into integrals and derivatives and evaluating\n", + "## Substituting into integrals and derivatives and evaluating\n", "Above, we defined `Delta_Pwa` as a variable that represents the partial derivative of `P_wa` with respect to `T_g`:\n", "```\n", "class Delta_Pwa(Variable):\n", @@ -1428,7 +1330,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1440,9 +1342,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHUAAAAxBAMAAAAW4/v1AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZjJ2me8QRFSJqyLN3buI9fnTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACeklEQVRIDZ2VT2jTUBzHv/nbJP0LggdFVs+CLfMg9GKkIgiKCuJF1BwUQZBGRPC2iBdBYYGdhAmBnhyD9eBpCBbpaQgr3vQ0UEF2caDWzqn1vXZuSdP3XrLfIfx+38/3l+SX914LCEL+bAscHFz0OFCAZhyBgYOfc5gIdUQGFs+eme6zmEi/3yr0RB4G1y9CbTOYSFZ7yPsiE4Nra2i4DCaSGz5mRR4Wb3hYNFosytcLVemDybeUWFhvTi8fZ8GhLn/j4h14YLC+0HF2ymGiXh8Toni3+g0ULu+WNHswlWwN5U3AGHtHW0u275SfgEL6Q5HxpKgQYpG0sAFYpD8UKpBs4GIbeG2HOsm4wPbA829pMA9sxYfxPtKKAEg28IkXz+pOpNfwAOl7RGIUX51xYFEhNnBxMBbE9Ge8FY+pMmXT62jeFZpOCHn4cveCbPuOgxu1N8QSUJu2Ra/8oMsL+D1lLefq72SyJ4zOKRLnEgycozsoe6trVZWWastdIL89l0Nvygt19VeVcNXXXBOapwQ882SWdxuOgkarsN+ZbBipRy9lf6wv/V1YDR+VXHkWB6G1Knd5rUDf9KF1oZZCNrn+sO4h03x0MiTG00yPrD3ZwJIbZyLF7B4mK+9BcUTOOM/ZZWDJQSaOBMrLuYpHLFcFtkk4cwV072cTbJpY+80SzhJR2stf6HkH9JxbyX7Koo++Bp3ufbK8qUPfhLFBusjykhefq6W5gd6H1X4yXF6ghk9pevERhwIfo2+9hS+pem8fO9J0zcXBShVSF3v5YsPHmYF8IdVzQ2YjsIJQmS6tz5fSNYTdWjlcpcmX8TSNPeJ9te90pP5f/AMhLaevBQv/TQAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle \\Delta = \\frac{d}{d T_g} P_{wa}$" + "$$\\Delta = \\frac{d}{d T_g} P_{wa}$$" ], "text/plain": [ " d \n", @@ -1468,14 +1370,14 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAAsBAMAAAC3ThhGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEg0lEQVRYCc1XXYgbVRT+ksn8ZfKnsNVaxeCDuLTiouiT0BG2UBA1LaZQd5Vr7VJE2cSXPvTFgSpSBZsVRddYmIoiZUVDoQ/rD5tSEaUgAZXqgzYvlvogrGILi7XruTOZycwkk0z+wAO593zf/c45c2bm5ibARCzV6J82Xe+vGVZxPkrgzVFEQ2nShShhKouiGkYjRAqSZiLJhhBt88Xc6UME4sxm3gsujAv7Gjt2OJBWeZvZzDOBhXFBJe/LdMmHCGSYzcQNex73qOZ8GUPrx2o+3eBA/RO4cLcdpzzixicarssdt77aop3+Fd9z8sVEA+kicJMjPe04kF3Pctz6Yot36qPsFw6MYi8hec6JkpnjLTqOPU+uvibjp1WnmFoAxI3lncAPDmXNr10xW7jVv7L2RItwr6yFB500wTB3OEEq7bNUE3HgqEP5ZrX4VNEp3FpovzI+ZWTwtHorO4xTtR9VE5jfD2j5tGb3v1AsFk1sto2S8v6zDrNOYNT636QelJr4uLAtlYNQvwAIteckoP38BbyOJ38pCPUPqJpVHwWlLNU4Ihvx/id/k/JHj0A0d9B5+y7EGuTpy5S2/f4nUIKhMgnLvJz1/M1YXjI4IuP3YHRLsD/oplt2EWaKvt88OT8BzgLHZjhlv39xp3tIukc4vJtcWv2yFU23mVyx7iaT6BHrhL7ijMIHZAxroiFZcLwxzcnZ5TfzQKzi5jvAQG+IhmzDpUrk/byV3wTRpGESpjtJpX3PIqXjEF5xGPtWXOIbBok2OV7PPdgzm9eRKiBWvcstoD5aQTIvMCK+pc9ErN/BnqxYW/SBiRSnpLF6n8x79pIgafZRDb98ondoEp+R4OXeolFWRdYzWriFdojU3iU9xf+/xdR9ZPTyOEfJCDM1d+PmvXfsYuFdVleN8MXuK+rGW/u6r3Rj/6Zzi87uEDtYF3XgI0bL1hAi89GKjjd8RC+gbNBW+CdUcT+EGWn6Hvoe5UM00yp4OJqSVNo1+tA1dLfUvxZ/O6PJGrrL/Gx86XHTz/RAwjr9I6Jr6G5C2eIHqy8zgVlh9vBrzgM63KwOXCx00C0iu7s6T65bX6qeaYRpXX4RCdMF9HYZHtDhHqfz4Hc/q85axi+q9BAypqf+d410xS/ugt6H/DVr83Lb7eKtTS/PecQBRWkdIm0Op3/pCBaMgKQDJmfr6hymTk69+g6wMoXvOxReYifzoqCfbSJ2rV0//sLnW4KSELyiy+Yp+o2j5baGKGz6es/VjI4Y/ctz+s/me6q9i3FjEfNIGGpu3ksHfeUKZ87n0/oiw8Lp3Ry1nn+e3HjZ13+2/8PnCbhl8CGaZoIdZE3TIroPfPsDlavaTKIuXVauBlREiOV2/xmqXwtIQuABfIHtDWXpBKqNEAmnE7xi+vlmvKY1xILS5JzXpnHIBNYYcTRoOhZ6ZfNGRvLFx/7i/YgVua5CNrV8MErdT7/d9r64K2cPZ27IBRXjwJl6iWkoNYQtbBzpBs6RMD7FbZAbx88OHDqWAGXu5JyJ1PaVPWNJFznJfzN3Py+JqTMaAAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle P_{wa} = 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}$" + "$$P_{wa} = 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}$$" ], "text/plain": [ " ⎛ 1 1 ⎞ \n", @@ -1514,14 +1416,14 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 40, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ - "$\\displaystyle \\Delta = \\frac{M_w \\lambda_E 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}}{R_{mol} T_g^{2}}$" + "$$\\Delta = \\frac{M_w \\lambda_E 611 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{273} + \\frac{1}{T_g}\\right)}{R_{mol}}}}{R_{mol} T_g^{2}}$$" ], "text/plain": [ " ⎛ 1 1 ⎞ \n", @@ -1540,7 +1442,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1566,14 +1468,14 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAANYAAABOBAMAAACu+PUzAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqu7zZkQ7zKJVHZEIt2ubTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEvElEQVRoBe1YXYgbVRT+8jeZZCY/COrDqhnqtlD2YeOCCgomlCz0Qd3UdgsaWIdi2welu/j3IK6NioIPmhErshRqBF9UdENKfdhVNhV8sIINpQo+7TwVC8LGrW7tumu8dyYzk0lmM+sycynoecg995xzv+/ec+6dmRvAC7l9d273aNoLJHeMPcgg0HCP8yCCq+Eg4k0PkNwheBlXIbrHeRPBbXiDsx0UcU2Peus9/zMZU3WuLN9R9K4vvyFJh81zLV/wu0FT5HAFFu8D4mq32Re9UgY+wQzwlO/1+nZlL/AIL4Hb48tS+kCvCF/h6DGlz+6H4buhA1hpq35A/3cwI3Mys8XWj0usuLiNZI0Vl9BixQQks+y4lpllEFhqsFtXTmbHdZ0dFb/Kjkv4ix1XiOGnVKrzKcVidRXVYklbql27pT22a1y227p6gdFru4YPdxm2UDOS6eCt0r3+QuL6GEGYUHTv70DoRTOwT0nlgfvlPnOvYdR6bEROWuHrMQVRFRF9qfwN8qllzaQXAxUypXkLyPLHbcaVhum5kCFDdBHXgsBy0bjFCGQDCYRvK6HPniVzcFeUjYtry6arGDX3SUx9FchUIejeUAsIDtiwOYIx2jCBLMXGJVqPDbEaMKceLpbJaNm4xdB6kFVuKaSciT+cvDau2DUzJAJ0Cvbj6UqVmF8xXaQe8atmT1NOFaiMazot5xdOKYSNK2wuBRdI1rQB4ixysm2mS3vnSsSylQirc+9/2e3ks52ejSu1bsZIgF6w42kcItaA5aLUAyRk1lkP4idVqsQKhUefLxQkqlNZ3tRbsqerBF5L+pP0vkk2g4XwtxHk3KbUHrtoGGzrmm8ZYWSTdwr2HLT7ZlSlFiq8Q931eu3T/JWi1lg/zlwf5o2IT6mSIaO4G4jTGVgbjx4v4HspkT8h42h9P+11Cz1eEOu4zF0BVxouw5krpxiDJKpESUq5dQTzn2vHi2T1dB0Ia9lU1oRsuMH9wlu5pUOITMjkJ5aSz+JhnChXyFFRiYGKLYcnq5qNWMcniUzRbD2IuyQyBW1D1HEvIhOrNbItn1GDNaEZKfbddw+1R8ion37ACL7GJN4ha1QNVDLQEOuxkWzrIgNHFt8eacSG2/tqSGziASM2okQbMUSrgmRY7O3jeBkKXgJJhCNX12PDPrDTC6gwM5ZsTMsCppuh22TH2F+5NdS4TdxzzOLiukIFl6+NmMTPGMDh8jzuRLRZOW9Y7O3+eCvQxCy/kXa+fgd/s8f39uJSUDJsfOmjUhXiyGcHDIu9fWPh1gXgm4Vz6cQULXCvJP/stfT0S6fSPZYdd1Mtt6HRslvEdv2V7ODIS/h4cMC/8FpvYudBl4cOOzt2YHV8me4AZztDVrYT5FEMeXmzEvryZiUBt+Pl4USCMx6CuUClFJcAD90Xmx6CDYQ6g7sH+r10PsTPegk3EOvnenmg/3/nzZOBwLMHVx9z+QDwarZBOdDCHV6hDcZ5GpEsyMctC3kTSQUNFkyUY5oZE3BRpozkmiVrja8/Z3R0/gMGXGOdlSQZcNHDNXRWBgMunrz+40qU/I/t+7rEqVUF4eZrLLi0YiXlxQaDdWlc4rvn0vzSE5p+c/z8A8zdJ0OF5rA2AAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle P_{wa} = P_{wa1} + \\int\\limits_{T_{a1}}^{T_{a2}} \\Delta\\, dT_g$" + "$$P_{wa} = P_{wa1} + \\int_{T_{a1}}^{T_{a2}} \\Delta\\, dT_g$$" ], "text/plain": [ " Tₐ₂ \n", @@ -1612,14 +1514,14 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ - "$\\displaystyle P_{wa} = 167405731976.232 e^{- \\frac{5304.00487246815}{T_{a2}}}$" + "$$P_{wa} = 167405731976.232 e^{- \\frac{5304.00487246815}{T_{a2}}}$$" ], "text/plain": [ " -5304.00487246815 \n", @@ -1658,13 +1560,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Unit conversions\n", + "## Unit conversions\n", "Values for variables are often given in obscure units, but to convert to our standard units, we can use the dictionary `SI_EXTENDED_DIMENSIONS`:" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1690,13 +1592,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Exporting definitions\n", + "## Exporting definitions\n", "The below example exports all relevant definitions from this jupyter notebook into a file called `test_definitions.py`, from which they can be re-imported into a different notebook just by executing `from test_definitions import *`, as shown below." ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -1711,7 +1613,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 45, "metadata": {}, "outputs": [], "source": [ @@ -1756,27 +1658,13 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:c_pi\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:lambda_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:rho_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:L_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:A_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:Q_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.chamber.insulation:dT_i\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:alpha_a\" will be overridden by \"essm.variables._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pa\" will be overridden by \"essm.variables._core:\"\n", @@ -1876,7 +1764,13 @@ "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:n_w\" will be overridden by \"essm.variables._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", + " instance[expr] = instance\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:Delta_Pwa\" will be overridden by \"essm.variables._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:x\" will be overridden by \"essm.variables._core:\"\n", @@ -1891,20 +1785,12 @@ " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_wa1\" will be overridden by \"essm.variables._core:\"\n", " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.chamber.insulation:eq_Qi\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Le\" will be overridden by \"essm.equations._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Cwa\" will be overridden by \"essm.equations._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Dva\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ + " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_alphaa\" will be overridden by \"essm.equations._core:\"\n", " instance[expr] = instance\n", "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_ka\" will be overridden by \"essm.equations._core:\"\n", @@ -1946,7 +1832,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Numerical evaluations\n", + "Since we re-imported names that already had definitions associated with them, we got a warning for each of them before it was overwritten. This tells us that the same variable used before may now have a different meaning, which could introduce inconsistency in the notebook. Here, however, we know that they are all the same." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Numerical evaluations\n", "See here for detailed instructions on how to turn sympy expressions into code: https://docs.sympy.org/latest/modules/codegen.html\n", "\n", "We will first list all equations defined in this worksheet:" @@ -1954,14 +1847,13 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "eq_Qi: Eq(Q_i, A_i*dT_i*lambda_i/L_i)\n", "eq_Le: Eq(Le, alpha_a/D_va)\n", "eq_Cwa: Eq(C_wa, P_wa/(R_mol*T_a))\n", "eq_Nu_forced_all: Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000)\n", @@ -1994,13 +1886,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Substitution of equations and values into equations\n", + "### Substitution of equations and values into equations\n", "The easiest way is to define a dictionary with all variables we want to substitute as keys. We start with the default variables and then add more. First, however, we will define a function to display the contents of a dictionary:" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -2018,7 +1910,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -2066,14 +1958,14 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJwAAAAuBAMAAAAvlG0AAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmElEQVRIDe1WPYgTQRT+ks0lm2x2k9hcY5FKwSYRrhPJemhhdRGtBM01opUXC9Er5AYtFYJVFA5NYSleOAjc2bgKovgDV4mFkoggWMgdyaHxCMS3kz0vm012Jyt2ebDzZr73vS8zLzPwAE+L/Ty41Lz2sOpJFCMoVYTziG+IsT1ZEWDFgJr1JIoRfgB1HQEmxvZkNYAlBsmTJ064YFGl1Sep6860I4e+TDMnPAqJdayIEjmDVWjpAWL1qq6klRevB+BRS3XbijyKFlHX3uXtxJhehrr1FIt2eOQq0rZCLKHjGZO4nHyfWwOQsQ2lfRablZEKtgBdO8tyDAfQk9uFyEttBOdPY0XwLtG1A+5MPwBqkDtOOSWPElHmGNEEjK4d5PMaHXkZ6iWnXNTABwacEpAyKRnixg2NjtzEt4ZTLpHWLgOKYXI9TVnslpMI64EipFbqDZXqbymt3Nzh/RXgU2+1r5tFqHCRWbERrlQJfmRUJDKHXI2jValhemTSQJSZMxcLVzaPgopEFhrc3bKJfj8+y0wvze7Qwc2Zm0lXjr1HSSdK7OWvpI0p81u+0O1yVLlFb2jGRhixCBXuDouc+N0vH0cBWBvG84XFUd+A4St1WNIMEnlUgZNNGixb5++Rl3gXEvVrUFpSFlDnRTNceQZiTfOPjaSH07pjGCnQETOPyYeTw+XGQyUdyL2lnBIdGLdTXLRXu/J4SpytMGCqRdM5+uR7cpGjvocpylS3aFinL3Ljs28hnnhz4Rx5c0t0Lb6Gs/+m1pdNL6+YqID1QXzqr0fRdhAoBnVn7fz1KLXOq0JWfp4a3BwmPYqtJJMexVYO22LSo/SV43/2KH0/4zIV71FcRPZCwj3KXorbTLhHcROxx7x7lD8fURZXwH0iVgAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle N_{Le} = \\frac{T_a p_1 - p_2}{T_a p_1 - p_2}$" + "$$N_{Le} = \\frac{T_a p_1 - p_2}{T_a p_1 - p_2}$$" ], "text/plain": [ " Tₐ⋅pₐₗₚₕₐ₁ - pₐₗₚₕₐ₂\n", @@ -2081,7 +1973,7 @@ " Tₐ⋅p_Dva1 - p_Dva2 " ] }, - "execution_count": 55, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -2100,20 +1992,20 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOwAAAARBAMAAAAs8V3gAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtUlEQVQ4Eb1VXWhURxT+9vfevfuXlKJghW6tpT4Ucx/6UhBy6YM/2Hb3rbRSdlFsUrG6D22hTTRTxYooZN9WQdt9aR9aC5uCqKzFtQoRspIVSmuVkAUfFRJsajapevuduZrcmO2jHphv58x8Z745Z+bOAnjBtRHO9yn8j43casmM2X3B9gGQqsvwXbaRl1owG2ta4gOxG6krXg8/1dYCx2pfiavpAsd+W6+nezLkKt3tADHH/FCGE8BnPgAiRRl+HzhiJ0o4jPjfQLgfiLpulRMbFaw6sk3zU/yg6Gs6wSziok0/9PY8EGens/0BnJeZd7m+D4AVIhvoA95AMIOrwMc4fLbNDM6uYm0GhhQCM0jnjAKMOpmaTkgoRAv04wcfAG+y09leB7KKU78Ah3wA6y+R/bmMEHcN7ASGKkhS1hAXmFQI7UC6lC4hPg2PLjHRHAyJSCAPnNPUTjAL9Dqc6F2HX32AeExkq2UEC/zFdwpDradkOZxtDmcQoIymC8TaMB5xJoHJJursdDSTpejt4pTh3nJ8gJsim6yUkf525LIOzStPdmJ1iz6zZa23IcpseeqaroHHzJqwvukcqsCWe4THdv6E2El61r/AlMji4pzygdklsl+jjOFTiDicD5EpRQ4qizJa1jpzVSocewhN92KYhgid425CNkMKdJaZxWynhBa+nN/hgzhEtiqy00jwAuurKrK019h0tlhh4xVsneGVJd2L0bcfrK91Ty6ykSEss4Ui/4nAfbUI78k64RZlWaukpNdgeyw7XnkiG+1H+PqdR9B0DTzVOplS357T/I12ibfMeKWyDkeZ0JSzAJurInsUlI2UkHzIT6lOksh+yaOwtaxVQXCGo0bbFLoGuqvZEHJY7DF2hsnF0W4t7p1tmQNY423cnGb4jQX4fbAxvrtrU6Nx/xI/TMn2HVBFZD8BxpUOSrc92VgxLPQXdQzCdfzIm01KRIqUZTOP8xFZak+ei128LJVFYHU0sw+pNhIFpKoIeLJ14AMuwbONZnhpk/2YqtDXdIE7wCpKcijJLPRbZOybYG+JRRxzD4ZLeEvhug+4TkZ424EBfOPg+9qFz1lpZnsaSe4OLyskm/xuA8fNU0LUdIK1rTaaw4G9H3FMNs7P5XbUFsYSM0dWtuSWpgb5V7AIiPfMNvl2ufsQH9vP58J1/0Hii7lrsMYGFTC692QTGxqvArWGLKrpAjHXdXM+BR5+MV0BQ56npeYRKAadZWf7jPdw5sFo3jYvdT9jGW/5/wAdKVDfo2JeQAAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle N_{Le} = 0.888446215139442$" + "$$N_{Le} = 0.888446215139442$$" ], "text/plain": [ "Le = 0.888446215139442" ] }, - "execution_count": 56, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -2127,13 +2019,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Evaluation of equations for long lists of variable sets\n", + "### Evaluation of equations for long lists of variable sets\n", "Substitution of variables into equations takes a lot of time if they need to be evaluated for a large number of variables. We can use theano to speed this up:" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -2159,7 +2051,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ @@ -2174,15 +2066,15 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 8.88 s, sys: 11.7 ms, total: 8.89 s\n", - "Wall time: 8.89 s\n" + "CPU times: user 20.6 s, sys: 335 ms, total: 20.9 s\n", + "Wall time: 26.4 s\n" ] } ], @@ -2197,15 +2089,15 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 34.4 ms, sys: 11.6 ms, total: 46 ms\n", - "Wall time: 760 ms\n" + "CPU times: user 88 ms, sys: 41.3 ms, total: 129 ms\n", + "Wall time: 1.82 s\n" ] } ], @@ -2218,7 +2110,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -2227,7 +2119,7 @@ "True" ] }, - "execution_count": 61, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -2247,13 +2139,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Numerical solution\n", + "### Numerical solution\n", "Some equations cannot be solved analytically for a given variable, e.g. eq_Nu_forced_all cannot be solved analytically for Re if Nu is given, so we can use numerical solvers instead:" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -2262,20 +2154,20 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 58, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAPCAYAAADUODwxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFTklEQVRoBe2Y/XFVNxDF/TwugCQdmA4IdEA6IJMOTAcwqYCBDqADxnRASkjcgd0B4XXgnJ+ejrzS/dr3nD/RjK6k1ersWWmvrq529/f3ZzHtdrv3an+rsl9UfpbOjXXU/0R1dPZVdqnyrXTuarsVAQvdp8odFooBjyZYJPCazYPo4RlwEc5xBOf1w4izZ6p/FOaXIFutBhtr3E+2I3w4vRanyLNxCvaRTXxsiqGyhWnVLb1F2yJ7RlYiCP5RfhlkH5GFNjrfla+CjAlD9sQySiWwXllGv/Kt8uUgu3a7jiMQAWg83C9ZhiN8CIziV8V8VTEb79g/1qWb4f4oO7LBXHS+V66bPo583V7CdL/LJT3JV23HCf0q5XGSkX0NRq7V/u62S8mQt7GqXy3oEQgx+AjGLsjAZCzZ+C4ly3B8Iz1AWqBWTGS3xloqpZPlfrId2WAsPs4Fy6aPc9zXMKP+mp76Vm17V3kpRSazvfXRgOtVpy12kJfdILQxOjcRfsNLgEiHCZssIGOVOz5qZzmiB263M1W8CXdzdim9LPeT7AifHYmAZPfq5kjtlI/m6lLjFjGtQ7mml7F9DoLSW+W9ACfnjtKrh75jbFGkfw9F9/xGSzqQJuH0XNpXofuxdxmwxzG2iXyTI0ry4S/lnyhpk4RPkJLYybaSuY16HfdH2OGc8mkEr+2UjzNj1zCj+prepu2LisQE3WhSOXT9oczicyAl8sukq9yrnwn7WXlMHMBILLyDyeWhp3+WoBLmr724teBBisG7yfEwpH+KDwHHzvdhZZHKoKpLfZN7GRAeGTvSYUdZC9ijfUxgFpYJvU3bF9VJu/1cE0qElaS+W2X+TPwXwRvB93ZMGCIRBF5gv4mloz7WFqGoyB5Y4LC4BeNIjsYBgz8NdhUC/p3yVvKLkOYubik71Qc+v56fjsuJPvIiLGLawP9pG4N80OTHwx8EdSXeAr7/5YxRZXzT31hXdRbDfzDUmTwGtwNv0GXHoO+9ZWOpvslfgmRHcZzB9IGyO8fM6D2W+6Kd0We1uzPLKT5uYdq/Lb2s7XMB+i2ai3gcYqGeK5ck/d9UuVO0XikzOXEc9bXdw29uOeMUwPAQHsHJmeP3ICaKj+IYx1LX+A9Vdl3fslHF7ZO5A7BkRzZ5iT7byFx5rI8ZTOxk9LK2zytxFtkLUkVdwRvXksC/KH9S5lNxow7336ltHAdGG6cKgUeKAVYEcqp83jR+9pKqjjF2GTM8CgfhcG4yn6jytxrY9ycz9pX6MdyzdqSHzRd1niY2B0FqHbKYWb3KYdP2RVVkwRcnUX2Txa3jXLA4BJAXkzMCkzQmB1D7U0FBTvHmPY2BIllZcMlsO8uRzxiY/BGZD6JsynLP2ilnMPEZD7Z8kgls5FwfsPtlfUxhCo+5sw1VWzrNtkiCwGAq7WxS5eXMQr22y4VV1Atj2x2NZKmLrWB7coYRBjtNxMxy5IzVLhIDdxZ34qP7XUonxV16j7XD+PGeJeWjuY5l5dRhjjq05/Qk27RdgqACcBHWFk11dgYcajehqrOA5RxTx6BDe3KNLhmLE8ca75kdUD+7B3ockJ0JULgsXdZtcWSxOz5qs3MxS02uOnyQTS7qJMtwT9mxr2MpG0vBtrkOI5bbS5jud7mkJ/mq7R0ATtoSWTAmca/MQr5TP1tjS1WHNnqkdhdzaB6e0qP/T2UfZl+o3uFJh0AjoucS5x/uerqU5Mg2HQ/J+EKQjZ8/guJG8qjLJ2yTO6Skl7KDrlPlj8+MJXEtwU7YLuoyPpaR9ZHBRDWjt2a7C5ZI4Ef9xwyMM/AfOZV7RyXoM4oAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIwAAAAPBAMAAADEyjp7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXYyEM1Embsi72bdVKu+2mc6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACeklEQVQ4Ea2TvWtTURjGfze5TfPZJO3QDiK1i1AR08mxqSBCKSaguBTbbIIgRlGvdDE4aBGkt5P4Ac1QqtQPguggDuogTtaIg5tecRA/oK2mhVpjfN9z0v/AOzw553nO+Z2vN0D3jhwHsl/B2dUDrjedk+ZAD7FsXx39jD+bvartvdqXEMLlLVEA+0udRfcuN/IcZcznIM467hHOco3UpozE+LEyH2vSXpKFNIRk0BYFwGWila4qXeVEFafIGVgkWmaaPXX+yEiMH2qSfg6hB9gQBgPJVBRAZEN66SLOSjQg1eAeLPsnfTGPl1iTH4wfWdBB3JwAExJ7HGDEAIhWZWShQmgjHRBpMplnOXdFPPnsoayPOVRGMDZ0OgK5JREDIH2o+xxx2c16oUzkp85+k18b2lmSxlhGu23ffSHn8wVjwyeKUTEACuMk684KHZtzGcKKiay6azVew+yrvHSxfmyb3No+JrCh2y8EIwZAYYXOeS7ytjlXJrwq05KB24IpQYQWDKbtD5bIKMaEDoIxYgFy/4l1Ug+Hfm0dykNf6FlJEIvC2joU8flUTjA2fKcYIxaQLJLQ8uhqyFWmmrKFMrwUTO06zNQlMX7MJ9ocQTEaPsoIxlXBAqRkZDeIIa+faMB7Yv433U0rbzHGTzcE88Hzfp9GwxNfvAu3d6v0W0C4QWc1Mc+wb8svnCHkD+eZ4o6+mSxg/HiFpKyBlJ8JIR5IV8QA4BOj9dBhdxx5nNEct7K9P+jKuPd5qnXjSgWqn6jZP4OwTSiEimJEFCAldOozZL0SjAxIa7LVkgvu3Z4j4p0Xc6ntH/MuybS+1ncb4sz8rbVFAf/n+wfURvBtNAe4UwAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle 690263.0346446$" + "$$690263.0346446$$" ], "text/plain": [ "690263.034644600" ] }, - "execution_count": 63, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } @@ -2298,7 +2190,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ @@ -2310,15 +2202,15 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.75 s, sys: 46 µs, total: 1.75 s\n", - "Wall time: 1.75 s\n" + "CPU times: user 3.99 s, sys: 37.9 ms, total: 4.02 s\n", + "Wall time: 4.49 s\n" ] } ], @@ -2343,7 +2235,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ @@ -2359,15 +2251,15 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 5.6 ms, sys: 324 µs, total: 5.92 ms\n", - "Wall time: 5.9 ms\n" + "CPU times: user 14.1 ms, sys: 3.78 ms, total: 17.9 ms\n", + "Wall time: 30.4 ms\n" ] } ], @@ -2379,20 +2271,20 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAN8AAAAVCAYAAADGijv+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHm0lEQVR4Ae2b/3EVNxDH8RsKcEgHpgMSOnA6IEMFQAcwVMBAB6SDxOnAdJDgDkwHjl8Hzvdz7CqSTnfaezf3R2ZOM/JJq+/+1Eon3YOzh4eHR3vZI7BHYH0Ezs7OnknKR62pX1rS6vHHLdBO2yOwRyAeAVtUb4zjouacGj/b33x1qPb+HoHTIqBFdinOz1pTT1sS6vFDC7TT9gjsEdg+Avvi2z7Gu4Y9As0I7IuvGZaduEdg+wgMH1x0Fv0qVZ9V/9B59ZhdEK/V/7NnhvBcMv3CCZyvPpx9C96leoT/KDl3CFT5UfV3ybyhYzZeqUn/H9WjalGEfQdhIbbryxJ5pv9cT3yhIJ/yzn353v3v75zfjhImNGfCofu18RFD+lfS/cVowyOKA7xAd8jG3I6t27Ldc4p84W6Wcmpr3SP5mgRo96o08son00e9Kh6SiYWWsOq/MFmvK3pIj3hJECbu0vnVZnP4mvVJqNzeuk2CDTYJF8IKF/IlKg/9Kp7seXxIAAaTfxl21u/Mp2gsi7kxPWxaL1yW0UI4w0Z1h3C5HWva+KSKzvOWHNGJbfIbnOqt6oXj1eajyXWgjnQY763Lqp/1uCcnRpEQTMpb1WRMLaDuG55ESk6BUeFPYYj6IT3C4XyRDEbjTew2sxibdoqeFp7ZEsKKD9+7vggTkpfpbk0USXLv/hi267fjxduNpTAkY7EBmp5hc8tkhXAZvqvb9IRwLveUp/wbNjc9PX+Zv1a82YCLeJuN8KVN/RQbnEdyWLhFzvuY6SrGPZGLZM0Zem1TSCLVuzhBKJxSv6vH5MHbXFhuj8abb2boqs8cxzOKFY7gdH2JyjPdyBtNiGhsdMlPtdGd+rn9rTb8LXpOE4ZYpA3Lx0QbdvysH8Jl+K5usCohnMtd+5Q+P+G0Fh8b28ge0fyUNuJZao/JGs21y6nHDyKsKhL8RfUHni5I52ocovCGWFq4px0l79sco8aH+1yOkV4S+E5jw73Qx6JY4UK+ROWZfvy4kG0kfKs4PeR3S8AMjYS7lO7rSv970VlwXqI4x/8fn+RGqxyNODXe4iloii3zS64TU9pXqpyihjI1/jgDsGtQSAYuohz7iiRmsFekCH6M+CT+32q8xnt6CMKNcHy0eal6p4o97FppgavfKnzEaP7Tnga4i+35UslsypM9P1U47+IfxTeZxX73Ykm8hOGjF5vhvdp8FCOWf2ksfQyL4sSXSk+3A6M4x2/xlA2+wfFhbqr4h7Cp8Um64scc5h8cC+zkuAYAsvOl167aGMJAcZQEO1WNh0XHBZZdIMlzHtFm9cCjil7uCsVdRX3kFvdKl8tTBd0FTz6et3tYjeP/rC9L5OVY2iosNBrD0VnPxX6LZzaWuU70qKKPSmxHc2N2RXEh3dITwuW2rmlLX/PYKbrn8+iqojE2QeLydo3uU3jnFhOBmzy/zinDEdXR3anFI1zSo7YnoaDlQtcYCxqZo8Rxvpqn1V+ChV9l1pel8kwmG0m6f7gMPTUc97uBTbH0McnkrUfsWPDoxanR3IgWwrnc+in+ke4aQz+KM+xorlsynSbZvcVXfMQzHb74RgvT5W71PBCNieJ3FXaNRUXGfjIGzr7+yp+SkfSI72ggP4rlPMOOLcLPOdHaBD16RF6CZTX0fFkkT/FgIXC3/NX9WOG3i/BniiUEO/K9lPw3qujkyMndkjlJcxPFiWeuFLpngCGc5Q1HZeZ9bZk7bj4x4XdrlSzlP8g5JqHloC+E2cUnXi6YLczfMoZJZsclEaJ6mBzXDWtdWro4b88FOJcxiY36kgtTe1JehSMGwyWcxVCPqR/2e0EsOUa+ynVJN5sJ99A0N2pHceF5XGBjbl5qy05ygJhQVxWThQxfaLk84kBZree7mPjfg6DD4miwuFEsornCUeZWwXb8FDaqhzdYa4G53FaQwDNZkTKHjfqS65mTl3CKD8e6p/nCEy3fuJb43Y2lzQfHtlFcREMXH1yeRHHJkXi+dG3MZDabspN4pRNCExQn8rGulaO+IHsf8+KagsiDcPyTstYXOYJ3o7HR5FWyGedIU+NISoo7FdXzQTznlhSDAPuDjUfpcXkDWTjO7JTumy+AjfoyKAzIy3HPZXv9xmNBelnidzeWNh/8U0GfB9fjz3M1fN66OGfSs6vbsFFcJnrTJr+rtq4sHMUjeb6JcUxOcRFVn3sMl/L0Q7faTBY35vqHc7DFV0b1SSqwia52SI+SRtDhB+h0AVYf3dgz+toJTRWmhEdGq/awGg/54rJ78swX/OaNytHOK/c+kqH4oGW05If6Tb9FD8VSODbQ4a7sNptN+Jm+7kVxmT+RfAnZmNu1to1PquRC80ON6MxDyiFwquRV8Y8y1toR5R/+M63tjsOPvDKEoPEW4Xero56pCIfx7BLFUUB0JjmnIYMkqt9S0Lt6hOFuQaISHGyA74PkcVwqitlOgr3SePrtqgBZJ4KN+oLIoDxs87ezWZIe32QzO28qkrnE724sJQ/d71WZU2JJTEe/mUZx4nW/I7rD843cU4tsZzPj+Ege4h95wnWJF0X6rVk4xojFnSrluWozr4bRjf/s/5N94wDv4vcITEXgX+716+/afoIPAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAN8AAAAVBAMAAAA0pCbNAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzWYQMplU74mrdiK7RN1/7zyFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADVElEQVRIDeVUTUhUURg9zhvH+U+yFi7CwRa267oyXeRsglppxZRF5SOIaKVhFNHfBBkpghaFrpoJEqwWPoIgCMJNRCQ1uzZRtiiIFjVGpaRN5/vue2qLtrbog/vmO9+53znv3nfvAKsV4SlAxmpFODcDGasXKZrJWLX4fwyrNob3yLYmrgy5sCB69xKcrgHPh20TB/19d3LTWUBpzTA4QYxtHFIMpAiDGNyUDdJgS2sqlbzUHiAyCwXOBuxESybRZyE6EXOBowZoRXQRSmuG5lJ1LVs/whYDKZEDIn1Alet8wutphtEDI6ZVA/eUn3Txy4JkJ6YxCtywMJKBU+uMFWi4GzgFpTXDEySngPhp2GIgpXqtA1+BJuCiIj6CFcb8wqsSylDw1mOpDAxbGJ2CMwNspuF5oOAprVnqp/berwe0GEhZxRANnwE97NOIzHDVHMuzuKUKnpJ3FoBJT2FqwUQz1rDBoJAVGpoleyVFnoZaXJaSshjO81VcATwjh+aLMhBrHM9qBVvzFpS3j5dwnCssWa4we5kTZIWMz0ZpzdasG+RxCnk01OKylMykofONhkUBKyJpEosKH743EOCUM/jA/URDxnLRSh0nWMPUnKX5SebQvhZpF22ohy0uSakeDRNzQEdR0R+PFxbFz8nvC6cC7DXJYmTYFQgcefOjFBimRywNpEfQ/gXVfciLofbY6fweTHSFCa6wI6/oj0e3Z+Ep2bVu7xfVSzh8ezirMDSCyb7AMAeeZaHBbM0MQouRLA2DIrvZ017Lx1+39Kp8LPKPgJeugndUzLBSMAprDMLffcN4J2BpydK1CM1ugRhqMZDi4hn+oelxBayI41yUIa4YGirgFZQlUEdhO9NrvuERJDxLSxbr5QqP5XI/9su13VwKpKy6GE77fbZin3xTvh5wVk6ggg6DvWgy4Z/8jyFX4wHPbWM4j7intGbhr6juZetpfinp0enENsSwacXFD+oPEDoju94of20KYnnnJG6Z5oyFqTqEiryVBnh8pf8mlNYMY2hxqcN31aJ2B7qI0zDtOieWCn6S6Lph5MilcgdKUID+gSyi/bxiFu7oYrrvwvoMGioVHhmhbRbtuk6VoQp3XIp2uq9bPVreBWfwTtbH/+znNwpLNV/ZnEjUAAAAAElFTkSuQmCC\n", "text/latex": [ - "$\\displaystyle 5.35677372658855 \\cdot 10^{-11}$" + "$$5.35695812626465 \\cdot 10^{-11}$$" ], "text/plain": [ - "5.35677372658855e-11" + "5.35695812626465e-11" ] }, - "execution_count": 68, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -2411,7 +2303,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -2424,15 +2316,15 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.53 s, sys: 493 µs, total: 1.53 s\n", - "Wall time: 1.52 s\n" + "CPU times: user 3.23 s, sys: 30.4 ms, total: 3.26 s\n", + "Wall time: 4.15 s\n" ] } ], @@ -2451,7 +2343,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 66, "metadata": {}, "outputs": [ { @@ -2486,15 +2378,15 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 63.8 ms, sys: 0 ns, total: 63.8 ms\n", - "Wall time: 63.6 ms\n" + "CPU times: user 120 ms, sys: 4.12 ms, total: 124 ms\n", + "Wall time: 164 ms\n" ] } ], @@ -2515,20 +2407,20 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 68, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAAPBAMAAAAL5A64AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMt2rmYlmIkR2uxDNVO+L8+I6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADaklEQVQ4Eb2UTWhcVRTHf/P15uNlPih0HTfuKh0lxY1tBpxqodo8TUaIGwfESqmQR9FtO4i7Cs0iKtnUobjQivpo4y52piBFUOkI6tIEkbYw1aYVa8okPs8597UMpG49MOe9e89/fv/7zr3vsWuq1QpIwm+er2GJ3PILkHtf0lutz6Q8/55Uluc6TBxPPZ9o7F8rrSfBKFaBVCOh7bwYbyGO47rWykO4SG7TJf8bnoPvuRDmG6y1We1k+2RhP5U4DpwGfonwr3EywihWgbThdtiJ1ng8CxmtXpwdwWH4w6VSg/N46+T6xW2qj/ARpS4/wyoTsx8kQn/fdERmnUzDUawCZx/maFrjEYB0TsITx19hOrR0JpSpUp3yqHCDar/wt0pehgtufaaBhUhq5DYcxVZO/o2HOZrWeMIpLCrNHK9GTNcsfa5T1TqFbbmutUvrOj7zKS85R9MYpdelqMsRinPMTfyn431eSWHOUS57I0tbu5c69BoU7oH/KNXL84ek/fFrAzJHl2qqV+FCREWecVOGQnGV19XRn18KVTQWok14smwL7aos9S9L/labxzgVkLpH/sXD9K6QHsArWxGlKK8OJhSKtHTiroyFYhV/UR3fDvOBTI6HaB0Pf8PNO0c7aOm6H8OR6FSDlK7gbKe3QXZI+dDeGyo+Jz8TCoVP+Ek6n1DOkUMc/d9ZqalyLNTR8Yp9N+0cmzqQdEda1rnfhcpQTqu3yasU/xEPZkLTWFcpH9t9GxLKTPiDOmauLR9X0Op3Gpf1Vncg4aW7NmEnh2JDBpr2iKQtO13ezoeUttN9vLsMYXLwlDS344RKkcjIfihFK6cDdZQ/7gjRGs8OpFXtGX9EDDQd0GeUV9AbVUfiKG+dt6mdy7RvyjNGpnHPiFqYh1a+mmrO/LZYDXYY6uqMJ6tuuKo6pgKKoaXJiCPuC1Dpkh6lRmTXuS6nIxT5Hic0R2/IZOgoVoFKnbQ4LjrsgyyO7gvAmlR7femlOJ5ozT3hUiaQ3ZfjeqnmtfUrt49LA96NOMabeNedBj6MKH7rXxGqUqwijl3d1ZXwgZe7Ea3x4OTADl72wNYzXI3jOy4xN1uDL5cfh3eaH8s3/aDcpabmOuQPTkWJ5ulbX7dpNTuCVIpVyH3xZ5ulo22ZHA/TGm989n+5/xc1gERnYT01lAAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle 7.123089551453573e-10$" + "$$7.122603685219754e-10$$" ], "text/plain": [ - "7.123089551453573e-10" + "7.122603685219754e-10" ] }, - "execution_count": 73, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -2548,13 +2440,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Generate code from sympy expressions and execute\n", + "### Generate code from sympy expressions and execute\n", "Need to install gfortran system-wide first!" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 69, "metadata": {}, "outputs": [], "source": [ @@ -2563,73 +2455,73 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "from sympy import symbols\n", "x, y, z = symbols('x y z')\n", "expr = ((x - y + z)**(13)).expand()\n", - "binary_func = autowrap(expr)" + "autowrap_func = autowrap(expr)" ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 7 µs, sys: 1 µs, total: 8 µs\n", - "Wall time: 12.6 µs\n" + "CPU times: user 12 µs, sys: 1 µs, total: 13 µs\n", + "Wall time: 19.6 µs\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPCAYAAAB5lebdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABWElEQVRIDc2VjW3CMBCF4yoDVO0GYQNoJygjsEIZAYkRGAE6AaIbFDZo2KBswM8G4XvBh0yUVKlClZz0Yvt8d345/5zLsizqgjjnZvDYgxPogSXctrRRJJL3AuFG4Age/xIT+1S+5iN/8AMS6WI6jYQMKOAH2IEEaFxb8B9jLDKf5kT/hF7jFRjcLYv6Y0QLqlM7k9h+gZX8Q6DTruSxHui0LcMKAjqbkmGrJP1REZGDPhWStEoSUk+emGUt5Hkl3jZJI/XbZXuOfco3Zl2zfeeQX96wmg4VZtdslcxblvcxiynVgxKjf1dpbZKkdYxQuKZld9eF7V7DzAiFJI34ugsk9WC/hOx8X6Vxm+80n5tHtMmYoBNQ+pijV7Y0lxbXQKcSWCyLKq992TYuiwSKOFdzGm2PPcwbdN+MRWhBq0To/Kl0CkXRnZgyn/iJV9o3fPLL6cS063IGbVpynMEbkMoAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", "text/latex": [ - "$\\displaystyle -1.0$" + "$$-1.0$$" ], "text/plain": [ "-1.0" ] }, - "execution_count": 76, + "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", - "binary_func(1, 4, 2)" + "autowrap_func(1, 4, 2)" ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 89.2 ms, sys: 233 µs, total: 89.5 ms\n", - "Wall time: 88.9 ms\n" + "CPU times: user 146 ms, sys: 14.3 ms, total: 161 ms\n", + "Wall time: 333 ms\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAPCAYAAAD+pA/bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAk0lEQVQ4EWP8//8/Ay0BEzUNZ2RkDAHi90AsADOXBcYgl4YaNhuo/x4QKwEx3HCwmaAgohYGGpgGxKAwF4CZSdUgArsYjRi1AC1AMLks0FSwF1MKr0gqMBLP4VUBlWQBKvwAZBsTo5gcNaORjB5qqLkYKMsIynGUAmBCmQk0QwiIXYAYZAkoAZwB4rNUsQBoEE4AAKEUWQBomgZbAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAPBAMAAAAMihLoAAAAJFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAEM0yVO+riWZ2mSMU5s8AAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAsSURBVAgdY2DAClgCEcJiZRsRHAYOMjlCSiCgzECWAZxIlnKlblqB5B4GBgDVtwt2YFScIgAAAABJRU5ErkJggg==\n", "text/latex": [ - "$\\displaystyle -1$" + "$$-1$$" ], "text/plain": [ "-1" ] }, - "execution_count": 77, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -2639,22 +2531,69 @@ "expr.subs({x:1, y:4, z:2})" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use of `autowrap` made the calculation 3 orders of magnitude faster than substitution of values into the original expression!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another way is to use `binary_function`:" + ] + }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "from sympy.utilities.autowrap import binary_function\n", - "binary_function?" + "f = binary_function('f', expr)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 5.36 ms, sys: 0 ns, total: 5.36 ms\n", + "Wall time: 6.78 ms\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", + "text/latex": [ + "$$-1.0$$" + ], + "text/plain": [ + "-1.0" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "f(x,y,z).evalf(2, subs={x:1, y:4, z:2})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, for the above example, `binary_function` was 10 times slower than `autowrap`." + ] } ], "metadata": { @@ -2689,7 +2628,7 @@ "height": "calc(100% - 180px)", "left": "10px", "top": "150px", - "width": "254px" + "width": "253.991px" }, "toc_section_display": "block", "toc_window_display": true diff --git a/docs/examples/api_features.rst b/docs/examples/api_features.rst new file mode 100644 index 0000000..0adbcae --- /dev/null +++ b/docs/examples/api_features.rst @@ -0,0 +1,1757 @@ + +Environmental Science for Symbolic Math +======================================== + +(Stan Schymanski and Jiri Kuncar) + +This notebook gives examples and common use cases for ESSM. The ESSM +package documentation can be obtained from here: +https://essm.readthedocs.io/en/latest/ + +The code is openly available here: +https://github.com/environmentalscience/essm + +Installation +============ + +See the documentation for different installation option, but the easiest +is: + +:: + + pip install essm + +General Jupyter setup +===================== + +We will first setup the IPython notebook to nicely render the results: + +.. code:: ipython3 + + import sys + before = [str(m) for m in sys.modules] # This is to track what modules have been imported in this notebook + +.. code:: ipython3 + + from IPython.display import display + from sympy import init_printing + init_printing() + from sympy.printing import StrPrinter + StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter) + +.. code:: ipython3 + + import scipy as sc + +Importing variables and equations +================================= + +.. code:: ipython3 + + # Import various functions from sympy + from sympy import Derivative, Eq, exp, log, solve, Symbol + +.. code:: ipython3 + + from essm.variables import Variable + from essm.variables.utils import generate_metadata_table + +.. code:: ipython3 + + import essm.variables.chamber.insulation as insulation_vars + import essm.equations.chamber.insulation as insulation_eqs + +.. code:: ipython3 + + vars = ['insulation_vars.' + name for name in insulation_vars.__all__] + generate_metadata_table([eval(name) for name in vars]) + + + + +.. raw:: html + +
SymbolNameDescriptionDefinitionDefault valueUnits
$A_i$A_iConducting area of insulation material.$$-m$^{2}$
$c_{pi}$c_piHeat capacity of insulation material.$$-J K$^{-1}$ kg$^{-1}$
$dT_i$dT_iTemperature increment of insulation material.$$-K
$L_i$L_iThickness of insulation material.$$-m
$lambda_i$lambda_iHeat conductivity of insulation material.$$-J K$^{-1}$ m$^{-1}$ s$^{-1}$
$Q_i$Q_iHeat conduction through insulation material.$$-J s$^{-1}$
$rho_i$rho_iDensity of insulation material.$$-kg m$^{-3}$
+ + + +.. code:: ipython3 + + eqs = ['insulation_eqs.' + name for name in insulation_eqs.__all__] + #generate_metadata_table([eval(name) for name in eqs]) + +.. code:: ipython3 + + from essm.variables.chamber import * + from essm.variables.leaf import * + from essm.variables.physics.thermodynamics import * + from essm.equations.chamber import * + from essm.equations.leaf import * + from essm.equations.physics.thermodynamics import * + +Plotting +======== + +.. code:: ipython3 + + import matplotlib.pyplot as plt + from sympy import latex + from sympy import N + from numpy import arange + from essm.variables.units import derive_unit, SI, Quantity + from essm.variables.utils import markdown + + def plot_expr2(xvar_min_max, yldata, yllabel=None, yrdata=None, + yrlabel='', clf=True, npoints=100, ylmin=None, ylmax=None, + yrmin=None, yrmax=None, xlabel=None, + colors=None, + loc_legend_left='best', loc_legend_right='right', + linestylesl=['-', '--', '-.', ':'], + linestylesr=['-', '--', '-.', ':'], + fontsize=None, fontsize_ticks=None, fontsize_labels=None, + fontsize_legend=None, + fig1=None, **args): + ''' + Plot expressions as function of xvar from xmin to xmax. + + **Examples:** + + from essm.variables import Variable + from essm.variables.physics.thermodynamics import T_a + from essm.equations.physics.thermodynamics import eq_nua, eq_ka + vdict = Variable.__defaults__.copy() + expr = eq_nua.subs(vdict) + exprr = eq_ka.subs(vdict) + xvar = T_a + yldata = [(expr.rhs, 'full'), (expr.rhs/2, 'half')] + yrdata = exprr + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata) + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), + yrdata=[(1/exprr.lhs, 1/exprr.rhs)], + loc_legend_right='lower right') + plot_expr2((T_a, 273, 373), expr) + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) + ''' + (xvar, xmin, xmax) = xvar_min_max + if not colors: + if yrdata is not None: + colors = ['black', 'blue', 'red', 'green'] + else: + colors = ['blue', 'black', 'red', 'green'] + if fontsize: + fontsize_labels = fontsize + fontsize_legend = fontsize + fontsize_ticks = fontsize + if not fig1: + plt.close + plt.clf + fig = plt.figure(**args) + else: + fig = fig1 + if hasattr(xvar, 'definition'): + unit1 = derive_unit(xvar) + if unit1 != 1: + strunit = ' (' + markdown(unit1) + ')' + else: + strunit = '' + if not xlabel: + xlabel = '$'+latex(xvar)+'$'+ strunit + else: + if not xlabel: + xlabel = xvar + if hasattr(yldata, 'lhs'): + yldata = (yldata.rhs, yldata.lhs) + if not yllabel: + if type(yldata) is tuple: + yllabel = yldata[1] + else: + try: + yllabel = yldata[0][1] + except Exception as e1: + print(e1) + print('yldata must be equation or list of (expr, name) tuples') + + if type(yllabel) is not str: + unit1 = derive_unit(yllabel) + if unit1 != 1: + strunit = ' (' + markdown(unit1) + ')' + else: + strunit = '' + + yllabel = '$'+latex(yllabel)+'$'+ strunit + if type (yldata) is not list and type(yldata) is not tuple: + # If only an expression given + yldata = [(yldata, '')] + if type(yldata[0]) is not tuple: + yldata = [yldata] + if yrdata is not None: + if yrlabel == '': + if hasattr(yrdata, 'lhs'): + yrlabel = yrdata.lhs + if type (yrdata) is not list and type(yrdata) is not tuple: + # If only an expression given + yrdata = [yrdata] + if type(yrlabel) is not str: + yrlabel = '$'+latex(yrlabel)+'$'+ ' (' + markdown(derive_unit(yrlabel)) + ')' + + xstep = (xmax - xmin)/npoints + xvals = arange(xmin, xmax, xstep) + + ax1 = fig.add_subplot(1, 1, 1) + if yrdata is not None: + color = colors[0] + else: + color = 'black' + if ylmin: ax1.set_ylim(ymin=float(ylmin)) + if ylmax: ax1.set_ylim(ymax=float(ylmax)) + ax1.set_xlabel(xlabel) + ax1.set_ylabel(yllabel, color=color) + ax1.tick_params(axis='y', labelcolor=color) + i = 0 + for (expr1, y1var) in yldata: + linestyle = linestylesl[i] + if yrdata is None: + color = colors[i] + i= i + 1 + try: + y1vals = [expr1.subs(xvar, dummy).n() for dummy in xvals] + ax1.plot(xvals, y1vals, color=color, linestyle=linestyle, label=y1var) + except Exception as e1: + print([expr1.subs(xvar, dummy) for dummy in xvals]) + print(e1) + if i > 1 or yrdata is not None: + plt.legend(loc=loc_legend_left, fontsize=fontsize_legend) + + if yrdata is not None: + ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis + color = colors[1] + ax2.set_ylabel(yrlabel, color=color) + i = 0 + + for item in yrdata: + if type(item) is tuple: # if item is tuple + (expr2, y2var) = item + else: + try: + (y2var, expr2) = (item.lhs, item.rhs) + except Exception as e1: + print(e1) + print('yrdata must be a list of equations or tuples (var, expr)') + return + linestyle = linestylesr[i] + i = i + 1 + try: + y2vals = [expr2.subs(xvar, dummy).n() for dummy in xvals] + ax2.plot(xvals, y2vals, color=color, linestyle=linestyle, label=y2var) + except Exception as e1: + print(expr2) + print([expr2.subs(xvar, dummy).n() for dummy in xvals]) + print(e1) + + if not yrlabel: + if hasattr(yrdata[0], 'lhs'): + yrlabel = yrdata[0].lhs + + if type(yrlabel) is not str: + yrlabel = '$'+latex(yrlabel)+'$'+ ' (' + markdown(derive_unit(yrlabel)) + ')' + ax2.tick_params(axis='y', labelcolor=color) + if yrmin: ax2.set_ylim(ymin=float(yrmin)) + if yrmax: ax2.set_ylim(ymax=float(yrmax)) + leg=ax2.legend(loc=loc_legend_right, fontsize=fontsize_legend) + ax2.add_artist(leg); + for item in ([ax2.xaxis.label, ax2.yaxis.label]): + item.set_fontsize(fontsize_labels) + ax2.tick_params(axis='both', which='major', labelsize=fontsize_ticks) + + for item in ([ax1.xaxis.label, ax1.yaxis.label]): + item.set_fontsize(fontsize_labels) + ax1.tick_params(axis='both', which='major', labelsize=fontsize_ticks) + fig.tight_layout() # otherwise the right y-label is slightly clipped + return fig + + vdict = Variable.__defaults__.copy() + expr = eq_nua.subs(vdict) + exprr = eq_ka.subs(vdict) + xvar = T_a + yldata = [(expr.rhs, 'full'), (expr.rhs/2, 'half')] + yrdata = exprr + + plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, yrmin=-0.0001, fontsize=14) # note that yrmin=0 would have no effect + plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, colors=['red', 'blue'], linestylesr=['--']) + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata) + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=[(1/exprr.rhs, 1/exprr.lhs)], + loc_legend_right='lower right') + plot_expr2((T_a, 273, 373), expr) + plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) + + + + +.. parsed-literal:: + +
+ + + +.. code:: ipython3 + + # Manipulate figure + fig = plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) + %matplotlib inline + fig.set_figwidth(8) + fig + + + + +.. image:: api_features_files/api_features_13_0.png + + + +Creating new variables +====================== + +To create custom variables, first import ``Variable``: + +.. code:: ipython3 + + from essm.variables import Variable + +To define units, you can either import these units from the library, +e.g. + +``from essm.variables.units import joule, kelvin, meter`` + +or import the appropriate units from sympy, e.g. + +``from sympy.physics.units import joule, kelvin, meter`` + +.. code:: ipython3 + + from sympy.physics.units import joule, kelvin, meter, mole, pascal, second + +Then you can define a custom variable with its name, description, +domain, latex_name, unit, and an optional default value, e.g.: + +.. code:: ipython3 + + class R_mol(Variable): + """Molar gas constant.""" + unit = joule/(kelvin*mole) + latex_name = 'R_{mol}' + default = 8.314472 + + +.. parsed-literal:: + + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_mol" will be overridden by "__main__:" + instance[expr] = instance + + +The variables defined above hold information about their docstring, +units, latex representations and default values if any. Each can be +accessed by e.g.: + +.. code:: ipython3 + + print(R_mol.__doc__) + print(R_mol.definition.unit) + print(R_mol.definition.latex_name) + print(R_mol.definition.default) + + +.. parsed-literal:: + + Molar gas constant. + J/(K*mol) + R_{mol} + 8.314472 + + +We will now define a few additional variables. + +.. code:: ipython3 + + class P_g(Variable): + """Pressure of gas.""" + unit = pascal + + class V_g(Variable): + """Volume of gas.""" + unit = meter**3 + + class n_g(Variable): + """Amount of gas.""" + unit = mole + + class n_w(Variable): + """Amount of water.""" + unit = mole + + class T_g(Variable): + """Temperature of gas.""" + unit = kelvin + + class P_wa(Variable): + """Partial pressure of water vapour in air.""" + unit = pascal + latex_name = 'P_{wa}' + + +.. parsed-literal:: + + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_wa" will be overridden by "__main__:" + instance[expr] = instance + + +Variables with expressions as definitions +----------------------------------------- + +.. code:: ipython3 + + class Delta_Pwa(Variable): + """Slope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$""" + expr = Derivative(P_wa,T_g) + latex_name = r'\Delta' + +.. code:: ipython3 + + Delta_Pwa.definition.unit + + + + +.. math:: + + \displaystyle \frac{\text{Pa}}{\text{K}} + + + +.. code:: ipython3 + + Delta_Pwa.definition.expr + + + + +.. math:: + + \displaystyle \frac{d}{d T_g} P_{wa} + + + +.. code:: ipython3 + + generate_metadata_table([Delta_Pwa]) + + + + +.. raw:: html + +
SymbolNameDescriptionDefinitionDefault valueUnits
$\Delta$Delta_PwaSlope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$$\frac{d}{d T_g} P_{wa}$-K$^{-1}$ Pa
+ + + +Linking assumptions to variables +-------------------------------- + +We can specify if a given variable is a complex, real, integer etc. by +using the ``assumptions`` property during variable definition: + +.. code:: ipython3 + + class x(Variable): + """Positive real variable.""" + assumptions = {'positive': True, 'real': True} + + print(solve(x**2 - 1)) + + +.. parsed-literal:: + + [1] + + +Creating new equations +====================== + +Equations have a left hand side and a right hand side and if they +contain variables with units, the units of each addend must be the same. + +Custom equation +--------------- + +To create custom equations, first import ``Equation``: + +.. code:: ipython3 + + from essm.equations import Equation + +We will now define an equation representing the ideal gas law, based on +the variables defined above: + +.. code:: ipython3 + + class eq_ideal_gas_law(Equation): + """Ideal gas law.""" + + expr = Eq(P_g*V_g, n_g*R_mol*T_g) + +Note that whenever an equation is defined, its units are checked for +consistency in the background and if they are not consistent, an error +message will be printed. To illustrate this, we will try to define the +above equation again, but omit temperature on the right hand side: + +.. code:: ipython3 + + try: + class eq_ideal_gas_law(Equation): + """Ideal gas law.""" + + expr = Eq(P_g*V_g, n_g*R_mol) + except Exception as exc1: + print(exc1) + + +.. parsed-literal:: + + Dimension of "R_mol*n_g" is Dimension(length**2*mass/(temperature*time**2)), but it should be the same as P_g*V_g, i.e. Dimension(length**2*mass/time**2) + + +The equation can be displayed in typesetted form, and the documentation +string can be accessed in a similar way as for Variable: + +.. code:: ipython3 + + display(eq_ideal_gas_law) + print(eq_ideal_gas_law.__doc__) + + + +.. math:: + + \displaystyle P_g V_g = R_{mol} T_g n_g + + +.. parsed-literal:: + + Ideal gas law. + + +New equation based on manipulation of previous equations +-------------------------------------------------------- + +We can use the above equation just as any Sympy expression, and +e.g. solve it for pressure: + +.. code:: ipython3 + + soln = solve(eq_ideal_gas_law, P_g, dict=True); print(soln) + + +.. parsed-literal:: + + [{P_g: R_mol*T_g*n_g/V_g}] + + +If we want to define a new equation based on a manipulation of +eq_ideal_gas_law we can specify that the parent of the new equation is +``eq_ideal_gas_law.definition``: + +.. code:: ipython3 + + class eq_Pg(eq_ideal_gas_law.definition): + """Calculate pressure of ideal gas.""" + + expr = Eq(P_g, soln[0][P_g]) + eq_Pg + + + + +.. math:: + + \displaystyle P_g = \frac{R_{mol} T_g n_g}{V_g} + + + +We can also have nested inheritance, if we now define another equation +based on eq_Pg: + +.. code:: ipython3 + + class eq_Pwa_nw(eq_Pg.definition): + """Calculate vapour pressure from amount of water in gas.""" + + expr = Eq(P_wa, eq_Pg.rhs.subs(n_g, n_w)) + eq_Pwa_nw + + + + +.. math:: + + \displaystyle P_{wa} = \frac{R_{mol} T_g n_w}{V_g} + + + +Show inheritance of equations +----------------------------- + +To see the inheritance of the newly created equation: + +.. code:: ipython3 + + eq_Pwa_nw.definition.__bases__ + + + + +.. parsed-literal:: + + (__main__.eq_Pg,) + + + +.. code:: ipython3 + + [parent.name for parent in eq_Pwa_nw.definition.__bases__] + + + + +.. parsed-literal:: + + ['eq_Pg'] + + + +.. code:: ipython3 + + [parent.expr for parent in eq_Pwa_nw.definition.__bases__] + + + + +.. math:: + + \displaystyle \left[ P_g = \frac{R_{mol} T_g n_g}{V_g}\right] + + + +We can also write a function to get all parents recursively: + +.. code:: ipython3 + + def get_parents(equation, allparents=set()): + """Return set of recursive parents of equation.""" + + parents = equation.definition.__bases__ + for parent in parents: + if hasattr(parent, 'name'): + allparents.update([parent.name]) + get_parents(eval(parent.name)) + return allparents + get_parents(eq_Pwa_nw) + + + + +.. parsed-literal:: + + {'eq_Pg', 'eq_ideal_gas_law'} + + + +Computational burden of deriving equations within class definition +------------------------------------------------------------------ + +If we solve for a variable to derive a new equation, is the solve() +command performed every time this equation is used? + +.. code:: ipython3 + + class eq_Pg1(eq_ideal_gas_law.definition): + """Calculate pressure of ideal gas.""" + from sympy import solve + soln = solve(eq_ideal_gas_law, P_g, dict=True); print(soln) + expr = Eq(P_g, soln[0][P_g]) + eq_Pg1 + + +.. parsed-literal:: + + [{P_g: R_mol*T_g*n_g/V_g}] + + +.. parsed-literal:: + + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pg" will be overridden by "__main__:" + instance[expr] = instance + + + + +.. math:: + + \displaystyle P_g = \frac{R_{mol} T_g n_g}{V_g} + + + +.. code:: ipython3 + + %time + eq_Pg.subs({R_mol: 8.314, T_g: 300, n_g: 0.1, V_g: 1}) + + +.. parsed-literal:: + + CPU times: user 2 µs, sys: 1 µs, total: 3 µs + Wall time: 9.3 µs + + + + +.. math:: + + \displaystyle P_g = 249.42 + + + +.. code:: ipython3 + + %time + eq_Pg1.subs({R_mol: 8.314, T_g: 300, n_g: 0.1, V_g: 1}) + + +.. parsed-literal:: + + CPU times: user 2 µs, sys: 1e+03 ns, total: 3 µs + Wall time: 9.54 µs + + + + +.. math:: + + \displaystyle P_g = 249.42 + + + +There is actually no difference! + +Empirical equations with internal variables +------------------------------------------- + +Empirical equations not only contain variables but also numbers. As an +example, we will try to define the Clausius-Clapeyron equation for +saturation vapour pressure in the following example, after defining a +few additional variables used in this equation. + +.. math:: P_{wa} = 611 e^\frac{-M_w \lambda_E (1/T_g - 1/273)}{R_{mol}} + +.. code:: ipython3 + + from sympy.physics.units import joule, kilogram + class lambda_E(Variable): + """Latent heat of evaporation.""" + unit = joule/kilogram + latex_name = '\\lambda_E' + default = 2.45e6 + + class M_w(Variable): + """Molar mass of water.""" + unit = kilogram/mole + default = 0.018 + + +.. parsed-literal:: + + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:lambda_E" will be overridden by "__main__:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_w" will be overridden by "__main__:" + instance[expr] = instance + + +.. code:: ipython3 + + from sympy import exp + try: + class eq_Pwa_CC(Equation): + """Clausius-Clapeyron P_wa as function of T_g. + + \cite[Eq. B3]{hartmann_global_1994} + """ + + expr = Eq(P_wa, 611.*exp(-M_w*lambda_E*(1/T_g - 1/273.)/R_mol)) + except Exception as exc1: + print(exc1) + + +.. parsed-literal:: + + Dimension of "1/T_g" is Dimension(1/temperature), but it should be the same as -0.00366300366300366, i.e. Dimension(1) + + +The unit mismatch reported in the error message stems from the fact that +the numbers in the empirical equation actually need units. Since the +term in the exponent has to be non-dimensional, the units of ``611`` +must be the same as those of ``P_wa``, i.e. pascal. The units of the +subtraction term in the exponent must match, meaning that ``273`` needs +units of kelvin. To avoid the error message, we can define the empirical +numbers as internal variables to the equation we want to define: + +.. code:: ipython3 + + class eq_Pwa_CC(Equation): + """Clausius-Clapeyron P_wa as function of T_g. + + Eq. B3 in :cite{hartmann_global_1994} + """ + + class p_CC1(Variable): + """Internal parameter of eq_Pwl.""" + unit = pascal + latex_name = '611' + default = 611. + + + + class p_CC2(Variable): + """Internal parameter of eq_Pwl.""" + unit = kelvin + latex_name = '273' + default = 273. + + expr = Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(1/T_g - 1/p_CC2)/R_mol)) + +In the above, we defined the latex representation of the empirical +constants as their actual values, so the equation displays in the +familiar way: + +.. code:: ipython3 + + eq_Pwa_CC + + + + +.. math:: + + \displaystyle P_{wa} = 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} + + + +All default values of variables defined along with the variable +definitions are stored in a dictionary that can be accessed as +``Variable.__defaults__``. We can substitute the values from this +dictionary into our empirical equation to plot saturation vapour +pressure as a function of temperature: + +.. code:: ipython3 + + expr = eq_Pwa_CC.subs(Variable.__defaults__) + print(expr) + xvar = T_g + p = plot_expr2((xvar, 273, 373), expr) + + +.. parsed-literal:: + + Eq(P_wa, 167405731976.232*exp(-5304.00487246815/T_g)) + + + +.. image:: api_features_files/api_features_64_1.png + + +Deduction of correct units for internal variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sometimes, the correct units of internal variables in an empirical +equation is not clear a priori. + +Piecewise defined equations +--------------------------- + +.. code:: ipython3 + + from sympy import Piecewise + expr = Eq(P_wa, Piecewise((0, T_a < 0), (eq_Pwa_CC.rhs, T_a >= 0))) + expr + + + + +.. math:: + + \displaystyle P_{wa} = \begin{cases} 0 & \text{for}\: T_a < 0 \\611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} & \text{otherwise} \end{cases} + + + +.. code:: ipython3 + + try: + class eq1(Equation): + """Test""" + expr = Eq(P_wa, Piecewise((0, T_a < 0), (eq_Pwa_CC.rhs, T_a >= 0))) + display(eq1) + except Exception as e1: + print(e1) + + + +.. math:: + + \displaystyle P_{wa} = \begin{cases} 0 & \text{for}\: T_a < 0 \\611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} & \text{otherwise} \end{cases} + + +**If the above returns a dimension error, then unit checking for +``Piecewise`` has not been implemented yet.** + +Substituting into integrals and derivatives and evaluating +========================================================== + +Above, we defined ``Delta_Pwa`` as a variable that represents the +partial derivative of ``P_wa`` with respect to ``T_g``: + +:: + + class Delta_Pwa(Variable): + """Slope of saturated vapour pressure, $\partial P_{ws} / \partial T_g""" + expr = P_wa(T_g).diff(T_g) + #unit = pascal/kelvin + latex_name = r'\Delta' + +This definition can be accessed by typing ``Delta_Pwa.definition.expr``. +Example: + +.. code:: ipython3 + + print(Delta_Pwa.definition.expr) + display(Eq(Delta_Pwa, Delta_Pwa.definition.expr)) + + +.. parsed-literal:: + + Derivative(P_wa, T_g) + + + +.. math:: + + \displaystyle \Delta = \frac{d}{d T_g} P_{wa} + + +We also defined the Clausius-Clapeyron approximation to +:math:`P_{wa}(T_g)` as ``eq_Pwa_CC``. + +.. code:: ipython3 + + display(eq_Pwa_CC) + print(eq_Pwa_CC.__doc__) + + + +.. math:: + + \displaystyle P_{wa} = 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} + + +.. parsed-literal:: + + Clausius-Clapeyron P_wa as function of T_g. + + Eq. B3 in :cite{hartmann_global_1994} + + + +If we want to substitute this approximation into +``Delta_Pwa.definition.expr``, we need to use ``replace`` instead of +``subs`` and evaluate the derivative using ``doit()``: + +.. code:: ipython3 + + expr = Eq(Delta_Pwa, Delta_Pwa.definition.expr.replace(P_wa, eq_Pwa_CC.rhs).doit()) + display(expr) + p = plot_expr2((T_g, 273, 373), expr.subs(Variable.__defaults__)) + + + +.. math:: + + \displaystyle \Delta = \frac{M_w \lambda_E 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}}}{R_{mol} T_g^{2}} + + + +.. image:: api_features_files/api_features_75_1.png + + +If we only had the slope of the curve, we could take the integral to get +the absolute value: + +.. code:: ipython3 + + from sympy import Integral + class T_a1(Variable): + """Air temperature""" + unit = kelvin + latex_name = r'T_{a1}' + + class T_a2(Variable): + """Air temperature""" + unit = kelvin + latex_name = r'T_{a2}' + + class P_wa1(Variable): + """P_wa at T1""" + unit = pascal + latex_name = r'P_{wa1}' + + class eq_Pwa_Delta(Equation): + """P_wa deduced from the integral of Delta""" + expr = Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2))) + display(eq_Pwa_Delta) + + + +.. math:: + + \displaystyle P_{wa} = P_{wa1} + \int\limits_{T_{a1}}^{T_{a2}} \Delta\, dT_g + + +.. code:: ipython3 + + expr_Delta = eq_Pwa_CC.rhs.diff(T_g) + expr = Eq(P_wa, eq_Pwa_Delta.rhs.replace(Delta_Pwa, expr_Delta).doit()) + vdict = Variable.__defaults__.copy() + vdict[T_a1] = 273. + vdict[P_wa1] = eq_Pwa_CC.rhs.subs(T_g, T_a1).subs(vdict) + display(expr.subs(vdict)) + p = plot_expr2((T_a2, 273, 373), expr.subs(vdict)) + + + +.. math:: + + \displaystyle P_{wa} = 167405731976.232 e^{- \frac{5304.00487246815}{T_{a2}}} + + + +.. image:: api_features_files/api_features_78_1.png + + +Unit conversions +================ + +Values for variables are often given in obscure units, but to convert to +our standard units, we can use the dictionary +``SI_EXTENDED_DIMENSIONS``: + +.. code:: ipython3 + + from sympy.physics.units import convert_to, kilo, mega, joule, kilogram, meter, second, inch, hour + from essm.variables.units import SI_EXTENDED_DIMENSIONS, SI_EXTENDED_UNITS + value1 = 0.3 + unit1 = inch/hour + print(value1*unit1) + unit2 = Variable.get_dimensional_expr(unit1).subs(SI_EXTENDED_DIMENSIONS) + print(convert_to(value1*unit1, unit2)) + + +.. parsed-literal:: + + 0.3*inch/hour + 2.11666666666667e-6*m/s + + +Exporting definitions +===================== + +The below example exports all relevant definitions from this jupyter +notebook into a file called ``test_definitions.py``, from which they can +be re-imported into a different notebook just by executing +``from test_definitions import *``, as shown below. + +.. code:: ipython3 + + from sympy import preorder_traversal + def extract_units(expr): + """Traverse through expression and return set of units.""" + return { + arg + for arg in preorder_traversal(expr) if isinstance(arg, Quantity) + } + +.. code:: ipython3 + + with open('test_definitions.py', 'wt') as file1: + file1.write('from essm.variables._core import BaseVariable, Variable\n') + file1.write('from essm.equations import Equation\n') + file1.write('from sympy import Abs, Derivative, Eq, exp, Integral, log, Piecewise, sqrt\n') + # Create import strings for all units + StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m) + s = set() + for unit in Variable.__units__.values(): + for item in extract_units(unit): + s.add(item) + commandstr = 'from sympy.physics.units import ' + str(s)[1:-1] + file1.write(commandstr.replace("\n", " ") + "\n") + + for variable in Variable.__registry__.keys(): + symbol = variable.definition.latex_name + name = variable.name + doc = variable.__doc__ + unit = variable.definition.unit + assumptions = variable.definition.assumptions + latex_name = variable.definition.latex_name + expression = Variable.__expressions__.get(variable, None) + default = str(Variable.__defaults__.get(variable, None)) + commandstr = '''{0} = type('{0}', (Variable,), {{'__doc__': """{1}""", 'unit': {2}, 'assumptions': {3}, \ + 'latex_name': r"{4}", 'default': {5}, 'expr': {6}}})'''.format( + name, doc.replace('\n', ' ').replace('\r', ''), unit, assumptions, latex_name,\ + default, expression) + file1.write(commandstr + "\n") + + for eq in Equation.__registry__.keys(): + name = eq.definition.name + doc = eq.__doc__ + equ = eq + commandstr = '''{0} = type('{0}', (Equation,), {{'__doc__': """{1}""", 'expr': {2}}})'''.format( + name, doc.replace('\n', ' ').replace('\r', ''), equ) + file1.write(commandstr + "\n") + + StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter) + +.. code:: ipython3 + + from test_definitions import * + + +.. parsed-literal:: + + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:c_pi" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:lambda_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:rho_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:L_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:A_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:Q_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:dT_i" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:alpha_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pa" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pamol" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pv" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:C_wa" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:D_va" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:g" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Gr" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:h_c" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:k_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:lambda_E" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Le" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_air" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_N2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_O2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:M_w" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:nu_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Nu" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Pr" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_N2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_O2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_wa" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_was" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_d" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Re_c" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Re" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:rho_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_u" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:R_mol" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_s" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:sigm" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:T0" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:T_a" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:v_w" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:x_N2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:x_O2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_Dva1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_Dva2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_alpha1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_alpha2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_ka1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_ka2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_nua1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_nua2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_g" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:V_g" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:n_g" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:n_w" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_g" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:Delta_Pwa" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:x" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:p_CC1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:p_CC2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_a1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_a2" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_wa1" will be overridden by "essm.variables._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.chamber.insulation:eq_Qi" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Le" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Cwa" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Dva" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_alphaa" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_ka" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_nua" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_rhoa_Pwa_Ta" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Pa" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PN2_PO2" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PO2" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PN2" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_rhoa" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_ideal_gas_law" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pg1" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_nw" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_CC" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq1" will be overridden by "essm.equations._core:" + instance[expr] = instance + /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_Delta" will be overridden by "essm.equations._core:" + instance[expr] = instance + + +Numerical evaluations +===================== + +See here for detailed instructions on how to turn sympy expressions into +code: https://docs.sympy.org/latest/modules/codegen.html + +We will first list all equations defined in this worksheet: + +.. code:: ipython3 + + for eq in Equation.__registry__.keys(): + print(eq.definition.name + ': ' + str(eq)) + + +.. parsed-literal:: + + eq_Qi: Eq(Q_i, A_i*dT_i*lambda_i/L_i) + eq_Le: Eq(Le, alpha_a/D_va) + eq_Cwa: Eq(C_wa, P_wa/(R_mol*T_a)) + eq_Nu_forced_all: Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000) + eq_Dva: Eq(D_va, T_a*p_Dva1 - p_Dva2) + eq_alphaa: Eq(alpha_a, T_a*p_alpha1 - p_alpha2) + eq_ka: Eq(k_a, T_a*p_ka1 + p_ka2) + eq_nua: Eq(nu_a, T_a*p_nua1 - p_nua2) + eq_rhoa_Pwa_Ta: Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a)) + eq_Pa: Eq(P_a, P_N2 + P_O2 + P_wa) + eq_PN2_PO2: Eq(P_N2, P_O2*x_N2/x_O2) + eq_PO2: Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2)) + eq_PN2: Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2)) + eq_rhoa: Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2)) + eq_ideal_gas_law: Eq(P_g*V_g, R_mol*T_g*n_g) + eq_Pg: Eq(P_g, R_mol*T_g*n_g/V_g) + eq_Pwa_nw: Eq(P_wa, R_mol*T_g*n_w/V_g) + eq_Pwa_CC: Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol)) + eq1: Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True))) + eq_Pwa_Delta: Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2))) + eq_Nu_forced_all: Eq(Nu, -Pr**0.333333333333333*(-37*Re**0.8 - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**0.8)/1000) + + +Substitution of equations and values into equations +--------------------------------------------------- + +The easiest way is to define a dictionary with all variables we want to +substitute as keys. We start with the default variables and then add +more. First, however, we will define a function to display the contents +of a dictionary: + +.. code:: ipython3 + + def print_dict(vdict, list_vars=None): + """Print values and units of variables in vdict.""" + if not list_vars: + list_vars = vdict.keys() + for var1 in list_vars: + unit1 = var1.definition.unit + if unit1 == 1: + unit1 = '' + if vdict[var1] is not None: + print('{0}: {1} {2}'.format(var1.name, str(vdict[var1]), str(unit1))) + +.. code:: ipython3 + + vdict = Variable.__defaults__.copy() + print_dict(vdict) + + +.. parsed-literal:: + + c_pa: 1010.0 J/(K*kg) + c_pamol: 29.19 J/(K*mol) + c_pv: 1864 J/(K*kg) + g: 9.81 m/s**2 + lambda_E: 2450000.0 J/kg + M_air: 0.02897 kg/mol + M_N2: 0.028 kg/mol + M_O2: 0.032 kg/mol + M_w: 0.018 kg/mol + R_mol: 8.314472 J/(K*mol) + sigm: 5.67e-08 J/(K**4*m**2*s) + T0: 273.15 K + x_N2: 0.79 + x_O2: 0.21 + p_Dva1: 1.49e-07 m**2/(K*s) + p_Dva2: 1.96e-05 m**2/s + p_alpha1: 1.32e-07 m**2/(K*s) + p_alpha2: 1.73e-05 m**2/s + p_ka1: 6.84e-05 J/(K**2*m*s) + p_ka2: 0.00563 J/(K*m*s) + p_nua1: 9e-08 m**2/(K*s) + p_nua2: 1.13e-05 m**2/s + p_CC1: 611.0 Pa + p_CC2: 273.0 K + + +We can substitute a range of equations into each other by using the +custom function ``subs_eq``: + +.. code:: ipython3 + + from essm.variables.utils import subs_eq + subs_eq(eq_Le, [eq_alphaa, eq_Dva]) + + + + +.. math:: + + \displaystyle N_{Le} = \frac{T_a p_1 - p_2}{T_a p_1 - p_2} + + + +We can also use subs_eq to substitute equations into each other and a +dictionary with values. We will first add an entry for T_a into the +dictionary and then substitute: + +.. code:: ipython3 + + vdict[T_a] = 300. + subs_eq(eq_Le, [eq_alphaa, eq_Dva], vdict) + + + + +.. math:: + + \displaystyle N_{Le} = 0.888446215139442 + + + +Evaluation of equations for long lists of variable sets +------------------------------------------------------- + +Substitution of variables into equations takes a lot of time if they +need to be evaluated for a large number of variables. We can use theano +to speed this up: + +.. code:: ipython3 + + #import theano + from sympy.printing.theanocode import theano_function + import numpy as np + + +.. parsed-literal:: + + WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions. + + +We will now create two long lists of values representing T_g and n_g +respectively and show how long it takes to compute ideal gas law values. + +.. code:: ipython3 + + npoints = 10000 + xmin = 290. + xmax = 310. + Tvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) + xmin = 0.1 + xmax = 0.5 + nvals = np.arange(xmin, xmax, (xmax-xmin)/npoints) + +.. code:: ipython3 + + %%time + # looping + expr = eq_ideal_gas_law.rhs.subs(Variable.__defaults__) + resvals0 = [] + for i in range(len(Tvals)): + resvals0.append(expr.subs({T_g: Tvals[i], n_g: nvals[i]})) + + +.. parsed-literal:: + + CPU times: user 8.88 s, sys: 11.7 ms, total: 8.89 s + Wall time: 8.89 s + + +.. code:: ipython3 + + %%time + # Using theano + f1 = theano_function([T_g, n_g], [eq_ideal_gas_law.rhs.subs(Variable.__defaults__)], dims={T_g:1, n_g:1}) + resvals1 = f1(Tvals,nvals) + + +.. parsed-literal:: + + CPU times: user 34.4 ms, sys: 11.6 ms, total: 46 ms + Wall time: 760 ms + + +.. code:: ipython3 + + list(resvals0) == list(resvals1) + + + + +.. parsed-literal:: + + True + + + +**Both approaches give identical results, but ``theano_function`` makes +it a lot faster.** + +Numerical solution +------------------ + +Some equations cannot be solved analytically for a given variable, +e.g. eq_Nu_forced_all cannot be solved analytically for Re if Nu is +given, so we can use numerical solvers instead: + +.. code:: ipython3 + + from sympy import nsolve + +.. code:: ipython3 + + vdict = Variable.__defaults__.copy() + vdict[Pr] = 0.71 + vdict[Re_c] = 3000. + vdict[Nu] = 1000. + expr = eq_Nu_forced_all.subs(vdict) + nsolve(expr, 1000.) + + + + +.. math:: + + \displaystyle 690263.0346446 + + + +Now applying to a long list of Nu-values: + +.. code:: ipython3 + + npoints = 100 + xmin = 1000. + xmax = 1200. + Nuvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) + +.. code:: ipython3 + + %%time + # Solving for a range of Nu values + vdict = Variable.__defaults__.copy() + vdict[Pr] = 0.71 + vdict[Re_c] = 3000. + resvals = [] + for Nu1 in Nuvals: + vdict[Nu] = Nu1 + resvals.append(nsolve(eq_Nu_forced_all.subs(vdict), 1000.)) + + +.. parsed-literal:: + + CPU times: user 1.75 s, sys: 46 µs, total: 1.75 s + Wall time: 1.75 s + + +We will now again use a theano function to make it faster. First we +import optimize from scipy and preapre the theano_function: + +.. code:: ipython3 + + import scipy.optimize as sciopt + vdict = Variable.__defaults__.copy() + vdict[Pr] = 0.71 + vdict[Re_c] = 3000. + expr = eq_Nu_forced_all.subs(vdict) + expr1 = expr.rhs - expr.lhs + fun_tf = theano_function([Re, Nu], [expr1], dims={Nu:1, Re:1}) + x0vals = np.full(Nuvals.shape, fill_value=2000.) # array of same shape as Nuvals, with initial guess + +.. code:: ipython3 + + %%time + # Solving for a range of Nu values + resvals1 = sciopt.fsolve(fun_tf, args=Nuvals, x0=x0vals) + + +.. parsed-literal:: + + CPU times: user 5.6 ms, sys: 324 µs, total: 5.92 ms + Wall time: 5.9 ms + + +.. code:: ipython3 + + np.mean(abs((resvals - resvals1)/resvals)) + + + + +.. math:: + + \displaystyle 5.35677372658855 \cdot 10^{-11} + + + +**Using theano and scipy makes it 2 orders of magnitude faster and the +results are different only by 10\ :math:`^{-10}`\ %!** **Note, however, +that scipy gets slowed down for large arrays, so it is more efficient to +re-run it repreatedly with subsections of the arra:** + +.. code:: ipython3 + + npoints = 1000 + xmin = 1000. + xmax = 1200. + Nuvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) + x0vals = np.full(Nuvals.shape, fill_value=2000.) + +.. code:: ipython3 + + %%time + # Solving for a range of Nu values + resvals1 = sciopt.fsolve(fun_tf, args=Nuvals, x0=x0vals) + + +.. parsed-literal:: + + CPU times: user 1.53 s, sys: 493 µs, total: 1.53 s + Wall time: 1.52 s + + +We will now test that we can process Nuvals bit by bit and re-create it +consistently: + +.. code:: ipython3 + + # Solving for a range of Nu values + imax = len(Nuvals) + i0 = 0 + idiff = 100 + i1 = i0 + resvals2 = [] + while i1 < imax - 1: + i0 = i1 # note that resvals[0:2] + resvals[2:4] = resvals[0:4] + i1 = min(i0+idiff, imax) + resvals0 = Nuvals[i0:i1] + resvals2 = np.append(resvals2,resvals0) + print(list(resvals2) == list(Nuvals)) + + +.. parsed-literal:: + + True + + +Now we will run fsolve for portions of Nuvals bit by bit: + +.. code:: ipython3 + + %%time + # Solving for a range of Nu values + imax = len(Nuvals) + i0 = 0 + idiff = 100 + i1 = i0 + resvals2 = [] + while i1 < imax - 1: + i0 = i1 # note that resvals[0:2] + resvals[2:4] = resvals[0:4] + i1 = min(i0+idiff, imax) + resvals0 = sciopt.fsolve(fun_tf, args=Nuvals[i0:i1], x0=x0vals[i0:i1]) + resvals2 = np.append(resvals2,resvals0) + + +.. parsed-literal:: + + CPU times: user 63.8 ms, sys: 0 ns, total: 63.8 ms + Wall time: 63.6 ms + + +.. code:: ipython3 + + np.mean(abs((resvals1 - resvals2)/resvals1)) + + + + +.. math:: + + \displaystyle 7.123089551453573e-10 + + + +**It is strange that resvals1 and resvals2 are different at all, but +anyway, it is clear that slicing the data in relatively small portions +is important to keep ``scipy.optimize.fsolve`` time-efficient.** + +Generate code from sympy expressions and execute +------------------------------------------------ + +Need to install gfortran system-wide first! + +.. code:: ipython3 + + from sympy.utilities.autowrap import autowrap + +.. code:: ipython3 + + from sympy import symbols + x, y, z = symbols('x y z') + expr = ((x - y + z)**(13)).expand() + binary_func = autowrap(expr) + +.. code:: ipython3 + + %%time + binary_func(1, 4, 2) + + +.. parsed-literal:: + + CPU times: user 7 µs, sys: 1 µs, total: 8 µs + Wall time: 12.6 µs + + + + +.. math:: + + \displaystyle -1.0 + + + +.. code:: ipython3 + + %%time + expr.subs({x:1, y:4, z:2}) + + +.. parsed-literal:: + + CPU times: user 89.2 ms, sys: 233 µs, total: 89.5 ms + Wall time: 88.9 ms + + + + +.. math:: + + \displaystyle -1 + + + +.. code:: ipython3 + + from sympy.utilities.autowrap import binary_function + binary_function? + diff --git a/docs/examples/api_features_files/api_features_104_0.png b/docs/examples/api_features_files/api_features_104_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fabfebc53e8715139d1e6d3d9db53c3d0ca87cf1 GIT binary patch literal 1436 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 Hu0mjf&X5b> literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_119_0.png b/docs/examples/api_features_files/api_features_119_0.png new file mode 100644 index 0000000000000000000000000000000000000000..168bfa3a561f2db3cb49f387e831df6c77666394 GIT binary patch literal 2030 zcmVe5ng4MWHxPhrCIt{uL7)RNbU->FNd{j*f0qUQ*su{-K;wDmXhk zdsHFL**QKwz7Fe?#C|i?kC3nK4A43DAR|88_zb#N1#W3VtGpA6cHg4BXyt)BO1kgc z27aJu%S&kAhzKZb3_oa#Hhv5mYv|rlJ)``^*eQMesLikGS9Z?O!hbFZ{pc?JHf$&S zGd|y)d$MOJu4Z(f%Q;tsiFt0us=;}-Q4H3jk%EkSluwlFExkBOC5yg>srzow(>5SX zx~!AFa;3Z9;0=g-fupUC50smMiyB-dQ#@dxwEWti_0ZOygE=K!>$fMNudHWilU=KR zEajGMbU5$Ize$$1Z`#TDu+JxC4#m~1?sCposm(k#*NpMaSY>?K)eizUIs9N@+sVVf zBp9_xWnjDLy+riu(Zd@kpF%F}hZJSx1WC4t`%uui(3!8mYsb6jCtjVDlPku+X?v!n zt^GZj;;TfKj}mj%=B^Ku{#{!5hx{0}mo>cV*N+G51#U$5kk3QspiI}h>yy$>+Ecp2 zhO1Cx`_P&}w;QX_9Ifr*2HEYI2`7bXiD;nYL<+g!B6*iZqkoqoZT?D13;0te&1?F- zz>BYEPI~B^i$})%l}$2rWVVTRr6cGQKi&WM!5!!>$IJE%t$aXyP4XN{d1V_~zh=^# za0fQ^a3z1zH{|o+8YNkCs=FJwi-32m zo5(i!d$8cq`G)enbr8X0atZFT0ovGu(}XO?b;Modyl(VA25*wa9nz-vVBamd4n^Tua zUK{#X0@8f6Wjj_ezCEtF00;M}maf;AkK);C_edo_;7(!V;1~nWpw|{3Aq=)GleS}P zd?vPI4_h0-DbF#BN4YFB*|Usy_@tF5`-Qe&+00KnY^sjbN$xOhqTltSx+!^%w6(E! zG#%Cr|EkYRpFlS(Gx*@yjH?OV#!U4f7rdeC|ERH{yJpEYW2YD6Iab>wba9zSot&fn zHDlKJq3^!*we--%W5g2V^dso22Nd~$m|Qh+@O}+V=vYXJdv{TTtPF7ZB7v(1q>i2P z<~wIQUiP6|rDd$Us11KRziuLyJkj3LUC>lM5ByraC6lqKxPrc`JIQg)@;W4(>pJzG zu{MwM;?dt-Gw?&PdJV!76xKajl|)~n%_m#uc^~{`PaZT+6V1!?so(m{$Ip;&G2h~Axa=vRg0KtH|J zpU)~~Yzbnbk1R#Ht}v&=yra0S{r*zqjo~K>vQBUJ{gtS*s~f}GrE!K z2K0)#Pd`q<HW6Kr&7I|s=JM2fJeaiAJIEN?>|2mOycE%gj!v_Ki~cO<^LO#d}S{3!K^m*0|#v3knrG!X~SRetoku%+B)g3l4(>obTdAmnh&yL?bhOIM)$Hl<=m0)8W~4~Ce&rI6*?@!t8 zjy?DYoewArAWu1^4sCNGm*eJVs>L34d4D@exI5H;KzDGwMy9%@_40g5k=HLsE7J`^ za9lW`5s5r)^1(-0ww3Fnf&B_bX`wTqHvL!$rUQ@mIyZeLxOOIF_0&yKgbXO)2iSoGXk1(HA7d;spXNmWgkIwn7~Cz3`eQ^3 zs#80Y*nWYP{6nDAuH>;E=(H`v3IaNtl3}YP{ZSE-gFY3Kv`P|EPo9`%E#!G6-Zn`i z_1k58j(y5EW?i#==a66Cu$m4PX4h<$%v+ZCF^ehHgA${ES7~jMq;-r?xTa-y*M;p~ z!^{YUB#rpG3ncYmzl7|3U!`%I?=+vAN3_Y9pc7E~n4?#=G?y0FK&KK|EQ>0yec3iH ziv)@|S92O|k3GyAbl;3cXhEw)==`a43PsVKm@=REiC5Y;eDcfb#I);j25nk$oWUEA Q$^ZZW07*qoM6N<$f;v66umAu6 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_125_1.png b/docs/examples/api_features_files/api_features_125_1.png new file mode 100644 index 0000000000000000000000000000000000000000..56bafd5c59f2098f6319660ee99510958cf9553e GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^5O=u<5X=vX`tX_ zPZ!4!3&G?+|Nq-F>oN+P@}{Sx@Gw65?x4e9Je~EJ!t^#NGwBuo2{hap8; zc<~Gw)5Q~eP7`O2j@Sl?6iyAsIgF1shiqiX5b$GQSSS+7 UkTHub8t6O*Pgg&ebxsLQ02}v0`Tzg` literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_13_0.png b/docs/examples/api_features_files/api_features_13_0.png new file mode 100644 index 0000000000000000000000000000000000000000..97e1ef0d316cc12eb3b8b2d54d329c38424145c7 GIT binary patch literal 16681 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 aRS49SQ-HUY{2RD4L`z*yt@M`dv;PO?6m`)6 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_26_0.png b/docs/examples/api_features_files/api_features_26_0.png new file mode 100644 index 0000000000000000000000000000000000000000..141ac9c977f6eb79c0e49f3453e32b1336de8e71 GIT binary patch literal 699 zcmV;s0!00ZP)P001ip1^@s6jawtd00009a7bBm000ie z000ie0hKEb8vp z6I7C64|?Oyjs-EX=A)#yxnn2=OvPfuvNP${Wh!IjC0pJ2hShy+oNLIOZ$@4cml1TB>a9f|>z2=oA(Lk@Z%A(CgbC)tO4@rjX53H( hh|>OGj{eE<`v;^;B;t5Y8Q}l`002ovPDHLkV1f#~Ov(TN literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_27_0.png b/docs/examples/api_features_files/api_features_27_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb905bc0af8f0d824c09a26e83a145d0503b707 GIT binary patch literal 1418 zcmV;51$Fv~P)d=nu~E0Nf3q+r2tG3!TB;UM+Ddz7>M8?1E`CDG8yUCdP#7z8+hf1oXQyAY=4 znzeyZV@9tn0zBOmWz6P~vF~BE;}#YW9qjp=Mk z0B`^Rg7Q8<$$$vZ_kHj$%F`Jb#u%#z&L_B}z40#!wFxk<826>rjI2faoG>Tn9yN6W zCIg_hd|!}SZFvM(d*NS{r4uj?$n-TbIekr%`u{BaE!YJ}iC=>vcO zVlkaip?&U@5ZHaR62Q1W?~#9R?a))@bk(MMT667b0p+3iW$n4Tb{x9%4gcbe;YtF; zWB481^d+xfx^^Jx0eoW`6Xm*d(ln0r8lF82G-j|zH3BG8h@-f**e8WeCkP!swJ5I6(Zxt_(-7Ej1pwnzdYD*af+Llb@0Z??-ZJOrzIbt0H zES>XhZtzp?Ts$;4V8?}NvA%&$Npm0SY4F%B10?&d$G&fz3c_e_>7jEz&c>REo*}5Zl{+8D^1$F zDJ||3fQ*e^09ZKo#V&&=_i9Rj;BDV!NJ`$zBd;(94T}5i-IQ2Ea18D|`8=6kz=Nm% Y0Re}pdD5JPYybcN07*qoM6N<$g7n3xng9R* literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_38_0.png b/docs/examples/api_features_files/api_features_38_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4fde2e2215a5001b2dc966e4fa55ea45e2811800 GIT binary patch literal 1682 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 R4cY(z002ovPDHLkV1ilhugCxZ literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_48_0.png b/docs/examples/api_features_files/api_features_48_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f5cdbaa6730310bc1f667a9117f9939709808928 GIT binary patch literal 2311 zcmV+i3HbJjP)m75bO4ikqTCHE*l19&m2L}h|^2hSty}!J?eB(2g z_#%O!5;#0Oe5X3EEA=i8l>z8p$p3PMX9C@YOE1wy0)r(W(4ow3yNdS}KfM(*{s?4$ zT;VLD63R;r^ojh_IN&ca^qT*(Wb-lR?<5ePch&K4c@)8q7%E77e{*@zGPygqR#9;! z=SjsBa`&%6}kWdBt7q*~_bwh(`%K58HmUsx%u5(_6e<$q8D zknW{B+Dops$do1st$_Qw3a~7P@l$kQyE~y4DY2|K)2e{T|}*xO_C;@y&f6` z)4Maxp}w2;lx9+!G~F-N*~ucw1lW?8^`0)u1dUPCauIN+lxYI9yUc{x|eqARN9XAL?D znU#)vA;Bh%AwdH`PK>ttq1m{D2ldV5+di_bPvg63Ki5_#%U3`2@jYe&VzwAwtKE)e zfV-$WD%#rk8pE_8>;yQ5pfp;JNjV|CWd~2|%wyMnt}nZo<}U&tpz`L`>IYzprp>$? z-QaNUphK{=3D!g~2{;Q^sqOp)>|A+tIrwhe&vjMuWp1GvxT2-J_$K*R{*FAF)thnJ z!?ZU#)ny@|o!0K>BCi|>=nMByeN_)dZQx>G8~9K=$EugCLCXqw@&E;8uT3V3BX|V|fDT|Fx0kM*^k;daqkTT1WinMBV0~=)(8z~&6aw~h zD{Bg&m4^`y8(G^vt@5mYrNd#t(-4<~?{_|5X#hu|jU|;UuUEUiJ&UVu7~gC)odob) zo=IymA-2JWe@bbMF+I%BWz1FJ| zqv;#^wgf)R_PPT~uck}1d(^9^E23ah)o~{DtKx9#A=w5>N4i8eAprsGt~~qf;1uWj zgA?-UX1s6pA71VEtu#eC$pO=znfnssEZJ^v(1~#a0%!*q=2%VKNj(r_ zH$Jhd4ZpFrK9+Do5*PwHyCTV+0gXu(S}ft>Y)m|ljaMm+)^~t5mLZ@+)7|K0gLS&A zu#Z4?#oL_v?FBk%h}QjFo3K=ejVznkzmcZtg+r}+G~EDvh+{F-t|*2yu+VN#0=+;d zb_@jRDBi`QfWwV?0-4fWp=2Mw+v+cSx;Dv7C%-S~!ix+Id+i0I0LIk`2aV1b4$~3g zGLoSZ=)4>jfIi6cA>YjFsnTe%E{9gc+=?1k#x_&TMjv$5u}cv;Z$m(hP!$bDz#l*c>1-;su2XYqY|)UL02 z9WuxwFA;`xI7V6)uK>i$9lnb;zS?12qT|&GcbCrVLJ8qL@; zI`?!#2O|M(Pe4-Hs<9b{{~eIInnGPpbmlwO{Y-$1qo1ETG$u*|2>b zdpR?=8D|0<=64dWca}X}HnlrT@REmrvzo3<8aR2Zyh*&?SwPn?yW7rU4=3MhRwF-? zdA+lMZrcdEet*2)@$N*4F3sp^_bR^Z>Goa>ThZ;{s**$=4q8S+rj_<002ovPDHLkV1oY|T|58) literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_52_2.png b/docs/examples/api_features_files/api_features_52_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c99312f8cfa46c39ce59bf8470aa68615e869335 GIT binary patch literal 2164 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 BBgg;% literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_64_1.png b/docs/examples/api_features_files/api_features_64_1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa85b86179c11c4255bb6667e803b07787745ec6 GIT binary patch literal 9773 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�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 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_67_0.png b/docs/examples/api_features_files/api_features_67_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d5523801c5e184dad284e63e19b2f654ad0707 GIT binary patch literal 6144 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 S$zAjS0000>!zknOB}*`r}Vhl~j`DYu~#U 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 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_73_0.png b/docs/examples/api_features_files/api_features_73_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5580d48345a6e20c3699e3d9853a17bd3766df GIT binary patch literal 3163 zcmV-h45agkP)=x-0iO)G40hQJxc9V@Mz-bI`FLh$26dI!vOcX=yMJnXyhp!&{kqnmabTY~aCCHZ z4|@MYcK_Qay0=9u{JG6sx8cvHu{p1gHMIK1fnDT4RQfwj>BsL*`AcNS?ER@8B7%<%q^B zU0j>IabOV+AiN)u)%%O|ouUu({Q%G1s611kTp7nYv@q6C|9zi#&Ev0pJKDf)aRA{p zNu~E{up|ef;X02z%%hv)XI313ft&x5;}?fva|ft13;dJAz3uHzi9X+ zJf>~qVg8)?*J^?vZXK=?}~92f@HYm^EMN`8eaggZCZB z)PgQ;qtB!(YuUA`YG!?lM1Ezi&Nitj{ua5v15>F$D*tgw3m)kK*DAXLvKFBHK5DxM z&MAf6mr+(SMr$qRKn6#H+_~pX@ekzYF1U=FQ3!G8Po_q8^>Je~@>j92lpUEyGPc(ofZA;;2eHy(o;xPg$dFvC350@dGf|g>A zGicE82VOSCFF13^MQ=LmOA4f5A5*7NrMPZi!25T#+Z#fzh*7jU{%&N_r;^B zXew#wGn{MheKw*^@hcoU&?@(MX%BCfSEYN2u=uDaD3|5l+U@r+)@c}gwk=qnw+o?$ zKj5)moS!JWefY-FQEsjUy}QOI0DaRQ{!6MW&Pia4s*7Tzcd0k|7{heo@!;c#P+Fc+ zA94t^X?*(Oz3p$}IQb~Q{^C%f^E$X*2_j8KK&~YjVz(P^nOwiT|3tqUFKJo`KQ@XF}X~k(EM^9fTzcPEdBr17%)@XN=d#Xh<{` z3Z!|4Y()BH+Orb$+g7;-UshPkDivt*nlmlbOW#acx@FspZbs=&ZS-42@w3sSzurF> zW^n-0nCVJ*mpL<@?lW53E4#9_L6rl9wt6-9`N3Oo{)6L`;{!sp(&II7>PhvmVNdKF zltZq7vfea>x^%k$>g{i6Jvlf(NLAntercgzLua_1fqK2M+XNM{^K3kK>J=PA--WjX z^w%hwLs>b&Sdsuf4aaBj&EDVO;!=y%`ZOL*B?AaxHAJR9JVL9@L!04u2(fGJtJZ;2 zg)pk=Y+J-<{XD$1YZ&JCnKyo38+b2`g656yw}DTdccP9PR5WND*a`>mJPM$heiMO) z$_Z2=zo;|j;Z#n&>mV9P2$nrZFZh;m|1j@)IX<>&6goh?Tbw{6XA_t{^Vevs6#aCN z$BQ_(II9tY^U>8LpvJ){H&8Q$vk3K^aigZrlIW+h-pW6~6mw!UzM1RB$Dvz77+`&wp5!3fbi)|X8xls^f zUWj{2(@0X`U9Yy zC3*tFShr!j&-l+cLdai3OFy>(Cn){sE51$fYn(fvI)oske-CI$Z7CCQV4(O2iu))N zC}DrV+5J?R7%?L5OYI$2v-&(W^w`oL=rS`qYP}0G21%TvtrZ&w zG6x2VpIV})@X^8SHNV(Mn<2+B$Dg#9Mj;K~t265{H2Tb;F$;+!>I^53N7k=Ve9JL+ z{oq)rA9xxpzybKFVfIm4deO)GCLEj-x>(lc{@$pehQTHVgt6?YN}(4rI!HHx;@*P$ zrmsoq<0_17+)D+3CkmO$?ps>6C847@gGKwzMzqor959*H`5k{W2Huy^?Di7)f19pV z#h1B}1A6uvq^zpp@LmIg<61pB&qFZ+o#(||pVKD@7h^PdX)8o=28;HajcBDMIN*Ki zJ0t5xv)fDH{;j%RA6ab>`kn_YyZVbQVazaGwC=}W_s-|6b+Y%Z_hZ?6No9~b4KK%Q z4xeYg;NER4>SPW-JN|=1V}CGkV`L>-(P~mlM$o3Wdo#x{jG*1g>abSU<@Uy(TbkU{ z`}>wy-@8yfJutW1h7*pISag2hA8*E}%Wm&g&a1#T9nVJZk@tXkybqmMc)Min-_=0z zqXM{+0Yhn1;Z3l-f+34!nZ+|1Fu!wq^Ophl?$ysTfv?=Bo5;&+qD?Dr(rED3(=wA^ z)|WY4k2w=xwg`$&oyJv~Gd+}lYk()-t221ymMg(63i5BG_XzyTM%57}LiX)EP<$4U z6w44tMN1&#eOu_t{+}4k-;^Twp@hx{7g(o;?=3v=TW6)PQ9TVrVK%Y&ggKJZ%V*cA zF=#O3fO6SaJ`H60W}vU8S~ev2NtDrmhC%RJe%jyd!r(D2<8*2PA7^DeI1B2nJ1B3@ zdal(JKP9yk#*GNP6Yl~Obj z=~l?!@t0re(O8>s)o`bMzE5IwP`^0OB--Y@^h=W%8;;yOm^VX`x-xTO&{ESsU+St^5dx;nR7|IXAdFlrdpnXx= z5JkCI$~QT=MM&dyY_^x6QF&5S__Qj?gvO)azv#N3#g5{`q|2V)U+F5LZ}bggC9s2_>+|vgO=XMe5KG>KP8MRJ@n+yJWV;_q2r43RmxJ3$zt8#^uZ1(8qeQDE*zTm9aFY^I<@baaeceZmR(9@eGFD-I8 zKK0w`8G0VF7C)&ZAN2aJ&yO&cbh=-(-Ar+cj6PHMm1~tZ@6#9U#~A-LRl=*03_yKI zGNtQwZXB4J1EW9ES!ALp;D*B?1m{{WX_yqkW3Kh0IXsW;hV>!L;#$v{w+f5Q+4?jN zG!CrKf$M9c(DMZkj}jZAdguWYoTft2UV2e8tRHQQ?Wub^Hx4uoY>)%%D!yUyS)?z7 zzj$-&3}1Z)o)ajsKD5Plw-sTl!1+-cXIq2DfyRN&a$wz1U*&Z_YQoOFy!&6X;o&-k z^jrtP7^vv>|H5H^_tIujJ9}iV8#E3y4s4JE{{tlQHu%pc$&vs7002ovPDHLkV1h1L BBgg;% literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_75_0.png b/docs/examples/api_features_files/api_features_75_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c95517bc4c52dd6a52185e4128a27dac5db143c7 GIT binary patch literal 5289 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 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_75_1.png b/docs/examples/api_features_files/api_features_75_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a18733a3cb42b3ab910d140d9819c24dd1ca85f8 GIT binary patch literal 10644 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 InqB1o0aKoUy#N3J literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_77_0.png b/docs/examples/api_features_files/api_features_77_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f9fe56ffcc3bab4d0b850adaa68b35ca9d50d7 GIT binary patch literal 3113 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 D_oM15 literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_78_0.png b/docs/examples/api_features_files/api_features_78_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0792f64f10aac78e0b0a22f0cb7376ba6f7f3430 GIT binary patch literal 3687 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 FV1n9*afSc@ literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_78_1.png b/docs/examples/api_features_files/api_features_78_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6b2536683c0e1b78ba899ab6dc8bab17e2b3d0 GIT binary patch literal 9821 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 MtEL9E`pz-`1&j)zy#N3J literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_91_0.png b/docs/examples/api_features_files/api_features_91_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5852f166179430e96e18ea456e7cef77ec30ae GIT binary patch literal 2278 zcmV!!f8%nWzEONvD6d7C2KKZ3PG** zQXL>a#`4XiK*FYi<0ca`l0A1hiPs zcM4cUvzV`xKARh8r!xt8%mR6`(XD&o;enDZp$fJ~rL_Ip zQ{C#Xd9bjt`$kH?RUSpRZS>M#ZXr%ph9#Kman~|3^WdH5mb!vXTInD=Nyq^bH$kyq z0a{d;Sg)uYApWqt2PWDJW)P2(S@&f6V3nOv1zVyHw;DuQOoIfQ4z8p`{E=&c zB3B}o=}f^0OArIkm8(7F5L*Op<*78&&r9`bz7F-Xp|LWH|E+{)k;6V>lT?9Y8G<-a z1k(nugAk76deS0RANVI^IG|>!%SA#zyO8Fd70>~zE_d%rqdTW`#X%=Z1LE(-*B6Ty za1Q40>u;I*F*193FYG!#e`I;$R&a>f0QV(s5U0h1ZxR$5*X>GL_s_%Tz@`{W2>1ZX z+gJz6qbv5JT6G@RiPt^QaoM`lLuD2p_s#twvjy;zV54~BVnSIoGQfo=H@;!j2PDVk zyOj32!m=|Xpfh6joC4UCHVb&tryKDyebe4%4%c^IyQ%9(%FF}DLzaYGrZ%u)@=*|= zql3m1>FauxmtSz#^3oFkG~n>`zn{Afo=WE8LA)G2z~!7grBM`?&F$PN?MUSS@`K7* zwpXee=+(e}FUO-}%T6**Z%oX`6=<?E&J8}5FGXBe4UusSeUl93<@lIhD(`9<&>$p!n|gEpT3qhS0G!(f zA+~hPXKB@81%Fz;#;J~XRUZk^P=ctm7+{4&rP~Hk+_?%>Ju9fzEt9z_TQYNxH9V0H z4y4?i8h)6-ai{5vDe+h_z+btrC6-Yq0a9Agc7pAO=L!jbsr`aYM5SmPBnaG-(5$}sqUC>$z}^D8$xCx^sU2G(&(w$W{gmeYudY{jXjbVr(m-O_rnoPGiq#xI3j1{Qt8%7E=Qnwt z7s`iMYg9IiO=8Kx0*D9hUV(>(7{Wb(ctETSULKKoe z_Wssm?c;#K>%a!kl>SFy4o*CqzYXw6M*G%BV%b%0hvsTlsY?TsflW$habZvYx$<21 znF64~0>py^sCbExaz|$MEWg2+bKnH@UQQl}(tiB+#R0b)yJ(6N+w znTBR}d?ZluV1z|WG?gUJVb7+qFp^r#Dwh^Coc;3fRO->d zuqJVES~vmt=mFN(Yj(`^HiB-oUn#FvjG=Ke@6=};o zWYxNw=5>R=n~^u%V181WE7&2$GI}N(k7H~?K+K0BW>iTk}3Q(y98D;`M12cMgXg{hiC0J84r~?w!*g1iOcGTWqL-@ z{HRWU%>#x_ZJuyemMFP2J<(sj&^T2YgEMH4Qhe*CUYTXJ@>M#P4NCVPmocro(niVx zWQ{2#zJJwY`2d;w_cyUZv5hYeZ!mjars?FLjVDY56h@uzytlZ-}>O@y#CNf<3-pCHZ&BGlr(laV;Ve*x&Tzk ziwM5Xd>^LKd@7Ba&nh`eW&zE8<3u{N)pT+*`$?{5MrlCGWeO$4;9`LIh%xU5QfCAR zw*_RQW!AlNf4ny4fJR=yW(L<^1)HgLiCBugS2KbmuUwSQe$%P1XKDd-D86%{q57C& zpvL8ENsp1)-#6~WwbCa9rI{hpw_&7^y3e+P4x~`P#U>{2?4e|0-f?pumhojc%sAS; z-}(>_zM{P&M;q7oI>$-Z(^b literal 0 HcmV?d00001 diff --git a/docs/examples/api_features_files/api_features_93_0.png b/docs/examples/api_features_files/api_features_93_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3d95f54c137691b2dce4699905a041bdc3006a8d GIT binary patch literal 2307 zcmV+e3He5nvHQ(ISj{>3Dl!2XGZ| z&;fJ+qyy*x*bZ|4pVu<-*RwY~7;>|kacs-7zAX9K-W*OWICRoSR8{y=oJuQbSh?E0dDE!S0E$*yzNL(tq~5j~8Af2yYcy5YZ7>7u+; zNsk-qJd)f;3E61O&^dp=0h=;^M4Ry$Ks*3XW_`9L&;N?&M`2#5{3|{i(^LJo>c7dU z=X&CSZr&gG=tarT*~9t+%)_3~q1X9iI*QKAXj1oRoowdSz7+F=RuS=A6*3tI^=NSF zac}&p;bjZ<+%>(iP34oyso|Dt(XsfMuY`N8l6W${HeEv|I#s^@e65xaoQw#rEQxH~>JgpBS^F};!KKZcag{3RghPJvB{V8* zTKJNhB&p^(-Pk0I7JI7rW4_81Ptm~xndPPl?vs-Xzod78&wOEH)PgCWFVTv}(3eL@ zY5>Pzj){NXj`A%b>8kgA`m_@G~#&WQ^5)R!L7X>*@lq9dtT|5o67mW-bk_WE(}2ao@y zZQ@wv4{8%Eok>i9FB*wtx_+f!z!&pAy~16qjd^+wf_>X1NxZ{6GyaDz7$b*Zxvq_YVmB(96|HG%3KwWMiB88Y0{N)XZ!F| zf&VV0d*6t*un6c|=_(w7$JpZ;9pMq_nS+jOYMGCt%+=_Sp_25Aa;rP*3|*u#-LpHm z#&{UXVxzQ8!>i8RDb8duxar}tz-oz+Og=1AzF1j=G>R>xR-E8;^>CI2>#a^r?%tJnsfxy zD|jz~GSyp8`g^J)04F zmtYB;9#%>Mvsp4W43hsqzq zE#6r*UcDPce#BmL9VU3<^YqUg<}=|eo`ao{Pj)94&U{hXVtk^0%p3ZAi8jjW`tnEw z9=Jd+?K}i7nb`fxXqX@U7r&|+|3`)0^GrJli+3iTqc5MxejZ3ZPxxQs&K3lz&8C8W z>39oH0MF{tF(K&;`DofOo^hbJn%7#Z>8G#K=ZGSD}CA=O9EO~k_|=`0%h z#A?r$I4xBpJrbcB8LeaueR&usVaUzcMp?4k|E4O`7Q~d@qvtf7KoEZrO*#@WQ+Rf$ z6XE$il3j@ZXjw{nru|ZoUO12dwWIkhwf~l$+2$iUcI0#6Ge1Ndng3N~qXIwtmD#yA zon!5<0|!TI`anr&yKMO-3a?vE7Q30zvg5Fe zaopI$-UE9NbUbjagWnmggyZSymbolNameDescriptionDefinitionDefault valueUnits$\\alpha_a$alpha_aThermal diffusivity of dry air.-m$^{2}$ s$^{-1}$$\\lambda_E$lambda_ELatent heat of evaporation.2450000.0J kg$^{-1}$$\\nu_a$nu_aKinematic viscosity of dry air.-m$^{2}$ s$^{-1}$$\\rho_a$rho_aDensity of dry air.-kg m$^{-3}$$\\sigma$sigmStefan-Boltzmann constant.5.67e-08J s$^{-1}$ m$^{-2}$ K$^{-4}$$c_{pa,mol}$c_pamolMolar specific heat of dry air.\n", + "\n", + " https://en.wikipedia.org/wiki/Heat_capacity#Specific_heat_capacity\n", + " 29.19J K$^{-1}$ mol$^{-1}$$c_{pa}$c_paSpecific heat of dry air.1010.0J K$^{-1}$ kg$^{-1}$$c_{pv}$c_pvSpecific heat of water vapour at 300 K.\n", + "\n", + " http://www.engineeringtoolbox.com/water-vapor-d_979.html\n", + " 1864J K$^{-1}$ kg$^{-1}$$C_{wa}$C_waConcentration of water in air.-mol m$^{-3}$$D_{va}$D_vaBinary diffusion coefficient of water vapour in air.-m$^{2}$ s$^{-1}$$g$gGravitational acceleration.9.81m s$^{-2}$$h_c$h_cAverage 1-sided convective heat transfer coefficient.-J K$^{-1}$ s$^{-1}$ m$^{-2}$$k_a$k_aThermal conductivity of dry air.-J K$^{-1}$ m$^{-1}$ s$^{-1}$$M_w$M_wMolar mass of water.0.018kg mol$^{-1}$$M_{air}$M_airMolar mass of air.\n", + "\n", + " http://www.engineeringtoolbox.com/molecular-mass-air-d_679.html\n", + " 0.02897kg mol$^{-1}$$M_{N_2}$M_N2Molar mass of nitrogen.0.028kg mol$^{-1}$$M_{O_2}$M_O2Molar mass of oxygen.0.032kg mol$^{-1}$$N_{Gr_L}$GrGrashof number.-1$N_{Le}$LeLewis number.-1$N_{Nu_L}$NuAverage Nusselt number over given length.-1$N_{Pr}$PrPrandtl number (0.71 for air).-1$N_{Re_c}$Re_cCritical Reynolds number for the onset of turbulence.-1$N_{Re_L}$ReAverage Reynolds number over given length.-1$P_a$P_aAir pressure.-Pa$P_{N2}$P_N2Partial pressure of nitrogen.-Pa$P_{O2}$P_O2Partial pressure of oxygen.-Pa$P_{was}$P_wasSaturation water vapour pressure at air temperature.-Pa$P_{wa}$P_waWater vapour pressure in the atmosphere.-Pa$R_d$R_dDownwelling global radiation.-W m$^{-2}$$R_s$R_sSolar shortwave flux per area.-J s$^{-1}$ m$^{-2}$$R_u$R_uUpwelling global radiation.-W m$^{-2}$$R_{mol}$R_molMolar gas constant.8.314472J K$^{-1}$ mol$^{-1}$$T_0$T0Freezing point in Kelvin.273.15K$T_a$T_aAir temperature.-K$v_w$v_wWind velocity.-m s$^{-1}$$x_{N2}$x_N2Mole fraction of nitrogen in dry air.0.791$x_{O2}$x_O2Mole fraction of oxygen in dry air.0.211" + ], + "text/plain": [ + "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", + " ('$\\\\alpha_a$',\n", + " 'alpha_a',\n", + " 'Thermal diffusivity of dry air.',\n", + " '',\n", + " '-',\n", + " 'm$^{2}$ s$^{-1}$'),\n", + " ('$\\\\lambda_E$',\n", + " 'lambda_E',\n", + " 'Latent heat of evaporation.',\n", + " '',\n", + " '2450000.0',\n", + " 'J kg$^{-1}$'),\n", + " ('$\\\\nu_a$',\n", + " 'nu_a',\n", + " 'Kinematic viscosity of dry air.',\n", + " '',\n", + " '-',\n", + " 'm$^{2}$ s$^{-1}$'),\n", + " ('$\\\\rho_a$', 'rho_a', 'Density of dry air.', '', '-', 'kg m$^{-3}$'),\n", + " ('$\\\\sigma$',\n", + " 'sigm',\n", + " 'Stefan-Boltzmann constant.',\n", + " '',\n", + " '5.67e-08',\n", + " 'J s$^{-1}$ m$^{-2}$ K$^{-4}$'),\n", + " ('$c_{pa,mol}$',\n", + " 'c_pamol',\n", + " 'Molar specific heat of dry air.\\n\\n https://en.wikipedia.org/wiki/Heat_capacity#Specific_heat_capacity\\n ',\n", + " '',\n", + " '29.19',\n", + " 'J K$^{-1}$ mol$^{-1}$'),\n", + " ('$c_{pa}$',\n", + " 'c_pa',\n", + " 'Specific heat of dry air.',\n", + " '',\n", + " '1010.0',\n", + " 'J K$^{-1}$ kg$^{-1}$'),\n", + " ('$c_{pv}$',\n", + " 'c_pv',\n", + " 'Specific heat of water vapour at 300 K.\\n\\n http://www.engineeringtoolbox.com/water-vapor-d_979.html\\n ',\n", + " '',\n", + " '1864',\n", + " 'J K$^{-1}$ kg$^{-1}$'),\n", + " ('$C_{wa}$',\n", + " 'C_wa',\n", + " 'Concentration of water in air.',\n", + " '',\n", + " '-',\n", + " 'mol m$^{-3}$'),\n", + " ('$D_{va}$',\n", + " 'D_va',\n", + " 'Binary diffusion coefficient of water vapour in air.',\n", + " '',\n", + " '-',\n", + " 'm$^{2}$ s$^{-1}$'),\n", + " ('$g$', 'g', 'Gravitational acceleration.', '', '9.81', 'm s$^{-2}$'),\n", + " ('$h_c$',\n", + " 'h_c',\n", + " 'Average 1-sided convective heat transfer coefficient.',\n", + " '',\n", + " '-',\n", + " 'J K$^{-1}$ s$^{-1}$ m$^{-2}$'),\n", + " ('$k_a$',\n", + " 'k_a',\n", + " 'Thermal conductivity of dry air.',\n", + " '',\n", + " '-',\n", + " 'J K$^{-1}$ m$^{-1}$ s$^{-1}$'),\n", + " ('$M_w$', 'M_w', 'Molar mass of water.', '', '0.018', 'kg mol$^{-1}$'),\n", + " ('$M_{air}$',\n", + " 'M_air',\n", + " 'Molar mass of air.\\n\\n http://www.engineeringtoolbox.com/molecular-mass-air-d_679.html\\n ',\n", + " '',\n", + " '0.02897',\n", + " 'kg mol$^{-1}$'),\n", + " ('$M_{N_2}$',\n", + " 'M_N2',\n", + " 'Molar mass of nitrogen.',\n", + " '',\n", + " '0.028',\n", + " 'kg mol$^{-1}$'),\n", + " ('$M_{O_2}$', 'M_O2', 'Molar mass of oxygen.', '', '0.032', 'kg mol$^{-1}$'),\n", + " ('$N_{Gr_L}$', 'Gr', 'Grashof number.', '', '-', '1'),\n", + " ('$N_{Le}$', 'Le', 'Lewis number.', '', '-', '1'),\n", + " ('$N_{Nu_L}$',\n", + " 'Nu',\n", + " 'Average Nusselt number over given length.',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$N_{Pr}$', 'Pr', 'Prandtl number (0.71 for air).', '', '-', '1'),\n", + " ('$N_{Re_c}$',\n", + " 'Re_c',\n", + " 'Critical Reynolds number for the onset of turbulence.',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$N_{Re_L}$',\n", + " 'Re',\n", + " 'Average Reynolds number over given length.',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$P_a$', 'P_a', 'Air pressure.', '', '-', 'Pa'),\n", + " ('$P_{N2}$', 'P_N2', 'Partial pressure of nitrogen.', '', '-', 'Pa'),\n", + " ('$P_{O2}$', 'P_O2', 'Partial pressure of oxygen.', '', '-', 'Pa'),\n", + " ('$P_{was}$',\n", + " 'P_was',\n", + " 'Saturation water vapour pressure at air temperature.',\n", + " '',\n", + " '-',\n", + " 'Pa'),\n", + " ('$P_{wa}$',\n", + " 'P_wa',\n", + " 'Water vapour pressure in the atmosphere.',\n", + " '',\n", + " '-',\n", + " 'Pa'),\n", + " ('$R_d$', 'R_d', 'Downwelling global radiation.', '', '-', 'W m$^{-2}$'),\n", + " ('$R_s$',\n", + " 'R_s',\n", + " 'Solar shortwave flux per area.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$R_u$', 'R_u', 'Upwelling global radiation.', '', '-', 'W m$^{-2}$'),\n", + " ('$R_{mol}$',\n", + " 'R_mol',\n", + " 'Molar gas constant.',\n", + " '',\n", + " '8.314472',\n", + " 'J K$^{-1}$ mol$^{-1}$'),\n", + " ('$T_0$', 'T0', 'Freezing point in Kelvin.', '', '273.15', 'K'),\n", + " ('$T_a$', 'T_a', 'Air temperature.', '', '-', 'K'),\n", + " ('$v_w$', 'v_w', 'Wind velocity.', '', '-', 'm s$^{-1}$'),\n", + " ('$x_{N2}$',\n", + " 'x_N2',\n", + " 'Mole fraction of nitrogen in dry air.',\n", + " '',\n", + " '0.79',\n", + " '1'),\n", + " ('$x_{O2}$', 'x_O2', 'Mole fraction of oxygen in dry air.', '', '0.21', '1')]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.variables.physics.thermodynamics as physics_vars\n", + "vars = ['physics_vars.' + name for name in physics_vars.__all__]\n", + "generate_metadata_table([eval(name) for name in vars])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each of the above can also be imported one-by-one, using its Name, e.g.:\n", + "\n", + "`from essm.variables.physics.thermodynamics import R_mol`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Equations\n", + "General equations based on the above variables can be imported from `essm.equations.physics.thermodynamics`:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
eq_LeLe as function of alpha_a and D_va.\n", + "\n", + " (Eq. B3 in :cite:`schymanski_leaf-scale_2017`)\n", + " $N_{Le} = \\frac{\\alpha_a}{D_{va}}$
eq_CwaC_wa as a function of P_wa and T_a.\n", + "\n", + " (Eq. B9 in :cite:`schymanski_leaf-scale_2017`)\n", + " $C_{wa} = \\frac{P_{wa}}{R_{mol} T_a}$
eq_Nu_forced_allNu as function of Re and Re_c under forced conditions.\n", + "\n", + " (Eqs. B13--B15 in :cite:`schymanski_leaf-scale_2017`)\n", + " $N_{Nu_L} = - \\frac{\\sqrt[3]{N_{Pr}} \\left(- 37 N_{Re_L}^{\\frac{4}{5}} + 37 \\left(N_{Re_L} + N_{Re_c} - \\frac{\\left|{N_{Re_L} - N_{Re_c}}\\right|}{2}\\right)^{\\frac{4}{5}} - 664 \\sqrt{N_{Re_L} + N_{Re_c} - \\frac{\\left|{N_{Re_L} - N_{Re_c}}\\right|}{2}}\\right)}{1000}$
eq_DvaD_va as a function of air temperature.\n", + "\n", + " (Table A.3 in :cite:`monteith_principles_2007`)\n", + " $D_{va} = T_a p_1 - p_2$
eq_alphaaalpha_a as a function of air temperature.\n", + "\n", + " (Table A.3 in :cite:`monteith_principles_2007`)\n", + " $\\alpha_a = T_a p_1 - p_2$
eq_kak_a as a function of air temperature.\n", + "\n", + " (Table A.3 in :cite:`monteith_principles_2007`)\n", + " $k_a = T_a p_1 + p_2$
eq_nuanu_a as a function of air temperature.\n", + "\n", + " (Table A.3 in :cite:`monteith_principles_2007`)\n", + " $\\nu_a = T_a p_1 - p_2$
eq_rhoa_Pwa_Tarho_a as a function of P_wa and T_a.\n", + "\n", + " (Eq. B20 in :cite:`schymanski_leaf-scale_2017`)\n", + " $\\rho_a = \\frac{M_{N_2} P_{N2} + M_{O_2} P_{O2} + M_w P_{wa}}{R_{mol} T_a}$
eq_PaCalculate air pressure.\n", + "\n", + " From partial pressures of N2, O2 and H2O, following Dalton's law of\n", + " partial pressures.\n", + " $P_a = P_{N2} + P_{O2} + P_{wa}$
eq_PN2_PO2Calculate P_N2 as a function of P_O2.\n", + "\n", + " It follows Dalton's law of partial pressures.\n", + " $P_{N2} = \\frac{P_{O2} x_{N2}}{x_{O2}}$
eq_PO2Calculate P_O2 as a function of P_a, P_N2 and P_wa.$P_{O2} = \\frac{P_a x_{O2} - P_{wa} x_{O2}}{x_{N2} + x_{O2}}$
eq_PN2Calculate P_N2 as a function of P_a, P_O2 and P_wa.$P_{N2} = \\frac{P_a x_{N2} - P_{wa} x_{N2}}{x_{N2} + x_{O2}}$
eq_rhoaCalculate rho_a from T_a, P_a and P_wa.$\\rho_a = \\frac{x_{N2} \\left(M_{N_2} P_a - P_{wa} \\left(M_{N_2} - M_w\\right)\\right) + x_{O2} \\left(M_{O_2} P_a - P_{wa} \\left(M_{O_2} - M_w\\right)\\right)}{R_{mol} T_a x_{N2} + R_{mol} T_a x_{O2}}$
" + ], + "text/plain": [ + "[('eq_Le',\n", + " 'Le as function of alpha_a and D_va.\\n\\n (Eq. B3 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$N_{Le} = \\\\frac{\\\\alpha_a}{D_{va}}$'),\n", + " ('eq_Cwa',\n", + " 'C_wa as a function of P_wa and T_a.\\n\\n (Eq. B9 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$C_{wa} = \\\\frac{P_{wa}}{R_{mol} T_a}$'),\n", + " ('eq_Nu_forced_all',\n", + " 'Nu as function of Re and Re_c under forced conditions.\\n\\n (Eqs. B13--B15 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$N_{Nu_L} = - \\\\frac{\\\\sqrt[3]{N_{Pr}} \\\\left(- 37 N_{Re_L}^{\\\\frac{4}{5}} + 37 \\\\left(N_{Re_L} + N_{Re_c} - \\\\frac{\\\\left|{N_{Re_L} - N_{Re_c}}\\\\right|}{2}\\\\right)^{\\\\frac{4}{5}} - 664 \\\\sqrt{N_{Re_L} + N_{Re_c} - \\\\frac{\\\\left|{N_{Re_L} - N_{Re_c}}\\\\right|}{2}}\\\\right)}{1000}$'),\n", + " ('eq_Dva',\n", + " 'D_va as a function of air temperature.\\n\\n (Table A.3 in :cite:`monteith_principles_2007`)\\n ',\n", + " '$D_{va} = T_a p_1 - p_2$'),\n", + " ('eq_alphaa',\n", + " 'alpha_a as a function of air temperature.\\n\\n (Table A.3 in :cite:`monteith_principles_2007`)\\n ',\n", + " '$\\\\alpha_a = T_a p_1 - p_2$'),\n", + " ('eq_ka',\n", + " 'k_a as a function of air temperature.\\n\\n (Table A.3 in :cite:`monteith_principles_2007`)\\n ',\n", + " '$k_a = T_a p_1 + p_2$'),\n", + " ('eq_nua',\n", + " 'nu_a as a function of air temperature.\\n\\n (Table A.3 in :cite:`monteith_principles_2007`)\\n ',\n", + " '$\\\\nu_a = T_a p_1 - p_2$'),\n", + " ('eq_rhoa_Pwa_Ta',\n", + " 'rho_a as a function of P_wa and T_a.\\n\\n (Eq. B20 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$\\\\rho_a = \\\\frac{M_{N_2} P_{N2} + M_{O_2} P_{O2} + M_w P_{wa}}{R_{mol} T_a}$'),\n", + " ('eq_Pa',\n", + " \"Calculate air pressure.\\n\\n From partial pressures of N2, O2 and H2O, following Dalton's law of\\n partial pressures.\\n \",\n", + " '$P_a = P_{N2} + P_{O2} + P_{wa}$'),\n", + " ('eq_PN2_PO2',\n", + " \"Calculate P_N2 as a function of P_O2.\\n\\n It follows Dalton's law of partial pressures.\\n \",\n", + " '$P_{N2} = \\\\frac{P_{O2} x_{N2}}{x_{O2}}$'),\n", + " ('eq_PO2',\n", + " 'Calculate P_O2 as a function of P_a, P_N2 and P_wa.',\n", + " '$P_{O2} = \\\\frac{P_a x_{O2} - P_{wa} x_{O2}}{x_{N2} + x_{O2}}$'),\n", + " ('eq_PN2',\n", + " 'Calculate P_N2 as a function of P_a, P_O2 and P_wa.',\n", + " '$P_{N2} = \\\\frac{P_a x_{N2} - P_{wa} x_{N2}}{x_{N2} + x_{O2}}$'),\n", + " ('eq_rhoa',\n", + " 'Calculate rho_a from T_a, P_a and P_wa.',\n", + " '$\\\\rho_a = \\\\frac{x_{N2} \\\\left(M_{N_2} P_a - P_{wa} \\\\left(M_{N_2} - M_w\\\\right)\\\\right) + x_{O2} \\\\left(M_{O_2} P_a - P_{wa} \\\\left(M_{O_2} - M_w\\\\right)\\\\right)}{R_{mol} T_a x_{N2} + R_{mol} T_a x_{O2}}$')]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.equations.physics.thermodynamics as physics_eqs\n", + "modstr = 'physics_eqs.'\n", + "eqs = [name for name in physics_eqs.__all__]\n", + "table = ListTable()\n", + "#table.append(('Name', 'Description', 'Equation'))\n", + "for name in eqs:\n", + " table.append((name, eval(modstr+name).__doc__, latex('$'+latex(eval(modstr+name))+'$')))\n", + "table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Variables and equations related to plant leaves\n", + "These refer to the model by Schymanski & Or (2017)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Variables for leaf energy and water balance\n", + "Variables related to the model by can be imported from `essm.variables.leaf.energy_water`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Gr\" will be overridden by \"essm.variables.leaf.energy_water:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:h_c\" will be overridden by \"essm.variables.leaf.energy_water:\"\n", + " instance[expr] = instance\n" + ] + }, + { + "data": { + "text/html": [ + "
SymbolNameDescriptionDefinitionDefault valueUnits
$\\alpha_l$alpha_lLeaf albedo, fraction of shortwave radiation reflected by the leaf.-1
$\\epsilon_l$epsilon_lLongwave emmissivity of the leaf surface.1.01
$\\rho_{al}$rho_alDensity of air at the leaf surface.-kg m$^{-3}$
$a_s$a_sFraction of one-sided leaf area covered by stomata.\n", + "\n", + " (1 if stomata are on one side only, 2 if they are on both sides).\n", + " -1
$a_{sh}$a_shFraction of projected area exchanging sensible heat with the air.2.01
$C_{wl}$C_wlConcentration of water in the leaf air space.-mol m$^{-3}$
$E_l$E_lLatent heat flux from leaf.-J s$^{-1}$ m$^{-2}$
$E_{l,mol}$E_lmolTranspiration rate in molar units.-mol s$^{-1}$ m$^{-2}$
$g_{bw,mol}$g_bwmolBoundary layer conductance to water vapour.-mol s$^{-1}$ m$^{-2}$
$g_{bw}$g_bwBoundary layer conductance to water vapour.-m s$^{-1}$
$g_{sw,mol}$g_swmolStomatal conductance to water vapour.-mol s$^{-1}$ m$^{-2}$
$g_{sw}$g_swStomatal conductance to water vapour.-m s$^{-1}$
$g_{tw,mol}$g_twmolTotal leaf layer conductance to water vapour.-mol s$^{-1}$ m$^{-2}$
$g_{tw}$g_twTotal leaf conductance to water vapour.-m s$^{-1}$
$h_c$h_cAverage 1-sided convective heat transfer coefficient.-J K$^{-1}$ s$^{-1}$ m$^{-2}$
$H_l$H_lSensible heat flux from leaf.-J s$^{-1}$ m$^{-2}$
$L_A$L_ALeaf area.-m$^{2}$
$L_l$L_lLeaf width as characteristic length scale for convection.-m
$N_{Gr_L}$GrGrashof number.-1
$P_{wl}$P_wlWater vapour pressure inside the leaf.-Pa
$r_{bw}$r_bwBoundary layer resistance to water vapour, inverse of $g_{bw}$.-s m$^{-1}$
$R_{la}$R_laLongwave radiation absorbed by leaf.-W m$^{-2}$
$R_{ld}$R_ldDownwards emitted/reflected global radiation from leaf.-W m$^{-2}$
$R_{ll}$R_llLongwave radiation away from leaf.-W m$^{-2}$
$R_{lu}$R_luUpwards emitted/reflected global radiation from leaf.-W m$^{-2}$
$r_{sw}$r_swStomatal resistance to water vapour, inverse of $g_{sw}$.-s m$^{-1}$
$r_{tw}$r_twTotal leaf resistance to water vapour, $r_{bv} + r_{sv}$.-s m$^{-1}$
$T_l$T_lLeaf temperature.-K
$T_w$T_wRadiative temperature of objects surrounding the leaf.-K
" + ], + "text/plain": [ + "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", + " ('$\\\\alpha_l$',\n", + " 'alpha_l',\n", + " 'Leaf albedo, fraction of shortwave radiation reflected by the leaf.',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$\\\\epsilon_l$',\n", + " 'epsilon_l',\n", + " 'Longwave emmissivity of the leaf surface.',\n", + " '',\n", + " '1.0',\n", + " '1'),\n", + " ('$\\\\rho_{al}$',\n", + " 'rho_al',\n", + " 'Density of air at the leaf surface.',\n", + " '',\n", + " '-',\n", + " 'kg m$^{-3}$'),\n", + " ('$a_s$',\n", + " 'a_s',\n", + " 'Fraction of one-sided leaf area covered by stomata.\\n\\n (1 if stomata are on one side only, 2 if they are on both sides).\\n ',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$a_{sh}$',\n", + " 'a_sh',\n", + " 'Fraction of projected area exchanging sensible heat with the air.',\n", + " '',\n", + " '2.0',\n", + " '1'),\n", + " ('$C_{wl}$',\n", + " 'C_wl',\n", + " 'Concentration of water in the leaf air space.',\n", + " '',\n", + " '-',\n", + " 'mol m$^{-3}$'),\n", + " ('$E_l$',\n", + " 'E_l',\n", + " 'Latent heat flux from leaf.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$E_{l,mol}$',\n", + " 'E_lmol',\n", + " 'Transpiration rate in molar units.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$ m$^{-2}$'),\n", + " ('$g_{bw,mol}$',\n", + " 'g_bwmol',\n", + " 'Boundary layer conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$ m$^{-2}$'),\n", + " ('$g_{bw}$',\n", + " 'g_bw',\n", + " 'Boundary layer conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'm s$^{-1}$'),\n", + " ('$g_{sw,mol}$',\n", + " 'g_swmol',\n", + " 'Stomatal conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$ m$^{-2}$'),\n", + " ('$g_{sw}$',\n", + " 'g_sw',\n", + " 'Stomatal conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'm s$^{-1}$'),\n", + " ('$g_{tw,mol}$',\n", + " 'g_twmol',\n", + " 'Total leaf layer conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$ m$^{-2}$'),\n", + " ('$g_{tw}$',\n", + " 'g_tw',\n", + " 'Total leaf conductance to water vapour.',\n", + " '',\n", + " '-',\n", + " 'm s$^{-1}$'),\n", + " ('$h_c$',\n", + " 'h_c',\n", + " 'Average 1-sided convective heat transfer coefficient.',\n", + " '',\n", + " '-',\n", + " 'J K$^{-1}$ s$^{-1}$ m$^{-2}$'),\n", + " ('$H_l$',\n", + " 'H_l',\n", + " 'Sensible heat flux from leaf.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$L_A$', 'L_A', 'Leaf area.', '', '-', 'm$^{2}$'),\n", + " ('$L_l$',\n", + " 'L_l',\n", + " 'Leaf width as characteristic length scale for convection.',\n", + " '',\n", + " '-',\n", + " 'm'),\n", + " ('$N_{Gr_L}$', 'Gr', 'Grashof number.', '', '-', '1'),\n", + " ('$P_{wl}$', 'P_wl', 'Water vapour pressure inside the leaf.', '', '-', 'Pa'),\n", + " ('$r_{bw}$',\n", + " 'r_bw',\n", + " 'Boundary layer resistance to water vapour, inverse of $g_{bw}$.',\n", + " '',\n", + " '-',\n", + " 's m$^{-1}$'),\n", + " ('$R_{la}$',\n", + " 'R_la',\n", + " 'Longwave radiation absorbed by leaf.',\n", + " '',\n", + " '-',\n", + " 'W m$^{-2}$'),\n", + " ('$R_{ld}$',\n", + " 'R_ld',\n", + " 'Downwards emitted/reflected global radiation from leaf.',\n", + " '',\n", + " '-',\n", + " 'W m$^{-2}$'),\n", + " ('$R_{ll}$',\n", + " 'R_ll',\n", + " 'Longwave radiation away from leaf.',\n", + " '',\n", + " '-',\n", + " 'W m$^{-2}$'),\n", + " ('$R_{lu}$',\n", + " 'R_lu',\n", + " 'Upwards emitted/reflected global radiation from leaf.',\n", + " '',\n", + " '-',\n", + " 'W m$^{-2}$'),\n", + " ('$r_{sw}$',\n", + " 'r_sw',\n", + " 'Stomatal resistance to water vapour, inverse of $g_{sw}$.',\n", + " '',\n", + " '-',\n", + " 's m$^{-1}$'),\n", + " ('$r_{tw}$',\n", + " 'r_tw',\n", + " 'Total leaf resistance to water vapour, $r_{bv} + r_{sv}$.',\n", + " '',\n", + " '-',\n", + " 's m$^{-1}$'),\n", + " ('$T_l$', 'T_l', 'Leaf temperature.', '', '-', 'K'),\n", + " ('$T_w$',\n", + " 'T_w',\n", + " 'Radiative temperature of objects surrounding the leaf.',\n", + " '',\n", + " '-',\n", + " 'K')]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.variables.leaf.energy_water as leaf_energy\n", + "vars = ['leaf_energy.' + name for name in leaf_energy.__all__]\n", + "generate_metadata_table([eval(name) for name in vars])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Equations for leaf energy and water balance\n", + "General equations based on the above variables can be imported from `essm.equations.physics.thermodynamics`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
eq_Rs_enbalCalculate R_s from energy balance.\n", + "\n", + " (Eq. 1 in :cite:`schymanski_leaf-scale_2017`)\n", + " $R_s = E_l + H_l + R_{ll}$
eq_RllR_ll as function of T_l and T_w.\n", + "\n", + " (Eq. 2 in :cite:`schymanski_leaf-scale_2017`)\n", + " $R_{ll} = a_{sh} \\epsilon_l \\sigma \\left(T_l^{4} - T_w^{4}\\right)$
eq_HlH_l as function of T_l.\n", + "\n", + " (Eq. 3 in :cite:`schymanski_leaf-scale_2017`)\n", + " $H_l = a_{sh} h_c \\left(- T_a + T_l\\right)$
eq_ElE_l as function of E_lmol.\n", + "\n", + " (Eq. 4 in :cite:`schymanski_leaf-scale_2017`)\n", + " $E_l = E_{l,mol} M_w \\lambda_E$
eq_ElmolE_lmol as functino of g_tw and C_wl.\n", + "\n", + " (Eq. 5 in :cite:`schymanski_leaf-scale_2017`)\n", + " $E_{l,mol} = g_{tw} \\left(- C_{wa} + C_{wl}\\right)$
eq_gtwg_tw from g_sw and g_bw.\n", + "\n", + " (Eq. 6 in :cite:`schymanski_leaf-scale_2017`)\n", + " $g_{tw} = \\frac{1}{\\frac{1}{g_{sw}} + \\frac{1}{g_{bw}}}$
eq_gbw_hcg_bw as function of h_c.\n", + "\n", + " (Eq. B2 in :cite:`schymanski_leaf-scale_2017`)\n", + " $g_{bw} = \\frac{a_s h_c}{N_{Le}^{\\frac{2}{3}} c_{pa} \\rho_a}$
eq_CwlC_wl as function of P_wl and T_l.\n", + "\n", + " (Eq. B4 in :cite:`schymanski_leaf-scale_2017`)\n", + " $C_{wl} = \\frac{P_{wl}}{R_{mol} T_l}$
eq_PwlClausius-Clapeyron P_wl as function of T_l.\n", + "\n", + " (Eq. B3 in :cite:`hartmann_global_1994`)\n", + " $P_{wl} = p_1 e^{- \\frac{M_w \\lambda_E \\left(- \\frac{1}{p_2} + \\frac{1}{T_l}\\right)}{R_{mol}}}$
eq_Elmol_convE_lmol as function of g_twmol and P_wl.\n", + "\n", + " (Eq. B6 in :cite:`schymanski_leaf-scale_2017`)\n", + " $E_{l,mol} = \\frac{g_{tw,mol} \\left(- P_{wa} + P_{wl}\\right)}{P_a}$
eq_gtwmol_gtwg_twmol as a function of g_tw.\n", + "\n", + " It uses eq_Elmol, eq_Cwl and eq_Elmol_conv.\n", + " $g_{tw,mol} = \\frac{g_{tw} \\left(P_a P_{wa} T_l - P_a P_{wl} T_a\\right)}{R_{mol} T_a T_l \\left(P_{wa} - P_{wl}\\right)}$
eq_gtwmol_gtw_isog_twmol as a function of g_tw at isothermal conditions.$g_{tw,mol} = \\frac{P_a g_{tw}}{R_{mol} T_a}$
eq_hch_c as a function of Nu and L_l.\n", + "\n", + " (Eq. B10 in :cite:`schymanski_leaf-scale_2017`)\n", + " $h_c = \\frac{N_{Nu_L} k_a}{L_l}$
eq_ReRe as a function of v_w and L_l.\n", + "\n", + " (Eq. B11 in :cite:`schymanski_leaf-scale_2017`)\n", + " $N_{Re_L} = \\frac{L_l v_w}{\\nu_a}$
eq_GrGr as function of air density within and outside of leaf.\n", + "\n", + " (Eq. B12 in :cite:`schymanski_leaf-scale_2017`)\n", + " $N_{Gr_L} = \\frac{L_l^{3} g \\left(\\rho_a - \\rho_{al}\\right)}{\\nu_a^{2} \\rho_{al}}$
" + ], + "text/plain": [ + "[('eq_Rs_enbal',\n", + " 'Calculate R_s from energy balance.\\n\\n (Eq. 1 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$R_s = E_l + H_l + R_{ll}$'),\n", + " ('eq_Rll',\n", + " 'R_ll as function of T_l and T_w.\\n\\n (Eq. 2 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$R_{ll} = a_{sh} \\\\epsilon_l \\\\sigma \\\\left(T_l^{4} - T_w^{4}\\\\right)$'),\n", + " ('eq_Hl',\n", + " 'H_l as function of T_l.\\n\\n (Eq. 3 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$H_l = a_{sh} h_c \\\\left(- T_a + T_l\\\\right)$'),\n", + " ('eq_El',\n", + " 'E_l as function of E_lmol.\\n\\n (Eq. 4 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$E_l = E_{l,mol} M_w \\\\lambda_E$'),\n", + " ('eq_Elmol',\n", + " 'E_lmol as functino of g_tw and C_wl.\\n\\n (Eq. 5 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$E_{l,mol} = g_{tw} \\\\left(- C_{wa} + C_{wl}\\\\right)$'),\n", + " ('eq_gtw',\n", + " 'g_tw from g_sw and g_bw.\\n\\n (Eq. 6 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$g_{tw} = \\\\frac{1}{\\\\frac{1}{g_{sw}} + \\\\frac{1}{g_{bw}}}$'),\n", + " ('eq_gbw_hc',\n", + " 'g_bw as function of h_c.\\n\\n (Eq. B2 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$g_{bw} = \\\\frac{a_s h_c}{N_{Le}^{\\\\frac{2}{3}} c_{pa} \\\\rho_a}$'),\n", + " ('eq_Cwl',\n", + " 'C_wl as function of P_wl and T_l.\\n\\n (Eq. B4 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$C_{wl} = \\\\frac{P_{wl}}{R_{mol} T_l}$'),\n", + " ('eq_Pwl',\n", + " 'Clausius-Clapeyron P_wl as function of T_l.\\n\\n (Eq. B3 in :cite:`hartmann_global_1994`)\\n ',\n", + " '$P_{wl} = p_1 e^{- \\\\frac{M_w \\\\lambda_E \\\\left(- \\\\frac{1}{p_2} + \\\\frac{1}{T_l}\\\\right)}{R_{mol}}}$'),\n", + " ('eq_Elmol_conv',\n", + " 'E_lmol as function of g_twmol and P_wl.\\n\\n (Eq. B6 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$E_{l,mol} = \\\\frac{g_{tw,mol} \\\\left(- P_{wa} + P_{wl}\\\\right)}{P_a}$'),\n", + " ('eq_gtwmol_gtw',\n", + " 'g_twmol as a function of g_tw.\\n\\n It uses eq_Elmol, eq_Cwl and eq_Elmol_conv.\\n ',\n", + " '$g_{tw,mol} = \\\\frac{g_{tw} \\\\left(P_a P_{wa} T_l - P_a P_{wl} T_a\\\\right)}{R_{mol} T_a T_l \\\\left(P_{wa} - P_{wl}\\\\right)}$'),\n", + " ('eq_gtwmol_gtw_iso',\n", + " 'g_twmol as a function of g_tw at isothermal conditions.',\n", + " '$g_{tw,mol} = \\\\frac{P_a g_{tw}}{R_{mol} T_a}$'),\n", + " ('eq_hc',\n", + " 'h_c as a function of Nu and L_l.\\n\\n (Eq. B10 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$h_c = \\\\frac{N_{Nu_L} k_a}{L_l}$'),\n", + " ('eq_Re',\n", + " 'Re as a function of v_w and L_l.\\n\\n (Eq. B11 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$N_{Re_L} = \\\\frac{L_l v_w}{\\\\nu_a}$'),\n", + " ('eq_Gr',\n", + " 'Gr as function of air density within and outside of leaf.\\n\\n (Eq. B12 in :cite:`schymanski_leaf-scale_2017`)\\n ',\n", + " '$N_{Gr_L} = \\\\frac{L_l^{3} g \\\\left(\\\\rho_a - \\\\rho_{al}\\\\right)}{\\\\nu_a^{2} \\\\rho_{al}}$')]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.equations.leaf.energy_water as leaf_energy\n", + "modstr = 'leaf_energy.'\n", + "eqs = [name for name in leaf_energy.__all__]\n", + "table = ListTable()\n", + "#table.append(('Name', 'Description', 'Equation'))\n", + "for name in eqs:\n", + " table.append((name, eval(modstr+name).__doc__, latex('$'+latex(eval(modstr+name))+'$')))\n", + "table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Variables for leaf radiative balance\n", + "Variables related to the model by can be imported from `essm.variables.leaf.radiation`:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.leaf.energy_water:alpha_l\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_d\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.leaf.energy_water:R_la\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.leaf.energy_water:R_ld\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.leaf.energy_water:R_lu\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_u\" will be overridden by \"essm.variables.leaf.radiation:\"\n", + " instance[expr] = instance\n" + ] + }, + { + "data": { + "text/html": [ + "
SymbolNameDescriptionDefinitionDefault valueUnits
$alpha_l$alpha_lLeaf albedo, fraction of shortwave radiation reflected by the leaf.-1
$R_d$R_dDownwelling global radiation.-J s$^{-1}$ m$^{-2}$
$R_u$R_uUpwelling global radiation.-J s$^{-1}$ m$^{-2}$
$R_{la}$R_laLongwave radiation absorbed by leaf.-J s$^{-1}$ m$^{-2}$
$R_{ld}$R_ldDownwards emitted/reflected global radiation from leaf.-J s$^{-1}$ m$^{-2}$
$R_{lu}$R_luUpwards emitted/reflected global radiation from leaf.-J s$^{-1}$ m$^{-2}$
$S_a$S_aRadiation sensor above leaf reading.-J s$^{-1}$ m$^{-2}$
$S_b$S_bRadiation sensor below leaf reading.-J s$^{-1}$ m$^{-2}$
$S_s$S_sRadiation sensor beside leaf reading.-J s$^{-1}$ m$^{-2}$
" + ], + "text/plain": [ + "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", + " ('$alpha_l$',\n", + " 'alpha_l',\n", + " 'Leaf albedo, fraction of shortwave radiation reflected by the leaf.',\n", + " '',\n", + " '-',\n", + " '1'),\n", + " ('$R_d$',\n", + " 'R_d',\n", + " 'Downwelling global radiation.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$R_u$',\n", + " 'R_u',\n", + " 'Upwelling global radiation.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$R_{la}$',\n", + " 'R_la',\n", + " 'Longwave radiation absorbed by leaf.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$R_{ld}$',\n", + " 'R_ld',\n", + " 'Downwards emitted/reflected global radiation from leaf.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$R_{lu}$',\n", + " 'R_lu',\n", + " 'Upwards emitted/reflected global radiation from leaf.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$S_a$',\n", + " 'S_a',\n", + " 'Radiation sensor above leaf reading.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$S_b$',\n", + " 'S_b',\n", + " 'Radiation sensor below leaf reading.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$'),\n", + " ('$S_s$',\n", + " 'S_s',\n", + " 'Radiation sensor beside leaf reading.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$ m$^{-2}$')]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.variables.leaf.radiation as leaf_radiation\n", + "vars = ['leaf_radiation.' + name for name in leaf_radiation.__all__]\n", + "generate_metadata_table([eval(name) for name in vars])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Variables for leaf chamber model\n", + "These refer to the model by Schymanski & Or (2017) and ongoing work." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Leaf chamber insulation\n", + "Variables related to the model by can be imported from `essm.variables.chamber.insulation`:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SymbolNameDescriptionDefinitionDefault valueUnits
$A_i$A_iConducting area of insulation material.-m$^{2}$
$c_{pi}$c_piHeat capacity of insulation material.-J K$^{-1}$ kg$^{-1}$
$dT_i$dT_iTemperature increment of insulation material.-K
$L_i$L_iThickness of insulation material.-m
$lambda_i$lambda_iHeat conductivity of insulation material.-J K$^{-1}$ m$^{-1}$ s$^{-1}$
$Q_i$Q_iHeat conduction through insulation material.-J s$^{-1}$
$rho_i$rho_iDensity of insulation material.-kg m$^{-3}$
" + ], + "text/plain": [ + "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", + " ('$A_i$',\n", + " 'A_i',\n", + " 'Conducting area of insulation material.',\n", + " '',\n", + " '-',\n", + " 'm$^{2}$'),\n", + " ('$c_{pi}$',\n", + " 'c_pi',\n", + " 'Heat capacity of insulation material.',\n", + " '',\n", + " '-',\n", + " 'J K$^{-1}$ kg$^{-1}$'),\n", + " ('$dT_i$',\n", + " 'dT_i',\n", + " 'Temperature increment of insulation material.',\n", + " '',\n", + " '-',\n", + " 'K'),\n", + " ('$L_i$', 'L_i', 'Thickness of insulation material.', '', '-', 'm'),\n", + " ('$lambda_i$',\n", + " 'lambda_i',\n", + " 'Heat conductivity of insulation material.',\n", + " '',\n", + " '-',\n", + " 'J K$^{-1}$ m$^{-1}$ s$^{-1}$'),\n", + " ('$Q_i$',\n", + " 'Q_i',\n", + " 'Heat conduction through insulation material.',\n", + " '',\n", + " '-',\n", + " 'J s$^{-1}$'),\n", + " ('$rho_i$',\n", + " 'rho_i',\n", + " 'Density of insulation material.',\n", + " '',\n", + " '-',\n", + " 'kg m$^{-3}$')]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.variables.chamber.insulation as chamber_ins\n", + "vars = ['chamber_ins.' + name for name in chamber_ins.__all__]\n", + "generate_metadata_table([eval(name) for name in vars])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Leaf chamber mass balance\n", + "Variables related to the model by can be imported from `essm.variables.chamber.mass`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.leaf.energy_water:L_A\" will be overridden by \"essm.variables.chamber.mass:\"\n", + " instance[expr] = instance\n" + ] + }, + { + "data": { + "text/html": [ + "
SymbolNameDescriptionDefinitionDefault valueUnits
$F_{in,mol,a}$F_in_molaMolar flow rate of dry air into chamber.-mol s$^{-1}$
$F_{in,mol,w}$F_in_molwMolar flow rate of water vapour into chamber.-mol s$^{-1}$
$F_{in,v}$F_in_vVolumetric flow rate into chamber.-m$^{3}$ s$^{-1}$
$F_{out,mol,a}$F_out_molaMolar flow rate of dry air out of chamber.-mol s$^{-1}$
$F_{out,mol,w}$F_out_molwMolar flow rate of water vapour out of chamber.-mol s$^{-1}$
$F_{out,v}$F_out_vVolumetric flow rate out of chamber.-m$^{3}$ s$^{-1}$
$H_c$H_cChamber height.-m
$L_A$L_ALeaf area.-m$^{2}$
$L_c$L_cChamber length.-m
$n_c$n_cmolar mass of gas in chamber.-mol
$P_{w,in}$P_w_inVapour pressure of incoming air.-Pa
$P_{w,out}$P_w_outVapour pressure of outgoing air.-Pa
$R_{H,in}$R_H_inRelative humidity of incoming air.-1
$T_d$T_dDew point temperature of incoming air.-K
$T_{in}$T_inTemperature of incoming air.-K
$T_{out}$T_outTemperature of outgoing air (= chamber T_a).-K
$T_{room}$T_roomLab air temperature.-K
$V_c$V_cChamber volume.-m$^{3}$
$W_c$W_cChamber width.-m
" + ], + "text/plain": [ + "[('Symbol', 'Name', 'Description', 'Definition', 'Default value', 'Units'),\n", + " ('$F_{in,mol,a}$',\n", + " 'F_in_mola',\n", + " 'Molar flow rate of dry air into chamber.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$'),\n", + " ('$F_{in,mol,w}$',\n", + " 'F_in_molw',\n", + " 'Molar flow rate of water vapour into chamber.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$'),\n", + " ('$F_{in,v}$',\n", + " 'F_in_v',\n", + " 'Volumetric flow rate into chamber.',\n", + " '',\n", + " '-',\n", + " 'm$^{3}$ s$^{-1}$'),\n", + " ('$F_{out,mol,a}$',\n", + " 'F_out_mola',\n", + " 'Molar flow rate of dry air out of chamber.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$'),\n", + " ('$F_{out,mol,w}$',\n", + " 'F_out_molw',\n", + " 'Molar flow rate of water vapour out of chamber.',\n", + " '',\n", + " '-',\n", + " 'mol s$^{-1}$'),\n", + " ('$F_{out,v}$',\n", + " 'F_out_v',\n", + " 'Volumetric flow rate out of chamber.',\n", + " '',\n", + " '-',\n", + " 'm$^{3}$ s$^{-1}$'),\n", + " ('$H_c$', 'H_c', 'Chamber height.', '', '-', 'm'),\n", + " ('$L_A$', 'L_A', 'Leaf area.', '', '-', 'm$^{2}$'),\n", + " ('$L_c$', 'L_c', 'Chamber length.', '', '-', 'm'),\n", + " ('$n_c$', 'n_c', 'molar mass of gas in chamber.', '', '-', 'mol'),\n", + " ('$P_{w,in}$', 'P_w_in', 'Vapour pressure of incoming air.', '', '-', 'Pa'),\n", + " ('$P_{w,out}$', 'P_w_out', 'Vapour pressure of outgoing air.', '', '-', 'Pa'),\n", + " ('$R_{H,in}$', 'R_H_in', 'Relative humidity of incoming air.', '', '-', '1'),\n", + " ('$T_d$', 'T_d', 'Dew point temperature of incoming air.', '', '-', 'K'),\n", + " ('$T_{in}$', 'T_in', 'Temperature of incoming air.', '', '-', 'K'),\n", + " ('$T_{out}$',\n", + " 'T_out',\n", + " 'Temperature of outgoing air (= chamber T_a).',\n", + " '',\n", + " '-',\n", + " 'K'),\n", + " ('$T_{room}$', 'T_room', 'Lab air temperature.', '', '-', 'K'),\n", + " ('$V_c$', 'V_c', 'Chamber volume.', '', '-', 'm$^{3}$'),\n", + " ('$W_c$', 'W_c', 'Chamber width.', '', '-', 'm')]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import essm.variables.chamber.mass as chamber_mass\n", + "vars = ['chamber_mass.' + name for name in chamber_mass.__all__]\n", + "generate_metadata_table([eval(name) for name in vars])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bibliography\n", + "See https://essm.readthedocs.io/en/latest/api.html#bibliography" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.4" + }, + "nav_menu": {}, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": { + "height": "calc(100% - 180px)", + "left": "10px", + "top": "150px", + "width": "253.991px" + }, + "toc_section_display": "block", + "toc_window_display": true + }, + "toc_position": { + "height": "991px", + "left": "0px", + "right": "888.92px", + "top": "105px", + "width": "212px" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/examples/test_definitions.py b/docs/examples/test_definitions.py new file mode 100644 index 0000000..3b03907 --- /dev/null +++ b/docs/examples/test_definitions.py @@ -0,0 +1,80 @@ +from essm.variables._core import BaseVariable, Variable +from essm.equations import Equation +from sympy import Abs, Derivative, Eq, exp, Integral, log, Piecewise, sqrt +from sympy.physics.units import kilogram, mole, meter, kelvin, watt, second, joule, pascal +alpha_a = type('alpha_a', (Variable,), {'__doc__': """Thermal diffusivity of dry air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"\alpha_a", 'default': None, 'expr': None}) +c_pa = type('c_pa', (Variable,), {'__doc__': """Specific heat of dry air.""", 'unit': joule/(kelvin*kilogram), 'assumptions': {'real': True}, 'latex_name': r"c_{pa}", 'default': 1010.0, 'expr': None}) +c_pamol = type('c_pamol', (Variable,), {'__doc__': """Molar specific heat of dry air. https://en.wikipedia.org/wiki/Heat_capacity#Specific_heat_capacity """, 'unit': joule/(kelvin*mole), 'assumptions': {'real': True}, 'latex_name': r"c_{pa,mol}", 'default': 29.19, 'expr': None}) +c_pv = type('c_pv', (Variable,), {'__doc__': """Specific heat of water vapour at 300 K. http://www.engineeringtoolbox.com/water-vapor-d_979.html """, 'unit': joule/(kelvin*kilogram), 'assumptions': {'real': True}, 'latex_name': r"c_{pv}", 'default': 1864, 'expr': None}) +C_wa = type('C_wa', (Variable,), {'__doc__': """Concentration of water in air.""", 'unit': mole/meter**3, 'assumptions': {'real': True}, 'latex_name': r"C_{wa}", 'default': None, 'expr': None}) +D_va = type('D_va', (Variable,), {'__doc__': """Binary diffusion coefficient of water vapour in air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"D_{va}", 'default': None, 'expr': None}) +g = type('g', (Variable,), {'__doc__': """Gravitational acceleration.""", 'unit': meter/second**2, 'assumptions': {'real': True}, 'latex_name': r"g", 'default': 9.81, 'expr': None}) +Gr = type('Gr', (Variable,), {'__doc__': """Grashof number.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Gr_L}", 'default': None, 'expr': None}) +h_c = type('h_c', (Variable,), {'__doc__': """Average 1-sided convective heat transfer coefficient.""", 'unit': joule/(kelvin*meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"h_c", 'default': None, 'expr': None}) +k_a = type('k_a', (Variable,), {'__doc__': """Thermal conductivity of dry air.""", 'unit': joule/(kelvin*meter*second), 'assumptions': {'real': True}, 'latex_name': r"k_a", 'default': None, 'expr': None}) +lambda_E = type('lambda_E', (Variable,), {'__doc__': """Latent heat of evaporation.""", 'unit': joule/kilogram, 'assumptions': {'real': True}, 'latex_name': r"\lambda_E", 'default': 2450000.0, 'expr': None}) +Le = type('Le', (Variable,), {'__doc__': """Lewis number.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Le}", 'default': None, 'expr': None}) +M_air = type('M_air', (Variable,), {'__doc__': """Molar mass of air. http://www.engineeringtoolbox.com/molecular-mass-air-d_679.html """, 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{air}", 'default': 0.02897, 'expr': None}) +M_N2 = type('M_N2', (Variable,), {'__doc__': """Molar mass of nitrogen.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{N_2}", 'default': 0.028, 'expr': None}) +M_O2 = type('M_O2', (Variable,), {'__doc__': """Molar mass of oxygen.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{O_2}", 'default': 0.032, 'expr': None}) +M_w = type('M_w', (Variable,), {'__doc__': """Molar mass of water.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_w", 'default': 0.018, 'expr': None}) +nu_a = type('nu_a', (Variable,), {'__doc__': """Kinematic viscosity of dry air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"\nu_a", 'default': None, 'expr': None}) +Nu = type('Nu', (Variable,), {'__doc__': """Average Nusselt number over given length.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Nu_L}", 'default': None, 'expr': None}) +P_a = type('P_a', (Variable,), {'__doc__': """Air pressure.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_a", 'default': None, 'expr': None}) +Pr = type('Pr', (Variable,), {'__doc__': """Prandtl number (0.71 for air).""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Pr}", 'default': None, 'expr': None}) +P_N2 = type('P_N2', (Variable,), {'__doc__': """Partial pressure of nitrogen.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{N2}", 'default': None, 'expr': None}) +P_O2 = type('P_O2', (Variable,), {'__doc__': """Partial pressure of oxygen.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{O2}", 'default': None, 'expr': None}) +P_wa = type('P_wa', (Variable,), {'__doc__': """Partial pressure of water vapour in air.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{wa}", 'default': None, 'expr': None}) +P_was = type('P_was', (Variable,), {'__doc__': """Saturation water vapour pressure at air temperature.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{was}", 'default': None, 'expr': None}) +R_d = type('R_d', (Variable,), {'__doc__': """Downwelling global radiation.""", 'unit': watt/meter**2, 'assumptions': {'real': True}, 'latex_name': r"R_d", 'default': None, 'expr': None}) +Re_c = type('Re_c', (Variable,), {'__doc__': """Critical Reynolds number for the onset of turbulence.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Re_c}", 'default': None, 'expr': None}) +Re = type('Re', (Variable,), {'__doc__': """Average Reynolds number over given length.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Re_L}", 'default': None, 'expr': None}) +rho_a = type('rho_a', (Variable,), {'__doc__': """Density of dry air.""", 'unit': kilogram/meter**3, 'assumptions': {'real': True}, 'latex_name': r"\rho_a", 'default': None, 'expr': None}) +R_u = type('R_u', (Variable,), {'__doc__': """Upwelling global radiation.""", 'unit': watt/meter**2, 'assumptions': {'real': True}, 'latex_name': r"R_u", 'default': None, 'expr': None}) +R_mol = type('R_mol', (Variable,), {'__doc__': """Molar gas constant.""", 'unit': joule/(kelvin*mole), 'assumptions': {'real': True}, 'latex_name': r"R_{mol}", 'default': 8.314472, 'expr': None}) +R_s = type('R_s', (Variable,), {'__doc__': """Solar shortwave flux per area.""", 'unit': joule/(meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"R_s", 'default': None, 'expr': None}) +sigm = type('sigm', (Variable,), {'__doc__': """Stefan-Boltzmann constant.""", 'unit': joule/(kelvin**4*meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"\sigma", 'default': 5.67e-08, 'expr': None}) +T0 = type('T0', (Variable,), {'__doc__': """Freezing point in Kelvin.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_0", 'default': 273.15, 'expr': None}) +T_a = type('T_a', (Variable,), {'__doc__': """Air temperature.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_a", 'default': None, 'expr': None}) +v_w = type('v_w', (Variable,), {'__doc__': """Wind velocity.""", 'unit': meter/second, 'assumptions': {'real': True}, 'latex_name': r"v_w", 'default': None, 'expr': None}) +x_N2 = type('x_N2', (Variable,), {'__doc__': """Mole fraction of nitrogen in dry air.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"x_{N2}", 'default': 0.79, 'expr': None}) +x_O2 = type('x_O2', (Variable,), {'__doc__': """Mole fraction of oxygen in dry air.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"x_{O2}", 'default': 0.21, 'expr': None}) +p_Dva1 = type('p_Dva1', (Variable,), {'__doc__': """Internal parameter of eq_Dva.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 1.49e-07, 'expr': None}) +p_Dva2 = type('p_Dva2', (Variable,), {'__doc__': """Internal parameter of eq_Dva.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.96e-05, 'expr': None}) +p_alpha1 = type('p_alpha1', (Variable,), {'__doc__': """Internal parameter of eq_alphaa.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 1.32e-07, 'expr': None}) +p_alpha2 = type('p_alpha2', (Variable,), {'__doc__': """Internal parameter of eq_alphaa.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.73e-05, 'expr': None}) +p_ka1 = type('p_ka1', (Variable,), {'__doc__': """Internal parameter of eq_ka.""", 'unit': joule/(kelvin**2*meter*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 6.84e-05, 'expr': None}) +p_ka2 = type('p_ka2', (Variable,), {'__doc__': """Internal parameter of eq_ka.""", 'unit': joule/(kelvin*meter*second), 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 0.00563, 'expr': None}) +p_nua1 = type('p_nua1', (Variable,), {'__doc__': """Internal parameter of eq_nua.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 9e-08, 'expr': None}) +p_nua2 = type('p_nua2', (Variable,), {'__doc__': """Internal parameter of eq_nua.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.13e-05, 'expr': None}) +P_g = type('P_g', (Variable,), {'__doc__': """Pressure of gas.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_g", 'default': None, 'expr': None}) +V_g = type('V_g', (Variable,), {'__doc__': """Volume of gas.""", 'unit': meter**3, 'assumptions': {'real': True}, 'latex_name': r"V_g", 'default': None, 'expr': None}) +n_g = type('n_g', (Variable,), {'__doc__': """Amount of gas.""", 'unit': mole, 'assumptions': {'real': True}, 'latex_name': r"n_g", 'default': None, 'expr': None}) +n_w = type('n_w', (Variable,), {'__doc__': """Amount of water.""", 'unit': mole, 'assumptions': {'real': True}, 'latex_name': r"n_w", 'default': None, 'expr': None}) +T_g = type('T_g', (Variable,), {'__doc__': """Temperature of gas.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_g", 'default': None, 'expr': None}) +Delta_Pwa = type('Delta_Pwa', (Variable,), {'__doc__': """Slope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$""", 'unit': pascal/kelvin, 'assumptions': {'real': True}, 'latex_name': r"\Delta", 'default': None, 'expr': Derivative(P_wa, T_g)}) +x = type('x', (Variable,), {'__doc__': """Positive real variable.""", 'unit': 1, 'assumptions': {'positive': True, 'real': True}, 'latex_name': r"x", 'default': None, 'expr': None}) +p_CC1 = type('p_CC1', (Variable,), {'__doc__': """Internal parameter of eq_Pwl.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"611", 'default': 611.0, 'expr': None}) +p_CC2 = type('p_CC2', (Variable,), {'__doc__': """Internal parameter of eq_Pwl.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"273", 'default': 273.0, 'expr': None}) +T_a1 = type('T_a1', (Variable,), {'__doc__': """Air temperature""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_{a1}", 'default': None, 'expr': None}) +T_a2 = type('T_a2', (Variable,), {'__doc__': """Air temperature""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_{a2}", 'default': None, 'expr': None}) +P_wa1 = type('P_wa1', (Variable,), {'__doc__': """P_wa at T1""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{wa1}", 'default': None, 'expr': None}) +eq_Le = type('eq_Le', (Equation,), {'__doc__': """Le as function of alpha_a and D_va. (Eq. B3 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(Le, alpha_a/D_va)}) +eq_Cwa = type('eq_Cwa', (Equation,), {'__doc__': """C_wa as a function of P_wa and T_a. (Eq. B9 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(C_wa, P_wa/(R_mol*T_a))}) +eq_Nu_forced_all = type('eq_Nu_forced_all', (Equation,), {'__doc__': """Nu as function of Re and Re_c under forced conditions. (Eqs. B13--B15 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000)}) +eq_Dva = type('eq_Dva', (Equation,), {'__doc__': """D_va as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(D_va, T_a*p_Dva1 - p_Dva2)}) +eq_alphaa = type('eq_alphaa', (Equation,), {'__doc__': """alpha_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(alpha_a, T_a*p_alpha1 - p_alpha2)}) +eq_ka = type('eq_ka', (Equation,), {'__doc__': """k_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(k_a, T_a*p_ka1 + p_ka2)}) +eq_nua = type('eq_nua', (Equation,), {'__doc__': """nu_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(nu_a, T_a*p_nua1 - p_nua2)}) +eq_rhoa_Pwa_Ta = type('eq_rhoa_Pwa_Ta', (Equation,), {'__doc__': """rho_a as a function of P_wa and T_a. (Eq. B20 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a))}) +eq_Pa = type('eq_Pa', (Equation,), {'__doc__': """Calculate air pressure. From partial pressures of N2, O2 and H2O, following Dalton's law of partial pressures. """, 'expr': Eq(P_a, P_N2 + P_O2 + P_wa)}) +eq_PN2_PO2 = type('eq_PN2_PO2', (Equation,), {'__doc__': """Calculate P_N2 as a function of P_O2. It follows Dalton's law of partial pressures. """, 'expr': Eq(P_N2, P_O2*x_N2/x_O2)}) +eq_PO2 = type('eq_PO2', (Equation,), {'__doc__': """Calculate P_O2 as a function of P_a, P_N2 and P_wa.""", 'expr': Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2))}) +eq_PN2 = type('eq_PN2', (Equation,), {'__doc__': """Calculate P_N2 as a function of P_a, P_O2 and P_wa.""", 'expr': Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2))}) +eq_rhoa = type('eq_rhoa', (Equation,), {'__doc__': """Calculate rho_a from T_a, P_a and P_wa.""", 'expr': Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2))}) +eq_ideal_gas_law = type('eq_ideal_gas_law', (Equation,), {'__doc__': """Ideal gas law.""", 'expr': Eq(P_g*V_g, R_mol*T_g*n_g)}) +eq_Pg = type('eq_Pg', (Equation,), {'__doc__': """Calculate pressure of ideal gas.""", 'expr': Eq(P_g, R_mol*T_g*n_g/V_g)}) +eq_Pwa_nw = type('eq_Pwa_nw', (Equation,), {'__doc__': """Calculate vapour pressure from amount of water in gas.""", 'expr': Eq(P_wa, R_mol*T_g*n_w/V_g)}) +eq_Pwa_CC = type('eq_Pwa_CC', (Equation,), {'__doc__': """Clausius-Clapeyron P_wa as function of T_g. Eq. B3 in :cite{hartmann_global_1994} """, 'expr': Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol))}) +eq1 = type('eq1', (Equation,), {'__doc__': """Test""", 'expr': Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True)))}) +eq_Pwa_Delta = type('eq_Pwa_Delta', (Equation,), {'__doc__': """P_wa deduced from the integral of Delta""", 'expr': Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2)))}) diff --git a/docs/index.rst b/docs/index.rst index a7f7d01..dd15ae0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,6 +12,27 @@ ESSM. installation usage +Importable variables and equations +================================== + +Here you find examples for importing pre-defined variables and equations +fromm ESSM. + +.. toctree:: + :maxdepth: 3 + + examples/importable_variables_equations + +API Examples +============= + +Here you find use examples for different API features of ESSM. + +.. toctree:: + :maxdepth: 3 + + examples/api_features + API Reference ============= diff --git a/setup.py b/setup.py index 9ee88e6..cc57968 100644 --- a/setup.py +++ b/setup.py @@ -40,7 +40,7 @@ extras_require = { 'docs': [ - 'Sphinx>=1.5.1,<1.8', + 'Sphinx>=1.8', 'matplotlib>=1.5.1', 'sphinxcontrib-bibtex>=0.3.5', ], From c66068c2ceaaa645d622de8841c034c99bd92846 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 02:10:38 +0200 Subject: [PATCH 04/21] update docu and fix export of variables and eqs --- docs/api.rst | 6 +- docs/examples/api_features.ipynb | 1101 +++++------ docs/examples/api_features.rst | 1757 ----------------- .../importable_variables_equations.ipynb | 59 +- docs/examples/test_definitions.py | 815 +++++++- docs/index.rst | 2 +- setup.py | 2 +- 7 files changed, 1293 insertions(+), 2449 deletions(-) delete mode 100644 docs/examples/api_features.rst diff --git a/docs/api.rst b/docs/api.rst index 9bce0f5..eba87b9 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4,11 +4,11 @@ API Docs Jupyter notebooks with API examples =================================== -A jupyter notebook with tables of importable variables and equations can be found at -:doc:`examples/importable_variables_equations.rst` +A jupyter notebook with tables of importable variables and equations can be found at +https://github.com/environmentalscience/essm/blob/master/docs/examples/importable_variables_equations.ipynb A jupyter notebook with use examples for the API can be found at -:doc:`examples/api_features.rst` +https://github.com/environmentalscience/essm/blob/master/docs/examples/api_features.ipynb Variables ========= diff --git a/docs/examples/api_features.ipynb b/docs/examples/api_features.ipynb index 4e06d87..6cfa030 100644 --- a/docs/examples/api_features.ipynb +++ b/docs/examples/api_features.ipynb @@ -4,8 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# API examples\n", - "\n", + "# Use examples\n", "This jupyter notebook can be found at:\n", "[https://github.com/environmentalscience/essm/blob/master/docs/examples/api_features.ipynb](https://github.com/environmentalscience/essm/blob/master/docs/examples/api_features.ipynb)\n", "\n", @@ -20,7 +19,7 @@ { "data": { "text/plain": [ - "'0.4.2.dev2+dirty'" + "'0.4.2.dev5+dirty'" ] }, "execution_count": 1, @@ -38,6 +37,29 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.core.display import display, HTML\n", + "display(HTML(\"\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "from IPython.display import display\n", @@ -49,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -70,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -91,20 +113,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from sympy import latex\n", @@ -279,34 +290,113 @@ " item.set_fontsize(fontsize_labels)\n", " ax1.tick_params(axis='both', which='major', labelsize=fontsize_ticks)\n", " fig.tight_layout() # otherwise the right y-label is slightly clipped\n", - " return fig\n", - " \n", + " return fig" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXmcjlX7wL+XGYZBKVQiM2Mpa6lQIomKtMgW0mIpZU29JHl7316qXw+ylHXIvkQoVKhQdpHsmsyMsSX7PsLMXL8/7nv0mJ5ZHvPMcz8zc76fz/1x7nOfc53rDO5rzn2uc12iqhgMBoPBEGjkcVoBg8FgMBg8YQyUwWAwGAISY6AMBoPBEJAYA2UwGAyGgMQYKIPBYDAEJMZAGQwGgyEgMQbKYDAYDAGJMVAGg8FgCEiMgTIYDAZDQBLstAI5gTx58miBAgWcVsNgMORQ4uPjVVVz3YLCGCgfUKBAAc6fP++0GgaDIYciIhec1sEJcp1FNhgMBkP2wBgog8FgMAQkxkAZDAaDISAxe1BZxOXLlzlw4AB//fWX06r4lPz581OqVCny5s3rtCoGgyGHYwxUFnHgwAEKFy5MeHg4IuK0Oj5BVTl+/DgHDhwgIiLCaXUMBkMOx3ziyyL++usvihYtmmOME4CIULRo0Ry3KjQYDIGJMVBZSE4yTsnkxDkZDIbAxO8GSkQaiUiUiESLyNsenoeIyCz7+XoRCXd71teujxKRhunJFJEIW0a0LTOfXf+miOwUka0islREwuz6aiKyVkR22M9aZeXPwmAw5C5+++0g99//E0eOnPO5bBEaiRAlQrQIHt6thIgwy36+XoRwu76mCJvta4sITd36TBDhiAjbfa5wBvCrgRKRIGAk8DhQCWgjIpVSNOsInFTVcsBQwGX3rQS0BioDjYBRIhKUjkwXMNSWddKWDfArUF1V7wTmAAPt+njgRVVNHmOYiBTx5c/An3zyySdUrFiRtm3bptqmUKFCAMTFxVGlShV/qWYw5Cp27dpF8+ZvUbHiKdavr82YMbt8Kl8ED+9BUnm3ctW7FdgOVFelGtZ7b6zIFf+ESXadI/h7BVUTiFbVWFW9BHwONEnRpgkw2S7PARqI9V2pCfC5ql5U1T1AtC3Po0y7T31bBrbMZwBUdbmqxtv164BSdv3vqrrbLv8BHAGK+/Qn4EdGjRrF999/z/Tp051WxWDIlaxZs4YmTZpQqVJ35s17m5CQcKZNO8Z//lPD10PZ70FiVfHi3YqoEq9Kgl2fH9DkDqqsAE74WtmM4m8vvpLAfrf7A8B9qbVR1QQROQ0UtevXpehb0i57klkUOKWqCR7au9MRWJSyUkRqAvmAmHRnlQ49e/Zk8+bNmRVzFdWqVWPYsGGpPn/ttdeIjY3l8ccfZ9++fbz77rv06tULgCpVqvD1118THh7uU50MBgMkJSXx7bff4nK5WLVqFaGh7yAygAoVkvj662DKlCmYFcN6+W4lQYTkd+sxEe4DJgBhwAtuBstRcrWThIg8D1QHBqWoLwFMBdqralIqfTuJyEYR2ZiQEBB/l1cxZswYbr31VpYvX84bb7zhtDoGQ47n8uXLTJkyhbvuuounnnqKuLjDVK++k/j4D2jaNA8//xxMmTLXLD44+X1jX518qDqqrFelMlAD6CtCfl/Kv1b8vYI6CNzmdl/KrvPU5oCIBAPXA8fT6eup/jhQRESC7VXUVWOJyCNAP+AhVb3oVn8d8A3QT1XdV2xXoaqRQCRAwYIFNbV2QJorHYPBkL05d+4c48ePZ8iQIezfv58qVaowbNgcpk1rysaNeXjvPXj3XciTueVAgqpWT+O5l+9W3N+tV1BllwjngCrAxkxp7AP8baA2AOVFJALrh9UaeC5FmwXAS8BaoAWwTFVVRBYAM0RkCHArUB74GRBPMu0+y20Zn9sy5wOIyN3AWKCRqh5JHtj28vsSmKKqyXtX2Z7g4GCSkv5eCJpzTAZD5jl69CiffvopI0aM4OTJkzz44IOMHj2aIkUa07y5cP48fPklPPOMX9Sx3614+W5F7T777c9+YUAFIM4vWqeDXz/x2SuZbsASYBcwW1V3iEh/EXnabvYZUFREooE3wXKXVNUdwGxgJ7AY6KqqianJtGX1Ad60ZRW1ZYP1Sa8Q8IWIbLaNH8CzQF2gnV2/WUSqZc1Pw3+Eh4ezadMmADZt2sSePXsc1shgyL7ExcXRvXt3wsLCGDBgAHXr1mXNmjWsWLGCP/98gvr1hUKFYN06vxkn7D2jFO9BdojQX4QU71auercCdYAtImzG+gW9iyrHAESYiWXQ7hDhgMgVT2j/oKrmyuQVGhqqKdm5c+c/6vxNWFiYHj16VOPj4/XRRx/VSpUqafv27bVChQq6Z88eVVUtWLCgqqru2bNHK1eunCG5gTA3g8HfbN68WZ977jkNCgrSvHnzavv27a/8X7h0SbVbN1VQffRR1ePHfTs2cF4D4F3n70usuRsyQ8GCBTVlwsJdu3ZRsWJFhzTKWnLy3AwGd1SVn376CZfLxeLFiylUqBCvvvoqPXv2pFSpUgAcOwYtW8KPP8K//gUffQTBPt48EZF4Vc0S979AxgSLNRgMhhQkJiYyf/58XC4XP//8MzfddBMffPABXbp0oUiRv8/ub95sfcb780+YMgVeeMFBpXMgxkAZDAaDzcWLF5kyZQqDBw/m999/p2zZsowePZqXXnqJAgUKXNV29mxo3x5uuAFWroQaPj97azAGymAw5HpOnz7NmDFjGDZsGH/++Sf33HMPs2bNonnz5gQFBV3VNinJchv/8EOoVQvmzoUSJRxSPIdjDJTBYMi1HDp0iOHDhzN69GjOnDnDI488wtSpU2nQoIHHyP2nT8Pzz8PXX8PLL8OIERAS4oDiuQRjoAwGQ67j999/Z9CgQUyZMoWEhARatGjBW2+9xb333ptGH2jSBKKjYeRI6NwZTPaZrMUYKIPBkGvYsGEDLpeLefPmkS9fPjp06ECvXr0oW7Zsmv0WLYI2bSBvXvjhB3joIT8pnMvJ1bH4cjreptB47733GDx4MAC//fYb1apV4+677yYmJtPxcg0Gx1BVlixZQv369alZsyZLly6lb9++7N27l9GjR6dpnFTB5YInnoCICNi40Rgnf2IMlMEjX331FS1atODXX39N97dLgyEQSUhIYMaMGdx99900atSI33//ncGDB7Nv3z4++OADbr755jT7x8fDc8/B229b55xWrYKwMD8pbwDMJz6/Ua9evX/UPfvss3Tp0oX4+HgaN278j+ft2rWjXbt2HDt2jBYtWlz17Mcff8zQuImJibzyyiusWbOGkiVLMn/+fKZNm0ZkZCSXLl2iXLlyTJ06ldDQ0Ct9vv32W4YNG0ZQUBBLly5l+fLlXs3VYHCS+Ph4Jk6cyODBg4mLi6NChQpMmDCBtm3bki9fvgzJ2LfPOt+0eTN88AH07Wv2m5zArKByOLt376Zr167s2LGDIkWKMHfuXJo1a8aGDRvYsmULFStW5LPPPruqT+PGjXnttdd44403jHEyZBtOnDjBgAEDCAsLo1u3bpQoUYKvvvqKHTt20L59+wwbpxUroHp1iImBhQvhnXeMcXIKs4LyE2mteEJDQ9N8XqxYsQyvmFISERFBtWpWvNt7772XuLg4tm/fzr///W9OnTrFuXPnaNiw4TXJNhgCgf379zNkyBDGjRvH+fPneeKJJ+jTpw916tTx6CqeFmPGQPfuUKYMLFgAd9yRRUobMoQxUDmcELdDGkFBQVy4cIF27drx1VdfcddddzFp0qRrNn4Gg5Ns376dgQMHMnPmTADatGlD7969qVq1qteyLl2CHj1g7Fho3BimTwe3iEYGhzCf+HIhZ8+epUSJEly+fJnp06c7rY7B4BWrVq3iqaeeomrVqsydO5euXbsSExPDlClTrsk4HT4MDRpYxqlvX2vlZIxTYGBWULmQAQMGcN9991G8eHHuu+8+zp4967RKBkOaJCUl8fXXX+NyuVizZg1Fixblvffeo1u3bhQtWvSa5f7yi+UMcfw4zJwJrVv7UGlDpjHpNnyASbdhMGQNly5dYsaMGQwaNIidO3cSFhbGv/71Lzp06EDBgpnLPjF9uhWu6Kab4Kuv4O67faR0FpBb022YT3wGgyHgOHfuHEOHDqVs2bK0b9+e4OBgpk+fTnR0NN27d8+UcUpMhN69rZh6NWvChg2BbZxyM+YTn8FgCBiOHDnCJ598wqhRozh58iT16tVj3LhxNGzY0GuPPE+cPGmFLFqyBLp0gWHDrPBFhsDE7ysoEWkkIlEiEi0ib3t4HiIis+zn60Uk3O1ZX7s+SkQapidTRCJsGdG2zHx2/ZsislNEtorIUhEJc+vzkojstq+XMjPXnPj5NCfOyeA8sbGxdOnShbCwMD788EPq1avHunXrWL58OY0aNfKJcdq501oxLVtmOUSMHGmMU8Djz/zyQBAQA5QB8gFbgEop2nQBxtjl1sAsu1zJbh8CRNhygtKSCcwGWtvlMUBnu/wwEGqXO7uNcSMQa/95g12+Ib15hYaGakpiY2P16NGjmpSU9I9n2ZWkpCQ9evSoxsbGOq2KIYewadMmbdWqlebJk0fz5s2rHTt21N9++83n48yfr1qokOrNN6uuWuVz8VkOcF79+K4OlMvfn/hqAtGqGgsgIp8DTYCdbm2aAO/Z5TnACLF+fWoCfK6qF4E9IhJty8OTTBHZBdQHnrPbTLbljlZV9/AI64Dn7XJD4HtVPWHL+h5oBMz0dqKlSpXiwIEDHD161NuuAU3+/PkpVaqU02oYsjGqyvLly3G5XHz33XcULlyYf/3rX/Ts2ZNbb73Vx2NZoYrefdeKDvHll2D++WYf/G2gSgL73e4PAPel1kZVE0TkNFDUrl+Xom9Ju+xJZlHglKomeGjvTkdgURr6eeqDiHQCOgEeQ6jkzZuXiIgIT10NhlxJYmIi8+bNY+DAgWzcuJGbb76Z//u//+O1116jSBYcPDp3zkrJPmeO5RARGQkpsrYbApxc7cUnIs8D1YFB3vZV1UhVra6q1YODja+JwZAaf/31F2PHjqVChQo8++yznDp1irFjxxIXF8fbb7+dJcZpzx544AGYNw8+/himTMn5xkmERiJEiRAtgof9fUJEmGU/Xy9CuF1fU4TN9rVFhKYZlZnV+PvNehC4ze2+lF3nqc0BEQkGrgeOp9PXU/1xoIiIBNurqKvGEpFHgH7AQ/Znw+Sx66WQ9aNXMzQYDACcOnWKMWPGMGzYMA4fPkz16tX54osvaNq0KUFBQVk27tKl8OyzkJRkJRp87LEsGypgECEIGAk8ivXlZ4MIC1Sv2j7pCJxUpZwIrQEX0ArYDlRXJUGEEsAWERYCmgGZWYs/N7ywDGIslpNDskND5RRtunK1k8Rsu1yZq50kYrEcJFKVCXzB1U4SXezy3ViOFeVTjH0jsAfLQeIGu3xjevPy5CRhMORWDh48qL1799bChQsroI899pj+8MMPWe4wlJSkOny4alCQaqVKqrt3Z+lwfoV0nCRAa4EucbvvC9o3RZsloLXscjDoMVBJ0SYC9LD9PF2ZWX35dQWl1p5SN2AJlnGZoKo7RKQ/sFFVFwCfAVNtJ4gTWEYKu91sLIeKBKCrqiYCeJJpD9kH+FxE3gd+tWWD9UmvEPCF7b66T1WfVtUTIjIA2GC366+2w4TBYEibqKgoBg0axNSpU0lISODZZ5/lrbfe4m4/nIK9eBE6d4aJE6FJE5g6FQoXzvJh/UmwiGx0u49U1Ui3ey/390kQIXl//5gI9wETgDDgBft5RmRmLf60hjn1MisoQ25m3bp12rRpUxURzZ8/v3bp0kVjYmL8Nv7Bg6r33acKqu++q5qY6Leh/Qbpr6BagI53u38BdESKNttBS7ndx4AWS9GmIujPoPkzIjOrL7O7bzAYvEZVWbx4MS6Xi59++okiRYrQr18/unfvzk033eQ3Pdavh6ZN4cwZmDsXmjXz29CBhpf7+7jv719BlV0inAOqZFBmlpKrvfgMBoN3JKdoqVatGo0bNyYmJoYhQ4awb98+BgwY4FfjNGkS1K0L+fPD2rW52jiBtS1RXoQIEfJhbY0sSNFmAZAcHacFsEwVtfsEA4gQBlQA4jIoM0sxKyiDwZAu58+fZ8KECXz88cfs3buXSpUqMWnSJNq0aZPhVOq+IiEBevWC4cOtPE6zZkEmMm7kCNTaM0qxF88OEez9fdz297lqfx+oA7wtwmUgCeiiyjEATzL9OS+TbsMHeEq3YTDkBI4dO8aIESMYMWIEx48fp3bt2vTp04cnnniCPHn8/wHm+HFo1cpyJX/9dRg8GHLDMcTcmm4jF/zVGgwGb9m7dy9Dhgxh/PjxxMfH89RTT9GnTx9q167tmE7btlkeegcPWt567do5porBTxgDZTAYrrBt2zYGDRrEjBkzEBHatm1L7969qVy5sqN6zZ0LL70E110HK1bAff51djY4hHGSMBhyOarKihUreOKJJ7jzzjuZN28ePXr0IDY2lkmTJjlqnJKS4L//hRYtoGpV2LjRGKfchFlBGQy5lKSkJBYsWIDL5WLdunUUL16cAQMG0KVLF2688Uan1ePMGXjhBViwwAr6Ono0hIQ4rZXBnxgDZTDkMi5evMj06dMZNGgQv/32G+Hh4YwYMYL27dsTGhrqtHoAREdb+01RUfDJJ9CtG/ggZ6Ehm2EMlMGQSzhz5gyRkZEMHTqUP/74g7vuuosZM2bQsmVLAiki/5Il0Lo15MkD330H9es7rZHBKQLnX6XBYMgSDh8+zPDhwxk1ahSnT5/m4YcfZsKECTz22GM+SaXuK1St1Bh9+kCVKvDVV2BSquVujIEyGHIoMTExDB48mIkTJ3Lp0iWaNWtGnz59qFGjhtOq/YMLF6BTJ5g2zXKImDgRChVyWiuD0xgDZTDkMH755RcGDhzInDlzCA4Opl27dvTq1Yvy5cs7rZpHDhyAZ56BX36B99+Hd94x+00GC2OgDIYcgKryww8/4HK5WLp0Kddddx29e/emZ8+e3HLLLU6rlyqrV0Pz5hAfD/Pnw9NPO62RIZAwBspgyMYkJiYyd+5cXC4XmzZtokSJErhcLl599VWuv/56p9VLk3HjoGtXCAuD5cuhYkWnNTIEGsZAGQzZkAsXLjBp0iQGDx5MbGwst99+O+PGjeOFF14gJMAPC12+DD17wqhR0LAhzJwJN9zgtFaGQMQYKIMhG3Hy5ElGjx7N8OHDOXLkCDVr1mTQoEE0adKEoKAgp9VLlyNHoGVLK1xR797wf/8H2UBtg0MYA2UwZAMOHDjA0KFDiYyM5Ny5czRq1Ig+ffrw0EMPBZSreFps3mwdvj1yBKZPh+eec1ojQ6Dj91h8ItJIRKJEJFpE3vbwPEREZtnP14tIuNuzvnZ9lIg0TE+miETYMqJtmfns+roisklEEkSkRYrxB4rIDhHZJSKfSHb532/IkezatYsOHTpQpkwZhg8fztNPP83mzZtZtGgR9erVyzbGadYseOABK7beqlXGOBkyiD/zy2MlvYoBygD5gC1ApRRtugBj7HJrYJZdrmS3DwEibDlBackEZgOt7fIYoLNdDgfuBKYALdzGfgBY7SZ3LVAvvXmFhoaqweBL1qxZo02aNFFACxQooN26ddM9e/Y4rZbXJCSovv22KqjWrq36559Oa5Q9Ac6rH9/VgXL5ewVVE4hW1VhVvQR8DjRJ0aYJMNkuzwEa2KuYJsDnqnpRVfcA0bY8jzLtPvVtGdgynwFQ1ThV3YqVPdIdBfJjGboQIC9w2DdTNxjSRlX55ptvqFu3Lg888AArV67kP//5D3v37uXTTz8lPDzcaRW94tQpeOop+Ogj6xDusmVw881Oa2XITvh7D6oksN/t/gCQMnj+lTaqmiAip4Gidv26FH1L2mVPMosCp1Q1wUN7j6jqWhFZDhwCBBihqrs8tRWRTkAnwO8prw05i8uXLzNr1ixcLhfbt2/ntttuY9iwYXTs2JFC2TScwm+/WftNsbFWFPLXXnNaI0N2xDhJuCEi5YCKQCm76nsReVBVV6Zsq6qRQCRYKd/9p6Uhp3D+/HnGjx/PkCFD2LdvH1WqVGHKlCm0bt2avHnzOq3eNfPNN9YeU0iIlZq9bl2nNTJkV/z9ie8gcJvbfSm7zmMbEQkGrgeOp9E3tfrjQBFbRmpjpaQpsE5Vz6nqOWARUCtDMzMYMsixY8f473//S+nSpenZsydhYWF8/fXXbN26lRdeeCHbGidVy238qaegXDkruaAxTobM4G8DtQEob3vX5cNygliQos0C4CW73AJYZm8SLgBa215+EUB54OfUZNp9ltsysGXOT0e/fcBDIhIsInmBhwCPn/gMBm+Ji4ujR48elC5dmv79+/Pggw+yevXqK9lss4tHnifOn4c2baw4eq1bw8qVULq001oZsj3+9soAGgO/Y3ne9bPr+gNP2+X8wBdYThA/A2Xc+vaz+0UBj6cl064vY8uItmWG2PU1sPakzmOttHbo316GY7GM0k5gSEbmZLz4DGmxefNmfe655zQoKEjz5s2r7du31507dzqtls+Ii1OtVk1VRHXgQNWkJKc1ynmQS734xJq7ITMULFhQz58/77QahgBCVfnpp59wuVwsXryYQoUK0alTJ9544w1KlSqVvoBswk8/WekxLl+2QhY9/rjTGuVMRCReVQum3YZGwHCsX7THq/JRiuchWEdr7sX6xbyVKnEiPAp8hOW9fAnorcoyu08rrIVBEPC1Kn18O7O08ftBXYMhJ5OUlMS8efOoVasWDz/8MJs2beKDDz5g3759fPzxxznGOKlasfQeeQSKFYOffzbGyUlECAJGAo9jnRltI0KlFM06AidVKQcMBVx2/THgKVWqYm2FTLVlFgUGAQ1UqQzcIkIDL/UqaOt2TRgDZTD4gIsXLzJ+/HgqVqxI8+bNOXr0KKNGjSIuLo533nmHG3JQNNSLF+HVV61I5I0awbp1cPvtTmuV67HPgxKrihdnTBFVflXlD7t+B1DAXm2VAXarctR+9gPQPC0lRMgjwnMifCPCEeA34JAIO0UYJEI5byZl3MwNhkxw5swZxowZw7Bhwzh06BB33303s2bNonnz5tkieKu3/Pmnlb9pzRro1w/694c85tdcfxAsIhvd7iPVOuqSjJdnTEkQIfmM6TG3Ns2BTapcFCEauEOEcFveM1ifAdNiOZYh6wtsV7WCIYhwI/Aw4BLhS1WmpTdhMAbKYLgmDh06xPDhwxk9ejRnzpyhQYMGTJkyhQYNGmRrb7y02LjRynx78iTMnm1FJTf4jQRVrZ6VA4hQGeuz32MAqpwUoTMwCyvqzhqgbDpiHlHlcspKVU4Ac4G5ImT4HIUxUAaDF+zevZtBgwYxefJkEhISaNGiBW+99Rb33nuv06plKdOmwcsvwy23WKunu+5yWiNDCrw5Y3pABPczpohQCvgSeFGVmOQOqiwEFtptOgGJaSnhyThdS5tkzOLcYMgAGzZsoEWLFtxxxx1MmTKF9u3bExUVxaxZs3K0cUpIgF694IUXoFYt2LDBGKcAxT4PSoQIXpwxRUUoAnwDvK3KavcOItxk/3kDViDv8RlVSCTzHn/GzdwHGDfznImq8v333+NyuVi2bBnXX389Xbp0oUePHtxyyy1Oq5flnDhhHbr9/nvo3h0+/hiyaZCLbE8G3cwbA8OwXMInqPKBCP2BjaosECE/lofe3cAJoLUqsSL8G2vPaLebuMdUOSLCTCD5V5L+qnyexviz3W+BaqqU93KqV8s0BirzGAOVs0hISGDOnDkMHDiQX3/9lVtvvZU33niDTp06cd111zmtnl/YscMK9rpvnxXstWNHpzXK3WTEQDmNCONVedntfrQqnTMj0+xBGQw2Fy5cYOLEiQwePJg9e/Zwxx138Nlnn9G2bVtCQkKcVs9vfPWV9UmvUCHrIG4tE43SkDE+ABChmCrHsA74ZgqzB2XI9Zw4cYL333+fsLAwunbtys0338yXX37Jzp076dChQ64xTklJltt406ZQsaLltWeMkyGjqLLHLk6w709kVqZZQRlyLfv372fo0KFERkZy/vx5GjduTJ8+fXjwwQdzrKt4apw7By+9BPPmwYsvwtixkD+/01oZsik++89jDJQh17Fz504GDhzI9OnTUVXatGnDW2+9RdWqVZ1WzRFiY639pp07YehQeP11yGX22eBbfObYYAyUIdewevVqXC4XCxcuJDQ0lC5duvDmm28SFhbmtGqO8cMP8OyzVnnxYnj0UWf1MeQIfPbrjdmDMuRokpKSWLhwIXXq1KFOnTqsWbOG9957j3379jF8+PBca5xUrdVSw4Zw663W+SZjnAw+oq+vBJkVlCFHcunSJWbOnMnAgQPZuXMnYWFhfPLJJ3To0IGCBQPaWzfL+esvK9jrlClW6KIpU6BwYae1MuQUVNnuK1lmBWXIUZw7d46hQ4dStmxZ2rVrR1BQENOmTWP37t1079491xungwfhoYcso/TeezB3rjFOBt8jQksRCtvlf4swT4R7vJVjVlCGHMGRI0f49NNPGTlyJCdPnuShhx4iMjKSRo0a5TqPvNRYuxaaNYOzZy1vvaZNndbIkIN5V5UvRKgDPIKVV2o0/4ywnibXtIISkYIikvNyCRiyHbGxsXTt2pWwsDA++OAD6tWrx9q1a/nxxx95/PHHjXGymTAB6tWD0FArf5MxToYsJjmo7BNApCrfkH6qjn+QIQMlInlE5DkR+UZE3JJQyU4RGSQiGU5CJSKNRCRKRKJF5G0Pz0NEZJb9fL2IhLs962vXR4lIw/RkikiELSPalpnPrq8rIptEJEFEWqQYv7SIfCciu+z5hWMIODZv3kybNm0oX74848aNo23btuzatYt58+Zx//33O61ewHD5shVHr2NHqFvXcoaoUsVprQy5gIMijAVaAd/aCRC9XxCparoX8BPwLnAnkMet/kasBFdzgeczICcIiMHK1JgP2AJUStGmCzDGLrcGZtnlSnb7ECDClhOUlkxgNtDaLo8BOtvlcHsuU4AWKcb/EXjULhcCQtObV2hoqBqynqSkJF26dKn9+oOVAAAgAElEQVQ+9thjCmjhwoW1V69eevDgQadVC0iOHlV9+GFVUH3zTdXLl53WyHCtAOc1A+/qQLlAQ0GbgZa370uAPua1nIwNRl4ftakFLHG77wv0TdFmCVDLLgdjZXuUlG2T26Um0+5zDAj2NLZdN8ndQNlGcJW3P0RjoLKWhIQE/eKLL7RGjRoK6M0336wffvihnjx50mnVApbNm1XDw1VDQlQnT3ZaG0NmyW4GyldXhpZcqnolwZSIeMzx4d4mDTylJS6ZWhtVTYAraYlT65tafVHglC0jtbFScjtwSkTmiciv9udLj3ttItJJRDaKyMaEhARPTQyZ5K+//mLcuHFUrFiRli1bcvLkScaMGUNcXBx9+/alSJEiTqsYkMyZAw88AJcuwcqVVugigyE7kq4Xn4j8I8cHVlrgnEgw8CBWvpR9WKmO2wGfpWyoqpFAJFjpNvynYs7n9OnTjB49muHDh/Pnn39y7733Mnv2bJo1a0ZQkPHNSY2kJPjvf+H9960gr3PnQokSTmtlMFw7GXEzP6Oqbjk+ZHQmxvMyLbG4pyVOq6+n+uNAEREJtldRnsZKyQFgs6rGAojIV8D9eDBQBt/zxx9/MGzYMMaMGcPZs2d59NFHmTZtGvXr1zfeeOlw5gw8/zwsXGg5RIwcCbkkCLshB5ORT3wfpLjPTI4POy2xRNgedRlMS6xq17e2vfwigPLAz6nJtPsst2Vgy5yfAf2KiEhx+74+sPMa52rIIFFRUbz88stERETw8ccf07hxY3755Re+++47GjRoYIxTOvz+O9x/PyxaBCNGwLhxxjgZnMcXKd+98MqgmC82vYDGwO9Ynnf97Lr+wNN2OT/wBRCNZYDKuPXtZ/eLAh5PS6ZdX8aWEW3LDLHra2Ctls5jrbR2uPV5FNgKbMNyosiX3pyMk8S1sW7dOm3WrJmKiObPn187d+6s0dHRTquVrVi0SPX661WLFVNdvtxpbQxZBdnASQJ0ttv1BejuzMrMcMp3EVmgqk97awBzAyble8ZRVRYvXozL5eKnn36iSJEidO3alR49enDTTTc5rV62QRUGDYK334Y777Sy4IaHO62VIaswKd8zMH5mBjLkbhISEpg9ezYDBw5ky5YtlCxZko8//phXXnmFwiYYnFfEx8PLL8PMmdCyJUycCLk8xKAhMPDldhDgnYEynmoGr4mPj+ezzz7j448/Zu/evVSqVIlJkybRpk0b8uXzOvJJrmffPisC+ebN8OGH1grKbNEZAgG1U76LUEyVY+qDlO/ehJ4w/w0MGeb48eP079+f0qVL06NHD0qWLMn8+fPZtm0bL730kjFO18DKlVC9OsTEwIIF0LevMU6GvxGhkQhRIkSL4CGMHCEizLKfrxch3K5/VIRfRNhm/1nfrU8bu36rCItFKJYBVSb4bFIZ3wCjitObcIF6GSeJv9m7d6++/vrrGhoaqoA++eSTunLlSqfVyvaMGaMaHKx6++2qu3Y5rY3B35COkwRoEGgMaBnQfKBbQFOEkdMuoHYYOW0NaoeR07tBb7XLVUAP2uVg0COgxez7gaDvpaWH3W5hem0yemV4BaWq20WkpYjYOT7k33bEBa9zfBhyHtu3b+fFF1+kbNmyjBw5khYtWrBt27Yr2WwN18alS9C5M7z2mpXxdv16qFDBaa0MAUhNIFqVWFUuAZ8DTVK0aQJMtstzgAYiiCq/qvKHXb8DKGAHdxX7KiiCANfBlXZp4bPtIG+jy76rqmdFJDnHx2dYOT4MuRBVZeXKlTz55JNUrVqVefPm0a1bN2JiYpg8eTJVTNjsTHHkCDzyCIwZY+01LVwIJrqTIRW8DCOHexg5d5oDm1S5qMploDPWkZs/sGKVZiRogc8+PHubsDBFjg/9RkTe95UyhuxBUlISCxcuxOVysXbtWooVK0b//v3p2rUrN954o9Pq5Qg2bbKcIY4ds7z1Wrd2WqPA5MKFC8TGxpKYmJh+42xAUFAQZcqUoUCBAikfBYvIRrf7SLXCrfkMESpjhbF7zL7Pi2Wg7gZigU+xAnGn987v6yudvDVQB0VkLNZhVpeIXFuOD0O25NKlS0yfPp1Bgwaxa9cuwsPDGTFiBO3btyc0NNRp9XIMM2dChw5QvDisWgX3mI/oqRIbG0uxYsUoXrw4efJk71dRUlISR48eJTY2lsqVK6d8nKCq1dPo7mUYOdzDyCFCKeBL4EVVYuz21QCS70WYDf90vkiJKttFqI7lZh6GZWcE66PLnen1d8dbA/Us0AgYrKqnRKQE0NtLGYZsxtmzZ4mMjGTo0KEcPHiQu+66ixkzZtCyZUuCg739J2RIjcREeOcdGDgQHnzQikpuzi6nTWJiYo4wTgB58uShePHiHD58+Fq62yHfiMAyRK2B51K0SQ4jt5YrYeRQEYoA3wBvq7Larf1BoJIIxVU5irUw2ZVBfaZj2YZtQNK1TAi8NFCqGg/Mc7s/BBy61sENgc3hw4f55JNPGDVqFKdOneLhhx/ms88+47HHHjPx8XzMyZPw3HOweLHlFDFsGBhP/IyRE4xTMtc6F1USROiGlScvCJigyg4R+gMbVVmAtX80VYRo4ASWEQPoBpQD/iPCf+y6x1T5Q4T/AStEuAzsxcrukBGO2mNmigyHOjKkTk4LdRQTE8PgwYOZOHEily5dolmzZvTp04caNWo4rVqOZNcuaNIE4uLg00/h1Ved1ij7sHXrVu6806uvRgGPpzllh1BH7ojQAGgDLAUuJter/r3AyQjm+4zhCps2bcLlcjFnzhyCg4N58cUX6d27N7fffrvTquVYFi6Etm2hQAFYtgyMR372IyoqiieffJLdu3c7rUog0R6oAOTl7098CsZAGbxAVVm6dCkul4sffviB6667jl69etGzZ09KmGx3WYaqFaro3XctJ4gvv4Tbbku/n8GQTaihyh2ZFZKRjLqPYjlHjFTVzSLSydfujQb/k5iYyLx583C5XPzyyy/ccsstuFwuXn31Va6//nqn1cvRnD8P7dvDF19Yq6dx46wVlCFzdOwI27b5VmbVqvCZF+lKd+3aRbNmzRg7dix169a96llUVBRt27YlPj4egE8++YRHHnnEl+oGEmtEqKSauXx6GVlBdcDyhf+3iNyI7XpoyJ5cuHCByZMnM3jwYGJiYihfvjyRkZG8+OKLhJgsd1nOnj3W+abt2610Gf/6l4mnl1PYunUrrVq1YuLEidx///3/eH7rrbeyYsUKQkND2b59O61bt2b79u0OaOoX7gc2i7AHaw8qy9zMz6rqKaCXiHyElezPkM04deoUo0aNYvjw4Rw5coQaNWrgcrl45plnCAoKclq9XMHy5VZ6jMRE+PZbaNjQaY1yFt6sdHzNiRMnaNKkCXPnzuWeVA6uXbp0iZdffpkdO3aQJ08e4uLi/Kukf2nkCyEZMVDfJBdU9W0R6e6LgQ3+4eDBgwwbNoyxY8dy9uxZGjZsSJ8+fahXr55xFfcTqlYq9jfegNtvh/nzoXx5p7Uy+JLChQtTsmRJli9fnqqB+vDDD7npppuYM2cOSUlJnqJF5BhU2esLOek63avq/BT3n2ZmQBFpJCJRIhItIh5CwkuIiMyyn68XkXC3Z33t+igRaZieTBGJsGVE2zLz2fV1RWSTiCSISAsPOlwnIgdEZERm5uokv/32Gx07diQiIoKhQ4fy5JNP8uuvv7J48WIefvhhY5z8xMWLVnLBHj2gcWNYt84Yp5xI3rx5+fbbb5kxYwZjx4712Ob06dOUKFGCoKAgRo8enWPCM2Up3oQ+B6pjhcPYBGzFOiW81Yv+QUAMUAbIB2wBUoSEpwtgh4SnNWCHhKeS3T4EiLDlBKUlE5gNtLbLY4DOdjkcuBOYArTwoOdwYAYwIiPzCqR0G2vXrtVnnnlGAc2fP7927dpVY2NjnVYrV/LHH6r3368Kqv/+t2piotMa5Ty2bNnitAr622+/ably5VRV9ejRo1q5cmWdPn36P9pt27ZNy5cvr7fffrt27txZCxQo4FGepzmRTrqNnHp5a6CigKdtAxGWfHnRvxawxO2+L9A3RZslQC27HAwcw9pgu6ptcrvUZNp9jgHBnsa26yalNFDAvVih6ttlFwOVlJSk33zzjdatW1cBveGGG/Tdd9/VI0eOOKpXbmbdOtVbb1UNDVX94guntcm5BIKB8jXGQP19eRtX46iqLlDVPaq6N/nyor+XIeHVPSR8an1Tqy8KnLJlpDbWVYhIHuBjoFd6ExGRTiKyUUQ2JiQkpNc8S7h8+TJTp07lzjvv5IknnmDPnj0MHTqUffv20b9/f4oXL+6IXrmdyZOhbl0rVNHatdDiHx+RDYacjwh9MivD24O6/xWR8fwjfIV6dTo4gOkCfKuqB9Lbo1HrLFgkWKGO/KDbFc6fP8/48eMZMmQI+/bto3LlykyePJk2bdqQN29ef6picCMhAXr3tuLo1a8Ps2ZBsYwkyDbkKObNm8c777xzVV3p0qX57rvvHNLIP9jRzq/cYh1JcmVGprcGKrPhK7wMCS/uIeHT6uup/jhQRESC7VWUp7FSUgt4UES6AIWAfCJyTlXTDTHvD44dO8aIESP49NNPOXHiBHXq1GHkyJE0btw4RwXMzI4cPw6tWsHSpfD66zB4MJhA77mTZs2a0axZM6fVcIIzqrycfCPig2S23nwPBKIy8z0RyyDGYu1hJTs0VE7RpitXO0nMtsuVudpJIhbLQSJVmcAXXO0k0SXFWJPw4CRhP2tHgOxBxcXFaffu3bVAgQIK6NNPP62rV6/O0jENGWfbNtUyZVTz5VOdONFpbXIXW7Zs0cQc5H2SmJiYbfegQCNS3N+YWZne/tq9RkQqednnCmqtZJJDwu/CMj47RKS/iDxtN/sMKCoi0cCb2AmyVHUHllfeTmAx0FVVE1OTacvqA7xpyypqy0ZEaojIAaAlMFZEktsHFFu3buX555+nbNmyjB49mlatWrFjxw7mz5/PAw884LR6BmDePLj/frhwAX76Cdq1c1qj3EVQUBBHjx4lKemaUw4FDMkJC7PrwXlV9gCIUMy+P5FZmV6l2xCRXUBZSBm+QnNWvHsv8WW6DVVlxYoVuFwuFi1aRKFChejUqRNvvPEGpUqV8skYhsyTlAT/+x/07w/33WcZqltvdVqr3EduSfmendJtiLBAlafTb5k+3n4l90n4CsM/SUpKYv78+bhcLtavX0/x4sV5//336dKlCzfccIPT6hncOHMGXngBFiywVkyjR0P+/E5rlTspUKCAp/ToBmfxWRSADBkoERH7U2iqLuXJbXylWG7h4sWLTJ06lcGDBxMVFUWZMmUYNWoU7dq1y9GhULIr0dFWcsGoKMtbr0cPE+zVYEiBz+xARldQy0VkLjBfVfclV9qhg+pg5blfjuV0YMgAZ86cYezYsQwdOpRDhw5x99138/nnn9O8eXOCjftXQPL995annggsWQINGjitkcEQkPh3BYX1aa8DMFNEIoBTQH4sL7rvgGGq+quvlMrJnDhxgsGDBzNq1ChOnz5NgwYNmDx5Mo888oiJjxegqMLQodYZp8qV4auvoEwZp7UyGAKWvr4S5JWTBICI5AWKARfUSsOR6/HGSeLQoUOULVuWJ598krfeeovq1atnsXaGzHDhArz6KkydCs2bw6RJUKiQ01oZchvZxUlChNtUr4rs4/7sSVW+9kqe2TbKPN568R0/fpyiRYtmoUYGX3DgADRtChs3Wt56/fqBOQ9tcIJsZKB+AxqpEpeivgPQT5Wy3sgzmx0OYIxT4LN6tbViOn/e+qTXpInTGhkM2YI3ge9EeEKV3QAi9AWeAx7yVpj5fdBgSMG4cfDww1C4sJW/yRgnQ3ZAhEYiRIkQLYKHXHuEiDDLfr5ehHC7/lERfhFhm/1nfbu+sAib3a5jIgxLSwdVvgU6A4tEqGK3fwqoq8oBb+dkDJTBYHP5MnTrBp06WQbq558tpwiDIdARIQgYCTyOlTuvjQgpo/50BE6qUg4Yyt+BXI8BT6lSFcsjeyqAKmdVqZZ8AXvJQNxVVZZixW39EStPX31VTl7LvDL1iU9E3gUewArC+quqjsyMPIPBKY4ehZYtrXBFvXrBRx9BNo04Y8id1ASiVYkFEOFzoAlWaLhkmgDv2eU5wAgRRBV3D+wdQAERQlT/zlghwu3ATcDKtJQQ4SzWOSjBipvaADgikhx1iOu8mVRm96CKAuuwMtO+kUlZBoMjbN4MzzwDhw/DtGnQtq3TGhkM/yBYRDa63UeqlfInGU958e5LIcMt1x4JIldy7R1za9Mc2ORunGzs7OZpH8JVpXC6M/GCzBqok1hnoY5A5gMDGgz+ZvZsK1xR0aKwciUYr39DgJKgqln6r1OEylif/R7z8Lg18EJWju8Jr/agRKSwiNQWkbIAqvo/rDQWn2BlvjUYsgWJiZbbeKtWcM89liu5MU6GbIw3ufYQwT3XHiKUAr4EXlQlxr2TCHcBwar8kjWqp463K6jlWPmWKojIUaC9qv6BtflmMGQLTp+2PuN98w288gqMGGGlZzcYsjEbgPIiRGAZotZYrt3uLMByglgLtACWqaIiFAG+Ad5WZbUH2W2AmVmmeRp4ZaDcl5gi0gJYJCLNbCNlMAQ8UVGW23hMjBWF/LXXnNbIYMg89p5Scl68IGCCKjtE6A9sVGUBVj68qSJEY23JtLa7dwPKAf8R4T923WOqHLHLzwKN/TUXd64l1FEeoARwK/AE0EZV78gC3bINvswHZcg6vv0W2rSxVktz50Lduk5rZDBkjGwUSSLZi88TF4EYrIgSSzMiz6sVlIj8CRQA/gT+AA4BC72RYTD4G1VwueCdd6BaNSsyROnSTmtlMOQ80vLis89qVQGm23+mi7d7ULer6hkv+xgMjhEfDx06wKxZ0Lo1fPYZhIY6rZXBkDOxz1V5XEGpkghsEWFURuV55cXnC+MkIo1EJEpEokXEQzgOCRGRWfbz9SIS7vasr10fJSIN05MpIhG2jGhbZj67vq6IbBKRBHsvLbl9NRFZKyI7RGSriLTK7HwNzrFvH9SpY7mSf/QRzJhhjJPBkMUsF6G7CFd9oxAhnwj1RZgMxGdUmF9DHYmIh3Ackko4Dr0qHIfdrjVQGSs/1SgRCUpHpgsYass6yd/ehvuAdsCMFGPHAy+qavIYw0SkiC/mbvAvK1ZYbuOxsfD119Cnj8l8azD4gUZAIjBThD9E2ClCLLAbyxtwmGrGE9v6OxafHY5DY1X1ElwJx+FOE2CyXZ4DNBArk18T4HNVvaiqe4BoW55HmXaf+rYMbJnPAKhqnKpuBZLcB1bV31V1t13+A+sAcnHfTd+Q1ajCqFFWttsbb4T166GxI/5HBkPuQ5W/VBmlSm0gDCvU0T2qhKnySoqwSunibwPlKRxHydTaqGoCXAnHkVrf1OqLAqdsGamNlSoiUhPIB1cfWnN73klENorIxoSEBE9NDH7m0iUruWDXrtCwoWWc7sjV/qUGg3OoclmVQ6pcc2JbE83cAyJSAiuib3tVTfLURlUjVbW6qlYPDjZptZzmzz+tCOTjxkHfvjB/Plx/vdNaGQyGzODvN6s34TgOiIh7OI60+nqqPw4UEZFgexXlaax/ICLXYZ2q7qeq6zI4L4ODbNxoBXs9edLy1nv2Wac1MhgMvsDfKyg7HIdE2B51rbHCb7iTHI4DroTjULXrW9tefhFAeeDn1GTafZbbMrBlzk9LObv/l8AUVZ2TVltDYDBtGjz4IAQHW1lwjXEyGHIOfjVQ9komORzHLmC2qu4Qkf4i8rTd7DOgqIhEY6UPftvuuwOYjZXfZDHQVVUTU5Npy+oDvGnLKmrLRkRqiMgBoCUwVkSS2z8L1AXaichm+6qWZT8QwzWTmAi9e8MLL8B998GGDdYhXIPBEHiI8K4Ii0QYL0LXDPfzNtSR4Z+YUEf+5eRJ69Dtd99ZDhFDh0LevE5rZTBkHdkl1FFq2KnfT2LnDlSlR0b6md19Q7Zixw4r2Ou+fZZDxMsvO62RwWDIANeUO9B48RmyDfPnw/33w7lzsHy5MU4GQ6Aiwvvu96r8DxiPl7kDjYEyBDxJSTBggOWpV7Gi5bVXu7bTWhkMhjQoKUKb5BsRigOTVemoytCMCjGf+AwBzblzVkr2uXMth4jISMif32mtDAZDOrwKLBEhBiv9xkQspzWvMAbKELDExlqrph07YMgQ6NnTxNMzGAIZEaYAm4Bfga5Y8U4TgGdUifZWnvnEZwhIli6FGjXgwAFYtAjeeMMYJ0POIC4uzmkVspJJgADtgWlAOJaDxPMiV86kZhizgjIEFKowfDj06mXF0Zs/H8qVc1org8F7zp49y7p161i9ejUXLlzA5XIBsHbtWsLDw51VLotQZRmwLPlehGCgInAXcB9/B+/OEOYclA8w56B8w19/wWuvweTJliv51KlQONX8nAZDYDJ69GjGjx/P5s2bSUpKIk+ePDzwwAOsWLECESE+Pp5QLxOTZfdzUNeKWUEZAoI//oBmzawI5P/9L/znP5DHfIA2BChJSUns3LmTVatWsXr1atauXcuvv/5K4cKFOXPmDEWKFKFfv37Url2bWrVqcd11113p661xys2YFZQPMCuozLFunWWczpyxVk1NmzqtkcFwNRcuXEBEyJ8/P/Pnz6ddu3acOmVlkbjllluoXbs2Q4cO5bbbbktH0rVhVlAGgwNMmmTlcCpVCpYsgapVndbIYIAjR46wevVqVq9ezapVq9i0aRNTp06lVatWlCtXjpYtW1KnTh1q165NmTJlEOPBkyWYFZQPMCso77l82XKE+OQTeOQRK03GjTc6rZUhN6Kq/P7776gqFSpUYP/+/ZQuXRqAkJAQatSoQe3atWnbti1VHfoNKiMrKBEaAcOxQgqNV+WjFM9DsGLh3YuVjqiVKnEiPAp8hJWg9RLQ23Z2QIR8wAigHlYG8n6qzPXl3NLCrKAMfufYMSstxvLllvv4wIFWugyDwV+sW7eOlStXXlklHTt2jLZt2zJt2jRKlSrFsGHDqFGjBvfeey8hISFOq5suIgQBI4FHsbKHbxBhgSo73Zp1BE6qUk6E1oALaAUcA55S5Q8RqmBlhkjOPt4POKLK7SLkAfz6a6RZQfkAs4LKOFu2WIdvDx2CsWPhpZfS72MwZIaTJ0+yZs0ajhw5Qvv27QGoWrUq27dvp1y5ctSuXZs6derw0EMPUb58eYe19Ux6KygRagHvqdLQvu8LoMr/ubVZYrdZa7t//wkUV0Xd2gjW6qqEKhdF2A9UUMWRF5z5vdXgN+bOhRdfhCJFYMUKqFnTaY0MOZXvv/+euXPnsmrVKnbssNK9FStWjHbt2iEiTJ06lRIlSnDzzTc7rGmGCRaRjW73kaoa6XZfEtjvdn8A69wRntqokiDCaaw8ecfc2jQHNtnGqYhdN0CEekAM0E2Vw5meTQYxjryGLCcpCd59F1q0gDvvtIK9GuNk8AUJCQls3LiR4cOH06pVK+Lj4wH48ccfmTlzJrfddhsDBgxg+fLl7N2794ozQ7Vq1bKTcQJIUNXqbldk+l28Q4TKWJ/9XrWrgoFSwBpV7gHWAoN9PW6aqKq5MnmFhoaqwTOnT6s+9ZQqqHbsqPrXX05rZMgJrF69Whs0aKAFCxZUrGCkWrp0ad25c6eqqp47d04TEhIc1tJ3AOc1jXcQaC3QJW73fUH7pmizBLSWXQ4GPQZqb/NoKdDfQWu7tRfQ86B57PvbQHekpYevL7OCMmQZu3db+Zu+/RY+/dRKMJgN9psNAcSBAweYNWsWPXr04J577mH+/PkABAUFcfz4cdq3b8/MmTPZv38/e/fupWLFigAULFiQoKAgJ1X3NxuA8iJE2J53rYEFKdosAJJ3fVsAy1RR+1PeN8DbqqxObqzW3tRCLA8+gAZwldNF1uNPa2hZYRoBUUC09QP5x/MQYJb9fD0Q7vasr10fBTRMTyYQYcuItmXms+vrYkXcTQBapBj/JWC3fb2UkTmZFdQ/WbRItUgR1aJFVZctc1obQ3YgISFBT506paqqhw8f1rCwsCuro9DQUG3QoIEuXrzYYS2dgXRWUFYTbWyvgmJA+9l1/UGftsv5Qb8AjQb9GbSMXf9ve6W02e26yX4WBroCdCvoUtDS6enhy8vfxikIa6OtDJbP/RagUoo2XYAxdrk1MMsuV7Lbh9iGJ8aWl6pMYDbQ2i6PATrb5XDgTqwzAS3cxr4RiLX/vMEu35DevIyB+pukJNWBA1Xz5FG9807VPXuc1sgQqJw/f16XL1+u77//vjZq1Eivv/56femll1RVNSkpSdu1a6fDhg3TDRs26KVLl5xV1mEyYqBy4uVvL76aQLSqxgKIyOdAE65eNjYB3rPLc4ARYu1sNgE+V9WLwB4Ribbl4UmmiOwC6gPP2W0m23JHq2qc3TYphX4Nge9V9YT9/Hus1dnMTM88F3DhgpWGfcYMyyFi0iQomOuCsxhS48iRI8TExFCrVi0AatasecXDrnLlyrRq1YonnngCABFh4sSJjulqCAz8baC8dIXUBBFJdoUsCaxL0Tf5MJknmUWBU6qa4KG9N/p57CMinYBOAPny5UtHbM5n/34rht6mTfDBB9C3r8nflNvZs2cPy5YtuxJQdffu3RQtWpSjR48iIvzvf/8jf/781KpVixtNGBGDB8w5qGtELTfPSLAO6jqsjqOsWgXNm1srqPnz4amnnNbI4G8uXrzIL7/8wqpVq3j99dcJCQlh1KhRDB48mKJFi1K7dm1eeeUV6tSpg6oiIjRv3txptQ0Bjr8N1EHAPdxvKbvOU5sDIhIMXI91sjmtvp7qjwNFRCTYXkV5GsuTfvVSyPoxnT65mshI6NYNIiLgp5+gQgWnNTL4i927dzNhwgRWrVrFhg0buHjxIgAPP/wwNWrUoGvXrnTs2JE77rjDBFM1XBP+dgxMcCkAABhRSURBVDO3XSElQkS8cIVUtetbi0iIiEQA5f+/vTsPr6I6Hzj+fUliWCUaq0RAA0pVojHIonADRSiI2ipFUHB9kEqruNu6IS5oW1v3ov2h4oJoRVSwoCKVItKEXaAmYTMBxdRYiknYAmTh/f0xJ/GSZgG8uXeS+36eJw9zzz1z5hwG8s6ZOXMOsLy2Mt0+n7gycGX+rZ76zQMGi8hRInIUMNilmWpKS+GGG7yZyH/6U28dJwtOTZOqsmnTJqZNm8avfvUrPv30UwAKCgp4/PHHKSsrY9y4ccycOZNvv/2Wnj17ApCcnMypp55qwckcvnCPygAuADbijbxzQyGZCLihkDQH3sYbGr4c6By073i33wbg/LrKdOmdXRm5rsx4l94T7/nSbryeVk7QPte6/LnA6INpU7SN4vvPf1T79VMF1bvuUm1C70OaIEVFRTp8+HBt165d1XDvtm3b6pQpU1RVtaysTHfv3h3hWkYHonQUn00WGwLRNFnsqlXeZK///S+89BJcfnn9+xh/27FjB0uXLq0azJCamspTTz3F/v376d69OykpKVUTqqakpNDMljoOO1uw0Jh6vPkmjBkDxxwDmZlw1lmRrpE5HEVFRRx11FEADB06lDlz5rB//36aNWvGmWeeSbt27QBo1qwZq1evjmRVTZSzAGXqVVEB997rrdvUty+88w4ce2yka2UORkVFBTk5OVW9o4yMDPbt20dBQQEiQp8+fUhLSyMQCHDOOefQpk2bSFfZmCoWoEydiou923hz58L118PTT4O99uVfJSUlLF++nEAgQFxcHHfddRdPPPEEAElJSfTt25dAIEB5eTlxcXHceeedEa6xMbWzZ1Ah0FSfQa1fDxddBJs3w7PPeiP2jL8UFxcf8DLsqlWrKC8vZ/ny5fTs2ZPPPvuMtWvXkp6eTnJyso2oa6Si9RmUBagQaIoB6oMPvJ5TfLy30GDfvpGukVFV1q9fT2ZmJr169SI1NZUFCxYwcOBAmjdvTs+ePUlPTyc9PZ1+/frRunXrSFfZhEi0Bii7xWcOoAp/+APcdx906wazZsEJJ0S6VtGrpKSESZMmkZmZSWZmJoWFhQA8/PDDpKam0rt3bxYvXkz37t1tyi3T5FgPKgSaSg9q924YPRreftvrPb34IrRsGelaRY/CwkIWL15MRkYG7dq149Zbb6W8vJyjjz6apKQkAoFA1TOkLl262O26KGI9KBPVvvwSLr4YsrPhscfgjjtsstdwue+++5g5cybr1q0DIC4ujlGjRgEQGxtLfn4+Rx55ZCSraExEWIAyLFzoLY9RUeGtfnveeZGuUdNTVlbGmjVrqgYzbNmyheXLlwOwbds2OnXqxJVXXkkgEKBXr160aNGial8LTiZaWYCKYqrw3HNw663w4x97M5F36RLpWjUNO3bsqFp2/Omnn2b8+PGUlJQA0KlTJwKBAHv37qV58+ZMnjw5wrU1xp8sQEWpfftg3DhvuqKf/xxefx3sQv3wbdmypWogQ0ZGBllZWXz22WekpaXRtWtXxowZQ9++fenTpw/t29e3LJkxBmyQREg0tkESBQXe+k1LlsCECfDgg2DTqx28iooKsrKySExMpGPHjsyfP59BgwYB0KpVK3r37k16ejqjR4/mBBsCaUIgWgdJWIAKgcYUoJYv91a+LS6GqVO9Z0+mbuXl5SxatKiqd7RkyRJ27tzJxIkTmTBhAjt27ODVV18lPT2d1NRUYmPtxoQJLQtQ5rA1lgD12mswdiwkJXnPm1JTI10jfyooKCAzM5PY2FiGDh1KWVkZbdu2Ze/evaSkpFS9DNu/f3+7XWfCwgKUOWx+D1Dl5XDnnfDUU3DuuTBjhjcjufne9OnTmTt3LhkZGWzatAmAPn36kJmZCcDSpUs59dRTSUhIiGQ1TZQ6mAAlwhDgGSAGmKLKo9W+jwdeA7rjrYN3mSpfijAIeBQ4AigFfqvKArfPQiAJ2OOKGazK1pA1rB4WoELAzwGqsBBGjoSPP4abb4bHH4e4uEjXKnL27t3LypUryczM5IsvvmDKlCkAXHLJJWRkZBAIBKrWPurWrZvNzmB8ob4AJUIM3qKtg/AWY10BjFJlbVCeG4BUVX4twkjgF6pcJkI34D+qfCPC6cA8Vdq7fRYCv1FlZYM1rg52s7wJy872Xr7Nz/dG6117baRrFDnvvvsuTz75JCtXrqS0tBSAU045hV27dtG6dWteffVVWrdubbMzmMaqF5CryiYAEaYDF8P3Acp9ftBtvwM8K4KoErzoVw7QQoR4VfY1fLXrFvaxWyIyREQ2iEiuiNxdw/fxIvKW+36ZiCQHfXePS98gIufVV6aIdHJl5Loyj6jrGCISJyJTRSRLRNaJyD0N9zfRsGbNgnPOgT174NNPoyM4qSq5ublMnTqV6667jtNOO421a73/n/v27UNVueWWW3jvvffYunUr69evr5pQtU2bNhacjJ/FisjKoJ+x1b5vD3wd9DnfpdWYR5VyYDuQWC3PJcCqasHpFRHWiDBBhPD+Jwnn+vJ490bzgM549zv/BXStlucGYLLbHgm85ba7uvzxQCdXTkxdZQIzgJFuezJwfT3HuByY7rZbAl8CyfW1q2XLluoXFRWqDzygCqq9eqnm50e6Rg2ntLRUd+7cqaqqK1as0OOOO04BBTQhIUEvvPBCXb16dYRracwPB+zWOn+36nDQKUGfrwJ9tlqebNAOQZ/zQI8J+pzi0k4KSmvv/mwD+nfQq+uqR6h/wt2Dct1Q3aSqpVDVDQ12MTDVbb8DDBTv0vZivOCxT1U3A7muvBrLdPsMcGXgyhxazzEUaCUisUALvAeGO0LX/Ia1c6f3ftNDD8E113g9p6Y0yGz79u189NFHTJgwgXPPPZe2bdvy3HPPAd7sDIMGDWLy5MlkZWXx3Xff8f7775OWlhbhWhsTFv8GOgZ97uDSaswjQizQFm+wBCJ0AGYBV6uSV7mDqleGKjuBv+L9vg2bcD+DqqkbenZteVS1XEQqu6HtgaXV9q389VtTmYlAsaqW15C/tmO8gxe8CvB6ULepauFhtTTM8vK8503r13ur3t58c+Oe7FVV2bJlC0VFRaSlpVFWVkZSUhJ79uwhJiaGtLQ0xo4dSyAQACAxMZFp06ZFuNbGRMwKoIsInfAC0Ui8O0LBZgPXAEuA4cACVVSEBOAD4G5VMiszuyCWoMo2EeKAnwHzG74p37NBEgfqBVQAxwNHAf8Ukfmquql6RncPeCwQ8ZFe8+fDpZd6AWnePBg4MKLVOWzZ2dksXLiw6oXY/Pz8qqHecXFxTJo0ieTkZM4++2xbjM+YIKqUi3AjMA/vscfLquSIMBFYqcps4CVgmgi5QCFeEAO4ETgZuF+E+13aYGA3MM8Fpxi84PRi2BpF+APUoXRD892ttspuaF371pT+HZAgIrGuFxWcv7ZjXA58pKplwFYRyQR6AP8ToFT1BeAF8IaZH+xfQCiper2l3/wGunb1Xr7t3DkSNTl0u3fvZtmyZeTk5HDTTTcBcO+99zJnzhw6dOhQNdS7b9BSvmPGjIlUdY3xPVU+BD6slnZ/0PZeYEQN+z0CPFJLsd1DWcdDFs4HXngBcRPeIIfKAQ0p1fKM48ABDDPcdgoHDpLYhBfVay0TeJsDB0ncUM8x7gJecdut8IZoptbXrkgMkigpUb36am8wxLBhqm6sgK8tW7ZMb7nlFu3evbvGxMQooM2aNdPCwkJVVc3JydGvvvoqwrU0xn+oZ5BEU/0J/wHhArwXyvKA8S5tInCR227uAksusBzoHLTveLffBuD8usp06Z1dGbmuzPi6jgG0duk5Ljj99mDaFO4A9fXXqj16eGfvoYe8kXt+UlFRodnZ2fr888/rVVddpXl5eaqq+sILL2iLFi20f//+On78eJ07d64WFRVFuLbG+F+0BiibSSIEwjmTxOLFMGyYtzz76697AyP8YuPGjdx+++0sXryYoqIiAI499ljefPNNBgwYwJ49e4iNjSUumqeyMOYwROtcfDZIohGZMgVuuAFOOAH+8Q9ISYlMPbZt21Y1kCEzM5NRo0Zx00030bZtW/Ly8hg2bBiBQIC+ffty0kknVb0AG7xKrDHG1McCVCNQVga33eatfjt4MLz5Jhx9dHiOraps376dhIQEKioq6NatG1lZWYA3erFHjx5VE6ged9xxrFu3LjwVM8Y0eRagfG7bNhgxAhYuhDvugEcfhYZcbqi0tJTVq1dX9Y4yMjLo2rUrCxcuJCYmhkGDBnHFFVcQCATo0aMHzZs3b7jKGGOimj2DCoGGega1Zg0MHQrffuvd3rvyypAfguLiYj7//HP69esHwEUXXcScOXMA6Ny5M+np6QwYMIBrrrkm9Ac3xhyUaH0GZQEqBBoiQM2YAaNHw1FHwXvvQY8eoSm3oKCABQsWVPWQsrOzASgsLCQhIYGPP/6Y7du3EwgESEpKCs1BjTE/SLQGKLvF5zP798OECfD730OfPvDuu9Cu3eGVVV5eTlZWFhkZGQwfPpykpCRmzZrFuHHjaNOmDb1792bEiBEEAgFatmwJwKBBg0LYGmOMOXzWgwqBUPWgtm+HK66ADz6A666DSZMgPv7Qyvj22295/vnnyczMZMmSJezatQuAGTNmMGLECLZu3UpBQQGnn346MTExP7jOxpiGF609KAtQIRCKALVhg/dOU14ePPMMXH99/ZO9fvPNN1UDGQKBAJdeeilff/01J554ImeccUbVUO9AIMAJJ5zwg+pnjImcaA1QdovPB+bOhVGjvKXY58+Hn/yk9ryqyujRo1m0aBGbN28GvPeLjnbjzjt27EhxcTFHHnlkOKpujDENxnpQIXC4PShV+NOf4J574MwzvcEQJ57ofbdnzx5WrFhR1UNq1aoVM2bMAOD888+nVatWBAIBAoEA3bp1s9kZjGnCrAdlwqqkBMaMgenT4bLL4Mknizn+eO+F15tvvpnJkydTVlYGwGmnncZ551WtcM/cuXMjUmdjjAkn60GFwKH2oL76Srnggn2sWxfPWWe9y44d49m0KY+ioiLatGnDK6+8woYNGwgEAvTp04fExMQGrL0xxu+sB2XCYv166NlzD7t2lQHD2Lx5GYFAgDFjrqWiogKA0aNHR7aSxhjjAxagwqxzZxgypJzU1HkMH/4Ep5xyCs2aNYt0tYwxxnfsFl8IhHO5DWNM9InWW3x26W6MMcaXLEAZY4zxJQtQxhhjfCnsAUpEhojIBhHJFZG7a/g+XkTect8vE5HkoO/ucekbROS8+soUkU6ujFxX5hEHcYxUEVkiIjkikiUituCRMcZEQFgDlIjEAM8B5wNdgVEi0rVatjFAkaqeDDwF/NHt2xUYCaQAQ4C/iEhMPWX+EXjKlVXkyq7rGLHA68CvVTUF6A+UhfQvwRhjGoAIQ0TYIEKuCDVc/BMvwlvu+2UiJLv0QSJ8JkKW+3NADfvOFiE7DM04QLh7UL2AXFXdpKqlwHTg4mp5Lgamuu13gIEiIi59uqruU9XNQK4rr8Yy3T4DXBm4MofWc4zBwOeq+i8AVf1OVStC2H5jjAk5EWq4UKeWi38OuDAHtgE/V+UM4BpgWrWyhwG7GrD6tQp3gGoPfB30Od+l1ZhHVcuB7UBiHfvWlp4IFLsyqh+rtmP8GFARmSciq0TkztoaIiJjRWSliKwsLy+vLZsxxoSDu1BnkyqHcPGPqLJalW9ceg7QQoR4ABFaA7cDjzR4C2pggyQOFAukA1e4P38hIgNryqiqL6hqD1XtERtr7zsbYxpUbOUFsfsZW+37Q7z4J/jCPNglwCpV9rnPDwNPACUhaMMhC/dv1n8DHYM+d3BpNeXJd8+E2gLf1bNvTenfAQkiEut6ScH5aztGPrBIVbcBiMiHwFnAP+pqVElJiYrInrqb3mBigabShWtKbQFrj581tra0UNUeDXkAEVLwbvsNdp/TgJNUua3yeVW4hTtArQC6iEgnvCAxEri8Wp7ZePdBlwDDgQWqqiIyG/iriDwJHA90AZYDUlOZbp9PXBnTXZl/q+cY84A7RaQlUAr8BO9ebZ1UNWI9URFZ2dD/cMOlKbUFrD1+1pTa4hzixT/BF+aI0AGYBVytSp7L3xvoIcKXeLHiWBEWqtK/oRpRXVh/sbqezI3APGAdMENVc0Rkoohc5LK9BCSKSC7evc+73b45wAxgLfARME5VK2or05V1F3C7KyvRlV3XMYqAJ/EC6Rpglap+0DB/G8YYEzLu4p9OIhyBd6E+u1qeygtzqLowR0VIAD4A7lYlszKzKv+nyvGqJOM98tgYzuAENhdfo9eUrgSbUlvA2uNnTaktlUS4AHgaiAFeVuV3IkwEVqoyW4TmeCP0ugGFwEhVNolwH3AP8EVQcYNV2RpUdjLwviqnh6k53nEtQDVuIjJWVV+IdD1CoSm1Baw9ftaU2tKUWYAyxhjjSzbM3BhjjC9ZgDLGGONLFqB8TEQ6isgnIrLWTV57i0tPE5GlIrLGvbTXy6WLiPzZTYL7uYicFdkWHEhEmovIchH5l2vPQy79kCf1jbQ62vKGm7g4W0ReFpE4l94oz03Q938WkV1Bn317bqDO8yMi8jsR2Sgi60Tk5qB0356fqKWq9uPTHyAJOMtttwE24s2z9XfgfJd+AbAwaHsu3rth5wDLIt2Gau0RoLXbjgOWuXrOAEa69MnA9W77BmCy2x4JvBXpNhxEWy5w3wnwZlBbGuW5cZ974I3+2hWU37fnpp7zMxp4DWjmvju2MZyfaP2xHpSPqWqBqq5y2zvx3vNqDyhwpMvWFqrm0boYeE09S/Fm0kgKc7Vr5epVeRUe536UQ5/UN+Jqa4uqfui+U7wXyTu4PI3y3Ii3WsBjQPV5KX17bqDOf2vXAxNVdb/LVzmU2tfnJ1pZgGok3C2UbnhXgrcCj4nI18DjeO8wwMHNxxVR4i2RsgbYCnwM5HHok/r6QvW2qOqyoO/igKvwXiqHRnhuXHtuBGarakG17L4+N1Bre04CLnO3xueKSBeX3ffnJxpZgGoERKQ18C5wq6ruwLsKvE1VOwK38f0MGb6n3uwfaXg9i17AqRGu0mGr3hYRCX6J8S948zr+MzK1O3Q1tKcfMAKYFNmaHZ5azk88sFe9l3RfBF6OZB1N3SxA+Zy7En8XeENVZ7rka4DK7bfxftHDwc3H5QuqWgx8gjffV4J4k/ZCzZP6Vi4mWTV3mJ8EtWUIgIg8APwIbxqtSo3x3JwLnAzkisiXQEvxpgeDRnJu4H/OTz7f/9+ZBaS67UZzfqKJBSgfc/f0XwLWqeqTQV99gzeRLXjPbyqnKJkNXO1GJJ0DbK/h1kzEiMiPRCTBbbcABuE9V6uc1BdqntQXgib1DV+Na1dLW9aLyC+B84BRlc85nMZ4bj5T1XaqmqyqyUCJeqtQg4/PDdR+foD38AIveP+HNrptX5+faGULGflbAO85Rpa7lw5wL3Ad8Iy7ct0LVK4N8yHeaKRcvPVbRoe3uvVKAqa6B+/N8Cb2fV9E1gLTReQRYDUHTuo7zV21F+KNFvOL2tpSDnwFLHFjBmaq6kQa6bmpI7+fzw3Ufn4ygDdE5Da8VWJ/6fL7/fxEJZvqyBhjjC/ZLT5jjDG+ZAHKGGOML1mAMsYY40sWoIwxxviSBShjjDG+ZAHKGGOML1mAMsYY40sWoIz5AUTkl+Kty7VGRPYHbT9Vz34tRORT9yIp1dZausCtV3SiiBwhIouCpoIyJmrYi7rGhICItAcWq+qJB5l/HBCrqs+4z7tUtbWIDASeB85T1Tz33QNArqq+0UDVN8aXrAdlTGicDmQdQv4r+H7OQQDc7OEvAj+rDE7Oey6/MVHFbhsYExpnANkHk1G8Je07q+qXQcnxeIGov6qur7ZLNtAzFJU0pjGxHpQxoXEoPahjgOJqaWXAYmBM9cyqWgGUikibH1RDYxoZC1DGhMb/9KBE5EEReUZE7q+Wdw/QvFrafuBSvIX17q2h/Hi8meuNiRoWoIz5gUSkGdAFb22ryrT2eLfQi/GWTamiqkVAjIg0r5ZeAlwIXCEiY4LKSgS2qWpZgzXCGB+yZ1DG/HAnA/mqWhqU9jBwC97Kuh1r2OfvQDowPzhRVQtFZAiwSET+q6qz8RbY+6BBam6Mj9kwc2MagIjcARwJJAIbVHVSte/PAm5T1asOoqyZwN2qurG+vMY0JdaDMqYBqOoT9Xy/SkQ+EZEYNwiiRm7E33sWnEw0sh6UMcYYX7JBEsYYY3zJApQxxhhfsgBljDHGlyxAGWOM8SULUMYYY3zJApQxxhhfsgBljDHGl/4f0MSBwTgkWs4AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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1CkpKQwcODDKPTAmvvh80KaNM4qqqHCS0CYmOrf94vWxPgtQhu+//55NmzZx6NAhRo8eDcDAgQP54osvAOjWrRuZmZk1zxr5fD422FOFxkSciBOQgm/7Rfr7qUixANVCLV++nGXLltUkTK2srKRz586UlJQAkJubS9u2bRkyZAgd7KlBY6Ju3LhxvP/++6SlpbF79+6a76fee+8D5s17kaysq/n880JeeeWVuAlUcTowNODMwtm5cyevvfYaM2bM4Nprr6XCnRK0evVq8vPzSUtL44EHHmDx4sV8+umnNfuOHTuWUaNGWXAyxiPuuOMOli1bVqssIQFWrVrGqFGjEHFm/pWVQYRmwzc7G0HFCVXl66+/5oILLiA5OZm8vDymT59ekzA1JSWFQYMGcfDgQTp16kRubi7PP/98rendxpj63XknbNnStMfs2xfmzq27zsiRI9m5c+dp5WvXruXXv/41r7/+OiLO81MLFrzB008/wYoVK7nook6n7bNgwQKeeOIJKioqaN++Pfn5+XTp0qWputNkbAQVo0pLS1m+fHmthKndu3evWXo8PT29VsLUY8eO8fHHH9Opk/PD2rZtWwtOxsS4ffv2kZiYSFpaGuB8B/Xmm3k8++xTvP32e6SmdqK83BlZBbruuusoKipi+/bt3HrrrcyaNSsKra+fjaBiQHXC1IKCAq666iquueYa9uzZw4033khCQgKXX3452dnZZGZm1jxQl5WVRVZWVpRbbkz8qW+kE0lLly5lREAupE8++YSioiI+/PBDUlPbU14e+vmpL7/8kptvvpn9+/dTUVHhydET2AjKc6pTT5WVlXH77bfTs2dP2rdvz/XXX88jjzzCmjVrAOjTpw9r167l2LFjbN26lZdffplp06Z59gfNGNP0Vq1axZgxY2red+vWjRMnTrB161YSEpxp6W3aOEGprMyZmu73w/Tp05k2bRq7du3ihRdeqEk75jU2goqi4ISp69evp3///rz22mskJSWxe/duMjIymDx5MpmZmQwePJjzzjsPgFatWjFs2LAo98AYEy1VVVVs27at1p2Srl278swzz3DLLbeQn5/P4MGDQz4/VVpaSteuFwMwb968aHWhXhagomjYsGE1axelpaWRmZnJFVf8sMCwrWtkjKl244038tlnn3HkyBE6duzI1KlT6du372nZHgYMGEBeXh7j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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ "vdict = Variable.__defaults__.copy() \n", "expr = eq_nua.subs(vdict)\n", "exprr = eq_ka.subs(vdict)\n", "xvar = T_a\n", "yldata = [(expr.rhs, 'full'), (expr.rhs/2, 'half')]\n", "yrdata = exprr\n", - "\n", - "plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, yrmin=-0.0001, fontsize=14) # note that yrmin=0 would have no effect\n", - "plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, colors=['red', 'blue'], linestylesr=['--'])\n", - "plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata)\n", - "plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=[(1/exprr.rhs, 1/exprr.lhs)],\n", + "fig=plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, yrmin=-0.0001, fontsize=14) # note that yrmin=0 would have no effect\n", + "fig=plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, colors=['red', 'blue'], linestylesr=['--'])\n", + "fig=plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata)\n", + "fig=plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=[(1/exprr.rhs, 1/exprr.lhs)],\n", " loc_legend_right='lower right')\n", - "plot_expr2((T_a, 273, 373), expr)\n", - "plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a))" + "fig=plot_expr2((T_a, 273, 373), expr)\n", + "fig=plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "To manipulate the figure later, we save the output to `fig` and then manipulate `fig`, e.g.:" + "We can also manipulate the figure later, e.g. change the width:" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -316,14 +406,12 @@ "
" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Manipulate figure\n", - "fig = plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a))\n", "%matplotlib inline\n", "fig.set_figwidth(8)\n", "fig" @@ -340,7 +428,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -363,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -380,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -409,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -439,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -487,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -499,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -514,7 +602,7 @@ "K " ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -525,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -540,7 +628,7 @@ "dT_g " ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -551,7 +639,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -569,7 +657,7 @@ " 'Pa K$^{-1}$')]" ] }, - "execution_count": 15, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -588,7 +676,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -620,7 +708,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -636,7 +724,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -655,7 +743,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -685,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -724,7 +812,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -748,7 +836,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -763,7 +851,7 @@ " V_g " ] }, - "execution_count": 22, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -785,7 +873,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -800,7 +888,7 @@ " V_g " ] }, - "execution_count": 23, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -823,7 +911,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -832,7 +920,7 @@ "(__main__.eq_Pg,)" ] }, - "execution_count": 24, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -843,7 +931,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -852,7 +940,7 @@ "['eq_Pg']" ] }, - "execution_count": 25, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -863,7 +951,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -878,7 +966,7 @@ "⎣ V_g ⎦" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -887,6 +975,34 @@ "[parent.expr for parent in eq_Pwa_nw.definition.__bases__]" ] }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'eq_Pg'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def get_parents(equation):\n", + " \"\"\"Return set of recursive parents of equation.\"\"\"\n", + " allparents = set()\n", + " parents = equation.definition.__bases__\n", + " for parent in parents:\n", + " if hasattr(parent, 'name'):\n", + " allparents.update([parent.name])\n", + " return allparents\n", + "get_parents(eq_Pwa_nw)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -896,7 +1012,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -905,22 +1021,43 @@ "{'eq_Pg', 'eq_ideal_gas_law'}" ] }, - "execution_count": 27, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "def get_parents(equation, allparents=set()):\n", + "def get_allparents(equation, allparents=None):\n", " \"\"\"Return set of recursive parents of equation.\"\"\"\n", - " \n", + " if not allparents:\n", + " allparents = set()\n", " parents = equation.definition.__bases__\n", " for parent in parents:\n", " if hasattr(parent, 'name'):\n", " allparents.update([parent.name])\n", - " get_parents(eval(parent.name))\n", + " get_allparents(eval(parent.name), allparents)\n", " return allparents\n", - "get_parents(eq_Pwa_nw)" + "get_allparents(eq_Pwa_nw)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'eq_ideal_gas_law'}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_allparents(eq_Pg)" ] }, { @@ -933,7 +1070,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -963,7 +1100,7 @@ " V_g " ] }, - "execution_count": 28, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -979,15 +1116,15 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4 µs, sys: 1 µs, total: 5 µs\n", - "Wall time: 11 µs\n" + "CPU times: user 2 µs, sys: 2 µs, total: 4 µs\n", + "Wall time: 7.39 µs\n" ] }, { @@ -1000,7 +1137,7 @@ "P_g = 249.42" ] }, - "execution_count": 29, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1012,15 +1149,15 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3 µs, sys: 0 ns, total: 3 µs\n", - "Wall time: 7.87 µs\n" + "CPU times: user 3 µs, sys: 2 µs, total: 5 µs\n", + "Wall time: 10.3 µs\n" ] }, { @@ -1033,7 +1170,7 @@ "P_g = 249.42" ] }, - "execution_count": 30, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1061,7 +1198,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1091,7 +1228,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1125,7 +1262,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -1161,7 +1298,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1179,7 +1316,7 @@ "P_wa = p_CC1⋅ℯ " ] }, - "execution_count": 34, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1197,7 +1334,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1236,7 +1373,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1257,7 +1394,7 @@ " ⎩ " ] }, - "execution_count": 36, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1270,7 +1407,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1330,7 +1467,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1370,7 +1507,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1416,7 +1553,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -1468,7 +1605,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -1514,7 +1651,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -1566,7 +1703,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -1598,7 +1735,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -1613,7 +1750,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -1658,172 +1795,239 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 50, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:alpha_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pa\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pamol\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pv\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:C_wa\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:D_va\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Gr\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:h_c\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:k_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:lambda_E\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Le\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_air\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_N2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_O2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:M_w\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:nu_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Nu\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Pr\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_N2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_O2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_wa\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_was\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_d\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Re_c\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Re\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:rho_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_u\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:R_mol\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_s\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:sigm\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:T0\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:T_a\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:v_w\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:x_N2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:x_O2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_Dva1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_Dva2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_alpha1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_alpha2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_ka1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_ka2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_nua1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_nua2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:V_g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:n_g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:n_w\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_g\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:Delta_Pwa\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:x\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:p_CC1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:p_CC2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_a1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_a2\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_wa1\" will be overridden by \"essm.variables._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Le\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Cwa\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Dva\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_alphaa\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_ka\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_nua\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_rhoa_Pwa_Ta\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Pa\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PN2_PO2\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PO2\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PN2\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_rhoa\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_ideal_gas_law\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pg1\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_nw\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_CC\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq1\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n", - "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_Delta\" will be overridden by \"essm.equations._core:\"\n", - " instance[expr] = instance\n" - ] - } - ], + "outputs": [], + "source": [ + " commandstr = '''{{'__doc__': \"\"\"{1}\"\"\",'''.format(\n", + " name, doc.replace('\\n', ' ').replace('\\r', ''), unit, assumptions, latex_name,\\\n", + " default, expression)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "with open('test_definitions.py', 'wt') as file1:\n", + " file1.write('from essm.variables._core import BaseVariable, Variable\\n')\n", + " file1.write('from essm.equations import Equation\\n')\n", + " file1.write('from sympy import (Abs, Derivative, Eq, exp,\\n')\n", + " file1.write(' Integral, log, Piecewise, sqrt)\\n')\n", + " # Create import strings for all units\n", + " StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m)\n", + " s = set()\n", + " for unit in Variable.__units__.values():\n", + " for item in extract_units(unit):\n", + " s.add(item)\n", + " for unit in s:\n", + " commandstr = 'from sympy.physics.units import ' + str(unit)\n", + " file1.write(commandstr.replace(\"\\n\", \" \") + \"\\n\")\n", + " \n", + " for variable in Variable.__registry__.keys():\n", + " symbol = variable.definition.latex_name\n", + " name = variable.name\n", + " doc = variable.__doc__\n", + " unit = variable.definition.unit\n", + " assumptions = variable.definition.assumptions\n", + " latex_name = variable.definition.latex_name\n", + " expression = Variable.__expressions__.get(variable, None)\n", + " default = str(Variable.__defaults__.get(variable, None))\n", + " \n", + " commandstr = \"{0} = type('{0}', (Variable,),\".format(name)\n", + " file1.write(commandstr + \"\\n\")\n", + " commandstr = ''' {{'__doc__': \"\"\"{0}\"\"\",\\\\'''.format(doc.replace('\\n', ' ').replace('\\r', ''))\n", + " \n", + " l = len(commandstr)\n", + " commandstr1 = commandstr\n", + " while l > 80:\n", + " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", + " commandstr1 = ' ' + commandstr1[80:]\n", + " l = len(commandstr1)\n", + " file1.write(commandstr1 + \"\\n\")\n", + " commandstr = \" 'unit': {0},\\\\\".format(unit)\n", + " file1.write(commandstr + \"\\n\")\n", + " commandstr = \" 'assumptions': {0},\\\\\".format(assumptions)\n", + " file1.write(commandstr + \"\\n\")\n", + " commandstr = ''' 'latex_name': r\"{0}\",\\\\'''.format(latex_name)\n", + " file1.write(commandstr + \"\\n\")\n", + " commandstr = ''' 'default': {0}, 'expr': {1}}})'''.format(default, expression)\n", + " file1.write(commandstr + \"\\n\")\n", + " \n", + " for eq in Equation.__registry__.keys():\n", + " name = eq.definition.name\n", + " doc = eq.__doc__\n", + " equ = eq\n", + " commandstr = '''{0} = type('{0}', (Equation,),'''.format(name)\n", + " file1.write(commandstr + \"\\n\")\n", + " commandstr = ''' {{'__doc__': \"\"\"{0}\"\"\", \\\\'''.format(doc.replace('\\n', ' ').replace('\\r', ''))\n", + " l = len(commandstr)\n", + " commandstr1 = commandstr\n", + " while l > 80:\n", + " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", + " commandstr1 = ' ' + commandstr1[80:]\n", + " l = len(commandstr1)\n", + " file1.write(commandstr1 + \"\\n\")\n", + " commandstr = \" 'expr': {0}}})\".format(equ)\n", + " l = len(commandstr)\n", + " commandstr1 = commandstr\n", + " while l > 80:\n", + " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", + " commandstr1 = ' ' + commandstr1[80:]\n", + " l = len(commandstr1)\n", + " file1.write(commandstr1 + \"\\n\")\n", + " \n", + "StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter)" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "with open('test_definitions.py', 'wt') as file1:\n", + " file1.write('from essm.variables._core import BaseVariable, Variable\\n')\n", + " file1.write('from essm.equations import Equation\\n')\n", + " file1.write('from sympy import (Abs, Derivative, Eq, exp,\\n')\n", + " file1.write(' Integral, log, Piecewise, sqrt)')\n", + " # Create import strings for all units\n", + " StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m)\n", + " s = set()\n", + " for unit in Variable.__units__.values():\n", + " for item in extract_units(unit):\n", + " s.add(item)\n", + " for unit in s:\n", + " commandstr = 'from sympy.physics.units import ' + str(unit)\n", + " file1.write(\"\\n\" + commandstr.replace(\"\\n\", \" \"))\n", + " \n", + " for variable in Variable.__registry__.keys():\n", + " symbol = variable.definition.latex_name\n", + " name = variable.name\n", + " doc = variable.__doc__\n", + " unit = variable.definition.unit\n", + " assumptions = variable.definition.assumptions\n", + " latex_name = variable.definition.latex_name\n", + " expression = Variable.__expressions__.get(variable, None)\n", + " default = str(Variable.__defaults__.get(variable, None))\n", + " \n", + " file1.write(\"\\n\\n\\n\")\n", + " # Variable class line\n", + " str_line = '''class {0}(Variable):\\n'''.format(name)\n", + " file1.write(str_line)\n", + " \n", + " # doc line\n", + " str_list = doc.replace('\\n', ' ').replace('\\r', '').split( )\n", + " str_line = ' \"\"\"'\n", + " for item in str_list: \n", + " if len(str_line) + len(item) < 77:\n", + " str_line = str_line + ' ' + item\n", + " else:\n", + " file1.write(str_line + \"\\n\")\n", + " str_line = ' ' + item\n", + " file1.write(str_line + \"\\n\")\n", + " str_line = ' \"\"\"'\n", + " file1.write(str_line + \"\\n\\n\")\n", + " \n", + " # name line\n", + " str_line = \" name = '{0}'\".format(name)\n", + " file1.write(str_line + \"\\n\")\n", + " \n", + " # unit line\n", + " str_line = ' unit = {0}'.format(unit)\n", + " file1.write(str_line + \"\\n\")\n", + " \n", + " # assumptions line\n", + " str_list = str(assumptions).split(',')\n", + " str_line = ' assumptions = {0}'.format(str_list[0])\n", + " for item in str_list[1:]: \n", + " if len(str_line) + len(item) < 77:\n", + " str_line = str_line + ', ' + item\n", + " else:\n", + " file1.write(str_line + \"\\n\")\n", + " str_line = ' ' + item\n", + " file1.write(str_line + \"\\n\") \n", + " \n", + " # latex_name\n", + " str_line = \" latex_name = r'{0}'\".format(latex_name)\n", + " file1.write(str_line)\n", + " \n", + " def write_equation(eq, file1):\n", + " \"\"\"Writes equation definition to file.\"\"\"\n", + " parents = tuple(get_parents(eq))\n", + " name = eq.definition.name\n", + " doc = eq.__doc__\n", + " equ = eq\n", + " \n", + " # Equation class line\n", + " if parents == ():\n", + " str_parents = '(Equation'\n", + " else:\n", + " str_parents = '({0}'.format(parents[0] + '.definition')\n", + " if len(parents) > 1:\n", + " for item in parents[1:]: \n", + " str_parents = str_parents + ', ' + item + '.definition'\n", + " str_parents = str_parents + '):'\n", + " str_list = str_parents.split(', ')\n", + " str_line = '''class {0}{1}'''.format(name, str_list[0])\n", + " if len(str_list) > 1:\n", + " for item in str_list[1:]: \n", + " if len(str_line) + len(item) < 77:\n", + " str_line = str_line + ', ' + item\n", + " else:\n", + " file1.write(str_line + \", # nopep8\\n\")\n", + " str_line = ' ' + item \n", + " file1.write(str_line + '\\n')\n", + " \n", + " # doc line\n", + " str_list = doc.replace('\\n', ' ').replace('\\r', '').split( )\n", + " str_line = ' \"\"\"'\n", + " for item in str_list: \n", + " if len(str_line) + len(item) < 79:\n", + " str_line = str_line + ' ' + item\n", + " else:\n", + " file1.write(str_line + \"\\n\")\n", + " str_line = ' ' + item\n", + " file1.write(str_line + \"\\n\")\n", + " str_line = ' \"\"\"'\n", + " file1.write(str_line + \"\\n\\n\")\n", + " \n", + " # expr line\n", + " str_list = re.split('(\\*\\*|\\*|/)', str(equ))\n", + " str_line = ' expr ='\n", + " for item in str_list: \n", + " str_line = str_line + ' ' + item\n", + " if len(str_line) > 50:\n", + " if str_line[-1] in ['+', '-', '*', '/']: \n", + " file1.write(str_line + \" # nopep8\\n\")\n", + " str_line = ' '\n", + " file1.write(str_line) \n", + " \n", + " eqs_with_deps = [] \n", + " \n", + " for eq in Equation.__registry__.keys():\n", + " parents = tuple(get_parents(eq))\n", + " if parents == ():\n", + " file1.write(\"\\n\\n\\n\")\n", + " write_equation(eq, file1)\n", + " else:\n", + " eqs_with_deps.append(eq) # Equations with dependencies must be at the end\n", + " \n", + " for eq in eqs_with_deps:\n", + " file1.write(\"\\n\\n\\n\")\n", + " write_equation(eq, file1)\n", + " file1.write(\"\\n\") \n", + " \n", + "StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [], "source": [ "from test_definitions import *" ] @@ -1847,36 +2051,9 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "eq_Le: Eq(Le, alpha_a/D_va)\n", - "eq_Cwa: Eq(C_wa, P_wa/(R_mol*T_a))\n", - "eq_Nu_forced_all: Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000)\n", - "eq_Dva: Eq(D_va, T_a*p_Dva1 - p_Dva2)\n", - "eq_alphaa: Eq(alpha_a, T_a*p_alpha1 - p_alpha2)\n", - "eq_ka: Eq(k_a, T_a*p_ka1 + p_ka2)\n", - "eq_nua: Eq(nu_a, T_a*p_nua1 - p_nua2)\n", - "eq_rhoa_Pwa_Ta: Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a))\n", - "eq_Pa: Eq(P_a, P_N2 + P_O2 + P_wa)\n", - "eq_PN2_PO2: Eq(P_N2, P_O2*x_N2/x_O2)\n", - "eq_PO2: Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2))\n", - "eq_PN2: Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2))\n", - "eq_rhoa: Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2))\n", - "eq_ideal_gas_law: Eq(P_g*V_g, R_mol*T_g*n_g)\n", - "eq_Pg: Eq(P_g, R_mol*T_g*n_g/V_g)\n", - "eq_Pwa_nw: Eq(P_wa, R_mol*T_g*n_w/V_g)\n", - "eq_Pwa_CC: Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol))\n", - "eq1: Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True)))\n", - "eq_Pwa_Delta: Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2)))\n", - "eq_Nu_forced_all: Eq(Nu, -Pr**0.333333333333333*(-37*Re**0.8 - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**0.8)/1000)\n" - ] - } - ], + "outputs": [], "source": [ "for eq in Equation.__registry__.keys():\n", " print(eq.definition.name + ': ' + str(eq))" @@ -1892,7 +2069,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1910,40 +2087,9 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "c_pa: 1010.0 J/(K*kg)\n", - "c_pamol: 29.19 J/(K*mol)\n", - "c_pv: 1864 J/(K*kg)\n", - "g: 9.81 m/s**2\n", - "lambda_E: 2450000.0 J/kg\n", - "M_air: 0.02897 kg/mol\n", - "M_N2: 0.028 kg/mol\n", - "M_O2: 0.032 kg/mol\n", - "M_w: 0.018 kg/mol\n", - "R_mol: 8.314472 J/(K*mol)\n", - "sigm: 5.67e-08 J/(K**4*m**2*s)\n", - "T0: 273.15 K\n", - "x_N2: 0.79 \n", - "x_O2: 0.21 \n", - "p_Dva1: 1.49e-07 m**2/(K*s)\n", - "p_Dva2: 1.96e-05 m**2/s\n", - "p_alpha1: 1.32e-07 m**2/(K*s)\n", - "p_alpha2: 1.73e-05 m**2/s\n", - "p_ka1: 6.84e-05 J/(K**2*m*s)\n", - "p_ka2: 0.00563 J/(K*m*s)\n", - "p_nua1: 9e-08 m**2/(K*s)\n", - "p_nua2: 1.13e-05 m**2/s\n", - "p_CC1: 611.0 Pa\n", - "p_CC2: 273.0 K\n" - ] - } - ], + "outputs": [], "source": [ "vdict = Variable.__defaults__.copy()\n", "print_dict(vdict)" @@ -1958,26 +2104,9 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJwAAAAuBAMAAAAvlG0AAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmElEQVRIDe1WPYgTQRT+ks0lm2x2k9hcY5FKwSYRrhPJemhhdRGtBM01opUXC9Er5AYtFYJVFA5NYSleOAjc2bgKovgDV4mFkoggWMgdyaHxCMS3kz0vm012Jyt2ebDzZr73vS8zLzPwAE+L/Ty41Lz2sOpJFCMoVYTziG+IsT1ZEWDFgJr1JIoRfgB1HQEmxvZkNYAlBsmTJ064YFGl1Sep6860I4e+TDMnPAqJdayIEjmDVWjpAWL1qq6klRevB+BRS3XbijyKFlHX3uXtxJhehrr1FIt2eOQq0rZCLKHjGZO4nHyfWwOQsQ2lfRablZEKtgBdO8tyDAfQk9uFyEttBOdPY0XwLtG1A+5MPwBqkDtOOSWPElHmGNEEjK4d5PMaHXkZ6iWnXNTABwacEpAyKRnixg2NjtzEt4ZTLpHWLgOKYXI9TVnslpMI64EipFbqDZXqbymt3Nzh/RXgU2+1r5tFqHCRWbERrlQJfmRUJDKHXI2jValhemTSQJSZMxcLVzaPgopEFhrc3bKJfj8+y0wvze7Qwc2Zm0lXjr1HSSdK7OWvpI0p81u+0O1yVLlFb2jGRhixCBXuDouc+N0vH0cBWBvG84XFUd+A4St1WNIMEnlUgZNNGixb5++Rl3gXEvVrUFpSFlDnRTNceQZiTfOPjaSH07pjGCnQETOPyYeTw+XGQyUdyL2lnBIdGLdTXLRXu/J4SpytMGCqRdM5+uR7cpGjvocpylS3aFinL3Ljs28hnnhz4Rx5c0t0Lb6Gs/+m1pdNL6+YqID1QXzqr0fRdhAoBnVn7fz1KLXOq0JWfp4a3BwmPYqtJJMexVYO22LSo/SV43/2KH0/4zIV71FcRPZCwj3KXorbTLhHcROxx7x7lD8fURZXwH0iVgAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$$N_{Le} = \\frac{T_a p_1 - p_2}{T_a p_1 - p_2}$$" - ], - "text/plain": [ - " Tₐ⋅pₐₗₚₕₐ₁ - pₐₗₚₕₐ₂\n", - "Le = ────────────────────\n", - " Tₐ⋅p_Dva1 - p_Dva2 " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from essm.variables.utils import subs_eq\n", "subs_eq(eq_Le, [eq_alphaa, eq_Dva])" @@ -1992,24 +2121,9 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOwAAAARBAMAAAAs8V3gAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtUlEQVQ4Eb1VXWhURxT+9vfevfuXlKJghW6tpT4Ucx/6UhBy6YM/2Hb3rbRSdlFsUrG6D22hTTRTxYooZN9WQdt9aR9aC5uCqKzFtQoRspIVSmuVkAUfFRJsajapevuduZrcmO2jHphv58x8Z745Z+bOAnjBtRHO9yn8j43casmM2X3B9gGQqsvwXbaRl1owG2ta4gOxG6krXg8/1dYCx2pfiavpAsd+W6+nezLkKt3tADHH/FCGE8BnPgAiRRl+HzhiJ0o4jPjfQLgfiLpulRMbFaw6sk3zU/yg6Gs6wSziok0/9PY8EGens/0BnJeZd7m+D4AVIhvoA95AMIOrwMc4fLbNDM6uYm0GhhQCM0jnjAKMOpmaTkgoRAv04wcfAG+y09leB7KKU78Ah3wA6y+R/bmMEHcN7ASGKkhS1hAXmFQI7UC6lC4hPg2PLjHRHAyJSCAPnNPUTjAL9Dqc6F2HX32AeExkq2UEC/zFdwpDradkOZxtDmcQoIymC8TaMB5xJoHJJursdDSTpejt4pTh3nJ8gJsim6yUkf525LIOzStPdmJ1iz6zZa23IcpseeqaroHHzJqwvukcqsCWe4THdv6E2El61r/AlMji4pzygdklsl+jjOFTiDicD5EpRQ4qizJa1jpzVSocewhN92KYhgid425CNkMKdJaZxWynhBa+nN/hgzhEtiqy00jwAuurKrK019h0tlhh4xVsneGVJd2L0bcfrK91Ty6ykSEss4Ui/4nAfbUI78k64RZlWaukpNdgeyw7XnkiG+1H+PqdR9B0DTzVOplS357T/I12ibfMeKWyDkeZ0JSzAJurInsUlI2UkHzIT6lOksh+yaOwtaxVQXCGo0bbFLoGuqvZEHJY7DF2hsnF0W4t7p1tmQNY423cnGb4jQX4fbAxvrtrU6Nx/xI/TMn2HVBFZD8BxpUOSrc92VgxLPQXdQzCdfzIm01KRIqUZTOP8xFZak+ei128LJVFYHU0sw+pNhIFpKoIeLJ14AMuwbONZnhpk/2YqtDXdIE7wCpKcijJLPRbZOybYG+JRRxzD4ZLeEvhug+4TkZ424EBfOPg+9qFz1lpZnsaSe4OLyskm/xuA8fNU0LUdIK1rTaaw4G9H3FMNs7P5XbUFsYSM0dWtuSWpgb5V7AIiPfMNvl2ufsQH9vP58J1/0Hii7lrsMYGFTC692QTGxqvArWGLKrpAjHXdXM+BR5+MV0BQ56npeYRKAadZWf7jPdw5sFo3jYvdT9jGW/5/wAdKVDfo2JeQAAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$$N_{Le} = 0.888446215139442$$" - ], - "text/plain": [ - "Le = 0.888446215139442" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "vdict[T_a] = 300.\n", "subs_eq(eq_Le, [eq_alphaa, eq_Dva], vdict)" @@ -2025,17 +2139,9 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.\n" - ] - } - ], + "outputs": [], "source": [ "#import theano\n", "from sympy.printing.theanocode import theano_function\n", @@ -2051,7 +2157,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2066,18 +2172,9 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 20.6 s, sys: 335 ms, total: 20.9 s\n", - "Wall time: 26.4 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# looping\n", @@ -2089,18 +2186,9 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 88 ms, sys: 41.3 ms, total: 129 ms\n", - "Wall time: 1.82 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# Using theano\n", @@ -2110,20 +2198,9 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "list(resvals0) == list(resvals1)" ] @@ -2145,7 +2222,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2154,24 +2231,9 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIwAAAAPBAMAAADEyjp7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXYyEM1Embsi72bdVKu+2mc6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACeklEQVQ4Ea2TvWtTURjGfze5TfPZJO3QDiK1i1AR08mxqSBCKSaguBTbbIIgRlGvdDE4aBGkt5P4Ac1QqtQPguggDuogTtaIg5tecRA/oK2mhVpjfN9z0v/AOzw553nO+Z2vN0D3jhwHsl/B2dUDrjedk+ZAD7FsXx39jD+bvartvdqXEMLlLVEA+0udRfcuN/IcZcznIM467hHOco3UpozE+LEyH2vSXpKFNIRk0BYFwGWila4qXeVEFafIGVgkWmaaPXX+yEiMH2qSfg6hB9gQBgPJVBRAZEN66SLOSjQg1eAeLPsnfTGPl1iTH4wfWdBB3JwAExJ7HGDEAIhWZWShQmgjHRBpMplnOXdFPPnsoayPOVRGMDZ0OgK5JREDIH2o+xxx2c16oUzkp85+k18b2lmSxlhGu23ffSHn8wVjwyeKUTEACuMk684KHZtzGcKKiay6azVew+yrvHSxfmyb3No+JrCh2y8EIwZAYYXOeS7ytjlXJrwq05KB24IpQYQWDKbtD5bIKMaEDoIxYgFy/4l1Ug+Hfm0dykNf6FlJEIvC2joU8flUTjA2fKcYIxaQLJLQ8uhqyFWmmrKFMrwUTO06zNQlMX7MJ9ocQTEaPsoIxlXBAqRkZDeIIa+faMB7Yv433U0rbzHGTzcE88Hzfp9GwxNfvAu3d6v0W0C4QWc1Mc+wb8svnCHkD+eZ4o6+mSxg/HiFpKyBlJ8JIR5IV8QA4BOj9dBhdxx5nNEct7K9P+jKuPd5qnXjSgWqn6jZP4OwTSiEimJEFCAldOozZL0SjAxIa7LVkgvu3Z4j4p0Xc6ntH/MuybS+1ncb4sz8rbVFAf/n+wfURvBtNAe4UwAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$$690263.0346446$$" - ], - "text/plain": [ - "690263.034644600" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "vdict = Variable.__defaults__.copy()\n", "vdict[Pr] = 0.71\n", @@ -2190,7 +2252,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2202,18 +2264,9 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.99 s, sys: 37.9 ms, total: 4.02 s\n", - "Wall time: 4.49 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2235,7 +2288,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2251,18 +2304,9 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 14.1 ms, sys: 3.78 ms, total: 17.9 ms\n", - "Wall time: 30.4 ms\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2271,24 +2315,9 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAN8AAAAVBAMAAAA0pCbNAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzWYQMplU74mrdiK7RN1/7zyFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADVElEQVRIDeVUTUhUURg9zhvH+U+yFi7CwRa267oyXeRsglppxZRF5SOIaKVhFNHfBBkpghaFrpoJEqwWPoIgCMJNRCQ1uzZRtiiIFjVGpaRN5/vue2qLtrbog/vmO9+53znv3nfvAKsV4SlAxmpFODcDGasXKZrJWLX4fwyrNob3yLYmrgy5sCB69xKcrgHPh20TB/19d3LTWUBpzTA4QYxtHFIMpAiDGNyUDdJgS2sqlbzUHiAyCwXOBuxESybRZyE6EXOBowZoRXQRSmuG5lJ1LVs/whYDKZEDIn1Alet8wutphtEDI6ZVA/eUn3Txy4JkJ6YxCtywMJKBU+uMFWi4GzgFpTXDEySngPhp2GIgpXqtA1+BJuCiIj6CFcb8wqsSylDw1mOpDAxbGJ2CMwNspuF5oOAprVnqp/berwe0GEhZxRANnwE97NOIzHDVHMuzuKUKnpJ3FoBJT2FqwUQz1rDBoJAVGpoleyVFnoZaXJaSshjO81VcATwjh+aLMhBrHM9qBVvzFpS3j5dwnCssWa4we5kTZIWMz0ZpzdasG+RxCnk01OKylMykofONhkUBKyJpEosKH743EOCUM/jA/URDxnLRSh0nWMPUnKX5SebQvhZpF22ohy0uSakeDRNzQEdR0R+PFxbFz8nvC6cC7DXJYmTYFQgcefOjFBimRywNpEfQ/gXVfciLofbY6fweTHSFCa6wI6/oj0e3Z+Ep2bVu7xfVSzh8ezirMDSCyb7AMAeeZaHBbM0MQouRLA2DIrvZ017Lx1+39Kp8LPKPgJeugndUzLBSMAprDMLffcN4J2BpydK1CM1ugRhqMZDi4hn+oelxBayI41yUIa4YGirgFZQlUEdhO9NrvuERJDxLSxbr5QqP5XI/9su13VwKpKy6GE77fbZin3xTvh5wVk6ggg6DvWgy4Z/8jyFX4wHPbWM4j7intGbhr6juZetpfinp0enENsSwacXFD+oPEDoju94of20KYnnnJG6Z5oyFqTqEiryVBnh8pf8mlNYMY2hxqcN31aJ2B7qI0zDtOieWCn6S6Lph5MilcgdKUID+gSyi/bxiFu7oYrrvwvoMGioVHhmhbRbtuk6VoQp3XIp2uq9bPVreBWfwTtbH/+znNwpLNV/ZnEjUAAAAAElFTkSuQmCC\n", - "text/latex": [ - "$$5.35695812626465 \\cdot 10^{-11}$$" - ], - "text/plain": [ - "5.35695812626465e-11" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "np.mean(abs((resvals - resvals1)/resvals))" ] @@ -2303,7 +2332,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2316,18 +2345,9 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.23 s, sys: 30.4 ms, total: 3.26 s\n", - "Wall time: 4.15 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2343,17 +2363,9 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "outputs": [], "source": [ "# Solving for a range of Nu values\n", "imax = len(Nuvals)\n", @@ -2378,18 +2390,9 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 120 ms, sys: 4.12 ms, total: 124 ms\n", - "Wall time: 164 ms\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2407,24 +2410,9 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAAPBAMAAAAL5A64AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMt2rmYlmIkR2uxDNVO+L8+I6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADaklEQVQ4Eb2UTWhcVRTHf/P15uNlPih0HTfuKh0lxY1tBpxqodo8TUaIGwfESqmQR9FtO4i7Cs0iKtnUobjQivpo4y52piBFUOkI6tIEkbYw1aYVa8okPs8597UMpG49MOe9e89/fv/7zr3vsWuq1QpIwm+er2GJ3PILkHtf0lutz6Q8/55Uluc6TBxPPZ9o7F8rrSfBKFaBVCOh7bwYbyGO47rWykO4SG7TJf8bnoPvuRDmG6y1We1k+2RhP5U4DpwGfonwr3EywihWgbThdtiJ1ng8CxmtXpwdwWH4w6VSg/N46+T6xW2qj/ARpS4/wyoTsx8kQn/fdERmnUzDUawCZx/maFrjEYB0TsITx19hOrR0JpSpUp3yqHCDar/wt0pehgtufaaBhUhq5DYcxVZO/o2HOZrWeMIpLCrNHK9GTNcsfa5T1TqFbbmutUvrOj7zKS85R9MYpdelqMsRinPMTfyn431eSWHOUS57I0tbu5c69BoU7oH/KNXL84ek/fFrAzJHl2qqV+FCREWecVOGQnGV19XRn18KVTQWok14smwL7aos9S9L/labxzgVkLpH/sXD9K6QHsArWxGlKK8OJhSKtHTiroyFYhV/UR3fDvOBTI6HaB0Pf8PNO0c7aOm6H8OR6FSDlK7gbKe3QXZI+dDeGyo+Jz8TCoVP+Ek6n1DOkUMc/d9ZqalyLNTR8Yp9N+0cmzqQdEda1rnfhcpQTqu3yasU/xEPZkLTWFcpH9t9GxLKTPiDOmauLR9X0Op3Gpf1Vncg4aW7NmEnh2JDBpr2iKQtO13ezoeUttN9vLsMYXLwlDS344RKkcjIfihFK6cDdZQ/7gjRGs8OpFXtGX9EDDQd0GeUV9AbVUfiKG+dt6mdy7RvyjNGpnHPiFqYh1a+mmrO/LZYDXYY6uqMJ6tuuKo6pgKKoaXJiCPuC1Dpkh6lRmTXuS6nIxT5Hic0R2/IZOgoVoFKnbQ4LjrsgyyO7gvAmlR7femlOJ5ozT3hUiaQ3ZfjeqnmtfUrt49LA96NOMabeNedBj6MKH7rXxGqUqwijl3d1ZXwgZe7Ea3x4OTADl72wNYzXI3jOy4xN1uDL5cfh3eaH8s3/aDcpabmOuQPTkWJ5ulbX7dpNTuCVIpVyH3xZ5ulo22ZHA/TGm989n+5/xc1gERnYT01lAAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$$7.122603685219754e-10$$" - ], - "text/plain": [ - "7.122603685219754e-10" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "np.mean(abs((resvals1 - resvals2)/resvals1))" ] @@ -2446,7 +2434,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2455,7 +2443,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2467,32 +2455,9 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 12 µs, sys: 1 µs, total: 13 µs\n", - "Wall time: 19.6 µs\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", - "text/latex": [ - "$$-1.0$$" - ], - "text/plain": [ - "-1.0" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%%time\n", "autowrap_func(1, 4, 2)" @@ -2500,32 +2465,9 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 146 ms, sys: 14.3 ms, total: 161 ms\n", - "Wall time: 333 ms\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAPBAMAAAAMihLoAAAAJFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAEM0yVO+riWZ2mSMU5s8AAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAsSURBVAgdY2DAClgCEcJiZRsRHAYOMjlCSiCgzECWAZxIlnKlblqB5B4GBgDVtwt2YFScIgAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$$-1$$" - ], - "text/plain": [ - "-1" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%%time\n", "expr.subs({x:1, y:4, z:2})" @@ -2547,7 +2489,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2557,32 +2499,9 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5.36 ms, sys: 0 ns, total: 5.36 ms\n", - "Wall time: 6.78 ms\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", - "text/latex": [ - "$$-1.0$$" - ], - "text/plain": [ - "-1.0" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%%time\n", "f(x,y,z).evalf(2, subs={x:1, y:4, z:2})" @@ -2628,7 +2547,7 @@ "height": "calc(100% - 180px)", "left": "10px", "top": "150px", - "width": "253.991px" + "width": "253.977px" }, "toc_section_display": "block", "toc_window_display": true diff --git a/docs/examples/api_features.rst b/docs/examples/api_features.rst deleted file mode 100644 index 0adbcae..0000000 --- a/docs/examples/api_features.rst +++ /dev/null @@ -1,1757 +0,0 @@ - -Environmental Science for Symbolic Math -======================================== - -(Stan Schymanski and Jiri Kuncar) - -This notebook gives examples and common use cases for ESSM. The ESSM -package documentation can be obtained from here: -https://essm.readthedocs.io/en/latest/ - -The code is openly available here: -https://github.com/environmentalscience/essm - -Installation -============ - -See the documentation for different installation option, but the easiest -is: - -:: - - pip install essm - -General Jupyter setup -===================== - -We will first setup the IPython notebook to nicely render the results: - -.. code:: ipython3 - - import sys - before = [str(m) for m in sys.modules] # This is to track what modules have been imported in this notebook - -.. code:: ipython3 - - from IPython.display import display - from sympy import init_printing - init_printing() - from sympy.printing import StrPrinter - StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter) - -.. code:: ipython3 - - import scipy as sc - -Importing variables and equations -================================= - -.. code:: ipython3 - - # Import various functions from sympy - from sympy import Derivative, Eq, exp, log, solve, Symbol - -.. code:: ipython3 - - from essm.variables import Variable - from essm.variables.utils import generate_metadata_table - -.. code:: ipython3 - - import essm.variables.chamber.insulation as insulation_vars - import essm.equations.chamber.insulation as insulation_eqs - -.. code:: ipython3 - - vars = ['insulation_vars.' + name for name in insulation_vars.__all__] - generate_metadata_table([eval(name) for name in vars]) - - - - -.. raw:: html - -
SymbolNameDescriptionDefinitionDefault valueUnits
$A_i$A_iConducting area of insulation material.$$-m$^{2}$
$c_{pi}$c_piHeat capacity of insulation material.$$-J K$^{-1}$ kg$^{-1}$
$dT_i$dT_iTemperature increment of insulation material.$$-K
$L_i$L_iThickness of insulation material.$$-m
$lambda_i$lambda_iHeat conductivity of insulation material.$$-J K$^{-1}$ m$^{-1}$ s$^{-1}$
$Q_i$Q_iHeat conduction through insulation material.$$-J s$^{-1}$
$rho_i$rho_iDensity of insulation material.$$-kg m$^{-3}$
- - - -.. code:: ipython3 - - eqs = ['insulation_eqs.' + name for name in insulation_eqs.__all__] - #generate_metadata_table([eval(name) for name in eqs]) - -.. code:: ipython3 - - from essm.variables.chamber import * - from essm.variables.leaf import * - from essm.variables.physics.thermodynamics import * - from essm.equations.chamber import * - from essm.equations.leaf import * - from essm.equations.physics.thermodynamics import * - -Plotting -======== - -.. code:: ipython3 - - import matplotlib.pyplot as plt - from sympy import latex - from sympy import N - from numpy import arange - from essm.variables.units import derive_unit, SI, Quantity - from essm.variables.utils import markdown - - def plot_expr2(xvar_min_max, yldata, yllabel=None, yrdata=None, - yrlabel='', clf=True, npoints=100, ylmin=None, ylmax=None, - yrmin=None, yrmax=None, xlabel=None, - colors=None, - loc_legend_left='best', loc_legend_right='right', - linestylesl=['-', '--', '-.', ':'], - linestylesr=['-', '--', '-.', ':'], - fontsize=None, fontsize_ticks=None, fontsize_labels=None, - fontsize_legend=None, - fig1=None, **args): - ''' - Plot expressions as function of xvar from xmin to xmax. - - **Examples:** - - from essm.variables import Variable - from essm.variables.physics.thermodynamics import T_a - from essm.equations.physics.thermodynamics import eq_nua, eq_ka - vdict = Variable.__defaults__.copy() - expr = eq_nua.subs(vdict) - exprr = eq_ka.subs(vdict) - xvar = T_a - yldata = [(expr.rhs, 'full'), (expr.rhs/2, 'half')] - yrdata = exprr - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata) - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), - yrdata=[(1/exprr.lhs, 1/exprr.rhs)], - loc_legend_right='lower right') - plot_expr2((T_a, 273, 373), expr) - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) - ''' - (xvar, xmin, xmax) = xvar_min_max - if not colors: - if yrdata is not None: - colors = ['black', 'blue', 'red', 'green'] - else: - colors = ['blue', 'black', 'red', 'green'] - if fontsize: - fontsize_labels = fontsize - fontsize_legend = fontsize - fontsize_ticks = fontsize - if not fig1: - plt.close - plt.clf - fig = plt.figure(**args) - else: - fig = fig1 - if hasattr(xvar, 'definition'): - unit1 = derive_unit(xvar) - if unit1 != 1: - strunit = ' (' + markdown(unit1) + ')' - else: - strunit = '' - if not xlabel: - xlabel = '$'+latex(xvar)+'$'+ strunit - else: - if not xlabel: - xlabel = xvar - if hasattr(yldata, 'lhs'): - yldata = (yldata.rhs, yldata.lhs) - if not yllabel: - if type(yldata) is tuple: - yllabel = yldata[1] - else: - try: - yllabel = yldata[0][1] - except Exception as e1: - print(e1) - print('yldata must be equation or list of (expr, name) tuples') - - if type(yllabel) is not str: - unit1 = derive_unit(yllabel) - if unit1 != 1: - strunit = ' (' + markdown(unit1) + ')' - else: - strunit = '' - - yllabel = '$'+latex(yllabel)+'$'+ strunit - if type (yldata) is not list and type(yldata) is not tuple: - # If only an expression given - yldata = [(yldata, '')] - if type(yldata[0]) is not tuple: - yldata = [yldata] - if yrdata is not None: - if yrlabel == '': - if hasattr(yrdata, 'lhs'): - yrlabel = yrdata.lhs - if type (yrdata) is not list and type(yrdata) is not tuple: - # If only an expression given - yrdata = [yrdata] - if type(yrlabel) is not str: - yrlabel = '$'+latex(yrlabel)+'$'+ ' (' + markdown(derive_unit(yrlabel)) + ')' - - xstep = (xmax - xmin)/npoints - xvals = arange(xmin, xmax, xstep) - - ax1 = fig.add_subplot(1, 1, 1) - if yrdata is not None: - color = colors[0] - else: - color = 'black' - if ylmin: ax1.set_ylim(ymin=float(ylmin)) - if ylmax: ax1.set_ylim(ymax=float(ylmax)) - ax1.set_xlabel(xlabel) - ax1.set_ylabel(yllabel, color=color) - ax1.tick_params(axis='y', labelcolor=color) - i = 0 - for (expr1, y1var) in yldata: - linestyle = linestylesl[i] - if yrdata is None: - color = colors[i] - i= i + 1 - try: - y1vals = [expr1.subs(xvar, dummy).n() for dummy in xvals] - ax1.plot(xvals, y1vals, color=color, linestyle=linestyle, label=y1var) - except Exception as e1: - print([expr1.subs(xvar, dummy) for dummy in xvals]) - print(e1) - if i > 1 or yrdata is not None: - plt.legend(loc=loc_legend_left, fontsize=fontsize_legend) - - if yrdata is not None: - ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis - color = colors[1] - ax2.set_ylabel(yrlabel, color=color) - i = 0 - - for item in yrdata: - if type(item) is tuple: # if item is tuple - (expr2, y2var) = item - else: - try: - (y2var, expr2) = (item.lhs, item.rhs) - except Exception as e1: - print(e1) - print('yrdata must be a list of equations or tuples (var, expr)') - return - linestyle = linestylesr[i] - i = i + 1 - try: - y2vals = [expr2.subs(xvar, dummy).n() for dummy in xvals] - ax2.plot(xvals, y2vals, color=color, linestyle=linestyle, label=y2var) - except Exception as e1: - print(expr2) - print([expr2.subs(xvar, dummy).n() for dummy in xvals]) - print(e1) - - if not yrlabel: - if hasattr(yrdata[0], 'lhs'): - yrlabel = yrdata[0].lhs - - if type(yrlabel) is not str: - yrlabel = '$'+latex(yrlabel)+'$'+ ' (' + markdown(derive_unit(yrlabel)) + ')' - ax2.tick_params(axis='y', labelcolor=color) - if yrmin: ax2.set_ylim(ymin=float(yrmin)) - if yrmax: ax2.set_ylim(ymax=float(yrmax)) - leg=ax2.legend(loc=loc_legend_right, fontsize=fontsize_legend) - ax2.add_artist(leg); - for item in ([ax2.xaxis.label, ax2.yaxis.label]): - item.set_fontsize(fontsize_labels) - ax2.tick_params(axis='both', which='major', labelsize=fontsize_ticks) - - for item in ([ax1.xaxis.label, ax1.yaxis.label]): - item.set_fontsize(fontsize_labels) - ax1.tick_params(axis='both', which='major', labelsize=fontsize_ticks) - fig.tight_layout() # otherwise the right y-label is slightly clipped - return fig - - vdict = Variable.__defaults__.copy() - expr = eq_nua.subs(vdict) - exprr = eq_ka.subs(vdict) - xvar = T_a - yldata = [(expr.rhs, 'full'), (expr.rhs/2, 'half')] - yrdata = exprr - - plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, yrmin=-0.0001, fontsize=14) # note that yrmin=0 would have no effect - plot_expr2((T_a, 273, 373), yldata=expr, yrdata=exprr, colors=['red', 'blue'], linestylesr=['--']) - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=yrdata) - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a), yrdata=[(1/exprr.rhs, 1/exprr.lhs)], - loc_legend_right='lower right') - plot_expr2((T_a, 273, 373), expr) - plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) - - - - -.. parsed-literal:: - -
- - - -.. code:: ipython3 - - # Manipulate figure - fig = plot_expr2((T_a, 273, 373), yldata, yllabel = (nu_a)) - %matplotlib inline - fig.set_figwidth(8) - fig - - - - -.. image:: api_features_files/api_features_13_0.png - - - -Creating new variables -====================== - -To create custom variables, first import ``Variable``: - -.. code:: ipython3 - - from essm.variables import Variable - -To define units, you can either import these units from the library, -e.g. - -``from essm.variables.units import joule, kelvin, meter`` - -or import the appropriate units from sympy, e.g. - -``from sympy.physics.units import joule, kelvin, meter`` - -.. code:: ipython3 - - from sympy.physics.units import joule, kelvin, meter, mole, pascal, second - -Then you can define a custom variable with its name, description, -domain, latex_name, unit, and an optional default value, e.g.: - -.. code:: ipython3 - - class R_mol(Variable): - """Molar gas constant.""" - unit = joule/(kelvin*mole) - latex_name = 'R_{mol}' - default = 8.314472 - - -.. parsed-literal:: - - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_mol" will be overridden by "__main__:" - instance[expr] = instance - - -The variables defined above hold information about their docstring, -units, latex representations and default values if any. Each can be -accessed by e.g.: - -.. code:: ipython3 - - print(R_mol.__doc__) - print(R_mol.definition.unit) - print(R_mol.definition.latex_name) - print(R_mol.definition.default) - - -.. parsed-literal:: - - Molar gas constant. - J/(K*mol) - R_{mol} - 8.314472 - - -We will now define a few additional variables. - -.. code:: ipython3 - - class P_g(Variable): - """Pressure of gas.""" - unit = pascal - - class V_g(Variable): - """Volume of gas.""" - unit = meter**3 - - class n_g(Variable): - """Amount of gas.""" - unit = mole - - class n_w(Variable): - """Amount of water.""" - unit = mole - - class T_g(Variable): - """Temperature of gas.""" - unit = kelvin - - class P_wa(Variable): - """Partial pressure of water vapour in air.""" - unit = pascal - latex_name = 'P_{wa}' - - -.. parsed-literal:: - - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_wa" will be overridden by "__main__:" - instance[expr] = instance - - -Variables with expressions as definitions ------------------------------------------ - -.. code:: ipython3 - - class Delta_Pwa(Variable): - """Slope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$""" - expr = Derivative(P_wa,T_g) - latex_name = r'\Delta' - -.. code:: ipython3 - - Delta_Pwa.definition.unit - - - - -.. math:: - - \displaystyle \frac{\text{Pa}}{\text{K}} - - - -.. code:: ipython3 - - Delta_Pwa.definition.expr - - - - -.. math:: - - \displaystyle \frac{d}{d T_g} P_{wa} - - - -.. code:: ipython3 - - generate_metadata_table([Delta_Pwa]) - - - - -.. raw:: html - -
SymbolNameDescriptionDefinitionDefault valueUnits
$\Delta$Delta_PwaSlope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$$\frac{d}{d T_g} P_{wa}$-K$^{-1}$ Pa
- - - -Linking assumptions to variables --------------------------------- - -We can specify if a given variable is a complex, real, integer etc. by -using the ``assumptions`` property during variable definition: - -.. code:: ipython3 - - class x(Variable): - """Positive real variable.""" - assumptions = {'positive': True, 'real': True} - - print(solve(x**2 - 1)) - - -.. parsed-literal:: - - [1] - - -Creating new equations -====================== - -Equations have a left hand side and a right hand side and if they -contain variables with units, the units of each addend must be the same. - -Custom equation ---------------- - -To create custom equations, first import ``Equation``: - -.. code:: ipython3 - - from essm.equations import Equation - -We will now define an equation representing the ideal gas law, based on -the variables defined above: - -.. code:: ipython3 - - class eq_ideal_gas_law(Equation): - """Ideal gas law.""" - - expr = Eq(P_g*V_g, n_g*R_mol*T_g) - -Note that whenever an equation is defined, its units are checked for -consistency in the background and if they are not consistent, an error -message will be printed. To illustrate this, we will try to define the -above equation again, but omit temperature on the right hand side: - -.. code:: ipython3 - - try: - class eq_ideal_gas_law(Equation): - """Ideal gas law.""" - - expr = Eq(P_g*V_g, n_g*R_mol) - except Exception as exc1: - print(exc1) - - -.. parsed-literal:: - - Dimension of "R_mol*n_g" is Dimension(length**2*mass/(temperature*time**2)), but it should be the same as P_g*V_g, i.e. Dimension(length**2*mass/time**2) - - -The equation can be displayed in typesetted form, and the documentation -string can be accessed in a similar way as for Variable: - -.. code:: ipython3 - - display(eq_ideal_gas_law) - print(eq_ideal_gas_law.__doc__) - - - -.. math:: - - \displaystyle P_g V_g = R_{mol} T_g n_g - - -.. parsed-literal:: - - Ideal gas law. - - -New equation based on manipulation of previous equations --------------------------------------------------------- - -We can use the above equation just as any Sympy expression, and -e.g. solve it for pressure: - -.. code:: ipython3 - - soln = solve(eq_ideal_gas_law, P_g, dict=True); print(soln) - - -.. parsed-literal:: - - [{P_g: R_mol*T_g*n_g/V_g}] - - -If we want to define a new equation based on a manipulation of -eq_ideal_gas_law we can specify that the parent of the new equation is -``eq_ideal_gas_law.definition``: - -.. code:: ipython3 - - class eq_Pg(eq_ideal_gas_law.definition): - """Calculate pressure of ideal gas.""" - - expr = Eq(P_g, soln[0][P_g]) - eq_Pg - - - - -.. math:: - - \displaystyle P_g = \frac{R_{mol} T_g n_g}{V_g} - - - -We can also have nested inheritance, if we now define another equation -based on eq_Pg: - -.. code:: ipython3 - - class eq_Pwa_nw(eq_Pg.definition): - """Calculate vapour pressure from amount of water in gas.""" - - expr = Eq(P_wa, eq_Pg.rhs.subs(n_g, n_w)) - eq_Pwa_nw - - - - -.. math:: - - \displaystyle P_{wa} = \frac{R_{mol} T_g n_w}{V_g} - - - -Show inheritance of equations ------------------------------ - -To see the inheritance of the newly created equation: - -.. code:: ipython3 - - eq_Pwa_nw.definition.__bases__ - - - - -.. parsed-literal:: - - (__main__.eq_Pg,) - - - -.. code:: ipython3 - - [parent.name for parent in eq_Pwa_nw.definition.__bases__] - - - - -.. parsed-literal:: - - ['eq_Pg'] - - - -.. code:: ipython3 - - [parent.expr for parent in eq_Pwa_nw.definition.__bases__] - - - - -.. math:: - - \displaystyle \left[ P_g = \frac{R_{mol} T_g n_g}{V_g}\right] - - - -We can also write a function to get all parents recursively: - -.. code:: ipython3 - - def get_parents(equation, allparents=set()): - """Return set of recursive parents of equation.""" - - parents = equation.definition.__bases__ - for parent in parents: - if hasattr(parent, 'name'): - allparents.update([parent.name]) - get_parents(eval(parent.name)) - return allparents - get_parents(eq_Pwa_nw) - - - - -.. parsed-literal:: - - {'eq_Pg', 'eq_ideal_gas_law'} - - - -Computational burden of deriving equations within class definition ------------------------------------------------------------------- - -If we solve for a variable to derive a new equation, is the solve() -command performed every time this equation is used? - -.. code:: ipython3 - - class eq_Pg1(eq_ideal_gas_law.definition): - """Calculate pressure of ideal gas.""" - from sympy import solve - soln = solve(eq_ideal_gas_law, P_g, dict=True); print(soln) - expr = Eq(P_g, soln[0][P_g]) - eq_Pg1 - - -.. parsed-literal:: - - [{P_g: R_mol*T_g*n_g/V_g}] - - -.. parsed-literal:: - - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pg" will be overridden by "__main__:" - instance[expr] = instance - - - - -.. math:: - - \displaystyle P_g = \frac{R_{mol} T_g n_g}{V_g} - - - -.. code:: ipython3 - - %time - eq_Pg.subs({R_mol: 8.314, T_g: 300, n_g: 0.1, V_g: 1}) - - -.. parsed-literal:: - - CPU times: user 2 µs, sys: 1 µs, total: 3 µs - Wall time: 9.3 µs - - - - -.. math:: - - \displaystyle P_g = 249.42 - - - -.. code:: ipython3 - - %time - eq_Pg1.subs({R_mol: 8.314, T_g: 300, n_g: 0.1, V_g: 1}) - - -.. parsed-literal:: - - CPU times: user 2 µs, sys: 1e+03 ns, total: 3 µs - Wall time: 9.54 µs - - - - -.. math:: - - \displaystyle P_g = 249.42 - - - -There is actually no difference! - -Empirical equations with internal variables -------------------------------------------- - -Empirical equations not only contain variables but also numbers. As an -example, we will try to define the Clausius-Clapeyron equation for -saturation vapour pressure in the following example, after defining a -few additional variables used in this equation. - -.. math:: P_{wa} = 611 e^\frac{-M_w \lambda_E (1/T_g - 1/273)}{R_{mol}} - -.. code:: ipython3 - - from sympy.physics.units import joule, kilogram - class lambda_E(Variable): - """Latent heat of evaporation.""" - unit = joule/kilogram - latex_name = '\\lambda_E' - default = 2.45e6 - - class M_w(Variable): - """Molar mass of water.""" - unit = kilogram/mole - default = 0.018 - - -.. parsed-literal:: - - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:lambda_E" will be overridden by "__main__:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_w" will be overridden by "__main__:" - instance[expr] = instance - - -.. code:: ipython3 - - from sympy import exp - try: - class eq_Pwa_CC(Equation): - """Clausius-Clapeyron P_wa as function of T_g. - - \cite[Eq. B3]{hartmann_global_1994} - """ - - expr = Eq(P_wa, 611.*exp(-M_w*lambda_E*(1/T_g - 1/273.)/R_mol)) - except Exception as exc1: - print(exc1) - - -.. parsed-literal:: - - Dimension of "1/T_g" is Dimension(1/temperature), but it should be the same as -0.00366300366300366, i.e. Dimension(1) - - -The unit mismatch reported in the error message stems from the fact that -the numbers in the empirical equation actually need units. Since the -term in the exponent has to be non-dimensional, the units of ``611`` -must be the same as those of ``P_wa``, i.e. pascal. The units of the -subtraction term in the exponent must match, meaning that ``273`` needs -units of kelvin. To avoid the error message, we can define the empirical -numbers as internal variables to the equation we want to define: - -.. code:: ipython3 - - class eq_Pwa_CC(Equation): - """Clausius-Clapeyron P_wa as function of T_g. - - Eq. B3 in :cite{hartmann_global_1994} - """ - - class p_CC1(Variable): - """Internal parameter of eq_Pwl.""" - unit = pascal - latex_name = '611' - default = 611. - - - - class p_CC2(Variable): - """Internal parameter of eq_Pwl.""" - unit = kelvin - latex_name = '273' - default = 273. - - expr = Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(1/T_g - 1/p_CC2)/R_mol)) - -In the above, we defined the latex representation of the empirical -constants as their actual values, so the equation displays in the -familiar way: - -.. code:: ipython3 - - eq_Pwa_CC - - - - -.. math:: - - \displaystyle P_{wa} = 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} - - - -All default values of variables defined along with the variable -definitions are stored in a dictionary that can be accessed as -``Variable.__defaults__``. We can substitute the values from this -dictionary into our empirical equation to plot saturation vapour -pressure as a function of temperature: - -.. code:: ipython3 - - expr = eq_Pwa_CC.subs(Variable.__defaults__) - print(expr) - xvar = T_g - p = plot_expr2((xvar, 273, 373), expr) - - -.. parsed-literal:: - - Eq(P_wa, 167405731976.232*exp(-5304.00487246815/T_g)) - - - -.. image:: api_features_files/api_features_64_1.png - - -Deduction of correct units for internal variables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Sometimes, the correct units of internal variables in an empirical -equation is not clear a priori. - -Piecewise defined equations ---------------------------- - -.. code:: ipython3 - - from sympy import Piecewise - expr = Eq(P_wa, Piecewise((0, T_a < 0), (eq_Pwa_CC.rhs, T_a >= 0))) - expr - - - - -.. math:: - - \displaystyle P_{wa} = \begin{cases} 0 & \text{for}\: T_a < 0 \\611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} & \text{otherwise} \end{cases} - - - -.. code:: ipython3 - - try: - class eq1(Equation): - """Test""" - expr = Eq(P_wa, Piecewise((0, T_a < 0), (eq_Pwa_CC.rhs, T_a >= 0))) - display(eq1) - except Exception as e1: - print(e1) - - - -.. math:: - - \displaystyle P_{wa} = \begin{cases} 0 & \text{for}\: T_a < 0 \\611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} & \text{otherwise} \end{cases} - - -**If the above returns a dimension error, then unit checking for -``Piecewise`` has not been implemented yet.** - -Substituting into integrals and derivatives and evaluating -========================================================== - -Above, we defined ``Delta_Pwa`` as a variable that represents the -partial derivative of ``P_wa`` with respect to ``T_g``: - -:: - - class Delta_Pwa(Variable): - """Slope of saturated vapour pressure, $\partial P_{ws} / \partial T_g""" - expr = P_wa(T_g).diff(T_g) - #unit = pascal/kelvin - latex_name = r'\Delta' - -This definition can be accessed by typing ``Delta_Pwa.definition.expr``. -Example: - -.. code:: ipython3 - - print(Delta_Pwa.definition.expr) - display(Eq(Delta_Pwa, Delta_Pwa.definition.expr)) - - -.. parsed-literal:: - - Derivative(P_wa, T_g) - - - -.. math:: - - \displaystyle \Delta = \frac{d}{d T_g} P_{wa} - - -We also defined the Clausius-Clapeyron approximation to -:math:`P_{wa}(T_g)` as ``eq_Pwa_CC``. - -.. code:: ipython3 - - display(eq_Pwa_CC) - print(eq_Pwa_CC.__doc__) - - - -.. math:: - - \displaystyle P_{wa} = 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}} - - -.. parsed-literal:: - - Clausius-Clapeyron P_wa as function of T_g. - - Eq. B3 in :cite{hartmann_global_1994} - - - -If we want to substitute this approximation into -``Delta_Pwa.definition.expr``, we need to use ``replace`` instead of -``subs`` and evaluate the derivative using ``doit()``: - -.. code:: ipython3 - - expr = Eq(Delta_Pwa, Delta_Pwa.definition.expr.replace(P_wa, eq_Pwa_CC.rhs).doit()) - display(expr) - p = plot_expr2((T_g, 273, 373), expr.subs(Variable.__defaults__)) - - - -.. math:: - - \displaystyle \Delta = \frac{M_w \lambda_E 611 e^{- \frac{M_w \lambda_E \left(- \frac{1}{273} + \frac{1}{T_g}\right)}{R_{mol}}}}{R_{mol} T_g^{2}} - - - -.. image:: api_features_files/api_features_75_1.png - - -If we only had the slope of the curve, we could take the integral to get -the absolute value: - -.. code:: ipython3 - - from sympy import Integral - class T_a1(Variable): - """Air temperature""" - unit = kelvin - latex_name = r'T_{a1}' - - class T_a2(Variable): - """Air temperature""" - unit = kelvin - latex_name = r'T_{a2}' - - class P_wa1(Variable): - """P_wa at T1""" - unit = pascal - latex_name = r'P_{wa1}' - - class eq_Pwa_Delta(Equation): - """P_wa deduced from the integral of Delta""" - expr = Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2))) - display(eq_Pwa_Delta) - - - -.. math:: - - \displaystyle P_{wa} = P_{wa1} + \int\limits_{T_{a1}}^{T_{a2}} \Delta\, dT_g - - -.. code:: ipython3 - - expr_Delta = eq_Pwa_CC.rhs.diff(T_g) - expr = Eq(P_wa, eq_Pwa_Delta.rhs.replace(Delta_Pwa, expr_Delta).doit()) - vdict = Variable.__defaults__.copy() - vdict[T_a1] = 273. - vdict[P_wa1] = eq_Pwa_CC.rhs.subs(T_g, T_a1).subs(vdict) - display(expr.subs(vdict)) - p = plot_expr2((T_a2, 273, 373), expr.subs(vdict)) - - - -.. math:: - - \displaystyle P_{wa} = 167405731976.232 e^{- \frac{5304.00487246815}{T_{a2}}} - - - -.. image:: api_features_files/api_features_78_1.png - - -Unit conversions -================ - -Values for variables are often given in obscure units, but to convert to -our standard units, we can use the dictionary -``SI_EXTENDED_DIMENSIONS``: - -.. code:: ipython3 - - from sympy.physics.units import convert_to, kilo, mega, joule, kilogram, meter, second, inch, hour - from essm.variables.units import SI_EXTENDED_DIMENSIONS, SI_EXTENDED_UNITS - value1 = 0.3 - unit1 = inch/hour - print(value1*unit1) - unit2 = Variable.get_dimensional_expr(unit1).subs(SI_EXTENDED_DIMENSIONS) - print(convert_to(value1*unit1, unit2)) - - -.. parsed-literal:: - - 0.3*inch/hour - 2.11666666666667e-6*m/s - - -Exporting definitions -===================== - -The below example exports all relevant definitions from this jupyter -notebook into a file called ``test_definitions.py``, from which they can -be re-imported into a different notebook just by executing -``from test_definitions import *``, as shown below. - -.. code:: ipython3 - - from sympy import preorder_traversal - def extract_units(expr): - """Traverse through expression and return set of units.""" - return { - arg - for arg in preorder_traversal(expr) if isinstance(arg, Quantity) - } - -.. code:: ipython3 - - with open('test_definitions.py', 'wt') as file1: - file1.write('from essm.variables._core import BaseVariable, Variable\n') - file1.write('from essm.equations import Equation\n') - file1.write('from sympy import Abs, Derivative, Eq, exp, Integral, log, Piecewise, sqrt\n') - # Create import strings for all units - StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m) - s = set() - for unit in Variable.__units__.values(): - for item in extract_units(unit): - s.add(item) - commandstr = 'from sympy.physics.units import ' + str(s)[1:-1] - file1.write(commandstr.replace("\n", " ") + "\n") - - for variable in Variable.__registry__.keys(): - symbol = variable.definition.latex_name - name = variable.name - doc = variable.__doc__ - unit = variable.definition.unit - assumptions = variable.definition.assumptions - latex_name = variable.definition.latex_name - expression = Variable.__expressions__.get(variable, None) - default = str(Variable.__defaults__.get(variable, None)) - commandstr = '''{0} = type('{0}', (Variable,), {{'__doc__': """{1}""", 'unit': {2}, 'assumptions': {3}, \ - 'latex_name': r"{4}", 'default': {5}, 'expr': {6}}})'''.format( - name, doc.replace('\n', ' ').replace('\r', ''), unit, assumptions, latex_name,\ - default, expression) - file1.write(commandstr + "\n") - - for eq in Equation.__registry__.keys(): - name = eq.definition.name - doc = eq.__doc__ - equ = eq - commandstr = '''{0} = type('{0}', (Equation,), {{'__doc__': """{1}""", 'expr': {2}}})'''.format( - name, doc.replace('\n', ' ').replace('\r', ''), equ) - file1.write(commandstr + "\n") - - StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter) - -.. code:: ipython3 - - from test_definitions import * - - -.. parsed-literal:: - - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:c_pi" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:lambda_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:rho_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:L_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:A_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:Q_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.chamber.insulation:dT_i" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:alpha_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pa" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pamol" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:c_pv" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:C_wa" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:D_va" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:g" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Gr" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:h_c" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:k_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:lambda_E" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Le" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_air" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_N2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:M_O2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:M_w" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:nu_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Nu" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Pr" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_N2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_O2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_wa" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:P_was" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_d" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Re_c" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:Re" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:rho_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_u" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:R_mol" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:R_s" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:sigm" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:T0" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:T_a" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:v_w" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:x_N2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.variables.physics.thermodynamics:x_O2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_Dva1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_Dva2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_alpha1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_alpha2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_ka1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_ka2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_nua1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "essm.equations.physics.thermodynamics:p_nua2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_g" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:V_g" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:n_g" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:n_w" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_g" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:Delta_Pwa" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:x" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:p_CC1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:p_CC2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_a1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:T_a2" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: "__main__:P_wa1" will be overridden by "essm.variables._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.chamber.insulation:eq_Qi" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Le" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Cwa" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Dva" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_alphaa" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_ka" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_nua" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_rhoa_Pwa_Ta" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_Pa" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PN2_PO2" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PO2" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_PN2" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "essm.equations.physics.thermodynamics:eq_rhoa" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_ideal_gas_law" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pg1" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_nw" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_CC" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq1" will be overridden by "essm.equations._core:" - instance[expr] = instance - /home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: "__main__:eq_Pwa_Delta" will be overridden by "essm.equations._core:" - instance[expr] = instance - - -Numerical evaluations -===================== - -See here for detailed instructions on how to turn sympy expressions into -code: https://docs.sympy.org/latest/modules/codegen.html - -We will first list all equations defined in this worksheet: - -.. code:: ipython3 - - for eq in Equation.__registry__.keys(): - print(eq.definition.name + ': ' + str(eq)) - - -.. parsed-literal:: - - eq_Qi: Eq(Q_i, A_i*dT_i*lambda_i/L_i) - eq_Le: Eq(Le, alpha_a/D_va) - eq_Cwa: Eq(C_wa, P_wa/(R_mol*T_a)) - eq_Nu_forced_all: Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000) - eq_Dva: Eq(D_va, T_a*p_Dva1 - p_Dva2) - eq_alphaa: Eq(alpha_a, T_a*p_alpha1 - p_alpha2) - eq_ka: Eq(k_a, T_a*p_ka1 + p_ka2) - eq_nua: Eq(nu_a, T_a*p_nua1 - p_nua2) - eq_rhoa_Pwa_Ta: Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a)) - eq_Pa: Eq(P_a, P_N2 + P_O2 + P_wa) - eq_PN2_PO2: Eq(P_N2, P_O2*x_N2/x_O2) - eq_PO2: Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2)) - eq_PN2: Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2)) - eq_rhoa: Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2)) - eq_ideal_gas_law: Eq(P_g*V_g, R_mol*T_g*n_g) - eq_Pg: Eq(P_g, R_mol*T_g*n_g/V_g) - eq_Pwa_nw: Eq(P_wa, R_mol*T_g*n_w/V_g) - eq_Pwa_CC: Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol)) - eq1: Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True))) - eq_Pwa_Delta: Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2))) - eq_Nu_forced_all: Eq(Nu, -Pr**0.333333333333333*(-37*Re**0.8 - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**0.8)/1000) - - -Substitution of equations and values into equations ---------------------------------------------------- - -The easiest way is to define a dictionary with all variables we want to -substitute as keys. We start with the default variables and then add -more. First, however, we will define a function to display the contents -of a dictionary: - -.. code:: ipython3 - - def print_dict(vdict, list_vars=None): - """Print values and units of variables in vdict.""" - if not list_vars: - list_vars = vdict.keys() - for var1 in list_vars: - unit1 = var1.definition.unit - if unit1 == 1: - unit1 = '' - if vdict[var1] is not None: - print('{0}: {1} {2}'.format(var1.name, str(vdict[var1]), str(unit1))) - -.. code:: ipython3 - - vdict = Variable.__defaults__.copy() - print_dict(vdict) - - -.. parsed-literal:: - - c_pa: 1010.0 J/(K*kg) - c_pamol: 29.19 J/(K*mol) - c_pv: 1864 J/(K*kg) - g: 9.81 m/s**2 - lambda_E: 2450000.0 J/kg - M_air: 0.02897 kg/mol - M_N2: 0.028 kg/mol - M_O2: 0.032 kg/mol - M_w: 0.018 kg/mol - R_mol: 8.314472 J/(K*mol) - sigm: 5.67e-08 J/(K**4*m**2*s) - T0: 273.15 K - x_N2: 0.79 - x_O2: 0.21 - p_Dva1: 1.49e-07 m**2/(K*s) - p_Dva2: 1.96e-05 m**2/s - p_alpha1: 1.32e-07 m**2/(K*s) - p_alpha2: 1.73e-05 m**2/s - p_ka1: 6.84e-05 J/(K**2*m*s) - p_ka2: 0.00563 J/(K*m*s) - p_nua1: 9e-08 m**2/(K*s) - p_nua2: 1.13e-05 m**2/s - p_CC1: 611.0 Pa - p_CC2: 273.0 K - - -We can substitute a range of equations into each other by using the -custom function ``subs_eq``: - -.. code:: ipython3 - - from essm.variables.utils import subs_eq - subs_eq(eq_Le, [eq_alphaa, eq_Dva]) - - - - -.. math:: - - \displaystyle N_{Le} = \frac{T_a p_1 - p_2}{T_a p_1 - p_2} - - - -We can also use subs_eq to substitute equations into each other and a -dictionary with values. We will first add an entry for T_a into the -dictionary and then substitute: - -.. code:: ipython3 - - vdict[T_a] = 300. - subs_eq(eq_Le, [eq_alphaa, eq_Dva], vdict) - - - - -.. math:: - - \displaystyle N_{Le} = 0.888446215139442 - - - -Evaluation of equations for long lists of variable sets -------------------------------------------------------- - -Substitution of variables into equations takes a lot of time if they -need to be evaluated for a large number of variables. We can use theano -to speed this up: - -.. code:: ipython3 - - #import theano - from sympy.printing.theanocode import theano_function - import numpy as np - - -.. parsed-literal:: - - WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions. - - -We will now create two long lists of values representing T_g and n_g -respectively and show how long it takes to compute ideal gas law values. - -.. code:: ipython3 - - npoints = 10000 - xmin = 290. - xmax = 310. - Tvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) - xmin = 0.1 - xmax = 0.5 - nvals = np.arange(xmin, xmax, (xmax-xmin)/npoints) - -.. code:: ipython3 - - %%time - # looping - expr = eq_ideal_gas_law.rhs.subs(Variable.__defaults__) - resvals0 = [] - for i in range(len(Tvals)): - resvals0.append(expr.subs({T_g: Tvals[i], n_g: nvals[i]})) - - -.. parsed-literal:: - - CPU times: user 8.88 s, sys: 11.7 ms, total: 8.89 s - Wall time: 8.89 s - - -.. code:: ipython3 - - %%time - # Using theano - f1 = theano_function([T_g, n_g], [eq_ideal_gas_law.rhs.subs(Variable.__defaults__)], dims={T_g:1, n_g:1}) - resvals1 = f1(Tvals,nvals) - - -.. parsed-literal:: - - CPU times: user 34.4 ms, sys: 11.6 ms, total: 46 ms - Wall time: 760 ms - - -.. code:: ipython3 - - list(resvals0) == list(resvals1) - - - - -.. parsed-literal:: - - True - - - -**Both approaches give identical results, but ``theano_function`` makes -it a lot faster.** - -Numerical solution ------------------- - -Some equations cannot be solved analytically for a given variable, -e.g. eq_Nu_forced_all cannot be solved analytically for Re if Nu is -given, so we can use numerical solvers instead: - -.. code:: ipython3 - - from sympy import nsolve - -.. code:: ipython3 - - vdict = Variable.__defaults__.copy() - vdict[Pr] = 0.71 - vdict[Re_c] = 3000. - vdict[Nu] = 1000. - expr = eq_Nu_forced_all.subs(vdict) - nsolve(expr, 1000.) - - - - -.. math:: - - \displaystyle 690263.0346446 - - - -Now applying to a long list of Nu-values: - -.. code:: ipython3 - - npoints = 100 - xmin = 1000. - xmax = 1200. - Nuvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) - -.. code:: ipython3 - - %%time - # Solving for a range of Nu values - vdict = Variable.__defaults__.copy() - vdict[Pr] = 0.71 - vdict[Re_c] = 3000. - resvals = [] - for Nu1 in Nuvals: - vdict[Nu] = Nu1 - resvals.append(nsolve(eq_Nu_forced_all.subs(vdict), 1000.)) - - -.. parsed-literal:: - - CPU times: user 1.75 s, sys: 46 µs, total: 1.75 s - Wall time: 1.75 s - - -We will now again use a theano function to make it faster. First we -import optimize from scipy and preapre the theano_function: - -.. code:: ipython3 - - import scipy.optimize as sciopt - vdict = Variable.__defaults__.copy() - vdict[Pr] = 0.71 - vdict[Re_c] = 3000. - expr = eq_Nu_forced_all.subs(vdict) - expr1 = expr.rhs - expr.lhs - fun_tf = theano_function([Re, Nu], [expr1], dims={Nu:1, Re:1}) - x0vals = np.full(Nuvals.shape, fill_value=2000.) # array of same shape as Nuvals, with initial guess - -.. code:: ipython3 - - %%time - # Solving for a range of Nu values - resvals1 = sciopt.fsolve(fun_tf, args=Nuvals, x0=x0vals) - - -.. parsed-literal:: - - CPU times: user 5.6 ms, sys: 324 µs, total: 5.92 ms - Wall time: 5.9 ms - - -.. code:: ipython3 - - np.mean(abs((resvals - resvals1)/resvals)) - - - - -.. math:: - - \displaystyle 5.35677372658855 \cdot 10^{-11} - - - -**Using theano and scipy makes it 2 orders of magnitude faster and the -results are different only by 10\ :math:`^{-10}`\ %!** **Note, however, -that scipy gets slowed down for large arrays, so it is more efficient to -re-run it repreatedly with subsections of the arra:** - -.. code:: ipython3 - - npoints = 1000 - xmin = 1000. - xmax = 1200. - Nuvals = np.arange(xmin, xmax, (xmax - xmin)/npoints) - x0vals = np.full(Nuvals.shape, fill_value=2000.) - -.. code:: ipython3 - - %%time - # Solving for a range of Nu values - resvals1 = sciopt.fsolve(fun_tf, args=Nuvals, x0=x0vals) - - -.. parsed-literal:: - - CPU times: user 1.53 s, sys: 493 µs, total: 1.53 s - Wall time: 1.52 s - - -We will now test that we can process Nuvals bit by bit and re-create it -consistently: - -.. code:: ipython3 - - # Solving for a range of Nu values - imax = len(Nuvals) - i0 = 0 - idiff = 100 - i1 = i0 - resvals2 = [] - while i1 < imax - 1: - i0 = i1 # note that resvals[0:2] + resvals[2:4] = resvals[0:4] - i1 = min(i0+idiff, imax) - resvals0 = Nuvals[i0:i1] - resvals2 = np.append(resvals2,resvals0) - print(list(resvals2) == list(Nuvals)) - - -.. parsed-literal:: - - True - - -Now we will run fsolve for portions of Nuvals bit by bit: - -.. code:: ipython3 - - %%time - # Solving for a range of Nu values - imax = len(Nuvals) - i0 = 0 - idiff = 100 - i1 = i0 - resvals2 = [] - while i1 < imax - 1: - i0 = i1 # note that resvals[0:2] + resvals[2:4] = resvals[0:4] - i1 = min(i0+idiff, imax) - resvals0 = sciopt.fsolve(fun_tf, args=Nuvals[i0:i1], x0=x0vals[i0:i1]) - resvals2 = np.append(resvals2,resvals0) - - -.. parsed-literal:: - - CPU times: user 63.8 ms, sys: 0 ns, total: 63.8 ms - Wall time: 63.6 ms - - -.. code:: ipython3 - - np.mean(abs((resvals1 - resvals2)/resvals1)) - - - - -.. math:: - - \displaystyle 7.123089551453573e-10 - - - -**It is strange that resvals1 and resvals2 are different at all, but -anyway, it is clear that slicing the data in relatively small portions -is important to keep ``scipy.optimize.fsolve`` time-efficient.** - -Generate code from sympy expressions and execute ------------------------------------------------- - -Need to install gfortran system-wide first! - -.. code:: ipython3 - - from sympy.utilities.autowrap import autowrap - -.. code:: ipython3 - - from sympy import symbols - x, y, z = symbols('x y z') - expr = ((x - y + z)**(13)).expand() - binary_func = autowrap(expr) - -.. code:: ipython3 - - %%time - binary_func(1, 4, 2) - - -.. parsed-literal:: - - CPU times: user 7 µs, sys: 1 µs, total: 8 µs - Wall time: 12.6 µs - - - - -.. math:: - - \displaystyle -1.0 - - - -.. code:: ipython3 - - %%time - expr.subs({x:1, y:4, z:2}) - - -.. parsed-literal:: - - CPU times: user 89.2 ms, sys: 233 µs, total: 89.5 ms - Wall time: 88.9 ms - - - - -.. math:: - - \displaystyle -1 - - - -.. code:: ipython3 - - from sympy.utilities.autowrap import binary_function - binary_function? - diff --git a/docs/examples/importable_variables_equations.ipynb b/docs/examples/importable_variables_equations.ipynb index 8f7730b..78c39b2 100644 --- a/docs/examples/importable_variables_equations.ipynb +++ b/docs/examples/importable_variables_equations.ipynb @@ -19,7 +19,7 @@ { "data": { "text/plain": [ - "'0.4.2.dev2+dirty'" + "'0.4.2.dev5'" ] }, "execution_count": 1, @@ -35,7 +35,30 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.core.display import display, HTML\n", + "display(HTML(\"\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -59,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -77,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -240,7 +263,7 @@ " ('$x_{O2}$', 'x_O2', 'Mole fraction of oxygen in dry air.', '', '0.21', '1')]" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -270,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -351,7 +374,7 @@ " '$\\\\rho_a = \\\\frac{x_{N2} \\\\left(M_{N_2} P_a - P_{wa} \\\\left(M_{N_2} - M_w\\\\right)\\\\right) + x_{O2} \\\\left(M_{O_2} P_a - P_{wa} \\\\left(M_{O_2} - M_w\\\\right)\\\\right)}{R_{mol} T_a x_{N2} + R_{mol} T_a x_{O2}}$')]" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -385,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -564,7 +587,7 @@ " 'K')]" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -585,7 +608,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -683,7 +706,7 @@ " '$N_{Gr_L} = \\\\frac{L_l^{3} g \\\\left(\\\\rho_a - \\\\rho_{al}\\\\right)}{\\\\nu_a^{2} \\\\rho_{al}}$')]" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -709,7 +732,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -793,7 +816,7 @@ " 'J s$^{-1}$ m$^{-2}$')]" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -822,7 +845,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -871,7 +894,7 @@ " 'kg m$^{-3}$')]" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -892,7 +915,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -966,7 +989,7 @@ " ('$W_c$', 'W_c', 'Chamber width.', '', '-', 'm')]" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } diff --git a/docs/examples/test_definitions.py b/docs/examples/test_definitions.py index 3b03907..45e9528 100644 --- a/docs/examples/test_definitions.py +++ b/docs/examples/test_definitions.py @@ -1,80 +1,739 @@ from essm.variables._core import BaseVariable, Variable from essm.equations import Equation -from sympy import Abs, Derivative, Eq, exp, Integral, log, Piecewise, sqrt -from sympy.physics.units import kilogram, mole, meter, kelvin, watt, second, joule, pascal -alpha_a = type('alpha_a', (Variable,), {'__doc__': """Thermal diffusivity of dry air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"\alpha_a", 'default': None, 'expr': None}) -c_pa = type('c_pa', (Variable,), {'__doc__': """Specific heat of dry air.""", 'unit': joule/(kelvin*kilogram), 'assumptions': {'real': True}, 'latex_name': r"c_{pa}", 'default': 1010.0, 'expr': None}) -c_pamol = type('c_pamol', (Variable,), {'__doc__': """Molar specific heat of dry air. https://en.wikipedia.org/wiki/Heat_capacity#Specific_heat_capacity """, 'unit': joule/(kelvin*mole), 'assumptions': {'real': True}, 'latex_name': r"c_{pa,mol}", 'default': 29.19, 'expr': None}) -c_pv = type('c_pv', (Variable,), {'__doc__': """Specific heat of water vapour at 300 K. http://www.engineeringtoolbox.com/water-vapor-d_979.html """, 'unit': joule/(kelvin*kilogram), 'assumptions': {'real': True}, 'latex_name': r"c_{pv}", 'default': 1864, 'expr': None}) -C_wa = type('C_wa', (Variable,), {'__doc__': """Concentration of water in air.""", 'unit': mole/meter**3, 'assumptions': {'real': True}, 'latex_name': r"C_{wa}", 'default': None, 'expr': None}) -D_va = type('D_va', (Variable,), {'__doc__': """Binary diffusion coefficient of water vapour in air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"D_{va}", 'default': None, 'expr': None}) -g = type('g', (Variable,), {'__doc__': """Gravitational acceleration.""", 'unit': meter/second**2, 'assumptions': {'real': True}, 'latex_name': r"g", 'default': 9.81, 'expr': None}) -Gr = type('Gr', (Variable,), {'__doc__': """Grashof number.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Gr_L}", 'default': None, 'expr': None}) -h_c = type('h_c', (Variable,), {'__doc__': """Average 1-sided convective heat transfer coefficient.""", 'unit': joule/(kelvin*meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"h_c", 'default': None, 'expr': None}) -k_a = type('k_a', (Variable,), {'__doc__': """Thermal conductivity of dry air.""", 'unit': joule/(kelvin*meter*second), 'assumptions': {'real': True}, 'latex_name': r"k_a", 'default': None, 'expr': None}) -lambda_E = type('lambda_E', (Variable,), {'__doc__': """Latent heat of evaporation.""", 'unit': joule/kilogram, 'assumptions': {'real': True}, 'latex_name': r"\lambda_E", 'default': 2450000.0, 'expr': None}) -Le = type('Le', (Variable,), {'__doc__': """Lewis number.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Le}", 'default': None, 'expr': None}) -M_air = type('M_air', (Variable,), {'__doc__': """Molar mass of air. http://www.engineeringtoolbox.com/molecular-mass-air-d_679.html """, 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{air}", 'default': 0.02897, 'expr': None}) -M_N2 = type('M_N2', (Variable,), {'__doc__': """Molar mass of nitrogen.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{N_2}", 'default': 0.028, 'expr': None}) -M_O2 = type('M_O2', (Variable,), {'__doc__': """Molar mass of oxygen.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_{O_2}", 'default': 0.032, 'expr': None}) -M_w = type('M_w', (Variable,), {'__doc__': """Molar mass of water.""", 'unit': kilogram/mole, 'assumptions': {'real': True}, 'latex_name': r"M_w", 'default': 0.018, 'expr': None}) -nu_a = type('nu_a', (Variable,), {'__doc__': """Kinematic viscosity of dry air.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"\nu_a", 'default': None, 'expr': None}) -Nu = type('Nu', (Variable,), {'__doc__': """Average Nusselt number over given length.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Nu_L}", 'default': None, 'expr': None}) -P_a = type('P_a', (Variable,), {'__doc__': """Air pressure.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_a", 'default': None, 'expr': None}) -Pr = type('Pr', (Variable,), {'__doc__': """Prandtl number (0.71 for air).""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Pr}", 'default': None, 'expr': None}) -P_N2 = type('P_N2', (Variable,), {'__doc__': """Partial pressure of nitrogen.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{N2}", 'default': None, 'expr': None}) -P_O2 = type('P_O2', (Variable,), {'__doc__': """Partial pressure of oxygen.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{O2}", 'default': None, 'expr': None}) -P_wa = type('P_wa', (Variable,), {'__doc__': """Partial pressure of water vapour in air.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{wa}", 'default': None, 'expr': None}) -P_was = type('P_was', (Variable,), {'__doc__': """Saturation water vapour pressure at air temperature.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{was}", 'default': None, 'expr': None}) -R_d = type('R_d', (Variable,), {'__doc__': """Downwelling global radiation.""", 'unit': watt/meter**2, 'assumptions': {'real': True}, 'latex_name': r"R_d", 'default': None, 'expr': None}) -Re_c = type('Re_c', (Variable,), {'__doc__': """Critical Reynolds number for the onset of turbulence.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Re_c}", 'default': None, 'expr': None}) -Re = type('Re', (Variable,), {'__doc__': """Average Reynolds number over given length.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"N_{Re_L}", 'default': None, 'expr': None}) -rho_a = type('rho_a', (Variable,), {'__doc__': """Density of dry air.""", 'unit': kilogram/meter**3, 'assumptions': {'real': True}, 'latex_name': r"\rho_a", 'default': None, 'expr': None}) -R_u = type('R_u', (Variable,), {'__doc__': """Upwelling global radiation.""", 'unit': watt/meter**2, 'assumptions': {'real': True}, 'latex_name': r"R_u", 'default': None, 'expr': None}) -R_mol = type('R_mol', (Variable,), {'__doc__': """Molar gas constant.""", 'unit': joule/(kelvin*mole), 'assumptions': {'real': True}, 'latex_name': r"R_{mol}", 'default': 8.314472, 'expr': None}) -R_s = type('R_s', (Variable,), {'__doc__': """Solar shortwave flux per area.""", 'unit': joule/(meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"R_s", 'default': None, 'expr': None}) -sigm = type('sigm', (Variable,), {'__doc__': """Stefan-Boltzmann constant.""", 'unit': joule/(kelvin**4*meter**2*second), 'assumptions': {'real': True}, 'latex_name': r"\sigma", 'default': 5.67e-08, 'expr': None}) -T0 = type('T0', (Variable,), {'__doc__': """Freezing point in Kelvin.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_0", 'default': 273.15, 'expr': None}) -T_a = type('T_a', (Variable,), {'__doc__': """Air temperature.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_a", 'default': None, 'expr': None}) -v_w = type('v_w', (Variable,), {'__doc__': """Wind velocity.""", 'unit': meter/second, 'assumptions': {'real': True}, 'latex_name': r"v_w", 'default': None, 'expr': None}) -x_N2 = type('x_N2', (Variable,), {'__doc__': """Mole fraction of nitrogen in dry air.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"x_{N2}", 'default': 0.79, 'expr': None}) -x_O2 = type('x_O2', (Variable,), {'__doc__': """Mole fraction of oxygen in dry air.""", 'unit': 1, 'assumptions': {'real': True}, 'latex_name': r"x_{O2}", 'default': 0.21, 'expr': None}) -p_Dva1 = type('p_Dva1', (Variable,), {'__doc__': """Internal parameter of eq_Dva.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 1.49e-07, 'expr': None}) -p_Dva2 = type('p_Dva2', (Variable,), {'__doc__': """Internal parameter of eq_Dva.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.96e-05, 'expr': None}) -p_alpha1 = type('p_alpha1', (Variable,), {'__doc__': """Internal parameter of eq_alphaa.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 1.32e-07, 'expr': None}) -p_alpha2 = type('p_alpha2', (Variable,), {'__doc__': """Internal parameter of eq_alphaa.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.73e-05, 'expr': None}) -p_ka1 = type('p_ka1', (Variable,), {'__doc__': """Internal parameter of eq_ka.""", 'unit': joule/(kelvin**2*meter*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 6.84e-05, 'expr': None}) -p_ka2 = type('p_ka2', (Variable,), {'__doc__': """Internal parameter of eq_ka.""", 'unit': joule/(kelvin*meter*second), 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 0.00563, 'expr': None}) -p_nua1 = type('p_nua1', (Variable,), {'__doc__': """Internal parameter of eq_nua.""", 'unit': meter**2/(kelvin*second), 'assumptions': {'real': True}, 'latex_name': r"p_1", 'default': 9e-08, 'expr': None}) -p_nua2 = type('p_nua2', (Variable,), {'__doc__': """Internal parameter of eq_nua.""", 'unit': meter**2/second, 'assumptions': {'real': True}, 'latex_name': r"p_2", 'default': 1.13e-05, 'expr': None}) -P_g = type('P_g', (Variable,), {'__doc__': """Pressure of gas.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_g", 'default': None, 'expr': None}) -V_g = type('V_g', (Variable,), {'__doc__': """Volume of gas.""", 'unit': meter**3, 'assumptions': {'real': True}, 'latex_name': r"V_g", 'default': None, 'expr': None}) -n_g = type('n_g', (Variable,), {'__doc__': """Amount of gas.""", 'unit': mole, 'assumptions': {'real': True}, 'latex_name': r"n_g", 'default': None, 'expr': None}) -n_w = type('n_w', (Variable,), {'__doc__': """Amount of water.""", 'unit': mole, 'assumptions': {'real': True}, 'latex_name': r"n_w", 'default': None, 'expr': None}) -T_g = type('T_g', (Variable,), {'__doc__': """Temperature of gas.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_g", 'default': None, 'expr': None}) -Delta_Pwa = type('Delta_Pwa', (Variable,), {'__doc__': """Slope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$""", 'unit': pascal/kelvin, 'assumptions': {'real': True}, 'latex_name': r"\Delta", 'default': None, 'expr': Derivative(P_wa, T_g)}) -x = type('x', (Variable,), {'__doc__': """Positive real variable.""", 'unit': 1, 'assumptions': {'positive': True, 'real': True}, 'latex_name': r"x", 'default': None, 'expr': None}) -p_CC1 = type('p_CC1', (Variable,), {'__doc__': """Internal parameter of eq_Pwl.""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"611", 'default': 611.0, 'expr': None}) -p_CC2 = type('p_CC2', (Variable,), {'__doc__': """Internal parameter of eq_Pwl.""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"273", 'default': 273.0, 'expr': None}) -T_a1 = type('T_a1', (Variable,), {'__doc__': """Air temperature""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_{a1}", 'default': None, 'expr': None}) -T_a2 = type('T_a2', (Variable,), {'__doc__': """Air temperature""", 'unit': kelvin, 'assumptions': {'real': True}, 'latex_name': r"T_{a2}", 'default': None, 'expr': None}) -P_wa1 = type('P_wa1', (Variable,), {'__doc__': """P_wa at T1""", 'unit': pascal, 'assumptions': {'real': True}, 'latex_name': r"P_{wa1}", 'default': None, 'expr': None}) -eq_Le = type('eq_Le', (Equation,), {'__doc__': """Le as function of alpha_a and D_va. (Eq. B3 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(Le, alpha_a/D_va)}) -eq_Cwa = type('eq_Cwa', (Equation,), {'__doc__': """C_wa as a function of P_wa and T_a. (Eq. B9 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(C_wa, P_wa/(R_mol*T_a))}) -eq_Nu_forced_all = type('eq_Nu_forced_all', (Equation,), {'__doc__': """Nu as function of Re and Re_c under forced conditions. (Eqs. B13--B15 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000)}) -eq_Dva = type('eq_Dva', (Equation,), {'__doc__': """D_va as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(D_va, T_a*p_Dva1 - p_Dva2)}) -eq_alphaa = type('eq_alphaa', (Equation,), {'__doc__': """alpha_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(alpha_a, T_a*p_alpha1 - p_alpha2)}) -eq_ka = type('eq_ka', (Equation,), {'__doc__': """k_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(k_a, T_a*p_ka1 + p_ka2)}) -eq_nua = type('eq_nua', (Equation,), {'__doc__': """nu_a as a function of air temperature. (Table A.3 in :cite:`monteith_principles_2007`) """, 'expr': Eq(nu_a, T_a*p_nua1 - p_nua2)}) -eq_rhoa_Pwa_Ta = type('eq_rhoa_Pwa_Ta', (Equation,), {'__doc__': """rho_a as a function of P_wa and T_a. (Eq. B20 in :cite:`schymanski_leaf-scale_2017`) """, 'expr': Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a))}) -eq_Pa = type('eq_Pa', (Equation,), {'__doc__': """Calculate air pressure. From partial pressures of N2, O2 and H2O, following Dalton's law of partial pressures. """, 'expr': Eq(P_a, P_N2 + P_O2 + P_wa)}) -eq_PN2_PO2 = type('eq_PN2_PO2', (Equation,), {'__doc__': """Calculate P_N2 as a function of P_O2. It follows Dalton's law of partial pressures. """, 'expr': Eq(P_N2, P_O2*x_N2/x_O2)}) -eq_PO2 = type('eq_PO2', (Equation,), {'__doc__': """Calculate P_O2 as a function of P_a, P_N2 and P_wa.""", 'expr': Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2))}) -eq_PN2 = type('eq_PN2', (Equation,), {'__doc__': """Calculate P_N2 as a function of P_a, P_O2 and P_wa.""", 'expr': Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2))}) -eq_rhoa = type('eq_rhoa', (Equation,), {'__doc__': """Calculate rho_a from T_a, P_a and P_wa.""", 'expr': Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2))}) -eq_ideal_gas_law = type('eq_ideal_gas_law', (Equation,), {'__doc__': """Ideal gas law.""", 'expr': Eq(P_g*V_g, R_mol*T_g*n_g)}) -eq_Pg = type('eq_Pg', (Equation,), {'__doc__': """Calculate pressure of ideal gas.""", 'expr': Eq(P_g, R_mol*T_g*n_g/V_g)}) -eq_Pwa_nw = type('eq_Pwa_nw', (Equation,), {'__doc__': """Calculate vapour pressure from amount of water in gas.""", 'expr': Eq(P_wa, R_mol*T_g*n_w/V_g)}) -eq_Pwa_CC = type('eq_Pwa_CC', (Equation,), {'__doc__': """Clausius-Clapeyron P_wa as function of T_g. Eq. B3 in :cite{hartmann_global_1994} """, 'expr': Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol))}) -eq1 = type('eq1', (Equation,), {'__doc__': """Test""", 'expr': Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True)))}) -eq_Pwa_Delta = type('eq_Pwa_Delta', (Equation,), {'__doc__': """P_wa deduced from the integral of Delta""", 'expr': Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2)))}) +from sympy import (Abs, Derivative, Eq, exp, + Integral, log, Piecewise, sqrt) +from sympy.physics.units import meter +from sympy.physics.units import second +from sympy.physics.units import watt +from sympy.physics.units import kelvin +from sympy.physics.units import kilogram +from sympy.physics.units import pascal +from sympy.physics.units import mole +from sympy.physics.units import joule + + +class alpha_a(Variable): + """ Thermal diffusivity of dry air. + """ + + name = 'alpha_a' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'\alpha_a' + + +class c_pa(Variable): + """ Specific heat of dry air. + """ + + name = 'c_pa' + unit = joule/(kelvin*kilogram) + assumptions = {'real': True} + latex_name = r'c_{pa}' + + +class c_pamol(Variable): + """ Molar specific heat of dry air. + https://en.wikipedia.org/wiki/Heat_capacity#Specific_heat_capacity + """ + + name = 'c_pamol' + unit = joule/(kelvin*mole) + assumptions = {'real': True} + latex_name = r'c_{pa,mol}' + + +class c_pv(Variable): + """ Specific heat of water vapour at 300 K. + http://www.engineeringtoolbox.com/water-vapor-d_979.html + """ + + name = 'c_pv' + unit = joule/(kelvin*kilogram) + assumptions = {'real': True} + latex_name = r'c_{pv}' + + +class C_wa(Variable): + """ Concentration of water in air. + """ + + name = 'C_wa' + unit = mole/meter**3 + assumptions = {'real': True} + latex_name = r'C_{wa}' + + +class D_va(Variable): + """ Binary diffusion coefficient of water vapour in air. + """ + + name = 'D_va' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'D_{va}' + + +class g(Variable): + """ Gravitational acceleration. + """ + + name = 'g' + unit = meter/second**2 + assumptions = {'real': True} + latex_name = r'g' + + +class Gr(Variable): + """ Grashof number. + """ + + name = 'Gr' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Gr_L}' + + +class h_c(Variable): + """ Average 1-sided convective heat transfer coefficient. + """ + + name = 'h_c' + unit = joule/(kelvin*meter**2*second) + assumptions = {'real': True} + latex_name = r'h_c' + + +class k_a(Variable): + """ Thermal conductivity of dry air. + """ + + name = 'k_a' + unit = joule/(kelvin*meter*second) + assumptions = {'real': True} + latex_name = r'k_a' + + +class lambda_E(Variable): + """ Latent heat of evaporation. + """ + + name = 'lambda_E' + unit = joule/kilogram + assumptions = {'real': True} + latex_name = r'\lambda_E' + + +class Le(Variable): + """ Lewis number. + """ + + name = 'Le' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Le}' + + +class M_air(Variable): + """ Molar mass of air. + http://www.engineeringtoolbox.com/molecular-mass-air-d_679.html + """ + + name = 'M_air' + unit = kilogram/mole + assumptions = {'real': True} + latex_name = r'M_{air}' + + +class M_N2(Variable): + """ Molar mass of nitrogen. + """ + + name = 'M_N2' + unit = kilogram/mole + assumptions = {'real': True} + latex_name = r'M_{N_2}' + + +class M_O2(Variable): + """ Molar mass of oxygen. + """ + + name = 'M_O2' + unit = kilogram/mole + assumptions = {'real': True} + latex_name = r'M_{O_2}' + + +class M_w(Variable): + """ Molar mass of water. + """ + + name = 'M_w' + unit = kilogram/mole + assumptions = {'real': True} + latex_name = r'M_w' + + +class nu_a(Variable): + """ Kinematic viscosity of dry air. + """ + + name = 'nu_a' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'\nu_a' + + +class Nu(Variable): + """ Average Nusselt number over given length. + """ + + name = 'Nu' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Nu_L}' + + +class P_a(Variable): + """ Air pressure. + """ + + name = 'P_a' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_a' + + +class Pr(Variable): + """ Prandtl number (0.71 for air). + """ + + name = 'Pr' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Pr}' + + +class P_N2(Variable): + """ Partial pressure of nitrogen. + """ + + name = 'P_N2' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_{N2}' + + +class P_O2(Variable): + """ Partial pressure of oxygen. + """ + + name = 'P_O2' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_{O2}' + + +class P_wa(Variable): + """ Partial pressure of water vapour in air. + """ + + name = 'P_wa' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_{wa}' + + +class P_was(Variable): + """ Saturation water vapour pressure at air temperature. + """ + + name = 'P_was' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_{was}' + + +class R_d(Variable): + """ Downwelling global radiation. + """ + + name = 'R_d' + unit = watt/meter**2 + assumptions = {'real': True} + latex_name = r'R_d' + + +class Re_c(Variable): + """ Critical Reynolds number for the onset of turbulence. + """ + + name = 'Re_c' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Re_c}' + + +class Re(Variable): + """ Average Reynolds number over given length. + """ + + name = 'Re' + unit = 1 + assumptions = {'real': True} + latex_name = r'N_{Re_L}' + + +class rho_a(Variable): + """ Density of dry air. + """ + + name = 'rho_a' + unit = kilogram/meter**3 + assumptions = {'real': True} + latex_name = r'\rho_a' + + +class R_u(Variable): + """ Upwelling global radiation. + """ + + name = 'R_u' + unit = watt/meter**2 + assumptions = {'real': True} + latex_name = r'R_u' + + +class R_mol(Variable): + """ Molar gas constant. + """ + + name = 'R_mol' + unit = joule/(kelvin*mole) + assumptions = {'real': True} + latex_name = r'R_{mol}' + + +class R_s(Variable): + """ Solar shortwave flux per area. + """ + + name = 'R_s' + unit = joule/(meter**2*second) + assumptions = {'real': True} + latex_name = r'R_s' + + +class sigm(Variable): + """ Stefan-Boltzmann constant. + """ + + name = 'sigm' + unit = joule/(kelvin**4*meter**2*second) + assumptions = {'real': True} + latex_name = r'\sigma' + + +class T0(Variable): + """ Freezing point in Kelvin. + """ + + name = 'T0' + unit = kelvin + assumptions = {'real': True} + latex_name = r'T_0' + + +class T_a(Variable): + """ Air temperature. + """ + + name = 'T_a' + unit = kelvin + assumptions = {'real': True} + latex_name = r'T_a' + + +class v_w(Variable): + """ Wind velocity. + """ + + name = 'v_w' + unit = meter/second + assumptions = {'real': True} + latex_name = r'v_w' + + +class x_N2(Variable): + """ Mole fraction of nitrogen in dry air. + """ + + name = 'x_N2' + unit = 1 + assumptions = {'real': True} + latex_name = r'x_{N2}' + + +class x_O2(Variable): + """ Mole fraction of oxygen in dry air. + """ + + name = 'x_O2' + unit = 1 + assumptions = {'real': True} + latex_name = r'x_{O2}' + + +class p_Dva1(Variable): + """ Internal parameter of eq_Dva. + """ + + name = 'p_Dva1' + unit = meter**2/(kelvin*second) + assumptions = {'real': True} + latex_name = r'p_1' + + +class p_Dva2(Variable): + """ Internal parameter of eq_Dva. + """ + + name = 'p_Dva2' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'p_2' + + +class p_alpha1(Variable): + """ Internal parameter of eq_alphaa. + """ + + name = 'p_alpha1' + unit = meter**2/(kelvin*second) + assumptions = {'real': True} + latex_name = r'p_1' + + +class p_alpha2(Variable): + """ Internal parameter of eq_alphaa. + """ + + name = 'p_alpha2' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'p_2' + + +class p_ka1(Variable): + """ Internal parameter of eq_ka. + """ + + name = 'p_ka1' + unit = joule/(kelvin**2*meter*second) + assumptions = {'real': True} + latex_name = r'p_1' + + +class p_ka2(Variable): + """ Internal parameter of eq_ka. + """ + + name = 'p_ka2' + unit = joule/(kelvin*meter*second) + assumptions = {'real': True} + latex_name = r'p_2' + + +class p_nua1(Variable): + """ Internal parameter of eq_nua. + """ + + name = 'p_nua1' + unit = meter**2/(kelvin*second) + assumptions = {'real': True} + latex_name = r'p_1' + + +class p_nua2(Variable): + """ Internal parameter of eq_nua. + """ + + name = 'p_nua2' + unit = meter**2/second + assumptions = {'real': True} + latex_name = r'p_2' + + +class P_g(Variable): + """ Pressure of gas. + """ + + name = 'P_g' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_g' + + +class V_g(Variable): + """ Volume of gas. + """ + + name = 'V_g' + unit = meter**3 + assumptions = {'real': True} + latex_name = r'V_g' + + +class n_g(Variable): + """ Amount of gas. + """ + + name = 'n_g' + unit = mole + assumptions = {'real': True} + latex_name = r'n_g' + + +class n_w(Variable): + """ Amount of water. + """ + + name = 'n_w' + unit = mole + assumptions = {'real': True} + latex_name = r'n_w' + + +class T_g(Variable): + """ Temperature of gas. + """ + + name = 'T_g' + unit = kelvin + assumptions = {'real': True} + latex_name = r'T_g' + + +class Delta_Pwa(Variable): + """ Slope of saturated vapour pressure, $\partial P_{wa} / \partial T_g$ + """ + + name = 'Delta_Pwa' + unit = pascal/kelvin + assumptions = {'real': True} + latex_name = r'\Delta' + + +class x(Variable): + """ Positive real variable. + """ + + name = 'x' + unit = 1 + assumptions = {'positive': True, 'real': True} + latex_name = r'x' + + +class p_CC1(Variable): + """ Internal parameter of eq_Pwl. + """ + + name = 'p_CC1' + unit = pascal + assumptions = {'real': True} + latex_name = r'611' + + +class p_CC2(Variable): + """ Internal parameter of eq_Pwl. + """ + + name = 'p_CC2' + unit = kelvin + assumptions = {'real': True} + latex_name = r'273' + + +class T_a1(Variable): + """ Air temperature + """ + + name = 'T_a1' + unit = kelvin + assumptions = {'real': True} + latex_name = r'T_{a1}' + + +class T_a2(Variable): + """ Air temperature + """ + + name = 'T_a2' + unit = kelvin + assumptions = {'real': True} + latex_name = r'T_{a2}' + + +class P_wa1(Variable): + """ P_wa at T1 + """ + + name = 'P_wa1' + unit = pascal + assumptions = {'real': True} + latex_name = r'P_{wa1}' + + +class eq_Le(Equation): + """ Le as function of alpha_a and D_va. (Eq. B3 in + :cite:`schymanski_leaf-scale_2017`) + """ + + expr = Eq(Le, alpha_a / D_va) + + +class eq_Cwa(Equation): + """ C_wa as a function of P_wa and T_a. (Eq. B9 in + :cite:`schymanski_leaf-scale_2017`) + """ + + expr = Eq(C_wa, P_wa / (R_mol * T_a)) + + +class eq_Nu_forced_all(Equation): + """ Nu as function of Re and Re_c under forced conditions. (Eqs. B13--B15 + in :cite:`schymanski_leaf-scale_2017`) + """ + + expr = Eq(Nu, -Pr ** (1 / 3) * (-37 * Re ** (4 / # nopep8 + 5) + 37 * (Re + Re_c - Abs(Re - Re_c) / 2) ** # nopep8 + (4 / 5) - 664 * sqrt(Re + Re_c - Abs(Re - Re_c) / # nopep8 + 2)) / 1000) + + +class eq_Dva(Equation): + """ D_va as a function of air temperature. (Table A.3 in + :cite:`monteith_principles_2007`) + """ + + expr = Eq(D_va, T_a * p_Dva1 - p_Dva2) + + +class eq_alphaa(Equation): + """ alpha_a as a function of air temperature. (Table A.3 in + :cite:`monteith_principles_2007`) + """ + + expr = Eq(alpha_a, T_a * p_alpha1 - p_alpha2) + + +class eq_ka(Equation): + """ k_a as a function of air temperature. (Table A.3 in + :cite:`monteith_principles_2007`) + """ + + expr = Eq(k_a, T_a * p_ka1 + p_ka2) + + +class eq_nua(Equation): + """ nu_a as a function of air temperature. (Table A.3 in + :cite:`monteith_principles_2007`) + """ + + expr = Eq(nu_a, T_a * p_nua1 - p_nua2) + + +class eq_rhoa_Pwa_Ta(Equation): + """ rho_a as a function of P_wa and T_a. (Eq. B20 in + :cite:`schymanski_leaf-scale_2017`) + """ + + expr = Eq(rho_a, (M_N2 * P_N2 + M_O2 * P_O2 + M_w * # nopep8 + P_wa) / (R_mol * T_a)) + + +class eq_Pa(Equation): + """ Calculate air pressure. From partial pressures of N2, O2 and H2O, + following Dalton's law of partial pressures. + """ + + expr = Eq(P_a, P_N2 + P_O2 + P_wa) + + +class eq_PN2_PO2(Equation): + """ Calculate P_N2 as a function of P_O2. It follows Dalton's law of + partial pressures. + """ + + expr = Eq(P_N2, P_O2 * x_N2 / x_O2) + + +class eq_ideal_gas_law(Equation): + """ Ideal gas law. + """ + + expr = Eq(P_g * V_g, R_mol * T_g * n_g) + + +class eq_Pwa_CC(Equation): + """ Clausius-Clapeyron P_wa as function of T_g. Eq. B3 in + :cite{hartmann_global_1994} + """ + + expr = Eq(P_wa, p_CC1 * exp(-M_w * lambda_E * (-1 / # nopep8 + p_CC2 + 1 / T_g) / R_mol)) + + +class eq1(Equation): + """ Test + """ + + expr = Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1 * # nopep8 + exp(-M_w * lambda_E * (-1 / p_CC2 + 1 / T_g) / # nopep8 + R_mol), True))) + + +class eq_Pwa_Delta(Equation): + """ P_wa deduced from the integral of Delta + """ + + expr = Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2))) + + +class eq_PO2(eq_Pa.definition, eq_PN2_PO2.definition): + """ Calculate P_O2 as a function of P_a, P_N2 and P_wa. + """ + + expr = Eq(P_O2, (P_a * x_O2 - P_wa * x_O2) / (x_N2 + x_O2)) + + +class eq_PN2(eq_Pa.definition, eq_PN2_PO2.definition): + """ Calculate P_N2 as a function of P_a, P_O2 and P_wa. + """ + + expr = Eq(P_N2, (P_a * x_N2 - P_wa * x_N2) / (x_N2 + x_O2)) + + +class eq_rhoa(eq_PO2.definition, eq_PN2.definition, # nopep8 + eq_rhoa_Pwa_Ta.definition): + """ Calculate rho_a from T_a, P_a and P_wa. + """ + + expr = Eq(rho_a, (x_N2 * (M_N2 * P_a - P_wa * (M_N2 - M_w)) + x_O2 * # nopep8 + (M_O2 * P_a - P_wa * (M_O2 - M_w))) / (R_mol * # nopep8 + T_a * x_N2 + R_mol * T_a * x_O2)) + + +class eq_Pg(eq_ideal_gas_law.definition): + """ Calculate pressure of ideal gas. + """ + + expr = Eq(P_g, R_mol * T_g * n_g / V_g) + + +class eq_Pwa_nw(eq_Pg.definition): + """ Calculate vapour pressure from amount of water in gas. + """ + + expr = Eq(P_wa, R_mol * T_g * n_w / V_g) diff --git a/docs/index.rst b/docs/index.rst index dd15ae0..6edb006 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,7 +23,7 @@ fromm ESSM. examples/importable_variables_equations -API Examples +Use examples ============= Here you find use examples for different API features of ESSM. diff --git a/setup.py b/setup.py index cc57968..4d0ecfd 100644 --- a/setup.py +++ b/setup.py @@ -40,7 +40,7 @@ extras_require = { 'docs': [ - 'Sphinx>=1.8', + 'Sphinx==1.8', 'matplotlib>=1.5.1', 'sphinxcontrib-bibtex>=0.3.5', ], From 4e1061cbbaeeccdb4b7f90c849f584d87b6d3645 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 02:19:50 +0200 Subject: [PATCH 05/21] update api_features notebook and clean up --- docs/examples/api_features.ipynb | 688 +++++++++++++----- .../api_features_files/api_features_104_0.png | Bin 1436 -> 0 bytes .../api_features_files/api_features_111_0.png | Bin 2025 -> 0 bytes .../api_features_files/api_features_119_0.png | Bin 2030 -> 0 bytes .../api_features_files/api_features_124_1.png | Bin 422 -> 0 bytes .../api_features_files/api_features_125_1.png | Bin 225 -> 0 bytes .../api_features_files/api_features_13_0.png | Bin 16681 -> 0 bytes .../api_features_files/api_features_26_0.png | Bin 699 -> 0 bytes .../api_features_files/api_features_27_0.png | Bin 1418 -> 0 bytes .../api_features_files/api_features_38_0.png | Bin 1682 -> 0 bytes .../api_features_files/api_features_42_0.png | Bin 2164 -> 0 bytes .../api_features_files/api_features_44_0.png | Bin 2399 -> 0 bytes .../api_features_files/api_features_48_0.png | Bin 2311 -> 0 bytes .../api_features_files/api_features_52_2.png | Bin 2164 -> 0 bytes .../api_features_files/api_features_53_1.png | Bin 1128 -> 0 bytes .../api_features_files/api_features_54_1.png | Bin 1128 -> 0 bytes .../api_features_files/api_features_62_0.png | Bin 3163 -> 0 bytes .../api_features_files/api_features_64_1.png | Bin 9773 -> 0 bytes .../api_features_files/api_features_67_0.png | Bin 6144 -> 0 bytes .../api_features_files/api_features_68_0.png | Bin 6144 -> 0 bytes .../api_features_files/api_features_71_1.png | Bin 1733 -> 0 bytes .../api_features_files/api_features_73_0.png | Bin 3163 -> 0 bytes .../api_features_files/api_features_75_0.png | Bin 5289 -> 0 bytes .../api_features_files/api_features_75_1.png | Bin 10644 -> 0 bytes .../api_features_files/api_features_77_0.png | Bin 3113 -> 0 bytes .../api_features_files/api_features_78_0.png | Bin 3687 -> 0 bytes .../api_features_files/api_features_78_1.png | Bin 9821 -> 0 bytes .../api_features_files/api_features_91_0.png | Bin 2278 -> 0 bytes .../api_features_files/api_features_93_0.png | Bin 2307 -> 0 bytes docs/examples/test_definitions.py | 6 +- 30 files changed, 505 insertions(+), 189 deletions(-) delete mode 100644 docs/examples/api_features_files/api_features_104_0.png delete mode 100644 docs/examples/api_features_files/api_features_111_0.png delete mode 100644 docs/examples/api_features_files/api_features_119_0.png delete mode 100644 docs/examples/api_features_files/api_features_124_1.png delete mode 100644 docs/examples/api_features_files/api_features_125_1.png delete mode 100644 docs/examples/api_features_files/api_features_13_0.png delete mode 100644 docs/examples/api_features_files/api_features_26_0.png delete mode 100644 docs/examples/api_features_files/api_features_27_0.png delete mode 100644 docs/examples/api_features_files/api_features_38_0.png delete mode 100644 docs/examples/api_features_files/api_features_42_0.png delete mode 100644 docs/examples/api_features_files/api_features_44_0.png delete mode 100644 docs/examples/api_features_files/api_features_48_0.png delete mode 100644 docs/examples/api_features_files/api_features_52_2.png delete mode 100644 docs/examples/api_features_files/api_features_53_1.png delete mode 100644 docs/examples/api_features_files/api_features_54_1.png delete mode 100644 docs/examples/api_features_files/api_features_62_0.png delete mode 100644 docs/examples/api_features_files/api_features_64_1.png delete mode 100644 docs/examples/api_features_files/api_features_67_0.png delete mode 100644 docs/examples/api_features_files/api_features_68_0.png delete mode 100644 docs/examples/api_features_files/api_features_71_1.png delete mode 100644 docs/examples/api_features_files/api_features_73_0.png delete mode 100644 docs/examples/api_features_files/api_features_75_0.png delete mode 100644 docs/examples/api_features_files/api_features_75_1.png delete mode 100644 docs/examples/api_features_files/api_features_77_0.png delete mode 100644 docs/examples/api_features_files/api_features_78_0.png delete mode 100644 docs/examples/api_features_files/api_features_78_1.png delete mode 100644 docs/examples/api_features_files/api_features_91_0.png delete mode 100644 docs/examples/api_features_files/api_features_93_0.png diff --git a/docs/examples/api_features.ipynb b/docs/examples/api_features.ipynb index 6cfa030..d01c622 100644 --- a/docs/examples/api_features.ipynb +++ b/docs/examples/api_features.ipynb @@ -1123,8 +1123,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2 µs, sys: 2 µs, total: 4 µs\n", - "Wall time: 7.39 µs\n" + "CPU times: user 2 µs, sys: 1 µs, total: 3 µs\n", + "Wall time: 7.15 µs\n" ] }, { @@ -1156,8 +1156,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3 µs, sys: 2 µs, total: 5 µs\n", - "Wall time: 10.3 µs\n" + "CPU times: user 2 µs, sys: 1 µs, total: 3 µs\n", + "Wall time: 7.15 µs\n" ] }, { @@ -1753,139 +1753,6 @@ "execution_count": 49, "metadata": {}, "outputs": [], - "source": [ - "with open('test_definitions.py', 'wt') as file1:\n", - " file1.write('from essm.variables._core import BaseVariable, Variable\\n')\n", - " file1.write('from essm.equations import Equation\\n')\n", - " file1.write('from sympy import Abs, Derivative, Eq, exp, Integral, log, Piecewise, sqrt\\n')\n", - " # Create import strings for all units\n", - " StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m)\n", - " s = set()\n", - " for unit in Variable.__units__.values():\n", - " for item in extract_units(unit):\n", - " s.add(item)\n", - " commandstr = 'from sympy.physics.units import ' + str(s)[1:-1]\n", - " file1.write(commandstr.replace(\"\\n\", \" \") + \"\\n\")\n", - " \n", - " for variable in Variable.__registry__.keys():\n", - " symbol = variable.definition.latex_name\n", - " name = variable.name\n", - " doc = variable.__doc__\n", - " unit = variable.definition.unit\n", - " assumptions = variable.definition.assumptions\n", - " latex_name = variable.definition.latex_name\n", - " expression = Variable.__expressions__.get(variable, None)\n", - " default = str(Variable.__defaults__.get(variable, None))\n", - " commandstr = '''{0} = type('{0}', (Variable,), {{'__doc__': \"\"\"{1}\"\"\", 'unit': {2}, 'assumptions': {3}, \\\n", - " 'latex_name': r\"{4}\", 'default': {5}, 'expr': {6}}})'''.format(\n", - " name, doc.replace('\\n', ' ').replace('\\r', ''), unit, assumptions, latex_name,\\\n", - " default, expression)\n", - " file1.write(commandstr + \"\\n\")\n", - " \n", - " for eq in Equation.__registry__.keys():\n", - " name = eq.definition.name\n", - " doc = eq.__doc__\n", - " equ = eq\n", - " commandstr = '''{0} = type('{0}', (Equation,), {{'__doc__': \"\"\"{1}\"\"\", 'expr': {2}}})'''.format(\n", - " name, doc.replace('\\n', ' ').replace('\\r', ''), equ)\n", - " file1.write(commandstr + \"\\n\")\n", - " \n", - "StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter)" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - " commandstr = '''{{'__doc__': \"\"\"{1}\"\"\",'''.format(\n", - " name, doc.replace('\\n', ' ').replace('\\r', ''), unit, assumptions, latex_name,\\\n", - " default, expression)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "with open('test_definitions.py', 'wt') as file1:\n", - " file1.write('from essm.variables._core import BaseVariable, Variable\\n')\n", - " file1.write('from essm.equations import Equation\\n')\n", - " file1.write('from sympy import (Abs, Derivative, Eq, exp,\\n')\n", - " file1.write(' Integral, log, Piecewise, sqrt)\\n')\n", - " # Create import strings for all units\n", - " StrPrinter._print_Quantity = lambda self, expr: str(expr.name) # displays long units (meter instead of m)\n", - " s = set()\n", - " for unit in Variable.__units__.values():\n", - " for item in extract_units(unit):\n", - " s.add(item)\n", - " for unit in s:\n", - " commandstr = 'from sympy.physics.units import ' + str(unit)\n", - " file1.write(commandstr.replace(\"\\n\", \" \") + \"\\n\")\n", - " \n", - " for variable in Variable.__registry__.keys():\n", - " symbol = variable.definition.latex_name\n", - " name = variable.name\n", - " doc = variable.__doc__\n", - " unit = variable.definition.unit\n", - " assumptions = variable.definition.assumptions\n", - " latex_name = variable.definition.latex_name\n", - " expression = Variable.__expressions__.get(variable, None)\n", - " default = str(Variable.__defaults__.get(variable, None))\n", - " \n", - " commandstr = \"{0} = type('{0}', (Variable,),\".format(name)\n", - " file1.write(commandstr + \"\\n\")\n", - " commandstr = ''' {{'__doc__': \"\"\"{0}\"\"\",\\\\'''.format(doc.replace('\\n', ' ').replace('\\r', ''))\n", - " \n", - " l = len(commandstr)\n", - " commandstr1 = commandstr\n", - " while l > 80:\n", - " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", - " commandstr1 = ' ' + commandstr1[80:]\n", - " l = len(commandstr1)\n", - " file1.write(commandstr1 + \"\\n\")\n", - " commandstr = \" 'unit': {0},\\\\\".format(unit)\n", - " file1.write(commandstr + \"\\n\")\n", - " commandstr = \" 'assumptions': {0},\\\\\".format(assumptions)\n", - " file1.write(commandstr + \"\\n\")\n", - " commandstr = ''' 'latex_name': r\"{0}\",\\\\'''.format(latex_name)\n", - " file1.write(commandstr + \"\\n\")\n", - " commandstr = ''' 'default': {0}, 'expr': {1}}})'''.format(default, expression)\n", - " file1.write(commandstr + \"\\n\")\n", - " \n", - " for eq in Equation.__registry__.keys():\n", - " name = eq.definition.name\n", - " doc = eq.__doc__\n", - " equ = eq\n", - " commandstr = '''{0} = type('{0}', (Equation,),'''.format(name)\n", - " file1.write(commandstr + \"\\n\")\n", - " commandstr = ''' {{'__doc__': \"\"\"{0}\"\"\", \\\\'''.format(doc.replace('\\n', ' ').replace('\\r', ''))\n", - " l = len(commandstr)\n", - " commandstr1 = commandstr\n", - " while l > 80:\n", - " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", - " commandstr1 = ' ' + commandstr1[80:]\n", - " l = len(commandstr1)\n", - " file1.write(commandstr1 + \"\\n\")\n", - " commandstr = \" 'expr': {0}}})\".format(equ)\n", - " l = len(commandstr)\n", - " commandstr1 = commandstr\n", - " while l > 80:\n", - " file1.write(commandstr[0:79] + \"\\\\\\n\")\n", - " commandstr1 = ' ' + commandstr1[80:]\n", - " l = len(commandstr1)\n", - " file1.write(commandstr1 + \"\\n\")\n", - " \n", - "StrPrinter._print_Quantity = lambda self, expr: str(expr.abbrev) # displays short units (m instead of meter)" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [], "source": [ "import re\n", "with open('test_definitions.py', 'wt') as file1:\n", @@ -2025,9 +1892,174 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:alpha_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pamol\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:c_pv\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:C_wa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:D_va\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:g\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Gr\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:h_c\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:k_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:lambda_E\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Le\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_air\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_N2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:M_O2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:M_w\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:nu_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Nu\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Pr\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_N2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_O2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_wa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:P_was\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_d\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Re_c\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:Re\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:rho_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_u\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:R_mol\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:R_s\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:sigm\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:T0\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:T_a\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:v_w\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:x_N2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.variables.physics.thermodynamics:x_O2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_Dva1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_Dva2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_alpha1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_alpha2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_ka1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_ka2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_nua1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"essm.equations.physics.thermodynamics:p_nua2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_g\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:V_g\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:n_g\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:n_w\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_g\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:Delta_Pwa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:x\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:p_CC1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:p_CC2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_a1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:T_a2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/variables/_core.py:89: UserWarning: \"__main__:P_wa1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Le\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Cwa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Nu_forced_all\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Dva\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_alphaa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_ka\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_nua\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_rhoa_Pwa_Ta\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_Pa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PN2_PO2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_ideal_gas_law\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_CC\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_Delta\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PO2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_PN2\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"essm.equations.physics.thermodynamics:eq_rhoa\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pg1\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n", + "/home/stan/Programs/essm/essm/equations/_core.py:107: UserWarning: \"__main__:eq_Pwa_nw\" will be overridden by \"test_definitions:\"\n", + " instance[expr] = instance\n" + ] + } + ], "source": [ "from test_definitions import *" ] @@ -2051,9 +2083,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "eq_Le: Eq(Le, alpha_a/D_va)\n", + "eq_Cwa: Eq(C_wa, P_wa/(R_mol*T_a))\n", + "eq_Nu_forced_all: Eq(Nu, -Pr**(1/3)*(-37*Re**(4/5) + 37*(Re + Re_c - Abs(Re - Re_c)/2)**(4/5) - 664*sqrt(Re + Re_c - Abs(Re - Re_c)/2))/1000)\n", + "eq_Dva: Eq(D_va, T_a*p_Dva1 - p_Dva2)\n", + "eq_alphaa: Eq(alpha_a, T_a*p_alpha1 - p_alpha2)\n", + "eq_ka: Eq(k_a, T_a*p_ka1 + p_ka2)\n", + "eq_nua: Eq(nu_a, T_a*p_nua1 - p_nua2)\n", + "eq_rhoa_Pwa_Ta: Eq(rho_a, (M_N2*P_N2 + M_O2*P_O2 + M_w*P_wa)/(R_mol*T_a))\n", + "eq_Pa: Eq(P_a, P_N2 + P_O2 + P_wa)\n", + "eq_PN2_PO2: Eq(P_N2, P_O2*x_N2/x_O2)\n", + "eq_PO2: Eq(P_O2, (P_a*x_O2 - P_wa*x_O2)/(x_N2 + x_O2))\n", + "eq_PN2: Eq(P_N2, (P_a*x_N2 - P_wa*x_N2)/(x_N2 + x_O2))\n", + "eq_rhoa: Eq(rho_a, (x_N2*(M_N2*P_a - P_wa*(M_N2 - M_w)) + x_O2*(M_O2*P_a - P_wa*(M_O2 - M_w)))/(R_mol*T_a*x_N2 + R_mol*T_a*x_O2))\n", + "eq_ideal_gas_law: Eq(P_g*V_g, R_mol*T_g*n_g)\n", + "eq_Pg: Eq(P_g, R_mol*T_g*n_g/V_g)\n", + "eq_Pwa_nw: Eq(P_wa, R_mol*T_g*n_w/V_g)\n", + "eq_Pwa_CC: Eq(P_wa, p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol))\n", + "eq1: Eq(P_wa, Piecewise((0, T_a < 0), (p_CC1*exp(-M_w*lambda_E*(-1/p_CC2 + 1/T_g)/R_mol), True)))\n", + "eq_Pwa_Delta: Eq(P_wa, P_wa1 + Integral(Delta_Pwa, (T_g, T_a1, T_a2)))\n" + ] + } + ], "source": [ "for eq in Equation.__registry__.keys():\n", " print(eq.definition.name + ': ' + str(eq))" @@ -2069,7 +2127,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -2087,9 +2145,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "c_pa: 1010.0 J/(K*kg)\n", + "c_pamol: 29.19 J/(K*mol)\n", + "c_pv: 1864 J/(K*kg)\n", + "g: 9.81 m/s**2\n", + "lambda_E: 2450000.0 J/kg\n", + "M_air: 0.02897 kg/mol\n", + "M_N2: 0.028 kg/mol\n", + "M_O2: 0.032 kg/mol\n", + "M_w: 0.018 kg/mol\n", + "R_mol: 8.314472 J/(K*mol)\n", + "sigm: 5.67e-08 J/(K**4*m**2*s)\n", + "T0: 273.15 K\n", + "x_N2: 0.79 \n", + "x_O2: 0.21 \n", + "p_Dva1: 1.49e-07 m**2/(K*s)\n", + "p_Dva2: 1.96e-05 m**2/s\n", + "p_alpha1: 1.32e-07 m**2/(K*s)\n", + "p_alpha2: 1.73e-05 m**2/s\n", + "p_ka1: 6.84e-05 J/(K**2*m*s)\n", + "p_ka2: 0.00563 J/(K*m*s)\n", + "p_nua1: 9e-08 m**2/(K*s)\n", + "p_nua2: 1.13e-05 m**2/s\n", + "p_CC1: 611.0 Pa\n", + "p_CC2: 273.0 K\n" + ] + } + ], "source": [ "vdict = Variable.__defaults__.copy()\n", "print_dict(vdict)" @@ -2104,9 +2193,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJwAAAAuBAMAAAAvlG0AAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmElEQVRIDe1WPYgTQRT+ks0lm2x2k9hcY5FKwSYRrhPJemhhdRGtBM01opUXC9Er5AYtFYJVFA5NYSleOAjc2bgKovgDV4mFkoggWMgdyaHxCMS3kz0vm012Jyt2ebDzZr73vS8zLzPwAE+L/Ty41Lz2sOpJFCMoVYTziG+IsT1ZEWDFgJr1JIoRfgB1HQEmxvZkNYAlBsmTJ064YFGl1Sep6860I4e+TDMnPAqJdayIEjmDVWjpAWL1qq6klRevB+BRS3XbijyKFlHX3uXtxJhehrr1FIt2eOQq0rZCLKHjGZO4nHyfWwOQsQ2lfRablZEKtgBdO8tyDAfQk9uFyEttBOdPY0XwLtG1A+5MPwBqkDtOOSWPElHmGNEEjK4d5PMaHXkZ6iWnXNTABwacEpAyKRnixg2NjtzEt4ZTLpHWLgOKYXI9TVnslpMI64EipFbqDZXqbymt3Nzh/RXgU2+1r5tFqHCRWbERrlQJfmRUJDKHXI2jValhemTSQJSZMxcLVzaPgopEFhrc3bKJfj8+y0wvze7Qwc2Zm0lXjr1HSSdK7OWvpI0p81u+0O1yVLlFb2jGRhixCBXuDouc+N0vH0cBWBvG84XFUd+A4St1WNIMEnlUgZNNGixb5++Rl3gXEvVrUFpSFlDnRTNceQZiTfOPjaSH07pjGCnQETOPyYeTw+XGQyUdyL2lnBIdGLdTXLRXu/J4SpytMGCqRdM5+uR7cpGjvocpylS3aFinL3Ljs28hnnhz4Rx5c0t0Lb6Gs/+m1pdNL6+YqID1QXzqr0fRdhAoBnVn7fz1KLXOq0JWfp4a3BwmPYqtJJMexVYO22LSo/SV43/2KH0/4zIV71FcRPZCwj3KXorbTLhHcROxx7x7lD8fURZXwH0iVgAAAABJRU5ErkJggg==\n", + "text/latex": [ + "$$N_{Le} = \\frac{T_a p_1 - p_2}{T_a p_1 - p_2}$$" + ], + "text/plain": [ + " Tₐ⋅pₐₗₚₕₐ₁ - pₐₗₚₕₐ₂\n", + "Le = ────────────────────\n", + " Tₐ⋅p_Dva1 - p_Dva2 " + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from essm.variables.utils import subs_eq\n", "subs_eq(eq_Le, [eq_alphaa, eq_Dva])" @@ -2121,9 +2227,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOwAAAARBAMAAAAs8V3gAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdrtEVN3vqxDNIomZZjLe39VDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtUlEQVQ4Eb1VXWhURxT+9vfevfuXlKJghW6tpT4Ucx/6UhBy6YM/2Hb3rbRSdlFsUrG6D22hTTRTxYooZN9WQdt9aR9aC5uCqKzFtQoRspIVSmuVkAUfFRJsajapevuduZrcmO2jHphv58x8Z745Z+bOAnjBtRHO9yn8j43casmM2X3B9gGQqsvwXbaRl1owG2ta4gOxG6krXg8/1dYCx2pfiavpAsd+W6+nezLkKt3tADHH/FCGE8BnPgAiRRl+HzhiJ0o4jPjfQLgfiLpulRMbFaw6sk3zU/yg6Gs6wSziok0/9PY8EGens/0BnJeZd7m+D4AVIhvoA95AMIOrwMc4fLbNDM6uYm0GhhQCM0jnjAKMOpmaTkgoRAv04wcfAG+y09leB7KKU78Ah3wA6y+R/bmMEHcN7ASGKkhS1hAXmFQI7UC6lC4hPg2PLjHRHAyJSCAPnNPUTjAL9Dqc6F2HX32AeExkq2UEC/zFdwpDradkOZxtDmcQoIymC8TaMB5xJoHJJursdDSTpejt4pTh3nJ8gJsim6yUkf525LIOzStPdmJ1iz6zZa23IcpseeqaroHHzJqwvukcqsCWe4THdv6E2El61r/AlMji4pzygdklsl+jjOFTiDicD5EpRQ4qizJa1jpzVSocewhN92KYhgid425CNkMKdJaZxWynhBa+nN/hgzhEtiqy00jwAuurKrK019h0tlhh4xVsneGVJd2L0bcfrK91Ty6ykSEss4Ui/4nAfbUI78k64RZlWaukpNdgeyw7XnkiG+1H+PqdR9B0DTzVOplS357T/I12ibfMeKWyDkeZ0JSzAJurInsUlI2UkHzIT6lOksh+yaOwtaxVQXCGo0bbFLoGuqvZEHJY7DF2hsnF0W4t7p1tmQNY423cnGb4jQX4fbAxvrtrU6Nx/xI/TMn2HVBFZD8BxpUOSrc92VgxLPQXdQzCdfzIm01KRIqUZTOP8xFZak+ei128LJVFYHU0sw+pNhIFpKoIeLJ14AMuwbONZnhpk/2YqtDXdIE7wCpKcijJLPRbZOybYG+JRRxzD4ZLeEvhug+4TkZ424EBfOPg+9qFz1lpZnsaSe4OLyskm/xuA8fNU0LUdIK1rTaaw4G9H3FMNs7P5XbUFsYSM0dWtuSWpgb5V7AIiPfMNvl2ufsQH9vP58J1/0Hii7lrsMYGFTC692QTGxqvArWGLKrpAjHXdXM+BR5+MV0BQ56npeYRKAadZWf7jPdw5sFo3jYvdT9jGW/5/wAdKVDfo2JeQAAAAABJRU5ErkJggg==\n", + "text/latex": [ + "$$N_{Le} = 0.888446215139442$$" + ], + "text/plain": [ + "Le = 0.888446215139442" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "vdict[T_a] = 300.\n", "subs_eq(eq_Le, [eq_alphaa, eq_Dva], vdict)" @@ -2139,9 +2260,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.\n" + ] + } + ], "source": [ "#import theano\n", "from sympy.printing.theanocode import theano_function\n", @@ -2157,7 +2286,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -2172,9 +2301,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 6.73 s, sys: 8.6 ms, total: 6.74 s\n", + "Wall time: 6.74 s\n" + ] + } + ], "source": [ "%%time\n", "# looping\n", @@ -2186,9 +2324,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 47.5 ms, sys: 14.6 ms, total: 62.1 ms\n", + "Wall time: 724 ms\n" + ] + } + ], "source": [ "%%time\n", "# Using theano\n", @@ -2198,9 +2345,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "list(resvals0) == list(resvals1)" ] @@ -2222,7 +2380,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ @@ -2231,9 +2389,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIwAAAAPBAMAAADEyjp7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXYyEM1Embsi72bdVKu+2mc6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACeklEQVQ4Ea2TvWtTURjGfze5TfPZJO3QDiK1i1AR08mxqSBCKSaguBTbbIIgRlGvdDE4aBGkt5P4Ac1QqtQPguggDuogTtaIg5tecRA/oK2mhVpjfN9z0v/AOzw553nO+Z2vN0D3jhwHsl/B2dUDrjedk+ZAD7FsXx39jD+bvartvdqXEMLlLVEA+0udRfcuN/IcZcznIM467hHOco3UpozE+LEyH2vSXpKFNIRk0BYFwGWila4qXeVEFafIGVgkWmaaPXX+yEiMH2qSfg6hB9gQBgPJVBRAZEN66SLOSjQg1eAeLPsnfTGPl1iTH4wfWdBB3JwAExJ7HGDEAIhWZWShQmgjHRBpMplnOXdFPPnsoayPOVRGMDZ0OgK5JREDIH2o+xxx2c16oUzkp85+k18b2lmSxlhGu23ffSHn8wVjwyeKUTEACuMk684KHZtzGcKKiay6azVew+yrvHSxfmyb3No+JrCh2y8EIwZAYYXOeS7ytjlXJrwq05KB24IpQYQWDKbtD5bIKMaEDoIxYgFy/4l1Ug+Hfm0dykNf6FlJEIvC2joU8flUTjA2fKcYIxaQLJLQ8uhqyFWmmrKFMrwUTO06zNQlMX7MJ9ocQTEaPsoIxlXBAqRkZDeIIa+faMB7Yv433U0rbzHGTzcE88Hzfp9GwxNfvAu3d6v0W0C4QWc1Mc+wb8svnCHkD+eZ4o6+mSxg/HiFpKyBlJ8JIR5IV8QA4BOj9dBhdxx5nNEct7K9P+jKuPd5qnXjSgWqn6jZP4OwTSiEimJEFCAldOozZL0SjAxIa7LVkgvu3Z4j4p0Xc6ntH/MuybS+1ncb4sz8rbVFAf/n+wfURvBtNAe4UwAAAABJRU5ErkJggg==\n", + "text/latex": [ + "$$690263.0346446$$" + ], + "text/plain": [ + "690263.034644600" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "vdict = Variable.__defaults__.copy()\n", "vdict[Pr] = 0.71\n", @@ -2252,7 +2425,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, "metadata": {}, "outputs": [], "source": [ @@ -2264,9 +2437,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.84 s, sys: 10.3 ms, total: 1.85 s\n", + "Wall time: 1.85 s\n" + ] + } + ], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2288,7 +2470,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ @@ -2304,9 +2486,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 7.57 ms, sys: 0 ns, total: 7.57 ms\n", + "Wall time: 7.72 ms\n" + ] + } + ], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2315,9 +2506,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAN8AAAAVBAMAAAA0pCbNAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzWYQMplU74mrdiK7RN1/7zyFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADSElEQVRIDeVUO0xTURj+6G1LSx804KCDocEB4+JhIjhIFxOdqGKFQeyNCTMYjAy+aiKGNiYgkWAcpCaSoA7chcTEREmMMUaC3VyM1EEXBwXig/Co/6O3wuBaB//k/Pf7vvP957/n9NwC1QrvPMCjWuFNFcGjehGhZjyqFv9Pw5p93lN8rKGRmzaUBB5dh9WTdcr00Ewv0GCO2OqxUgsJRUBuJqFJRHDhzsjtJ4OGe6S1pVKGlTn4VyDE2ovjaIuHBpUiiaCNq6VfZU87ApvqRmvBF9MkohTq6pT9g0CNbX3B+wUKIxeGm9ZkH4tn1saWknASC5gEJpT647Bi2H3XAcTTBQwpwkuE5zWJKIVuw/bsKtACXHMFd4fBsvCugGUIWaKlCWNUaWAeVhFjbBPPFWDKERRZJ00SRJRC9kl4qOFroN+Uub9Iu6bhNiS2ouQVOawN2o8jc5ENE4hrQ/E0GUwlBIUHyCkJInLhn+CGa8CSrVLozFqeB4LN0wmVDmeULB+dLuAc7bCgc1MrN4DxAyfZRR6Kr/TWhOp35Xo1qSiFDCWoofWdGubL3H2ETWhT8JNPBkys5Tg+03miKa5zgVIj8ALPCwB76BTp/jDqaEDUliSiFrrrghqGyNiZrygVsKio7jI/F60S0G3Cef+ozRTo+/CTeiFcpCSe6Jiijm/wDUoiHh3TQoIWDUhD2mFnRtiOlHaUDvHrp50t4GABZx+MJoR6xjA7SMjHVwTsSTEgVF+EZ1MSURK1EOiI8fzfjvQW/1g0/xR4awv5SA3jpEwZobUG3h/BGH994kFdsuyOxuBZkURbJ9EtlBPghnxp+m1aanvQ7UgbEkqGGgqhT5B2COzhm5M2HQTHa2PwraoHfQg54g4O0A4l0bmT6Bbq8txwgZbixbeHvhlwiS+fkE6DbrQY7zr9x9Bb1zrAGx/9SDH1eDOoc8TtXYVvQBJElMLK2txw+4fvTszBc5FPvZm/QyHBjHUB901rXGmkEZ58KIkWRz3PRobvKcIdtNmaRJRCd13UUcOobZ2vCGUQ6pkwdMUQSZ0uQAiGswkEhukfW+mxHoJz2S76HtjTVCptKUKg5zY0iSiF7vq+yeUTsHIPE67wr56/AbImTGJbOXpVAAAAAElFTkSuQmCC\n", + "text/latex": [ + "$$5.35695853236626 \\cdot 10^{-11}$$" + ], + "text/plain": [ + "5.35695853236626e-11" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "np.mean(abs((resvals - resvals1)/resvals))" ] @@ -2332,7 +2538,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ @@ -2345,9 +2551,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 2.07 s, sys: 5.18 ms, total: 2.08 s\n", + "Wall time: 2.08 s\n" + ] + } + ], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2363,9 +2578,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], "source": [ "# Solving for a range of Nu values\n", "imax = len(Nuvals)\n", @@ -2390,9 +2613,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 74 ms, sys: 464 µs, total: 74.4 ms\n", + "Wall time: 75.2 ms\n" + ] + } + ], "source": [ "%%time\n", "# Solving for a range of Nu values\n", @@ -2410,9 +2642,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAAPBAMAAAAL5A64AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMt2rmYlmIkR2uxDNVO+L8+I6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADaklEQVQ4Eb2UTWhcVRTHf/P15uNlPih0HTfuKh0lxY1tBpxqodo8TUaIGwfESqmQR9FtO4i7Cs0iKtnUobjQivpo4y52piBFUOkI6tIEkbYw1aYVa8okPs8597UMpG49MOe9e89/fv/7zr3vsWuq1QpIwm+er2GJ3PILkHtf0lutz6Q8/55Uluc6TBxPPZ9o7F8rrSfBKFaBVCOh7bwYbyGO47rWykO4SG7TJf8bnoPvuRDmG6y1We1k+2RhP5U4DpwGfonwr3EywihWgbThdtiJ1ng8CxmtXpwdwWH4w6VSg/N46+T6xW2qj/ARpS4/wyoTsx8kQn/fdERmnUzDUawCZx/maFrjEYB0TsITx19hOrR0JpSpUp3yqHCDar/wt0pehgtufaaBhUhq5DYcxVZO/o2HOZrWeMIpLCrNHK9GTNcsfa5T1TqFbbmutUvrOj7zKS85R9MYpdelqMsRinPMTfyn431eSWHOUS57I0tbu5c69BoU7oH/KNXL84ek/fFrAzJHl2qqV+FCREWecVOGQnGV19XRn18KVTQWok14smwL7aos9S9L/labxzgVkLpH/sXD9K6QHsArWxGlKK8OJhSKtHTiroyFYhV/UR3fDvOBTI6HaB0Pf8PNO0c7aOm6H8OR6FSDlK7gbKe3QXZI+dDeGyo+Jz8TCoVP+Ek6n1DOkUMc/d9ZqalyLNTR8Yp9N+0cmzqQdEda1rnfhcpQTqu3yasU/xEPZkLTWFcpH9t9GxLKTPiDOmauLR9X0Op3Gpf1Vncg4aW7NmEnh2JDBpr2iKQtO13ezoeUttN9vLsMYXLwlDS344RKkcjIfihFK6cDdZQ/7gjRGs8OpFXtGX9EDDQd0GeUV9AbVUfiKG+dt6mdy7RvyjNGpnHPiFqYh1a+mmrO/LZYDXYY6uqMJ6tuuKo6pgKKoaXJiCPuC1Dpkh6lRmTXuS6nIxT5Hic0R2/IZOgoVoFKnbQ4LjrsgyyO7gvAmlR7femlOJ5ozT3hUiaQ3ZfjeqnmtfUrt49LA96NOMabeNedBj6MKH7rXxGqUqwijl3d1ZXwgZe7Ea3x4OTADl72wNYzXI3jOy4xN1uDL5cfh3eaH8s3/aDcpabmOuQPTkWJ5ulbX7dpNTuCVIpVyH3xZ5ulo22ZHA/TGm989n+5/xc1gERnYT01lAAAAABJRU5ErkJggg==\n", + "text/latex": [ + "$$7.122603685219754e-10$$" + ], + "text/plain": [ + "7.122603685219754e-10" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "np.mean(abs((resvals1 - resvals2)/resvals1))" ] @@ -2434,7 +2681,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ @@ -2443,7 +2690,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ @@ -2455,9 +2702,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 7 µs, sys: 2 µs, total: 9 µs\n", + "Wall time: 13.1 µs\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", + "text/latex": [ + "$$-1.0$$" + ], + "text/plain": [ + "-1.0" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "%%time\n", "autowrap_func(1, 4, 2)" @@ -2465,9 +2735,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 76.3 ms, sys: 4.05 ms, total: 80.3 ms\n", + "Wall time: 79.7 ms\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAPBAMAAAAMihLoAAAAJFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAEM0yVO+riWZ2mSMU5s8AAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAsSURBVAgdY2DAClgCEcJiZRsRHAYOMjlCSiCgzECWAZxIlnKlblqB5B4GBgDVtwt2YFScIgAAAABJRU5ErkJggg==\n", + "text/latex": [ + "$$-1$$" + ], + "text/plain": [ + "-1" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "%%time\n", "expr.subs({x:1, y:4, z:2})" @@ -2489,7 +2782,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, "outputs": [], "source": [ @@ -2499,9 +2792,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 78, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.15 ms, sys: 287 µs, total: 1.44 ms\n", + "Wall time: 1.45 ms\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAPBAMAAACLu/vuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVO+riWZ2md0iu0S3uypJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAeV7QZIQiyBYA6TA+MehKhY2Ucwp5WBoQghysABEb3GwOAvgBCGin5jYHjvgC7K+AsoOgFdlOc7A4M9pihQrX0Bg5ASCCgzQG3DbgID0DZ/DNsY7jIw9GO6DM0XnEBfyCswcDswBiMcxpX6aQUDdwIDY+U0A4QoCgsAmwIj8jixtwMAAAAASUVORK5CYII=\n", + "text/latex": [ + "$$-1.0$$" + ], + "text/plain": [ + "-1.0" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "%%time\n", "f(x,y,z).evalf(2, subs={x:1, y:4, z:2})" diff --git a/docs/examples/api_features_files/api_features_104_0.png b/docs/examples/api_features_files/api_features_104_0.png deleted file mode 100644 index fabfebc53e8715139d1e6d3d9db53c3d0ca87cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1436 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 Hu0mjf&X5b> diff --git a/docs/examples/api_features_files/api_features_119_0.png b/docs/examples/api_features_files/api_features_119_0.png deleted file mode 100644 index 168bfa3a561f2db3cb49f387e831df6c77666394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmVe5ng4MWHxPhrCIt{uL7)RNbU->FNd{j*f0qUQ*su{-K;wDmXhk zdsHFL**QKwz7Fe?#C|i?kC3nK4A43DAR|88_zb#N1#W3VtGpA6cHg4BXyt)BO1kgc z27aJu%S&kAhzKZb3_oa#Hhv5mYv|rlJ)``^*eQMesLikGS9Z?O!hbFZ{pc?JHf$&S zGd|y)d$MOJu4Z(f%Q;tsiFt0us=;}-Q4H3jk%EkSluwlFExkBOC5yg>srzow(>5SX zx~!AFa;3Z9;0=g-fupUC50smMiyB-dQ#@dxwEWti_0ZOygE=K!>$fMNudHWilU=KR zEajGMbU5$Ize$$1Z`#TDu+JxC4#m~1?sCposm(k#*NpMaSY>?K)eizUIs9N@+sVVf zBp9_xWnjDLy+riu(Zd@kpF%F}hZJSx1WC4t`%uui(3!8mYsb6jCtjVDlPku+X?v!n zt^GZj;;TfKj}mj%=B^Ku{#{!5hx{0}mo>cV*N+G51#U$5kk3QspiI}h>yy$>+Ecp2 zhO1Cx`_P&}w;QX_9Ifr*2HEYI2`7bXiD;nYL<+g!B6*iZqkoqoZT?D13;0te&1?F- zz>BYEPI~B^i$})%l}$2rWVVTRr6cGQKi&WM!5!!>$IJE%t$aXyP4XN{d1V_~zh=^# za0fQ^a3z1zH{|o+8YNkCs=FJwi-32m zo5(i!d$8cq`G)enbr8X0atZFT0ovGu(}XO?b;Modyl(VA25*wa9nz-vVBamd4n^Tua zUK{#X0@8f6Wjj_ezCEtF00;M}maf;AkK);C_edo_;7(!V;1~nWpw|{3Aq=)GleS}P zd?vPI4_h0-DbF#BN4YFB*|Usy_@tF5`-Qe&+00KnY^sjbN$xOhqTltSx+!^%w6(E! zG#%Cr|EkYRpFlS(Gx*@yjH?OV#!U4f7rdeC|ERH{yJpEYW2YD6Iab>wba9zSot&fn zHDlKJq3^!*we--%W5g2V^dso22Nd~$m|Qh+@O}+V=vYXJdv{TTtPF7ZB7v(1q>i2P z<~wIQUiP6|rDd$Us11KRziuLyJkj3LUC>lM5ByraC6lqKxPrc`JIQg)@;W4(>pJzG zu{MwM;?dt-Gw?&PdJV!76xKajl|)~n%_m#uc^~{`PaZT+6V1!?so(m{$Ip;&G2h~Axa=vRg0KtH|J zpU)~~Yzbnbk1R#Ht}v&=yra0S{r*zqjo~K>vQBUJ{gtS*s~f}GrE!K z2K0)#Pd`q<HW6Kr&7I|s=JM2fJeaiAJIEN?>|2mOycE%gj!v_Ki~cO<^LO#d}S{3!K^m*0|#v3knrG!X~SRetoku%+B)g3l4(>obTdAmnh&yL?bhOIM)$Hl<=m0)8W~4~Ce&rI6*?@!t8 zjy?DYoewArAWu1^4sCNGm*eJVs>L34d4D@exI5H;KzDGwMy9%@_40g5k=HLsE7J`^ za9lW`5s5r)^1(-0ww3Fnf&B_bX`wTqHvL!$rUQ@mIyZeLxOOIF_0&yKgbXO)2iSoGXk1(HA7d;spXNmWgkIwn7~Cz3`eQ^3 zs#80Y*nWYP{6nDAuH>;E=(H`v3IaNtl3}YP{ZSE-gFY3Kv`P|EPo9`%E#!G6-Zn`i z_1k58j(y5EW?i#==a66Cu$m4PX4h<$%v+ZCF^ehHgA${ES7~jMq;-r?xTa-y*M;p~ z!^{YUB#rpG3ncYmzl7|3U!`%I?=+vAN3_Y9pc7E~n4?#=G?y0FK&KK|EQ>0yec3iH ziv)@|S92O|k3GyAbl;3cXhEw)==`a43PsVKm@=REiC5Y;eDcfb#I);j25nk$oWUEA Q$^ZZW07*qoM6N<$f;v66umAu6 diff --git a/docs/examples/api_features_files/api_features_125_1.png b/docs/examples/api_features_files/api_features_125_1.png deleted file mode 100644 index 56bafd5c59f2098f6319660ee99510958cf9553e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^5O=u<5X=vX`tX_ zPZ!4!3&G?+|Nq-F>oN+P@}{Sx@Gw65?x4e9Je~EJ!t^#NGwBuo2{hap8; zc<~Gw)5Q~eP7`O2j@Sl?6iyAsIgF1shiqiX5b$GQSSS+7 UkTHub8t6O*Pgg&ebxsLQ02}v0`Tzg` diff --git a/docs/examples/api_features_files/api_features_13_0.png b/docs/examples/api_features_files/api_features_13_0.png deleted file mode 100644 index 97e1ef0d316cc12eb3b8b2d54d329c38424145c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16681 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 aRS49SQ-HUY{2RD4L`z*yt@M`dv;PO?6m`)6 diff --git a/docs/examples/api_features_files/api_features_26_0.png b/docs/examples/api_features_files/api_features_26_0.png deleted file mode 100644 index 141ac9c977f6eb79c0e49f3453e32b1336de8e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmV;s0!00ZP)P001ip1^@s6jawtd00009a7bBm000ie z000ie0hKEb8vp z6I7C64|?Oyjs-EX=A)#yxnn2=OvPfuvNP${Wh!IjC0pJ2hShy+oNLIOZ$@4cml1TB>a9f|>z2=oA(Lk@Z%A(CgbC)tO4@rjX53H( hh|>OGj{eE<`v;^;B;t5Y8Q}l`002ovPDHLkV1f#~Ov(TN diff --git a/docs/examples/api_features_files/api_features_27_0.png b/docs/examples/api_features_files/api_features_27_0.png deleted file mode 100644 index cdb905bc0af8f0d824c09a26e83a145d0503b707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1418 zcmV;51$Fv~P)d=nu~E0Nf3q+r2tG3!TB;UM+Ddz7>M8?1E`CDG8yUCdP#7z8+hf1oXQyAY=4 znzeyZV@9tn0zBOmWz6P~vF~BE;}#YW9qjp=Mk z0B`^Rg7Q8<$$$vZ_kHj$%F`Jb#u%#z&L_B}z40#!wFxk<826>rjI2faoG>Tn9yN6W zCIg_hd|!}SZFvM(d*NS{r4uj?$n-TbIekr%`u{BaE!YJ}iC=>vcO zVlkaip?&U@5ZHaR62Q1W?~#9R?a))@bk(MMT667b0p+3iW$n4Tb{x9%4gcbe;YtF; zWB481^d+xfx^^Jx0eoW`6Xm*d(ln0r8lF82G-j|zH3BG8h@-f**e8WeCkP!swJ5I6(Zxt_(-7Ej1pwnzdYD*af+Llb@0Z??-ZJOrzIbt0H zES>XhZtzp?Ts$;4V8?}NvA%&$Npm0SY4F%B10?&d$G&fz3c_e_>7jEz&c>REo*}5Zl{+8D^1$F zDJ||3fQ*e^09ZKo#V&&=_i9Rj;BDV!NJ`$zBd;(94T}5i-IQ2Ea18D|`8=6kz=Nm% Y0Re}pdD5JPYybcN07*qoM6N<$g7n3xng9R* diff --git a/docs/examples/api_features_files/api_features_38_0.png b/docs/examples/api_features_files/api_features_38_0.png deleted file mode 100644 index 4fde2e2215a5001b2dc966e4fa55ea45e2811800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 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 R4cY(z002ovPDHLkV1ilhugCxZ diff --git a/docs/examples/api_features_files/api_features_48_0.png b/docs/examples/api_features_files/api_features_48_0.png deleted file mode 100644 index f5cdbaa6730310bc1f667a9117f9939709808928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2311 zcmV+i3HbJjP)m75bO4ikqTCHE*l19&m2L}h|^2hSty}!J?eB(2g z_#%O!5;#0Oe5X3EEA=i8l>z8p$p3PMX9C@YOE1wy0)r(W(4ow3yNdS}KfM(*{s?4$ zT;VLD63R;r^ojh_IN&ca^qT*(Wb-lR?<5ePch&K4c@)8q7%E77e{*@zGPygqR#9;! z=SjsBa`&%6}kWdBt7q*~_bwh(`%K58HmUsx%u5(_6e<$q8D zknW{B+Dops$do1st$_Qw3a~7P@l$kQyE~y4DY2|K)2e{T|}*xO_C;@y&f6` z)4Maxp}w2;lx9+!G~F-N*~ucw1lW?8^`0)u1dUPCauIN+lxYI9yUc{x|eqARN9XAL?D znU#)vA;Bh%AwdH`PK>ttq1m{D2ldV5+di_bPvg63Ki5_#%U3`2@jYe&VzwAwtKE)e zfV-$WD%#rk8pE_8>;yQ5pfp;JNjV|CWd~2|%wyMnt}nZo<}U&tpz`L`>IYzprp>$? z-QaNUphK{=3D!g~2{;Q^sqOp)>|A+tIrwhe&vjMuWp1GvxT2-J_$K*R{*FAF)thnJ z!?ZU#)ny@|o!0K>BCi|>=nMByeN_)dZQx>G8~9K=$EugCLCXqw@&E;8uT3V3BX|V|fDT|Fx0kM*^k;daqkTT1WinMBV0~=)(8z~&6aw~h zD{Bg&m4^`y8(G^vt@5mYrNd#t(-4<~?{_|5X#hu|jU|;UuUEUiJ&UVu7~gC)odob) zo=IymA-2JWe@bbMF+I%BWz1FJ| zqv;#^wgf)R_PPT~uck}1d(^9^E23ah)o~{DtKx9#A=w5>N4i8eAprsGt~~qf;1uWj zgA?-UX1s6pA71VEtu#eC$pO=znfnssEZJ^v(1~#a0%!*q=2%VKNj(r_ zH$Jhd4ZpFrK9+Do5*PwHyCTV+0gXu(S}ft>Y)m|ljaMm+)^~t5mLZ@+)7|K0gLS&A zu#Z4?#oL_v?FBk%h}QjFo3K=ejVznkzmcZtg+r}+G~EDvh+{F-t|*2yu+VN#0=+;d zb_@jRDBi`QfWwV?0-4fWp=2Mw+v+cSx;Dv7C%-S~!ix+Id+i0I0LIk`2aV1b4$~3g zGLoSZ=)4>jfIi6cA>YjFsnTe%E{9gc+=?1k#x_&TMjv$5u}cv;Z$m(hP!$bDz#l*c>1-;su2XYqY|)UL02 z9WuxwFA;`xI7V6)uK>i$9lnb;zS?12qT|&GcbCrVLJ8qL@; zI`?!#2O|M(Pe4-Hs<9b{{~eIInnGPpbmlwO{Y-$1qo1ETG$u*|2>b zdpR?=8D|0<=64dWca}X}HnlrT@REmrvzo3<8aR2Zyh*&?SwPn?yW7rU4=3MhRwF-? zdA+lMZrcdEet*2)@$N*4F3sp^_bR^Z>Goa>ThZ;{s**$=4q8S+rj_<002ovPDHLkV1oY|T|58) diff --git a/docs/examples/api_features_files/api_features_52_2.png b/docs/examples/api_features_files/api_features_52_2.png deleted file mode 100644 index c99312f8cfa46c39ce59bf8470aa68615e869335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2164 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 BBgg;% diff --git a/docs/examples/api_features_files/api_features_64_1.png b/docs/examples/api_features_files/api_features_64_1.png deleted file mode 100644 index aa85b86179c11c4255bb6667e803b07787745ec6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9773 zcma)icT`i&_I5(=2uLTWA%G2tQlujSQlv?fUMvCWC6FL3sPv+Q8mcIQg(60Ji&TLi zNEIP;q=%vqmG(RFy?5RFt?!=;D~H8o&di=Uv!DI!XP-DzV_kL@Ar=q_#ICQWZ3Y5? zUjZKhCI+B|8GXA7_(KSHFq*v{9MB6sA@xY40v^4;eI6wHA=6v3(f!KjT8XB5wo0KjkDgJAmS1D!nlp}SIk$TG# zW74-pUWJm?VWscn*x1;jJ}Z63(@^O9O9rM;DAwSAzp|%toKCW>@!rT&4m40^<4S4# z*(vN3I!pF)e^WwN#RW7!udP*Ffop5;U~yr#IS=YPB%#pPMRel-+qFs|LfzhvK6KCK zu;2!>fws2$#%zqs%vI~k=STf7siRcA50YYou;_|1JJb&!|4w_RtzBd#Vf0WbVCLWl zK0sakEEm`7bjDMUtGxKH zQ@gyWLa-mKnE3wuGEf(=_xUY#u8{}ix~(bmYGqvuvxnSVDej~QjSoJYU64%DkH2H2 ztN&q=Fo~W%U=TtCa|HdJd+-rwv}4Hly2wp^>bMH-9V`NuXpEJaoA*iU1sWdAJw#Cj zd=z3Y{Q5WtLZO3*=<3g?oFsb2;?lFm8xYkdotMIHAC4nNC0~R($%e>?%C-|r>jPqA z^>&XAT&)`gq-#&(ez@Z4<++zDHOEH?7N|`Y!=wpN7sz3LkP{8M_8!atVg&8e(q88N zOiKtB?Am=bD*}a@(W7cN)xX~1R9tv^_x2~-hyIiZ(4z233f=XN-J1kv!NnJ9Xm&Rj z#0KU?uAJ zWL~waT%6a>Ya_+fhom&{SKS{fR&P7OrC-&r{%Cu?tv19cM}l8>kl9_cQBC*2UZ8gg z43S+8jJ-FKj{2$>9Jq9XDF|pSQ+q;9$9XC^;b&eP5WnVB2)~0(73a{2 z+(Ss+S&Dsu(f6A+lU?Hr+03i^*K*!RTE1;)I32b+8pZLhBvDZVL;Gg^rF6{g^XQtR>mhg6_ht*8R;fr%g54kTz0+`K*$1=M3|z$VHjWlN}t$V0*+xzl1}x4I>_7E)bIziw3D zP|m(eJ!7>?qF>!F)c%?)60^|-8j1)~4noC9ja`f7ua)2bj6Vksv)N2E`=g5HhrKc; z%Glj=z|be($$MN|if!Xybs!FDlZZOnEMLt{KISUH@9GVv99*daT#F@5WipT-xxyW- zU?BXrVOZmsd8jz*wY-p=o^tkaF<)A&US$0|hZ{-g&z_MoHpv|Dlyg^Q5d?gHG$p^9 zq_EhT%lry z*;PIn4)gkgAR**x8d7fL@7Sj)B>rgm`kkI4vDY|YNAx1Cn?=aY!pSNedy}#&Ztlg@ zJ5K}4m1)L!Q~)-8yGgYP^w#QQ9;$UVrcIL(m~X@Fl^9nF&DJL|xQ}R}KnfC8RYF}% zz8#*yyFtpZWE)>V?e>~p9Ex2MjSx9H^g-|F!+}lzX3lD$4SQ1NzY`vUg_tVczBDrEKe?LL4OT=9E|lfF~p4E!VhG)?dHEfN7uI z;8#5SS@dE&G*0rYtOut(&B?lb@>SYr{JtviPoxHr6U|b))@N{Y;^L#*YDCW(^yCwa zDB%z>N+1e>DBvzo1GuEC9tsU!iIbdZqRd1KKXc)jmb{^=sly&AffzmUl`o4^1gy$M zc|vnOWQ&qG(SE3#jqBK{BscevG#Csphx2B0^0kavS-g`>VM z{vLOK8Ckub$UqZ-sfg?*2or9joOs@*(`?K?2yymS4NAgEfo(f>#x6H2|H!HnPCI4F znF$22+R8g^Atv)(OJsbBL0ruqeirBI?=u{mq~9h^1lQxntG8_iQwWAL z;xh}@B>)nYn^1Q`roN$T$FVZg$@STVEoC@lStx{FK>}Hnl@+zd&DEU^pb)+!j1o2f z#6&r}J_XI%Ln^_I^AK_fLNij=ZhTjAF2#|!d!xIwqG_LG*)W?L>nYamv&jmZ=y`i! zSV>`07@Py0A@t{o(61!dyK8^6wcpPc#yEe@g?o5QCs{i}Sd%#a8;i^?IEB%xY@ED) zu|Qe=5Qs}tzLe+Lt1oBy3IGs`Y}kx`f4O#d^rvKrQ6b<`*tX_hGz=VU0cwG38A!Q6 zYJ7&pkb>-LJ5aq+`nqNms#p6DmlU)%QCe}Xtxv)MpADo2V3_Xi<|%cbW~Fh()dZ@` zay(d*LjSy3yMFmELe=R}J9X8z@!leEs1QbiRU=L3WLD#2KNaItl^QpZ6w<(Roxv}| zr>Gd@|LI$m?_&Daqf-Q*h#aKc?hUHviCn&|oz)XIspvMTxZ<{&X$x>0rQ0iJwPa<* zU(Sk)X+; zJ}vB=>P-Chppf+xq+GWtbzWS2{L?Jks)xcphRWFsuc%Y>Bnp5lnpwnjuk~gC!--Hg z#%v)$<{D~8i<8~Fj{h=s2`B5mXAfMOJKAT(-_e$!wxpqVEd>6h)GB2y>pypmRY;5!abz_X$J1rPN2P14Z(m3V8Rgr z(^JH^mYeBk|3oVBmiFBQhtNwG?HJl(V#fXNg;gDy+(sFCc_1>vp4smpj5L^Wi9O3aiC zXubX-Xy^9J%F_Cs!KAc`F5(}YO(l*uGd+FeZ*na(7HY2B{{l1u&6JkDRQy2A&>E@=WjG5_pJe0eVCLm+4RaNM`1VkJl8qj zOeawZF_B9&Lh?YU`}r-6&e9zrg>l84LnwfMec-r#mfnCAW;+@F@aa3g_KAS@{wTj= z)n|7)w;{J}0v90)X3|h>Adh70@)zITkwSWL%eR35Pj#x_zl~}EFPoqdA3FN|Cl3Rh z%W;;~oyl|v8lK3Wd~_Iw*)I(0i&*a)W4Gq^p*N;Uj)y4O(&&Oy=bB$4My2+qRAlEH z07yi9c@EG0k{@#I_z2j*aCwfvyNC(U60HMQR7x!EAJEU=j4bY*_NJF7EfwNJwzlVzSXFKd)=SOv^j99>h z8AE9s4VUK*UpF{qM}6fs{|^-mzI%XH+>onX91;2*K5P-;N-K5kZx>Fb(_w zQ7C7e3!xAnxOpKimdUqIers<6?kVuW%Pt`7w@+0t!w9XSFq%kI=INZCU~mH&GLVBP zHLEh(Tq%<~2S4C$rsz$5*#+-rq3K7q74L1tp2=?oiukF@tf-yk8n^$k6q5q|R`uxq zkaLa~Hu-GW>W@32AO0h#3W=}%7Qj~YPG@@4~V%Ud7 zOae6n6ysxuBU=vH%UeXlcP}XJuLFzbq{6P9+eaG3L*%bnP9Q!Gzice`9Ftd z&bqZCg=(oVegOnzE|0Njt0Am7{2q&(S2j}n_niPc(=yB$M#J<99*9i~MZ(?~ekV39 z!HwpS!7mG$eMY8E+*6NinbO8g0dgZ_lq*o&uek52xK;|xtYNpqwyNpO^sXrRHWyd7 zAl@}bdU2mD%A` z{P3W%MWw zCM5duU~lbiMJL@oL>T5+{6lpY-S8#Jt*Y{$jIZXf&_FyH(z)QS$l{sr_?*>zqB2vgi@7oidZ5RZlQ zOec;u0Z1r3QRKB~i2nG3_jj@*OB#*LaF`+#+WlvSc6ppf85PaUBbRs+E9X)et0xzs zE)u{d=T0Zn2%=^xH(e$s`2%&dcY3hmXOz;@Ki-gu;!A^Fke32TwKKv8H;(sfz~hW$ z@!Yb)u85>NzeoKVVC2oTZOB;r4rkx`a^j9?WobLH{PSK_oL+sIy`W=zo|0_i+K1_I zeO=ho=XCV;2Fsm}D?!dr8&GH1N|44EH5h+g&ftvSh2u#WN5WrPerZJ>M5av!2hkco z0nD++OC*+2c6#9tBNNuxoyv*nK*i<5E#%5m+!yR&EM1t@*_bDGa8GHgzAX!y_7bfh*G7$_cIGMs)@XVRPg zVh}~%ui>QIsj&�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 diff --git a/docs/examples/api_features_files/api_features_67_0.png b/docs/examples/api_features_files/api_features_67_0.png deleted file mode 100644 index e8d5523801c5e184dad284e63e19b2f654ad0707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 S$zAjS0000>!zknOB}*`r}Vhl~j`DYu~#U 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 diff --git a/docs/examples/api_features_files/api_features_73_0.png b/docs/examples/api_features_files/api_features_73_0.png deleted file mode 100644 index 1a5580d48345a6e20c3699e3d9853a17bd3766df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3163 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 BBgg;% diff --git a/docs/examples/api_features_files/api_features_75_0.png b/docs/examples/api_features_files/api_features_75_0.png deleted file mode 100644 index c95517bc4c52dd6a52185e4128a27dac5db143c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5289 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 diff --git a/docs/examples/api_features_files/api_features_75_1.png b/docs/examples/api_features_files/api_features_75_1.png deleted file mode 100644 index a18733a3cb42b3ab910d140d9819c24dd1ca85f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10644 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 InqB1o0aKoUy#N3J diff --git a/docs/examples/api_features_files/api_features_77_0.png b/docs/examples/api_features_files/api_features_77_0.png deleted file mode 100644 index b9f9fe56ffcc3bab4d0b850adaa68b35ca9d50d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 D_oM15 diff --git a/docs/examples/api_features_files/api_features_78_0.png b/docs/examples/api_features_files/api_features_78_0.png deleted file mode 100644 index 0792f64f10aac78e0b0a22f0cb7376ba6f7f3430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3687 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 FV1n9*afSc@ diff --git a/docs/examples/api_features_files/api_features_78_1.png b/docs/examples/api_features_files/api_features_78_1.png deleted file mode 100644 index 1b6b2536683c0e1b78ba899ab6dc8bab17e2b3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9821 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 MtEL9E`pz-`1&j)zy#N3J diff --git a/docs/examples/api_features_files/api_features_91_0.png b/docs/examples/api_features_files/api_features_91_0.png deleted file mode 100644 index 3f5852f166179430e96e18ea456e7cef77ec30ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2278 zcmV!!f8%nWzEONvD6d7C2KKZ3PG** zQXL>a#`4XiK*FYi<0ca`l0A1hiPs zcM4cUvzV`xKARh8r!xt8%mR6`(XD&o;enDZp$fJ~rL_Ip zQ{C#Xd9bjt`$kH?RUSpRZS>M#ZXr%ph9#Kman~|3^WdH5mb!vXTInD=Nyq^bH$kyq z0a{d;Sg)uYApWqt2PWDJW)P2(S@&f6V3nOv1zVyHw;DuQOoIfQ4z8p`{E=&c zB3B}o=}f^0OArIkm8(7F5L*Op<*78&&r9`bz7F-Xp|LWH|E+{)k;6V>lT?9Y8G<-a z1k(nugAk76deS0RANVI^IG|>!%SA#zyO8Fd70>~zE_d%rqdTW`#X%=Z1LE(-*B6Ty za1Q40>u;I*F*193FYG!#e`I;$R&a>f0QV(s5U0h1ZxR$5*X>GL_s_%Tz@`{W2>1ZX z+gJz6qbv5JT6G@RiPt^QaoM`lLuD2p_s#twvjy;zV54~BVnSIoGQfo=H@;!j2PDVk zyOj32!m=|Xpfh6joC4UCHVb&tryKDyebe4%4%c^IyQ%9(%FF}DLzaYGrZ%u)@=*|= zql3m1>FauxmtSz#^3oFkG~n>`zn{Afo=WE8LA)G2z~!7grBM`?&F$PN?MUSS@`K7* zwpXee=+(e}FUO-}%T6**Z%oX`6=<?E&J8}5FGXBe4UusSeUl93<@lIhD(`9<&>$p!n|gEpT3qhS0G!(f zA+~hPXKB@81%Fz;#;J~XRUZk^P=ctm7+{4&rP~Hk+_?%>Ju9fzEt9z_TQYNxH9V0H z4y4?i8h)6-ai{5vDe+h_z+btrC6-Yq0a9Agc7pAO=L!jbsr`aYM5SmPBnaG-(5$}sqUC>$z}^D8$xCx^sU2G(&(w$W{gmeYudY{jXjbVr(m-O_rnoPGiq#xI3j1{Qt8%7E=Qnwt z7s`iMYg9IiO=8Kx0*D9hUV(>(7{Wb(ctETSULKKoe z_Wssm?c;#K>%a!kl>SFy4o*CqzYXw6M*G%BV%b%0hvsTlsY?TsflW$habZvYx$<21 znF64~0>py^sCbExaz|$MEWg2+bKnH@UQQl}(tiB+#R0b)yJ(6N+w znTBR}d?ZluV1z|WG?gUJVb7+qFp^r#Dwh^Coc;3fRO->d zuqJVES~vmt=mFN(Yj(`^HiB-oUn#FvjG=Ke@6=};o zWYxNw=5>R=n~^u%V181WE7&2$GI}N(k7H~?K+K0BW>iTk}3Q(y98D;`M12cMgXg{hiC0J84r~?w!*g1iOcGTWqL-@ z{HRWU%>#x_ZJuyemMFP2J<(sj&^T2YgEMH4Qhe*CUYTXJ@>M#P4NCVPmocro(niVx zWQ{2#zJJwY`2d;w_cyUZv5hYeZ!mjars?FLjVDY56h@uzytlZ-}>O@y#CNf<3-pCHZ&BGlr(laV;Ve*x&Tzk ziwM5Xd>^LKd@7Ba&nh`eW&zE8<3u{N)pT+*`$?{5MrlCGWeO$4;9`LIh%xU5QfCAR zw*_RQW!AlNf4ny4fJR=yW(L<^1)HgLiCBugS2KbmuUwSQe$%P1XKDd-D86%{q57C& zpvL8ENsp1)-#6~WwbCa9rI{hpw_&7^y3e+P4x~`P#U>{2?4e|0-f?pumhojc%sAS; z-}(>_zM{P&M;q7oI>$-Z(^b diff --git a/docs/examples/api_features_files/api_features_93_0.png b/docs/examples/api_features_files/api_features_93_0.png deleted file mode 100644 index 3d95f54c137691b2dce4699905a041bdc3006a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2307 zcmV+e3He5nvHQ(ISj{>3Dl!2XGZ| z&;fJ+qyy*x*bZ|4pVu<-*RwY~7;>|kacs-7zAX9K-W*OWICRoSR8{y=oJuQbSh?E0dDE!S0E$*yzNL(tq~5j~8Af2yYcy5YZ7>7u+; zNsk-qJd)f;3E61O&^dp=0h=;^M4Ry$Ks*3XW_`9L&;N?&M`2#5{3|{i(^LJo>c7dU z=X&CSZr&gG=tarT*~9t+%)_3~q1X9iI*QKAXj1oRoowdSz7+F=RuS=A6*3tI^=NSF zac}&p;bjZ<+%>(iP34oyso|Dt(XsfMuY`N8l6W${HeEv|I#s^@e65xaoQw#rEQxH~>JgpBS^F};!KKZcag{3RghPJvB{V8* zTKJNhB&p^(-Pk0I7JI7rW4_81Ptm~xndPPl?vs-Xzod78&wOEH)PgCWFVTv}(3eL@ zY5>Pzj){NXj`A%b>8kgA`m_@G~#&WQ^5)R!L7X>*@lq9dtT|5o67mW-bk_WE(}2ao@y zZQ@wv4{8%Eok>i9FB*wtx_+f!z!&pAy~16qjd^+wf_>X1NxZ{6GyaDz7$b*Zxvq_YVmB(96|HG%3KwWMiB88Y0{N)XZ!F| zf&VV0d*6t*un6c|=_(w7$JpZ;9pMq_nS+jOYMGCt%+=_Sp_25Aa;rP*3|*u#-LpHm z#&{UXVxzQ8!>i8RDb8duxar}tz-oz+Og=1AzF1j=G>R>xR-E8;^>CI2>#a^r?%tJnsfxy zD|jz~GSyp8`g^J)04F zmtYB;9#%>Mvsp4W43hsqzq zE#6r*UcDPce#BmL9VU3<^YqUg<}=|eo`ao{Pj)94&U{hXVtk^0%p3ZAi8jjW`tnEw z9=Jd+?K}i7nb`fxXqX@U7r&|+|3`)0^GrJli+3iTqc5MxejZ3ZPxxQs&K3lz&8C8W z>39oH0MF{tF(K&;`DofOo^hbJn%7#Z>8G#K=ZGSD}CA=O9EO~k_|=`0%h z#A?r$I4xBpJrbcB8LeaueR&usVaUzcMp?4k|E4O`7Q~d@qvtf7KoEZrO*#@WQ+Rf$ z6XE$il3j@ZXjw{nru|ZoUO12dwWIkhwf~l$+2$iUcI0#6Ge1Ndng3N~qXIwtmD#yA zon!5<0|!TI`anr&yKMO-3a?vE7Q30zvg5Fe zaopI$-UE9NbUbjagWnmggyZ Date: Thu, 30 Apr 2020 02:32:03 +0200 Subject: [PATCH 06/21] add nbsphinx to setup.py --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 4d0ecfd..285175e 100644 --- a/setup.py +++ b/setup.py @@ -43,6 +43,7 @@ 'Sphinx==1.8', 'matplotlib>=1.5.1', 'sphinxcontrib-bibtex>=0.3.5', + 'nbsphinx>=0.6.1' ], 'generator': ['yapf>=0.16.2', ], 'tests': From f33b97fef95dc6c26f89b3089fd7f5af9291b80b Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 11:24:36 +0200 Subject: [PATCH 07/21] add nbsphinx to requirements-devel.txt --- requirements-devel.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-devel.txt b/requirements-devel.txt index 05df58e..7594eef 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1 +1,2 @@ -e git+https://github.com/sympy/sympy.git#egg=sympy +nbsphinx From 403f26b5602571b1a73868a650f8a04bc03aa962 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 11:45:12 +0200 Subject: [PATCH 08/21] update conf.py for new version of sphinx. --- docs/conf.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index b840c27..531f5bb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -251,4 +251,8 @@ def get_attr(obj, value, *args, **kwargs): autoclass_content = 'both' -autodoc_default_flags = ['members', 'undoc-members', 'show-inheritance'] +autodoc_default_options = { + 'undoc-members': True, + 'show-inheritance': True +} + From bf4df3abe24a385d139637a3ed723da50eff24cc Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 13:54:38 +0200 Subject: [PATCH 09/21] Fix modules in api.rst --- docs/api.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index eba87b9..3b6d34f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -43,10 +43,10 @@ Radiation .. automodule:: essm.variables.leaf.radiation :members: -Water Vapour -~~~~~~~~~~~~ +Energy and Water +~~~~~~~~~~~~~~~~ -.. automodule:: essm.variables.leaf.water_vapour +.. automodule:: essm.variables.leaf.energy_water :members: Physics From 613784310d0b8c337b71c46426d4a01d4e70609d Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 14:00:23 +0200 Subject: [PATCH 10/21] Fix modules in api.rst --- docs/api.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 3b6d34f..856ad9d 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -66,17 +66,6 @@ Equations .. automodule:: essm.equations -Chamber -------- - -.. automodule:: essm.equations.chamber - -Insulation -~~~~~~~~~~ - -.. automodule:: essm.equations.chamber.insulation - :members: - Leaf ---- From 514f27b8029d5162c443cdccfdadcda89fb13f94 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 14:27:35 +0200 Subject: [PATCH 11/21] Add pandoc to requirements --- requirements-devel.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-devel.txt b/requirements-devel.txt index 7594eef..74a9ef2 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,2 +1,3 @@ -e git+https://github.com/sympy/sympy.git#egg=sympy nbsphinx +pandoc From 49aec07a3503bc76d817999b137350ef1ced9039 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 14:42:47 +0200 Subject: [PATCH 12/21] Move pandoc install to .travis.yml --- .travis.yml | 1 + requirements-devel.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 04f3d62..ec8f40e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,6 +42,7 @@ env: before_install: - git fetch --tags + - sudo apt-get install pandoc - travis_retry pip install -U twine wheel coveralls pip - travis_retry pip install check-manifest pydocstyle - travis_retry pip install -r requirements-devel.txt diff --git a/requirements-devel.txt b/requirements-devel.txt index 74a9ef2..7594eef 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,3 +1,2 @@ -e git+https://github.com/sympy/sympy.git#egg=sympy nbsphinx -pandoc From 823ee0f26a7fa06066da1f2218b307b08bf7b277 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 15:22:00 +0200 Subject: [PATCH 13/21] Remove duplicate bibliography --- docs/api.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 856ad9d..ae5d9bf 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -92,7 +92,3 @@ Internals .. automodule:: essm.equations._core :members: - -Bibliography -============ -.. bibliography:: refs.bib \ No newline at end of file From fa489ec53406f6d9877dd7516c0e258ca990daaf Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 15:42:05 +0200 Subject: [PATCH 14/21] add options to conf.py to avoid travis errors --- docs/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 531f5bb..b46b4d4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -95,7 +95,7 @@ def get_attr(obj, value, *args, **kwargs): 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', - 'nbsphinx' + 'nbsphinx', 'IPython.sphinxext.ipython_console_highlighting' ] # Add any paths that contain templates here, relative to this directory. @@ -141,7 +141,8 @@ def get_attr(obj, value, *args, **kwargs): # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '_build', + '**.ipynb_checkpoints'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' From 49e7a59d881074083a510e4331af773cdefc67bb Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 16:13:07 +0200 Subject: [PATCH 15/21] Further installs to avoid travis failures --- .gitignore | 4 ++++ docs/conf.py | 2 +- requirements-devel.txt | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fc60763..f0e1a8c 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,7 @@ src/* # version.py essm/version.py + +# Jupyter temp files +.ipynb_checkpoints +*/.ipynb_checkpoints/* diff --git a/docs/conf.py b/docs/conf.py index b46b4d4..6c87250 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -95,7 +95,7 @@ def get_attr(obj, value, *args, **kwargs): 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', - 'nbsphinx', 'IPython.sphinxext.ipython_console_highlighting' + 'nbsphinx' ] # Add any paths that contain templates here, relative to this directory. diff --git a/requirements-devel.txt b/requirements-devel.txt index 7594eef..d14e845 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,2 +1,8 @@ -e git+https://github.com/sympy/sympy.git#egg=sympy +jupyter +nbconvert +pandoc +nbsphinx +IPython +ipykernel nbsphinx From 8de2919eab149ae4da1c55a1a8ac98b3084ef552 Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Thu, 30 Apr 2020 17:50:48 +0200 Subject: [PATCH 16/21] update logo --- docs/_static/logo.png | Bin 18710 -> 37819 bytes docs/conf.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_static/logo.png b/docs/_static/logo.png index 56243cb0fe3b2851d14838e3bc876570b1e509ec..88417ca8e0386181f320e33bebe612ca1f66172f 100644 GIT binary patch literal 37819 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 b7!>D!o(_fQz8+rD00000NkvXXu0mjfoDSu| literal 18710 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 Date: Fri, 1 May 2020 14:54:23 +0200 Subject: [PATCH 17/21] Clean up, as suggested by @jirikuncar --- .gitignore | 3 +++ requirements-devel.txt | 7 ------- setup.py | 7 +++++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index f0e1a8c..c89bc8c 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ essm/version.py # Jupyter temp files .ipynb_checkpoints */.ipynb_checkpoints/* + +# Docu build +docs/_build diff --git a/requirements-devel.txt b/requirements-devel.txt index d14e845..05df58e 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,8 +1 @@ -e git+https://github.com/sympy/sympy.git#egg=sympy -jupyter -nbconvert -pandoc -nbsphinx -IPython -ipykernel -nbsphinx diff --git a/setup.py b/setup.py index 285175e..32f57cf 100644 --- a/setup.py +++ b/setup.py @@ -48,6 +48,13 @@ 'generator': ['yapf>=0.16.2', ], 'tests': tests_require, + 'dev': ['jupyter', + 'nbconvert', + 'pandoc', + 'nbsphinx', + 'IPython', + 'ipykernel' + ] } extras_require['all'] = [] From 7e9288909c22644ef776f59752514459b0f159fb Mon Sep 17 00:00:00 2001 From: Jiri Kuncar Date: Fri, 1 May 2020 18:46:44 +0200 Subject: [PATCH 18/21] Update .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c89bc8c..cd2baa4 100644 --- a/.gitignore +++ b/.gitignore @@ -77,5 +77,5 @@ essm/version.py .ipynb_checkpoints */.ipynb_checkpoints/* -# Docu build -docs/_build +# Documentation build +docs/_build/ From 13f3ce2e855016eefc9bacb8e2e356b494aeea7d Mon Sep 17 00:00:00 2001 From: Stan Schymanski Date: Sat, 2 May 2020 10:43:25 +0200 Subject: [PATCH 19/21] Exclude docs/_build from maniest --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 6d91c93..de2ffba 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -15,4 +15,6 @@ recursive-include docs/_static *.png recursive-include essm *.yapf recursive-include tests *.py +recursive-exclude docs/_build * + prune src From 0ff1d9690363f851ed7807ffb5713b15c76ab2bd Mon Sep 17 00:00:00 2001 From: Jiri Kuncar Date: Mon, 4 May 2020 11:35:52 +0200 Subject: [PATCH 20/21] Apply suggestions from code review --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 32f57cf..87efcad 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,8 @@ 'generator': ['yapf>=0.16.2', ], 'tests': tests_require, - 'dev': ['jupyter', + 'dev': [ + 'jupyter', 'nbconvert', 'pandoc', 'nbsphinx', From beab984c8fa886e45497c8de2954e4559c51fad0 Mon Sep 17 00:00:00 2001 From: Jiri Kuncar Date: Mon, 4 May 2020 11:36:37 +0200 Subject: [PATCH 21/21] Apply suggestions from code review --- docs/conf.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index e1fb68b..9b46a18 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -141,7 +141,7 @@ def get_attr(obj, value, *args, **kwargs): # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '_build', +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '**.ipynb_checkpoints'] # The name of the Pygments (syntax highlighting) style to use. @@ -256,4 +256,3 @@ def get_attr(obj, value, *args, **kwargs): 'undoc-members': True, 'show-inheritance': True } -