From 0c14b094331ff0c3138b84f7c4d9377ed517a45d Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Fri, 16 Jun 2023 18:58:57 +0530 Subject: [PATCH 01/30] Group Optional Dependencies --- setup.py | 62 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/setup.py b/setup.py index 537464777c..6d9f9bdefe 100644 --- a/setup.py +++ b/setup.py @@ -206,22 +206,9 @@ def compile_KLU(): "numpy>=1.16", "scipy>=1.3", "pandas>=0.24", - "anytree>=2.4.3", - "autograd>=1.2", - "scikit-fem>=0.2.0", "casadi>=3.6.0", - "imageio>=2.9.0", "importlib-metadata", - "pybtex>=0.24.0", - "sympy>=1.8", "xarray", - "bpx", - "tqdm", - # Note: Matplotlib is loaded for debug plots, but to ensure pybamm runs - # on systems without an attached display, it should never be imported - # outside of plot() methods. - # Should not be imported - "matplotlib>=2.0", ], extras_require={ "docs": [ @@ -236,6 +223,55 @@ def compile_KLU(): "pre-commit", # For code style checking "black", # For code style auto-formatting "jupyter", # For example notebooks + "anytree>=2.4.3", + "autograd>=1.2", + "scikit-fem>=0.2.0", + ], + "plot": [ + "imageio>=2.9.0", + # Note: Matplotlib is loaded for debug plots, but to ensure pybamm runs + # on systems without an attached display, it should never be imported + # outside of plot() methods. + # Should not be imported + "matplotlib>=2.0", + ], + "cite": [ + "pybtex>=0.24.0", + ], + "latexify": [ + "sympy>=1.8", + ], + "bpx": [ + "bpx", + ], + "tqdm": [ + "tqdm", + ], + "all": [ + "numpy>=1.16", + "scipy>=1.3", + "pandas>=0.24", + "anytree>=2.4.3", + "autograd>=1.2", + "scikit-fem>=0.2.0", + "casadi>=3.6.0", + "imageio>=2.9.0", + "importlib-metadata", + "pybtex>=0.24.0", + "sympy>=1.8", + "xarray", + "bpx", + "tqdm", + "matplotlib>=2.0", + "sphinx>=1.5", + "pydata-sphinx-theme", + "sphinx_design", + "sphinx-copybutton", + "myst-parser", + "sphinx-inline-tabs", + "pre-commit", + "black", + "jupyter", ], }, entry_points={ From 5fa1311c57103ba6e3d443f73de92d76000cc97a Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Sat, 17 Jun 2023 01:45:54 +0530 Subject: [PATCH 02/30] Add `noxfile` & modify workflow for it --- .github/workflows/run_periodic_tests.yml | 31 ++---- .github/workflows/test_on_push.yml | 16 +-- noxfile.py | 121 +++++++++++++++++++++++ 3 files changed, 139 insertions(+), 29 deletions(-) create mode 100644 noxfile.py diff --git a/.github/workflows/run_periodic_tests.yml b/.github/workflows/run_periodic_tests.yml index 9f8fe72774..f4e18e9148 100644 --- a/.github/workflows/run_periodic_tests.yml +++ b/.github/workflows/run_periodic_tests.yml @@ -86,46 +86,35 @@ jobs: - name: Install standard python dependencies run: | - python -m pip install --upgrade pip wheel setuptools - python -m pip install "tox<4" - + python -m pip install --upgrade pip wheel setuptools nox + - name: Install SuiteSparse and Sundials if: matrix.os == 'ubuntu-latest' - run: tox -e pybamm-requires + run: nox -s pybamm-requires - name: Run unit tests for GNU/Linux with Python 3.8, 3.9, and 3.10 if: matrix.os == 'ubuntu-latest' && matrix.python-version != 3.11 - run: python -m tox -e unit + run: nox -s unit - name: Run unit tests for GNU/Linux with Python 3.11 and generate coverage report if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 - run: python -m tox -e coverage + run: nox -s coverage - name: Upload coverage report if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 uses: codecov/codecov-action@v2.1.0 - - name: Run integration tests for GNU/Linux - if: matrix.os == 'ubuntu-latest' - run: python -m tox -e integration + - name: Run integration tests + run: nox -s integration - name: Run unit tests for Windows and MacOS if: matrix.os != 'ubuntu-latest' - run: python -m tox -e mac-windows-unit - - - name: Run integration tests for Windows and MacOS - if: matrix.os != 'ubuntu-latest' - run: python -m tox -e mac-windows-integration + run: nox -s unit - name: Install docs dependencies and run doctests if: matrix.os == 'ubuntu-latest' - run: tox -e doctests + run: nox -s doctests - name: Install dev dependencies and run example tests if: matrix.os == 'ubuntu-latest' - run: tox -e examples - - - name: Install scikits.odes and test pybamm_install_odes - if: matrix.os == 'ubuntu-latest' - run: | - tox -e odes + run: nox -s examples \ No newline at end of file diff --git a/.github/workflows/test_on_push.yml b/.github/workflows/test_on_push.yml index da93ae7311..f3abb85fc1 100644 --- a/.github/workflows/test_on_push.yml +++ b/.github/workflows/test_on_push.yml @@ -96,19 +96,19 @@ jobs: - name: Install standard Python dependencies run: | python -m pip install --upgrade pip wheel setuptools - python -m pip install "tox<4" + python -m pip install "nox" - name: Install SuiteSparse and Sundials if: matrix.os == 'ubuntu-latest' - run: tox -e pybamm-requires + run: nox -s pybamm-requires - name: Run unit tests for GNU/Linux with Python 3.8, 3.9, and 3.10 if: matrix.os == 'ubuntu-latest' && matrix.python-version != 3.11 - run: python -m tox -e unit + run: nox -s unit - name: Run unit tests for GNU/Linux with Python 3.11 and generate coverage report if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 - run: python -m tox -e coverage + run: nox -s coverage - name: Upload coverage report if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 @@ -116,16 +116,16 @@ jobs: - name: Run integration tests for GNU/Linux with Python 3.11 if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 - run: python -m tox -e integration + run: nox -s integration - name: Run unit tests for Windows and MacOS with all Python versions if: matrix.os != 'ubuntu-latest' - run: python -m tox -e mac-windows-unit + run: nox -s unit - name: Install docs dependencies and run doctests for GNU/Linux with Python 3.11 if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 - run: tox -e doctests + run: nox -s doctests - name: Install dev dependencies and run example tests for GNU/Linux with Python 3.11 if: matrix.os == 'ubuntu-latest' && matrix.python-version == 3.11 - run: tox -e examples + run: nox -s examples \ No newline at end of file diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 0000000000..c5c25e815f --- /dev/null +++ b/noxfile.py @@ -0,0 +1,121 @@ +import nox +import os +import sys + + +@nox.session(name="pybamm-requires") +def run_pybamm_requires(session): + homedir = os.getenv("HOME") + session.env["SUNDIALS_INST"] = session.env.get("SUNDIALS_INST", f"{homedir}/.local") + session.env[ + "LD_LIBRARY_PATH" + ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" + if sys.platform != "win32" or sys.platform != "darwin": + session.install("wget", "cmake") + session.run("python", "scripts/install_KLU_Sundials.py") + session.run( + "git", + "clone", + "https://github.com/pybind/pybind11.git", + "pybind11/", + external=True, + ) + + +@nox.session(name="coverage") +def run_coverage(session): + homedir = os.getenv("HOME") + session.env["SUNDIALS_INST"] = session.env.get("SUNDIALS_INST", f"{homedir}/.local") + session.env[ + "LD_LIBRARY_PATH" + ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" + session.install("coverage") + session.run("pip", "install", "-e", ".") + if sys.platform != "win32" or sys.platform != "darwin": + session.install("scikits.odes") + session.run("pybamm_install_jax") + session.run("coverage", "run", "--rcfile=.coveragerc", "run-tests.py", "--nosub") + session.run("coverage", "combine") + session.run("coverage", "xml") + + +@nox.session(name="integration", reuse_venv=True) +def run_integration(session): + homedir = os.getenv("HOME") + session.env["SUNDIALS_INST"] = session.env.get("SUNDIALS_INST", f"{homedir}/.local") + session.env[ + "LD_LIBRARY_PATH" + ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" + session.run("pip", "install", "-e", ".") + if sys.platform == "linux": + session.install("scikits.odes") + session.run("python", "run-tests.py", "--integration") + + +@nox.session(name="doctests", reuse_venv=True) +def run_doctests(session): + session.run("pip", "install", "-e", ".[docs]") + session.run("python", "run-tests.py", "--doctest") + + +@nox.session(name="unit", reuse_venv=True) +def run_unit(session): + homedir = os.getenv("HOME") + session.env["SUNDIALS_INST"] = session.env.get("SUNDIALS_INST", f"{homedir}/.local") + session.env[ + "LD_LIBRARY_PATH" + ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" + session.run("pip", "install", "-e", ".") + if sys.platform == "linux": + session.run("pybamm_install_jax") + session.install("scikits.odes") + session.run("python", "run-tests.py", "--unit") + + +@nox.session(name="examples", reuse_venv=True) +def run_examples(session): + session.run("pip", "install", "-e", ".[dev]") + session.run("python", "run-tests.py", "--examples") + + +@nox.session(name="dev", reuse_venv=True) +def set_dev(session): + homedir = os.getenv("HOME") + LD_LIBRARY_PATH = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" + envbindir = session.bin + session.run("pip", "install", "-e", ".[dev]") + session.install("cmake") + session.run( + "echo", + "export", + f"LD_LIBRARY_PATH={LD_LIBRARY_PATH}", + ">>", + f"{envbindir}/activate", + ) + + +@nox.session(name="tests", reuse_venv=True) +def run_tests(session): + session.run("pip", "install", "-e", ".") + if sys.platform == "linux": + session.run("pybamm_install_jax") + session.run("python", "run-tests.py", "--all") + + +@nox.session(name="docs", reuse_venv=True) +def build_docs(session): + envbindir = session.bin + session.run("pip", "install", "-e", ".") + session.install( + "sphinx>=1.5", + "pydata-sphinx-theme", + "sphinx-autobuild", + "sphinx_design", + "sphinx-copybutton", + "myst-parser", + "sphinx-inline-tabs", + ) + session.chdir("docs/") + session.run( + "sphinx-autobuild", "--open-browser", "-qT", ".", f"{envbindir}/../tmp/html" + ) \ No newline at end of file From 436184692b71f6f07500d3c897756b15c4d3690e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:16:22 +0000 Subject: [PATCH 03/30] style: pre-commit fixes --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index c5c25e815f..4513021364 100644 --- a/noxfile.py +++ b/noxfile.py @@ -118,4 +118,4 @@ def build_docs(session): session.chdir("docs/") session.run( "sphinx-autobuild", "--open-browser", "-qT", ".", f"{envbindir}/../tmp/html" - ) \ No newline at end of file + ) From 2b749f4afaf735a992872415319f1f354193534a Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Sat, 17 Jun 2023 02:03:38 +0530 Subject: [PATCH 04/30] Make a tests group for CI --- noxfile.py | 10 +++++----- setup.py | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/noxfile.py b/noxfile.py index 4513021364..bd8af2b39c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -30,7 +30,7 @@ def run_coverage(session): "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" session.install("coverage") - session.run("pip", "install", "-e", ".") + session.run("pip", "install", "-e", ".[tests]") if sys.platform != "win32" or sys.platform != "darwin": session.install("scikits.odes") session.run("pybamm_install_jax") @@ -46,7 +46,7 @@ def run_integration(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.run("pip", "install", "-e", ".") + session.run("pip", "install", "-e", ".[tests]") if sys.platform == "linux": session.install("scikits.odes") session.run("python", "run-tests.py", "--integration") @@ -65,7 +65,7 @@ def run_unit(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.run("pip", "install", "-e", ".") + session.run("pip", "install", "-e", ".[tests]") if sys.platform == "linux": session.run("pybamm_install_jax") session.install("scikits.odes") @@ -96,7 +96,7 @@ def set_dev(session): @nox.session(name="tests", reuse_venv=True) def run_tests(session): - session.run("pip", "install", "-e", ".") + session.run("pip", "install", "-e", ".[tests]") if sys.platform == "linux": session.run("pybamm_install_jax") session.run("python", "run-tests.py", "--all") @@ -105,7 +105,7 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.run("pip", "install", "-e", ".") + session.run("pip", "install", "-e", ".[tests]") session.install( "sphinx>=1.5", "pydata-sphinx-theme", diff --git a/setup.py b/setup.py index 6d9f9bdefe..7924b3df25 100644 --- a/setup.py +++ b/setup.py @@ -247,6 +247,23 @@ def compile_KLU(): "tqdm": [ "tqdm", ], + "tests": [ + "numpy>=1.16", + "scipy>=1.3", + "pandas>=0.24", + "anytree>=2.4.3", + "autograd>=1.2", + "scikit-fem>=0.2.0", + "casadi>=3.6.0", + "imageio>=2.9.0", + "importlib-metadata", + "pybtex>=0.24.0", + "sympy>=1.8", + "xarray", + "bpx", + "tqdm", + "matplotlib>=2.0", + ], "all": [ "numpy>=1.16", "scipy>=1.3", @@ -299,4 +316,4 @@ def compile_KLU(): "ECM_Example = pybamm.input.parameters.ecm.example_set:get_parameter_values", # noqa: E501 ], }, -) +) \ No newline at end of file From 71232720a1f2275cbfe17caf50de93eeb7a171b0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:34:05 +0000 Subject: [PATCH 05/30] style: pre-commit fixes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7924b3df25..56c7304e1c 100644 --- a/setup.py +++ b/setup.py @@ -316,4 +316,4 @@ def compile_KLU(): "ECM_Example = pybamm.input.parameters.ecm.example_set:get_parameter_values", # noqa: E501 ], }, -) \ No newline at end of file +) From 1381d39909fc4c465d428bbee276df0711b6619f Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Sat, 17 Jun 2023 19:50:42 +0530 Subject: [PATCH 06/30] Add `pybtex` in docs --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 56c7304e1c..7978f994b5 100644 --- a/setup.py +++ b/setup.py @@ -218,6 +218,7 @@ def compile_KLU(): "sphinx-copybutton", "myst-parser", "sphinx-inline-tabs", + "pybtex>=0.24.0", ], # For doc generation "dev": [ "pre-commit", # For code style checking From 3d99eb8cd4f1d5348f5cbfdc22a36b44e101a97a Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Sun, 18 Jun 2023 03:19:10 +0530 Subject: [PATCH 07/30] Add anytree to doctests --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 7978f994b5..8afd976334 100644 --- a/setup.py +++ b/setup.py @@ -219,6 +219,7 @@ def compile_KLU(): "myst-parser", "sphinx-inline-tabs", "pybtex>=0.24.0", + "anytree>=2.4.3", ], # For doc generation "dev": [ "pre-commit", # For code style checking From 994db56f255f991a6918336261eaa54120419464 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Sun, 18 Jun 2023 12:58:52 +0530 Subject: [PATCH 08/30] Also Installing tests deps in doctests --- noxfile.py | 1 + setup.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/noxfile.py b/noxfile.py index bd8af2b39c..39cffddb01 100644 --- a/noxfile.py +++ b/noxfile.py @@ -54,6 +54,7 @@ def run_integration(session): @nox.session(name="doctests", reuse_venv=True) def run_doctests(session): + session.run("pip", "install", "-e", ".[tests]") session.run("pip", "install", "-e", ".[docs]") session.run("python", "run-tests.py", "--doctest") diff --git a/setup.py b/setup.py index 8afd976334..56c7304e1c 100644 --- a/setup.py +++ b/setup.py @@ -218,8 +218,6 @@ def compile_KLU(): "sphinx-copybutton", "myst-parser", "sphinx-inline-tabs", - "pybtex>=0.24.0", - "anytree>=2.4.3", ], # For doc generation "dev": [ "pre-commit", # For code style checking From 72a889c8b91f3ba0c14b9a99644ce1e3c1dd4004 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 19 Jun 2023 21:00:52 +0530 Subject: [PATCH 09/30] Remove importlib-metadata from deps --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 56c7304e1c..2ccda1b47b 100644 --- a/setup.py +++ b/setup.py @@ -207,7 +207,6 @@ def compile_KLU(): "scipy>=1.3", "pandas>=0.24", "casadi>=3.6.0", - "importlib-metadata", "xarray", ], extras_require={ @@ -256,7 +255,6 @@ def compile_KLU(): "scikit-fem>=0.2.0", "casadi>=3.6.0", "imageio>=2.9.0", - "importlib-metadata", "pybtex>=0.24.0", "sympy>=1.8", "xarray", @@ -273,7 +271,6 @@ def compile_KLU(): "scikit-fem>=0.2.0", "casadi>=3.6.0", "imageio>=2.9.0", - "importlib-metadata", "pybtex>=0.24.0", "sympy>=1.8", "xarray", From 3634661dd604a72ecc6e0de52985c7f0411e029f Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 20 Jun 2023 13:44:58 +0530 Subject: [PATCH 10/30] Create examples group for `examples` --- noxfile.py | 18 +++++++++--------- setup.py | 7 ++----- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/noxfile.py b/noxfile.py index 39cffddb01..f69da54dee 100644 --- a/noxfile.py +++ b/noxfile.py @@ -30,7 +30,7 @@ def run_coverage(session): "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" session.install("coverage") - session.run("pip", "install", "-e", ".[tests]") + session.install("-e", ".[dev]") if sys.platform != "win32" or sys.platform != "darwin": session.install("scikits.odes") session.run("pybamm_install_jax") @@ -46,7 +46,7 @@ def run_integration(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.run("pip", "install", "-e", ".[tests]") + session.install("-e", ".[dev]") if sys.platform == "linux": session.install("scikits.odes") session.run("python", "run-tests.py", "--integration") @@ -54,8 +54,8 @@ def run_integration(session): @nox.session(name="doctests", reuse_venv=True) def run_doctests(session): - session.run("pip", "install", "-e", ".[tests]") - session.run("pip", "install", "-e", ".[docs]") + session.install("-e", ".[dev]") + session.install("-e", ".[docs]") session.run("python", "run-tests.py", "--doctest") @@ -66,7 +66,7 @@ def run_unit(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.run("pip", "install", "-e", ".[tests]") + session.install("-e", ".[dev]") if sys.platform == "linux": session.run("pybamm_install_jax") session.install("scikits.odes") @@ -75,7 +75,7 @@ def run_unit(session): @nox.session(name="examples", reuse_venv=True) def run_examples(session): - session.run("pip", "install", "-e", ".[dev]") + session.install("-e", ".[examples]") session.run("python", "run-tests.py", "--examples") @@ -84,7 +84,7 @@ def set_dev(session): homedir = os.getenv("HOME") LD_LIBRARY_PATH = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" envbindir = session.bin - session.run("pip", "install", "-e", ".[dev]") + session.install("-e", ".[dev]") session.install("cmake") session.run( "echo", @@ -97,7 +97,7 @@ def set_dev(session): @nox.session(name="tests", reuse_venv=True) def run_tests(session): - session.run("pip", "install", "-e", ".[tests]") + session.install("-e", ".[dev]") if sys.platform == "linux": session.run("pybamm_install_jax") session.run("python", "run-tests.py", "--all") @@ -106,7 +106,7 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.run("pip", "install", "-e", ".[tests]") + session.install("-e", ".[dev]") session.install( "sphinx>=1.5", "pydata-sphinx-theme", diff --git a/setup.py b/setup.py index 2ccda1b47b..5cedc32bf0 100644 --- a/setup.py +++ b/setup.py @@ -218,13 +218,10 @@ def compile_KLU(): "myst-parser", "sphinx-inline-tabs", ], # For doc generation - "dev": [ + "examples": [ "pre-commit", # For code style checking "black", # For code style auto-formatting "jupyter", # For example notebooks - "anytree>=2.4.3", - "autograd>=1.2", - "scikit-fem>=0.2.0", ], "plot": [ "imageio>=2.9.0", @@ -246,7 +243,7 @@ def compile_KLU(): "tqdm": [ "tqdm", ], - "tests": [ + "dev": [ "numpy>=1.16", "scipy>=1.3", "pandas>=0.24", From ad1d9b147d805abf46f956fe8bd74bfdef6cb433 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 20 Jun 2023 14:02:48 +0530 Subject: [PATCH 11/30] Add `tqdm` as dependency --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index dc2066668c..61e2ed36cf 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -11,6 +11,7 @@ jupyter # For example notebooks pybtex sympy >= 1.8 xarray +tqdm # Note: Matplotlib is loaded for debug plots but to ensure pybamm runs # on systems without an attached display it should never be imported # outside of plot() methods. From ca20dbcb4f9d514898a71439336b3ad45e4891a8 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 20 Jun 2023 21:27:45 +0530 Subject: [PATCH 12/30] Missed installing dev deps in `examples` --- noxfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/noxfile.py b/noxfile.py index f69da54dee..43b92af377 100644 --- a/noxfile.py +++ b/noxfile.py @@ -75,6 +75,7 @@ def run_unit(session): @nox.session(name="examples", reuse_venv=True) def run_examples(session): + session.install("-e", ".[dev]") session.install("-e", ".[examples]") session.run("python", "run-tests.py", "--examples") From 65a2650c46f251e0fa94aa459a48d3bbec2bfadf Mon Sep 17 00:00:00 2001 From: Arjun Date: Sun, 25 Jun 2023 18:08:26 +0530 Subject: [PATCH 13/30] Apply suggestions from code review Co-authored-by: Saransh Chopra --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5cedc32bf0..daca4c6951 100644 --- a/setup.py +++ b/setup.py @@ -258,6 +258,7 @@ def compile_KLU(): "bpx", "tqdm", "matplotlib>=2.0", + "pre-commit", ], "all": [ "numpy>=1.16", @@ -280,8 +281,6 @@ def compile_KLU(): "sphinx-copybutton", "myst-parser", "sphinx-inline-tabs", - "pre-commit", - "black", "jupyter", ], }, From e2f8d5d3674bca98c6c88504214ab363c7cd90e7 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 01:02:50 +0530 Subject: [PATCH 14/30] Remove doc deps from [all] --- setup.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/setup.py b/setup.py index daca4c6951..98502f59d2 100644 --- a/setup.py +++ b/setup.py @@ -275,12 +275,6 @@ def compile_KLU(): "bpx", "tqdm", "matplotlib>=2.0", - "sphinx>=1.5", - "pydata-sphinx-theme", - "sphinx_design", - "sphinx-copybutton", - "myst-parser", - "sphinx-inline-tabs", "jupyter", ], }, From e7a653688e0f3dd1a6c4c7d87023133635cd354f Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 01:35:55 +0530 Subject: [PATCH 15/30] Added required deps section in docs --- docs/source/user_guide/installation/index.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 636be8743f..4fdbd86b14 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -50,6 +50,25 @@ Following GNU/Linux and macOS solvers are optionally available: * `scikits.odes `_ -based solver, see `Optional - scikits.odes solver `_. * `jax `_ -based solver, see `Optional - JaxSolver `_. +Dependencies +------------ +.. _install.required_dependencies: + +Required dependencies +~~~~~~~~~~~~~~~~~~~~~ + +PyBaMM requires the following dependencies. + +================================================================ ========================== +Package Minimum supported version +================================================================ ========================== +`NumPy `__ 1.16.0 +`SciPy `__ 2.8.2 +`pandas `__ 0.24.0 +`CasADi `__ 3.6.0 +`xarray `__ 2023.04.0 +================================================================ ========================== + Full installation guide ----------------------- From fee6b0708be4686e27cb777d560587d6393c0102 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 02:12:22 +0530 Subject: [PATCH 16/30] Added [plot] deps in docs --- docs/source/user_guide/installation/index.rst | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 4fdbd86b14..bb607ce8b7 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -69,6 +69,32 @@ Package Minimum support `xarray `__ 2023.04.0 ================================================================ ========================== +.. _install.optional_dependencies: + +Optional Dependencies +~~~~~~~~~~~~~~~~~~~~~ + +PyBaMM has a number of optional dependencies for different functionalities. +If the optional dependency is not installed, PyBaMM will raise an ImportError when the method requiring that dependency is called. + +If using pip, optional PyBaMM dependencies can be installed or managed in a file (e.g. requirements.txt or setup.py) +as optional extras (e.g.,``pybamm[dev,plot]``). All optional dependencies can be installed with ``pybamm[all]``, +and specific sets of dependencies are listed in the sections below. + +.. _install.plot_dependencies: + +Plot dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pandas[plot]"`` + +=========================================================== ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +=========================================================== ================== ================== =================================================================================================================================================================================== +`imageio `__ 2.9.0 plot Handles diverse image data formats, including animated, volumetric, and scientific formats. +`Matplotlib `__ 2.0.0 plot To plot various battery models, and analyzing battery performance. +=========================================================== ================== ================== =================================================================================================================================================================================== + Full installation guide ----------------------- From b81bb9038c438822045f8c2d50b9863c71f63048 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 02:38:15 +0530 Subject: [PATCH 17/30] Add [docs] deps in docs --- docs/source/user_guide/installation/index.rst | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index bb607ce8b7..c021799591 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -86,7 +86,7 @@ and specific sets of dependencies are listed in the sections below. Plot dependencies ^^^^^^^^^^^^^^^^^ -Installable with ``pip install "pandas[plot]"`` +Installable with ``pip install "pybamm[plot]"`` =========================================================== ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes @@ -95,8 +95,26 @@ Dependency Minimum Version p `Matplotlib `__ 2.0.0 plot To plot various battery models, and analyzing battery performance. =========================================================== ================== ================== =================================================================================================================================================================================== +.. _install.docs_dependencies: + +Docs dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[docs]"`` + +================================================================================ ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +================================================================================ ================== ================== =================================================================================================================================================================================== +`sphinx `__ 1.5.0 docs Sphinx makes it easy to create intelligent and beautiful documentation. +`pydata-sphinx-theme `__ - docs A clean, Bootstrap-based Sphinx theme +`sphinx_design `__ - docs A sphinx extension for designing +`sphinx-copybutton `__ - docs To copy codeblocks +`myst-parser `__ - docs For technical & scientific documentation. +`sphinx-inline-tabs `__ - docs Add inline tabbed content to your Sphinx documentation. +================================================================================ ================== ================== =================================================================================================================================================================================== + Full installation guide ------------------------ +----------------------- Installing a specific version? Installing from source? Check the advanced installation pages below From 14bcf3aeb7cc3782241ab22516ec0f9a9c474a9b Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 02:49:57 +0530 Subject: [PATCH 18/30] Added `[example]` deps in docs --- docs/source/user_guide/installation/index.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index c021799591..16ed9dab63 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -113,6 +113,21 @@ Dependency `sphinx-inline-tabs `__ - docs Add inline tabbed content to your Sphinx documentation. ================================================================================ ================== ================== =================================================================================================================================================================================== +.. _install.examples_dependencies: + +examples dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[examples]"`` + +================================================================================ ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +================================================================================ ================== ================== =================================================================================================================================================================================== +`pre-commit `__ - examples For managing and maintaining multi-language pre-commit hooks. +`black `__ - examples For code formatting. +`jupyter `__ - examples For example notebooks rendering. +================================================================================ ================== ================== =================================================================================================================================================================================== + Full installation guide ----------------------- From 574c37ca080d9016947bf1a3673d01181344aed9 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 03:33:21 +0530 Subject: [PATCH 19/30] Add `[dev]` deps in docs --- docs/source/user_guide/installation/index.rst | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 16ed9dab63..5e49875801 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -115,7 +115,7 @@ Dependency .. _install.examples_dependencies: -examples dependencies +Examples dependencies ^^^^^^^^^^^^^^^^^ Installable with ``pip install "pybamm[examples]"`` @@ -128,6 +128,33 @@ Dependency `jupyter `__ - examples For example notebooks rendering. ================================================================================ ================== ================== =================================================================================================================================================================================== +.. _install.dev_dependencies: + +Dev dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[dev]"`` + +================================================================================ ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +================================================================================ ================== ================== =================================================================================================================================================================================== +`numpy `__ 1.16.0 dev For complex computation handling. +`scipy `__ 2.8.2 dev Provides algorithms for optimization, integration, interpolation etc. +`pandas `__ 0.24.0 dev For data manipulation & analysis. +`anytree `__ 2.4.3 dev For Tree Data Structure +`autograd `__ 1.2.0 dev To differentiate python & numpy code. +`scikit-fem `__ 0.2.0 dev For performing finite element assembly. +`imageio `__ 2.9.0 dev Handles diverse image data formats, including animated, volumetric, and scientific formats. +`matplotlib `__ 2.0.0 dev To plot various battery models, and analyzing battery performance. +`casadi `__ 3.6.0 dev For nonlinear optimization and algorithmic differentiation +`pybtex `__ 0.24.0 dev BibTeX-compatible bibliography processor +`sympy `__ 1.8.0 dev For symbolic mathematics. +`xarray `__ 2023.04.0 dev For labelled multi dimensional arrays. +`bpx `__ - dev Battery Parameter eXchange +`tqdm `__ - dev For faster loops. +`pre-commit `__ - dev For managing and maintaining multi-language pre-commit hooks. +================================================================================ ================== ================== =================================================================================================================================================================================== + Full installation guide ----------------------- From 828aa05de38836a5d441155c8cdd9dd924c782dd Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 03:42:19 +0530 Subject: [PATCH 20/30] Add extra deps --- docs/source/user_guide/installation/index.rst | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 5e49875801..c35c2bd3ed 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -155,6 +155,58 @@ Dependency `pre-commit `__ - dev For managing and maintaining multi-language pre-commit hooks. ================================================================================ ================== ================== =================================================================================================================================================================================== +.. _install.cite_dependencies: + +Cite dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[cite]"`` + +=========================================================== ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +=========================================================== ================== ================== =================================================================================================================================================================================== +`pybtex `__ 0.24.0 cite BibTeX-compatible bibliography processor +=========================================================== ================== ================== =================================================================================================================================================================================== + +.. _install.latexify_dependencies: + +Latexify dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[latexify]"`` + +=========================================================== ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +=========================================================== ================== ================== =================================================================================================================================================================================== +`sympy `__ 1.8.0 latexify For symbolic mathematics. +=========================================================== ================== ================== =================================================================================================================================================================================== + +.. _install.bpx_dependencies: + +bpx dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[bpx]"`` + +=========================================================== ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +=========================================================== ================== ================== =================================================================================================================================================================================== +`bpx `__ - bpx Battery Parameter eXchange +=========================================================== ================== ================== =================================================================================================================================================================================== + +.. _install.tqdm_dependencies: + +tqdm dependencies +^^^^^^^^^^^^^^^^^ + +Installable with ``pip install "pybamm[tqdm]"`` + +=========================================================== ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +=========================================================== ================== ================== =================================================================================================================================================================================== +`tqdm `__ - tqdm For faster loops. +=========================================================== ================== ================== =================================================================================================================================================================================== + Full installation guide ----------------------- From 52f41183fff8bf27dd777936bf6e8a2d8be45016 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 23:21:30 +0530 Subject: [PATCH 21/30] Remove extra deps from deps --- docs/source/user_guide/installation/index.rst | 16 ++-------------- setup.py | 16 ++-------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index c35c2bd3ed..0fdab41ada 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -123,8 +123,6 @@ Installable with ``pip install "pybamm[examples]"`` ================================================================================ ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes ================================================================================ ================== ================== =================================================================================================================================================================================== -`pre-commit `__ - examples For managing and maintaining multi-language pre-commit hooks. -`black `__ - examples For code formatting. `jupyter `__ - examples For example notebooks rendering. ================================================================================ ================== ================== =================================================================================================================================================================================== @@ -138,21 +136,11 @@ Installable with ``pip install "pybamm[dev]"`` ================================================================================ ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes ================================================================================ ================== ================== =================================================================================================================================================================================== -`numpy `__ 1.16.0 dev For complex computation handling. -`scipy `__ 2.8.2 dev Provides algorithms for optimization, integration, interpolation etc. -`pandas `__ 0.24.0 dev For data manipulation & analysis. `anytree `__ 2.4.3 dev For Tree Data Structure `autograd `__ 1.2.0 dev To differentiate python & numpy code. `scikit-fem `__ 0.2.0 dev For performing finite element assembly. -`imageio `__ 2.9.0 dev Handles diverse image data formats, including animated, volumetric, and scientific formats. -`matplotlib `__ 2.0.0 dev To plot various battery models, and analyzing battery performance. -`casadi `__ 3.6.0 dev For nonlinear optimization and algorithmic differentiation -`pybtex `__ 0.24.0 dev BibTeX-compatible bibliography processor -`sympy `__ 1.8.0 dev For symbolic mathematics. -`xarray `__ 2023.04.0 dev For labelled multi dimensional arrays. -`bpx `__ - dev Battery Parameter eXchange -`tqdm `__ - dev For faster loops. `pre-commit `__ - dev For managing and maintaining multi-language pre-commit hooks. +`black `__ - dev For code formatting. ================================================================================ ================== ================== =================================================================================================================================================================================== .. _install.cite_dependencies: @@ -204,7 +192,7 @@ Installable with ``pip install "pybamm[tqdm]"`` =========================================================== ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes =========================================================== ================== ================== =================================================================================================================================================================================== -`tqdm `__ - tqdm For faster loops. +`tqdm `__ - tqdm For logging loops. =========================================================== ================== ================== =================================================================================================================================================================================== Full installation guide diff --git a/setup.py b/setup.py index 98502f59d2..fcd1a644f8 100644 --- a/setup.py +++ b/setup.py @@ -219,8 +219,6 @@ def compile_KLU(): "sphinx-inline-tabs", ], # For doc generation "examples": [ - "pre-commit", # For code style checking - "black", # For code style auto-formatting "jupyter", # For example notebooks ], "plot": [ @@ -244,21 +242,11 @@ def compile_KLU(): "tqdm", ], "dev": [ - "numpy>=1.16", - "scipy>=1.3", - "pandas>=0.24", "anytree>=2.4.3", "autograd>=1.2", "scikit-fem>=0.2.0", - "casadi>=3.6.0", - "imageio>=2.9.0", - "pybtex>=0.24.0", - "sympy>=1.8", - "xarray", - "bpx", - "tqdm", - "matplotlib>=2.0", - "pre-commit", + "pre-commit", # For code style checking + "black", # For code style auto-formatting ], "all": [ "numpy>=1.16", From afe2449bef46b4a9e291c3ea6a47bbd38d9e242e Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Mon, 26 Jun 2023 23:35:07 +0530 Subject: [PATCH 22/30] Remove required deps from `[all]` & conf. tests --- noxfile.py | 16 ++++++++-------- setup.py | 5 ----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/noxfile.py b/noxfile.py index 43b92af377..a7ce4ac41b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -30,7 +30,7 @@ def run_coverage(session): "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" session.install("coverage") - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") if sys.platform != "win32" or sys.platform != "darwin": session.install("scikits.odes") session.run("pybamm_install_jax") @@ -46,7 +46,7 @@ def run_integration(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") if sys.platform == "linux": session.install("scikits.odes") session.run("python", "run-tests.py", "--integration") @@ -54,7 +54,7 @@ def run_integration(session): @nox.session(name="doctests", reuse_venv=True) def run_doctests(session): - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") session.install("-e", ".[docs]") session.run("python", "run-tests.py", "--doctest") @@ -66,7 +66,7 @@ def run_unit(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") if sys.platform == "linux": session.run("pybamm_install_jax") session.install("scikits.odes") @@ -75,7 +75,7 @@ def run_unit(session): @nox.session(name="examples", reuse_venv=True) def run_examples(session): - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") session.install("-e", ".[examples]") session.run("python", "run-tests.py", "--examples") @@ -85,7 +85,7 @@ def set_dev(session): homedir = os.getenv("HOME") LD_LIBRARY_PATH = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" envbindir = session.bin - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") session.install("cmake") session.run( "echo", @@ -98,7 +98,7 @@ def set_dev(session): @nox.session(name="tests", reuse_venv=True) def run_tests(session): - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") if sys.platform == "linux": session.run("pybamm_install_jax") session.run("python", "run-tests.py", "--all") @@ -107,7 +107,7 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.install("-e", ".[dev]") + session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") session.install( "sphinx>=1.5", "pydata-sphinx-theme", diff --git a/setup.py b/setup.py index fcd1a644f8..2f64b70857 100644 --- a/setup.py +++ b/setup.py @@ -249,17 +249,12 @@ def compile_KLU(): "black", # For code style auto-formatting ], "all": [ - "numpy>=1.16", - "scipy>=1.3", - "pandas>=0.24", "anytree>=2.4.3", "autograd>=1.2", "scikit-fem>=0.2.0", - "casadi>=3.6.0", "imageio>=2.9.0", "pybtex>=0.24.0", "sympy>=1.8", - "xarray", "bpx", "tqdm", "matplotlib>=2.0", From 1a6cbb7b90fb1fd60903b36d4470e8bc73f2b0f5 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 27 Jun 2023 00:32:49 +0530 Subject: [PATCH 23/30] Changelog & fix headings --- CHANGELOG.md | 4 ++-- docs/source/user_guide/installation/index.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eb885081b..11d583d3ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - Enable multithreading in IDAKLU solver ([#2947](https://github.com/pybamm-team/PyBaMM/pull/2947)) - If a solution contains cycles and steps, the cycle number and step number are now saved when `solution.save_data()` is called ([#2931](https://github.com/pybamm-team/PyBaMM/pull/2931)) -- Experiments can now be given a `start_time` to define when each step should be triggered ([#2616](https://github.com/pybamm-team/PyBaMM/pull/2616)) +- Experiments can now be given a `start_time` to define when each step should be triggered ([#2616](https://github.com/pybamm-team/PyBaMM/pull/2616)) ## Optimizations @@ -28,6 +28,7 @@ ## Breaking changes - Deprecate functionality to load parameter set from a csv file. Parameter sets must now be provided as python dictionaries ([#2959](https://github.com/pybamm-team/PyBaMM/pull/2959)) +- PyBaMM now has optional dependencies that can be installed with `pip install pybamm[option]` e.g. `pybamm[dev]` ([#3044](https://github.com/pybamm-team/PyBaMM/pull/3044)) # [v23.4.1](https://github.com/pybamm-team/PyBaMM/tree/v23.4) - 2023-05-01 @@ -44,7 +45,6 @@ - PyBaMM is now natively supported on Apple silicon chips (`M1/M2`) ([#2435](https://github.com/pybamm-team/PyBaMM/pull/2435)) - PyBaMM is now supported on Python `3.10` and `3.11` ([#2435](https://github.com/pybamm-team/PyBaMM/pull/2435)) - ## Optimizations - Fixed deprecated `interp2d` method by switching to `xarray.DataArray` as the backend for `ProcessedVariable` ([#2907](https://github.com/pybamm-team/PyBaMM/pull/2907)) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 0fdab41ada..cb8bafed37 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -116,7 +116,7 @@ Dependency .. _install.examples_dependencies: Examples dependencies -^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^ Installable with ``pip install "pybamm[examples]"`` @@ -159,7 +159,7 @@ Dependency Minimum Version p .. _install.latexify_dependencies: Latexify dependencies -^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^ Installable with ``pip install "pybamm[latexify]"`` From 6a886250b2fc95e5f69e081eff3785a7887ccb16 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Wed, 28 Jun 2023 17:09:26 +0530 Subject: [PATCH 24/30] Also Installing `dev` deps in doctests --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 2d0e93de26..db1072278c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -57,7 +57,7 @@ def run_integration(session): @nox.session(name="doctests", reuse_venv=True) def run_doctests(session): - session.install("-e", ".[docs]") + session.install("-e", ".[dev,docs]") session.run("python", "run-tests.py", "--doctest") From a8101d3a86c50188ee2e13f2f599116736ee907c Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Wed, 28 Jun 2023 22:07:30 +0530 Subject: [PATCH 25/30] Installing `[all]` in sessions & edit docs --- docs/source/user_guide/installation/index.rst | 28 ++++++++++--------- noxfile.py | 16 +++++------ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index cb8bafed37..a8dd5b1842 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -102,19 +102,21 @@ Docs dependencies Installable with ``pip install "pybamm[docs]"`` -================================================================================ ================== ================== =================================================================================================================================================================================== -Dependency Minimum Version pip extra Notes -================================================================================ ================== ================== =================================================================================================================================================================================== -`sphinx `__ 1.5.0 docs Sphinx makes it easy to create intelligent and beautiful documentation. -`pydata-sphinx-theme `__ - docs A clean, Bootstrap-based Sphinx theme -`sphinx_design `__ - docs A sphinx extension for designing -`sphinx-copybutton `__ - docs To copy codeblocks -`myst-parser `__ - docs For technical & scientific documentation. -`sphinx-inline-tabs `__ - docs Add inline tabbed content to your Sphinx documentation. -================================================================================ ================== ================== =================================================================================================================================================================================== - -.. _install.examples_dependencies: - +================================================================================================= ================== ================== =================================================================================================================================================================================== +Dependency Minimum Version pip extra Notes +================================================================================================= ================== ================== =================================================================================================================================================================================== +`sphinx `__ 1.5.0 docs Sphinx makes it easy to create intelligent and beautiful documentation. +`pydata-sphinx-theme `__ - docs A clean, Bootstrap-based Sphinx theme +`sphinx_design `__ - docs A sphinx extension for designing +`sphinx-copybutton `__ - docs To copy codeblocks +`myst-parser `__ - docs For technical & scientific documentation. +`sphinx-inline-tabs `__ - docs Add inline tabbed content to your Sphinx documentation. +`sphinxcontrib-bibtex `__ - docs For BibTeX citations +`sphinx-autobuild `__ - docs For re-building docs once triggered +================================================================================================= ================== ================== =================================================================================================================================================================================== + +.. _install.examples_dependencies: +================= Examples dependencies ^^^^^^^^^^^^^^^^^^^^^ diff --git a/noxfile.py b/noxfile.py index db1072278c..dabcb52605 100644 --- a/noxfile.py +++ b/noxfile.py @@ -33,7 +33,7 @@ def run_coverage(session): "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" session.install("coverage") - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") if sys.platform != "win32": session.install("scikits.odes") session.run("pybamm_install_jax") @@ -49,7 +49,7 @@ def run_integration(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") if sys.platform == "linux": session.install("scikits.odes") session.run("python", "run-tests.py", "--integration") @@ -57,7 +57,7 @@ def run_integration(session): @nox.session(name="doctests", reuse_venv=True) def run_doctests(session): - session.install("-e", ".[dev,docs]") + session.install("-e", ".[all,docs]") session.run("python", "run-tests.py", "--doctest") @@ -68,7 +68,7 @@ def run_unit(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") if sys.platform == "linux": session.run("pybamm_install_jax") session.install("scikits.odes") @@ -77,7 +77,7 @@ def run_unit(session): @nox.session(name="examples", reuse_venv=True) def run_examples(session): - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") session.install("-e", ".[examples]") session.run("python", "run-tests.py", "--examples") @@ -87,7 +87,7 @@ def set_dev(session): homedir = os.getenv("HOME") LD_LIBRARY_PATH = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" envbindir = session.bin - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") session.install("cmake") session.run( "echo", @@ -105,7 +105,7 @@ def run_tests(session): session.env[ "LD_LIBRARY_PATH" ] = f"{homedir}/.local/lib:{session.env.get('LD_LIBRARY_PATH')}" - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm]") + session.install("-e", ".[all]") if sys.platform == "linux" or sys.platform == "darwin": session.run("pybamm_install_jax") session.install("scikits.odes") @@ -115,7 +115,7 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.install("-e", ".[dev,plot,cite,latexify,bpx,tqdm,docs]") + session.install("-e", ".[all,docs]") session.chdir("docs/") session.run( "sphinx-autobuild", "--open-browser", "-qT", ".", f"{envbindir}/../tmp/html" From c25cab902080be73202dfb96833535899934a4e6 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Fri, 30 Jun 2023 03:19:19 +0530 Subject: [PATCH 26/30] Remove 3 deps from `[dev]` & update docs --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 15366634c6..9e8825a237 100644 --- a/setup.py +++ b/setup.py @@ -244,9 +244,6 @@ def compile_KLU(): "tqdm", ], "dev": [ - "anytree>=2.4.3", - "autograd>=1.2", - "scikit-fem>=0.2.0", "pre-commit", # For code style checking "black", # For code style auto-formatting ], From 50f20cc0c657a7d5fa31c7a25d0dc565a7c10742 Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 4 Jul 2023 20:20:54 +0530 Subject: [PATCH 27/30] Squash Previous 6 commits --- .github/workflows/test_on_push.yml | 2 +- .gitignore | 15 +- .lycheeignore | 3 - .pre-commit-config.yaml | 4 +- CHANGELOG.md | 15 +- CONTRIBUTING.md | 12 +- README.md | 10 +- docs/Makefile | 5 +- docs/conf.py | 54 +- docs/index.rst | 3 +- docs/requirements.txt | 5 + docs/source/api/index.rst | 2 +- docs/source/api/models/index.rst | 2 +- docs/source/examples/index.rst | 110 ++ .../examples}/notebooks/batch_study.ipynb | 0 .../examples}/notebooks/callbacks.ipynb | 16 +- .../examples}/notebooks/change-settings.ipynb | 18 +- .../creating_models}/1-an-ode-model.ipynb | 44 +- .../creating_models}/2-a-pde-model.ipynb | 31 +- .../3-negative-particle-problem.ipynb | 31 +- ...paring-full-and-reduced-order-models.ipynb | 28 +- .../creating_models}/5-half-cell-model.ipynb | 57 +- .../6-a-simple-SEI-model.ipynb | 54 +- .../notebooks/experiments-start-time.ipynb | 0 .../expression_tree/broadcasts.ipynb | 0 .../expression_tree/expression-tree.ipynb | 27 +- .../expression_tree/expression_tree1.png | Bin .../expression_tree/expression_tree2.png | Bin .../expression_tree/expression_tree3.png | Bin .../expression_tree/expression_tree4.png | Bin .../expression_tree/expression_tree5.png | Bin .../tutorial-1-how-to-run-a-model.ipynb | 109 +- .../tutorial-10-creating-a-model.ipynb | 36 +- .../tutorial-11-creating-a-submodel.ipynb | 74 +- .../tutorial-2-compare-models.ipynb | 11 +- .../tutorial-3-basic-plotting.ipynb | 22 +- .../tutorial-4-setting-parameter-values.ipynb | 28 +- .../tutorial-5-run-experiments.ipynb | 59 +- ...torial-6-managing-simulation-outputs.ipynb | 23 +- .../tutorial-7-model-options.ipynb | 12 +- .../tutorial-8-solver-options.ipynb | 11 +- .../tutorial-9-changing-the-mesh.ipynb | 15 +- docs/source/examples/notebooks/index.rst | 115 ++ .../initialize-model-with-solution.ipynb | 0 ...DFN-with-particle-size-distributions.ipynb | 23 +- .../examples}/notebooks/models/DFN.ipynb | 71 +- .../examples}/notebooks/models/MPM.ipynb | 27 +- .../notebooks/models/SEI-on-cracks.ipynb | 0 .../examples/notebooks/models/SPM.ipynb | 1144 ++++++++++++++++ .../examples}/notebooks/models/SPMe.ipynb | 60 +- ...ating_mechanical_models_Enertech_DFN.ipynb | 13 +- .../compare-comsol-discharge-curve.ipynb | 0 .../notebooks/models/compare-ecker-data.ipynb | 13 +- .../models/compare-lithium-ion.ipynb | 0 .../compare-particle-diffusion-models.ipynb | 18 +- .../notebooks/models/composite_particle.ipynb | 18 +- .../models/coupled-degradation.ipynb | 8 - .../models/electrode-state-of-health.ipynb | 38 +- .../notebooks/models/jelly-roll-model.ipynb | 0 .../examples}/notebooks/models/latexify.ipynb | 32 +- .../notebooks/models/lead-acid.ipynb | 36 +- .../notebooks/models/lithium-plating.ipynb | 28 +- .../notebooks/models/pouch-cell-model.ipynb | 38 +- .../notebooks/models/rate-capability.ipynb | 0 ...simulating-ORegan-2022-parameter-set.ipynb | 0 .../source/examples/notebooks/models/spm1.png | Bin 0 -> 24160 bytes .../source/examples/notebooks/models/spm2.png | Bin 0 -> 28254 bytes .../models/submodel_cracking_DFN_or_SPM.ipynb | 13 +- .../submodel_loss_of_active_materials.ipynb | 9 +- .../notebooks/models/thermal-models.ipynb | 84 +- .../models/unsteady-heat-equation.ipynb | 0 .../using-model-options_thermal-example.ipynb | 13 +- .../notebooks/models/using-submodels.ipynb | 30 +- .../change-input-current.ipynb | 21 +- .../parameterization/parameter-values.ipynb | 0 .../parameterization/parameterization.ipynb | 32 +- .../plotting/customize-quick-plot.ipynb | 430 ++++++ .../plotting/plot-voltage-components.ipynb | 0 .../simulating-long-experiments.ipynb | 31 +- .../notebooks/simulation-class.ipynb | 17 +- ...olution-data-and-processed-variables.ipynb | 0 .../notebooks/solvers/dae-solver.ipynb | 0 .../notebooks/solvers/ode-solver.ipynb | 0 .../notebooks/solvers/speed-up-solver.ipynb | 0 .../spatial_methods/finite-volumes.ipynb | 50 +- docs/source/user_guide/fundamentals/index.md | 4 +- docs/source/user_guide/getting_started.md | 6 +- docs/source/user_guide/index.md | 39 + docs/source/user_guide/installation/index.rst | 29 +- examples/README.md | 4 +- examples/notebooks/README.md | 75 - examples/notebooks/models/SPM.ipynb | 1219 ----------------- .../plotting/customize-quick-plot.ipynb | 269 ---- examples/scripts/create_model.py | 2 +- noxfile.py | 17 +- pybamm/expression_tree/broadcasts.py | 2 +- run-tests.py | 64 +- setup.py | 4 + sphinx_extend_parent.py | 5 + 99 files changed, 2963 insertions(+), 2136 deletions(-) create mode 100644 docs/source/examples/index.rst rename {examples => docs/source/examples}/notebooks/batch_study.ipynb (100%) rename {examples => docs/source/examples}/notebooks/callbacks.ipynb (98%) rename {examples => docs/source/examples}/notebooks/change-settings.ipynb (99%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/1-an-ode-model.ipynb (97%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/2-a-pde-model.ipynb (98%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/3-negative-particle-problem.ipynb (98%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/4-comparing-full-and-reduced-order-models.ipynb (96%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/5-half-cell-model.ipynb (96%) rename {examples/notebooks/Creating Models => docs/source/examples/notebooks/creating_models}/6-a-simple-SEI-model.ipynb (94%) rename {examples => docs/source/examples}/notebooks/experiments-start-time.ipynb (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/broadcasts.ipynb (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression-tree.ipynb (94%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression_tree1.png (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression_tree2.png (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression_tree3.png (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression_tree4.png (100%) rename {examples => docs/source/examples}/notebooks/expression_tree/expression_tree5.png (100%) rename examples/notebooks/Getting Started/Tutorial 1 - How to run a model.ipynb => docs/source/examples/notebooks/getting_started/tutorial-1-how-to-run-a-model.ipynb (61%) rename examples/notebooks/Getting Started/Tutorial 10 - Creating a model.ipynb => docs/source/examples/notebooks/getting_started/tutorial-10-creating-a-model.ipynb (92%) rename examples/notebooks/Getting Started/Tutorial 11 - Creating a submodel.ipynb => docs/source/examples/notebooks/getting_started/tutorial-11-creating-a-submodel.ipynb (91%) rename examples/notebooks/Getting Started/Tutorial 2 - Compare models.ipynb => docs/source/examples/notebooks/getting_started/tutorial-2-compare-models.ipynb (87%) rename examples/notebooks/Getting Started/Tutorial 3 - Basic plotting.ipynb => docs/source/examples/notebooks/getting_started/tutorial-3-basic-plotting.ipynb (99%) rename examples/notebooks/Getting Started/Tutorial 4 - Setting parameter values.ipynb => docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb (98%) rename examples/notebooks/Getting Started/Tutorial 5 - Run experiments.ipynb => docs/source/examples/notebooks/getting_started/tutorial-5-run-experiments.ipynb (76%) rename examples/notebooks/Getting Started/Tutorial 6 - Managing simulation outputs.ipynb => docs/source/examples/notebooks/getting_started/tutorial-6-managing-simulation-outputs.ipynb (95%) rename examples/notebooks/Getting Started/Tutorial 7 - Model options.ipynb => docs/source/examples/notebooks/getting_started/tutorial-7-model-options.ipynb (85%) rename examples/notebooks/Getting Started/Tutorial 8 - Solver options.ipynb => docs/source/examples/notebooks/getting_started/tutorial-8-solver-options.ipynb (92%) rename examples/notebooks/Getting Started/Tutorial 9 - Changing the mesh.ipynb => docs/source/examples/notebooks/getting_started/tutorial-9-changing-the-mesh.ipynb (94%) create mode 100644 docs/source/examples/notebooks/index.rst rename {examples => docs/source/examples}/notebooks/initialize-model-with-solution.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/DFN-with-particle-size-distributions.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/DFN.ipynb (79%) rename {examples => docs/source/examples}/notebooks/models/MPM.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/SEI-on-cracks.ipynb (100%) create mode 100644 docs/source/examples/notebooks/models/SPM.ipynb rename {examples => docs/source/examples}/notebooks/models/SPMe.ipynb (77%) rename {examples => docs/source/examples}/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/compare-comsol-discharge-curve.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/compare-ecker-data.ipynb (98%) rename {examples => docs/source/examples}/notebooks/models/compare-lithium-ion.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/compare-particle-diffusion-models.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/composite_particle.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/coupled-degradation.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/electrode-state-of-health.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/jelly-roll-model.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/latexify.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/lead-acid.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/lithium-plating.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/pouch-cell-model.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/rate-capability.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/simulating-ORegan-2022-parameter-set.ipynb (100%) create mode 100644 docs/source/examples/notebooks/models/spm1.png create mode 100644 docs/source/examples/notebooks/models/spm2.png rename {examples => docs/source/examples}/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb (98%) rename {examples => docs/source/examples}/notebooks/models/submodel_loss_of_active_materials.ipynb (99%) rename {examples => docs/source/examples}/notebooks/models/thermal-models.ipynb (90%) rename {examples => docs/source/examples}/notebooks/models/unsteady-heat-equation.ipynb (100%) rename {examples => docs/source/examples}/notebooks/models/using-model-options_thermal-example.ipynb (91%) rename {examples => docs/source/examples}/notebooks/models/using-submodels.ipynb (98%) rename {examples => docs/source/examples}/notebooks/parameterization/change-input-current.ipynb (96%) rename {examples => docs/source/examples}/notebooks/parameterization/parameter-values.ipynb (100%) rename {examples => docs/source/examples}/notebooks/parameterization/parameterization.ipynb (99%) create mode 100644 docs/source/examples/notebooks/plotting/customize-quick-plot.ipynb rename examples/notebooks/plotting/plot_voltage_components.ipynb => docs/source/examples/notebooks/plotting/plot-voltage-components.ipynb (100%) rename {examples => docs/source/examples}/notebooks/simulating-long-experiments.ipynb (99%) rename {examples => docs/source/examples}/notebooks/simulation-class.ipynb (95%) rename {examples => docs/source/examples}/notebooks/solution-data-and-processed-variables.ipynb (100%) rename {examples => docs/source/examples}/notebooks/solvers/dae-solver.ipynb (100%) rename {examples => docs/source/examples}/notebooks/solvers/ode-solver.ipynb (100%) rename {examples => docs/source/examples}/notebooks/solvers/speed-up-solver.ipynb (100%) rename {examples => docs/source/examples}/notebooks/spatial_methods/finite-volumes.ipynb (99%) delete mode 100644 examples/notebooks/README.md delete mode 100644 examples/notebooks/models/SPM.ipynb delete mode 100644 examples/notebooks/plotting/customize-quick-plot.ipynb diff --git a/.github/workflows/test_on_push.yml b/.github/workflows/test_on_push.yml index 521b34aca2..2ad24ac75a 100644 --- a/.github/workflows/test_on_push.yml +++ b/.github/workflows/test_on_push.yml @@ -56,7 +56,7 @@ jobs: uses: awalsh128/cache-apt-pkgs-action@v1.3.0 if: matrix.os == 'ubuntu-latest' with: - packages: gfortran gcc graphviz + packages: gfortran gcc graphviz pandoc execute_install_scripts: true # dot -c is for registering graphviz fonts and plugins diff --git a/.gitignore b/.gitignore index a49282d472..4633e08165 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,7 @@ input/* !input/drive_cycles # keep images required by notebooks -!examples/notebooks/Creating%20Models/SEI.png +!docs/examples/notebooks/creating_models/SEI.png # simulation outputs out/ @@ -121,4 +121,15 @@ vcpkg_installed/ # benchmarks html/ -results/ \ No newline at end of file +results/ + +# expression tree images for notebooks in docs +!docs/source/examples/notebooks/expression_tree/expression_tree1.png +!docs/source/examples/notebooks/expression_tree/expression_tree2.png +!docs/source/examples/notebooks/expression_tree/expression_tree3.png +!docs/source/examples/notebooks/expression_tree/expression_tree4.png +!docs/source/examples/notebooks/expression_tree/expression_tree5.png + +# do not ignore SPM images for notebooks in docs +!docs/source/examples/notebooks/models/spm1.png +!docs/source/examples/notebooks/models/spm2.png diff --git a/.lycheeignore b/.lycheeignore index b95c44b763..67bf57aeb5 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -12,6 +12,3 @@ file:///home/runner/work/PyBaMM/PyBaMM/docs/source/user_guide/fundamentals/plot_ # Errors in docs/source/user_guide/index.md file:///home/runner/work/PyBaMM/PyBaMM/docs/source/user_guide/api_docs -# Errors in examples/notebooks/README.md -file:///home/runner/work/PyBaMM/PyBaMM/examples/notebooks/using-submodels.ipynb -file:///home/runner/work/PyBaMM/PyBaMM/examples/notebooks/create-model.ipynb diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index db3d4b36a8..ba385be222 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,8 +8,8 @@ repos: hooks: - id: black - - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: "v0.0.275" + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.0.276" hooks: - id: ruff args: [--ignore=E741, --exclude=__init__.py] diff --git a/CHANGELOG.md b/CHANGELOG.md index 51bd80d953..b8996babb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,21 @@ # [Unreleased](https://github.com/pybamm-team/PyBaMM/) +## Bug fixes + +## Features + +## Optimizations + +## Breaking changes + +- PyBaMM now has optional dependencies that can be installed with `pip install pybamm[option]` e.g. `pybamm[dev]` ([#3044](https://github.com/pybamm-team/PyBaMM/pull/3044)) + # [v23.5](https://github.com/pybamm-team/PyBaMM/tree/v23.5) - 2023-05-31 ## Bug fixes - Realign 'count' increment in CasadiSolver._integrate() ([#2986](https://github.com/pybamm-team/PyBaMM/pull/2986)) +# [v23.5](https://github.com/pybamm-team/PyBaMM/tree/v23.5) - 2023-06-18 ## Features @@ -21,6 +32,7 @@ ## Bug fixes +- Realign 'count' increment in CasadiSolver._integrate() ([#2986](https://github.com/pybamm-team/PyBaMM/pull/2986)) - Fix `pybamm_install_odes` and update the required SUNDIALS version ([#2958](https://github.com/pybamm-team/PyBaMM/pull/2958)) - Fixed a bug where all data included in a BPX was incorrectly assumed to be given as a function of time.([#2957](https://github.com/pybamm-team/PyBaMM/pull/2957)) - Remove brew install for Mac from the recommended developer installation options for SUNDIALS ([#2925](https://github.com/pybamm-team/PyBaMM/pull/2925)) @@ -29,7 +41,6 @@ ## Breaking changes - Deprecate functionality to load parameter set from a csv file. Parameter sets must now be provided as python dictionaries ([#2959](https://github.com/pybamm-team/PyBaMM/pull/2959)) -- PyBaMM now has optional dependencies that can be installed with `pip install pybamm[option]` e.g. `pybamm[dev]` ([#3044](https://github.com/pybamm-team/PyBaMM/pull/3044)) - Tox support for Installation & testing has now been replaced by Nox ([#3005](https://github.com/pybamm-team/PyBaMM/pull/3005)) # [v23.4.1](https://github.com/pybamm-team/PyBaMM/tree/v23.4) - 2023-05-01 @@ -921,7 +932,7 @@ This release introduces many new features and optimizations. All models can now - Removed `Outer` and `Kron` nodes as no longer used ([#777](https://github.com/pybamm-team/PyBaMM/pull/777)) - Moved `results` to separate repositories ([#761](https://github.com/pybamm-team/PyBaMM/pull/761)) - The parameters "Bruggeman coefficient" must now be specified separately as "Bruggeman coefficient (electrolyte)" and "Bruggeman coefficient (electrode)" -- The current classes (`GetConstantCurrent`, `GetUserCurrent` and `GetUserData`) have now been removed. Please refer to the [`change-input-current` notebook](https://github.com/pybamm-team/PyBaMM/blob/main/examples/notebooks/change-input-current.ipynb) for information on how to specify an input current +- The current classes (`GetConstantCurrent`, `GetUserCurrent` and `GetUserData`) have now been removed. Please refer to the [`change-input-current` notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/change-input-current.ipynb) for information on how to specify an input current - Parameter functions must now use pybamm functions instead of numpy functions (e.g. `pybamm.exp` instead of `numpy.exp`), as these are then used to construct the expression tree directly. Generally, pybamm syntax follows numpy syntax; please get in touch if a function you need is missing. - The current must now be updated by changing "Current function [A]" or "C-rate" instead of "Typical current [A]" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f5bb8a7444..230fbe120b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -173,7 +173,15 @@ To test all example scripts and notebooks, type nox -s examples ``` -If notebooks fail because of changes to pybamm, it can be a bit of a hassle to debug. In these cases, you can create a temporary export of a notebook's Python content using +To edit the structure and how the Jupyter notebooks get rendered in the Sphinx documentation (using `nbsphinx`), install [Pandoc](https://pandoc.org/installing.html) on your system, either using `conda` (through the `conda-forge` channel) + +```bash +conda install -c conda-forge pandoc +``` + +or refer to the [Pandoc installation instructions](https://pandoc.org/installing.html) specific to your platform. + +If notebooks fail because of changes to PyBaMM, it can be a bit of a hassle to debug. In these cases, you can create a temporary export of a notebook's Python content using ```bash python run-tests.py --debook examples/notebooks/notebook-name.ipynb script.py @@ -394,4 +402,4 @@ GitHub does some magic with particular filenames. In particular: ## Acknowledgements This CONTRIBUTING.md file, along with large sections of the code infrastructure, -was copied from the excellent [Pints GitHub repo](https://github.com/pints-team/pints) +was copied from the excellent [Pints GitHub repo](https://github.com/pints-team/pints) \ No newline at end of file diff --git a/README.md b/README.md index 9db33fbbb8..8cc7564a21 100644 --- a/README.md +++ b/README.md @@ -80,12 +80,12 @@ sim.solve() sim.plot() ``` -However, much greater customisation is available. It is possible to change the physics, parameter values, geometry, submesh type, number of submesh points, methods for spatial discretisation and solver for integration (see DFN [script](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/scripts/DFN.py) or [notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/models/DFN.ipynb)). +However, much greater customisation is available. It is possible to change the physics, parameter values, geometry, submesh type, number of submesh points, methods for spatial discretisation and solver for integration (see DFN [script](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/scripts/DFN.py) or [notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/models/DFN.ipynb)). -For new users we recommend the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks/Getting%20Started) guides. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM, and can either be downloaded and used locally, or used online through [Google Colab](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop). +For new users we recommend the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/docs/source/examples/notebooks/getting_started/) guides. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM, and can either be downloaded and used locally, or used online through [Google Colab](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop). -Further details can be found in a number of [detailed examples](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/README.md), hosted here on -github. In addition, there is a [full API documentation](https://pybamm.readthedocs.io/en/latest/source/api/index.html), +Further details can be found in a number of [detailed examples](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/README.md), hosted here on +github. In addition, there is a [full API documentation](https://docs.pybamm.org/en/latest/source/api/index.html), hosted on [Read The Docs](https://readthedocs.org/). Additional supporting material can be found [here](https://github.com/pybamm-team/pybamm-supporting-material/). @@ -100,7 +100,7 @@ PyBaMM uses [CalVer](https://calver.org/), which means that we make new releases PyBaMM is available on GNU/Linux, MacOS and Windows. We strongly recommend to install PyBaMM within a python virtual environment, in order not to alter any distribution python files. -For instructions on how to create a virtual environment for PyBaMM, see [the documentation](https://pybamm.readthedocs.io/en/latest/source/user_guide/installation/GNU-linux.html#user-install). +For instructions on how to create a virtual environment for PyBaMM, see [the documentation](https://docs.pybamm.org/en/latest/source/user_guide/installation/GNU-linux.html#user-install). ### Using pip diff --git a/docs/Makefile b/docs/Makefile index 51285967a7..b454275837 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -j auto SPHINXBUILD = sphinx-build SOURCEDIR = . BUILDDIR = _build @@ -16,4 +16,5 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + diff --git a/docs/conf.py b/docs/conf.py index 293ca29af3..f2dcc81793 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -53,6 +53,9 @@ "sphinx_extend_parent", "sphinx_inline_tabs", "sphinxcontrib.bibtex", + "nbsphinx", + "IPython.sphinxext.ipython_console_highlighting", + "sphinx_gallery.load_style", ] # -- sphinxcontrib-bibtex configuration -------------------------------------- @@ -92,10 +95,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".ipynb_checkpoints"] # Suppress warnings generated if footnotes are not references in a docstring # suppress_warnings = ["ref.footnote"] @@ -138,10 +138,6 @@ ], "collapse_navigation": True, "external_links": [ - { - "name": "Examples", - "url": "https://github.com/pybamm-team/PyBaMM/tree/develop/examples", - }, { "name": "Contributing", "url": "https://github.com/pybamm-team/PyBaMM/tree/develop/CONTRIBUTING.md", @@ -156,6 +152,8 @@ # for dark mode toggle, version switcher, and social media links "navbar_end": ["theme-switcher", "version-switcher", "navbar-icon-links"], "use_edit_page_button": True, + "pygment_light_style": "xcode", + "pygment_dark_style": "monokai", } html_title = "%s v%s Manual" % (project, version) @@ -262,9 +260,47 @@ "sphinx": ("https://www.sphinx-doc.org/en/master/", None), "numpy": ("https://numpy.org/doc/stable", None), "scipy": ("https://docs.scipy.org/doc/scipy", None), - "matplotlib": ("https://matplotlib.org", None), + "matplotlib": ("https://matplotlib.org/stable/", None), } +# -- nbsphinx configuration options ------------------------------------------ + +nbsphinx_prolog = r""" + +{% set github_docname = +'github/pybamm-team/pybamm/blob/develop/docs/' + +env.doc2path(env.docname, base=None) %} + +{% set readthedocs_download_url = +'https://docs.pybamm.org/en/latest/' %} + +{% set doc_path = env.doc2path(env.docname, base=None) %} + +.. raw:: html + +
+

+ Tip +

+

+ An interactive online version of this notebook is available, which can be + accessed via + + Open this notebook in Google Colab +

+
+

+ Alternatively, you may + + download this notebook and run it offline. +

+
+ +""" + # -- Jinja templating -------------------------------------------------------- # Credit to: https://ericholscher.com/blog/2016/jul/25/integrating-jinja-rst-sphinx/ diff --git a/docs/index.rst b/docs/index.rst index 285793f955..9a00c5da15 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,7 @@ PyBaMM documentation User Guide source/api/index + source/examples/index **Version**: |version| @@ -68,7 +69,7 @@ explore the effect of different battery designs and modeling assumptions under a +++ - .. button-link:: https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks + .. button-ref:: source/examples/index :expand: :color: secondary :click-parent: diff --git a/docs/requirements.txt b/docs/requirements.txt index 441d08c943..2e3c5737d9 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -25,3 +25,8 @@ sphinx-copybutton myst-parser sphinx-inline-tabs sphinxcontrib-bibtex +nbsphinx +ipython +ipykernel +ipywidgets +sphinx-gallery diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index 5cec6ae7aa..2dd4e382f5 100644 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -11,7 +11,7 @@ API documentation This reference manual details functions, modules, and objects included in PyBaMM, describing what they are and what they do. -For a high-level introduction to PyBaMM, see the :ref:`user guide `. +For a high-level introduction to PyBaMM, see the :ref:`user guide ` and the :ref:`examples `. .. toctree:: :maxdepth: 2 diff --git a/docs/source/api/models/index.rst b/docs/source/api/models/index.rst index 5f944ce4a5..e62d4a2beb 100644 --- a/docs/source/api/models/index.rst +++ b/docs/source/api/models/index.rst @@ -5,7 +5,7 @@ Below is an overview of all the battery models included in PyBaMM. Each of the pre-built models contains a reference to the paper in which it is derived. The models can be customised using the `options` dictionary defined in the :class:`pybamm.BaseBatteryModel` (which also provides information on which options and models are compatible) -Visit our `examples page `_ +Visit our `examples page `_ to see how these models can be solved, and compared, using PyBaMM. .. toctree:: diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst new file mode 100644 index 0000000000..f2218d66f9 --- /dev/null +++ b/docs/source/examples/index.rst @@ -0,0 +1,110 @@ +.. _examples: + +######## +Examples +######## + +A collection of Python scripts and Jupyter notebooks that demonstrate how to use PyBaMM. +For further examples, see the `PyBaMM case studies GitHub repository `_. + +.. toctree:: + :maxdepth: 2 + + notebooks/index + +.. _notebooks: + +For new users we recommend the Getting Started notebooks. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM. +For more detailed notebooks, please see the examples listed below. + +.. _google-colab: + +You may run the notebooks in `Google Colab `_. + +This page contains a number of examples showing how to use PyBaMM. Each example was created as a `Jupyter notebook `_. +These notebooks can be downloaded and used locally by running + +.. code:: bash + + $ jupyter notebook + +from your local PyBaMM repository or used online through `Google Colab `_. +Alternatively, you can simply copy/paste the relevant code. + +Using PyBaMM +------------ + +The easiest way to start with PyBaMM is by running and comparing some of the inbuilt models: + +- `Run the Single Particle Model (SPM) <./notebooks/models/SPM.ipynb>`__ +- `Compare models <./notebooks/models/lead-acid.ipynb>`__ +- `Comparison with COMSOL <./notebooks/models/compare-comsol-discharge-curve.ipynb>`__ + +It is also easy to add new models or change the setting that are used: + +- `Add a model (example) <./creating_models/index.rst>`__ +- `Change model options <./models/using-model-options_thermal-example.ipynb>`__ +- `Using submodels <./using-submodels.ipynb>`__ +- `Change the settings <./change-settings.ipynb>`__ (parameters, spatial method, or solver) +- `Change the applied current <./parameterization/change-input-current.ipynb>`__ + +Expression tree structure +------------------------- + +PyBaMM is built around an expression tree structure. + +- `The expression tree notebook `__ explains how this works, from model creation to solution. +- `The broadcast notebook `__ explains the different types of broadcast. + +The following notebooks are specific to different stages of the PyBaMM +pipeline, such as choosing a model, spatial method, or solver. + +Models +~~~~~~ + +Several battery models are implemented and can easily be used or `compared <./models/lead-acid.ipynb>`__. The notebooks below show the +solution of each individual model. + +Once you are comfortable with the expression tree structure, a good +starting point to understand the models in PyBaMM is to take a look at + +the `basic SPM `__ +and `basic DFN `__, + +since these define the entire model (variables, equations, initial and +boundary conditions, events) in a single class and so are easier to +understand. However, we recommend that you subsequently use the full +models as they offer much greater flexibility for coupling different +physical effects and visualising a greater range of variables. + +Lithium-ion models +^^^^^^^^^^^^^^^^^^ + +- `Single-Particle Model <./models/SPM.ipynb>`__ +- `Single-Particle Model with electrolyte <./models/SPMe.ipynb>`__ +- `Doyle-Fuller-Newman Model <./models/DFN.ipynb>`__ + +Lead-acid models +^^^^^^^^^^^^^^^^ + +- `Full porous-electrode `__ +- `Leading-Order Quasi-Static `__ + +Spatial Methods +~~~~~~~~~~~~~~~ + +The following spatial methods are implemented + +- `Finite Volumes <./spatial_methods/finite-volumes.ipynb>`__ (1D only) +- Spectral Volumes (1D only) +- Finite Elements (only for 2D current collector domains) + +Solvers +~~~~~~~ + +The following notebooks show examples for generic ODE and DAE solvers. +Several solvers are implemented in PyBaMM and we encourage users to try +different ones to find the most appropriate one for their models. + +- `ODE solver <./solvers/ode-solver.ipynb>`__ +- `DAE solver <./solvers/dae-solver.ipynb>`__ diff --git a/examples/notebooks/batch_study.ipynb b/docs/source/examples/notebooks/batch_study.ipynb similarity index 100% rename from examples/notebooks/batch_study.ipynb rename to docs/source/examples/notebooks/batch_study.ipynb diff --git a/examples/notebooks/callbacks.ipynb b/docs/source/examples/notebooks/callbacks.ipynb similarity index 98% rename from examples/notebooks/callbacks.ipynb rename to docs/source/examples/notebooks/callbacks.ipynb index 8445b09319..19f6c6a6a2 100644 --- a/examples/notebooks/callbacks.ipynb +++ b/docs/source/examples/notebooks/callbacks.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "id": "403c07ba", "metadata": {}, @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "4e5bfd9f", "metadata": {}, @@ -63,6 +65,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "6c38b44e", "metadata": {}, @@ -71,6 +74,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "538f91d4", "metadata": {}, @@ -110,6 +114,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "67608fe3", "metadata": {}, @@ -158,6 +163,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "aa7b0634", "metadata": {}, @@ -166,6 +172,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "070fee9e", "metadata": {}, @@ -224,6 +231,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "f83dccc3", "metadata": {}, @@ -257,14 +265,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "df832fba", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/change-settings.ipynb b/docs/source/examples/notebooks/change-settings.ipynb similarity index 99% rename from examples/notebooks/change-settings.ipynb rename to docs/source/examples/notebooks/change-settings.ipynb index 15b76ea067..7d2c61d2cc 100644 --- a/examples/notebooks/change-settings.ipynb +++ b/docs/source/examples/notebooks/change-settings.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -10,13 +11,14 @@ "\n", "\n", "### Table of Contents\n", - "1. [Default SPM model](#default)\n", - "1. [Changing the parameters](#parameters)\n", - "1. [Changing the discretisation](#discretisation)\n", - "1. [Changing the solver](#solver)" + "1. Default SPM model\n", + "1. Changing the parameters\n", + "1. Changing the discretisation\n", + "1. Changing the solver" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -76,6 +78,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -419,6 +422,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -468,6 +472,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -516,6 +521,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -533,6 +539,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -550,6 +557,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -617,6 +625,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -646,6 +655,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Creating Models/1-an-ode-model.ipynb b/docs/source/examples/notebooks/creating_models/1-an-ode-model.ipynb similarity index 97% rename from examples/notebooks/Creating Models/1-an-ode-model.ipynb rename to docs/source/examples/notebooks/creating_models/1-an-ode-model.ipynb index a31e6e7b62..6c3f8029e3 100644 --- a/examples/notebooks/Creating Models/1-an-ode-model.ipynb +++ b/docs/source/examples/notebooks/creating_models/1-an-ode-model.ipynb @@ -1,26 +1,25 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Creating a simple ODE model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this series of notebooks, we will run through the steps involved in creating a new model within pybamm. Before using pybamm we recommend following the [Getting Started](../Getting%20Started) guides.\n", + "# Creating a simple ODE model\n", + "\n", + "In this series of notebooks, we will run through the steps involved in creating a new model within pybamm. Before using pybamm we recommend following the [Getting Started](../getting_started/tutorial-1-how-to-run-a-model.ipynb) guides.\n", "\n", "In this notebook we create and solve the following simple ODE model:\n", "\n", - "\\begin{align*}\n", - " \\frac{\\textrm{d} x}{\\textrm{d} t} &= 4x - 2y, \\quad x(0) = 1, \\\\\n", - " \\frac{\\textrm{d} y}{\\textrm{d} t} &= 3x - y, \\quad y(0) = 2.\n", - "\\end{align*}\n", + "$$\n", + " \\frac{\\textrm{d}x}{\\textrm{d} t} = 4x - 2y, \\quad x(0) = 1,\n", + "$$\n", + "\n", + "$$\n", + " \\frac{\\textrm{d}y}{\\textrm{d} t} = 3x - y, \\quad y(0) = 2.\n", + "$$\n", "\n", - "We begin by importing the pybamm library into this notebook, along with numpy and matplotlib, which we use for plotting:\n" + "We begin by importing the PyBaMM library into this notebook, along with NumPy and Matplotlib, which we use for plotting:\n" ] }, { @@ -44,6 +43,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -51,6 +51,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -67,6 +68,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -84,6 +86,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -101,6 +104,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -117,6 +121,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -133,6 +138,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -149,6 +155,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -156,6 +163,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -163,6 +171,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -180,6 +189,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -198,6 +208,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -216,6 +227,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -229,7 +241,7 @@ "outputs": [ { "data": { - "image/png": "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t4777ruPcePGAe7LhNatW0ejRo2YOHHi4fs+W7Zsydq1a2nWrFmZ9lFZPosXFQB/s9bON8ZEA/OMMVOttcuOWGYdcKa1do8x5jzc/SGU8/SUVEV7D+axZPM+Onw9guhj7tl0FeXQb8srTGl4JkNOjadF7Wha1ommWVLU8Qd6j1UZxeKh9fpr213Gz2yMISkmnL4x4fRtVRtwf/du35fLwvS91PvI8wF5m5nOb6sy6JpSi3BXcKV8FCmdjIwMXC4XcXFxZGdnM3XqVO677z6Py7Zs2ZKMjAxmzpx5+L7HlStX0rZtW8aMGUPr1q154oknuOGGG5g5cyYul4uioiI+/vhjBg8ezPvvv0/Pnj2B/7WVvXv3Bv7Xvhy6bNVay7Zt2467DHbgwIEMHDjQY75zzz2Xf/7zn1x99dVERUWxefNmXC4XtWrV4sYbb+SDDz7g7bff5plnnuHvf/87AFOnTmX37t1ERETw+eef8+abb1KzZk0KCwvJyckhPDycvLw8Bg4cyJAhQw5fNnwipf0sZaVrJwORD44ghp070uMZVWstew/ms3H3QTbsPsim3QfZuOsgG3YfYM663fwteywh5pijRPnZ7PnyYT7a25mmiVE0SYyiQc2IE3etLlKNzJgxg3fffZf27dtzyimnAPDEE09w/vnne1z+vffe49Zbb2X06NHk5+czePBg6tevz/3338+0adNo0KABd9xxB3fddRdvv/02AHv27CE1NZWwsDA++OADAM477zyuvfbaw+u9/vrrueWWWw533LNv3z4iIiIO339SGm3atGH06NGcc845FBUV4XK5eOGFF/jll19wuVxcddVVFBYWctppp/Hjjz8SFBRE165dueOOOw53QnSowb7gggv4+eefadasWZn3kTc+S1kU33aytfh1ljFmOVAfWHbEMr8f8SezcPeXIAEqJ7+QxZszmb9hDws27WXx5kzS97jb2rVhW93nwY9Rl528c2O38m3Qn4vFylLBz2yMoU5sOHVi68AUzwfkt9h4rn1jDuGuIHo0iadX80TObJlIk4Qa6tzIx7Zu3cp1111HYWEhRUVFDBo0iAsvvNDjsqGhoXz88cfceeedZGZmUlBQwN13301ISAivv/46c+bMITo6ml69ejF69GgeffRRatSowZw5cxg9ejRJSUlMnDgRcLdFr7zyCjfddBMAw4cPp3//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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6AAAAEYCAYAAABCw5uAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABYyUlEQVR4nO3dd3hUVf7H8fdJMmmkQQotQOg9SEdFpFiwoVhYbFgQrGvb/a11ERFdd11FEXtDxQJ27CAWFGkB6UhvoYYWAqTn/P6YwFImkDKZO5l8Xs8zz8zce3PvZ644Z763nGOstYiIiIiIiIhUtiCnA4iIiIiIiEj1oAJUREREREREfEIFqIiIiIiIiPiEClARERERERHxCRWgIiIiIiIi4hMhTgc4kYSEBJuSkuJ0DBERkaPMmzdvp7U20ekcaidFRMRfldRW+nUBmpKSQlpamtMxREREjmKM2eB0BlA7KSIi/quktlKX4IqIiIiIiIhPqAAVERERERERn1ABKiIiIiIiIj7h1/eAioj4g/z8fNLT08nJyXE6ivhYeHg4ycnJuFwup6OIiPg1tZXVV1nbShWgIiInkZ6eTnR0NCkpKRhjnI4jPmKtZdeuXaSnp9O4cWOn44iI+DW1ldVTedpKXYIrInISOTk5xMfHq0GtZowxxMfH62i+iEgpqK2snsrTVnqlADXGvGmM2WGMWVLCfGOMGWuMWW2MWWSM6eSN7ZbKokkwph2MjHM/L5rkX+sTkSpBDWr1pP/uIj6k31hVnr4zq6ey/nf31hnQ8UD/E8w/D2he/BgOvOSl7Z7Yoknw5Z2QuQmw7ucv7yz/F5q313fkevWFKyIiIlWJN3+/VNZvLBHxO165B9RaO90Yk3KCRS4G3rHWWmCWMSbOGFPXWrvVG9sv0bRRkJ999LT8bHZPfph/rWhJkDEEBbmr9iCD+70xGAOG4mlBBlewwRUcxI1z/0mMh/Ud/PYRpgf1IjTEvdyhR4QrmIjQYPezK5jw0CBCg4OOPkpw6Av30HoPfeECpA4q3+deNMn92TPTITYZ+o0o/7pExHGbNm1iyJAhbN++HWMMw4cP56677jo8f/z48fTu3ZtGjRp5/ejzs88+S61atRgyZAjjx4/nnHPOoV69egAMHjyYxx57jObNm3t1m6VlraVfv358/vnnZGZmlmkf+dtnEal0XvxtUFBYRM78D4n8/l6CCv73+6Xgi78yc1UGfyaeR25BIbkFRe5Hvvt1QZE9vA5rj17nQ6seppaH31j7vxnBVzk9iIlwERPuIiYihNji19HhIYQEn+Bcin4PVSs5OTn06tWL3NxcCgoKuPzyy3n00Uex1mKMYeTIkYwcOfLwe2+6++67ufTSS+nVqxfPPvssw4cPJzIyEoCzzjqLjz76iJo1a3p1m6WVnZ1N//79+fHHH1m8eDG33nor+/btIzg4mIceeoi//OUvJe6jyvosxh77DVDeFbkL0K+ste08zPsKeNJa+1vx+2nAfdbaNA/LDsd9lpSGDRt23rBhQ/lDjYwDjv98RRh6hn1CkQWLdT9b93ORtRQVWeyh1xYKiorIL7SsDbuKIA//XousoUnue6WKFGQoLkxDiAgN4uPs4dS2Gccttze0Dm93+4ro8BCiwkOICQ8hOtxFVFgI0cWvo8NDCAs5SUEL4IqAi8bqS1eknJYvX07r1q0d2/7WrVvZunUrnTp1Iisri86dO/P5558TGxvLI488QqNGjWjcuDG//vorr7zyite2W1BQQKdOnZg/fz4hISH07t2b//73v3Tp0gWAX375hQkTJvDaa695bZtl8fXXX/PDDz8wZsyYMu+jsnwWT//9jTHzrLVdfPJBT6BLly42Le24plTkaKX4bZBbUMi2zBy2Zuawc38uO7Ny2bk/j537c8nIynVP25/H3oN5HMgr5LfQO0kO2nncptKLEuiZNxYAYyA8JJgwl/sAvOsExeKvOZcS5Ok320l+Y0WHh5AUHUZSdDhJMWGHX3fMnErHBY8QXKjfQ77idFtpreXAgQNERUWRn59Pz549ee655wgLC+Ott94CoG/fvsyZM4cnnnjCa9vdtWsXF1xwAbNmzQIgJSWFtLQ0EhISAHj77bdJT0/noYce8to2y+KFF16goKCAu+66i5UrV2KMoXnz5mzZsoXOnTuzfPly1q1b53EfleWzlKWt9LtecK21rwKvgrthrdDKYpOLL+U4WlBsMr/f06+sueDZZPdRtGMURtfjm5vPIL+wiPzCIvIKi8grKCInv4ic/EIO5hWSnV9ITn4h2cWvs/MLyckrJGn58V/eADG52xnzw8qT5nIFG2IjQqkZ6aJmZCgv7XyI+ILjjyDmfj+STXXOp1aNUOIiXAR5qqRLoiOIIo6qW7cudevWBSA6OprWrVuzefNm2rRpw+OPP0737t1p164dkydPBmDNmjXcfvvtZGRkEBkZyWuvvUazZs049dRTeeqpp+jduzcPPPAAQUFBPP7446SkpDBo0CC+/fZbIiIieP/992nWrBk//vgjnTp1IiQkhI8//pi0tDSuvvpqIiIimDlzJmeccQbXX389BQUFhISUvjmZMGECY8eOJS8vj+7du/Piiy8yf/58hg4dypw5cygsLKRbt25MnDiRnTt3MmLECKKjo1m9ejV9+vThxRdfJCgoiPfee4/hw4eXeR9587OIVAklXBG2a/LDDP21Ppv3ZpORlXvcnwUHGWrVCCUhKozE6DCaJkVRMzKUmHAX9X/b5XFT9YN2sXjkOYSFBOMKNqU/0zTG8282Yuvz+4192ZeTz77sAvZl55OZnc++HPfzngN57MjKZUdWLvM37mHHvlxyC4r4LfQ/BAcd/5n3fvkwn+7rSvPaUTRPiqZ2TJjuWwwQxhiioqIA95Aw+fn5GGPo2LEjERERnHrqqeTn5/PSS+47AefNm8e9997L/v37SUhIYPz48URGRtKtWzcmT55My5YtufLKK+nbty/Dhg0jKiqKYcOGMWXKFOrUqcOHH35IYmIin3zyCf37u+9EHDt2LFu2bKFPnz4kJCTw008/MWDAAM4444wyF6BPPfUUkyZNIjc3l4EDB/Loo4/y2WefMW7cOH744Qe2bdvGmWeeyfTp0/nuu+/47LPPyMzMZPPmzVxzzTU88sgjALz33nu8//77ALRo0eLw+uvVq0dSUhIZGRke95E3P8uxfNXKbgYaHPE+uXha5eo3wvMRv34jyrwqYwz0e8Tj+lznjKRNvZjyZSzhCzcoLplVd57HgdwCsnIOPfLJyilgf27x6+J5ew+6v4D3HMyjZsHxZ1MBXPu3cNYzvwDuBiUhKpTE6DASixuV/70O/9/76DBqrPgU4+1LhEWqsEe/XMqyLfu8us429WJ45KK2pVp2/fr1/PHHH3Tv3p0tW7bwyCOPcOONN9K4cWNuv/12XnrpJYYPH87LL79M8+bNmT17Nrfddhs//vgj48eP5/LLL+f555/nu+++Y/bs2YfXGxsby+LFi3nnnXe4++67+eqrr5gxYwadO3cG4PLLL2fcuHFHnTUEaNasGQsXLjy83MksX76ciRMnMmPGDFwuF7fddhvvvfceQ4YMYcCAATz88MNkZ2dzzTXX0K5dO37++WfmzJnDsmXLaNSoEf379+fTTz/l8ssvZ8aMGR7P+JZmH3njs4j4m7yCIjbuPsj6nQdYt/MA63YdYP3OA0zITPfY6UfNgh1EhYXQp2Ui9eMiqRcXTt3YCBKiQ0mMCqNmZGjJB6wXe/79YmKTiQ4vx7i5JfxmCzrrEerFRVCPiFKtxlpLVm4B0U96LpBj8nYw6qtlh99Hh4fQonY0zZOiaFE7mnb1Y2lbL4YaYR5+IuuAfKk51VYWFhbSuXNnVq9eze2330737t1ZsGABb731Ftdeey19+/bl4Ycf5pFHHuGvf/0rX3zxBYmJiUycOJGHHnqIN998k3HjxnH99ddz1113sWfPHoYNGwbAgQMH6NKlC2PGjGHUqFE8+uijjBs3jhkzZnD55ZcDcOedd/LMM8/w008/HT5rWLNmTXJzc9m1axfx8fGl+qxTpkxh1apVzJkzB2stAwYMYPr06QwcOJBPPvmEF154ge+++45HH32UOnXqADBnzhyWLFlCZGQkXbt25YILLiA1NZW1a9eSkpJy3DbmzJlDXl4eTZs29biPRo8e7ZXP4omvCtDJwB3GmA+B7kBmpd//Cf/7UvDWl4W31wcnLJJdwUHERYYSFxla+vWVUNDm1ajLcwNPYfeBPHbtzyMjK5eM4stqlm/NYuf+3KPuzThkRtgD1DfHH0HM+e4R0uucR93YCM9f0iLidfv37+eyyy7j2WefJSYmhpiYGF577TXGjx/PGWecwTXXXMP+/fv5/fffueKKKw7/XW6u+8xG27Ztufbaa7nwwguZOXMmoaH/+2658sorDz/fc889gPvS35NdTpWUlHT4Mp7SmDZtGvPmzaNr166A+96UpKQkAEaMGEHXrl0JDw9n7Nixh/+mW7duNGnS5HC+3377jcsvv5zdu3cTHR1d5n3krc8iUqlOUOwUFlk27DrAyu1ZrNi2n5Xbs/hz2z7W7zpI4RFteVyki8YJNdgbkkStgu3HbSIoNpkJN3UvXz4vHuQHvPYbyxhDTLirxKvgTFwyacPOYuX2LFbvcO+7ldv38/3SbXw4d1PxOqBZYhTtk2NpXz+W1ORY2u+eQug3d+uAvJ8LDg5mwYIF7N27l4EDB7JkyRI6dOjAc889x8iRI7nkkku4+OKLWbp0KUuWLOHss88G3IXroatozj77bD766CNuv/12Fi5ceHjdQUFB/OUvfwHgmmuu4dJLLwXcbWViYuIJcx1qX8pSgE6ZMoWOHTsC7rZt1apV9OrVi+eff5527drRo0ePw233odyH1n/ppZfy22+/Ua9ePeLi4o5b/9atW7n22mt5++23CQoK8riPvPVZPPFK5WCM+QDoDSQYY9KBRwAXgLX2ZeAb4HxgNXAQuMEb2y2V1EHe/WKojPWB94raEhqE8P6PcnFq/RL/rKjIsjc7nx1ZOe7itPhR7yfPRxBDD2zlrGemAxATHkK9uAjqxobTsFYkDWpF0rBWJI3ia9CgVgSRocf8M9MRRKnCSnum0tvy8/O57LLLuPrqqw83eodcf/31h18XFRURFxfHggULPK5n8eLFxMXFsWPHjqOmH3kJ2qHXERERJx3XKycnh4iIo89MzJ49m5tvvhmAUaNGMWDAgMPzrLVcd911/Otf/zpuXbt27WL//v3k5+eTk5NDjRo1jst25PuQkBCKiooICnKf2yntPirLZ/EWY0wD4B2gNu7OCV611j53zDJXA/cBBsgCbrXWLjx2XVINeOigMP/zvzJx1gY+zO3Bqu37yS0oAtzFUqNakbSoHc157erSJLEGjRPcj8MHsBeN9m6xCJVzUN6bv7FK+D1k+o0gISqMhKgwTmuacHiWtZaMrFyWbMlkUXomi9Mz+XXVTj6d775gb0bYQx4PyDNtlH7DeOBUW3lIXFwcffr04bvvvqNdO3f3NCNHjgTcbYi1lrZt2zJz5szj/raoqIjly5cTGRnJnj17SE5O9riNiraVn332GY8++igAr7/++lFX5FhreeCBBw63pUdKT08nKCiI7du3H9UGemorPWXbt28fF1xwAY8//jg9evQ46m+P3Edl+Sxl5a1ecK88yXwL3O6NbQUkb37hlrNBCCq+z6NWjVBa1TlixnzPRxDzo+rx3MBT2LI3h62Z2WzZm8OWvdmkrd9DVm7BUcsmRofRsLgoPbvgF85Z+wQhhcX/M+gIoshJWWsZOnQorVu35t577z3hsjExMTRu3JiPPvqIK664AmstixYtokOHDnz66afs3r2b6dOnc+GFFzJnzpzDR0YnTpzI/fffz8SJEzn11FMBaN26NatXrz687ujoaLKyso7a3sqVKw837occuuTJk379+nHxxRdzzz33kJSUxO7du8nKyqJRo0bcfPPNPPbYY6xbt4777ruPcePGAe7LhNatW0ejRo2YOHHi4fs+W7Zsydq1a2nWrFmZ9lFZPosXFQB/s9bON8ZEA/OMMVOttcuOWGYdcKa1do8x5jzc/SGU8/SUVEV7D+axZPM+Onw9guhj7tl0FeXQb8srTGl4JkNOjadF7Wha1ommWVLU8Qd6j1UZxeKh9fpr213Gz2yMISkmnL4x4fRtVRtwf/du35fLwvS91PvI8wF5m5nOb6sy6JpSi3BXcKV8FCmdjIwMXC4XcXFxZGdnM3XqVO677z6Py7Zs2ZKMjAxmzpx5+L7HlStX0rZtW8aMGUPr1q154oknuOGGG5g5cyYul4uioiI+/vhjBg8ezPvvv0/Pnj2B/7WVvXv3Bv7Xvhy6bNVay7Zt2467DHbgwIEMHDjQY75zzz2Xf/7zn1x99dVERUWxefNmXC4XtWrV4sYbb+SDDz7g7bff5plnnuHvf/87AFOnTmX37t1ERETw+eef8+abb1KzZk0KCwvJyckhPDycvLw8Bg4cyJAhQw5fNnwipf0sZaVrJwORD44ghp070uMZVWstew/ms3H3QTbsPsim3QfZuOsgG3YfYM663fwteywh5pijRPnZ7PnyYT7a25mmiVE0SYyiQc2IE3etLlKNzJgxg3fffZf27dtzyimnAPDEE09w/vnne1z+vffe49Zbb2X06NHk5+czePBg6tevz/3338+0adNo0KABd9xxB3fddRdvv/02AHv27CE1NZWwsDA++OADAM477zyuvfbaw+u9/vrrueWWWw533LNv3z4iIiIO339SGm3atGH06NGcc845FBUV4XK5eOGFF/jll19wuVxcddVVFBYWctppp/Hjjz8SFBRE165dueOOOw53QnSowb7gggv4+eefadasWZn3kTc+S1kU33aytfh1ljFmOVAfWHbEMr8f8SezcPeXIAEqJ7+QxZszmb9hDws27WXx5kzS97jb2rVhW93nwY9Rl528c2O38m3Qn4vFylLBz2yMoU5sOHVi68AUzwfkt9h4rn1jDuGuIHo0iadX80TObJlIk4Qa6tzIx7Zu3cp1111HYWEhRUVFDBo0iAsvvNDjsqGhoXz88cfceeedZGZmUlBQwN13301ISAivv/46c+bMITo6ml69ejF69GgeffRRatSowZw5cxg9ejRJSUlMnDgRcLdFr7zyCjfddBMAw4cPp3//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", "text/plain": [ "
" ] @@ -257,6 +269,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -264,6 +277,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -310,7 +324,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.0" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/examples/notebooks/Creating Models/2-a-pde-model.ipynb b/docs/source/examples/notebooks/creating_models/2-a-pde-model.ipynb similarity index 98% rename from examples/notebooks/Creating Models/2-a-pde-model.ipynb rename to docs/source/examples/notebooks/creating_models/2-a-pde-model.ipynb index 068638745d..87caff52c5 100644 --- a/examples/notebooks/Creating Models/2-a-pde-model.ipynb +++ b/docs/source/examples/notebooks/creating_models/2-a-pde-model.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,21 +9,22 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In the [previous notebook](./1-an-ode-model.ipynb) we show how to create, discretise and solve an ODE model in pybamm. In this notebook we show how to create and solve a PDE problem, which will require meshing of the spatial domain.\n", "\n", "As an example, we consider the problem of linear diffusion on a unit sphere,\n", - "\\begin{equation*}\n", + "$$\n", " \\frac{\\partial c}{\\partial t} = \\nabla \\cdot (\\nabla c),\n", - "\\end{equation*}\n", + "$$\n", "with the following boundary and initial conditions:\n", - "\\begin{equation*}\n", + "$$\n", " \\left.\\frac{\\partial c}{\\partial r}\\right\\vert_{r=0} = 0, \\quad \\left.\\frac{\\partial c}{\\partial r}\\right\\vert_{r=1} = 2, \\quad \\left.c\\right\\vert_{t=0} = 1.\n", - "\\end{equation*}\n", + "$$\n", "\n", - "As before, we begin by importing the pybamm library into this notebook, along with any other packages we require:\n" + "As before, we begin by importing the PyBaMM library into this notebook, along with any other packages we require:\n" ] }, { @@ -46,6 +48,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -53,6 +56,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -71,6 +75,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -78,6 +83,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -97,6 +103,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -119,6 +126,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -137,6 +145,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -144,6 +153,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,6 +161,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -173,6 +184,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -192,6 +204,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -199,6 +212,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -217,6 +231,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -224,6 +239,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -231,6 +247,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -251,7 +268,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -287,6 +304,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -294,6 +312,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Creating Models/3-negative-particle-problem.ipynb b/docs/source/examples/notebooks/creating_models/3-negative-particle-problem.ipynb similarity index 98% rename from examples/notebooks/Creating Models/3-negative-particle-problem.ipynb rename to docs/source/examples/notebooks/creating_models/3-negative-particle-problem.ipynb index a4676b01cd..4ff90d6fba 100644 --- a/examples/notebooks/Creating Models/3-negative-particle-problem.ipynb +++ b/docs/source/examples/notebooks/creating_models/3-negative-particle-problem.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,17 +9,18 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In the [previous notebook](./2-a-pde-model.ipynb) we saw how to solve a PDE model in pybamm. Now it is time to solve a real-life battery problem! We consider the problem of spherical diffusion in the negative electrode particle within the single particle model. That is,\n", - "\\begin{equation*}\n", + "$$\n", " \\frac{\\partial c}{\\partial t} = \\nabla \\cdot (D \\nabla c),\n", - "\\end{equation*}\n", + "$$\n", "with the following boundary and initial conditions:\n", - "\\begin{equation*}\n", + "$$\n", " \\left.\\frac{\\partial c}{\\partial r}\\right\\vert_{r=0} = 0, \\quad \\left.\\frac{\\partial c}{\\partial r}\\right\\vert_{r=R} = -\\frac{j}{FD}, \\quad \\left.c\\right\\vert_{t=0} = c_0,\n", - "\\end{equation*}\n", + "$$\n", "where $c$ is the concentration, $r$ the radial coordinate, $t$ time, $R$ the particle radius, $D$ the diffusion coefficient, $j$ the interfacial current density, $F$ Faraday's constant, and $c_0$ the initial concentration. \n", "\n", "In this example we use the following parameters:\n", @@ -34,11 +36,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Setting up the model\n", - "As before, we begin by importing the pybamm library into this notebook, along with any other packages we require, and start with an empty `pybamm.BaseModel`\n" + "As before, we begin by importing the PyBaMM library into this notebook, along with any other packages we require, and start with an empty `pybamm.BaseModel`\n" ] }, { @@ -64,10 +67,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "We then define all of the model variables and parameters. Parameters are created using the `pybamm.Parameter` class and are given informative names (with units). Later, we will provide parameter values and the `Parameter` objects will be turned into numerical values. For more information please see the [parameter values notebook](../parameter-values.ipynb)." + "We then define all of the model variables and parameters. Parameters are created using the `pybamm.Parameter` class and are given informative names (with units). Later, we will provide parameter values and the `Parameter` objects will be turned into numerical values. For more information please see the [parameter values notebook](../parameterization/parameter-values.ipynb)." ] }, { @@ -86,6 +90,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -113,6 +118,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -133,6 +139,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -140,6 +147,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -164,13 +172,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "Here all of the parameters are simply scalars, but they can also be functions or read in from data (see [parameter values notebook](../parameter-values.ipynb))." + "Here all of the parameters are simply scalars, but they can also be functions or read in from data (see [parameter values notebook](../parameterization/parameter-values.ipynb))." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -188,6 +198,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -205,6 +216,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -227,6 +239,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -234,6 +247,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -241,6 +255,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -302,6 +317,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -309,6 +325,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Creating Models/4-comparing-full-and-reduced-order-models.ipynb b/docs/source/examples/notebooks/creating_models/4-comparing-full-and-reduced-order-models.ipynb similarity index 96% rename from examples/notebooks/Creating Models/4-comparing-full-and-reduced-order-models.ipynb rename to docs/source/examples/notebooks/creating_models/4-comparing-full-and-reduced-order-models.ipynb index e176cdcb6d..253bd6af87 100644 --- a/examples/notebooks/Creating Models/4-comparing-full-and-reduced-order-models.ipynb +++ b/docs/source/examples/notebooks/creating_models/4-comparing-full-and-reduced-order-models.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -15,14 +17,14 @@ "\n", "In the limit of fast diffusion in the particles the concentration is uniform in $r$. This result in the following ODE model for the (uniform) concentration in the particle \n", "\n", - "\\begin{equation*}\n", + "$$\n", " \\frac{\\textrm{d} c}{\\textrm{d} t} = -3\\frac{j}{RF}\n", - "\\end{equation*}\n", + "$$\n", "with the initial condition:\n", - "\\begin{equation*}\n", + "$$\n", "\\left.c\\right\\vert_{t=0} = c_0,\n", - "\\end{equation*}\n", - "where $c$ is the concentration, $r$ the radial coordinate, $t$ time, $R$ the particle radius, $D$ the diffusion coefficient, $j$ the interfacial current density, $F$ Faraday's constant, and $c_0$ the initial concentration. \n", + "$$\n", + "where $c$$ is the concentration, $r$ the radial coordinate, $t$ time, $R$ the particle radius, $D$ the diffusion coefficient, $j$ the interfacial current density, $F$ Faraday's constant, and $c_0$ the initial concentration. \n", "\n", "As in the previous example we use the following parameters:\n", "\n", @@ -36,6 +38,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -69,6 +72,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,6 +89,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -105,6 +110,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -122,6 +128,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -154,6 +161,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -184,6 +192,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -191,6 +200,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -215,6 +225,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,6 +249,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -265,6 +277,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -272,6 +285,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -279,6 +293,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -364,6 +379,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -371,6 +387,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -378,6 +395,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Creating Models/5-half-cell-model.ipynb b/docs/source/examples/notebooks/creating_models/5-half-cell-model.ipynb similarity index 96% rename from examples/notebooks/Creating Models/5-half-cell-model.ipynb rename to docs/source/examples/notebooks/creating_models/5-half-cell-model.ipynb index 445e29b594..bb5acd5df6 100644 --- a/examples/notebooks/Creating Models/5-half-cell-model.ipynb +++ b/docs/source/examples/notebooks/creating_models/5-half-cell-model.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "id": "professional-composer", "metadata": {}, @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "naval-management", "metadata": {}, @@ -18,39 +20,40 @@ "We consider a problem posed on a half-cell geometry, which consists of a separator ($-L_s \u001b[0m\u001b[32;49m23.1.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -41,6 +39,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -48,6 +47,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -72,6 +72,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -90,6 +91,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -98,27 +100,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "module 'pybamm.step' has no attribute '_Step'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[5], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m sim \u001b[38;5;241m=\u001b[39m \u001b[43mpybamm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSimulation\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexperiment\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexperiment\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32mc:\\code\\pybamm\\pybamm\\simulation.py:101\u001b[0m, in \u001b[0;36mSimulation.__init__\u001b[1;34m(self, model, experiment, geometry, parameter_values, submesh_types, var_pts, spatial_methods, solver, output_variables, C_rate)\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parameter_values\u001b[38;5;241m.\u001b[39mupdate(\n\u001b[0;32m 95\u001b[0m {\n\u001b[0;32m 96\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCurrent function [A]\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mC_rate\n\u001b[0;32m 97\u001b[0m \u001b[38;5;241m*\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parameter_values[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNominal cell capacity [A.h]\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 98\u001b[0m }\n\u001b[0;32m 99\u001b[0m )\n\u001b[0;32m 100\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 101\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(experiment, (\u001b[38;5;28mstr\u001b[39m, \u001b[43mpybamm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexperiment\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_Step\u001b[49m)):\n\u001b[0;32m 102\u001b[0m experiment \u001b[38;5;241m=\u001b[39m pybamm\u001b[38;5;241m.\u001b[39mExperiment([experiment])\n\u001b[0;32m 103\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(experiment, \u001b[38;5;28mlist\u001b[39m):\n", - "\u001b[1;31mAttributeError\u001b[0m: module 'pybamm.step' has no attribute '_Step'" - ] - } - ], + "outputs": [], "source": [ "sim = pybamm.Simulation(model, experiment=experiment)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -133,12 +123,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3254388ac62b4c2f80f15cfa4ad42f73", + "model_id": "45c0c0129d8f4610a494ffaaadddaa5a", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=38.90909528397491, step=0.38909095283974904)…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=38.90909528447357, step=0.3890909528447357),…" ] }, "metadata": {}, @@ -147,7 +137,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -161,6 +151,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -209,6 +200,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -236,6 +228,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -243,6 +236,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -270,6 +264,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -297,6 +292,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -315,7 +311,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "88acadd29b9246f8a12940a4912dc12b", + "model_id": "6a03bebbd6a34a33a942c3106b70a0dd", "version_major": 2, "version_minor": 0 }, @@ -329,7 +325,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -348,6 +344,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -355,13 +352,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "In this notebook we have seen how to use the Experiment class to run simulations of more complex operating conditions. In [Tutorial 6](./Tutorial%206%20-%20Managing%20simulation%20outputs.ipynb) we will see how to manage the outputs of the simulation." + "In this notebook we have seen how to use the Experiment class to run simulations of more complex operating conditions. In [Tutorial 6](./tutorial-6-managing-simulation-outputs.ipynb) we will see how to manage the outputs of the simulation." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -412,7 +411,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.11.4" }, "toc": { "base_numbering": 1, diff --git a/examples/notebooks/Getting Started/Tutorial 6 - Managing simulation outputs.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-6-managing-simulation-outputs.ipynb similarity index 95% rename from examples/notebooks/Getting Started/Tutorial 6 - Managing simulation outputs.ipynb rename to docs/source/examples/notebooks/getting_started/tutorial-6-managing-simulation-outputs.ipynb index 01e3913159..79d87dca8e 100644 --- a/examples/notebooks/Getting Started/Tutorial 6 - Managing simulation outputs.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-6-managing-simulation-outputs.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -48,6 +50,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -55,6 +58,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -71,10 +75,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "and now we can create a post-processed variable (for a list of all the available variables see [Tutorial 3](./Tutorial%203%20-%20Basic%20plotting.ipynb))" + "and now we can create a post-processed variable (for a list of all the available variables see [Tutorial 3](./tutorial-3-basic-plotting.ipynb))" ] }, { @@ -88,6 +93,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -134,6 +140,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -185,6 +192,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -212,6 +220,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -219,6 +228,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -235,6 +245,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -251,6 +262,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -282,6 +294,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -299,6 +312,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -341,6 +355,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -357,6 +372,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -376,13 +392,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "In this notebook we have shown how to extract and store the outputs of PyBaMM's simulations. Next, in [Tutorial 7](./Tutorial%207%20-%20Model%20options.ipynb) we will show how to change the model options." + "In this notebook we have shown how to extract and store the outputs of PyBaMM's simulations. Next, in [Tutorial 7](./tutorial-7-model-options.ipynb) we will show how to change the model options." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -404,6 +422,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Getting Started/Tutorial 7 - Model options.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-7-model-options.ipynb similarity index 85% rename from examples/notebooks/Getting Started/Tutorial 7 - Model options.ipynb rename to docs/source/examples/notebooks/getting_started/tutorial-7-model-options.ipynb index 2e5de0b692..4156735352 100644 --- a/examples/notebooks/Getting Started/Tutorial 7 - Model options.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-7-model-options.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -32,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this tutorial, we add a thermal model to the SPMe. From the [documentation](https://pybamm.readthedocs.io/en/latest/source/api/models/base_models/base_battery_model.html), we see that we have a choice of either a 'x-full' thermal model or a number of different lumped thermal models. For a deeper look at the thermal models see the [thermal models notebook](../models/thermal-models.ipynb). We choose the full thermal model, which solves the spatially-dependent heat equation on our battery geometry, and couples the temperature with the electrochemistry. We set the model options by creating a Python dictionary:" + "In this tutorial, we add a thermal model to the SPMe. From the [documentation](https://docs.pybamm.org/en/latest/source/api/models/base_models/base_battery_model.html), we see that we have a choice of either a 'x-full' thermal model or a number of different lumped thermal models. For a deeper look at the thermal models see the [thermal models notebook](../models/thermal-models.ipynb). We choose the full thermal model, which solves the spatially-dependent heat equation on our battery geometry, and couples the temperature with the electrochemistry. We set the model options by creating a Python dictionary:" ] }, { @@ -45,6 +46,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -75,10 +77,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "We now plot the cell temperature and the total heating by passing these variables to the `plot` method as we saw in [Tutorial 3](./Tutorial%203%20-%20Basic%20plotting.ipynb):" + "We now plot the cell temperature and the total heating by passing these variables to the `plot` method as we saw in [Tutorial 3](./tutorial-3-basic-plotting.ipynb):" ] }, { @@ -120,12 +123,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this tutorial we have seen how to adjust the model options. To see all of the options currently available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/api/models/base_models/base_battery_model.html).\n", + "In this tutorial we have seen how to adjust the model options. To see all of the options currently available in PyBaMM, please take a look at the documentation [here](https://docs.pybamm.org/en/latest/source/api/models/base_models/base_battery_model.html).\n", "\n", - "In the [next tutorial](./Tutorial%208%20-%20Solver%20options.ipynb) we show how to change the solver options." + "In the [next tutorial](./tutorial-8-solver-options.ipynb) we show how to change the solver options." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Getting Started/Tutorial 8 - Solver options.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-8-solver-options.ipynb similarity index 92% rename from examples/notebooks/Getting Started/Tutorial 8 - Solver options.ipynb rename to docs/source/examples/notebooks/getting_started/tutorial-8-solver-options.ipynb index fabb0decd4..b3104f3435 100644 --- a/examples/notebooks/Getting Started/Tutorial 8 - Solver options.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-8-solver-options.ipynb @@ -1,16 +1,17 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 8 - Solver options\n", "\n", - "In [Tutorial 7](./Tutorial%207%20-%20Model%20options.ipynb) we saw how to change the model options. In this tutorial we will show how to pass options to the solver.\n", + "In [Tutorial 7](./tutorial-7-model-options.ipynb) we saw how to change the model options. In this tutorial we will show how to pass options to the solver.\n", "\n", "All models in PyBaMM have a default solver which is typically different depending on whether the model results in a system of ordinary differential equations (ODEs) or differential algebraic equations (DAEs). \n", "\n", - "One of the most common options you will want to change is the solver tolerances. By default all tolerances are set to $10^{-6}$. However, depending on your simulation you may find you want to tighten the tolerances to obtain a more accurate solution, or you may want to loosen the tolerances to reduce the solve time. It is good practice to conduct a tolerance study, where you simulate the same problem with a tighter tolerances and compare the results. We do not show how to do this here, but we give an example of a mesh resolution study in the [next tutorial](./Tutorial%209%20-%20Changing%20the%20mesh.ipynb), which is conducted in a similar way." + "One of the most common options you will want to change is the solver tolerances. By default all tolerances are set to $10^{-6}$. However, depending on your simulation you may find you want to tighten the tolerances to obtain a more accurate solution, or you may want to loosen the tolerances to reduce the solve time. It is good practice to conduct a tolerance study, where you simulate the same problem with a tighter tolerances and compare the results. We do not show how to do this here, but we give an example of a mesh resolution study in the [next tutorial](./tutorial-9-changing-the-mesh.ipynb), which is conducted in a similar way." ] }, { @@ -36,7 +37,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here we will change the absolute and relative tolerances, as well as the \"mode\" of the `CasadiSolver`. For a list of all the solver options please consult the [documentation](https://pybamm.readthedocs.io/en/latest/source/api/solvers/index.html).\n", + "Here we will change the absolute and relative tolerances, as well as the \"mode\" of the `CasadiSolver`. For a list of all the solver options please consult the [documentation](https://docs.pybamm.org/en/latest/source/api/solvers/index.html).\n", "\n", "The `CasadiSolver` can operate in a number of modes, including \"safe\" (default) and \"fast\". Safe mode performs step-and-check integration and supports event handling (e.g. you can integrate until you hit a certain voltage), and is the recommended for simulations of a full charge or discharge. Fast mode performs direct integration, ignoring events, and is recommended when simulating a drive cycle or other simulation where no events should be triggered.\n", "\n", @@ -106,6 +107,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -113,10 +115,11 @@ "\n", "Usually the default solver options provide a good combination of speed and accuracy, but we encourage you to investigate different solvers and options to find the best combination for your problem.\n", "\n", - "In the [next tutorial](./Tutorial%209%20-%20Changing%20the%20mesh.ipynb) we show how to change the mesh." + "In the [next tutorial](./tutorial-9-changing-the-mesh.ipynb) we show how to change the mesh." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/Getting Started/Tutorial 9 - Changing the mesh.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-9-changing-the-mesh.ipynb similarity index 94% rename from examples/notebooks/Getting Started/Tutorial 9 - Changing the mesh.ipynb rename to docs/source/examples/notebooks/getting_started/tutorial-9-changing-the-mesh.ipynb index 8a163e4082..14bb7e461d 100644 --- a/examples/notebooks/Getting Started/Tutorial 9 - Changing the mesh.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-9-changing-the-mesh.ipynb @@ -1,12 +1,13 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 9 - Changing the mesh\n", "\n", - "In [Tutorial 8](./Tutorial%207%20-%20Solver%20options.ipynb) we saw how to change the solver options. In this tutorial we will change the mesh used in the simulation, and show how to investigate the influence of the mesh on the solution.\n", + "In [Tutorial 8](./tutorial-8-solver-options.ipynb) we saw how to change the solver options. In this tutorial we will change the mesh used in the simulation, and show how to investigate the influence of the mesh on the solution.\n", "\n", "All models in PyBaMM have a default number of mesh points used in a simulation. However, depending on things like the operating conditions you are simulating or the parameters you are using, you may find you need to increase the number points in the mesh to obtain an accurate solution. On the other hand, you may find that you are able to decrease the number of mesh points and still obtain a solution with an acceptable degree of accuracy but in a shorter amount of computational time. \n", "\n", @@ -32,6 +33,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -50,6 +52,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,6 +88,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +112,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -136,6 +141,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -177,6 +183,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -195,6 +202,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -232,6 +240,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -273,13 +282,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "In the [next tutorial](./Tutorial%2010%20-%20Creating%20a%20model.ipynb) we show how to create a basic model from scratch in PyBaMM." + "In the [next tutorial](./tutorial-10-creating-a-model.ipynb) we show how to create a basic model from scratch in PyBaMM." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/docs/source/examples/notebooks/index.rst b/docs/source/examples/notebooks/index.rst new file mode 100644 index 0000000000..0e091400d1 --- /dev/null +++ b/docs/source/examples/notebooks/index.rst @@ -0,0 +1,115 @@ +Example Notebooks +================= + +This folder contains a collection of Jupyter notebooks that demonstrate how to use PyBaMM and reveal some of its functionalities and inner workings. +The notebooks are organised into subfolders, and can be viewed in the gallery below. + + +.. nbgallery:: + :caption: Getting Started + :glob: + :maxdepth: 1 + + getting_started/tutorial-1-how-to-run-a-model.ipynb + getting_started/tutorial-2-compare-models.ipynb + getting_started/tutorial-3-basic-plotting.ipynb + getting_started/tutorial-4-setting-parameter-values.ipynb + getting_started/tutorial-5-run-experiments.ipynb + getting_started/tutorial-6-managing-simulation-outputs.ipynb + getting_started/tutorial-7-model-options.ipynb + getting_started/tutorial-8-solver-options.ipynb + getting_started/tutorial-9-changing-the-mesh.ipynb + getting_started/tutorial-10-creating-a-model.ipynb + getting_started/tutorial-11-creating-a-submodel.ipynb + +.. nbgallery:: + :caption: Creating Models + :glob: + + creating_models/1-an-ode-model.ipynb + creating_models/2-a-pde-model.ipynb + creating_models/3-negative-particle-problem.ipynb + creating_models/4-comparing-full-and-reduced-order-models.ipynb + creating_models/5-half-cell-model.ipynb + creating_models/6-a-simple-SEI-model.ipynb + +.. nbgallery:: + :caption: Expression Tree + :glob: + + expression_tree/expression-tree.ipynb + expression_tree/broadcasts.ipynb + +.. nbgallery:: + :caption: Models + :glob: + + models/compare-comsol-discharge-curve.ipynb + models/compare-ecker-data.ipynb + models/compare-lithium-ion.ipynb + models/compare-particle-diffusion-models.ipynb + models/composite_particle.ipynb + models/coupled-degradation.ipynb + models/DFN-with-particle-size-distributions.ipynb + models/DFN.ipynb + models/electrode-state-of-health.ipynb + models/jelly-roll-model.ipynb + models/latexify.ipynb + models/lead-acid.ipynb + models/lithium-plating.ipynb + models/MPM.ipynb + models/pouch-cell-model.ipynb + models/rate-capability.ipynb + models/SEI-on-cracks.ipynb + models/simulating-ORegan-2022-parameter-set.ipynb + models/SPM.ipynb + models/SPMe.ipynb + models/submodel_cracking_DFN_or_SPM.ipynb + models/submodel_loss_of_active_materials.ipynb + models/thermal-models.ipynb + models/unsteady-heat-equation.ipynb + models/using-model-options_thermal-example.ipynb + models/using-submodels.ipynb + models/Validating_mechanical_models_Enertech_DFN.ipynb + +.. nbgallery:: + :caption: Parameterization + :glob: + + parameterization/change-input-current.ipynb + parameterization/parameter-values.ipynb + parameterization/parameterization.ipynb + +.. nbgallery:: + :caption: Plotting + :glob: + + plotting/customize-quick-plot.ipynb + plotting/plot-voltage-components.ipynb + +.. nbgallery:: + :caption: Solvers + :glob: + + solvers/dae-solver.ipynb + solvers/ode-solver.ipynb + solvers/speed-up-solver.ipynb + +.. nbgallery:: + :caption: Spatial Methods + :glob: + + spatial_methods/finite-volumes.ipynb + +.. nbgallery:: + :caption: Miscellaneous Notebooks + :glob: + + batch_study.ipynb + callbacks.ipynb + change-settings.ipynb + initialize-model-with-solution.ipynb + simulating-long-experiments.ipynb + simulation-class.ipynb + solution-data-and-processed-variables.ipynb + experiments-start-time.ipynb diff --git a/examples/notebooks/initialize-model-with-solution.ipynb b/docs/source/examples/notebooks/initialize-model-with-solution.ipynb similarity index 100% rename from examples/notebooks/initialize-model-with-solution.ipynb rename to docs/source/examples/notebooks/initialize-model-with-solution.ipynb diff --git a/examples/notebooks/models/DFN-with-particle-size-distributions.ipynb b/docs/source/examples/notebooks/models/DFN-with-particle-size-distributions.ipynb similarity index 99% rename from examples/notebooks/models/DFN-with-particle-size-distributions.ipynb rename to docs/source/examples/notebooks/models/DFN-with-particle-size-distributions.ipynb index 8607d7aad2..3f73593d49 100644 --- a/examples/notebooks/models/DFN-with-particle-size-distributions.ipynb +++ b/docs/source/examples/notebooks/models/DFN-with-particle-size-distributions.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -19,6 +21,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -46,6 +49,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -66,6 +70,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -73,6 +78,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -95,6 +101,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -102,6 +109,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -178,6 +186,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -251,6 +260,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -258,6 +268,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -305,6 +316,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -349,6 +361,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -356,6 +369,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -422,6 +436,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -429,6 +444,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -460,13 +476,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/DFN.ipynb b/docs/source/examples/notebooks/models/DFN.ipynb similarity index 79% rename from examples/notebooks/models/DFN.ipynb rename to docs/source/examples/notebooks/models/DFN.ipynb index d3086ea449..c96ad08f79 100644 --- a/examples/notebooks/models/DFN.ipynb +++ b/docs/source/examples/notebooks/models/DFN.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -27,68 +28,72 @@ "The model equations for the DFN read: \n", "\n", "#### Charge conservation:\n", - "\\begin{align}\n", - " \\frac{\\partial i_{\\text{e,k}}}{\\partial x} &= \\begin{cases}\n", + "$$\n", + " \\frac{\\partial i_{\\text{e,k}}}{\\partial x} = \\begin{cases}\n", " a_{\\text{k}}j_{\\text{k}}, \\quad &\\text{k} = \\text{n, p}\\\\ \n", " 0, \\qquad &\\text{k} = \\text{s}\n", - " \\end{cases} , && \\\\\n", - " i_{\\text{e,k}} &= \\epsilon_{\\text{k}}^{\\text{b}} \\kappa_{\\text{e}}(c_{\\text{e,k}}) \\left( - \\frac{\\partial \\phi_{\\text{e,k}}}{\\partial x} + 2(1-t^+)\\frac{RT}{F}\\frac{\\partial}{\\partial x}\\left(\\log(c_{\\text{e,k}})\\right)\\right), && \\text{k} \\in \\text{n, s, p}, \\\\ \n", - " I-i_{\\text{e,k}} &= - \\sigma_{\\text{k}} \\frac{\\partial \\phi_{\\text{e,k}}}{\\partial x}, && \\text{k} \\in \\text{n, s, p}.\n", - "\\end{align}\n", + " \\end{cases},\n", + "$$\n", + "\n", + "$$\n", + " i_{\\text{e,k}} = \\epsilon_{\\text{k}}^{\\text{b}} \\kappa_{\\text{e}}(c_{\\text{e,k}}) \\left( - \\frac{\\partial \\phi_{\\text{e,k}}}{\\partial x} + 2(1-t^+)\\frac{RT}{F}\\frac{\\partial}{\\partial x}\\left(\\log(c_{\\text{e,k}})\\right)\\right), \\text{k} \\in \\text{n, s, p}, \\\\ \n", + " I-i_{\\text{e,k}} = - \\sigma_{\\text{k}} \\frac{\\partial \\phi_{\\text{e,k}}}{\\partial x}, \\text{k} \\in \\text{n, s, p}.\n", + "$$\n", "\n", "#### Mass conservation:\n", - "\\begin{align}\n", - "\\epsilon_{\\text{k}} \\frac{\\partial c_{\\text{e,k}}}{\\partial t} &= -\\frac{\\partial N_{\\text{e,k}}}{\\partial x} + \\frac{1}{F}\\frac{\\partial i_{\\text{e,k}}}{\\partial x}, && \\text{k} \\in \\text{n, s, p},\\\\\n", - "N_{\\text{e,k}} &= -\\epsilon_{\\text{k}}^{\\text{b}} D_{\\text{e}}(c_{\\text{e,k}}) \\frac{\\partial c_{\\text{e,k}}}{\\partial x} + \\frac{t^+}{F} i_{\\text{e,k}},\n", - " && \\text{k} \\in \\text{n, s, p}, \\\\\n", - "\\frac{\\partial c_{\\text{s,k}}}{\\partial t} &= -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), && \\text{k} \\in \\text{n, p},\\\\\n", - "N_{\\text{s,k}} &= -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, && \\text{k} \\in \\text{n, p}. \n", - "\\end{align}\n", + "$$\n", + "\\epsilon_{\\text{k}} \\frac{\\partial c_{\\text{e,k}}}{\\partial t} = -\\frac{\\partial N_{\\text{e,k}}}{\\partial x} + \\frac{1}{F}\\frac{\\partial i_{\\text{e,k}}}{\\partial x}, \\text{k} \\in \\text{n, s, p},\\\\\n", + "N_{\\text{e,k}} = -\\epsilon_{\\text{k}}^{\\text{b}} D_{\\text{e}}(c_{\\text{e,k}}) \\frac{\\partial c_{\\text{e,k}}}{\\partial x} + \\frac{t^+}{F} i_{\\text{e,k}},\n", + "\\\\ \\text{k} \\in \\text{n, s, p}, \\\\\n", + "\\frac{\\partial c_{\\text{s,k}}}{\\partial t} = -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), \\\\ \\text{k} \\in \\text{n, p},\\\\\n", + "N_{\\text{s,k}} = -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, \\\\ \\text{k} \\in \\text{n, p}.\n", + "$$\n", "\n", "\n", "#### Electrochemical reactions:\n", - "\\begin{align}\n", - "j_{\\text{k}} &= 2 j_{\\text{0,k}} \\sinh\\left(\\frac{ F\\eta_{\\text{k}}}{2RT} \\right), && \\text{k} \\in \\text{n, p}, \\\\\n", - "j_{\\text{0,k}} &= c_{\\text{s,k}}^{1/2} (1-c_{\\text{s,k}})^{1/2}c_{\\text{e,k}}^{1/2}\\big|_{r_{\\text{k}}=1}, && \\text{k} \\in \\text{n, p}, \\\\\n", - "\\eta_{\\text{k}} &= \\phi_{\\text{s,k}} - \\phi_{\\text{e,k}} - U_{\\text{k}}(c_{\\text{s,k}}\\big|_{r_{\\text{k}}=1}), && \\text{k} \\in \\text{n, p}.\n", - "\\end{align}\n", + "$$\n", + "j_{\\text{k}} = 2 j_{\\text{0,k}} \\sinh\\left(\\frac{ F\\eta_{\\text{k}}}{2RT} \\right), \\\\ \\text{k} \\in \\text{n, p}, \\\\\n", + "j_{\\text{0,k}} = c_{\\text{s,k}}^{1/2} (1-c_{\\text{s,k}})^{1/2}c_{\\text{e,k}}^{1/2}\\big|_{r_{\\text{k}}=1}, \\\\ \\text{k} \\in \\text{n, p}, \\\\\n", + "\\eta_{\\text{k}} = \\phi_{\\text{s,k}} - \\phi_{\\text{e,k}} - U_{\\text{k}}(c_{\\text{s,k}}\\big|_{r_{\\text{k}}=1}), \\\\ \\text{k} \\in \\text{n, p}.\n", + "$$\n", "\n", "\n", "These are to be solved subject to the following boundary conditions:\n", "\n", "#### Current:\n", - "\\begin{gather}\n", + "$$\n", "i_{\\text{e,n}}\\big|_{x=0} = 0, \\quad i_{\\text{e,p}}\\big|_{x=1}=0, \\\\\n", "\\phi_{\\text{e,n}}\\big|_{x=L_{\\text{n}}} = \\phi_{\\text{e,s}}\\big|_{x=L_{\\text{n}}}, \\quad i_{\\text{e,n}}\\big|_{x=L_{\\text{n}}} = i_{\\text{e,s}}\\big\\vert_{x=L_{\\text{n}}} = I, \\\\ \n", "\\phi_{\\text{e,s}}\\big|_{x=1-L_{\\text{p}}} = \\phi_{\\text{e,p}}\\big|_{x=1-L_{\\text{p}}}, \\quad \n", " i_{\\text{e,s}}\\big|_{x=1-L_{\\text{p}}} = i_{\\text{e,p}}\\big|_{x=1-L_{\\text{p}}} = I.\n", - "\\end{gather}\n", + "$$\n", "\n", "#### Concentration in the electrolyte:\n", - "\\begin{gather}\n", + "$$\n", "N_{\\text{e,n}}\\big|_{x=0} = 0, \\quad N_{\\text{e,p}}\\big|_{x=1}=0,\\\\ \n", "c_{\\text{e,n}}\\big|_{x=L_{\\text{n}}} = c_{\\text{e,s}}|_{x=L_{\\text{n}}}, \\quad N_{\\text{e,n}}\\big|_{x=L_{\\text{n}}}=N_{\\text{e,s}}\\big|_{x=L_{\\text{n}}}, \\\\\n", - "c_{\\text{e,s}}|_{x=1-L_{\\text{p}}}=c_{\\text{e,p}}|_{x=1-L_{\\text{p}}}, \\quad N_{\\text{e,s}}\\big|_{x=1-L_{\\text{p}}}=N_{\\text{e,p}}\\big|_{x=1-L_{\\text{p}}}. &&\n", - "\\end{gather}\n", + "c_{\\text{e,s}}|_{x=1-L_{\\text{p}}}=c_{\\text{e,p}}|_{x=1-L_{\\text{p}}}, \\quad N_{\\text{e,s}}\\big|_{x=1-L_{\\text{p}}}=N_{\\text{e,p}}\\big|_{x=1-L_{\\text{p}}}.\n", + "$$\n", "\n", "#### Concentration in the electrode active material:\n", - "\\begin{gather}\n", + "$$\n", "N_{\\text{s,k}}\\big|_{r_{\\text{k}}=0} = 0, \\quad \\text{k} \\in \\text{n, p}, \\quad \\ \\ - N_{\\text{s,k}}\\big|_{r_{\\text{k}}=1} = \\frac{j_{\\text{k}}}{F}, \\quad \\text{k} \\in \\text{n, p}.\n", - "\\end{gather}\n", + "$$\n", "\n", "#### Reference potential:\n", "$$\\phi_{\\text{s,cn}} = 0, \\quad \\boldsymbol{x} \\in \\partial \\Omega_{\\text{tab,n}}.$$\n", "\n", "\n", - "And the initial conditions:\n", + "#### And the initial conditions:\n", "\n", - "\\begin{align}\n", - "&c_{\\text{s,k}}(x,r,0) = c_{\\text{s,k,0}}, \\quad \\phi_{\\text{s,n}}(x,0) = 0, \\quad \\phi_{\\text{s,p}}(x,0) = \\phi_{\\text{s,p,0}}, && \\text{k} \\in \\text{n, p},\\\\\n", - "&\\phi_{\\text{e,k}}(x,0) = \\phi_{\\text{e,0}}, \\quad c_{\\text{e,k}}(x,0) = 1, && \\text{k} \\in \\text{n, s, p}. \n", - "\\end{align}\n" + "$$\n", + "c_{\\text{s,k}}(x,r,0) = c_{\\text{s,k,0}}, \\quad \\phi_{\\text{s,n}}(x,0) = 0, \\quad \\phi_{\\text{s,p}}(x,0) = \\phi_{\\text{s,p,0}}, \\\\ \\text{k} \\in \\text{n, p},\\\\\n", + "\\phi_{\\text{e,k}}(x,0) = \\phi_{\\text{e,0}}, \\quad c_{\\text{e,k}}(x,0) = 1, \\\\ \\text{k} \\in \\text{n, s, p}. \n", + "$$\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -96,6 +101,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -128,6 +134,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -153,6 +160,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -174,6 +182,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -193,6 +202,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -225,6 +235,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/MPM.ipynb b/docs/source/examples/notebooks/models/MPM.ipynb similarity index 99% rename from examples/notebooks/models/MPM.ipynb rename to docs/source/examples/notebooks/models/MPM.ipynb index 0eb3af1188..c16098ff20 100644 --- a/examples/notebooks/models/MPM.ipynb +++ b/docs/source/examples/notebooks/models/MPM.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -81,6 +82,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +110,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -124,6 +127,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,6 +155,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -181,6 +186,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -195,6 +201,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -223,6 +230,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -236,6 +244,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -280,6 +289,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -423,6 +433,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -430,6 +441,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -533,6 +545,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -584,6 +597,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -668,6 +682,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -732,6 +747,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -788,6 +804,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -796,6 +813,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -850,6 +868,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -914,6 +933,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -948,13 +968,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/SEI-on-cracks.ipynb b/docs/source/examples/notebooks/models/SEI-on-cracks.ipynb similarity index 100% rename from examples/notebooks/models/SEI-on-cracks.ipynb rename to docs/source/examples/notebooks/models/SEI-on-cracks.ipynb diff --git a/docs/source/examples/notebooks/models/SPM.ipynb b/docs/source/examples/notebooks/models/SPM.ipynb new file mode 100644 index 0000000000..1c1a5283a2 --- /dev/null +++ b/docs/source/examples/notebooks/models/SPM.ipynb @@ -0,0 +1,1144 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Single Particle Model (SPM) " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Equations" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The SPM consists of two spherically symmetric diffusion equations: one within a representative negative particle ($\\text{k}=\\text{n}$) and one within a representative positive particle ($\\text{k}=\\text{p}$). In the centre of the particle the standard no-flux condition is imposed. Since the SPM assumes that all particles in an electrode behave in exactly the same way, the flux on the surface of a particle is simply the current $I$ divided by the thickness of the electrode $L_{\\text{k}}$. The concentration of lithium in electrode $\\text{k}$ is denoted $c_{\\text{k}}$ and the current is denoted by $I$. The model equations for the SPM are then: \n", + "$$\n", + "\\frac{\\partial c_{\\text{s,k}}}{\\partial t} = -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), \\\\\n", + "N_{\\text{s,k}} = -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, \\quad \\text{k} \\in \\text{n, p},\n", + "$$\n", + "\n", + "$$\n", + "N_{\\text{s,k}}\\big|_{r_{\\text{k}}=0} = 0, \\quad \\text{k} \\in \\text{n, p}, \\quad \\ \\ - N_{\\text{s,k}}\\big|_{r_{\\text{k}}=1} = \n", + "\\begin{cases}\n", + "\t\t \\frac{I}{Fa_{\\text{n}}L_{\\text{n}}}, \\quad &\\text{k}=\\text{n}, \\\\ \n", + "\t\t -\\frac{I}{Fa_{\\text{p}}L_{\\text{p}}}, \\quad &\\text{k}=\\text{p}, \n", + "\\end{cases} \\\\\n", + "c_{\\text{s,k}}(r_{\\text{k}},0) = c_{\\text{s,k,0}}, \\quad \\text{k} \\in \\text{n, p},$$\n", + "where $D_{\\text{s,k}}$ is the diffusion coefficient in the solid, $N_{\\text{s,k}}$ denotes the flux of lithium ions in the solid particle within the region $\\text{k}$, and $r_{\\text{k}} \\in[0,1]$ is the radial coordinate of the particle in electrode $\\text{k}$. \n", + "\n", + "### Voltage Expression\n", + "The voltage is obtained from the expression: \n", + "$$\n", + "V = U_{\\text{p}}(c_{\\text{p}})\\big|_{r_{\\text{p}}=1} - U_{\\text{n}}(c_{\\text{n}})\\big|_{r_{\\text{n}}=1} - \\frac{2RT}{F}\\sinh^{-1}\\left(\\frac{I}{2j_{\\text{0,p}} a_{\\text{p}}L_{\\text{p}}}\\right) - \\frac{2RT}{F}\\sinh^{-1}\\left(\\frac{I}{2j_{\\text{0,n}} a_{\\text{p}}L_{\\text{n}}}\\right)\n", + "$$\n", + "with the exchange current densities given by\n", + "$$j_{\\text{0,k}} = (c_{\\text{k}})^{1/2}(1-c_{\\text{k}})^{1/2} $$\n", + "\n", + "More details can be found in [[3]](#References)." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example solving SPM using PyBaMM\n", + "\n", + "Below we show how to solve the Single Particle Model, using the default geometry, mesh, parameters, discretisation and solver provided with PyBaMM. In this notebook we explicitly handle all the stages of setting up, processing and solving the model in order to explain them in detail. However, it is often simpler in practice to use the `Simulation` class, which handles many of the stages automatically, as shown [here](../simulation-class.ipynb).\n", + "\n", + "First we need to import `pybamm`, and then change our working directory to the root of the pybamm folder. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import numpy as np\n", + "import os\n", + "import matplotlib.pyplot as plt\n", + "os.chdir(pybamm.__path__[0]+'/..')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then create an instance of the SPM:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.SPM()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model object is a subtype of [`pybamm.BaseModel`](https://docs.pybamm.org/en/latest/source/api/models/base_models/base_model.html), and contains all the equations that define this particular model. For example, the `rhs` dict contained in `model` has a dictionary mapping variables such as $c_n$ to the equation representing its rate of change with time (i.e. $\\partial{c_n}/\\partial{t}$). We can see this explicitly by visualising this entry in the `rhs` dict:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs equation for variable ' Throughput capacity [A.h] ' is:\n" + ] + } + ], + "source": [ + "variable = list(model.rhs.keys())[1]\n", + "equation = list(model.rhs.values())[1]\n", + "print('rhs equation for variable \\'',variable,'\\' is:')\n", + "path = 'docs/source/examples/notebooks/models/'\n", + "equation.visualise(path+'spm1.png')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![spm1](spm1.png)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need a geometry in which to define our model equations. In pybamm this is represented by the [`pybamm.Geometry`](https://docs.pybamm.org/en/latest/source/api/geometry/index.html) class. In this case we use the default geometry object defined by the model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "geometry = model.default_geometry" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This geometry object defines a number of domains, each with its own name, spatial variables and min/max limits (the latter are represented as equations similar to the rhs equation shown above). For instance, the SPM has the following domains:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SPM domains:\n", + "1. negative electrode with variables:\n", + " -( 0 ) <= x_n <= ( Negative electrode thickness [m] )\n", + "2. separator with variables:\n", + " -( Negative electrode thickness [m] ) <= x_s <= ( Negative electrode thickness [m] + Separator thickness [m] )\n", + "3. positive electrode with variables:\n", + " -( Negative electrode thickness [m] + Separator thickness [m] ) <= x_p <= ( Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m] )\n", + "4. negative particle with variables:\n", + " -( 0 ) <= r_n <= ( Negative particle radius [m] )\n", + "5. positive particle with variables:\n", + " -( 0 ) <= r_p <= ( Positive particle radius [m] )\n", + "6. current collector with variables:\n", + "z = 1\n" + ] + } + ], + "source": [ + "print('SPM domains:')\n", + "for i, (k, v) in enumerate(geometry.items()):\n", + " print(str(i+1)+'.',k,'with variables:')\n", + " for var, rng in v.items():\n", + " if 'min' in rng:\n", + " print(' -(',rng['min'],') <=',var,'<= (',rng['max'],')')\n", + " else:\n", + " print(var, '=', rng['position'])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Both the model equations and the geometry include parameters, such as $L_p$. We can substitute these symbolic parameters in the model with values by using the [`pybamm.ParameterValues`](https://docs.pybamm.org/en/latest/source/api/parameters/parameter_values.html) class, which takes either a python dictionary or CSV file with the mapping between parameter names and values. Rather than create our own instance of `pybamm.ParameterValues`, we will use the default parameter set included in the model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "param = model.default_parameter_values" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then apply this parameter set to the model and geometry" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "param.process_model(model)\n", + "param.process_geometry(geometry)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is to mesh the input geometry. We can do this using the [`pybamm.Mesh`](https://docs.pybamm.org/en/latest/source/api/meshes/index.html) class. This class takes in the geometry of the problem, and also two dictionaries containing the type of mesh to use within each domain of the geometry (i.e. within the positive or negative electrode domains), and the number of mesh points. \n", + "\n", + "The default mesh types and the default number of points to use in each variable for the SPM are:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "negative electrode is of type Uniform1DSubMesh\n", + "separator is of type Uniform1DSubMesh\n", + "positive electrode is of type Uniform1DSubMesh\n", + "negative particle is of type Uniform1DSubMesh\n", + "positive particle is of type Uniform1DSubMesh\n", + "negative primary particle is of type Uniform1DSubMesh\n", + "positive primary particle is of type Uniform1DSubMesh\n", + "negative secondary particle is of type Uniform1DSubMesh\n", + "positive secondary particle is of type Uniform1DSubMesh\n", + "negative particle size is of type Uniform1DSubMesh\n", + "positive particle size is of type Uniform1DSubMesh\n", + "current collector is of type SubMesh0D\n", + "x_n has 20 mesh points\n", + "x_s has 20 mesh points\n", + "x_p has 20 mesh points\n", + "r_n has 20 mesh points\n", + "r_p has 20 mesh points\n", + "r_n_prim has 20 mesh points\n", + "r_p_prim has 20 mesh points\n", + "r_n_sec has 20 mesh points\n", + "r_p_sec has 20 mesh points\n", + "y has 10 mesh points\n", + "z has 10 mesh points\n", + "R_n has 30 mesh points\n", + "R_p has 30 mesh points\n" + ] + } + ], + "source": [ + "for k, t in model.default_submesh_types.items():\n", + " print(k,'is of type',t.__name__)\n", + "for var, npts in model.default_var_pts.items():\n", + " print(var,'has',npts,'mesh points')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With these defaults, we can then create our mesh of the given geometry:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = pybamm.Mesh(geometry, model.default_submesh_types, model.default_var_pts)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is to discretise the model equations using this mesh. We do this using the [`pybamm.Discretisation`](https://docs.pybamm.org/en/latest/source/api/spatial_methods/discretisation.html) class, which takes both the mesh we have already created, and a dictionary of spatial methods to use for each geometry domain. For the case of the SPM, we use the following defaults for the spatial discretisation methods:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "macroscale is discretised using FiniteVolume method\n", + "negative particle is discretised using FiniteVolume method\n", + "positive particle is discretised using FiniteVolume method\n", + "negative primary particle is discretised using FiniteVolume method\n", + "positive primary particle is discretised using FiniteVolume method\n", + "negative secondary particle is discretised using FiniteVolume method\n", + "positive secondary particle is discretised using FiniteVolume method\n", + "negative particle size is discretised using FiniteVolume method\n", + "positive particle size is discretised using FiniteVolume method\n", + "current collector is discretised using ZeroDimensionalSpatialMethod method\n" + ] + } + ], + "source": [ + "for k, method in model.default_spatial_methods.items():\n", + " print(k,'is discretised using',method.__class__.__name__,'method')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then create the `pybamm.Discretisation` object, and use this to discretise the model equations" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "disc = pybamm.Discretisation(mesh, model.default_spatial_methods)\n", + "disc.process_model(model)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After this stage, all of the variables in `model` have been discretised into `pybamm.StateVector` objects, and spatial operators have been replaced by matrix-vector multiplications, ready to be evaluated within a time-stepping algorithm of a given solver. For example, the rhs expression for $\\partial{c_n}/\\partial{t}$ that we visualised above is now represented by:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model.concatenated_rhs.children[1].visualise(path+'spm2.png')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![spm2](spm2.png)\n", + "\n", + "Now we are ready to run the time-stepping routine to solve the model. Once again we use the default ODE solver." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solving using CasadiSolver solver...\n", + "Finished.\n" + ] + } + ], + "source": [ + "# Solve the model at the given time points (in seconds)\n", + "solver = model.default_solver\n", + "n = 250\n", + "t_eval = np.linspace(0, 3600, n)\n", + "print('Solving using',type(solver).__name__,'solver...')\n", + "solution = solver.solve(model, t_eval)\n", + "print('Finished.')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each model in pybamm has a list of relevant variables defined in the model, for use in visualising the model solution or for comparison with other models. The SPM defines the following variables:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SPM model variables:\n", + "\t- Time [s]\n", + "\t- Time [min]\n", + "\t- Time [h]\n", + "\t- x [m]\n", + "\t- x_n [m]\n", + "\t- x_s [m]\n", + "\t- x_p [m]\n", + "\t- r_n [m]\n", + "\t- r_p [m]\n", + "\t- Current variable [A]\n", + "\t- Total current density [A.m-2]\n", + "\t- Current [A]\n", + "\t- C-rate\n", + "\t- Discharge capacity [A.h]\n", + "\t- Throughput capacity [A.h]\n", + "\t- Discharge energy [W.h]\n", + "\t- Throughput energy [W.h]\n", + "\t- Porosity\n", + "\t- Negative electrode porosity\n", + "\t- X-averaged negative electrode porosity\n", + "\t- Separator porosity\n", + "\t- X-averaged separator porosity\n", + "\t- Positive electrode porosity\n", + "\t- X-averaged positive electrode porosity\n", + "\t- Porosity change\n", + "\t- Negative electrode porosity change [s-1]\n", + "\t- X-averaged negative electrode porosity change [s-1]\n", + "\t- Separator porosity change [s-1]\n", + "\t- X-averaged separator porosity change [s-1]\n", + "\t- Positive electrode porosity change [s-1]\n", + "\t- X-averaged positive electrode porosity change [s-1]\n", + "\t- Negative electrode interface utilisation variable\n", + "\t- X-averaged negative electrode interface utilisation variable\n", + "\t- Negative electrode interface utilisation\n", + "\t- X-averaged negative electrode interface utilisation\n", + "\t- Positive electrode interface utilisation variable\n", + "\t- X-averaged positive electrode interface utilisation variable\n", + "\t- Positive electrode interface utilisation\n", + "\t- X-averaged positive electrode interface utilisation\n", + "\t- Negative particle crack length [m]\n", + "\t- X-averaged negative particle crack length [m]\n", + "\t- Negative particle cracking rate [m.s-1]\n", + "\t- X-averaged negative particle cracking rate [m.s-1]\n", + "\t- Positive particle crack length [m]\n", + "\t- X-averaged positive particle crack length [m]\n", + "\t- Positive particle cracking rate [m.s-1]\n", + "\t- X-averaged positive particle cracking rate [m.s-1]\n", + "\t- Negative electrode active material volume fraction\n", + "\t- X-averaged negative electrode active material volume fraction\n", + "\t- Negative electrode capacity [A.h]\n", + "\t- Negative particle radius\n", + "\t- Negative particle radius [m]\n", + "\t- X-averaged negative particle radius [m]\n", + "\t- Negative electrode surface area to volume ratio [m-1]\n", + "\t- X-averaged negative electrode surface area to volume ratio [m-1]\n", + "\t- Negative electrode active material volume fraction change [s-1]\n", + "\t- X-averaged negative electrode active material volume fraction change [s-1]\n", + "\t- Loss of lithium due to loss of active material in negative electrode [mol]\n", + "\t- Positive electrode active material volume fraction\n", + "\t- X-averaged positive electrode active material volume fraction\n", + "\t- Positive electrode capacity [A.h]\n", + "\t- Positive particle radius\n", + "\t- Positive particle radius [m]\n", + "\t- X-averaged positive particle radius [m]\n", + "\t- Positive electrode surface area to volume ratio [m-1]\n", + "\t- X-averaged positive electrode surface area to volume ratio [m-1]\n", + "\t- Positive electrode active material volume fraction change [s-1]\n", + "\t- X-averaged positive electrode active material volume fraction change [s-1]\n", + "\t- Loss of lithium due to loss of active material in positive electrode [mol]\n", + "\t- Separator pressure [Pa]\n", + "\t- X-averaged separator pressure [Pa]\n", + "\t- negative electrode transverse volume-averaged velocity [m.s-1]\n", + "\t- X-averaged negative electrode transverse volume-averaged velocity [m.s-1]\n", + "\t- separator transverse volume-averaged velocity [m.s-1]\n", + "\t- X-averaged separator transverse volume-averaged velocity [m.s-1]\n", + "\t- positive electrode transverse volume-averaged velocity [m.s-1]\n", + "\t- X-averaged positive electrode transverse volume-averaged velocity [m.s-1]\n", + "\t- Transverse volume-averaged velocity [m.s-1]\n", + "\t- negative electrode transverse volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged negative electrode transverse volume-averaged acceleration [m.s-2]\n", + "\t- separator transverse volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged separator transverse volume-averaged acceleration [m.s-2]\n", + "\t- positive electrode transverse volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged positive electrode transverse volume-averaged acceleration [m.s-2]\n", + "\t- Transverse volume-averaged acceleration [m.s-2]\n", + "\t- Negative electrode volume-averaged velocity [m.s-1]\n", + "\t- Negative electrode volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged negative electrode volume-averaged acceleration [m.s-2]\n", + "\t- Negative electrode pressure [Pa]\n", + "\t- X-averaged negative electrode pressure [Pa]\n", + "\t- Positive electrode volume-averaged velocity [m.s-1]\n", + "\t- Positive electrode volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged positive electrode volume-averaged acceleration [m.s-2]\n", + "\t- Positive electrode pressure [Pa]\n", + "\t- X-averaged positive electrode pressure [Pa]\n", + "\t- Negative particle stoichiometry\n", + "\t- Negative particle concentration\n", + "\t- Negative particle concentration [mol.m-3]\n", + "\t- X-averaged negative particle concentration\n", + "\t- X-averaged negative particle concentration [mol.m-3]\n", + "\t- R-averaged negative particle concentration\n", + "\t- R-averaged negative particle concentration [mol.m-3]\n", + "\t- Average negative particle concentration\n", + "\t- Average negative particle concentration [mol.m-3]\n", + "\t- Negative particle surface stoichiometry\n", + "\t- Negative particle surface concentration\n", + "\t- Negative particle surface concentration [mol.m-3]\n", + "\t- X-averaged negative particle surface concentration\n", + "\t- X-averaged negative particle surface concentration [mol.m-3]\n", + "\t- Negative electrode extent of lithiation\n", + "\t- X-averaged negative electrode extent of lithiation\n", + "\t- Minimum negative particle concentration\n", + "\t- Maximum negative particle concentration\n", + "\t- Minimum negative particle concentration [mol.m-3]\n", + "\t- Maximum negative particle concentration [mol.m-3]\n", + "\t- Minimum negative particle surface concentration\n", + "\t- Maximum negative particle surface concentration\n", + "\t- Minimum negative particle surface concentration [mol.m-3]\n", + "\t- Maximum negative particle surface concentration [mol.m-3]\n", + "\t- Positive particle stoichiometry\n", + "\t- Positive particle concentration\n", + "\t- Positive particle concentration [mol.m-3]\n", + "\t- X-averaged positive particle concentration\n", + "\t- X-averaged positive particle concentration [mol.m-3]\n", + "\t- R-averaged positive particle concentration\n", + "\t- R-averaged positive particle concentration [mol.m-3]\n", + "\t- Average positive particle concentration\n", + "\t- Average positive particle concentration [mol.m-3]\n", + "\t- Positive particle surface stoichiometry\n", + "\t- Positive particle surface concentration\n", + "\t- Positive particle surface concentration [mol.m-3]\n", + "\t- X-averaged positive particle surface concentration\n", + "\t- X-averaged positive particle surface concentration [mol.m-3]\n", + "\t- Positive electrode extent of lithiation\n", + "\t- X-averaged positive electrode extent of lithiation\n", + "\t- Minimum positive particle concentration\n", + "\t- Maximum positive particle concentration\n", + "\t- Minimum positive particle concentration [mol.m-3]\n", + "\t- Maximum positive particle concentration [mol.m-3]\n", + "\t- Minimum positive particle surface concentration\n", + "\t- Maximum positive particle surface concentration\n", + "\t- Minimum positive particle surface concentration [mol.m-3]\n", + "\t- Maximum positive particle surface concentration [mol.m-3]\n", + "\t- Porosity times concentration [mol.m-3]\n", + "\t- Negative electrode porosity times concentration [mol.m-3]\n", + "\t- Separator porosity times concentration [mol.m-3]\n", + "\t- Positive electrode porosity times concentration [mol.m-3]\n", + "\t- Total lithium in electrolyte [mol]\n", + "\t- Electrolyte flux [mol.m-2.s-1]\n", + "\t- Ambient temperature [K]\n", + "\t- Cell temperature [K]\n", + "\t- Negative current collector temperature [K]\n", + "\t- Positive current collector temperature [K]\n", + "\t- X-averaged cell temperature [K]\n", + "\t- Volume-averaged cell temperature [K]\n", + "\t- Negative electrode temperature [K]\n", + "\t- X-averaged negative electrode temperature [K]\n", + "\t- Separator temperature [K]\n", + "\t- X-averaged separator temperature [K]\n", + "\t- Positive electrode temperature [K]\n", + "\t- X-averaged positive electrode temperature [K]\n", + "\t- Ambient temperature [C]\n", + "\t- Cell temperature [C]\n", + "\t- Negative current collector temperature [C]\n", + "\t- Positive current collector temperature [C]\n", + "\t- X-averaged cell temperature [C]\n", + "\t- Volume-averaged cell temperature [C]\n", + "\t- Negative electrode temperature [C]\n", + "\t- X-averaged negative electrode temperature [C]\n", + "\t- Separator temperature [C]\n", + "\t- X-averaged separator temperature [C]\n", + "\t- Positive electrode temperature [C]\n", + "\t- X-averaged positive electrode temperature [C]\n", + "\t- Negative current collector potential [V]\n", + "\t- Inner SEI thickness [m]\n", + "\t- Outer SEI thickness [m]\n", + "\t- X-averaged inner SEI thickness [m]\n", + "\t- X-averaged outer SEI thickness [m]\n", + "\t- SEI [m]\n", + "\t- Total SEI thickness [m]\n", + "\t- X-averaged SEI thickness [m]\n", + "\t- X-averaged total SEI thickness [m]\n", + "\t- X-averaged negative electrode resistance [Ohm.m2]\n", + "\t- Inner SEI interfacial current density [A.m-2]\n", + "\t- X-averaged inner SEI interfacial current density [A.m-2]\n", + "\t- Outer SEI interfacial current density [A.m-2]\n", + "\t- X-averaged outer SEI interfacial current density [A.m-2]\n", + "\t- SEI interfacial current density [A.m-2]\n", + "\t- X-averaged SEI interfacial current density [A.m-2]\n", + "\t- Inner SEI on cracks thickness [m]\n", + "\t- Outer SEI on cracks thickness [m]\n", + "\t- X-averaged inner SEI on cracks thickness [m]\n", + "\t- X-averaged outer SEI on cracks thickness [m]\n", + "\t- SEI on cracks [m]\n", + "\t- Total SEI on cracks thickness [m]\n", + "\t- X-averaged SEI on cracks thickness [m]\n", + "\t- X-averaged total SEI on cracks thickness [m]\n", + "\t- Inner SEI on cracks interfacial current density [A.m-2]\n", + "\t- X-averaged inner SEI on cracks interfacial current density [A.m-2]\n", + "\t- Outer SEI on cracks interfacial current density [A.m-2]\n", + "\t- X-averaged outer SEI on cracks interfacial current density [A.m-2]\n", + "\t- SEI on cracks interfacial current density [A.m-2]\n", + "\t- X-averaged SEI on cracks interfacial current density [A.m-2]\n", + "\t- Lithium plating concentration [mol.m-3]\n", + "\t- X-averaged lithium plating concentration [mol.m-3]\n", + "\t- Dead lithium concentration [mol.m-3]\n", + "\t- X-averaged dead lithium concentration [mol.m-3]\n", + "\t- Lithium plating thickness [m]\n", + "\t- X-averaged lithium plating thickness [m]\n", + "\t- Dead lithium thickness [m]\n", + "\t- X-averaged dead lithium thickness [m]\n", + "\t- Loss of lithium to lithium plating [mol]\n", + "\t- Loss of capacity to lithium plating [A.h]\n", + "\t- Negative electrode lithium plating reaction overpotential [V]\n", + "\t- X-averaged negative electrode lithium plating reaction overpotential [V]\n", + "\t- Lithium plating interfacial current density [A.m-2]\n", + "\t- X-averaged lithium plating interfacial current density [A.m-2]\n", + "\t- Negative crack surface to volume ratio [m-1]\n", + "\t- Negative electrode roughness ratio\n", + "\t- X-averaged negative electrode roughness ratio\n", + "\t- Positive crack surface to volume ratio [m-1]\n", + "\t- Positive electrode roughness ratio\n", + "\t- X-averaged positive electrode roughness ratio\n", + "\t- Electrolyte transport efficiency\n", + "\t- Negative electrolyte transport efficiency\n", + "\t- X-averaged negative electrolyte transport efficiency\n", + "\t- Separator electrolyte transport efficiency\n", + "\t- X-averaged separator electrolyte transport efficiency\n", + "\t- Positive electrolyte transport efficiency\n", + "\t- X-averaged positive electrolyte transport efficiency\n", + "\t- Electrode transport efficiency\n", + "\t- Negative electrode transport efficiency\n", + "\t- X-averaged negative electrode transport efficiency\n", + "\t- Separator electrode transport efficiency\n", + "\t- X-averaged separator electrode transport efficiency\n", + "\t- Positive electrode transport efficiency\n", + "\t- X-averaged positive electrode transport efficiency\n", + "\t- Separator volume-averaged velocity [m.s-1]\n", + "\t- Separator volume-averaged acceleration [m.s-2]\n", + "\t- X-averaged separator volume-averaged acceleration [m.s-2]\n", + "\t- Volume-averaged velocity [m.s-1]\n", + "\t- Volume-averaged acceleration [m.s-1]\n", + "\t- X-averaged volume-averaged acceleration [m.s-1]\n", + "\t- Pressure [Pa]\n", + "\t- Negative electrode stoichiometry\n", + "\t- Negative electrode volume-averaged concentration\n", + "\t- Negative electrode volume-averaged concentration [mol.m-3]\n", + "\t- Total lithium in primary phase in negative electrode [mol]\n", + "\t- Positive electrode stoichiometry\n", + "\t- Positive electrode volume-averaged concentration\n", + "\t- Positive electrode volume-averaged concentration [mol.m-3]\n", + "\t- Total lithium in primary phase in positive electrode [mol]\n", + "\t- Electrolyte concentration concatenation [mol.m-3]\n", + "\t- Negative electrolyte concentration [mol.m-3]\n", + "\t- X-averaged negative electrolyte concentration [mol.m-3]\n", + "\t- Separator electrolyte concentration [mol.m-3]\n", + "\t- X-averaged separator electrolyte concentration [mol.m-3]\n", + "\t- Positive electrolyte concentration [mol.m-3]\n", + "\t- X-averaged positive electrolyte concentration [mol.m-3]\n", + "\t- Negative electrolyte concentration [Molar]\n", + "\t- X-averaged negative electrolyte concentration [Molar]\n", + "\t- Separator electrolyte concentration [Molar]\n", + "\t- X-averaged separator electrolyte concentration [Molar]\n", + "\t- Positive electrolyte concentration [Molar]\n", + "\t- X-averaged positive electrolyte concentration [Molar]\n", + "\t- Electrolyte concentration [mol.m-3]\n", + "\t- X-averaged electrolyte concentration [mol.m-3]\n", + "\t- Electrolyte concentration [Molar]\n", + "\t- X-averaged electrolyte concentration [Molar]\n", + "\t- Ohmic heating [W.m-3]\n", + "\t- X-averaged Ohmic heating [W.m-3]\n", + "\t- Volume-averaged Ohmic heating [W.m-3]\n", + "\t- Irreversible electrochemical heating [W.m-3]\n", + "\t- X-averaged irreversible electrochemical heating [W.m-3]\n", + "\t- Volume-averaged irreversible electrochemical heating [W.m-3]\n", + "\t- Reversible heating [W.m-3]\n", + "\t- X-averaged reversible heating [W.m-3]\n", + "\t- Volume-averaged reversible heating [W.m-3]\n", + "\t- Total heating [W.m-3]\n", + "\t- X-averaged total heating [W.m-3]\n", + "\t- Volume-averaged total heating [W.m-3]\n", + "\t- Current collector current density [A.m-2]\n", + "\t- Inner SEI concentration [mol.m-3]\n", + "\t- X-averaged inner SEI concentration [mol.m-3]\n", + "\t- Outer SEI concentration [mol.m-3]\n", + "\t- X-averaged outer SEI concentration [mol.m-3]\n", + "\t- SEI concentration [mol.m-3]\n", + "\t- X-averaged SEI concentration [mol.m-3]\n", + "\t- Loss of lithium to SEI [mol]\n", + "\t- Loss of capacity to SEI [A.h]\n", + "\t- X-averaged negative electrode SEI interfacial current density [A.m-2]\n", + "\t- Negative electrode SEI interfacial current density [A.m-2]\n", + "\t- Positive electrode SEI interfacial current density [A.m-2]\n", + "\t- X-averaged positive electrode SEI volumetric interfacial current density [A.m-2]\n", + "\t- Positive electrode SEI volumetric interfacial current density [A.m-3]\n", + "\t- Negative electrode SEI volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged negative electrode SEI volumetric interfacial current density [A.m-3]\n", + "\t- Inner SEI on cracks concentration [mol.m-3]\n", + "\t- X-averaged inner SEI on cracks concentration [mol.m-3]\n", + "\t- Outer SEI on cracks concentration [mol.m-3]\n", + "\t- X-averaged outer SEI on cracks concentration [mol.m-3]\n", + "\t- SEI on cracks concentration [mol.m-3]\n", + "\t- X-averaged SEI on cracks concentration [mol.m-3]\n", + "\t- Loss of lithium to SEI on cracks [mol]\n", + "\t- Loss of capacity to SEI on cracks [A.h]\n", + "\t- X-averaged negative electrode SEI on cracks interfacial current density [A.m-2]\n", + "\t- Negative electrode SEI on cracks interfacial current density [A.m-2]\n", + "\t- Positive electrode SEI on cracks interfacial current density [A.m-2]\n", + "\t- X-averaged positive electrode SEI on cracks volumetric interfacial current density [A.m-2]\n", + "\t- Positive electrode SEI on cracks volumetric interfacial current density [A.m-3]\n", + "\t- Negative electrode SEI on cracks volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged negative electrode SEI on cracks volumetric interfacial current density [A.m-3]\n", + "\t- Negative electrode lithium plating interfacial current density [A.m-2]\n", + "\t- X-averaged negative electrode lithium plating interfacial current density [A.m-2]\n", + "\t- Lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged positive electrode lithium plating interfacial current density [A.m-2]\n", + "\t- X-averaged positive electrode lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- Positive electrode lithium plating interfacial current density [A.m-2]\n", + "\t- Positive electrode lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- Negative electrode lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged negative electrode lithium plating volumetric interfacial current density [A.m-3]\n", + "\t- Negative electrode open-circuit potential [V]\n", + "\t- X-averaged negative electrode open-circuit potential [V]\n", + "\t- Negative electrode bulk open-circuit potential [V]\n", + "\t- Negative particle concentration overpotential [V]\n", + "\t- Negative electrode entropic change [V.K-1]\n", + "\t- X-averaged negative electrode entropic change [V.K-1]\n", + "\t- Positive electrode open-circuit potential [V]\n", + "\t- X-averaged positive electrode open-circuit potential [V]\n", + "\t- Positive electrode bulk open-circuit potential [V]\n", + "\t- Positive particle concentration overpotential [V]\n", + "\t- Positive electrode entropic change [V.K-1]\n", + "\t- X-averaged positive electrode entropic change [V.K-1]\n", + "\t- X-averaged negative electrode total interfacial current density [A.m-2]\n", + "\t- X-averaged negative electrode total volumetric interfacial current density [A.m-3]\n", + "\t- SEI film overpotential [V]\n", + "\t- X-averaged SEI film overpotential [V]\n", + "\t- Negative electrode exchange current density [A.m-2]\n", + "\t- X-averaged negative electrode exchange current density [A.m-2]\n", + "\t- Negative electrode reaction overpotential [V]\n", + "\t- X-averaged negative electrode reaction overpotential [V]\n", + "\t- X-averaged negative electrode surface potential difference [V]\n", + "\t- Negative electrode interfacial current density [A.m-2]\n", + "\t- X-averaged negative electrode interfacial current density [A.m-2]\n", + "\t- Negative electrode volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged negative electrode volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged positive electrode total interfacial current density [A.m-2]\n", + "\t- X-averaged positive electrode total volumetric interfacial current density [A.m-3]\n", + "\t- Positive electrode exchange current density [A.m-2]\n", + "\t- X-averaged positive electrode exchange current density [A.m-2]\n", + "\t- Positive electrode reaction overpotential [V]\n", + "\t- X-averaged positive electrode reaction overpotential [V]\n", + "\t- X-averaged positive electrode surface potential difference [V]\n", + "\t- Positive electrode interfacial current density [A.m-2]\n", + "\t- X-averaged positive electrode interfacial current density [A.m-2]\n", + "\t- Positive electrode volumetric interfacial current density [A.m-3]\n", + "\t- X-averaged positive electrode volumetric interfacial current density [A.m-3]\n", + "\t- Negative particle rhs [mol.m-3.s-1]\n", + "\t- Negative particle bc [mol.m-2]\n", + "\t- Negative particle effective diffusivity [m2.s-1]\n", + "\t- X-averaged negative particle effective diffusivity [m2.s-1]\n", + "\t- Negative particle flux [mol.m-2.s-1]\n", + "\t- X-averaged negative particle flux [mol.m-2.s-1]\n", + "\t- Positive particle rhs [mol.m-3.s-1]\n", + "\t- Positive particle bc [mol.m-2]\n", + "\t- Positive particle effective diffusivity [m2.s-1]\n", + "\t- X-averaged positive particle effective diffusivity [m2.s-1]\n", + "\t- Positive particle flux [mol.m-2.s-1]\n", + "\t- X-averaged positive particle flux [mol.m-2.s-1]\n", + "\t- Negative electrode potential [V]\n", + "\t- X-averaged negative electrode potential [V]\n", + "\t- Negative electrode ohmic losses [V]\n", + "\t- X-averaged negative electrode ohmic losses [V]\n", + "\t- Gradient of negative electrode potential [V.m-1]\n", + "\t- Negative electrode current density [A.m-2]\n", + "\t- Electrolyte potential [V]\n", + "\t- X-averaged electrolyte potential [V]\n", + "\t- X-averaged electrolyte overpotential [V]\n", + "\t- Gradient of electrolyte potential [V.m-1]\n", + "\t- Negative electrolyte potential [V]\n", + "\t- X-averaged negative electrolyte potential [V]\n", + "\t- Gradient of negative electrolyte potential [V.m-1]\n", + "\t- Separator electrolyte potential [V]\n", + "\t- X-averaged separator electrolyte potential [V]\n", + "\t- Gradient of separator electrolyte potential [V.m-1]\n", + "\t- Positive electrolyte potential [V]\n", + "\t- X-averaged positive electrolyte potential [V]\n", + "\t- Gradient of positive electrolyte potential [V.m-1]\n", + "\t- Electrolyte current density [A.m-2]\n", + "\t- Negative electrolyte current density [A.m-2]\n", + "\t- Positive electrolyte current density [A.m-2]\n", + "\t- X-averaged concentration overpotential [V]\n", + "\t- X-averaged electrolyte ohmic losses [V]\n", + "\t- Negative electrode surface potential difference [V]\n", + "\t- Negative electrode surface potential difference at separator interface [V]\n", + "\t- Sum of negative electrode electrolyte reaction source terms [A.m-3]\n", + "\t- Sum of x-averaged negative electrode electrolyte reaction source terms [A.m-3]\n", + "\t- Sum of negative electrode volumetric interfacial current densities [A.m-3]\n", + "\t- Sum of x-averaged negative electrode volumetric interfacial current densities [A.m-3]\n", + "\t- Sum of positive electrode electrolyte reaction source terms [A.m-3]\n", + "\t- Sum of x-averaged positive electrode electrolyte reaction source terms [A.m-3]\n", + "\t- Sum of positive electrode volumetric interfacial current densities [A.m-3]\n", + "\t- Sum of x-averaged positive electrode volumetric interfacial current densities [A.m-3]\n", + "\t- Interfacial current density [A.m-2]\n", + "\t- Exchange current density [A.m-2]\n", + "\t- Sum of volumetric interfacial current densities [A.m-3]\n", + "\t- Sum of electrolyte reaction source terms [A.m-3]\n", + "\t- Positive electrode potential [V]\n", + "\t- X-averaged positive electrode potential [V]\n", + "\t- Positive electrode ohmic losses [V]\n", + "\t- X-averaged positive electrode ohmic losses [V]\n", + "\t- Gradient of positive electrode potential [V.m-1]\n", + "\t- Positive electrode current density [A.m-2]\n", + "\t- Electrode current density [A.m-2]\n", + "\t- Positive current collector potential [V]\n", + "\t- Local voltage [V]\n", + "\t- Terminal voltage [V]\n", + "\t- Voltage [V]\n", + "\t- Contact overpotential [V]\n", + "\t- Positive electrode surface potential difference [V]\n", + "\t- Positive electrode surface potential difference at separator interface [V]\n", + "\t- Surface open-circuit voltage [V]\n", + "\t- Bulk open-circuit voltage [V]\n", + "\t- Particle concentration overpotential [V]\n", + "\t- X-averaged reaction overpotential [V]\n", + "\t- X-averaged solid phase ohmic losses [V]\n", + "\t- Battery open-circuit voltage [V]\n", + "\t- Battery negative electrode bulk open-circuit potential [V]\n", + "\t- Battery positive electrode bulk open-circuit potential [V]\n", + "\t- Battery particle concentration overpotential [V]\n", + "\t- Battery negative particle concentration overpotential [V]\n", + "\t- Battery positive particle concentration overpotential [V]\n", + "\t- X-averaged battery reaction overpotential [V]\n", + "\t- X-averaged battery negative reaction overpotential [V]\n", + "\t- X-averaged battery positive reaction overpotential [V]\n", + "\t- X-averaged battery solid phase ohmic losses [V]\n", + "\t- X-averaged battery negative solid phase ohmic losses [V]\n", + "\t- X-averaged battery positive solid phase ohmic losses [V]\n", + "\t- X-averaged battery electrolyte ohmic losses [V]\n", + "\t- X-averaged battery concentration overpotential [V]\n", + "\t- Battery voltage [V]\n", + "\t- Change in open-circuit voltage [V]\n", + "\t- Local ECM resistance [Ohm]\n", + "\t- Terminal power [W]\n", + "\t- Power [W]\n", + "\t- Resistance [Ohm]\n", + "\t- Total lithium in negative electrode [mol]\n", + "\t- LAM_ne [%]\n", + "\t- Loss of active material in negative electrode [%]\n", + "\t- Total lithium in positive electrode [mol]\n", + "\t- LAM_pe [%]\n", + "\t- Loss of active material in positive electrode [%]\n", + "\t- LLI [%]\n", + "\t- Loss of lithium inventory [%]\n", + "\t- Loss of lithium inventory, including electrolyte [%]\n", + "\t- Total lithium [mol]\n", + "\t- Total lithium in particles [mol]\n", + "\t- Total lithium capacity [A.h]\n", + "\t- Total lithium capacity in particles [A.h]\n", + "\t- Total lithium lost [mol]\n", + "\t- Total lithium lost from particles [mol]\n", + "\t- Total lithium lost from electrolyte [mol]\n", + "\t- Total lithium lost to side reactions [mol]\n", + "\t- Total capacity lost to side reactions [A.h]\n" + ] + } + ], + "source": [ + "print('SPM model variables:')\n", + "for v in model.variables.keys():\n", + " print('\\t-',v)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To help visualise the results, pybamm provides the `pybamm.ProcessedVariable` class, which takes the output of a solver and a variable, and allows the user to evaluate the value of that variable at any given time or $x$ value. These processed variables are automatically created by the solution dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "voltage = solution['Voltage [V]']\n", + "c_s_n_surf = solution['Negative particle surface concentration']\n", + "c_s_p_surf = solution['Positive particle surface concentration']" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One we have these variables in hand, we can begin generating plots using a library such as Matplotlib. Below we plot the voltage and surface particle concentrations versus time" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t = solution[\"Time [s]\"].entries\n", + "x = solution[\"x [m]\"].entries[:, 0]\n", + "f, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(13,4))\n", + "\n", + "ax1.plot(t, voltage(t))\n", + "ax1.set_xlabel(r'$Time [s]$')\n", + "ax1.set_ylabel('Voltage [V]')\n", + "\n", + "ax2.plot(t, c_s_n_surf(t=t, x=x[0])) # can evaluate at arbitrary x (single representative particle)\n", + "ax2.set_xlabel(r'$Time [s]$')\n", + "ax2.set_ylabel('Negative particle surface concentration')\n", + "\n", + "ax3.plot(t, c_s_p_surf(t=t, x=x[-1])) # can evaluate at arbitrary x (single representative particle)\n", + "ax3.set_xlabel(r'$Time [s]$')\n", + "ax3.set_ylabel('Positive particle surface concentration')\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some of the output variables are defined over space as well as time. Once option to visualise these variables is to use the `interact` slider widget. Below we plot the negative/positive particle concentration over $r$, using a slider to change the current time point" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "c_s_n = solution['Negative particle concentration']\n", + "c_s_p = solution['Positive particle concentration']\n", + "r_n = solution[\"r_n [m]\"].entries[:, 0]\n", + "r_p = solution[\"r_p [m]\"].entries[:, 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3800db8e54f0444c9aed3bd9b06dbfa6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=3600.0, step=10.0), Output()), _dom_classes=…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "c_s_n = solution['Negative particle concentration']\n", + "c_s_p = solution['Positive particle concentration']\n", + "r_n = solution[\"r_n [m]\"].entries[:, 0, 0]\n", + "r_p = solution[\"r_p [m]\"].entries[:, 0, 0]\n", + "\n", + "def plot_concentrations(t):\n", + " f, (ax1, ax2) = plt.subplots(1, 2 ,figsize=(10,5))\n", + " plot_c_n, = ax1.plot(r_n, c_s_n(r=r_n,t=t,x=x[0])) # can evaluate at arbitrary x (single representative particle)\n", + " plot_c_p, = ax2.plot(r_p, c_s_p(r=r_p,t=t,x=x[-1])) # can evaluate at arbitrary x (single representative particle)\n", + " ax1.set_ylabel('Negative particle concentration')\n", + " ax2.set_ylabel('Positive particle concentration')\n", + " ax1.set_xlabel(r'$r_n$ [m]')\n", + " ax2.set_xlabel(r'$r_p$ [m]')\n", + " ax1.set_ylim(0, 1)\n", + " ax2.set_ylim(0, 1)\n", + " plt.show()\n", + "\n", + "import ipywidgets as widgets\n", + "widgets.interact(plot_concentrations, t=widgets.FloatSlider(min=0,max=3600,step=10,value=0));\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The QuickPlot class can be used to plot the common set of useful outputs which should give you a good initial overview of the model. The method `Quickplot.dynamic_plot` employs the slider widget. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ac9df01028e4489c83eccaa4071aa245", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "quick_plot = pybamm.QuickPlot(solution)\n", + "quick_plot.dynamic_plot()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[4] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pybamm", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "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": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "187972e187ab8dfbecfab9e8e194ae6d08262b2d51a54fa40644e3ddb6b5f74c" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/models/SPMe.ipynb b/docs/source/examples/notebooks/models/SPMe.ipynb similarity index 77% rename from examples/notebooks/models/SPMe.ipynb rename to docs/source/examples/notebooks/models/SPMe.ipynb index b3c41a515f..f4182b5ffa 100644 --- a/examples/notebooks/models/SPMe.ipynb +++ b/docs/source/examples/notebooks/models/SPMe.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -31,37 +32,43 @@ "\n", "\n", "#### Particles: \n", - "\\begin{align}\n", - "\\mathcal{C}_{\\text{k}} \\frac{\\partial c_{\\text{s,k}}}{\\partial t} &= -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), \\\\\n", - "N_{\\text{s,k}} &= -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, \\quad \\text{k} \\in \\text{n, p}, \\end{align}\n", + "$$\n", + "\\mathcal{C}_{\\text{k}} \\frac{\\partial c_{\\text{s,k}}}{\\partial t} = -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), \\\\\n", + "N_{\\text{s,k}} = -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, \\quad \\text{k} \\in \\text{n, p},\n", + "$$\n", + "\n", "$$\n", "N_{\\text{s,k}}\\big|_{r_{\\text{k}}=0} = 0, \\quad \\text{k} \\in \\text{n, p}, \\quad \\ \\ - \\frac{a_{R, \\text{k}}\\gamma_{\\text{k}}}{\\mathcal{C}_{\\text{k}}} N_{\\text{s,k}}\\big|_{r_{\\text{k}}=1} = \n", "\\begin{cases}\n", "\t\t \\frac{I}{L_{\\text{n}}}, \\quad &\\text{k}=\\text{n}, \\\\ \n", "\t\t -\\frac{I}{L_{\\text{p}}}, \\quad &\\text{k}=\\text{p}, \n", "\\end{cases} \\\\\n", - "c_{\\text{s,k}}(r_{\\text{k}},0) = c_{\\text{s,k,0}}, \\quad \\text{k} \\in \\text{n, p},$$\n", + "c_{\\text{s,k}}(r_{\\text{k}},0) = c_{\\text{s,k,0}}, \\quad \\text{k} \\in \\text{n, p},\n", + "$$\n", + "\n", "where $D_{\\text{s,k}}$ is the diffusion coefficient in the solid, $N_{\\text{s,k}}$ denotes the flux of lithium ions in the solid particle within the region $\\text{k}$, and $r_{\\text{k}} \\in[0,1]$ is the radial coordinate of the particle in electrode $\\text{k}$. All other relevant parameters are given in the table at the end of this notebook.\n", "\n", "\n", "#### Electrolyte: \n", - "\\begin{align}\n", - "\\epsilon_{\\text{k}} \\frac{\\partial c_{\\text{e,k}}}{\\partial t} &= -\\frac{\\partial N_{\\text{e,k}}}{\\partial x} + \n", + "$$\n", + "\\epsilon_{\\text{k}} \\frac{\\partial c_{\\text{e,k}}}{\\partial t} = -\\frac{\\partial N_{\\text{e,k}}}{\\partial x} + \n", "\\begin{cases} \n", " \\frac{I}{FL_{\\text{n}}}, \\quad &\\text{k}=\\text{n}, \\\\ \n", - " 0, \\quad &\\text{k}=\\text{s}, \\\\ \n", + " 0, \\quad \\\\\\text{k}=\\text{s}, \\\\ \n", " -\\frac{I}{FL_{\\text{p}}}, \\quad &\\text{k}=\\text{p},\n", "\\end{cases} \\\\\n", - "N_{\\text{e,k}} &= -\\epsilon_{\\text{k}}^{\\text{b}} D_{\\text{e}} \\frac{\\partial c_{\\text{e,k}}}{\\partial x} + \n", + "N_{\\text{e,k}} = -\\epsilon_{\\text{k}}^{\\text{b}} D_{\\text{e}} \\frac{\\partial c_{\\text{e,k}}}{\\partial x} +\n", "\\begin{cases} \n", "\t \\frac{x t^+IRT}{F L_{\\text{n}}}, \\quad &\\text{k}=\\text{n} \\\\ \n", " \\frac{t^+IRT}{F}, \\quad &\\text{k}=\\text{s} \\\\ \n", "\t \\frac{(1-x)t^+ IRT}{F L_{\\text{p}}}, \\quad &\\text{k}=\\text{p}\n", "\\end{cases}\n", - "\\end{align}\n", + "$$\n", + "\n", "$$\n", "N_{\\text{e,n}}\\big|_{x=0} = 0, \\quad N_{\\text{e,p}}\\big|_{x=1}=0, \\\\\n", - "c_{\\text{e,k}}(x,0) = 0, \\quad \\text{k} \\in \\text{n, s, p},$$\n", + "c_{\\text{e,k}}(x,0) = 0, \\quad \\text{k} \\in \\text{n, s, p},\n", + "$$\n", "where $D_{\\text{e}}$ is the diffusion coefficient in the solid, $N_{\\text{e,k}}$ denotes the flux of lithium ions in the electrolyte within the region $\\text{k}$, and $x\\in[0,1]$ is the macroscopic through-cell distance. This equation is also solved subject to continuity of concentration and flux at the electrode/separator interfaces.\n", "\n", "### Voltage Expression\n", @@ -70,25 +77,27 @@ "V = U_{\\text{eq}} + \\eta_r + \\eta_c + \\Delta\\Phi_{\\text{Elec}} + \\Delta\\Phi_{\\text{Solid}}\n", "$$ \n", "where \n", - "\\begin{align}\n", - "U_{\\text{eq}} &= U_{\\text{p}}(c_{\\text{p}})\\big|_{r_{\\text{p}}=1} - U_{\\text{n}}(c_{\\text{n}})\\big|_{r_{\\text{n}}=1}, \\\\ \n", - "\\eta_{r} &= -2\\sinh^{-1}\\left(\\frac{I}{\\bar{j}_{\\text{0,p}} L_{\\text{p}}}\\right) - 2\\sinh^{-1}\\left(\\frac{I}{\\bar{j}_{\\text{0,n}} L_{\\text{n}}}\\right), \\\\\n", - "\\eta_c &= 2 (1-t^+)\\frac{RT}{F}\\left(\\bar{c}_{\\text{e,p}} - \\bar{c}_{\\text{e,n}}\\right), \\\\\n", - "\\bar{j}_{\\text{0,n}} &= \\frac{1}{L_{\\text{n}}}\\int_0^{L_{\\text{n}}} \\frac{\\gamma_{\\text{n}}}{\\mathcal{C}_{\\text{r,n}}} (c_{\\text{n}})^{1/2}(1-c_{\\text{n}})^{1/2} (1+\\mathcal{C}_{\\text{e}} c_{\\text{e,n}})^{1/2} \\, \\text{d}x,\\\\\n", - "\\bar{j}_{\\text{0,p}} &= \\frac{1}{L_{\\text{p}}}\\int_{1-L_{\\text{p}}}^1 \\frac{\\gamma_{\\text{p}}}{\\mathcal{C}_{\\text{r,p}}} (c_{\\text{p}})^{1/2}(1-c_{\\text{p}})^{1/2} (1+\\mathcal{C}_{\\text{e}} c_{\\text{e,p}})^{1/2} \\, \\text{d}x,\\\\\n", - "\\Delta \\Phi_{\\text{Elec}} &= -\\frac{\\mathcal{C}_{\\text{e}}I}{\\gamma_{\\text{e}} \\kappa_{\\text{e}}(1)} \\left(\\frac{L_{\\text{n}}}{3\\epsilon_{\\text{n}}^{\\text{b}}} + \\frac{L_{\\text{s}}}{\\epsilon_{\\text{s}}^{\\text{b}}} + \\frac{L_{\\text{p}}}{3\\epsilon_{\\text{p}}^{\\text{b}}} \\right), \\\\\n", - "\\Delta \\Phi_{\\text{Solid}} &= -\\frac{I}{3}\\left(\\frac{L_{\\text{p}}}{\\sigma_{\\text{p}}} + \\frac{L_{\\text{n}}}{\\sigma_{\\text{n}}} \\right), \n", - "\\end{align} \n", + "$$\n", + "U_{\\text{eq}} = U_{\\text{p}}(c_{\\text{p}})\\big|_{r_{\\text{p}}=1} - U_{\\text{n}}(c_{\\text{n}})\\big|_{r_{\\text{n}}=1}, \\\\ \n", + "\\eta_{r} = -2\\sinh^{-1}\\left(\\frac{I}{\\bar{j}_{\\text{0,p}} L_{\\text{p}}}\\right) - 2\\sinh^{-1}\\left(\\frac{I}{\\bar{j}_{\\text{0,n}} L_{\\text{n}}}\\right), \\\\\n", + "\\eta_c = 2 (1-t^+)\\frac{RT}{F}\\left(\\bar{c}_{\\text{e,p}} - \\bar{c}_{\\text{e,n}}\\right), \\\\\n", + "\\bar{j}_{\\text{0,n}} = \\frac{1}{L_{\\text{n}}}\\int_0^{L_{\\text{n}}} \\frac{\\gamma_{\\text{n}}}{\\mathcal{C}_{\\text{r,n}}} (c_{\\text{n}})^{1/2}(1-c_{\\text{n}})^{1/2} (1+\\mathcal{C}_{\\text{e}} c_{\\text{e,n}})^{1/2} \\, \\text{d}x,\\\\\n", + "\\bar{j}_{\\text{0,p}} = \\frac{1}{L_{\\text{p}}}\\int_{1-L_{\\text{p}}}^1 \\frac{\\gamma_{\\text{p}}}{\\mathcal{C}_{\\text{r,p}}} (c_{\\text{p}})^{1/2}(1-c_{\\text{p}})^{1/2} (1+\\mathcal{C}_{\\text{e}} c_{\\text{e,p}})^{1/2} \\, \\text{d}x,\\\\\n", + "\\Delta \\Phi_{\\text{Elec}} = -\\frac{\\mathcal{C}_{\\text{e}}I}{\\gamma_{\\text{e}} \\kappa_{\\text{e}}(1)} \\left(\\frac{L_{\\text{n}}}{3\\epsilon_{\\text{n}}^{\\text{b}}} + \\frac{L_{\\text{s}}}{\\epsilon_{\\text{s}}^{\\text{b}}} + \\frac{L_{\\text{p}}}{3\\epsilon_{\\text{p}}^{\\text{b}}} \\right), \\\\\n", + "\\Delta \\Phi_{\\text{Solid}} = -\\frac{I}{3}\\left(\\frac{L_{\\text{p}}}{\\sigma_{\\text{p}}} + \\frac{L_{\\text{n}}}{\\sigma_{\\text{n}}} \\right), \n", + "$$\n", + "\n", "where\n", - "\\begin{equation} \n", - " \\bar{c}_{\\text{e,n}} = \\frac{1}{L_{\\text{n}}}\\int_0^{L_{\\text{n}}} c_{\\text{e,n}} \\, \\text{d}x, \\quad\n", - " \\bar{c}_{\\text{e,p}} = \\frac{1}{L_{\\text{p}}}\\int_{1-L_{\\text{p}}}^{1} c_{\\text{e,p}} \\, \\text{d}x.\n", - "\\end{equation} \n", + "$$\n", + "\\bar{c}_{\\text{e,n}} = \\frac{1}{L_{\\text{n}}}\\int_0^{L_{\\text{n}}} c_{\\text{e,n}} \\, \\text{d}x, \\quad\n", + "\\bar{c}_{\\text{e,p}} = \\frac{1}{L_{\\text{p}}}\\int_{1-L_{\\text{p}}}^{1} c_{\\text{e,p}} \\, \\text{d}x.\n", + "$$\n", "\n", "More details can be found in [[3]](#References)." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -96,6 +105,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -123,6 +133,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -143,6 +154,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -171,6 +183,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -202,6 +215,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb b/docs/source/examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb similarity index 99% rename from examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb rename to docs/source/examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb index cef75187dd..fcbde8fad2 100644 --- a/examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb +++ b/docs/source/examples/notebooks/models/Validating_mechanical_models_Enertech_DFN.ipynb @@ -32,6 +32,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -55,6 +56,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -115,6 +117,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -144,6 +147,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -228,6 +232,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -281,6 +286,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -312,13 +318,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/compare-comsol-discharge-curve.ipynb b/docs/source/examples/notebooks/models/compare-comsol-discharge-curve.ipynb similarity index 100% rename from examples/notebooks/models/compare-comsol-discharge-curve.ipynb rename to docs/source/examples/notebooks/models/compare-comsol-discharge-curve.ipynb diff --git a/examples/notebooks/models/compare-ecker-data.ipynb b/docs/source/examples/notebooks/models/compare-ecker-data.ipynb similarity index 98% rename from examples/notebooks/models/compare-ecker-data.ipynb rename to docs/source/examples/notebooks/models/compare-ecker-data.ipynb index 8095301d1b..d8b0d70a2d 100644 --- a/examples/notebooks/models/compare-ecker-data.ipynb +++ b/docs/source/examples/notebooks/models/compare-ecker-data.ipynb @@ -1,15 +1,17 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Comparing with Experimental Data\n", "\n", - "In this notebook we show how to compare results generated in PyBaMM with experimental data. We compare the results of the DFN model (see the [DFN notebook](./models/DFN.ipynb)) with the experimental data from Ecker et. al. [[3]](#References). Results are compared for a constant current discharge at 1C and at 5C." + "In this notebook we show how to compare results generated in PyBaMM with experimental data. We compare the results of the DFN model (see the [DFN notebook](DFN.ipynb)) with the experimental data from Ecker et. al. [[3]](#References). Results are compared for a constant current discharge at 1C and at 5C." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -40,6 +42,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -57,6 +60,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -64,6 +68,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,6 +90,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +114,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -124,6 +131,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -152,6 +160,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -204,6 +213,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -211,6 +221,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/compare-lithium-ion.ipynb b/docs/source/examples/notebooks/models/compare-lithium-ion.ipynb similarity index 100% rename from examples/notebooks/models/compare-lithium-ion.ipynb rename to docs/source/examples/notebooks/models/compare-lithium-ion.ipynb diff --git a/examples/notebooks/models/compare-particle-diffusion-models.ipynb b/docs/source/examples/notebooks/models/compare-particle-diffusion-models.ipynb similarity index 99% rename from examples/notebooks/models/compare-particle-diffusion-models.ipynb rename to docs/source/examples/notebooks/models/compare-particle-diffusion-models.ipynb index 4858dbe77d..516bba8d9e 100644 --- a/examples/notebooks/models/compare-particle-diffusion-models.ipynb +++ b/docs/source/examples/notebooks/models/compare-particle-diffusion-models.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Compare particle diffusion models\n", - "In this notebook we compare the different models for mass transport within the electrode particles. For a full list of all the particle models, see the [documentation](https://pybamm.readthedocs.io/en/latest/source/api/models/submodels/particle/index.html).\n", + "In this notebook we compare the different models for mass transport within the electrode particles. For a full list of all the particle models, see the [documentation](https://docs.pybamm.org/en/latest/source/api/models/submodels/particle/index.html).\n", "\n", "With the \"Fickian diffusion\" option a diffusion equation is solved within the particle domain, with the boundary flux prescribed at the surface related to the local current density. Alternatively, one can assume a particular (polynomial) concentration profile within the particle (at present, this can be uniform, quadratic, or quartic). The \"uniform profile\" model assumes that the concentration inside the particle is uniform in space (and therefore equal to the surface concentration through the entire particle - in effect ignoring transport resistance within the particle), and solves an ODE for the average particle concentration. The \"quadratic profile\" model additionally solves an algebraic equation for the surface concentration, taking into account the effect of diffusion within the particle. Finally, the \"quartic profile\" model also solves for the average concentration gradient (the integral of $\\partial c/ \\partial r$) in the particle, giving a higher-order approximation to the concentration profile within the particle.\n", "\n", @@ -14,6 +14,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -43,6 +44,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -60,6 +62,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -89,6 +92,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -125,6 +129,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -163,6 +168,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -213,6 +219,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -263,6 +270,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -296,6 +304,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -326,13 +335,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/composite_particle.ipynb b/docs/source/examples/notebooks/models/composite_particle.ipynb similarity index 99% rename from examples/notebooks/models/composite_particle.ipynb rename to docs/source/examples/notebooks/models/composite_particle.ipynb index 54fb935d1f..62680ef3b4 100644 --- a/examples/notebooks/models/composite_particle.ipynb +++ b/docs/source/examples/notebooks/models/composite_particle.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "id": "68feb769", "metadata": {}, @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "58f614c2", "metadata": {}, @@ -17,13 +19,14 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "44c5f462", "metadata": {}, "source": [ "## How to use the model\n", "\n", - "Let us set up pybamm " + "Let us set up PyBaMM " ] }, { @@ -47,6 +50,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "7d4ebc5e", "metadata": {}, @@ -91,6 +95,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "10339d40", "metadata": {}, @@ -99,6 +104,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "cf194af2", "metadata": {}, @@ -123,6 +129,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "659b97d9", "metadata": {}, @@ -256,6 +263,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "e87e931c", "metadata": {}, @@ -305,6 +313,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "ee7bc032", "metadata": {}, @@ -372,6 +381,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "77fa4197", "metadata": {}, @@ -439,6 +449,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "1d2efd36", "metadata": {}, @@ -506,6 +517,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "299bd7ec", "metadata": {}, @@ -593,6 +605,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "dbc0edb2", "metadata": {}, @@ -637,6 +650,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "40467b70", "metadata": {}, @@ -846,6 +860,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "977b4c09", "metadata": {}, @@ -893,6 +908,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "e9a2ba08", "metadata": {}, diff --git a/examples/notebooks/models/coupled-degradation.ipynb b/docs/source/examples/notebooks/models/coupled-degradation.ipynb similarity index 99% rename from examples/notebooks/models/coupled-degradation.ipynb rename to docs/source/examples/notebooks/models/coupled-degradation.ipynb index e7d524c6e2..926c5da0fd 100644 --- a/examples/notebooks/models/coupled-degradation.ipynb +++ b/docs/source/examples/notebooks/models/coupled-degradation.ipynb @@ -307,14 +307,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "50f2ca6d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/electrode-state-of-health.ipynb b/docs/source/examples/notebooks/models/electrode-state-of-health.ipynb similarity index 99% rename from examples/notebooks/models/electrode-state-of-health.ipynb rename to docs/source/examples/notebooks/models/electrode-state-of-health.ipynb index 365980fd86..136459c68a 100644 --- a/examples/notebooks/models/electrode-state-of-health.ipynb +++ b/docs/source/examples/notebooks/models/electrode-state-of-health.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -44,6 +46,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -101,6 +104,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,36 +112,36 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Given a total amount of cyclable lithium capacity, $Q_{Li}$, electrode capacities, $Q_n$ and $Q_p$, and voltage limits, $V_{min}$ and $V_{max}$, we can solve for the min and max electrode SOCs, $x_0$, $x_{100}$, $y_0$, and $y_{100}$, and the cell capacity, $C$, using the algorithm adapted from Mohtat et al [1].\n", "First, we find $x_{100}$ and $y_{100}$ using\n", + "\n", "$$\n", - "\\begin{align}\n", - "Q_{Li} &= y_{100}Q_p + x_{100}Q_n,\n", + "Q_{Li} = y_{100}Q_p + x_{100}Q_n,\n", "\\\\\n", - "V_{max} &= U_p(y_{100}) - U_n(x_{100}).\n", - "\\end{align}\n", + "V_{max} = U_p(y_{100}) - U_n(x_{100}).\n", "$$\n", + "\n", "Note that Mohtat et al use $n_{Li} = \\frac{3600 Q_{Li}}{F}$ instead.\n", "Then, we find $Q$ using\n", + "\n", "$$\n", - "\\begin{align}\n", - "V_{min} &= U_p(y_{0}) - U_n(x_{0})\n", - "\\\\\n", - "&= U_p\\left(y_{100} + \\frac{Q}{Q_p}\\right) - U_n\\left(x_{100} - \\frac{Q}{Q_n}\\right)\n", - "\\end{align}\n", + "V_{min} = U_p(y_{0}) - U_n(x_{0})\n", + "= U_p\\left(y_{100} + \\frac{Q}{Q_p}\\right) - U_n\\left(x_{100} - \\frac{Q}{Q_n}\\right)\n", "$$\n", + "\n", "Finally, $x_0$ and $y_0$ are simply defined as\n", + "\n", "$$\n", - "\\begin{align}\n", - "x_0 &= x_{100} - \\frac{Q}{Q_n},\n", + "x_0 = x_{100} - \\frac{Q}{Q_n},\n", "\\\\\n", - "y_0 &= y_{100} + \\frac{Q}{Q_p}.\n", - "\\end{align}\n", + "y_0 = y_{100} + \\frac{Q}{Q_p}.\n", "$$\n", - "We implement this in pybamm as an algebraic model." + "\n", + "We implement this in PyBaMM as an algebraic model." ] }, { @@ -231,6 +235,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -266,6 +271,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -273,6 +279,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -326,6 +333,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -333,6 +341,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -557,6 +566,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/jelly-roll-model.ipynb b/docs/source/examples/notebooks/models/jelly-roll-model.ipynb similarity index 100% rename from examples/notebooks/models/jelly-roll-model.ipynb rename to docs/source/examples/notebooks/models/jelly-roll-model.ipynb diff --git a/examples/notebooks/models/latexify.ipynb b/docs/source/examples/notebooks/models/latexify.ipynb similarity index 99% rename from examples/notebooks/models/latexify.ipynb rename to docs/source/examples/notebooks/models/latexify.ipynb index cea026f9ea..cb7d3ca833 100644 --- a/examples/notebooks/models/latexify.ipynb +++ b/docs/source/examples/notebooks/models/latexify.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -34,6 +36,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -50,6 +53,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -112,6 +116,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -309,6 +314,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -324,26 +330,12 @@ "model.latexify(\"spm_equations_.png\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It will create a png file like this in the directory" - ] - }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "![SPM Equations PNG](./spm_equations_.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Don't worry if you get something like this :)" + "will create a png file titled `spm_equations.png` in the working directory." ] }, { @@ -1264,6 +1256,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1291,13 +1284,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1316,7 +1302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.11.4" }, "vscode": { "interpreter": { diff --git a/examples/notebooks/models/lead-acid.ipynb b/docs/source/examples/notebooks/models/lead-acid.ipynb similarity index 99% rename from examples/notebooks/models/lead-acid.ipynb rename to docs/source/examples/notebooks/models/lead-acid.ipynb index 3a9fc052fd..79025ad28d 100644 --- a/examples/notebooks/models/lead-acid.ipynb +++ b/docs/source/examples/notebooks/models/lead-acid.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -39,12 +41,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "### \"Full\" model\n", + "## \"Full\" model\n", "\n", - "#### Electrolyte Concentration\n", + "### Electrolyte Concentration\n", "\n", "$$\n", " \\frac{\\partial }{\\partial t}\\left(\\epsilon c\\right) = -\\frac{\\partial N}{\\partial x} + sj, \\\\ \n", @@ -53,14 +56,14 @@ " c\\big|_{t=0} = 1\n", "$$ \n", "\n", - "#### Porosity\n", + "### Porosity\n", "\n", "$$\n", " \\frac{\\partial \\epsilon}{\\partial t} = -\\beta^\\text{surf}j, \\\\ \n", " \\epsilon\\big|_{t=0} = \\epsilon^0\n", "$$ \n", "\n", - "#### Electrolyte Current \n", + "### Electrolyte Current \n", "\n", "$$\n", " \\frac{\\partial i_{\\text{e}}}{\\partial x} = j, \\\\\n", @@ -70,7 +73,7 @@ " i_{\\text{e}}\\big|_{x=0}= i_{\\text{e}}\\big|_{x=1}=0,\n", "$$\n", "\n", - "#### Electrode Current \n", + "### Electrode Current \n", "\n", "$$\n", " \\frac{\\partial i_{\\text{s}}}{\\partial x} = -j,\\\\\n", @@ -82,7 +85,7 @@ "$$\n", "\n", "\n", - "#### interfacial current density\n", + "### Interfacial current density\n", "\n", "$$\n", "j = \\begin{cases}\n", @@ -108,10 +111,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "### \"Leading-order\" model \n", + "## \"Leading-order\" model \n", "\n", "$$\n", " \\frac{\\mathrm{d} }{\\mathrm{d} t}\\left(\\epsilon c\\right) = (s_\\text{n} - s_\\text{p})\\mathrm{I}, \\\\\n", @@ -138,6 +142,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -145,6 +150,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -168,6 +174,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -184,7 +191,7 @@ " # load and process default geometry\n", " geometry = model.default_geometry\n", " param.process_geometry(geometry)\n", - " \n", + "\n", " # discretise using default settings\n", " mesh = pybamm.Mesh(geometry, model.default_submesh_types, model.default_var_pts)\n", " disc = pybamm.Discretisation(mesh, model.default_spatial_methods)\n", @@ -192,6 +199,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -225,6 +233,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -232,6 +241,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -266,6 +276,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -299,6 +310,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -348,6 +360,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -377,13 +390,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/lithium-plating.ipynb b/docs/source/examples/notebooks/models/lithium-plating.ipynb similarity index 99% rename from examples/notebooks/models/lithium-plating.ipynb rename to docs/source/examples/notebooks/models/lithium-plating.ipynb index df04b614ab..d9c4fcf842 100644 --- a/examples/notebooks/models/lithium-plating.ipynb +++ b/docs/source/examples/notebooks/models/lithium-plating.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -32,6 +33,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -59,10 +61,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "A series of simple fast charging experiments based on those of Ren et al. [8] is defined here. We first initialise the model at 0% SoC by performing a C/20 discharge (see more details on how to initialise a model from a simulation in [this notebook](./initialise-model-with-solution.ipynb))." + "A series of simple fast charging experiments based on those of Ren et al. [8] is defined here. We first initialise the model at 0% SoC by performing a C/20 discharge (see more details on how to initialise a model from a simulation in [this notebook](../initialize-model-with-solution.ipynb))." ] }, { @@ -91,6 +94,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -116,6 +120,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -134,7 +139,7 @@ " sim = pybamm.Simulation(model, experiment=experiment, parameter_values=parameter_values)\n", " sim.solve(calc_esoh=False)\n", " sims[C_rate] = sim\n", - " \n", + "\n", " return sims\n", "\n", "sims_reversible = define_and_solve_sims(models[\"reversible\"], experiments, parameter_values)" @@ -187,33 +192,34 @@ " for current, ls in zip(currents,linestyles):\n", " j = sol[current].entries\n", " axs[0,1].plot(t, j, color=color, linestyle=ls)\n", - " \n", + "\n", " # Plated lithium capacity\n", " Q_Li = sol[\"Loss of capacity to lithium plating [A.h]\"].entries\n", " axs[1,0].plot(t, Q_Li, color=color, linestyle='solid')\n", - " \n", + "\n", " # Capacity vs time\n", " Q_main = sol[\"Negative electrode volume-averaged concentration [mol.m-3]\"].entries * F * A * L_n / 3600\n", " axs[1,1].plot(t, Q_main, color=color, linestyle='solid')\n", - " \n", + "\n", " axs[0,0].legend()\n", " axs[0,0].set_ylabel(\"Voltage [V]\")\n", " axs[0,1].set_ylabel(\"Volumetric interfacial current density [A.m-3]\")\n", " axs[0,1].legend(('Deintercalation current','Stripping current','Total current'))\n", " axs[1,0].set_ylabel(\"Plated lithium capacity [Ah]\")\n", " axs[1,1].set_ylabel(\"Intercalated lithium capacity [Ah]\")\n", - " \n", + "\n", " for ax in axs.flat:\n", " ax.set_xlabel(\"Time [minutes]\")\n", "\n", " fig.tight_layout()\n", - " \n", + "\n", " return fig, axs\n", "\n", "plot(sims_reversible);" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -221,6 +227,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -253,10 +260,11 @@ } ], "source": [ - "plot(sims_irreversible);" + "plot(sims_irreversible)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -289,10 +297,11 @@ } ], "source": [ - "plot(sims_partially_reversible);" + "plot(sims_partially_reversible)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -300,6 +309,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/pouch-cell-model.ipynb b/docs/source/examples/notebooks/models/pouch-cell-model.ipynb similarity index 99% rename from examples/notebooks/models/pouch-cell-model.ipynb rename to docs/source/examples/notebooks/models/pouch-cell-model.ipynb index 479ca1d045..7add73fcb8 100644 --- a/examples/notebooks/models/pouch-cell-model.ipynb +++ b/docs/source/examples/notebooks/models/pouch-cell-model.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -23,6 +25,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -30,6 +33,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -60,6 +64,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -83,6 +88,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -99,6 +105,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -128,6 +135,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -152,6 +160,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -171,6 +180,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -200,6 +210,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -207,6 +218,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -214,6 +226,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -235,7 +248,7 @@ "pybamm_z = mesh[\"current collector\"].nodes\n", "z_interp = pybamm_z * L_z\n", "\n", - " \n", + "\n", "def get_interp_fun_curr_coll(variable_name):\n", " \"\"\"\n", " Create a :class:`pybamm.Function` object using the variable (interpolate in space \n", @@ -256,11 +269,12 @@ " fun.domains = {\"primary\": \"current collector\"}\n", " fun.mesh = mesh.combine_submeshes(\"current collector\")\n", " fun.secondary_mesh = None\n", - " \n", + "\n", " return fun" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -288,6 +302,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -330,6 +345,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -337,6 +353,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -360,6 +377,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -384,7 +402,7 @@ " param,\n", " cmap=\"viridis\",\n", "):\n", - " \n", + "\n", " fig, ax = plt.subplots(2, 2, figsize=(13, 7))\n", " fig.subplots_adjust(\n", " left=0.15, bottom=0.1, right=0.95, top=0.95, wspace=0.4, hspace=0.8\n", @@ -513,6 +531,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -531,6 +550,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -576,6 +596,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -640,6 +661,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -692,6 +714,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -758,6 +781,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -772,6 +796,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -802,13 +827,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/rate-capability.ipynb b/docs/source/examples/notebooks/models/rate-capability.ipynb similarity index 100% rename from examples/notebooks/models/rate-capability.ipynb rename to docs/source/examples/notebooks/models/rate-capability.ipynb diff --git a/examples/notebooks/models/simulating-ORegan-2022-parameter-set.ipynb b/docs/source/examples/notebooks/models/simulating-ORegan-2022-parameter-set.ipynb similarity index 100% rename from examples/notebooks/models/simulating-ORegan-2022-parameter-set.ipynb rename to docs/source/examples/notebooks/models/simulating-ORegan-2022-parameter-set.ipynb diff --git a/docs/source/examples/notebooks/models/spm1.png b/docs/source/examples/notebooks/models/spm1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0e9ea9cc09656856bc3884639c6c0b7cfef208 GIT binary patch literal 24160 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 Ezeggo*Z=?k literal 0 HcmV?d00001 diff --git a/examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb b/docs/source/examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb similarity index 98% rename from examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb rename to docs/source/examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb index 73897bfcd5..c8f4c6913f 100644 --- a/examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb +++ b/docs/source/examples/notebooks/models/submodel_cracking_DFN_or_SPM.ipynb @@ -32,6 +32,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -55,6 +56,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -73,6 +75,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -113,6 +116,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -181,6 +185,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -220,6 +225,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -250,13 +256,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/submodel_loss_of_active_materials.ipynb b/docs/source/examples/notebooks/models/submodel_loss_of_active_materials.ipynb similarity index 99% rename from examples/notebooks/models/submodel_loss_of_active_materials.ipynb rename to docs/source/examples/notebooks/models/submodel_loss_of_active_materials.ipynb index 8e41a57d06..0f01da45b8 100644 --- a/examples/notebooks/models/submodel_loss_of_active_materials.ipynb +++ b/docs/source/examples/notebooks/models/submodel_loss_of_active_materials.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -365,6 +366,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -396,13 +398,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/models/thermal-models.ipynb b/docs/source/examples/notebooks/models/thermal-models.ipynb similarity index 90% rename from examples/notebooks/models/thermal-models.ipynb rename to docs/source/examples/notebooks/models/thermal-models.ipynb index 5968001a76..96cf317b12 100644 --- a/examples/notebooks/models/thermal-models.ipynb +++ b/docs/source/examples/notebooks/models/thermal-models.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,7 +9,7 @@ "\n", "There are a number of thermal submodels available in PyBaMM. In this notebook we give details of each of the models, and highlight any relevant parameters. At present PyBaMM includes a lumped thermal model, a 1D thermal model which accounts for the through-cell variation in temperature, and a 2D pouch cell model which assumed the temperature is uniform through the thickness of the pouch, but accounts for variations in temperature in the remaining two dimensions. Here we give the governing equations for each model. \n", "\n", - "A more comprehensive review of the pouch cell models can be found in [[4]](#References), [[6]](#References)." + "A more comprehensive review of the pouch cell models can be found in references [4] and [6] at the end of this notebook." ] }, { @@ -30,6 +31,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -37,27 +39,38 @@ "\n", "The lumped thermal model solves the following ordinary differential equation for the average temperature, given here in dimensional terms,\n", "\n", - "$$\\rho_{eff} \\frac{\\partial T}{\\partial t} = \\bar{Q} - \\frac{hA}{V}(T-T_{\\infty}),$$\n", + "$$\n", + "\\rho_{eff} \\frac{\\partial T}{\\partial t} = \\bar{Q} - \\frac{hA}{V}(T-T_{\\infty}),\n", + "$$\n", "\n", "where $\\rho_{eff}$ is effective volumetric heat capacity, $T$ is the temperature, $t$ is time, $\\bar{Q}$ is the averaged heat source term, $h$ is the heat transfer coefficient, $A$ is the surface area (available for cooling), $V$ is the cell volume, and $T_{\\infty}$ is the ambient temperature. An initial temperature $T_0$ must be prescribed.\n", "\n", "\n", "The effective volumetric heat capacity is computed as \n", "\n", - "$$ \\rho_{eff} = \\frac{\\sum_k \\rho_k c_{p,k} L_k}{\\sum_k L_k},$$\n", + "$$\n", + "\\rho_{eff} = \\frac{\\sum_k \\rho_k c_{p,k} L_k}{\\sum_k L_k},\n", + "$$\n", "\n", "where $\\rho_k$ is the density, $c_{p,k}$ is the specific heat, and $L_k$ is the thickness of each component. The subscript $k \\in \\{cn, n, s, p, cp\\}$ is used to refer to the components negative current collector, negative electrode, separator, positive electrode, and positive current collector.\n", "\n", "The heat source term accounts for Ohmic heating $Q_{Ohm,k}$ due to resistance in the solid and electrolyte, irreverisble heating due to electrochemical reactions $Q_{rxn,k}$, and reversible heating due to entropic changes in the the electrode $Q_{rev,k}$:\n", "\n", - "$$ Q = Q_{Ohm,k}+Q_{rxn,k}+Q_{rev,k}, $$\n", + "$$\n", + "Q = Q_{Ohm,k}+Q_{rxn,k}+Q_{rev,k},\n", + "$$\n", "\n", - "with \n", - "$$ Q_{Ohm,k} = -i_k \\nabla \\phi_k, \\quad Q_{rxn,k} = a_k j_k \\eta_k, \\quad Q_{rev,k} = a_k j_k T_k \\frac{\\partial U}{\\partial T} \\bigg|_{T=T_{\\infty}}.$$\n", - "Here $i_k$ is the current, $\\phi_k$ the potential, $a_k$ the surface area to volume ratio, $j_k$ the interfacial current density, $\\eta_k$ the overpotential, and $U$ the open-circuit potential. The averaged heat source term $\\bar{Q}$ is computed by taking the volume-average of $Q$." + "with\n", + "\n", + "$$ \n", + "Q_{Ohm,k} = -i_k \\nabla \\phi_k, \\quad Q_{rxn,k} = a_k j_k \\eta_k, \\quad Q_{rev,k} = a_k j_k T_k \\frac{\\partial U}{\\partial T} \\bigg|_{T=T_{\\infty}}.\n", + "$$\n", + "\n", + "Here $i_k$ is the current, $\\phi_k$ the potential, $a_k$ the surface area to volume ratio, $j_k$ the interfacial current density, $\\eta_k$ the overpotential, and $U$ the open-circuit potential. The averaged heat source term $\\bar{Q}$ is computed by taking the volume-average of $Q$.\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -65,6 +78,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -79,7 +93,7 @@ "\n", "and correspond to heat transfer at the large surface of the pouch on the side of the negative current collector, heat transfer at the large surface of the pouch on the side of the positive current collector, heat transfer at the negative tab, heat transfer at the positive tab, and heat transfer at the remaining surfaces.\n", "\n", - "The \"x-lumped\" option can be selected as follows" + "The \"x-lumped\" option can be selected as follows\n" ] }, { @@ -93,6 +107,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -107,7 +122,7 @@ "\n", "However, if the \"cell geometry\" is set to \"pouch\" the heat transfer coefficient, cell cooling surface are and cell volume are automatically computed to correspond to a pouch. In this instance the \"lumped\" is equivalent to the \"x-lumped\" option.\n", "\n", - "The lumped thermal option with an arbitrary geometry can be selected as follows" + "The lumped thermal option with an arbitrary geometry can be selected as follows\n" ] }, { @@ -128,6 +143,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -146,6 +162,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -165,7 +182,7 @@ "\n", "Here $\\lambda_k$ is the thermal conductivity of component $k$, and the heat transfer coefficients $h_{cn}$ and $h_{cp}$ correspond to heat transfer at the large surface of the pouch on the side of the negative current collector, heat transfer at the large surface of the pouch on the side of the positive current collector, respectively. The heat source term $Q$ is as described in the section on lumped models. Note: the 1D model neglects any cooling from the tabs or edges of the cell -- it assumes a pouch cell geometry and _only_ accounts for cooling from the two large surfaces of the pouch. \n", "\n", - "The 1D model is termed \"x-full\" (since it fully accounts for variation in the x direction) and can be selected as follows" + "The 1D model is termed \"x-full\" (since it fully accounts for variation in the x direction) and can be selected as follows\n" ] }, { @@ -179,6 +196,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -186,32 +204,48 @@ "\n", "The pouch cell thermal models ignore any variation in temperature through the thickness of the cell (x direction), and solve for $T(y,z,t)$. The temperature is found as the solution of a partial differential equation, given here in dimensional terms,\n", "\n", - "$$\\rho_{eff} \\frac{\\partial T}{\\partial t} = \\lambda_{eff} \\nabla_\\perp^2T + \\bar{Q} - \\frac{(h_{cn}+h_{cp})A}{V}(T-T_{\\infty}),$$\n", + "$$\n", + "\\rho_{eff} \\frac{\\partial T}{\\partial t} = \\lambda_{eff} \\nabla_\\perp^2T + \\bar{Q} - \\frac{(h_{cn}+h_{cp})A}{V}(T-T_{\\infty}),\n", + "$$\n", "\n", "along with boundary conditions\n", "\n", - "$$ -\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = \\frac{L_{cn}h_{cn} + (L_n+L_s+L_p+L_{cp})h_{edge}}{L_{cn}+L_n+L_s+L_p+L_{cp}}(T-T_\\infty),$$\n", + "$$\n", + "-\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = \\frac{L_{cn}h_{cn} + (L_n+L_s+L_p+L_{cp})h_{edge}}{L_{cn}+L_n+L_s+L_p+L_{cp}}(T-T_\\infty),\n", + "$$\n", + "\n", "at the negative tab,\n", - "$$ -\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = \\frac{(L_{cn}+L_n+L_s+L_p)h_{edge}+L_{cp}h_{cp}}{L_{cn}+L_n+L_s+L_p+L_{cp}}(T-T_\\infty),$$ \n", + "\n", + "$$\n", + "-\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = \\frac{(L_{cn}+L_n+L_s+L_p)h_{edge}+L_{cp}h_{cp}}{L_{cn}+L_n+L_s+L_p+L_{cp}}(T-T_\\infty),\n", + "$$\n", + "\n", "at the positive tab, and\n", - "$$ -\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = h_{edge}(T-T_\\infty),$$ \n", + "\n", + "$$\n", + "-\\lambda_{eff} \\nabla_\\perp T \\cdot \\boldsymbol{n} = h_{edge}(T-T_\\infty),\n", + "$$\n", + "\n", "elsewhere. Again, an initial temperature $T_0$ must be prescribed.\n", "\n", "Here the heat source term is averaged in the x direction so that $\\bar{Q}=\\bar{Q}(y,z)$. The parameter $\\lambda_{eff}$ is the effective thermal conductivity, computed as \n", "\n", - "$$ \\lambda_{eff} = \\frac{\\sum_k \\lambda_k L_k}{\\sum_k L_k}.$$\n", + "$$\n", + "\\lambda_{eff} = \\frac{\\sum_k \\lambda_k L_k}{\\sum_k L_k}.\n", + "$$\n", "\n", "The heat transfer coefficients $h_{cn}$, $h_{cp}$ and $h_{egde}$ correspond to heat transfer at the large surface of the pouch on the side of the negative current collector, heat transfer at the large surface of the pouch on the side of the positive current collector, and heat transfer at the remaining, respectively.\n", "\n", - "As with the \"x-lumped\" option, the relevant heat transfer parameters are: \n", - "\"Negative current collector surface heat transfer coefficient [W.m-2.K-1]\" \n", - "\"Positive current collector surface heat transfer coefficient [W.m-2.K-1]\" \n", - "\"Negative tab heat transfer coefficient [W.m-2.K-1]\" \n", - "\"Positive tab heat transfer coefficient [W.m-2.K-1]\" \n", - "\"Edge heat transfer coefficient [W.m-2.K-1]\" " + "As with the \"x-lumped\" option, the relevant heat transfer parameters are:\n", + "\"Negative current collector surface heat transfer coefficient [W.m-2.K-1]\"\n", + "\"Positive current collector surface heat transfer coefficient [W.m-2.K-1]\"\n", + "\"Negative tab heat transfer coefficient [W.m-2.K-1]\"\n", + "\"Positive tab heat transfer coefficient [W.m-2.K-1]\"\n", + "\"Edge heat transfer coefficient [W.m-2.K-1]\"\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -219,6 +253,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -240,6 +275,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -256,6 +292,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -295,6 +332,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -339,6 +377,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -367,6 +406,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -436,6 +476,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -443,6 +484,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/unsteady-heat-equation.ipynb b/docs/source/examples/notebooks/models/unsteady-heat-equation.ipynb similarity index 100% rename from examples/notebooks/models/unsteady-heat-equation.ipynb rename to docs/source/examples/notebooks/models/unsteady-heat-equation.ipynb diff --git a/examples/notebooks/models/using-model-options_thermal-example.ipynb b/docs/source/examples/notebooks/models/using-model-options_thermal-example.ipynb similarity index 91% rename from examples/notebooks/models/using-model-options_thermal-example.ipynb rename to docs/source/examples/notebooks/models/using-model-options_thermal-example.ipynb index 98c0408341..85c91ec0d0 100644 --- a/examples/notebooks/models/using-model-options_thermal-example.ipynb +++ b/docs/source/examples/notebooks/models/using-model-options_thermal-example.ipynb @@ -6,15 +6,16 @@ "metadata": {}, "source": [ "# Using model options in PyBaMM\n", - "In this notebook we show how to pass options to models. This allows users to do things such as include extra physics (e.g. thermal effects) or change the macroscopic dimension of the problem (e.g. change from a 1D model to a 2+1D pouch cell model). To see all of the options currently available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/api/models/base_models/base_battery_model.html). For more information on combining submodels explicitly to create your own custom model, please see the [Using Submodels notebook](./using-submodels.ipynb)." + "In this notebook we show how to pass options to models. This allows users to do things such as include extra physics (e.g. thermal effects) or change the macroscopic dimension of the problem (e.g. change from a 1D model to a 2+1D pouch cell model). To see all of the options currently available in PyBaMM, please take a look at the documentation [here](https://docs.pybamm.org/en/latest/source/api/models/base_models/base_battery_model.html). For more information on combining submodels explicitly to create your own custom model, please see the [Using Submodels notebook](using-submodels.ipynb)." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Solving the SPMe with a lumped thermal model\n", - "PyBaMM is designed to be a flexible modelling package that allows users to easily include different physics within a model without having to start from scratch. In this example, we show how to pass model options to include thermal effects in the SPMe (for more information on the SPMe see [here](./models/SPMe.ipynb)). First we import PyBaMM and any other packages we need" + "PyBaMM is designed to be a flexible modelling package that allows users to easily include different physics within a model without having to start from scratch. In this example, we show how to pass model options to include thermal effects in the SPMe (for more information on the SPMe see [here](SPMe.ipynb)). First we import PyBaMM and any other packages we need" ] }, { @@ -40,10 +41,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "We then choose out model options, which a set as a dictionary. We choose to model the behaviour in the particle by assuming the concentration profile is quadratic within the particle. We also choose a lumped thermal model (note that this is fully-coupled, i.e. parameters can depend on temperature). For an in-depth look at the thermal models see the [thermal models notebook](models/thermal-models.ipynb)" + "We then choose out model options, which a set as a dictionary. We choose to model the behaviour in the particle by assuming the concentration profile is quadratic within the particle. We also choose a lumped thermal model (note that this is fully-coupled, i.e. parameters can depend on temperature). For an in-depth look at the thermal models see the [thermal models notebook](thermal-models.ipynb)" ] }, { @@ -56,6 +58,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -89,6 +92,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -117,6 +121,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,6 +156,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -158,6 +164,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/models/using-submodels.ipynb b/docs/source/examples/notebooks/models/using-submodels.ipynb similarity index 98% rename from examples/notebooks/models/using-submodels.ipynb rename to docs/source/examples/notebooks/models/using-submodels.ipynb index 9ef15853f0..fd66ef45f2 100644 --- a/examples/notebooks/models/using-submodels.ipynb +++ b/docs/source/examples/notebooks/models/using-submodels.ipynb @@ -10,11 +10,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Changing a submodel in an exisiting battery model\n", - "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](./models/SPM.ipynb)). \n", + "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](SPM.ipynb)). \n", "\n", "First we import pybamm" ] @@ -38,6 +39,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -54,6 +56,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -112,6 +115,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -128,6 +132,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -146,6 +151,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -153,6 +159,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -211,6 +218,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,6 +246,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -254,6 +263,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -283,6 +293,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -326,6 +337,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -345,6 +357,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -363,6 +376,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -387,6 +401,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -430,6 +445,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -481,6 +497,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -505,6 +522,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -526,6 +544,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -542,6 +561,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -585,6 +605,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -614,13 +635,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/parameterization/change-input-current.ipynb b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb similarity index 96% rename from examples/notebooks/parameterization/change-input-current.ipynb rename to docs/source/examples/notebooks/parameterization/change-input-current.ipynb index 1f11a56727..4240b70f1a 100644 --- a/examples/notebooks/parameterization/change-input-current.ipynb +++ b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,18 +10,19 @@ "This notebook shows you how to change the input current when solving PyBaMM models. It also explains how to load in current data from a file, and how to add a user-defined current function. For more examples of different drive cycles see [here](https://github.com/pybamm-team/PyBaMM/tree/develop/pybamm/input/drive_cycles).\n", "\n", "### Table of Contents\n", - "1. [Constant current](#constant)\n", - "1. [Loading in current data](#data)\n", - "1. [Adding your own current function](#function)" + "1. Constant current\n", + "1. Loading in current data\n", + "1. Adding your own current function" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Constant current \n", "\n", - "In this notebook we will use the SPM as the example model, and change the input current from the default option. If you are not familiar with running a model in PyBaMM, please see [this](./models/SPM.ipynb) notebook for more details.\n", + "In this notebook we will use the SPM as the example model, and change the input current from the default option. If you are not familiar with running a model in PyBaMM, please see [this](../models/SPM.ipynb) notebook for more details.\n", "\n", "In PyBaMM, the current function is set using the parameter \"Current function [A]\". Below we load the SPM with the default parameters, and then change the the current function to be an input parameter, so that we can change it easily later." ] @@ -56,6 +58,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -97,6 +100,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -132,6 +136,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -168,6 +173,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -203,6 +209,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -210,6 +217,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -230,11 +238,12 @@ "def my_fun(A, omega):\n", " def current(t):\n", " return A * pybamm.sin(2 * np.pi * omega * t)\n", - " \n", + "\n", " return current" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -260,6 +269,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -303,6 +313,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/parameterization/parameter-values.ipynb b/docs/source/examples/notebooks/parameterization/parameter-values.ipynb similarity index 100% rename from examples/notebooks/parameterization/parameter-values.ipynb rename to docs/source/examples/notebooks/parameterization/parameter-values.ipynb diff --git a/examples/notebooks/parameterization/parameterization.ipynb b/docs/source/examples/notebooks/parameterization/parameterization.ipynb similarity index 99% rename from examples/notebooks/parameterization/parameterization.ipynb rename to docs/source/examples/notebooks/parameterization/parameterization.ipynb index 6720cb894f..211884f19d 100644 --- a/examples/notebooks/parameterization/parameterization.ipynb +++ b/docs/source/examples/notebooks/parameterization/parameterization.ipynb @@ -17,6 +17,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -46,6 +47,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -70,6 +72,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -105,6 +108,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -122,6 +126,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -129,6 +134,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -158,6 +164,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -165,6 +172,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -190,6 +198,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -221,6 +230,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -253,6 +263,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -260,6 +271,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -294,6 +306,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -311,6 +324,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -333,6 +347,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -385,10 +400,11 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Using pre-defined models in `PyBaMM`\n", + "## Using pre-defined models in `PyBaMM`\n", "\n", "In the next few steps, we will be showing the same workflow with the Single Particle Model (`SPM`). We will also see how you can pass a function as a `parameter`'s value and how to plot such `parameter functions`.\n", "\n", @@ -405,6 +421,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -473,6 +490,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -480,6 +498,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -550,6 +569,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1362,6 +1382,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1431,6 +1452,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1438,6 +1460,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1445,6 +1468,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1483,6 +1507,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1515,6 +1540,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1524,6 +1550,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1565,6 +1592,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1609,6 +1637,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1714,6 +1743,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/docs/source/examples/notebooks/plotting/customize-quick-plot.ipynb b/docs/source/examples/notebooks/plotting/customize-quick-plot.ipynb new file mode 100644 index 0000000000..c9ea0e7581 --- /dev/null +++ b/docs/source/examples/notebooks/plotting/customize-quick-plot.ipynb @@ -0,0 +1,430 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "saved-crown", + "metadata": {}, + "source": [ + "# Customizing QuickPlot" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "adjacent-internship", + "metadata": {}, + "source": [ + "This notebook shows how to customize PyBaMM's `QuickPlot`, using matplotlib's [style sheets and rcParams](https://matplotlib.org/stable/tutorials/introductory/customizing.html)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "rocky-function", + "metadata": {}, + "source": [ + "First we define and solve the models" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "spare-craft", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.1.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "\n", + "models = [pybamm.lithium_ion.SPM(), pybamm.lithium_ion.SPMe(), pybamm.lithium_ion.DFN()]\n", + "sims = []\n", + "for model in models:\n", + " sim = pybamm.Simulation(model)\n", + " sim.solve([0, 3600])\n", + " sims.append(sim)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "nutritional-scratch", + "metadata": {}, + "source": [ + "Call the default plots" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "healthy-fluid", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74615ee0f3bf4ce7a681c0e556bec502", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pybamm.dynamic_plot(sims)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "basic-mentor", + "metadata": {}, + "source": [ + "## Using style sheets" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "mysterious-pantyhose", + "metadata": {}, + "source": [ + "The easiest way to customize style is to use one of matplotlib's available style sheets" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "sunset-planet", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Solarize_Light2',\n", + " '_classic_test_patch',\n", + " '_mpl-gallery',\n", + " '_mpl-gallery-nogrid',\n", + " 'bmh',\n", + " 'classic',\n", + " 'dark_background',\n", + " 'fast',\n", + " 'fivethirtyeight',\n", + " 'ggplot',\n", + " 'grayscale',\n", + " 'seaborn-v0_8',\n", + " 'seaborn-v0_8-bright',\n", + " 'seaborn-v0_8-colorblind',\n", + " 'seaborn-v0_8-dark',\n", + " 'seaborn-v0_8-dark-palette',\n", + " 'seaborn-v0_8-darkgrid',\n", + " 'seaborn-v0_8-deep',\n", + " 'seaborn-v0_8-muted',\n", + " 'seaborn-v0_8-notebook',\n", + " 'seaborn-v0_8-paper',\n", + " 'seaborn-v0_8-pastel',\n", + " 'seaborn-v0_8-poster',\n", + " 'seaborn-v0_8-talk',\n", + " 'seaborn-v0_8-ticks',\n", + " 'seaborn-v0_8-white',\n", + " 'seaborn-v0_8-whitegrid',\n", + " 'tableau-colorblind10']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.style.available" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "headed-royalty", + "metadata": {}, + "source": [ + "For example we can use the ggplot style from R. In this case, the title fonts are quite large, so we reduce the number of words in a title before a line break" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "behavioral-tyler", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1436920c8a174d099b1fe25dfb41c55c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.style.use(\"ggplot\")\n", + "pybamm.settings.max_words_in_line = 3\n", + "pybamm.dynamic_plot(sims)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "annoying-limitation", + "metadata": {}, + "source": [ + "Another good set of style sheets for scientific plots is available by pip installing the [SciencePlots](https://github.com/garrettj403/SciencePlots) package" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "valuable-baptist", + "metadata": {}, + "source": [ + "## Further customization using rcParams" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "atlantic-building", + "metadata": {}, + "source": [ + "Sometimes we want further customization of a style, without needing to edit the style sheets. For example, we can update the font sizes and plot again.\n", + "\n", + "To change the line colors, we use `cycler`" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "excited-circuit", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8f4c908b9c604d43a9a028c84fc86b1a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib as mpl\n", + "from cycler import cycler\n", + "\n", + "mpl.rcParams[\"axes.labelsize\"] = 12\n", + "mpl.rcParams[\"axes.titlesize\"] = 12\n", + "mpl.rcParams[\"xtick.labelsize\"] = 12\n", + "mpl.rcParams[\"ytick.labelsize\"] = 12\n", + "mpl.rcParams[\"legend.fontsize\"] = 12\n", + "mpl.rcParams[\"axes.prop_cycle\"] = cycler('color', [\"k\", \"g\", \"c\"])\n", + "pybamm.dynamic_plot(sims)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "recreational-complexity", + "metadata": {}, + "source": [ + "## Very fine customization" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "german-possibility", + "metadata": {}, + "source": [ + "Some customization of the `QuickPlot` object is possible by passing arguments - see the [docs](https://pybamm.readthedocs.io/en/latest/source/api/plotting/quick_plot.html) for details\n", + "\n", + "We can also further control the plot by calling `plot.fig` after the figure has been created, and editing the matplotlib objects. For example, here we move the titles to the ylabel, and move the legend." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "specific-dictionary", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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hBBCCCFEUVg0JVSv19OsWbOSzqVAJpOJO3fuKH1lExISuHPnDgEBAfli69aty9WrV5XbV69exc7ODl9f33xxeftLa0whhChr27Zt43//+x+2trZ4e3tTpUoVnJ2dzb6cnJysnaYQQgghhBBCiHvIysrirbfe4q233iIrK8va6QgrsWimbZMmTYiIiFBmn5am/fv3k5CQwNChQwFITEwEwM3NLV+sm5sbqampGAwGbG1tSUpKwtXVFZVKlS/u7rFKY8yCGAwGDAaDclulUuHg4IBKpco3nihdecdbjrt1yPEvHevWraNBgwb897//RafTWTsdIYQQQgghhBAWyMnJYdGiRQC8/fbbVs5GWItFRdsXXniBWbNmsXbtWrp3746zs3NJ5wXAzZs3+eGHH6hfvz6dO3cGcmf5AmZ9b/PY2toqMba2tuj1+vvGldaYBVm3bh2rV69WbteuXdush64oe97e3tZOoVKT41+y0tPT6dChgxRshRDiAaSmpvLrr79y+/Zt0tLSMJlMZvtVKhXjx4+3UnZCCCGEEKKysKho+5///AeTycTKlStZuXIlWq22wMW38j4VsERSUhIfffQROp2O1157TRlfq9UCkJ2dne8+ebNY82K0Wm2R40p6zIIEBwfTt29f5XbeLMO4uDizGbii9KlUKry9vYmOjs73ZkyUvop+/DUaDVWrVrV2GvkEBgYSGRlp7TSEEKLCOnHiBJ9//jlZWVk4ODgUuNiuXCUihBBCCCHKgkVF29atW5fqCWt6ejoffPABaWlpvPvuu7i7uyv77tWGIDExEScnJ2XWq6urK2fPnsVkMpnl+892CKUxZkFsbW2Vce5mMpkqZOHqYSDH3rrk+JesF154gQ8//JBffvmFLl26lNpVEEII8bBavHgxrq6uvP766/j5+Vk7HSGEEEIIUYlZVLSdMGFCSeeh0Ov1fPzxx0RFRTF9+nRq1Khhtt/d3R0XFxcuX76c774RERH4+/srt/39/dm9ezc3b940GyciIkLZX1pjCiFEWXvttdcwmUwsW7aMZcuWlcpVEEII8TCLjo7m2WeflYKtEEIIIYSwOouKtqXFaDTyxRdfcPHiRd544w3q169fYFzr1q0JCwsjLi5O6Qd7+vRpoqKi6NOnjxLXqlUrFi1axLZt2xgzZgyQO7Nvx44duLu706BBg1IdUwghylJpXwUh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IiJSNV1dXYjFYgBAaWkpbt++jU6dOsmP6+npyY8TEREREamTUknbhw8fvnITBktLSzx8+FD+2NnZGXl5eco8FRERERFRrXB2dsbp06eRmJiIQ4cOoaCgAN27d5cff/78OZo0aaLBCImIiIiosVAqaWtmZoaoqChIpdJyx6RSKSIiImBqaiovy83NhZGRkdJBEhERERGp24QJE5CdnY3PP/8cBw4cgJubG1xdXeXHo6Oj0bp1aw1GSERERESNhVJr2g4dOhRbtmzBkiVL0LdvX9jY2AAAUlJScPr0aSQkJOCtt96S14+MjISLi4tqIiYiIiIiUgMXFxesX78e9+7dg6GhIdq1ayc/lp+fj4EDByqUERERERGpi0Amk8mUOTE0NBRBQUHllj0wMjLCuHHjMGjQIABAcXEx4uPjYWlp+colFYiIiIiIiIiIiIioBklbACgpKcH9+/eRlpYG4OVats7OztDWVmoCLxERERGRxt2+fRtXr15FamoqgJfXuF27duUsWyIiIiKqNTVK2hIRERERNRQlJSVYv349YmJiAAAGBgYAALFYDADo2bMn5s+fzwkKRERERKR2Sl9xisVihIaGIjY2FtnZ2Zg1axZcXV2Rl5eHc+fOoXv37vK1bomIiIiI6rr9+/cjJiYGw4cPx7Bhw+Qb62ZnZyMkJAQhISE4cOAAJkyYoNlAiYiIiKjBEypzUnp6OhYuXIigoCCkp6fj4cOHKCwsBPByTdtTp07hxIkTKg2UiIiIiEidLl26BD8/P0yZMkWesAWAJk2aYMqUKfD19cXFixc1FyARERERNRpKJW137NiBgoICfPvtt1i2bFm54z169MCtW7dqGhsRERERUa3JysqCq6trpcdbtmyJrKys2guIiIiIiBotpZK2N2/exODBg2Fvbw+BQFDuuLW1NdLT02scHBERERFRbTE3N8ft27crPX779m2Ym5vXYkRERERE1FgplbSVSCQwMTGp9HhBQYHSARERERERaYKfnx8iIiKwefNmPH36FFKpFFKpFE+fPsVvv/2GiIgI9OrVS9NhEhEREVEjoNRGZPb29rhz5w769+9f4fGYmBg4OTnVJC4iIiIiolo1evRoPH/+HKdPn8bp06chFL6c3yCVSgG8TOr6+/trMkQiIiIiaiSUStoOGTIEgYGBcHR0hIeHB4CXF7MpKSnYv38/4uLi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QuT2Vdo2mYioJJi0JaIKLzg4GB999BFatGgBOzs7REVF4ffff0d8fHyBySlKqmbNmujQoQOmTp2KzMxMODs7Y9OmTUJCpiju7u4YNmwYxowZgzFjxqBhw4bIycnB48ePce7cOWzatKnUMTVr1gxAXq+MQYMG4f79+/j5558LPEZWXGw6OjrYtm0bdHV1oaurW+iPCnd3dwwePBgLFy5EUlISAgMDkZmZiePHj+Obb76R68GQr0+fPti0aRO6deuG0aNHw93dHcnJybh58yays7Px/fffK/w+P/7442LH6dTR0cGECRMwZcoU2NjYoFWrVrhy5Qp++uknjBw5UviB99lnn+F///sf+vXrh3HjxiEpKQlLliwp8ANwxowZ6NmzJ0aMGIFu3brB0tISkZGROHPmDPr374+mTZsqHDsVxPOU56mmnaeenp6wsbFBaGioMEmajo4OmjRpghMnThSZiM6n6GekKJFIhNmzZ2PUqFHIyMhAmzZtYGxsjJcvX+LYsWOYOnWqXHLs7TgU+R5/8803OHbsGDp16oSxY8fCzs4ODx48QEZGBr744guhTv766y/4+fnB2NgYHh4eRSZ4a9eujY4dO2L69OnIysqCh4cHdu3ahUuXLil07nzyySf4+OOPYWFhIUzely9/3Or//e9/aN++PYyMjODl5YVRo0Zhz5496NatG0aMGAEnJyfEx8fjypUrsLe3x6hRo0pU5x86mUwmDL+Qnp6Ou3fvYvPmzXj+/DlWrlwpJPisra3x6aefYvXq1TAwMICPjw9OnDiBvXv3YsGCBQUSiQMHDsR3330HDw8PIblflPJsj97VqlUrGBsbY+LEiRg7diyioqKwbt06uUfgFaHMGN82btw47NixA9HR0WjYsKGw/Ntvv0Xbtm3Rp08fDBo0CJUrV8br168RGhoKPz8/9OjRA0DZ2zRFmZubo0GDBvjpp59gY2MjTOxlZmam8E0fZVH0uzpu3Dh89NFHGDx4MIYOHYpnz57h559/lvtulLZNJiIqCSZtiajC+/rrr3H06FFMnz4d8fHxsLKygpeXF/bs2SMkTspixYoV+O677zBz5kwYGhqiT58+qFWrFn7//fdit5s/fz48PDywadMmLFu2DCYmJnB3dy92bDdFeHl5YeXKlViyZAkGDhyI2rVr4/fff5d7RK041tbWWLhwIVatWoVdu3YhJyen0DHWAGDhwoVwcXHBH3/8gV9++QWVKlVCQEBAkT/iDQwMsHfvXixevBjLly9HTEwMrKysUKdOnUIf6yur4cOHQ1dXF2vXrsX69ethZ2eHb775Rm72Xzs7O2zfvh1TpkzB8OHD4erqioULFwo/aPI1adIEISEhWLx4McaPH4/s7Gw4ODggMDCw2FnBSTE8T3meauJ56u/vj5CQELlHhv39/XHixIn3TkJWks9IUV26dIG5uTmWL1+O3bt3AwBcXFzQokWLYoe/UOR77ObmhkOHDmHevHmYNGkScnNz4ebmJtdDe+HChfj+++/Rv39/ZGZmYt++fcUmwtesWYP58+dj5cqVSEpKgoeHB37//XeFeq63aNECxsbG6N69e4EkWp06dfDNN99gy5YtWLVqFRwdHXHlyhVYWVnh8OHDWLhwIebMmYPExETY2NjAx8cHHTp0eO8xSV5mZqZQbyYmJnBxcUFgYCA2bNgAT09PubIzZ86EhYUFtmzZgh9//BHOzs5YsmQJBg8eXGC/HTt2xHfffafQOMXKbI+srKzwv//9DzNnzsSQIUNQu3ZtrFq1qtBJE9UV49vc3NzQvXt34dx/e/nff/+NBQsWYNKkSUhPT4ednR38/Pzg5eUlV7YsbVpJ/Pzzz/jmm2/wxRdfoFKlShg+fDjS09OxZs2acjtGaSnyXa1Tpw5+++03zJ07F0OGDEHNmjXxyy+/CE/r5Cttm0xEpCiRTCaTqTsIItJcT548KfVM0h+yLl26QEdHB/v27VN3KERUBJ6nRJrr7Nmz6NmzJ44dO4Z69eqpOxwqR1u3bsXXX3+Nf//9F3Z2duoOh0jtUlNT4ebmpu4wiEgDsactEVEZhYSE4NWrV6hVqxYyMzOxd+9eXLx4sdjZ7olItXieEmmH6OhoPH36FLNmzUKTJk2YsK1AXrx4gSdPnuCHH35A165dmbAlIiJ6DyZtiYjKyMTEBLt27cKTJ0+QnZ0NDw8PrFmzho9iEmkQnqdE2mHTpk344Ycf4O3tjR9//FHd4VA5WrJkCfbu3YvGjRtj1qxZ6g6HiIhI43F4BCIqFodHICIiIiIiUg4Oj0BERRGrOwAiIiIiIiIiIiIi+g+TtkRULJFIpO4QiIiIiIiIKiT+3iKiojBpS0TFEolEkEql6g6DiIiIiIioQpFKpUzaElGRmLQlomLZ2dkhNTWViVsiIiIiIqJyIpVKkZqaCjs7O3WHQkQaihOREdF7ZWZmIiYmBjKZDGwyiIiIiIiISk8kEkEkEsHOzg5GRkbqDoeINBSTtkREREREREREREQahMMjEBEREREREREREWkQJm2JiIiIiIiIiIiINAiTtkREREREREREREQahElbIiIiIiIiIiIiIg3CpC0RERERERERERGRBmHSloiIiIiIiIiIiEiD/B+v90+C0QGHCQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pybamm.settings.max_words_in_line = 4\n", + "\n", + "plot = pybamm.QuickPlot(sims, figsize=(14,7))\n", + "plot.plot(0.5); # time in hours\n", + "\n", + "# Move title to ylabel\n", + "for ax in plot.fig.axes:\n", + " title = ax.get_title()\n", + " ax.set_title(\"\")\n", + " ax.set_ylabel(title)\n", + "\n", + "# Remove old legend and add a new one in the bottom\n", + "leg = plot.fig.get_children()[-1]\n", + "leg.set_visible(False)\n", + "plot.fig.legend(plot.labels, loc=\"lower center\", ncol=len(plot.labels), fontsize=11)\n", + "\n", + "# Adjust layout\n", + "plot.gridspec.tight_layout(plot.fig, rect=[0, 0.04, 1, 1])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "approved-gibraltar", + "metadata": {}, + "source": [ + "The figure can then be saved using `plot.fig.savefig`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "needed-structure", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "refined-space", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", + "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + } + ], + "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.11.3" + }, + "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": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "1a781583db2df3c2e87436f6d22cce842c2e50a5670da93a3bd820b97dc43011" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/notebooks/plotting/plot_voltage_components.ipynb b/docs/source/examples/notebooks/plotting/plot-voltage-components.ipynb similarity index 100% rename from examples/notebooks/plotting/plot_voltage_components.ipynb rename to docs/source/examples/notebooks/plotting/plot-voltage-components.ipynb diff --git a/examples/notebooks/simulating-long-experiments.ipynb b/docs/source/examples/notebooks/simulating-long-experiments.ipynb similarity index 99% rename from examples/notebooks/simulating-long-experiments.ipynb rename to docs/source/examples/notebooks/simulating-long-experiments.ipynb index 38d92cc2b7..9bdfd40b54 100644 --- a/examples/notebooks/simulating-long-experiments.ipynb +++ b/docs/source/examples/notebooks/simulating-long-experiments.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "id": "regional-bedroom", "metadata": {}, @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "quantitative-radar", "metadata": {}, @@ -38,6 +40,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "mounted-seven", "metadata": {}, @@ -46,6 +49,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "chronic-consensus", "metadata": {}, @@ -66,6 +70,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "compact-teddy", "metadata": {}, @@ -85,6 +90,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "focused-substitute", "metadata": {}, @@ -126,6 +132,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "heavy-crisis", "metadata": {}, @@ -465,6 +472,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "cloudy-lover", "metadata": {}, @@ -473,6 +481,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "shared-practitioner", "metadata": {}, @@ -516,6 +525,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "intense-princeton", "metadata": {}, @@ -626,6 +636,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "approximate-error", "metadata": {}, @@ -681,6 +692,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "given-telephone", "metadata": {}, @@ -728,6 +740,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "french-substance", "metadata": {}, @@ -736,6 +749,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "accepting-canada", "metadata": {}, @@ -744,6 +758,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "employed-plate", "metadata": {}, @@ -1519,6 +1534,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "guilty-nylon", "metadata": {}, @@ -1592,6 +1608,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "considered-rescue", "metadata": {}, @@ -1639,6 +1656,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "convinced-winter", "metadata": {}, @@ -1647,6 +1665,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "unauthorized-fundamental", "metadata": {}, @@ -1742,6 +1761,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "weird-darkness", "metadata": {}, @@ -1828,6 +1848,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "leading-passport", "metadata": {}, @@ -1857,6 +1878,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "plastic-framework", "metadata": {}, @@ -1865,6 +1887,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "id": "drawn-fifty", "metadata": {}, @@ -1899,14 +1922,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "593ae90b", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebooks/simulation-class.ipynb b/docs/source/examples/notebooks/simulation-class.ipynb similarity index 95% rename from examples/notebooks/simulation-class.ipynb rename to docs/source/examples/notebooks/simulation-class.ipynb index 7506e7a426..91d9968dfa 100644 --- a/examples/notebooks/simulation-class.ipynb +++ b/docs/source/examples/notebooks/simulation-class.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# A step-by-step look at the Simulation class\n", - "The simplest way to solve a model is to use the `Simulation` class. This automatically processes the model (setting of parameters, setting up the mesh and discretisation, etc.) for you, and provides built-in functionality for solving and plotting. Changing things such as parameters in handled by passing options to the `Simulation`, as shown in the [Getting Started](./Getting%20Started/) guides, [example notebooks](./) and [documentation](https://pybamm.readthedocs.io/en/latest/source/api/simulation.html).\n", + "The simplest way to solve a model is to use the `Simulation` class. This automatically processes the model (setting of parameters, setting up the mesh and discretisation, etc.) for you, and provides built-in functionality for solving and plotting. Changing things such as parameters in handled by passing options to the `Simulation`, as shown in the [Getting Started](getting_started/tutorial-1-how-to-run-a-model.ipynb) guides, [example notebooks](index.rst) and [documentation](https://docs.pybamm.org/en/latest/source/api/simulation.html).\n", "\n", "In this notebook we show how to solve a model using a `Simulation` and compare this to manually handling the different stages of the process, such as setting parameters, ourselves step-by-step." ] @@ -22,6 +22,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -40,6 +41,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -67,6 +69,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +111,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -115,6 +119,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -133,6 +138,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -161,6 +167,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -177,6 +184,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -193,6 +201,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -210,6 +219,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -226,6 +236,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -254,6 +265,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -270,6 +282,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -286,6 +299,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -327,6 +341,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/examples/notebooks/solution-data-and-processed-variables.ipynb b/docs/source/examples/notebooks/solution-data-and-processed-variables.ipynb similarity index 100% rename from examples/notebooks/solution-data-and-processed-variables.ipynb rename to docs/source/examples/notebooks/solution-data-and-processed-variables.ipynb diff --git a/examples/notebooks/solvers/dae-solver.ipynb b/docs/source/examples/notebooks/solvers/dae-solver.ipynb similarity index 100% rename from examples/notebooks/solvers/dae-solver.ipynb rename to docs/source/examples/notebooks/solvers/dae-solver.ipynb diff --git a/examples/notebooks/solvers/ode-solver.ipynb b/docs/source/examples/notebooks/solvers/ode-solver.ipynb similarity index 100% rename from examples/notebooks/solvers/ode-solver.ipynb rename to docs/source/examples/notebooks/solvers/ode-solver.ipynb diff --git a/examples/notebooks/solvers/speed-up-solver.ipynb b/docs/source/examples/notebooks/solvers/speed-up-solver.ipynb similarity index 100% rename from examples/notebooks/solvers/speed-up-solver.ipynb rename to docs/source/examples/notebooks/solvers/speed-up-solver.ipynb diff --git a/examples/notebooks/spatial_methods/finite-volumes.ipynb b/docs/source/examples/notebooks/spatial_methods/finite-volumes.ipynb similarity index 99% rename from examples/notebooks/spatial_methods/finite-volumes.ipynb rename to docs/source/examples/notebooks/spatial_methods/finite-volumes.ipynb index 69d8f40336..9b4ff12986 100644 --- a/examples/notebooks/spatial_methods/finite-volumes.ipynb +++ b/docs/source/examples/notebooks/spatial_methods/finite-volumes.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -30,6 +31,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -37,6 +39,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -69,6 +72,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -96,6 +100,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -123,6 +128,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -144,6 +150,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,6 +158,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -158,6 +166,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -221,6 +230,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -241,6 +251,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -248,6 +259,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -268,6 +280,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -297,6 +310,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -336,6 +350,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -395,6 +410,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -402,6 +418,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -434,6 +451,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -471,6 +489,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -505,6 +524,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -594,6 +614,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -601,6 +622,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -645,6 +667,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -687,6 +710,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -727,6 +751,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -734,6 +759,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -741,6 +767,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -757,6 +784,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -789,6 +817,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -827,6 +856,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -834,6 +864,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -870,6 +901,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -933,6 +965,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -940,6 +973,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -974,6 +1008,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1019,6 +1054,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1065,6 +1101,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1072,6 +1109,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1079,6 +1117,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1130,6 +1169,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1162,6 +1202,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1195,6 +1236,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1215,6 +1257,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1242,13 +1285,6 @@ "source": [ "pybamm.print_citations()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/source/user_guide/fundamentals/index.md b/docs/source/user_guide/fundamentals/index.md index 4ad4542949..347fe81fa7 100644 --- a/docs/source/user_guide/fundamentals/index.md +++ b/docs/source/user_guide/fundamentals/index.md @@ -19,10 +19,10 @@ explore the effect of different battery designs and modeling assumptions under a The core of the framework is a custom computer algebra system to define mathematical equations, and a domain specific modeling language to combine these equations into systems of differential equations (usually partial differential equations for variables depending on space and time). -The [expression tree](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/expression_tree/expression-tree.ipynb) example gives an introduction to the computer algebra system, and the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks/Getting%20Started) tutorials +The [expression tree](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/expression_tree/expression-tree.ipynb) example gives an introduction to the computer algebra system, and the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/docs/source/examples/notebooks/getting_started/) tutorials walk through creating models of increasing complexity. -Once a model has been defined symbolically, PyBaMM solves it using the Method of Lines. First, the equations are discretised in the spatial dimension, using the finite volume method. Then, the resulting system is solved using third-party numerical solvers. Depending on the form of the model, the system can be ordinary differential equations (ODEs) (if only `model.rhs` is defined), or algebraic equations (if only `model.algebraic` is defined), or differential-algebraic equations (DAEs) (if both `model.rhs` and `model.algebraic` are defined). Jupyter notebooks explaining the solvers can be found [here](https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks/solvers). +Once a model has been defined symbolically, PyBaMM solves it using the Method of Lines. First, the equations are discretised in the spatial dimension, using the finite volume method. Then, the resulting system is solved using third-party numerical solvers. Depending on the form of the model, the system can be ordinary differential equations (ODEs) (if only `model.rhs` is defined), or algebraic equations (if only `model.algebraic` is defined), or differential-algebraic equations (DAEs) (if both `model.rhs` and `model.algebraic` are defined). Jupyter notebooks explaining the solvers can be found [here](https://github.com/pybamm-team/PyBaMM/tree/develop/docs/source/examples/notebooks/solvers). ## Model and Parameter Library diff --git a/docs/source/user_guide/getting_started.md b/docs/source/user_guide/getting_started.md index 99cb3b022a..8b4191950e 100644 --- a/docs/source/user_guide/getting_started.md +++ b/docs/source/user_guide/getting_started.md @@ -30,11 +30,11 @@ sim.solve() sim.plot() ``` -However, much greater customisation is available. It is possible to change the physics, parameter values, geometry, submesh type, number of submesh points, methods for spatial discretisation and solver for integration (see DFN [script](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/scripts/DFN.py) or [notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/models/DFN.ipynb)). +However, much greater customisation is available. It is possible to change the physics, parameter values, geometry, submesh type, number of submesh points, methods for spatial discretisation and solver for integration (see DFN [script](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/scripts/DFN.py) or [notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/models/DFN.ipynb)). -For new users we recommend the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks/Getting%20Started) guides. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM, and can either be downloaded and used locally, or used online through [Google Colab](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop). +For new users we recommend the [Getting Started](https://github.com/pybamm-team/PyBaMM/tree/develop/docs/source/examples/notebooks/getting_started/) guides. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM, and can either be downloaded and used locally, or used online through [Google Colab](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop). -Further details can be found in a number of [detailed examples](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/README.md), hosted on +Further details can be found in a number of [detailed examples](https://github.com/pybamm-team/PyBaMM/blob/develop/docs/source/examples/notebooks/index.rst), hosted on GitHub. In addition, full details of classes and methods can be found in the [](api_docs). Additional supporting material can be found [here](https://github.com/pybamm-team/pybamm-supporting-material/). diff --git a/docs/source/user_guide/index.md b/docs/source/user_guide/index.md index ee97bb5875..236dec14e1 100644 --- a/docs/source/user_guide/index.md +++ b/docs/source/user_guide/index.md @@ -22,3 +22,42 @@ maxdepth: 2 --- fundamentals/index ``` + +# Example notebooks + +The notebooks below provide a good introduction to PyBaMM and how to use it. For more +examples, see the [Examples](../examples/index) section. + + +```{nbgallery} +--- +caption: Getting Started +maxdepth: 1 +glob: +--- +../examples/notebooks/getting_started/tutorial-1-how-to-run-a-model.ipynb +../examples/notebooks/getting_started/tutorial-2-compare-models.ipynb +../examples/notebooks/getting_started/tutorial-3-basic-plotting.ipynb +../examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb +../examples/notebooks/getting_started/tutorial-5-run-experiments.ipynb +../examples/notebooks/getting_started/tutorial-6-managing-simulation-outputs.ipynb +../examples/notebooks/getting_started/tutorial-7-model-options.ipynb +../examples/notebooks/getting_started/tutorial-8-solver-options.ipynb +../examples/notebooks/getting_started/tutorial-9-changing-the-mesh.ipynb +../examples/notebooks/getting_started/tutorial-10-creating-a-model.ipynb +../examples/notebooks/getting_started/tutorial-11-creating-a-submodel.ipynb +``` + +```{nbgallery} +--- +caption: Creating Models +maxdepth: 1 +glob: +--- +../examples/notebooks/creating_models/1-an-ode-model.ipynb +../examples/notebooks/creating_models/2-a-pde-model.ipynb +../examples/notebooks/creating_models/3-negative-particle-problem.ipynb +../examples/notebooks/creating_models/4-comparing-full-and-reduced-order-models.ipynb +../examples/notebooks/creating_models/5-half-cell-model.ipynb +../examples/notebooks/creating_models/6-a-simple-SEI-model.ipynb +``` diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index a8dd5b1842..a199342fc2 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -106,17 +106,17 @@ Installable with ``pip install "pybamm[docs]"`` Dependency Minimum Version pip extra Notes ================================================================================================= ================== ================== =================================================================================================================================================================================== `sphinx `__ 1.5.0 docs Sphinx makes it easy to create intelligent and beautiful documentation. -`pydata-sphinx-theme `__ - docs A clean, Bootstrap-based Sphinx theme -`sphinx_design `__ - docs A sphinx extension for designing -`sphinx-copybutton `__ - docs To copy codeblocks -`myst-parser `__ - docs For technical & scientific documentation. -`sphinx-inline-tabs `__ - docs Add inline tabbed content to your Sphinx documentation. -`sphinxcontrib-bibtex `__ - docs For BibTeX citations -`sphinx-autobuild `__ - docs For re-building docs once triggered +`pydata-sphinx-theme `__ \- docs A clean, Bootstrap-based Sphinx theme +`sphinx_design `__ \- docs A sphinx extension for designing +`sphinx-copybutton `__ \- docs To copy codeblocks +`myst-parser `__ \- docs For technical & scientific documentation. +`sphinx-inline-tabs `__ \- docs Add inline tabbed content to your Sphinx documentation. +`sphinxcontrib-bibtex `__ \- docs For BibTeX citations +`sphinx-autobuild `__ \- docs For re-building docs once triggered ================================================================================================= ================== ================== =================================================================================================================================================================================== .. _install.examples_dependencies: -================= + Examples dependencies ^^^^^^^^^^^^^^^^^^^^^ @@ -125,7 +125,7 @@ Installable with ``pip install "pybamm[examples]"`` ================================================================================ ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes ================================================================================ ================== ================== =================================================================================================================================================================================== -`jupyter `__ - examples For example notebooks rendering. +`jupyter `__ \- examples For example notebooks rendering. ================================================================================ ================== ================== =================================================================================================================================================================================== .. _install.dev_dependencies: @@ -138,11 +138,8 @@ Installable with ``pip install "pybamm[dev]"`` ================================================================================ ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes ================================================================================ ================== ================== =================================================================================================================================================================================== -`anytree `__ 2.4.3 dev For Tree Data Structure -`autograd `__ 1.2.0 dev To differentiate python & numpy code. -`scikit-fem `__ 0.2.0 dev For performing finite element assembly. -`pre-commit `__ - dev For managing and maintaining multi-language pre-commit hooks. -`black `__ - dev For code formatting. +`pre-commit `__ \- dev For managing and maintaining multi-language pre-commit hooks. +`black `__ \- dev For code formatting. ================================================================================ ================== ================== =================================================================================================================================================================================== .. _install.cite_dependencies: @@ -181,7 +178,7 @@ Installable with ``pip install "pybamm[bpx]"`` =========================================================== ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes =========================================================== ================== ================== =================================================================================================================================================================================== -`bpx `__ - bpx Battery Parameter eXchange +`bpx `__ \- bpx Battery Parameter eXchange =========================================================== ================== ================== =================================================================================================================================================================================== .. _install.tqdm_dependencies: @@ -194,7 +191,7 @@ Installable with ``pip install "pybamm[tqdm]"`` =========================================================== ================== ================== =================================================================================================================================================================================== Dependency Minimum Version pip extra Notes =========================================================== ================== ================== =================================================================================================================================================================================== -`tqdm `__ - tqdm For logging loops. +`tqdm `__ \- tqdm For logging loops. =========================================================== ================== ================== =================================================================================================================================================================================== Full installation guide diff --git a/examples/README.md b/examples/README.md index c717c5d98a..a90baaecfb 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,4 +1,4 @@ # Examples -A collection of Python scripts and Jupyter notebooks that demonstrate how to use PyBaMM. -For further examples, see the list of repositories that use PyBaMM [here](https://github.com/pybamm-team/pybamm-example-results) +A collection of Python scripts that demonstrate how to use PyBaMM. +Example notebooks have been moved to the [docs folder](docs/source/examples) diff --git a/examples/notebooks/README.md b/examples/notebooks/README.md deleted file mode 100644 index 5890a3f1c9..0000000000 --- a/examples/notebooks/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Getting started - -For new users we recommend the [Getting Started](./Getting%20Started/) notebooks. These are intended to be very simple step-by-step guides to show the basic functionality of PyBaMM. For more detailed notebooks, please see the examples listed below. - -# Examples - -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop/) - -This page contains a number of examples showing how to use PyBaMM. - -Each example was created as a _Jupyter notebook_ (http://jupyter.org/). -These notebooks can be downloaded and used locally by running - -``` -$ jupyter notebook -``` - -from your local PyBaMM repository or used online through [Google Colab](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop/). Alternatively, you can simply copy/paste the relevant code. - -## Using PyBaMM - -The easiest way to start with PyBaMM is by running and comparing some of the inbuilt models: - -- [Run the Single Particle Model (SPM)](./models/SPM.ipynb) -- [Compare models](./models/lead-acid.ipynb) -- [Comparison with COMSOL](./models/compare-comsol-discharge-curve.ipynb) - -It is also easy to add new models or change the setting that are used: - -- [Add a model (example)](./create-model.ipynb) -- [Change model options](./models/using-model-options_thermal-example.ipynb) -- [Using submodels](./using-submodels.ipynb) -- [Change the settings](./change-settings.ipynb) (parameters, spatial method or solver) -- [Change the applied current](./parameterization/change-input-current.ipynb) - -## Expression tree structure - -PyBaMM is built around an expression tree structure. - -- [The expression tree notebook](expression_tree/expression-tree.ipynb) explains how this works, from model creation to solution. -- [The broadcast notebook](expression_tree/broadcasts.ipynb) explains the different types of broadcast. - -The following notebooks are specific to different stages of the PyBaMM pipeline, such as choosing a model, spatial method, or solver. - -### Models - -Several battery models are implemented and can easily be used or [compared](./models/lead-acid.ipynb). The notebooks below show the solution of each individual model. - -Once you are comfortable with the expression tree structure, a good starting point to understand the models in PyBaMM is to take a look at the [basic SPM](https://github.com/pybamm-team/PyBaMM/blob/develop/pybamm/models/full_battery_models/lithium_ion/basic_spm.py) and [basic DFN](https://github.com/pybamm-team/PyBaMM/blob/develop/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py), since these define the entire model (variables, equations, initial and boundary conditions, events) in a single class and so are easier to understand. However, we recommend that you subsequently use the full models as they offer much greater flexibility for coupling different physical effects and visualising a greater range of variables. - -#### Lithium-ion models - -- [Single-Particle Model](./models/SPM.ipynb) -- [Single-Particle Model with electrolyte](./models/SPMe.ipynb) -- [Doyle-Fuller-Newman Model](./models/DFN.ipynb) - -#### Lead-acid models - -- [Full porous-electrode](https://pybamm.readthedocs.io/en/latest/source/api/models/lead_acid/full.html) -- [Leading-Order Quasi-Static](https://pybamm.readthedocs.io/en/latest/source/api/models/lead_acid/loqs.html) - -### Spatial Methods - -The following spatial methods are implemented - -- [Finite Volumes](./spatial_methods/finite-volumes.ipynb) (1D only) -- Spectral Volumes (1D only) -- Finite Elements (only for 2D current collector domains) - -### Solvers - -The following notebooks show examples for generic ODE and DAE solvers. Several solvers are implemented in PyBaMM and we encourage users to try different ones to find the most appropriate one for their models. - -- [ODE solver](./solvers/ode-solver.ipynb) -- [DAE solver](./solvers/dae-solver.ipynb) diff --git a/examples/notebooks/models/SPM.ipynb b/examples/notebooks/models/SPM.ipynb deleted file mode 100644 index 0502dea314..0000000000 --- a/examples/notebooks/models/SPM.ipynb +++ /dev/null @@ -1,1219 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Single Particle Model (SPM) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model Equations" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The SPM consists of two spherically symmetric diffusion equations: one within a representative negative particle ($\\text{k}=\\text{n}$) and one within a representative positive particle ($\\text{k}=\\text{p}$). In the centre of the particle the standard no-flux condition is imposed. Since the SPM assumes that all particles in an electrode behave in exactly the same way, the flux on the surface of a particle is simply the current $I$ divided by the thickness of the electrode $L_{\\text{k}}$. The concentration of lithium in electrode $\\text{k}$ is denoted $c_{\\text{k}}$ and the current is denoted by $I$. The model equations for the SPM are then: \n", - "\\begin{align}\n", - "\\frac{\\partial c_{\\text{s,k}}}{\\partial t} &= -\\frac{1}{r_{\\text{k}}^2} \\frac{\\partial}{\\partial r_{\\text{k}}} \\left(r_{\\text{k}}^2 N_{\\text{s,k}}\\right), \\\\\n", - "N_{\\text{s,k}} &= -D_{\\text{s,k}}(c_{\\text{s,k}}) \\frac{\\partial c_{\\text{s,k}}}{\\partial r_{\\text{k}}}, \\quad \\text{k} \\in \\text{n, p}, \\end{align}\n", - "$$\n", - "N_{\\text{s,k}}\\big|_{r_{\\text{k}}=0} = 0, \\quad \\text{k} \\in \\text{n, p}, \\quad \\ \\ - N_{\\text{s,k}}\\big|_{r_{\\text{k}}=1} = \n", - "\\begin{cases}\n", - "\t\t \\frac{I}{Fa_{\\text{n}}L_{\\text{n}}}, \\quad &\\text{k}=\\text{n}, \\\\ \n", - "\t\t -\\frac{I}{Fa_{\\text{p}}L_{\\text{p}}}, \\quad &\\text{k}=\\text{p}, \n", - "\\end{cases} \\\\\n", - "c_{\\text{s,k}}(r_{\\text{k}},0) = c_{\\text{s,k,0}}, \\quad \\text{k} \\in \\text{n, p},$$\n", - "where $D_{\\text{s,k}}$ is the diffusion coefficient in the solid, $N_{\\text{s,k}}$ denotes the flux of lithium ions in the solid particle within the region $\\text{k}$, and $r_{\\text{k}} \\in[0,1]$ is the radial coordinate of the particle in electrode $\\text{k}$. \n", - "\n", - "### Voltage Expression\n", - "The voltage is obtained from the expression: \n", - "$$\n", - "V = U_{\\text{p}}(c_{\\text{p}})\\big|_{r_{\\text{p}}=1} - U_{\\text{n}}(c_{\\text{n}})\\big|_{r_{\\text{n}}=1} - \\frac{2RT}{F}\\sinh^{-1}\\left(\\frac{I}{2j_{\\text{0,p}} a_{\\text{p}}L_{\\text{p}}}\\right) - \\frac{2RT}{F}\\sinh^{-1}\\left(\\frac{I}{2j_{\\text{0,n}} a_{\\text{p}}L_{\\text{n}}}\\right)\n", - "$$\n", - "with the exchange current densities given by\n", - "$$j_{\\text{0,k}} = (c_{\\text{k}})^{1/2}(1-c_{\\text{k}})^{1/2} $$\n", - "\n", - "More details can be found in [[3]](#References)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example solving SPM using PyBaMM\n", - "\n", - "Below we show how to solve the Single Particle Model, using the default geometry, mesh, parameters, discretisation and solver provided with PyBaMM. In this notebook we explicitly handle all the stages of setting up, processing and solving the model in order to explain them in detail. However, it is often simpler in practice to use the `Simulation` class, which handles many of the stages automatically, as shown [here](../simulation-class.ipynb).\n", - "\n", - "First we need to import `pybamm`, and then change our working directory to the root of the pybamm folder. " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "import numpy as np\n", - "import os\n", - "import matplotlib.pyplot as plt\n", - "os.chdir(pybamm.__path__[0]+'/..')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We then create an instance of the SPM:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.SPM()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model object is a subtype of [`pybamm.BaseModel`](https://pybamm.readthedocs.io/en/latest/source/api/models/base_models/base_model.html), and contains all the equations that define this particular model. For example, the `rhs` dict contained in `model` has a dictionary mapping variables such as $c_n$ to the equation representing its rate of change with time (i.e. $\\partial{c_n}/\\partial{t}$). We can see this explicitly by visualising this entry in the `rhs` dict:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "rhs equation for variable ' X-averaged negative particle concentration ' is:\n" - ] - } - ], - "source": [ - "variable = list(model.rhs.keys())[1]\n", - "equation = list(model.rhs.values())[1]\n", - "print('rhs equation for variable \\'',variable,'\\' is:')\n", - "path = 'examples/notebooks/models/'\n", - "equation.visualise(path+'spm1.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![](spm1.png)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a geometry in which to define our model equations. In pybamm this is represented by the [`pybamm.Geometry`](https://pybamm.readthedocs.io/en/latest/source/api/geometry/index.html) class. In this case we use the default geometry object defined by the model" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "geometry = model.default_geometry" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This geometry object defines a number of domains, each with its own name, spatial variables and min/max limits (the latter are represented as equations similar to the rhs equation shown above). For instance, the SPM has the following domains:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPM domains:\n", - "1. negative electrode with variables:\n", - " -( 0 ) <= x_n <= ( Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) )\n", - "2. separator with variables:\n", - " -( Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) ) <= x_s <= ( Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) + Separator thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) )\n", - "3. positive electrode with variables:\n", - " -( Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) + Separator thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) ) <= x_p <= ( 1 )\n", - "4. negative particle with variables:\n", - " -( 0 ) <= r_n <= ( 1 )\n", - "5. positive particle with variables:\n", - " -( 0 ) <= r_p <= ( 1 )\n", - "6. current collector with variables:\n", - "z = 1\n" - ] - } - ], - "source": [ - "print('SPM domains:')\n", - "for i, (k, v) in enumerate(geometry.items()):\n", - " print(str(i+1)+'.',k,'with variables:')\n", - " for var, rng in v.items():\n", - " if 'min' in rng:\n", - " print(' -(',rng['min'],') <=',var,'<= (',rng['max'],')')\n", - " else:\n", - " print(var, '=', rng['position'])" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Both the model equations and the geometry include parameters, such as $L_p$. We can substitute these symbolic parameters in the model with values by using the [`pybamm.ParameterValues`](https://pybamm.readthedocs.io/en/latest/source/api/parameters/parameter_values.html) class, which takes either a python dictionary or CSV file with the mapping between parameter names and values. Rather than create our own instance of `pybamm.ParameterValues`, we will use the default parameter set included in the model" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "param = model.default_parameter_values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then apply this parameter set to the model and geometry" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "param.process_model(model)\n", - "param.process_geometry(geometry)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next step is to mesh the input geometry. We can do this using the [`pybamm.Mesh`](https://pybamm.readthedocs.io/en/latest/source/api/meshes/index.html) class. This class takes in the geometry of the problem, and also two dictionaries containing the type of mesh to use within each domain of the geometry (i.e. within the positive or negative electrode domains), and the number of mesh points. \n", - "\n", - "The default mesh types and the default number of points to use in each variable for the SPM are:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "negative electrode is of type Uniform1DSubMesh\n", - "separator is of type Uniform1DSubMesh\n", - "positive electrode is of type Uniform1DSubMesh\n", - "negative particle is of type Uniform1DSubMesh\n", - "positive particle is of type Uniform1DSubMesh\n", - "negative particle size is of type Uniform1DSubMesh\n", - "positive particle size is of type Uniform1DSubMesh\n", - "current collector is of type SubMesh0D\n", - "x_n has 20 mesh points\n", - "x_s has 20 mesh points\n", - "x_p has 20 mesh points\n", - "r_n has 20 mesh points\n", - "r_p has 20 mesh points\n", - "y has 10 mesh points\n", - "z has 10 mesh points\n", - "R_n has 30 mesh points\n", - "R_p has 30 mesh points\n" - ] - } - ], - "source": [ - "for k, t in model.default_submesh_types.items():\n", - " print(k,'is of type',t.__name__)\n", - "for var, npts in model.default_var_pts.items():\n", - " print(var,'has',npts,'mesh points')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With these defaults, we can then create our mesh of the given geometry:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "mesh = pybamm.Mesh(geometry, model.default_submesh_types, model.default_var_pts)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next step is to discretise the model equations using this mesh. We do this using the [`pybamm.Discretisation`](https://pybamm.readthedocs.io/en/latest/source/api/spatial_methods/discretisation.html) class, which takes both the mesh we have already created, and a dictionary of spatial methods to use for each geometry domain. For the case of the SPM, we use the following defaults for the spatial discretisation methods:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "macroscale is discretised using FiniteVolume method\n", - "negative particle is discretised using FiniteVolume method\n", - "positive particle is discretised using FiniteVolume method\n", - "negative particle size is discretised using FiniteVolume method\n", - "positive particle size is discretised using FiniteVolume method\n", - "current collector is discretised using ZeroDimensionalSpatialMethod method\n" - ] - } - ], - "source": [ - "for k, method in model.default_spatial_methods.items():\n", - " print(k,'is discretised using',method.__class__.__name__,'method')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We then create the `pybamm.Discretisation` object, and use this to discretise the model equations" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "disc = pybamm.Discretisation(mesh, model.default_spatial_methods)\n", - "disc.process_model(model);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After this stage, all of the variables in `model` have been discretised into `pybamm.StateVector` objects, and spatial operators have been replaced by matrix-vector multiplications, ready to be evaluated within a time-stepping algorithm of a given solver. For example, the rhs expression for $\\partial{c_n}/\\partial{t}$ that we visualised above is now represented by:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "model.concatenated_rhs.children[1].visualise(path+'spm2.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![](spm2.png)\n", - "\n", - "Now we are ready to run the time-stepping routine to solve the model. Once again we use the default ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Solving using CasadiSolver solver...\n", - "Finished.\n" - ] - } - ], - "source": [ - "# Solve the model at the given time points (in seconds)\n", - "solver = model.default_solver\n", - "n = 250\n", - "t_eval = np.linspace(0, 3600, n)\n", - "print('Solving using',type(solver).__name__,'solver...')\n", - "solution = solver.solve(model, t_eval)\n", - "print('Finished.')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each model in pybamm has a list of relevant variables defined in the model, for use in visualising the model solution or for comparison with other models. The SPM defines the following variables:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPM model variables:\n", - "\t- Time\n", - "\t- Time [s]\n", - "\t- Time [min]\n", - "\t- Time [h]\n", - "\t- x\n", - "\t- x [m]\n", - "\t- x_n\n", - "\t- x_n [m]\n", - "\t- x_s\n", - "\t- x_s [m]\n", - "\t- x_p\n", - "\t- x_p [m]\n", - "\t- Sum of electrolyte reaction source terms\n", - "\t- Sum of positive electrode electrolyte reaction source terms\n", - "\t- Sum of x-averaged positive electrode electrolyte reaction source terms\n", - "\t- Sum of interfacial current densities\n", - "\t- Sum of positive electrode interfacial current densities\n", - "\t- Sum of x-averaged positive electrode interfacial current densities\n", - "\t- Sum of negative electrode electrolyte reaction source terms\n", - "\t- Sum of x-averaged negative electrode electrolyte reaction source terms\n", - "\t- Sum of negative electrode interfacial current densities\n", - "\t- Sum of x-averaged negative electrode interfacial current densities\n", - "\t- r_p\n", - "\t- r_p [m]\n", - "\t- r_n\n", - "\t- r_n [m]\n", - "\t- Current density variable\n", - "\t- Total current density\n", - "\t- Total current density [A.m-2]\n", - "\t- Current [A]\n", - "\t- C-rate\n", - "\t- Discharge capacity [A.h]\n", - "\t- Porosity\n", - "\t- Separator porosity\n", - "\t- Positive electrode porosity\n", - "\t- X-averaged separator porosity\n", - "\t- X-averaged positive electrode porosity\n", - "\t- Negative electrode porosity\n", - "\t- X-averaged negative electrode porosity\n", - "\t- Leading-order porosity\n", - "\t- Leading-order separator porosity\n", - "\t- Leading-order positive electrode porosity\n", - "\t- Leading-order x-averaged separator porosity\n", - "\t- Leading-order x-averaged positive electrode porosity\n", - "\t- Leading-order negative electrode porosity\n", - "\t- Leading-order x-averaged negative electrode porosity\n", - "\t- Porosity change\n", - "\t- Separator porosity change\n", - "\t- Positive electrode porosity change\n", - "\t- X-averaged separator porosity change\n", - "\t- X-averaged positive electrode porosity change\n", - "\t- Negative electrode porosity change\n", - "\t- X-averaged negative electrode porosity change\n", - "\t- Leading-order x-averaged separator porosity change\n", - "\t- Leading-order x-averaged positive electrode porosity change\n", - "\t- Leading-order x-averaged negative electrode porosity change\n", - "\t- Negative electrode interface utilisation variable\n", - "\t- X-averaged negative electrode interface utilisation variable\n", - "\t- Negative electrode interface utilisation\n", - "\t- X-averaged negative electrode interface utilisation\n", - "\t- Positive electrode interface utilisation variable\n", - "\t- X-averaged positive electrode interface utilisation variable\n", - "\t- Positive electrode interface utilisation\n", - "\t- X-averaged positive electrode interface utilisation\n", - "\t- Negative electrode active material volume fraction\n", - "\t- X-averaged negative electrode active material volume fraction\n", - "\t- Negative electrode capacity [A.h]\n", - "\t- Negative particle radius\n", - "\t- Negative particle radius [m]\n", - "\t- Negative electrode surface area to volume ratio\n", - "\t- Negative electrode surface area to volume ratio [m-1]\n", - "\t- X-averaged negative electrode surface area to volume ratio\n", - "\t- X-averaged negative electrode surface area to volume ratio [m-1]\n", - "\t- Negative electrode active material volume fraction change\n", - "\t- X-averaged negative electrode active material volume fraction change\n", - "\t- Positive electrode active material volume fraction\n", - "\t- X-averaged positive electrode active material volume fraction\n", - "\t- Positive electrode capacity [A.h]\n", - "\t- Positive particle radius\n", - "\t- Positive particle radius [m]\n", - "\t- Positive electrode surface area to volume ratio\n", - "\t- Positive electrode surface area to volume ratio [m-1]\n", - "\t- X-averaged positive electrode surface area to volume ratio\n", - "\t- X-averaged positive electrode surface area to volume ratio [m-1]\n", - "\t- Positive electrode active material volume fraction change\n", - "\t- X-averaged positive electrode active material volume fraction change\n", - "\t- Positive electrode volume-averaged velocity\n", - "\t- Positive electrode volume-averaged velocity [m.s-1]\n", - "\t- Negative electrode volume-averaged velocity\n", - "\t- Negative electrode volume-averaged velocity [m.s-1]\n", - "\t- Positive electrode volume-averaged acceleration\n", - "\t- Positive electrode volume-averaged acceleration [m.s-1]\n", - "\t- X-averaged positive electrode volume-averaged acceleration\n", - "\t- X-averaged positive electrode volume-averaged acceleration [m.s-1]\n", - "\t- Negative electrode volume-averaged acceleration\n", - "\t- Negative electrode volume-averaged acceleration [m.s-1]\n", - "\t- X-averaged negative electrode volume-averaged acceleration\n", - "\t- X-averaged negative electrode volume-averaged acceleration [m.s-1]\n", - "\t- Positive electrode pressure\n", - "\t- X-averaged positive electrode pressure\n", - "\t- Negative electrode pressure\n", - "\t- X-averaged negative electrode pressure\n", - "\t- Separator pressure\n", - "\t- X-averaged separator pressure\n", - "\t- Separator transverse volume-averaged velocity\n", - "\t- Positive electrode transverse volume-averaged velocity\n", - "\t- Separator transverse volume-averaged velocity [m.s-2]\n", - "\t- Positive electrode transverse volume-averaged velocity [m.s-2]\n", - "\t- X-averaged separator transverse volume-averaged velocity\n", - "\t- X-averaged positive electrode transverse volume-averaged velocity\n", - "\t- X-averaged separator transverse volume-averaged velocity [m.s-2]\n", - "\t- X-averaged positive electrode transverse volume-averaged velocity [m.s-2]\n", - "\t- Transverse volume-averaged velocity\n", - "\t- Transverse volume-averaged velocity [m.s-2]\n", - "\t- Negative electrode transverse volume-averaged velocity\n", - "\t- Negative electrode transverse volume-averaged velocity [m.s-2]\n", - "\t- X-averaged negative electrode transverse volume-averaged velocity\n", - "\t- X-averaged negative electrode transverse volume-averaged velocity [m.s-2]\n", - "\t- Separator transverse volume-averaged acceleration\n", - "\t- Positive electrode transverse volume-averaged acceleration\n", - "\t- Separator transverse volume-averaged acceleration [m.s-2]\n", - "\t- Positive electrode transverse volume-averaged acceleration [m.s-2]\n", - "\t- X-averaged separator transverse volume-averaged acceleration\n", - "\t- X-averaged positive electrode transverse volume-averaged acceleration\n", - "\t- X-averaged separator transverse volume-averaged acceleration [m.s-2]\n", - "\t- X-averaged positive electrode transverse volume-averaged acceleration [m.s-2]\n", - "\t- Transverse volume-averaged acceleration\n", - "\t- Transverse volume-averaged acceleration [m.s-2]\n", - "\t- Negative electrode transverse volume-averaged acceleration\n", - "\t- Negative electrode transverse volume-averaged acceleration [m.s-2]\n", - "\t- X-averaged negative electrode transverse volume-averaged acceleration\n", - "\t- X-averaged negative electrode transverse volume-averaged acceleration [m.s-2]\n", - "\t- Negative particle concentration\n", - "\t- Negative particle concentration [mol.m-3]\n", - "\t- X-averaged negative particle concentration\n", - "\t- X-averaged negative particle concentration [mol.m-3]\n", - "\t- R-averaged negative particle concentration\n", - "\t- R-averaged negative particle concentration [mol.m-3]\n", - "\t- Average negative particle concentration\n", - "\t- Average negative particle concentration [mol.m-3]\n", - "\t- Negative particle surface concentration\n", - "\t- Negative particle surface concentration [mol.m-3]\n", - "\t- X-averaged negative particle surface concentration\n", - "\t- X-averaged negative particle surface concentration [mol.m-3]\n", - "\t- Negative electrode extent of lithiation\n", - "\t- X-averaged negative electrode extent of lithiation\n", - "\t- Minimum negative particle concentration\n", - "\t- Maximum negative particle concentration\n", - "\t- Minimum negative particle concentration [mol.m-3]\n", - "\t- Maximum negative particle concentration [mol.m-3]\n", - "\t- Minimum negative particle surface concentration\n", - "\t- Maximum negative particle surface concentration\n", - "\t- Minimum negative particle surface concentration [mol.m-3]\n", - "\t- Maximum negative particle surface concentration [mol.m-3]\n", - "\t- Positive particle concentration\n", - "\t- Positive particle concentration [mol.m-3]\n", - "\t- X-averaged positive particle concentration\n", - "\t- X-averaged positive particle concentration [mol.m-3]\n", - "\t- R-averaged positive particle concentration\n", - "\t- R-averaged positive particle concentration [mol.m-3]\n", - "\t- Average positive particle concentration\n", - "\t- Average positive particle concentration [mol.m-3]\n", - "\t- Positive particle surface concentration\n", - "\t- Positive particle surface concentration [mol.m-3]\n", - "\t- X-averaged positive particle surface concentration\n", - "\t- X-averaged positive particle surface concentration [mol.m-3]\n", - "\t- Positive electrode extent of lithiation\n", - "\t- X-averaged positive electrode extent of lithiation\n", - "\t- Minimum positive particle concentration\n", - "\t- Maximum positive particle concentration\n", - "\t- Minimum positive particle concentration [mol.m-3]\n", - "\t- Maximum positive particle concentration [mol.m-3]\n", - "\t- Minimum positive particle surface concentration\n", - "\t- Maximum positive particle surface concentration\n", - "\t- Minimum positive particle surface concentration [mol.m-3]\n", - "\t- Maximum positive particle surface concentration [mol.m-3]\n", - "\t- Electrolyte concentration\n", - "\t- Electrolyte concentration [mol.m-3]\n", - "\t- Electrolyte concentration [Molar]\n", - "\t- X-averaged electrolyte concentration\n", - "\t- X-averaged electrolyte concentration [mol.m-3]\n", - "\t- X-averaged electrolyte concentration [Molar]\n", - "\t- Negative electrolyte concentration\n", - "\t- Negative electrolyte concentration [mol.m-3]\n", - "\t- Negative electrolyte concentration [Molar]\n", - "\t- Separator electrolyte concentration\n", - "\t- Separator electrolyte concentration [mol.m-3]\n", - "\t- Separator electrolyte concentration [Molar]\n", - "\t- Positive electrolyte concentration\n", - "\t- Positive electrolyte concentration [mol.m-3]\n", - "\t- Positive electrolyte concentration [Molar]\n", - "\t- X-averaged negative electrolyte concentration\n", - "\t- X-averaged negative electrolyte concentration [mol.m-3]\n", - "\t- X-averaged separator electrolyte concentration\n", - "\t- X-averaged separator electrolyte concentration [mol.m-3]\n", - "\t- X-averaged positive electrolyte concentration\n", - "\t- X-averaged positive electrolyte concentration [mol.m-3]\n", - "\t- Electrolyte flux\n", - "\t- Electrolyte flux [mol.m-2.s-1]\n", - "\t- Negative current collector temperature\n", - "\t- Negative current collector temperature [K]\n", - "\t- X-averaged negative electrode temperature\n", - "\t- X-averaged negative electrode temperature [K]\n", - "\t- Negative electrode temperature\n", - "\t- Negative electrode temperature [K]\n", - "\t- X-averaged separator temperature\n", - "\t- X-averaged separator temperature [K]\n", - "\t- Separator temperature\n", - "\t- Separator temperature [K]\n", - "\t- X-averaged positive electrode temperature\n", - "\t- X-averaged positive electrode temperature [K]\n", - "\t- Positive electrode temperature\n", - "\t- Positive electrode temperature [K]\n", - "\t- Positive current collector temperature\n", - "\t- Positive current collector temperature [K]\n", - "\t- Cell temperature\n", - "\t- Cell temperature [K]\n", - "\t- X-averaged cell temperature\n", - "\t- X-averaged cell temperature [K]\n", - "\t- Volume-averaged cell temperature\n", - "\t- Volume-averaged cell temperature [K]\n", - "\t- Ambient temperature [K]\n", - "\t- Ambient temperature\n", - "\t- Negative current collector potential\n", - "\t- Negative current collector potential [V]\n", - "\t- Inner SEI thickness\n", - "\t- Inner SEI thickness [m]\n", - "\t- Outer SEI thickness\n", - "\t- Outer SEI thickness [m]\n", - "\t- X-averaged inner SEI thickness\n", - "\t- X-averaged inner SEI thickness [m]\n", - "\t- X-averaged outer SEI thickness\n", - "\t- X-averaged outer SEI thickness [m]\n", - "\t- SEI thickness\n", - "\t- SEI thickness [m]\n", - "\t- Total SEI thickness\n", - "\t- Total SEI thickness [m]\n", - "\t- X-averaged SEI thickness\n", - "\t- X-averaged SEI thickness [m]\n", - "\t- X-averaged total SEI thickness\n", - "\t- X-averaged total SEI thickness [m]\n", - "\t- X-averaged negative electrode resistance [Ohm.m2]\n", - "\t- Inner SEI concentration [mol.m-3]\n", - "\t- X-averaged inner SEI concentration [mol.m-3]\n", - "\t- Outer SEI concentration [mol.m-3]\n", - "\t- X-averaged outer SEI concentration [mol.m-3]\n", - "\t- SEI concentration [mol.m-3]\n", - "\t- X-averaged SEI concentration [mol.m-3]\n", - "\t- Loss of lithium to SEI [mol]\n", - "\t- Loss of capacity to SEI [A.h]\n", - "\t- Inner SEI interfacial current density\n", - "\t- Inner SEI interfacial current density [A.m-2]\n", - "\t- X-averaged inner SEI interfacial current density\n", - "\t- X-averaged inner SEI interfacial current density [A.m-2]\n", - "\t- Outer SEI interfacial current density\n", - "\t- Outer SEI interfacial current density [A.m-2]\n", - "\t- X-averaged outer SEI interfacial current density\n", - "\t- X-averaged outer SEI interfacial current density [A.m-2]\n", - "\t- SEI interfacial current density\n", - "\t- SEI interfacial current density [A.m-2]\n", - "\t- X-averaged SEI interfacial current density\n", - "\t- X-averaged SEI interfacial current density [A.m-2]\n", - "\t- Lithium plating concentration\n", - "\t- Lithium plating concentration [mol.m-3]\n", - "\t- X-averaged lithium plating concentration\n", - "\t- X-averaged lithium plating concentration [mol.m-3]\n", - "\t- Lithium plating thickness\n", - "\t- Lithium plating thickness [m]\n", - "\t- X-averaged lithium plating thickness [m]\n", - "\t- Loss of lithium to lithium plating [mol]\n", - "\t- Loss of capacity to lithium plating [A.h]\n", - "\t- Negative electrode lithium plating reaction overpotential\n", - "\t- X-averaged negative electrode lithium plating reaction overpotential\n", - "\t- Negative electrode lithium plating reaction overpotential [V]\n", - "\t- X-averaged negative electrode lithium plating reaction overpotential [V]\n", - "\t- Lithium plating interfacial current density\n", - "\t- Lithium plating interfacial current density [A.m-2]\n", - "\t- X-averaged lithium plating interfacial current density\n", - "\t- X-averaged lithium plating interfacial current density [A.m-2]\n", - "\t- Electrolyte transport efficiency\n", - "\t- Positive electrolyte transport efficiency\n", - "\t- X-averaged positive electrolyte transport efficiency\n", - "\t- Negative electrolyte transport efficiency\n", - "\t- X-averaged negative electrolyte transport efficiency\n", - "\t- Separator transport efficiency\n", - "\t- X-averaged separator transport efficiency\n", - "\t- Electrode transport efficiency\n", - "\t- Positive electrode transport efficiency\n", - "\t- X-averaged positive electrode transport efficiency\n", - "\t- Negative electrode transport efficiency\n", - "\t- X-averaged negative electrode transport efficiency\n", - "\t- Separator volume-averaged velocity\n", - "\t- Separator volume-averaged velocity [m.s-1]\n", - "\t- Separator volume-averaged acceleration\n", - "\t- Separator volume-averaged acceleration [m.s-1]\n", - "\t- X-averaged separator volume-averaged acceleration\n", - "\t- X-averaged separator volume-averaged acceleration [m.s-1]\n", - "\t- Volume-averaged velocity\n", - "\t- Volume-averaged velocity [m.s-1]\n", - "\t- Volume-averaged acceleration\n", - "\t- X-averaged volume-averaged acceleration\n", - "\t- Volume-averaged acceleration [m.s-1]\n", - "\t- X-averaged volume-averaged acceleration [m.s-1]\n", - "\t- Pressure\n", - "\t- Negative particle flux\n", - "\t- X-averaged negative particle flux\n", - "\t- Negative effective diffusivity\n", - "\t- Negative effective diffusivity [m2.s-1]\n", - "\t- X-averaged negative effective diffusivity\n", - "\t- X-averaged negative effective diffusivity [m2.s-1]\n", - "\t- Negative electrode SOC\n", - "\t- Negative electrode volume-averaged concentration\n", - "\t- Negative electrode volume-averaged concentration [mol.m-3]\n", - "\t- Total lithium in negative electrode [mol]\n", - "\t- Positive particle flux\n", - "\t- X-averaged positive particle flux\n", - "\t- Positive effective diffusivity\n", - "\t- Positive effective diffusivity [m2.s-1]\n", - "\t- X-averaged positive effective diffusivity\n", - "\t- X-averaged positive effective diffusivity [m2.s-1]\n", - "\t- Positive electrode SOC\n", - "\t- Positive electrode volume-averaged concentration\n", - "\t- Positive electrode volume-averaged concentration [mol.m-3]\n", - "\t- Total lithium in positive electrode [mol]\n", - "\t- Porosity times concentration\n", - "\t- Separator porosity times concentration\n", - "\t- Positive electrode porosity times concentration\n", - "\t- Negative electrode porosity times concentration\n", - "\t- Total lithium in electrolyte\n", - "\t- Total lithium in electrolyte [mol]\n", - "\t- Ohmic heating\n", - "\t- Ohmic heating [W.m-3]\n", - "\t- X-averaged Ohmic heating\n", - "\t- X-averaged Ohmic heating [W.m-3]\n", - "\t- Volume-averaged Ohmic heating\n", - "\t- Volume-averaged Ohmic heating [W.m-3]\n", - "\t- Irreversible electrochemical heating\n", - "\t- Irreversible electrochemical heating [W.m-3]\n", - "\t- X-averaged irreversible electrochemical heating\n", - "\t- X-averaged irreversible electrochemical heating [W.m-3]\n", - "\t- Volume-averaged irreversible electrochemical heating\n", - "\t- Volume-averaged irreversible electrochemical heating[W.m-3]\n", - "\t- Reversible heating\n", - "\t- Reversible heating [W.m-3]\n", - "\t- X-averaged reversible heating\n", - "\t- X-averaged reversible heating [W.m-3]\n", - "\t- Volume-averaged reversible heating\n", - "\t- Volume-averaged reversible heating [W.m-3]\n", - "\t- Total heating\n", - "\t- Total heating [W.m-3]\n", - "\t- X-averaged total heating\n", - "\t- X-averaged total heating [W.m-3]\n", - "\t- Volume-averaged total heating\n", - "\t- Volume-averaged total heating [W.m-3]\n", - "\t- Current collector current density\n", - "\t- Current collector current density [A.m-2]\n", - "\t- Leading-order current collector current density\n", - "\t- X-averaged negative electrode SEI interfacial current density\n", - "\t- Negative electrode SEI interfacial current density\n", - "\t- X-averaged positive electrode SEI interfacial current density\n", - "\t- Positive electrode SEI interfacial current density\n", - "\t- X-averaged negative electrode lithium plating interfacial current density\n", - "\t- X-averaged positive electrode lithium plating interfacial current density\n", - "\t- Negative electrode lithium plating interfacial current density\n", - "\t- Positive electrode lithium plating interfacial current density\n", - "\t- X-averaged negative electrode total interfacial current density\n", - "\t- X-averaged negative electrode total interfacial current density [A.m-2]\n", - "\t- X-averaged negative electrode total interfacial current density per volume [A.m-3]\n", - "\t- SEI film overpotential\n", - "\t- X-averaged SEI film overpotential\n", - "\t- SEI film overpotential [V]\n", - "\t- X-averaged SEI film overpotential [V]\n", - "\t- Negative electrode exchange current density\n", - "\t- X-averaged negative electrode exchange current density\n", - "\t- Negative electrode exchange current density [A.m-2]\n", - "\t- X-averaged negative electrode exchange current density [A.m-2]\n", - "\t- Negative electrode exchange current density per volume [A.m-3]\n", - "\t- X-averaged negative electrode exchange current density per volume [A.m-3]\n", - "\t- Negative electrode reaction overpotential\n", - "\t- X-averaged negative electrode reaction overpotential\n", - "\t- Negative electrode reaction overpotential [V]\n", - "\t- X-averaged negative electrode reaction overpotential [V]\n", - "\t- X-averaged negative electrode surface potential difference\n", - "\t- X-averaged negative electrode surface potential difference [V]\n", - "\t- Negative electrode open-circuit potential\n", - "\t- Negative electrode open-circuit potential [V]\n", - "\t- X-averaged negative electrode open-circuit potential\n", - "\t- X-averaged negative electrode open-circuit potential [V]\n", - "\t- Negative electrode entropic change\n", - "\t- Negative electrode entropic change [V.K-1]\n", - "\t- X-averaged negative electrode entropic change\n", - "\t- X-averaged negative electrode entropic change [V.K-1]\n", - "\t- X-averaged positive electrode total interfacial current density\n", - "\t- X-averaged positive electrode total interfacial current density [A.m-2]\n", - "\t- X-averaged positive electrode total interfacial current density per volume [A.m-3]\n", - "\t- Positive electrode exchange current density\n", - "\t- X-averaged positive electrode exchange current density\n", - "\t- Positive electrode exchange current density [A.m-2]\n", - "\t- X-averaged positive electrode exchange current density [A.m-2]\n", - "\t- Positive electrode exchange current density per volume [A.m-3]\n", - "\t- X-averaged positive electrode exchange current density per volume [A.m-3]\n", - "\t- Positive electrode reaction overpotential\n", - "\t- X-averaged positive electrode reaction overpotential\n", - "\t- Positive electrode reaction overpotential [V]\n", - "\t- X-averaged positive electrode reaction overpotential [V]\n", - "\t- X-averaged positive electrode surface potential difference\n", - "\t- X-averaged positive electrode surface potential difference [V]\n", - "\t- Positive electrode open-circuit potential\n", - "\t- Positive electrode open-circuit potential [V]\n", - "\t- X-averaged positive electrode open-circuit potential\n", - "\t- X-averaged positive electrode open-circuit potential [V]\n", - "\t- Positive electrode entropic change\n", - "\t- Positive electrode entropic change [V.K-1]\n", - "\t- X-averaged positive electrode entropic change\n", - "\t- X-averaged positive electrode entropic change [V.K-1]\n", - "\t- Negative electrode interfacial current density\n", - "\t- X-averaged negative electrode interfacial current density\n", - "\t- Negative electrode interfacial current density [A.m-2]\n", - "\t- X-averaged negative electrode interfacial current density [A.m-2]\n", - "\t- Negative electrode interfacial current density per volume [A.m-3]\n", - "\t- X-averaged negative electrode interfacial current density per volume [A.m-3]\n", - "\t- Positive electrode interfacial current density\n", - "\t- X-averaged positive electrode interfacial current density\n", - "\t- Positive electrode interfacial current density [A.m-2]\n", - "\t- X-averaged positive electrode interfacial current density [A.m-2]\n", - "\t- Positive electrode interfacial current density per volume [A.m-3]\n", - "\t- X-averaged positive electrode interfacial current density per volume [A.m-3]\n", - "\t- Interfacial current density\n", - "\t- Interfacial current density [A.m-2]\n", - "\t- Interfacial current density per volume [A.m-3]\n", - "\t- Exchange current density\n", - "\t- Exchange current density [A.m-2]\n", - "\t- Exchange current density per volume [A.m-3]\n", - "\t- Negative electrode potential\n", - "\t- Negative electrode potential [V]\n", - "\t- X-averaged negative electrode potential\n", - "\t- X-averaged negative electrode potential [V]\n", - "\t- Negative electrode ohmic losses\n", - "\t- Negative electrode ohmic losses [V]\n", - "\t- X-averaged negative electrode ohmic losses\n", - "\t- X-averaged negative electrode ohmic losses [V]\n", - "\t- Gradient of negative electrode potential\n", - "\t- Negative electrode current density\n", - "\t- Negative electrode current density [A.m-2]\n", - "\t- Negative electrolyte potential\n", - "\t- Negative electrolyte potential [V]\n", - "\t- Separator electrolyte potential\n", - "\t- Separator electrolyte potential [V]\n", - "\t- Positive electrolyte potential\n", - "\t- Positive electrolyte potential [V]\n", - "\t- Electrolyte potential\n", - "\t- Electrolyte potential [V]\n", - "\t- X-averaged electrolyte potential\n", - "\t- X-averaged electrolyte potential [V]\n", - "\t- X-averaged negative electrolyte potential\n", - "\t- X-averaged negative electrolyte potential [V]\n", - "\t- X-averaged separator electrolyte potential\n", - "\t- X-averaged separator electrolyte potential [V]\n", - "\t- X-averaged positive electrolyte potential\n", - "\t- X-averaged positive electrolyte potential [V]\n", - "\t- X-averaged electrolyte overpotential\n", - "\t- X-averaged electrolyte overpotential [V]\n", - "\t- Gradient of separator electrolyte potential\n", - "\t- Gradient of positive electrolyte potential\n", - "\t- Gradient of electrolyte potential\n", - "\t- Gradient of negative electrolyte potential\n", - "\t- Electrolyte current density\n", - "\t- Electrolyte current density [A.m-2]\n", - "\t- Negative electrolyte current density\n", - "\t- Negative electrolyte current density [A.m-2]\n", - "\t- Positive electrolyte current density\n", - "\t- Positive electrolyte current density [A.m-2]\n", - "\t- X-averaged concentration overpotential\n", - "\t- X-averaged electrolyte ohmic losses\n", - "\t- X-averaged concentration overpotential [V]\n", - "\t- X-averaged electrolyte ohmic losses [V]\n", - "\t- Negative electrode surface potential difference\n", - "\t- Negative electrode surface potential difference [V]\n", - "\t- Negative electrode oxygen interfacial current density\n", - "\t- X-averaged negative electrode oxygen interfacial current density\n", - "\t- Negative electrode oxygen interfacial current density [A.m-2]\n", - "\t- X-averaged negative electrode oxygen interfacial current density [A.m-2]\n", - "\t- Negative electrode oxygen interfacial current density per volume [A.m-3]\n", - "\t- X-averaged negative electrode oxygen interfacial current density per volume [A.m-3]\n", - "\t- Negative electrode oxygen exchange current density\n", - "\t- X-averaged negative electrode oxygen exchange current density\n", - "\t- Negative electrode oxygen exchange current density [A.m-2]\n", - "\t- X-averaged negative electrode oxygen exchange current density [A.m-2]\n", - "\t- Negative electrode oxygen exchange current density per volume [A.m-3]\n", - "\t- X-averaged negative electrode oxygen exchange current density per volume [A.m-3]\n", - "\t- Negative electrode oxygen reaction overpotential\n", - "\t- X-averaged negative electrode oxygen reaction overpotential\n", - "\t- Negative electrode oxygen reaction overpotential [V]\n", - "\t- X-averaged negative electrode oxygen reaction overpotential [V]\n", - "\t- Negative electrode oxygen open-circuit potential\n", - "\t- Negative electrode oxygen open-circuit potential [V]\n", - "\t- X-averaged negative electrode oxygen open-circuit potential\n", - "\t- X-averaged negative electrode oxygen open-circuit potential [V]\n", - "\t- Positive electrode potential\n", - "\t- Positive electrode potential [V]\n", - "\t- X-averaged positive electrode potential\n", - "\t- X-averaged positive electrode potential [V]\n", - "\t- Positive electrode ohmic losses\n", - "\t- Positive electrode ohmic losses [V]\n", - "\t- X-averaged positive electrode ohmic losses\n", - "\t- X-averaged positive electrode ohmic losses [V]\n", - "\t- Gradient of positive electrode potential\n", - "\t- Positive electrode current density\n", - "\t- Positive electrode current density [A.m-2]\n", - "\t- Electrode current density\n", - "\t- Positive current collector potential\n", - "\t- Positive current collector potential [V]\n", - "\t- Local voltage\n", - "\t- Local voltage [V]\n", - "\t- Voltage\n", - "\t- Voltage [V]\n", - "\t- Positive electrode surface potential difference\n", - "\t- Positive electrode surface potential difference [V]\n", - "\t- Positive electrode oxygen interfacial current density\n", - "\t- X-averaged positive electrode oxygen interfacial current density\n", - "\t- Positive electrode oxygen interfacial current density [A.m-2]\n", - "\t- X-averaged positive electrode oxygen interfacial current density [A.m-2]\n", - "\t- Positive electrode oxygen interfacial current density per volume [A.m-3]\n", - "\t- X-averaged positive electrode oxygen interfacial current density per volume [A.m-3]\n", - "\t- Positive electrode oxygen exchange current density\n", - "\t- X-averaged positive electrode oxygen exchange current density\n", - "\t- Positive electrode oxygen exchange current density [A.m-2]\n", - "\t- X-averaged positive electrode oxygen exchange current density [A.m-2]\n", - "\t- Positive electrode oxygen exchange current density per volume [A.m-3]\n", - "\t- X-averaged positive electrode oxygen exchange current density per volume [A.m-3]\n", - "\t- Positive electrode oxygen reaction overpotential\n", - "\t- X-averaged positive electrode oxygen reaction overpotential\n", - "\t- Positive electrode oxygen reaction overpotential [V]\n", - "\t- X-averaged positive electrode oxygen reaction overpotential [V]\n", - "\t- Positive electrode oxygen open-circuit potential\n", - "\t- Positive electrode oxygen open-circuit potential [V]\n", - "\t- X-averaged positive electrode oxygen open-circuit potential\n", - "\t- X-averaged positive electrode oxygen open-circuit potential [V]\n", - "\t- Oxygen interfacial current density\n", - "\t- Oxygen interfacial current density [A.m-2]\n", - "\t- Oxygen interfacial current density per volume [A.m-3]\n", - "\t- Oxygen exchange current density\n", - "\t- Oxygen exchange current density [A.m-2]\n", - "\t- Oxygen exchange current density per volume [A.m-3]\n", - "\t- X-averaged open-circuit voltage\n", - "\t- Measured open-circuit voltage\n", - "\t- X-averaged open-circuit voltage [V]\n", - "\t- Measured open-circuit voltage [V]\n", - "\t- X-averaged reaction overpotential\n", - "\t- X-averaged reaction overpotential [V]\n", - "\t- X-averaged solid phase ohmic losses\n", - "\t- X-averaged solid phase ohmic losses [V]\n", - "\t- X-averaged battery open-circuit voltage [V]\n", - "\t- Measured battery open-circuit voltage [V]\n", - "\t- X-averaged battery reaction overpotential [V]\n", - "\t- X-averaged battery solid phase ohmic losses [V]\n", - "\t- X-averaged battery electrolyte ohmic losses [V]\n", - "\t- X-averaged battery concentration overpotential [V]\n", - "\t- Battery voltage [V]\n", - "\t- Change in measured open-circuit voltage\n", - "\t- Change in measured open-circuit voltage [V]\n", - "\t- Local ECM resistance\n", - "\t- Local ECM resistance [Ohm]\n", - "\t- Terminal power [W]\n", - "\t- Power [W]\n", - "\t- Resistance [Ohm]\n", - "\t- LAM_ne [%]\n", - "\t- LAM_pe [%]\n", - "\t- LLI [%]\n", - "\t- Loss of active material in negative electrode [%]\n", - "\t- Loss of active material in positive electrode [%]\n", - "\t- Loss of lithium inventory [%]\n", - "\t- Loss of lithium inventory, including electrolyte [%]\n", - "\t- Total lithium [mol]\n", - "\t- Total lithium in particles [mol]\n", - "\t- Total lithium lost [mol]\n", - "\t- Total lithium lost from particles [mol]\n", - "\t- Total lithium lost from electrolyte [mol]\n", - "\t- Total lithium lost to side reactions [mol]\n", - "\t- Total capacity lost to side reactions [A.h]\n" - ] - } - ], - "source": [ - "print('SPM model variables:')\n", - "for v in model.variables.keys():\n", - " print('\\t-',v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To help visualise the results, pybamm provides the `pybamm.ProcessedVariable` class, which takes the output of a solver and a variable, and allows the user to evaluate the value of that variable at any given time or $x$ value. These processed variables are automatically created by the solution dictionary." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "voltage = solution['Voltage [V]']\n", - "c_s_n_surf = solution['Negative particle surface concentration']\n", - "c_s_p_surf = solution['Positive particle surface concentration']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One we have these variables in hand, we can begin generating plots using a library such as Matplotlib. Below we plot the voltage and surface particle concentrations versus time" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "t = solution[\"Time [s]\"].entries\n", - "x = solution[\"x [m]\"].entries[:, 0]\n", - "f, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(13,4))\n", - "\n", - "ax1.plot(t, voltage(t))\n", - "ax1.set_xlabel(r'$Time [s]$')\n", - "ax1.set_ylabel('Voltage [V]')\n", - "\n", - "ax2.plot(t, c_s_n_surf(t=t, x=x[0])) # can evaluate at arbitrary x (single representative particle)\n", - "ax2.set_xlabel(r'$Time [s]$')\n", - "ax2.set_ylabel('Negative particle surface concentration')\n", - "\n", - "ax3.plot(t, c_s_p_surf(t=t, x=x[-1])) # can evaluate at arbitrary x (single representative particle)\n", - "ax3.set_xlabel(r'$Time [s]$')\n", - "ax3.set_ylabel('Positive particle surface concentration')\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the output variables are defined over space as well as time. Once option to visualise these variables is to use the `interact` slider widget. Below we plot the negative/positive particle concentration over $r$, using a slider to change the current time point" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "c_s_n = solution['Negative particle concentration']\n", - "c_s_p = solution['Positive particle concentration']\n", - "r_n = solution[\"r_n [m]\"].entries[:, 0]\n", - "r_p = solution[\"r_p [m]\"].entries[:, 0]" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d34f3a42f2d541689971f32415133547", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=3600.0, step=10.0), Output()), _dom_classes=…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "c_s_n = solution['Negative particle concentration']\n", - "c_s_p = solution['Positive particle concentration']\n", - "r_n = solution[\"r_n [m]\"].entries[:, 0, 0]\n", - "r_p = solution[\"r_p [m]\"].entries[:, 0, 0]\n", - "\n", - "def plot_concentrations(t):\n", - " f, (ax1, ax2) = plt.subplots(1, 2 ,figsize=(10,5))\n", - " plot_c_n, = ax1.plot(r_n, c_s_n(r=r_n,t=t,x=x[0])) # can evaluate at arbitrary x (single representative particle)\n", - " plot_c_p, = ax2.plot(r_p, c_s_p(r=r_p,t=t,x=x[-1])) # can evaluate at arbitrary x (single representative particle)\n", - " ax1.set_ylabel('Negative particle concentration')\n", - " ax2.set_ylabel('Positive particle concentration')\n", - " ax1.set_xlabel(r'$r_n$ [m]')\n", - " ax2.set_xlabel(r'$r_p$ [m]')\n", - " ax1.set_ylim(0, 1)\n", - " ax2.set_ylim(0, 1)\n", - " plt.show()\n", - " \n", - "import ipywidgets as widgets\n", - "widgets.interact(plot_concentrations, t=widgets.FloatSlider(min=0,max=3600,step=10,value=0));\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The QuickPlot class can be used to plot the common set of useful outputs which should give you a good initial overview of the model. The method `Quickplot.dynamic_plot` employs the slider widget. " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b0b7eae65c9a4a49b8d172ace163688f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "quick_plot = pybamm.QuickPlot(solution)\n", - "quick_plot.dynamic_plot();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[4] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pybamm", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - }, - "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": {}, - "toc_section_display": true, - "toc_window_display": true - }, - "vscode": { - "interpreter": { - "hash": "187972e187ab8dfbecfab9e8e194ae6d08262b2d51a54fa40644e3ddb6b5f74c" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/plotting/customize-quick-plot.ipynb b/examples/notebooks/plotting/customize-quick-plot.ipynb deleted file mode 100644 index de3db0fded..0000000000 --- a/examples/notebooks/plotting/customize-quick-plot.ipynb +++ /dev/null @@ -1,269 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "saved-crown", - "metadata": {}, - "source": [ - "# Customizing QuickPlot" - ] - }, - { - "cell_type": "markdown", - "id": "adjacent-internship", - "metadata": {}, - "source": [ - "This notebook shows how to customize PyBaMM's `QuickPlot`, using matplotlib's [style sheets and rcParams](https://matplotlib.org/stable/tutorials/introductory/customizing.html)" - ] - }, - { - "cell_type": "markdown", - "id": "rocky-function", - "metadata": {}, - "source": [ - "First we define and solve the models" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "spare-craft", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "\n", - "models = [pybamm.lithium_ion.SPM(), pybamm.lithium_ion.SPMe(), pybamm.lithium_ion.DFN()]\n", - "sims = []\n", - "for model in models:\n", - " sim = pybamm.Simulation(model)\n", - " sim.solve([0, 3600])\n", - " sims.append(sim)" - ] - }, - { - "cell_type": "markdown", - "id": "nutritional-scratch", - "metadata": {}, - "source": [ - "Call the default plots" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "healthy-fluid", - "metadata": {}, - "outputs": [], - "source": [ - "pybamm.dynamic_plot(sims);" - ] - }, - { - "cell_type": "markdown", - "id": "basic-mentor", - "metadata": {}, - "source": [ - "## Using style sheets" - ] - }, - { - "cell_type": "markdown", - "id": "mysterious-pantyhose", - "metadata": {}, - "source": [ - "The easiest way to customize style is to use one of matplotlib's available style sheets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "sunset-planet", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.style.available" - ] - }, - { - "cell_type": "markdown", - "id": "headed-royalty", - "metadata": {}, - "source": [ - "For example we can use the ggplot style from R. In this case, the title fonts are quite large, so we reduce the number of words in a title before a line break" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "behavioral-tyler", - "metadata": {}, - "outputs": [], - "source": [ - "plt.style.use(\"ggplot\")\n", - "pybamm.settings.max_words_in_line = 3\n", - "pybamm.dynamic_plot(sims);" - ] - }, - { - "cell_type": "markdown", - "id": "annoying-limitation", - "metadata": {}, - "source": [ - "Another good set of style sheets for scientific plots is available by pip installing the [SciencePlots](https://github.com/garrettj403/SciencePlots) package" - ] - }, - { - "cell_type": "markdown", - "id": "valuable-baptist", - "metadata": {}, - "source": [ - "## Further customization using rcParams" - ] - }, - { - "cell_type": "markdown", - "id": "atlantic-building", - "metadata": {}, - "source": [ - "Sometimes we want further customization of a style, without needing to edit the style sheets. For example, we can update the font sizes and plot again.\n", - "\n", - "To change the line colors, we use `cycler`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "excited-circuit", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib as mpl\n", - "from cycler import cycler\n", - "\n", - "mpl.rcParams[\"axes.labelsize\"] = 12\n", - "mpl.rcParams[\"axes.titlesize\"] = 12\n", - "mpl.rcParams[\"xtick.labelsize\"] = 12\n", - "mpl.rcParams[\"ytick.labelsize\"] = 12\n", - "mpl.rcParams[\"legend.fontsize\"] = 12\n", - "mpl.rcParams[\"axes.prop_cycle\"] = cycler('color', [\"k\", \"g\", \"c\"])\n", - "pybamm.dynamic_plot(sims);" - ] - }, - { - "cell_type": "markdown", - "id": "recreational-complexity", - "metadata": {}, - "source": [ - "## Very fine customization" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "german-possibility", - "metadata": {}, - "source": [ - "Some customization of the `QuickPlot` object is possible by passing arguments - see the [docs](https://pybamm.readthedocs.io/en/latest/source/api/plotting/quick_plot.html) for details\n", - "\n", - "We can also further control the plot by calling `plot.fig` after the figure has been created, and editing the matplotlib objects. For example, here we move the titles to the ylabel, and move the legend." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "specific-dictionary", - "metadata": {}, - "outputs": [], - "source": [ - "pybamm.settings.max_words_in_line = 4\n", - "\n", - "plot = pybamm.QuickPlot(sims, figsize=(14,7))\n", - "plot.plot(0.5); # time in hours\n", - "\n", - "# Move title to ylabel\n", - "for ax in plot.fig.axes:\n", - " title = ax.get_title()\n", - " ax.set_title(\"\")\n", - " ax.set_ylabel(title)\n", - " \n", - "# Remove old legend and add a new one in the bottom\n", - "leg = plot.fig.get_children()[-1]\n", - "leg.set_visible(False)\n", - "plot.fig.legend(plot.labels, loc=\"lower center\", ncol=len(plot.labels), fontsize=11)\n", - "\n", - "# Adjust layout\n", - "plot.gridspec.tight_layout(plot.fig, rect=[0, 0.04, 1, 1])" - ] - }, - { - "cell_type": "markdown", - "id": "approved-gibraltar", - "metadata": {}, - "source": [ - "The figure can then be saved using `plot.fig.savefig`" - ] - }, - { - "cell_type": "markdown", - "id": "needed-structure", - "metadata": {}, - "source": [ - "## References\n", - "\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "refined-space", - "metadata": {}, - "outputs": [], - "source": [ - "pybamm.print_citations()" - ] - } - ], - "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.9.13" - }, - "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": {}, - "toc_section_display": true, - "toc_window_display": true - }, - "vscode": { - "interpreter": { - "hash": "1a781583db2df3c2e87436f6d22cce842c2e50a5670da93a3bd820b97dc43011" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/scripts/create_model.py b/examples/scripts/create_model.py index a39e874631..25641f9273 100644 --- a/examples/scripts/create_model.py +++ b/examples/scripts/create_model.py @@ -1,5 +1,5 @@ # This script is intended to be a stripped back version of the -# 'examples/notebooks/create-model.ipnb' so for more details please see +# 'docs/source/examples/notebooks/create-model.ipnb' so for more details please see # that notebook import pybamm diff --git a/noxfile.py b/noxfile.py index dabcb52605..622b189ae8 100644 --- a/noxfile.py +++ b/noxfile.py @@ -78,7 +78,6 @@ def run_unit(session): @nox.session(name="examples", reuse_venv=True) def run_examples(session): session.install("-e", ".[all]") - session.install("-e", ".[examples]") session.run("python", "run-tests.py", "--examples") @@ -115,8 +114,14 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.install("-e", ".[all,docs]") - session.chdir("docs/") - session.run( - "sphinx-autobuild", "--open-browser", "-qT", ".", f"{envbindir}/../tmp/html" - ) + session.install("-e", ".[docs]") + with session.chdir("docs/"): + session.run( + "sphinx-autobuild", + "-j", + "auto", + "--open-browser", + "-qT", + ".", + f"{envbindir}/../tmp/html", + ) diff --git a/pybamm/expression_tree/broadcasts.py b/pybamm/expression_tree/broadcasts.py index 0d85a83e1c..7fb34a57b8 100644 --- a/pybamm/expression_tree/broadcasts.py +++ b/pybamm/expression_tree/broadcasts.py @@ -17,7 +17,7 @@ class Broadcast(pybamm.SpatialOperator): For an example of broadcasts in action, see `this example notebook - `_ + `_ Parameters ---------- diff --git a/run-tests.py b/run-tests.py index a564bf16fa..17f981f826 100755 --- a/run-tests.py +++ b/run-tests.py @@ -7,6 +7,7 @@ # import re import os +import shutil import pybamm import sys import argparse @@ -65,7 +66,17 @@ def run_doc_tests(): """ print("Checking if docs can be built.") p = subprocess.Popen( - ["sphinx-build", "-b", "doctest", "docs", "docs/build/html", "-W"] + [ + "sphinx-build", + "-j", + "auto", + "-b", + "doctest", + "docs", + "docs/build/html", + "-W", + "--keep-going", + ] ) try: ret = p.wait() @@ -80,24 +91,36 @@ def run_doc_tests(): if ret != 0: print("FAILED") sys.exit(ret) + # delete the entire docs/source/build folder + files since it currently + # causes problems with nbsphinx in further docs or doctest builds + print("Deleting built files.") + shutil.rmtree("docs/build") def run_notebook_and_scripts(executable="python"): """ - Runs Jupyter notebook tests. Exits if they fail. + Runs Jupyter notebook and example scripts tests. Exits if they fail. """ # Scan and run print("Testing notebooks and scripts with executable `" + str(executable) + "`") - if not scan_for_nb_and_scripts("examples", True, executable): + + # Test notebooks in docs/source/examples + if not scan_for_notebooks("docs/source/examples", True, executable): print("\nErrors encountered in notebooks") sys.exit(1) + + # Test scripts in examples + # TODO: add scripts to docs/source/examples + if not scan_for_scripts("examples", True, executable): + print("\nErrors encountered in scripts") + sys.exit(1) print("\nOK") -def scan_for_nb_and_scripts(root, recursive=True, executable="python"): +def scan_for_notebooks(root, recursive=True, executable="python"): """ - Scans for, and tests, all notebooks and scripts in a directory. + Scans for, and tests, all notebooks in a directory. """ ok = True debug = False @@ -111,7 +134,7 @@ def scan_for_nb_and_scripts(root, recursive=True, executable="python"): # Ignore hidden directories if filename[:1] == ".": continue - ok &= scan_for_nb_and_scripts(path, recursive, executable) + ok &= scan_for_notebooks(path, recursive, executable) # Test notebooks if os.path.splitext(path)[1] == ".ipynb": @@ -119,6 +142,29 @@ def scan_for_nb_and_scripts(root, recursive=True, executable="python"): print(path) else: ok &= test_notebook(path, executable) + + # Return True if every notebook is ok + return ok + + +def scan_for_scripts(root, recursive=True, executable="python"): + """ + Scans for, and tests, all scripts in a directory. + """ + ok = True + debug = False + + # Scan path + for filename in os.listdir(root): + path = os.path.join(root, filename) + + # Recurse into subdirectories + if recursive and os.path.isdir(path): + # Ignore hidden directories + if filename[:1] == ".": + continue + ok &= scan_for_scripts(path, recursive, executable) + # Test scripts elif os.path.splitext(path)[1] == ".py": if debug: @@ -126,13 +172,13 @@ def scan_for_nb_and_scripts(root, recursive=True, executable="python"): else: ok &= test_script(path, executable) - # Return True if every notebook is ok + # Return True if every script is ok return ok def test_notebook(path, executable="python"): """ - Tests a single notebook, exists if it doesn't finish. + Tests a single notebook, exits if it doesn't finish. """ import nbconvert import pybamm @@ -220,7 +266,7 @@ def test_notebook(path, executable="python"): def test_script(path, executable="python"): """ - Tests a single notebook, exists if it doesn't finish. + Tests a single script, exits if it doesn't finish. """ import pybamm diff --git a/setup.py b/setup.py index 9e8825a237..f21f2ff51e 100644 --- a/setup.py +++ b/setup.py @@ -219,6 +219,10 @@ def compile_KLU(): "sphinx-inline-tabs", "sphinxcontrib-bibtex", "sphinx-autobuild", + "nbsphinx", + "ipykernel", + "ipywidgets", + "sphinx-gallery", ], # For doc generation "examples": [ "jupyter", # For example notebooks diff --git a/sphinx_extend_parent.py b/sphinx_extend_parent.py index a84ae537a2..25978fe804 100644 --- a/sphinx_extend_parent.py +++ b/sphinx_extend_parent.py @@ -25,3 +25,8 @@ def process_docstring(app, what, name, obj, options, lines): def setup(app): app.connect("autodoc-process-docstring", process_docstring) + return { + "version": "0.1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } From 3b75abeb2e9042076c64737bd40553d01a54f53f Mon Sep 17 00:00:00 2001 From: "arjxn.py" Date: Tue, 4 Jul 2023 20:29:31 +0530 Subject: [PATCH 28/30] Opening notebooks in `main` with `Open with Colab` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8cc7564a21..f41eaa56d9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Scheduled](https://github.com/pybamm-team/PyBaMM/actions/workflows/run_periodic_tests.yml/badge.svg?branch=develop)](https://github.com/pybamm-team/PyBaMM/actions/workflows/run_periodic_tests.yml) [![readthedocs](https://readthedocs.org/projects/pybamm/badge/?version=latest)](https://pybamm.readthedocs.io/en/latest/?badge=latest) [![codecov](https://codecov.io/gh/pybamm-team/PyBaMM/branch/main/graph/badge.svg)](https://codecov.io/gh/pybamm-team/PyBaMM) -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/develop/) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pybamm-team/PyBaMM/blob/main/) [![DOI](https://zenodo.org/badge/DOI/10.5334/jors.309.svg)](https://doi.org/10.5334/jors.309) [![release](https://img.shields.io/github/v/release/pybamm-team/PyBaMM?color=yellow)](https://github.com/pybamm-team/PyBaMM/releases) [![black code style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) From 694322978be00be719371a3810e0549bbe470fe9 Mon Sep 17 00:00:00 2001 From: Arjun Date: Tue, 4 Jul 2023 20:48:23 +0530 Subject: [PATCH 29/30] Apply suggestions from code review Co-authored-by: Saransh Chopra --- CHANGELOG.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e000eb64c9..9610bba2a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,8 @@ # [Unreleased](https://github.com/pybamm-team/PyBaMM/) -## Bug fixes - -## Features - -## Optimizations - ## Breaking changes -- PyBaMM now has optional dependencies that can be installed with `pip install pybamm[option]` e.g. `pybamm[dev]` ([#3044](https://github.com/pybamm-team/PyBaMM/pull/3044)) +- PyBaMM now has optional dependencies that can be installed with the pattern `pip install pybamm[option]` e.g. `pybamm[plot]` ([#3044](https://github.com/pybamm-team/PyBaMM/pull/3044)) # [v23.5](https://github.com/pybamm-team/PyBaMM/tree/v23.5) - 2023-06-18 From 63524b4e424dd9bdea6921465735e12b805e50c1 Mon Sep 17 00:00:00 2001 From: Saransh Chopra Date: Wed, 5 Jul 2023 08:53:26 -0400 Subject: [PATCH 30/30] Formatting and minor fixes --- docs/source/user_guide/installation/index.rst | 80 +++++++++---------- noxfile.py | 2 +- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index a199342fc2..8d7f282e6b 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -66,7 +66,7 @@ Package Minimum support `SciPy `__ 2.8.2 `pandas `__ 0.24.0 `CasADi `__ 3.6.0 -`xarray `__ 2023.04.0 +`Xarray `__ 2023.04.0 ================================================================ ========================== .. _install.optional_dependencies: @@ -88,12 +88,12 @@ Plot dependencies Installable with ``pip install "pybamm[plot]"`` -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ================================================================== Dependency Minimum Version pip extra Notes -=========================================================== ================== ================== =================================================================================================================================================================================== -`imageio `__ 2.9.0 plot Handles diverse image data formats, including animated, volumetric, and scientific formats. -`Matplotlib `__ 2.0.0 plot To plot various battery models, and analyzing battery performance. -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ================================================================== +`imageio `__ 2.9.0 plot For generating simulation GIFs. +`matplotlib `__ 2.0.0 plot To plot various battery models, and analyzing battery performance. +=========================================================== ================== ================== ================================================================== .. _install.docs_dependencies: @@ -102,18 +102,18 @@ Docs dependencies Installable with ``pip install "pybamm[docs]"`` -================================================================================================= ================== ================== =================================================================================================================================================================================== +================================================================================================= ================== ================== ======================================================================= Dependency Minimum Version pip extra Notes -================================================================================================= ================== ================== =================================================================================================================================================================================== +================================================================================================= ================== ================== ======================================================================= `sphinx `__ 1.5.0 docs Sphinx makes it easy to create intelligent and beautiful documentation. -`pydata-sphinx-theme `__ \- docs A clean, Bootstrap-based Sphinx theme -`sphinx_design `__ \- docs A sphinx extension for designing -`sphinx-copybutton `__ \- docs To copy codeblocks -`myst-parser `__ \- docs For technical & scientific documentation. -`sphinx-inline-tabs `__ \- docs Add inline tabbed content to your Sphinx documentation. -`sphinxcontrib-bibtex `__ \- docs For BibTeX citations -`sphinx-autobuild `__ \- docs For re-building docs once triggered -================================================================================================= ================== ================== =================================================================================================================================================================================== +`pydata-sphinx-theme `__ \- docs A clean, Bootstrap-based Sphinx theme. +`sphinx_design `__ \- docs A sphinx extension for designing. +`sphinx-copybutton `__ \- docs To copy codeblocks. +`myst-parser `__ \- docs For technical & scientific documentation. +`sphinx-inline-tabs `__ \- docs Add inline tabbed content to your Sphinx documentation. +`sphinxcontrib-bibtex `__ \- docs For BibTeX citations. +`sphinx-autobuild `__ \- docs For re-building docs once triggered. +================================================================================================= ================== ================== ======================================================================= .. _install.examples_dependencies: @@ -122,11 +122,11 @@ Examples dependencies Installable with ``pip install "pybamm[examples]"`` -================================================================================ ================== ================== =================================================================================================================================================================================== +================================================================================ ================== ================== ================================ Dependency Minimum Version pip extra Notes -================================================================================ ================== ================== =================================================================================================================================================================================== -`jupyter `__ \- examples For example notebooks rendering. -================================================================================ ================== ================== =================================================================================================================================================================================== +================================================================================ ================== ================== ================================ +`jupyter `__ \- examples For example notebooks rendering. +================================================================================ ================== ================== ================================ .. _install.dev_dependencies: @@ -135,12 +135,12 @@ Dev dependencies Installable with ``pip install "pybamm[dev]"`` -================================================================================ ================== ================== =================================================================================================================================================================================== +================================================================================ ================== ================== ============================================================= Dependency Minimum Version pip extra Notes -================================================================================ ================== ================== =================================================================================================================================================================================== -`pre-commit `__ \- dev For managing and maintaining multi-language pre-commit hooks. -`black `__ \- dev For code formatting. -================================================================================ ================== ================== =================================================================================================================================================================================== +================================================================================ ================== ================== ============================================================= +`pre-commit `__ \- dev For managing and maintaining multi-language pre-commit hooks. +`black `__ \- dev For code formatting. +================================================================================ ================== ================== ============================================================= .. _install.cite_dependencies: @@ -149,11 +149,11 @@ Cite dependencies Installable with ``pip install "pybamm[cite]"`` -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================================= Dependency Minimum Version pip extra Notes -=========================================================== ================== ================== =================================================================================================================================================================================== -`pybtex `__ 0.24.0 cite BibTeX-compatible bibliography processor -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================================= +`pybtex `__ 0.24.0 cite BibTeX-compatible bibliography processor. +=========================================================== ================== ================== ========================================= .. _install.latexify_dependencies: @@ -162,11 +162,11 @@ Latexify dependencies Installable with ``pip install "pybamm[latexify]"`` -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================= Dependency Minimum Version pip extra Notes -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================= `sympy `__ 1.8.0 latexify For symbolic mathematics. -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================= .. _install.bpx_dependencies: @@ -175,11 +175,11 @@ bpx dependencies Installable with ``pip install "pybamm[bpx]"`` -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================== Dependency Minimum Version pip extra Notes -=========================================================== ================== ================== =================================================================================================================================================================================== -`bpx `__ \- bpx Battery Parameter eXchange -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ========================== +`bpx `__ \- bpx Battery Parameter eXchange +=========================================================== ================== ================== ========================== .. _install.tqdm_dependencies: @@ -188,11 +188,11 @@ tqdm dependencies Installable with ``pip install "pybamm[tqdm]"`` -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ================== Dependency Minimum Version pip extra Notes -=========================================================== ================== ================== =================================================================================================================================================================================== -`tqdm `__ \- tqdm For logging loops. -=========================================================== ================== ================== =================================================================================================================================================================================== +=========================================================== ================== ================== ================== +`tqdm `__ \- tqdm For logging loops. +=========================================================== ================== ================== ================== Full installation guide ----------------------- diff --git a/noxfile.py b/noxfile.py index 622b189ae8..dc537f2dbc 100644 --- a/noxfile.py +++ b/noxfile.py @@ -114,7 +114,7 @@ def run_tests(session): @nox.session(name="docs", reuse_venv=True) def build_docs(session): envbindir = session.bin - session.install("-e", ".[docs]") + session.install("-e", ".[all,docs]") with session.chdir("docs/"): session.run( "sphinx-autobuild",