From b6e1202ead80983fcc42251a69aeb6865d687f2d Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 10 Jan 2023 18:52:45 +0100 Subject: [PATCH 1/9] try switching to pydata theme --- docs/conf.py | 11 ++++---- docs/requirements.txt | 2 +- docs/source/parameters/parameter_sets.rst | 32 +++++++++++------------ setup.py | 2 +- tox.ini | 4 +-- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5566c50cc0..53842d3914 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,7 +15,7 @@ import os import sys import pybamm -import guzzle_sphinx_theme +import pydata_sphinx_theme sys.path.insert(0, os.path.abspath("../")) @@ -114,18 +114,17 @@ # # html_sidebars = {} -# Guzzle theme +# Theme -html_theme_path = guzzle_sphinx_theme.html_theme_path() -html_theme = "guzzle_sphinx_theme" +html_theme = "pydata_sphinx_theme" # Register the theme as an extension to generate a sitemap.xml -extensions.append("guzzle_sphinx_theme") +extensions.append("pydata_sphinx_theme") # Guzzle theme options (see theme.conf for more information) html_theme_options = { # Set the name of the project to appear in the sidebar - "project_nav_name": project + # "project_nav_name": project } diff --git a/docs/requirements.txt b/docs/requirements.txt index 0e38481d28..abc61a14d0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -16,5 +16,5 @@ sympy >= 1.8 # Should not be imported matplotlib >= 2.0 # -guzzle-sphinx-theme +pydata-sphinx-theme sphinx>4.0 diff --git a/docs/source/parameters/parameter_sets.rst b/docs/source/parameters/parameter_sets.rst index f3de4eac3a..0fa047f97d 100644 --- a/docs/source/parameters/parameter_sets.rst +++ b/docs/source/parameters/parameter_sets.rst @@ -83,20 +83,20 @@ PyBaMM provides pre-defined parameter sets for several common chemistries, listed below. See :ref:`adding-parameter-sets` for information on registering new parameter sets with PyBaMM. -Lead-acid Parameter Sets -========================== - -{% for k,v in parameter_sets.items() if v.chemistry == "lead_acid" %} -{{k}} ----------------------------- -{{ parameter_sets.get_docstring(k) | safe }} -{% endfor %} - -Lithium-ion Parameter Sets -========================== -{% for k,v in parameter_sets.items() if v.chemistry == "lithium_ion" %} -{{k}} ----------------------------- -{{ parameter_sets.get_docstring(k) }} -{% endfor %} +.. Lead-acid Parameter Sets +.. ======================== + +.. {% for k,v in parameter_sets.items() if v.chemistry == "lead_acid" %} +.. {{k}} +.. ---------------------------- +.. {{ parameter_sets.get_docstring(k) | safe }} +.. {% endfor %} + +.. Lithium-ion Parameter Sets +.. ========================== +.. {% for k,v in parameter_sets.items() if v.chemistry == "lithium_ion" %} +.. {{k}} +.. ---------------------------- +.. {{ parameter_sets.get_docstring(k) }} +.. {% endfor %} diff --git a/setup.py b/setup.py index f8257e478d..0284e9fc0b 100644 --- a/setup.py +++ b/setup.py @@ -208,7 +208,7 @@ def compile_KLU(): "matplotlib>=2.0", ], extras_require={ - "docs": ["sphinx>=1.5", "guzzle-sphinx-theme"], # For doc generation + "docs": ["sphinx>=1.5", "pydata-sphinx-theme"], # For doc generation "dev": [ "flake8>=3", # For code style checking "black", # For code style auto-formatting diff --git a/tox.ini b/tox.ini index 974efc5a14..0086bdd625 100644 --- a/tox.ini +++ b/tox.ini @@ -15,7 +15,7 @@ deps = dev: black dev: flake8 dev,doctests: sphinx>=1.5 - dev,doctests: guzzle-sphinx-theme + dev,doctests: pydata-sphinx-theme !windows-!mac: scikits.odes commands = @@ -64,7 +64,7 @@ usedevelop = false skip_install = false deps = sphinx>=1.5 - guzzle-sphinx-theme + pydata-sphinx-theme sphinx-autobuild changedir = docs commands = sphinx-autobuild --open-browser -qT . {envtmpdir}/html From 14abfe4b08bb8c920515d33cb65b6e911e8f8075 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 13 Jan 2023 17:20:50 +0100 Subject: [PATCH 2/9] reformatting docs --- README.md | 2 +- docs/conf.py | 89 ++++++---- docs/index.rst | 166 ++++++++++-------- docs/requirements.txt | 1 + docs/source/_static/index-images/api.svg | 31 ++++ .../_static/index-images/contributor.svg | 1 + docs/source/_static/index-images/examples.svg | 1 + .../_static/index-images/getting_started.svg | 31 ++++ docs/source/_static/pybamm.css | 143 +++++++++++++++ docs/source/_static/pybamm_logo.svg | 76 ++++++++ docs/source/{ => api}/batch_study.rst | 0 docs/source/{ => api}/callbacks.rst | 0 docs/source/{ => api}/citations.rst | 0 .../{ => api}/experiments/experiment.rst | 0 docs/source/{ => api}/experiments/index.rst | 0 .../{ => api}/expression_tree/array.rst | 0 .../expression_tree/binary_operator.rst | 0 .../{ => api}/expression_tree/broadcasts.rst | 0 .../expression_tree/concatenations.rst | 0 .../{ => api}/expression_tree/functions.rst | 0 .../expression_tree/independent_variable.rst | 0 .../{ => api}/expression_tree/index.rst | 0 .../expression_tree/input_parameter.rst | 0 .../{ => api}/expression_tree/interpolant.rst | 0 .../{ => api}/expression_tree/matrix.rst | 0 .../operations/convert_to_casadi.rst | 0 .../expression_tree/operations/evaluate.rst | 0 .../expression_tree/operations/index.rst | 0 .../expression_tree/operations/jacobian.rst | 0 .../operations/unpack_symbol.rst | 0 .../{ => api}/expression_tree/parameter.rst | 0 .../{ => api}/expression_tree/scalar.rst | 0 .../expression_tree/state_vector.rst | 0 .../{ => api}/expression_tree/symbol.rst | 0 .../expression_tree/unary_operator.rst | 0 .../{ => api}/expression_tree/variable.rst | 0 .../{ => api}/expression_tree/vector.rst | 0 .../{ => api}/geometry/battery_geometry.rst | 0 docs/source/{ => api}/geometry/geometry.rst | 0 docs/source/{ => api}/geometry/index.rst | 0 docs/source/api/index.rst | 32 ++++ docs/source/{ => api}/meshes/index.rst | 0 docs/source/{ => api}/meshes/meshes.rst | 0 .../meshes/one_dimensional_submeshes.rst | 0 .../meshes/two_dimensional_submeshes.rst | 0 .../meshes/zero_dimensional_submeshes.rst | 0 .../models/base_models/base_battery_model.rst | 0 .../models/base_models/base_model.rst | 0 .../{ => api}/models/base_models/event.rst | 0 .../{ => api}/models/base_models/index.rst | 0 .../models/equivalent_circuit/index.rst | 0 .../models/equivalent_circuit/thevenin.rst | 0 docs/source/{ => api}/models/index.rst | 0 .../models/lead_acid/base_lead_acid_model.rst | 0 .../{ => api}/models/lead_acid/full.rst | 0 .../{ => api}/models/lead_acid/index.rst | 0 .../{ => api}/models/lead_acid/loqs.rst | 0 .../lithium_ion/base_lithium_ion_model.rst | 0 .../{ => api}/models/lithium_ion/dfn.rst | 0 .../models/lithium_ion/electrode_soh.rst | 0 .../{ => api}/models/lithium_ion/index.rst | 0 .../{ => api}/models/lithium_ion/mpm.rst | 0 .../models/lithium_ion/newman_tobias.rst | 0 .../{ => api}/models/lithium_ion/spm.rst | 0 .../{ => api}/models/lithium_ion/spme.rst | 0 .../{ => api}/models/lithium_ion/yang2017.rst | 0 .../active_material/base_active_material.rst | 0 .../constant_active_material.rst | 0 .../submodels/active_material/index.rst | 0 .../active_material/loss_active_material.rst | 0 .../models/submodels/base_submodel.rst | 0 .../submodels/convection/base_convection.rst | 0 .../models/submodels/convection/index.rst | 0 .../base_through_cell_convection.rst | 0 .../through_cell/explicit_convection.rst | 0 .../through_cell/full_convection.rst | 0 .../convection/through_cell/index.rst | 0 .../convection/through_cell/no_convection.rst | 0 .../transverse/base_transverse_convection.rst | 0 .../convection/transverse/full_convection.rst | 0 .../submodels/convection/transverse/index.rst | 0 .../convection/transverse/no_convection.rst | 0 .../transverse/uniform_convection.rst | 0 .../base_current_collector.rst | 0 ...effective_resistance_current_collector.rst | 0 .../homogeneous_current_collector.rst | 0 .../submodels/current_collector/index.rst | 0 .../current_collector/potential_pair.rst | 0 .../submodels/electrode/base_electrode.rst | 0 .../models/submodels/electrode/index.rst | 0 .../submodels/electrode/ohm/base_ohm.rst | 0 .../submodels/electrode/ohm/composite_ohm.rst | 0 .../submodels/electrode/ohm/full_ohm.rst | 0 .../models/submodels/electrode/ohm/index.rst | 0 .../submodels/electrode/ohm/leading_ohm.rst | 0 .../electrode/ohm/li_metal_explicit.rst | 0 .../electrode/ohm/surface_form_ohm.rst | 0 .../base_electrolyte_conductivity.rst | 0 .../composite_conductivity.rst | 0 .../full_conductivity.rst | 0 .../electrolyte_conductivity/index.rst | 0 .../integrated_conductivity.rst | 0 .../leading_order_conductivity.rst | 0 .../explicit_surface_form_conductivity.rst | 0 .../full_surface_form_conductivity.rst | 0 .../surface_form/index.rst | 0 .../leading_surface_form_conductivity.rst | 0 .../base_electrolyte_diffusion.rst | 0 .../constant_concentration.rst | 0 .../electrolyte_diffusion/full_diffusion.rst | 0 .../submodels/electrolyte_diffusion/index.rst | 0 .../leading_order_diffusion.rst | 0 .../equivalent_circuit_elements/index.rst | 0 .../ocv_element.rst | 0 .../rc_element.rst | 0 .../resistor_element.rst | 0 .../equivalent_circuit_elements/thermal.rst | 0 .../voltage_model.rst | 0 .../explicit_control_external_circuit.rst | 0 .../function_control_external_circuit.rst | 0 .../submodels/external_circuit/index.rst | 0 .../{ => api}/models/submodels/index.rst | 0 .../submodels/interface/base_interface.rst | 0 .../submodels/interface/diffusion_limited.rst | 0 .../models/submodels/interface/index.rst | 0 .../interface/inverse_butler_volmer.rst | 0 .../models/submodels/interface/kinetics.rst | 0 .../interface/open_circuit_potential.rst | 0 .../models/submodels/interface/sei.rst | 0 .../base_oxygen_diffusion.rst | 0 .../full_oxygen_diffusion.rst | 0 .../submodels/oxygen_diffusion/index.rst | 0 .../leading_oxygen_diffusion.rst | 0 .../submodels/oxygen_diffusion/no_oxygen.rst | 0 .../submodels/particle/base_particle.rst | 0 .../submodels/particle/fickian_diffusion.rst | 0 .../models/submodels/particle/index.rst | 0 .../submodels/particle/polynomial_profile.rst | 0 .../x_averaged_polynomial_profile.rst | 0 .../particle_mechanics/base_mechanics.rst | 0 .../particle_mechanics/crack_propagation.rst | 0 .../submodels/particle_mechanics/index.rst | 0 .../particle_mechanics/swelling_only.rst | 0 .../submodels/porosity/base_porosity.rst | 0 .../submodels/porosity/constant_porosity.rst | 0 .../models/submodels/porosity/index.rst | 0 .../porosity/reaction_driven_porosity.rst | 0 .../porosity/reaction_driven_porosity_ode.rst | 0 .../models/submodels/thermal/base_thermal.rst | 0 .../models/submodels/thermal/index.rst | 0 .../models/submodels/thermal/isothermal.rst | 0 .../models/submodels/thermal/lumped.rst | 0 .../submodels/thermal/pouch_cell/index.rst | 0 .../pouch_cell_1D_current_collectors.rst | 0 .../pouch_cell_2D_current_collectors.rst | 0 .../models/submodels/thermal/x_full.rst | 0 .../base_transport_efficiency.rst | 0 .../bruggeman_transport_efficiency.rst | 0 .../submodels/transport_efficiency/index.rst | 0 .../parameters/electrical_parameters.rst | 0 .../parameters/geometric_parameters.rst | 0 docs/source/{ => api}/parameters/index.rst | 0 .../parameters/lead_acid_parameters.rst | 0 .../parameters/lithium_ion_parameters.rst | 0 .../{ => api}/parameters/parameter_sets.rst | 33 ++-- .../{ => api}/parameters/parameter_values.rst | 0 .../parameters/process_parameter_data.rst | 0 .../parameters/thermal_parameters.rst | 0 .../{ => api}/plotting/dynamic_plot.rst | 0 docs/source/{ => api}/plotting/index.rst | 0 docs/source/{ => api}/plotting/plot.rst | 0 docs/source/{ => api}/plotting/plot_2D.rst | 0 .../plotting/plot_summary_variables.rst | 0 .../plotting/plot_voltage_components.rst | 0 docs/source/{ => api}/plotting/quick_plot.rst | 0 docs/source/{ => api}/simulation.rst | 0 .../{ => api}/solvers/algebraic_solvers.rst | 0 docs/source/{ => api}/solvers/base_solver.rst | 0 .../{ => api}/solvers/casadi_solver.rst | 0 .../source/{ => api}/solvers/dummy_solver.rst | 0 .../{ => api}/solvers/idaklu_solver.rst | 0 docs/source/{ => api}/solvers/index.rst | 0 docs/source/{ => api}/solvers/jax_solver.rst | 0 .../{ => api}/solvers/processed_variable.rst | 0 .../{ => api}/solvers/scikits_solvers.rst | 0 .../source/{ => api}/solvers/scipy_solver.rst | 0 docs/source/{ => api}/solvers/solution.rst | 0 .../spatial_methods/discretisation.rst | 0 .../spatial_methods/finite_volume.rst | 0 .../{ => api}/spatial_methods/index.rst | 0 .../spatial_methods/scikit_finite_element.rst | 0 .../spatial_methods/spatial_method.rst | 0 .../spatial_methods/spectral_volume.rst | 0 .../zero_dimensional_method.rst | 0 docs/source/{ => api}/util.rst | 0 docs/source/user_guide/fundamentals/index.rst | 53 ++++++ docs/source/user_guide/getting_started.rst | 42 +++++ docs/source/user_guide/index.rst | 21 +++ .../user_guide/installation}/GNU-linux.rst | 0 docs/source/user_guide/installation/index.rst | 86 +++++++++ .../installation}/install-from-source.rst | 0 .../user_guide/installation}/windows-wsl.rst | 0 .../user_guide/installation}/windows.rst | 0 docs/source/user_guide/todo.md | 14 ++ examples/notebooks/README.md | 1 - .../submodels/electrode/ohm/li_metal.py | 2 +- setup.py | 6 +- 207 files changed, 700 insertions(+), 131 deletions(-) create mode 100644 docs/source/_static/index-images/api.svg create mode 100644 docs/source/_static/index-images/contributor.svg create mode 100644 docs/source/_static/index-images/examples.svg create mode 100644 docs/source/_static/index-images/getting_started.svg create mode 100644 docs/source/_static/pybamm.css create mode 100644 docs/source/_static/pybamm_logo.svg rename docs/source/{ => api}/batch_study.rst (100%) rename docs/source/{ => api}/callbacks.rst (100%) rename docs/source/{ => api}/citations.rst (100%) rename docs/source/{ => api}/experiments/experiment.rst (100%) rename docs/source/{ => api}/experiments/index.rst (100%) rename docs/source/{ => api}/expression_tree/array.rst (100%) rename docs/source/{ => api}/expression_tree/binary_operator.rst (100%) rename docs/source/{ => api}/expression_tree/broadcasts.rst (100%) rename docs/source/{ => api}/expression_tree/concatenations.rst (100%) rename docs/source/{ => api}/expression_tree/functions.rst (100%) rename docs/source/{ => api}/expression_tree/independent_variable.rst (100%) rename docs/source/{ => api}/expression_tree/index.rst (100%) rename docs/source/{ => api}/expression_tree/input_parameter.rst (100%) rename docs/source/{ => api}/expression_tree/interpolant.rst (100%) rename docs/source/{ => api}/expression_tree/matrix.rst (100%) rename docs/source/{ => api}/expression_tree/operations/convert_to_casadi.rst (100%) rename docs/source/{ => api}/expression_tree/operations/evaluate.rst (100%) rename docs/source/{ => api}/expression_tree/operations/index.rst (100%) rename docs/source/{ => api}/expression_tree/operations/jacobian.rst (100%) rename docs/source/{ => api}/expression_tree/operations/unpack_symbol.rst (100%) rename docs/source/{ => api}/expression_tree/parameter.rst (100%) rename docs/source/{ => api}/expression_tree/scalar.rst (100%) rename docs/source/{ => api}/expression_tree/state_vector.rst (100%) rename docs/source/{ => api}/expression_tree/symbol.rst (100%) rename docs/source/{ => api}/expression_tree/unary_operator.rst (100%) rename docs/source/{ => api}/expression_tree/variable.rst (100%) rename docs/source/{ => api}/expression_tree/vector.rst (100%) rename docs/source/{ => api}/geometry/battery_geometry.rst (100%) rename docs/source/{ => api}/geometry/geometry.rst (100%) rename docs/source/{ => api}/geometry/index.rst (100%) create mode 100644 docs/source/api/index.rst rename docs/source/{ => api}/meshes/index.rst (100%) rename docs/source/{ => api}/meshes/meshes.rst (100%) rename docs/source/{ => api}/meshes/one_dimensional_submeshes.rst (100%) rename docs/source/{ => api}/meshes/two_dimensional_submeshes.rst (100%) rename docs/source/{ => api}/meshes/zero_dimensional_submeshes.rst (100%) rename docs/source/{ => api}/models/base_models/base_battery_model.rst (100%) rename docs/source/{ => api}/models/base_models/base_model.rst (100%) rename docs/source/{ => api}/models/base_models/event.rst (100%) rename docs/source/{ => api}/models/base_models/index.rst (100%) rename docs/source/{ => api}/models/equivalent_circuit/index.rst (100%) rename docs/source/{ => api}/models/equivalent_circuit/thevenin.rst (100%) rename docs/source/{ => api}/models/index.rst (100%) rename docs/source/{ => api}/models/lead_acid/base_lead_acid_model.rst (100%) rename docs/source/{ => api}/models/lead_acid/full.rst (100%) rename docs/source/{ => api}/models/lead_acid/index.rst (100%) rename docs/source/{ => api}/models/lead_acid/loqs.rst (100%) rename docs/source/{ => api}/models/lithium_ion/base_lithium_ion_model.rst (100%) rename docs/source/{ => api}/models/lithium_ion/dfn.rst (100%) rename docs/source/{ => api}/models/lithium_ion/electrode_soh.rst (100%) rename docs/source/{ => api}/models/lithium_ion/index.rst (100%) rename docs/source/{ => api}/models/lithium_ion/mpm.rst (100%) rename docs/source/{ => api}/models/lithium_ion/newman_tobias.rst (100%) rename docs/source/{ => api}/models/lithium_ion/spm.rst (100%) rename docs/source/{ => api}/models/lithium_ion/spme.rst (100%) rename docs/source/{ => api}/models/lithium_ion/yang2017.rst (100%) rename docs/source/{ => api}/models/submodels/active_material/base_active_material.rst (100%) rename docs/source/{ => api}/models/submodels/active_material/constant_active_material.rst (100%) rename docs/source/{ => api}/models/submodels/active_material/index.rst (100%) rename docs/source/{ => api}/models/submodels/active_material/loss_active_material.rst (100%) rename docs/source/{ => api}/models/submodels/base_submodel.rst (100%) rename docs/source/{ => api}/models/submodels/convection/base_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/index.rst (100%) rename docs/source/{ => api}/models/submodels/convection/through_cell/base_through_cell_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/through_cell/explicit_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/through_cell/full_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/through_cell/index.rst (100%) rename docs/source/{ => api}/models/submodels/convection/through_cell/no_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/transverse/base_transverse_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/transverse/full_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/transverse/index.rst (100%) rename docs/source/{ => api}/models/submodels/convection/transverse/no_convection.rst (100%) rename docs/source/{ => api}/models/submodels/convection/transverse/uniform_convection.rst (100%) rename docs/source/{ => api}/models/submodels/current_collector/base_current_collector.rst (100%) rename docs/source/{ => api}/models/submodels/current_collector/effective_resistance_current_collector.rst (100%) rename docs/source/{ => api}/models/submodels/current_collector/homogeneous_current_collector.rst (100%) rename docs/source/{ => api}/models/submodels/current_collector/index.rst (100%) rename docs/source/{ => api}/models/submodels/current_collector/potential_pair.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/base_electrode.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/index.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/base_ohm.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/composite_ohm.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/full_ohm.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/index.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/leading_ohm.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/li_metal_explicit.rst (100%) rename docs/source/{ => api}/models/submodels/electrode/ohm/surface_form_ohm.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/composite_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/full_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/index.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/integrated_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/leading_order_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/surface_form/explicit_surface_form_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/surface_form/full_surface_form_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/surface_form/index.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_conductivity/surface_form/leading_surface_form_conductivity.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_diffusion/base_electrolyte_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_diffusion/constant_concentration.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_diffusion/full_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_diffusion/index.rst (100%) rename docs/source/{ => api}/models/submodels/electrolyte_diffusion/leading_order_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/index.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/ocv_element.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/rc_element.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/resistor_element.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/thermal.rst (100%) rename docs/source/{ => api}/models/submodels/equivalent_circuit_elements/voltage_model.rst (100%) rename docs/source/{ => api}/models/submodels/external_circuit/explicit_control_external_circuit.rst (100%) rename docs/source/{ => api}/models/submodels/external_circuit/function_control_external_circuit.rst (100%) rename docs/source/{ => api}/models/submodels/external_circuit/index.rst (100%) rename docs/source/{ => api}/models/submodels/index.rst (100%) rename docs/source/{ => api}/models/submodels/interface/base_interface.rst (100%) rename docs/source/{ => api}/models/submodels/interface/diffusion_limited.rst (100%) rename docs/source/{ => api}/models/submodels/interface/index.rst (100%) rename docs/source/{ => api}/models/submodels/interface/inverse_butler_volmer.rst (100%) rename docs/source/{ => api}/models/submodels/interface/kinetics.rst (100%) rename docs/source/{ => api}/models/submodels/interface/open_circuit_potential.rst (100%) rename docs/source/{ => api}/models/submodels/interface/sei.rst (100%) rename docs/source/{ => api}/models/submodels/oxygen_diffusion/base_oxygen_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/oxygen_diffusion/full_oxygen_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/oxygen_diffusion/index.rst (100%) rename docs/source/{ => api}/models/submodels/oxygen_diffusion/leading_oxygen_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/oxygen_diffusion/no_oxygen.rst (100%) rename docs/source/{ => api}/models/submodels/particle/base_particle.rst (100%) rename docs/source/{ => api}/models/submodels/particle/fickian_diffusion.rst (100%) rename docs/source/{ => api}/models/submodels/particle/index.rst (100%) rename docs/source/{ => api}/models/submodels/particle/polynomial_profile.rst (100%) rename docs/source/{ => api}/models/submodels/particle/x_averaged_polynomial_profile.rst (100%) rename docs/source/{ => api}/models/submodels/particle_mechanics/base_mechanics.rst (100%) rename docs/source/{ => api}/models/submodels/particle_mechanics/crack_propagation.rst (100%) rename docs/source/{ => api}/models/submodels/particle_mechanics/index.rst (100%) rename docs/source/{ => api}/models/submodels/particle_mechanics/swelling_only.rst (100%) rename docs/source/{ => api}/models/submodels/porosity/base_porosity.rst (100%) rename docs/source/{ => api}/models/submodels/porosity/constant_porosity.rst (100%) rename docs/source/{ => api}/models/submodels/porosity/index.rst (100%) rename docs/source/{ => api}/models/submodels/porosity/reaction_driven_porosity.rst (100%) rename docs/source/{ => api}/models/submodels/porosity/reaction_driven_porosity_ode.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/base_thermal.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/index.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/isothermal.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/lumped.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/pouch_cell/index.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/pouch_cell/pouch_cell_1D_current_collectors.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/pouch_cell/pouch_cell_2D_current_collectors.rst (100%) rename docs/source/{ => api}/models/submodels/thermal/x_full.rst (100%) rename docs/source/{ => api}/models/submodels/transport_efficiency/base_transport_efficiency.rst (100%) rename docs/source/{ => api}/models/submodels/transport_efficiency/bruggeman_transport_efficiency.rst (100%) rename docs/source/{ => api}/models/submodels/transport_efficiency/index.rst (100%) rename docs/source/{ => api}/parameters/electrical_parameters.rst (100%) rename docs/source/{ => api}/parameters/geometric_parameters.rst (100%) rename docs/source/{ => api}/parameters/index.rst (100%) rename docs/source/{ => api}/parameters/lead_acid_parameters.rst (100%) rename docs/source/{ => api}/parameters/lithium_ion_parameters.rst (100%) rename docs/source/{ => api}/parameters/parameter_sets.rst (84%) rename docs/source/{ => api}/parameters/parameter_values.rst (100%) rename docs/source/{ => api}/parameters/process_parameter_data.rst (100%) rename docs/source/{ => api}/parameters/thermal_parameters.rst (100%) rename docs/source/{ => api}/plotting/dynamic_plot.rst (100%) rename docs/source/{ => api}/plotting/index.rst (100%) rename docs/source/{ => api}/plotting/plot.rst (100%) rename docs/source/{ => api}/plotting/plot_2D.rst (100%) rename docs/source/{ => api}/plotting/plot_summary_variables.rst (100%) rename docs/source/{ => api}/plotting/plot_voltage_components.rst (100%) rename docs/source/{ => api}/plotting/quick_plot.rst (100%) rename docs/source/{ => api}/simulation.rst (100%) rename docs/source/{ => api}/solvers/algebraic_solvers.rst (100%) rename docs/source/{ => api}/solvers/base_solver.rst (100%) rename docs/source/{ => api}/solvers/casadi_solver.rst (100%) rename docs/source/{ => api}/solvers/dummy_solver.rst (100%) rename docs/source/{ => api}/solvers/idaklu_solver.rst (100%) rename docs/source/{ => api}/solvers/index.rst (100%) rename docs/source/{ => api}/solvers/jax_solver.rst (100%) rename docs/source/{ => api}/solvers/processed_variable.rst (100%) rename docs/source/{ => api}/solvers/scikits_solvers.rst (100%) rename docs/source/{ => api}/solvers/scipy_solver.rst (100%) rename docs/source/{ => api}/solvers/solution.rst (100%) rename docs/source/{ => api}/spatial_methods/discretisation.rst (100%) rename docs/source/{ => api}/spatial_methods/finite_volume.rst (100%) rename docs/source/{ => api}/spatial_methods/index.rst (100%) rename docs/source/{ => api}/spatial_methods/scikit_finite_element.rst (100%) rename docs/source/{ => api}/spatial_methods/spatial_method.rst (100%) rename docs/source/{ => api}/spatial_methods/spectral_volume.rst (100%) rename docs/source/{ => api}/spatial_methods/zero_dimensional_method.rst (100%) rename docs/source/{ => api}/util.rst (100%) create mode 100644 docs/source/user_guide/fundamentals/index.rst create mode 100644 docs/source/user_guide/getting_started.rst create mode 100644 docs/source/user_guide/index.rst rename docs/{install => source/user_guide/installation}/GNU-linux.rst (100%) create mode 100644 docs/source/user_guide/installation/index.rst rename docs/{install => source/user_guide/installation}/install-from-source.rst (100%) rename docs/{install => source/user_guide/installation}/windows-wsl.rst (100%) rename docs/{install => source/user_guide/installation}/windows.rst (100%) create mode 100644 docs/source/user_guide/todo.md diff --git a/README.md b/README.md index aaa3f105b5..be7c798bb1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ sim.solve([0, 3600]) # solve for 1 hour sim.plot() ``` -or simulate an experiment such as CCCV: +or simulate an experiment such as a constant-current discharge followed by a constant-current-constant-voltage charge: ```python3 import pybamm diff --git a/docs/conf.py b/docs/conf.py index 53842d3914..c080b25b60 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,6 +48,7 @@ "sphinx.ext.mathjax", "sphinx.ext.viewcode", "sphinx.ext.napoleon", + "sphinx_design", ] @@ -88,43 +89,61 @@ # -- Options for HTML output ------------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -# html_theme = "sphinxdoc" +html_static_path = ["source/_static"] -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} +# Theme +html_theme = "pydata_sphinx_theme" -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] +# pydata theme options (see https://pydata-sphinx-theme.readthedocs.io/en/latest/index.html# for more information) +# mostly copied from numpy, scipy, pandas +html_logo = "source/_static/pybamm_logo.png" -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} +html_theme_options = { + "logo": { + "image_light": "pybamm_logo.png", + "image_dark": "pybamm_logo.png", + }, + "github_url": "https://github.com/pybamm-team/pybamm", + "twitter_url": "https://twitter.com/pybamm_", + "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", + }, + ], + # Add light/dark mode and documentation version switcher: + # "navbar_end": ["theme-switcher", "version-switcher", "navbar-icon-links"], + # "switcher": { + # "version_match": switcher_version, + # "json_url": "https://numpy.org/doc/_static/versions.json", + # }, + "use_edit_page_button": True, +} -# Theme +html_title = "%s v%s Manual" % (project, version) +html_last_updated_fmt = "%b %d, %Y" +html_css_files = ["pybamm.css"] +html_context = {"default_mode": "light"} +html_use_modindex = True +html_copy_source = False +html_domain_indices = False +html_file_suffix = ".html" -html_theme = "pydata_sphinx_theme" +htmlhelp_basename = "pybamm" -# Register the theme as an extension to generate a sitemap.xml -extensions.append("pydata_sphinx_theme") +html_sidebars = {"**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"]} -# Guzzle theme options (see theme.conf for more information) -html_theme_options = { - # Set the name of the project to appear in the sidebar - # "project_nav_name": project +# For edit button +html_context = { + "github_user": "pybamm-team", + "github_repo": "pybamm", + "github_version": "develop", + "doc_path": "docs/", } @@ -209,7 +228,7 @@ "python": ("https://docs.python.org/3/", None), "sphinx": ("https://www.sphinx-doc.org/en/master/", None), "numpy": ("https://numpy.org/doc/stable", None), - # "scipy": ("http://docs.scipy.org/doc/scipy/reference", None), + "scipy": ("https://docs.scipy.org/doc/scipy", None), "matplotlib": ("https://matplotlib.org", None), } @@ -234,6 +253,8 @@ def setup(app): # Context for Jinja Templates -html_context = { - "parameter_sets": pybamm.parameter_sets, -} +html_context.update( + { + "parameter_sets": pybamm.parameter_sets, + } +) diff --git a/docs/index.rst b/docs/index.rst index 8859b8e5c5..f4078e3d1e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,101 +1,115 @@ .. Root of all pybamm docs -.. _GitHub: https://github.com/pybamm-team/PyBaMM +.. Remove the right side-bar for the home page +:html_theme.sidebar_secondary.remove: -Welcome to PyBaMM's documentation! -================================== +#################### +PyBaMM documentation +#################### -Python Battery Mathematical Modelling (**PyBAMM**) solves continuum models for -batteries, using both numerical methods and asymptotic analysis. +.. This TOC defines what goes in the top navbar +.. toctree:: + :maxdepth: 1 + :hidden: -PyBaMM is hosted on GitHub_. This page provides the *API*, or *developer -documentation* for ``pybamm``. + source/user_guide/index + source/api/index -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +**Version**: |version| -Quickstart -========================= -PyBaMM is available on GNU/Linux, MacOS and Windows. +.. **Download documentation**: +.. `PDF Version `_ | +.. `Historical versions of documentation `_ + +**Useful links**: +`Project Home Page `_ | +`Installation `_ | +`Source Repository `_ | +`Issue Tracker `_ | +`Discussions `_ -Using pip ----------- +PyBaMM (Python Battery Mathematical Modelling) is an open-source battery simulation package +written in Python. Our mission is to accelerate battery modelling research by +providing open-source tools for multi-institutional, interdisciplinary collaboration. +Broadly, PyBaMM consists of +(i) a framework for writing and solving systems +of differential equations, +(ii) a library of battery models and parameters, and +(iii) specialized tools for simulating battery-specific experiments and visualizing the results. +Together, these enable flexible model definitions and fast battery simulations, allowing users to +explore the effect of different battery designs and modeling assumptions under a variety of operating scenarios. -GNU/Linux and Windows -~~~~~~~~~~~~~~~~~~~~~~ +.. grid:: 2 -.. code:: bash + .. grid-item-card:: + :img-top: source/_static/index-images/getting_started.svg - pip install pybamm + User Guide + ^^^^^^^^^^ -macOS -~~~~~~~~~~~~~~~~~~~~~~ + The user guide is the best place to start learning PyBaMM. It contains an installation + guide, an introduction to the main concepts and links to additional tutorials. -.. code:: bash + +++ - brew install sundials && pip install pybamm + .. button-ref:: source/user_guide/index + :expand: + :color: secondary + :click-parent: -Using conda -------------- -PyBaMM is available as a conda package through the conda-forge channel. + To the user guide + + .. grid-item-card:: + :img-top: source/_static/index-images/examples.svg -.. code:: bash + Examples + ^^^^^^^^ - conda install -c conda-forge pybamm + Examples and tutorials can be viewed on the GitHub examples page, + which also provides a link to run them online through Google Colab. -Optional solvers ------------------ -Following GNU/Linux and macOS solvers are optionally available: + +++ -* `scikits.odes `_ -based solver, see `Optional - scikits.odes solver `_. -* `jax `_ -based solver, see `Optional - JaxSolver `_. + .. button-ref:: https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks + :expand: + :color: secondary + :click-parent: -Installation -============ + To the examples -.. toctree:: - :maxdepth: 1 + .. grid-item-card:: + :img-top: source/_static/index-images/api.svg - install/GNU-linux - install/windows - install/windows-wsl - install/install-from-source + API Documentation + ^^^^^^^^^^^^^^^^^ -API documentation -==================== + The reference guide contains a detailed description of the functions, + modules, and objects included in PyBaMM. The reference describes how the + methods work and which parameters can be used. -.. module:: pybamm + +++ -.. toctree:: - :maxdepth: 2 - - source/expression_tree/index - source/models/index - source/parameters/index - source/geometry/index - source/meshes/index - source/spatial_methods/index - source/solvers/index - source/experiments/index - source/simulation - source/plotting/index - source/util - source/callbacks - source/citations - source/batch_study - -Examples -======== - -Detailed examples can be viewed on the -`GitHub examples page `_, -and run locally using ``jupyter notebook``, or online through -`Google Colab `_. - -Contributing -============ - -Contributions to PyBaMM and its development are welcome! If you have ideas for features, bug fixes, models, spatial methods, or solvers, we would love to hear from you. - -Before contributing, please read the `Contribution Guidelines `_. + .. button-ref:: source/api/index + :expand: + :color: secondary + :click-parent: + + To the API documentation + + .. grid-item-card:: + :img-top: source/_static/index-images/contributor.svg + + Contributor's Guide + ^^^^^^^^^^^^^^^^^^^ + + Contributions to PyBaMM and its development are welcome! If you have ideas for + features, bug fixes, models, spatial methods, or solvers, we would love to hear from you. + + +++ + + .. button-ref:: https://github.com/pybamm-team/PyBaMM/blob/develop/CONTRIBUTING.md + :expand: + :color: secondary + :click-parent: + + To the contributor's guide diff --git a/docs/requirements.txt b/docs/requirements.txt index abc61a14d0..0dd679f075 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -17,4 +17,5 @@ sympy >= 1.8 matplotlib >= 2.0 # pydata-sphinx-theme +sphinx_design sphinx>4.0 diff --git a/docs/source/_static/index-images/api.svg b/docs/source/_static/index-images/api.svg new file mode 100644 index 0000000000..e637525cc0 --- /dev/null +++ b/docs/source/_static/index-images/api.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/index-images/contributor.svg b/docs/source/_static/index-images/contributor.svg new file mode 100644 index 0000000000..3a689e0e4c --- /dev/null +++ b/docs/source/_static/index-images/contributor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/_static/index-images/examples.svg b/docs/source/_static/index-images/examples.svg new file mode 100644 index 0000000000..d61b0937da --- /dev/null +++ b/docs/source/_static/index-images/examples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/_static/index-images/getting_started.svg b/docs/source/_static/index-images/getting_started.svg new file mode 100644 index 0000000000..04db7e6156 --- /dev/null +++ b/docs/source/_static/index-images/getting_started.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/pybamm.css b/docs/source/_static/pybamm.css new file mode 100644 index 0000000000..ffe3d948d9 --- /dev/null +++ b/docs/source/_static/pybamm.css @@ -0,0 +1,143 @@ +@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Open+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap'); + +.navbar-brand img { + height: 50px; +} + +.navbar-brand { + height: 50px; +} + +body { + font-family: 'Open Sans', sans-serif; +} + +pre, +code { + font-size: 100%; + line-height: 155%; +} + +h1 { + font-family: "Lato", sans-serif; + color: #013243; + /* warm black */ +} + +h2 { + color: #4d77cf; + /* han blue */ + letter-spacing: -.03em; +} + +h3 { + color: #013243; + /* warm black */ + letter-spacing: -.03em; +} + +/* Style the active version button. + +- dev: orange +- stable: green +- old, PR: red + +Colors from: + +Wong, B. Points of view: Color blindness. +Nat Methods 8, 441 (2011). https://doi.org/10.1038/nmeth.1618 +*/ + +/* If the active version has the name "dev", style it orange */ +#version_switcher_button[data-active-version-name*="dev"] { + background-color: #E69F00; + border-color: #E69F00; + color: #000000; +} + +/* green for `stable` */ +#version_switcher_button[data-active-version-name*="stable"] { + background-color: #009E73; + border-color: #009E73; +} + +/* red for `old` */ +#version_switcher_button:not([data-active-version-name*="stable"], [data-active-version-name*="dev"], [data-active-version-name=""]) { + background-color: #980F0F; + border-color: #980F0F; +} + +/* Main page overview cards */ + +.sd-card { + background: #fff; + border-radius: 0; + padding: 30px 10px 20px 10px; + margin: 10px 0px; +} + +.sd-card .sd-card-header { + text-align: center; +} + +.sd-card .sd-card-header .sd-card-text { + margin: 0px; +} + +.sd-card .sd-card-img-top { + height: 52px; + width: 52px; + margin-left: auto; + margin-right: auto; +} + +.sd-card .sd-card-header { + border: none; + background-color: white; + color: #150458 !important; + font-size: var(--pst-font-size-h5); + font-weight: bold; + padding: 2.5rem 0rem 0.5rem 0rem; +} + +.sd-card .sd-card-footer { + border: none; + background-color: white; +} + +.sd-card .sd-card-footer .sd-card-text { + max-width: 220px; + margin-left: auto; + margin-right: auto; +} + +/* Dark theme tweaking */ +html[data-theme=dark] .sd-card img[src*='.svg'] { + filter: invert(0.82) brightness(0.8) contrast(1.2); +} + +/* Main index page overview cards */ +html[data-theme=dark] .sd-card { + background-color: var(--pst-color-background); +} + +html[data-theme=dark] .sd-shadow-sm { + box-shadow: 0 .1rem 1rem rgba(250, 250, 250, .6) !important +} + +html[data-theme=dark] .sd-card .sd-card-header { + background-color: var(--pst-color-background); + color: #150458 !important; +} + +html[data-theme=dark] .sd-card .sd-card-footer { + background-color: var(--pst-color-background); +} + +html[data-theme=dark] h1 { + color: var(--pst-color-primary); +} + +html[data-theme=dark] h3 { + color: #0a6774; +} \ No newline at end of file diff --git a/docs/source/_static/pybamm_logo.svg b/docs/source/_static/pybamm_logo.svg new file mode 100644 index 0000000000..401e6b59b5 --- /dev/null +++ b/docs/source/_static/pybamm_logo.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/source/batch_study.rst b/docs/source/api/batch_study.rst similarity index 100% rename from docs/source/batch_study.rst rename to docs/source/api/batch_study.rst diff --git a/docs/source/callbacks.rst b/docs/source/api/callbacks.rst similarity index 100% rename from docs/source/callbacks.rst rename to docs/source/api/callbacks.rst diff --git a/docs/source/citations.rst b/docs/source/api/citations.rst similarity index 100% rename from docs/source/citations.rst rename to docs/source/api/citations.rst diff --git a/docs/source/experiments/experiment.rst b/docs/source/api/experiments/experiment.rst similarity index 100% rename from docs/source/experiments/experiment.rst rename to docs/source/api/experiments/experiment.rst diff --git a/docs/source/experiments/index.rst b/docs/source/api/experiments/index.rst similarity index 100% rename from docs/source/experiments/index.rst rename to docs/source/api/experiments/index.rst diff --git a/docs/source/expression_tree/array.rst b/docs/source/api/expression_tree/array.rst similarity index 100% rename from docs/source/expression_tree/array.rst rename to docs/source/api/expression_tree/array.rst diff --git a/docs/source/expression_tree/binary_operator.rst b/docs/source/api/expression_tree/binary_operator.rst similarity index 100% rename from docs/source/expression_tree/binary_operator.rst rename to docs/source/api/expression_tree/binary_operator.rst diff --git a/docs/source/expression_tree/broadcasts.rst b/docs/source/api/expression_tree/broadcasts.rst similarity index 100% rename from docs/source/expression_tree/broadcasts.rst rename to docs/source/api/expression_tree/broadcasts.rst diff --git a/docs/source/expression_tree/concatenations.rst b/docs/source/api/expression_tree/concatenations.rst similarity index 100% rename from docs/source/expression_tree/concatenations.rst rename to docs/source/api/expression_tree/concatenations.rst diff --git a/docs/source/expression_tree/functions.rst b/docs/source/api/expression_tree/functions.rst similarity index 100% rename from docs/source/expression_tree/functions.rst rename to docs/source/api/expression_tree/functions.rst diff --git a/docs/source/expression_tree/independent_variable.rst b/docs/source/api/expression_tree/independent_variable.rst similarity index 100% rename from docs/source/expression_tree/independent_variable.rst rename to docs/source/api/expression_tree/independent_variable.rst diff --git a/docs/source/expression_tree/index.rst b/docs/source/api/expression_tree/index.rst similarity index 100% rename from docs/source/expression_tree/index.rst rename to docs/source/api/expression_tree/index.rst diff --git a/docs/source/expression_tree/input_parameter.rst b/docs/source/api/expression_tree/input_parameter.rst similarity index 100% rename from docs/source/expression_tree/input_parameter.rst rename to docs/source/api/expression_tree/input_parameter.rst diff --git a/docs/source/expression_tree/interpolant.rst b/docs/source/api/expression_tree/interpolant.rst similarity index 100% rename from docs/source/expression_tree/interpolant.rst rename to docs/source/api/expression_tree/interpolant.rst diff --git a/docs/source/expression_tree/matrix.rst b/docs/source/api/expression_tree/matrix.rst similarity index 100% rename from docs/source/expression_tree/matrix.rst rename to docs/source/api/expression_tree/matrix.rst diff --git a/docs/source/expression_tree/operations/convert_to_casadi.rst b/docs/source/api/expression_tree/operations/convert_to_casadi.rst similarity index 100% rename from docs/source/expression_tree/operations/convert_to_casadi.rst rename to docs/source/api/expression_tree/operations/convert_to_casadi.rst diff --git a/docs/source/expression_tree/operations/evaluate.rst b/docs/source/api/expression_tree/operations/evaluate.rst similarity index 100% rename from docs/source/expression_tree/operations/evaluate.rst rename to docs/source/api/expression_tree/operations/evaluate.rst diff --git a/docs/source/expression_tree/operations/index.rst b/docs/source/api/expression_tree/operations/index.rst similarity index 100% rename from docs/source/expression_tree/operations/index.rst rename to docs/source/api/expression_tree/operations/index.rst diff --git a/docs/source/expression_tree/operations/jacobian.rst b/docs/source/api/expression_tree/operations/jacobian.rst similarity index 100% rename from docs/source/expression_tree/operations/jacobian.rst rename to docs/source/api/expression_tree/operations/jacobian.rst diff --git a/docs/source/expression_tree/operations/unpack_symbol.rst b/docs/source/api/expression_tree/operations/unpack_symbol.rst similarity index 100% rename from docs/source/expression_tree/operations/unpack_symbol.rst rename to docs/source/api/expression_tree/operations/unpack_symbol.rst diff --git a/docs/source/expression_tree/parameter.rst b/docs/source/api/expression_tree/parameter.rst similarity index 100% rename from docs/source/expression_tree/parameter.rst rename to docs/source/api/expression_tree/parameter.rst diff --git a/docs/source/expression_tree/scalar.rst b/docs/source/api/expression_tree/scalar.rst similarity index 100% rename from docs/source/expression_tree/scalar.rst rename to docs/source/api/expression_tree/scalar.rst diff --git a/docs/source/expression_tree/state_vector.rst b/docs/source/api/expression_tree/state_vector.rst similarity index 100% rename from docs/source/expression_tree/state_vector.rst rename to docs/source/api/expression_tree/state_vector.rst diff --git a/docs/source/expression_tree/symbol.rst b/docs/source/api/expression_tree/symbol.rst similarity index 100% rename from docs/source/expression_tree/symbol.rst rename to docs/source/api/expression_tree/symbol.rst diff --git a/docs/source/expression_tree/unary_operator.rst b/docs/source/api/expression_tree/unary_operator.rst similarity index 100% rename from docs/source/expression_tree/unary_operator.rst rename to docs/source/api/expression_tree/unary_operator.rst diff --git a/docs/source/expression_tree/variable.rst b/docs/source/api/expression_tree/variable.rst similarity index 100% rename from docs/source/expression_tree/variable.rst rename to docs/source/api/expression_tree/variable.rst diff --git a/docs/source/expression_tree/vector.rst b/docs/source/api/expression_tree/vector.rst similarity index 100% rename from docs/source/expression_tree/vector.rst rename to docs/source/api/expression_tree/vector.rst diff --git a/docs/source/geometry/battery_geometry.rst b/docs/source/api/geometry/battery_geometry.rst similarity index 100% rename from docs/source/geometry/battery_geometry.rst rename to docs/source/api/geometry/battery_geometry.rst diff --git a/docs/source/geometry/geometry.rst b/docs/source/api/geometry/geometry.rst similarity index 100% rename from docs/source/geometry/geometry.rst rename to docs/source/api/geometry/geometry.rst diff --git a/docs/source/geometry/index.rst b/docs/source/api/geometry/index.rst similarity index 100% rename from docs/source/geometry/index.rst rename to docs/source/api/geometry/index.rst diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst new file mode 100644 index 0000000000..91563fb338 --- /dev/null +++ b/docs/source/api/index.rst @@ -0,0 +1,32 @@ +.. module:: pybamm + +.. _api_docs: + +################# +API documentation +################# + +:Release: |version| +:Date: |today| + +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 `. + +.. toctree:: + :maxdepth: 2 + + expression_tree/index + models/index + parameters/index + geometry/index + meshes/index + spatial_methods/index + solvers/index + experiments/index + simulation + plotting/index + util + callbacks + citations + batch_study \ No newline at end of file diff --git a/docs/source/meshes/index.rst b/docs/source/api/meshes/index.rst similarity index 100% rename from docs/source/meshes/index.rst rename to docs/source/api/meshes/index.rst diff --git a/docs/source/meshes/meshes.rst b/docs/source/api/meshes/meshes.rst similarity index 100% rename from docs/source/meshes/meshes.rst rename to docs/source/api/meshes/meshes.rst diff --git a/docs/source/meshes/one_dimensional_submeshes.rst b/docs/source/api/meshes/one_dimensional_submeshes.rst similarity index 100% rename from docs/source/meshes/one_dimensional_submeshes.rst rename to docs/source/api/meshes/one_dimensional_submeshes.rst diff --git a/docs/source/meshes/two_dimensional_submeshes.rst b/docs/source/api/meshes/two_dimensional_submeshes.rst similarity index 100% rename from docs/source/meshes/two_dimensional_submeshes.rst rename to docs/source/api/meshes/two_dimensional_submeshes.rst diff --git a/docs/source/meshes/zero_dimensional_submeshes.rst b/docs/source/api/meshes/zero_dimensional_submeshes.rst similarity index 100% rename from docs/source/meshes/zero_dimensional_submeshes.rst rename to docs/source/api/meshes/zero_dimensional_submeshes.rst diff --git a/docs/source/models/base_models/base_battery_model.rst b/docs/source/api/models/base_models/base_battery_model.rst similarity index 100% rename from docs/source/models/base_models/base_battery_model.rst rename to docs/source/api/models/base_models/base_battery_model.rst diff --git a/docs/source/models/base_models/base_model.rst b/docs/source/api/models/base_models/base_model.rst similarity index 100% rename from docs/source/models/base_models/base_model.rst rename to docs/source/api/models/base_models/base_model.rst diff --git a/docs/source/models/base_models/event.rst b/docs/source/api/models/base_models/event.rst similarity index 100% rename from docs/source/models/base_models/event.rst rename to docs/source/api/models/base_models/event.rst diff --git a/docs/source/models/base_models/index.rst b/docs/source/api/models/base_models/index.rst similarity index 100% rename from docs/source/models/base_models/index.rst rename to docs/source/api/models/base_models/index.rst diff --git a/docs/source/models/equivalent_circuit/index.rst b/docs/source/api/models/equivalent_circuit/index.rst similarity index 100% rename from docs/source/models/equivalent_circuit/index.rst rename to docs/source/api/models/equivalent_circuit/index.rst diff --git a/docs/source/models/equivalent_circuit/thevenin.rst b/docs/source/api/models/equivalent_circuit/thevenin.rst similarity index 100% rename from docs/source/models/equivalent_circuit/thevenin.rst rename to docs/source/api/models/equivalent_circuit/thevenin.rst diff --git a/docs/source/models/index.rst b/docs/source/api/models/index.rst similarity index 100% rename from docs/source/models/index.rst rename to docs/source/api/models/index.rst diff --git a/docs/source/models/lead_acid/base_lead_acid_model.rst b/docs/source/api/models/lead_acid/base_lead_acid_model.rst similarity index 100% rename from docs/source/models/lead_acid/base_lead_acid_model.rst rename to docs/source/api/models/lead_acid/base_lead_acid_model.rst diff --git a/docs/source/models/lead_acid/full.rst b/docs/source/api/models/lead_acid/full.rst similarity index 100% rename from docs/source/models/lead_acid/full.rst rename to docs/source/api/models/lead_acid/full.rst diff --git a/docs/source/models/lead_acid/index.rst b/docs/source/api/models/lead_acid/index.rst similarity index 100% rename from docs/source/models/lead_acid/index.rst rename to docs/source/api/models/lead_acid/index.rst diff --git a/docs/source/models/lead_acid/loqs.rst b/docs/source/api/models/lead_acid/loqs.rst similarity index 100% rename from docs/source/models/lead_acid/loqs.rst rename to docs/source/api/models/lead_acid/loqs.rst diff --git a/docs/source/models/lithium_ion/base_lithium_ion_model.rst b/docs/source/api/models/lithium_ion/base_lithium_ion_model.rst similarity index 100% rename from docs/source/models/lithium_ion/base_lithium_ion_model.rst rename to docs/source/api/models/lithium_ion/base_lithium_ion_model.rst diff --git a/docs/source/models/lithium_ion/dfn.rst b/docs/source/api/models/lithium_ion/dfn.rst similarity index 100% rename from docs/source/models/lithium_ion/dfn.rst rename to docs/source/api/models/lithium_ion/dfn.rst diff --git a/docs/source/models/lithium_ion/electrode_soh.rst b/docs/source/api/models/lithium_ion/electrode_soh.rst similarity index 100% rename from docs/source/models/lithium_ion/electrode_soh.rst rename to docs/source/api/models/lithium_ion/electrode_soh.rst diff --git a/docs/source/models/lithium_ion/index.rst b/docs/source/api/models/lithium_ion/index.rst similarity index 100% rename from docs/source/models/lithium_ion/index.rst rename to docs/source/api/models/lithium_ion/index.rst diff --git a/docs/source/models/lithium_ion/mpm.rst b/docs/source/api/models/lithium_ion/mpm.rst similarity index 100% rename from docs/source/models/lithium_ion/mpm.rst rename to docs/source/api/models/lithium_ion/mpm.rst diff --git a/docs/source/models/lithium_ion/newman_tobias.rst b/docs/source/api/models/lithium_ion/newman_tobias.rst similarity index 100% rename from docs/source/models/lithium_ion/newman_tobias.rst rename to docs/source/api/models/lithium_ion/newman_tobias.rst diff --git a/docs/source/models/lithium_ion/spm.rst b/docs/source/api/models/lithium_ion/spm.rst similarity index 100% rename from docs/source/models/lithium_ion/spm.rst rename to docs/source/api/models/lithium_ion/spm.rst diff --git a/docs/source/models/lithium_ion/spme.rst b/docs/source/api/models/lithium_ion/spme.rst similarity index 100% rename from docs/source/models/lithium_ion/spme.rst rename to docs/source/api/models/lithium_ion/spme.rst diff --git a/docs/source/models/lithium_ion/yang2017.rst b/docs/source/api/models/lithium_ion/yang2017.rst similarity index 100% rename from docs/source/models/lithium_ion/yang2017.rst rename to docs/source/api/models/lithium_ion/yang2017.rst diff --git a/docs/source/models/submodels/active_material/base_active_material.rst b/docs/source/api/models/submodels/active_material/base_active_material.rst similarity index 100% rename from docs/source/models/submodels/active_material/base_active_material.rst rename to docs/source/api/models/submodels/active_material/base_active_material.rst diff --git a/docs/source/models/submodels/active_material/constant_active_material.rst b/docs/source/api/models/submodels/active_material/constant_active_material.rst similarity index 100% rename from docs/source/models/submodels/active_material/constant_active_material.rst rename to docs/source/api/models/submodels/active_material/constant_active_material.rst diff --git a/docs/source/models/submodels/active_material/index.rst b/docs/source/api/models/submodels/active_material/index.rst similarity index 100% rename from docs/source/models/submodels/active_material/index.rst rename to docs/source/api/models/submodels/active_material/index.rst diff --git a/docs/source/models/submodels/active_material/loss_active_material.rst b/docs/source/api/models/submodels/active_material/loss_active_material.rst similarity index 100% rename from docs/source/models/submodels/active_material/loss_active_material.rst rename to docs/source/api/models/submodels/active_material/loss_active_material.rst diff --git a/docs/source/models/submodels/base_submodel.rst b/docs/source/api/models/submodels/base_submodel.rst similarity index 100% rename from docs/source/models/submodels/base_submodel.rst rename to docs/source/api/models/submodels/base_submodel.rst diff --git a/docs/source/models/submodels/convection/base_convection.rst b/docs/source/api/models/submodels/convection/base_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/base_convection.rst rename to docs/source/api/models/submodels/convection/base_convection.rst diff --git a/docs/source/models/submodels/convection/index.rst b/docs/source/api/models/submodels/convection/index.rst similarity index 100% rename from docs/source/models/submodels/convection/index.rst rename to docs/source/api/models/submodels/convection/index.rst diff --git a/docs/source/models/submodels/convection/through_cell/base_through_cell_convection.rst b/docs/source/api/models/submodels/convection/through_cell/base_through_cell_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/through_cell/base_through_cell_convection.rst rename to docs/source/api/models/submodels/convection/through_cell/base_through_cell_convection.rst diff --git a/docs/source/models/submodels/convection/through_cell/explicit_convection.rst b/docs/source/api/models/submodels/convection/through_cell/explicit_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/through_cell/explicit_convection.rst rename to docs/source/api/models/submodels/convection/through_cell/explicit_convection.rst diff --git a/docs/source/models/submodels/convection/through_cell/full_convection.rst b/docs/source/api/models/submodels/convection/through_cell/full_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/through_cell/full_convection.rst rename to docs/source/api/models/submodels/convection/through_cell/full_convection.rst diff --git a/docs/source/models/submodels/convection/through_cell/index.rst b/docs/source/api/models/submodels/convection/through_cell/index.rst similarity index 100% rename from docs/source/models/submodels/convection/through_cell/index.rst rename to docs/source/api/models/submodels/convection/through_cell/index.rst diff --git a/docs/source/models/submodels/convection/through_cell/no_convection.rst b/docs/source/api/models/submodels/convection/through_cell/no_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/through_cell/no_convection.rst rename to docs/source/api/models/submodels/convection/through_cell/no_convection.rst diff --git a/docs/source/models/submodels/convection/transverse/base_transverse_convection.rst b/docs/source/api/models/submodels/convection/transverse/base_transverse_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/transverse/base_transverse_convection.rst rename to docs/source/api/models/submodels/convection/transverse/base_transverse_convection.rst diff --git a/docs/source/models/submodels/convection/transverse/full_convection.rst b/docs/source/api/models/submodels/convection/transverse/full_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/transverse/full_convection.rst rename to docs/source/api/models/submodels/convection/transverse/full_convection.rst diff --git a/docs/source/models/submodels/convection/transverse/index.rst b/docs/source/api/models/submodels/convection/transverse/index.rst similarity index 100% rename from docs/source/models/submodels/convection/transverse/index.rst rename to docs/source/api/models/submodels/convection/transverse/index.rst diff --git a/docs/source/models/submodels/convection/transverse/no_convection.rst b/docs/source/api/models/submodels/convection/transverse/no_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/transverse/no_convection.rst rename to docs/source/api/models/submodels/convection/transverse/no_convection.rst diff --git a/docs/source/models/submodels/convection/transverse/uniform_convection.rst b/docs/source/api/models/submodels/convection/transverse/uniform_convection.rst similarity index 100% rename from docs/source/models/submodels/convection/transverse/uniform_convection.rst rename to docs/source/api/models/submodels/convection/transverse/uniform_convection.rst diff --git a/docs/source/models/submodels/current_collector/base_current_collector.rst b/docs/source/api/models/submodels/current_collector/base_current_collector.rst similarity index 100% rename from docs/source/models/submodels/current_collector/base_current_collector.rst rename to docs/source/api/models/submodels/current_collector/base_current_collector.rst diff --git a/docs/source/models/submodels/current_collector/effective_resistance_current_collector.rst b/docs/source/api/models/submodels/current_collector/effective_resistance_current_collector.rst similarity index 100% rename from docs/source/models/submodels/current_collector/effective_resistance_current_collector.rst rename to docs/source/api/models/submodels/current_collector/effective_resistance_current_collector.rst diff --git a/docs/source/models/submodels/current_collector/homogeneous_current_collector.rst b/docs/source/api/models/submodels/current_collector/homogeneous_current_collector.rst similarity index 100% rename from docs/source/models/submodels/current_collector/homogeneous_current_collector.rst rename to docs/source/api/models/submodels/current_collector/homogeneous_current_collector.rst diff --git a/docs/source/models/submodels/current_collector/index.rst b/docs/source/api/models/submodels/current_collector/index.rst similarity index 100% rename from docs/source/models/submodels/current_collector/index.rst rename to docs/source/api/models/submodels/current_collector/index.rst diff --git a/docs/source/models/submodels/current_collector/potential_pair.rst b/docs/source/api/models/submodels/current_collector/potential_pair.rst similarity index 100% rename from docs/source/models/submodels/current_collector/potential_pair.rst rename to docs/source/api/models/submodels/current_collector/potential_pair.rst diff --git a/docs/source/models/submodels/electrode/base_electrode.rst b/docs/source/api/models/submodels/electrode/base_electrode.rst similarity index 100% rename from docs/source/models/submodels/electrode/base_electrode.rst rename to docs/source/api/models/submodels/electrode/base_electrode.rst diff --git a/docs/source/models/submodels/electrode/index.rst b/docs/source/api/models/submodels/electrode/index.rst similarity index 100% rename from docs/source/models/submodels/electrode/index.rst rename to docs/source/api/models/submodels/electrode/index.rst diff --git a/docs/source/models/submodels/electrode/ohm/base_ohm.rst b/docs/source/api/models/submodels/electrode/ohm/base_ohm.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/base_ohm.rst rename to docs/source/api/models/submodels/electrode/ohm/base_ohm.rst diff --git a/docs/source/models/submodels/electrode/ohm/composite_ohm.rst b/docs/source/api/models/submodels/electrode/ohm/composite_ohm.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/composite_ohm.rst rename to docs/source/api/models/submodels/electrode/ohm/composite_ohm.rst diff --git a/docs/source/models/submodels/electrode/ohm/full_ohm.rst b/docs/source/api/models/submodels/electrode/ohm/full_ohm.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/full_ohm.rst rename to docs/source/api/models/submodels/electrode/ohm/full_ohm.rst diff --git a/docs/source/models/submodels/electrode/ohm/index.rst b/docs/source/api/models/submodels/electrode/ohm/index.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/index.rst rename to docs/source/api/models/submodels/electrode/ohm/index.rst diff --git a/docs/source/models/submodels/electrode/ohm/leading_ohm.rst b/docs/source/api/models/submodels/electrode/ohm/leading_ohm.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/leading_ohm.rst rename to docs/source/api/models/submodels/electrode/ohm/leading_ohm.rst diff --git a/docs/source/models/submodels/electrode/ohm/li_metal_explicit.rst b/docs/source/api/models/submodels/electrode/ohm/li_metal_explicit.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/li_metal_explicit.rst rename to docs/source/api/models/submodels/electrode/ohm/li_metal_explicit.rst diff --git a/docs/source/models/submodels/electrode/ohm/surface_form_ohm.rst b/docs/source/api/models/submodels/electrode/ohm/surface_form_ohm.rst similarity index 100% rename from docs/source/models/submodels/electrode/ohm/surface_form_ohm.rst rename to docs/source/api/models/submodels/electrode/ohm/surface_form_ohm.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/composite_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/composite_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/composite_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/composite_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/full_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/full_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/full_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/full_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/index.rst b/docs/source/api/models/submodels/electrolyte_conductivity/index.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/index.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/index.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/integrated_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/integrated_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/integrated_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/integrated_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/leading_order_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/leading_order_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/leading_order_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/leading_order_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/surface_form/explicit_surface_form_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/surface_form/explicit_surface_form_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/surface_form/explicit_surface_form_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/surface_form/explicit_surface_form_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/surface_form/full_surface_form_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/surface_form/full_surface_form_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/surface_form/full_surface_form_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/surface_form/full_surface_form_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/surface_form/index.rst b/docs/source/api/models/submodels/electrolyte_conductivity/surface_form/index.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/surface_form/index.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/surface_form/index.rst diff --git a/docs/source/models/submodels/electrolyte_conductivity/surface_form/leading_surface_form_conductivity.rst b/docs/source/api/models/submodels/electrolyte_conductivity/surface_form/leading_surface_form_conductivity.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_conductivity/surface_form/leading_surface_form_conductivity.rst rename to docs/source/api/models/submodels/electrolyte_conductivity/surface_form/leading_surface_form_conductivity.rst diff --git a/docs/source/models/submodels/electrolyte_diffusion/base_electrolyte_diffusion.rst b/docs/source/api/models/submodels/electrolyte_diffusion/base_electrolyte_diffusion.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_diffusion/base_electrolyte_diffusion.rst rename to docs/source/api/models/submodels/electrolyte_diffusion/base_electrolyte_diffusion.rst diff --git a/docs/source/models/submodels/electrolyte_diffusion/constant_concentration.rst b/docs/source/api/models/submodels/electrolyte_diffusion/constant_concentration.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_diffusion/constant_concentration.rst rename to docs/source/api/models/submodels/electrolyte_diffusion/constant_concentration.rst diff --git a/docs/source/models/submodels/electrolyte_diffusion/full_diffusion.rst b/docs/source/api/models/submodels/electrolyte_diffusion/full_diffusion.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_diffusion/full_diffusion.rst rename to docs/source/api/models/submodels/electrolyte_diffusion/full_diffusion.rst diff --git a/docs/source/models/submodels/electrolyte_diffusion/index.rst b/docs/source/api/models/submodels/electrolyte_diffusion/index.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_diffusion/index.rst rename to docs/source/api/models/submodels/electrolyte_diffusion/index.rst diff --git a/docs/source/models/submodels/electrolyte_diffusion/leading_order_diffusion.rst b/docs/source/api/models/submodels/electrolyte_diffusion/leading_order_diffusion.rst similarity index 100% rename from docs/source/models/submodels/electrolyte_diffusion/leading_order_diffusion.rst rename to docs/source/api/models/submodels/electrolyte_diffusion/leading_order_diffusion.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/index.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/index.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/index.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/index.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/ocv_element.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/ocv_element.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/ocv_element.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/ocv_element.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/rc_element.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/rc_element.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/rc_element.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/rc_element.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/resistor_element.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/resistor_element.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/resistor_element.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/resistor_element.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/thermal.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/thermal.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/thermal.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/thermal.rst diff --git a/docs/source/models/submodels/equivalent_circuit_elements/voltage_model.rst b/docs/source/api/models/submodels/equivalent_circuit_elements/voltage_model.rst similarity index 100% rename from docs/source/models/submodels/equivalent_circuit_elements/voltage_model.rst rename to docs/source/api/models/submodels/equivalent_circuit_elements/voltage_model.rst diff --git a/docs/source/models/submodels/external_circuit/explicit_control_external_circuit.rst b/docs/source/api/models/submodels/external_circuit/explicit_control_external_circuit.rst similarity index 100% rename from docs/source/models/submodels/external_circuit/explicit_control_external_circuit.rst rename to docs/source/api/models/submodels/external_circuit/explicit_control_external_circuit.rst diff --git a/docs/source/models/submodels/external_circuit/function_control_external_circuit.rst b/docs/source/api/models/submodels/external_circuit/function_control_external_circuit.rst similarity index 100% rename from docs/source/models/submodels/external_circuit/function_control_external_circuit.rst rename to docs/source/api/models/submodels/external_circuit/function_control_external_circuit.rst diff --git a/docs/source/models/submodels/external_circuit/index.rst b/docs/source/api/models/submodels/external_circuit/index.rst similarity index 100% rename from docs/source/models/submodels/external_circuit/index.rst rename to docs/source/api/models/submodels/external_circuit/index.rst diff --git a/docs/source/models/submodels/index.rst b/docs/source/api/models/submodels/index.rst similarity index 100% rename from docs/source/models/submodels/index.rst rename to docs/source/api/models/submodels/index.rst diff --git a/docs/source/models/submodels/interface/base_interface.rst b/docs/source/api/models/submodels/interface/base_interface.rst similarity index 100% rename from docs/source/models/submodels/interface/base_interface.rst rename to docs/source/api/models/submodels/interface/base_interface.rst diff --git a/docs/source/models/submodels/interface/diffusion_limited.rst b/docs/source/api/models/submodels/interface/diffusion_limited.rst similarity index 100% rename from docs/source/models/submodels/interface/diffusion_limited.rst rename to docs/source/api/models/submodels/interface/diffusion_limited.rst diff --git a/docs/source/models/submodels/interface/index.rst b/docs/source/api/models/submodels/interface/index.rst similarity index 100% rename from docs/source/models/submodels/interface/index.rst rename to docs/source/api/models/submodels/interface/index.rst diff --git a/docs/source/models/submodels/interface/inverse_butler_volmer.rst b/docs/source/api/models/submodels/interface/inverse_butler_volmer.rst similarity index 100% rename from docs/source/models/submodels/interface/inverse_butler_volmer.rst rename to docs/source/api/models/submodels/interface/inverse_butler_volmer.rst diff --git a/docs/source/models/submodels/interface/kinetics.rst b/docs/source/api/models/submodels/interface/kinetics.rst similarity index 100% rename from docs/source/models/submodels/interface/kinetics.rst rename to docs/source/api/models/submodels/interface/kinetics.rst diff --git a/docs/source/models/submodels/interface/open_circuit_potential.rst b/docs/source/api/models/submodels/interface/open_circuit_potential.rst similarity index 100% rename from docs/source/models/submodels/interface/open_circuit_potential.rst rename to docs/source/api/models/submodels/interface/open_circuit_potential.rst diff --git a/docs/source/models/submodels/interface/sei.rst b/docs/source/api/models/submodels/interface/sei.rst similarity index 100% rename from docs/source/models/submodels/interface/sei.rst rename to docs/source/api/models/submodels/interface/sei.rst diff --git a/docs/source/models/submodels/oxygen_diffusion/base_oxygen_diffusion.rst b/docs/source/api/models/submodels/oxygen_diffusion/base_oxygen_diffusion.rst similarity index 100% rename from docs/source/models/submodels/oxygen_diffusion/base_oxygen_diffusion.rst rename to docs/source/api/models/submodels/oxygen_diffusion/base_oxygen_diffusion.rst diff --git a/docs/source/models/submodels/oxygen_diffusion/full_oxygen_diffusion.rst b/docs/source/api/models/submodels/oxygen_diffusion/full_oxygen_diffusion.rst similarity index 100% rename from docs/source/models/submodels/oxygen_diffusion/full_oxygen_diffusion.rst rename to docs/source/api/models/submodels/oxygen_diffusion/full_oxygen_diffusion.rst diff --git a/docs/source/models/submodels/oxygen_diffusion/index.rst b/docs/source/api/models/submodels/oxygen_diffusion/index.rst similarity index 100% rename from docs/source/models/submodels/oxygen_diffusion/index.rst rename to docs/source/api/models/submodels/oxygen_diffusion/index.rst diff --git a/docs/source/models/submodels/oxygen_diffusion/leading_oxygen_diffusion.rst b/docs/source/api/models/submodels/oxygen_diffusion/leading_oxygen_diffusion.rst similarity index 100% rename from docs/source/models/submodels/oxygen_diffusion/leading_oxygen_diffusion.rst rename to docs/source/api/models/submodels/oxygen_diffusion/leading_oxygen_diffusion.rst diff --git a/docs/source/models/submodels/oxygen_diffusion/no_oxygen.rst b/docs/source/api/models/submodels/oxygen_diffusion/no_oxygen.rst similarity index 100% rename from docs/source/models/submodels/oxygen_diffusion/no_oxygen.rst rename to docs/source/api/models/submodels/oxygen_diffusion/no_oxygen.rst diff --git a/docs/source/models/submodels/particle/base_particle.rst b/docs/source/api/models/submodels/particle/base_particle.rst similarity index 100% rename from docs/source/models/submodels/particle/base_particle.rst rename to docs/source/api/models/submodels/particle/base_particle.rst diff --git a/docs/source/models/submodels/particle/fickian_diffusion.rst b/docs/source/api/models/submodels/particle/fickian_diffusion.rst similarity index 100% rename from docs/source/models/submodels/particle/fickian_diffusion.rst rename to docs/source/api/models/submodels/particle/fickian_diffusion.rst diff --git a/docs/source/models/submodels/particle/index.rst b/docs/source/api/models/submodels/particle/index.rst similarity index 100% rename from docs/source/models/submodels/particle/index.rst rename to docs/source/api/models/submodels/particle/index.rst diff --git a/docs/source/models/submodels/particle/polynomial_profile.rst b/docs/source/api/models/submodels/particle/polynomial_profile.rst similarity index 100% rename from docs/source/models/submodels/particle/polynomial_profile.rst rename to docs/source/api/models/submodels/particle/polynomial_profile.rst diff --git a/docs/source/models/submodels/particle/x_averaged_polynomial_profile.rst b/docs/source/api/models/submodels/particle/x_averaged_polynomial_profile.rst similarity index 100% rename from docs/source/models/submodels/particle/x_averaged_polynomial_profile.rst rename to docs/source/api/models/submodels/particle/x_averaged_polynomial_profile.rst diff --git a/docs/source/models/submodels/particle_mechanics/base_mechanics.rst b/docs/source/api/models/submodels/particle_mechanics/base_mechanics.rst similarity index 100% rename from docs/source/models/submodels/particle_mechanics/base_mechanics.rst rename to docs/source/api/models/submodels/particle_mechanics/base_mechanics.rst diff --git a/docs/source/models/submodels/particle_mechanics/crack_propagation.rst b/docs/source/api/models/submodels/particle_mechanics/crack_propagation.rst similarity index 100% rename from docs/source/models/submodels/particle_mechanics/crack_propagation.rst rename to docs/source/api/models/submodels/particle_mechanics/crack_propagation.rst diff --git a/docs/source/models/submodels/particle_mechanics/index.rst b/docs/source/api/models/submodels/particle_mechanics/index.rst similarity index 100% rename from docs/source/models/submodels/particle_mechanics/index.rst rename to docs/source/api/models/submodels/particle_mechanics/index.rst diff --git a/docs/source/models/submodels/particle_mechanics/swelling_only.rst b/docs/source/api/models/submodels/particle_mechanics/swelling_only.rst similarity index 100% rename from docs/source/models/submodels/particle_mechanics/swelling_only.rst rename to docs/source/api/models/submodels/particle_mechanics/swelling_only.rst diff --git a/docs/source/models/submodels/porosity/base_porosity.rst b/docs/source/api/models/submodels/porosity/base_porosity.rst similarity index 100% rename from docs/source/models/submodels/porosity/base_porosity.rst rename to docs/source/api/models/submodels/porosity/base_porosity.rst diff --git a/docs/source/models/submodels/porosity/constant_porosity.rst b/docs/source/api/models/submodels/porosity/constant_porosity.rst similarity index 100% rename from docs/source/models/submodels/porosity/constant_porosity.rst rename to docs/source/api/models/submodels/porosity/constant_porosity.rst diff --git a/docs/source/models/submodels/porosity/index.rst b/docs/source/api/models/submodels/porosity/index.rst similarity index 100% rename from docs/source/models/submodels/porosity/index.rst rename to docs/source/api/models/submodels/porosity/index.rst diff --git a/docs/source/models/submodels/porosity/reaction_driven_porosity.rst b/docs/source/api/models/submodels/porosity/reaction_driven_porosity.rst similarity index 100% rename from docs/source/models/submodels/porosity/reaction_driven_porosity.rst rename to docs/source/api/models/submodels/porosity/reaction_driven_porosity.rst diff --git a/docs/source/models/submodels/porosity/reaction_driven_porosity_ode.rst b/docs/source/api/models/submodels/porosity/reaction_driven_porosity_ode.rst similarity index 100% rename from docs/source/models/submodels/porosity/reaction_driven_porosity_ode.rst rename to docs/source/api/models/submodels/porosity/reaction_driven_porosity_ode.rst diff --git a/docs/source/models/submodels/thermal/base_thermal.rst b/docs/source/api/models/submodels/thermal/base_thermal.rst similarity index 100% rename from docs/source/models/submodels/thermal/base_thermal.rst rename to docs/source/api/models/submodels/thermal/base_thermal.rst diff --git a/docs/source/models/submodels/thermal/index.rst b/docs/source/api/models/submodels/thermal/index.rst similarity index 100% rename from docs/source/models/submodels/thermal/index.rst rename to docs/source/api/models/submodels/thermal/index.rst diff --git a/docs/source/models/submodels/thermal/isothermal.rst b/docs/source/api/models/submodels/thermal/isothermal.rst similarity index 100% rename from docs/source/models/submodels/thermal/isothermal.rst rename to docs/source/api/models/submodels/thermal/isothermal.rst diff --git a/docs/source/models/submodels/thermal/lumped.rst b/docs/source/api/models/submodels/thermal/lumped.rst similarity index 100% rename from docs/source/models/submodels/thermal/lumped.rst rename to docs/source/api/models/submodels/thermal/lumped.rst diff --git a/docs/source/models/submodels/thermal/pouch_cell/index.rst b/docs/source/api/models/submodels/thermal/pouch_cell/index.rst similarity index 100% rename from docs/source/models/submodels/thermal/pouch_cell/index.rst rename to docs/source/api/models/submodels/thermal/pouch_cell/index.rst diff --git a/docs/source/models/submodels/thermal/pouch_cell/pouch_cell_1D_current_collectors.rst b/docs/source/api/models/submodels/thermal/pouch_cell/pouch_cell_1D_current_collectors.rst similarity index 100% rename from docs/source/models/submodels/thermal/pouch_cell/pouch_cell_1D_current_collectors.rst rename to docs/source/api/models/submodels/thermal/pouch_cell/pouch_cell_1D_current_collectors.rst diff --git a/docs/source/models/submodels/thermal/pouch_cell/pouch_cell_2D_current_collectors.rst b/docs/source/api/models/submodels/thermal/pouch_cell/pouch_cell_2D_current_collectors.rst similarity index 100% rename from docs/source/models/submodels/thermal/pouch_cell/pouch_cell_2D_current_collectors.rst rename to docs/source/api/models/submodels/thermal/pouch_cell/pouch_cell_2D_current_collectors.rst diff --git a/docs/source/models/submodels/thermal/x_full.rst b/docs/source/api/models/submodels/thermal/x_full.rst similarity index 100% rename from docs/source/models/submodels/thermal/x_full.rst rename to docs/source/api/models/submodels/thermal/x_full.rst diff --git a/docs/source/models/submodels/transport_efficiency/base_transport_efficiency.rst b/docs/source/api/models/submodels/transport_efficiency/base_transport_efficiency.rst similarity index 100% rename from docs/source/models/submodels/transport_efficiency/base_transport_efficiency.rst rename to docs/source/api/models/submodels/transport_efficiency/base_transport_efficiency.rst diff --git a/docs/source/models/submodels/transport_efficiency/bruggeman_transport_efficiency.rst b/docs/source/api/models/submodels/transport_efficiency/bruggeman_transport_efficiency.rst similarity index 100% rename from docs/source/models/submodels/transport_efficiency/bruggeman_transport_efficiency.rst rename to docs/source/api/models/submodels/transport_efficiency/bruggeman_transport_efficiency.rst diff --git a/docs/source/models/submodels/transport_efficiency/index.rst b/docs/source/api/models/submodels/transport_efficiency/index.rst similarity index 100% rename from docs/source/models/submodels/transport_efficiency/index.rst rename to docs/source/api/models/submodels/transport_efficiency/index.rst diff --git a/docs/source/parameters/electrical_parameters.rst b/docs/source/api/parameters/electrical_parameters.rst similarity index 100% rename from docs/source/parameters/electrical_parameters.rst rename to docs/source/api/parameters/electrical_parameters.rst diff --git a/docs/source/parameters/geometric_parameters.rst b/docs/source/api/parameters/geometric_parameters.rst similarity index 100% rename from docs/source/parameters/geometric_parameters.rst rename to docs/source/api/parameters/geometric_parameters.rst diff --git a/docs/source/parameters/index.rst b/docs/source/api/parameters/index.rst similarity index 100% rename from docs/source/parameters/index.rst rename to docs/source/api/parameters/index.rst diff --git a/docs/source/parameters/lead_acid_parameters.rst b/docs/source/api/parameters/lead_acid_parameters.rst similarity index 100% rename from docs/source/parameters/lead_acid_parameters.rst rename to docs/source/api/parameters/lead_acid_parameters.rst diff --git a/docs/source/parameters/lithium_ion_parameters.rst b/docs/source/api/parameters/lithium_ion_parameters.rst similarity index 100% rename from docs/source/parameters/lithium_ion_parameters.rst rename to docs/source/api/parameters/lithium_ion_parameters.rst diff --git a/docs/source/parameters/parameter_sets.rst b/docs/source/api/parameters/parameter_sets.rst similarity index 84% rename from docs/source/parameters/parameter_sets.rst rename to docs/source/api/parameters/parameter_sets.rst index 0fa047f97d..219506bf1a 100644 --- a/docs/source/parameters/parameter_sets.rst +++ b/docs/source/api/parameters/parameter_sets.rst @@ -83,20 +83,19 @@ PyBaMM provides pre-defined parameter sets for several common chemistries, listed below. See :ref:`adding-parameter-sets` for information on registering new parameter sets with PyBaMM. -.. Lead-acid Parameter Sets -.. ======================== - -.. {% for k,v in parameter_sets.items() if v.chemistry == "lead_acid" %} -.. {{k}} -.. ---------------------------- -.. {{ parameter_sets.get_docstring(k) | safe }} -.. {% endfor %} - -.. Lithium-ion Parameter Sets -.. ========================== -.. {% for k,v in parameter_sets.items() if v.chemistry == "lithium_ion" %} -.. {{k}} -.. ---------------------------- -.. {{ parameter_sets.get_docstring(k) }} -.. {% endfor %} - +Lead-acid Parameter Sets +======================== + +{% for k,v in parameter_sets.items() if v.chemistry == "lead_acid" %} +{{k}} +---------------------------- +{{ parameter_sets.get_docstring(k) | safe }} +{% endfor %} + +Lithium-ion Parameter Sets +========================== +{% for k,v in parameter_sets.items() if v.chemistry == "lithium_ion" %} +{{k}} +---------------------------- +{{ parameter_sets.get_docstring(k) }} +{% endfor %} diff --git a/docs/source/parameters/parameter_values.rst b/docs/source/api/parameters/parameter_values.rst similarity index 100% rename from docs/source/parameters/parameter_values.rst rename to docs/source/api/parameters/parameter_values.rst diff --git a/docs/source/parameters/process_parameter_data.rst b/docs/source/api/parameters/process_parameter_data.rst similarity index 100% rename from docs/source/parameters/process_parameter_data.rst rename to docs/source/api/parameters/process_parameter_data.rst diff --git a/docs/source/parameters/thermal_parameters.rst b/docs/source/api/parameters/thermal_parameters.rst similarity index 100% rename from docs/source/parameters/thermal_parameters.rst rename to docs/source/api/parameters/thermal_parameters.rst diff --git a/docs/source/plotting/dynamic_plot.rst b/docs/source/api/plotting/dynamic_plot.rst similarity index 100% rename from docs/source/plotting/dynamic_plot.rst rename to docs/source/api/plotting/dynamic_plot.rst diff --git a/docs/source/plotting/index.rst b/docs/source/api/plotting/index.rst similarity index 100% rename from docs/source/plotting/index.rst rename to docs/source/api/plotting/index.rst diff --git a/docs/source/plotting/plot.rst b/docs/source/api/plotting/plot.rst similarity index 100% rename from docs/source/plotting/plot.rst rename to docs/source/api/plotting/plot.rst diff --git a/docs/source/plotting/plot_2D.rst b/docs/source/api/plotting/plot_2D.rst similarity index 100% rename from docs/source/plotting/plot_2D.rst rename to docs/source/api/plotting/plot_2D.rst diff --git a/docs/source/plotting/plot_summary_variables.rst b/docs/source/api/plotting/plot_summary_variables.rst similarity index 100% rename from docs/source/plotting/plot_summary_variables.rst rename to docs/source/api/plotting/plot_summary_variables.rst diff --git a/docs/source/plotting/plot_voltage_components.rst b/docs/source/api/plotting/plot_voltage_components.rst similarity index 100% rename from docs/source/plotting/plot_voltage_components.rst rename to docs/source/api/plotting/plot_voltage_components.rst diff --git a/docs/source/plotting/quick_plot.rst b/docs/source/api/plotting/quick_plot.rst similarity index 100% rename from docs/source/plotting/quick_plot.rst rename to docs/source/api/plotting/quick_plot.rst diff --git a/docs/source/simulation.rst b/docs/source/api/simulation.rst similarity index 100% rename from docs/source/simulation.rst rename to docs/source/api/simulation.rst diff --git a/docs/source/solvers/algebraic_solvers.rst b/docs/source/api/solvers/algebraic_solvers.rst similarity index 100% rename from docs/source/solvers/algebraic_solvers.rst rename to docs/source/api/solvers/algebraic_solvers.rst diff --git a/docs/source/solvers/base_solver.rst b/docs/source/api/solvers/base_solver.rst similarity index 100% rename from docs/source/solvers/base_solver.rst rename to docs/source/api/solvers/base_solver.rst diff --git a/docs/source/solvers/casadi_solver.rst b/docs/source/api/solvers/casadi_solver.rst similarity index 100% rename from docs/source/solvers/casadi_solver.rst rename to docs/source/api/solvers/casadi_solver.rst diff --git a/docs/source/solvers/dummy_solver.rst b/docs/source/api/solvers/dummy_solver.rst similarity index 100% rename from docs/source/solvers/dummy_solver.rst rename to docs/source/api/solvers/dummy_solver.rst diff --git a/docs/source/solvers/idaklu_solver.rst b/docs/source/api/solvers/idaklu_solver.rst similarity index 100% rename from docs/source/solvers/idaklu_solver.rst rename to docs/source/api/solvers/idaklu_solver.rst diff --git a/docs/source/solvers/index.rst b/docs/source/api/solvers/index.rst similarity index 100% rename from docs/source/solvers/index.rst rename to docs/source/api/solvers/index.rst diff --git a/docs/source/solvers/jax_solver.rst b/docs/source/api/solvers/jax_solver.rst similarity index 100% rename from docs/source/solvers/jax_solver.rst rename to docs/source/api/solvers/jax_solver.rst diff --git a/docs/source/solvers/processed_variable.rst b/docs/source/api/solvers/processed_variable.rst similarity index 100% rename from docs/source/solvers/processed_variable.rst rename to docs/source/api/solvers/processed_variable.rst diff --git a/docs/source/solvers/scikits_solvers.rst b/docs/source/api/solvers/scikits_solvers.rst similarity index 100% rename from docs/source/solvers/scikits_solvers.rst rename to docs/source/api/solvers/scikits_solvers.rst diff --git a/docs/source/solvers/scipy_solver.rst b/docs/source/api/solvers/scipy_solver.rst similarity index 100% rename from docs/source/solvers/scipy_solver.rst rename to docs/source/api/solvers/scipy_solver.rst diff --git a/docs/source/solvers/solution.rst b/docs/source/api/solvers/solution.rst similarity index 100% rename from docs/source/solvers/solution.rst rename to docs/source/api/solvers/solution.rst diff --git a/docs/source/spatial_methods/discretisation.rst b/docs/source/api/spatial_methods/discretisation.rst similarity index 100% rename from docs/source/spatial_methods/discretisation.rst rename to docs/source/api/spatial_methods/discretisation.rst diff --git a/docs/source/spatial_methods/finite_volume.rst b/docs/source/api/spatial_methods/finite_volume.rst similarity index 100% rename from docs/source/spatial_methods/finite_volume.rst rename to docs/source/api/spatial_methods/finite_volume.rst diff --git a/docs/source/spatial_methods/index.rst b/docs/source/api/spatial_methods/index.rst similarity index 100% rename from docs/source/spatial_methods/index.rst rename to docs/source/api/spatial_methods/index.rst diff --git a/docs/source/spatial_methods/scikit_finite_element.rst b/docs/source/api/spatial_methods/scikit_finite_element.rst similarity index 100% rename from docs/source/spatial_methods/scikit_finite_element.rst rename to docs/source/api/spatial_methods/scikit_finite_element.rst diff --git a/docs/source/spatial_methods/spatial_method.rst b/docs/source/api/spatial_methods/spatial_method.rst similarity index 100% rename from docs/source/spatial_methods/spatial_method.rst rename to docs/source/api/spatial_methods/spatial_method.rst diff --git a/docs/source/spatial_methods/spectral_volume.rst b/docs/source/api/spatial_methods/spectral_volume.rst similarity index 100% rename from docs/source/spatial_methods/spectral_volume.rst rename to docs/source/api/spatial_methods/spectral_volume.rst diff --git a/docs/source/spatial_methods/zero_dimensional_method.rst b/docs/source/api/spatial_methods/zero_dimensional_method.rst similarity index 100% rename from docs/source/spatial_methods/zero_dimensional_method.rst rename to docs/source/api/spatial_methods/zero_dimensional_method.rst diff --git a/docs/source/util.rst b/docs/source/api/util.rst similarity index 100% rename from docs/source/util.rst rename to docs/source/api/util.rst diff --git a/docs/source/user_guide/fundamentals/index.rst b/docs/source/user_guide/fundamentals/index.rst new file mode 100644 index 0000000000..4463f9b1a8 --- /dev/null +++ b/docs/source/user_guide/fundamentals/index.rst @@ -0,0 +1,53 @@ +Fundamentals +============ + +PyBaMM (Python Battery Mathematical Modelling) is an open-source battery simulation package +written in Python. Our mission is to accelerate battery modelling research by +providing open-source tools for multi-institutional, interdisciplinary collaboration. +Broadly, PyBaMM consists of +(i) a framework for writing and solving systems +of differential equations, +(ii) a library of battery models and parameters, and +(iii) specialized tools for simulating battery-specific experiments and visualizing the results. +Together, these enable flexible model definitions and fast battery simulations, allowing users to +explore the effect of different battery designs and modeling assumptions under a variety of operating scenarios. + +.. note:: + This user-guide is a work-in-progress, we hope it is helpful in this state but it is definitely incomplete and may contain inaccuracies. + +Core framework +~~~~~~~~~~~~~~ +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] example gives an introduction to the computer algebra system, and the [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 (e.g. using the [finite volume] discretisation). 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). [Solver examples]. + +Model and Parameter Library +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +PyBaMM contains an extensive library of battery models and parameters. +The bulk of the library consists of models for lithium-ion, but there are also some other chemistries (lead-acid, lithium metal). +Models are first divided broadly into common named models of varying complexity, such as the `single particle model` (SPM) or `Doyle-Fuller-Newman` model (DFN). +For each model, . Most options can be applied to any model, but some are model-specific (an error will be raised if you attempt to set an option is not compatible with a model). +See ... for a list of options. + +The parameter library is simply a collection of python files each defining a complete set of parameters +for a particular battery chemistry, covering all major lithium-ion chemistries (NMC, LFP, NCA, ...). +External parameter sets can be linked using [entry points](). + +Battery-specific tools +~~~~~~~~~~~~~~~~~~~~~~ +One of PyBaMM's unique features is the `Experiment` class, which allows users to define synthetic experiments using simple English +.. code-block:: + pybamm.Experiment() + + +The `Simulation` class handles simulating an `Experiment`, as well as calculating additional outputs such as capacity as a function of cycle number. + +Finally, PyBaMM provides cusotm visualization tools: +- The `QuickPlot` class, for easily plotting simulation outputs in a grid, including comparing multiple simulations +- The `plot_voltage_components` function, for plotting the component overpotentials that make up a voltage curve + +Users are not limited to these tools and can plot the output of a simulation solution by accessing variables as `solution["variable name"].data` and using plotting libraries of their choice. \ No newline at end of file diff --git a/docs/source/user_guide/getting_started.rst b/docs/source/user_guide/getting_started.rst new file mode 100644 index 0000000000..ee50bbe7df --- /dev/null +++ b/docs/source/user_guide/getting_started.rst @@ -0,0 +1,42 @@ +Getting Started +=============== + +The easiest way to use PyBaMM is to run a 1C constant-current discharge with a model of your choice with all the default settings: + +.. code-block:: python + + import pybamm + model = pybamm.lithium_ion.DFN() # Doyle-Fuller-Newman model + sim = pybamm.Simulation(model) + sim.solve([0, 3600]) # solve for 1 hour + sim.plot() + +or simulate an experiment such as a constant-current discharge followed by a constant-current-constant-voltage charge: + +.. code-block:: python + + import pybamm + experiment = pybamm.Experiment( + [ + ("Discharge at C/10 for 10 hours or until 3.3 V", + "Rest for 1 hour", + "Charge at 1 A until 4.1 V", + "Hold at 4.1 V until 50 mA", + "Rest for 1 hour") + ] + * 3, + ) + model = pybamm.lithium_ion.DFN() + sim = pybamm.Simulation(model, experiment=experiment, solver=pybamm.CasadiSolver()) + 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)). + +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). + +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](http://pybamm.readthedocs.io/), +hosted on [Read The Docs](https://readthedocs.org/). +Additional supporting material can be found +[here](https://github.com/pybamm-team/pybamm-supporting-material/). \ No newline at end of file diff --git a/docs/source/user_guide/index.rst b/docs/source/user_guide/index.rst new file mode 100644 index 0000000000..ebf661e9ae --- /dev/null +++ b/docs/source/user_guide/index.rst @@ -0,0 +1,21 @@ +.. _user: + +################# +PyBaMM user guide +################# + +This guide is an overview and explains the important features; +details are found in :ref:`api_docs`. + +.. toctree:: + :caption: Getting started + :maxdepth: 1 + + installation/index + getting_started + +.. toctree:: + :caption: Fundamentals and usage + :maxdepth: 2 + + fundamentals/index diff --git a/docs/install/GNU-linux.rst b/docs/source/user_guide/installation/GNU-linux.rst similarity index 100% rename from docs/install/GNU-linux.rst rename to docs/source/user_guide/installation/GNU-linux.rst diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst new file mode 100644 index 0000000000..5351760181 --- /dev/null +++ b/docs/source/user_guide/installation/index.rst @@ -0,0 +1,86 @@ +Installation +============ + +PyBaMM is available on GNU/Linux, MacOS and Windows. +.. grid-item-card:: + :column: col-lg-6 col-md-6 col-sm-12 col-xs-12 p-3 + + Working with conda? + ^^^^^^^^^^^^^^^^^^^ + + PyBaMM is part of the `Anaconda `__ + distribution and is available as a conda package through the conda-forge channel. + + ++++++++++++++++++++++ + + .. code-block:: bash + + conda install -c conda-forge pybamm + + .. grid-item-card:: + + Prefer pip? + ^^^^^^^^^^^ + + PyBaMM can be installed via pip from `PyPI `__. + + ++++ + + .. code-block:: bash + + pip install pybamm + + .. grid-item-card:: + :column: col-12 p-3 + + In-depth instructions? + ^^^^^^^^^^^^^^^^^^^^^^ + Installing a specific version? Installing from source? Check the advanced + installation page. + + .. button-ref:: installation/index + :classes: btn-secondary stretched-link + :expand: + :color: secondary + :click-parent: + + To detailed installation guide +Using pip +---------- + +GNU/Linux and Windows +~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + pip install pybamm + +macOS +~~~~~ + +.. code:: bash + + brew install sundials && pip install pybamm + +Using conda +----------- +PyBaMM is available as a conda package through the conda-forge channel. + +.. code:: bash + + conda install -c conda-forge pybamm + +Optional solvers +---------------- +Following GNU/Linux and macOS solvers are optionally available: + +* `scikits.odes `_ -based solver, see `Optional - scikits.odes solver `_. +* `jax `_ -based solver, see `Optional - JaxSolver `_. + +.. toctree:: + :maxdepth: 1 + + GNU-linux + windows + windows-wsl + install-from-source \ No newline at end of file diff --git a/docs/install/install-from-source.rst b/docs/source/user_guide/installation/install-from-source.rst similarity index 100% rename from docs/install/install-from-source.rst rename to docs/source/user_guide/installation/install-from-source.rst diff --git a/docs/install/windows-wsl.rst b/docs/source/user_guide/installation/windows-wsl.rst similarity index 100% rename from docs/install/windows-wsl.rst rename to docs/source/user_guide/installation/windows-wsl.rst diff --git a/docs/install/windows.rst b/docs/source/user_guide/installation/windows.rst similarity index 100% rename from docs/install/windows.rst rename to docs/source/user_guide/installation/windows.rst diff --git a/docs/source/user_guide/todo.md b/docs/source/user_guide/todo.md new file mode 100644 index 0000000000..dc16b3d010 --- /dev/null +++ b/docs/source/user_guide/todo.md @@ -0,0 +1,14 @@ +Fundamentals + +- More details on each section including code examples + +Creating a project using PyBaMM + +- Setup +- Basic use +- Creating your own model + - Your own model + - Making it compatible with experiments + - Extending the existing models (adding submodels) +- Adding your own parameter sets +- Contributing diff --git a/examples/notebooks/README.md b/examples/notebooks/README.md index 7cc0e5ffd2..8b52c47c74 100644 --- a/examples/notebooks/README.md +++ b/examples/notebooks/README.md @@ -65,7 +65,6 @@ Once you are comfortable with the expression tree structure, a good starting poi - [Full porous-electrode](https://pybamm.readthedocs.io/en/latest/source/models/lead_acid/full.html) - [Leading-Order Quasi-Static](https://pybamm.readthedocs.io/en/latest/source/models/lead_acid/loqs.html) -- [Higher-Order](https://pybamm.readthedocs.io/en/latest/source/models/lead_acid/higher_order.html) ### Spatial Methods diff --git a/pybamm/models/submodels/electrode/ohm/li_metal.py b/pybamm/models/submodels/electrode/ohm/li_metal.py index 9f6b7501ef..f97b37fea0 100644 --- a/pybamm/models/submodels/electrode/ohm/li_metal.py +++ b/pybamm/models/submodels/electrode/ohm/li_metal.py @@ -122,7 +122,7 @@ class LithiumMetalExplicit(LithiumMetalBaseModel): Parameters ---------- - param : parameteslackr class + param : parameter class The parameters to use for this submodel options : dict, optional A dictionary of options to be passed to the model. diff --git a/setup.py b/setup.py index 0284e9fc0b..a0e25d8593 100644 --- a/setup.py +++ b/setup.py @@ -208,7 +208,11 @@ def compile_KLU(): "matplotlib>=2.0", ], extras_require={ - "docs": ["sphinx>=1.5", "pydata-sphinx-theme"], # For doc generation + "docs": [ + "sphinx>=1.5", + "pydata-sphinx-theme", + "sphinx_design", + ], # For doc generation "dev": [ "flake8>=3", # For code style checking "black", # For code style auto-formatting From 4ba1600b6ded86665c3f909f78c1f59524e3e216 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 25 Jan 2023 23:13:11 -0500 Subject: [PATCH 3/9] clean up user guide --- .../models/base_models/base_battery_model.rst | 2 + docs/source/api/parameters/parameter_sets.rst | 2 + docs/source/api/plotting/dynamic_plot.rst | 4 -- docs/source/api/plotting/index.rst | 1 - .../api/plotting/plot_voltage_components.rst | 2 + docs/source/api/plotting/quick_plot.rst | 4 ++ docs/source/user_guide/fundamentals/index.rst | 58 ++++++++++++++----- docs/source/user_guide/getting_started.rst | 11 ++-- docs/source/user_guide/installation/index.rst | 54 ++++------------- 9 files changed, 70 insertions(+), 68 deletions(-) delete mode 100644 docs/source/api/plotting/dynamic_plot.rst diff --git a/docs/source/api/models/base_models/base_battery_model.rst b/docs/source/api/models/base_models/base_battery_model.rst index 45f0eb6a3e..64715ae5d4 100644 --- a/docs/source/api/models/base_models/base_battery_model.rst +++ b/docs/source/api/models/base_models/base_battery_model.rst @@ -1,3 +1,5 @@ +.. _base_battery_model: + Base Battery Model ================== diff --git a/docs/source/api/parameters/parameter_sets.rst b/docs/source/api/parameters/parameter_sets.rst index 219506bf1a..97da4d272e 100644 --- a/docs/source/api/parameters/parameter_sets.rst +++ b/docs/source/api/parameters/parameter_sets.rst @@ -1,5 +1,7 @@ :tocdepth: 3 +.. _parameter_sets: + =============== Parameters Sets =============== diff --git a/docs/source/api/plotting/dynamic_plot.rst b/docs/source/api/plotting/dynamic_plot.rst deleted file mode 100644 index b363ab2222..0000000000 --- a/docs/source/api/plotting/dynamic_plot.rst +++ /dev/null @@ -1,4 +0,0 @@ -Dynamic Plot -============ - -.. autofunction:: pybamm.dynamic_plot diff --git a/docs/source/api/plotting/index.rst b/docs/source/api/plotting/index.rst index 52852d02f6..088823c64c 100644 --- a/docs/source/api/plotting/index.rst +++ b/docs/source/api/plotting/index.rst @@ -4,7 +4,6 @@ Plotting .. toctree:: quick_plot - dynamic_plot plot plot_2D plot_voltage_components diff --git a/docs/source/api/plotting/plot_voltage_components.rst b/docs/source/api/plotting/plot_voltage_components.rst index 5ba712630d..04d95e62cc 100644 --- a/docs/source/api/plotting/plot_voltage_components.rst +++ b/docs/source/api/plotting/plot_voltage_components.rst @@ -1,3 +1,5 @@ +.. _plot_voltage_components: + Plot Voltage Components ======================= diff --git a/docs/source/api/plotting/quick_plot.rst b/docs/source/api/plotting/quick_plot.rst index b26903ba14..ef81719056 100644 --- a/docs/source/api/plotting/quick_plot.rst +++ b/docs/source/api/plotting/quick_plot.rst @@ -1,5 +1,9 @@ +.. _quick_plot: + Quick Plot ========== .. autoclass:: pybamm.QuickPlot :members: + +.. autofunction:: pybamm.dynamic_plot \ No newline at end of file diff --git a/docs/source/user_guide/fundamentals/index.rst b/docs/source/user_guide/fundamentals/index.rst index 4463f9b1a8..fe843b80ba 100644 --- a/docs/source/user_guide/fundamentals/index.rst +++ b/docs/source/user_guide/fundamentals/index.rst @@ -13,41 +13,71 @@ Together, these enable flexible model definitions and fast battery simulations, explore the effect of different battery designs and modeling assumptions under a variety of operating scenarios. .. note:: - This user-guide is a work-in-progress, we hope it is helpful in this state but it is definitely incomplete and may contain inaccuracies. + This user-guide is a work-in-progress, we hope that this brief but incomplete overview will be useful to you. Core framework ~~~~~~~~~~~~~~ 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] example gives an introduction to the computer algebra system, and the [Getting Started] tutorials +The `expression tree `_ example gives an introduction to the computer algebra system, and the `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 (e.g. using the [finite volume] discretisation). 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). [Solver examples]. +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 `_. Model and Parameter Library ~~~~~~~~~~~~~~~~~~~~~~~~~~~ PyBaMM contains an extensive library of battery models and parameters. The bulk of the library consists of models for lithium-ion, but there are also some other chemistries (lead-acid, lithium metal). -Models are first divided broadly into common named models of varying complexity, such as the `single particle model` (SPM) or `Doyle-Fuller-Newman` model (DFN). -For each model, . Most options can be applied to any model, but some are model-specific (an error will be raised if you attempt to set an option is not compatible with a model). -See ... for a list of options. +Models are first divided broadly into common named models of varying complexity, such as the single particle model` (SPM) or Doyle-Fuller-Newman model (DFN). +Most options can be applied to any model, but some are model-specific (an error will be raised if you attempt to set an option is not compatible with a model). +See :ref:`base_battery_model` for a list of options. The parameter library is simply a collection of python files each defining a complete set of parameters for a particular battery chemistry, covering all major lithium-ion chemistries (NMC, LFP, NCA, ...). -External parameter sets can be linked using [entry points](). +External parameter sets can be linked using entry points (see :ref:`parameter_sets`). Battery-specific tools ~~~~~~~~~~~~~~~~~~~~~~ -One of PyBaMM's unique features is the `Experiment` class, which allows users to define synthetic experiments using simple English -.. code-block:: - pybamm.Experiment() +One of PyBaMM's unique features is the `Experiment` class, which allows users to define synthetic experiments using simple instructions in English +.. code-block::python -The `Simulation` class handles simulating an `Experiment`, as well as calculating additional outputs such as capacity as a function of cycle number. + pybamm.Experiment( + [ + ("Discharge at C/10 for 10 hours or until 3.3 V", + "Rest for 1 hour", + "Charge at 1 A until 4.1 V", + "Hold at 4.1 V until 50 mA", + "Rest for 1 hour") + ] + * 3, + ) + +The above instruction will conduct a standard discharge / rest / charge / rest cycle three times, with a 10 hour discharge and 1 hour rest at the end of each cycle. + +The `Simulation` class handles simulating an `Experiment`, as well as calculating additional outputs such as capacity as a function of cycle number. For example, the following code will simulate the experiment above and plot the standard output variables: + +.. code-block::python + + import pybamm + import matplotlib.pyplot as plt + + # load model and parameter values + model = pybamm.lithium_ion.DFN() + sim = pybamm.Simulation(model, experiment=experiment) + solution = sim.solve() + solution.plot() Finally, PyBaMM provides cusotm visualization tools: -- The `QuickPlot` class, for easily plotting simulation outputs in a grid, including comparing multiple simulations -- The `plot_voltage_components` function, for plotting the component overpotentials that make up a voltage curve -Users are not limited to these tools and can plot the output of a simulation solution by accessing variables as `solution["variable name"].data` and using plotting libraries of their choice. \ No newline at end of file +* :ref:`quick_plot`: for easily plotting simulation outputs in a grid, including comparing multiple simulations +* :ref:`plot_voltage_components`: for plotting the component overpotentials that make up a voltage curve + +Users are not limited to these tools and can plot the output of a simulation solution by accessing the underlying numpy array for the solution variables as + +.. code-block::python + + solution["variable name"].data + +and using the plotting library of their choice. \ No newline at end of file diff --git a/docs/source/user_guide/getting_started.rst b/docs/source/user_guide/getting_started.rst index ee50bbe7df..4753ce9a34 100644 --- a/docs/source/user_guide/getting_started.rst +++ b/docs/source/user_guide/getting_started.rst @@ -31,12 +31,11 @@ or simulate an experiment such as a constant-current discharge followed by a con 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 `_ or `notebook `_). -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 `_ 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 `_. -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](http://pybamm.readthedocs.io/), -hosted on [Read The Docs](https://readthedocs.org/). +Further details can be found in a number of `detailed examples `_, hosted on +GitHub. In addition, full details of classes and methods can be found in the :ref:`api_docs`. Additional supporting material can be found -[here](https://github.com/pybamm-team/pybamm-supporting-material/). \ No newline at end of file +`here `_. \ No newline at end of file diff --git a/docs/source/user_guide/installation/index.rst b/docs/source/user_guide/installation/index.rst index 5351760181..3c03521cca 100644 --- a/docs/source/user_guide/installation/index.rst +++ b/docs/source/user_guide/installation/index.rst @@ -2,52 +2,13 @@ Installation ============ PyBaMM is available on GNU/Linux, MacOS and Windows. -.. grid-item-card:: - :column: col-lg-6 col-md-6 col-sm-12 col-xs-12 p-3 +It can be installed using pip or conda, or from source. - Working with conda? - ^^^^^^^^^^^^^^^^^^^ - - PyBaMM is part of the `Anaconda `__ - distribution and is available as a conda package through the conda-forge channel. - - ++++++++++++++++++++++ - - .. code-block:: bash - - conda install -c conda-forge pybamm - - .. grid-item-card:: - - Prefer pip? - ^^^^^^^^^^^ - - PyBaMM can be installed via pip from `PyPI `__. - - ++++ - - .. code-block:: bash - - pip install pybamm - - .. grid-item-card:: - :column: col-12 p-3 - - In-depth instructions? - ^^^^^^^^^^^^^^^^^^^^^^ - Installing a specific version? Installing from source? Check the advanced - installation page. - - .. button-ref:: installation/index - :classes: btn-secondary stretched-link - :expand: - :color: secondary - :click-parent: - - To detailed installation guide Using pip ---------- +PyBaMM can be installed via pip from `PyPI `__ + GNU/Linux and Windows ~~~~~~~~~~~~~~~~~~~~~ @@ -64,7 +25,8 @@ macOS Using conda ----------- -PyBaMM is available as a conda package through the conda-forge channel. + +PyBaMM is part of the `Anaconda `_ distribution and is available as a conda package through the conda-forge channel .. code:: bash @@ -72,11 +34,17 @@ PyBaMM is available as a conda package through the conda-forge channel. Optional solvers ---------------- + Following GNU/Linux and macOS solvers are optionally available: * `scikits.odes `_ -based solver, see `Optional - scikits.odes solver `_. * `jax `_ -based solver, see `Optional - JaxSolver `_. +Full installation guide +----------------------- + +Installing a specific version? Installing from source? Check the advanced installation pages below + .. toctree:: :maxdepth: 1 From 4a037171343603aafb764e022ba216764a823796 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 04:16:37 +0000 Subject: [PATCH 4/9] style: pre-commit fixes --- docs/source/_static/pybamm.css | 124 +++++++++++++++++---------------- 1 file changed, 64 insertions(+), 60 deletions(-) diff --git a/docs/source/_static/pybamm.css b/docs/source/_static/pybamm.css index ffe3d948d9..39f202a6f6 100644 --- a/docs/source/_static/pybamm.css +++ b/docs/source/_static/pybamm.css @@ -1,39 +1,39 @@ -@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Open+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Open+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap"); .navbar-brand img { - height: 50px; + height: 50px; } .navbar-brand { - height: 50px; + height: 50px; } body { - font-family: 'Open Sans', sans-serif; + font-family: "Open Sans", sans-serif; } pre, code { - font-size: 100%; - line-height: 155%; + font-size: 100%; + line-height: 155%; } h1 { - font-family: "Lato", sans-serif; - color: #013243; - /* warm black */ + font-family: "Lato", sans-serif; + color: #013243; + /* warm black */ } h2 { - color: #4d77cf; - /* han blue */ - letter-spacing: -.03em; + color: #4d77cf; + /* han blue */ + letter-spacing: -0.03em; } h3 { - color: #013243; - /* warm black */ - letter-spacing: -.03em; + color: #013243; + /* warm black */ + letter-spacing: -0.03em; } /* Style the active version button. @@ -50,94 +50,98 @@ Nat Methods 8, 441 (2011). https://doi.org/10.1038/nmeth.1618 /* If the active version has the name "dev", style it orange */ #version_switcher_button[data-active-version-name*="dev"] { - background-color: #E69F00; - border-color: #E69F00; - color: #000000; + background-color: #e69f00; + border-color: #e69f00; + color: #000000; } /* green for `stable` */ #version_switcher_button[data-active-version-name*="stable"] { - background-color: #009E73; - border-color: #009E73; + background-color: #009e73; + border-color: #009e73; } /* red for `old` */ -#version_switcher_button:not([data-active-version-name*="stable"], [data-active-version-name*="dev"], [data-active-version-name=""]) { - background-color: #980F0F; - border-color: #980F0F; +#version_switcher_button:not( + [data-active-version-name*="stable"], + [data-active-version-name*="dev"], + [data-active-version-name=""] + ) { + background-color: #980f0f; + border-color: #980f0f; } /* Main page overview cards */ .sd-card { - background: #fff; - border-radius: 0; - padding: 30px 10px 20px 10px; - margin: 10px 0px; + background: #fff; + border-radius: 0; + padding: 30px 10px 20px 10px; + margin: 10px 0px; } .sd-card .sd-card-header { - text-align: center; + text-align: center; } .sd-card .sd-card-header .sd-card-text { - margin: 0px; + margin: 0px; } .sd-card .sd-card-img-top { - height: 52px; - width: 52px; - margin-left: auto; - margin-right: auto; + height: 52px; + width: 52px; + margin-left: auto; + margin-right: auto; } .sd-card .sd-card-header { - border: none; - background-color: white; - color: #150458 !important; - font-size: var(--pst-font-size-h5); - font-weight: bold; - padding: 2.5rem 0rem 0.5rem 0rem; + border: none; + background-color: white; + color: #150458 !important; + font-size: var(--pst-font-size-h5); + font-weight: bold; + padding: 2.5rem 0rem 0.5rem 0rem; } .sd-card .sd-card-footer { - border: none; - background-color: white; + border: none; + background-color: white; } .sd-card .sd-card-footer .sd-card-text { - max-width: 220px; - margin-left: auto; - margin-right: auto; + max-width: 220px; + margin-left: auto; + margin-right: auto; } /* Dark theme tweaking */ -html[data-theme=dark] .sd-card img[src*='.svg'] { - filter: invert(0.82) brightness(0.8) contrast(1.2); +html[data-theme="dark"] .sd-card img[src*=".svg"] { + filter: invert(0.82) brightness(0.8) contrast(1.2); } /* Main index page overview cards */ -html[data-theme=dark] .sd-card { - background-color: var(--pst-color-background); +html[data-theme="dark"] .sd-card { + background-color: var(--pst-color-background); } -html[data-theme=dark] .sd-shadow-sm { - box-shadow: 0 .1rem 1rem rgba(250, 250, 250, .6) !important +html[data-theme="dark"] .sd-shadow-sm { + box-shadow: 0 0.1rem 1rem rgba(250, 250, 250, 0.6) !important; } -html[data-theme=dark] .sd-card .sd-card-header { - background-color: var(--pst-color-background); - color: #150458 !important; +html[data-theme="dark"] .sd-card .sd-card-header { + background-color: var(--pst-color-background); + color: #150458 !important; } -html[data-theme=dark] .sd-card .sd-card-footer { - background-color: var(--pst-color-background); +html[data-theme="dark"] .sd-card .sd-card-footer { + background-color: var(--pst-color-background); } -html[data-theme=dark] h1 { - color: var(--pst-color-primary); +html[data-theme="dark"] h1 { + color: var(--pst-color-primary); } -html[data-theme=dark] h3 { - color: #0a6774; -} \ No newline at end of file +html[data-theme="dark"] h3 { + color: #0a6774; +} From 623a4183dbf58a5e8d5435705a9c4f3728f28885 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 26 Jan 2023 11:26:36 -0500 Subject: [PATCH 5/9] flake8 --- docs/conf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index c080b25b60..79ff3818ba 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,7 +15,6 @@ import os import sys import pybamm -import pydata_sphinx_theme sys.path.insert(0, os.path.abspath("../")) @@ -92,9 +91,9 @@ html_static_path = ["source/_static"] # Theme -html_theme = "pydata_sphinx_theme" -# pydata theme options (see https://pydata-sphinx-theme.readthedocs.io/en/latest/index.html# for more information) +# pydata theme options (see +# https://pydata-sphinx-theme.readthedocs.io/en/latest/index.html# for more information) # mostly copied from numpy, scipy, pandas html_logo = "source/_static/pybamm_logo.png" From c248f28eed80e8386d07475383b151c01551c664 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 26 Jan 2023 14:09:32 -0500 Subject: [PATCH 6/9] fix doctest --- docs/index.rst | 1 + tox.ini | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index f4078e3d1e..2f1feec86c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,7 @@ .. Root of all pybamm docs .. Remove the right side-bar for the home page + :html_theme.sidebar_secondary.remove: #################### diff --git a/tox.ini b/tox.ini index 0086bdd625..3b72cbe7ad 100644 --- a/tox.ini +++ b/tox.ini @@ -16,6 +16,7 @@ deps = dev: flake8 dev,doctests: sphinx>=1.5 dev,doctests: pydata-sphinx-theme + dev,doctests: sphinx_design !windows-!mac: scikits.odes commands = From 58afd08f82e583025e7370f9168825d203a58d04 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 26 Jan 2023 15:40:04 -0500 Subject: [PATCH 7/9] fix theme and logo --- docs/conf.py | 2 ++ docs/index.rst | 4 ++-- docs/source/_static/pybamm_logo.png | Bin 0 -> 88493 bytes 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 docs/source/_static/pybamm_logo.png diff --git a/docs/conf.py b/docs/conf.py index 79ff3818ba..34b1c5f9e3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -88,6 +88,8 @@ # -- Options for HTML output ------------------------------------------------- +html_theme = "pydata_sphinx_theme" + html_static_path = ["source/_static"] # Theme diff --git a/docs/index.rst b/docs/index.rst index 2f1feec86c..25183d5e07 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -71,7 +71,7 @@ explore the effect of different battery designs and modeling assumptions under a +++ - .. button-ref:: https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks + .. button-link:: https://github.com/pybamm-team/PyBaMM/tree/develop/examples/notebooks :expand: :color: secondary :click-parent: @@ -108,7 +108,7 @@ explore the effect of different battery designs and modeling assumptions under a +++ - .. button-ref:: https://github.com/pybamm-team/PyBaMM/blob/develop/CONTRIBUTING.md + .. button-link:: https://github.com/pybamm-team/PyBaMM/blob/develop/CONTRIBUTING.md :expand: :color: secondary :click-parent: diff --git a/docs/source/_static/pybamm_logo.png b/docs/source/_static/pybamm_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..54a931c29e30475cc7c33b10a5f686e394e77a3e GIT binary patch literal 88493 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 Date: Fri, 27 Jan 2023 11:46:11 -0500 Subject: [PATCH 8/9] fix code blocks and add copybutton --- docs/conf.py | 1 + docs/index.rst | 9 +++++---- docs/requirements.txt | 3 ++- docs/source/user_guide/fundamentals/index.rst | 20 ++++++++++--------- setup.py | 1 + tox.ini | 1 + 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 34b1c5f9e3..a642eced15 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,6 +48,7 @@ "sphinx.ext.viewcode", "sphinx.ext.napoleon", "sphinx_design", + "sphinx_copybutton", ] diff --git a/docs/index.rst b/docs/index.rst index 25183d5e07..3ff5c4d6d4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,10 +33,11 @@ PyBaMM (Python Battery Mathematical Modelling) is an open-source battery simulat written in Python. Our mission is to accelerate battery modelling research by providing open-source tools for multi-institutional, interdisciplinary collaboration. Broadly, PyBaMM consists of -(i) a framework for writing and solving systems -of differential equations, -(ii) a library of battery models and parameters, and -(iii) specialized tools for simulating battery-specific experiments and visualizing the results. + +#. a framework for writing and solving systems of differential equations, +#. a library of battery models and parameters, and +#. specialized tools for simulating battery-specific experiments and visualizing the results. + Together, these enable flexible model definitions and fast battery simulations, allowing users to explore the effect of different battery designs and modeling assumptions under a variety of operating scenarios. diff --git a/docs/requirements.txt b/docs/requirements.txt index 0dd679f075..e015c3deac 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -16,6 +16,7 @@ sympy >= 1.8 # Should not be imported matplotlib >= 2.0 # +sphinx>4.0 pydata-sphinx-theme sphinx_design -sphinx>4.0 +sphinx-copybutton diff --git a/docs/source/user_guide/fundamentals/index.rst b/docs/source/user_guide/fundamentals/index.rst index fe843b80ba..e9fabdf34c 100644 --- a/docs/source/user_guide/fundamentals/index.rst +++ b/docs/source/user_guide/fundamentals/index.rst @@ -5,14 +5,16 @@ PyBaMM (Python Battery Mathematical Modelling) is an open-source battery simulat written in Python. Our mission is to accelerate battery modelling research by providing open-source tools for multi-institutional, interdisciplinary collaboration. Broadly, PyBaMM consists of -(i) a framework for writing and solving systems -of differential equations, -(ii) a library of battery models and parameters, and -(iii) specialized tools for simulating battery-specific experiments and visualizing the results. + +#. a framework for writing and solving systems of differential equations, +#. a library of battery models and parameters, and +#. specialized tools for simulating battery-specific experiments and visualizing the results. + Together, these enable flexible model definitions and fast battery simulations, allowing users to explore the effect of different battery designs and modeling assumptions under a variety of operating scenarios. .. note:: + This user-guide is a work-in-progress, we hope that this brief but incomplete overview will be useful to you. Core framework @@ -39,9 +41,9 @@ External parameter sets can be linked using entry points (see :ref:`parameter_se Battery-specific tools ~~~~~~~~~~~~~~~~~~~~~~ -One of PyBaMM's unique features is the `Experiment` class, which allows users to define synthetic experiments using simple instructions in English +One of PyBaMM's unique features is the ``Experiment`` class, which allows users to define synthetic experiments using simple instructions in English -.. code-block::python +.. code-block:: python pybamm.Experiment( [ @@ -56,9 +58,9 @@ One of PyBaMM's unique features is the `Experiment` class, which allows users to The above instruction will conduct a standard discharge / rest / charge / rest cycle three times, with a 10 hour discharge and 1 hour rest at the end of each cycle. -The `Simulation` class handles simulating an `Experiment`, as well as calculating additional outputs such as capacity as a function of cycle number. For example, the following code will simulate the experiment above and plot the standard output variables: +The ``Simulation`` class handles simulating an ``Experiment``, as well as calculating additional outputs such as capacity as a function of cycle number. For example, the following code will simulate the experiment above and plot the standard output variables: -.. code-block::python +.. code-block:: python import pybamm import matplotlib.pyplot as plt @@ -76,7 +78,7 @@ Finally, PyBaMM provides cusotm visualization tools: Users are not limited to these tools and can plot the output of a simulation solution by accessing the underlying numpy array for the solution variables as -.. code-block::python +.. code-block:: python solution["variable name"].data diff --git a/setup.py b/setup.py index a0e25d8593..df64abe44b 100644 --- a/setup.py +++ b/setup.py @@ -212,6 +212,7 @@ def compile_KLU(): "sphinx>=1.5", "pydata-sphinx-theme", "sphinx_design", + "sphinx-copybutton", ], # For doc generation "dev": [ "flake8>=3", # For code style checking diff --git a/tox.ini b/tox.ini index 3b72cbe7ad..64b31d3600 100644 --- a/tox.ini +++ b/tox.ini @@ -17,6 +17,7 @@ deps = dev,doctests: sphinx>=1.5 dev,doctests: pydata-sphinx-theme dev,doctests: sphinx_design + dev,doctests: sphinx-copybutton !windows-!mac: scikits.odes commands = From 00e2df8341b0447a76de0e31a5020d602b4833fa Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 27 Jan 2023 11:49:57 -0500 Subject: [PATCH 9/9] changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d7d57a21c..910616de35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,10 @@ ## Features -- Steps in `Experiment` can now be tagged and cycle numbers be searched based on those tags ([#2593](https://github.com/pybamm-team/PyBaMM/pull/2593)). +- Changed linting from `flake8` to `ruff` ([#2630](https://github.com/pybamm-team/PyBaMM/pull/2630)). +- Changed docs theme to pydata theme and start to improve docs in general ([#2618](https://github.com/pybamm-team/PyBaMM/pull/2618)). - New `contact resistance` option, new parameter `Contact resistance [Ohm]` and new variable `Contact overpotential [V]` ([#2598](https://github.com/pybamm-team/PyBaMM/pull/2598)). +- Steps in `Experiment` can now be tagged and cycle numbers be searched based on those tags ([#2593](https://github.com/pybamm-team/PyBaMM/pull/2593)). ## Bug fixes