From de46a2ef32193fa856e8a3556bd06f779881ca78 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 28 Jun 2022 15:41:04 -0400 Subject: [PATCH 01/47] making composite release branch without silicon parameters added --- CHANGELOG.md | 6 +- docs/requirements.txt | 2 +- examples/notebooks/compare-ecker-data.ipynb | 286 + examples/notebooks/models/DFN.ipynb | 15 +- examples/notebooks/models/MPM.ipynb | 2 +- .../change-input-current.ipynb | 8 +- .../parameterization/parameterization.ipynb | 4986 ++++++++-------- .../simulating-long-experiments.ipynb | 5000 ++++++++--------- examples/scripts/compare_lithium_ion.py | 19 +- .../scripts/compare_lithium_ion_half_cell.py | 2 +- pybamm/CITATIONS.txt | 14 +- pybamm/expression_tree/averages.py | 28 +- pybamm/expression_tree/broadcasts.py | 37 +- .../expression_tree/independent_variable.py | 8 +- pybamm/expression_tree/parameter.py | 20 +- pybamm/expression_tree/printing/print_name.py | 4 +- pybamm/geometry/battery_geometry.py | 23 +- pybamm/geometry/standard_spatial_vars.py | 36 + .../LiPF6_Mohtat2020/parameters.csv | 1 + .../parameters.csv | 1 + .../parameters.csv | 1 + .../parameters.csv | 1 + .../lipf6_Ecker2015/parameters.csv | 1 + .../lipf6_Enertech_Ai2020/parameters.csv | 1 + .../electrolytes/lipf6_Kim2011/parameters.csv | 1 + .../lipf6_Marquis2019/parameters.csv | 1 + .../lipf6_Nyman2008/parameters.csv | 1 + .../lipf6_Ramadass2004/parameters.csv | 1 + .../lipf6_Valoen2005/parameters.csv | 1 + .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 1 - .../parameters.csv | 3 +- ...e_exchange_current_density_Dualfoil1998.py | 12 +- ...aphite_entropy_Enertech_Ai2020_function.py | 2 +- ...olyte_exchange_current_density_Chen2020.py | 13 +- ...olyte_exchange_current_density_Chen2020.py | 12 +- ...lyte_exchange_current_density_Ecker2015.py | 10 +- ...rolyte_exchange_current_density_Kim2011.py | 11 +- ...yte_exchange_current_density_ORegan2021.py | 11 +- ...aphite_LGM50_entropic_change_ORegan2021.py | 2 +- ...e_exchange_current_density_Ramadass2004.py | 12 +- .../graphite_entropic_change_Moura2016.py | 22 +- ...lyte_exchange_current_density_PeymanMPM.py | 10 +- .../graphite_entropic_change_PeymanMPM.py | 2 +- ...e_exchange_current_density_Dualfoil1998.py | 12 +- .../graphite_entropic_change_Moura2016.py | 24 +- ..._exchange_current_density_kashkooli2017.py | 9 +- ...lyte_exchange_current_density_Ecker2015.py | 12 +- ...trolyte_exchange_current_density_Xu2019.py | 9 +- ...lyte_exchange_current_density_PeymanMPM.py | 10 +- .../NMC_entropic_change_PeymanMPM.py | 2 +- ...e_exchange_current_density_Dualfoil1998.py | 10 +- .../lico2_entropic_change_Ai2020_function.py | 2 +- .../lico2_volume_change_Ai2020.py | 6 +- ...e_exchange_current_density_Dualfoil1998.py | 10 +- .../lico2_entropic_change_Moura2016.py | 19 +- ...e_exchange_current_density_Ramadass2004.py | 10 +- .../lico2_entropic_change_Moura2016.py | 27 +- ...rolyte_exchange_current_density_Kim2011.py | 7 +- ...olyte_exchange_current_density_Chen2020.py | 10 +- ...yte_exchange_current_density_ORegan2021.py | 11 +- .../nmc_LGM50_entropic_change_ORegan2021.py | 2 +- .../full_battery_models/base_battery_model.py | 159 +- .../lead_acid/base_lead_acid_model.py | 21 +- .../lead_acid/basic_full.py | 20 +- .../full_battery_models/lead_acid/full.py | 7 +- .../lead_acid/higher_order.py | 7 +- .../full_battery_models/lead_acid/loqs.py | 17 +- .../lithium_ion/__init__.py | 1 + .../lithium_ion/base_lithium_ion_model.py | 137 +- .../lithium_ion/basic_dfn.py | 55 +- .../lithium_ion/basic_dfn_half_cell.py | 28 +- .../lithium_ion/basic_spm.py | 40 +- .../full_battery_models/lithium_ion/dfn.py | 81 +- .../lithium_ion/electrode_soh.py | 4 +- .../lithium_ion/electrode_soh_half_cell.py | 2 +- .../lithium_ion/newman_tobias.py | 20 - .../full_battery_models/lithium_ion/spm.py | 84 +- .../submodels/active_material/__init__.py | 1 + .../active_material/base_active_material.py | 82 +- .../constant_active_material.py | 4 +- .../active_material/loss_active_material.py | 2 +- .../active_material/total_active_material.py | 81 + pybamm/models/submodels/base_submodel.py | 48 +- .../submodels/electrode/base_electrode.py | 5 +- .../submodels/electrode/ohm/full_ohm.py | 11 +- .../submodels/electrode/ohm/li_metal.py | 6 +- .../base_electrolyte_conductivity.py | 22 +- .../full_conductivity.py | 22 +- .../composite_surface_form_conductivity.py | 2 +- .../full_surface_form_conductivity.py | 24 +- .../leading_surface_form_conductivity.py | 2 +- .../submodels/interface/base_interface.py | 475 +- .../submodels/interface/kinetics/__init__.py | 1 + .../interface/kinetics/base_kinetics.py | 42 +- .../interface/kinetics/butler_volmer.py | 14 +- .../interface/kinetics/diffusion_limited.py | 22 +- .../first_order_kinetics.py | 15 +- .../inverse_kinetics/inverse_butler_volmer.py | 33 +- .../submodels/interface/kinetics/linear.py | 6 +- .../submodels/interface/kinetics/marcus.py | 16 +- .../interface/kinetics/no_reaction.py | 24 +- .../submodels/interface/kinetics/tafel.py | 12 +- .../interface/kinetics/total_kinetics.py | 274 + .../interface/lithium_plating/base_plating.py | 7 +- .../interface/lithium_plating/plating.py | 4 +- .../open_circuit_potential/__init__.py | 1 + .../open_circuit_potential/base_ocp.py | 72 +- .../current_sigmoid_ocp.py | 38 + .../open_circuit_potential/single_ocp.py | 26 +- .../submodels/interface/sei/base_sei.py | 15 +- .../submodels/particle/base_particle.py | 134 +- .../particle/no_distribution/base_fickian.py | 28 +- .../no_distribution/fickian_diffusion.py | 58 +- .../no_distribution/polynomial_profile.py | 23 +- .../x_averaged_fickian_diffusion.py | 81 +- .../x_averaged_polynomial_profile.py | 26 +- .../size_distribution/base_distribution.py | 8 +- .../size_distribution/fickian_diffusion.py | 16 +- .../size_distribution/uniform_profile.py | 6 +- .../x_averaged_fickian_diffusion.py | 23 +- .../x_averaged_uniform_profile.py | 6 +- .../particle_mechanics/base_mechanics.py | 8 +- .../base_transport_efficiency.py | 24 +- .../bruggeman_transport_efficiency.py | 10 +- pybamm/parameters/base_parameters.py | 64 +- pybamm/parameters/geometric_parameters.py | 96 +- pybamm/parameters/lead_acid_parameters.py | 214 +- pybamm/parameters/lithium_ion_parameters.py | 516 +- pybamm/parameters/parameter_values.py | 31 +- pybamm/simulation.py | 4 +- requirements.txt | 2 +- setup.py | 2 +- tests/unit/test_citations.py | 8 +- .../test_operations/test_convert_to_casadi.py | 20 +- .../test_printing/__init__.py | 0 .../test_printing/test_print_name.py | 13 +- .../test_base_battery_model.py | 7 +- .../test_lithium_ion/test_basic_models.py | 10 + .../test_lithium_ion/test_spm.py | 7 +- .../standard_submodel_unit_tests.py | 52 + .../test_parameters/test_base_parameters.py | 6 +- .../test_lead_acid_parameters.py | 8 +- .../test_lithium_ion_parameters.py | 48 +- .../test_parameter_sets/test_LCO_Ai2020.py | 6 +- .../test_LCO_Ramadass2004.py | 6 +- .../test_LGM50_ORegan2021.py | 6 +- .../test_size_distribution_parameters.py | 16 +- tests/unit/test_simulation.py | 2 +- tests/unit/test_solvers/test_idaklu_solver.py | 51 +- tests/unit/test_solvers/test_scipy_solver.py | 55 +- tests/unit/test_solvers/test_solution.py | 12 +- .../test_base_spatial_method.py | 2 +- 160 files changed, 7868 insertions(+), 6769 deletions(-) create mode 100644 examples/notebooks/compare-ecker-data.ipynb create mode 100644 pybamm/models/submodels/active_material/total_active_material.py create mode 100644 pybamm/models/submodels/interface/kinetics/total_kinetics.py create mode 100644 pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py create mode 100644 tests/unit/test_expression_tree/test_printing/__init__.py create mode 100644 tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ddbab7ac14..9bc03b9a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Features - Added open-circuit potential as a separate submodel ([#2094](https://github.com/pybamm-team/PyBaMM/pull/2094)) +- Reformated submodel structure to allow composite electrodes, with an example for graphite/silicon. Composite positive electrode is now also possible. With current implementation, electrodes can have at most two phases. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) +- Added "Chen2020_composite" parameter set for a composite graphite/silicon electrode. Silicon parameters are added as a standard negative electrode parameter set, specified as the "negative electrode secondary" set, which automatically adds "Secondary:" to the start of each parameter name. Primary (graphite) parameter names are unchanged. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) - Added partially reversible lithium plating model and new `OKane2022` parameter set to go with it ([#2043](https://github.com/pybamm-team/PyBaMM/pull/2043)) - Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) @@ -17,6 +19,7 @@ ## Features +- Added a casadi version of the IDKLU solver, which is used for `model.convert_to_format = "casadi"` ([#2002](https://github.com/pybamm-team/PyBaMM/pull/2002)) - Added functionality to generate Julia expressions from a model. See [PyBaMM.jl](https://github.com/tinosulzer/PyBaMM.jl) for how to use these ([#1942](https://github.com/pybamm-team/PyBaMM/pull/1942))) - Added basic callbacks to the Simulation class, and a LoggingCallback ([#1880](https://github.com/pybamm-team/PyBaMM/pull/1880))) @@ -26,7 +29,8 @@ ## Breaking changes -- Changed domain-specific parameter names to a nested attribute, e.g. `param.c_n_max` is now `param.n.c_max` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) +- Exchange-current density functions now take a fourth argument, the maximum particle concentration for that phase +- Changed domain-specific parameter names to a nested attribute. `param.l_n` is now `param.n.l`. Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) # [v22.4](https://github.com/pybamm-team/PyBaMM/tree/v22.4) - 2022-04-30 diff --git a/docs/requirements.txt b/docs/requirements.txt index b5c1baf29b..d8a7ccb655 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ # Requirements for readthedocs.io -numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed +numpy >= 1.16 scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 diff --git a/examples/notebooks/compare-ecker-data.ipynb b/examples/notebooks/compare-ecker-data.ipynb new file mode 100644 index 0000000000..8d1c69380d --- /dev/null +++ b/examples/notebooks/compare-ecker-data.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparing with Experimental Data\n", + "\n", + "In this notebook we show how to compare results generated in PyBaMM with experimental data. We compare the results of the DFN model (see the [DFN notebook](./models/DFN.ipynb)) with the experimental data from Ecker et. al. [[3]](#References). Results are compared for a constant current discharge at 1C and at 5C." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we import pybamm and any other packages required by this example, and then change our working directory to the root of the pybamm folder." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import os\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "os.chdir(pybamm.__path__[0]+'/..')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then load the Ecker data in from the `.csv` files using `pandas`" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "voltage_data_1C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_1C.csv\", header=None).to_numpy()\n", + "voltage_data_5C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_5C.csv\", header=None).to_numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the data is Time [s] vs Voltage [V]." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We load the DFN model and select the parameter set from the Ecker paper [1]. We update the C-rate an `InputParameter` so that we can re-run the same model at different C-rates without the need to rebuild the model. This is done by passing the flag `[input]`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# choose DFN\n", + "model1 = pybamm.lithium_ion.SPMe()\n", + "model2 = pybamm.lithium_ion.DFN()\n", + "\n", + "# pick parameters, keeping C-rate as an input to be changed for each solve\n", + "chemistry = pybamm.parameter_sets.Ecker2015\n", + "parameter_values = pybamm.ParameterValues(chemistry=chemistry)\n", + "parameter_values.update({\"Current function [A]\": \"[input]\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this comparison we choose a fine mesh of 1 finite volume per micron in the electrodes and separator and 1 finite volume per 0.1 micron in the particles" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "var = pybamm.standard_spatial_vars\n", + "var_pts = {\n", + " var.x_n: int(parameter_values.evaluate(model1.param.L_n / 1e-6)),\n", + " var.x_s: int(parameter_values.evaluate(model1.param.L_s / 1e-6)),\n", + " var.x_p: int(parameter_values.evaluate(model1.param.L_p / 1e-6)),\n", + " var.r_n: int(parameter_values.evaluate(model1.param.R_n_typ / 1e-7)),\n", + " var.r_p: int(parameter_values.evaluate(model1.param.R_p_typ / 1e-7)),\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create a simulation using our model, parameters and number of grid points" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "sim1 = pybamm.Simulation(model1, parameter_values=parameter_values, var_pts=var_pts)\n", + "sim2 = pybamm.Simulation(model2, parameter_values=parameter_values, var_pts=var_pts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then solve the model for a 1C and 5C discharge " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "C_rates = [1, 5] # C-rates to solve for\n", + "capacity = parameter_values[\"Nominal cell capacity [A.h]\"]\n", + "t_evals = [\n", + " np.linspace(0, 3800, 100), \n", + " np.linspace(0, 720, 100)\n", + "] # times to return the solution at\n", + "solutions1 = [None] * len(C_rates) # empty list that will hold solutions\n", + "solutions2 = [None] * len(C_rates) # empty list that will hold solutions\n", + "\n", + "# loop over C-rates\n", + "for i, C_rate in enumerate(C_rates):\n", + " current = C_rate * capacity\n", + " sim1.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", + " solutions1[i] = sim1.solution\n", + " sim2.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", + " solutions2[i] = sim2.solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we plot the numerical solution against the experimental data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6AAAAEYCAYAAABCw5uAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABgHUlEQVR4nO3dd3yV5fnH8c+VhCQkJMwwQxKQJYKCoOJAcKKi/qp140CtWG2rrVoXHbZKq9WqrdpaqpZW4p51bxAXFicOEJCEvUcC2cn1++OcYIhJSELOSr7v1+u8cs4zznPdhJzrXM9zP/dt7o6IiIiIiIhIqMVFOgARERERERFpG1SAioiIiIiISFioABUREREREZGwUAEqIiIiIiIiYaECVERERERERMJCBaiIiIiIiIiEhQpQERERERERCQsVoCKtiJn91MzmmVmpmc2otS7dzO40s2Vmts3MlgRfd4tQuCIiIlHFzGaZWUkwT24zs4U11vUys/vNbLWZFZrZAjP7nZmlRjJmkVijAlSkdVkF3AQ8UHOhmSUCbwB7AccA6cCBwEZg/zDHKCIiEs1+6u4dgo/BAGbWBXgfaA8c6O5pwFFAJ2CPiEUqEoMSIh2AiLQcd38KwMxGA5k1Vp0LZAGHufu24LJ1wI3hjVBERCQmXQEUAme7exWAuy8HLo9oVCIxSFdARdqGI4GXaxSfIiIiUrc/mtkGM3vXzMYHlx0JPFVdfIpI86kAFWkbugKrIx2EiIhIlLsG6A/0AaYDz5nZHiiPirQYFaAibcNGoFekgxAREYlm7j7X3QvdvdTd/w28CxyH8qhIi1EBKtI2vA5M0Eh9IiIiTeKAEcijJ5mZvjuL7Cb9EYm0ImaWYGbJQDwQb2bJZpYAPAgsB540syFmFmdmXc3sejM7LqJBi4iIRAEz62RmE6pzp5lNAg4FXgZuJzCC/L/NLDu4fR8zu93M9o5g2CIxRwWoSOvyK6AYuBY4O/j8V+5eSmAAhQXAa0AB8CHQDZgbmVBFRESiSjsCU5mtBzYAPwN+4O7fuPsm4CCgHJhrZoUEpjfbCiyOULwiMcncPdIxiIiIiIiISBugK6AiIiIiIiISFipARUREREREJCxUgIqIiIiIiEhYqAAVERERERGRsEiIdADN0a1bN8/JyYl0GCIi0op99NFHG9w9I9JxtDTlUBERCYf68mhMFqA5OTnMmzcv0mGIiEgrZmb5kY4hFJRDRUQkHOrLo+qCKyIiIiIiImGhAlRERERERETCIia74IqICFRVVVFZWRnpMGJefHw8cXE6Hysi0pYoh7aM5uRQZVwRkRi0fft2SktLIx1Gq1BaWsr27dsjHYaIiISJcmjLaU4O1RVQEZEYU1VVRVxcHO3bt490KK1Cu3btKC4u3vHvKiIirZdyaMtqTg5VphURiTGVlZUkJOj8YUuKj49XVywRkTZAObTlNTWHqgAVEZE2z8wiHYKIiEhMamoObbMF6LvTv2Rcr9/Sp0cmcXFx5OTkkJubG+mwRESiVlVVFRdffDEHH3wwY8eOZdKkScyYMYN+/foxfvx4DjroID799FMgkIxuvPHGHfveeOONKvJakcpKuPzYb3js9hWRDkVEJGYojwa02QL0ul8/yttrbmPVupW4O/n5+UyZMkVFqIhIPV555RUqKip49913mTNnDnfddRcAF154IbNmzeK2227j2muvBSAnJ4c333xzx75vvvkm/fr1i0jc0vJuu/I2/vrykZx+ZRY9MzKVO0VEGkF5NKDNdoDOT5oBFO20rKioiJ9NuYr9so9i0CHdIxKXiEiTjBwJa9e2zHv16AGffFLv6tTUVBYtWsTXX3/NkCFD6NKly07r9913X/Lz84HA/SB77703H3/8Me7OPvvsw/LlywEoLy/nkksuYcmSJZSXl3P77bez//77t0wbYpSZDQK+BA5z93dqLO8C/AfoCHwKXObubmb7AncBBkx39xnhijU3N5ff//O3VOfQtRtW8qMLLwJg0qRJ4QpDRKRlKI+GXZu9Arp8Rd3dhjYXrWXw2O4MTFrGL/Z/hzfv/JzyovIwRyciEn0OPfRQJk+ezKWXXkr//v258847d1r/6quvstdee+14fdZZZ/HQQw/x0EMPcdZZZ+1Yfv/99zNgwADeeustnnzySX7xi1+EqwnR7NfA7DqWXw086u5jgVRgQnD5XcDZwHjgMjPrHI4gAaZOnUpR0c4ncEtKi7nmqmvDFYKISExSHg0wd490DE02evRonzdv3m69R05Ozo4zDDV1Tu7O6KT/MmvrSMpJBKAjWzimz3y6DniJ/37zH1auWUVWVhbTpk3T2V4RCbvy8sBJsXbt2kUshoKCAg499FAuu+wybrzxRrKzs+nUqRN33nknOTk5DBgwgMWLFzNu3DgAZs+evWPZT37yE9577z06duwIwIYNG/jiiy8i1hao+9/UzD5y99GhPraZHQCcAmQA99W6Avo+cJy7bzazk4D9gRuAue4+IrjNX4AX3f2Vxhxvd3NoXFwcdX93MDYs2UzX/h2b/d4iIqEWDTkUWlcere/ftL482ma74E6bNo0pU6bsdBY3JSWFu6bfzqRJB1CwdCOv/fUrnnvOeOHbPXl05TJY+Requxzl5+dz0YU/AtTlSETahlWrVtGhQwfS09NJS0ujQ4cOuDsXXnghv/rVr+rc54ILLvjesr322osBAwbsOGNbVlYW0rhjwFTgfODPdazrAmwJPt8SfN21xrKay+tlZlOAKQBZWVm7EWpg/7pO4EIWZx+0hBdWjiQuvnUMlCEi0pKURwPabBfcSZMmMX36dLKzszEzsrOzmT59+o5iMr1fV354x1hmLD6ENWVd6NH1amrfM1pcWsKF51zFXce+yOq3F0WgFSIi4bNixQqOPfZYxo4dy0EHHcRxxx1HfHx8g/ucd955nHfeeTstu+iii1i4cCGHHXYYhx12GFOnTg1l2FHNzCYC89x9Yz2bbCZw/yfBn5uCj041tqleXi93n+7uo919dEZGxm7FPG3aNFJSUnZaZmb0iN+fl9fuyx3nfrxb7y8i0lopjwa02S64TdVQlyOoIo5KJnb5gIsvrOCY3x1IfPvEsMYnIm1HtHQfak0i1QXXzKYCRwBlwHBgOXC6u+cH198CfObuD5nZdOApd3/ZzN4FzgRWA+8DR7n75sYcsyVy6KWXXsq99967U15sn5QMpX+hgsm8+8JW9jtu9wpdEZFQUA5teU3tgttmr4A2VX1dlnr37MO0//uQgckreG7TwRx/6zj6dVjHqXteR9/efTXHqIiI1Mvdp7n74e5+DPAacBWwp5mdE9zkT8AkM5sDlAOvBpdfDjxMYOCivzW2+GwpL7744vdOyhaXlpCaMpVyEjnj1AoKtsbeCW4REQk9FaCNVFeXo5SUFP50281c/8z+fF2Uzazp33DWHnNZVfUGTyz4KytWr9AcoyIi0ijuPtnd33H3l939weCyje4+0d3HuvtP3L0quHyeux/s7ge5+wPhjnXZsmV1Lt9YvJEfd3+Kb4t6cckx3xKDnaxERCTEQl6AmtkgMys3s0NqLe9iZs+b2Rwzu8vMonrEgl3dM2oG4y4aRO7iA+jV+9fUNcfoLy69iorSyghELyIi0nLq6xWUlZXF7a8OY5h9wUMf7MHPz91IRUWYgxMRkagWjiugTZ3bLGpNmjSJvLw8qqqqyMvLq3f025Wr655jdH3BWvqlruXGo94mb27dE97m5uaSk5OjrrsiIhK16usVNG3aNNrvM4gnp35CDkv568yuTDxoE1u2RCZOERGJPiEtQINzm60B6qrIxgHPB58/F3zdKtR3ZjglvjvrKrvym9cPpd+YHhyQ/hW3/fB98j4KDH6Ym5vLlClTyM/PV9ddERGJWrvqFTToxnP4cNrrjOVtXv1fF8YM3co330Q4aBERiQqhvgI6Fbi5nnV1zW1WLzObYmbzzGze+vXrWyzAUKjvzPD0f/+ZFfO3cPvENxiT8jkfFg7ll08dSL/RXdkr5VsuueCqneYlhUDX3VgbWllERFq/2r2CgJ168LyancLrj27iR/EPsHB1R0YNL+X6qyvYsCGycYuISGSFrABt5txm9WrJOcxCraEzwxnDevCL54/g/e17k/f6Ym47+lUOSfmYb4r7UlhWd7fc+gZ7EBEJp7y8PDp37sxhhx3GmDFjOPHEE1mwYAGzZs2iV69ejB8/nvHjx/Pggw+Sl5eHmfHMM8/s2H/AgAGRC15Cqr4ePI+Xb2f6nKHcnXoNCWVF/PHWBHL6lHHNFeWsrTvliYi0WsqjQe4ekgeBq59vAi8DK4EPgOwa628Bzgo+nw4c09j3HjVqlLc2Wxes8oy07g7U8cj2we3zffLwef6PSz/1z97c4OXlO+8/c+ZMz87OdjPz7OxsnzlzZmQaIiIhV1ZW5mVlZWE/7tKlS/2II47Y8fq9997z4cOH+8svv+wXXnjh97YdMmSIH3DAAV5VVeXu7nvssUdY422Kuv5NCZxEDVmejNQjFDk0Ozu7zvyVnZ0d2CA/37ec+zO/Me433pmNDu7t4iv8zP/b7rNnuwf/i4iIhFykcqh7682j9f2b1pdHE0JY2E4DpgGY2QzgPgJzmx3qgeHl/wT8x8wuAT7nu7nN2qT0wb244++3M2XKlJ264SZYEllxF/FtcU8Wzs9ixnzgb5BiRYzqms/+e22ntMub3PfSDZSUFAPsOPMM1DtQkoi0DiNH0mJXknr0gE8+afz2Bx54IMOHD2fevHl1ru/Tpw+DBg3i2Wef5Qc/+EHLBClRqb6eOjuWZ2XR8d9/5Vc3LeeyaTfz9/sT+VvFRTz8bDYPPwt79i3kostTmXROHN27hzFwEWnzlEfDLyzzgHoT5jZry+rqujvjwftZUjGVgiUbePemt7jt0P9yWrc36c465mzYkz/PHs3dT/9tR/FZraioiKt/eZ3mYBORkOrbty8DBw7khRde2NF1aOHChTvWX3/99dx8883VPV+klWpoWpad9O1L+r1/4prVP+fbW57g+d5TOJ7nWLA8lSuuiqNPr0p+cNgWnnnaKSsLQ+AiIhHWFvNoyK6ASvNMmjSpzquWyf17c9DU3hxUPR5RRQVr53zF/55azgl3133medXqFXRN2MK+GcvZd0gR+x6cwsgTMhm4f2fi4gL37EydOpVly5aRlZXFtGnTdMVUJMY05UxrKCxfvpy0tDQmTpzIfffdt2N59aA0mZmZjBo1aqd7WKT1mTZt2vd68FRPy1Knbt2Iv/pKJv7SmTh7Nsvu/Dn/eaErMyom8eysATw7C7q2L+KMH5RwzuVd2H//wHzbIiItTXk0/MJyBVRCICGBHocN5fi7JpCdXfeZ52TrTruqUt5YO5xbZx/AmX8YzpADO5OesJ1Bqbcy+dwfacoXEWm2Dz/8kPnz5zN69OgGt7vuuuu4+eb6BkSX1qChwfcanN/aDMaPJ+uZv/KrTVew6N/v8/Z+V3IBD1BeXM49D3dhzBgYkrGB31+6hiWLW88VABGRtppHdQW0FajvzPP06X/mrFO7sPrtr/j4+VV8/EEZnyzqwMebc1hUdA9QstP7FBUVcfHkq1j//B6MGN+ZfU7MpnOv5DC3RkSi2UcffcRhhx1GSUkJ3bp14+GHH2ZXU2NlZmay33778fLLL4cpSomEunrwVI+OW52fGhyjIC0NO/ccxp57DmPXruXuRx/jv9PX8OCX+/Lyxgn89u8J/PbvMKZXHpNOq+C0a/rRvVd8WNomItJSlEfBYrE/8ejRo72+m3XbqiZ1p62qIi4hoZ6+5AZ8dztuVrtVjOi+in0GlzLiwPbsfUxv+h/Yg4cfeUjdd0UipLy8HIB27dpFOJLWo65/UzP7yN0bPi0dg8KZQ3NycsjPz//e8uzs7B3dy3Zp3TrW/edlHvvXNmZ+PYq5fgAA8VRwVJ+vOOvkUn5w3Z6k9erQgpGLSGulHNry6vs3rS+PqgBto+r7UtCzc09uPPLffPJZHJ+u6MrnRQPYRtpO2yTxAOX8hKoaV1Dbt2/PP//5TxWhImGg5NnyVICGRlxcXJ0nO82MqqpmjD1YUMCiB+bw8ANF5H45gm+qBgLQniKO7/kRZ/7fdo69ahjJAzJ3N3QRaaWUQ1teUwtQ3QPaRk2bNo2UlJSdlqWkpHDbXbfxo8eO5p6FR/Lu9pFsLU5i0X+/5vGfzuJXY17jhG7vU8Fvdio+AYqLi5l89jWc3PsDbhj3Fk/98j0Wv/otVWUVO7Zp8D4gERFpdRo9Om5jpacz8OcT+c3np7KgOIeP/v4hV4x8iy7xW3l8zVhO/scx9BzYgfO7Pccrkx+m/NMv0XDwIiLRRVdA27DmjoJb3xnt2t13AVLYzrCUb2nf4VHe23gb5ZWl361LSdkxSIWINJ7O3rY8XQENjdr3gEJoPvurKp05/1nKw3/fwuMf78Gmyo4AdGM9p6S/xhkTCznk56OJ329fDacr0sYph7Y8dcGVkKuv+25WVhav3vsWn7++ls8+LGP+kvbMX9+LpRV9gRzg+/ukJXTnjpP+w7CD0hl6dCZpe2bqy4HILih5tjwVoKHT2JOdLTU1WHk5vP7oRh65ewNPz8uksDIVgN6s5NT0VznjxCIOuGosts/eu902EYk9yqEtTwWohFxTz2gXrCmiU68OOLu+appt+eyVvoK9Mrey11BnrzFpfF76Eb+/906WLV+uAY9EUPIMBRWgkRWqK6UlJfDiY9t49J71PDevN8VVSQDksJTTur3FGWcaI646Esvqu9ttEJHYoBza8nQPqIRcQ/O91SW9ZwpZ9cxV2r1zL/582lwuGPYhB3RawEa68uLWg7n1y+OY/PhE9rtyORde/yvyly3bMV/pBeddyG9PvpZNb34K27aFsKUisa8l773Oy8ujc+fOjB8/nvHjx3PEEUe0YKTfCdUJpry8PP773/+G5L1l90ydOnWn4hMCU4NNnTp1t943ORlOPrcDj87tx7qtSTx833Z+MDKfVdaHP224gH3vOp8h2UX8do+ZfP3nFwMVq4hIDcqj32mxPOruMfcYNWqUS2yZOXOmp6SkOLDjkZKS4jNnztxpu8pK97yvtvuLf/nGbz1jnqe267nTPt89sh3cM1jrYxPf94t6P+e3HfiEP3/RM/7NP2d5+YLF7uXlPnPmTM/OznYz8+zs7O8dTyQWlZWVeVlZ2S63a+zfXWMtXbrUjzjiiGbt21iVlZUhe++33nrLL7zwwjrX1fVvCszzKMh5Lf2IxhxqZnV+1ptZSI63ZYv7jDs2+TGDv/V4yj0wUpH73nHz/Q9jnvVvX/gqJMcVkchrbA51Vx6trb48Wt+/aX15NOKJsDmPaEyesmvNKQbr+1IC5of2+NozEjbu+OJQ85FAmffkVo8naaf92icm+YN33BmodEViVGOTZ3Z2dp1/P9nZ2c06bl2J85JLLvF///vfXllZ6UcffbR/8MEHvnTpUh85cqSfdtppPmrUKL/zzjvd3X3Lli1+6qmn+uGHH+6HHXaYL1q0yN3dx40b51dccYUfffTRvnDhQt9jjz3c3f1f//qXn3jiiX7SSSf5nnvu6U8++aSfcMIJPnToUH/99dfd3f3zzz/3I444wg877DA/9dRTvaioyN3d+/bt61OmTPEDDjjAr7zySnd3P+GEE7xnz54+btw4nzdv3i7/TVWAhk9L/19tivXrqvwf1y31w3ovcKNyRx4Zk/qZ/+XUOb564daQxyAi4dOUAlR5tHF5VAWotCqN+cPftLHK339ho//rugV+7bGf+MmDPvdh6XkOWfUUr319qH3pJ3Z4w3/R/xm/+7An/KVL/+vfPDDHS78KXDkViWaNTZ4tfVVp6dKl3qlTJx83bpyPGzfOzzrrLC8uLvYDDzzQp0yZ4rfccsuO7bp16+YFBQVeVlbm++yzj69du9avueYaf/jhh93d/dNPP/Uf/vCH7h5InA899NCO49RMnCeddJK7uz/88MM+cuRIr6io8E8++cRPPPFEd3cfO3as5+fnu7v7nXfe6XfddZe7uyclJfnq1au9qqrKBw8e7Fu3btUV0CjOoU29yhCq3i2rlhT5nWd/6AekfbmjEI2jwo/sOd/v/+XXvnlTVYscR0QipykFqPJo4/JoUwvQhN3ovSsSctOmTatzYIpp06bteN25izHmuC6MOa7LTvvGxS3H6xxjawWLfABfbRsK24BvgbeC+1BJX5aTkjCDZf53tleup1tKN356whQu+fFZZIzOxjqktng7RUIhKyur3hGrm2vUqFG8/vrrOy07//zzufrqq1m9evWOZUOGDCEtLQ2AYcOGsXTpUubPn8/s2bO59957AUhI+C4FHXTQQXUeb+TIkQBkZmYyfPhw4uPjyczMZNOmTQB8+eWXnHvuuQCUlJRw5JFHAtCnTx969uy5Y9/Nmzc3u80SetX3KzV2tNyaeSE/P58pU6bs9D7N1at/ey5/cD8uB759YykP/+4bHno/h9fXDOP1W+GSW0s5dvBSzrikMyf8qAepSgcirZryaGjyqApQiWpN+VJSW30fGtnZWSxZksiypZUs+WA9S+ZtZslXpSzJi+PbdR34eussSituBQJfbjYUreeGR+/ghkf3JJUscuIX0C99A/26F9Evu4p+gxPpt29n+o3pQfqgnhCnsb0kOjTmBM7uWr16Nffffz+//vWvuf7667n99tsBWLBgAdu2bSM5OZkvvviCfv36sddee3HggQdy0kknAVBWVrbjfeLj4+t8f6sxLVPN5x48uzRs2DAefvhhevXqtdN7Wq3pnNydxMREKioqdrfJLc7M0oGXgTIgBbjO3d+osf4K4MTgy2zgKXe/0sxmAPsAW4H17n5qWANvYZMmTWrUZ3tDAxa15MAb/Y/ox9Qj+nF9eQXz753Nw3dt4OFFo3h24RCe/TmkXFHM8SNWcuqlGRx3ZkdSUlrs0CISJZRH2Wn7lsqjKkAl6jX2S0ltDX1oxMdDvwHx9BvQkyPP7rnTftnZh7NsWVGtdysiOe6X9Gg3joWle/Dl5iGwGVgIvPrdVilMp5wbKGcNae0y+MHwCzjlyIlk792J7AN60mmPrprnVMJmd07g1Oejjz5i/PjxAFRVVZGYmMidd97JmDFjOOOMM3jxxRcZOnQoOTk5XHTRRSxatIjzzjuP7t27M3XqVH784x9z11134e5MnDiRq666arfaeM899zB58uQdQ8Bfd911HHXUUXVuO3z4cJYsWcIpp5zCb3/7W4YPH75bx25B24BD3b3CzPoDjwL7Va9099uB2wHM7EXg8Rr7/szd3wlnsJG2bNmyJi3fXdYugb1/No69fwZ/WLeeubc8zqO5FTy6dhyPfTyAx34EKVOKmThyNaf8uBvHnp5O8KKFiMQ45dGdtVQe1Tyg0qo1Z2LzuLg46vq7MDOqqqqoqICVC7ex9IO1LP10K3kLS1maH8eHK2bxTdHvcIpr7JUCTAcCx0xnK1lJa8lK30LfbsX07eMsr3yLpz/9J+u3rCGzTyZ/vPmPmudUGhTtc5jl5eXxox/96HtdjKJZtMwDamYjCBSVF9axrjsw2933DL6eAQwFSoG73f3RBt53CjAFICsra1RdvUNiRU5OTj29W7LJy8v73vLm5IHGqPp6Ie/e+h6PP9OOJzYfzmp6A5BkZRw1dAUnnZfOCZO7kZGx24cSkRYU7TkUYi+PNnUeUBWgIrU09cvNrvbrmNSDEzOfIn9jKsu2dWFFRU8qqP4DzSXwnbDmFdf29I6fxpCO4+nVqYReGRX07GX0yEygR04K3fdII2NgJ7rt0ZHEZHX3bYuiPXnGWuKEyBegZtaHwJXPQcAF7v58HdtcBnR1998GX3dz9w1m1gV4A/ihu3+7q2PFeg6tfQ8oBHq31DUfdVO2bTZ3quZ/yXt/fp+nXkjk6Y2Hkkc/IDCuwEF9l3PiicaJl2YyeGjdXeREJHyiPYdC7OVRFaAiu6m5X1h2deW0WmVZJas/X8/yTzZw4pVHsqFwbR3vlgXs6gpFLsZ1OCtItF4M6nApwzKOonN6BZ07OZ06x9G5Wzwdu7WjY0YiHXu2J71He9J7pZLeK5XU9HjdrhqjYiF5xpqysjLMLBqugOYAs9w9p451c4Gz3X1RHev+BLzv7k/v6hitIYc29qpmc08o7g7/ZhGf/u09nn6yimdX7Mvn7LNj3cC01Rx/8BaOv6gXY0/ohP6ERcJPObTl1ZVDQQWoSJM0p8tWc77oNFS0rv9iNavmb2TNokLW5pewdmU5a9ca6zYl8On6WczffjNVlNTYa+fuvg20DpgKLMPIpKNdS4/E40hrV0JaUilpSeV0aF9BWvtK0lKr6NAB0tKgQ3ocaZ3i6NAxgbQu7UjrlhR49EghrUcKqT06YPGqaMOhqqqK0tJS2rdvH+lQWo3i4mKSkpKIq3FWJlwFqJkluXtp8HkXAt1sh9faZhDwH3cfU2NZJ3ffYmaJBMbynuLuX+7qeG0phzb2xGC1Fu+uu349eQ/O4bmZW/nv/BxmVxxMOYkApMdv46iBeRx3YjuOvbQfvbITm38cEWk05dCWV1cOBRWgIiHXnCunLd3dt3e3Xjzx62fZsqaEzevK2LyhkoKtztYCY2thPJ+tf4sPt9xGJaU19mpPO+6hnPN31UKqC9fAFdpp1Cx246gkjULS47aRnlBEx3bFdEwqoWP7UjqmVNA5vZJOHZ3OXaBzt3i69EyiS+9kumal0rV/R1Iyu2Dtk3cRg1Tbvn07cXFxxMfHf2+kOmk8d6eyspKqqipSa82pEcYCdBRwB1BJYHDAG4CNwFHufmtwm98TGOn2rhr7vQJ0ANoBM939r405XlvKoU35jA15d93ycgrenMdr05fy3KwOvLTpANbRY8fqEelLOHb/TRx7bgZjTs+mXaL+rkVCRTm0ZTSUQ0EFqEhYNPXseai7+9ZW75exrCwWf/oF29ZuZ9v6YgrXFVO4oZRtm8sp3FzOK/97mfvfvpWyyu8K13hLYr/O19IlYSIFJUkUlidRUJ5CQWUqWz2t1n2u9Reu1ZIpJsM20K3dVronF9IjrYgeXcro0a2K3n3j6d0/mV6D0+k9vCsdBvaCRF0tqKqqorKyMtJhxLz4+PjvnbWFyHTBDYe2lEOb8hkb7u66VWvW8fF9H/Pik0W8+GU2H5aPxAn8P+xoWzmi7zdMOKKSCT/uR/b+PXbxbiLSVMqhLaO+HAoqQEWiVri6+0IICtd6jucOJdsr+de9/+LKX11GSel3IwMnxifzf8OvIStlApu2xLGpMIEN25LZUNyB9WXpbKrqXOOd6i5eO7OJvgmryeqwmayu2+nXt4J+AxPoPyKdPQ7qQfqwLEjQLFOye1SAtg6N/Yxtzudji3XZdWfDuwt5bfpSXnoziVdWDmMd3XesHpz4LUcPWcbRxycx/pI96ZDZqenHEBEJMxWgIq1Ic6+cRnvhClBRARtWlfGvv93H726/ktLy7+5zjbdk+rX/PSXl57CqPIMq6h5RsgdrGNh+BYMyNrNn/zKG7pvM0PHdyTpsD+I6aLZ4aRwVoG1Lc6Z3CVWX3aqSMj7N/ZJXHtrIK/O68m7BsB29StpRxoFpX3DUiA0cdUpHRk0eTkK6PtdEJPqoABVpZZpz5j1WCtfGHLOiAlYvLSH/f+tY+skWln5dwrd5xuLVqXy++W0K/WZqXzlNZRvDkhczovd69hlWyYhD0xlx6kDaZ2miPvk+FaBtS1M/H8M5H2nhqkJmT1/Iq88W8+rXmSws7bdjXUe2cFi3+Rx5wDaOmNSTwT8chiVqdE8Ribx686i7x9xj1KhRLiLNM3PmTM/OznYz8+zsbJ85c2aj9klJSXFgxyMlJWWX+2ZnZ++0T/UjOzt7l8c0szr3NbMmx5oQl+wjOt/kOYkrPNBB+LtHPOW+T7sv/cKc1/0fP3zF5z/4iVcWlewyPmn9gHkeBTmvpR/KofVryudjUz6jmvsZWp/8jzf4/T/+0M8cMNcz4jfs9JnW21b6OX1e9xmnv+jLXpzvXlnZrGOIiOyu+vKoroCKSKOE84ortPwIwdX7bd1QzucvLOezNzfw8UfOvKXd+LIoZ6fuvOlsZUynBRwybCuHTkzjgPOHktyjY4PxSuujK6DSkKZ8RoVygKOqKvjitdW8PmM5b8xJZPaqgWz370ajHBC3hMOylnD4uCrGn9+PnocOAo36KSJhoCugIhIRzbniWr1fc64YNOfK6bYt5f7rKbd7p5SeDuZxZDrM3HFFIZESH9vhI//NmFd89p8+8JKN25r0byCxCV0BlQY05TOquT06qo/TlM/Q0pIqf+ehfP/9CXN9XMYXnkjJTldI94xf4Jfs8Yo/+qNXfc2cb9yrqpr9byAi0pD68qiugIpI1ArXCMF1Xaltn9yecw+9jooVR/L24t4sKsv+bh1FjO30BUeP2crR5/Rk2GlDsYS6B0SS2KUroLIrjf2Mau4V0JYY6KhoWxXvP5zHW49v4K15aXy4eUCNabJgcPxixuXkc+ihcOi5OfQd119XSEWkRWgQIhFpE5rzha0xXw5XfbmZt/65mDdeqeCNxVksq+izY7uetoajsxdyzAQ46qeD6TasZ8s2SiJCBai0lHAPANeQ7QWVvPfgEmY9tYnZn6Tx4eaBlPPdvMrZccsZ23cphxxYxSFnZLLnxP7EJdQ9x5+ISENUgIpIm9HUK6dNHa3XHRa/s4bX/vEtr85qx5srh1BIWmAfqtgv5UuOGbmO487uwujJw4hP1oiUsUgFqLSk5vTo2J2RxBt7zKKCCubmLubtpzcy+6MOfLBpIMV8N61LZ9vMgd2XcPC+xRx8QldGnzmQ1E76TBORXVMBKiJSj929ylBeUskH/17Iy7kbefnjDD7ePmTHuq62kQmZX3HcMVVMuExXR2OJClCJtN35bGruVdfy4go+fmwR7zy5jjn/S+a9tf1Z799NVRVPBXt3+JYDB21izGHJ7H9qDgP360ScLpKKSC0qQEVE6rE791nVdYXhiJHH8spd3/DSS/DKsiFs8U7Ad1dHj913Hcee3TVwdTQpIZRNk92gAlQiLRIjidfmlVUsfvVb3n1kOe+953yQ35svygfhfFdxdowrYL8ey9lvnzJGHdmZ0T/IJKt/gm4lFWnjVICKiDQgVNPMVJRVMfffC3jpwQ28+FEPPikavGPbrraRCX2/4tijqzj6p4Povk+v0DROmkUFqESD5nw2we53321IwYJV/C/3Gz54Yzv/+7oDc7cMYg07f351TdjCvn3WMnLvKkYe3pkRE3owcJARr/HaRNoMFaAiIi2sOVcYVn+xMXB19GXj1eXfXR0FGJn8FcfsvZoJp3XkwB/tRWLH9iGKXBpDBajEslDOPVqbFxWz4uUvmPfcaj6aW8G8pV35qGQoG8jYabv2cSXslbGO4YPKGD4mlWGHZTB07wR699bAuyKtkQpQEZEWtrtXGCrKqvjwwYW89J/1vPJxN+ZtG7KjW1sq2zis2xccffA2jjqvD4NPHIzF6yarcFIBKrGsJaZw2R2+dh0rX/mCT19ZyycfVfFJXmfmlw5kCXvs1H0XoGO77QztvYUhg6oYvG8qQw7oxKAhcfTvD0lJIQ9VREKkvjyqm49ERJopKyurzisMWVlZu9z3e93q7p3GhDF9eO3uBbz6YiWvLunP8xvG8PyzwLPQN24FR2Yv4qgjnCMuHkD30bs+hoi0XdVFZnO677YE69GdzHMPJ/NcOL564dq1bH//Df589xP8Zc4TbCrbRDLdsfJf8X7+z3g/H3jtu/eIsyqyOm5lYFYpAwYn0H+fNPrvmUT//pCTA506haUpItLCQnYF1MzSgZeBMiAFuM7d36ixfjLwW6D629skd1/ZmPfW2VsRiQbNvcLQmP28yvnqleW8cv9yXn+nPbPXDqaI1B3b7534NUcOXs6RxyUx9uKhdOiX8b3jyO7RFVCRllfn519yMn858wL2qRjCws9LWZCXzDdbu7OIgSxmANuC01zV1jGphJzuRWRnVZE9MJGsIalk9YsnKwv69oWePdE9pyIRFPYuuGYWB8S5e4WZ9Qcedff9aqyfDGS6+01NfW8lTxGJFs0ZIKQ592aVFlXy/r+/4bVHN/HGJ535X8Fgqgh8s2pHGQemfs6R+6znyB92Yr8L9yahY2qd7yONpwJUpOU1+vOvqAgWLcIXLGTtvOV8O387S5bAt6uSWVLUk3yyySOHFWTu+CysLd4q6d1xO327l5LZx8nMSaDPwBQy90imTx/o0wd694bExBA1VqSNi+g9oGY2AviZu19YY9lk4HpgHfAW8Ft3r/emKTObAkwByMrKGlXXh5eISCzYnXtHaxa83dJ7sk+nKSxfO5mFJTk7tklnK4d1nc9RBxZy9Lm9GHDScCxBlwGaSgWoSMtrkdF5t26FpUth6VLKF+ez4ostLFtcxrIVceSva8/ykm6sIJPl9GU5fdlC5wbfLiO5gD4dt9Onawl9elXSJzOOPjnt6DMwhd5D0umT044uXTRQkkhTRaQANbM+wKPAIOACd3++xrrOQEHw5b+A19z9wca8r5KniMSy5o5O2VDX3XEjjuf1fyzh9VcqeH1JP9ZWftclt3/cUib0W8QxxxmH/2wYHQZqupfGUAEq0vLCMjrv9u2wciWsWAErV7Jt6XpWLilhRV4Fy1cnsHJjMm9t+Yr3qv5LMRuIozdV3AycXe9bJlsJvRM3kJm6hT4dt5HZrYQ+PSvJ7Gtk9mtH5qAUeu7ZmfieGdChg6pVESJ/BTQHmOXuOfWsPw6Y4O6XN+b9lDxFJJY1997Rxn5xc4f5r63htfuX8crsZN5eO4hSkgFIpJTxaR9z/MGbmTilD/3/bzjEaXTduqgAFWl5kR6dt94YkpK4+eQfsX+n/Vi5wlm5Jp6VG5NYuaUDK4s6sbI0gxXee6d78WuLp4JerKavrSSz/Qb6pm0lq8s2+vYsJ6uvkzUgkYwBHbFePQM3qPbqBenpKlal1YrEPaBJ7l4afN4FmO3uw2us7+TuW4LPbwO+dfe/Nea9lTxFJNY1597R5nZdKyqsZPb9i3npkS288Gkfvi3N3LFu74SvOHnfPE6e0o1h5+6LtdPg6NVUgIqERnM+/1pSc6/CelExW5duYuXXBaxcVMSKpeWsXOmsWJ3Aio3JrNiaxortndlU0bHe90immCyWkcUycsgjJ2ElOV0KyOlZQr9+0HNAB+L69oHMzMBISllZ0L27ThRKTIpEAToKuAOoJDDdyw3ARuAod7/VzKYBRwIVwELgYncvb8x7K3mKSFu0O13Xan7h69W9D+P6TWHFoh/yzsbv5h4dFL+YM/f9hkm/7M3AU/Zp82flw1WANnfU+GDvogeAJOAFd/9DY46nHCptXYvch9qA7dsDvX+Xf1vO8gXbWP5NCcuWVrBsRTz5a5NYtjmNksq6Rz5Kppgc8ujPt+zBksAjYRkDem2n/8B4EvtnBuag6d8/8NhjD+jatc1/Xkt0imgX3Jam5CkibVEopn058qCTePaWBTz13wTeWL0nFbQDYP+kzzj3yFWcfdsIOg5pm/eMhrEAbdao8Wb2CHCPu88xs9eBn7r7gl0dTzlU2rqw3IcaVNfV3rPOmsS6dZCfD3l5kLfUyVtUxtKF5XybZ+StSaas4vsDx8VRSTb5DGQRg/iGISxgMAsZ3GEVmYNSsEEDYdCgwGPIkMAjVSOiS+SoABURaQVCOe3L+vwiHvvd1+Q+k8L7m/cEIIXtnNXvfS65Op19L96vTZ1lj0QX3KaMGm9mC9x9SHCbXwBF7v6PXR1DOVTaunDdh9rc41RVwapVsGQJLF4c+LlokbPo60oWf2tsL/5+cdqBQvbka4byFUP5imF8wTC+oG9fw/YaCsOGffcYOhTat2+xdorURwWoiEgb1ZzuZovnbuT+6xZx/+yBrK/qCsDBKR9z/U8KOPYPY9vEtC7hLECbM2q8mX3j7oOC25wP9HT3P9bz/prKTKSGcNyH2tiTf02JxR1Wr4aFC3d+fP1VFXn5379PNI0ChvEFI/iUffiMffiMveO+JGXPbBgxIvDYd9/Ao1Onlmm4SJAKUBGRNqo53c1qfiHqmtaTzhWXs6joGgD2Sfya6yev4od3jiW+feudwT1CV0BzaOSo8bWugP4cKNYVUJHo0ZiTfy15NXb7dliwAL78MvCYPx/mz3dWrNi550oclQxhAfvyMfvyMfvxP/blY1IGZsLo0TBmTOAxYgQktt7PeAm9+vKohtQSEWnlpk2bRkpKyk7LUlJSmDZtWp3bV38hys/Px93ZULCalfyeX0+5nWN7fcJnZXty+vQjGN15MbP++H7glLw0m5kl1XhZABTWWt+pxsvDCQzcB/CZmR0UfH4s8HaoYhSRpsvKytrl8qlTp+5UfAIUFRUxderUOvfNzc0lJyeHuLg4cnJyyM3N3bEuNRVGjYJzz4VbboEXX4Tly41Nm2DWLPjLX+CCC2CfkfF8kzCUmZzDFdzBWN4hnQJGLH6cKQ+P54HLP2XBAedSldYRDjkErr0WXngBtmzZ7X8TEdAVUBGRNqEpXbx2dcX0k2fyueGnG/jvylEAnNz9Hf707x7scczAkLYh3MI4CFGzRo0PDlh0P5AIvFR7kKL6KIeKhEdjrm425RaJlrxaWloKX3wB8+YFHh9+CF984VRVfXe1tHPcFg6sepdDeZtDeZtRfEziPnvC4YcHHmPHQsf6p5wRURdcERFplMZ+IXrjrq/4xTWJzC8eQCKl/P7IOVz13Djik9uFM9yQ0TygIrK7dnXyrym3SDR39N7GnoDcvh0++gjefx/eey/wc/3679a3txIO9Hc5nDc5nDcZbR/T7oB9YcKEwGO//SBBc0nLd1SAiohIozTlS05leRX3Xfw/rp0xmC3eiUM6fMp/nkmn3xH9wxRt6KgAFZFQa8pVzeYMKLc7V03dYdEimDMH3n478KiZAjrEbWdc1VtM4BUm8AoDO67HjpkAEyfCscdCt26N+BeQ1kz3gIqISKM05Z7R+HZxXPzAAcz/uIKjMj7hnW0j2PvIDP517pu6N1REZBcmTZrE9OnTyc7OxszIzs6utzhszD2ltTX1HtOazAJTil54Ifz737B0aeDxwANw9tmQ1iOVFziey7iLwXxD/8JPufTRQ3nh3EcozsiCgw+GW28NzCUjUoMKUBER2UlTvhBVyxzRjZdXj+Cus96jknguePBwLtv7LSpLysMYuYhI7Jk0aRJ5eXlUVVWRl5dX72dtUweUA1i2bFmTlkPDAx3l5MD558ODD8LKlYH7SP/850AP3DWJWfydSzmeF+himzj+veu47+qFrB14MAwfDjfcAF99Vf8/hLQZ9XbBDQ71visl7v5my4a0a+o+JCISXWreY9Qzozfl669mg1/GxG5zefiTIaRlxt5AFY3tghvN+bIuyqEisaup85c29b7R3emyW1QEb70VGDD3hRegusY1qjiYdzmJp/khT5K9VxqcfnrgMWhQ4xouManJ94CaWSHwP8Dq3CCgX31zlYWSkqeISPSo6wtL++T2ZPIbFpVcyz7JC3j+rQ5kjsmMYJRN14QCNGrzZV2UQ0XajqYWlM0pWOsqiN3h88/hmWcCj08//W6fA/iAU3mcU3mcrP16Bvrznn469Oix+w2WqNKcAvQTdx+5izfd5TahoOQpIhI96vvC0rdvFgfHP8IjeQeSFb+Cd+ZA3wNjpwhtQgEatfmyLsqhIm1LU66ahmpamLw8ePJJePxxmDv3u+VjeZtJ5HJK3NN0PXb/QP/eE06AxMTmN1iiRnMK0Hbu3uDNO43ZJhSUPEVEokdDX1gqyiu56oA53PHRoQxu9y1zPulAxl7dIxBl0zWhAI3afFkX5VARqU84poXJzw8Uog8/DB9/HFjWjjIm8gKTmcFxXT+k3dmnw0UXwV577U5zJMKaMwruvWZ2UENvGi3JVEREIqehkRnj4o0/fziWHw15h4Xl/Tlmvw1szd8S3gBDT/lSRFqFpgx01JwBjgCys+GqqwJzjn71Ffz615DZrx3PcBI/4Fl6b5rPz/+Sw/xhZ8AhhwRGPCoubn6jJOo0VIAuB2aa2QIzu8bMeoYrKBERiR27+sJicca9nx3IqX0/4OPioZy491KKNxbV9VaxSvlSRFqFUE8LU9uee8Lvfw9Llhhvvw0XXAAlqV35Cz9nb+Zz4Lu38sC5b7G9zyC4+urAPDAS8+otQN39BnfvD1wK7AUsNLPnzOwkM4sPW4QiIhLVGvOFJT4xnplf7cuEbvN4u2Ak5434FK9qHfOEKl+KSGsSymlhaque8iU+Po5zzsnh8MNzWbPGmDEjMI3oBxzIhTxA781fcNmtmXzdfyKceCK89prmmo5h9d4D+r0NzdKA04GfAj3dPWJneHX/iohIbNq+vohDspfxafEQ7j1rNhfnjot0SPVq7D2gdewXNfmyLsqhItJSmjotTO19dzWI0VdfwX33wYx/OZu3BAYaP5w3+An38H97LSH+yp/DWWdBUlKLt012X3PuAa25swGHABOAfsCsFo1ORERateqz3Gk9OrAu7UgSeYCfP7Q/85/8JtKhtSjlSxFpSxp7tbQuU6dO3an4BCgqKmLq1Kk7Xg8dCrffDitWGg88AKNGOW9yBD/kKQZ8+Qy3XzCfrX2HwU03webNLdYuCa0GC1AzG2RmNwMrgJuA2UCOu58RjuBERCT2VZ/lzs/Px91ZtW4lJFxKCU9x2lnxbF+3PdIh7jblSxGRpmnKIEYpKZCYmMv69f0wiyMlJYd8e48ruZ0+6z/h8l+nkZd5SGB0o5UrQx267KZ6C1Azex94F2gPTHT3Ue5+t7vr9IKIiDRaXWe5yypKSU24kgVle3DZIR9HKLKWoXwpItJ0TRnEqPpE5rJlgROZRUX5JCdP4cQTc0nqnMJfuZwBRZ8x6c8j+TTnBzBligYsimINXQG9A+jj7pe7+6dhikdERFqZ+s5yF1WuY3DitzywaCxPXvV+mKNqUcqXIiJN1JRBjOo6kVlcXMRnn01l+Yo47r4bsnLieIhJjKz4H8f98we8O+A8OP98WLQopO2QpmuoAN3g7mUN7Wxmh7dwPCIi0so0dJb74RllxFHJFXf2pXhTzM7zpnwpItJETZnypaHuuikp8JOfwDeL4njkERixTxUvcRyHVL3NYTPO5fXBP8HPvwDy8kLcImmshgrQ282svZml1PcA/hyuQEVEJDY1dJZ75JlDuGjouyyrzOS2U+dGKMLdpnwpItIMjR3EqDHddRMS4PTT4eNP4njhBRg4YCazOJ+j/HXaz3iRqf2Ph0su0T2iUaChAnRvYFs9j8Lgzx6hDlBERGLbrs5y3/jEUDqylZvf3I+V81ZHONpmUb4UEQmhpnTXNYPNm3NZuepiIB9wSlnLH3wpQ+/twpz+58G118KWLWGJXb6v3gLU3ePcPT74s/ajennvcAYrIiKxqaGz3Bl7duO3//cJRaRy7WlLIhhl8yhfioiEVlO660Ld94xCEV+Ty6Flr3P8LYfwefYJgTleSkpC3wDZSaPmARUREQmln8w8iEHtljJz6SF8cN8XkQ5HRESiTFPmHK3vnlGzZYwaUcELHM+Igtmcc2UGeQOOhCeeAPdQhS61qAAVEZGIyc3NJScnh+T0ZDanHATk8vOfQ1VFVaRDExGRGNXQPaMffpTAI4/AHjlVzOQchqx8nRNPfYys9inExcWRk5NDbm5umCNuW1SAiohIRFTP65afH5jXbf3WNcTxI+Zu/4znfjsv0uGFjZmlm9l7ZjbLzD40syNqrb/azOaa2btmdpeZWXD5LDN7P/jzrshELyISfRq6ZzQuLjBY0VffJHDPPdCu/eM8xwssLy3B3cnPz2fKRRepCA0hFaAiIhIRdd2jU0UJMJU77kmMTFCRsQ041N3HA2cAN9da/7S7H+DuBxMYzKjmlC6nuvt4d/9ZeEIVEYl+jblntF07uPRS6NT118DOuaiouJipl10GVeqNEwq7LEDNrLuZzTSzt4Ov9zazH4c+NBERac3qu0cHljF76wg+fmhBWOPZXc3Nl+5e5e4VwZfpwOe11tecRb0UqN7WgUfM7E3NMyoisrPG3jO6cmXduSh/0ybWHXACzJ8fyjDbpMZcAf0n8A7QKfh6AXBpqAISEZG2ob57dLqldQfgjl9tDGc4LaHZ+dLM+pjZO8CrwNP1bDMO6AW8HVx0qrsfApwH/N3M0hp4/ylmNs/M5q1fv74xIYmItAn15SLIZvC8mfxzxD1U/eo3Gi23BTWmAO3j7vcClQDuXgboerSIiOyW+u7Ruf2vt5Idv5xHlu4fa/OCNjtfuvvKYDG5P3B37fVmtjeBrrlnuAeGanT3DcGfy4HPgAENvP90dx/t7qMzMjKa1ioRkVasvlz0w5OnUdIujSlV93L4tMP5Zq+TyP3Nb8jJydFgRbupMQVoRc0XZtYJsJBEIyIibUZ99+icM/kcLpu4hAracc9lCyMdZlM0K1+aWVKNlwVAYa31A4AHCBSfG4LLzMzSg8/TgOEEZlwXEZEmqC8XPfHkJD7/MoHxB5cxm/EM/fZ0zr/xjzsGzsvPz2fKlCkqQpvBfBdz3pjZ1cAewBHATQS6E+W6+19CH17dRo8e7fPmtZ0REkVE2pqty7bSN9tIsEqWr0kktXtq2GMws4/cfXQTtm9WvjSzUcAdBK6cJgA3ABuBo9z9VjN7HhgCrAjuciuBrrofAMVAO+B2d3+0MXEqh4qINJ47PPAAXHRRNu7fv180OzubvLy88AcWA+rLo7ssQIM7TwJOJHAm97/uPrPlQ2w8JU8Rkdbvin1ncccn47nn9Le59JFDw378phagwX2iKl/WRTlURKTp4uLiqKtuMjOqNFpunerLo42ahsXdc939dHc/LRqTqYiItA65ubk77q95bNXZwIPc+VRfvGrXJ0ujgfKliEjrVN9gRb0Tk2HVqjBHE9saMw3L42b2WK3HP83sAjPTPKIiItIicnNzmTJlyo77a1auXUk8U1hU/h7/+8/XkQ5vl5QvRURar7oGK4IUCkr/zCtDfwEvvbRjac2TqRqs6PsakxDXAH0JDC3/DtAnuPw04M76djKzdDN7z8xmmdmHZnZErfXJZpZrZnOCP5Ob1wQREWkNpk6dSlHRzpOBV1ICTOWxe2Ji6pBm5UsREYl+tQcrysrK5uST/8F2u5hjtj7KNcd9Tvkvryf3wQd3OpmqwYq+rzGDEL1NYCCE0uDrZOB14HDgU3cfWs9+cUCcu1eYWX/gUXffr8b6HwMZ7n6jmf0GWBccvn6XdP+KiEjrU9/9NWBkxS8jr6wPFhe+QdibMQhRs/JluCmHioi0nNmz4axTSlm1IYmDeYf8pAmsKC363nZtcbCi3bkHtAdQVuN1OdAtOL9ZaX07uXuVu1cPSZ8OfF5rk3HA88HnzwVf10uTaIuItG713V/TPq4Hyyoz+fBfX4Y5oiZrVr4UEZHYNW4cfPZ1EsccVsq7HMKK0uI6t1u27Psj6LZVjSlAZwMvmNmZZnYm8Cwwx8w6sIuEamZ9zOwdAsPFP11rdVdgc/D5FqBLQ++lSbRFRFq3+iYDP/+IiwF47O8bIxFWUzQ7X4qISOzq1g2efy2JqddWAnWfTK3vJGtb1JgC9CfAS8ApwccrwKXuvs3dxzS0o7uvdPdDgP2Bu2ut3gR0Cj7vGHwtIiJtVH2Tgd8840qSKebxTwdQVRnVo+E2O1+KiEhsi4+Hm/4Yz+WXTwO+fzJ12rRpkQksCu2yAHX3cne/y91/GHzc5e7lu9rPzJJqvCwACmttMhs4Lvj8uOBrERFpwyZNmkReXh5VVVXk5eUxadIk0nqncVzvT1le2Ye5D0RvN9zm5ksREWk97rxzErfcMp2E+L6A0Z4M7hp9MJNOP32n7drySLmNmYYlIXj/5d/M7IHqRyPee5iZvW1mbxHohvRzMxthZr8Mrp8BDDezOcDw4GsREZHvOe2UwCTf0dwNdzfypYiItCJXXz2JVauXMWZEEcWs429v/4E1R50D27YB3592rK2NlNuYUXDvBxKAw4C/A2cBb7v7T0IfXt00gp+ISNuybc02uveKo0v8VpaV9CAuIfTTajZjFNyoy5d1UQ4VEQmP4mI45/RSnnwuiWzyeHWfqxn01j/IGTmS/Pz8723f2kbK3Z1RcPd39/OALe7+R+AQYK+WDlBERKSmmt2Tho0ZxvBOf2JlZS/evy9qu+EqX4qIyA7t28NjzyRx5eUV5JPD2M/u4vMDLqp3RNy2MlJuYwrQ6rGEK80sxd23At1DGJOIiLRxdXVP+nTbzUAuj967eZf7R4jypYiI7CQuDm67M4E/3FjJOnowbtE/6RGXXOe2bWWk3MYUoJvMrDPwMvCSmT0JrAxtWCIi0pZNnTqVoqKdJ/IuqygFrueVr/pGJqhdU74UEZE6XfereP76lyq20JlNlXeTRPxO69vSSLmNKUAnuvtmYCrwT+At4OSQRiUiIm1a/d2QlvNNeT82L90SznAaS/lSRETq9bPL4njgfqfCJlPJP+kRl7LTtGOTJk0CWv8IuY0pQK8EcPcqd5/p7ncDl4Q2LBERacvq64aU1i7Qo/XDh5eEM5zGUr4UEZEGnX+BkZtrVNl5bKtay7t9TyNv7tydis/WPkJuYwrQMxq5TEREpEVMmzaNlJTvT+R9zriLAfjgtdpTS0cF5UsREdmlM8407r/f2E4Hjln2Dz4++GewYQNQ9y0oRUVFTJ06NRKhhkRCfSvM7CjgaKC3mf2pxqqOgIU6MBERabuqzwRPnTqVZcuWkZWVxbRp0ziw9yH87XWY+2VqhCP8jvKliIg01eTzjeKiKi79aUeOXvI3Zo3/KcPm3t8mRsittwAFyoBtgAPbayxfDfwxlEGJiIhMmjRpRyFazaucDFvPBxsG4FWOxUVFfad8KSIiTXbJT+IoLqrkyqu7MeHLP/PB//2UrL59ya+j2GxNI+TWW4C6+2xgtpk96e5fhDEmERGROlmccUDGUp5ftz+L3shn0FHZkQ5J+VJERJrtil/Gs3ljOTfd0oeJb/yCX41bw+UbNuzUDbe1jZDbUBfcS2s8P7T2enf/W6iCEhERqc+Y4dt5/g2Y++SKqChAlS9FRGR3/P6P7cj7toSZj+/NY7N/wd9P68xv5r630y0otXsExbKGuuDu18A6b+lAREREGmPM0enwBnzwXiXnRDqYAOVLERFpNjO478FklucX89qHR9P3seUsffQk7LRTv7dtbm7u98ZHiLXitKEuuOeHMxAREZHG2O/MAdg1Vcxd0i3SoQC7ny/NLB14mcC9pCnAde7+Ro31ycD9QBawDLjQ3UvMLAd4AEgCXnD3P+xOHCIiEjlJSfD0y+05aGQxD+RfyKCzf801Q/eEYcN2bFM9RUt199zqKVqAmCpCdzkNiwVcbGaPBx8XmVlUjPogIiJtQ81Jufceuw+94+/gs6KBFG8qjnRoO+xGvtwGHOru4wlM23JzrfWTgQXuPhZYGHxNcLvfuvvBwOFmNqQl2iEiIpHRuTO8+FZ7unYo4fryG3h9wq2wZcuO9a1lipbGzAP6J+BU4Jng41TgltCFJCIi8p26JuVeUzWVCh7j48cWRzq8mpqVL929yt0rgi/Tgc9rbTIOeD74/Lnga4AR7j4n+PyFGstFRCRG9esHjzydDGacueo2lp1yBVRVAfVPxRJrU7Q0pgCdABzj7rnungtMBI4JbVgiIiIBdZ3xrfRSYCofvLQpMkHVrdn50sz6mNk7wKvA07VWdwU2B59vAboEn9fM4TWX1/X+U8xsnpnNW79+fWNCEhGRCDnySJj2+yo2kMEpb/yY0hsCM3rVNxVLrE3R0pgC1Nh5EAVHE2uLiEiY1H9mdxkffJwU1lh2odn50t1XuvshwP7A3bVWbwI6BZ93DL4GqKqxTc3ldb3/dHcf7e6jMzIyGhOSiIhE0DVTE/jBhGL+x/5cdmMGvPoq06ZNIyUlZaftYnGKlsYUoK8AL5nZWWZ2FoFuPi+HNiwREZGA+s7sGpnMXd03zNE0qFn50sxqVtEFQGGtTWYDxwWfHxd8DfCZmR0UfH4s8HZzAxcRkehiBjMebc/AzCKmM4WZp/2XSRMmMH36dLKzszEzsrOzmT59ekwNQAQNFKBmNjb49GoC3YFODj6eBq4JfWgiIiLUe8Z3SPuLWV7Zh1WfrI1QZAEtkC+HmdnbZvYW8CzwczMbYWa/DK6fAQw3sznA8OBrgOuAaWb2LjDH3b9uifaIiEh06NgRnnwxhaT4cn6ydRr5k65n0llnkZeXR1VVFXl5eTFXfELDV0BnmNk3BBLqs+5+SvBxr7tXNbCfiIhIi5k0aVKdZ3x/sE/g4t/cR/MiG+Bu5kt3/8jdD3X3w9x9rLu/4e6fuvutwfXF7n5mcN2Z7l4SXP5tcJ+D3f2m0DZRREQiYfhw+OMfjQI6ct6rZ1F5/4yd1tccJT4nJ4fc3NzIBNoE9Rag7r4HcDGwJ/C1mb1gZiebWb1zh4qIiITCpEmTvnfGd/9DkwH46J3ITsWifCkiIqF0+ZUJHDFmO7MZz+2XLobFgRHg6xolfsqUKVFfhDZ4D6i7v+Xu5wGZBLoSXQGsNLPbwxGciIhIfXoNSgNg4+bGDGcQWsqXIiISKnFxMOPxVDq1L2Vq+W/57KQboKIiZucFbVTWdvdC4H7gj8AyAmd6RUREIia9e+AKaEFRfIQj+Y7ypYiIhEJmJtz7QCLlJDLpi2spveNvMTsv6C4LUDMbbGa3ACuAG4B/AX1CHJeIiEiD0nqmAlBY3C7CkQQoX4qISCidfoZx1g+K+JJh3DK1gKzevevcLtrnBW1oFNwpZvY+MAdIBI519/3c/W/uviVcAYqIiNQlvWdgZNzC0sgWoMqXIiISLndOT6FLSjF/KL+Kn6UPisl5QRu6AvoD4M9AH3f/hbt/Hp6QREREdq1Dzw4AFJQlRzgS5UsREQmPjAz4051JlJLMS19fz/QfXRRz84LWO0Kfux9X3zoREZFIi2sXTwcKKSyPbAGqfCkiIuF0/oVxzPjbNt749EjO/88z5OV9Fpg0NEZEfuhAERGRZkqL205BZWqkwxAREQmbuDi4d2YHEuIquWLLr9l81XddbmNhXlAVoCIiErPS4osprFIBKiIibctee8Evf1HJOnpw7X0D4MsvY2ZeUBWgIiISs9LbFVFEKhWllZEORUREJKx+9ftE+mUU8k9+xPxL/hYz84KqABURkZiVllgKwLY12yIciYiISHilpMAf/5KKE8c1cybGzLygKkBFRCRmpSeXAVCwenuEIxEREQm/U0+PY/TgAl7iODLi674lJdrmBVUBKiIiMSstuQKAwnXFEY5EREQk/OLi4E9/TwcgpeJqUhITd1ofjfOCqgAVEZGYlZ4auPezYK0KUBERaZsOOwyOO7SQPH7N5HbjyO7bN6rnBa13HlAREZFol9ahCoDCDaURjkRERCRybrknjZf3ruLF7f9g4fVPkXT9lZEOqV66AioiIjErPS3ws2BTeWQDERERiaBhw+C800vIox9//8NmqDUabjRRASoiIjErraMBULipIsKRiIiIRNbvb00hKb6cW7b/hJJ7ZwCQm5tLTk4OcXFx5OTkRMWcoCHrgmtmI4G7gUqgAviRu39bY/0NwOnA2uCiI9xdE7mJiEijpXeKB6Bwq9KHiIi0bZmZMPmMEv6R24v/3LSM1K7/Zsqll+6YGzQ/P58pU6YARPS+0FBeAV0NHOPuhwK3Ab+rY5tp7j4++NC3BxERaZK0zoHzqAVbPMKRiIiIRN5VN6QRZ1XcuvlCrr/iyh3FZ7WioiKmTp0aoegCQlaAuvsady8MviwlcBW0tqvN7B0zuyxUcYiISOuV3rUdAIXbIhyIiIhIFBgwAE49dhuLGcjyTRvr3GbZsmVhjmpnIb8H1MxSgZuAW2utugvYBzgKONHMxu7ifaaY2Twzm7d+/frQBCsiIjElLSMZgIJt8RGOREREJDpcc1NgXtAEeta5PisrK5zhfE9IC1Azawc8Ctzi7l/VXOfuGz2gGHgKGN3Qe7n7dHcf7e6jMzIyQhe0iIjEjOoCtHC7xtQTEREBGDkSJhxYQDm3kWQ7D/mTkpLCtGnTIhRZQMgytpnFATOBZ9z9mTrWdwr+NGA8sDBUsYiISOuU3qM9AAUl7SIcSfOZ2Ugze9fM3jazN82sf631fzKzWcHHajP7WXD5LDN7P/jzrshELyIi0ejaP6QDk9jDf0l29+6YGdnZ2UyfPj2iAxBBCEfBBU4GJgI9zOxsYD7wApDh7g8Cd5rZYMCAWe7+YghjERGRViitZyoAhTFcgPLdoH2FZnYcgUH7zqle6e5XVz83s/nAkzX2PdXdV4QtUhERiQnjxsEBe25l7td/YO6QcvZfW/tuyMgJWQHq7k8ATzSwfnKoji0iIm1Dh54dACgoS45wJM3n7mtqvKxv0D7MbF9grbuvqt4VeMTMyoCb3P3N+o5hZlOAKRD5e39ERCT0zODqG9P54Snw9zl7sf/q1dCrV6TDAsIwCJGIiEioxCclkMo2CsvbRzqU3dbAoH3VzgZqziB+qrsfApwH/N3M0up7b42jICLS9pxwotGjwzYe81Mp+MfDkQ5nBxWgIiIS09LjtlFQmRLpMHZLQ4P2BdfHA/9Hje637r4h+HM58BkwIDzRiohILGjXDs49F4pI5bG/bSA3N5ecnBzi4uLIyckhNzd3128SAipARUQkpqXFF1FYlRrpMJptV4P2BR0BzHP3guA+ZmbpwedpwHAgPwzhiohIDDn/p4FbVW5Zn8iUCy8kPz8fdyc/P58pU6ZEpAhVASoiIjEtvV0xRaRSUVYV6VCaq3rQvrOrR7Q1s2PM7Jwa25xNoEitlgC8ZWbvAK8DN7j7pvCFLCIisWDPPeHAIZtZzAyKSkt3WldUVMTUqVPDHlMoR8EVEREJubTEUiiCbWu20SkrPdLhNNmuBu0LbnNurdflwKhQxiUiIq3DBb/oyPsXL6tz3bJldS8PJV0BFRGRmJaeVAZA4dqiCEciIiISfU47Iw6jb53rIjEyugpQERGJaWntA7OWFKzeHuFIREREok96Ohyy/2+AnQfsS0lJYdq0aWGPRwWoiIjEtPSUQAFauL4kwpGIiIhEp2m3XQhMpz0ZmBnZ2dlMnz6dSZMmhT0W3QMqIiIxLa2DA1CwvnQXW4qIiLRNhxwCA7ofz9J1p7P6l3+lxy1XRCwWXQEVEZGYlpYW+Fm4qTyygYiIiEQpMzj7bKOSBF54sjiisagAFRGRmJbe0QAo2FQR4UhERESi17GnB0aKf3XJANgUuZm7VICKiEhMS+sYSGWFWyojHImIiEj0GjUKuiRv5zWOpPLl1yIWhwpQERGJaeldA8MZFGz1CEciIiISveLj4cgDt7OJrnyUuyBicagAFRGRmJbWJRGAwsIIByIiIhLlJpzZBYBXZydBVVVEYlABKiIiMS29W6AALdimlCYiItKQo48N9Bp6ZfvB8MknEYlB2VpERGJaWvf2ABQWKaWJiIg0JDMThvbazPscyNan34xIDMrWIiIS09J7BAvQ4nYRjkRERCT6TZiYQCUJvPXExogcXwWoiIjEtLReqQAUlCRGOBIREZHod/QPAxNov7IwJyLTsagAFRGRmNahZyCRFpYlRTgSERGR6HfooZAUX86rHAWvhX86FhWgIiIS0+KTEkhlGwXl7SMdioiISNRLSYFDRxbyLXuw+NGPwn58FaAiIhLz0uO2UVipAlRERKQxjj6lIwCvvB4PHt55tFWAiohIzEuLL6KgqkOkwxAREYkJE46LB+DVwjGwcmVYj60CVEREYl5aQglFpFJZHplJtUVERGLJsGHQK3Urb3I4lV98HdZjqwAVEZGYl55YAkDhmu0RjkRERCT6mcH+AzazjTTy39MVUBERkSZJSy4DVICKiIg01uC9EgBY+NG2sB5XBaiIiMS89PblABSsKYpwJCIiIrFh0P6dAPhmYXhvX1EBKiIiMS8tpRKAwvUlEY6k6cxspJm9a2Zvm9mbZta/1vobzOxrM5sVfMQHl+8b3O89M5sckeBFRCRmDR4VGLxv4cq0sB43IaxHExERCYH0DoGztwUbyiIcSbOsBo5x90IzOw74HXBOrW2mufvMWsvuAs4GVgIfmNmz7r459OGKiEhrMHhw4OfCkizYuBG6dg3LcXUFVEREYl5acAaWwo2xV4C6+xp3Lwy+LAUq6tjsajN7x8wuAzCzJCDV3Ze6exkwB9g/PBGLiEhr0K0bdErczkIGw9fhGwlXBaiIiMS89I4GQOHm8ghH0nxmlgrcBNxaa9VdwD7AUcCJZjYW6ApsqbHNFqBLA+89xczmmdm89evXt2TYIiISo8xgcK8CVpLJtk8Whe24KkBFRCTmpXUKTKhdsDk25wE1s3bAo8At7v5VzXXuvtEDioGngNHAJqBTjc06BpfVyd2nu/todx+dkZHR4vGLiEhsGjzQAVg0t94U0uJUgIqISMxL7xwoQAsLYq8ANbM4YCbwjLs/U8f6TsGfBowHFrp7CbDdzLKCxeshwIfhillERFqHQSNTAFj4Rfh6EGkQIhERiXlpXRMBKCiIcCDNczIwEehhZmcD84EXgAx3fxC408wGAwbMcvcXg/tdDjwcXP43DUAkIiJNNXi/jgAszEsK2zFVgIqISMyrLkALt8Vexx53fwJ4ooH1k+tZPg84OERhiYhIGzB4SGAMhW+2doft2yE1NeTHjL1MLSIiUkt692QACoriIxyJiIhI7BgwAIyqwEi4CxeG5ZgqQEVEJOal9Qjcw1JYpI49IiIijdW+PWR1KmQhg/Evv9r1Di1ABaiIiMS89F6BLkMFpYkRjkRERCS2DM4pZRtprP7firAcL2QFqJmNNLN3zextM3vTzPrXWt/FzJ43szlmdldwdD8REZEm69CzAwCFpeEbREFERKQ1GDy8HQDffLI9LMcL5RXQ1cAx7n4ocBvwu1rrrwYedfexQCowIYSxiIhIKxbfPpFUtlFQ0T7SoYiIiMSUQaPSAVi4KDydY0N2FHdf4+6FwZelQEWtTcYBzwefPxd8LSIi0ixpcdspVAEqIiLSJIOHBgbwW7iuM5SHfj7QkJe5ZpYK3ATcWmtVF2BL8PmW4OuG3meKmc0zs3nr169v6TBFRCTGpcdvp6CqQ6TDEBERiSmDBwd+LvSBsHhxyI8X0gLUzNoBjwK3uHvtYZU2Ax2DzzsCmxp6L3ef7u6j3X10RkZGywcrIiIxLS2hmCJSqazwSIciIiISMzIzoX1CGd8wCL7+OuTHC+UgRHHATOAZd3+mjk1mA8cFnx8XfC0iItIs6YmlAGxbG55BFERERFqDuDgY2Hs7S+lH2fzQzwUayiugJwMTgbPNbFZwpNtjzOyc4Po/AZPMbA5QDrwawlhERKSVS0sqA6BgtQpQERGRphg82KgkgSXzNof8WCGbsdvdnwCeaGD9RgIFqoiIyG5Lbx8YOKFwXXGEIxEREYktg/dNhddg4ZcV7BniY4VnrF0REZEQS0upBKBgrQpQERGRphi0V3Au0IMmh/xYKkBFRKRVSEutAqBwQ2mEIxEREYktO0bCTdo75MdSASoiIq1CemAebQo2lEU2EBERkRizowAN/RhEobsHVEREJJxOmFhFVsFf2e+AgyIdioiISEzp2BFOOgkGDQr9sVSAiohIq7D3FUey9xVHRjoMERGRmPTUU+E5jrrgioiIiIiISFioABUREREREZGwUAEqIiIiIiIiYaECVERERERERMJCBaiIiIiIiIiEhQpQERERERERCQsVoCIiIiIiIhIWKkBFREREREQkLMzdIx1Dk5nZeiC/Bd6qG7ChBd4n0lpDO9SG6KA2RI/W0I5Yb0O2u2dEOoiW1oI5FGL/d1yb2hPd1J7opvZEt0i0p848GpMFaEsxs3nuPjrSceyu1tAOtSE6qA3RozW0ozW0QRrW2n7Hak90U3uim9oT3aKpPeqCKyIiIiIiImGhAlRERERERETCoq0XoNMjHUALaQ3tUBuig9oQPVpDO1pDG6Rhre13rPZEN7Unuqk90S1q2tOm7wEVERERERGR8GnrV0BFREREREQkTFSAioiIiIiISFioABUREREREZGwUAEqIiIiIiIiYdFmC1Azm2xm75nZu2a2b6Tj2RUzKzazWcHHhRZwl5nNMbPnzaxLcLsuwddzgustgjG/YmbrzexXwddNitnM9g3+ft4zs8lR1I7xZra6xu9jVDS3w8xGBo//tpm9aWb9zSzZzHKDseaaWXJw25zgNu+a2fU13uMYM3s/+JgQ7jY00I7JZra0xu+iTzS3w8zSg/8PZpnZh2Z2RKz9XdTThpj6m5CWYTGWR2H381K0aYnP92jSEp+R0cjMBplZuZkdEsu/H4jN76MNMbNRZvaqmb1lZn+K5faY2dAav5v3zWxj1LbH3dvcA+gMfAwkAv2AdyIdUyNiXlzr9THA/cHn5wI3B5/fDJwTfP4AcEwEY84EJgO/ak7MwLvB309i8PfVOUraMR64r47torIdQE8gLfj8OOBB4MfAr4PLfgP8OPj8EWBs8PnrwBAgHvgc6BR8fAbER+D3UFc7dvxeam0ble0gcNIvIfi8P/C/WPu7qKcNMfU3oUeL/D+IuTwajHu38lK0PXb38z3S8dfRnt3+jIzGR/D38jpwSCz/foKxxdz30Qbakgi8Vv03FOvtqdW204B7o7U9bfUK6P7AHHcvc/elQJqZJUU6qF3oaWazzewpM8sBxgHPB9c9F3xNA8vDzt1X1FrU6JiDv49Ud1/q7mXAHAK/t7Crox0AE2qcNWofXBaV7XD3Ne5eGHxZClTUFWvw+Qh3nxN8/kJw+QBgqbtvcfctQF5wWVjV0w6Ac83sHTO70cyqP9Oish3uXuXu1XGnEyiIY+rvop42QAz9TUiLiMU8ult5KfTRNV0LfL5Hld39jAxXnE1hZgcAa4Dq/3sx+/sJirnvow04ENgGPBS8+jyW2G5PTWcDM4nS9rTVArQrsLnG6y1Al8iE0mg57j4O+AdwPzu3YQuBs9EQaMeWGsujqV1NiblrjWU1l0eDj4CB7j4WKACuCi6P6naYWSpwE3Ar3/9dVMdU8zOhenlU/b3UasezwJ4EPjizgUnBzaK2HWbWx8zeAV4FniYG/y7qaENM/k3IbomKv6cWEIu59Ht24/M96uzmZ2Q0mkrgalO1mP790Dq+j1brDexD4LvDOcA/gW7EbnsAMLOuBHp+vUuU/n7aagG6iUAXvGodg8uilrtvCP58hcAX7Zpt6Mh3/7k2B19XL4+mdjUl5qj9Hbl7obuXBF/mAqODz6O2HWbWDngUuMXdv+L7v4vqmKpq7BZVbYDvt8PdN7t7pbtXEui+VP27iNp2uPtKdz+EwBWku4nBv4vabYjFvwnZba3l9xiLuXQnu/n5HnV28zMyqpjZRGCeu2+ssTjWfz+t4ftotU3Ae+5e4O4rgQ0EbtfpFFwfa+2pdjrwuAf610bl76etFqBzgUPMrJ2ZZQHb3L000kHVx8w6mFl88PneBP5AZhO434Pgz9nB5/UtjwaNjjn4ZXa7mWUFk+shwIfhDLY+ZtaxxsvDgYXB51HZjmC31JnAM+7+TH2xBp9/ZmYHBZ8fC7wNLAL6WWBwiHQC93stDkfsNdXVDjPrVGOTmr+LqGxHrS6KBUAhMfZ3UVcbYu1vQlpETOXRBsRiLt2hBT7fo8rufkaGI8YmGgGMN7OXgaOA24Cvid3fT2v5PlptLjDIzBLMLA3oDjxJ7Lan2iQCnwsQpb8fC9582uaY2QXAjwAHLnf3eREOqV5mtj+Brg6FBOK9DJgP3AXsTeBD+lx33xi87P4fvrt34mfuXlXnG4c+7n8CBwFJwBfAyU2J2cxGA38BjMAAJw9EoBl1teNV4AKgiMCH7wXuviVa22FmpwAzgOr/4/OBqwncdJ5J4L6U8929xMz6E+hSkwi85O43Bd/jOODXwf1vdPcXw9eCgHraUQAcSeC+p4XAxe5eHq3tsMDosHcAlUACcAPwFjH0d1FPGwYTQ38T0jJiKY9W2928FJmo69cSn+/RpCU+IyMRd2OY2QzgPgK3LMTq7ycmv482xMzOAS4G2hHoKv0ssd2e/sBj7j46+DqOKGxPmy1ARUREREREJLzaahdcERERERERCTMVoCIiIiIiIhIWKkBFREREREQkLFSAioiIiIiISFioABUREREREZGwUAEqIiIiIiIiYaECVCSKmNlcM/vUzL4ys4rg80/N7F9m9nszOz2Ex55sZlvM7L1dbJcTjKnMzIaFKh4REZGmUA4ViQ0JkQ5ARL7j7gdAIEEB89x9RJhDeN3dT2loA3fPA0aYWV5YIhIREWkE5VCR2KAroCIxwsxmmNlPg89vMLNHzOxFM1tsZo+a2Ugze9PMlpjZrTX262VmT5jZh2Y238yub+TxUszs8eCZ5M/M7LFQtU1ERCSUlENFooeugIrErlHAaGAb8DFwM3Asgb/rpWY23d0XAf8BbnT3t80sEXjDzP7n7q/t4v0nAOnuPhTAzDqHqiEiIiJhphwqEiEqQEVi1yvuvhXAzD4HPnP3UqDUzBYCe5jZKmA8kGFm1fulAXsCu0qenwF7mtk9wCzghRZvgYiISGQoh4pEiApQkdhVUuN5ZR2vEwh0s3dgP3cvb8qbu/u3ZrYXcASBs8J/MLPh7l6yi11FRESinXKoSIToHlCRVszdC4E5wLXVy8ysr5n13NW+ZpYJVLr7M8AvgAygS4hCFRERiSrKoSKhoQJUpPWbBAwNDp4wH3gU6NSI/YYD75vZZ8CHwB/dfVXowhQREYk6yqEiLczcPdIxiEgUMLPJwPG7GkK+xvZ5we2/CGVcIiIi0U45VKTxdAVURKoVA6MbO4k20A5o0j0xIiIirZRyqEgj6QqoiIiIiIiIhIWugIqIiIiIiEhYqAAVERERERGRsFABKiIiIiIiImGhAlRERERERETC4v8Bk9NNtSoloUkAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", + "\n", + "# plot the 1C results\n", + "t_sol = solutions1[0][\"Time [s]\"].entries\n", + "ax1.plot(t_sol, solutions1[0][\"Terminal voltage [V]\"](t_sol))\n", + "t_sol = solutions2[0][\"Time [s]\"].entries\n", + "ax1.plot(t_sol, solutions2[0][\"Terminal voltage [V]\"](t_sol))\n", + "ax1.plot(voltage_data_1C[:,0], voltage_data_1C[:,1], \"o\")\n", + "ax1.set_xlabel(\"Time [s]\")\n", + "ax1.set_ylabel(\"Voltage [V]\")\n", + "ax1.set_title(\"1C\")\n", + "ax1.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", + "\n", + "# plot the 5C results\n", + "t_sol = solutions1[1][\"Time [s]\"].entries\n", + "ax2.plot(t_sol, solutions1[1][\"Terminal voltage [V]\"](t_sol))\n", + "t_sol = solutions2[1][\"Time [s]\"].entries\n", + "ax2.plot(t_sol, solutions2[1][\"Terminal voltage [V]\"](t_sol))\n", + "ax2.plot(voltage_data_5C[:,0], voltage_data_5C[:,1], \"o\")\n", + "ax2.set_xlabel(\"Time [s]\")\n", + "ax2.set_ylabel(\"Voltage [V]\")\n", + "ax2.set_title(\"5C\")\n", + "ax2.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a 1C discharge we observe an excellent agreement between the model and experiment, both in terms of the overall shape of the curve and the capacity. The agreement between model and experiment is less good at 5C, but in line with other implementations of the DFN (e.g. [[6]](#References)). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", + "[3] Madeleine Ecker, Stefan Käbitz, Izaro Laresgoiti, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: II. Model Validation. Journal of The Electrochemical Society, 162(9):A1849–A1857, 2015. doi:10.1149/2.0541509jes.\n", + "[4] Madeleine Ecker, Thi Kim Dung Tran, Philipp Dechent, Stefan Käbitz, Alexander Warnecke, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: I. Determination of Parameters. Journal of the Electrochemical Society, 162(9):A1836–A1848, 2015. doi:10.1149/2.0551509jes.\n", + "[5] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[6] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[7] Giles Richardson, Ivan Korotkin, Rahifa Ranom, Michael Castle, and Jamie M. Foster. Generalised single particle models for high-rate operation of graded lithium-ion electrodes: systematic derivation and validation. Electrochimica Acta, 339:135862, 2020. doi:10.1016/j.electacta.2020.135862.\n", + "[8] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/models/DFN.ipynb b/examples/notebooks/models/DFN.ipynb index 10ca9f8b43..2cd768ed2e 100644 --- a/examples/notebooks/models/DFN.ipynb +++ b/examples/notebooks/models/DFN.ipynb @@ -297,7 +297,20 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.0" + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true } }, "nbformat": 4, diff --git a/examples/notebooks/models/MPM.ipynb b/examples/notebooks/models/MPM.ipynb index df3bbf649a..3660f3ba7b 100644 --- a/examples/notebooks/models/MPM.ipynb +++ b/examples/notebooks/models/MPM.ipynb @@ -973,7 +973,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.0" + "version": "3.8.10" }, "toc": { "base_numbering": 1, diff --git a/examples/notebooks/parameterization/change-input-current.ipynb b/examples/notebooks/parameterization/change-input-current.ipynb index 44c17514cf..4a296b7ac3 100644 --- a/examples/notebooks/parameterization/change-input-current.ipynb +++ b/examples/notebooks/parameterization/change-input-current.ipynb @@ -72,7 +72,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "aef64b871f1346a4b42c722c7eecfe38", + "model_id": "34863ef9d7fb4b83a9db107cbe534616", "version_major": 2, "version_minor": 0 }, @@ -111,7 +111,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6447d4f706374208b5cbd283577b5da5", + "model_id": "590814de9055434f959b6925097c76a4", "version_major": 2, "version_minor": 0 }, @@ -183,7 +183,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "84f87c3d21644c20bafdac8e9b69247d", + "model_id": "0f52c24ce31b4ff9bad73c37e9d0dd32", "version_major": 2, "version_minor": 0 }, @@ -275,7 +275,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6c06d938eca0491d88cdcbb29c59cd2a", + "model_id": "b0d73894ac2a4609acb7751a644ba65b", "version_major": 2, "version_minor": 0 }, diff --git a/examples/notebooks/parameterization/parameterization.ipynb b/examples/notebooks/parameterization/parameterization.ipynb index ce90d9e6e7..1cbf777415 100644 --- a/examples/notebooks/parameterization/parameterization.ipynb +++ b/examples/notebooks/parameterization/parameterization.ipynb @@ -1,2495 +1,2495 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Parameterisation\n", - "\n", - "In this notebook, we show how to find which parameters are needed in a model and define them.\n", - "\n", - "For other notebooks about parameterization, see:\n", - "\n", - "- The API documentation of [Parameters](https://pybamm.readthedocs.io/en/latest/source/parameters/index.html) can be found at [pybamm.readthedocs.io](https://pybamm.readthedocs.io/)\n", - "- [Setting parameter values](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%204%20-%20Setting%20parameter%20values.ipynb) can be found at `pybamm/examples/notebooks/Getting Started/Tutorial 4 - Setting parameter values.ipynb`. This explains the basics of how to set the parameters of a model (in less detail than here).\n", - "- [parameter-management.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/parameterization/parameter-management.ipynb) can be found at `pybamm/examples/notebooks/parameterization/parameter-management.ipynb`. This explains how to add and edit parameters in the `pybamm/input` directories\n", - "- [parameter-values.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/parameterization/parameter-values.ipynb) can be found at `pybamm/examples/notebooks/parameterization/parameter-values.ipynb`. This explains the basics of the `ParameterValues` class.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Adding your own parameter sets (using a dictionary)\n", - "\n", - "We will be using the model defined and explained in more detail in [3-negative-particle-problem.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Creating%20Models/3-negative-particle-problem.ipynb) example notebook. We begin by importing the required libraries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mWARNING: You are using pip version 21.0.1; however, version 21.1.1 is available.\n", - "You should consider upgrading via the '/Users/vsulzer/Documents/Energy_storage/PyBaMM/.tox/dev/bin/python -m pip install --upgrade pip' command.\u001b[0m\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setting up the model\n", - "\n", - "We define all the parameters and variables using `pybamm.Parameter` and `pybamm.Variable` respectively." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "c = pybamm.Variable(\"Concentration [mol.m-3]\", domain=\"negative particle\")\n", - "\n", - "R = pybamm.Parameter(\"Particle radius [m]\")\n", - "D = pybamm.FunctionParameter(\"Diffusion coefficient [m2.s-1]\", {\"Concentration [mol.m-3]\": c})\n", - "j = pybamm.InputParameter(\"Interfacial current density [A.m-2]\")\n", - "c0 = pybamm.Parameter(\"Initial concentration [mol.m-3]\")\n", - "c_e = pybamm.Parameter(\"Electrolyte concentration [mol.m-3]\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define our model equations, boundary and initial conditions. We also add the variables required using the dictionary `model.variables`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.BaseModel()\n", - "\n", - "# governing equations\n", - "N = -D * pybamm.grad(c) # flux\n", - "dcdt = -pybamm.div(N)\n", - "model.rhs = {c: dcdt} \n", - "\n", - "# boundary conditions \n", - "lbc = pybamm.Scalar(0)\n", - "rbc = -j\n", - "model.boundary_conditions = {c: {\"left\": (lbc, \"Neumann\"), \"right\": (rbc, \"Neumann\")}}\n", - "\n", - "# initial conditions \n", - "model.initial_conditions = {c: c0}\n", - "\n", - "model.variables = {\n", - " \"Concentration [mol.m-3]\": c,\n", - " \"Surface concentration [mol.m-3]\": pybamm.surf(c),\n", - " \"Flux [mol.m-2.s-1]\": N,\n", - "}\n", - "\n", - "model.length_scales = {\"negative particle\": pybamm.Scalar(1)}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also define the geometry, since there are parameters in the geometry too" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "r = pybamm.SpatialVariable(\"r\", domain=[\"negative particle\"], coord_sys=\"spherical polar\")\n", - "geometry = pybamm.Geometry({\"negative particle\": {r: {\"min\": pybamm.Scalar(0), \"max\": R}}})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Finding the parameters required" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To know what parameters are required by the model and geometry, we can do" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial concentration [mol.m-3] (Parameter)\n", - "Interfacial current density [A.m-2] (InputParameter)\n", - "Diffusion coefficient [m2.s-1] (FunctionParameter with input(s) 'Concentration [mol.m-3]')\n", - "\n", - "Particle radius [m] (Parameter)\n" - ] - } - ], - "source": [ - "model.print_parameter_info()\n", - "geometry.print_parameter_info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tells us that we need to provide parameter values for the initial concentration and Faraday constant, an `InputParameter` at solve time for the interfacial current density, and diffusivity as a function of concentration. Since the electrolyte concentration does not appear anywhere in the model, there is no need to provide a value for it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Adding the parameters\n", - "\n", - "Now we can proceed to the step where we add the `parameter` values using a dictionary. We set up a dictionary with parameter names as the dictionary keys and their respective values as the dictionary values." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def D_fun(c):\n", - " return 3.9 #* pybamm.exp(-c)\n", - "\n", - "values = {\n", - " \"Particle radius [m]\": 2,\n", - " \"Diffusion coefficient [m2.s-1]\": D_fun,\n", - " \"Initial concentration [mol.m-3]\": 2.5,\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass this dictionary in `pybamm.ParameterValues` class which accepts a dictionary of parameter names and values. We can then print `param` to check if it was initialised." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Diffusion coefficient [m2.s-1]': ,\n", - " 'Initial concentration [mol.m-3]': 2.5,\n", - " 'Particle radius [m]': 2}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param = pybamm.ParameterValues(values)\n", - "\n", - "param" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating the parameter values\n", - "\n", - "The parameter values or `param` can be further updated by using the `update` function of `ParameterValues` class. The `update` function takes a dictionary with keys being the parameters to be updated and their respective values being the updated values. Here we update the `\"Particle radius [m]\"` parameter's value. Additionally, a function can also be passed as a `parameter`'s value which we will see ahead, and a new `parameter` can also be added by passing `check_already_exists=False` in the `update` function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Diffusion coefficient [m2.s-1]': ,\n", - " 'Initial concentration [mol.m-3]': 1.5,\n", - " 'Particle radius [m]': 2}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param.update({\"Initial concentration [mol.m-3]\": 1.5})\n", - "param" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solving the model " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Finding the parameters in a model\n", - "\n", - "The `parameter` function of the `BaseModel` class can be used to obtain the parameters of a model." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[FunctionParameter(0x736b1e61c4b31acc, Diffusion coefficient [m2.s-1], children=['Concentration [mol.m-3]'], domain=['negative particle'], auxiliary_domains={}),\n", - " Parameter(0x40657aef7bd7f3b3, Initial concentration [mol.m-3], children=[], domain=[], auxiliary_domains={}),\n", - " InputParameter(0x7ae41be7144e72f1, Interfacial current density [A.m-2], children=[], domain=[], auxiliary_domains={})]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "parameters = model.parameters\n", - "parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As explained in the [3-negative-particle-problem.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Creating%20Models/3-negative-particle-problem.ipynb) example, we first process both the `model` and the `geometry`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "param.process_model(model)\n", - "param.process_geometry(geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now set up our mesh, choose a spatial method, and discretise our model" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "submesh_types = {\"negative particle\": pybamm.Uniform1DSubMesh}\n", - "var_pts = {r: 20}\n", - "mesh = pybamm.Mesh(geometry, submesh_types, var_pts)\n", - "\n", - "spatial_methods = {\"negative particle\": pybamm.FiniteVolume()}\n", - "disc = pybamm.Discretisation(mesh, spatial_methods)\n", - "disc.process_model(model);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We choose a solver and times at which we want the solution returned, and solve the model. Here we give a value for the current density `j`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# solve\n", - "solver = pybamm.ScipySolver()\n", - "t = np.linspace(0, 3600, 600)\n", - "solution = solver.solve(model, t, inputs={\"Interfacial current density [A.m-2]\": 1.4})\n", - "\n", - "# post-process, so that the solution can be called at any time t or space r\n", - "# (using interpolation)\n", - "c = solution[\"Concentration [mol.m-3]\"]\n", - "c_surf = solution[\"Surface concentration [mol.m-3]\"]\n", - "\n", - "# plot\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", - "\n", - "ax1.plot(solution.t, c_surf(solution.t))\n", - "ax1.set_xlabel(\"Time [s]\")\n", - "ax1.set_ylabel(\"Surface concentration [mol.m-3]\")\n", - "\n", - "rsol = mesh[\"negative particle\"].nodes # radial position\n", - "time = 1000 # time in seconds\n", - "ax2.plot(rsol * 1e6, c(t=time, r=rsol), label=\"t={}[s]\".format(time))\n", - "ax2.set_xlabel(\"Particle radius [microns]\")\n", - "ax2.set_ylabel(\"Concentration [mol.m-3]\")\n", - "ax2.legend()\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using pre-defined models in `PyBaMM`\n", - "\n", - "In the next few steps, we will be showing the same workflow with the Single Particle Model (`SPM`). We will also see how you can pass a function as a `parameter`'s value and how to plot such `parameter functions`.\n", - "\n", - "We start by initializing our model" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "spm = pybamm.lithium_ion.SPM()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Finding the parameters in a model\n", - "\n", - "We can print the `parameters` of a model by using the `get_parameters_info` function." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Maximum concentration in negative electrode [mol.m-3] (Parameter)\n", - "Negative electrode thickness [m] (Parameter)\n", - "Separator thickness [m] (Parameter)\n", - "Positive electrode thickness [m] (Parameter)\n", - "Typical current [A] (Parameter)\n", - "Number of electrodes connected in parallel to make a cell (Parameter)\n", - "Electrode width [m] (Parameter)\n", - "Electrode height [m] (Parameter)\n", - "Reference temperature [K] (Parameter)\n", - "Maximum concentration in positive electrode [mol.m-3] (Parameter)\n", - "Nominal cell capacity [A.h] (Parameter)\n", - "Typical electrolyte concentration [mol.m-3] (Parameter)\n", - "Negative electrode Bruggeman coefficient (electrolyte) (Parameter)\n", - "Separator Bruggeman coefficient (electrolyte) (Parameter)\n", - "Positive electrode Bruggeman coefficient (electrolyte) (Parameter)\n", - "Negative electrode electrons in reaction (Parameter)\n", - "Positive electrode electrons in reaction (Parameter)\n", - "Number of cells connected in series to make a battery (Parameter)\n", - "Initial temperature [K] (Parameter)\n", - "Lower voltage cut-off [V] (Parameter)\n", - "Upper voltage cut-off [V] (Parameter)\n", - "Current function [A] (FunctionParameter with input(s) 'Time [s]')\n", - "Negative particle radius [m] (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", - "Negative electrode diffusivity [m2.s-1] (FunctionParameter with input(s) 'Negative particle stoichiometry', 'Temperature [K]')\n", - "Positive particle radius [m] (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", - "Positive electrode diffusivity [m2.s-1] (FunctionParameter with input(s) 'Positive particle stoichiometry', 'Temperature [K]')\n", - "Initial concentration in negative electrode [mol.m-3] (FunctionParameter with input(s) 'Dimensionless through-cell position (x_n)')\n", - "Initial concentration in positive electrode [mol.m-3] (FunctionParameter with input(s) 'Dimensionless through-cell position (x_p)')\n", - "Negative electrode active material volume fraction (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", - "Positive electrode active material volume fraction (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", - "Negative electrode porosity (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", - "Separator porosity (FunctionParameter with input(s) 'Through-cell distance (x_s) [m]')\n", - "Positive electrode porosity (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", - "Ambient temperature [K] (FunctionParameter with input(s) 'Time [s]')\n", - "Negative electrode exchange-current density [A.m-2] (FunctionParameter with input(s) 'Electrolyte concentration [mol.m-3]', 'Negative particle surface concentration [mol.m-3]', 'Temperature [K]')\n", - "Negative electrode OCP [V] (FunctionParameter with input(s) 'Negative particle stoichiometry')\n", - "Negative electrode OCP entropic change [V.K-1] (FunctionParameter with input(s) 'Negative particle stoichiometry')\n", - "Positive electrode exchange-current density [A.m-2] (FunctionParameter with input(s) 'Electrolyte concentration [mol.m-3]', 'Positive particle surface concentration [mol.m-3]', 'Temperature [K]')\n", - "Positive electrode OCP [V] (FunctionParameter with input(s) 'Positive particle stoichiometry')\n", - "Positive electrode OCP entropic change [V.K-1] (FunctionParameter with input(s) 'Positive particle stoichiometry')\n", - "\n" - ] - } - ], - "source": [ - "spm.print_parameter_info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that there are no `InputParameter` objects in the default SPM. Also, note that if a `FunctionParameter` is expected, it is ok to provide a scalar (parameter) instead. However, if a `Parameter` is expected, you cannot provide a function instead." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to view what parameters are needed is to print the default parameter values. This can also be used to get some good defaults (but care must be taken when combining parameters across datasets and chemistries)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Negative electrode thickness [m]': 0.0001,\n", - " 'Separator thickness [m]': 2.5e-05,\n", - " 'Positive electrode thickness [m]': 0.0001,\n", - " 'Electrode height [m]': 0.137,\n", - " 'Electrode width [m]': 0.207,\n", - " 'Nominal cell capacity [A.h]': 0.680616,\n", - " 'Typical current [A]': 0.680616,\n", - " 'Current function [A]': 0.680616,\n", - " 'Maximum concentration in negative electrode [mol.m-3]': 24983.2619938437,\n", - " 'Negative electrode diffusivity [m2.s-1]': ,\n", - " 'Negative electrode OCP [V]': ,\n", - " 'Negative electrode porosity': 0.3,\n", - " 'Negative electrode active material volume fraction': 0.6,\n", - " 'Negative particle radius [m]': 1e-05,\n", - " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode electrons in reaction': 1.0,\n", - " 'Negative electrode exchange-current density [A.m-2]': ,\n", - " 'Negative electrode OCP entropic change [V.K-1]': ,\n", - " 'Maximum concentration in positive electrode [mol.m-3]': 51217.9257309275,\n", - " 'Positive electrode diffusivity [m2.s-1]': ,\n", - " 'Positive electrode OCP [V]': ,\n", - " 'Positive electrode porosity': 0.3,\n", - " 'Positive electrode active material volume fraction': 0.5,\n", - " 'Positive particle radius [m]': 1e-05,\n", - " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode electrons in reaction': 1.0,\n", - " 'Positive electrode exchange-current density [A.m-2]': ,\n", - " 'Positive electrode OCP entropic change [V.K-1]': ,\n", - " 'Separator porosity': 1.0,\n", - " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", - " 'Reference temperature [K]': 298.15,\n", - " 'Ambient temperature [K]': 298.15,\n", - " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", - " 'Number of cells connected in series to make a battery': 1.0,\n", - " 'Lower voltage cut-off [V]': 3.105,\n", - " 'Upper voltage cut-off [V]': 4.2,\n", - " 'Initial concentration in negative electrode [mol.m-3]': 19986.609595075,\n", - " 'Initial concentration in positive electrode [mol.m-3]': 30730.7554385565,\n", - " 'Initial temperature [K]': 298.15}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "{k: v for k,v in spm.default_parameter_values.items() if k in spm._parameter_info}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define a dictionary of values for `ParameterValues` as before (here, a subset of the `Chen2020` parameters)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Ambient temperature [K]': 298.15,\n", - " 'Current function [A]': 5.0,\n", - " 'Electrode height [m]': 0.065,\n", - " 'Electrode width [m]': 1.58,\n", - " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", - " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", - " 'Initial temperature [K]': 298.15,\n", - " 'Lower voltage cut-off [V]': 2.5,\n", - " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", - " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", - " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020',\n", - " array([[0. , 1.81772748],\n", - " [0.03129623, 1.0828807 ],\n", - " [0.03499902, 0.99593794],\n", - " [0.0387018 , 0.90023398],\n", - " [0.04240458, 0.79649431],\n", - " [0.04610736, 0.73354429],\n", - " [0.04981015, 0.66664314],\n", - " [0.05351292, 0.64137149],\n", - " [0.05721568, 0.59813869],\n", - " [0.06091845, 0.5670836 ],\n", - " [0.06462122, 0.54746181],\n", - " [0.06832399, 0.53068399],\n", - " [0.07202675, 0.51304734],\n", - " [0.07572951, 0.49394092],\n", - " [0.07943227, 0.47926274],\n", - " [0.08313503, 0.46065259],\n", - " [0.08683779, 0.45992726],\n", - " [0.09054054, 0.43801501],\n", - " [0.09424331, 0.42438665],\n", - " [0.09794607, 0.41150269],\n", - " [0.10164883, 0.40033659],\n", - " [0.10535158, 0.38957134],\n", - " [0.10905434, 0.37756538],\n", - " [0.1127571 , 0.36292541],\n", - " [0.11645985, 0.34357086],\n", - " [0.12016261, 0.3406314 ],\n", - " [0.12386536, 0.32299468],\n", - " [0.12756811, 0.31379458],\n", - " [0.13127086, 0.30795386],\n", - " [0.13497362, 0.29207319],\n", - " [0.13867638, 0.28697687],\n", - " [0.14237913, 0.27405477],\n", - " [0.14608189, 0.2670497 ],\n", - " [0.14978465, 0.25857493],\n", - " [0.15348741, 0.25265783],\n", - " [0.15719018, 0.24826777],\n", - " [0.16089294, 0.2414345 ],\n", - " [0.1645957 , 0.23362778],\n", - " [0.16829847, 0.22956218],\n", - " [0.17200122, 0.22370236],\n", - " [0.17570399, 0.22181271],\n", - " [0.17940674, 0.22089651],\n", - " [0.1831095 , 0.2194268 ],\n", - " [0.18681229, 0.21830064],\n", - " [0.19051504, 0.21845333],\n", - " [0.1942178 , 0.21753715],\n", - " [0.19792056, 0.21719357],\n", - " [0.20162334, 0.21635373],\n", - " [0.2053261 , 0.21667822],\n", - " [0.20902886, 0.21738444],\n", - " [0.21273164, 0.21469313],\n", - " [0.2164344 , 0.21541846],\n", - " [0.22013716, 0.21465495],\n", - " [0.22383993, 0.2135479 ],\n", - " [0.2275427 , 0.21392964],\n", - " [0.23124547, 0.21074206],\n", - " [0.23494825, 0.20873788],\n", - " [0.23865101, 0.20465319],\n", - " [0.24235377, 0.20205732],\n", - " [0.24605653, 0.19774358],\n", - " [0.2497593 , 0.19444147],\n", - " [0.25346208, 0.19190285],\n", - " [0.25716486, 0.18850531],\n", - " [0.26086762, 0.18581399],\n", - " [0.26457039, 0.18327537],\n", - " [0.26827314, 0.18157659],\n", - " [0.2719759 , 0.17814088],\n", - " [0.27567867, 0.17529686],\n", - " [0.27938144, 0.1719375 ],\n", - " [0.28308421, 0.16934161],\n", - " [0.28678698, 0.16756649],\n", - " [0.29048974, 0.16609676],\n", - " [0.29419251, 0.16414985],\n", - " [0.29789529, 0.16260378],\n", - " [0.30159806, 0.16224113],\n", - " [0.30530083, 0.160027 ],\n", - " [0.30900361, 0.15827096],\n", - " [0.31270637, 0.1588054 ],\n", - " [0.31640913, 0.15552238],\n", - " [0.32011189, 0.15580869],\n", - " [0.32381466, 0.15220118],\n", - " [0.32751744, 0.1511132 ],\n", - " [0.33122021, 0.14987253],\n", - " [0.33492297, 0.14874637],\n", - " [0.33862575, 0.14678037],\n", - " [0.34232853, 0.14620776],\n", - " [0.34603131, 0.14555879],\n", - " [0.34973408, 0.14389819],\n", - " [0.35343685, 0.14359279],\n", - " [0.35713963, 0.14242846],\n", - " [0.36084241, 0.14038612],\n", - " [0.36454517, 0.13882096],\n", - " [0.36824795, 0.13954628],\n", - " [0.37195071, 0.13946992],\n", - " [0.37565348, 0.13780934],\n", - " [0.37935626, 0.13973714],\n", - " [0.38305904, 0.13698858],\n", - " [0.38676182, 0.13523254],\n", - " [0.3904646 , 0.13441178],\n", - " [0.39416737, 0.1352898 ],\n", - " [0.39787015, 0.13507985],\n", - " [0.40157291, 0.13647321],\n", - " [0.40527567, 0.13601512],\n", - " [0.40897844, 0.13435452],\n", - " [0.41268121, 0.1334765 ],\n", - " [0.41638398, 0.1348317 ],\n", - " [0.42008676, 0.13275118],\n", - " [0.42378953, 0.13286571],\n", - " [0.4274923 , 0.13263667],\n", - " [0.43119506, 0.13456447],\n", - " [0.43489784, 0.13471718],\n", - " [0.43860061, 0.13395369],\n", - " [0.44230338, 0.13448814],\n", - " [0.44600615, 0.1334765 ],\n", - " [0.44970893, 0.13298023],\n", - " [0.45341168, 0.13259849],\n", - " [0.45711444, 0.13338107],\n", - " [0.46081719, 0.13309476],\n", - " [0.46451994, 0.13275118],\n", - " [0.46822269, 0.13443087],\n", - " [0.47192545, 0.13315202],\n", - " [0.47562821, 0.132713 ],\n", - " [0.47933098, 0.1330184 ],\n", - " [0.48303375, 0.13278936],\n", - " [0.48673651, 0.13225491],\n", - " [0.49043926, 0.13317111],\n", - " [0.49414203, 0.13263667],\n", - " [0.49784482, 0.13187316],\n", - " [0.50154759, 0.13265574],\n", - " [0.50525036, 0.13250305],\n", - " [0.50895311, 0.13324745],\n", - " [0.51265586, 0.13204496],\n", - " [0.51635861, 0.13242669],\n", - " [0.52006139, 0.13233127],\n", - " [0.52376415, 0.13198769],\n", - " [0.52746692, 0.13254122],\n", - " [0.53116969, 0.13145325],\n", - " [0.53487245, 0.13298023],\n", - " [0.53857521, 0.13168229],\n", - " [0.54227797, 0.1313578 ],\n", - " [0.54598074, 0.13235036],\n", - " [0.5496835 , 0.13120511],\n", - " [0.55338627, 0.13089971],\n", - " [0.55708902, 0.13109058],\n", - " [0.56079178, 0.13082336],\n", - " [0.56449454, 0.13011713],\n", - " [0.5681973 , 0.129869 ],\n", - " [0.57190006, 0.12992626],\n", - " [0.57560282, 0.12942998],\n", - " [0.57930558, 0.12796026],\n", - " [0.58300835, 0.12862831],\n", - " [0.58671112, 0.12656689],\n", - " [0.59041389, 0.12734947],\n", - " [0.59411664, 0.12509716],\n", - " [0.59781941, 0.12110791],\n", - " [0.60152218, 0.11839751],\n", - " [0.60522496, 0.11244226],\n", - " [0.60892772, 0.11307214],\n", - " [0.61263048, 0.1092165 ],\n", - " [0.61633325, 0.10683058],\n", - " [0.62003603, 0.10433014],\n", - " [0.6237388 , 0.10530359],\n", - " [0.62744156, 0.10056993],\n", - " [0.63114433, 0.09950104],\n", - " [0.63484711, 0.09854668],\n", - " [0.63854988, 0.09921473],\n", - " [0.64225265, 0.09541635],\n", - " [0.64595543, 0.09980643],\n", - " [0.64965823, 0.0986612 ],\n", - " [0.653361 , 0.09560722],\n", - " [0.65706377, 0.09755413],\n", - " [0.66076656, 0.09612258],\n", - " [0.66446934, 0.09430929],\n", - " [0.66817212, 0.09661885],\n", - " [0.67187489, 0.09366032],\n", - " [0.67557767, 0.09522548],\n", - " [0.67928044, 0.09535909],\n", - " [0.68298322, 0.09316404],\n", - " [0.686686 , 0.09450016],\n", - " [0.69038878, 0.0930877 ],\n", - " [0.69409156, 0.09343126],\n", - " [0.69779433, 0.0932404 ],\n", - " [0.70149709, 0.09350762],\n", - " [0.70519988, 0.09339309],\n", - " [0.70890264, 0.09291591],\n", - " [0.7126054 , 0.09303043],\n", - " [0.71630818, 0.0926296 ],\n", - " [0.72001095, 0.0932404 ],\n", - " [0.72371371, 0.09261052],\n", - " [0.72741648, 0.09249599],\n", - " [0.73111925, 0.09240055],\n", - " [0.73482204, 0.09253416],\n", - " [0.7385248 , 0.09209515],\n", - " [0.74222757, 0.09234329],\n", - " [0.74593034, 0.09366032],\n", - " [0.74963312, 0.09333583],\n", - " [0.75333589, 0.09322131],\n", - " [0.75703868, 0.09264868],\n", - " [0.76074146, 0.09253416],\n", - " [0.76444422, 0.09243873],\n", - " [0.76814698, 0.09230512],\n", - " [0.77184976, 0.09310678],\n", - " [0.77555253, 0.09165615],\n", - " [0.77925531, 0.09159888],\n", - " [0.78295807, 0.09207606],\n", - " [0.78666085, 0.09175158],\n", - " [0.79036364, 0.09177067],\n", - " [0.79406641, 0.09236237],\n", - " [0.79776918, 0.09241964],\n", - " [0.80147197, 0.09320222],\n", - " [0.80517474, 0.09199972],\n", - " [0.80887751, 0.09167523],\n", - " [0.81258028, 0.09322131],\n", - " [0.81628304, 0.09190428],\n", - " [0.81998581, 0.09167523],\n", - " [0.82368858, 0.09285865],\n", - " [0.82739136, 0.09180884],\n", - " [0.83109411, 0.09150345],\n", - " [0.83479688, 0.09186611],\n", - " [0.83849965, 0.0920188 ],\n", - " [0.84220242, 0.09320222],\n", - " [0.84590519, 0.09131257],\n", - " [0.84960797, 0.09117896],\n", - " [0.85331075, 0.09133166],\n", - " [0.85701353, 0.09089265],\n", - " [0.86071631, 0.09058725],\n", - " [0.86441907, 0.09051091],\n", - " [0.86812186, 0.09033912],\n", - " [0.87182464, 0.09041547],\n", - " [0.87552742, 0.0911217 ],\n", - " [0.87923019, 0.0894611 ],\n", - " [0.88293296, 0.08999555],\n", - " [0.88663573, 0.08921297],\n", - " [0.89033849, 0.08881213],\n", - " [0.89404126, 0.08797229],\n", - " [0.89774404, 0.08709427],\n", - " [0.9014468 , 0.08503284],\n", - " [1. , 0.07601531]])),\n", - " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Negative electrode active material volume fraction': 0.75,\n", - " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", - " 'Negative electrode electrons in reaction': 1.0,\n", - " 'Negative electrode exchange-current density [A.m-2]': ,\n", - " 'Negative electrode porosity': 0.25,\n", - " 'Negative electrode thickness [m]': 8.52e-05,\n", - " 'Negative particle radius [m]': 5.86e-06,\n", - " 'Nominal cell capacity [A.h]': 5.0,\n", - " 'Number of cells connected in series to make a battery': 1.0,\n", - " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", - " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020',\n", - " array([[0.24879728, 4.4 ],\n", - " [0.26614516, 4.2935653 ],\n", - " [0.26886763, 4.2768621 ],\n", - " [0.27159011, 4.2647018 ],\n", - " [0.27431258, 4.2540312 ],\n", - " [0.27703505, 4.2449446 ],\n", - " [0.27975753, 4.2364879 ],\n", - " [0.28248 , 4.2302647 ],\n", - " [0.28520247, 4.2225528 ],\n", - " [0.28792495, 4.2182574 ],\n", - " [0.29064743, 4.213294 ],\n", - " [0.29336992, 4.2090373 ],\n", - " [0.29609239, 4.2051239 ],\n", - " [0.29881487, 4.2012677 ],\n", - " [0.30153735, 4.1981564 ],\n", - " [0.30425983, 4.1955218 ],\n", - " [0.30698231, 4.1931167 ],\n", - " [0.30970478, 4.1889744 ],\n", - " [0.31242725, 4.1881533 ],\n", - " [0.31514973, 4.1865883 ],\n", - " [0.3178722 , 4.1850228 ],\n", - " [0.32059466, 4.1832285 ],\n", - " [0.32331714, 4.1808805 ],\n", - " [0.32603962, 4.1805749 ],\n", - " [0.32876209, 4.1789522 ],\n", - " [0.33148456, 4.1768146 ],\n", - " [0.33420703, 4.1768146 ],\n", - " [0.3369295 , 4.1752872 ],\n", - " [0.33965197, 4.173111 ],\n", - " [0.34237446, 4.1726718 ],\n", - " [0.34509694, 4.1710877 ],\n", - " [0.34781941, 4.1702285 ],\n", - " [0.3505419 , 4.168797 ],\n", - " [0.35326438, 4.1669831 ],\n", - " [0.35598685, 4.1655135 ],\n", - " [0.35870932, 4.1634517 ],\n", - " [0.3614318 , 4.1598248 ],\n", - " [0.36415428, 4.1571712 ],\n", - " [0.36687674, 4.154079 ],\n", - " [0.36959921, 4.1504135 ],\n", - " [0.37232169, 4.1466532 ],\n", - " [0.37504418, 4.1423388 ],\n", - " [0.37776665, 4.1382346 ],\n", - " [0.38048913, 4.1338248 ],\n", - " [0.38321161, 4.1305799 ],\n", - " [0.38593408, 4.1272392 ],\n", - " [0.38865655, 4.1228104 ],\n", - " [0.39137903, 4.1186109 ],\n", - " [0.39410151, 4.114182 ],\n", - " [0.39682398, 4.1096005 ],\n", - " [0.39954645, 4.1046948 ],\n", - " [0.40226892, 4.1004758 ],\n", - " [0.4049914 , 4.0956464 ],\n", - " [0.40771387, 4.0909696 ],\n", - " [0.41043634, 4.0864644 ],\n", - " [0.41315882, 4.0818448 ],\n", - " [0.41588129, 4.077683 ],\n", - " [0.41860377, 4.0733309 ],\n", - " [0.42132624, 4.0690737 ],\n", - " [0.42404872, 4.0647216 ],\n", - " [0.4267712 , 4.0608654 ],\n", - " [0.42949368, 4.0564747 ],\n", - " [0.43221616, 4.0527525 ],\n", - " [0.43493864, 4.0492401 ],\n", - " [0.43766111, 4.0450211 ],\n", - " [0.44038359, 4.041986 ],\n", - " [0.44310607, 4.0384736 ],\n", - " [0.44582856, 4.035171 ],\n", - " [0.44855103, 4.0320406 ],\n", - " [0.45127351, 4.0289288 ],\n", - " [0.453996 , 4.02597 ],\n", - " [0.45671848, 4.0227437 ],\n", - " [0.45944095, 4.0199757 ],\n", - " [0.46216343, 4.0175133 ],\n", - " [0.46488592, 4.0149746 ],\n", - " [0.46760838, 4.0122066 ],\n", - " [0.47033085, 4.009954 ],\n", - " [0.47305333, 4.0075679 ],\n", - " [0.47577581, 4.0050669 ],\n", - " [0.47849828, 4.0023184 ],\n", - " [0.48122074, 3.9995501 ],\n", - " [0.48394321, 3.9969349 ],\n", - " [0.48666569, 3.9926589 ],\n", - " [0.48938816, 3.9889555 ],\n", - " [0.49211064, 3.9834003 ],\n", - " [0.4948331 , 3.9783037 ],\n", - " [0.49755557, 3.9755929 ],\n", - " [0.50027804, 3.9707632 ],\n", - " [0.50300052, 3.9681098 ],\n", - " [0.50572298, 3.9635665 ],\n", - " [0.50844545, 3.9594433 ],\n", - " [0.51116792, 3.9556634 ],\n", - " [0.51389038, 3.9521511 ],\n", - " [0.51661284, 3.9479132 ],\n", - " [0.51933531, 3.9438281 ],\n", - " [0.52205777, 3.9400866 ],\n", - " [0.52478024, 3.9362304 ],\n", - " [0.52750271, 3.9314201 ],\n", - " [0.53022518, 3.9283848 ],\n", - " [0.53294765, 3.9242232 ],\n", - " [0.53567012, 3.9192028 ],\n", - " [0.53839258, 3.9166257 ],\n", - " [0.54111506, 3.9117961 ],\n", - " [0.54383753, 3.90815 ],\n", - " [0.54656 , 3.9038739 ],\n", - " [0.54928247, 3.8995597 ],\n", - " [0.55200494, 3.8959136 ],\n", - " [0.5547274 , 3.8909314 ],\n", - " [0.55744986, 3.8872662 ],\n", - " [0.56017233, 3.8831048 ],\n", - " [0.5628948 , 3.8793442 ],\n", - " [0.56561729, 3.8747628 ],\n", - " [0.56833976, 3.8702576 ],\n", - " [0.57106222, 3.8666878 ],\n", - " [0.57378469, 3.8623927 ],\n", - " [0.57650716, 3.8581741 ],\n", - " [0.57922963, 3.854146 ],\n", - " [0.5819521 , 3.8499846 ],\n", - " [0.58467456, 3.8450022 ],\n", - " [0.58739702, 3.8422534 ],\n", - " [0.59011948, 3.8380919 ],\n", - " [0.59284194, 3.8341596 ],\n", - " [0.5955644 , 3.8309333 ],\n", - " [0.59828687, 3.8272109 ],\n", - " [0.60100935, 3.823164 ],\n", - " [0.60373182, 3.8192315 ],\n", - " [0.60645429, 3.8159864 ],\n", - " [0.60917677, 3.8123021 ],\n", - " [0.61189925, 3.8090379 ],\n", - " [0.61462172, 3.8071671 ],\n", - " [0.61734419, 3.8040555 ],\n", - " [0.62006666, 3.8013639 ],\n", - " [0.62278914, 3.7970879 ],\n", - " [0.62551162, 3.7953317 ],\n", - " [0.62823408, 3.7920673 ],\n", - " [0.63095656, 3.788383 ],\n", - " [0.63367903, 3.7855389 ],\n", - " [0.6364015 , 3.7838206 ],\n", - " [0.63912397, 3.78111 ],\n", - " [0.64184645, 3.7794874 ],\n", - " [0.64456893, 3.7769294 ],\n", - " [0.6472914 , 3.773608 ],\n", - " [0.65001389, 3.7695992 ],\n", - " [0.65273637, 3.7690265 ],\n", - " [0.65545884, 3.7662776 ],\n", - " [0.65818131, 3.7642922 ],\n", - " [0.66090379, 3.7626889 ],\n", - " [0.66362625, 3.7603791 ],\n", - " [0.66634874, 3.7575538 ],\n", - " [0.66907121, 3.7552056 ],\n", - " [0.67179369, 3.7533159 ],\n", - " [0.67451616, 3.7507198 ],\n", - " [0.67723865, 3.7487535 ],\n", - " [0.67996113, 3.7471499 ],\n", - " [0.68268361, 3.7442865 ],\n", - " [0.68540608, 3.7423012 ],\n", - " [0.68812855, 3.7400677 ],\n", - " [0.69085103, 3.7385788 ],\n", - " [0.6935735 , 3.7345319 ],\n", - " [0.69629597, 3.7339211 ],\n", - " [0.69901843, 3.7301605 ],\n", - " [0.7017409 , 3.7301033 ],\n", - " [0.70446338, 3.7278316 ],\n", - " [0.70718585, 3.7251589 ],\n", - " [0.70990833, 3.723861 ],\n", - " [0.71263081, 3.7215703 ],\n", - " [0.71535328, 3.7191267 ],\n", - " [0.71807574, 3.7172751 ],\n", - " [0.72079822, 3.7157097 ],\n", - " [0.72352069, 3.7130945 ],\n", - " [0.72624317, 3.7099447 ],\n", - " [0.72896564, 3.7071004 ],\n", - " [0.7316881 , 3.7045615 ],\n", - " [0.73441057, 3.703588 ],\n", - " [0.73713303, 3.70208 ],\n", - " [0.73985551, 3.7002664 ],\n", - " [0.74257799, 3.6972122 ],\n", - " [0.74530047, 3.6952841 ],\n", - " [0.74802293, 3.6929362 ],\n", - " [0.7507454 , 3.6898055 ],\n", - " [0.75346787, 3.6890991 ],\n", - " [0.75619034, 3.686522 ],\n", - " [0.75891281, 3.6849759 ],\n", - " [0.76163529, 3.6821697 ],\n", - " [0.76435776, 3.6808143 ],\n", - " [0.76708024, 3.6786573 ],\n", - " [0.7698027 , 3.6761947 ],\n", - " [0.77252517, 3.674763 ],\n", - " [0.77524765, 3.6712887 ],\n", - " [0.77797012, 3.6697233 ],\n", - " [0.78069258, 3.6678908 ],\n", - " [0.78341506, 3.6652565 ],\n", - " [0.78613753, 3.6630611 ],\n", - " [0.78885999, 3.660274 ],\n", - " [0.79158246, 3.6583652 ],\n", - " [0.79430494, 3.6554828 ],\n", - " [0.79702741, 3.6522949 ],\n", - " [0.79974987, 3.6499848 ],\n", - " [0.80247234, 3.6470451 ],\n", - " [0.8051948 , 3.6405547 ],\n", - " [0.80791727, 3.6383405 ],\n", - " [0.81063974, 3.635076 ],\n", - " [0.81336221, 3.633549 ],\n", - " [0.81608468, 3.6322317 ],\n", - " [0.81880714, 3.6306856 ],\n", - " [0.82152961, 3.6283948 ],\n", - " [0.82425208, 3.6268487 ],\n", - " [0.82697453, 3.6243098 ],\n", - " [0.829697 , 3.6223626 ],\n", - " [0.83241946, 3.6193655 ],\n", - " [0.83514192, 3.6177621 ],\n", - " [0.83786439, 3.6158531 ],\n", - " [0.84058684, 3.6128371 ],\n", - " [0.84330931, 3.6118062 ],\n", - " [0.84603177, 3.6094582 ],\n", - " [0.84875424, 3.6072438 ],\n", - " [0.8514767 , 3.6049912 ],\n", - " [0.85419916, 3.6030822 ],\n", - " [0.85692162, 3.6012688 ],\n", - " [0.85964409, 3.5995889 ],\n", - " [0.86236656, 3.5976417 ],\n", - " [0.86508902, 3.5951984 ],\n", - " [0.86781149, 3.593843 ],\n", - " [0.87053395, 3.5916286 ],\n", - " [0.87325642, 3.5894907 ],\n", - " [0.87597888, 3.587429 ],\n", - " [0.87870135, 3.5852909 ],\n", - " [0.88142383, 3.5834775 ],\n", - " [0.8841463 , 3.5817785 ],\n", - " [0.88686877, 3.5801177 ],\n", - " [0.88959124, 3.5778842 ],\n", - " [0.89231371, 3.5763381 ],\n", - " [0.8950362 , 3.5737801 ],\n", - " [0.89775868, 3.5721002 ],\n", - " [0.90048116, 3.5702102 ],\n", - " [0.90320364, 3.5684922 ],\n", - " [0.90592613, 3.5672133 ],\n", - " [1. , 3.52302167]])),\n", - " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Positive electrode active material volume fraction': 0.665,\n", - " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", - " 'Positive electrode electrons in reaction': 1.0,\n", - " 'Positive electrode exchange-current density [A.m-2]': ,\n", - " 'Positive electrode porosity': 0.335,\n", - " 'Positive electrode thickness [m]': 7.56e-05,\n", - " 'Positive particle radius [m]': 5.22e-06,\n", - " 'Reference temperature [K]': 298.15,\n", - " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Separator porosity': 0.47,\n", - " 'Separator thickness [m]': 1.2e-05,\n", - " 'Typical current [A]': 5.0,\n", - " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", - " 'Upper voltage cut-off [V]': 4.4}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def graphite_mcmb2528_diffusivity_Dualfoil1998(sto, T):\n", - " D_ref = 3.9 * 10 ** (-14)\n", - " E_D_s = 42770\n", - " arrhenius = exp(E_D_s / constants.R * (1 / 298.15 - 1 / T))\n", - " return D_ref * arrhenius\n", - "\n", - "neg_ocp = np.array([[0. , 1.81772748],\n", - " [0.03129623, 1.0828807 ],\n", - " [0.03499902, 0.99593794],\n", - " [0.0387018 , 0.90023398],\n", - " [0.04240458, 0.79649431],\n", - " [0.04610736, 0.73354429],\n", - " [0.04981015, 0.66664314],\n", - " [0.05351292, 0.64137149],\n", - " [0.05721568, 0.59813869],\n", - " [0.06091845, 0.5670836 ],\n", - " [0.06462122, 0.54746181],\n", - " [0.06832399, 0.53068399],\n", - " [0.07202675, 0.51304734],\n", - " [0.07572951, 0.49394092],\n", - " [0.07943227, 0.47926274],\n", - " [0.08313503, 0.46065259],\n", - " [0.08683779, 0.45992726],\n", - " [0.09054054, 0.43801501],\n", - " [0.09424331, 0.42438665],\n", - " [0.09794607, 0.41150269],\n", - " [0.10164883, 0.40033659],\n", - " [0.10535158, 0.38957134],\n", - " [0.10905434, 0.37756538],\n", - " [0.1127571 , 0.36292541],\n", - " [0.11645985, 0.34357086],\n", - " [0.12016261, 0.3406314 ],\n", - " [0.12386536, 0.32299468],\n", - " [0.12756811, 0.31379458],\n", - " [0.13127086, 0.30795386],\n", - " [0.13497362, 0.29207319],\n", - " [0.13867638, 0.28697687],\n", - " [0.14237913, 0.27405477],\n", - " [0.14608189, 0.2670497 ],\n", - " [0.14978465, 0.25857493],\n", - " [0.15348741, 0.25265783],\n", - " [0.15719018, 0.24826777],\n", - " [0.16089294, 0.2414345 ],\n", - " [0.1645957 , 0.23362778],\n", - " [0.16829847, 0.22956218],\n", - " [0.17200122, 0.22370236],\n", - " [0.17570399, 0.22181271],\n", - " [0.17940674, 0.22089651],\n", - " [0.1831095 , 0.2194268 ],\n", - " [0.18681229, 0.21830064],\n", - " [0.19051504, 0.21845333],\n", - " [0.1942178 , 0.21753715],\n", - " [0.19792056, 0.21719357],\n", - " [0.20162334, 0.21635373],\n", - " [0.2053261 , 0.21667822],\n", - " [0.20902886, 0.21738444],\n", - " [0.21273164, 0.21469313],\n", - " [0.2164344 , 0.21541846],\n", - " [0.22013716, 0.21465495],\n", - " [0.22383993, 0.2135479 ],\n", - " [0.2275427 , 0.21392964],\n", - " [0.23124547, 0.21074206],\n", - " [0.23494825, 0.20873788],\n", - " [0.23865101, 0.20465319],\n", - " [0.24235377, 0.20205732],\n", - " [0.24605653, 0.19774358],\n", - " [0.2497593 , 0.19444147],\n", - " [0.25346208, 0.19190285],\n", - " [0.25716486, 0.18850531],\n", - " [0.26086762, 0.18581399],\n", - " [0.26457039, 0.18327537],\n", - " [0.26827314, 0.18157659],\n", - " [0.2719759 , 0.17814088],\n", - " [0.27567867, 0.17529686],\n", - " [0.27938144, 0.1719375 ],\n", - " [0.28308421, 0.16934161],\n", - " [0.28678698, 0.16756649],\n", - " [0.29048974, 0.16609676],\n", - " [0.29419251, 0.16414985],\n", - " [0.29789529, 0.16260378],\n", - " [0.30159806, 0.16224113],\n", - " [0.30530083, 0.160027 ],\n", - " [0.30900361, 0.15827096],\n", - " [0.31270637, 0.1588054 ],\n", - " [0.31640913, 0.15552238],\n", - " [0.32011189, 0.15580869],\n", - " [0.32381466, 0.15220118],\n", - " [0.32751744, 0.1511132 ],\n", - " [0.33122021, 0.14987253],\n", - " [0.33492297, 0.14874637],\n", - " [0.33862575, 0.14678037],\n", - " [0.34232853, 0.14620776],\n", - " [0.34603131, 0.14555879],\n", - " [0.34973408, 0.14389819],\n", - " [0.35343685, 0.14359279],\n", - " [0.35713963, 0.14242846],\n", - " [0.36084241, 0.14038612],\n", - " [0.36454517, 0.13882096],\n", - " [0.36824795, 0.13954628],\n", - " [0.37195071, 0.13946992],\n", - " [0.37565348, 0.13780934],\n", - " [0.37935626, 0.13973714],\n", - " [0.38305904, 0.13698858],\n", - " [0.38676182, 0.13523254],\n", - " [0.3904646 , 0.13441178],\n", - " [0.39416737, 0.1352898 ],\n", - " [0.39787015, 0.13507985],\n", - " [0.40157291, 0.13647321],\n", - " [0.40527567, 0.13601512],\n", - " [0.40897844, 0.13435452],\n", - " [0.41268121, 0.1334765 ],\n", - " [0.41638398, 0.1348317 ],\n", - " [0.42008676, 0.13275118],\n", - " [0.42378953, 0.13286571],\n", - " [0.4274923 , 0.13263667],\n", - " [0.43119506, 0.13456447],\n", - " [0.43489784, 0.13471718],\n", - " [0.43860061, 0.13395369],\n", - " [0.44230338, 0.13448814],\n", - " [0.44600615, 0.1334765 ],\n", - " [0.44970893, 0.13298023],\n", - " [0.45341168, 0.13259849],\n", - " [0.45711444, 0.13338107],\n", - " [0.46081719, 0.13309476],\n", - " [0.46451994, 0.13275118],\n", - " [0.46822269, 0.13443087],\n", - " [0.47192545, 0.13315202],\n", - " [0.47562821, 0.132713 ],\n", - " [0.47933098, 0.1330184 ],\n", - " [0.48303375, 0.13278936],\n", - " [0.48673651, 0.13225491],\n", - " [0.49043926, 0.13317111],\n", - " [0.49414203, 0.13263667],\n", - " [0.49784482, 0.13187316],\n", - " [0.50154759, 0.13265574],\n", - " [0.50525036, 0.13250305],\n", - " [0.50895311, 0.13324745],\n", - " [0.51265586, 0.13204496],\n", - " [0.51635861, 0.13242669],\n", - " [0.52006139, 0.13233127],\n", - " [0.52376415, 0.13198769],\n", - " [0.52746692, 0.13254122],\n", - " [0.53116969, 0.13145325],\n", - " [0.53487245, 0.13298023],\n", - " [0.53857521, 0.13168229],\n", - " [0.54227797, 0.1313578 ],\n", - " [0.54598074, 0.13235036],\n", - " [0.5496835 , 0.13120511],\n", - " [0.55338627, 0.13089971],\n", - " [0.55708902, 0.13109058],\n", - " [0.56079178, 0.13082336],\n", - " [0.56449454, 0.13011713],\n", - " [0.5681973 , 0.129869 ],\n", - " [0.57190006, 0.12992626],\n", - " [0.57560282, 0.12942998],\n", - " [0.57930558, 0.12796026],\n", - " [0.58300835, 0.12862831],\n", - " [0.58671112, 0.12656689],\n", - " [0.59041389, 0.12734947],\n", - " [0.59411664, 0.12509716],\n", - " [0.59781941, 0.12110791],\n", - " [0.60152218, 0.11839751],\n", - " [0.60522496, 0.11244226],\n", - " [0.60892772, 0.11307214],\n", - " [0.61263048, 0.1092165 ],\n", - " [0.61633325, 0.10683058],\n", - " [0.62003603, 0.10433014],\n", - " [0.6237388 , 0.10530359],\n", - " [0.62744156, 0.10056993],\n", - " [0.63114433, 0.09950104],\n", - " [0.63484711, 0.09854668],\n", - " [0.63854988, 0.09921473],\n", - " [0.64225265, 0.09541635],\n", - " [0.64595543, 0.09980643],\n", - " [0.64965823, 0.0986612 ],\n", - " [0.653361 , 0.09560722],\n", - " [0.65706377, 0.09755413],\n", - " [0.66076656, 0.09612258],\n", - " [0.66446934, 0.09430929],\n", - " [0.66817212, 0.09661885],\n", - " [0.67187489, 0.09366032],\n", - " [0.67557767, 0.09522548],\n", - " [0.67928044, 0.09535909],\n", - " [0.68298322, 0.09316404],\n", - " [0.686686 , 0.09450016],\n", - " [0.69038878, 0.0930877 ],\n", - " [0.69409156, 0.09343126],\n", - " [0.69779433, 0.0932404 ],\n", - " [0.70149709, 0.09350762],\n", - " [0.70519988, 0.09339309],\n", - " [0.70890264, 0.09291591],\n", - " [0.7126054 , 0.09303043],\n", - " [0.71630818, 0.0926296 ],\n", - " [0.72001095, 0.0932404 ],\n", - " [0.72371371, 0.09261052],\n", - " [0.72741648, 0.09249599],\n", - " [0.73111925, 0.09240055],\n", - " [0.73482204, 0.09253416],\n", - " [0.7385248 , 0.09209515],\n", - " [0.74222757, 0.09234329],\n", - " [0.74593034, 0.09366032],\n", - " [0.74963312, 0.09333583],\n", - " [0.75333589, 0.09322131],\n", - " [0.75703868, 0.09264868],\n", - " [0.76074146, 0.09253416],\n", - " [0.76444422, 0.09243873],\n", - " [0.76814698, 0.09230512],\n", - " [0.77184976, 0.09310678],\n", - " [0.77555253, 0.09165615],\n", - " [0.77925531, 0.09159888],\n", - " [0.78295807, 0.09207606],\n", - " [0.78666085, 0.09175158],\n", - " [0.79036364, 0.09177067],\n", - " [0.79406641, 0.09236237],\n", - " [0.79776918, 0.09241964],\n", - " [0.80147197, 0.09320222],\n", - " [0.80517474, 0.09199972],\n", - " [0.80887751, 0.09167523],\n", - " [0.81258028, 0.09322131],\n", - " [0.81628304, 0.09190428],\n", - " [0.81998581, 0.09167523],\n", - " [0.82368858, 0.09285865],\n", - " [0.82739136, 0.09180884],\n", - " [0.83109411, 0.09150345],\n", - " [0.83479688, 0.09186611],\n", - " [0.83849965, 0.0920188 ],\n", - " [0.84220242, 0.09320222],\n", - " [0.84590519, 0.09131257],\n", - " [0.84960797, 0.09117896],\n", - " [0.85331075, 0.09133166],\n", - " [0.85701353, 0.09089265],\n", - " [0.86071631, 0.09058725],\n", - " [0.86441907, 0.09051091],\n", - " [0.86812186, 0.09033912],\n", - " [0.87182464, 0.09041547],\n", - " [0.87552742, 0.0911217 ],\n", - " [0.87923019, 0.0894611 ],\n", - " [0.88293296, 0.08999555],\n", - " [0.88663573, 0.08921297],\n", - " [0.89033849, 0.08881213],\n", - " [0.89404126, 0.08797229],\n", - " [0.89774404, 0.08709427],\n", - " [0.9014468 , 0.08503284],\n", - " [1. , 0.07601531]])\n", - "\n", - "pos_ocp = np.array([[0.24879728, 4.4 ],\n", - " [0.26614516, 4.2935653 ],\n", - " [0.26886763, 4.2768621 ],\n", - " [0.27159011, 4.2647018 ],\n", - " [0.27431258, 4.2540312 ],\n", - " [0.27703505, 4.2449446 ],\n", - " [0.27975753, 4.2364879 ],\n", - " [0.28248 , 4.2302647 ],\n", - " [0.28520247, 4.2225528 ],\n", - " [0.28792495, 4.2182574 ],\n", - " [0.29064743, 4.213294 ],\n", - " [0.29336992, 4.2090373 ],\n", - " [0.29609239, 4.2051239 ],\n", - " [0.29881487, 4.2012677 ],\n", - " [0.30153735, 4.1981564 ],\n", - " [0.30425983, 4.1955218 ],\n", - " [0.30698231, 4.1931167 ],\n", - " [0.30970478, 4.1889744 ],\n", - " [0.31242725, 4.1881533 ],\n", - " [0.31514973, 4.1865883 ],\n", - " [0.3178722 , 4.1850228 ],\n", - " [0.32059466, 4.1832285 ],\n", - " [0.32331714, 4.1808805 ],\n", - " [0.32603962, 4.1805749 ],\n", - " [0.32876209, 4.1789522 ],\n", - " [0.33148456, 4.1768146 ],\n", - " [0.33420703, 4.1768146 ],\n", - " [0.3369295 , 4.1752872 ],\n", - " [0.33965197, 4.173111 ],\n", - " [0.34237446, 4.1726718 ],\n", - " [0.34509694, 4.1710877 ],\n", - " [0.34781941, 4.1702285 ],\n", - " [0.3505419 , 4.168797 ],\n", - " [0.35326438, 4.1669831 ],\n", - " [0.35598685, 4.1655135 ],\n", - " [0.35870932, 4.1634517 ],\n", - " [0.3614318 , 4.1598248 ],\n", - " [0.36415428, 4.1571712 ],\n", - " [0.36687674, 4.154079 ],\n", - " [0.36959921, 4.1504135 ],\n", - " [0.37232169, 4.1466532 ],\n", - " [0.37504418, 4.1423388 ],\n", - " [0.37776665, 4.1382346 ],\n", - " [0.38048913, 4.1338248 ],\n", - " [0.38321161, 4.1305799 ],\n", - " [0.38593408, 4.1272392 ],\n", - " [0.38865655, 4.1228104 ],\n", - " [0.39137903, 4.1186109 ],\n", - " [0.39410151, 4.114182 ],\n", - " [0.39682398, 4.1096005 ],\n", - " [0.39954645, 4.1046948 ],\n", - " [0.40226892, 4.1004758 ],\n", - " [0.4049914 , 4.0956464 ],\n", - " [0.40771387, 4.0909696 ],\n", - " [0.41043634, 4.0864644 ],\n", - " [0.41315882, 4.0818448 ],\n", - " [0.41588129, 4.077683 ],\n", - " [0.41860377, 4.0733309 ],\n", - " [0.42132624, 4.0690737 ],\n", - " [0.42404872, 4.0647216 ],\n", - " [0.4267712 , 4.0608654 ],\n", - " [0.42949368, 4.0564747 ],\n", - " [0.43221616, 4.0527525 ],\n", - " [0.43493864, 4.0492401 ],\n", - " [0.43766111, 4.0450211 ],\n", - " [0.44038359, 4.041986 ],\n", - " [0.44310607, 4.0384736 ],\n", - " [0.44582856, 4.035171 ],\n", - " [0.44855103, 4.0320406 ],\n", - " [0.45127351, 4.0289288 ],\n", - " [0.453996 , 4.02597 ],\n", - " [0.45671848, 4.0227437 ],\n", - " [0.45944095, 4.0199757 ],\n", - " [0.46216343, 4.0175133 ],\n", - " [0.46488592, 4.0149746 ],\n", - " [0.46760838, 4.0122066 ],\n", - " [0.47033085, 4.009954 ],\n", - " [0.47305333, 4.0075679 ],\n", - " [0.47577581, 4.0050669 ],\n", - " [0.47849828, 4.0023184 ],\n", - " [0.48122074, 3.9995501 ],\n", - " [0.48394321, 3.9969349 ],\n", - " [0.48666569, 3.9926589 ],\n", - " [0.48938816, 3.9889555 ],\n", - " [0.49211064, 3.9834003 ],\n", - " [0.4948331 , 3.9783037 ],\n", - " [0.49755557, 3.9755929 ],\n", - " [0.50027804, 3.9707632 ],\n", - " [0.50300052, 3.9681098 ],\n", - " [0.50572298, 3.9635665 ],\n", - " [0.50844545, 3.9594433 ],\n", - " [0.51116792, 3.9556634 ],\n", - " [0.51389038, 3.9521511 ],\n", - " [0.51661284, 3.9479132 ],\n", - " [0.51933531, 3.9438281 ],\n", - " [0.52205777, 3.9400866 ],\n", - " [0.52478024, 3.9362304 ],\n", - " [0.52750271, 3.9314201 ],\n", - " [0.53022518, 3.9283848 ],\n", - " [0.53294765, 3.9242232 ],\n", - " [0.53567012, 3.9192028 ],\n", - " [0.53839258, 3.9166257 ],\n", - " [0.54111506, 3.9117961 ],\n", - " [0.54383753, 3.90815 ],\n", - " [0.54656 , 3.9038739 ],\n", - " [0.54928247, 3.8995597 ],\n", - " [0.55200494, 3.8959136 ],\n", - " [0.5547274 , 3.8909314 ],\n", - " [0.55744986, 3.8872662 ],\n", - " [0.56017233, 3.8831048 ],\n", - " [0.5628948 , 3.8793442 ],\n", - " [0.56561729, 3.8747628 ],\n", - " [0.56833976, 3.8702576 ],\n", - " [0.57106222, 3.8666878 ],\n", - " [0.57378469, 3.8623927 ],\n", - " [0.57650716, 3.8581741 ],\n", - " [0.57922963, 3.854146 ],\n", - " [0.5819521 , 3.8499846 ],\n", - " [0.58467456, 3.8450022 ],\n", - " [0.58739702, 3.8422534 ],\n", - " [0.59011948, 3.8380919 ],\n", - " [0.59284194, 3.8341596 ],\n", - " [0.5955644 , 3.8309333 ],\n", - " [0.59828687, 3.8272109 ],\n", - " [0.60100935, 3.823164 ],\n", - " [0.60373182, 3.8192315 ],\n", - " [0.60645429, 3.8159864 ],\n", - " [0.60917677, 3.8123021 ],\n", - " [0.61189925, 3.8090379 ],\n", - " [0.61462172, 3.8071671 ],\n", - " [0.61734419, 3.8040555 ],\n", - " [0.62006666, 3.8013639 ],\n", - " [0.62278914, 3.7970879 ],\n", - " [0.62551162, 3.7953317 ],\n", - " [0.62823408, 3.7920673 ],\n", - " [0.63095656, 3.788383 ],\n", - " [0.63367903, 3.7855389 ],\n", - " [0.6364015 , 3.7838206 ],\n", - " [0.63912397, 3.78111 ],\n", - " [0.64184645, 3.7794874 ],\n", - " [0.64456893, 3.7769294 ],\n", - " [0.6472914 , 3.773608 ],\n", - " [0.65001389, 3.7695992 ],\n", - " [0.65273637, 3.7690265 ],\n", - " [0.65545884, 3.7662776 ],\n", - " [0.65818131, 3.7642922 ],\n", - " [0.66090379, 3.7626889 ],\n", - " [0.66362625, 3.7603791 ],\n", - " [0.66634874, 3.7575538 ],\n", - " [0.66907121, 3.7552056 ],\n", - " [0.67179369, 3.7533159 ],\n", - " [0.67451616, 3.7507198 ],\n", - " [0.67723865, 3.7487535 ],\n", - " [0.67996113, 3.7471499 ],\n", - " [0.68268361, 3.7442865 ],\n", - " [0.68540608, 3.7423012 ],\n", - " [0.68812855, 3.7400677 ],\n", - " [0.69085103, 3.7385788 ],\n", - " [0.6935735 , 3.7345319 ],\n", - " [0.69629597, 3.7339211 ],\n", - " [0.69901843, 3.7301605 ],\n", - " [0.7017409 , 3.7301033 ],\n", - " [0.70446338, 3.7278316 ],\n", - " [0.70718585, 3.7251589 ],\n", - " [0.70990833, 3.723861 ],\n", - " [0.71263081, 3.7215703 ],\n", - " [0.71535328, 3.7191267 ],\n", - " [0.71807574, 3.7172751 ],\n", - " [0.72079822, 3.7157097 ],\n", - " [0.72352069, 3.7130945 ],\n", - " [0.72624317, 3.7099447 ],\n", - " [0.72896564, 3.7071004 ],\n", - " [0.7316881 , 3.7045615 ],\n", - " [0.73441057, 3.703588 ],\n", - " [0.73713303, 3.70208 ],\n", - " [0.73985551, 3.7002664 ],\n", - " [0.74257799, 3.6972122 ],\n", - " [0.74530047, 3.6952841 ],\n", - " [0.74802293, 3.6929362 ],\n", - " [0.7507454 , 3.6898055 ],\n", - " [0.75346787, 3.6890991 ],\n", - " [0.75619034, 3.686522 ],\n", - " [0.75891281, 3.6849759 ],\n", - " [0.76163529, 3.6821697 ],\n", - " [0.76435776, 3.6808143 ],\n", - " [0.76708024, 3.6786573 ],\n", - " [0.7698027 , 3.6761947 ],\n", - " [0.77252517, 3.674763 ],\n", - " [0.77524765, 3.6712887 ],\n", - " [0.77797012, 3.6697233 ],\n", - " [0.78069258, 3.6678908 ],\n", - " [0.78341506, 3.6652565 ],\n", - " [0.78613753, 3.6630611 ],\n", - " [0.78885999, 3.660274 ],\n", - " [0.79158246, 3.6583652 ],\n", - " [0.79430494, 3.6554828 ],\n", - " [0.79702741, 3.6522949 ],\n", - " [0.79974987, 3.6499848 ],\n", - " [0.80247234, 3.6470451 ],\n", - " [0.8051948 , 3.6405547 ],\n", - " [0.80791727, 3.6383405 ],\n", - " [0.81063974, 3.635076 ],\n", - " [0.81336221, 3.633549 ],\n", - " [0.81608468, 3.6322317 ],\n", - " [0.81880714, 3.6306856 ],\n", - " [0.82152961, 3.6283948 ],\n", - " [0.82425208, 3.6268487 ],\n", - " [0.82697453, 3.6243098 ],\n", - " [0.829697 , 3.6223626 ],\n", - " [0.83241946, 3.6193655 ],\n", - " [0.83514192, 3.6177621 ],\n", - " [0.83786439, 3.6158531 ],\n", - " [0.84058684, 3.6128371 ],\n", - " [0.84330931, 3.6118062 ],\n", - " [0.84603177, 3.6094582 ],\n", - " [0.84875424, 3.6072438 ],\n", - " [0.8514767 , 3.6049912 ],\n", - " [0.85419916, 3.6030822 ],\n", - " [0.85692162, 3.6012688 ],\n", - " [0.85964409, 3.5995889 ],\n", - " [0.86236656, 3.5976417 ],\n", - " [0.86508902, 3.5951984 ],\n", - " [0.86781149, 3.593843 ],\n", - " [0.87053395, 3.5916286 ],\n", - " [0.87325642, 3.5894907 ],\n", - " [0.87597888, 3.587429 ],\n", - " [0.87870135, 3.5852909 ],\n", - " [0.88142383, 3.5834775 ],\n", - " [0.8841463 , 3.5817785 ],\n", - " [0.88686877, 3.5801177 ],\n", - " [0.88959124, 3.5778842 ],\n", - " [0.89231371, 3.5763381 ],\n", - " [0.8950362 , 3.5737801 ],\n", - " [0.89775868, 3.5721002 ],\n", - " [0.90048116, 3.5702102 ],\n", - " [0.90320364, 3.5684922 ],\n", - " [0.90592613, 3.5672133 ],\n", - " [1. , 3.52302167]])\n", - "\n", - "from pybamm import exp, constants, Parameter\n", - "\n", - "\n", - "def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T):\n", - " m_ref = 6.48e-7 # (A/m2)(mol/m3)**1.5 - includes ref concentrations\n", - " E_r = 35000\n", - " arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T))\n", - "\n", - " c_n_max = Parameter(\"Maximum concentration in negative electrode [mol.m-3]\")\n", - "\n", - " return (\n", - " m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5\n", - " )\n", - "\n", - "def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T):\n", - " m_ref = 3.42e-6 # (A/m2)(mol/m3)**1.5 - includes ref concentrations\n", - " E_r = 17800\n", - " arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T))\n", - "\n", - " c_p_max = Parameter(\"Maximum concentration in positive electrode [mol.m-3]\")\n", - "\n", - " return (\n", - " m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5\n", - " )\n", - "\n", - "\n", - "values = {\n", - " 'Negative electrode thickness [m]': 8.52e-05,\n", - " 'Separator thickness [m]': 1.2e-05,\n", - " 'Positive electrode thickness [m]': 7.56e-05,\n", - " 'Electrode height [m]': 0.065,\n", - " 'Electrode width [m]': 1.58,\n", - " 'Nominal cell capacity [A.h]': 5.0,\n", - " 'Typical current [A]': 5.0,\n", - " 'Current function [A]': 5.0,\n", - " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", - " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", - " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020', neg_ocp),\n", - " 'Negative electrode porosity': 0.25,\n", - " 'Negative electrode active material volume fraction': 0.75,\n", - " 'Negative particle radius [m]': 5.86e-06,\n", - " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode Bruggeman coefficient (electrode)': 1.5,\n", - " 'Negative electrode electrons in reaction': 1.0,\n", - " 'Negative electrode exchange-current density [A.m-2]': graphite_LGM50_electrolyte_exchange_current_density_Chen2020,\n", - " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", - " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", - " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020', pos_ocp),\n", - " 'Positive electrode porosity': 0.335,\n", - " 'Positive electrode active material volume fraction': 0.665,\n", - " 'Positive particle radius [m]': 5.22e-06,\n", - " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode Bruggeman coefficient (electrode)': 1.5,\n", - " 'Positive electrode electrons in reaction': 1.0,\n", - " 'Positive electrode exchange-current density [A.m-2]': nmc_LGM50_electrolyte_exchange_current_density_Chen2020,\n", - " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Separator porosity': 0.47,\n", - " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", - " 'Reference temperature [K]': 298.15,\n", - " 'Ambient temperature [K]': 298.15,\n", - " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", - " 'Number of cells connected in series to make a battery': 1.0,\n", - " 'Lower voltage cut-off [V]': 2.5,\n", - " 'Upper voltage cut-off [V]': 4.4,\n", - " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", - " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", - " 'Initial temperature [K]': 298.15\n", - "}\n", - "param = pybamm.ParameterValues(values)\n", - "param" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we would have got the same result by doing" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Negative electrode thickness [m]': 8.52e-05,\n", - " 'Separator thickness [m]': 1.2e-05,\n", - " 'Positive electrode thickness [m]': 7.56e-05,\n", - " 'Electrode height [m]': 0.065,\n", - " 'Electrode width [m]': 1.58,\n", - " 'Nominal cell capacity [A.h]': 5.0,\n", - " 'Typical current [A]': 5.0,\n", - " 'Current function [A]': 5.0,\n", - " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", - " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", - " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020',\n", - " array([[0. , 1.81772748],\n", - " [0.03129623, 1.0828807 ],\n", - " [0.03499902, 0.99593794],\n", - " [0.0387018 , 0.90023398],\n", - " [0.04240458, 0.79649431],\n", - " [0.04610736, 0.73354429],\n", - " [0.04981015, 0.66664314],\n", - " [0.05351292, 0.64137149],\n", - " [0.05721568, 0.59813869],\n", - " [0.06091845, 0.5670836 ],\n", - " [0.06462122, 0.54746181],\n", - " [0.06832399, 0.53068399],\n", - " [0.07202675, 0.51304734],\n", - " [0.07572951, 0.49394092],\n", - " [0.07943227, 0.47926274],\n", - " [0.08313503, 0.46065259],\n", - " [0.08683779, 0.45992726],\n", - " [0.09054054, 0.43801501],\n", - " [0.09424331, 0.42438665],\n", - " [0.09794607, 0.41150269],\n", - " [0.10164883, 0.40033659],\n", - " [0.10535158, 0.38957134],\n", - " [0.10905434, 0.37756538],\n", - " [0.1127571 , 0.36292541],\n", - " [0.11645985, 0.34357086],\n", - " [0.12016261, 0.3406314 ],\n", - " [0.12386536, 0.32299468],\n", - " [0.12756811, 0.31379458],\n", - " [0.13127086, 0.30795386],\n", - " [0.13497362, 0.29207319],\n", - " [0.13867638, 0.28697687],\n", - " [0.14237913, 0.27405477],\n", - " [0.14608189, 0.2670497 ],\n", - " [0.14978465, 0.25857493],\n", - " [0.15348741, 0.25265783],\n", - " [0.15719018, 0.24826777],\n", - " [0.16089294, 0.2414345 ],\n", - " [0.1645957 , 0.23362778],\n", - " [0.16829847, 0.22956218],\n", - " [0.17200122, 0.22370236],\n", - " [0.17570399, 0.22181271],\n", - " [0.17940674, 0.22089651],\n", - " [0.1831095 , 0.2194268 ],\n", - " [0.18681229, 0.21830064],\n", - " [0.19051504, 0.21845333],\n", - " [0.1942178 , 0.21753715],\n", - " [0.19792056, 0.21719357],\n", - " [0.20162334, 0.21635373],\n", - " [0.2053261 , 0.21667822],\n", - " [0.20902886, 0.21738444],\n", - " [0.21273164, 0.21469313],\n", - " [0.2164344 , 0.21541846],\n", - " [0.22013716, 0.21465495],\n", - " [0.22383993, 0.2135479 ],\n", - " [0.2275427 , 0.21392964],\n", - " [0.23124547, 0.21074206],\n", - " [0.23494825, 0.20873788],\n", - " [0.23865101, 0.20465319],\n", - " [0.24235377, 0.20205732],\n", - " [0.24605653, 0.19774358],\n", - " [0.2497593 , 0.19444147],\n", - " [0.25346208, 0.19190285],\n", - " [0.25716486, 0.18850531],\n", - " [0.26086762, 0.18581399],\n", - " [0.26457039, 0.18327537],\n", - " [0.26827314, 0.18157659],\n", - " [0.2719759 , 0.17814088],\n", - " [0.27567867, 0.17529686],\n", - " [0.27938144, 0.1719375 ],\n", - " [0.28308421, 0.16934161],\n", - " [0.28678698, 0.16756649],\n", - " [0.29048974, 0.16609676],\n", - " [0.29419251, 0.16414985],\n", - " [0.29789529, 0.16260378],\n", - " [0.30159806, 0.16224113],\n", - " [0.30530083, 0.160027 ],\n", - " [0.30900361, 0.15827096],\n", - " [0.31270637, 0.1588054 ],\n", - " [0.31640913, 0.15552238],\n", - " [0.32011189, 0.15580869],\n", - " [0.32381466, 0.15220118],\n", - " [0.32751744, 0.1511132 ],\n", - " [0.33122021, 0.14987253],\n", - " [0.33492297, 0.14874637],\n", - " [0.33862575, 0.14678037],\n", - " [0.34232853, 0.14620776],\n", - " [0.34603131, 0.14555879],\n", - " [0.34973408, 0.14389819],\n", - " [0.35343685, 0.14359279],\n", - " [0.35713963, 0.14242846],\n", - " [0.36084241, 0.14038612],\n", - " [0.36454517, 0.13882096],\n", - " [0.36824795, 0.13954628],\n", - " [0.37195071, 0.13946992],\n", - " [0.37565348, 0.13780934],\n", - " [0.37935626, 0.13973714],\n", - " [0.38305904, 0.13698858],\n", - " [0.38676182, 0.13523254],\n", - " [0.3904646 , 0.13441178],\n", - " [0.39416737, 0.1352898 ],\n", - " [0.39787015, 0.13507985],\n", - " [0.40157291, 0.13647321],\n", - " [0.40527567, 0.13601512],\n", - " [0.40897844, 0.13435452],\n", - " [0.41268121, 0.1334765 ],\n", - " [0.41638398, 0.1348317 ],\n", - " [0.42008676, 0.13275118],\n", - " [0.42378953, 0.13286571],\n", - " [0.4274923 , 0.13263667],\n", - " [0.43119506, 0.13456447],\n", - " [0.43489784, 0.13471718],\n", - " [0.43860061, 0.13395369],\n", - " [0.44230338, 0.13448814],\n", - " [0.44600615, 0.1334765 ],\n", - " [0.44970893, 0.13298023],\n", - " [0.45341168, 0.13259849],\n", - " [0.45711444, 0.13338107],\n", - " [0.46081719, 0.13309476],\n", - " [0.46451994, 0.13275118],\n", - " [0.46822269, 0.13443087],\n", - " [0.47192545, 0.13315202],\n", - " [0.47562821, 0.132713 ],\n", - " [0.47933098, 0.1330184 ],\n", - " [0.48303375, 0.13278936],\n", - " [0.48673651, 0.13225491],\n", - " [0.49043926, 0.13317111],\n", - " [0.49414203, 0.13263667],\n", - " [0.49784482, 0.13187316],\n", - " [0.50154759, 0.13265574],\n", - " [0.50525036, 0.13250305],\n", - " [0.50895311, 0.13324745],\n", - " [0.51265586, 0.13204496],\n", - " [0.51635861, 0.13242669],\n", - " [0.52006139, 0.13233127],\n", - " [0.52376415, 0.13198769],\n", - " [0.52746692, 0.13254122],\n", - " [0.53116969, 0.13145325],\n", - " [0.53487245, 0.13298023],\n", - " [0.53857521, 0.13168229],\n", - " [0.54227797, 0.1313578 ],\n", - " [0.54598074, 0.13235036],\n", - " [0.5496835 , 0.13120511],\n", - " [0.55338627, 0.13089971],\n", - " [0.55708902, 0.13109058],\n", - " [0.56079178, 0.13082336],\n", - " [0.56449454, 0.13011713],\n", - " [0.5681973 , 0.129869 ],\n", - " [0.57190006, 0.12992626],\n", - " [0.57560282, 0.12942998],\n", - " [0.57930558, 0.12796026],\n", - " [0.58300835, 0.12862831],\n", - " [0.58671112, 0.12656689],\n", - " [0.59041389, 0.12734947],\n", - " [0.59411664, 0.12509716],\n", - " [0.59781941, 0.12110791],\n", - " [0.60152218, 0.11839751],\n", - " [0.60522496, 0.11244226],\n", - " [0.60892772, 0.11307214],\n", - " [0.61263048, 0.1092165 ],\n", - " [0.61633325, 0.10683058],\n", - " [0.62003603, 0.10433014],\n", - " [0.6237388 , 0.10530359],\n", - " [0.62744156, 0.10056993],\n", - " [0.63114433, 0.09950104],\n", - " [0.63484711, 0.09854668],\n", - " [0.63854988, 0.09921473],\n", - " [0.64225265, 0.09541635],\n", - " [0.64595543, 0.09980643],\n", - " [0.64965823, 0.0986612 ],\n", - " [0.653361 , 0.09560722],\n", - " [0.65706377, 0.09755413],\n", - " [0.66076656, 0.09612258],\n", - " [0.66446934, 0.09430929],\n", - " [0.66817212, 0.09661885],\n", - " [0.67187489, 0.09366032],\n", - " [0.67557767, 0.09522548],\n", - " [0.67928044, 0.09535909],\n", - " [0.68298322, 0.09316404],\n", - " [0.686686 , 0.09450016],\n", - " [0.69038878, 0.0930877 ],\n", - " [0.69409156, 0.09343126],\n", - " [0.69779433, 0.0932404 ],\n", - " [0.70149709, 0.09350762],\n", - " [0.70519988, 0.09339309],\n", - " [0.70890264, 0.09291591],\n", - " [0.7126054 , 0.09303043],\n", - " [0.71630818, 0.0926296 ],\n", - " [0.72001095, 0.0932404 ],\n", - " [0.72371371, 0.09261052],\n", - " [0.72741648, 0.09249599],\n", - " [0.73111925, 0.09240055],\n", - " [0.73482204, 0.09253416],\n", - " [0.7385248 , 0.09209515],\n", - " [0.74222757, 0.09234329],\n", - " [0.74593034, 0.09366032],\n", - " [0.74963312, 0.09333583],\n", - " [0.75333589, 0.09322131],\n", - " [0.75703868, 0.09264868],\n", - " [0.76074146, 0.09253416],\n", - " [0.76444422, 0.09243873],\n", - " [0.76814698, 0.09230512],\n", - " [0.77184976, 0.09310678],\n", - " [0.77555253, 0.09165615],\n", - " [0.77925531, 0.09159888],\n", - " [0.78295807, 0.09207606],\n", - " [0.78666085, 0.09175158],\n", - " [0.79036364, 0.09177067],\n", - " [0.79406641, 0.09236237],\n", - " [0.79776918, 0.09241964],\n", - " [0.80147197, 0.09320222],\n", - " [0.80517474, 0.09199972],\n", - " [0.80887751, 0.09167523],\n", - " [0.81258028, 0.09322131],\n", - " [0.81628304, 0.09190428],\n", - " [0.81998581, 0.09167523],\n", - " [0.82368858, 0.09285865],\n", - " [0.82739136, 0.09180884],\n", - " [0.83109411, 0.09150345],\n", - " [0.83479688, 0.09186611],\n", - " [0.83849965, 0.0920188 ],\n", - " [0.84220242, 0.09320222],\n", - " [0.84590519, 0.09131257],\n", - " [0.84960797, 0.09117896],\n", - " [0.85331075, 0.09133166],\n", - " [0.85701353, 0.09089265],\n", - " [0.86071631, 0.09058725],\n", - " [0.86441907, 0.09051091],\n", - " [0.86812186, 0.09033912],\n", - " [0.87182464, 0.09041547],\n", - " [0.87552742, 0.0911217 ],\n", - " [0.87923019, 0.0894611 ],\n", - " [0.88293296, 0.08999555],\n", - " [0.88663573, 0.08921297],\n", - " [0.89033849, 0.08881213],\n", - " [0.89404126, 0.08797229],\n", - " [0.89774404, 0.08709427],\n", - " [0.9014468 , 0.08503284],\n", - " [1. , 0.07601531]])),\n", - " 'Negative electrode porosity': 0.25,\n", - " 'Negative electrode active material volume fraction': 0.75,\n", - " 'Negative particle radius [m]': 5.86e-06,\n", - " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode electrons in reaction': 1.0,\n", - " 'Negative electrode exchange-current density [A.m-2]': ,\n", - " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", - " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", - " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020',\n", - " array([[0.24879728, 4.4 ],\n", - " [0.26614516, 4.2935653 ],\n", - " [0.26886763, 4.2768621 ],\n", - " [0.27159011, 4.2647018 ],\n", - " [0.27431258, 4.2540312 ],\n", - " [0.27703505, 4.2449446 ],\n", - " [0.27975753, 4.2364879 ],\n", - " [0.28248 , 4.2302647 ],\n", - " [0.28520247, 4.2225528 ],\n", - " [0.28792495, 4.2182574 ],\n", - " [0.29064743, 4.213294 ],\n", - " [0.29336992, 4.2090373 ],\n", - " [0.29609239, 4.2051239 ],\n", - " [0.29881487, 4.2012677 ],\n", - " [0.30153735, 4.1981564 ],\n", - " [0.30425983, 4.1955218 ],\n", - " [0.30698231, 4.1931167 ],\n", - " [0.30970478, 4.1889744 ],\n", - " [0.31242725, 4.1881533 ],\n", - " [0.31514973, 4.1865883 ],\n", - " [0.3178722 , 4.1850228 ],\n", - " [0.32059466, 4.1832285 ],\n", - " [0.32331714, 4.1808805 ],\n", - " [0.32603962, 4.1805749 ],\n", - " [0.32876209, 4.1789522 ],\n", - " [0.33148456, 4.1768146 ],\n", - " [0.33420703, 4.1768146 ],\n", - " [0.3369295 , 4.1752872 ],\n", - " [0.33965197, 4.173111 ],\n", - " [0.34237446, 4.1726718 ],\n", - " [0.34509694, 4.1710877 ],\n", - " [0.34781941, 4.1702285 ],\n", - " [0.3505419 , 4.168797 ],\n", - " [0.35326438, 4.1669831 ],\n", - " [0.35598685, 4.1655135 ],\n", - " [0.35870932, 4.1634517 ],\n", - " [0.3614318 , 4.1598248 ],\n", - " [0.36415428, 4.1571712 ],\n", - " [0.36687674, 4.154079 ],\n", - " [0.36959921, 4.1504135 ],\n", - " [0.37232169, 4.1466532 ],\n", - " [0.37504418, 4.1423388 ],\n", - " [0.37776665, 4.1382346 ],\n", - " [0.38048913, 4.1338248 ],\n", - " [0.38321161, 4.1305799 ],\n", - " [0.38593408, 4.1272392 ],\n", - " [0.38865655, 4.1228104 ],\n", - " [0.39137903, 4.1186109 ],\n", - " [0.39410151, 4.114182 ],\n", - " [0.39682398, 4.1096005 ],\n", - " [0.39954645, 4.1046948 ],\n", - " [0.40226892, 4.1004758 ],\n", - " [0.4049914 , 4.0956464 ],\n", - " [0.40771387, 4.0909696 ],\n", - " [0.41043634, 4.0864644 ],\n", - " [0.41315882, 4.0818448 ],\n", - " [0.41588129, 4.077683 ],\n", - " [0.41860377, 4.0733309 ],\n", - " [0.42132624, 4.0690737 ],\n", - " [0.42404872, 4.0647216 ],\n", - " [0.4267712 , 4.0608654 ],\n", - " [0.42949368, 4.0564747 ],\n", - " [0.43221616, 4.0527525 ],\n", - " [0.43493864, 4.0492401 ],\n", - " [0.43766111, 4.0450211 ],\n", - " [0.44038359, 4.041986 ],\n", - " [0.44310607, 4.0384736 ],\n", - " [0.44582856, 4.035171 ],\n", - " [0.44855103, 4.0320406 ],\n", - " [0.45127351, 4.0289288 ],\n", - " [0.453996 , 4.02597 ],\n", - " [0.45671848, 4.0227437 ],\n", - " [0.45944095, 4.0199757 ],\n", - " [0.46216343, 4.0175133 ],\n", - " [0.46488592, 4.0149746 ],\n", - " [0.46760838, 4.0122066 ],\n", - " [0.47033085, 4.009954 ],\n", - " [0.47305333, 4.0075679 ],\n", - " [0.47577581, 4.0050669 ],\n", - " [0.47849828, 4.0023184 ],\n", - " [0.48122074, 3.9995501 ],\n", - " [0.48394321, 3.9969349 ],\n", - " [0.48666569, 3.9926589 ],\n", - " [0.48938816, 3.9889555 ],\n", - " [0.49211064, 3.9834003 ],\n", - " [0.4948331 , 3.9783037 ],\n", - " [0.49755557, 3.9755929 ],\n", - " [0.50027804, 3.9707632 ],\n", - " [0.50300052, 3.9681098 ],\n", - " [0.50572298, 3.9635665 ],\n", - " [0.50844545, 3.9594433 ],\n", - " [0.51116792, 3.9556634 ],\n", - " [0.51389038, 3.9521511 ],\n", - " [0.51661284, 3.9479132 ],\n", - " [0.51933531, 3.9438281 ],\n", - " [0.52205777, 3.9400866 ],\n", - " [0.52478024, 3.9362304 ],\n", - " [0.52750271, 3.9314201 ],\n", - " [0.53022518, 3.9283848 ],\n", - " [0.53294765, 3.9242232 ],\n", - " [0.53567012, 3.9192028 ],\n", - " [0.53839258, 3.9166257 ],\n", - " [0.54111506, 3.9117961 ],\n", - " [0.54383753, 3.90815 ],\n", - " [0.54656 , 3.9038739 ],\n", - " [0.54928247, 3.8995597 ],\n", - " [0.55200494, 3.8959136 ],\n", - " [0.5547274 , 3.8909314 ],\n", - " [0.55744986, 3.8872662 ],\n", - " [0.56017233, 3.8831048 ],\n", - " [0.5628948 , 3.8793442 ],\n", - " [0.56561729, 3.8747628 ],\n", - " [0.56833976, 3.8702576 ],\n", - " [0.57106222, 3.8666878 ],\n", - " [0.57378469, 3.8623927 ],\n", - " [0.57650716, 3.8581741 ],\n", - " [0.57922963, 3.854146 ],\n", - " [0.5819521 , 3.8499846 ],\n", - " [0.58467456, 3.8450022 ],\n", - " [0.58739702, 3.8422534 ],\n", - " [0.59011948, 3.8380919 ],\n", - " [0.59284194, 3.8341596 ],\n", - " [0.5955644 , 3.8309333 ],\n", - " [0.59828687, 3.8272109 ],\n", - " [0.60100935, 3.823164 ],\n", - " [0.60373182, 3.8192315 ],\n", - " [0.60645429, 3.8159864 ],\n", - " [0.60917677, 3.8123021 ],\n", - " [0.61189925, 3.8090379 ],\n", - " [0.61462172, 3.8071671 ],\n", - " [0.61734419, 3.8040555 ],\n", - " [0.62006666, 3.8013639 ],\n", - " [0.62278914, 3.7970879 ],\n", - " [0.62551162, 3.7953317 ],\n", - " [0.62823408, 3.7920673 ],\n", - " [0.63095656, 3.788383 ],\n", - " [0.63367903, 3.7855389 ],\n", - " [0.6364015 , 3.7838206 ],\n", - " [0.63912397, 3.78111 ],\n", - " [0.64184645, 3.7794874 ],\n", - " [0.64456893, 3.7769294 ],\n", - " [0.6472914 , 3.773608 ],\n", - " [0.65001389, 3.7695992 ],\n", - " [0.65273637, 3.7690265 ],\n", - " [0.65545884, 3.7662776 ],\n", - " [0.65818131, 3.7642922 ],\n", - " [0.66090379, 3.7626889 ],\n", - " [0.66362625, 3.7603791 ],\n", - " [0.66634874, 3.7575538 ],\n", - " [0.66907121, 3.7552056 ],\n", - " [0.67179369, 3.7533159 ],\n", - " [0.67451616, 3.7507198 ],\n", - " [0.67723865, 3.7487535 ],\n", - " [0.67996113, 3.7471499 ],\n", - " [0.68268361, 3.7442865 ],\n", - " [0.68540608, 3.7423012 ],\n", - " [0.68812855, 3.7400677 ],\n", - " [0.69085103, 3.7385788 ],\n", - " [0.6935735 , 3.7345319 ],\n", - " [0.69629597, 3.7339211 ],\n", - " [0.69901843, 3.7301605 ],\n", - " [0.7017409 , 3.7301033 ],\n", - " [0.70446338, 3.7278316 ],\n", - " [0.70718585, 3.7251589 ],\n", - " [0.70990833, 3.723861 ],\n", - " [0.71263081, 3.7215703 ],\n", - " [0.71535328, 3.7191267 ],\n", - " [0.71807574, 3.7172751 ],\n", - " [0.72079822, 3.7157097 ],\n", - " [0.72352069, 3.7130945 ],\n", - " [0.72624317, 3.7099447 ],\n", - " [0.72896564, 3.7071004 ],\n", - " [0.7316881 , 3.7045615 ],\n", - " [0.73441057, 3.703588 ],\n", - " [0.73713303, 3.70208 ],\n", - " [0.73985551, 3.7002664 ],\n", - " [0.74257799, 3.6972122 ],\n", - " [0.74530047, 3.6952841 ],\n", - " [0.74802293, 3.6929362 ],\n", - " [0.7507454 , 3.6898055 ],\n", - " [0.75346787, 3.6890991 ],\n", - " [0.75619034, 3.686522 ],\n", - " [0.75891281, 3.6849759 ],\n", - " [0.76163529, 3.6821697 ],\n", - " [0.76435776, 3.6808143 ],\n", - " [0.76708024, 3.6786573 ],\n", - " [0.7698027 , 3.6761947 ],\n", - " [0.77252517, 3.674763 ],\n", - " [0.77524765, 3.6712887 ],\n", - " [0.77797012, 3.6697233 ],\n", - " [0.78069258, 3.6678908 ],\n", - " [0.78341506, 3.6652565 ],\n", - " [0.78613753, 3.6630611 ],\n", - " [0.78885999, 3.660274 ],\n", - " [0.79158246, 3.6583652 ],\n", - " [0.79430494, 3.6554828 ],\n", - " [0.79702741, 3.6522949 ],\n", - " [0.79974987, 3.6499848 ],\n", - " [0.80247234, 3.6470451 ],\n", - " [0.8051948 , 3.6405547 ],\n", - " [0.80791727, 3.6383405 ],\n", - " [0.81063974, 3.635076 ],\n", - " [0.81336221, 3.633549 ],\n", - " [0.81608468, 3.6322317 ],\n", - " [0.81880714, 3.6306856 ],\n", - " [0.82152961, 3.6283948 ],\n", - " [0.82425208, 3.6268487 ],\n", - " [0.82697453, 3.6243098 ],\n", - " [0.829697 , 3.6223626 ],\n", - " [0.83241946, 3.6193655 ],\n", - " [0.83514192, 3.6177621 ],\n", - " [0.83786439, 3.6158531 ],\n", - " [0.84058684, 3.6128371 ],\n", - " [0.84330931, 3.6118062 ],\n", - " [0.84603177, 3.6094582 ],\n", - " [0.84875424, 3.6072438 ],\n", - " [0.8514767 , 3.6049912 ],\n", - " [0.85419916, 3.6030822 ],\n", - " [0.85692162, 3.6012688 ],\n", - " [0.85964409, 3.5995889 ],\n", - " [0.86236656, 3.5976417 ],\n", - " [0.86508902, 3.5951984 ],\n", - " [0.86781149, 3.593843 ],\n", - " [0.87053395, 3.5916286 ],\n", - " [0.87325642, 3.5894907 ],\n", - " [0.87597888, 3.587429 ],\n", - " [0.87870135, 3.5852909 ],\n", - " [0.88142383, 3.5834775 ],\n", - " [0.8841463 , 3.5817785 ],\n", - " [0.88686877, 3.5801177 ],\n", - " [0.88959124, 3.5778842 ],\n", - " [0.89231371, 3.5763381 ],\n", - " [0.8950362 , 3.5737801 ],\n", - " [0.89775868, 3.5721002 ],\n", - " [0.90048116, 3.5702102 ],\n", - " [0.90320364, 3.5684922 ],\n", - " [0.90592613, 3.5672133 ],\n", - " [1. , 3.52302167]])),\n", - " 'Positive electrode porosity': 0.335,\n", - " 'Positive electrode active material volume fraction': 0.665,\n", - " 'Positive particle radius [m]': 5.22e-06,\n", - " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode electrons in reaction': 1.0,\n", - " 'Positive electrode exchange-current density [A.m-2]': ,\n", - " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", - " 'Separator porosity': 0.47,\n", - " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", - " 'Reference temperature [K]': 298.15,\n", - " 'Ambient temperature [K]': 298.15,\n", - " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", - " 'Number of cells connected in series to make a battery': 1.0,\n", - " 'Lower voltage cut-off [V]': 2.5,\n", - " 'Upper voltage cut-off [V]': 4.4,\n", - " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", - " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", - " 'Initial temperature [K]': 298.15}" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param_same = pybamm.ParameterValues(\"Chen2020\")\n", - "{k: v for k,v in param_same.items() if k in spm._parameter_info}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating a specific parameter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once a parameter set has been defined (either via a dictionary or a pre-built set), single parameters can be updated" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a constant value:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current function [A]\t5.0\n" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parameterisation\n", + "\n", + "In this notebook, we show how to find which parameters are needed in a model and define them.\n", + "\n", + "For other notebooks about parameterization, see:\n", + "\n", + "- The API documentation of [Parameters](https://pybamm.readthedocs.io/en/latest/source/parameters/index.html) can be found at [pybamm.readthedocs.io](https://pybamm.readthedocs.io/)\n", + "- [Setting parameter values](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%204%20-%20Setting%20parameter%20values.ipynb) can be found at `pybamm/examples/notebooks/Getting Started/Tutorial 4 - Setting parameter values.ipynb`. This explains the basics of how to set the parameters of a model (in less detail than here).\n", + "- [parameter-management.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/parameterization/parameter-management.ipynb) can be found at `pybamm/examples/notebooks/parameterization/parameter-management.ipynb`. This explains how to add and edit parameters in the `pybamm/input` directories\n", + "- [parameter-values.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/parameterization/parameter-values.ipynb) can be found at `pybamm/examples/notebooks/parameterization/parameter-values.ipynb`. This explains the basics of the `ParameterValues` class.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adding your own parameter sets (using a dictionary)\n", + "\n", + "We will be using the model defined and explained in more detail in [3-negative-particle-problem.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Creating%20Models/3-negative-particle-problem.ipynb) example notebook. We begin by importing the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: You are using pip version 21.0.1; however, version 21.1.1 is available.\n", + "You should consider upgrading via the '/Users/vsulzer/Documents/Energy_storage/PyBaMM/.tox/dev/bin/python -m pip install --upgrade pip' command.\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up the model\n", + "\n", + "We define all the parameters and variables using `pybamm.Parameter` and `pybamm.Variable` respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "c = pybamm.Variable(\"Concentration [mol.m-3]\", domain=\"negative particle\")\n", + "\n", + "R = pybamm.Parameter(\"Particle radius [m]\")\n", + "D = pybamm.FunctionParameter(\"Diffusion coefficient [m2.s-1]\", {\"Concentration [mol.m-3]\": c})\n", + "j = pybamm.InputParameter(\"Interfacial current density [A.m-2]\")\n", + "c0 = pybamm.Parameter(\"Initial concentration [mol.m-3]\")\n", + "c_e = pybamm.Parameter(\"Electrolyte concentration [mol.m-3]\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we define our model equations, boundary and initial conditions. We also add the variables required using the dictionary `model.variables`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.BaseModel()\n", + "\n", + "# governing equations\n", + "N = -D * pybamm.grad(c) # flux\n", + "dcdt = -pybamm.div(N)\n", + "model.rhs = {c: dcdt} \n", + "\n", + "# boundary conditions \n", + "lbc = pybamm.Scalar(0)\n", + "rbc = -j\n", + "model.boundary_conditions = {c: {\"left\": (lbc, \"Neumann\"), \"right\": (rbc, \"Neumann\")}}\n", + "\n", + "# initial conditions \n", + "model.initial_conditions = {c: c0}\n", + "\n", + "model.variables = {\n", + " \"Concentration [mol.m-3]\": c,\n", + " \"Surface concentration [mol.m-3]\": pybamm.surf(c),\n", + " \"Flux [mol.m-2.s-1]\": N,\n", + "}\n", + "\n", + "model.length_scales = {\"negative particle\": pybamm.Scalar(1)}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also define the geometry, since there are parameters in the geometry too" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "r = pybamm.SpatialVariable(\"r\", domain=[\"negative particle\"], coord_sys=\"spherical polar\")\n", + "geometry = pybamm.Geometry({\"negative particle\": {r: {\"min\": pybamm.Scalar(0), \"max\": R}}})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finding the parameters required" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To know what parameters are required by the model and geometry, we can do" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial concentration [mol.m-3] (Parameter)\n", + "Interfacial current density [A.m-2] (InputParameter)\n", + "Diffusion coefficient [m2.s-1] (FunctionParameter with input(s) 'Concentration [mol.m-3]')\n", + "\n", + "Particle radius [m] (Parameter)\n" + ] + } + ], + "source": [ + "model.print_parameter_info()\n", + "geometry.print_parameter_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tells us that we need to provide parameter values for the initial concentration and Faraday constant, an `InputParameter` at solve time for the interfacial current density, and diffusivity as a function of concentration. Since the electrolyte concentration does not appear anywhere in the model, there is no need to provide a value for it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adding the parameters\n", + "\n", + "Now we can proceed to the step where we add the `parameter` values using a dictionary. We set up a dictionary with parameter names as the dictionary keys and their respective values as the dictionary values." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def D_fun(c):\n", + " return 3.9 #* pybamm.exp(-c)\n", + "\n", + "values = {\n", + " \"Particle radius [m]\": 2,\n", + " \"Diffusion coefficient [m2.s-1]\": D_fun,\n", + " \"Initial concentration [mol.m-3]\": 2.5,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can pass this dictionary in `pybamm.ParameterValues` class which accepts a dictionary of parameter names and values. We can then print `param` to check if it was initialised." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Diffusion coefficient [m2.s-1]': ,\n", + " 'Initial concentration [mol.m-3]': 2.5,\n", + " 'Particle radius [m]': 2}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param = pybamm.ParameterValues(values)\n", + "\n", + "param" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Updating the parameter values\n", + "\n", + "The parameter values or `param` can be further updated by using the `update` function of `ParameterValues` class. The `update` function takes a dictionary with keys being the parameters to be updated and their respective values being the updated values. Here we update the `\"Particle radius [m]\"` parameter's value. Additionally, a function can also be passed as a `parameter`'s value which we will see ahead, and a new `parameter` can also be added by passing `check_already_exists=False` in the `update` function." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Diffusion coefficient [m2.s-1]': ,\n", + " 'Initial concentration [mol.m-3]': 1.5,\n", + " 'Particle radius [m]': 2}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param.update({\"Initial concentration [mol.m-3]\": 1.5})\n", + "param" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving the model " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finding the parameters in a model\n", + "\n", + "The `parameter` function of the `BaseModel` class can be used to obtain the parameters of a model." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[FunctionParameter(0x736b1e61c4b31acc, Diffusion coefficient [m2.s-1], children=['Concentration [mol.m-3]'], domain=['negative particle'], auxiliary_domains={}),\n", + " Parameter(0x40657aef7bd7f3b3, Initial concentration [mol.m-3], children=[], domain=[], auxiliary_domains={}),\n", + " InputParameter(0x7ae41be7144e72f1, Interfacial current density [A.m-2], children=[], domain=[], auxiliary_domains={})]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parameters = model.parameters\n", + "parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As explained in the [3-negative-particle-problem.ipynb](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Creating%20Models/3-negative-particle-problem.ipynb) example, we first process both the `model` and the `geometry`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "param.process_model(model)\n", + "param.process_geometry(geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now set up our mesh, choose a spatial method, and discretise our model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "submesh_types = {\"negative particle\": pybamm.Uniform1DSubMesh}\n", + "var_pts = {r: 20}\n", + "mesh = pybamm.Mesh(geometry, submesh_types, var_pts)\n", + "\n", + "spatial_methods = {\"negative particle\": pybamm.FiniteVolume()}\n", + "disc = pybamm.Discretisation(mesh, spatial_methods)\n", + "disc.process_model(model);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We choose a solver and times at which we want the solution returned, and solve the model. Here we give a value for the current density `j`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# solve\n", + "solver = pybamm.ScipySolver()\n", + "t = np.linspace(0, 3600, 600)\n", + "solution = solver.solve(model, t, inputs={\"Interfacial current density [A.m-2]\": 1.4})\n", + "\n", + "# post-process, so that the solution can be called at any time t or space r\n", + "# (using interpolation)\n", + "c = solution[\"Concentration [mol.m-3]\"]\n", + "c_surf = solution[\"Surface concentration [mol.m-3]\"]\n", + "\n", + "# plot\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", + "\n", + "ax1.plot(solution.t, c_surf(solution.t))\n", + "ax1.set_xlabel(\"Time [s]\")\n", + "ax1.set_ylabel(\"Surface concentration [mol.m-3]\")\n", + "\n", + "rsol = mesh[\"negative particle\"].nodes # radial position\n", + "time = 1000 # time in seconds\n", + "ax2.plot(rsol * 1e6, c(t=time, r=rsol), label=\"t={}[s]\".format(time))\n", + "ax2.set_xlabel(\"Particle radius [microns]\")\n", + "ax2.set_ylabel(\"Concentration [mol.m-3]\")\n", + "ax2.legend()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using pre-defined models in `PyBaMM`\n", + "\n", + "In the next few steps, we will be showing the same workflow with the Single Particle Model (`SPM`). We will also see how you can pass a function as a `parameter`'s value and how to plot such `parameter functions`.\n", + "\n", + "We start by initializing our model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "spm = pybamm.lithium_ion.SPM()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finding the parameters in a model\n", + "\n", + "We can print the `parameters` of a model by using the `get_parameters_info` function." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maximum concentration in negative electrode [mol.m-3] (Parameter)\n", + "Negative electrode thickness [m] (Parameter)\n", + "Separator thickness [m] (Parameter)\n", + "Positive electrode thickness [m] (Parameter)\n", + "Typical current [A] (Parameter)\n", + "Number of electrodes connected in parallel to make a cell (Parameter)\n", + "Electrode width [m] (Parameter)\n", + "Electrode height [m] (Parameter)\n", + "Reference temperature [K] (Parameter)\n", + "Maximum concentration in positive electrode [mol.m-3] (Parameter)\n", + "Nominal cell capacity [A.h] (Parameter)\n", + "Typical electrolyte concentration [mol.m-3] (Parameter)\n", + "Negative electrode Bruggeman coefficient (electrolyte) (Parameter)\n", + "Separator Bruggeman coefficient (electrolyte) (Parameter)\n", + "Positive electrode Bruggeman coefficient (electrolyte) (Parameter)\n", + "Negative electrode electrons in reaction (Parameter)\n", + "Positive electrode electrons in reaction (Parameter)\n", + "Number of cells connected in series to make a battery (Parameter)\n", + "Initial temperature [K] (Parameter)\n", + "Lower voltage cut-off [V] (Parameter)\n", + "Upper voltage cut-off [V] (Parameter)\n", + "Current function [A] (FunctionParameter with input(s) 'Time [s]')\n", + "Negative particle radius [m] (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", + "Negative electrode diffusivity [m2.s-1] (FunctionParameter with input(s) 'Negative particle stoichiometry', 'Temperature [K]')\n", + "Positive particle radius [m] (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", + "Positive electrode diffusivity [m2.s-1] (FunctionParameter with input(s) 'Positive particle stoichiometry', 'Temperature [K]')\n", + "Initial concentration in negative electrode [mol.m-3] (FunctionParameter with input(s) 'Dimensionless through-cell position (x_n)')\n", + "Initial concentration in positive electrode [mol.m-3] (FunctionParameter with input(s) 'Dimensionless through-cell position (x_p)')\n", + "Negative electrode active material volume fraction (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", + "Positive electrode active material volume fraction (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", + "Negative electrode porosity (FunctionParameter with input(s) 'Through-cell distance (x_n) [m]')\n", + "Separator porosity (FunctionParameter with input(s) 'Through-cell distance (x_s) [m]')\n", + "Positive electrode porosity (FunctionParameter with input(s) 'Through-cell distance (x_p) [m]')\n", + "Ambient temperature [K] (FunctionParameter with input(s) 'Time [s]')\n", + "Negative electrode exchange-current density [A.m-2] (FunctionParameter with input(s) 'Electrolyte concentration [mol.m-3]', 'Negative particle surface concentration [mol.m-3]', 'Temperature [K]')\n", + "Negative electrode OCP [V] (FunctionParameter with input(s) 'Negative particle stoichiometry')\n", + "Negative electrode OCP entropic change [V.K-1] (FunctionParameter with input(s) 'Negative particle stoichiometry')\n", + "Positive electrode exchange-current density [A.m-2] (FunctionParameter with input(s) 'Electrolyte concentration [mol.m-3]', 'Positive particle surface concentration [mol.m-3]', 'Temperature [K]')\n", + "Positive electrode OCP [V] (FunctionParameter with input(s) 'Positive particle stoichiometry')\n", + "Positive electrode OCP entropic change [V.K-1] (FunctionParameter with input(s) 'Positive particle stoichiometry')\n", + "\n" + ] + } + ], + "source": [ + "spm.print_parameter_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that there are no `InputParameter` objects in the default SPM. Also, note that if a `FunctionParameter` is expected, it is ok to provide a scalar (parameter) instead. However, if a `Parameter` is expected, you cannot provide a function instead." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another way to view what parameters are needed is to print the default parameter values. This can also be used to get some good defaults (but care must be taken when combining parameters across datasets and chemistries)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Negative electrode thickness [m]': 0.0001,\n", + " 'Separator thickness [m]': 2.5e-05,\n", + " 'Positive electrode thickness [m]': 0.0001,\n", + " 'Electrode height [m]': 0.137,\n", + " 'Electrode width [m]': 0.207,\n", + " 'Nominal cell capacity [A.h]': 0.680616,\n", + " 'Typical current [A]': 0.680616,\n", + " 'Current function [A]': 0.680616,\n", + " 'Maximum concentration in negative electrode [mol.m-3]': 24983.2619938437,\n", + " 'Negative electrode diffusivity [m2.s-1]': ,\n", + " 'Negative electrode OCP [V]': ,\n", + " 'Negative electrode porosity': 0.3,\n", + " 'Negative electrode active material volume fraction': 0.6,\n", + " 'Negative particle radius [m]': 1e-05,\n", + " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Negative electrode electrons in reaction': 1.0,\n", + " 'Negative electrode exchange-current density [A.m-2]': ,\n", + " 'Negative electrode OCP entropic change [V.K-1]': ,\n", + " 'Maximum concentration in positive electrode [mol.m-3]': 51217.9257309275,\n", + " 'Positive electrode diffusivity [m2.s-1]': ,\n", + " 'Positive electrode OCP [V]': ,\n", + " 'Positive electrode porosity': 0.3,\n", + " 'Positive electrode active material volume fraction': 0.5,\n", + " 'Positive particle radius [m]': 1e-05,\n", + " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Positive electrode electrons in reaction': 1.0,\n", + " 'Positive electrode exchange-current density [A.m-2]': ,\n", + " 'Positive electrode OCP entropic change [V.K-1]': ,\n", + " 'Separator porosity': 1.0,\n", + " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", + " 'Reference temperature [K]': 298.15,\n", + " 'Ambient temperature [K]': 298.15,\n", + " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", + " 'Number of cells connected in series to make a battery': 1.0,\n", + " 'Lower voltage cut-off [V]': 3.105,\n", + " 'Upper voltage cut-off [V]': 4.2,\n", + " 'Initial concentration in negative electrode [mol.m-3]': 19986.609595075,\n", + " 'Initial concentration in positive electrode [mol.m-3]': 30730.7554385565,\n", + " 'Initial temperature [K]': 298.15}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{k: v for k,v in spm.default_parameter_values.items() if k in spm._parameter_info}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now define a dictionary of values for `ParameterValues` as before (here, a subset of the `Chen2020` parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Ambient temperature [K]': 298.15,\n", + " 'Current function [A]': 5.0,\n", + " 'Electrode height [m]': 0.065,\n", + " 'Electrode width [m]': 1.58,\n", + " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", + " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", + " 'Initial temperature [K]': 298.15,\n", + " 'Lower voltage cut-off [V]': 2.5,\n", + " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", + " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", + " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020',\n", + " array([[0. , 1.81772748],\n", + " [0.03129623, 1.0828807 ],\n", + " [0.03499902, 0.99593794],\n", + " [0.0387018 , 0.90023398],\n", + " [0.04240458, 0.79649431],\n", + " [0.04610736, 0.73354429],\n", + " [0.04981015, 0.66664314],\n", + " [0.05351292, 0.64137149],\n", + " [0.05721568, 0.59813869],\n", + " [0.06091845, 0.5670836 ],\n", + " [0.06462122, 0.54746181],\n", + " [0.06832399, 0.53068399],\n", + " [0.07202675, 0.51304734],\n", + " [0.07572951, 0.49394092],\n", + " [0.07943227, 0.47926274],\n", + " [0.08313503, 0.46065259],\n", + " [0.08683779, 0.45992726],\n", + " [0.09054054, 0.43801501],\n", + " [0.09424331, 0.42438665],\n", + " [0.09794607, 0.41150269],\n", + " [0.10164883, 0.40033659],\n", + " [0.10535158, 0.38957134],\n", + " [0.10905434, 0.37756538],\n", + " [0.1127571 , 0.36292541],\n", + " [0.11645985, 0.34357086],\n", + " [0.12016261, 0.3406314 ],\n", + " [0.12386536, 0.32299468],\n", + " [0.12756811, 0.31379458],\n", + " [0.13127086, 0.30795386],\n", + " [0.13497362, 0.29207319],\n", + " [0.13867638, 0.28697687],\n", + " [0.14237913, 0.27405477],\n", + " [0.14608189, 0.2670497 ],\n", + " [0.14978465, 0.25857493],\n", + " [0.15348741, 0.25265783],\n", + " [0.15719018, 0.24826777],\n", + " [0.16089294, 0.2414345 ],\n", + " [0.1645957 , 0.23362778],\n", + " [0.16829847, 0.22956218],\n", + " [0.17200122, 0.22370236],\n", + " [0.17570399, 0.22181271],\n", + " [0.17940674, 0.22089651],\n", + " [0.1831095 , 0.2194268 ],\n", + " [0.18681229, 0.21830064],\n", + " [0.19051504, 0.21845333],\n", + " [0.1942178 , 0.21753715],\n", + " [0.19792056, 0.21719357],\n", + " [0.20162334, 0.21635373],\n", + " [0.2053261 , 0.21667822],\n", + " [0.20902886, 0.21738444],\n", + " [0.21273164, 0.21469313],\n", + " [0.2164344 , 0.21541846],\n", + " [0.22013716, 0.21465495],\n", + " [0.22383993, 0.2135479 ],\n", + " [0.2275427 , 0.21392964],\n", + " [0.23124547, 0.21074206],\n", + " [0.23494825, 0.20873788],\n", + " [0.23865101, 0.20465319],\n", + " [0.24235377, 0.20205732],\n", + " [0.24605653, 0.19774358],\n", + " [0.2497593 , 0.19444147],\n", + " [0.25346208, 0.19190285],\n", + " [0.25716486, 0.18850531],\n", + " [0.26086762, 0.18581399],\n", + " [0.26457039, 0.18327537],\n", + " [0.26827314, 0.18157659],\n", + " [0.2719759 , 0.17814088],\n", + " [0.27567867, 0.17529686],\n", + " [0.27938144, 0.1719375 ],\n", + " [0.28308421, 0.16934161],\n", + " [0.28678698, 0.16756649],\n", + " [0.29048974, 0.16609676],\n", + " [0.29419251, 0.16414985],\n", + " [0.29789529, 0.16260378],\n", + " [0.30159806, 0.16224113],\n", + " [0.30530083, 0.160027 ],\n", + " [0.30900361, 0.15827096],\n", + " [0.31270637, 0.1588054 ],\n", + " [0.31640913, 0.15552238],\n", + " [0.32011189, 0.15580869],\n", + " [0.32381466, 0.15220118],\n", + " [0.32751744, 0.1511132 ],\n", + " [0.33122021, 0.14987253],\n", + " [0.33492297, 0.14874637],\n", + " [0.33862575, 0.14678037],\n", + " [0.34232853, 0.14620776],\n", + " [0.34603131, 0.14555879],\n", + " [0.34973408, 0.14389819],\n", + " [0.35343685, 0.14359279],\n", + " [0.35713963, 0.14242846],\n", + " [0.36084241, 0.14038612],\n", + " [0.36454517, 0.13882096],\n", + " [0.36824795, 0.13954628],\n", + " [0.37195071, 0.13946992],\n", + " [0.37565348, 0.13780934],\n", + " [0.37935626, 0.13973714],\n", + " [0.38305904, 0.13698858],\n", + " [0.38676182, 0.13523254],\n", + " [0.3904646 , 0.13441178],\n", + " [0.39416737, 0.1352898 ],\n", + " [0.39787015, 0.13507985],\n", + " [0.40157291, 0.13647321],\n", + " [0.40527567, 0.13601512],\n", + " [0.40897844, 0.13435452],\n", + " [0.41268121, 0.1334765 ],\n", + " [0.41638398, 0.1348317 ],\n", + " [0.42008676, 0.13275118],\n", + " [0.42378953, 0.13286571],\n", + " [0.4274923 , 0.13263667],\n", + " [0.43119506, 0.13456447],\n", + " [0.43489784, 0.13471718],\n", + " [0.43860061, 0.13395369],\n", + " [0.44230338, 0.13448814],\n", + " [0.44600615, 0.1334765 ],\n", + " [0.44970893, 0.13298023],\n", + " [0.45341168, 0.13259849],\n", + " [0.45711444, 0.13338107],\n", + " [0.46081719, 0.13309476],\n", + " [0.46451994, 0.13275118],\n", + " [0.46822269, 0.13443087],\n", + " [0.47192545, 0.13315202],\n", + " [0.47562821, 0.132713 ],\n", + " [0.47933098, 0.1330184 ],\n", + " [0.48303375, 0.13278936],\n", + " [0.48673651, 0.13225491],\n", + " [0.49043926, 0.13317111],\n", + " [0.49414203, 0.13263667],\n", + " [0.49784482, 0.13187316],\n", + " [0.50154759, 0.13265574],\n", + " [0.50525036, 0.13250305],\n", + " [0.50895311, 0.13324745],\n", + " [0.51265586, 0.13204496],\n", + " [0.51635861, 0.13242669],\n", + " [0.52006139, 0.13233127],\n", + " [0.52376415, 0.13198769],\n", + " [0.52746692, 0.13254122],\n", + " [0.53116969, 0.13145325],\n", + " [0.53487245, 0.13298023],\n", + " [0.53857521, 0.13168229],\n", + " [0.54227797, 0.1313578 ],\n", + " [0.54598074, 0.13235036],\n", + " [0.5496835 , 0.13120511],\n", + " [0.55338627, 0.13089971],\n", + " [0.55708902, 0.13109058],\n", + " [0.56079178, 0.13082336],\n", + " [0.56449454, 0.13011713],\n", + " [0.5681973 , 0.129869 ],\n", + " [0.57190006, 0.12992626],\n", + " [0.57560282, 0.12942998],\n", + " [0.57930558, 0.12796026],\n", + " [0.58300835, 0.12862831],\n", + " [0.58671112, 0.12656689],\n", + " [0.59041389, 0.12734947],\n", + " [0.59411664, 0.12509716],\n", + " [0.59781941, 0.12110791],\n", + " [0.60152218, 0.11839751],\n", + " [0.60522496, 0.11244226],\n", + " [0.60892772, 0.11307214],\n", + " [0.61263048, 0.1092165 ],\n", + " [0.61633325, 0.10683058],\n", + " [0.62003603, 0.10433014],\n", + " [0.6237388 , 0.10530359],\n", + " [0.62744156, 0.10056993],\n", + " [0.63114433, 0.09950104],\n", + " [0.63484711, 0.09854668],\n", + " [0.63854988, 0.09921473],\n", + " [0.64225265, 0.09541635],\n", + " [0.64595543, 0.09980643],\n", + " [0.64965823, 0.0986612 ],\n", + " [0.653361 , 0.09560722],\n", + " [0.65706377, 0.09755413],\n", + " [0.66076656, 0.09612258],\n", + " [0.66446934, 0.09430929],\n", + " [0.66817212, 0.09661885],\n", + " [0.67187489, 0.09366032],\n", + " [0.67557767, 0.09522548],\n", + " [0.67928044, 0.09535909],\n", + " [0.68298322, 0.09316404],\n", + " [0.686686 , 0.09450016],\n", + " [0.69038878, 0.0930877 ],\n", + " [0.69409156, 0.09343126],\n", + " [0.69779433, 0.0932404 ],\n", + " [0.70149709, 0.09350762],\n", + " [0.70519988, 0.09339309],\n", + " [0.70890264, 0.09291591],\n", + " [0.7126054 , 0.09303043],\n", + " [0.71630818, 0.0926296 ],\n", + " [0.72001095, 0.0932404 ],\n", + " [0.72371371, 0.09261052],\n", + " [0.72741648, 0.09249599],\n", + " [0.73111925, 0.09240055],\n", + " [0.73482204, 0.09253416],\n", + " [0.7385248 , 0.09209515],\n", + " [0.74222757, 0.09234329],\n", + " [0.74593034, 0.09366032],\n", + " [0.74963312, 0.09333583],\n", + " [0.75333589, 0.09322131],\n", + " [0.75703868, 0.09264868],\n", + " [0.76074146, 0.09253416],\n", + " [0.76444422, 0.09243873],\n", + " [0.76814698, 0.09230512],\n", + " [0.77184976, 0.09310678],\n", + " [0.77555253, 0.09165615],\n", + " [0.77925531, 0.09159888],\n", + " [0.78295807, 0.09207606],\n", + " [0.78666085, 0.09175158],\n", + " [0.79036364, 0.09177067],\n", + " [0.79406641, 0.09236237],\n", + " [0.79776918, 0.09241964],\n", + " [0.80147197, 0.09320222],\n", + " [0.80517474, 0.09199972],\n", + " [0.80887751, 0.09167523],\n", + " [0.81258028, 0.09322131],\n", + " [0.81628304, 0.09190428],\n", + " [0.81998581, 0.09167523],\n", + " [0.82368858, 0.09285865],\n", + " [0.82739136, 0.09180884],\n", + " [0.83109411, 0.09150345],\n", + " [0.83479688, 0.09186611],\n", + " [0.83849965, 0.0920188 ],\n", + " [0.84220242, 0.09320222],\n", + " [0.84590519, 0.09131257],\n", + " [0.84960797, 0.09117896],\n", + " [0.85331075, 0.09133166],\n", + " [0.85701353, 0.09089265],\n", + " [0.86071631, 0.09058725],\n", + " [0.86441907, 0.09051091],\n", + " [0.86812186, 0.09033912],\n", + " [0.87182464, 0.09041547],\n", + " [0.87552742, 0.0911217 ],\n", + " [0.87923019, 0.0894611 ],\n", + " [0.88293296, 0.08999555],\n", + " [0.88663573, 0.08921297],\n", + " [0.89033849, 0.08881213],\n", + " [0.89404126, 0.08797229],\n", + " [0.89774404, 0.08709427],\n", + " [0.9014468 , 0.08503284],\n", + " [1. , 0.07601531]])),\n", + " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Negative electrode active material volume fraction': 0.75,\n", + " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", + " 'Negative electrode electrons in reaction': 1.0,\n", + " 'Negative electrode exchange-current density [A.m-2]': ,\n", + " 'Negative electrode porosity': 0.25,\n", + " 'Negative electrode thickness [m]': 8.52e-05,\n", + " 'Negative particle radius [m]': 5.86e-06,\n", + " 'Nominal cell capacity [A.h]': 5.0,\n", + " 'Number of cells connected in series to make a battery': 1.0,\n", + " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", + " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020',\n", + " array([[0.24879728, 4.4 ],\n", + " [0.26614516, 4.2935653 ],\n", + " [0.26886763, 4.2768621 ],\n", + " [0.27159011, 4.2647018 ],\n", + " [0.27431258, 4.2540312 ],\n", + " [0.27703505, 4.2449446 ],\n", + " [0.27975753, 4.2364879 ],\n", + " [0.28248 , 4.2302647 ],\n", + " [0.28520247, 4.2225528 ],\n", + " [0.28792495, 4.2182574 ],\n", + " [0.29064743, 4.213294 ],\n", + " [0.29336992, 4.2090373 ],\n", + " [0.29609239, 4.2051239 ],\n", + " [0.29881487, 4.2012677 ],\n", + " [0.30153735, 4.1981564 ],\n", + " [0.30425983, 4.1955218 ],\n", + " [0.30698231, 4.1931167 ],\n", + " [0.30970478, 4.1889744 ],\n", + " [0.31242725, 4.1881533 ],\n", + " [0.31514973, 4.1865883 ],\n", + " [0.3178722 , 4.1850228 ],\n", + " [0.32059466, 4.1832285 ],\n", + " [0.32331714, 4.1808805 ],\n", + " [0.32603962, 4.1805749 ],\n", + " [0.32876209, 4.1789522 ],\n", + " [0.33148456, 4.1768146 ],\n", + " [0.33420703, 4.1768146 ],\n", + " [0.3369295 , 4.1752872 ],\n", + " [0.33965197, 4.173111 ],\n", + " [0.34237446, 4.1726718 ],\n", + " [0.34509694, 4.1710877 ],\n", + " [0.34781941, 4.1702285 ],\n", + " [0.3505419 , 4.168797 ],\n", + " [0.35326438, 4.1669831 ],\n", + " [0.35598685, 4.1655135 ],\n", + " [0.35870932, 4.1634517 ],\n", + " [0.3614318 , 4.1598248 ],\n", + " [0.36415428, 4.1571712 ],\n", + " [0.36687674, 4.154079 ],\n", + " [0.36959921, 4.1504135 ],\n", + " [0.37232169, 4.1466532 ],\n", + " [0.37504418, 4.1423388 ],\n", + " [0.37776665, 4.1382346 ],\n", + " [0.38048913, 4.1338248 ],\n", + " [0.38321161, 4.1305799 ],\n", + " [0.38593408, 4.1272392 ],\n", + " [0.38865655, 4.1228104 ],\n", + " [0.39137903, 4.1186109 ],\n", + " [0.39410151, 4.114182 ],\n", + " [0.39682398, 4.1096005 ],\n", + " [0.39954645, 4.1046948 ],\n", + " [0.40226892, 4.1004758 ],\n", + " [0.4049914 , 4.0956464 ],\n", + " [0.40771387, 4.0909696 ],\n", + " [0.41043634, 4.0864644 ],\n", + " [0.41315882, 4.0818448 ],\n", + " [0.41588129, 4.077683 ],\n", + " [0.41860377, 4.0733309 ],\n", + " [0.42132624, 4.0690737 ],\n", + " [0.42404872, 4.0647216 ],\n", + " [0.4267712 , 4.0608654 ],\n", + " [0.42949368, 4.0564747 ],\n", + " [0.43221616, 4.0527525 ],\n", + " [0.43493864, 4.0492401 ],\n", + " [0.43766111, 4.0450211 ],\n", + " [0.44038359, 4.041986 ],\n", + " [0.44310607, 4.0384736 ],\n", + " [0.44582856, 4.035171 ],\n", + " [0.44855103, 4.0320406 ],\n", + " [0.45127351, 4.0289288 ],\n", + " [0.453996 , 4.02597 ],\n", + " [0.45671848, 4.0227437 ],\n", + " [0.45944095, 4.0199757 ],\n", + " [0.46216343, 4.0175133 ],\n", + " [0.46488592, 4.0149746 ],\n", + " [0.46760838, 4.0122066 ],\n", + " [0.47033085, 4.009954 ],\n", + " [0.47305333, 4.0075679 ],\n", + " [0.47577581, 4.0050669 ],\n", + " [0.47849828, 4.0023184 ],\n", + " [0.48122074, 3.9995501 ],\n", + " [0.48394321, 3.9969349 ],\n", + " [0.48666569, 3.9926589 ],\n", + " [0.48938816, 3.9889555 ],\n", + " [0.49211064, 3.9834003 ],\n", + " [0.4948331 , 3.9783037 ],\n", + " [0.49755557, 3.9755929 ],\n", + " [0.50027804, 3.9707632 ],\n", + " [0.50300052, 3.9681098 ],\n", + " [0.50572298, 3.9635665 ],\n", + " [0.50844545, 3.9594433 ],\n", + " [0.51116792, 3.9556634 ],\n", + " [0.51389038, 3.9521511 ],\n", + " [0.51661284, 3.9479132 ],\n", + " [0.51933531, 3.9438281 ],\n", + " [0.52205777, 3.9400866 ],\n", + " [0.52478024, 3.9362304 ],\n", + " [0.52750271, 3.9314201 ],\n", + " [0.53022518, 3.9283848 ],\n", + " [0.53294765, 3.9242232 ],\n", + " [0.53567012, 3.9192028 ],\n", + " [0.53839258, 3.9166257 ],\n", + " [0.54111506, 3.9117961 ],\n", + " [0.54383753, 3.90815 ],\n", + " [0.54656 , 3.9038739 ],\n", + " [0.54928247, 3.8995597 ],\n", + " [0.55200494, 3.8959136 ],\n", + " [0.5547274 , 3.8909314 ],\n", + " [0.55744986, 3.8872662 ],\n", + " [0.56017233, 3.8831048 ],\n", + " [0.5628948 , 3.8793442 ],\n", + " [0.56561729, 3.8747628 ],\n", + " [0.56833976, 3.8702576 ],\n", + " [0.57106222, 3.8666878 ],\n", + " [0.57378469, 3.8623927 ],\n", + " [0.57650716, 3.8581741 ],\n", + " [0.57922963, 3.854146 ],\n", + " [0.5819521 , 3.8499846 ],\n", + " [0.58467456, 3.8450022 ],\n", + " [0.58739702, 3.8422534 ],\n", + " [0.59011948, 3.8380919 ],\n", + " [0.59284194, 3.8341596 ],\n", + " [0.5955644 , 3.8309333 ],\n", + " [0.59828687, 3.8272109 ],\n", + " [0.60100935, 3.823164 ],\n", + " [0.60373182, 3.8192315 ],\n", + " [0.60645429, 3.8159864 ],\n", + " [0.60917677, 3.8123021 ],\n", + " [0.61189925, 3.8090379 ],\n", + " [0.61462172, 3.8071671 ],\n", + " [0.61734419, 3.8040555 ],\n", + " [0.62006666, 3.8013639 ],\n", + " [0.62278914, 3.7970879 ],\n", + " [0.62551162, 3.7953317 ],\n", + " [0.62823408, 3.7920673 ],\n", + " [0.63095656, 3.788383 ],\n", + " [0.63367903, 3.7855389 ],\n", + " [0.6364015 , 3.7838206 ],\n", + " [0.63912397, 3.78111 ],\n", + " [0.64184645, 3.7794874 ],\n", + " [0.64456893, 3.7769294 ],\n", + " [0.6472914 , 3.773608 ],\n", + " [0.65001389, 3.7695992 ],\n", + " [0.65273637, 3.7690265 ],\n", + " [0.65545884, 3.7662776 ],\n", + " [0.65818131, 3.7642922 ],\n", + " [0.66090379, 3.7626889 ],\n", + " [0.66362625, 3.7603791 ],\n", + " [0.66634874, 3.7575538 ],\n", + " [0.66907121, 3.7552056 ],\n", + " [0.67179369, 3.7533159 ],\n", + " [0.67451616, 3.7507198 ],\n", + " [0.67723865, 3.7487535 ],\n", + " [0.67996113, 3.7471499 ],\n", + " [0.68268361, 3.7442865 ],\n", + " [0.68540608, 3.7423012 ],\n", + " [0.68812855, 3.7400677 ],\n", + " [0.69085103, 3.7385788 ],\n", + " [0.6935735 , 3.7345319 ],\n", + " [0.69629597, 3.7339211 ],\n", + " [0.69901843, 3.7301605 ],\n", + " [0.7017409 , 3.7301033 ],\n", + " [0.70446338, 3.7278316 ],\n", + " [0.70718585, 3.7251589 ],\n", + " [0.70990833, 3.723861 ],\n", + " [0.71263081, 3.7215703 ],\n", + " [0.71535328, 3.7191267 ],\n", + " [0.71807574, 3.7172751 ],\n", + " [0.72079822, 3.7157097 ],\n", + " [0.72352069, 3.7130945 ],\n", + " [0.72624317, 3.7099447 ],\n", + " [0.72896564, 3.7071004 ],\n", + " [0.7316881 , 3.7045615 ],\n", + " [0.73441057, 3.703588 ],\n", + " [0.73713303, 3.70208 ],\n", + " [0.73985551, 3.7002664 ],\n", + " [0.74257799, 3.6972122 ],\n", + " [0.74530047, 3.6952841 ],\n", + " [0.74802293, 3.6929362 ],\n", + " [0.7507454 , 3.6898055 ],\n", + " [0.75346787, 3.6890991 ],\n", + " [0.75619034, 3.686522 ],\n", + " [0.75891281, 3.6849759 ],\n", + " [0.76163529, 3.6821697 ],\n", + " [0.76435776, 3.6808143 ],\n", + " [0.76708024, 3.6786573 ],\n", + " [0.7698027 , 3.6761947 ],\n", + " [0.77252517, 3.674763 ],\n", + " [0.77524765, 3.6712887 ],\n", + " [0.77797012, 3.6697233 ],\n", + " [0.78069258, 3.6678908 ],\n", + " [0.78341506, 3.6652565 ],\n", + " [0.78613753, 3.6630611 ],\n", + " [0.78885999, 3.660274 ],\n", + " [0.79158246, 3.6583652 ],\n", + " [0.79430494, 3.6554828 ],\n", + " [0.79702741, 3.6522949 ],\n", + " [0.79974987, 3.6499848 ],\n", + " [0.80247234, 3.6470451 ],\n", + " [0.8051948 , 3.6405547 ],\n", + " [0.80791727, 3.6383405 ],\n", + " [0.81063974, 3.635076 ],\n", + " [0.81336221, 3.633549 ],\n", + " [0.81608468, 3.6322317 ],\n", + " [0.81880714, 3.6306856 ],\n", + " [0.82152961, 3.6283948 ],\n", + " [0.82425208, 3.6268487 ],\n", + " [0.82697453, 3.6243098 ],\n", + " [0.829697 , 3.6223626 ],\n", + " [0.83241946, 3.6193655 ],\n", + " [0.83514192, 3.6177621 ],\n", + " [0.83786439, 3.6158531 ],\n", + " [0.84058684, 3.6128371 ],\n", + " [0.84330931, 3.6118062 ],\n", + " [0.84603177, 3.6094582 ],\n", + " [0.84875424, 3.6072438 ],\n", + " [0.8514767 , 3.6049912 ],\n", + " [0.85419916, 3.6030822 ],\n", + " [0.85692162, 3.6012688 ],\n", + " [0.85964409, 3.5995889 ],\n", + " [0.86236656, 3.5976417 ],\n", + " [0.86508902, 3.5951984 ],\n", + " [0.86781149, 3.593843 ],\n", + " [0.87053395, 3.5916286 ],\n", + " [0.87325642, 3.5894907 ],\n", + " [0.87597888, 3.587429 ],\n", + " [0.87870135, 3.5852909 ],\n", + " [0.88142383, 3.5834775 ],\n", + " [0.8841463 , 3.5817785 ],\n", + " [0.88686877, 3.5801177 ],\n", + " [0.88959124, 3.5778842 ],\n", + " [0.89231371, 3.5763381 ],\n", + " [0.8950362 , 3.5737801 ],\n", + " [0.89775868, 3.5721002 ],\n", + " [0.90048116, 3.5702102 ],\n", + " [0.90320364, 3.5684922 ],\n", + " [0.90592613, 3.5672133 ],\n", + " [1. , 3.52302167]])),\n", + " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Positive electrode active material volume fraction': 0.665,\n", + " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", + " 'Positive electrode electrons in reaction': 1.0,\n", + " 'Positive electrode exchange-current density [A.m-2]': ,\n", + " 'Positive electrode porosity': 0.335,\n", + " 'Positive electrode thickness [m]': 7.56e-05,\n", + " 'Positive particle radius [m]': 5.22e-06,\n", + " 'Reference temperature [K]': 298.15,\n", + " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Separator porosity': 0.47,\n", + " 'Separator thickness [m]': 1.2e-05,\n", + " 'Typical current [A]': 5.0,\n", + " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", + " 'Upper voltage cut-off [V]': 4.4}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def graphite_mcmb2528_diffusivity_Dualfoil1998(sto, T):\n", + " D_ref = 3.9 * 10 ** (-14)\n", + " E_D_s = 42770\n", + " arrhenius = exp(E_D_s / constants.R * (1 / 298.15 - 1 / T))\n", + " return D_ref * arrhenius\n", + "\n", + "neg_ocp = np.array([[0. , 1.81772748],\n", + " [0.03129623, 1.0828807 ],\n", + " [0.03499902, 0.99593794],\n", + " [0.0387018 , 0.90023398],\n", + " [0.04240458, 0.79649431],\n", + " [0.04610736, 0.73354429],\n", + " [0.04981015, 0.66664314],\n", + " [0.05351292, 0.64137149],\n", + " [0.05721568, 0.59813869],\n", + " [0.06091845, 0.5670836 ],\n", + " [0.06462122, 0.54746181],\n", + " [0.06832399, 0.53068399],\n", + " [0.07202675, 0.51304734],\n", + " [0.07572951, 0.49394092],\n", + " [0.07943227, 0.47926274],\n", + " [0.08313503, 0.46065259],\n", + " [0.08683779, 0.45992726],\n", + " [0.09054054, 0.43801501],\n", + " [0.09424331, 0.42438665],\n", + " [0.09794607, 0.41150269],\n", + " [0.10164883, 0.40033659],\n", + " [0.10535158, 0.38957134],\n", + " [0.10905434, 0.37756538],\n", + " [0.1127571 , 0.36292541],\n", + " [0.11645985, 0.34357086],\n", + " [0.12016261, 0.3406314 ],\n", + " [0.12386536, 0.32299468],\n", + " [0.12756811, 0.31379458],\n", + " [0.13127086, 0.30795386],\n", + " [0.13497362, 0.29207319],\n", + " [0.13867638, 0.28697687],\n", + " [0.14237913, 0.27405477],\n", + " [0.14608189, 0.2670497 ],\n", + " [0.14978465, 0.25857493],\n", + " [0.15348741, 0.25265783],\n", + " [0.15719018, 0.24826777],\n", + " [0.16089294, 0.2414345 ],\n", + " [0.1645957 , 0.23362778],\n", + " [0.16829847, 0.22956218],\n", + " [0.17200122, 0.22370236],\n", + " [0.17570399, 0.22181271],\n", + " [0.17940674, 0.22089651],\n", + " [0.1831095 , 0.2194268 ],\n", + " [0.18681229, 0.21830064],\n", + " [0.19051504, 0.21845333],\n", + " [0.1942178 , 0.21753715],\n", + " [0.19792056, 0.21719357],\n", + " [0.20162334, 0.21635373],\n", + " [0.2053261 , 0.21667822],\n", + " [0.20902886, 0.21738444],\n", + " [0.21273164, 0.21469313],\n", + " [0.2164344 , 0.21541846],\n", + " [0.22013716, 0.21465495],\n", + " [0.22383993, 0.2135479 ],\n", + " [0.2275427 , 0.21392964],\n", + " [0.23124547, 0.21074206],\n", + " [0.23494825, 0.20873788],\n", + " [0.23865101, 0.20465319],\n", + " [0.24235377, 0.20205732],\n", + " [0.24605653, 0.19774358],\n", + " [0.2497593 , 0.19444147],\n", + " [0.25346208, 0.19190285],\n", + " [0.25716486, 0.18850531],\n", + " [0.26086762, 0.18581399],\n", + " [0.26457039, 0.18327537],\n", + " [0.26827314, 0.18157659],\n", + " [0.2719759 , 0.17814088],\n", + " [0.27567867, 0.17529686],\n", + " [0.27938144, 0.1719375 ],\n", + " [0.28308421, 0.16934161],\n", + " [0.28678698, 0.16756649],\n", + " [0.29048974, 0.16609676],\n", + " [0.29419251, 0.16414985],\n", + " [0.29789529, 0.16260378],\n", + " [0.30159806, 0.16224113],\n", + " [0.30530083, 0.160027 ],\n", + " [0.30900361, 0.15827096],\n", + " [0.31270637, 0.1588054 ],\n", + " [0.31640913, 0.15552238],\n", + " [0.32011189, 0.15580869],\n", + " [0.32381466, 0.15220118],\n", + " [0.32751744, 0.1511132 ],\n", + " [0.33122021, 0.14987253],\n", + " [0.33492297, 0.14874637],\n", + " [0.33862575, 0.14678037],\n", + " [0.34232853, 0.14620776],\n", + " [0.34603131, 0.14555879],\n", + " [0.34973408, 0.14389819],\n", + " [0.35343685, 0.14359279],\n", + " [0.35713963, 0.14242846],\n", + " [0.36084241, 0.14038612],\n", + " [0.36454517, 0.13882096],\n", + " [0.36824795, 0.13954628],\n", + " [0.37195071, 0.13946992],\n", + " [0.37565348, 0.13780934],\n", + " [0.37935626, 0.13973714],\n", + " [0.38305904, 0.13698858],\n", + " [0.38676182, 0.13523254],\n", + " [0.3904646 , 0.13441178],\n", + " [0.39416737, 0.1352898 ],\n", + " [0.39787015, 0.13507985],\n", + " [0.40157291, 0.13647321],\n", + " [0.40527567, 0.13601512],\n", + " [0.40897844, 0.13435452],\n", + " [0.41268121, 0.1334765 ],\n", + " [0.41638398, 0.1348317 ],\n", + " [0.42008676, 0.13275118],\n", + " [0.42378953, 0.13286571],\n", + " [0.4274923 , 0.13263667],\n", + " [0.43119506, 0.13456447],\n", + " [0.43489784, 0.13471718],\n", + " [0.43860061, 0.13395369],\n", + " [0.44230338, 0.13448814],\n", + " [0.44600615, 0.1334765 ],\n", + " [0.44970893, 0.13298023],\n", + " [0.45341168, 0.13259849],\n", + " [0.45711444, 0.13338107],\n", + " [0.46081719, 0.13309476],\n", + " [0.46451994, 0.13275118],\n", + " [0.46822269, 0.13443087],\n", + " [0.47192545, 0.13315202],\n", + " [0.47562821, 0.132713 ],\n", + " [0.47933098, 0.1330184 ],\n", + " [0.48303375, 0.13278936],\n", + " [0.48673651, 0.13225491],\n", + " [0.49043926, 0.13317111],\n", + " [0.49414203, 0.13263667],\n", + " [0.49784482, 0.13187316],\n", + " [0.50154759, 0.13265574],\n", + " [0.50525036, 0.13250305],\n", + " [0.50895311, 0.13324745],\n", + " [0.51265586, 0.13204496],\n", + " [0.51635861, 0.13242669],\n", + " [0.52006139, 0.13233127],\n", + " [0.52376415, 0.13198769],\n", + " [0.52746692, 0.13254122],\n", + " [0.53116969, 0.13145325],\n", + " [0.53487245, 0.13298023],\n", + " [0.53857521, 0.13168229],\n", + " [0.54227797, 0.1313578 ],\n", + " [0.54598074, 0.13235036],\n", + " [0.5496835 , 0.13120511],\n", + " [0.55338627, 0.13089971],\n", + " [0.55708902, 0.13109058],\n", + " [0.56079178, 0.13082336],\n", + " [0.56449454, 0.13011713],\n", + " [0.5681973 , 0.129869 ],\n", + " [0.57190006, 0.12992626],\n", + " [0.57560282, 0.12942998],\n", + " [0.57930558, 0.12796026],\n", + " [0.58300835, 0.12862831],\n", + " [0.58671112, 0.12656689],\n", + " [0.59041389, 0.12734947],\n", + " [0.59411664, 0.12509716],\n", + " [0.59781941, 0.12110791],\n", + " [0.60152218, 0.11839751],\n", + " [0.60522496, 0.11244226],\n", + " [0.60892772, 0.11307214],\n", + " [0.61263048, 0.1092165 ],\n", + " [0.61633325, 0.10683058],\n", + " [0.62003603, 0.10433014],\n", + " [0.6237388 , 0.10530359],\n", + " [0.62744156, 0.10056993],\n", + " [0.63114433, 0.09950104],\n", + " [0.63484711, 0.09854668],\n", + " [0.63854988, 0.09921473],\n", + " [0.64225265, 0.09541635],\n", + " [0.64595543, 0.09980643],\n", + " [0.64965823, 0.0986612 ],\n", + " [0.653361 , 0.09560722],\n", + " [0.65706377, 0.09755413],\n", + " [0.66076656, 0.09612258],\n", + " [0.66446934, 0.09430929],\n", + " [0.66817212, 0.09661885],\n", + " [0.67187489, 0.09366032],\n", + " [0.67557767, 0.09522548],\n", + " [0.67928044, 0.09535909],\n", + " [0.68298322, 0.09316404],\n", + " [0.686686 , 0.09450016],\n", + " [0.69038878, 0.0930877 ],\n", + " [0.69409156, 0.09343126],\n", + " [0.69779433, 0.0932404 ],\n", + " [0.70149709, 0.09350762],\n", + " [0.70519988, 0.09339309],\n", + " [0.70890264, 0.09291591],\n", + " [0.7126054 , 0.09303043],\n", + " [0.71630818, 0.0926296 ],\n", + " [0.72001095, 0.0932404 ],\n", + " [0.72371371, 0.09261052],\n", + " [0.72741648, 0.09249599],\n", + " [0.73111925, 0.09240055],\n", + " [0.73482204, 0.09253416],\n", + " [0.7385248 , 0.09209515],\n", + " [0.74222757, 0.09234329],\n", + " [0.74593034, 0.09366032],\n", + " [0.74963312, 0.09333583],\n", + " [0.75333589, 0.09322131],\n", + " [0.75703868, 0.09264868],\n", + " [0.76074146, 0.09253416],\n", + " [0.76444422, 0.09243873],\n", + " [0.76814698, 0.09230512],\n", + " [0.77184976, 0.09310678],\n", + " [0.77555253, 0.09165615],\n", + " [0.77925531, 0.09159888],\n", + " [0.78295807, 0.09207606],\n", + " [0.78666085, 0.09175158],\n", + " [0.79036364, 0.09177067],\n", + " [0.79406641, 0.09236237],\n", + " [0.79776918, 0.09241964],\n", + " [0.80147197, 0.09320222],\n", + " [0.80517474, 0.09199972],\n", + " [0.80887751, 0.09167523],\n", + " [0.81258028, 0.09322131],\n", + " [0.81628304, 0.09190428],\n", + " [0.81998581, 0.09167523],\n", + " [0.82368858, 0.09285865],\n", + " [0.82739136, 0.09180884],\n", + " [0.83109411, 0.09150345],\n", + " [0.83479688, 0.09186611],\n", + " [0.83849965, 0.0920188 ],\n", + " [0.84220242, 0.09320222],\n", + " [0.84590519, 0.09131257],\n", + " [0.84960797, 0.09117896],\n", + " [0.85331075, 0.09133166],\n", + " [0.85701353, 0.09089265],\n", + " [0.86071631, 0.09058725],\n", + " [0.86441907, 0.09051091],\n", + " [0.86812186, 0.09033912],\n", + " [0.87182464, 0.09041547],\n", + " [0.87552742, 0.0911217 ],\n", + " [0.87923019, 0.0894611 ],\n", + " [0.88293296, 0.08999555],\n", + " [0.88663573, 0.08921297],\n", + " [0.89033849, 0.08881213],\n", + " [0.89404126, 0.08797229],\n", + " [0.89774404, 0.08709427],\n", + " [0.9014468 , 0.08503284],\n", + " [1. , 0.07601531]])\n", + "\n", + "pos_ocp = np.array([[0.24879728, 4.4 ],\n", + " [0.26614516, 4.2935653 ],\n", + " [0.26886763, 4.2768621 ],\n", + " [0.27159011, 4.2647018 ],\n", + " [0.27431258, 4.2540312 ],\n", + " [0.27703505, 4.2449446 ],\n", + " [0.27975753, 4.2364879 ],\n", + " [0.28248 , 4.2302647 ],\n", + " [0.28520247, 4.2225528 ],\n", + " [0.28792495, 4.2182574 ],\n", + " [0.29064743, 4.213294 ],\n", + " [0.29336992, 4.2090373 ],\n", + " [0.29609239, 4.2051239 ],\n", + " [0.29881487, 4.2012677 ],\n", + " [0.30153735, 4.1981564 ],\n", + " [0.30425983, 4.1955218 ],\n", + " [0.30698231, 4.1931167 ],\n", + " [0.30970478, 4.1889744 ],\n", + " [0.31242725, 4.1881533 ],\n", + " [0.31514973, 4.1865883 ],\n", + " [0.3178722 , 4.1850228 ],\n", + " [0.32059466, 4.1832285 ],\n", + " [0.32331714, 4.1808805 ],\n", + " [0.32603962, 4.1805749 ],\n", + " [0.32876209, 4.1789522 ],\n", + " [0.33148456, 4.1768146 ],\n", + " [0.33420703, 4.1768146 ],\n", + " [0.3369295 , 4.1752872 ],\n", + " [0.33965197, 4.173111 ],\n", + " [0.34237446, 4.1726718 ],\n", + " [0.34509694, 4.1710877 ],\n", + " [0.34781941, 4.1702285 ],\n", + " [0.3505419 , 4.168797 ],\n", + " [0.35326438, 4.1669831 ],\n", + " [0.35598685, 4.1655135 ],\n", + " [0.35870932, 4.1634517 ],\n", + " [0.3614318 , 4.1598248 ],\n", + " [0.36415428, 4.1571712 ],\n", + " [0.36687674, 4.154079 ],\n", + " [0.36959921, 4.1504135 ],\n", + " [0.37232169, 4.1466532 ],\n", + " [0.37504418, 4.1423388 ],\n", + " [0.37776665, 4.1382346 ],\n", + " [0.38048913, 4.1338248 ],\n", + " [0.38321161, 4.1305799 ],\n", + " [0.38593408, 4.1272392 ],\n", + " [0.38865655, 4.1228104 ],\n", + " [0.39137903, 4.1186109 ],\n", + " [0.39410151, 4.114182 ],\n", + " [0.39682398, 4.1096005 ],\n", + " [0.39954645, 4.1046948 ],\n", + " [0.40226892, 4.1004758 ],\n", + " [0.4049914 , 4.0956464 ],\n", + " [0.40771387, 4.0909696 ],\n", + " [0.41043634, 4.0864644 ],\n", + " [0.41315882, 4.0818448 ],\n", + " [0.41588129, 4.077683 ],\n", + " [0.41860377, 4.0733309 ],\n", + " [0.42132624, 4.0690737 ],\n", + " [0.42404872, 4.0647216 ],\n", + " [0.4267712 , 4.0608654 ],\n", + " [0.42949368, 4.0564747 ],\n", + " [0.43221616, 4.0527525 ],\n", + " [0.43493864, 4.0492401 ],\n", + " [0.43766111, 4.0450211 ],\n", + " [0.44038359, 4.041986 ],\n", + " [0.44310607, 4.0384736 ],\n", + " [0.44582856, 4.035171 ],\n", + " [0.44855103, 4.0320406 ],\n", + " [0.45127351, 4.0289288 ],\n", + " [0.453996 , 4.02597 ],\n", + " [0.45671848, 4.0227437 ],\n", + " [0.45944095, 4.0199757 ],\n", + " [0.46216343, 4.0175133 ],\n", + " [0.46488592, 4.0149746 ],\n", + " [0.46760838, 4.0122066 ],\n", + " [0.47033085, 4.009954 ],\n", + " [0.47305333, 4.0075679 ],\n", + " [0.47577581, 4.0050669 ],\n", + " [0.47849828, 4.0023184 ],\n", + " [0.48122074, 3.9995501 ],\n", + " [0.48394321, 3.9969349 ],\n", + " [0.48666569, 3.9926589 ],\n", + " [0.48938816, 3.9889555 ],\n", + " [0.49211064, 3.9834003 ],\n", + " [0.4948331 , 3.9783037 ],\n", + " [0.49755557, 3.9755929 ],\n", + " [0.50027804, 3.9707632 ],\n", + " [0.50300052, 3.9681098 ],\n", + " [0.50572298, 3.9635665 ],\n", + " [0.50844545, 3.9594433 ],\n", + " [0.51116792, 3.9556634 ],\n", + " [0.51389038, 3.9521511 ],\n", + " [0.51661284, 3.9479132 ],\n", + " [0.51933531, 3.9438281 ],\n", + " [0.52205777, 3.9400866 ],\n", + " [0.52478024, 3.9362304 ],\n", + " [0.52750271, 3.9314201 ],\n", + " [0.53022518, 3.9283848 ],\n", + " [0.53294765, 3.9242232 ],\n", + " [0.53567012, 3.9192028 ],\n", + " [0.53839258, 3.9166257 ],\n", + " [0.54111506, 3.9117961 ],\n", + " [0.54383753, 3.90815 ],\n", + " [0.54656 , 3.9038739 ],\n", + " [0.54928247, 3.8995597 ],\n", + " [0.55200494, 3.8959136 ],\n", + " [0.5547274 , 3.8909314 ],\n", + " [0.55744986, 3.8872662 ],\n", + " [0.56017233, 3.8831048 ],\n", + " [0.5628948 , 3.8793442 ],\n", + " [0.56561729, 3.8747628 ],\n", + " [0.56833976, 3.8702576 ],\n", + " [0.57106222, 3.8666878 ],\n", + " [0.57378469, 3.8623927 ],\n", + " [0.57650716, 3.8581741 ],\n", + " [0.57922963, 3.854146 ],\n", + " [0.5819521 , 3.8499846 ],\n", + " [0.58467456, 3.8450022 ],\n", + " [0.58739702, 3.8422534 ],\n", + " [0.59011948, 3.8380919 ],\n", + " [0.59284194, 3.8341596 ],\n", + " [0.5955644 , 3.8309333 ],\n", + " [0.59828687, 3.8272109 ],\n", + " [0.60100935, 3.823164 ],\n", + " [0.60373182, 3.8192315 ],\n", + " [0.60645429, 3.8159864 ],\n", + " [0.60917677, 3.8123021 ],\n", + " [0.61189925, 3.8090379 ],\n", + " [0.61462172, 3.8071671 ],\n", + " [0.61734419, 3.8040555 ],\n", + " [0.62006666, 3.8013639 ],\n", + " [0.62278914, 3.7970879 ],\n", + " [0.62551162, 3.7953317 ],\n", + " [0.62823408, 3.7920673 ],\n", + " [0.63095656, 3.788383 ],\n", + " [0.63367903, 3.7855389 ],\n", + " [0.6364015 , 3.7838206 ],\n", + " [0.63912397, 3.78111 ],\n", + " [0.64184645, 3.7794874 ],\n", + " [0.64456893, 3.7769294 ],\n", + " [0.6472914 , 3.773608 ],\n", + " [0.65001389, 3.7695992 ],\n", + " [0.65273637, 3.7690265 ],\n", + " [0.65545884, 3.7662776 ],\n", + " [0.65818131, 3.7642922 ],\n", + " [0.66090379, 3.7626889 ],\n", + " [0.66362625, 3.7603791 ],\n", + " [0.66634874, 3.7575538 ],\n", + " [0.66907121, 3.7552056 ],\n", + " [0.67179369, 3.7533159 ],\n", + " [0.67451616, 3.7507198 ],\n", + " [0.67723865, 3.7487535 ],\n", + " [0.67996113, 3.7471499 ],\n", + " [0.68268361, 3.7442865 ],\n", + " [0.68540608, 3.7423012 ],\n", + " [0.68812855, 3.7400677 ],\n", + " [0.69085103, 3.7385788 ],\n", + " [0.6935735 , 3.7345319 ],\n", + " [0.69629597, 3.7339211 ],\n", + " [0.69901843, 3.7301605 ],\n", + " [0.7017409 , 3.7301033 ],\n", + " [0.70446338, 3.7278316 ],\n", + " [0.70718585, 3.7251589 ],\n", + " [0.70990833, 3.723861 ],\n", + " [0.71263081, 3.7215703 ],\n", + " [0.71535328, 3.7191267 ],\n", + " [0.71807574, 3.7172751 ],\n", + " [0.72079822, 3.7157097 ],\n", + " [0.72352069, 3.7130945 ],\n", + " [0.72624317, 3.7099447 ],\n", + " [0.72896564, 3.7071004 ],\n", + " [0.7316881 , 3.7045615 ],\n", + " [0.73441057, 3.703588 ],\n", + " [0.73713303, 3.70208 ],\n", + " [0.73985551, 3.7002664 ],\n", + " [0.74257799, 3.6972122 ],\n", + " [0.74530047, 3.6952841 ],\n", + " [0.74802293, 3.6929362 ],\n", + " [0.7507454 , 3.6898055 ],\n", + " [0.75346787, 3.6890991 ],\n", + " [0.75619034, 3.686522 ],\n", + " [0.75891281, 3.6849759 ],\n", + " [0.76163529, 3.6821697 ],\n", + " [0.76435776, 3.6808143 ],\n", + " [0.76708024, 3.6786573 ],\n", + " [0.7698027 , 3.6761947 ],\n", + " [0.77252517, 3.674763 ],\n", + " [0.77524765, 3.6712887 ],\n", + " [0.77797012, 3.6697233 ],\n", + " [0.78069258, 3.6678908 ],\n", + " [0.78341506, 3.6652565 ],\n", + " [0.78613753, 3.6630611 ],\n", + " [0.78885999, 3.660274 ],\n", + " [0.79158246, 3.6583652 ],\n", + " [0.79430494, 3.6554828 ],\n", + " [0.79702741, 3.6522949 ],\n", + " [0.79974987, 3.6499848 ],\n", + " [0.80247234, 3.6470451 ],\n", + " [0.8051948 , 3.6405547 ],\n", + " [0.80791727, 3.6383405 ],\n", + " [0.81063974, 3.635076 ],\n", + " [0.81336221, 3.633549 ],\n", + " [0.81608468, 3.6322317 ],\n", + " [0.81880714, 3.6306856 ],\n", + " [0.82152961, 3.6283948 ],\n", + " [0.82425208, 3.6268487 ],\n", + " [0.82697453, 3.6243098 ],\n", + " [0.829697 , 3.6223626 ],\n", + " [0.83241946, 3.6193655 ],\n", + " [0.83514192, 3.6177621 ],\n", + " [0.83786439, 3.6158531 ],\n", + " [0.84058684, 3.6128371 ],\n", + " [0.84330931, 3.6118062 ],\n", + " [0.84603177, 3.6094582 ],\n", + " [0.84875424, 3.6072438 ],\n", + " [0.8514767 , 3.6049912 ],\n", + " [0.85419916, 3.6030822 ],\n", + " [0.85692162, 3.6012688 ],\n", + " [0.85964409, 3.5995889 ],\n", + " [0.86236656, 3.5976417 ],\n", + " [0.86508902, 3.5951984 ],\n", + " [0.86781149, 3.593843 ],\n", + " [0.87053395, 3.5916286 ],\n", + " [0.87325642, 3.5894907 ],\n", + " [0.87597888, 3.587429 ],\n", + " [0.87870135, 3.5852909 ],\n", + " [0.88142383, 3.5834775 ],\n", + " [0.8841463 , 3.5817785 ],\n", + " [0.88686877, 3.5801177 ],\n", + " [0.88959124, 3.5778842 ],\n", + " [0.89231371, 3.5763381 ],\n", + " [0.8950362 , 3.5737801 ],\n", + " [0.89775868, 3.5721002 ],\n", + " [0.90048116, 3.5702102 ],\n", + " [0.90320364, 3.5684922 ],\n", + " [0.90592613, 3.5672133 ],\n", + " [1. , 3.52302167]])\n", + "\n", + "from pybamm import exp, constants, Parameter\n", + "\n", + "\n", + "def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T, c_s_max):\n", + " m_ref = 6.48e-7 # (A/m2)(mol/m3)**1.5 - includes ref concentrations\n", + " E_r = 35000\n", + " arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T))\n", + "\n", + " c_n_max = Parameter(\"Maximum concentration in negative electrode [mol.m-3]\")\n", + "\n", + " return (\n", + " m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5\n", + " )\n", + "\n", + "def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T, c_s_max):\n", + " m_ref = 3.42e-6 # (A/m2)(mol/m3)**1.5 - includes ref concentrations\n", + " E_r = 17800\n", + " arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T))\n", + "\n", + " c_p_max = Parameter(\"Maximum concentration in positive electrode [mol.m-3]\")\n", + "\n", + " return (\n", + " m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5\n", + " )\n", + "\n", + "\n", + "values = {\n", + " 'Negative electrode thickness [m]': 8.52e-05,\n", + " 'Separator thickness [m]': 1.2e-05,\n", + " 'Positive electrode thickness [m]': 7.56e-05,\n", + " 'Electrode height [m]': 0.065,\n", + " 'Electrode width [m]': 1.58,\n", + " 'Nominal cell capacity [A.h]': 5.0,\n", + " 'Typical current [A]': 5.0,\n", + " 'Current function [A]': 5.0,\n", + " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", + " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", + " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020', neg_ocp),\n", + " 'Negative electrode porosity': 0.25,\n", + " 'Negative electrode active material volume fraction': 0.75,\n", + " 'Negative particle radius [m]': 5.86e-06,\n", + " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Negative electrode Bruggeman coefficient (electrode)': 1.5,\n", + " 'Negative electrode electrons in reaction': 1.0,\n", + " 'Negative electrode exchange-current density [A.m-2]': graphite_LGM50_electrolyte_exchange_current_density_Chen2020,\n", + " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", + " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", + " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020', pos_ocp),\n", + " 'Positive electrode porosity': 0.335,\n", + " 'Positive electrode active material volume fraction': 0.665,\n", + " 'Positive particle radius [m]': 5.22e-06,\n", + " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Positive electrode Bruggeman coefficient (electrode)': 1.5,\n", + " 'Positive electrode electrons in reaction': 1.0,\n", + " 'Positive electrode exchange-current density [A.m-2]': nmc_LGM50_electrolyte_exchange_current_density_Chen2020,\n", + " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Separator porosity': 0.47,\n", + " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", + " 'Reference temperature [K]': 298.15,\n", + " 'Ambient temperature [K]': 298.15,\n", + " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", + " 'Number of cells connected in series to make a battery': 1.0,\n", + " 'Lower voltage cut-off [V]': 2.5,\n", + " 'Upper voltage cut-off [V]': 4.4,\n", + " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", + " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", + " 'Initial temperature [K]': 298.15\n", + "}\n", + "param = pybamm.ParameterValues(values)\n", + "param" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we would have got the same result by doing" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Negative electrode thickness [m]': 8.52e-05,\n", + " 'Separator thickness [m]': 1.2e-05,\n", + " 'Positive electrode thickness [m]': 7.56e-05,\n", + " 'Electrode height [m]': 0.065,\n", + " 'Electrode width [m]': 1.58,\n", + " 'Nominal cell capacity [A.h]': 5.0,\n", + " 'Typical current [A]': 5.0,\n", + " 'Current function [A]': 5.0,\n", + " 'Maximum concentration in negative electrode [mol.m-3]': 33133.0,\n", + " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", + " 'Negative electrode OCP [V]': ('graphite_LGM50_ocp_Chen2020',\n", + " array([[0. , 1.81772748],\n", + " [0.03129623, 1.0828807 ],\n", + " [0.03499902, 0.99593794],\n", + " [0.0387018 , 0.90023398],\n", + " [0.04240458, 0.79649431],\n", + " [0.04610736, 0.73354429],\n", + " [0.04981015, 0.66664314],\n", + " [0.05351292, 0.64137149],\n", + " [0.05721568, 0.59813869],\n", + " [0.06091845, 0.5670836 ],\n", + " [0.06462122, 0.54746181],\n", + " [0.06832399, 0.53068399],\n", + " [0.07202675, 0.51304734],\n", + " [0.07572951, 0.49394092],\n", + " [0.07943227, 0.47926274],\n", + " [0.08313503, 0.46065259],\n", + " [0.08683779, 0.45992726],\n", + " [0.09054054, 0.43801501],\n", + " [0.09424331, 0.42438665],\n", + " [0.09794607, 0.41150269],\n", + " [0.10164883, 0.40033659],\n", + " [0.10535158, 0.38957134],\n", + " [0.10905434, 0.37756538],\n", + " [0.1127571 , 0.36292541],\n", + " [0.11645985, 0.34357086],\n", + " [0.12016261, 0.3406314 ],\n", + " [0.12386536, 0.32299468],\n", + " [0.12756811, 0.31379458],\n", + " [0.13127086, 0.30795386],\n", + " [0.13497362, 0.29207319],\n", + " [0.13867638, 0.28697687],\n", + " [0.14237913, 0.27405477],\n", + " [0.14608189, 0.2670497 ],\n", + " [0.14978465, 0.25857493],\n", + " [0.15348741, 0.25265783],\n", + " [0.15719018, 0.24826777],\n", + " [0.16089294, 0.2414345 ],\n", + " [0.1645957 , 0.23362778],\n", + " [0.16829847, 0.22956218],\n", + " [0.17200122, 0.22370236],\n", + " [0.17570399, 0.22181271],\n", + " [0.17940674, 0.22089651],\n", + " [0.1831095 , 0.2194268 ],\n", + " [0.18681229, 0.21830064],\n", + " [0.19051504, 0.21845333],\n", + " [0.1942178 , 0.21753715],\n", + " [0.19792056, 0.21719357],\n", + " [0.20162334, 0.21635373],\n", + " [0.2053261 , 0.21667822],\n", + " [0.20902886, 0.21738444],\n", + " [0.21273164, 0.21469313],\n", + " [0.2164344 , 0.21541846],\n", + " [0.22013716, 0.21465495],\n", + " [0.22383993, 0.2135479 ],\n", + " [0.2275427 , 0.21392964],\n", + " [0.23124547, 0.21074206],\n", + " [0.23494825, 0.20873788],\n", + " [0.23865101, 0.20465319],\n", + " [0.24235377, 0.20205732],\n", + " [0.24605653, 0.19774358],\n", + " [0.2497593 , 0.19444147],\n", + " [0.25346208, 0.19190285],\n", + " [0.25716486, 0.18850531],\n", + " [0.26086762, 0.18581399],\n", + " [0.26457039, 0.18327537],\n", + " [0.26827314, 0.18157659],\n", + " [0.2719759 , 0.17814088],\n", + " [0.27567867, 0.17529686],\n", + " [0.27938144, 0.1719375 ],\n", + " [0.28308421, 0.16934161],\n", + " [0.28678698, 0.16756649],\n", + " [0.29048974, 0.16609676],\n", + " [0.29419251, 0.16414985],\n", + " [0.29789529, 0.16260378],\n", + " [0.30159806, 0.16224113],\n", + " [0.30530083, 0.160027 ],\n", + " [0.30900361, 0.15827096],\n", + " [0.31270637, 0.1588054 ],\n", + " [0.31640913, 0.15552238],\n", + " [0.32011189, 0.15580869],\n", + " [0.32381466, 0.15220118],\n", + " [0.32751744, 0.1511132 ],\n", + " [0.33122021, 0.14987253],\n", + " [0.33492297, 0.14874637],\n", + " [0.33862575, 0.14678037],\n", + " [0.34232853, 0.14620776],\n", + " [0.34603131, 0.14555879],\n", + " [0.34973408, 0.14389819],\n", + " [0.35343685, 0.14359279],\n", + " [0.35713963, 0.14242846],\n", + " [0.36084241, 0.14038612],\n", + " [0.36454517, 0.13882096],\n", + " [0.36824795, 0.13954628],\n", + " [0.37195071, 0.13946992],\n", + " [0.37565348, 0.13780934],\n", + " [0.37935626, 0.13973714],\n", + " [0.38305904, 0.13698858],\n", + " [0.38676182, 0.13523254],\n", + " [0.3904646 , 0.13441178],\n", + " [0.39416737, 0.1352898 ],\n", + " [0.39787015, 0.13507985],\n", + " [0.40157291, 0.13647321],\n", + " [0.40527567, 0.13601512],\n", + " [0.40897844, 0.13435452],\n", + " [0.41268121, 0.1334765 ],\n", + " [0.41638398, 0.1348317 ],\n", + " [0.42008676, 0.13275118],\n", + " [0.42378953, 0.13286571],\n", + " [0.4274923 , 0.13263667],\n", + " [0.43119506, 0.13456447],\n", + " [0.43489784, 0.13471718],\n", + " [0.43860061, 0.13395369],\n", + " [0.44230338, 0.13448814],\n", + " [0.44600615, 0.1334765 ],\n", + " [0.44970893, 0.13298023],\n", + " [0.45341168, 0.13259849],\n", + " [0.45711444, 0.13338107],\n", + " [0.46081719, 0.13309476],\n", + " [0.46451994, 0.13275118],\n", + " [0.46822269, 0.13443087],\n", + " [0.47192545, 0.13315202],\n", + " [0.47562821, 0.132713 ],\n", + " [0.47933098, 0.1330184 ],\n", + " [0.48303375, 0.13278936],\n", + " [0.48673651, 0.13225491],\n", + " [0.49043926, 0.13317111],\n", + " [0.49414203, 0.13263667],\n", + " [0.49784482, 0.13187316],\n", + " [0.50154759, 0.13265574],\n", + " [0.50525036, 0.13250305],\n", + " [0.50895311, 0.13324745],\n", + " [0.51265586, 0.13204496],\n", + " [0.51635861, 0.13242669],\n", + " [0.52006139, 0.13233127],\n", + " [0.52376415, 0.13198769],\n", + " [0.52746692, 0.13254122],\n", + " [0.53116969, 0.13145325],\n", + " [0.53487245, 0.13298023],\n", + " [0.53857521, 0.13168229],\n", + " [0.54227797, 0.1313578 ],\n", + " [0.54598074, 0.13235036],\n", + " [0.5496835 , 0.13120511],\n", + " [0.55338627, 0.13089971],\n", + " [0.55708902, 0.13109058],\n", + " [0.56079178, 0.13082336],\n", + " [0.56449454, 0.13011713],\n", + " [0.5681973 , 0.129869 ],\n", + " [0.57190006, 0.12992626],\n", + " [0.57560282, 0.12942998],\n", + " [0.57930558, 0.12796026],\n", + " [0.58300835, 0.12862831],\n", + " [0.58671112, 0.12656689],\n", + " [0.59041389, 0.12734947],\n", + " [0.59411664, 0.12509716],\n", + " [0.59781941, 0.12110791],\n", + " [0.60152218, 0.11839751],\n", + " [0.60522496, 0.11244226],\n", + " [0.60892772, 0.11307214],\n", + " [0.61263048, 0.1092165 ],\n", + " [0.61633325, 0.10683058],\n", + " [0.62003603, 0.10433014],\n", + " [0.6237388 , 0.10530359],\n", + " [0.62744156, 0.10056993],\n", + " [0.63114433, 0.09950104],\n", + " [0.63484711, 0.09854668],\n", + " [0.63854988, 0.09921473],\n", + " [0.64225265, 0.09541635],\n", + " [0.64595543, 0.09980643],\n", + " [0.64965823, 0.0986612 ],\n", + " [0.653361 , 0.09560722],\n", + " [0.65706377, 0.09755413],\n", + " [0.66076656, 0.09612258],\n", + " [0.66446934, 0.09430929],\n", + " [0.66817212, 0.09661885],\n", + " [0.67187489, 0.09366032],\n", + " [0.67557767, 0.09522548],\n", + " [0.67928044, 0.09535909],\n", + " [0.68298322, 0.09316404],\n", + " [0.686686 , 0.09450016],\n", + " [0.69038878, 0.0930877 ],\n", + " [0.69409156, 0.09343126],\n", + " [0.69779433, 0.0932404 ],\n", + " [0.70149709, 0.09350762],\n", + " [0.70519988, 0.09339309],\n", + " [0.70890264, 0.09291591],\n", + " [0.7126054 , 0.09303043],\n", + " [0.71630818, 0.0926296 ],\n", + " [0.72001095, 0.0932404 ],\n", + " [0.72371371, 0.09261052],\n", + " [0.72741648, 0.09249599],\n", + " [0.73111925, 0.09240055],\n", + " [0.73482204, 0.09253416],\n", + " [0.7385248 , 0.09209515],\n", + " [0.74222757, 0.09234329],\n", + " [0.74593034, 0.09366032],\n", + " [0.74963312, 0.09333583],\n", + " [0.75333589, 0.09322131],\n", + " [0.75703868, 0.09264868],\n", + " [0.76074146, 0.09253416],\n", + " [0.76444422, 0.09243873],\n", + " [0.76814698, 0.09230512],\n", + " [0.77184976, 0.09310678],\n", + " [0.77555253, 0.09165615],\n", + " [0.77925531, 0.09159888],\n", + " [0.78295807, 0.09207606],\n", + " [0.78666085, 0.09175158],\n", + " [0.79036364, 0.09177067],\n", + " [0.79406641, 0.09236237],\n", + " [0.79776918, 0.09241964],\n", + " [0.80147197, 0.09320222],\n", + " [0.80517474, 0.09199972],\n", + " [0.80887751, 0.09167523],\n", + " [0.81258028, 0.09322131],\n", + " [0.81628304, 0.09190428],\n", + " [0.81998581, 0.09167523],\n", + " [0.82368858, 0.09285865],\n", + " [0.82739136, 0.09180884],\n", + " [0.83109411, 0.09150345],\n", + " [0.83479688, 0.09186611],\n", + " [0.83849965, 0.0920188 ],\n", + " [0.84220242, 0.09320222],\n", + " [0.84590519, 0.09131257],\n", + " [0.84960797, 0.09117896],\n", + " [0.85331075, 0.09133166],\n", + " [0.85701353, 0.09089265],\n", + " [0.86071631, 0.09058725],\n", + " [0.86441907, 0.09051091],\n", + " [0.86812186, 0.09033912],\n", + " [0.87182464, 0.09041547],\n", + " [0.87552742, 0.0911217 ],\n", + " [0.87923019, 0.0894611 ],\n", + " [0.88293296, 0.08999555],\n", + " [0.88663573, 0.08921297],\n", + " [0.89033849, 0.08881213],\n", + " [0.89404126, 0.08797229],\n", + " [0.89774404, 0.08709427],\n", + " [0.9014468 , 0.08503284],\n", + " [1. , 0.07601531]])),\n", + " 'Negative electrode porosity': 0.25,\n", + " 'Negative electrode active material volume fraction': 0.75,\n", + " 'Negative particle radius [m]': 5.86e-06,\n", + " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Negative electrode electrons in reaction': 1.0,\n", + " 'Negative electrode exchange-current density [A.m-2]': ,\n", + " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Maximum concentration in positive electrode [mol.m-3]': 63104.0,\n", + " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", + " 'Positive electrode OCP [V]': ('nmc_LGM50_ocp_Chen2020',\n", + " array([[0.24879728, 4.4 ],\n", + " [0.26614516, 4.2935653 ],\n", + " [0.26886763, 4.2768621 ],\n", + " [0.27159011, 4.2647018 ],\n", + " [0.27431258, 4.2540312 ],\n", + " [0.27703505, 4.2449446 ],\n", + " [0.27975753, 4.2364879 ],\n", + " [0.28248 , 4.2302647 ],\n", + " [0.28520247, 4.2225528 ],\n", + " [0.28792495, 4.2182574 ],\n", + " [0.29064743, 4.213294 ],\n", + " [0.29336992, 4.2090373 ],\n", + " [0.29609239, 4.2051239 ],\n", + " [0.29881487, 4.2012677 ],\n", + " [0.30153735, 4.1981564 ],\n", + " [0.30425983, 4.1955218 ],\n", + " [0.30698231, 4.1931167 ],\n", + " [0.30970478, 4.1889744 ],\n", + " [0.31242725, 4.1881533 ],\n", + " [0.31514973, 4.1865883 ],\n", + " [0.3178722 , 4.1850228 ],\n", + " [0.32059466, 4.1832285 ],\n", + " [0.32331714, 4.1808805 ],\n", + " [0.32603962, 4.1805749 ],\n", + " [0.32876209, 4.1789522 ],\n", + " [0.33148456, 4.1768146 ],\n", + " [0.33420703, 4.1768146 ],\n", + " [0.3369295 , 4.1752872 ],\n", + " [0.33965197, 4.173111 ],\n", + " [0.34237446, 4.1726718 ],\n", + " [0.34509694, 4.1710877 ],\n", + " [0.34781941, 4.1702285 ],\n", + " [0.3505419 , 4.168797 ],\n", + " [0.35326438, 4.1669831 ],\n", + " [0.35598685, 4.1655135 ],\n", + " [0.35870932, 4.1634517 ],\n", + " [0.3614318 , 4.1598248 ],\n", + " [0.36415428, 4.1571712 ],\n", + " [0.36687674, 4.154079 ],\n", + " [0.36959921, 4.1504135 ],\n", + " [0.37232169, 4.1466532 ],\n", + " [0.37504418, 4.1423388 ],\n", + " [0.37776665, 4.1382346 ],\n", + " [0.38048913, 4.1338248 ],\n", + " [0.38321161, 4.1305799 ],\n", + " [0.38593408, 4.1272392 ],\n", + " [0.38865655, 4.1228104 ],\n", + " [0.39137903, 4.1186109 ],\n", + " [0.39410151, 4.114182 ],\n", + " [0.39682398, 4.1096005 ],\n", + " [0.39954645, 4.1046948 ],\n", + " [0.40226892, 4.1004758 ],\n", + " [0.4049914 , 4.0956464 ],\n", + " [0.40771387, 4.0909696 ],\n", + " [0.41043634, 4.0864644 ],\n", + " [0.41315882, 4.0818448 ],\n", + " [0.41588129, 4.077683 ],\n", + " [0.41860377, 4.0733309 ],\n", + " [0.42132624, 4.0690737 ],\n", + " [0.42404872, 4.0647216 ],\n", + " [0.4267712 , 4.0608654 ],\n", + " [0.42949368, 4.0564747 ],\n", + " [0.43221616, 4.0527525 ],\n", + " [0.43493864, 4.0492401 ],\n", + " [0.43766111, 4.0450211 ],\n", + " [0.44038359, 4.041986 ],\n", + " [0.44310607, 4.0384736 ],\n", + " [0.44582856, 4.035171 ],\n", + " [0.44855103, 4.0320406 ],\n", + " [0.45127351, 4.0289288 ],\n", + " [0.453996 , 4.02597 ],\n", + " [0.45671848, 4.0227437 ],\n", + " [0.45944095, 4.0199757 ],\n", + " [0.46216343, 4.0175133 ],\n", + " [0.46488592, 4.0149746 ],\n", + " [0.46760838, 4.0122066 ],\n", + " [0.47033085, 4.009954 ],\n", + " [0.47305333, 4.0075679 ],\n", + " [0.47577581, 4.0050669 ],\n", + " [0.47849828, 4.0023184 ],\n", + " [0.48122074, 3.9995501 ],\n", + " [0.48394321, 3.9969349 ],\n", + " [0.48666569, 3.9926589 ],\n", + " [0.48938816, 3.9889555 ],\n", + " [0.49211064, 3.9834003 ],\n", + " [0.4948331 , 3.9783037 ],\n", + " [0.49755557, 3.9755929 ],\n", + " [0.50027804, 3.9707632 ],\n", + " [0.50300052, 3.9681098 ],\n", + " [0.50572298, 3.9635665 ],\n", + " [0.50844545, 3.9594433 ],\n", + " [0.51116792, 3.9556634 ],\n", + " [0.51389038, 3.9521511 ],\n", + " [0.51661284, 3.9479132 ],\n", + " [0.51933531, 3.9438281 ],\n", + " [0.52205777, 3.9400866 ],\n", + " [0.52478024, 3.9362304 ],\n", + " [0.52750271, 3.9314201 ],\n", + " [0.53022518, 3.9283848 ],\n", + " [0.53294765, 3.9242232 ],\n", + " [0.53567012, 3.9192028 ],\n", + " [0.53839258, 3.9166257 ],\n", + " [0.54111506, 3.9117961 ],\n", + " [0.54383753, 3.90815 ],\n", + " [0.54656 , 3.9038739 ],\n", + " [0.54928247, 3.8995597 ],\n", + " [0.55200494, 3.8959136 ],\n", + " [0.5547274 , 3.8909314 ],\n", + " [0.55744986, 3.8872662 ],\n", + " [0.56017233, 3.8831048 ],\n", + " [0.5628948 , 3.8793442 ],\n", + " [0.56561729, 3.8747628 ],\n", + " [0.56833976, 3.8702576 ],\n", + " [0.57106222, 3.8666878 ],\n", + " [0.57378469, 3.8623927 ],\n", + " [0.57650716, 3.8581741 ],\n", + " [0.57922963, 3.854146 ],\n", + " [0.5819521 , 3.8499846 ],\n", + " [0.58467456, 3.8450022 ],\n", + " [0.58739702, 3.8422534 ],\n", + " [0.59011948, 3.8380919 ],\n", + " [0.59284194, 3.8341596 ],\n", + " [0.5955644 , 3.8309333 ],\n", + " [0.59828687, 3.8272109 ],\n", + " [0.60100935, 3.823164 ],\n", + " [0.60373182, 3.8192315 ],\n", + " [0.60645429, 3.8159864 ],\n", + " [0.60917677, 3.8123021 ],\n", + " [0.61189925, 3.8090379 ],\n", + " [0.61462172, 3.8071671 ],\n", + " [0.61734419, 3.8040555 ],\n", + " [0.62006666, 3.8013639 ],\n", + " [0.62278914, 3.7970879 ],\n", + " [0.62551162, 3.7953317 ],\n", + " [0.62823408, 3.7920673 ],\n", + " [0.63095656, 3.788383 ],\n", + " [0.63367903, 3.7855389 ],\n", + " [0.6364015 , 3.7838206 ],\n", + " [0.63912397, 3.78111 ],\n", + " [0.64184645, 3.7794874 ],\n", + " [0.64456893, 3.7769294 ],\n", + " [0.6472914 , 3.773608 ],\n", + " [0.65001389, 3.7695992 ],\n", + " [0.65273637, 3.7690265 ],\n", + " [0.65545884, 3.7662776 ],\n", + " [0.65818131, 3.7642922 ],\n", + " [0.66090379, 3.7626889 ],\n", + " [0.66362625, 3.7603791 ],\n", + " [0.66634874, 3.7575538 ],\n", + " [0.66907121, 3.7552056 ],\n", + " [0.67179369, 3.7533159 ],\n", + " [0.67451616, 3.7507198 ],\n", + " [0.67723865, 3.7487535 ],\n", + " [0.67996113, 3.7471499 ],\n", + " [0.68268361, 3.7442865 ],\n", + " [0.68540608, 3.7423012 ],\n", + " [0.68812855, 3.7400677 ],\n", + " [0.69085103, 3.7385788 ],\n", + " [0.6935735 , 3.7345319 ],\n", + " [0.69629597, 3.7339211 ],\n", + " [0.69901843, 3.7301605 ],\n", + " [0.7017409 , 3.7301033 ],\n", + " [0.70446338, 3.7278316 ],\n", + " [0.70718585, 3.7251589 ],\n", + " [0.70990833, 3.723861 ],\n", + " [0.71263081, 3.7215703 ],\n", + " [0.71535328, 3.7191267 ],\n", + " [0.71807574, 3.7172751 ],\n", + " [0.72079822, 3.7157097 ],\n", + " [0.72352069, 3.7130945 ],\n", + " [0.72624317, 3.7099447 ],\n", + " [0.72896564, 3.7071004 ],\n", + " [0.7316881 , 3.7045615 ],\n", + " [0.73441057, 3.703588 ],\n", + " [0.73713303, 3.70208 ],\n", + " [0.73985551, 3.7002664 ],\n", + " [0.74257799, 3.6972122 ],\n", + " [0.74530047, 3.6952841 ],\n", + " [0.74802293, 3.6929362 ],\n", + " [0.7507454 , 3.6898055 ],\n", + " [0.75346787, 3.6890991 ],\n", + " [0.75619034, 3.686522 ],\n", + " [0.75891281, 3.6849759 ],\n", + " [0.76163529, 3.6821697 ],\n", + " [0.76435776, 3.6808143 ],\n", + " [0.76708024, 3.6786573 ],\n", + " [0.7698027 , 3.6761947 ],\n", + " [0.77252517, 3.674763 ],\n", + " [0.77524765, 3.6712887 ],\n", + " [0.77797012, 3.6697233 ],\n", + " [0.78069258, 3.6678908 ],\n", + " [0.78341506, 3.6652565 ],\n", + " [0.78613753, 3.6630611 ],\n", + " [0.78885999, 3.660274 ],\n", + " [0.79158246, 3.6583652 ],\n", + " [0.79430494, 3.6554828 ],\n", + " [0.79702741, 3.6522949 ],\n", + " [0.79974987, 3.6499848 ],\n", + " [0.80247234, 3.6470451 ],\n", + " [0.8051948 , 3.6405547 ],\n", + " [0.80791727, 3.6383405 ],\n", + " [0.81063974, 3.635076 ],\n", + " [0.81336221, 3.633549 ],\n", + " [0.81608468, 3.6322317 ],\n", + " [0.81880714, 3.6306856 ],\n", + " [0.82152961, 3.6283948 ],\n", + " [0.82425208, 3.6268487 ],\n", + " [0.82697453, 3.6243098 ],\n", + " [0.829697 , 3.6223626 ],\n", + " [0.83241946, 3.6193655 ],\n", + " [0.83514192, 3.6177621 ],\n", + " [0.83786439, 3.6158531 ],\n", + " [0.84058684, 3.6128371 ],\n", + " [0.84330931, 3.6118062 ],\n", + " [0.84603177, 3.6094582 ],\n", + " [0.84875424, 3.6072438 ],\n", + " [0.8514767 , 3.6049912 ],\n", + " [0.85419916, 3.6030822 ],\n", + " [0.85692162, 3.6012688 ],\n", + " [0.85964409, 3.5995889 ],\n", + " [0.86236656, 3.5976417 ],\n", + " [0.86508902, 3.5951984 ],\n", + " [0.86781149, 3.593843 ],\n", + " [0.87053395, 3.5916286 ],\n", + " [0.87325642, 3.5894907 ],\n", + " [0.87597888, 3.587429 ],\n", + " [0.87870135, 3.5852909 ],\n", + " [0.88142383, 3.5834775 ],\n", + " [0.8841463 , 3.5817785 ],\n", + " [0.88686877, 3.5801177 ],\n", + " [0.88959124, 3.5778842 ],\n", + " [0.89231371, 3.5763381 ],\n", + " [0.8950362 , 3.5737801 ],\n", + " [0.89775868, 3.5721002 ],\n", + " [0.90048116, 3.5702102 ],\n", + " [0.90320364, 3.5684922 ],\n", + " [0.90592613, 3.5672133 ],\n", + " [1. , 3.52302167]])),\n", + " 'Positive electrode porosity': 0.335,\n", + " 'Positive electrode active material volume fraction': 0.665,\n", + " 'Positive particle radius [m]': 5.22e-06,\n", + " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Positive electrode electrons in reaction': 1.0,\n", + " 'Positive electrode exchange-current density [A.m-2]': ,\n", + " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", + " 'Separator porosity': 0.47,\n", + " 'Separator Bruggeman coefficient (electrolyte)': 1.5,\n", + " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", + " 'Reference temperature [K]': 298.15,\n", + " 'Ambient temperature [K]': 298.15,\n", + " 'Number of electrodes connected in parallel to make a cell': 1.0,\n", + " 'Number of cells connected in series to make a battery': 1.0,\n", + " 'Lower voltage cut-off [V]': 2.5,\n", + " 'Upper voltage cut-off [V]': 4.4,\n", + " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", + " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", + " 'Initial temperature [K]': 298.15}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param_same = pybamm.ParameterValues(\"Chen2020\")\n", + "{k: v for k,v in param_same.items() if k in spm._parameter_info}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Updating a specific parameter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once a parameter set has been defined (either via a dictionary or a pre-built set), single parameters can be updated" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using a constant value:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current function [A]\t5.0\n" + ] + }, + { + "data": { + "text/plain": [ + "4.0" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param.search(\"Current function [A]\")\n", + "\n", + "param.update(\n", + " {\n", + " \"Current function [A]\": 4.0\n", + " }\n", + ")\n", + "\n", + "param[\"Current function [A]\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def curren_func(time):\n", + " return 1 + pybamm.sin(2 * np.pi * time / 60)\n", + "\n", + "param.update(\n", + " {\n", + " \"Current function [A]\": curren_func\n", + " }\n", + ")\n", + "\n", + "param[\"Current function [A]\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting parameter functions\n", + "\n", + "As seen above, functions can be passed as parameter values. These parameter values can then be plotted by using `pybamm.plot`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting \"Current function \\[A]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "currentfunc = param[\"Current function [A]\"]\n", + "time = pybamm.linspace(0, 120, 60)\n", + "evaluated = param.evaluate(currentfunc(time))\n", + "evaluated = pybamm.Array(evaluated)\n", + "pybamm.plot(time, evaluated)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Taking another such example:\n", + "\n", + "### Plotting \"Negative electrode exchange-current density \\[A.m-2]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD5CAYAAAAp8/5SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAco0lEQVR4nO3de5hVVf3H8fc3RORnCILgZQzRUPKXCsEo4g/FMEwh9SEV7z1kgUqKFxTLFO+GaIrXiMRQTIsn75ImaiCgIgOGWngp8ZagQwwK6gAD398f3z16HAcZ4Mzsc/b5vJ5nHs9e58B8l2fOhzVrr722uTsiIpJdX0u7ABERaVwKehGRjFPQi4hknIJeRCTjFPQiIhm3WdoF1LXNNtt4p06d0i5DRKSozJ07d4m7t6/vuYIL+k6dOlFRUZF2GSIiRcXM3lrXc5q6ERHJOAW9iEjGKehFRDJOQS8iknEKehGRjFPQi4hknIJeRCTjFPQiIhmnoBcRyTgFvYhIxinoRUQyTkEvIpJxCnoRkYxT0IuIZJyCXkQk4xT0IiIZp6AXEck4Bb2ISMYp6EVEMk5BLyKScQp6EZGMU9CLiGScgl5EJOMU9CIihWLVqkb5axX0IiJpWr0aJk+G3r1h6NBG+RabNcrfKiIiX23JEhg/Hm69Ff7zn2jbYgtYuxa+lt8xuIJeRKQpzZ8PN94If/gDrFwJm28OgwfDGWdA9+6N8i0V9CIijW3NGnjoIbjhBpg+Pdq23x6GDYvpmg4dGvXbK+hFRBrLsmUwYQLcfDO8+Wa09ewJw4fDUUfFaL4JKOhFRPLttddiembiRPj4Y9hsMzjuODjzzAj6JqagFxHJB3d46ikYOxYeeSTa2rWLcB82DMrKUitNQS8isimqq+HuuyPgX3op2r797Qj4E0+Eli1TLQ8U9CIiG+f99+E3v4mvDz6Itv794eyz4aCDwCzd+nIo6EVENsRLL8H118fyyFWr4H/+B047LUbwXbqkXV29FPQiIuvjDn/9K1x3HUydGm1lZXD66bE8sm3bdOtbjwYFvZkNBoYCDpzh7vNynhsJHAnUAPOA4e7uyZ85HVgNzHL3c/NbuohII6uuhrvuioBfsCDauneHc86BQYOgefN062ug9Qa9mW0NDAf2BcqASUDvnJfc7+5jktdOBvoCTwKXAHu4+wozm2Zmu7v7gjzXLyKSfx98EHPvt9wClZUx33744TBiBOy/f0HNvzdEQ0b0+wAz3H0VsNDMWplZC3dfCeDur+e8diUxsgd4BWhlZquAzYFl6/oGZjaU+I2Bjh07bnAnRETy4pVXYvR+552xPUHLlrE08qyzYNdd065uozUk6NsBVTnHy4C2wKLcF5lZH2B74Omk6S7gBaAamOzuX3h9LncfD4wHKC8v9wbWLiKy6dxjW4Jrr4UpU6Jtu+1i75lTTy34+feGaEjQLwXa5By3Tto+Y2Z7AaOBw5L5+VbE1E0XYAXwoJnt4+7P56NoEZFNVlMDf/5zBPzcudG2xx4xPXPccdCiRbr15VFDgn42cIWZNSdG7Ctqp20AzKwzcDtwpLsvSZrXAquS164xsypg6/yWLiKyEZYvj/1nrr8e3n472r73PTj3XDj44KKbf2+I9Qa9u1eZ2a3AdGLVzZlm1g3o5+7XAGOJEf8dFv+DrnH3KWb2G+BZM1sNvA480Sg9EBFpiPfeg5tugnHjYrOxzTaDk06KEXzXrmlX16jMvbCmxMvLy72ioiLtMkQkK/75z5ieueuuuJtTq1ZwyilxgdOOO6ZdXd6Y2Vx3L6/vOV0wJSLZ4w4zZ8KYMZ9vMFZWFqtnhgyB1q1TLa+pKehFJDvWrIEHH4RrroHnnou2PfaA886DY49tsv3fC42CXkSKX3U1TJoUUzSvvRZt3/1uBPwhh2TyBOuGUNCLSPFatixOrt5wAyxeHDfVPvroCPi99067uoKhoBeR4vPee7H/+7hxsVyyRYu4uGnECOjcOe3qCo6CXkSKx6uvxvz7pEmxRXCbNvDLX8ZVrNtum3Z1BUtBLyKFr6ICRo+G++6LFTVlZXGDj6FDY7mkfCUFvYgUptp7sP7qV/Dkk9G2225w/vlxi74SXUGzMRT0IlJY1q6FBx6IEfycOdG2997w85/DEUdAs2aplleMFPQiUhhWr47b8119dWwXDNCvX4zg+/Yt+SWSm0JBLyLp+uST2GTsmmvgnXci0I88Mkbw5fVe0S8bSEEvIun48EO49dbYRbKyMjYZ+/GPYeRI+Na30q4uUxT0ItK0KivjAqebb46wb9kShg+PNfC6w1yjUNCLSNN491349a9h/PiYrtlqq5ieOfts6NAh7eoyTUEvIo3rjTdiBc3EiXHCdZtt4iKnYcPigidpdAp6EWkcCxbEGvi7745dJXfYIfagGTIEttwy7epKioJeRPJr/ny44gq499646KlTp5iiGTw4U/dhLSYKehHJjzlz4PLL4eGH47hLF7jggrjRdvPm6dZW4hT0IrJpZs6MgH/88Tjec0+48MJYC6+rWAuCgl5ENpw7TJsGl10W/wXo0SMC/vDDY194KRgKehFpOHeYOjUCftasaOvVCy66SHdyKmAKehFZP3d49NEI+Nmzo61Pnwh47UNT8BT0IrJu7jBlClx6aewJDxHso0ZF0EtRUNCLyJe5w0MPxQh+3rxo69cvAr5373Rrkw2moBeRz9UG/KWXwgsvRNshh0TA9+qVbm2y0RT0IlJ/wPfvHwHfs2e6tckmU9CLlLL6An7AALj44rirk2SCgl6kFLnHFayXXKKALwEKepFSUruK5pJLYO7caOvfP44V8JmloBcpBe7w2GMxYq+94fahh8ax5uAzT0EvkmXu8MQTcVL1ueei7eCDY05+333TrU2ajIJeJKumTYuAnzEjjvv2jYDXOviSo6AXyZpZsyLgn3oqjg84IC580pWsJUtBL5IVc+ZEwD/2WBz36hUBf9BB2oumxCnoRYrd/PkR8A89FMc9esT+8NpNUhIKepFi9corsWpm8uQ43muvGMEffrgCXr5AQS9SbBYujJOqkybB2rVxy75LL4Wjj9YNP6ReCnqRYvHee3HT7dtug9WrYeed40Kn44+HzfRRlnXTT4dIoVuyBEaPhltugepqKCuLG36cfLJuui0N0qCgN7PBwFDAgTPcfV7OcyOBI4EaYB4w3N3dzLYBbgHaAzXufnCeaxfJtg8/hOuui68VK2CbbeDKK+G006Bly7SrkyKy3qA3s62B4cC+QBkwCci94uJ+dx+TvHYy0Bd4EhgLXObu/8hzzSLZ9umncPPNMYpfuhS22ipW0Zx5JrRqlXZ1UoQacuZmH2CGu69y94VAKzNrUfuku7+e89qVQI2ZNQP2AEaY2XQzG/ZV38DMhppZhZlVVFZWbkQ3RDJg9WoYNw46d4aRIyPwzz8/Tr5eeKFCXjZaQ4K+HVCVc7wMaFv3RWbWB9geeBroAOwJ3AD0A443s93X9Q3cfby7l7t7efv27RtevUgWrF0L99wDu+8e0zKVlTBsGPz73zGqb/ulj5vIBmnIHP1SoE3Oceuk7TNmthcwGjgsmZ+vAt5z9/nJ89OI4F+Qh5pFssEdHn0ULrggLnoyg5NOiqWSO++cdnWSIQ0Z0c8GeptZczPrCKxw95W1T5pZZ+B24Fh3XwLg7tXAG2b2jeRlPYB/5bd0kSI2a1bsPTNgQIT84YfDiy/CnXcq5CXv1juid/cqM7sVmE6sujnTzLoB/dz9GuKkaxvgDour8a5x9ynAmcBdZtYceCp3pY5IyXr55RjBP/xwHB9wQEzP6Mbb0ojM3dOu4QvKy8u9oqIi7TJE8uutt2K7gjvvjCmbbt3gV7+C739f2xVIXpjZXHcvr+85XTAl0piWLIGrroqLnVatgl12iatbjzlG2xVIk1HQizSGjz+GsWNhzBj46CPo0CF2mBwyBDbfPO3qpMQo6EXyqaYGbr899qBZtAi+/vVYRXPOOfFYJAUKepF8cIcHHoBf/AJefTX2oBk+PC500rUhkjIFvcimmjkzrmR99tk4Pu64mIffZZd06xJJKOhFNtaCBTGCf/DBOD7oILj66rjDk0gB0Wl/kQ21eDGccgrssUeEfNeucZ/WqVMV8lKQNKIXaagVK+Daa+Pr44/hG9+IKZoTToBmzdKuTmSdFPQi61NTAxMmxAVP778PrVvHsskzzoAttki7OpH1UtCLrIs7TJkSJ1oXLIiVNGedFStp2rVLuzqRBlPQi9Rn3jw491z429/ieNCguML1m99Mty6RjaCgF8n1zjvwy1/CpElx3Lt3zMn37JluXSKbQEEvArB8eewied11cQPuzp1jqeTAgdp0TIqegl5KW+2J1lGj4IMPYu59zJhYPqk9aSQjFPRSuh57LObh//GPCPVzz41pmzZt0q5MJK8U9FJ6Xn4ZRoyAxx+P46OPjmkbbVkgGaUrY6V0vP9+TMl07Rohv88+cUu/yZMV8pJpGtFL9lVXww03wJVXxknXjh3j7k7HHqubf0hJUNBLdrnDvffGBU8LF8Z+8FddFRc9tWyZdnUiTUZBL9k0b14E+owZsTzyJz+JfWm22y7tykSanIJesmXRolg5M3FijOgPPBCuvz5uxi1SohT0kg3V1RHoV10Vu0x+85txResRR+iCJyl5Cnopbu5w332xBv7NN6FVq7ii9cwzoUWLtKsTKQgKeile8+fHPPy0aTFq/+lPYx5+223TrkykoCjopfhUVsaWBePHw9q1cMABMHYsfOc7aVcmUpC0iFiKx+rVsR5+t91g3DjYcce42GnaNIW8yFfQiF6Kw9SpMe++YEGsgb/0UjjvPK2HF2kABb0UtjfegHPOiZtwQ1zNOmZM3K9VRBpEQS+F6eOPY5uCa6+FlStjf5obb4z5eBHZIAp6KSzu8Kc/xbTMu+/G/vA33BArapo1S7s6kaKkoJfC8eKLMHw4TJ8em42dfnrMxbdtm3ZlIkVNQS/pq6qCiy+GW26J5ZJ9+sQ0zV57pV2ZSCYo6CU9a9fC738PP/85LFkSyyWvvRYGDdK2BSJ5pHX0ko6KCujVK+beP/oIfvELeOUVOOYYhbxInmlEL01ryRK44AK47bY48XrooXGydddd065MJLMU9NI01qyB3/0uthBeuhR23jm2LTjsMI3gRRqZpm6k8T3/PPTsCaedBp98ApdcAv/4Bxx+uEJepAloRC+Np+40zWGHxSheN+IWaVIKesm/tWthwoRYTVM7TXPjjfCDH6RdmUhJatDUjZkNNrNnzGyWmXWv89xIM5udPHeT2ee/i5tZczN73cwuzHfhUqDmzYP99oOhQ2Mbg4svjmkahbxIatYb9Ga2NTAcOBA4Ebixzkvud/ee7v5/wLZA35znTgFeyU+pUtCWLYsrWffeG2bPjtU0L78c8/HaYVIkVQ0Z0e8DzHD3Ve6+EGhlZp/do83dX8957UqgBsDMvg4cCty7vm9gZkPNrMLMKiorKzeoA5Iyd7jrLujSJa5sLSuLW/tNmQKdO6ddnYjQsKBvB1TlHC8DvrT5iJn1AbYHnk6azgPGNqQIdx/v7uXuXt6+ffuG/BEpBAsWQN++cNJJMRc/cmS0DRyo1TQiBaQhQb8UaJNz3Dpp+4yZ7QWMBo51dzezbYHvuPvUfBUqBeSTT2I1TdeucXenPn3i/q1XXw1bbpl2dSJSR0NW3cwGrjCz5sSIfYW7r6x90sw6A7cDR7r7kqR5T6C9mT0GlAEtzGy+uz+c3/KlyT3yCJxxBrz5JrRvD7/+NZx4okbwIgVsvUHv7lVmdiswHXDgTDPrBvRz92uI6Zk2wB3Jgptr3H0K8ATEih1gR4V8kXv33dhC+P77I9RPPRWuugq23jrtykRkPczd067hC8rLy72ioiLtMqRWTQ3cdBOMGgUrVsR0zbhxsO++aVcmIjnMbK67l9f3nC6YknV7/nk45RT4+99j7v2662LaZjP92IgUE+11I1/24YcR6PvuGyE/cGCspjn7bIW8SBHSp1Y+5w733htz8YsWQceOcPPNsUeNiBQtjeglvPVWBPrRR8MHH8CIEbF1gUJepOhpRF/qamrixh+jRsX6+H32gd/+Frp1S7syEckTBX0pmzsXhgyBF16AVq1idc1pp0GzZmlXJiJ5pKmbUrRiBZxzTozeX3ghTrb+85+xKZlCXiRzNKIvNX/5S4za334bdtghTrYOHJh2VSLSiDSiLxXvvw/HHQcDBsA778DPfvb5BmQikmka0WedO0ycGKtoqqrg29+Om3T36pV2ZSLSRDSiz7J//xv69YOTT467PV1+edwBSiEvUlI0os+imhq4/vq4jd+nn8L++8covkuXtCsTkRQo6LPm73+Hn/wkRu5bbRWBP2QIfE2/vImUKn36s6K6Om4GUl4eIX/EEbFk8pRTFPIiJU4j+iyYOTNG8a+9Bh06xJLJo47SzUBEBNCIvrgtXx4XOe2/f4T84MGxZPLooxXyIvIZjeiL1V//CkOHxoVPO+0E48fDwQenXZWIFCCN6IvN0qUxcj/kkLjw6Ywz4OWXFfIisk4a0ReTBx6I7QsWL4bddoMJE6B377SrEpECpxF9MaishGOPje0KPvgAzj8/llEq5EWkATSiL2TuMHlynHBdsgT23BNuvz2WUIqINJBG9IVq8WI48sgYyS9bFjcGqahQyIvIBtOIvtC4wz33xEnWpUvjTk+//73u+CQiG00j+kKyeHHMw59wQqyRv/xyeP55hbyIbBKN6AuBO9x9d4ziq6qge/fYWnjPPdOuTEQyQCP6tC1eDD/8IZx4Ytzi74or4LnnFPIikjca0afFHf70p7jT09Kl0KNHjOL32CPtykQkYzSiT0NlJQwaFLf2q52Lf/ZZhbyINAqN6JvafffBqadG2HfrFqP4rl3TrkpEMkwj+qaydGmspjnyyHg8ahTMnq2QF5FGpxF9U/jLX+CnP4VFi+B//xfuuEMXPolIk9GIvjEtXx638RswIFbXnHcezJ2rkBeRJqURfWOZPj22E37zTejcOUbx++2XdlUiUoI0os+36moYMQK++90I+WHDYqdJhbyIpEQj+nyaNw9OOiluyl1WFnvU9OuXdlUiUuI0os+Hmpq4orVnzwj5E06Iuz4p5EWkAGhEv6leew1+9KNYKtmuHYwbB0cdlXZVIiKf0Yh+Y7nDb34D3/lOhPyAATGKV8iLSIFR0G+MRYsi2IcNAzP47W/h4Ydhu+3SrkxE5EsaFPRmNtjMnjGzWWbWvc5zI81sdvLcTRZamtlUM5tpZs+Z2aGNU34K7rsvdpZ89FHo1StW1AwdGoEvIlKA1hv0ZrY1MBw4EDgRuLHOS+53957u/n/AtkBfoAYY4u69gR8AY/NYczqWL4eTT44tDD78ME6+Pv10rJEXESlgDTkZuw8ww91XAQvNrJWZtXD3lQDu/nrOa1cCNe6+GngzafsUWPtV38DMhgJDATp27LhhPWgKs2bFssmFC6FLF7jrLl3dKiJFoyFTN+2AqpzjZUDbui8ysz7A9sDTdZ66HhjzVd/A3ce7e7m7l7dv374BJTWR1avhoovggAMi5IcNi7XyCnkRKSINGdEvBdrkHLdO2j5jZnsBo4HD3N1z2i8CPnL33296qU3s9ddjPfycOdChQ1z81L9/2lWJiGywhozoZwO9zay5mXUEVtRO2wCYWWfgduBYd1+S0346sCtwXp5rblzucNttsVf8nDlw2GHw0ksKeREpWusNenevAm4FpgP3AGeZWTczqw3wscSI/w4zm2ZmA8ysA3ADsAvwt6S9WWN0IK/++9842TpkSAT+uHHw4IMxohcRKVINujLW3W8nRu25/p4894N1/LHCD/ZcTz4ZV7i+9x507w533x0nXkVEipwumFq1CkaOjH1pFi2C88+P+7cq5EUkI0p7r5tXX4Xjj4+VNGVlcOed0Ldv2lWJiORVaY7o3WHChJiimTcPfvhDmD9fIS8imVR6QV9VBYMGxT1cAcaPhz//OXaeFBHJoNKaupk5M9bGv/12LJ+85x741rfSrkpEpFGVxoh+zRq47DLo0ydC/uyz4bnnFPIiUhKyP6J/5x048cTYgKx9+7hJ96HZ2UxTRGR9sj2if+AB6No1Qr5fP3jxRYW8iJScbAZ9dTX87GcwcGBsL3z11fDYY7oxiIiUpOxN3bzyChxzTIzed945Trj27Jl2VSIiqcnOiN4dJk6EHj0i5AcNghdeUMiLSMnLTtCPGQM//nEE/u9+B3/8I7RunXZVIiKpy07Qn3BC3CBkzpy4GEr3cBURAbI0R7/jjjB9etpViIgUnOyM6EVEpF4KehGRjFPQi4hknIJeRCTjFPQiIhmnoBcRyTgFvYhIxinoRUQyTkEvIpJxCnoRkYxT0IuIZJyCXkQk4xT0IiIZp6AXEck4Bb2ISMYp6EVEMk5BLyKScQp6EZGMM3dPu4YvMLNK4K1N+Cu2AZbkqZw0ZaUfoL4Uoqz0A9SXWju5e/v6nii4oN9UZlbh7uVp17GpstIPUF8KUVb6AepLQ2jqRkQk4xT0IiIZl8WgH592AXmSlX6A+lKIstIPUF/WK3Nz9CIi8kVZHNGLiEgOBb2ISMYp6EVEMk5BLyKScUUR9Ga2lZk9Y2bTzOx5MzvIwk1mNsPMHjGztslr2ybHM5LnLWnvbmazkr9ncAH140AzW5S0TTOzHoXej1xmtpuZrTaz3ma2hZn9Ian5D2a2RfKaTmb2VFL3BTl/9hAzezb5+n56vfisnty+DDazhTnvS1nymoLvi5l9mlP3T4rxs7KOfhTtZ8XMepjZ42b2NzMb0+TvibsX/BfxD9JmyeNdgDnAIcCEpO1HwOjk8WjgpOTx7cAhyeNZwM7A5sA8YOsC6ceBwG31vLZg+1GnzknAE0Bv4FTgoqR9FHBq8viPwP7J4yeAbwHNgBeBNsnXfKBZAfVlMHBhPa8p+L4A/6pzXHSflXX0oyg/K8n3nwq0Sus9KYoRvbuvdfea5HAr4kPVB3gkaXs4Oaa+djNrAWzp7gvdfRUwA9inSYrPsY5+AHw/51/wlklbwfajlpn1BBYD7yZN63pPurn7jOTxlKS9M7DQ3Ze5+zLgzaQtFfX0BeBHZjbTzC43s9rPSsH3BdjOzKab2X1m1oki/Kwk6vYDivOz0gtYAdyd/Da4P038nhRF0AOYWZmZzQQeB+4H2gFVydPLgK2Tx22T49r2tslra9ty25tcPf2YC+zq7vsDHwHnJi8t6H4kfkmMQGrVfU9qa8v9Oattz31t3denoW5fHgR2Jz54OwEnJO3F0JdO7t4H+C0wgSL9rPDlfhTrZ2UHoCvxM3QS8Dti87Ime0+KJujd/T/u3pv4l+xmYCnxazJAaz7/n1aVHNe2L63z2tz2Jle3H+6+3N2rk6f/ANRuaFTQ/TCzAUCFu/83p7nue1Jb29qc1xRFX9y9yt3XuPsaYrqm9n0p6L4AuPuS5L9/Jf6RKtbPyhf6UayfleT7PuPuH7n7f4jdKZvRhO9JUQR98qtLrY+A5cB0oH/S1j85pr725IfjYzPraGbNiTnY5xu98Drq64eZtc5p6wu8mjwu2H4kugEHmtljQD/gWmAB9b8n881sv+TxocDTwOvAzhYnqLci5h//1US119WNOn0xs51yns99Xwq6L2b2dTNrljzeiwiVYvysfKkfRfxZmQ3sZmabmVkroANwL035nqRxcmIjTmb0ID5QfyPmpw4i/pG6JTmeArRLXtsuOZ6RPP+1pL2cOKHxDHByAfVjGFCRtN8HtCn0ftTTr4nJD19L4J6k5nuALZLnd0n6PIucE5zJD/KzyVf/tPtRpy9XEh/QWcRJsebF0BfiN8UXkp+n6cSUQTF+VurrR9F+Vogpm5nJz9TApn5PtNeNiEjGFcXUjYiIbDwFvYhIxinoRUQyTkEvIpJxCnoRkYxT0IuIZJyCXkQk4/4fpNuEFrmLZKIAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "negative_electrode_exchange_current_density = param[\"Negative electrode exchange-current density [A.m-2]\"]\n", + "x = pybamm.linspace(3000,6000,100)\n", + "evaluated = param.evaluate(negative_electrode_exchange_current_density(1000,x,300))\n", + "evaluated = pybamm.Array(evaluated)\n", + "pybamm.plot(x, evaluated)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulating and solving the model\n", + "\n", + "Finally we can simulate the model and solve it using `pybamm.Simulation` and `solve` respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f25dbab3e85042f1a775dfa5fd8446a1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=3599.0, step=35.99), Output()), _dom_classes…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim = pybamm.Simulation(spm, parameter_values=param)\n", + "t_eval = np.arange(0, 3600, 1)\n", + "sim.solve(t_eval=t_eval)\n", + "sim.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Chang-Hui Chen, Ferran Brosa Planella, Kieran O'Regan, Dominika Gastol, W. Dhammika Widanage, and Emma Kendrick. Development of Experimental Techniques for Parameterization of Multi-scale Lithium-ion Battery Models. Journal of The Electrochemical Society, 167(8):080534, 2020. doi:10.1149/1945-7111/ab9050.\n", + "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", + "[6] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } }, - { - "data": { - "text/plain": [ - "4.0" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param.search(\"Current function [A]\")\n", - "\n", - "param.update(\n", - " {\n", - " \"Current function [A]\": 4.0\n", - " }\n", - ")\n", - "\n", - "param[\"Current function [A]\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a function:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def curren_func(time):\n", - " return 1 + pybamm.sin(2 * np.pi * time / 60)\n", - "\n", - "param.update(\n", - " {\n", - " \"Current function [A]\": curren_func\n", - " }\n", - ")\n", - "\n", - "param[\"Current function [A]\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting parameter functions\n", - "\n", - "As seen above, functions can be passed as parameter values. These parameter values can then be plotted by using `pybamm.plot`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting \"Current function \\[A]\"" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "currentfunc = param[\"Current function [A]\"]\n", - "time = pybamm.linspace(0, 120, 60)\n", - "evaluated = param.evaluate(currentfunc(time))\n", - "evaluated = pybamm.Array(evaluated)\n", - "pybamm.plot(time, evaluated)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Taking another such example:\n", - "\n", - "### Plotting \"Negative electrode exchange-current density \\[A.m-2]\"" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "negative_electrode_exchange_current_density = param[\"Negative electrode exchange-current density [A.m-2]\"]\n", - "x = pybamm.linspace(3000,6000,100)\n", - "evaluated = param.evaluate(negative_electrode_exchange_current_density(1000,x,300))\n", - "evaluated = pybamm.Array(evaluated)\n", - "pybamm.plot(x, evaluated)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Simulating and solving the model\n", - "\n", - "Finally we can simulate the model and solve it using `pybamm.Simulation` and `solve` respectively." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f25dbab3e85042f1a775dfa5fd8446a1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=3599.0, step=35.99), Output()), _dom_classes…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sim = pybamm.Simulation(spm, parameter_values=param)\n", - "t_eval = np.arange(0, 3600, 1)\n", - "sim.solve(t_eval=t_eval)\n", - "sim.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Chang-Hui Chen, Ferran Brosa Planella, Kieran O'Regan, Dominika Gastol, W. Dhammika Widanage, and Emma Kendrick. Development of Experimental Techniques for Parameterization of Multi-scale Lithium-ion Battery Models. Journal of The Electrochemical Society, 167(8):080534, 2020. doi:10.1149/1945-7111/ab9050.\n", - "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", - "[6] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.0" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/examples/notebooks/simulating-long-experiments.ipynb b/examples/notebooks/simulating-long-experiments.ipynb index 2320501a6d..f120dcab74 100644 --- a/examples/notebooks/simulating-long-experiments.ipynb +++ b/examples/notebooks/simulating-long-experiments.ipynb @@ -1,2502 +1,2502 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "regional-bedroom", - "metadata": {}, - "source": [ - "# Simulating long experiments" - ] - }, - { - "cell_type": "markdown", - "id": "quantitative-radar", - "metadata": {}, - "source": [ - "This notebook introduces functionality for simulating experiments over hundreds or even thousands of cycles. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "novel-spectacular", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "mounted-seven", - "metadata": {}, - "source": [ - "## Simulating long experiments" - ] - }, - { - "cell_type": "markdown", - "id": "chronic-consensus", - "metadata": {}, - "source": [ - "In the interest of simplicity and running time, we consider a SPM with SEI effects leading to linear degradation, with parameter values chosen so that the capacity fades by 20% in just a few cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "limiting-making", - "metadata": {}, - "outputs": [], - "source": [ - "parameter_values = pybamm.ParameterValues(\"Mohtat2020\")\n", - "parameter_values.update({\"SEI kinetic rate constant [m.s-1]\": 1e-14})\n", - "spm = pybamm.lithium_ion.SPM({\"SEI\": \"ec reaction limited\"})" - ] - }, - { - "cell_type": "markdown", - "id": "compact-teddy", - "metadata": {}, - "source": [ - "Using the \"Electrode SOH\" (eSOH) model, we initialize the concentration in each electrode at 100% State of Charge" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "photographic-sussex", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial negative electrode SOC: 0.833\n", - "Initial positive electrode SOC: 0.034\n" - ] - } - ], - "source": [ - "# Calculate stoichiometries at 100% SOC\n", - "esoh_model = pybamm.lithium_ion.ElectrodeSOH()\n", - "esoh_sim = pybamm.Simulation(esoh_model, parameter_values=parameter_values)\n", - "param = spm.param\n", - "\n", - "Vmin = 3.0\n", - "Vmax = 4.2\n", - "Cn = parameter_values.evaluate(param.n.cap_init)\n", - "Cp = parameter_values.evaluate(param.p.cap_init)\n", - "n_Li_init = parameter_values.evaluate(param.n_Li_particles_init)\n", - "\n", - "esoh_sol = esoh_sim.solve(\n", - " [0],\n", - " inputs={\"V_min\": Vmin, \"V_max\": Vmax, \"C_n\": Cn, \"C_p\": Cp, \"n_Li\": n_Li_init},\n", - ")\n", - "print(f\"Initial negative electrode SOC: {esoh_sol['x_100'].data[0]:.3f}\")\n", - "print(f\"Initial positive electrode SOC: {esoh_sol['y_100'].data[0]:.3f}\")\n", - "\n", - "# Update parameter values with initial conditions\n", - "c_n_max = parameter_values.evaluate(param.n.c_max)\n", - "c_p_max = parameter_values.evaluate(param.p.c_max)\n", - "parameter_values.update(\n", - " {\n", - " \"Initial concentration in negative electrode [mol.m-3]\": esoh_sol[\"x_100\"].data[0] * c_n_max,\n", - " \"Initial concentration in positive electrode [mol.m-3]\": esoh_sol[\"y_100\"].data[0] * c_p_max,\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "focused-substitute", - "metadata": {}, - "source": [ - "We can now simulate a single CCCV cycle using the `Experiment` class (see [this notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%205%20-%20Run%20experiments.ipynb) for more details)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "religious-primary", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:30,343 - [NOTICE] simulation.solve(850): Cycle 1/1 (34.436 ms elapsed) --------------------\n", - "2021-11-20 13:05:30,344 - [NOTICE] simulation.solve(884): Cycle 1/1, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:30,399 - [NOTICE] simulation.solve(884): Cycle 1/1, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:30,439 - [NOTICE] simulation.solve(884): Cycle 1/1, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:30,486 - [NOTICE] simulation.solve(884): Cycle 1/1, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:30,792 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 482.871 ms\n" - ] - } - ], - "source": [ - "pybamm.set_logging_level(\"NOTICE\")\n", - "\n", - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\"\n", - " )\n", - "])\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "heavy-crisis", - "metadata": {}, - "source": [ - "Alternatively, we can simulate many CCCV cycles. Here we simulate either 100 cycles or until the capacity is 80% of the initial capacity, whichever is first. The capacity is calculated by the eSOH model" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "stupid-abortion", - "metadata": { - "tags": [ - "outputPrepend" - ] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:32,969 - [NOTICE] simulation.solve(850): Cycle 1/500 (32.976 ms elapsed) --------------------\n", - "2021-11-20 13:05:32,970 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,022 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,072 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,123 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:33,339 - [NOTICE] simulation.solve(972): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:33,340 - [NOTICE] simulation.solve(850): Cycle 2/500 (404.083 ms elapsed) --------------------\n", - "2021-11-20 13:05:33,341 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,369 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,392 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,418 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:33,453 - [NOTICE] simulation.solve(972): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:33,454 - [NOTICE] simulation.solve(850): Cycle 3/500 (518.002 ms elapsed) --------------------\n", - "2021-11-20 13:05:33,455 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,487 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,513 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,542 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:33,576 - [NOTICE] simulation.solve(972): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:33,577 - [NOTICE] simulation.solve(850): Cycle 4/500 (641.396 ms elapsed) --------------------\n", - "2021-11-20 13:05:33,578 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,607 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,631 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,662 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:33,705 - [NOTICE] simulation.solve(972): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:33,706 - [NOTICE] simulation.solve(850): Cycle 5/500 (770.111 ms elapsed) --------------------\n", - "2021-11-20 13:05:33,707 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,743 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,770 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,807 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:33,847 - [NOTICE] simulation.solve(972): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:33,848 - [NOTICE] simulation.solve(850): Cycle 6/500 (912.321 ms elapsed) --------------------\n", - "2021-11-20 13:05:33,849 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:33,894 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:33,926 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:33,958 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,006 - [NOTICE] simulation.solve(972): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,007 - [NOTICE] simulation.solve(850): Cycle 7/500 (1.070 s elapsed) --------------------\n", - "2021-11-20 13:05:34,008 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,037 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,061 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,087 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,129 - [NOTICE] simulation.solve(972): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,130 - [NOTICE] simulation.solve(850): Cycle 8/500 (1.193 s elapsed) --------------------\n", - "2021-11-20 13:05:34,130 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,161 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,203 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,227 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,263 - [NOTICE] simulation.solve(972): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,265 - [NOTICE] simulation.solve(850): Cycle 9/500 (1.328 s elapsed) --------------------\n", - "2021-11-20 13:05:34,265 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,292 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,315 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,341 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,378 - [NOTICE] simulation.solve(972): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,379 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.442 s elapsed) --------------------\n", - "2021-11-20 13:05:34,379 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,407 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,430 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,456 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,493 - [NOTICE] simulation.solve(972): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,494 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.557 s elapsed) --------------------\n", - "2021-11-20 13:05:34,494 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,524 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,548 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,578 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,620 - [NOTICE] simulation.solve(972): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,621 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.684 s elapsed) --------------------\n", - "2021-11-20 13:05:34,622 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,653 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,678 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,704 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,744 - [NOTICE] simulation.solve(972): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,745 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.808 s elapsed) --------------------\n", - "2021-11-20 13:05:34,746 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,771 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,794 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n" - ] + "cells": [ + { + "cell_type": "markdown", + "id": "regional-bedroom", + "metadata": {}, + "source": [ + "# Simulating long experiments" + ] + }, + { + "cell_type": "markdown", + "id": "quantitative-radar", + "metadata": {}, + "source": [ + "This notebook introduces functionality for simulating experiments over hundreds or even thousands of cycles. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "novel-spectacular", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "mounted-seven", + "metadata": {}, + "source": [ + "## Simulating long experiments" + ] + }, + { + "cell_type": "markdown", + "id": "chronic-consensus", + "metadata": {}, + "source": [ + "In the interest of simplicity and running time, we consider a SPM with SEI effects leading to linear degradation, with parameter values chosen so that the capacity fades by 20% in just a few cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "limiting-making", + "metadata": {}, + "outputs": [], + "source": [ + "parameter_values = pybamm.ParameterValues(\"Mohtat2020\")\n", + "parameter_values.update({\"SEI kinetic rate constant [m.s-1]\": 1e-14})\n", + "spm = pybamm.lithium_ion.SPM({\"SEI\": \"ec reaction limited\"})" + ] + }, + { + "cell_type": "markdown", + "id": "compact-teddy", + "metadata": {}, + "source": [ + "Using the \"Electrode SOH\" (eSOH) model, we initialize the concentration in each electrode at 100% State of Charge" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "photographic-sussex", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial negative electrode SOC: 0.833\n", + "Initial positive electrode SOC: 0.034\n" + ] + } + ], + "source": [ + "# Calculate stoichiometries at 100% SOC\n", + "esoh_model = pybamm.lithium_ion.ElectrodeSOH()\n", + "esoh_sim = pybamm.Simulation(esoh_model, parameter_values=parameter_values)\n", + "param = spm.param\n", + "\n", + "Vmin = 3.0\n", + "Vmax = 4.2\n", + "Cn = parameter_values.evaluate(param.n.cap_init)\n", + "Cp = parameter_values.evaluate(param.p.cap_init)\n", + "n_Li_init = parameter_values.evaluate(param.n_Li_particles_init)\n", + "\n", + "esoh_sol = esoh_sim.solve(\n", + " [0],\n", + " inputs={\"V_min\": Vmin, \"V_max\": Vmax, \"C_n\": Cn, \"C_p\": Cp, \"n_Li\": n_Li_init},\n", + ")\n", + "print(f\"Initial negative electrode SOC: {esoh_sol['x_100'].data[0]:.3f}\")\n", + "print(f\"Initial positive electrode SOC: {esoh_sol['y_100'].data[0]:.3f}\")\n", + "\n", + "# Update parameter values with initial conditions\n", + "c_n_max = parameter_values.evaluate(param.n.prim.c_max)\n", + "c_p_max = parameter_values.evaluate(param.p.prim.c_max)\n", + "parameter_values.update(\n", + " {\n", + " \"Initial concentration in negative electrode [mol.m-3]\": esoh_sol[\"x_100\"].data[0] * c_n_max,\n", + " \"Initial concentration in positive electrode [mol.m-3]\": esoh_sol[\"y_100\"].data[0] * c_p_max,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "focused-substitute", + "metadata": {}, + "source": [ + "We can now simulate a single CCCV cycle using the `Experiment` class (see [this notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%205%20-%20Run%20experiments.ipynb) for more details)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "religious-primary", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:30,343 - [NOTICE] simulation.solve(850): Cycle 1/1 (34.436 ms elapsed) --------------------\n", + "2021-11-20 13:05:30,344 - [NOTICE] simulation.solve(884): Cycle 1/1, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:30,399 - [NOTICE] simulation.solve(884): Cycle 1/1, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:30,439 - [NOTICE] simulation.solve(884): Cycle 1/1, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:30,486 - [NOTICE] simulation.solve(884): Cycle 1/1, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:30,792 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 482.871 ms\n" + ] + } + ], + "source": [ + "pybamm.set_logging_level(\"NOTICE\")\n", + "\n", + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\"\n", + " )\n", + "])\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "heavy-crisis", + "metadata": {}, + "source": [ + "Alternatively, we can simulate many CCCV cycles. Here we simulate either 100 cycles or until the capacity is 80% of the initial capacity, whichever is first. The capacity is calculated by the eSOH model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "stupid-abortion", + "metadata": { + "tags": [ + "outputPrepend" + ] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:32,969 - [NOTICE] simulation.solve(850): Cycle 1/500 (32.976 ms elapsed) --------------------\n", + "2021-11-20 13:05:32,970 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,022 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,072 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,123 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:33,339 - [NOTICE] simulation.solve(972): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:33,340 - [NOTICE] simulation.solve(850): Cycle 2/500 (404.083 ms elapsed) --------------------\n", + "2021-11-20 13:05:33,341 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,369 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,392 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,418 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:33,453 - [NOTICE] simulation.solve(972): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:33,454 - [NOTICE] simulation.solve(850): Cycle 3/500 (518.002 ms elapsed) --------------------\n", + "2021-11-20 13:05:33,455 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,487 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,513 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,542 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:33,576 - [NOTICE] simulation.solve(972): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:33,577 - [NOTICE] simulation.solve(850): Cycle 4/500 (641.396 ms elapsed) --------------------\n", + "2021-11-20 13:05:33,578 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,607 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,631 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,662 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:33,705 - [NOTICE] simulation.solve(972): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:33,706 - [NOTICE] simulation.solve(850): Cycle 5/500 (770.111 ms elapsed) --------------------\n", + "2021-11-20 13:05:33,707 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,743 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,770 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,807 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:33,847 - [NOTICE] simulation.solve(972): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:33,848 - [NOTICE] simulation.solve(850): Cycle 6/500 (912.321 ms elapsed) --------------------\n", + "2021-11-20 13:05:33,849 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:33,894 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:33,926 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:33,958 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,006 - [NOTICE] simulation.solve(972): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,007 - [NOTICE] simulation.solve(850): Cycle 7/500 (1.070 s elapsed) --------------------\n", + "2021-11-20 13:05:34,008 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,037 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,061 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,087 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,129 - [NOTICE] simulation.solve(972): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,130 - [NOTICE] simulation.solve(850): Cycle 8/500 (1.193 s elapsed) --------------------\n", + "2021-11-20 13:05:34,130 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,161 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,203 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,227 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,263 - [NOTICE] simulation.solve(972): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,265 - [NOTICE] simulation.solve(850): Cycle 9/500 (1.328 s elapsed) --------------------\n", + "2021-11-20 13:05:34,265 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,292 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,315 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,341 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,378 - [NOTICE] simulation.solve(972): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,379 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.442 s elapsed) --------------------\n", + "2021-11-20 13:05:34,379 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,407 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,430 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,456 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,493 - [NOTICE] simulation.solve(972): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,494 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.557 s elapsed) --------------------\n", + "2021-11-20 13:05:34,494 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,524 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,548 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,578 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,620 - [NOTICE] simulation.solve(972): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,621 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.684 s elapsed) --------------------\n", + "2021-11-20 13:05:34,622 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,653 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,678 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,704 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,744 - [NOTICE] simulation.solve(972): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,745 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.808 s elapsed) --------------------\n", + "2021-11-20 13:05:34,746 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,771 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,794 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:34,816 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,854 - [NOTICE] simulation.solve(972): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,855 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.919 s elapsed) --------------------\n", + "2021-11-20 13:05:34,856 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:34,887 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:34,911 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:34,937 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:34,978 - [NOTICE] simulation.solve(972): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:34,979 - [NOTICE] simulation.solve(850): Cycle 15/500 (2.042 s elapsed) --------------------\n", + "2021-11-20 13:05:34,979 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,008 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,036 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,061 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,098 - [NOTICE] simulation.solve(972): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,099 - [NOTICE] simulation.solve(850): Cycle 16/500 (2.163 s elapsed) --------------------\n", + "2021-11-20 13:05:35,100 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,129 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,157 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,187 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,229 - [NOTICE] simulation.solve(972): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,230 - [NOTICE] simulation.solve(850): Cycle 17/500 (2.293 s elapsed) --------------------\n", + "2021-11-20 13:05:35,230 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,260 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,284 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,310 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,346 - [NOTICE] simulation.solve(972): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,347 - [NOTICE] simulation.solve(850): Cycle 18/500 (2.411 s elapsed) --------------------\n", + "2021-11-20 13:05:35,348 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,378 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,400 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,427 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,463 - [NOTICE] simulation.solve(972): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,464 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.528 s elapsed) --------------------\n", + "2021-11-20 13:05:35,465 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,492 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,515 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,538 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,577 - [NOTICE] simulation.solve(972): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,578 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.641 s elapsed) --------------------\n", + "2021-11-20 13:05:35,578 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,603 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,625 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,648 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,684 - [NOTICE] simulation.solve(972): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,686 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.749 s elapsed) --------------------\n", + "2021-11-20 13:05:35,686 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,711 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,733 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,756 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,791 - [NOTICE] simulation.solve(972): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,792 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.856 s elapsed) --------------------\n", + "2021-11-20 13:05:35,793 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:35,817 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:35,840 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:35,863 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:35,904 - [NOTICE] simulation.solve(972): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:35,905 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.969 s elapsed) --------------------\n", + "2021-11-20 13:05:35,906 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,108 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,133 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,158 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,199 - [NOTICE] simulation.solve(972): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,201 - [NOTICE] simulation.solve(850): Cycle 24/500 (3.265 s elapsed) --------------------\n", + "2021-11-20 13:05:36,202 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,231 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,257 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,284 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,325 - [NOTICE] simulation.solve(972): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,326 - [NOTICE] simulation.solve(850): Cycle 25/500 (3.390 s elapsed) --------------------\n", + "2021-11-20 13:05:36,326 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,359 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,383 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,410 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,452 - [NOTICE] simulation.solve(972): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,453 - [NOTICE] simulation.solve(850): Cycle 26/500 (3.517 s elapsed) --------------------\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:36,454 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,484 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,508 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,533 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,568 - [NOTICE] simulation.solve(972): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,569 - [NOTICE] simulation.solve(850): Cycle 27/500 (3.633 s elapsed) --------------------\n", + "2021-11-20 13:05:36,570 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,595 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,618 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,639 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,674 - [NOTICE] simulation.solve(972): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,675 - [NOTICE] simulation.solve(850): Cycle 28/500 (3.739 s elapsed) --------------------\n", + "2021-11-20 13:05:36,676 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,703 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,726 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,748 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,784 - [NOTICE] simulation.solve(972): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,785 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.849 s elapsed) --------------------\n", + "2021-11-20 13:05:36,785 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,810 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,834 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,858 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:36,896 - [NOTICE] simulation.solve(972): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:36,897 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.961 s elapsed) --------------------\n", + "2021-11-20 13:05:36,898 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:36,923 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:36,946 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:36,970 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,010 - [NOTICE] simulation.solve(972): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,011 - [NOTICE] simulation.solve(850): Cycle 31/500 (4.075 s elapsed) --------------------\n", + "2021-11-20 13:05:37,011 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,035 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,057 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,081 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,117 - [NOTICE] simulation.solve(972): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,119 - [NOTICE] simulation.solve(850): Cycle 32/500 (4.183 s elapsed) --------------------\n", + "2021-11-20 13:05:37,120 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,143 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,166 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,189 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,225 - [NOTICE] simulation.solve(972): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,226 - [NOTICE] simulation.solve(850): Cycle 33/500 (4.289 s elapsed) --------------------\n", + "2021-11-20 13:05:37,226 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,252 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,275 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,301 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,340 - [NOTICE] simulation.solve(972): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,343 - [NOTICE] simulation.solve(850): Cycle 34/500 (4.406 s elapsed) --------------------\n", + "2021-11-20 13:05:37,343 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,370 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,395 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,422 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,462 - [NOTICE] simulation.solve(972): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,463 - [NOTICE] simulation.solve(850): Cycle 35/500 (4.527 s elapsed) --------------------\n", + "2021-11-20 13:05:37,464 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,498 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,527 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,551 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,591 - [NOTICE] simulation.solve(972): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,592 - [NOTICE] simulation.solve(850): Cycle 36/500 (4.656 s elapsed) --------------------\n", + "2021-11-20 13:05:37,593 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,625 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,650 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,674 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,711 - [NOTICE] simulation.solve(972): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,713 - [NOTICE] simulation.solve(850): Cycle 37/500 (4.777 s elapsed) --------------------\n", + "2021-11-20 13:05:37,714 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,743 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,769 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:37,796 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,834 - [NOTICE] simulation.solve(972): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,835 - [NOTICE] simulation.solve(850): Cycle 38/500 (4.899 s elapsed) --------------------\n", + "2021-11-20 13:05:37,836 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,859 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:37,884 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:37,922 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:37,969 - [NOTICE] simulation.solve(972): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:37,970 - [NOTICE] simulation.solve(850): Cycle 39/500 (5.034 s elapsed) --------------------\n", + "2021-11-20 13:05:37,971 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:37,994 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,017 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,039 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,076 - [NOTICE] simulation.solve(972): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,077 - [NOTICE] simulation.solve(850): Cycle 40/500 (5.140 s elapsed) --------------------\n", + "2021-11-20 13:05:38,077 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,100 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,123 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,153 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,191 - [NOTICE] simulation.solve(972): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,192 - [NOTICE] simulation.solve(850): Cycle 41/500 (5.255 s elapsed) --------------------\n", + "2021-11-20 13:05:38,193 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,219 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,244 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,269 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,310 - [NOTICE] simulation.solve(972): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,311 - [NOTICE] simulation.solve(850): Cycle 42/500 (5.375 s elapsed) --------------------\n", + "2021-11-20 13:05:38,312 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,339 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,366 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,393 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,438 - [NOTICE] simulation.solve(972): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,439 - [NOTICE] simulation.solve(850): Cycle 43/500 (5.503 s elapsed) --------------------\n", + "2021-11-20 13:05:38,441 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,467 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,490 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,514 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,552 - [NOTICE] simulation.solve(972): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,553 - [NOTICE] simulation.solve(850): Cycle 44/500 (5.617 s elapsed) --------------------\n", + "2021-11-20 13:05:38,554 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,580 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,603 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,627 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,666 - [NOTICE] simulation.solve(972): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,667 - [NOTICE] simulation.solve(850): Cycle 45/500 (5.731 s elapsed) --------------------\n", + "2021-11-20 13:05:38,667 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,696 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,721 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,745 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,783 - [NOTICE] simulation.solve(972): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,784 - [NOTICE] simulation.solve(850): Cycle 46/500 (5.848 s elapsed) --------------------\n", + "2021-11-20 13:05:38,786 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,813 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,839 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,862 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:38,906 - [NOTICE] simulation.solve(972): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:38,907 - [NOTICE] simulation.solve(850): Cycle 47/500 (5.971 s elapsed) --------------------\n", + "2021-11-20 13:05:38,908 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:38,936 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:38,960 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:38,983 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:39,024 - [NOTICE] simulation.solve(972): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:39,025 - [NOTICE] simulation.solve(850): Cycle 48/500 (6.088 s elapsed) --------------------\n", + "2021-11-20 13:05:39,025 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:39,049 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:39,071 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:39,093 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:39,131 - [NOTICE] simulation.solve(972): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:39,133 - [NOTICE] simulation.solve(850): Cycle 49/500 (6.197 s elapsed) --------------------\n", + "2021-11-20 13:05:39,133 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:39,155 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:39,181 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:39,207 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:39,251 - [NOTICE] simulation.solve(972): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:05:39,252 - [NOTICE] simulation.solve(850): Cycle 50/500 (6.315 s elapsed) --------------------\n", + "2021-11-20 13:05:39,252 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:39,278 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:39,304 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:39,329 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:39,375 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", + "2021-11-20 13:05:39,377 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 6.441 s\n" + ] + } + ], + "source": [ + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\")\n", + "] * 500,\n", + "termination=\"80% capacity\"\n", + ")\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "cloudy-lover", + "metadata": {}, + "source": [ + "### Summary variables" + ] + }, + { + "cell_type": "markdown", + "id": "shared-practitioner", + "metadata": {}, + "source": [ + "We can plot standard variables like the current and voltage, but it isn't very instructive on these timescales" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "personalized-oracle", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bbb607c89ae24d26bdd9e89847c6ec01", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=147.0807212393683, step=1.470807212393683), …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol.plot([\"Current [A]\", \"Terminal voltage [V]\"])" + ] + }, + { + "cell_type": "markdown", + "id": "intense-princeton", + "metadata": {}, + "source": [ + "Instead, we plot \"summary variables\", which show how the battery degrades over time by various metrics. Some of the variables also have \"Change in ...\", which is how much that variable changes over each cycle. This can be achieved by using `plot_summary_variables` method of pybamm, which can also be used to compare \"summary variables\" extracted from 2 or more solutions." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "right-skiing", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['C',\n", + " 'C_n',\n", + " 'C_n * (x_100 - x_0)',\n", + " 'C_p',\n", + " 'C_p * (y_100 - y_0)',\n", + " 'Capacity [A.h]',\n", + " 'Change in local ECM resistance [Ohm]',\n", + " 'Change in loss of active material in negative electrode [%]',\n", + " 'Change in loss of active material in positive electrode [%]',\n", + " 'Change in loss of capacity to SEI [A.h]',\n", + " 'Change in loss of capacity to lithium plating [A.h]',\n", + " 'Change in loss of lithium inventory [%]',\n", + " 'Change in loss of lithium inventory, including electrolyte [%]',\n", + " 'Change in loss of lithium to SEI [mol]',\n", + " 'Change in loss of lithium to lithium plating [mol]',\n", + " 'Change in negative electrode capacity [A.h]',\n", + " 'Change in positive electrode capacity [A.h]',\n", + " 'Change in total capacity lost to side reactions [A.h]',\n", + " 'Change in total lithium [mol]',\n", + " 'Change in total lithium in electrolyte [mol]',\n", + " 'Change in total lithium in negative electrode [mol]',\n", + " 'Change in total lithium in particles [mol]',\n", + " 'Change in total lithium in positive electrode [mol]',\n", + " 'Change in total lithium lost [mol]',\n", + " 'Change in total lithium lost from electrolyte [mol]',\n", + " 'Change in total lithium lost from particles [mol]',\n", + " 'Change in total lithium lost to side reactions [mol]',\n", + " 'Cycle number',\n", + " 'Local ECM resistance [Ohm]',\n", + " 'Loss of active material in negative electrode [%]',\n", + " 'Loss of active material in positive electrode [%]',\n", + " 'Loss of capacity to SEI [A.h]',\n", + " 'Loss of capacity to lithium plating [A.h]',\n", + " 'Loss of lithium inventory [%]',\n", + " 'Loss of lithium inventory, including electrolyte [%]',\n", + " 'Loss of lithium to SEI [mol]',\n", + " 'Loss of lithium to lithium plating [mol]',\n", + " 'Maximum measured discharge capacity [A.h]',\n", + " 'Measured capacity [A.h]',\n", + " 'Minimum measured discharge capacity [A.h]',\n", + " 'Negative electrode capacity [A.h]',\n", + " 'Positive electrode capacity [A.h]',\n", + " 'Total capacity lost to side reactions [A.h]',\n", + " 'Total lithium [mol]',\n", + " 'Total lithium in electrolyte [mol]',\n", + " 'Total lithium in negative electrode [mol]',\n", + " 'Total lithium in particles [mol]',\n", + " 'Total lithium in positive electrode [mol]',\n", + " 'Total lithium lost [mol]',\n", + " 'Total lithium lost from electrolyte [mol]',\n", + " 'Total lithium lost from particles [mol]',\n", + " 'Total lithium lost to side reactions [mol]',\n", + " 'Un(x_0)',\n", + " 'Un(x_100)',\n", + " 'Up(y_0)',\n", + " 'Up(y_0) - Un(x_0)',\n", + " 'Up(y_100)',\n", + " 'Up(y_100) - Un(x_100)',\n", + " 'n_Li',\n", + " 'n_Li_0',\n", + " 'n_Li_100',\n", + " 'x_0',\n", + " 'x_100',\n", + " 'y_0',\n", + " 'y_100']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(sol.summary_variables.keys())" + ] + }, + { + "cell_type": "markdown", + "id": "approximate-error", + "metadata": {}, + "source": [ + "The \"summary variables\" associated with a particular model can also be accessed as a list (which can then be edited) -" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "romance-roulette", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Positive electrode capacity [A.h]',\n", + " 'Loss of active material in positive electrode [%]',\n", + " 'Loss of lithium inventory [%]',\n", + " 'Loss of lithium inventory, including electrolyte [%]',\n", + " 'Total lithium [mol]',\n", + " 'Total lithium in electrolyte [mol]',\n", + " 'Total lithium in positive electrode [mol]',\n", + " 'Total lithium in particles [mol]',\n", + " 'Total lithium lost [mol]',\n", + " 'Total lithium lost from particles [mol]',\n", + " 'Total lithium lost from electrolyte [mol]',\n", + " 'Loss of lithium to SEI [mol]',\n", + " 'Loss of lithium to lithium plating [mol]',\n", + " 'Loss of capacity to SEI [A.h]',\n", + " 'Loss of capacity to lithium plating [A.h]',\n", + " 'Total lithium lost to side reactions [mol]',\n", + " 'Total capacity lost to side reactions [A.h]',\n", + " 'Local ECM resistance [Ohm]',\n", + " 'Negative electrode capacity [A.h]',\n", + " 'Loss of active material in negative electrode [%]',\n", + " 'Total lithium in negative electrode [mol]']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spm.summary_variables" + ] + }, + { + "cell_type": "markdown", + "id": "given-telephone", + "metadata": {}, + "source": [ + "Here the only degradation mechanism is one that causes loss of lithium, so we don't see loss of active material" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "postal-butter", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAAI4CAYAAACcFxlBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAD3e0lEQVR4nOzdd3hVVdbH8e9K6L3XNHrvoQkoKCiggF2xjB17GcuMOjP2KerYxo69K4oFe6coCARQeoc0epHes94/7kUjLyWQm5ybm9/nefLknr7OQ9g5WWfvtc3dERERERERERGJZnFBByAiIiIiIiIicihKYIiIiIiIiIhI1FMCQ0RERERERESinhIYIiIiIiIiIhL1lMAQERERERERkahXIugAolWNGjU8JSUl6DBEJEZMmTJljbvXDDqOokptsohEitrj/FF7LCKRciTtsRIYB5CSkkJaWlrQYYhIjDCz9KBjKMrUJotIpKg9zh+1xyISKUfSHmsIiYiIiIiIiIhEPfXAEBGR/TKz6XnYbbW7H3eA4xOBV4HagAPD3f0xM6sGvAOkAEuBM919fUSCFhEREZGYpQSGiIgcSDww8CDbDRh1kO27gZvcfaqZVQSmmNnXwIXAt+7+HzO7FbgV+GuEYhYRERGRGKUEhoiIHMjl7n7QsYlmdtWBtrn7cmB5+PMmM5sD1AeGAL3Du70CjEYJDBERERE5BCUwDmDx6s0sWr2ZRjUrBB2KiEgg3P2HfdeZWSOgnLvPONA++2NmKUAHYCJQO5zcAFhBaIjJ/o4ZBgwDSEpKOtzwRUR+s33XHr6ds4oPpmUHHUqemdnGQ+0CLHf3poURj4hIJLg7M7I3HHF7rATGAWzflcOAx8ZxQ98mXNarISXjVe9URIo3M7sdaAzkmFlpdz8/j8dVAEYCN7j7RjP7bZu7u5n5/o5z9+HAcIDU1NT97iMiciA5Oc7EJev4cFo2n81YzqYdu6ldqXTQYR2ORe7e4WA7mNm0wgpGRCQ/Mtdt5aOfs/lgWjaLVm+h1BH+fa0ExgE0rVORo1rU4oEv5vHp9OXcf1pbWtevHHRYIiKFxsyuA5509z3hVe3c/azwtrwU+MTMShJKXrzh7u+HV680s7ruvtzM6gKrIh27iBRfC1dt4v2p2Xz08zKyf91G+VLx9G9dl1M61Kd7o+qU+FvQEebZafnZx8xeBE4CVrl76/1sN+AxQrWOtgIXuvvUI4xVROT/2bBtF5/NWM4HU7OZtHQdAF1SqnFpr4YMbF2XKv86/HMqgXEAJeKMp87txBczl/P3D2cx5Mkfufzohlx3XBPKlIwPOjwRkcKwFvjCzB5391HAV2b2BaEpuL881MHhh+MXgDnu/nCuTaOAC4D/hL9/FPHIRaRYWbN5Bx//sowPpmUzPWsD8XFGz8Y1+Ev/ZvRrWZtypYreI6+7L87nPi8DTxCaDWp/BgBNwl9dgafD30VEjtiuPTmMnb+a96dm8/WclezcnUPDmuW55YRmDG5Xj8Rq5fJ1/qLXmhey/q3r0r1hDe77dDZPjV7EFzNX8O9T29C1YfWgQxMRKVDu/oaZjQRuNrNLgTuAt4CS7r4hD6foAZwPzDCzn8PrbieUuBhhZpcA6cCZEQ9eRGLe3roW70/NYsz81ezOcVrVq8TfT2zB4Pb1qFWxTNAhRoSZnQrcD9QiVPfCCI3Aq3Sw49x9bLj+0IEMAV51dwd+MrMqe3vHRSh0ESkm3J2Z2RsZOTWLj39ZxtotO6lWvhTndEnilA71aZtQmdxDiPNDCYw8qFyuJA+e0Y7B7etx+wczOGv4TwztksitA1pQuWzJoMMTESlIjYARwPPAveF1/wAOmcAIF/g80G+r4yISnYgUK+7OlPT1jJyazSfTl7Fp+27qVCrDpb0acmrH+jStXTHoEAvCA8Agd58T4fPWBzJzLWeF1/2/BIaKKovI/izfsI0Ppy3j/alZLFi1mVIl4ujXojandqzP0U1rFkgdSSUwDkOvJjX58oajefSbBTw/bjHfzFnF3YNbMaB1nYhllEREooWZvQzsAsoB2e5+mZl1AJ4zs8nufk+gAYpIsZG5bivvT83m/WlZpK/dStmS8QxoXYdTOybQvVF14uNi+jlsZQEkLw6LiiqLyF5bd+7my1krGDklmx8XrcEdUpOr8q9T2nBim7pULlewL/iVwDhM5UqV4PaBLRjcrh5/HTmdq96YSr+Wtbl7cCvqVSkbdHgiIpHUwd3bwe+V7t19GjDIzIYEGpmIxLxN23fx+YwVvDc1i0lL1mEG3RpU59pjmzCgdR3Kl47tx9jw0BGANDN7B/gQ2LF3e67CyEcqG0jMtZwQXici8gd7Z3UaOTWLz2csZ8vOPSRULcu1xzbh1A71SalRvtBiie2WvwC1rl+Zj67uwYs/LuHhr+fT7+Ex3HR8My44KiXW3wKISPHxuZl9CZQE3sy9wd1VeFNEIm5PjjNh0Vrem5LJF7NWsH1XDg1qlOfm45tySscE6hevl0WDcn3eChyfa9mB/CYwRgHXmNnbhIp3blD9CxHJLX3tFkZOyeL9adlkrd9GhdIlOLFtXU7rmEDnlGrEBfB3rxIY+VAiPo5hRzdiQOu6/P3DmdzzyWw+mJbNv05pQ5sETbkqIkWbu99qZpWAHHffHHQ8IhK7lqwJPyRPzWLZhu1UKlOCUzsmcFrHBDomVSmWQ3Xd/aL8HG9mbwG9gRpmlgXcSSghjbs/A3xGaArVhYQSJPm6nojEhs07dvPZ9OW8NyWLSUtDvd96Nq7Bzcc344RWdShbKtgZOZXAiIDEauV4+aLOfDpjOXd/PJshT/7AhUc14Mbjm1Ihxrs3ikjsMrOT3P2T/O4jIrI/G7fv+u0hOS19PXEGRzetye0ntqBvi9qatv4g8tL2uvvQQ2x34OqIBiYiRVJOjvPT4rW8NyWLz2euYNuuPTSsWZ6/9G/GKR3qU7dy9PR+01/XEWJmnNS2Hr2a1OTBL+fy0vglfD5zOXcOasUJrWoXyzcHIlLkPWhm2Rx4JhGAfwFKYIhInuTkOBMWr+XdtN+HiDSuVYHbBjTn5A71qV0pNqY+LQSdUdsrIvmUsXYr703JZOTUbLJ/3UbFMiU4pWN9Tu+UQIfE6Oz9pgRGhFUuW5L7Tm7DKR0S+NsHM7ji9Skc27wWdw9uRWK1ckGHJyJyOFYCDx9inwWFEYiIFG37PiRXKlOC0zslcHqnRNolVI7Kh+Qo91TQAYhI0bRlx24+n7mCd9Mymbjk9yEifx3QnONbRn/vNyUwCkin5Kp8cm1PXh6/NFTk85ExXHtsEy7r1ZBSJSI/H66ISKS5e++gYxCRomvrzt18PmMFI3I9JPdqUrPIPCRHGzOrApwGnAO0AOoFGpCIFBnuzpT09YxIy+TT6aFZRFKql+OWE0JDRIrSbJpKYBSgEvFxXNqrIQPb1OWej2fz4Jfz+GBaNvcOaU33RtWDDk9EREQkotydqRnreTcti0+mL2fzjt0kVy/Hzcc35dSOCUXqITkamFlZYAihpEUHoCJwMjA2wLBEpIhYuXE7I6dm8V5aFovXbKFcqXhOaluXM1ITSU2uWiR7vymBUQjqVSnLM+d34ru5K7njo1kMfe4nTm5fj9sHtqCWxnqKiIhIEbd60w7en5rFiLRMFq3eQtmS8ZzYti5npibSOaVoPiQHzczeBHoBXwGPA98BC919dJBxiUh027k7h+/mrmREWhaj560ix6FLSjWu7N2IgW3qUr6ITzJRtKPPxczigTQg291P2mdbEvAKUAWIB251988KO8Zjm9eme8MaPDV6Ic+OWcy3c1bx535N+VP3ZErEa1iJiIiIFB279+Qwet5q3knL5Lu5q9iT43RKrsr9pzXkxLb1NBNb/rUE1gNzgDnuvsfMPOCYRCRKLVi5iXcmZ/LBtGzWbtlJ7UqlueKYRpyRmkiDGuWDDi9iYuk3y/WEGvhK+9n2d2CEuz9tZi0JzXudUoix/aZsqXhuOr4Zp3ZM4M5Rs7jnk9mMSMvk3pNb0zmlWhAhiYgclJlNAV4E3nT39UHHIyLBWrJmCyPSMnlvSharN+2gRoXSXNqzAWekJtK4VoWgw4sZ7t7ezJoDQ4FvzGwNUNHMarv7yoDDE5EosHnHbj75ZRnvpGUyLeNXSsQZfVvU5qzOifRqUiMmX5LHRALDzBKAE4F/AjfuZxfn98RGZWBZIYV2QA1qlOeVizrzxcwV3PPJbM54ZgKndqzPrQOaU6uihpWISFQ5C7gImGxmacBLwFfurjeBIsXEtp17+GzGct5Jy2TSknXExxl9mtXkzNRE+jSvRckYfEiOBu4+F7gTuNPMOhFKZkw2syx3PyrY6EQkCHtrDb09KZNPZyxn6849NKlVgb8NbMEpHetTo0LpoEMsUDGRwAAeBf5CqLDR/twFfGVm1wLlgb7728nMhgHDAJKSkiIe5H6ux4A2dTmmWU0e/24hz49bzFezVnJD3yZccFSKHgZEJCq4+0Lgb2b2D+AkQr0x9pjZS8Bj7r4u0ABFpMDMzN7A25Mz+GjaMjbt2E1K9XL8pX8zTu+YoDpehczdpwBTzOwWQrUxRKQYWbt5B+9PzeadtEwWrtpMuVLxDGpbj7O6JNIhsUqxqTVU5BMYZnYSsMrdp5hZ7wPsNhR42d0fMrPuwGtm1trdc3Lv5O7DgeEAqamphfZmsVypEvy1f3PO6JTA3R/P5r5P5/DO5EzuHtKKoxrVKKwwREQOyMzaEuqFMRAYCbwB9CRUVK59cJGJSKRt2LaLUT9n8/bkTGYt20jpEnEMbFOXszon0rVBtWLzkBw0MxsWfjb9g3Dvt7EH20dEYkNOjvPDwjW8MzmTr2avYNcep0NSFe4/rU2xrTUUC3fcAxhsZgOBMkAlM3vd3c/Ltc8lQH8Ad59gZmWAGsCqQo/2IBrWrMDLF3Xm69krueeT2Zzz3ERObFuX2we2oL6mHRORgIRrYPwKvECoCPKO8KaJZtYjsMBEJGLcnbT09bw1KYPPZixn+64cWtatxL1DWjG4fX0qly0ZdIjF0a3huhcHYoRqwCmBIRJjVmzYzoi0TN6ZnEn2r9uoWq4kf+qewlmdE2la+0CDDoqHIp/AcPfbgNsAwj0wbt4neQGQARwHvGxmLQglOlYXYph5ZmYc36oORzetyTNjFvH06EV8O2clVx7TmMuPaUiZkvFBhygixYiZxQEj3f1f+9vu7qcWckgiEkHrtuzk/alZvD051CW5QukSnNYxgbM7J9G6fiX1tgjWGGDQIfb5ujACEZGCt3tPDt/PW83bkzL4Pjz9aY/G1bl1QHOOb1Wb0iX0dyDEQALjQMzsHiDN3UcBNwHPmdmfCRX0vDDai8+VKRnPDX2bcnqnBP792Vwe+WY+I9Iy+fuJLejfuo4eKESkULh7jpmdCuw3gSEiRY+7M2HRWt6anMmXM1ewc08OHZOq8MDpbTmpbV3KlYrZx8Mixd0vCjoGESl4Weu38s7kTEakZbJy4w5qVgxNf3pW50SSq8fO9KeRElO/odx9NDA6/PmOXOtnExpqUuQkVC3Hk+d25LxFa7n741lc+cZUjmpUnTsHtaJZneLdfUhECs03ZnYz8A6wZe9KFe8UKVrWbN7ByClZvDUpg6Vrt1K5bEnO6ZrE0C5JeqYQESlEu/bk8N3cVbw5MYOxC0IDA3o3rck9Q5I4VjM7HVRMJTBiWfdG1fnk2p68OSmDh76az4DHxnJu12T+3K8p1cqXCjo8EYltZ4W/X51rnQMNA4hFRA5DTo7z0+K1vDEpg69mhQrAdU6pyvV9mzCgdV0NTRURKUSZ637vbbFq0w7qVCrDtcc24azOiap5mEdKYBQhJeLj+FP3FAa1rcej38zn9YkZfPRzNn/u15TzuiUrUyciBcLdGwQdg4gcnrWbd/DePr0tzu+WwtAuiTQp5gXgREQK0+49OXybq7eFAb2b1eKcLkn0blaTEvob7rAogVEEVS1firuHtObcbsnc+8ls7v54Nm9MzODvJ7agd7NaQYcnIjHGzEoCVwJHh1eNBp51912BBSUi/4+7M3HJOt6cmMEX4doWnVOqct1xTRjYRr0tihozu/Fg29394cKKRUQO37Jft/H25ExGTM5kxcbt1K5UWr0tIkAJjCKsae2KvHpxF76ds4r7Pp3NhS9NpnezmvxtYAu9XRGRSHoaKAk8FV4+P7zu0sAiEpHfbNi6i5FTs3hzUgYLV22mUpkSnNM1iXO6JhX76faKuHz/45lZf+AxIB543t3/s8/2JOAVoEp4n1vd/bP8XlekuNqT44xdsJo3fkrnu7mrcOCYpjW5Z0grjm1eS70tIkAJjCLOzOjbsjZHN63JqxOW8ti3C+j/2DjO6ZKk+hgiEimd3b1druXvzOyXwKIREdydX7I28PpP6Xz8yzJ27M6hfWIV/ntGO05sU5eypdTboqhz97vzc7yZxQNPAv2ALGCymY0KF7ff6+/ACHd/2sxaAp8BKfm5rkhxtHrTDkakZfLWpAyy1m+jRoXSXNm7EWd3TiKxWrmgw4spSmDEiFIl4ri0V0NO7ZjAo9/M542JGXz4czbXHduEC45KoVQJZftE5IjtMbNG7r4IwMwaAnsCjkmkWNqyYzcf/byMNyamM2vZRsqXiuf0Tgmc0zWJVvUqBx2eRJCZjXD3M8Of73f3v+ba9pW7H3+IU3QBFrr74vAxbwNDgNwJDAcqhT9XBpZFKn6RWOfu/LR4Ha9PTP+tSPJRjapz+8AW9GtZW/UJC4gSGDGmWvlS3DOkNed3S+a+T+fwz8/m8PrEdG7t35z+retgZkGHKCJFzy3A92a2GDAgGbj4UAeZ2YvAScAqd28dXncXcBmwOrzb7equLHJoC1Zu4vWf0nl/ajabduymeZ2K3Hdya07uUJ8KpfU4F6Oa5PrcD/hrruWaeTi+PpCZazkL6LrPPncBX5nZtUB5oO/+TmRmw4BhAElJSXm4tEjs2rBtF+9PzeKNiaFhe5XLluRP3VM4p2sSjWpWCDq8mKffeDGqSe2KvHJxF0bPW8W/PpvDlW9MpXNKVf52YkvaJ1YJOjwRKVp+IPQg3Sy8PC+Px70MPAG8us/6R9z9v5EJTSR27dydw5ezVvDaT+lMWrKOUvFxnNi2Lud1S6ZjUhW9lIh9foTbDsdQ4GV3f8jMugOvmVlrd8/5w8XchwPDAVJTUyN1bZEiZWZ2aNjeRz8vY9uuPbQLD9s7qa2KJBemwBMYZlYtD7vluPuvBR1LLOrdrBY9G9fg3SlZPPTVfE5+8kcGtavHX05opvFYIpJXE9y9IzB97wozmwp0PNhB7j7WzFIKODaRmLPs1228NSmDtyZlsmbzDhKrleXWAc05o1MC1SuUDjo8KTzlzKwDEAeUDX+28FdepjDIBhJzLSeE1+V2CdAfwN0nmFkZoAawKp+xi8SE7bv28NmM5bz2UzrTMn6lTMk4Tm5fn/O6JdO6vobtBSHwBAahsXbLCDXGBxIPqL/aESoRH8fQLkkMaleP4WMWMXzcYr6ctYKLjkrhqt6NqVyuZNAhikgUMrM6hLog535whtB46fxkQK8xsz8BacBN7r7+ANdXl2UpNtydHxeu5bWflvL17JU4cFzzWpzbLZljmtQkLk69LYqhFcDD+/m8d/lQJgNNzKwBocTF2cA5++yTARwHvGxmLYAy/D7ET6TYyly3lTcmZjAiLZN1W3bSsEZ57jipJad1SqByWf3tFKRoSGDMcfcOB9vBzKYVVjCxrELpEtx4fDOGdk3ioa/mM3zcYt5Jy+SaPo05v3sypUuo65OI/MEJwIWE3trlfnDeBNx+hOd8GriXUPfne4GHOEA9DXVZluJg4/ZdvJeWxes/pbN4zRaqlS/F5cc04pwuqlxf3Ll773wev9vMrgG+JPQy8EV3n2Vm9wBp7j4KuAl4zsz+TKhdvtDd1d5KsZQTngL1tQnpfDdvFXFm9GtRm/O7J3NUo+oathclLOg2yszKuPv2/O4TaampqZ6WllaYlyx0s5dt5N+fz2HcgjUkVivLLSc0Z1DbuvrPKVIAzGyKu6cGHceRMLPT3H3kER6bAnyyt4hnXrftqzi0yVK8zF2xkVcnpPPhtGy27txDh6Qq/Kl7MgNaayx1QSsq7bGZdQYy3X1FePlPwGlAOnCXu68LIi61xxJrNmzdxbtTMnn9p3SWrt1KjQqlGdolkXO6JlG3cl5Ga8mROpL2OPAeGLkTE+H5qmuTKy53zyjs5EVx0bJeJV67pCtj56/mX5/N4bq3pvHCuMXcOqAF3RtVDzo8EYken5jZOUAKf2yf7zncE5lZXXdfHl48BZgZkQhFioBde3L4atZKXpmwlElL1lG6RByD29XjT91TaJOgsdTy/zxLeFYQMzsa+A9wLdCeUO+00wOLTCQGzF62kdd+WsoH07LZviuH1OSq/LlfUwa0rkupEpoCNVoFnsDYKzx9053ASmBv5WMH2gYWVDFxdNOa9Ghcgw+mZfPQV/MY+txP9G5Wk1sHNKd5nUqHPoGIxLqPgA3AFGBHXg8ys7eA3kANM8si1Mb3NrP2hNr3pcDlEY5VJOqs2byDtyZm8MbEDFZs3E5C1bLcNqA5Z6YmUrV8qaDDk+gVn6uXxVnA8HBvuJFm9nNwYYkUXb8lkscvZdLSdb8V5Ty/ezKt6imRXBRETQIDuB5o5u5rgw6kOIqPM07vlMBJbevyyvilPPn9QgY8No5TOyRw4/FNqV9F3adEirEEd+9/uAe5+9D9rH4hAvGIFAk/Z/7KK+OX8un05ezck0OvJjW47+TW9Glei3gV5ZRDizezEu6+m1ChzWG5tkXTM7xI1NtfIvn2gaFEcpVySiQXJdHU+GUSesMnASpTMp7Lj2nEWZ0TeWr0Il4ev5SPpy/jwqNSuPKYRnpTJFI8jTezNu4+I+hARKLdzt05fDZjOS+NX8ovmb9SoXQJzumaxHndkmlcq0LQ4UnR8hYwxszWANuAcQBm1hg9M4vkyfSsX3l5/FI++UWJ5FgReALDzG4Mf1wMjDazT8nVRdndH97vgVKgqpQrxe0DW3DBUSk8/NV8nhu3mLcmZXDFMY24qEcK5UoF/qMjIoWnJ3ChmS0h1D4b4O6uIX4iYas2beeNnzJ4c1IGqzftoGGN8tw1KDTlXsUymnJPDp+7/9PMvgXqAl/lmh0kjlAtDBHZj117cvh85gpe/nEJUzN+pXypeIZ2SeT87ilKJMeAaPgrtGL4e0b4q1T4S6JA/SpleejMdgw7uiEPfjmPB7+cx8vjl3LdcU04u3MiJeNV4EakGBgQdAAi0eqXzF956cclfDpjObv2OH2a1eTCHg3o1bgGcXq7J/nk7j/tZ938IGIRiXZrN+/gzYkZvD4xnZUbd5BSvRx3nNSS01MTqKREcswIPIHh7ndH4jzhGUzSgGx3P2k/288E7iJUOO4Xdz8nEtctLprVqcjzF6SStnQd938xl398OJMXxi3mz/2aMqhtPT2kicQwd083s55AE3d/ycxqAnqFIcXWrj05fDFzBS+F3+5VKF2Cc7smc8FRKTSoUT7o8EREipVZyzbw0o9LGfXLMnbuDg0T+c+pbTmmaU39jRKDAk9gHIyZDXP34Xnc/XpgDvD/ps0wsybAbUAPd19vZrUiGGaxkppSjRGXd+f7eat44It5XP/2zzwzZjG3nNCUPs1qYaZGQiTWmNmdQCrQDHgJKAm8DvQIMi6RwrZ+y07enJTBaxPSWbFxO8nVy3HnoJacrmEiIiKFak+O8/XsFbz4Y2ha6rIl4zkzNYELj0qhca2Khz6BFFlRncAgNM760DuZJQAnAv8EbtzPLpcBT7r7egB3XxWxCIshM+PY5rXp3bQWH09fxsNfz+fil9NITa7KX/o3p0uDakGHKCKRdQrQAZgK4O7LzExPB1JszF+5iZd+XML7U7PZsTuHno1r8M9TWtOnWS293ZNCYWa1gc7hxUl6lpXiauP2XYyYnMnL45eStX4b9auEZhM5KzWJyuWUSC4Ooj2BMTWP+z0K/IXf62nsqymAmf0IxAN3ufsX++5kZsMIT1GVlJR0uLEWO3FxxpD29RnYpi7vTM7kf98u4MxnJ3BM05rcfHwz2iRoLmWRGLHT3d3MHMDM1EdeYl5OjjNm/mpe/HEJ4xasoXSJOE7tmMBFPVJoWlv5Oyk84WHQDwKjCb3ce9zMbnH39wINTKQQLV2zhZfHL+XdtEy27NxDl5Rq/G1gC/q1rE0J1eQrVqIugWFmLYGh4a9fCXVbPtj+JwGr3H2KmfU+wG4lgCZAbyABGBueEvDX3DuFh6sMB0hNTXUkT0rGx3Fet2RO65jAqxOW8vSYRQx64gf6t6rDjcc31YOeSNE3wsyeBaqY2WXAxcBzAcckUiC27tzNyKnZvPTjEhav3kLtSqW55YRmDO2SRDVNJS7B+BvQeW+vi3Adom8AJTAkprk7Exav5cUflvDt3FWUiDMGtavHxT0a0Lq+XpQWV1GRwDCzFH5PWuwCkoFUd1+ah8N7AIPNbCBQBqhkZq+7+3m59skCJrr7LmCJmc0nlNCYHLm7kLKl4rn8mEYM7ZrEC+OW8MIPS/hy9gpObl+f649rQooKm4kUSe7+XzPrB2wkVAfjDnf/OuCwRCJqxYbtvDJhKW9OzGDDtl20S6jMY2e3Z2CbuppxS4IWt8+QkbWEplIViUk7d+fw8S/LeOGHJcxevpFq5UtxbZ/GnNctmVqVygQdngQs8ASGmU0gVHjzbeA0d19gZkvymLzA3W8jVKCTcA+Mm/dJXgB8SCg58pKZ1SA0pGRxJOKX/69SmZL8uV9TLjgqhWfHLOKVCaGqwGemJnDNsU2oX6Vs0CGKyGEwsxuBd5S0kFg0I2sDL/ywmE+mLyfHneNb1uHSXg3olFxVhaklWnxhZl8Cb4WXzwI+DzAekQKxbstO3vgpnVd/Smf1ph00qVWB/5zahpM71KdMyfigw5MoEXgCA1gJ1AdqAzWBBYSmOs0XM7sHSHP3UcCXwPFmNhvYA9zi7mvzew05uGrlS3HbwBZc0rMBT3y/kLcmZTBySjZnd0nk6j6Nqa0MqkhRURH4yszWAe8A77r7yoBjEjliOTnOt3NX8fy4xUxcso7ypeL5U/cULuqRQmK1ckGHJ/IH7n6LmZ0K9AyvGu7uHwQZk0gkLVq9mRd/WMLIqVls35XD0U1r8t8zGnB0kxpKJMv/Y+7Bl3ows8rAqYR6STQBqgAnuPukoGJKTU31tLS0oC4fk7J/3cYT3y3g3bQs4uOM87olc2XvRtSoUDro0EQKnJlNcfeD1vSJdmbWltCbv9OALHfvW1jXVpsskbBt5x5GTs3ixR+WsHjNFupVLsNFPRpwVpdEKmka1GKjqLXHZna/u//1UOsKi9pjiQR3Z+KSdTw/bjHfzFlFqfg4TulQn0t6NVD9vGLkSNrjaOiBgbtvAF4iNMSjFnAm8IiZJbl7YrDRSaTUr1KWf5/aliuPacxj3y7gpR+X8ObEDC44KoVhRzdUcTSR6LcKWEFo/HWtgGMRybPVm3bw2oSlvPZTOuu37qJtQmX+N7QDA1rXUX0LKQr6AfsmKwbsZ51I1Nu1J4fPZizn+XFLmJG9gWrlS3HdcU04v1syNSvqpaYcWlQkMHILFyl6AnjCzJKDjkciL6l6OR46sx1X9WnEY98s4Nmxi3htwlIu7JHCZb0aUqWcEhki0cTMriKUWK4JvAtc5u6zg41K5NAWrtrMCz8sZuTUbHbtyaFvi9pc1qshnVNU30Kin5ldCVwFNDSz6bk2VQR+DCYqkSOzecdu3p6UwUs/LiX71200rFGef57SmtM6Jqi+hRyWwBMYZnaXu9+1v23unn6ofaToalSzAv8b2oFrj23Mo98u4KnRi3hlfDoX9Ujh0p4NqVxO3XlFokQicIO7/xx0ICKH4u5MWrKO4WMX8+3cVZQuEcfpnRK4tGcDGtasEHR4IofjTULFOv8N3Jpr/SZ3X5eXE5hZf+AxIB543t3/s599zgTuIlSD7hd3PyefcYv8ZsWG7bw0PtTretP23XRpUI27B7fi2Oa1iItTIlkOX+AJDOBSM9t4kO0GnE2oYZUY1KR2RZ48pyPzVmzisW/n8/h3C3n5x6Vc1LMBl/RooESGSMDc/TYzizezeuT6veHuGQGGJfIHe3KcL2auYPjYRfySFeqWfP1xTTi/e7JqLUmRFB5ivYFQjbjDZmbxwJOEhqBkAZPNbFTuHnRm1oTQbH493H19eCi3SL7NW7GJ4WMXM+qXbPbkOAPa1OWyXg1pn1gl6NCkiIuGBMZzhLrCHWofiXHN6lTkqXM7MXvZRv737QL+9+0CXvphCRf1SOES9cgQCYyZXUMoibwSyAmvdqBtUDGJ7LVt5x7em5LJ8z8sIX3tVpKrl+Pek1tzescEypZSt2Qp1roAC919MYCZvQ0MAXIPAbwMeNLd18NvQ7lFjoi789PidQwfu4jv562mbMl4zumSxCU9G5JUXTM8SWQEnsBw97uDjkGiS8t6lXjm/E7MWR5OZHy3kJd+XMpFPVK4uGcD1cgQKXw3AM00/bREk3VbdvLqhKW8OiGddVt20j6xCrf2b87xreoQr27JIgD1gcxcy1lA1332aQpgZj8SGmZyl7t/se+JzGwYMAwgKSmpQIKVomtPjvPlrBU8OybUA656+VLc2K8p53dLpqqK9EuEBZ7AEDmQFnUr8fR5f0xkvPjjUi44KplLemrWEpFClEmoG7NI4DLXbeWFH5bwzuRMtu3aQ98WtRh2dCMV5pSYZWbXAq/v7SURYSWAJkBvIAEYa2Zt3P3X3Du5+3BgOISmUS2AOKQI2r5rD+9NyeK5cYtJX7uVlOrlVJhTCpwSGBL19iYy5q7YyOPfLeSp0Yt46celnN89mct6NdTYZpGCtxgYbWafAjv2rnT3h4MLSYqb2cs28uzYRXwyfTlxBkPa1+fyoxvSpPahRqGKFHm1CdWvmAq8CHzp7nlJImQTKsK8V0J4XW5ZwER33wUsMbP5hBIak/MftsSqDVt38dpPS3l5/FLWbN5Ju4TK3HpuR/WAk0IRNQkMM6uu7slyMM3rVOLJczqyYOUmnvh+Ic+NXcyr49M5t2sSw45uSK1KZYIOUSRWZYS/SoW/RAqFuzNxyTqeHr2IMfNXU75UPBeHhxPWrVw26PBECoW7/93M/gEcD1wEPGFmI4AX3H3RQQ6dDDQxswaEEhdnA/vOMPIhoSKhL5lZDUJDShZH+BYkRqzYsJ0XfljMmxMz2LJzD8c0rckVxzSiW8Nq6gEnhSZqEhjAT2b2M/AS8HkeM8tSDDWpXZHHzu7Adcc14cnvFvLij0t49ad0hnZO5PJjGlGvih5qRSJJtYqksOXkON/MWcnTYxYxLeNXqpcvxc3HN+X8bikq6CzFkru7ma0AVgC7garAe2b2tbv/5QDH7A4XYf6SUH2LF919lpndA6S5+6jwtuPNbDawB7hFLxRlX4tWb2b4mMW8Py2LPTnOSW3rccUxjWhZr1LQoUkxZNGSJ7BQ2q4vcDHQGRgBvOzu84OIJzU11dPS0oK4tBympWu28PToRYycmoUZnN4pgSuPaaxqxxJVzGyKu6cGHcfhMLNH3f0GM/uY0Kwjf+DugwsrFrXJxcOuPTl89PMynhmziIWrNpNYrSzDjm7EGZ00nloip6i1x2Z2PfAnYA3wPPChu+8yszhggbs3Ksx41B4XH9OzfuXp0Yv4YtYKSsXHcVbnRC7r1ZDEanrGlsg4kvY4anpghHtcfA18bWZ9gNeBq8zsF+BWd58QaIAStVJqlOf+09ty7XGNeWbMIkZMzmJEWhZD2tfjqt6NaVyrQtAhihRVr4W//zfQKCTmbd+1h3cmZzJ87GKyf91G8zoVeezs9pzYpi4l4uOCDk8kaNWAU909PfdKd88xs5MCiklilLszYfFanh69iHEL1lCxTAmu7t2YC3ukqO6cRIWoSWCYWXXgPOB8YCVwLTAKaA+8CzQILDgpEhKqluO+k9tw7bFNeHbMYt6clM4H07IZ0LoOV/dpTKt6lYMOUaRIcfcp4e9jgo5FYtPG7bt4bUI6L/24hDWbd5KaXJV7T25Fn2a1NJ5a5HcN901emNlr7n6+u88JKiiJLTk5zrdzV/HU6IVMy/iVGhVKc+uA5pzbNYmKZTR0T6JH1CQwgAmE3vad7O5ZudanmdkzAcUkRVDtSmW4Y1BLru7TKFQfY3w6n81YwbHNa3F1n8Z0Sq4adIgixYKZvQicBKxy99bhddWAd4AUYClwZgFNDShRbO3mHb+1z5t27OaYpjW5uk9jujSoFnRoItGoVe4FM4sHOgUUi8SY3Xty+HTGcp76fhHzVm4ioWpZ7j25tYbuSdSKpgTG3919RO4VZnaGu7/r7vcHFZQUXdUrlOaWE5oz7OhGvDp+KS/+uITTnh5Pt4bVuLpPY3o2rqE3fCIF62XgCeDVXOtuBb519/+Y2a3h5b8GEJsEYPmGbQwfu5i3JmWwY3cOA1vX5crejWhdXz3kRPZlZrcBtwNlzWzj3tXATmB4YIFJTNi5O4f3p2bx9JhFpK/dSpNaFXjkrHYMaltPQ/ckqkVTAuNWQoU7c7uN0PARkSNWuWxJrj2uCRf3bMBbkzJ4btxizn9hEm0TKnNV78Yc37I2cZqzWiTi3H2smaXss3oI0Dv8+RVgNEpgxLz0tVt4Zswi3puShTuc3KE+V/ZuRKOaqlEkciDu/m/g32b2b3e/Leh4JDZs27mHtydnMHzsYpZv2E6b+pV55rxOeh6WIiPwBIaZDQAGAvXN7H+5NlUiNE2USESUL12CS3s15PzuyXwwNZunxyziiten0LhWBa44phFD2tejpDLOIv+PmaUCfwOSCf3eMEK1l9sewelqu/vy8OcVQO2DXHcYMAwgKSnpCC4lQVu4ahNPfr+IUb8sIz7OOLtzEsOOVgV7kbwws+buPhd418w67rvd3acGEJYUUZt37Ob1n9J5ftxi1mzeSZeUavzntLYc3UQ9kqVoCTyBASwD0oDBwJRc6zcBf87rScLjAdOAbHffb0VmMzsNeA/o7O6a/6mYKl0inrO7JHF6pwQ+m7mCp75fyM3v/sIjX8/n0l4NOKtzIuVKRcN/DZGo8QZwCzADyInUSd3dzeyAc3m7+3DC3aRTU1OjY85vyZPZyzby5PcL+WzmcsqUiOfiHilc1qshtSqVCTo0kaLkRkJJ3If2s82BYws3HCmKNmzbxcs/hoZSb9i2i6Ob1uQa1RySIizwv9Lc/RfgFzN7w93z0+PiemAOoZ4b/4+ZVQzvMzEf15AYUiI+jsHt6jGobV1Gz1vN06MXcffHs/nftwu48KgGXHBUMlXKlQo6TJFosNrdR0XoXCvNrK67LzezusCqCJ1XosAvmb/y+HcL+WbOSiqWDk29d3HPBlQrr7ZU5HC5+7Dw9z5BxyJFz7otO3nhh8W/FUvu26I21xzbmPaJVYIOTSRfAk9gmNkIdz8TmLa/N3F56aJsZgnAicA/CWWr9+de4H5CbxFFfmNm9Gleiz7Na5G2dB1Pj17EI9/M59mxixjaJYlLejagXpWyQYcpEqQ7zex54Ftgx96V7v7+EZxrFHAB8J/w948iEqEEakr6ev737QLGzF9N5bIlubFfUy44KoXKZTX1nkh+mdnVwBvu/mt4uSow1N2fCjQwiUprNu/gubGLee2ndLbt2sPA1nW5uk9jWtbb7ztekSIn8AQGoV4REJpq70g9CvwFqLi/jeFxg4nu/qmZHTCBofHWkppSjRcurMbcFRt5dsxiXh6/lFfGL2VI+/pcfkxDmtbe74+YSKy7CGgOlOT3ISQOHDSBYWZvESrYWcPMsoA7CSUuRpjZJUA6cGYBxSyFYPLSdTz2zQJ+WLiGauVL8df+zTm/ezIVSkfD44VIzLjM3Z/cu+Du683sMkAJDPnNqk3bGT5mMa9PTGfn7hwGtavHNX0a00TPrhJjAn/CyFXMLQ5Y7u7bAcysLAcp7raXmZ0ErHL3KWbWez/b44CHgQvzEIvGWwsAzetU4pGz2nPT8U15ftwS3pmcycipWRzXvBZX9G5EanJVFTyS4qSzuzc73IPcfegBNh2Xz3gkYD8tXstj3yxgwuK11KhQitsHNue8bsmqHyRSMOLNzNzd4be6bxqXJQCs3Lidp0cv4q1JGezOcYa0r8fVfRprlieJWdH0pPEucFSu5T3hdZ0PcVwPYLCZDQTKAJXM7HV3Py+8vSLQGhgd/oOzDjDKzAarkKccSkLVctw1uBXXH9eEVyek8/L4JZzxzAQ6JFXh8qMb0a9lbeI15ZTEvvFm1tLdZwcdiARrwqK1PPrNfCYuWUfNiqX5x0ktOadLEmVLxQcdmkgs+wJ4x8yeDS9fHl4nxdiKDdt5Zswi3pyUwZ4c57SO9bmqd2NSapQPOjSRAhVNCYwS7r5z74K77zSzQ2aXw/Ni3wYQ7oFxc67kBe6+Aaixd9nMRof3UfJC8qxq+VJc37cJw45uyIi0TJ7/YTFXvD6FBjXKc1mvhpzasT5lSuoBXmJWN+BnM1tCqAZGfqZRlSIod+KiVsXS3DmoJUO7JKndEykcfyWUtLgyvPw18Hxw4UiQcicucnKc0zslcHWfxpqeWoqNaEpgrA73ihgFYGZDgDVHejIzuwdIi2DlfBHKlorngqNSOLdrEl/MWsGzYxZz+wczePjreVzQPYXzuiVTVdX2Jfb0DzoACca+iYu7BrXkbCUuRAqVu+cAT4e/pJjaO1REiQsp7qIpgXEF8IaZPUHo7V4m8KfDOYG7jwZGhz/fcYB9eucnSBEITcF6Utt6nNimLhMWr+XZMYt56Ov5PDV6EWemJnBJz4YkVdcvFIkZqglUzExaso5Hvp7PhMVrlbgQCZiZNQH+DbQkNFwaAHdvGFhQUmhWbQolLt6YqMSFCERRAsPdFwHdzKxCeHlzwCGJHJKZcVSjGhzVqAZzV2zk+XFLeHNSBq/9lM6A1nW57OiGmm9bYsGnhJIYRujhuQEwD2gVZFASeVPS1/HI16FZRWpUKM0dJ7XknK5KXIgE7CVCszg9AvQhNDNUXKARSYFbvWkHz45ZxOsT09m1J1Tj4tpjmyhxIcVe1CQwAMzsREIPxGX2zvDg7vcEGpRIHjWvU4n/ntGOm49vxsvjl/LGxHQ+nbGczilVubRXQ/q2UMFPKZrcvU3u5fDU1FcFFI4UgJ8zf+Xhr+czdv5qqpcvxd9PbMG5XZNVnFMkOpR192/DM5GkA3eZ2RRgv72NpWhbt2Unz45dxKvj09mxew+ndEjg2mNVnFNkr6hJYJjZM0A5Qpnl54HTgUmBBiVyBOpULsOtA5pzzbGNeWdyJi/+sITLX5tCSvVyXNKzAad1StBUg1KkuftUM+sadBySf7OWbeCRr+fzzZxVVC1XklsHNOdP3TUdqkiU2WFmccACM7sGyAbyNEemmfUHHgPigefd/T8H2O804D1C02ar0H0ANmzbxfPjFvPiD0vYumsPg9vV4/rjmtBQ06GK/EE0PaEc5e5tzWy6u99tZg8BnwcdlMiRqlC6BJf0bMAF3ZP5YtYKnhu3hH98NIuHvp7PuV2TuKB7CrUqlTn0iUQCZmY35lqMAzoCywIKRyJg/spNPPL1fD6fuYJKZUpw8/FNubBHAyqUjqbHAhEJu57QS77rgHuBY4ELDnWQmcUDTwL9gCxgspmN2ndKbDOrGL7GxAjHLXmwafsuXvpxKc+NW8ym7bs5sU1dbujbhCa1KwYdmkhUiqYnlW3h71vNrB6wFqgbYDwiEZG74OeU9PU8N24xT41exPCxixnUrh6X9GxAq3qVgw5T5GByP0XtJlQTY2RAsUg+LF2zhUe+mc+oX5ZRvlQJrju2MZf0akjlsiWDDk1EDsDdJwOEe2Fc5+6b8nhoF2Chuy8OH/82MASYvc9+9wL3A7dEJmLJi2079/DqhKU8M2YR67fuom+L2vy5XxM9E4ocQjQlMD4xsyrAg8BUQgXjngs0IpEIMjNSU6qRmlKNpWu28PL4pYxIy+T9qdl0b1idS3o24NjmtYhTnQyJMu5+d9AxSP4s+3Ub//t2Ae9OyaJkvDHs6IZccXQjTfssUgSYWSqhQp4Vw8sbgIvdfcohDq1PaFa/vbKAPwz/C9c0SnT3T83sgAkMMxsGDANISko67HuQ3+3cncPbkzN4/LuFrN60g15NanDT8c1U9F0kj6ImgeHu94Y/jjSzT4Ay7r4hyJhECkpKjfLcNbgVf+7XlLcnZfDy+KVc+moaDWqU56IeKZzWMYHy6sotATOzR939BjP7mP1MperugwMISw7D6k07ePL7hbw5MQOA87slc1WfRtSqqOFrIkXIi8BV7j4OwMx6EkpotM3PScM9Oh4GLjzUvu4+HBgOkJqaqqm1j8DuPTm8Py2bx75ZQPav2+iSUo0nhnaga8PqQYcmUqREzV9IZlaGUFX7noQelH8ws6fdfXuwkYkUnMplS3L5MY24uGcDPp+5ghd+WMIdH83iv1/OY2iXJP50VAr1q5QNOkwpvl4Lf/9voFHIYduwbRfDxy7ixR+WsnNPDqd3TOC6vk3UnogUTXv2Ji8A3P0HM9udh+OygcRcywnhdXtVBFoDo8Oz/9UBRpnZYBXyjJycHOfzmSt46Ot5LF69hbYJlfnXqW04ukkN9s66KCJ5FzUJDOBVYBPweHj5HEIPz2cEFpFIISkZH8fgdvUY3K4eU9LX8+KPS3j+h9BX/9Z1uLhHCh2TquoXnRSqvd2T3X1M0LFI3mzbuYeXxi/hmdGL2Lh9N4Pa1ePGfk1poOn3RIqyMWb2LPAWoZd8ZxFKOnSE0MxQBzhuMtDEzBoQSlycTej5mvBxG4Aae5fNbDRws5IXkeHujJm/mv9+NY+Z2RtpUqsCz5zXiRNa1dbznEg+RFMCo7W7t8y1/L2Z7VtkSCTmdUquSqfkqmT/uo1Xxy/lrUkZfDp9OW0TKnNxjwYMbFOXUiXigg5TihEz6wHcBSQT+r1hgLt7wyDjkt/t3J3DO5Mz+F94TPWxzWtx8/HNaFmvUtChiUj+tQt/v3Of9R0IJTSO3d9B7r47PO3ql4SmUX3R3WeZ2T1AmruPKqiAi7sp6eu4/4t5TFqyjoSqZXnojHac3KE+8apzJpJv0ZTAmGpm3dz9JwAz6wooAyzFVv0qZbltYAuuO64J70/L5uUfl3DDOz/zr8/mcF63ZM7pmkSNCqWDDlOKhxeAPwNTgD0BxyK55OQ4H09fxkNfzSdj3Va6pFTjqXM70jmlWtChiUiEuHuffBz7GfDZPuvuOMC+vY/0OhIyb8UmHvxyLt/MWUWNCqW5e3Arzu6SSOkS8UGHJhIzoimB0QkYb2YZ4eUkYJ6ZzSD0pi9fhYpEiqrypUtwfrdkzu2SxNgFq3npx6U8/PV8nvh+IYPb1ePCo1JoXV9TbkmB2uDunwcdhPxub9fkB76Yx+zlG2lRtxIvXdiZ3s1qqmuySAwysxOBVsBvFXjd/Z7gIpLcstZv5ZGvF/D+tCwqlCrBzcc35eKeDShXKpr+1BKJDdH0v6p/0AGIRLO4OKN3s1r0blaLhas288r4pYycmsV7U7LonFKVC49qwPGtalMyXsNLJDL2jq8mNKTvQeB9YMfe7QcZdy0FaFrGeu7/Yi4/LV5HYrWyPHpWewa3q6cpmEVilJk9A5QD+gDPA6cDkwINSgBYt2UnT36/kNcmpIPBpT0bcFXvxpqiWqQARU0Cw93TAcysFn/MLmcc8CCRYqpxrQrce3Jrbj6hGe+mZfLqhHSufnMqdSuX4bxuyZzdOZHqGl4i+ffQPsupuT4fcNy1FIzFqzfz4Jfz+HzmCmpUKMXdg1sxtEuSauKIxL6j3L2tmU1397vN7CFAveICtG3nHl74YTHPjlnMlp27Oa1jAjf0a6qZnkQKQdQkMMxsMKGH5XrAKkLF4uYQ6i4nIvtRuWxJLu3VkIt6NOD7uat4efxSHvxyHo99u4BBbUPDS9okaHiJHJm9467NrKG7L869zcxUwLOQrNq0nce+WcDbkzMpUyKOG/o24dJeDalQOmp+hYtIwdoW/r7VzOoBa4G6AcZTbO3ek8O7U7J45Ov5rNq0g74tavPX/s1oUrti0KGJFBvR9PRzL9AN+MbdO5hZH+C8gGMSKRLi44y+LWvTt2VtFq7axCvj0xk5NYuRU7PomFSFC45KYUBrzV4iR+w9oOM+694lVLtICsjmHbsZPnYxz49bzM7dOZzbNYlrj21CzYrqXSVSzHxiZlWAB4GphHrAPR9oRMWMu/P17JU88OU8Fq7aTMekKjypgskigYimBMYud19rZnFmFufu35vZo0EHJVLUNK5VkXtPbs0t/ZvxXloWr/2UzvVv/8x9FecwtEsS53ZNonalMoc+kRR7ZtacUC+4ymZ2aq5Nlcg11E8ia9eeHN6enMlj38xnzeadnNimLjef0IwGNcoHHZqIBMDd7w1/HGlmnwBl3H1DkDEVJ1Mz1vPvz+Yweel6GtYszzPndeKEVrVVMFkkINGUwPjVzCoAY4E3zGwVsCWvB5tZPKFpV7Pd/aR9tt0IXArsBlYDF++tuSESqyqVKcnFPRtw4VEpjF2wmlcnpPP4dwt46vuFnNCqDn/qnkyXBtX0C1gOphlwElAFGJRr/SbgsiACimXuzlezV3L/F3NZvHoLXRpU4/kLWtA+sUrQoYlIgMzsauANd//V3XeYWTkzu8rdnwo6tliWvnYLD3wxj09nLKdGhdLcd3Jrzu6cSAkVSxcJVDQlMIYQGuP3Z+BcoDJwONNDXU+oZkal/WybBqS6+1YzuxJ4ADgrf+GKFA25Zy/JWLuV1yem887kTD6dsZzmdSpyXrdkTulQn/IaTy/7cPePgI/MrLu7Twg6nlg2LWM9//5sLpOWrqNRzfI896dU+raopQSjiABc5u5P7l1w9/VmdhmgBEYBWL9lJ//7bgGv/5ROibg4rj+uCcOObqjnJJEoEfj/RDNrDNR29x/Dq3KAV8ysJ6G3fmvzcI4E4ETgn8CN+2539+9zLf6EamtIMZVUvRy3D2zBn/s2ZdQv2bwyPp2/fziT+z+fy2mdEjivWzKNa1UIOkyJEmb2F3d/ADjHzIbuu93drwsgrJiSuW4r938xl0+mh97w/fOU1pyVqjd8IvIH8WZm7u7wW69jzdMZYdt37eGV8Ut54vuFbNmxm7M6J/Lnvk2ppWG3IlEl8AQG8Chw237WbwhvG7Sfbfs7x1+AvJQAvgRNPSXFXNlS8ZzVOYkzUxOZmvErr01YypsTM3h5/FJ6NK7O+d2S6duitv6Ikjnh72mBRhGDNmzbxVPfL+SlH5cSFwfXHduYYcc00swiIrI/XwDvmNmz4eXLw+skAtydT6Yv5/4v5pK1fht9mtXktoEtaKqZRUSiUjQ8KdV29xn7rnT3GWaWcqiDzewkYJW7TzGz3ofY9zwgFTjmANuHAcMAkpKSDhm4SFFnZnRKrkqn5Kr8/aQdvDM5kzcnZnDF61OpU6kMZ3dJZGgXFf0srtz94/D3VyJ9bjNbSqiWxh5gt7unRvoa0WjXnhzenJjBo9/M59dtuzitYwI3H9+MOpX1f0xEDuivhJ5Prwwvf41mIYmIKenrue/T2UzL+JXmdSry+iVd6dmkRtBhichBREMCo8pBtpXNw/E9gMFmNpBQVfxKZva6u/9hmIiZ9QX+Bhzj7jv2dyJ3Hw4MB0hNTfU8XFskZtSoUJqr+zTmimMa8f3cVbz2UzqPfrOAx79byPEta3N+t2S6N6quMfnFiJl9TGi6vv1y98H5vEQfd1+Tz3MUCe7Ot3NW8a/P57B49Ra6N6zO305sQev6lYMOTUSinLvnAM+EvyQCMtdt5T9fzOXT6cupVbE0D5zWltM6JRAfp2cckWgXDQmMNDO7zN2fy73SzC4FphzqYHe/jfAQlHAPjJv3k7zoADwL9Hf3VRGKWyQmxccZfVvWpm/L2qSv3cKbEzN4Jy2Tz2euoGHN8pzbNZnTOyZQuVzJoEOVgvffoAOIBXNXbOS+T+bww8I1NKxRnuf/lMpxKtApIlLoNm3fxVOjF/HCD0uIM7juuCZcrgKdIkVKNPxvvQH4wMzO5feERSqh4kSnHOlJzeweIM3dRwEPAhWAd8MPjBkReHMoEvOSq5fntoEt+HO/pnw6fTmvT0zn3k9m88AXcxnUrh7ndUumXUJl/SEWo9x9TEGeHvjKzBx4NtwD7g+K+rC+NZt38PDX83l7UgYVy5TkzkEtOa9bMiVVW0ZEpFDtyXHeTcvkv1/NZ83mHZzaoT639G9G3cp56ewtItEk8ASGu68EjjKzPkDr8OpP3f27IzjXaGB0+PMdudb3zX+kIsVXmZLxnNYpgdM6JTBr2QbemJjBh9OyeW9KFq3qVeLcrskMaV9PbzDkcPR092wzqwV8bWZz3X1s7h2K6rC+Hbv38PKPS3niu4Vs27WHP3VP4Ya+TahSTpMGiEjemdlr7n6+mV3v7o8FHU9RNX7RGu79ZA5zlm+kU3JVnr8glfaJVYIOS0SOUNT8tRGe6vT7Q+4oIoFqVa8y/zqlDbcNaM6H07J5Y2IGt38wg399Noch7etxbtdkWtarFHSYEuXcPTv8fZWZfQB0AcYe/Kjo5u58M2cV9306m/S1W+nTrCZ/O7GlpiYWkSPVyczqAReb2avAH7o7uvu6YMIqGjLXbeWfn87hi1krqF+lLI8P7cBJbeuq16hIERc1CQwRKVoqlinJ+d1TOK9bMlMzfuWNiem8NyWLNyZm0D6xCud0TWJQ23qULRUfdKhyhArq7Z+ZlQfi3H1T+PPxwD2ROn8Q5q/cxL2fzGbcgjU0qlmely/qTO9mtYIOS0SKtmeAb4GGhIZZ5/7L28PrZR9bduzmqdELeW7cEuLNuKlfUy47uiFlSup5RCQWKIEhIvmSeyrWO05qyftTs3ljYjp/eW86934ym1M71Gdo1ySa11GvjCKooN7+1SZU+whCv4fedPcv8hVpQH7dupNHvp7P6xMzKF8qXnUuRCRi3P1/wP/M7Gl3v/KQB+yHmfUHHgPigefd/T/7bL8RuBTYDawGLnb39PxFHoycHOeDadnc/8VcVm3awSkd6vPX/s01TbVIjFECQ0Qipkq5UlzcswEX9Uhh0pJ1vDUpg7cmZ/LKhHQ6JlVhaJckTlKvjKKkQN7+uftioF2+owvQnhznzUkZPPTVPDZu28U5XZO4sV8zqpVXnQsRiSx3v9LM2gG9wqvGuvv0Qx1nZvHAk0A/IAuYbGaj3H12rt2mAanuvtXMrgQeAM6K7B0UvF8yf+XOUbP4OfNX2iVW4ZnzO9ExqWrQYYlIAVACQ0Qizszo2rA6XRtW584tOxk5NYs3J2Vwy3vTueeT2ZzSoT5nd05SrYwoF4m3f7Fo0pJ13DlqFnOWb6Rrg2rcNbgVLerqZ1lECoaZXUdoRqb3w6veMLPh7v74IQ7tAiwMJ40xs7eBIcBvCYxwDbq9fgLOi1jghWDN5h08+MU8RkzJpHr50jx4eltO65hAXJzqXIjEKiUwRKRAVS1fikt7NeSSng2YuGQdb0/K4O3Jmbw6IZ12iVU4p0siJ7XVDCbR7Ejf/sWaFRu286/P5jDql2XUq1yGJ87pwIltVBBORArcpUBXd98CYGb3AxOAQyUw6gOZuZazgK4H2f8S4PN8xFlodu3J4dUJ6Tz6zXy27dzDZb0acu2xjalYpmTQoYlIAdNfDCJSKMyMbg2r061hde7aupP3p2bz1qQM/jpyBvd+ModB7eoxtEsibepX1h+EUSYfb/9iws7dObzwwxIe/24Bu3Oc645tzBW9G1GulH6FikihMGBPruU97FOTKN8XMDsPSAWOOcD2YYR+D5CUlBTJSx+28YvWcOdHs1iwajO9mtTgzkGtNNuTSDGipy8RKXS5a2VMSV/PW5My+WBaFm9NyqBl3Uqc3SWRIe3rU7ms3qREiSN9+1fkjZ2/mrtGzWLxmi30a1mbf5zYkqTq5YIOS0SKl5eAieEppwFOBl7Iw3HZQGKu5YTwuj8ws77A34Bj3H3H/k7k7sOB4QCpqame58gjaPmGbfzz0zl8Mn05CVXLMvz8TvRrWVsvPUSKGSUwRCQwZkZqSjVSU6pxx6CWjPplGW9PyuCOj2bxr8/mMLB1Xc7qnEiXBtX0gBKsAn/7F22yf93GvR/P5otZK0ipXo6XLupMH02LKiIBcPeHzWw00DO86iJ3n5aHQycDTcysAaHExdnAObl3MLMOwLNAf3dfFbmoI2fn7hxe/HEJ//s21Avu+uOacGXvRpoWVaSYUgJDRKJC5bIlOb9bMud3S2ZG1gbempzBqJ+X8f60bBrWKM+ZnRM5tWN9alXUdGgBONK3f0XOjt17eG7sYp74fiEAt5zQjEt7NaB0CT0oi0hw3H0qMPUwj9ltZtcAXxKaRvVFd59lZvcAae4+CngQqAC8G35RkOHugyMb/ZH7YcEa7hg1k8Wrt9C3RW3uOEm94ESKO3MPpBdY1EtNTfW0tLSgwxAp1rbu3M1nM1bwzuQMJi9dT3yccVzzWpzVOZFjmtakRHxc0CHmmZlNcffUoOM4UmbWkd/f/o3L49u/iCmMNnncgtXc+VFouMiA1nX4+0ktqV+lbIFeU0QKX1Fvj4NWGO3xig3bue/T2XwyfTnJ1ctx16BW9GmuXnAiseZI2mP1wBCRqFWuVAlO75TA6Z0SWLhqM++mZTJyahZfzV5JrYqlOb1TAmemJpJSo3zQoca8I3n7V1TkflBOqV6OVy7uwjFNawYdlohIsbN7Tw4vj1/KI1/PZ1eO8+e+Tbn8mIYaLiIiv1ECQ0SKhMa1KnDbwBbcfEIzvpu7ihGTM3lmzCKeGr2Irg2qcVbnRAa0rkvZUnrIkbzZtSeHV8IPyrtznBv7NWXY0XpQFpHoYmblgW3unmNmTYHmwOfuvivg0CJq8tJ1/OPDmcxdsYk+zWpy1+BWJFfXCwoR+SMlMESkSCkZH8cJrepwQqs6rNy4nfemZPFuWiY3jviFOz6axaB29TgzNYH2iVVU+FMOaEr6ev72wQzmrtjEsc1rcdegVhpXLSLRaizQy8yqAl8RKs55FnBuoFFFyPotO/n353MYkZZFvcpleOa8TpzQSrOLiMj+KYEhIkVW7UpluLpPY67q3YhJS9YxIi2LD6dl89akDJrUqsCZqYmc3KE+NSuWDjrUIi2W3v5t2LqL/3wxl7cmZVBXD8oiUjSYu281s0uAp9z9ATP7Oeig8svdeW9KFv/6bA6btu/m8mMacv1xTShXSn+eiMiBqYUQkSLPzOjasDpdG1bnrsEt+XT6ckakZfLPz+bwny/m0qdZLc5ITeDY5rUoWYQKf0aRIv/2z9358Ods7vtkDr9u28VlvRpwQ9+mlC+tX4MiEvXMzLoTanMvCa8r0mPdFq7axO0fzGTSknWkJlflvlNa07xOpaDDEpEiQE9uIhJTKpYpydldkji7SxILV23i3SlZvD81m2/mrKR6+VKc3KE+Z6Qm6EHp8BTpt3+LV2/m7x/OZPyitbRPrMJrp7ShZT39+4tIkXEDcBvwQXga1IbA98GGdGS279rDE98t5NmxiyhXqgT/ObUNZ6YmEhenXnAikjdKYIhIzGpcqyK3DWjBLcc3Y8z81byblsWrE5bywg9LaFO/Mqd3SmBwu3pULV8q6FCjXZF8+7dzdw7PjFnEE98vpHSJOO47uTXndEnSg7KIFCnuPgYYA2BmccAad78u2KgO348L1/C3D2awdO1WTu1Yn78NbEH1ChriKSKHJ2YSGGYWD6QB2e5+0j7bSgOvAp2AtcBZ7r600IMUkUCUiI/juBa1Oa5FbdZt2cmH07J5b0oWd46axX2fzqZvi9qckZrA0U1qUkJDTPbnBorY27/JS9dx2/szWLhqMye1rcsdg1pSq2KZoMMSETlsZvYmcAWwh9AQvkpm9pi7PxhsZHmzdvMO/vnpHN6flk1K9XK8eWlXjmpcI+iwRKSIipkEBnA9MAfYX7/gS4D17t7YzM4G7ic0fltEiplq5Utxcc8GXNyzAbOWbWDklGw+/Dmbz2euoEaF0pzSoR6nddIQk9yK0tu/3EU661cpy0sXdqZP81pBhyUikh8t3X2jmZ0LfA7cCkwBojqB4e6MnJrNPz+dzabtu7mmT2OuObaxpqoWkXyJiQSGmSUAJwL/BG7czy5DgLvCn98DnjAzc3cvnAhFJBq1qleZVvUqc+uA5nw/bxUjp2Tx0o9LeW7cElrXr8RpHRMY0r4+1Yr5EJOi8PbP3fli5gruGDWLtZt3cFmvBvy5X1NVsxeRWFDSzEoCJwNPuPsuM4vqZ9j0tVu4/YMZ/LhwLZ2Sq/LvU9vQtHbFoMMSkRgQK092jwJ/AQ7UMtYHMgHcfbeZbQCqA2ty72Rmw4BhAElJSQUVq4hEmVIl4jihVR1OaFWHtZt3MOqXZbw3JYu7P57Nvz6bQ59mtTi1Y2gWk1IliuUQk6h++7dy43b+8eFMvpq9klb1KvHShZ1pXb9y0GGJiETKs8BS4BdgrJklAxsDjegAdu/J4cUfl/Dw1/MpERfHvSe35lzVHhKRCCryCQwzOwlY5e5TzKx3fs7l7sOB4QCpqalRndkWkYJRvUJpLurRgIt6NGDuio2MnJLFB9OW8dXslVQtV5LB7UJDTNrUr4xZsXkgi8q3fzk5ztuTM/n3Z3PYuSeH2wY055KeDVTHRERiirv/D/hfrlXpZtYnqHgOZNayDdw6cgYzsjfQt0Vt7ju5NXUqq/aQiERWkU9gAD2AwWY2EChDqGvz6+5+Xq59soFEIMvMSgCVCRXzFBE5oOZ1KvG3E1vy1/7NGbdgDe9NzeKtyZm8MiGdJrUqcErH+pzcvj71qpQNOtSCFnVv/5as2cKtI6czcck6ujeszr9PbUNKjfJBhiQiUiDMrDJwJ3B0eNUY4B5gQ2BB5bJ91x4e+3YBw8cupmq5kjx5TkcGtqlTnJL8IlKIinwCw91vI1Qdn3APjJv3SV4AjAIuACYApwPfqf6FiORVifg4+jSvRZ/mtdiwbRefTl/O+1OzeOCLeTz45TyOalSdUzok0L91HSqULvLN6v8TTW//du/J4YUfQt2TS5eI4/7T2nBmaqIelEUklr0IzATODC+fD7wEnBpYRGFpS9fxl5HTWbx6C2d0SuBvJ7agSrniXTdKRApW7D1ph5nZPUCau48CXgBeM7OFwDrg7ECDE5Eiq3LZkpzTNYlzuiaRvnYLH0zL5v2p2dz87i/848OZnNCqNqd0TKBn4xrEx8iY32h5+zdvxSb+8t4v/JK1gX4ta/PPk1tTq5K6J4tIzGvk7qflWr7bzH4OKhiArTt388AX83hlwlLqVS7La5d0oVeTmkGGJCLFREwlMNx9NDA6/PmOXOu3A2cEE5WIxKrk6uW5oW9Trj+uCVPS1zNyajafTl/Ghz8vo2bF0gxpV49TOybQsl6Rn5I18Ld/qzbt4KTHx1GxTEkeH9qBk9rWVa8LESkutplZT3f/AcDMegDbggpm847dnPDoWDLXbeOC7sn8pX9zysdg70MRiU5qbURE8snMSE2pRmpKNe4c1JLv567i/WnZvDJhKc//sITmdYr81HGBv/1buXE7l7euy52DWlK9QunCvLSISNCuAF4N94YDWE9oaHQglqzZQt24OEZc3p0uDaoFFYaIFFNKYIiIRFCZkvEMaFOXAW3qsm7LTj6dvoz3p2UHHVZ+Bf72L7laOf43tENhXlJEJCq4+y9AOzOrFF7eaGY3ANODiKdmhdJ8fn0vypSMD+LyIlLMaa45EZECUq18Kc7vnsIHV/UIOpT8ugJ40syWmtlS4Ang8vyc0Mz6m9k8M1toZrceav9KZUvm53IiIkWeu290970zQN2Yl2MO1daaWWkzeye8faKZpRzqnHUql1HyQkQCowSGiIgclLv/4u7tgLZAW3fvABx7pOczs3jgSWAA0BIYamYtIxKsiEjxcMgiQHlsay8B1rt7Y+AR4P5IByoiEklKYIiISJ4cydu/A+gCLHT3xe6+E3gbGJLvAEVEig/Pwz55aWuHAK+EP78HHGeqkCwiUUwJDBERORL5ecCtD2TmWs4Kr/vjBcyGmVmamaWtXr06H5cTESl6zGyTmW3cz9cmoF4eTpGXtva3fdx9N6HpsavvJxa1xyISFSJWxNPM8lJIaLW7Hxepa4qISGDy8vYvfxdwHw4MB0hNTS3w64mIRBN3j5oprNQei0i0iOQsJPHAwINsN2BUBK8nIiIFKPyWb38PqgaUzceps4HEXMsJ4XUiIhI5eWlr9+6TZWYlgMrA2sIJT0Tk8Jl7ZJKouafYy88+0cLMVgPpQccRITWANUEHUYBi/f4g9u8x1u8PoFlhvU0zs4552G2Xu88o8GD2I/yQPB84jtDD82TgHHefdZBjYqVNLg4/67F+j7F+fxD791ho7XGQ8tLWmtnVQBt3v8LMzgZOdfczD3HeWGmPIfZ/1nV/RV+s3+Nht8cR64Gxv8SEmTUCyu19SC4qyQsAd68ZdAyRYmZp7p4adBwFJdbvD2L/HmP9/iB0j4V4uTGEHlQPVqeiAZBSKNHsw913m9k1wJeEeu+9eLDkRfiYmGiTi8vPeizfY6zfH8T+PRZyexyYA7W1ZnYPkObuo4AXgNfMbCGwDjg7D+eNifYYisfPuu6vaIv1ezyS9jiSQ0j+wMxuBxoDOWZW2t3PL6hriYjIH0x294NOc2pm3xVWMPvj7p8BnwUZg4hIrNtfW+vud+T6vB04o7DjEhE5UpEs4nkd8KS77wmvaufuZ4W35aXAp4iIRMChkhd53UdEREREJJpEchrVtcAXZjY4vPyVmX1hZl8R6romwRkedAAFLNbvD2L/HmP9/iDAezSzmmZ2n5k9ZGZNgopDAP2sx4JYvz+I/XuM9fuTvIv1nwXdX9EX6/d42PcXsSKeAGZWBrgZ6ALcQahwUEl33xCxi4iIyGExs1eB5wjNKPKIu3cOOCQRERERkcMWyR4YAI2AEcAw4GrgMfI31Z6IiBwmM/vSzI7OtaoUsDT8VTqImERERERE8itiCQwzexm4AbgTuNHdLwOeAp4zszsOcqhEkJm9aGarzGxmrnXVzOxrM1sQ/l41yBjzw8wSzex7M5ttZrPM7Prw+pi4RzMrY2aTzOyX8P3dHV7fwMwmmtlCM3vHzEoFHWt+mFm8mU0zs0/Cy7F2f0vNbIaZ/by3unIh/4yeCQwys7fCs0H9A/g3oaTyVQV4XclF7XFM3KPa5CJ+f1HQHkuUUJtctO9R7XHM3F++2+RI9sDo4O6Xufu5QD8Ad5/m7oOAXyJ4HTm4l4H++6y7FfjW3ZsA34aXi6rdwE3u3hLoBlxtZi2JnXvcARzr7u2A9kB/M+sG3E+o639jYD1wSXAhRsT1wJxcy7F2fwB93L19rqmvCu1n1N03uPstwN+A+4ArgGvc/bSiNJ11DHgZtcdF/R7VJsfG/QXWHktUeRm1yUX5HtUex8b9QT7b5EgmMD63ULfl74A3c29w948ieB05CHcfS2ge79yGAK+EP78CnFyYMUWSuy9396nhz5sI/QevT4zco4dsDi+WDH85cCzwXnh9kb0/ADNLAE4Eng8vGzF0fwdRaD+jZtbIzP4LXArcBHwIvGNm15lZfEFdV/5I7TFQ9O9RbXIRv78DiJmfUck7tclAEb5HtcdAEb+/gzisn9GIJTDc/VZC80gPdvcHI3VeiYja7r48/HkFUDvIYCLFzFKADsBEYugew13HfgZWAV8Di4Bf3X13eJcsQr+QiqpHgb8AOeHl6sTW/UHoF+pXZjbFzIaF1xXmz+hbwPvA98Br7j7O3U8AfgW+KsDryqHFTFuVW6y2x6A2maJ/f0G3xxLdYvJnIVbbZLXHRf7+IAJtciRrYJzk7htzZcb2u0+kridHxkPTzkRu6pmAmFkFYCRwg7tvzL2tqN+ju+9x9/ZAAqEZfZoHG1HkhNuAVe4+JehYClhPd+8IDCDUhTN3Qc3C+BktDSwhVLSzXK7rvgqoHY4SRb2t2iuW22NQmxwDgm6PpYiIlZ+FWG6T1R7HhHy3ySUiGMyDZpYN2EH2+RfwSQSvKXmz0szquvtyM6tLKGtZZJlZSUIN8xvu/n54dUzdI4C7/2pm3wPdgSpmViKcgU0AsoON7oj1AAab2UCgDFCJUGHJWLk/ANw9O/x9lZl9QOiXbGH+jF4JPAHsJFT/Inds2wrwunJoMdVWFZf2GNQmBxhjvkRBeyzRLaZ+FopLm6z2uOiKRJscyRoYK4GHgYcO8rUggteTvBsFXBD+fAFQZGuShMeCvQDMcfeHc22KiXs0s5pmViX8uSyhgrhzCA0FOD28W5G9P3e/zd0T3D0FOBv4zkOFf2Pi/gDMrLyZVdz7GTgemEkh/oy6+3gPFewc6u4qohxdYqKtgthvj0Ftcni3Int/0dAeS9SLmZ+FWG+T1R4DRfj+IHJtsoV6aUisMLO3gN5ADUJJpTsJFfAbASQB6cCZ7r5vEaMiwcx6AuOAGfw+Pux2QmP8ivw9mllbQsVr4gklGEe4+z1m1hB4G6gGTAPOc/cdwUWaf2bWG7jZ3U+KpfsL38sH4cUSwJvu/k8zq04h/Yya2XB3H5bffSR/1B7HxD2qTS7C9xcN7bFED7XJRfse1R4X/fuLVJusBIaISIwxs1WEftkdcBegv4emqxIRERERKRIiWQNDRESiwy152GdcgUchIiIiIhJB6oEhIiIiIiIiIlEvkkU8ATCzcmb2DzN7LrzcRNOnioiIiIiIiEh+RDyBAbwE7CA0rQ2Epnq5rwCuIyIiIiIiIiLFREEkMBq5+wPALgB330qoYJyIiATAzMoFHYOIiIiISH4VRAJjZ3huXgcws0aEemSIRJSZ1TGzt81skZlNMbPPzKzpEZxntJmlFkSMhxnHhWb2RNBxSOwws6PMbDYwN7zczsyeCjgsiUFqj0VEooPaY4l1BZHAuBP4Akg0szeAb4G/FMB1pBgzMyM0j/Bod2/k7p2A24DawUYWHDOLDzoGiTqPACcAawHc/Rfg6EAjkpij9vj/U3ssIkFQe/z/qT2OPRFPYLj718CpwIXAW0Cqu4+O9HWk2OsD7HL3Z/aucPdf3H2cmb1qZifvXW9mb5jZEDOLN7P/mtlMM5tuZtfue1IzO97MJpjZVDN718wq7Gef0WZ2v5lNMrP5ZtYrvP4PGWIz+8TMeoc/bzazB81slpl9Y2ZdwudZbGaDc50+Mbx+gZndmetc54Wv97OZPbu3MQ6f9yEz+4Xf686I/MbdM/dZtSeQQCSWqT1G7bGIRAW1x6g9jnURS2CYWce9X0AysBxYBiSF14lEUmtgygG2vUAogYaZVQaOAj4FhgEpQHt3bwu8kfsgM6sB/B3o6+4dgTTgxgNco4S7dwFuINTr6FDKA9+5eytgE6HCtv2AU4B7cu3XBTgNaAucYWapZtYCOAvo4e7tCf0Bem6u805093bu/kMe4pDiJdPMjgLczEqa2c3AnKCDkpij9vj386o9FpEgqT3+/bxqj2NUiQie66Hw9zJAKvALoeKdbQn9oCv7JYXC3ceY2VNmVpNQYzfS3XebWV/gGXffHd5v3T6HdgNaAj+aGUApYMIBLvN++PsUQo3+oewkNLQKYAaww913mdmMfY7/2t3XApjZ+0BPYDfQCZgcjqsssCq8/x5gZB6uL8XTFcBjQH1CM0J9BVwdaERSrKg9FhGJDmqPJVZELIHh7n3gtx+qju4+I7zcGrgrUtcRCZsFnH6Q7a8C5wFnAxfl8ZxGqIEcmod99xam3cPv/49288deTWVyfd7l7h7+nLP3eHfPMbPc/w+dP/JwXK+4+237iWO7u2tIgOyXu6/h97cRIgVF7XGI2mMRCZra4xC1xzGsIIp4NtubvABw95lAiwK4jhRv3wGlzWzY3hVm1nbveDvgZULd13D32eF1XwOX720QzazaPuf8CehhZo3D28vb4VVtXgq0N7M4M0sk1N3tcPUzs2oWmsnnZOBHQoVwTzezWnvjNrPkIzi3FBNm9riZ/e9AX0HHJzFH7bGISHRQeywxryASGNPN7Hkz6x3+eg6YXgDXkWIsnK09BehroWmiZgH/BlaEt68kNNb/pVyHPQ9kEPoZ/QU4Z59zriZcfNbMphPqHtf8MML6EVgCzAb+B0w9/DtjEqEub9MJde1LC/+C+TvwVTiur4G6R3BuKT7SCHXfLAN0BBaEv9oT6vopEjFqj9Uei0h0UHus9rg4sN977UTohGZlgCv5faq+scDT7r49ohcSOQgzK0doLF1Hd98QdDwiQTCzn4Cee8e1mllJYJy7dws2MilO1B6LiEQHtccSCyJZxBMAd99uZk8C3xAanzTP3XdF+joiBxIuRvQC8IgaZynmqgKVgL0FuSqE14kUCrXHIiLRQe2xxIqC6IHRG3iF0HgnAxKBC9x9bEQvJCIiB2VmFxEqovw9ofb4aOAud38lyLhERERERI5EQSQwpgDnuPu88HJT4C137xTRC4mIyCGZWR2gK6EecZPcfUXAIYmIiIiIHJGIDyEBSu5NXgC4+/zwuGsRESl8XYC91ccd+DjAWEREREREjlhB9MB4idDcv6+HV50LxLv7xRG9kIiIHJSZ/QfoDLwRXjUUmOzutwcXlYiIiIjIkSmIBEZp4GqgZ3jVOOApd98R0QuJiMhBhacVa+/uOeHleGCau7cNNjIRERERkcMX0SEk4YfjX9y9OfBwJM8tIiJHpAq/z0JSOcA4RERERETyJaIJDHffY2bzzCzJ3TMieW4RETls/wKmmVnuWUhuDTYkEREREZEjUxBFPKsCs8xsErBl70p3H1wA1xIRkf0wszggB+hGqA4GwF81C4mIiIiIFFUFUQPjmP2td/cxEb2QiIgclJmluXtq0HGIiIiIiERCQfTAGOjuf829wszuB5TAEBEpXN+Y2c3AO/yxR9y6Ax8iIiIiIhKdCqIHxlR377jPuumqei8iUrjMbMl+Vru7Nyz0YERERERE8iliPTDM7ErgKqBReOq+vSoC4yN1HRERybMW7r499wozKxNUMCIiIiIi+RGxHhhmVplQAc9/88cq95vUXVlEpPAdoEfc/1snIiIiIlIURKwHhrtvADaY2WPAOnffBGBmlcysq7tPjNS1RETkwMysDlAfKGtmHQhNoQpQCSgXWGAiIiIiIvlQEDUwpgEdPXzi8FR+aUXtjV+NGjU8JSUl6DBEJEZMmTJljbvXLIxrmdkFwIVAKjCZ3xMYG4FX3P39wogjktQmi0ikFGZ7HIvUHotIpBxJe1wQs5CY58qKuHuOmRXEdQpUSkoKaWlpQYchIjHCzNIL61ru/grwipmd5u4jC+u6BUltsohESmG2x7FI7bGIRMqRtMdxBRDHYjO7zsxKhr+uBxYXwHVEROTgOplZlb0LZlbVzO4LMB4RERERkSNWEAmMK4CjgGwgC+gKDCuA64iIyMENcPdf9y64+3pgYHDhiIiIiIgcuYgP7XD3VcDZkT6viIgctngzK+3uOwDMrCxQOuCYRERERESOSMR7YJhZUzP71sxmhpfbmtnfI30dERE5pDeAb83sEjO7BPgaeCXgmEREpAjbkxPZCQBERA5HQQwheQ64DdgF4O7TUY8MEZFC5+73A/cBLcJf97r7A8FGJSIiRdn8lZv4ctaKoMMQkWKqIBIY5dx90j7rdhfAdURE5NDmAF+4+83AODOrGHRAIiJSdJWIj+Py16ZwzZtTWbt5R9DhiEgxUxAJjDVm1ghwADM7HVheANcREZGDMLPLgPeAZ8Or6gMfBhaQiIgUeY1rVeCmfk35ctYK+j48ho9+zsZdw0pEpHAURALjakIPy83NLBu4AbiyAK4jIiIHdzXQA9gI4O4LgFqBRiQiIkWaAdce14RPr+tFUvXyXP/2z1z2ahrLN2wLOjQRKQYinsBw98Xu3heoCTR3957uvjTS1xERkUPa4e479y6YWQnCveNERETyo2ntirx/5VH8/cQW/LBwDf0eHstrP6WToyKfIlKAIjaNqpndeID1ALj7w5G6loiI5MkYM7sdKGtm/YCrgI8DjklERGJEfJxxaa+G9GtZm9s/mME/PpzJqJ+z+fepbWlcq0LQ4YlIDIpkD4yKh/gSEZHCdSuwGpgBXA58BmhaaxERiajk6uV5/ZKuPHB6W+av3MzAx8bx+LcL2Lk7J+jQRCTGRKwHhrvfHalziYhI/rl7DqGprZ8LOhYREYltZsaZqYn0blaTuz+ezUNfz+eT6cv516lt6JRcNejwRCRGRLwGhpk1NbNvzWxmeLmtmemNn4hIITGzGWY2/UBfQccnIiKxq1bFMjx5Tkee/1MqG7fv4vRnxvOPD2eycfuuoEMTkRgQsR4YuTwH3EJ42j53n25mbwL3FcC1RETk/zsp6ABERKR469uyNt0aVeehr+bx8vilfDV7BXcNakX/1nV+q5EnInK4CmIa1XLuPmmfdbsjcWIz629m88xsoZndup/tpc3snfD2iWaWss/2JDPbbGY3RyIeEZFo5O7pe7/Cq5qEP68C1kXiGmqPRUTkUCqULsGdg1rx4VU9qF6+NFe+MZXLXk1j2a+aclVEjkxBJDDWmFkjwlP1mdnpwPL8ntTM4oEngQFAS2CombXcZ7dLgPXu3hh4BLh/n+0PA5/nNxYRkaLAzC4D3iPcIw5IAD6MwHnVHouISJ61S6zCqGt6cPvA5vy4cC19Hx7Dc2MXs2uPinyKyOEpiATG1YQelpubWTZwA3BFBM7bBVjo7ovdfSfwNjBkn32GAK+EP78HHGfhPmpmdjKwBJgVgVhERIqCq4EewEYAd18A1IrAedUei4jIYSkRH8ewoxvx1Z+PplvD6vzzszkMevwHpmasDzo0ESlCIp7ACD/Q9gVqAs3dvWeubsz5UR/IzLWcFV63333cfTewAahuZhWAvwKaKUVEipMd4QQDAGZWgnDvuHxSeywiIkcksVo5XrgglWfO68SGbbs47enx3P7BDDZsVZFPETm0guiBAYC7b3H3TQV1/sN0F/CIu28+2E5mNszM0swsbfXq1YUTmYhIwRljZrcDZc2sH/Au8HHAMd1FHtpjUJssIhKrzIz+revw9Y3HcEmPBrwzOZNjHxrNyClZuEcizy4isarAEhgFIBtIzLWcEF63333CbxorA2uBrsADZraU0JCW283smn0v4O7D3T3V3VNr1qwZ8RsQESlktwKrgRnA5cBnQCSmtS7w9hjUJouIxLoKpUvw95NaMuqaHiRVL8dN7/7CWc/+xLwV0fIOVESiTUFMo1pQJgNNzKwBoQfjs4Fz9tlnFHABMAE4HfjOQ2ncXnt3MLO7gM3u/kRhBC0iEhR3zyE0tfVzET612mMREYmYVvUqM/KKo3h3Sib//nwuA/83jot7pHB936ZUKF2U/lwRkYIW8R4YZlbOzP5hZs+Fl5uY2Un5PW94DPU1wJfAHGCEu88ys3vMbHB4txcIjbFeCNxI6O2jiIhEkNpjERGJtLg446zOSXx3U2/O6JTAc+OW0PehMXwyfZmGlYjIbyzSDYKZvQNMAf7k7q3NrBww3t3bR/RCBSw1NdXT0tKCDkNEYoSZTXH31KDjKKrUJotIpKg9zp/Cao+nZqznHx/OZNayjfRoXJ27B7eica2KBX5dESk8R9IeF0QNjEbu/gCwC8DdtwJWANcREZE8CCeSRUREioyOSVUZdU1P7hnSihlZG+j/6Dj+9dkcNu/YHXRoIhKggkhg7DSzsoSn6jOzRsCOAriOiIgchJkdZWazgbnh5XZm9lTAYYmISISZWX8zm2dmC83s/w3ZM7MkM/vezKaZ2XQzG5hr223h4+aZ2QmFG/nBxccZf+qewvc39+a0jgkMH7uYY/87mo9+ztawEpFiqiASGHcBXwCJZvYG8C3wlwK4joiIHNwjwAmEZv/A3X8Bjg40IhERiSgziweeBAYALYGhZtZyn93+TqheUQdChZefCh/bMrzcCugPPBU+X1SpXqE095/elg+uOoralcpw/ds/c9bwn5i9bGPQoYlIIYt4AsPdvwJOBS4E3gJS3X10pK8jIiKH5u6Z+6zaE0ggIiJSULoAC919sbvvBN4GhuyzjwOVwp8rA8vCn4cAb7v7DndfAiwMny8qdUiqyodX9+Cfp7RmwcpNnPT4OP7x4UzWb9kZdGgiUkgKYhaSj4HjgdHu/om7r4n0NUREJE8yzewowM2spJndTGjWEBERiR31gdzJ6qzwutzuAs4zsyzgM+DawzgWMxtmZmlmlrZ69epIxX1E4uOMc7sm8/3NvTm/WzJvTEynz0Ojee2ndPbkaFiJSKwriCEk/wV6AbPN7D0zO93MyhTAdURE5OCuAK4m9DCaDbQPL4uISPEyFHjZ3ROAgcBrZpbnvwPcfbi7p7p7as2aNQssyMNRpVwp7h7Sms+u70XzOhX5x4czOenxH/hp8dqgQxORAlQQQ0jGuPtVQEPgWeBMYFWkryMiIodk7n6uu9d291rufp6768lORCS2ZAOJuZYTwutyuwQYAeDuE4AyQI08HhvVmtepxFuXdeOpczuycdsuzh7+E1e/MZXMdVuDDk1ECkBB9MAgPAvJaYTe/nUGXimI64iIyEH9aGZfmdklZlYl6GBERKRATAaamFkDMytFqCjnqH32yQCOAzCzFoQSGKvD+51tZqXNrAHQBJhUaJFHiJkxsE1dvrnxGP7ctynfzl1J34fH8NBX89i6U9OuisSSgqiBMYLQGOtjgSeARu5+7cGPEhGRSHP3poQqz7cCpprZJ2Z2XsBhiYhIBLn7buAa4EtCz+Aj3H2Wmd1jZoPDu90EXGZmvxAqsn+hh8wi1DNjNqFZBK929yJb7LlsqXiu79uE727qTf/WdXj8u4Uc+98xfDAtixzVxxCJCRbpOZTD80d/U5QbP4DU1FRPS0sLOgwRiRFmNsXdUwO8fg3gYeBcd4+6KfIORW2yiERK0O1xUVeU2uMp6eu4++PZTM/aQLvEKtxxUgs6JVcLOiwRCTuS9jhiPTDM7Njwx/LAEDM7NfdXpK4jIiJ5Y2aVzOwCM/scGA8sJ4qnxxMREYmkTsnV+PCqHvz3jHas2LCN056ewDVvTiVrvepjiBRVJSJ4rmOA74BB+9nmwPsRvJaIiBzaL8CHwD3hom0iIiLFSlyccXqnBAa2qcMzYxbz7JhFfDV7JZf1asCVvRtToXQk/xwSkYIWsf+x7n5n+OM97r4k97ZwUSARESlcDT3S4wRFRESKoHKlSnBjv6ac3TmRB76Yy5PfL+KdyVncdHxTzkxNJD7Ogg5RRPKgIGYhGbmfde8VwHVERGQ/zOzR8MdRZvb/voKMTUREJEj1qpTl0bM78MFVR5FcvRy3vT+DgY+NY8z81UGHJiJ5ELEeGGbWnFCl+8r71LyoRGiqJhERKRyvhb//N9AoREREolSHpKq8d0V3Pp+5gv98PpcLXpzE0U1r8reBLWhWp2LQ4YnIAURy0Fcz4CSgCn+sg7EJuCyC1xERkYNw9ynhj+3d/bHc28zsemBM4UclIiISXcyMgW3qclyLWrw6Pp3Hv1vAgMfGcmZqIjf2a0qtSnoHKxJtIlkD4yPgIzPrrmJxIiJR4QLgsX3WXbifdSIiIsVW6RLxXHZ0Q07vlMDj3y3ktZ+W8tHPy7js6IZcfnRDyqvQp0jUKIj/jdPM7GpCw0l+S1u6+8UFcC0REdmHmQ0FzgEa7FPzoiKwLpioREREolvV8qW4Y1BLLjgqmQe+nMf/vl3AmxMz+HO/JpyVmkiJ+IIoHygih6Mg/he+BtQBTiDUTTmB0DCSfDOz/mY2z8wWmtmt+9le2szeCW+faGYp4fX9zGyKmc0Ifz82EvGIiESp8cBDwNzw971fNxFqm/NN7bGIiMSq5OrlefKcjnxw1VE0qFGOv30wkxMeHcuXs1agyb1EglUQCYzG7v4PYIu7vwKcCHTN70nNLB54EhgAtASGmlnLfXa7BFjv7o2BR4D7w+vXAIPcvQ2hLtWvISISo9w93d1Hu3t3dx+T62uqu+/O7/nVHouISHHQIakqIy7vzrPnd8KBy1+bwunPTCBtqTozigSlIBIYu8LffzWz1kBloFYEztsFWOjui919J/A2MGSffYYAr4Q/vwccZ2bm7tPcfVl4/SygrJmVjkBMIiJRx8x+CH/fZGYbc31tMrONEbiE2mMRESkWzIwTWtXhqxuO5l+ntCFj3VZOf2YCw15NY+GqzUGHJ1LsFEQCY7iZVQX+AYwCZgMPROC89YHMXMtZ4XX73Sf8lnEDUH2ffU4Dprr7jn0vYGbDzCzNzNJWr9Zc0CJSNLl7z/D3iu5eKddXRXevFIFLFHh7DGqTRUQkepSIj+OcrkmMuaU3N/VryvhFaznh0bHcOnI6KzZsDzo8kWIj4gkMd3/e3deHuys3dPda7v5MpK9zJMysFaFuzJfvb7u7D3f3VHdPrVmzZuEGJyISYWbWaG/vBjPrbWbXmVmVgMMCDt0eg9pkERGJPuVKleDa45ow5pbenN8tmZFTszjmwe/59+dz2LB116FPICL5EvFZSMzsxv2s3gBMcfef83HqbCAx13JCeN3+9skysxKEhq+sDceVAHwA/MndF+UjDhGRomIkkGpmjYHhwEfAm8DAfJ5X7bGIiBRr1SuU5q7BrbikZwMe/no+w8cu5q2JGVzZuzEXHpVC2VLxQYcoEpMKYghJKnAFoe7D9Qm9XesPPGdmf8nHeScDTcysgZmVAs4mNEQlt1GEisIBnA585+4efuP4KXCru/+YjxhERIqSnPDwjVOAx939FqBuBM6r9lhERARIrFaOR85qz6fX9qJTclXu/2Iuvf/7PW9MTGfXnpygwxOJOQWRwEgAOrr7Te5+E9CJUBHPo4ELj/Sk4Yfwa4AvgTnACHefZWb3mNng8G4vANXNbCFwI7B3ar9rgMbAHWb2c/grEoVFRUSi2S4zG0ookfBJeF3J/J5U7bGIiMgftaxXiZcu6sLbw7pRv0pZ/vbBTPo9PIaPfs4mJ0dTr4pEikV6LmMzmwu0cfdd4eXSwC/u3tzMprl7h4hesICkpqZ6Wlpa0GGISIwwsynunlrI12xJqEfcBHd/y8waAGe6+/2HODTqqE0WkUgJoj2OJWqPD83d+W7uKh78ch5zV2yiRd1K3HJCU/o0q4WZBR2eSNQ4kvY44jUwgDeAiWb2UXh5EPCmmZUnNCOJiIgUAnefbWY3A03D01rPK4rJCxERkaLEzDiuRW36NKvFx9OX8fDX87n45TRSk6ty8wnN6NZw30m5RCSvIp7AcPd7zexzoEd41RXuvjdNe26kryciIvtnZr2BV4ClgAGJZnaBu48NMCwREZFiIS7OGNK+PgPb1OWdyZk8/t0Czh7+E72a1OCm45vRPrFK0CGKFDkFUQMDoAyw0d0fA9LD3ZZFRKRwPQQc7+7HuPvRwAnAIwHHJCIiUqyUjI/jvG7JjLmlD38/sQWzlm3k5Cd/5LJX05i7YmPQ4YkUKRFPYJjZncBfgdvCq0oCr0f6OiIickgl3X3e3gV3n08EiniKiIjI4StTMp5LezVk7F/6cFO/pvy0eC0DHhvHtW9NY9HqzUGHJ1IkFEQNjFOADsBUAHdfZmYVC+A6IiJycGlm9jy/J5HPBVR5TUREJEAVSpfg2uOacH73ZIaPXczL45fy6fRlnNyhPtcf14Tk6uWDDlEkahXEEJKdHpraxAHCxTtFRKTwXUmoePJ14a/Z4XUiIiISsCrlSvGX/s0Z95c+XNKzAZ9OX86xD43h1pHTyVq/NejwRKJSQfTAGGFmzwJVzOwy4GLguQK4joiIHIS77zCzJ4BvgRxCs5DsDDgsERERyaV6hdL87cSWXNarIU+NXsSbEzMYOTWLszoncnWfxtStXDboEEWiRkHMQvJfM+sHbASaAXe4+9eRvo6IiBycmZ0IPAMsIjQLSQMzu9zdPw82MhEREdlXrUpluGtwK4Yd3ZAnv1/IO5MzGTE5i6FdErmqT2NqVyoTdIgigSuIHhiEExZKWoiIBOshoI+7LwQws0bAp4ASGCIiUcjMqgG4+7qgY5Hg1KtSln+e0oYrjmnEk98v5I2JGbw9OZNzuiZxZe9G1KqoRIYUXwUxC8mpZrbAzDaY2UYz22Rmmh9IRKTwbdqbvAhbDGwKKhgREfn/zCzJzN42s9XARGCSma0Kr0sJODwJUGK1cvzntLZ8d1NvBrerx6sT0ul1//fc8/FsVm3cHnR4IoEoiCKeDwCD3b2yu1dy94ruXqkAriMiIgeXZmafmdmFZnYB8DEwOZxoPjXo4EREBIB3gA+AOu7exN0bA3WBD4G3gwxMokNS9XI8eEY7vr3xGAa1q8crE5bS6wElMqR4KogExkp3n1MA5xURkcNTBlgJHAP0BlYDZYFBwEnBhSUiIrnUcPd33H3P3hXuvsfd3waqBxiXRJmUGuX57xnt+O6mYxicK5Fx98ezWKlEhhQTBVEDI83M3iGUNd6xd6W7v18A1xIRkQNw94uCjkFERA5pipk9BbwCZIbXJQIXANMCi0qiVnL18jx4RjuuObYxT36/kFcnpPPGxAyGdk7kit6NNGuJxLSCSGBUArYCx+da54ASGCIiIiIif/Qn4BLgbqB+eF02MAp44VAHm1l/4DEgHnje3f+zz/ZHgD7hxXJALXevEt62B5gR3pbh7oPzdSdSqJKrl+eB09txTZ8mPDU6VOzzrUmZnJGawJW9G5FQtVzQIYpEXEFMo6o3fiIiIiIieeDuO4Gnw1+HxczigSeBfkAWoTpHo9x9dq7z/znX/tcCHXKdYpu7tz/C0CVKJFUPFfu85tjGPDV6ESPSMnlnciand0rgqt6NSaquRIbEjoKogSEiIiIiInlgZiXM7HIz+9zMpoe/PjezK8ys5CEO7wIsdPfF4UTI28CQg+w/FHgrUrFLdEmoWo5/ndKGMbf04ZyuSbw/LZs+D43mxhE/s3DV5qDDE4mIghhCIiIiUcDMSgOnASnkau/d/Z6gYhIRkf/nNeBXQkNIssLrEgjVwHgdOOsgx9bn97oZhI/vur8dzSwZaAB8l2t1GTNLA3YD/3H3Dw9w7DBgGEBSUtJBb0aCV69KWe4Z0pqr+zTmubGLeWNiBh9My+bENnW55tjGNK+jCSKl6CpSPTDMrL+ZzTOzhWZ26362lzazd8LbJ+aeO9vMbguvn2dmJxRq4CIiwfiI0Ju43cCWXF/5pvZYRCRiOrn7le7+f+zdZXRc19WH8WeLLDPKJFlmiBlkiu3YDjrocBxusGmTNm3aBtq+DRQChUAbbJgZHK6TmBKjzBgzyMxMkvb7Ya5cRTXI0oxmNPr/1po1c89c2CdrvHVz7oEJ7p4TvCa4+0/44XCP0hoGvFt4tROgqbtnAZcBj5hZy0Md6O7PuHuWu2elpaWFMSSJpAY1Uvn9We359o7B3DSwJSPnr2fII2O54eVsZqzcGu3wREok7D0wIvXErzhj/AhNgLTF3VuZ2TDgQeASM2tPKGl3ABoDX5lZmyIJXEQk3mS4+5Bwn1T5WEQkrDab2UXAe+6eD2BmCcBFwJajHLuK0IolBTKCskMZBtxcuMDdVwXvS8xsFKEGk8XHWgGJbXWrVeKOIe348QkteOG7Zbw4bhlD537HgNb1uGVwK3q30Gq9Un5EYgjJR8A2YAqFllENg4Nj/ADMrGCMX+Eb5qHAPcHnd4F/mZkF5W+6+z5gqZktCs43/nAXW7JhF5c8fdivRUTKg3Fm1sndZx1912NSpvkYlJNFJK4VNPI+YWYFDRa1gJHBd0cyGWhtZs0JNVwMI9Sb4gfMrB1Qm0K51sxqA7vdfZ+Z1QP6AQ+VrioSy2pVSeGXp7ThhhNa8OqE5Tw7dgmXPDOBns1q89PBrRjUJo3Qn2qR2BWJBoyIPPGjeGP8Du7j7rlmtg2oG5RPKHJsepFjfzC+r1qjQ/agExEpT/oDPzKzpYQalA1wd+9cyvNGPB+DcrKIVAzuvoxgngszqxuUbSrmsblmdgvwJaFlVJ939zlmdh+Q7e7Dg12HEWo89kKHHwc8bWb5hIaVP1CkJ53EqWqVkrhpYEt+dHwz3py0gqfHLOGaFybToXENfjqoFUM6NiQxQQ0ZEpsi0YARqSd+EefuzwDPAGRlZflbP+4b5YhEJF68fVNULnt6VK4aJsrJIhIJUcrHxVK04cLMTnH3EUc55jPgsyJlfyiyfc8hjhsHdCpxsFLupSYn8qN+zbmsd1M+nLaKp0Yv5ubXp9KiXlVuGtiSc7ulk5JUrqZMlAogEr/I/sCUYHK2mWY2y8xmhuG8xRnjd3AfM0sCagKbinmsiEhcMLOC6cV3HOZVWsrHIiJl47loByDxLyUpgYt7NmHEbQN5/LLuVE5J5Pb3ZjLwryN57tul7N6fG+0QRQ6KRA+MSD3xK84Yv+GElpwaD1wIfOPubmbDgdfN7B+EJo1rDUyKUJwiItH2OnAWobmInNDQkQIOtCjl+ZWPRUTCJMiLh/yK0NA7kTKRmGCc2bkRZ3RqyJiFG3l85CL++Mlc/vnNQn50fDOu7tuM2lVToh2mVHBha8Awsxruvp3wPN37H8Uc4/cc8EowKdxmgomPgv3eJjTBXC5ws2a8F5F45e5nBe/NI3R+5WMRkfAZAFwB7CxSboQmORYpU2bGwDZpDGyTxpTlm3ly1BIe+WohT49ewqW9Mrl+QHMa16oc7TClgrIfzuVTihOZfeLuZwWTxf3PEz93L+0TvzKVlZXl2dnZ0Q5DROKEmU1x96xox1FeKSeLSLjEWj42s8+Bh9x95CG+G+PuJ0QhrMNSPq6YFqzbwVOjFvPRjNUYMLRrOjcNbEHrBtWjHZqUYyXJx2HrgRHpJ34iIiIiIvHG3Q87/DrWGi+k4mrToDr/uKQrt53ahmfHLuXNySt4b2oOJ7Wrz02DWtKzWZ1ohygVhKaVFRERERGJcWY2PtoxiGTUrsI953Rg3J0n8YuTWzN1xRYuemo8Fzw5jv/MWUt+fnh694scTiQm8RQRkSgysyM+BnH3zWUVi4iIhE1qtAMQKVCnagq/OLkNN57Qgneyc/j32CXc+MoUWqRV5cYBLTi3WzqpyYnRDlPikBowRETiz6FWHykQjlVIRESk7OnRtsScKilJXH18My7vnclns9fy9OjF3Pn+LP72nwVc068ZV/RuSs0qydEOU+JIOFch0RM/EZEYoLmIREREpCwlJSZwTpfGnN25EeMWb+Kp0Yv565ff8/jIRVzSswnX9mtOkzpVoh2mxIFw9sDQEz8RkRhjZrWB1hTqeuzuY6IXkYiIHIqZtXf3uUXKBrn7qILNso9K5NiYGf1a1aNfq3rMXb2df49dwivjl/Py+OWc0akRNwxoTueMWtEOU8qxcK5Coid+IiIxxMyuB24FMoDpQB9gPHBiFMMSEZFDe9vMXgEeItTo/BCQBfQNvr8yWoGJlET7xjV4+JKu/Oa0trw4bhmvT1zBxzNW06dFHW48oQWD2tQnIUHtcnJsIrIKiZnVNrNeZnZCwSsS1xERkSO6FegJLHf3wUA3YGtUIxIRkcPpDTQBxgGTgdVAv4Iv3X12lOISKZXGtSrz2zOOY9xdJ/K7M45j+abdXPtiNqc8PJrXJ65g74G8aIco5UjYGzCCJ35jgC+Be4P3e8J9HREROaq97r4XwMwquft8oG2UYxIRkUM7AOwBKhPqgbHU3fOjG5JI+NRITeaGE1ow5vbBPHJJVyqnJPLbD2bR74FveHjEAjbu3BftEKUciEQPDD3xExGJDTlmVgv4EBhhZh8By6MakYiIHM5kQg0YPYEBwKVm9k50QxIJv+TEBM7tls7Ht/TnjRv60LVJLR79eiHHP/ANd743kwXrdkQ7RIlhkVhGda+77zWzg0/8zExP/EREypi7nxd8vMfMRgI1gS+iGJKIiBzede6eHXxeAww1M817IXHLzOjbsi59W9Zl8YadPPftUt6bksObk1cyoHU9rh/QghNa18NM82TIf0WiAaPoE78t6ImfiEiZMbMa7r69yPLWs4L3aoCWtRYRiTGFGi8Kl70SjVhEylrLtGr85bxO/PrUtrw+cTkvjV/O1c9PonX9alzbvznndUsnNTkx2mFKDAh7A4ae+ImIRN3rwFn8cHnrwu9a1lpERERiTp2qKdxyYmtuOKEFn8xYw7PfLuWu92fx1y+/5/LemVzZpyn1a6Qe/UQSt8LWgKEnfiIiscHdz7JQf8uB7r4i2vGIiIiIHItKSYlc0COD87unM37JJp7/dhn/GrmIp0Yv5qzOjbm2X3M6ZdSMdpgSBeHsgaEnfiIiMcLd3cw+BTpFOxYRERGRkjAzjm9Zj+Nb1mPZxl28OG4Z72Sv5INpq+jZrDbX9GvOqe0bkJQYibUpJBaFrQFDT/xERGLOVDPr6e6Tox2IiIiISGk0q1eVe87pwG2ntuHtySt5cdwyfvraVNJrVebKvk0Z1rMJtaqkRDtMibCwNlW5uwOfhvOcIiJSYr2B8Wa22MxmmtksM5sZ7aBERERESqpGajLXD2jB6N8M5ukre9CkTmUe+Hw+fe//ht9+MIuFWoY1rkViFZKwP/EL5tV4C2gGLAMudvcth9jvauD3weaf3P0lM6sCvAO0BPKAj939znDFJiISw04L9wmVj0VERCQWJCYYp3VoyGkdGjJ39XZeHLeUd6fk8PrEFQxoXY+r+zZjcLv6JCZoGdZ4EonBQpF44ncn8LW7twa+DrZ/ILipvju4fi/gbjOrHXz9N3dvB3QD+pnZ6aWMR0Qk5rn7cqAJcGLweTelz/vKxyIiIhJT2jeuwUMXdmH8nSfym9PasnDdTq5/OZvBfxvFs2OXsG3PgWiHKGESiQaM0wg9XTsROJvQxJ5nl/KcQ4GXgs8vAece5roj3H1z8DRwBDDE3Xe7+0gAd98PTAUyShmPiEjMM7O7gTuAu4KiZODVUp5W+VhERERiUt1qlbh5cCvG3jGYxy/rToMalfjTp/Po85ev+d0Hs1ig4SXlXtiHkLj7cjPrD7R29xfMLI3QMqql0cDd1wSf1wINDrFPOrCy0HZOUHaQmdUi1Jjy6KEuYmY3AjcCZGZmli5iEZHoO49QT4epAO6+2syql/KcZZKPg32Uk0VEROSYJScmcGbnRpzZuRGzV20LrV4yJYfXJq7g+JZ1uapvM04+rr5WLymHwt6AETzxywLaAi/w3yd+/Y5y3FdAw0N89bvCG8HSgF6CuJKAN4DH3H3JofZx92eAZwCysrKO+RoiIjFmf+GcaWZVi3NQLOTj4PzKySIiIlIqHdNr8reLunDX6e14K3slr45fzk2vTiG9VmWu6NOUS3o2oU5VrV5SXkRiEs8SPfFz95MP952ZrTOzRu6+xswaAesPsdsqYFCh7QxgVKHtZ4CF7v7I0WIREYkTb5vZ00AtM7sBuBZ49mgHKR+LiIhIvKlbrRI/HdSKGwe04Kt563lp3DIe/GI+D3+1gLM7N+aqvk3p0qRWtMOUo4hEA0aJnvgdxXDgauCB4P2jQ+zzJfCXQhPFnUow7tvM/gTUBK4PQywiIuWCu//NzE4BthPqFfcHdx9RytMqH4uIiEi5lZSYwJCODRnSsSEL1u3glfHLeX9qDu9NzaFLRk2u6tuMMzs3IjU5MdqhyiFEYtBP0Sd+X1GMJ35H8QBwipktBE4OtjGzLDN7FsDdNwN/BCYHr/vcfbOZZRDq9tye0BKv081MN84iEvfM7EF3H+Huv3H3X7v7CDN7sJSnVT4WERGRuNCmQXX+eG5HJvz2JO49pwM79uXyq3dmcPwD3/DA5/NZuXl3tEOUIsw9/MOKgyd+pwIGfBmGJ35lLisry7Ozs6MdhojECTOb4u5ZZXzNqe7evUjZTHfvXJZxhINysoiESzTycTxRPpZ45u58t2gTr0xYxoi563DgxLb1uaJvUwa2TiMhwaIdYlwpST6OxCSeD7r7HYSWzStaJiIiEWZmPwF+CrQws5mFvqoOfBedqEREJBLMbAihFZ0SgWfd/YEi3z8MDA42qwD13b1W8N3VwO+D7/7k7i8hUoGZGf1b16N/63qs3rqHNyat4I1JK/n6hclk1qnC5b0zuShLk35GU9h7YMTLEz+1LotIOJXlEz8zqwnUBu4H7iz01Y5geEe5o5wsIuESTz0wzCwRWACcQmjJ6snApe4+9zD7/wzo5u7XmlkdIJvQ6oEOTAF6uPuWI11T+Vgqmv25+Xw5Zy2vjF/OpGWbSUlK4KxOjbi8T1O6Z9bCTL0ySiqqPTD0xE9EJDa4+zZgG3ApgJnVB1KBamZWzd1XRDM+EREJm17AooIlqc3sTWAocMgGDEJ/F+4OPp8GjCho2DazEcAQQstci0ggJSmBs7s05uwujfl+7Q5em7ic96eu4v1pq2jfqAZX9GnK0K6NqVopEutjSFHhnMTzdeBsQjPUn13o1cPdrwjjdUREpBjM7Oxgss2lwGhgGfB5VIMSEZFwSgdWFtrOCcr+h5k1BZoD35Tg2BvNLNvMsjds2FDqoEXKq7YNq3Pf0NCkn38+ryMO/PaDWfT+y9f834ezmb92e7RDjHthaybSEz8RkZjzJ6AP8JW7dzOzwYAalEVEKqZhwLvunnesB7r7M8AzEBpCEu7ARMqbapWSuLx3Uy7rlcnUFVt5beJy3speySsTlpPVtDaX98nk9I5aijUSwr6Mqp74iYjEjAPuvglIMLMEdx9JaKyziIjEh1VAk0LbGUHZoQzjh8NDjuVYETkEM6NH09r84+KuTLzrJH5/5nFs2rWfX741gz73f82fPpnL4g07ox1mXInEQB098RMRiQ1bzawaMAZ4zczWA7uiHJOIiITPZKC1mTUn1PgwDLis6E5m1o7Q5M7jCxV/CfzFzGoH26cCd0U2XJH4VbtqCtcPaMG1/ZozfskmXp+4ghfHLePZb5fSt0VdLuudyWkdGpKSFPY+BBVKJBowDrj7JjM7+MTPzB6JwHVEROTIhgJ7gV8ClwM1gfuiGpGIiISNu+ea2S2EGiMSgefdfY6Z3Qdku/vwYNdhwJteaPlBd99sZn8k1AgCcF95XalKJJYkJBj9WtWjX6t6rN+xl3eyc3hj0gp+9sY06lZN4cKsDC7tmUmzelWjHWq5FIkGDD3xExGJAe6+C8DMagAfRzkcERGJAHf/DPisSNkfimzfc5hjnweej1hwIhVc/eqp3Dy4FT8Z2JKxizby+sTlPDt2KU+PXkK/VnW5tFcmp7ZXr4xjEYkGDD3xExGJAWb2Y+BeQjk5HzDAgRbRjEtERESkIklIMAa2SWNgmzTWbd/LO9kreWPSSm55PeiV0SODYb0yaa5eGUcV9gYMPfETEYkZvwY6uvvGaAciIiIiItCgRiq3nNianwxqxdiFG3h94gqe/XYpT49ZQp8Wdbi0V2iuDK1gcmhhb8DQEz8RkZixGNgd7SBERERE5IcSE4xBbeszqG191m/fyztTcnhz8gpufXM6taokc363DIb1akKbBtWjHWpMicQQEj3xExGJDXcB48xsIrCvoNDdfx69kERERESksPo1/jtXxrjFm3hj8gpembCM579bSvfMWgzrmcmZnRtRtVIk/ve9fInEfwE98RMRiQ1PA98Aswj1iBMRERGRGJWQYPRvXY/+reuxaec+Ppi2ijcmreD292Zy3ydzObtLY4b1bELnjJqYWbTDjYpINGDoiZ+ISGxIdvfboh2EiIiIiBybutUqcf2AFlzXvzlTlm/hjUkr+WBaaEnWdg2rc0nPJpzXLZ1aVVKiHWqZikQDhp74iYjEhs/N7EZCEyoXblDeHL2QRERERKS4zIysZnXIalaHu89pz/Dpq3k7eyX3fjyX+z+fz2kdGjKsZxP6tqhLQkL898qIRAOGnviJiMSGS4P3uwqVaVJlERERkXKoRmoyV/RpyhV9mjJ39Xbezl7JB9NW8fGM1TSpU5mLejThgh4ZpNeqHO1QIyYhAuf83MxuNLNGZlan4FWaEwbnGGFmC4P32ofZ7+pgn4VmdvUhvh9uZrNLE4uISHnh7s0P8SpV44XysYiIiEj0tW9cg3vO6cDE357Eo8O6klmnCv8YsYD+D37DVc9P4pOZq9mXmxftMMMuEj0wIvHE707ga3d/wMzuDLbvKLxD0EhyN5AVXG+KmQ139y3B9+cDO0sRg4iIKB+LiIiIxIzU5ESGdk1naNd0Vm7ezbtTcnh3Sg63vD6NWlWSObdrOhdlZdChcc1ohxoWYe+BEYknfsBQ4KXg80vAuYfY5zRghLtvDm6SRwBDAMysGnAb8KdSxiEiUtEpH4uIiIjEoCZ1qvDLU9ow5vbBvHJdL/q3qsfrk1Zw5mPfcuZjY3nxu6Vs2bU/2mGWSnlZSLaBu68JPq8FGhxin3RgZaHtnKAM4I/A39HyriIipaV8LCIiIhLDEhOMAa3TGNA6ja279zN8Rmjiz3s+nstfPpvPKe0bcGFWBie0TiOxnE38GTMNGGb2FdDwEF/9rvCGu7uZ+TGctyvQ0t1/aWbNjrLvjcCNAJmZmcW9hIhITLLQAuGXAy3c/T4zywQauvukoxwX9Xwc7K+cLCIiIlIKtaqkcFXfZlzVtxlzV2/nnSkr+XDaKj6dtYYGNSpxXrcMLsrKoGVatWiHWiwx04Dh7icf7jszW2dmjdx9jZk1AtYfYrdVwKBC2xnAKKAvkGVmywjVt76ZjXL3QUWOx92fAZ4ByMrKKvZNuYhIjHqC0HLWJwL3ATuA94CeRzooFvJxEIdysoiIiEiYtG9cg7sbd+Cu04/jm/nreCc7h3+PXcJToxfTPbMWF/ZowlldGlEjNTnaoR5W2OfAsJArzOwPwXammfUq5WmHAwWz2F8NfHSIfb4ETjWz2sGs+KcCX7r7k+7e2N2bAf2BBYe7WRYRiTO93f1mYC9AMB9FSinPqXwsIiIiUo6lJCUwpGMjnvtRT8bfdSK/PaMdO/bm8tsPZtHzT1/x8zemMWbBBvLyY+/5USR6YJToid9RPAC8bWbXAcuBiwHMLAu4yd2vd/fNZvZHYHJwzH3uvrkU1xQRKe8OmFkioZVAMLM0Qvm5NJSPRUREROJE/eqp3HhCS24Y0IJZq7bx7pQcPpq+muEzVtOwRirndU/ngu4ZtKofG0NMzD28rSpmNtXdu5vZNHfvFpTNcPcuYb1QhGVlZXl2dna0wxCROGFmU9w9q4yveTlwCdCd0IohFwK/d/d3yjKOcFBOFpFwiUY+jifKxyLxb19uHl/PW8+7U3IYHfTE6NqkFhf0yODszo2oVaW0HXpDSpKPI9EDIxJP/ERE5Bi5+2tmNgU4CTDgXHefF+WwRERERCSGVUpK5IxOjTijUyPW79jLR9NW897UHP7vw9n88eO5nNy+Phd0z+CENmkkJ4Z9VoojikQDxmPAB4QmZ/szwRO/CFxHRESOwMweA95098ejHYuIiIiIlD/1q6dywwktuH5Ac+as3s57U0NDTD6btZZ61VI4p0s653dPp0PjGoQWwIussDdg6ImfiEjMmAL83szaEmpYftPd1e9XRERERI6JmdExvSYd02vy2zOOY9T3G3h/ag6vTljO898tpW2D6pzfPZ1zu6XToEZqxOIIewOGnviJiMQGd38JeMnM6gAXAA+aWaa7t45yaCIiIiJSTiUnJnBK+wac0r4BW3fv55OZa3h/ag73fz6fB7+YT79W9Ti/ezqndWhIlZTwNjlEYgiJnviJiMSWVkA7oCmgHnEiIiIiEha1qqRwRZ+mXNGnKUs27OTDaat4f9oqfvnWDKqkzGZIh4ac3z2Dvi3rkphQ+iEmkRhCoid+IiIxwMweAs4DFgNvAX90961RDUpERERE4lKLtGrcdmpbfnFyG7KXb+GDaTmh3hnTVtGgRiWGdk3nvG7pHNeoRomvEYkeGAX0xE9EJLoWA33dfWO0AxERERGRiiEhwejVvA69mtfh7rM78PW89XwwLYfnv13KM2OW0K5hdc7rll6ic0diDgw98RMRiSIza+fu84HJQKaZZRb+3t2nRicyEREREalIUpMTObNzI87s3IjNu/bzyczVfDBtFfd/Pr9E54tEDww98RMRia7bgBuBvx/iOwdOLNtwRERERKSiq1M1hav6NuOqvs1YunEXLR489nOErQFDT/xERGKDu98YfDzd3fcW/s7MIreulYiIiIhIMTSvV7VEx4WzB4ae+ImIxJZxQPdilImIiIiIxLywNWDoiZ+ISGwws4ZAOlDZzLoBBWtW1QCqRC0wEREREZFSiMQcGHriJyISXacBPwIyCPWKK2jA2A78NkoxiYiIiIiUSjjnwNATPxGRGODuLwEvmdkF7v5etOMREREREQkHc/fwnMjsakJP/LIITeRZ+InfS+7+flguVEbMbAOwPNpxhEk9IJ5XhYn3+kH81zHe6wfQ1t2rl+UFzewvwEMFS1mbWW3gV+7++7KMIxziKCdXhN96vNcx3usH8V/HMs/H8SSO8jHE/29d9Sv/4r2Ox5yPw9aAcfCEeuIXc8ws292zoh1HpMR7/SD+6xjv9YPo1NHMprl7tyJlU91dQ/qiRL/18i/e6wfxX8d4r58UX7z/FlS/8i/e61iS+iVEII4eZlarYMPMapvZnyJwHRERObJEM6tUsGFmlYFKR9hfRERERCRmRaIB4/SC7soA7r4FOCMC1xERkSN7DfjazK4zs+uAEcBLUY5JRERERKREIrEKSaKZVXL3faAnfjHimWgHEGHxXj+I/zrGe/0gCnV09wfNbCZwUlD0R3f/sqzjkB/Qb738i/f6QfzXMd7rJ8UX778F1a/8i/c6HnP9IjEHxh3A2cALQdE1wHB3fyisFxIRERERERGRCiPsDRgAZnY6/33iN0JP/EREyp6Z9QH+CRwHpACJwC53rxHVwERERERESiAiDRgiIhJ9ZpYNDAPeIbTE9VVAG3e/K6qBiYiIiIiUQNgn8TSzPmY22cx2mtl+M8szs+3hvo4cmpk9b2brzWx2obI6ZjbCzBYG77WjGWNpmFkTMxtpZnPNbI6Z3RqUx0UdzSzVzCaZ2YygfvcG5c3NbKKZLTKzt8wsJdqxloaZJZrZNDP7JNiOt/otM7NZZjY9aESI2m/U3RcBie6e5+4vAEPK4rqifBwndVROLuf1i6V8LNGlnFy+66h8HDf1K3VOjsQqJP8CLgUWApWB64HHI3AdObQX+d//QbkT+NrdWwNfB9vlVS7wK3dvD/QBbjaz9sRPHfcBJ7p7F6ArMMRCwwAeBB5291bAFuC66IUYFrcC8wptx1v9AAa7e9dCa1tH4ze6O/hDN93MHjKzXxKZvC+H9iLKx+W9jsrJ8VG/WMjHEn0vopxcnuuofBwf9YNS5uSI3MjqiV/0uPsYYHOR4qH8d+nEl4BzyzKmcHL3Ne4+Nfi8g9A/8HTipI4esjPYTA5eDpwIvBuUl9v6AZhZBnAm8GywbcRR/Y4gGr/RKwnl+VuAXUAT4IIyuK6gfBzsVt7rqJxczut3GHHzG5XiU04GynEdlY+Bcl6/Izim32gkGjD0xC/2NHD3NcHntUCDaAYTLmbWDOgGTCSO6hh0HZsOrAdGAIuBre6eG+ySQ+gPUnn1CHA7kB9s1yW+6gehP6j/MbMpZnZjUFbmv1F3X+7ue919u7vf6+63BQ3MEj1xk6sKi9d8DMrJlP/6xUQ+lpgVl7+FeM3Jysflvn4QhpycFIGgCj/x+yV64hdT3N3NrNzP3Gpm1YD3gF+4+/ZQA2VIea+ju+cBXc2sFvAB0C66EYWPmZ0FrHf3KWY2KMrhRFJ/d19lZvWBEWY2v/CX5f03KuERL7+DeM7HoJwcB5SPpVji5bcQzzlZ+TgulDonh70Bw92XBx/3AveG+/xSIuvMrJG7rzGzRoRaLcstM0smlJhfc/f3g+K4qiOAu281s5FAX6CWmSUFLbAZwKroRldi/YBzzOwMIBWoATxK/NQPAHdfFbyvN7MPgF7E4W9USiSufgcVJR+DcnIUYywV5WM5irj6LVSUnKx8XH6FIydraEfFMBy4Ovh8NfBRFGMplWAs2HPAPHf/R6Gv4qKOZpYWtCpjZpWBUwiNYRwJXBjsVm7r5+53uXuGuzcjtLznN+5+OXFSPwAzq2pm1Qs+A6cCsynD36iZvRK83xqpa0iJxUWugvjPx6CcHOxWbusXC/lYYl7c/BbiPScrHwPluH4Qvpxs7uW2F5Ecgpm9AQwC6gHrgLuBD4G3gUxgOXCxuxedxKhcMLP+wFhgFv8dH/ZbQmP8yn0dzawzoclrEgk1ML7t7veZWQvgTaAOMA24wt33RS/S0gu6x/3a3c+Kp/oFdfkg2EwCXnf3P5tZXcroN2pmc4GTgc8J5QMr/H15/LdRHikfx0UdlZPLcf1iIR9L7FBOLt91VD4u//ULV04OWwOGmb3i7lea2a3u/mhYTioiIsfMzH4O/ARoQairYeEGDHf3FlEJTERERESkFMLZgKEnfiIiMcTMnnT3n0Q7DhERERGRcAhnA4ae+ImIxBgz6wIMCDbHuPvMaMYjIiIiIlJSYZ8DQ0/8RERiQ9CwfCNQMBP5ecAz7v7P6EUlIiIiIlIyEZnEU0/8RESiz8xmAn3dfVewXRUY7+6doxuZiIiIiMixC/syqsETv9eA+sHrNTP7WbivIyIiR2VAXqHtPIrMTyQiIiIiUl6EvQEDuB7o7e5/cPc/AH2AGyJwHangzKyhmb1pZovNbIqZfWZmbUpwnlFmlhWJGI8xjh+Z2b+iHYfElReAiWZ2j5ndA0wgtEa8SFgpH4uIxAblY4l3SRE4p574ScSZmRFaR/gldx8WlHUBGgALohlbtJhZorvnHX1PqSjc/R9mNgroHxRd4+7TohiSxCHl4/+lfCwi0aB8/L+Uj+NPJHpg6ImflIXBwAF3f6qgwN1nuPtYM3vZzM4tKDez18xsqJklmtnfzGy2mc081NAmMzvVzMab2VQze8fMqh1in1Fm9qCZTTKzBWY2ICj/QQuxmX1iZoOCzzvN7K9mNsfMvjKzXsF5lpjZOYVO3yQoX2hmdxc61xXB9aab2dNmlljovH83sxlA35L/55R45e5T3f2x4KXGC4kE5WOUj0UkJigfo3wc78LegOHu/wCuATYHr2vc/ZFwX0cqvI7AlMN89xzwIwAzqwkcD3xKaDWGZkDXYBLD1wofZGb1gN8DJ7t7dyAbuO0w10hy917AL4C7D7NPYVWBb9y9A7AD+BNwCqFVIe4rtF8v4AKgM3CRmWWZ2XHAJUA/d+9KqFfT5YXOO9Hdu7j7t8WIQ0Qk3JSP/3te5WMRiSbl4/+eV/k4TkViCAnuPhWYGolzixyNu482syfMLI1QsnvP3XPN7GTgKXfPDfbbXOTQPkB74DszA0gBxh/mMgXLUk4hlPSPZj/wRfB5FrDP3Q+Y2awix49w900AZvY+oa7/uUAPYHIQV2VgfbB/HvBeMa4vIlLmlI9FRGKD8rHEi4g0YIiUgTnAhUf4/mXgCmAYoR5BxWGEEuSlxdh3X/Cex3//HeXyw15NqYU+H/D/rlmcX3C8u+ebWeF/h0XXNfYgrpfc/a5DxLFX4/rkcCy0bOqe4HfWBmgHfO7uB6IcmsQX5eMQ5WMRiTbl4xDl4zgWiTkwRMrCN0AlM7uxoMDMOheMtwNeJNR9DXefG5SNAH5ckBDNrE6Rc04A+plZq+D7qnZsszYvA7qaWYKZNSHU3e1YnWJmdcysMnAu8B3wNXChmdUviNvMmpbg3FLxjAFSzSwd+A9wJaF/GyLhpHwsIhIblI8l7oW9ASP4UScEn9uY2Tlmlhzu60jFFrTWngecbKFlouYA9wNrg+/XAfMITSpb4FlgBTAzmNTnsiLn3EBobOAbZjaTUPe4dscQ1nfAUmAu8BglG0Y1iVCXt5mEuvZlB39gfg/8J4hrBNCoBOeWisfcfTdwPvCEu18EdIhyTBJnlI+Vj0UkNigfKx9XBPbfXjthOqHZFGAAUJvQD3YysN/dLz/igSJhZGZVCI2l6+7u26Idj0g0mNk04KfAw8B17j7HzGa5e6cohyYViPKxiEhsUD6WeBCJISR64idRFUxGNA/4p5KzVHC/AO4CPggaL1oAI6MbklQkysciIrFB+VjiRSR6YOiJn4hIjAmG9lVz9+3RjkVEREREpCQi0QPjF+iJn4hI1JnZ62ZWI1iNZDYw18x+E+24RERERERKIuw9MH5wcj3xExGJGjOb7u5dzexyoDtwJzDF3TtHOTQRERERkWMWiVVI9MRPRCQ2JAerQJ0LDHf3A/zvWuoiIiIiIuVCJIaQtA96XJwLfA40B66MwHVEROTInia0/npVYEywPrp6xImIiIhIuRSJSTznAF2B14F/uftoM5vh7l3CeiERETlmZpbk7rnRjkNERERE5FhFogeGnviJiMQAM6tpZv8ws+zg9XdCuVlEREREpNyJ6CSeBy+iJ34iImXOzN4jNBfRS0HRlUAXdz8/elGJiIiIiJRMJIaQ1ATuBk4IikYD97n7trBeSEREjqhgFZKjlYmIiIiIlAeRGELyPLADuDh4bQdeiMB1RETkyPaYWf+CDTPrB+yJYjwiIiIiIiUWiR4YeuInIhIDzKwL8DJQMyjaAlzt7jOjF5WIiIiISMlEogdG0Sd+twFtzWyRmd1ZdGczq2RmbwXfTzSzZoW+uyso/97MTitU/ryZrTez2UXOdY+ZrTKz6cHrjKOdS0QkXrl7wQpQnYHO7t4NODHKYYmIiIiIlEgkemAUfeLXCDgX+BqYDFzq7nML7f9TQjfWN5nZMOA8d7/EzNoDbwC9gMbAV0Abd88zsxOAncDL7t6x0LnuAXa6+9+KxHTYc4W18iIiMc7MVrh7ZrTjEBERERE5VmHvgVHkid91wCigrbvvB94EhhY5ZCj/nSH/XeAkM7Og/E133+fuS4FFhBogcPcxwOZjCOuw5xIRqWAs2gGIiIiIiJREUqRO7O7bzaw2sBK4DXgEyAF6F9k1PdgHd881s21A3aB8QqH9coKyo7nFzK4CsoFfufuW4p7LzG4EbgSoWrVqj3bt2hXjciIiRzdlypSN7p4W7TiAyK+dHQH16tXzZs2aRTsMEYkDMZSPyyXlYxEJl5Lk44g1YBRRVk/8ngT+SOgG/Y/A34Fri3uwuz8DPAOQlZXl2dnZkYhRRCogM1tehtfawaEbKgyoXFZxhFOzZs1QThaRcCjLfByPlI9FJFxKko8j3YCxCmjCf2+kM4KyQ+2TY2ZJhObO2FSonCMc+wPuvq7gs5n9G/ikyDWKfS4RkfLK3atHOwYRERERkXAL2xwYZrbDzLYXfgFfAqcAjc0sBRgGDC9y6HDg6uDzhcA3HppZdDgwLFilpDnQGph0lBgaFdo8DyhYpeSYzyUiIiIiIiIisSNsPTAO98QvWMr0EWAe8Ly7zzGz+4Bsdx8OPAe8YmaLCE3MOSw43xwzexuYC+QCNxesGmJmbwCDgHpmlgPc7e7PAQ+ZWVdCPT6WAT8+2rlEREREREREJPaFfRnVeJHeuqPnLJhFaEEUEZHSMbMp7p4V7TjKq05du/us6VOjHYaIxAHl49Jp1aGLL5w9XffIIlJqJcnHYV9GNV5s3LmPZ8cujXYYIiICbN97INohiIgIsHLzbm54eQprt+2NdigiUgGpAeMwalZO5v7P5zF6wYZohyIiUuHt3Jsb7RBERARoVDOVsQs3cMo/RvPGpBWoN7eIlCU1YBxGRu3KtGlQnVten8qSDTujHY6ISIW2a18ue/Zr6iIRkWirV60SX/7iBNo3rsFd78/i8mcnsmLT7miHJSIVhBowDiPBjH9flUVyYgI3vJyt7ssiIlHkwISlm6IdhoiIAM3qVeWNG/rwl/M6MTNnG6c+Mppnxy4hNy8/2qGJSJxTA8YRNKlThScu787yTbv5xZvTyctXFzkRkWgwYIyG9ImIxIyEBOOy3pmMuO0E+rWsx58+ncd5T4xjzupt0Q5NROKYGjCOok+Lutx9Tge+mb+ev/3n+2iHIyJSIVWrlKQ5iUREYlCjmpV59uos/nVZN9Zs28s5//qOBz6fz94DGvYnIuGnBoxiuKJ3Jpf2yuTJUYv5aPqqaIcjIlLhVEtNYsmGXeRs0ThrEZFYY2ac1bkxX982kAu7Z/DU6MWc9sgYvlu0MdqhiUicUQNGMZgZ957TgV7N6/Cbd2YyednmaIckIlKhVE9NBmDMAt0Mi4jEqppVknnwws68fkNvDLj82Ync9vZ0Nu3cF+3QRCROqAGjmFKSEnj6ih5k1K7MDS9na2USEZEyVCkpgcY1UzUPhohIOXB8y3p88YsTuGVwKz6esZqT/zGad7JXaslVESk1NWAcg9pVU3jhmp4kmHHNi5PVmiwiUoZOaJPGd4s2ckCz3IuIxLzU5ER+fVpbPv35AFqmVeM3787k0n9PYLEeAopIKagB4xg1rVuVf1+Vxdpte7nh5WxNUCQiUkYGtkljx75cpq/cGu1QRESkmNo0qM7bP+7L/ed3Yu7q7Zz+yFgeHrFA99AiUiJqwCiBHk1r88glXZm2ciu/ensG+VpeVUQk4o5vVY/EBNMwEhGRciYhwbi0VyZf/2oQp3dqyKNfL2TII2OUz0XkmKkBo4RO79SI355+HJ/OWsODX86PdjgiInGvZuVkujappRteEZFyKq16JR4d1o1Xr+uNmXHV85P42RvTWL99b7RDE5FyQg0YpXD9gOZc0SeTp0cv4cXvlkY7HBGRuHdC6zRmrtrG5l37ox2KiIiUUP/W9fj81gH84uTWfDlnLSf9fTQvfreUPPVqFpGjUANGKZgZ95zdgVPbN+Cej+fy4bRV0Q5JRCSundCmHu7w7SItpyoiUp6lJifyi5Pb8OUvTqBrZi3u+Xgu5/zrW6au2BLt0EQkhqkBo5SSEhN47NJu9G5eh1+/M4OR36+PdkgiInGrc0YtalVJZvT3GkYiIhIPmterysvX9uJfl3Vj4859nP/EOO58b6Z62onIIUW8AcPMhpjZ92a2yMzuPMT3lczsreD7iWbWrNB3dwXl35vZaYXKnzez9WY2u8i5/mpm881sppl9YGa1gvJmZrbHzKYHr6fCWcfU5ESevTqLdo2q85NXpzBl+eZwnl5ERAKJCUb/VvUYu3AD7upqLCISD8yMszo35utfDeKGAc15Z0oOJ/59FG9MWqHJ8kXkByLagGFmicDjwOlAe+BSM2tfZLfrgC3u3gp4GHgwOLY9MAzoAAwBngjOB/BiUFbUCKCju3cGFgB3Ffpusbt3DV43haN+hVVPTebFa3rRqGZlrnlhMvPXbg/3JUREBDihTRrrd+xj/tod0Q5FRETCqFqlJH53Zns++/kA2jSozl3vz+K8J8cxM2drtEMTkRgR6R4YvYBF7r7E3fcDbwJDi+wzFHgp+PwucJKZWVD+prvvc/elwKLgfLj7GOB/ujm4+3/cPTfYnABkhLtCR1KvWiVevrYXlVMSueq5SazcvLssLy8iUiGc0DoNQKuRiIjEqbYNq/PWjX14+JIurN66h6GPf8dd72tYiYhEvgEjHVhZaDsnKDvkPkHjwzagbjGPPZJrgc8LbTc3s2lmNtrMBhzqADO70cyyzSx7w4aS3Rg3qVOFV67rzb7cfC5/diJrt2lZKBGRcGpYM5W2DaozZqEaMERE4pWZcV63DL751UCu79+cd7JzGPy3UbwyfplWKxGpwOJyEk8z+x2QC7wWFK0BMt29G3Ab8LqZ1Sh6nLs/4+5Z7p6VlpZW4uu3aVCdF6/pyeZd+7ns3xNYv0ONGCISfSWdk8jMehWaQ2iGmZ0XlKea2aSgbI6Z3VvoXC+a2dJCx3UNyi8P5imaZWbjzKxLSeoysG0ak5ZuZvveAyU5XEREyonqqcn87sz2fH7rADo0rsH/fTSHs//5LZOXac45kYoo0g0Yq4AmhbYzgrJD7mNmSUBNYFMxj/0fZvYj4Czgcg9meAuGoWwKPk8BFgNtjr06xdctszYvXNOTtdv3cvm/J7Jp575IXk5E5IhKMycRMBvIcveuhOYfejrI1/uAE929C9AVGGJmfQqd7zeF5h6aHpQtBQa6eyfgj8AzJanPkI4NOZDnfDV3XUkOFxGRcqZ1g+q8dn1vHr+sO1t27+eip8Zz65vT1NtZpIKJdAPGZKC1mTU3sxRCk3IOL7LPcODq4POFwDdBw8NwYFjwRLA50BqYdKSLmdkQ4HbgHHffXag8rWACUDNrEZxrSalrdxQ9m9Xhuat7snLLbi5/diJbNG5PRKKnxHMSufvuQvMLpQIFjcPu7juD8uTgdcR+ve4+zt23BJslnquoW5NapNeqzKcz15TkcBERKYfMjDM7N+LrXw3kZye24vPZaznx76N4fOQi9h7Ii3Z4IlIGItqAEdzw3gJ8CcwD3nb3OWZ2n5mdE+z2HFDXzBYRGt5xZ3DsHOBtYC7wBXCzu+cBmNkbwHigrZnlmNl1wbn+BVQHRhRZLvUEYKaZTSd0U36Tu5dJv7O+Levy76uyWLJxF1c+P5Fte9TdWUSiojRzEmFmvc1sDjCLUA7NDcoTg9y6Hhjh7hMLne/PwXCRh82s0iFiuo4fzlVUbGbGGZ0aMmbhBuVVEZEKpkpKEr86tS1f/XIgA1rX469ffs9pj4xhxNx1WmJbJM5FfA4Md//M3du4e0t3/3NQ9gd3Hx583uvuF7l7K3fv5e5LCh375+C4tu7+eaHyS929kbsnu3uGuz8XlLdy9yZFl0t19/fcvUNQ1t3dP450vQsb0DqNp6/owfdrd3DV85PYoTHbIlLOuPtEd+8A9ATuMrPUoDwvGFqSAfQys47BIXcB7YL96wB3FD6fmQ0m1IDxg/Ii+xxxYuUzOzfmQJ4zQsNIRKQCK8b8RplmNjKYzH6mmZ0RlDczsz2F5ip66n/PHtsy61bh6SuzeOW6XiQnJnDDy9lc9fwkFqzTMtsi8SouJ/GMRYPb1efxy7ozZ9U2rnxukp4YikhZK82cRAe5+zxgJ9CxSPlWYCShOTJw9zXBEJN9wAsEy2AH5+4MPAsMLZif6FCONrFyl4yawTCS1UeotohI/Crm/Ea/J9QLuhuh4dxPFPpucdEHf+XRgNZpfH7rAP5wVntmrNzK6Y+O5e6PZrN1t4Zvi8QbNWCUoVM7NOTxy7szZ/U2Ln92gubEEJGyVOI5iYJjkgDMrCmhnhXLgvmFagXllYFTgPnBdqPg3YBzCU0EipllAu8DV7r7gtJUqGAs9NiFG9m2W43CIlIhFWd+IwcKVt+rCcRlq29yYgLX9m/OqN8M5rJembwyYTkD/zqKl8YtIzcvP9rhiUiYqAGjjJ3WoSHPXJnFgnU7ufTfE9io1UlEpAyUZk4ioD8wI5jr4gPgp+6+EWgEjDSzmYQaSEa4+yfBMa+Z2SxCc2bUA/4UlP+B0LwaTwRdlrNLU68zOzUiN9/5cu7a0pxGRKS8Ks78RvcAV5hZDvAZ8LNC3zUPhpaMNrMBEY20jNSpmsIfz+3IZ7cOoGN6De4ePochj45l1Pfrox2aiISBaaKbQ8vKyvLs7FLdVx/Rtws3cv3Lk0mvVZnXb+hDgxqpEbuWiESfmU1x96xox1FeHS4nuzsDHhpJy7RqvHRtr0McKSLyQ/GUj83sQmCIu18fbF8J9Hb3Wwrtcxuhe/6/m1lfQo3VHQmtHFXN3TeZWQ/gQ6CDu28/xHVuBG4EyMzM7LF8+fII1yw83EPzJP3ls3ks27SbgW3S+P2Zx9G6QfVohyYilCwfqwdGlPRvXY+XrunF2m17ufjp8azauifaIYmIlDsFw0i+W7RRw/JEpCIqzvxG1xFa2Q93H09oOex67r6vYB4id58CLAbaHOoiR5uTKFaZGad2aMh/fjmQ3595HFNXbGHIo2P5vw9ns1l/M0TKJTVgRFHvFnV5+brebN65n4ufGs+yjbuiHZKISLlzVqfG5OY7/9EwEhGpeIozv9EK4CQAMzuOUAPGhmAeo8SgvAXQGlhCHEpJSuD6AS0Y/ZvBXN47k9cnrWDgX0fy9OjF7MvNi3Z4InIM1IARZT2a1ua1G3qze38uFz41njmrt0U7JBGRcqVjeg0y61Th01lqwBCRiqWY8xv9CrjBzGYAbwA/8tAY8hOAmcH8Ru8CN7n75jKvRBmqUzWF+4Z25ItbB9CjaW3u/3w+J/19NB/PWI2G1YuUD2rAiAGdM2rxzk19SUk0hj09gQlLDruqoIiIFKFhJCJSkbn7Z+7ext1buvufg7I/uPvw4PNcd+/n7l2C5VL/E5S/5+4dgrLu7v5xNOtRllo3qM6L1/Tilet6Ua1SEj97YxrnPzmOKcvjuv1GJC6oASNGtKpfnXd/cjwNaqZy1fOT+M8cPUkUESmuMzs1Ii/f+VK5U0REimlA6zQ+/fkAHrqgM6u27OGCJ8dz82tTWb5Jw7pFYpUaMGJI41qVeefHfTmuUQ1uenUKb2evPPpBIiJCh8Y1aFa3Cp/OWhPtUEREpBxJTDAu7tmEkb8exK0nteab+es5+R+juWf4HE30KRKD1IARY2pXTeH163vTr1U9bn93Jk+NXqwxeSIiR1EwjGTc4k1s2rkv2uGIiEg5U7VSEr88pQ2jfzOIC3tk8PL4ZQx8aCRPjlrM3gOa6FMkVqgBIwZVrZTEc1f35OwujXng8/n830ezyc3Lj3ZYIiIx7cxOjYNhJOuiHYqIiJRT9Wukcv/5nfniFyfQq3kdHvxiPoP/Nop3p+SQl6+HiiLRpgaMGJWSlMCjl3TlpoEteXXCCm54OZtd+3KjHZaISMw6rlF1WqRV5b2pOdEORUREyrk2Darz3I968voNvalXrRK/fmcGZz42lpHfr1fvaJEoUgNGDEtIMO48vR1/Pq8jYxZu5OKnx7Nu+95ohyUiEpPMjEt7ZjJl+Ra+X7sj2uGIiEgcOL5lPT66uR//vLQbu/fncc0Lk7ns3xOZsXJrtEMTqZDUgFEOXN67Kc9encXSjbs47/HvmL92e7RDEhGJSRf0yCAlMYHXJy6PdigiIhInEhKMs7s05qvbBnLP2e35ft0Ohj7+HTe/PpVlG7ViiUhZUgNGOTG4bX3e/nFf8ty56MnxjFmwIdohiYjEnDpVUzi9U0Pen7qK3fs17E5ERMInJSmBH/VrzujfDOLnJ7Xmm3mhFUt+98Es1quXtEiZiHgDhpkNMbPvzWyRmd15iO8rmdlbwfcTzaxZoe/uCsq/N7PTCpU/b2brzWx2kXPVMbMRZrYweK8dlJuZPRaca6aZdY9glSOmY3pNPvhpP9JrV+ZHL0zi+W+XagyeiEgRl/XKZMe+XD6ZoSVVRUQk/KqnJnPbKW0YffsgLuudyVuTVzLwr6P465fz2b73QLTDE4lrEW3AMLNE4HHgdKA9cKmZtS+y23XAFndvBTwMPBgc2x4YBnQAhgBPBOcDeDEoK+pO4Gt3bw18HWwTXL918LoReDIc9YuGxrUq895Pjufk4xpw3ydzufO9WezL1dJOIiIFejWvQ6v61Xht0opohyIiInGsfvVU7hvaka9/NZBT2jfg8ZGLOeGhkTwzRkuvikRKpHtg9AIWufsSd98PvAkMLbLPUOCl4PO7wElmZkH5m+6+z92XAouC8+HuY4DNh7he4XO9BJxbqPxlD5kA1DKzRuGoYDRUrZTEU1f04GcntuKt7JVc8exENu7cF+2wRERigplxWa9MZqzcyuxV26IdjoiIxLmmdavy2KXd+PTn/emSUYu/fDafgX8dyWsTl3MgLz/a4YnElUg3YKQDKwtt5wRlh9zH3XOBbUDdYh5bVAN3L+gzvBZocAxxYGY3mlm2mWVv2BDbc0wkJBi/OrUt/7y0G7NWbWPov75j7mpN7ikiAnBB9wwqJSXwunphiIhIGenQuCYvXduLN2/sQ3qtyvzug9mc8o/RfDR9Ffn5GvYtEg5xO4mnhyaHOKZM4e7PuHuWu2elpaVFKLLwOrtLY9758fHk5TsXPDmO4TNWRzskEZGoq1klmTM7N+KjaavYuU+TeYqISNnp06Iu7/3keJ67OovU5ERufXM6Zzw2lq/nrdP8dSKlFOkGjFVAk0LbGUHZIfcxsySgJrCpmMcWta5gaEjwvv4Y4ii3OmXUZPgt/eiYXoOfvzGN+z6eq+5qIlLhXd67Kbv25zF8uhp2RUSkbJkZJx3XgM9+PoBHh3Vlz4E8rnspm/OfHMd3izZGOzyRcivSDRiTgdZm1tzMUghNyjm8yD7DgauDzxcC3wS9J4YDw4JVSpoTmoBz0lGuV/hcVwMfFSq/KliNpA+wrdBQk7hQv0Yqr9/Qh2v6NeP575Zy2b8naDknEanQumfWol3D6rw2cbmeeImISFQkJBhDu6bz1W0D+ct5nVi7bS+XPzuRS5+ZwJTlW6Idnki5E9EGjGBOi1uAL4F5wNvuPsfM7jOzc4LdngPqmtki4DaClUPcfQ7wNjAX+AK42d3zAMzsDWA80NbMcszsuuBcDwCnmNlC4ORgG+AzYAmhiUD/Dfw0gtWOmuTEBO4+uwOPDuvK7FXbOfOf3zJ52aHmOhURiX9mxmW9M5mzejszczSZp4iIRE9yYgKX9c5k5K8H8X9ntWfBuh1c8OQ4rn1xsiacFjkGpqdSh5aVleXZ2dnRDqPEvl+7g5tencLKzbu58/R2XNe/OaHFXUQkGsxsirtnRTuO8qqkOXn73gP0/vPXnNOlMQ9e2DkCkYlIeaN8XDrl/R45Vuzal8uL45bx9OjFbN+by5AODfnlKW1o27B6tEMTKTMlycdxO4lnRde2YXU+uqUfJ7arz58+nccNL09h6+790Q5LRKRM1UhN5uwujRg+YzXb9x6IdjgiIiIAVK2UxM2DW/HtnSdy60mt+XbRRoY8OoafvTGNxRt2Rjs8kZilBow4ViM1maev7MEfzmrP6AXrOfOxbzXWTkQqnCv6NGXPgTzemKglVUVEJLbUSE3ml6e0Yeztg7lpYEu+mruOU/4xml+9PYPlm3ZFOzyRmKMGjDhnZlzbvznv3nQ8CQlw8dPjeWr0Yq1FLSIVRueMWvRvVY9/j13C3gN50Q5HRETkf9SumsIdQ9ox9o7BXNuvOZ/MXM2Jfx/N7e/OYOXm3dEOTyRmqAGjgujSpBaf/nwAp3VowAOfz+falyazaee+aIclIiVkZnXMrE604ygvbjmxFRt37ufNSeqFISIisatetUr8/qz2jL19MFf1bcqH01cz+G+juOv9meRsUUOGiBowKpAaqck8fll3/nhuR8Yt3sRpj4xl5Pfrox2WiBSTmWWa2ZtmtgGYCEwys/VBWbMohxfTejevQ89mtXl6zBL25+ZHOxwREZEjql8jlbvP7sCY3wzm8t6ZvDdlFYP/NorffjCLVVv3RDs8kahRA0YFY2Zc2acpw2/pR92qKVzzwmTu/mi2ulWLlA9vAR8ADd29tbu3AhoBHwJvRjOwWGdm3Dy4FWu27eX9qTnRDkdERKRYGtZM5d6hHRn1m0Fc0rMJ72SvZNBfR/LbD2apR4ZUSGrAqKDaNazBR7f049p+zXlp/HLO/ue3zFmtNahFYlw9d3/L3Q+2OLp7nru/CdSNYlzlwsA2aXRKr8kToxaTm6deGCIiUn40rlWZP53bidG/Gcywnpm8m51zsEeGGjKkIlEDRgWWmpzIH85uz8vX9mLrngOc9/g4nhmzmDxN8CkSq6aY2RNm1tvMGgev3mb2BDAt2sHFOjPjlhNbsWLzbj6ZuSba4YiIiByzxrUq88dzQz0yCjdk3PX+TE32KRWCGjCEE9qk8eUvTmBQ2zT+8tl8hj0znmUbtWyTSAy6CpgF3At8GbzuBWYDVx7tYDMbYmbfm9kiM7vzEN9XMrO3gu8nFsyrYWa9zGx68JphZucF5almNikom2Nm9xY614tmtrTQcV2DcjOzx4JrzDSz7qX+r3IMTjmuAW0aVONfIxdpNSYRESm3ChoyRt8+iEt7hebIGPS3UfzmnRm6j5e4pgYMAaBO1RSevrIHf7+oC/PX7uD0R8fy0rhlusEXiSHuvt/dn3T3Ie7eKXgNcfcn3P2IywqZWSLwOHA60B641MzaF9ntOmBLMLfGw8CDQflsIMvduwJDgKfNLAnYB5zo7l2ArsAQM+tT6Hy/cfeuwWt6UHY60Dp43Qg8WYL/FCWWkBCaC2PR+p18OWdtWV5aREQk7BrVrMx9QzsyJli1ZPiM1Zz491H88q3pLFq/M9rhiYTdURswzKymmV1iZrcFr0vMrFYZxCZlzMy4oEcG//nlCfRsXoe7h8/h8mcnqjuaSIwwsyQz+7GZfR70XpgZfL7JzJKPcngvYJG7L3H3/YQm/RxaZJ+hwEvB53eBk8zM3H23u+cG5amAA3hIwd1RcvA6WqvnUODl4NgJQC0za3S0uofTWZ0b07xeVf41chHuaqQVkejT/baUVsOaoVVLxt4xmOv6N+eL2Ws55eHR3PL6VOav3R7t8ETC5ogNGGZ2FTAVGARUCV6DCY3Dviri0UlUNKpZmZeu6ckD53di1qptDHlkDK9OWK7eGCLR9wqhng73AmcEr3uBLsCrRzk2HVhZaDsnKDvkPkGDxTaCyUGDuTbmEBrCclNBg4aZJZrZdGA9MMLdJxY635+DRpaHzazSMcRBcO4bzSzbzLI3bNhwlOoVX2KC8ZNBLZmzejujvg/feUVESkL32xJO9aun8rsz2zP2jsHcNLAlI+evZ8gjY7nx5Wxm5WjCfin/ko7y/e+AHu6+tXChmdUGJgIvRyguiTIzY1ivTPq3rscd783k9x/OZviM1dx/fidaplWLdngiFVUPd29TpCwHmGBmCyJ54aBhooOZHQe8ZGafu/veYEWUrsGTwg/MrKO7zwbuAtYCKcAzwB3Afcd4zWeCY8nKygprC+p53dJ59KuFPPr1Qga1TcPMwnl6EZFjofttCbt61Spxx5B2/PiEFrzw3TJe+G4p/5m7jsFt07jlxNb0aFo72iGKlMjRhpAYh+4OnB98J3Euo3YVXr2uNw9d0Jn5a7Zz+qNjeXzkIg5oCUKRaNhsZheZ2cHcbWYJZnYJsOUox64CmhTazgjKDrlPMMdFTWBT4R3cfR6wE+hYpHwrMJLQHBm4+5pgmMg+4AVCQ1iKG0fEJScm8LMTWzF95VatSCIi0Vbq++1iTNKcaWYjzWxa0DPujELf3RUc972ZnVbiWkhMqlUlhV+e0oZv7zyR35zWlhk527jgyXEMe2Y83y7cqKGUUu4crQHjz8BUM3vSzH4bvJ4i1M3tz5EPT2KBmXFxzyZ89auBnHJcA/765fec/c9vmZmzNdqhiVQ0w4ALgXVmtiDodbEWOD/47kgmA63NrLmZpQT7Dy+yz3Dg6uDzhcA37u7BMUkAZtYUaAcsM7O0gjHaZlYZOAWYH2w3Ct4NOJfQRKAF17gqWI2kD7DN3aPSgnBRVhPaN6rB/Z/NY8/+vGiEICICpbzfLuYkzb8H3nb3boTy/xPBse2D7Q6EGqCfCM4ncaZGajI3D27Ft3cM5vdnHsfSjbu44rmJnPvEOEbMXaeGDCk3jtiA4e4vAVnAaEKzze8DRhGajf7FSAcnsaV+9VQev7w7z1zZgy2793Pu499xz/A57Nh7INqhiVQI7r7M3S9x9zSgL9DX3esHZUuPcmwucAuhpVfnEbqRnWNm95nZOcFuzwF1zWwRcBtQ8BSvPzAjmOviA+Cn7r4RaASMNLOZhBpIRrj7J8Exr5nZLEJzZtQD/hSUfwYsARYB/wZ+Wpr/JqWRmGDcfXZ7Vm/byzNjlkQrDBGp4MJwv12cSZodqBF8rgmsDj4PBd50933B35FF/LfHnMShKilJXD+gBWNuH8yfz+vIpp37uOHlbE5/dCwfTV9FrnpZS4yzcLS2mdl4d+97mO+GAI8CicCz7v5Ake8rERrb14NQV+VL3H1Z8N1dhJb1ywN+7u5fHumcZjYWqB6cuj4wyd3PNbNBwEdAwQ3+++5+xLHYWVlZnp2dXdz/BBXO9r0H+OsX3/PqxOWkVavE/53VnrM6N9I4cpHDMLMp7p4VwfOf4u4jInX+aItkTr75tal8PX8d3/xqEI1rVY7INUQkdkQ6H0fK4e63zexCYIi7Xx9sXwn0dvdbCu3TCPgPUBuoCpzs7lPM7F/ABHd/NdjvOeBzd3+3yDVuJLT0NZmZmT2WL18ekTpK2TuQl8/w6at5YtQiFm/YRdO6VbhpYEvO755OpSR1xpHIKkk+PuoyqsWUeqjCYnZpuw7Y4u6tgIeBB4NjD9ml7UjndPcB7t7V3bsC44H3C11nbMF3R2u8kKOrkZrMH8/tyIc/7Uf9GpX42RvTuOr5SSzduCvaoYlUVM9FO4Dy6s7T25Hv8OAX86MdiojIkRzyfruYLgVedPcMQitYvVJ4PqWjcfdn3D3L3bPS0tJKEYbEmuTEBC7okcGIXw7kqSt6ULNyMne9P4sTHhrJv8csYde+3KOfRKQMhasB43DdOIrTpW0o8FLw+V3gpGDM9OG6tB31nGZWAzgR+LDUNZMj6tKkFh/d3J97z+nA9BVbOe2RMTw8YgF7D2g8uUi4mdnww7w+JljuVI5dkzpV+PEJLfho+mqmLN8c7XBERA7ncPfbxZkc+TrgbQB3H0+oMaReMY+VCiAhwRjSsSEf3dyPV67rRYt61fjzZ/M4/oFv+MeIBWzetT/aIYoA4WvAOJx0YGWh7Zyg7JD7BGO0txG6ET/cscU557nA1+6+vVBZXzObYWafm1mHEtVGDikxwbj6+GZ8/auBDOnQkEe/XshJfx/N57PWaEIgkfAaADwN/P0Qr51RjKvcu2lgSxrUqMS9H88lP195S0TKleJM0rwCOAkgWA47FdgQ7DfMzCqZWXOgNTCpzCKXmGNmDGidxhs39uH9nx5Pr+Z1eOzrhRz/wNfcM3wOq7buiXaIUsEVqwHjEMM+COaVOLgZpnjC5VLgjULbU4Gm7t4F+CeH6ZlhZjeaWbaZZW/YsCHyUcaZ+jVSeezSbrx5Yx+qpybxk9emcvmzE/l+7Y5ohyYSLyYAu919dJHXKOD7KMdWrlWtlMSdp7djZs423puaE+1wRKQCMrOfmVntI+1yqMJiTtL8K+AGM5tB6B75R8FS13MI9cyYC3wB3Ozu6kYrAHTPrM2/r8pixC9P4MxOjXl1wnIGPjSS296ezoJ1ur+X6ChuD4y3zeyOYNm7ymb2T+D+Qt9feZjjitMt7eA+wTJ9NQlN5nm4Y494TjOrR2iYyacFZe6+3d13Bp8/A5KD/X5A4/vCo0+Lunzys/78cWgH5qzezhmPjeWe4XPYtlurlYiUhruf7u4jD/PdCWUdT7wZ2iWdbpm1eOjL79mpMb8iUvYaAJPN7G0zG2L/OzP64e63cffP3L2Nu7d09z8HZX9w9+HB57nu3s/duwTzwf2n0LF/Do5r6+6fR6JiUr61blCdv1/chdG3D+bKvk35fNZaTn14DNe/NJnJyzT0UspWcRswehNqNBhHqJvaaqBfwZfuPvswxxWnS9tw4Org84XANx4ad3C4Lm1HO+eFwCfuvregwMwaFvwRMLNeQb03FbPuUgJJiQlc2bcZo349iEt7NeHl8csY+LeRvPDdUg5oeSaRiDKz8dGOoTxKSDDuPrsDG3bs4+ERC6IdjohUMO7+e0L3u88BPwIWmtlfzKxl8P3h7rdFykR6rcrcfXYHvrvzRH5xcmumLN/CRU+N54InxzFi7joNwZQyUdwGjAPAHqAyoTFzS939qP8XWswubc8Bdc1sEXAbcGdw7CG7tB3unIUuO4wfDh+BUKPG7KDb3GPAMNfkDGWidtUU/nRuJz752QA6Nq7JvR/P5bSHx/CfOWs1P4ZI5JRmpvoKrWuTWlzeO5Pnv1vKxCVq5xaRshXcn64NXrmElj1918weimpgIoXUqZrCL05uw3d3nsi953Rg3fa93PByNqc+Moa3J69kX65GIUnkWHH+JzL4H/+PgD8SmrH4KWC/u18U2fCiJysry7Ozs6MdRlxxd0Z9v4E/fzaPRet30qdFHX5/Zns6pteMdmgiEVeSda5Lca2p7t69LK5VVsoyJ+/al8sZj40lL9/54hcnUK1SUplcV0TKRlnm42NhZrcCVwEbgWeBD939QLDc6UJ3bxnVAAO6R5aicvPy+XTWGp4evYS5a7ZTv3olrunXnMt6Z1KzcnK0w5MYVpJ8XNweGNcF4+gOuPsadx/K/w4FETkiM2Nwu/p8cesA/nhuRxas28lZ//yWW9+cxopNu6MdnogIEJrQ8+8XdWHV1j38+dO50Q5HRCqOOsD57n6au7/j7gcAgl7PZ0U3NJHDS0pMYGjXdD79eX9eua4XbRpU58Ev5tPvgW/40ydzWa2VSySMitWA4e7/08zq7q+EPxypCJISE7iyT1NG/WYQPx3Uki/nrOWkf4zi7o9ms2HHvmiHJxLzSjpTvRRfVrM63HhCC96YtJKR89dHOxwRqQDc/W53X36Y7+aVdTwix6pgCdZXr+/NJz/rz4nt6vPCuGWc8NBIfvnWdOas3hbtECUOFLcHhkjY1UhN5vYh7Rj9m8FclNWEVyeuYOBfR/KPEQvYsVcrlogcQYlnqpfiu+2UNrRtUJ3b35vJll37ox2OiIhIudExvSaPXdqNUb8exFV9m/HlnLWc+di3XPHsRMYs2KC58KTE1IAhUdegRip/Oa8T//nlCQxqm8ZjXy/khIdG8vToxezZr0mARIrSTPVlo1JSIv+4pAtbd+/n/z7Sf1IREZFj1aROFf5wdnvG33kSdwxpx4J1O7jq+Umc/uhY3p2Sw/5crU4ox0YNGBIzWqZV44nLe/Dhzf3omF6T+z+fz4CHQkuv7j2ghgyRwjRTfdno0Lgmt57Umk9mrmH4jNXRDkdERKRcqlklmZ8MasnYOwbzt4u64A6/fmcG/R/8hsdHLmLrbvV0lOJRA4bEnK5NavHKdb15+8d9aZlWlXs/nsvgv43itYnL1UorQmimejObAjwEfAd0cvefAD2AC6IaXBy6aWBLujapxf99OJtVmohMRESkxColJXJhjwy++MUAXr62F20bVuevX35P3/u/4Q8fzWbZxl3RDlFinBowJGb1al6HN2/sw2vX96ZRzVR+98FsBv9tFK9OWK71paWi00z1ZSgpMYGHL+lKfr7z41eyNbRNRESklMyME9qk8cp1vfniFwM4q3Mj3py0ksF/H8UNL2czcckmzZMhh6QGDIlpZka/VvV47yfH8+I1PalfoxK//3A2Ax8axUvjlmloiVRImqm+7DWvV5VHL+3KnNXbueO9mbqpEhERCZN2DWvw14u68O0dg7llcCuyl23mkmcmcPa/vuXDaavUA1t+QA0YUi6YGYPa1uf9nxzPq9f1pkmdytw9fA4nPDSSZ8cuYff+3GiHKCJx7sR2DfjNaW0ZPmM1T49ZEu1wRERE4kr9Gqn86tS2jLvzJP5yXif27M/jF29NZ8BDoXkytCKYACRFOwCRY2Fm9G9dj36t6jJhyWYe+3ohf/p0Ho+PXMSPjm/O1cc3pVaVlGiHKSJx6icDWzJ39XYe/GI+bRtUZ3C7+tEOSUREJK5UTknkst6ZDOvZhNELN/Dc2KX89cvv+ec3Czm/ewbX9mtGq/rVox2mRIkaMKRcMjP6tqxL35Z1mbJ8M0+OWszDXy3g6TGLuaxXJtcPaEHDmqnRDlNE4oyZ8dcLu7B04y5+/uY0Pry5Hy3TqkU7LBERkbiTkGAMblufwW3r8/3aHTz/7VLenZLD6xNXMLBNGtf2b84JrethZtEOVcqQhpBIudejaR2evbonX/xiAKd1aMgL45Yx4KFvuP3dGSxctyPa4YlInKmcksgzV2WRkpjADS9ns33vgWiHJCIiEtfaNqzOgxd2ZvydJ/KrU9owd812rn5+Eif/YzSvTFiu4eQViBowJG60a1iDhy/pyqhfD2JYz0yGz1jNKQ+P4ZoXJjFu8UZNuiciYZNeqzJPXN6dFZt2c8vr0zTBmIiISBmoW60SPzupNd/eMZh/XNyFKilJ/N+Hs+nzl6/5y2fzyNmyO9ohSoSZ/qfu0LKysjw7OzvaYUgpbN61n1cnLOelccvYtGs/HdNrcMOAFpzRqRHJiWq7k7JlZlPcPSvacZRXsZqT3568ktvfm8mQDg3512XdSFJuEYl5yselE6v5WComd2fK8i288N0yvpizFnfn1PYNuaZfM3o1r6PhJTGuJPlYc2BI3KpTNYWfn9SaG09owQfTVvHs2CXc+uZ07v9sPlf2bcplvTKpXVUTfopIyV3cswk79+Vy3ydz+dU7M/jHxV1JTNDNkoiISFkwM7Ka1SGrWR1Wbd3DK+OX88akFXwxZy3HNarBNcc345yujUlNTox2qBIm6oFxGGpdjj/5+c7I79fzwnfL+HbRRiolJXBet3Su6dectg01k7FElp74lU6s5+QnRi3ioS++Z1jPJtx/fic98RGJYcrHpRPr+Vhkz/48Ppq+ihfHLWP+2h3UrpLMpb0yuaJPUxrXqhzt8KSQkuTjiPd1NbMhZva9mS0yszsP8X0lM3sr+H6imTUr9N1dQfn3Znba0c5pZi+a2VIzmx68ugblZmaPBfvPNLPuka21xKKEBOOk4xrw6vW9+c8vT+D87hl8MG0Vpz0yhsv+PYEvZq8hN0/j2EXk2P10UCt+dmIr3py8kns/nqs5d0RERKKkckoiw3pl8vmtA3jjhj70al6Hp0YvZsBDI/nJq1OYsGST/k6XYxEdQmJmicDjwClADjDZzIa7+9xCu10HbHH3VmY2DHgQuMTM2gPDgA5AY+ArM2sTHHOkc/7G3d8tEsrpQOvg1Rt4MniXCqpNg+rcf34nbj+tLW9MXsGr45dz06tTaVQzlct6ZTKsVyZp1StFO0wRKUduO6UNe/bn8ey3S0lNTuSOIW3VE0NERCRKzIy+LevSt2VdVm7ezasTl/PW5JV8Pnst7RpW56q+zTi3W2OqpGhWhfIk0j0wegGL3H2Ju+8H3gSGFtlnKPBS8Pld4CQL3fENBd50933uvhRYFJyvOOcsaijwsodMAGqZWaNwVFDKt9pVU/jpoFaMuX0wT1/Zg1b1q/H3EQs4/oGv+fkb05i0dLNaaEWkWMyM3515HJf3zuSp0Yt54PP55Ocrf4iIiERbkzpVuOv04xh/50k8eEFoqOdvP5hFn798zZ8+mcvyTbuiHaIUU6Sbm9KBlYW2c/jfng8H93H3XDPbBtQNyicUOTY9+Hykc/7ZzP4AfA3c6e77DhNHOrCmBHWSOJSUmMBpHRpyWoeGLN6wk1cnLOfdKTkMn7Ga1vWrcWmvTM7vnk6tKpr0U0QOz8z449COmMHTY5awbvteHrqwCylJWp1EREQk2iqnJHJJz0wuzmpC9vItvDhuGS+OW8Zz3y1lUJs0rjq+GQNbp5GgCbljVrzdUd0FtAN6AnWAO47lYDO70cyyzSx7w4YNkYhPyoGWadW4++wOTPztSTx0YWeqVkrivk/m0usvX/PLt6YzeZl6ZUj5VNI5icysV6G5hWaY2XlBeaqZTQrK5pjZvYc452NmtrPQdqaZjTSzacGcRGdEsMpRkZAQasS4fUhbPpy+mh+9MIntew9EOywREREJmBk9m9Xh8cu6892dJ/LzE1sze/V2rnlhMoP/Popnxy5h22797Y5FkW7AWAU0KbSdEZQdch8zSwJqApuOcOxhz+nua4JhIvuAFwgNNyluHLj7M+6e5e5ZaWlpx1BNiUdVUpK4OKsJH97cj89+PoCLszIYMXcdFz01npP/MZqnRy9m/Y690Q5TpFgKzUl0OtAeuDSYa6iwg3MSAQ8TmpMIYDaQ5e5dgSHA00G+3gec6O5dgK7AEDPrU+iaWUDtItf4PfC2u3cjNM/RE2GrZAwxM346qBX/uLgLk5Zu5uKnxrN2m/KFiIhIrGlQI5VfntKG7+44kccu7UZatUr86dN59L7/K25/dwazV22LdohSSKQbMCYDrc2suZmlELpZHV5kn+HA1cHnC4FvPPR4ezgwLHgi2JzQBJyTjnTOgnktgjk0ziV0011wjauC1Uj6ANvcXcNHpNjaN67Bn87txKTfncRDF3SmdpUU7v98Pn3v/4YbXs7mq7nrtIKJxLoSz0nk7rvdPTcoTwUcIGgwLuhdkRy8HA42mPwVuL3INRyoEXyuCawOR+Vi1fndM3jxml7kbNnDeU98x/drd0Q7JBERETmElKQEzunSmHd/cjyf/XwA53XL4OMZazjrn99y3hPf8f7UHPYeyIt2mBVeRBswghveW4AvgXmEnrrNMbP7zOycYLfngLpmtgi4DbgzOHYO8DYwF/gCuNnd8w53zuBcr5nZLGAWUA/4U1D+GbCE0ESg/wZ+GsFqSxyrkpLExT2b8O5Pjuer2wZyff/mTFuxletfzqbvA9/w50/nMn/t9miHKXIoh5sL6JD7BLm2YE4izKy3mc0hlF9vKmjQMLNEM5sOrAdGuPvE4Fy3AMMP0Vh8D3CFmeUQys0/C0vtYlj/1vV468d9yMt3LnxyHF/OWRvtkEREROQI2jeuwf3nd2LCb0/iD2e1Z9vuA9z29gz63v81938+jxWbdkc7xArLNJb/0LKysjw7OzvaYUg5cCAvn5Hz1/POlBxGzl9Pbr7ToXENLuiewdCujalbTcuxCpjZFHfPiuL1LwSGuPv1wfaVQG93v6XQPrODfXKC7cXBPhsL7XMcoV4aJ7j73kLltYAPCDVIbCbUAD0omJx5p7tXC/a7jdDfnr+bWV9Cjdgd3f1/ujCZ2Y3AjQCZmZk9li9fHr7/IFGwausefvrqFGbkbOO6/s25Y0g7Te4pEgXRzsflne6RpSJyd75btIlXJyxnxLx15LszsE0aV/RuyuB29UnUpJ8lUpJ8rEVvRUopOTGBUzs05NQODdm8az/Dp6/ivamruO+Tufzls3kMbJPG0G7pnHJcAyqnJEY7XKm4jmVOopwicxId5O7zgkk5OwLZhcq3mtlIQnNkzANaAYtCI/qoYmaLgrk1rgv2wd3Hm1kqoR5z64sG7O7PAM9A6Ia5hPWOGem1KvP2TX25/7P5PPftUqYs38K/LutGRu0q0Q5NREREjsDM6N+6Hv1b12Pttr28MWkFb0xawfUvZ5NeqzKX9c7koqwM6ldPjXaocU89MA5DrctSWt+v3cH7U3P4aPpq1m7fS9WURE7r0JBzu6VzfMu6JCXqyWtFEu0nfkGDxALgJEINFZOBywoNwcPMbgY6uftNZjYMON/dLw7mIVoZ9KZoCowHOgMGHAgaLyoD/wEedPdPily7cA+Mz4G33P3FoDfH10C6H+WPUbzl5M9mreGOd2eSkGD8/aIunNy+QbRDEqkwop2Pw83MhgCPAonAs+7+QJHvHwYGB5tVgPruXiv4Lo/Q0ECAFe5+DkcRb/lYpKQO5OXz1dx1vDJhOeMWbyIpwTitY0Ou6N2UPi3qEDzEkSMoST5WA8ZhKDlLuOTlOxOXbuKjaav5bPYaduzNpV61SpzVuRFnd2lEtya1tdZ0BRALN8zBkqWPELrJfd7d/2xm9wHZ7j486A3xCtCN0DCQYe6+JBhucidwAMgH7nP3D82sM6HhJImE5lR6293vO8R1CzdgtCc0F1E1QhN63u7u/zla7PGYk5dv2sVPX5vKnNXbuaZfM35zWluqpKhjpEikxUI+DpdgwuQFwCmE5jaaDFzq7nMPs//PgG7ufm2wfTA/F1c85mOR0lq8YSdvTFzBO1Ny2LbnAC3TqnJ576Zc0D2DmlWSox1ezFIDRhgpOUsk7D2Qx6jv1/PhtNV88/169ufmk16rMmd2bsTZnRvTMb2GWmvjVDzdMEdDvObkvQfyuP+zebw0fjlN6lTm/vM60791vWiHJRLX4ikfB3MJ3ePupwXbdwG4+/2H2X8ccLe7jwi21YAhEkZ7D+Tx6cw1vDpxOdNWbKVSUgJndW7MZb0z6Z5ZS/f5RagBI4yUnCXSduw9wFfz1vHxjDWMWbCB3HynWd0qnN6pEWd0bKTGjDgTTzfM0RDvOXnikk3c9f4slmzcxYU9Mvj9mcdRq0pKtMMSiUvxlI+LM0FzoX2bAhOADHfPC8pygelALvCAu394mOvE1aTKImVh7urtvD5pOR9MXcWu/Xm0a1idy3pncm63dGqkqlcGqAEjrOL9Zlliy9bd+/li9lo+nbWGcYs3kZfvNKlTmTM6NuL0To3oklFTjRnlXDzdMEdDRcjJew/k8djXC3l6zBJqV0nh3nM6cEanhvq3LxJm8ZSPj7EB4w5CjRc/K1SW7u6rzKwF8A1wkrsvPtI1K0I+FgmnnftyGT59Na9NXM6c1dupnJzI2V0acVnvphX+Hl+rkIiUU7WqpDCsVybDemWyZdd+Rsxdx6ez1vDct0t5eswSGtdM5dQODTmtQ0N6NqutCUBF4lBqciK3D2nHWZ0bc8d7M7n59an0a1WXu04/jo7pNaMdnojEpuKsMFVgGHBz4QJ3XxW8LzGzUYTmQDpiA4aIHJtqlZK4rHcml/Zqwsycbbw+cQXDZ6zm7ewc2jeqwaW9Mzm3a2Oqq1dGsagHxmGodVliwbbdB/jP3LV8OWcdYxZuYH9uPrWrJHPycQ0Y0rEh/VrVIzVZS7OWB/H0xC8aKlpOzs3L59UJy3n064Vs3XOA87qm86vT2pJeq3K0QxMp9+IpHxdnhalgv3bAF0DzglWfzKw2sNvd95lZPUIrTA093ASgBSpaPhaJhB17D/Dh9NW8PnEF89aEemWc06Uxw3o1oWuTijNXhoaQhJGSs8SaXftyGb1gA1/OWcs389azY18ulZMTGdC6Hie3b8CJ7epTr1qlaIcphxFPN8zRUFFz8rY9B3hy1GKe/24pANf1b85PBrXU2FmRUoi3fHy0FaaCfe4BUt39zkLHHQ88TWh1qQTgEXd/7mjXq6j5WCQS3J0ZOdt4c1KoV8buYK6MS3uF5sqoWTm+/96rASOMlJwllu3PzWf8kk18PW8dX81dx+ptezGD7pm1Oem4+pzUrgFtGlSrMK235UG83TCXtYqek1dt3cPfv/ye96etolaVZH50fDN+dHwzTfQpUgLKx6VT0fOxSKTs2HuA4TNW8+aklcxatY3U5ATO6NSIYT0z6dmsdlze16sBI4yUnKW8cHfmrN7OV/PWMWLuOuas3g5Aeq3KDG6Xxont6nN8Sw01iTbdMJeOcnLI7FXbeOSrhXw1bx1VUhK5rFcm1w9oQcOaqdEOTaTcUD4uHeVjkciblbONNyavYPj01ezcl0vLtKoM65nJ+d3TqRtHPa7VgBFGSs5SXq3dtpeR36/nm/nr+W7RRnbvzyM1OYE+LeoyqE0aA9vWp1ndKnHZihvLdMNcOsrJP/T92h08OWoRH89cQ6IZF/RI5/oBLWiZVi3aoYnEPOXj0lE+Fik7u/bl8umsNbw5aQVTV2wlOdE4tX1DhvVqQr+W9UhIKN/382rACCMlZ4kH+3LzmLhkM9/MX8/oBRtYunEXAJl1qjCwTRoD26TRp2VdqlXSgkSRphvm0lFOPrQVm3bz9JjFvDMlh/25+Rzfsi6X927KqR0akKzVikQOSfm4dJSPRaJjwbodvDlpJe9Py2Hr7gOk16rMxVlNuCgrg8bldJJvNWCEkZKzxKPlm3YxZsEGRn2/gXGLN7HnQB5JCUb3zNoMaF2P/q3r0TmjFonlvDU3FumGuXSUk49sw459vJ29ktcnrmDV1j2kVa/EsJ5NGNYrUyuXiBShfFw6ysci0bUvN4//zFnHW5NX8u2ijZjBwDZpXJLVhJOOa0BKUvl5gKEGjDBScpZ4ty83jynLtjB20UbGLtzA7FWhuTNqVk6mb4u69GtVl+Nb1aNFvaoabhIGumEuHeXk4snLd0YvWM9rE1bwzffrATi+ZV2GdknntI4N4342c5HiUD4uHeVjkdixcvNu3sleydvZOazdvpe6VVM4r1s6l/RsQusG1aMd3lGpASOMlJylotm0cx/fLd7Etws38N2iTazaugeAhjVSOb5lqDGjb8u6eppbQrphLh3l5GOXs2U3b2fnMHz6KpZt2k1KYgKD26UxtGs6J7arr4l9pcJSPi4d5WOR2JOX74xZsIG3s1fy1bx1HMhzujapxSU9m3BW50ZUj9Hl19WAEUZKzlKRuTvLN+1m3OJNfLd4I+MXb2Lzrv1AaP6MPi3q0KdFXfq0qFtux9yVNd0wl45ycsm5OzNztvHR9NV8PHM1G3bso0pKIie0TuPk9g04sV196lTVcqxScSgfl47ysUhs27RzHx9MW8Vbk1eycP1OKicnckanRlyclUGv5nViqmd1TDZgmNkQ4FEgEXjW3R8o8n0l4GWgB7AJuMTdlwXf3QVcB+QBP3f3L490TjN7DcgCDgCTgB+7+wEzGwR8BCwNLvu+u993pLiVnEX+Kz/fmb92BxOXbmLCkk1MXLqZrbsPANCkTmV6NatLr+a16dW8rlY4OQzdMJeOcnJ45OU74xdv4vPZa/hq3jrWbd9HgkFW0zqc3L4+g9rWp3X9avo3LHFN+bh0lI9Fygd3Z9rKrbyTncPHM0LLsTatW4WLemRwQY8MGtWM/kPImGvAMLNEYAFwCpADTAYudfe5hfb5KdDZ3W8ys2HAee5+iZm1B94AegGNga+ANsFhhzynmZ0BfB7s8zowxt2fDBowfu3uZxU3diVnkcMraNAINWZsYvKyLQd7aNSrVolezWvTs1kdsprW4bhG1UnSagi6YS4l5eTwc3dmr9rOiHnr+GruOuauCc2Dk1a9Ev1b1eP4lnXp37peTNzgiIST8nHpKB+LlD+79+fyxey1vJ29kglLNpNg0L91Ghf1yOCU9g2iNqy0JPk40msn9gIWufsSADN7ExgKzC20z1DgnuDzu8C/LPToZyjwprvvA5aa2aLgfBzunO7+WcFJzWwSkBGpiolUZAkJRvvGNWjfuAbX9m+Ou7N4w04mLd3CpKBB47NZawGonJxI1ya1yGpWmx5Na9OtSW1qVonNcXgiFYmZ0SmjJp0yanLbKW1YtXUP3y3cyLeLNjJmwQY+mLYKgBb1qtKzWR16NKtNVtPaNNfEviIiIuVKlZQkzu+ewfndM1i+aRfvTsnhvSk5/OyNadSsnMw5XRpzUVYGndJrxvzf+Eg3YKQDKwtt5wC9D7ePu+ea2TagblA+ocix6cHnI57TzJKBK4FbCxX3NbMZwGpCvTHmFA3WzG4EbgTIzMwsRvVEBEL/I9SqfnVa1a/OZb1D/3ZWb93DlOVbmLJ8C9nLN/PEqMXk5Yd6fLWqX41uTWrRLbM23ZvWonX96lq6VSTK0mtV5uKeTbi4ZxPy853v1+3gu0UbGbd4E1/MWctb2aE/vXWrptC9aW26Z9amc0ZNOqbX1OomIiIi5UTTulX51alt+cXJbRi3eCPvZOfwVvZKXpmwnLYNqnNRVgZDu6aTVr1StEM9pEg3YETLE4SGj4wNtqcCTd19ZzDM5EOgddGD3P0Z4BkIdY8ro1hF4lLjWpVpXKsyZ3dpDMCufbnMWLmVaSu3MnX5Fr6ev553puQAUDUlkY7pNenapBZdglfjmqkx3wIsEq8SEozjGtXguEY1uH5AC/LzQ72sspdvIXvZFqYs38yIuesO7t+sbhU6ptekc0ZNjmtUg7YNq5NWrZL+DYuIiMSoxARjQOs0BrROY9vuAwyfuZp3p+Twp0/ncf/n8xncNo0LezThxHb1SUmKneHgkW7AWAU0KbSdEZQdap8cM0sCahKazPNIxx72nGZ2N5AG/LigzN23F/r8mZk9YWb13H1jCeslIseoaqUkjm9Vj+Nb1QNC4+9XbN7N1BVbmL5iKzNytvHCd8vYn5cPhObSKHi62yn4H6MGNVKjWQWRCishwWjdoDqtG1Tn0l6hXlZbdu1n9uptzMzZxuxV25i2YiufzFxz8Jg6VVNo26A6bRuGXq3qV6NFvarUqZqihg0REZEYUrNKMlf2acqVfZqycN0O3p2aw/tTV/HVvPXUqZrCOV0ac2GPDDo0rhH1v+GRbsCYDLQ2s+aEGhmGAZcV2Wc4cDUwHrgQ+Mbd3cyGA6+b2T8ITeLZmtDKIna4c5rZ9cBpwEnunl9wATNrCKwLztsLSCDUSCIiUWJmNK1blaZ1q3Jet9B0Nftz85m/djszVm5l+sptzFq1lVHfrycYeUJa9Up0Sq9Jh8Y1gldNMmpXjnoiFamIaldNOfjkpsDmXfuZv3Y789fs4Pu1O5i/bgdvTV7JngN5B/epWTmZlmlVaZFWjeb1qtK0bhWa1qlKZt0qGooiIiISZa0bVOeu04/jN6e2ZezCjbwzZSWvT1zBi+OW0a5hdS7onsHQbo2pXz06DxYj2oARzGlxC/AloSVPn3f3OWZ2H5Dt7sOB54BXgkk6NxNqkCDY721CE37mAje7ex7Aoc4ZXPIpYDkwPvgfmoLlUi8EfmJmucAeYJhHev1YETlmKUkJdM6oReeMWlzZN1S2e38uc1dvZ9aqbcxaFXrSW7hRo3pqEu0bhRoz2jWqTvtGNWhVv1rUZlMWqcjqVE3h+Jb1OL5lvYNl+flOzpY9LN64kyUbdrF4w06WbNjJ6AUbeDcYRlagZuVkmtatQkbtyqQHw9AKv9eqkqwGSxERkTKQlJjA4Hb1GdyuPlt37+fjmWt4b0oOf/5sHg98MZ+BbdK4oHsGJx1Xv0zvuyO6jGp5piWiRGLX3gN5zF+7g7mrtzNn9TbmrN7O/LXb2Xsg1PEqMcFoUa8q7RrVoF3D6ge7safXqkxClCYL1bJ9paOcHJ927ctlxebdLN+0mxWbdwXvu1m1dQ+rtuxhX27+D/avlJRAw5qpNKiRSsMaqTSsmUr96pVIC171q1cirVoqNSonqaFDDkv5uHSUj0UqtkXrd/Le1Bw+mLqKtdv3UiM1ibO6NOaC7ul0z6x9TH9/S5KP1YBxGErOIuVLXr6zfNMu5q/dwbw125m3JvS+auueg/tUSUmkdYPqtKlfjTYNQmPyW9WvViYNG7phLh3l5IrH3dm0az+rg8aMVVv3sG77XtZu38e6bXtZuz302l+kkQMgJTGBOlVTqFstJfReNYW61SpRp2oKtaokU7vKf98LPqvXVsWhfFw6ysciAqF77/GLN/He1By+mL2WPQfyaFa3Cud3z+C8buk0qVPlqOdQA0YYKTmLxIcdew+wcP1OFqzdwffrdrBgXWhs/sad+w/uUzk58WBjRsHY/JZp1What0rY/qdGN8ylo5wsh+LubN+Ty4ade1m/Yx8bd+5nw459rN+xl80797N513427trP5l372LRzP7v35x32XClJCdSsnEzNysnUSE0KvVdOpnpqEtVTk6mRWvA5iWqVQq+qwXu1oKxSUoJ6fpQDyselo3wsIkXt3JfL57PW8N7UHCYs2QxAr+Z1uKB7Oqd3akSN1EPPcaUGjDBSchaJb1t27WfRhp0sWr+Thet2snD9Dhav38nqbXsP7pNgkFG7Cs3rVaV5vao0q1uFZvWq0qJeNdJrVybxGHpt6Ia5dJSTJRz2Hshj6+4DbNm9ny279x/8vHX3AbbvPcD2PQfYVui1Y29u8DrAgbyj3y8lGFRNCTVsVKmUSNWUJCqnJFIleFVOTjr4OTU5kcopiVRODr1SUxJJTUogNTkxeAWfk0KfKyUlUik5gZTEhKgNhYsXyselo3wsIkeSs2U3H01fzXtTc1iyYReVkhI4pX0Dzu+ezoDWaSQn/ndJ1pLk40ivQiIiEpNqV02hZ9U69GxW5wflu/fnsmTDLpZs3MXi9TtZsnEXSzfuZMryLezcl3twv+REI6N2FTLrVKFp3YL3qgcnIKySovQqEmtSkxNpWDORhjWPbeZ0d2fvgXx27D3A9r257NqXy86C197Q+679uezel8eu/aHvd+3PY/e+XHbvz2Pzrv3kbMljz/48du8PlRWd3+NYpCQmUCkp4WCDRqXkRColJZCSFNpOSUogOXhPSUqgUuJ/t5MTE0hOsoNlSYkJJCcaKUkJJCWEPicf/M4Obhd8l5hgB78rKEtKTCA5IfRdUmICSQl28PsEQ71SREQqkIzaVbh5cCt+OqglM3O28f7UHIbPWM0nM9dQt2oKZ3dpzPnd0+mUXrNE59cdtohIIVVSkuiYXpOORZKqu7Nx536WbtzFso27WLppFys27Wb55l1MXb6FHYUaNwDqVUsho3YVmtSpQmadymVZBREJMzML9ZZISaR+jfCcMz/f2Zebz54DeaHX/lz2Hshn74G8/77nhho99ufls+9APntz8w6+78/NZ39uPvsOvgdleaHtXftyQ98F2wfy8jmQ5z/Yp6wUNHwkJSQE73bwPeEH2wk/2E5MMBLtv58Lvkuw/+5TuCwxITSJc0JwTELhYwu+V2OKiEiZMDO6NKlFlya1+N2Z7Rm9YAMfTMs5uCRry7SqJTqvGjBERIrBzA6udNCr+Q97bbg7W3YfYPmmXazYvJucLXtYuXk3K7fsZsbKrXw2a02UohaRWJWQ8N9GkWhwd/LyPdSokZdPbtDAEWroyCc3P9TYkZvv5OblB/s4ufmh/Qo+H3zPLygL7Z+bHzp/4c8H8px8D+2fV2j/vHwnz528YDvfQ3HkBzHm5Tv7cvPIc8jLzycvP9QAlJufT74Tes/n4HnyC86X/9/P+fkcLBMRkbKVEgwjOaV9A7btOcBns9bwwdRVJTqXGjBERErJzKhTNbTaQbfM2v/zfW5ePsn3RyEwEZHDMAuGeSRCZSrWCiz2YLQjEBGpuGpWTubSXplc2isT+8mxH59w9F1ERKQ0khJjI9Wa2RAz+97MFpnZnYf4vpKZvRV8P9HMmgXlvcxsevCaYWbnBeWpZjYpKJtjZvce4pyPmdnOImUXm9nc4JjXI1RdEREREYkz6oEhIlIBmFki8DhwCpADTDaz4e4+t9Bu1wFb3L2VmQ0DHgQuAWYDWe6ea2aNgBlm9jGwDzjR3XeaWTLwrZl97u4TgmtmAT/okmJmrYG7gH7uvsXM6ke04iIiIiISN2LjsaCIiERaL2CRuy9x9/3Am8DQIvsMBV4KPr8LnGRm5u673b1gltJUwAE8pKB3RXLwcjjYYPJX4PYi17gBeNzdtwTnWB+uCoqIiIhIfFMDhohIxZAOrCy0nROUHXKfoMFiG1AXwMx6m9kcYBZwU0GDhpklmtl0YD0wwt0nBue6BRju7kVnMG0DtDGz78xsgpkNOVzAZnajmWWbWfaGDRuOvcYiIiIiElfUgCEiIkfl7hPdvQPQE7jLzFKD8jx37wpkAL3MrKOZNQYuAv55iFMlAa2BQcClwL/NrNZhrvmMu2e5e1ZaWlq4qyQiIiIi5YzmwDiMKVOmbDSz5dGOI0zqARujHUQExXv9IP7rGO/1A2gb5euvApoU2s4Iyg61T46ZJQE1gU2Fd3D3ecGknB2B7ELlW81sJDAEmAe0AhaZGUAVM1vk7q0I9fyY6O4HgKVmtoBQg8bkIwUfRzm5IvzW472O8V4/iP86Rjsfl2txlI8h/n/rql/5F+91POZ8rAaMw3D3uHncZ2bZ7p4V7TgiJd7rB/Ffx3ivH4TqGOUQJgOtzaw5oYaKYcBlRfYZDlwNjAcuBL5xdw+OWRlM4tkUaAcsM7M04EDQeFGZ0AShD7r7p0DDgpOa2c6g8QLgQ0I9L14ws3qEhpQsOVrw8ZKTK8pvPZ7rGO/1g/ivYwzk43ItXvIxVIzfuupXvsV7HUuSj9WAISJSAQSND7cAXwKJwPPuPsfM7gOy3X048BzwipktAjYTauQA6A/caWYHgHzgp+6+0cw6Ay8FE3YmAG+7+ydHCeVL4FQzmwvkAb9x901HOUZERERERA0YIiIVhbt/BnxWpOwPhT7vJTR3RdHjXgFeOUT5TKBbMa5brdBnB24LXiIiIiIixaZJPCuGZ6IdQITFe/0g/usY7/WDilFHObqK8DuI9zrGe/0g/usY7/WT4ov334LqV/7Fex2PuX4WehgmIiIiIiIiIhK71ANDRERERERERGKeGjBEREREREREJOapASPOmNnzZrbezGYXKqtjZiPMbGHwXjuaMZaGmTUxs5FmNtfM5pjZrUF5XNTRzFLNbJKZzQjqd29Q3tzMJprZIjN7y8xSoh1raZhZoplNM7NPgu14q98yM5tlZtMLloeKl9+oFJ/ycVzUUTm5nNdP+VgKKCeX7zoqH8dN/Uqdk9WAEX9eBIYUKbsT+NrdWwNfB9vlVS7wK3dvD/QBbjaz9sRPHfcBJ7p7F6ArMMTM+gAPAg+7eytgC3Bd9EIMi1uBeYW2461+AIPdvWuhtbvj5TcqxfciysflvY7KyfFRP+VjAeXk8l5H5eP4qB+UMierASPOuPsYYHOR4qHAS8Hnl4BzyzKmcHL3Ne4+Nfi8g9A/8HTipI4esjPYTA5eDpwIvBuUl9v6AZhZBnAm8GywbcRR/Y4gLn6jUnzKx0D5r6Nycjmv32HEzW9Uik85GSjHdVQ+Bsp5/Y7gmH6jasCoGBq4+5rg81qgQTSDCRczawZ0AyYSR3UMuo5NB9YDI4DFwFZ3zw12ySH0B6m8egS4HcgPtusSX/WD0B/U/5jZFDO7MSiLm9+olEpc/g7iNR+DcjLlv37Kx3IkcflbiNecrHxc7usHYcjJSZGMTmKPu7uZlfu1c82sGvAe8At33x5qoAwp73V09zygq5nVAj4A2kU3ovAxs7OA9e4+xcwGRTmcSOrv7qvMrD4wwszmF/6yvP9GJTzi5XcQz/kYlJPjgPKxFEu8/BbiOScrH8eFUudk9cCoGNaZWSOA4H19lOMpFTNLJpSYX3P394PiuKojgLtvBUYCfYFaZlbQ4JgBrIpWXKXUDzjHzJYBbxLqFvco8VM/ANx9VfC+ntAf2F7E4W9USiSufgcVJR+DcnJ0wis95WM5irj6LVSUnKx8XH6FIyerAaNiGA5cHXy+GvgoirGUSjAW7Dlgnrv/o9BXcVFHM0sLWpUxs8rAKYTGMI4ELgx2K7f1c/e73D3D3ZsBw4Bv3P1y4qR+AGZW1cyqF3wGTgVmEye/USm1uPkdxHs+BuXkYLdyWz/lYymGuPktxHtOVj4GynH9IHw52dzLbS8iOQQzewMYBNQD1gF3Ax8CbwOZwHLgYncvOolRuWBm/YGxwCz+Oz7st4TG+JX7OppZZ0KT1yQSamB8293vM7MWhFpj6wDTgCvcfV/0Ii29oHvcr939rHiqX1CXD4LNJOB1d/+zmdUlDn6jUnzKx3FRR+Xkclw/5WMpTDm5fNdR+bj81y9cOVkNGCIiIiIiIiIS8zSERERERERERERinhowRERERERERCTmqQFDRERERERERGKeGjBEREREREREJOapAUNEREREREREYp4aMKTcMrOGZvammS02sylm9pmZtSnBeUaZWVYkYjzGOH5kZv+KdhwiIsdK+VhEJDYoH0u8UwOGlEtmZoTWER7l7i3dvQdwF9AgupFFj5klRjsGEal4lI//l/KxiESD8vH/Uj6OP2rAkPJqMHDA3Z8qKHD3Gf7/7d1NaB1VGMbx/6NFrRWEooKLogsXflFDlaBWwUXqUlus+NWFbupKEHdCoSCCiLpREAVFLRQX0q4UxGhRNFRrWzQ1LSiouPIDBdGFtUlfFzOX3IRGk5Caye3/t7nDmTPvnATuEzi8M6n6OMmuJJt740l2J7kzydlJnk3yVZLxJI/MLprk9iT7kxxO8laSC04x58MkTyc5kOTrJLe24zN2iJO8neS29vjPJM8kmUjyfpLhts63Se7oK7+uHf8myc6+Wtva+32R5OVeGLd1n0vyJXDT4n+dkrRo5jHmsaROMI8xjwedGxhaqa4FDs1x7lXgQYAkFwI3A+8A24HLgaGqWg/s7r8oyUXADmCkqjYAB4HH5rjHqqoaBh4Fds4xp98aYF9VXQP8ATwJbAK2AE/0zRsG7gLWA3cnuSHJVcA9wMaqGgKmgAf66n5WVddV1SfzWIckLTXzeLqueSxpOZnH03XN4wG1arkXIC21qvooyYtJLqYJuz1VNZlkBHipqibbeb/NuvRG4GpgLAnAOcD+OW6zt/08RBP6/+Vv4N32+AhwvKpOJDky6/rRqvoVIMle4BZgErge+Lxd12rg53b+FLBnHveXpP+deSxJ3WAea1C4gaGVagLY+i/ndwHbgHuBh+ZZMzQBed885h5vP6eY/h5NMrOr6by+4xNVVe3xyd71VXUySf/3sJip2nW9UVWPn2Idf1XV1DzWK0mni3ncMI8lLTfzuGEeDzAfIdFKtQ84N8n23kCS9b3n7YDXadrXqKqj7dgo8HAvEJOsnVXzU2Bjkiva82uysLc2fw8MJTkryTqadreF2pRkbZLVwGZgDPgA2Jrkkt66k1y2iNqSdDqYx5LUDeaxBp4bGFqR2t3aLcBImn8TNQE8BfzYnv8JOAa81nfZK8APwHj7Up/7Z9X8hebZwDeTjNO0x125gGWNAd8BR4HngcML/8k4QNPyNk7T2new/QOzA3ivXdcocOkiakvSkjOPzWNJ3WAem8dngkx37UiDI8n5NM/Sbaiq35d7PZJ0pjKPJakbzGMNAjswNHDalxEdA14wnCVp+ZjHktQN5rEGhR0YkiRJkiSp8+zAkCRJkiRJnecGhiRJkiRJ6jw3MCRJkiRJUue5gSFJkiRJkjrPDQxJkiRJktR5/wDQXO20VnZOmgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ]], dtype=object)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pybamm.plot_summary_variables(sol)" + ] + }, + { + "cell_type": "markdown", + "id": "french-substance", + "metadata": {}, + "source": [ + "To suggest additional summary variables, open an issue!" + ] + }, + { + "cell_type": "markdown", + "id": "accepting-canada", + "metadata": {}, + "source": [ + "## Choosing which cycles to save" + ] + }, + { + "cell_type": "markdown", + "id": "employed-plate", + "metadata": {}, + "source": [ + "If the simulation contains thousands of cycles, saving each cycle in RAM might not be possible. To get around this, we can use `save_at_cycles`. If this is an integer `n`, every nth cycle is saved. If this is a list, all the cycles in the list are saved.\n", + "The first cycle is always saved." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "polished-trout", + "metadata": { + "tags": [ + "outputPrepend" + ] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:40,911 - [NOTICE] simulation.solve(850): Cycle 1/500 (43.152 ms elapsed) --------------------\n", + "2021-11-20 13:05:40,912 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:40,959 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:40,984 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,010 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,369 - [NOTICE] simulation.solve(972): Capacity is now 3.949 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,370 - [NOTICE] simulation.solve(850): Cycle 2/500 (502.929 ms elapsed) --------------------\n", + "2021-11-20 13:05:41,371 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,396 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:41,421 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,444 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,482 - [NOTICE] simulation.solve(972): Capacity is now 3.933 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,483 - [NOTICE] simulation.solve(850): Cycle 3/500 (615.314 ms elapsed) --------------------\n", + "2021-11-20 13:05:41,483 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,507 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:41,530 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,553 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,594 - [NOTICE] simulation.solve(972): Capacity is now 3.918 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,595 - [NOTICE] simulation.solve(850): Cycle 4/500 (727.418 ms elapsed) --------------------\n", + "2021-11-20 13:05:41,595 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,626 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:41,652 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,677 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,720 - [NOTICE] simulation.solve(972): Capacity is now 3.903 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,721 - [NOTICE] simulation.solve(850): Cycle 5/500 (853.912 ms elapsed) --------------------\n", + "2021-11-20 13:05:41,722 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,751 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:41,776 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,799 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,841 - [NOTICE] simulation.solve(972): Capacity is now 3.888 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,842 - [NOTICE] simulation.solve(850): Cycle 6/500 (975.009 ms elapsed) --------------------\n", + "2021-11-20 13:05:41,843 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,870 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:41,893 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:41,920 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:41,958 - [NOTICE] simulation.solve(972): Capacity is now 3.873 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:41,959 - [NOTICE] simulation.solve(850): Cycle 7/500 (1.092 s elapsed) --------------------\n", + "2021-11-20 13:05:41,959 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:41,986 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,009 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,033 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,085 - [NOTICE] simulation.solve(972): Capacity is now 3.858 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,086 - [NOTICE] simulation.solve(850): Cycle 8/500 (1.219 s elapsed) --------------------\n", + "2021-11-20 13:05:42,087 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,121 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,152 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,178 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,222 - [NOTICE] simulation.solve(972): Capacity is now 3.843 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,223 - [NOTICE] simulation.solve(850): Cycle 9/500 (1.355 s elapsed) --------------------\n", + "2021-11-20 13:05:42,224 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,252 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,276 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,296 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,336 - [NOTICE] simulation.solve(972): Capacity is now 3.829 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,336 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.468 s elapsed) --------------------\n", + "2021-11-20 13:05:42,337 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,359 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,382 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,402 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,441 - [NOTICE] simulation.solve(972): Capacity is now 3.814 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,441 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.573 s elapsed) --------------------\n", + "2021-11-20 13:05:42,442 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,464 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,486 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,510 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,550 - [NOTICE] simulation.solve(972): Capacity is now 3.800 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,551 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.683 s elapsed) --------------------\n", + "2021-11-20 13:05:42,552 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,575 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,598 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,620 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,657 - [NOTICE] simulation.solve(972): Capacity is now 3.786 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,658 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.790 s elapsed) --------------------\n", + "2021-11-20 13:05:42,659 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,683 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,706 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:42,729 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,768 - [NOTICE] simulation.solve(972): Capacity is now 3.772 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,768 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.900 s elapsed) --------------------\n", + "2021-11-20 13:05:42,769 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,794 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,819 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,842 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,881 - [NOTICE] simulation.solve(972): Capacity is now 3.758 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,881 - [NOTICE] simulation.solve(850): Cycle 15/500 (2.014 s elapsed) --------------------\n", + "2021-11-20 13:05:42,882 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:42,907 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:42,932 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:42,954 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:42,992 - [NOTICE] simulation.solve(972): Capacity is now 3.744 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:42,993 - [NOTICE] simulation.solve(850): Cycle 16/500 (2.126 s elapsed) --------------------\n", + "2021-11-20 13:05:42,994 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,017 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,040 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,062 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,104 - [NOTICE] simulation.solve(972): Capacity is now 3.730 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,105 - [NOTICE] simulation.solve(850): Cycle 17/500 (2.238 s elapsed) --------------------\n", + "2021-11-20 13:05:43,106 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,133 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,157 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,179 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,218 - [NOTICE] simulation.solve(972): Capacity is now 3.716 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,219 - [NOTICE] simulation.solve(850): Cycle 18/500 (2.351 s elapsed) --------------------\n", + "2021-11-20 13:05:43,219 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,243 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,269 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,288 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,326 - [NOTICE] simulation.solve(972): Capacity is now 3.703 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,327 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.460 s elapsed) --------------------\n", + "2021-11-20 13:05:43,328 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,353 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,377 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,396 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,432 - [NOTICE] simulation.solve(972): Capacity is now 3.689 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,433 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.565 s elapsed) --------------------\n", + "2021-11-20 13:05:43,433 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,458 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,481 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,500 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,536 - [NOTICE] simulation.solve(972): Capacity is now 3.676 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,537 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.669 s elapsed) --------------------\n", + "2021-11-20 13:05:43,537 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,563 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,586 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,605 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,642 - [NOTICE] simulation.solve(972): Capacity is now 3.663 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,643 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.775 s elapsed) --------------------\n", + "2021-11-20 13:05:43,644 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,668 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,694 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,718 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,757 - [NOTICE] simulation.solve(972): Capacity is now 3.650 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,758 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.890 s elapsed) --------------------\n", + "2021-11-20 13:05:43,759 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,782 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,807 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,831 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,872 - [NOTICE] simulation.solve(972): Capacity is now 3.637 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,873 - [NOTICE] simulation.solve(850): Cycle 24/500 (3.005 s elapsed) --------------------\n", + "2021-11-20 13:05:43,874 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:43,897 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:43,922 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:43,946 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:43,985 - [NOTICE] simulation.solve(972): Capacity is now 3.624 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:43,986 - [NOTICE] simulation.solve(850): Cycle 25/500 (3.118 s elapsed) --------------------\n", + "2021-11-20 13:05:43,986 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,009 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,034 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,056 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,092 - [NOTICE] simulation.solve(972): Capacity is now 3.611 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,093 - [NOTICE] simulation.solve(850): Cycle 26/500 (3.226 s elapsed) --------------------\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:44,094 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,116 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,140 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,163 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,205 - [NOTICE] simulation.solve(972): Capacity is now 3.598 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,206 - [NOTICE] simulation.solve(850): Cycle 27/500 (3.339 s elapsed) --------------------\n", + "2021-11-20 13:05:44,207 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,231 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,257 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,280 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,324 - [NOTICE] simulation.solve(972): Capacity is now 3.585 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,325 - [NOTICE] simulation.solve(850): Cycle 28/500 (3.458 s elapsed) --------------------\n", + "2021-11-20 13:05:44,326 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,349 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,373 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,391 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,427 - [NOTICE] simulation.solve(972): Capacity is now 3.573 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,429 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.561 s elapsed) --------------------\n", + "2021-11-20 13:05:44,430 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,453 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,476 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,496 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,533 - [NOTICE] simulation.solve(972): Capacity is now 3.560 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,533 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.666 s elapsed) --------------------\n", + "2021-11-20 13:05:44,534 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,558 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,581 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,600 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,636 - [NOTICE] simulation.solve(972): Capacity is now 3.548 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,637 - [NOTICE] simulation.solve(850): Cycle 31/500 (3.770 s elapsed) --------------------\n", + "2021-11-20 13:05:44,638 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,662 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,687 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,705 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,741 - [NOTICE] simulation.solve(972): Capacity is now 3.535 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,742 - [NOTICE] simulation.solve(850): Cycle 32/500 (3.874 s elapsed) --------------------\n", + "2021-11-20 13:05:44,744 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,768 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,790 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,810 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,846 - [NOTICE] simulation.solve(972): Capacity is now 3.523 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,847 - [NOTICE] simulation.solve(850): Cycle 33/500 (3.979 s elapsed) --------------------\n", + "2021-11-20 13:05:44,847 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,871 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:44,896 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:44,917 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:44,954 - [NOTICE] simulation.solve(972): Capacity is now 3.511 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:44,955 - [NOTICE] simulation.solve(850): Cycle 34/500 (4.087 s elapsed) --------------------\n", + "2021-11-20 13:05:44,956 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:44,981 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,006 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,029 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,067 - [NOTICE] simulation.solve(972): Capacity is now 3.498 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,068 - [NOTICE] simulation.solve(850): Cycle 35/500 (4.200 s elapsed) --------------------\n", + "2021-11-20 13:05:45,068 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,091 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,116 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,138 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,178 - [NOTICE] simulation.solve(972): Capacity is now 3.486 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,179 - [NOTICE] simulation.solve(850): Cycle 36/500 (4.311 s elapsed) --------------------\n", + "2021-11-20 13:05:45,179 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,200 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,225 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,246 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,286 - [NOTICE] simulation.solve(972): Capacity is now 3.474 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,287 - [NOTICE] simulation.solve(850): Cycle 37/500 (4.419 s elapsed) --------------------\n", + "2021-11-20 13:05:45,288 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,314 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,337 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,360 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,398 - [NOTICE] simulation.solve(972): Capacity is now 3.463 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,400 - [NOTICE] simulation.solve(850): Cycle 38/500 (4.532 s elapsed) --------------------\n", + "2021-11-20 13:05:45,400 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,423 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,446 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:45,470 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,508 - [NOTICE] simulation.solve(972): Capacity is now 3.451 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,509 - [NOTICE] simulation.solve(850): Cycle 39/500 (4.641 s elapsed) --------------------\n", + "2021-11-20 13:05:45,510 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,533 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,556 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,577 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,615 - [NOTICE] simulation.solve(972): Capacity is now 3.439 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,616 - [NOTICE] simulation.solve(850): Cycle 40/500 (4.749 s elapsed) --------------------\n", + "2021-11-20 13:05:45,617 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,639 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,662 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,683 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,722 - [NOTICE] simulation.solve(972): Capacity is now 3.427 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,723 - [NOTICE] simulation.solve(850): Cycle 41/500 (4.855 s elapsed) --------------------\n", + "2021-11-20 13:05:45,724 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,745 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,767 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,787 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,833 - [NOTICE] simulation.solve(972): Capacity is now 3.416 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,834 - [NOTICE] simulation.solve(850): Cycle 42/500 (4.966 s elapsed) --------------------\n", + "2021-11-20 13:05:45,835 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,860 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,885 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:45,902 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:45,940 - [NOTICE] simulation.solve(972): Capacity is now 3.404 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:45,941 - [NOTICE] simulation.solve(850): Cycle 43/500 (5.073 s elapsed) --------------------\n", + "2021-11-20 13:05:45,942 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:45,966 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:45,990 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,012 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,047 - [NOTICE] simulation.solve(972): Capacity is now 3.393 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,048 - [NOTICE] simulation.solve(850): Cycle 44/500 (5.180 s elapsed) --------------------\n", + "2021-11-20 13:05:46,049 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,072 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,096 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,117 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,155 - [NOTICE] simulation.solve(972): Capacity is now 3.381 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,156 - [NOTICE] simulation.solve(850): Cycle 45/500 (5.288 s elapsed) --------------------\n", + "2021-11-20 13:05:46,157 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,184 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,207 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,227 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,266 - [NOTICE] simulation.solve(972): Capacity is now 3.370 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,267 - [NOTICE] simulation.solve(850): Cycle 46/500 (5.399 s elapsed) --------------------\n", + "2021-11-20 13:05:46,268 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,293 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,321 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,344 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,383 - [NOTICE] simulation.solve(972): Capacity is now 3.359 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,384 - [NOTICE] simulation.solve(850): Cycle 47/500 (5.516 s elapsed) --------------------\n", + "2021-11-20 13:05:46,385 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,415 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,441 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,461 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,518 - [NOTICE] simulation.solve(972): Capacity is now 3.348 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,519 - [NOTICE] simulation.solve(850): Cycle 48/500 (5.651 s elapsed) --------------------\n", + "2021-11-20 13:05:46,520 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,547 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,572 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,589 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,626 - [NOTICE] simulation.solve(972): Capacity is now 3.337 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,627 - [NOTICE] simulation.solve(850): Cycle 49/500 (5.759 s elapsed) --------------------\n", + "2021-11-20 13:05:46,628 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,647 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,669 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,689 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,725 - [NOTICE] simulation.solve(972): Capacity is now 3.326 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,726 - [NOTICE] simulation.solve(850): Cycle 50/500 (5.858 s elapsed) --------------------\n", + "2021-11-20 13:05:46,727 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,746 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,769 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,788 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,822 - [NOTICE] simulation.solve(972): Capacity is now 3.315 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,823 - [NOTICE] simulation.solve(850): Cycle 51/500 (5.956 s elapsed) --------------------\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:46,823 - [NOTICE] simulation.solve(884): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,843 - [NOTICE] simulation.solve(884): Cycle 51/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,865 - [NOTICE] simulation.solve(884): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,885 - [NOTICE] simulation.solve(884): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:46,921 - [NOTICE] simulation.solve(972): Capacity is now 3.304 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:46,921 - [NOTICE] simulation.solve(850): Cycle 52/500 (6.054 s elapsed) --------------------\n", + "2021-11-20 13:05:46,922 - [NOTICE] simulation.solve(884): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:46,943 - [NOTICE] simulation.solve(884): Cycle 52/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:46,966 - [NOTICE] simulation.solve(884): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:46,986 - [NOTICE] simulation.solve(884): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,027 - [NOTICE] simulation.solve(972): Capacity is now 3.293 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,028 - [NOTICE] simulation.solve(850): Cycle 53/500 (6.161 s elapsed) --------------------\n", + "2021-11-20 13:05:47,029 - [NOTICE] simulation.solve(884): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,050 - [NOTICE] simulation.solve(884): Cycle 53/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,074 - [NOTICE] simulation.solve(884): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,095 - [NOTICE] simulation.solve(884): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,132 - [NOTICE] simulation.solve(972): Capacity is now 3.282 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,133 - [NOTICE] simulation.solve(850): Cycle 54/500 (6.266 s elapsed) --------------------\n", + "2021-11-20 13:05:47,134 - [NOTICE] simulation.solve(884): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,154 - [NOTICE] simulation.solve(884): Cycle 54/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,178 - [NOTICE] simulation.solve(884): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,198 - [NOTICE] simulation.solve(884): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,233 - [NOTICE] simulation.solve(972): Capacity is now 3.272 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,234 - [NOTICE] simulation.solve(850): Cycle 55/500 (6.367 s elapsed) --------------------\n", + "2021-11-20 13:05:47,235 - [NOTICE] simulation.solve(884): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,254 - [NOTICE] simulation.solve(884): Cycle 55/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,277 - [NOTICE] simulation.solve(884): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,297 - [NOTICE] simulation.solve(884): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,335 - [NOTICE] simulation.solve(972): Capacity is now 3.261 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,335 - [NOTICE] simulation.solve(850): Cycle 56/500 (6.468 s elapsed) --------------------\n", + "2021-11-20 13:05:47,336 - [NOTICE] simulation.solve(884): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,357 - [NOTICE] simulation.solve(884): Cycle 56/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,380 - [NOTICE] simulation.solve(884): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,399 - [NOTICE] simulation.solve(884): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,434 - [NOTICE] simulation.solve(972): Capacity is now 3.251 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,435 - [NOTICE] simulation.solve(850): Cycle 57/500 (6.567 s elapsed) --------------------\n", + "2021-11-20 13:05:47,436 - [NOTICE] simulation.solve(884): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,457 - [NOTICE] simulation.solve(884): Cycle 57/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,480 - [NOTICE] simulation.solve(884): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,501 - [NOTICE] simulation.solve(884): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,540 - [NOTICE] simulation.solve(972): Capacity is now 3.241 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,542 - [NOTICE] simulation.solve(850): Cycle 58/500 (6.674 s elapsed) --------------------\n", + "2021-11-20 13:05:47,543 - [NOTICE] simulation.solve(884): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,569 - [NOTICE] simulation.solve(884): Cycle 58/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,596 - [NOTICE] simulation.solve(884): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,620 - [NOTICE] simulation.solve(884): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,661 - [NOTICE] simulation.solve(972): Capacity is now 3.230 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,662 - [NOTICE] simulation.solve(850): Cycle 59/500 (6.794 s elapsed) --------------------\n", + "2021-11-20 13:05:47,663 - [NOTICE] simulation.solve(884): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,686 - [NOTICE] simulation.solve(884): Cycle 59/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,710 - [NOTICE] simulation.solve(884): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,729 - [NOTICE] simulation.solve(884): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,766 - [NOTICE] simulation.solve(972): Capacity is now 3.220 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,767 - [NOTICE] simulation.solve(850): Cycle 60/500 (6.899 s elapsed) --------------------\n", + "2021-11-20 13:05:47,767 - [NOTICE] simulation.solve(884): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,790 - [NOTICE] simulation.solve(884): Cycle 60/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,813 - [NOTICE] simulation.solve(884): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,830 - [NOTICE] simulation.solve(884): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,868 - [NOTICE] simulation.solve(972): Capacity is now 3.210 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,869 - [NOTICE] simulation.solve(850): Cycle 61/500 (7.001 s elapsed) --------------------\n", + "2021-11-20 13:05:47,870 - [NOTICE] simulation.solve(884): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,891 - [NOTICE] simulation.solve(884): Cycle 61/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:47,915 - [NOTICE] simulation.solve(884): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:47,932 - [NOTICE] simulation.solve(884): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:47,968 - [NOTICE] simulation.solve(972): Capacity is now 3.200 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:47,969 - [NOTICE] simulation.solve(850): Cycle 62/500 (7.102 s elapsed) --------------------\n", + "2021-11-20 13:05:47,970 - [NOTICE] simulation.solve(884): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:47,992 - [NOTICE] simulation.solve(884): Cycle 62/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,022 - [NOTICE] simulation.solve(884): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,039 - [NOTICE] simulation.solve(884): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,076 - [NOTICE] simulation.solve(972): Capacity is now 3.190 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:48,077 - [NOTICE] simulation.solve(850): Cycle 63/500 (7.210 s elapsed) --------------------\n", + "2021-11-20 13:05:48,078 - [NOTICE] simulation.solve(884): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,101 - [NOTICE] simulation.solve(884): Cycle 63/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,126 - [NOTICE] simulation.solve(884): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:48,145 - [NOTICE] simulation.solve(884): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,183 - [NOTICE] simulation.solve(972): Capacity is now 3.180 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:48,183 - [NOTICE] simulation.solve(850): Cycle 64/500 (7.316 s elapsed) --------------------\n", + "2021-11-20 13:05:48,184 - [NOTICE] simulation.solve(884): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,208 - [NOTICE] simulation.solve(884): Cycle 64/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,231 - [NOTICE] simulation.solve(884): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,249 - [NOTICE] simulation.solve(884): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,286 - [NOTICE] simulation.solve(972): Capacity is now 3.171 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:48,288 - [NOTICE] simulation.solve(850): Cycle 65/500 (7.420 s elapsed) --------------------\n", + "2021-11-20 13:05:48,288 - [NOTICE] simulation.solve(884): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,307 - [NOTICE] simulation.solve(884): Cycle 65/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,331 - [NOTICE] simulation.solve(884): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,350 - [NOTICE] simulation.solve(884): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,387 - [NOTICE] simulation.solve(972): Capacity is now 3.161 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", + "2021-11-20 13:05:48,388 - [NOTICE] simulation.solve(850): Cycle 66/500 (7.520 s elapsed) --------------------\n", + "2021-11-20 13:05:48,389 - [NOTICE] simulation.solve(884): Cycle 66/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,410 - [NOTICE] simulation.solve(884): Cycle 66/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,433 - [NOTICE] simulation.solve(884): Cycle 66/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,450 - [NOTICE] simulation.solve(884): Cycle 66/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,486 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (3.152 Ah) is below stopping capacity (3.159 Ah).\n", + "2021-11-20 13:05:48,488 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 7.620 s\n", + "2021-11-20 13:05:48,522 - [NOTICE] simulation.solve(850): Cycle 1/500 (33.269 ms elapsed) --------------------\n", + "2021-11-20 13:05:48,523 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,558 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,580 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,597 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,745 - [NOTICE] simulation.solve(972): Capacity is now 3.152 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:48,746 - [NOTICE] simulation.solve(850): Cycle 2/500 (257.841 ms elapsed) --------------------\n", + "2021-11-20 13:05:48,747 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,765 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,787 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,804 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,839 - [NOTICE] simulation.solve(972): Capacity is now 3.142 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:48,840 - [NOTICE] simulation.solve(850): Cycle 3/500 (352.077 ms elapsed) --------------------\n", + "2021-11-20 13:05:48,841 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,860 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,883 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,901 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:48,939 - [NOTICE] simulation.solve(972): Capacity is now 3.133 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:48,940 - [NOTICE] simulation.solve(850): Cycle 4/500 (450.966 ms elapsed) --------------------\n", + "2021-11-20 13:05:48,941 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:48,959 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:48,982 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:48,999 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,035 - [NOTICE] simulation.solve(972): Capacity is now 3.124 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,036 - [NOTICE] simulation.solve(850): Cycle 5/500 (547.077 ms elapsed) --------------------\n", + "2021-11-20 13:05:49,037 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,055 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,078 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,098 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,134 - [NOTICE] simulation.solve(972): Capacity is now 3.115 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,135 - [NOTICE] simulation.solve(850): Cycle 6/500 (646.149 ms elapsed) --------------------\n", + "2021-11-20 13:05:49,136 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,156 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,180 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,198 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,235 - [NOTICE] simulation.solve(972): Capacity is now 3.107 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,235 - [NOTICE] simulation.solve(850): Cycle 7/500 (746.308 ms elapsed) --------------------\n", + "2021-11-20 13:05:49,236 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,255 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,277 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,296 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,335 - [NOTICE] simulation.solve(972): Capacity is now 3.098 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,335 - [NOTICE] simulation.solve(850): Cycle 8/500 (846.322 ms elapsed) --------------------\n", + "2021-11-20 13:05:49,336 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,356 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,379 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,399 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,437 - [NOTICE] simulation.solve(972): Capacity is now 3.090 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,437 - [NOTICE] simulation.solve(850): Cycle 9/500 (948.255 ms elapsed) --------------------\n", + "2021-11-20 13:05:49,438 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,458 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,482 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,500 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,534 - [NOTICE] simulation.solve(972): Capacity is now 3.082 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:49,535 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.046 s elapsed) --------------------\n", + "2021-11-20 13:05:49,536 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,556 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,577 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,597 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,631 - [NOTICE] simulation.solve(972): Capacity is now 3.074 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,632 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.143 s elapsed) --------------------\n", + "2021-11-20 13:05:49,633 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,654 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,676 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,695 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,730 - [NOTICE] simulation.solve(972): Capacity is now 3.066 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,731 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.243 s elapsed) --------------------\n", + "2021-11-20 13:05:49,732 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,753 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,777 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,794 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,828 - [NOTICE] simulation.solve(972): Capacity is now 3.058 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,828 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.340 s elapsed) --------------------\n", + "2021-11-20 13:05:49,829 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,850 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,872 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,891 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:49,927 - [NOTICE] simulation.solve(972): Capacity is now 3.051 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:49,928 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.440 s elapsed) --------------------\n", + "2021-11-20 13:05:49,929 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:49,951 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:49,975 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:49,996 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,032 - [NOTICE] simulation.solve(972): Capacity is now 3.043 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,033 - [NOTICE] simulation.solve(850): Cycle 15/500 (1.545 s elapsed) --------------------\n", + "2021-11-20 13:05:50,034 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,056 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,080 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,099 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,141 - [NOTICE] simulation.solve(972): Capacity is now 3.036 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,142 - [NOTICE] simulation.solve(850): Cycle 16/500 (1.654 s elapsed) --------------------\n", + "2021-11-20 13:05:50,143 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,165 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,192 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,216 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,264 - [NOTICE] simulation.solve(972): Capacity is now 3.029 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,266 - [NOTICE] simulation.solve(850): Cycle 17/500 (1.777 s elapsed) --------------------\n", + "2021-11-20 13:05:50,267 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,292 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,335 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,364 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,402 - [NOTICE] simulation.solve(972): Capacity is now 3.022 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,404 - [NOTICE] simulation.solve(850): Cycle 18/500 (1.915 s elapsed) --------------------\n", + "2021-11-20 13:05:50,404 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,428 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,451 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,470 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,504 - [NOTICE] simulation.solve(972): Capacity is now 3.016 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,505 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.017 s elapsed) --------------------\n", + "2021-11-20 13:05:50,506 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,528 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,553 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,570 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,612 - [NOTICE] simulation.solve(972): Capacity is now 3.009 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,614 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.125 s elapsed) --------------------\n", + "2021-11-20 13:05:50,615 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,645 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,672 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,692 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,746 - [NOTICE] simulation.solve(972): Capacity is now 3.003 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,746 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.258 s elapsed) --------------------\n", + "2021-11-20 13:05:50,747 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,768 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,795 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,811 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,846 - [NOTICE] simulation.solve(972): Capacity is now 2.997 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,847 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.358 s elapsed) --------------------\n", + "2021-11-20 13:05:50,848 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,866 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:50,889 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:50,906 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:50,942 - [NOTICE] simulation.solve(972): Capacity is now 2.990 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:50,942 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.453 s elapsed) --------------------\n", + "2021-11-20 13:05:50,943 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:50,962 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:50,986 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,003 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,037 - [NOTICE] simulation.solve(972): Capacity is now 2.984 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,038 - [NOTICE] simulation.solve(850): Cycle 24/500 (2.549 s elapsed) --------------------\n", + "2021-11-20 13:05:51,038 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,056 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,079 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,096 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,131 - [NOTICE] simulation.solve(972): Capacity is now 2.978 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,131 - [NOTICE] simulation.solve(850): Cycle 25/500 (2.642 s elapsed) --------------------\n", + "2021-11-20 13:05:51,132 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,152 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,176 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,195 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,229 - [NOTICE] simulation.solve(972): Capacity is now 2.973 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,230 - [NOTICE] simulation.solve(850): Cycle 26/500 (2.741 s elapsed) --------------------\n", + "2021-11-20 13:05:51,231 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,250 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,274 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,292 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,327 - [NOTICE] simulation.solve(972): Capacity is now 2.967 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,328 - [NOTICE] simulation.solve(850): Cycle 27/500 (2.839 s elapsed) --------------------\n", + "2021-11-20 13:05:51,328 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,348 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,370 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,392 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,427 - [NOTICE] simulation.solve(972): Capacity is now 2.961 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,428 - [NOTICE] simulation.solve(850): Cycle 28/500 (2.939 s elapsed) --------------------\n", + "2021-11-20 13:05:51,429 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,449 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,473 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,491 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,528 - [NOTICE] simulation.solve(972): Capacity is now 2.956 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,529 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.040 s elapsed) --------------------\n", + "2021-11-20 13:05:51,530 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,549 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,572 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,591 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,625 - [NOTICE] simulation.solve(972): Capacity is now 2.950 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,626 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.137 s elapsed) --------------------\n", + "2021-11-20 13:05:51,626 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,645 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,668 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,687 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,723 - [NOTICE] simulation.solve(972): Capacity is now 2.944 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,724 - [NOTICE] simulation.solve(850): Cycle 31/500 (3.235 s elapsed) --------------------\n", + "2021-11-20 13:05:51,726 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,745 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,769 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,790 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,827 - [NOTICE] simulation.solve(972): Capacity is now 2.939 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,828 - [NOTICE] simulation.solve(850): Cycle 32/500 (3.339 s elapsed) --------------------\n", + "2021-11-20 13:05:51,828 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,848 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,874 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,894 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:51,931 - [NOTICE] simulation.solve(972): Capacity is now 2.934 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:51,932 - [NOTICE] simulation.solve(850): Cycle 33/500 (3.443 s elapsed) --------------------\n", + "2021-11-20 13:05:51,933 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:51,952 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:51,975 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:51,995 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,032 - [NOTICE] simulation.solve(972): Capacity is now 2.928 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,033 - [NOTICE] simulation.solve(850): Cycle 34/500 (3.544 s elapsed) --------------------\n", + "2021-11-20 13:05:52,034 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,054 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,078 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,097 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,139 - [NOTICE] simulation.solve(972): Capacity is now 2.923 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:52,141 - [NOTICE] simulation.solve(850): Cycle 35/500 (3.652 s elapsed) --------------------\n", + "2021-11-20 13:05:52,141 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,163 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,188 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,207 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,245 - [NOTICE] simulation.solve(972): Capacity is now 2.917 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,246 - [NOTICE] simulation.solve(850): Cycle 36/500 (3.757 s elapsed) --------------------\n", + "2021-11-20 13:05:52,247 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,270 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,293 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,311 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,349 - [NOTICE] simulation.solve(972): Capacity is now 2.912 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,349 - [NOTICE] simulation.solve(850): Cycle 37/500 (3.860 s elapsed) --------------------\n", + "2021-11-20 13:05:52,350 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,371 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,396 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,414 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,452 - [NOTICE] simulation.solve(972): Capacity is now 2.906 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,453 - [NOTICE] simulation.solve(850): Cycle 38/500 (3.964 s elapsed) --------------------\n", + "2021-11-20 13:05:52,454 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,475 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,498 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,515 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,553 - [NOTICE] simulation.solve(972): Capacity is now 2.901 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,554 - [NOTICE] simulation.solve(850): Cycle 39/500 (4.065 s elapsed) --------------------\n", + "2021-11-20 13:05:52,555 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,576 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,600 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,616 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,654 - [NOTICE] simulation.solve(972): Capacity is now 2.895 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,655 - [NOTICE] simulation.solve(850): Cycle 40/500 (4.166 s elapsed) --------------------\n", + "2021-11-20 13:05:52,656 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,676 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,699 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,716 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,753 - [NOTICE] simulation.solve(972): Capacity is now 2.890 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,754 - [NOTICE] simulation.solve(850): Cycle 41/500 (4.265 s elapsed) --------------------\n", + "2021-11-20 13:05:52,755 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,778 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,802 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,819 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,857 - [NOTICE] simulation.solve(972): Capacity is now 2.884 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,857 - [NOTICE] simulation.solve(850): Cycle 42/500 (4.368 s elapsed) --------------------\n", + "2021-11-20 13:05:52,858 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,881 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:52,904 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:52,920 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:52,956 - [NOTICE] simulation.solve(972): Capacity is now 2.879 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:52,957 - [NOTICE] simulation.solve(850): Cycle 43/500 (4.468 s elapsed) --------------------\n", + "2021-11-20 13:05:52,958 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:52,979 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,002 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,019 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,057 - [NOTICE] simulation.solve(972): Capacity is now 2.873 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,058 - [NOTICE] simulation.solve(850): Cycle 44/500 (4.569 s elapsed) --------------------\n", + "2021-11-20 13:05:53,058 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,080 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,103 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,119 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,157 - [NOTICE] simulation.solve(972): Capacity is now 2.867 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,158 - [NOTICE] simulation.solve(850): Cycle 45/500 (4.669 s elapsed) --------------------\n", + "2021-11-20 13:05:53,158 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,180 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,205 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,222 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,261 - [NOTICE] simulation.solve(972): Capacity is now 2.862 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,262 - [NOTICE] simulation.solve(850): Cycle 46/500 (4.773 s elapsed) --------------------\n", + "2021-11-20 13:05:53,263 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,283 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,307 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,327 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,366 - [NOTICE] simulation.solve(972): Capacity is now 2.856 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,367 - [NOTICE] simulation.solve(850): Cycle 47/500 (4.878 s elapsed) --------------------\n", + "2021-11-20 13:05:53,368 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,391 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:53,414 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,434 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,631 - [NOTICE] simulation.solve(972): Capacity is now 2.850 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,632 - [NOTICE] simulation.solve(850): Cycle 48/500 (5.143 s elapsed) --------------------\n", + "2021-11-20 13:05:53,633 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,655 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,677 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,697 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,736 - [NOTICE] simulation.solve(972): Capacity is now 2.844 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,737 - [NOTICE] simulation.solve(850): Cycle 49/500 (5.249 s elapsed) --------------------\n", + "2021-11-20 13:05:53,738 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,761 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,784 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,802 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,841 - [NOTICE] simulation.solve(972): Capacity is now 2.838 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,842 - [NOTICE] simulation.solve(850): Cycle 50/500 (5.353 s elapsed) --------------------\n", + "2021-11-20 13:05:53,842 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,860 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,882 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:53,901 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:53,940 - [NOTICE] simulation.solve(972): Capacity is now 2.832 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:53,941 - [NOTICE] simulation.solve(850): Cycle 51/500 (5.453 s elapsed) --------------------\n", + "2021-11-20 13:05:53,942 - [NOTICE] simulation.solve(884): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:53,960 - [NOTICE] simulation.solve(884): Cycle 51/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:53,983 - [NOTICE] simulation.solve(884): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,002 - [NOTICE] simulation.solve(884): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,044 - [NOTICE] simulation.solve(972): Capacity is now 2.826 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,045 - [NOTICE] simulation.solve(850): Cycle 52/500 (5.556 s elapsed) --------------------\n", + "2021-11-20 13:05:54,045 - [NOTICE] simulation.solve(884): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,066 - [NOTICE] simulation.solve(884): Cycle 52/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,089 - [NOTICE] simulation.solve(884): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,107 - [NOTICE] simulation.solve(884): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,145 - [NOTICE] simulation.solve(972): Capacity is now 2.820 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,145 - [NOTICE] simulation.solve(850): Cycle 53/500 (5.657 s elapsed) --------------------\n", + "2021-11-20 13:05:54,146 - [NOTICE] simulation.solve(884): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,163 - [NOTICE] simulation.solve(884): Cycle 53/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,188 - [NOTICE] simulation.solve(884): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,206 - [NOTICE] simulation.solve(884): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,244 - [NOTICE] simulation.solve(972): Capacity is now 2.813 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,245 - [NOTICE] simulation.solve(850): Cycle 54/500 (5.757 s elapsed) --------------------\n", + "2021-11-20 13:05:54,246 - [NOTICE] simulation.solve(884): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,263 - [NOTICE] simulation.solve(884): Cycle 54/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,288 - [NOTICE] simulation.solve(884): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,309 - [NOTICE] simulation.solve(884): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,347 - [NOTICE] simulation.solve(972): Capacity is now 2.807 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,348 - [NOTICE] simulation.solve(850): Cycle 55/500 (5.859 s elapsed) --------------------\n", + "2021-11-20 13:05:54,349 - [NOTICE] simulation.solve(884): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,368 - [NOTICE] simulation.solve(884): Cycle 55/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,391 - [NOTICE] simulation.solve(884): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,406 - [NOTICE] simulation.solve(884): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,443 - [NOTICE] simulation.solve(972): Capacity is now 2.801 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,444 - [NOTICE] simulation.solve(850): Cycle 56/500 (5.955 s elapsed) --------------------\n", + "2021-11-20 13:05:54,446 - [NOTICE] simulation.solve(884): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,465 - [NOTICE] simulation.solve(884): Cycle 56/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,489 - [NOTICE] simulation.solve(884): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,504 - [NOTICE] simulation.solve(884): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,542 - [NOTICE] simulation.solve(972): Capacity is now 2.794 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,543 - [NOTICE] simulation.solve(850): Cycle 57/500 (6.054 s elapsed) --------------------\n", + "2021-11-20 13:05:54,543 - [NOTICE] simulation.solve(884): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,563 - [NOTICE] simulation.solve(884): Cycle 57/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,586 - [NOTICE] simulation.solve(884): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,601 - [NOTICE] simulation.solve(884): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,638 - [NOTICE] simulation.solve(972): Capacity is now 2.788 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,638 - [NOTICE] simulation.solve(850): Cycle 58/500 (6.150 s elapsed) --------------------\n", + "2021-11-20 13:05:54,639 - [NOTICE] simulation.solve(884): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,658 - [NOTICE] simulation.solve(884): Cycle 58/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,683 - [NOTICE] simulation.solve(884): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,700 - [NOTICE] simulation.solve(884): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,739 - [NOTICE] simulation.solve(972): Capacity is now 2.781 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,739 - [NOTICE] simulation.solve(850): Cycle 59/500 (6.251 s elapsed) --------------------\n", + "2021-11-20 13:05:54,740 - [NOTICE] simulation.solve(884): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,758 - [NOTICE] simulation.solve(884): Cycle 59/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,781 - [NOTICE] simulation.solve(884): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,796 - [NOTICE] simulation.solve(884): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,833 - [NOTICE] simulation.solve(972): Capacity is now 2.774 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:54,834 - [NOTICE] simulation.solve(850): Cycle 60/500 (6.346 s elapsed) --------------------\n", + "2021-11-20 13:05:54,835 - [NOTICE] simulation.solve(884): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,855 - [NOTICE] simulation.solve(884): Cycle 60/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,879 - [NOTICE] simulation.solve(884): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,894 - [NOTICE] simulation.solve(884): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:54,935 - [NOTICE] simulation.solve(972): Capacity is now 2.768 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:54,936 - [NOTICE] simulation.solve(850): Cycle 61/500 (6.447 s elapsed) --------------------\n", + "2021-11-20 13:05:54,937 - [NOTICE] simulation.solve(884): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:54,955 - [NOTICE] simulation.solve(884): Cycle 61/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:54,980 - [NOTICE] simulation.solve(884): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:54,996 - [NOTICE] simulation.solve(884): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,037 - [NOTICE] simulation.solve(972): Capacity is now 2.761 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,038 - [NOTICE] simulation.solve(850): Cycle 62/500 (6.549 s elapsed) --------------------\n", + "2021-11-20 13:05:55,039 - [NOTICE] simulation.solve(884): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,058 - [NOTICE] simulation.solve(884): Cycle 62/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,080 - [NOTICE] simulation.solve(884): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,097 - [NOTICE] simulation.solve(884): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,140 - [NOTICE] simulation.solve(972): Capacity is now 2.754 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,142 - [NOTICE] simulation.solve(850): Cycle 63/500 (6.653 s elapsed) --------------------\n", + "2021-11-20 13:05:55,143 - [NOTICE] simulation.solve(884): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,165 - [NOTICE] simulation.solve(884): Cycle 63/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,196 - [NOTICE] simulation.solve(884): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,212 - [NOTICE] simulation.solve(884): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,254 - [NOTICE] simulation.solve(972): Capacity is now 2.747 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,255 - [NOTICE] simulation.solve(850): Cycle 64/500 (6.767 s elapsed) --------------------\n", + "2021-11-20 13:05:55,256 - [NOTICE] simulation.solve(884): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,277 - [NOTICE] simulation.solve(884): Cycle 64/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,303 - [NOTICE] simulation.solve(884): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,319 - [NOTICE] simulation.solve(884): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,362 - [NOTICE] simulation.solve(972): Capacity is now 2.741 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,363 - [NOTICE] simulation.solve(850): Cycle 65/500 (6.874 s elapsed) --------------------\n", + "2021-11-20 13:05:55,364 - [NOTICE] simulation.solve(884): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,386 - [NOTICE] simulation.solve(884): Cycle 65/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,410 - [NOTICE] simulation.solve(884): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,444 - [NOTICE] simulation.solve(884): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,489 - [NOTICE] simulation.solve(972): Capacity is now 2.734 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,490 - [NOTICE] simulation.solve(850): Cycle 66/500 (7.001 s elapsed) --------------------\n", + "2021-11-20 13:05:55,491 - [NOTICE] simulation.solve(884): Cycle 66/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,513 - [NOTICE] simulation.solve(884): Cycle 66/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,537 - [NOTICE] simulation.solve(884): Cycle 66/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,555 - [NOTICE] simulation.solve(884): Cycle 66/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,598 - [NOTICE] simulation.solve(972): Capacity is now 2.727 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,599 - [NOTICE] simulation.solve(850): Cycle 67/500 (7.110 s elapsed) --------------------\n", + "2021-11-20 13:05:55,600 - [NOTICE] simulation.solve(884): Cycle 67/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,623 - [NOTICE] simulation.solve(884): Cycle 67/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,646 - [NOTICE] simulation.solve(884): Cycle 67/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,664 - [NOTICE] simulation.solve(884): Cycle 67/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,705 - [NOTICE] simulation.solve(972): Capacity is now 2.720 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,706 - [NOTICE] simulation.solve(850): Cycle 68/500 (7.218 s elapsed) --------------------\n", + "2021-11-20 13:05:55,707 - [NOTICE] simulation.solve(884): Cycle 68/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,731 - [NOTICE] simulation.solve(884): Cycle 68/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,757 - [NOTICE] simulation.solve(884): Cycle 68/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,776 - [NOTICE] simulation.solve(884): Cycle 68/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,825 - [NOTICE] simulation.solve(972): Capacity is now 2.713 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,825 - [NOTICE] simulation.solve(850): Cycle 69/500 (7.337 s elapsed) --------------------\n", + "2021-11-20 13:05:55,826 - [NOTICE] simulation.solve(884): Cycle 69/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,847 - [NOTICE] simulation.solve(884): Cycle 69/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:55,875 - [NOTICE] simulation.solve(884): Cycle 69/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:55,892 - [NOTICE] simulation.solve(884): Cycle 69/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:55,934 - [NOTICE] simulation.solve(972): Capacity is now 2.706 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:55,935 - [NOTICE] simulation.solve(850): Cycle 70/500 (7.447 s elapsed) --------------------\n", + "2021-11-20 13:05:55,937 - [NOTICE] simulation.solve(884): Cycle 70/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:55,975 - [NOTICE] simulation.solve(884): Cycle 70/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,006 - [NOTICE] simulation.solve(884): Cycle 70/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,026 - [NOTICE] simulation.solve(884): Cycle 70/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,068 - [NOTICE] simulation.solve(972): Capacity is now 2.699 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,069 - [NOTICE] simulation.solve(850): Cycle 71/500 (7.580 s elapsed) --------------------\n", + "2021-11-20 13:05:56,070 - [NOTICE] simulation.solve(884): Cycle 71/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,093 - [NOTICE] simulation.solve(884): Cycle 71/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,120 - [NOTICE] simulation.solve(884): Cycle 71/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,139 - [NOTICE] simulation.solve(884): Cycle 71/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,182 - [NOTICE] simulation.solve(972): Capacity is now 2.692 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,182 - [NOTICE] simulation.solve(850): Cycle 72/500 (7.694 s elapsed) --------------------\n", + "2021-11-20 13:05:56,183 - [NOTICE] simulation.solve(884): Cycle 72/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,205 - [NOTICE] simulation.solve(884): Cycle 72/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:56,227 - [NOTICE] simulation.solve(884): Cycle 72/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,245 - [NOTICE] simulation.solve(884): Cycle 72/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,288 - [NOTICE] simulation.solve(972): Capacity is now 2.686 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,289 - [NOTICE] simulation.solve(850): Cycle 73/500 (7.800 s elapsed) --------------------\n", + "2021-11-20 13:05:56,290 - [NOTICE] simulation.solve(884): Cycle 73/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,311 - [NOTICE] simulation.solve(884): Cycle 73/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,335 - [NOTICE] simulation.solve(884): Cycle 73/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,353 - [NOTICE] simulation.solve(884): Cycle 73/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,393 - [NOTICE] simulation.solve(972): Capacity is now 2.679 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,393 - [NOTICE] simulation.solve(850): Cycle 74/500 (7.905 s elapsed) --------------------\n", + "2021-11-20 13:05:56,394 - [NOTICE] simulation.solve(884): Cycle 74/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,416 - [NOTICE] simulation.solve(884): Cycle 74/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,440 - [NOTICE] simulation.solve(884): Cycle 74/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,457 - [NOTICE] simulation.solve(884): Cycle 74/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,498 - [NOTICE] simulation.solve(972): Capacity is now 2.672 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,499 - [NOTICE] simulation.solve(850): Cycle 75/500 (8.010 s elapsed) --------------------\n", + "2021-11-20 13:05:56,500 - [NOTICE] simulation.solve(884): Cycle 75/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,522 - [NOTICE] simulation.solve(884): Cycle 75/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,546 - [NOTICE] simulation.solve(884): Cycle 75/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,565 - [NOTICE] simulation.solve(884): Cycle 75/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,603 - [NOTICE] simulation.solve(972): Capacity is now 2.665 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,604 - [NOTICE] simulation.solve(850): Cycle 76/500 (8.115 s elapsed) --------------------\n", + "2021-11-20 13:05:56,604 - [NOTICE] simulation.solve(884): Cycle 76/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,621 - [NOTICE] simulation.solve(884): Cycle 76/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,644 - [NOTICE] simulation.solve(884): Cycle 76/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,659 - [NOTICE] simulation.solve(884): Cycle 76/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,700 - [NOTICE] simulation.solve(972): Capacity is now 2.658 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,700 - [NOTICE] simulation.solve(850): Cycle 77/500 (8.212 s elapsed) --------------------\n", + "2021-11-20 13:05:56,701 - [NOTICE] simulation.solve(884): Cycle 77/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,720 - [NOTICE] simulation.solve(884): Cycle 77/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,743 - [NOTICE] simulation.solve(884): Cycle 77/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,759 - [NOTICE] simulation.solve(884): Cycle 77/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,799 - [NOTICE] simulation.solve(972): Capacity is now 2.651 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,800 - [NOTICE] simulation.solve(850): Cycle 78/500 (8.312 s elapsed) --------------------\n", + "2021-11-20 13:05:56,801 - [NOTICE] simulation.solve(884): Cycle 78/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,820 - [NOTICE] simulation.solve(884): Cycle 78/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,846 - [NOTICE] simulation.solve(884): Cycle 78/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,864 - [NOTICE] simulation.solve(884): Cycle 78/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:56,912 - [NOTICE] simulation.solve(972): Capacity is now 2.644 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:56,912 - [NOTICE] simulation.solve(850): Cycle 79/500 (8.424 s elapsed) --------------------\n", + "2021-11-20 13:05:56,913 - [NOTICE] simulation.solve(884): Cycle 79/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:56,931 - [NOTICE] simulation.solve(884): Cycle 79/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:56,955 - [NOTICE] simulation.solve(884): Cycle 79/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:56,970 - [NOTICE] simulation.solve(884): Cycle 79/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,010 - [NOTICE] simulation.solve(972): Capacity is now 2.637 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,010 - [NOTICE] simulation.solve(850): Cycle 80/500 (8.521 s elapsed) --------------------\n", + "2021-11-20 13:05:57,011 - [NOTICE] simulation.solve(884): Cycle 80/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,029 - [NOTICE] simulation.solve(884): Cycle 80/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,052 - [NOTICE] simulation.solve(884): Cycle 80/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,067 - [NOTICE] simulation.solve(884): Cycle 80/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,108 - [NOTICE] simulation.solve(972): Capacity is now 2.631 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,109 - [NOTICE] simulation.solve(850): Cycle 81/500 (8.620 s elapsed) --------------------\n", + "2021-11-20 13:05:57,110 - [NOTICE] simulation.solve(884): Cycle 81/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,127 - [NOTICE] simulation.solve(884): Cycle 81/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,152 - [NOTICE] simulation.solve(884): Cycle 81/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,168 - [NOTICE] simulation.solve(884): Cycle 81/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,207 - [NOTICE] simulation.solve(972): Capacity is now 2.624 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,208 - [NOTICE] simulation.solve(850): Cycle 82/500 (8.719 s elapsed) --------------------\n", + "2021-11-20 13:05:57,208 - [NOTICE] simulation.solve(884): Cycle 82/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,226 - [NOTICE] simulation.solve(884): Cycle 82/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,252 - [NOTICE] simulation.solve(884): Cycle 82/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,267 - [NOTICE] simulation.solve(884): Cycle 82/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,307 - [NOTICE] simulation.solve(972): Capacity is now 2.617 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,309 - [NOTICE] simulation.solve(850): Cycle 83/500 (8.820 s elapsed) --------------------\n", + "2021-11-20 13:05:57,310 - [NOTICE] simulation.solve(884): Cycle 83/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,328 - [NOTICE] simulation.solve(884): Cycle 83/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,351 - [NOTICE] simulation.solve(884): Cycle 83/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,366 - [NOTICE] simulation.solve(884): Cycle 83/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,406 - [NOTICE] simulation.solve(972): Capacity is now 2.610 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,407 - [NOTICE] simulation.solve(850): Cycle 84/500 (8.918 s elapsed) --------------------\n", + "2021-11-20 13:05:57,408 - [NOTICE] simulation.solve(884): Cycle 84/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,426 - [NOTICE] simulation.solve(884): Cycle 84/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,451 - [NOTICE] simulation.solve(884): Cycle 84/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,466 - [NOTICE] simulation.solve(884): Cycle 84/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,512 - [NOTICE] simulation.solve(972): Capacity is now 2.603 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:57,513 - [NOTICE] simulation.solve(850): Cycle 85/500 (9.024 s elapsed) --------------------\n", + "2021-11-20 13:05:57,513 - [NOTICE] simulation.solve(884): Cycle 85/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,534 - [NOTICE] simulation.solve(884): Cycle 85/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,556 - [NOTICE] simulation.solve(884): Cycle 85/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,571 - [NOTICE] simulation.solve(884): Cycle 85/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,610 - [NOTICE] simulation.solve(972): Capacity is now 2.597 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,611 - [NOTICE] simulation.solve(850): Cycle 86/500 (9.122 s elapsed) --------------------\n", + "2021-11-20 13:05:57,612 - [NOTICE] simulation.solve(884): Cycle 86/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,630 - [NOTICE] simulation.solve(884): Cycle 86/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,653 - [NOTICE] simulation.solve(884): Cycle 86/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,668 - [NOTICE] simulation.solve(884): Cycle 86/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,709 - [NOTICE] simulation.solve(972): Capacity is now 2.590 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,710 - [NOTICE] simulation.solve(850): Cycle 87/500 (9.221 s elapsed) --------------------\n", + "2021-11-20 13:05:57,711 - [NOTICE] simulation.solve(884): Cycle 87/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,729 - [NOTICE] simulation.solve(884): Cycle 87/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,753 - [NOTICE] simulation.solve(884): Cycle 87/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,770 - [NOTICE] simulation.solve(884): Cycle 87/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,810 - [NOTICE] simulation.solve(972): Capacity is now 2.583 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,811 - [NOTICE] simulation.solve(850): Cycle 88/500 (9.322 s elapsed) --------------------\n", + "2021-11-20 13:05:57,811 - [NOTICE] simulation.solve(884): Cycle 88/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,830 - [NOTICE] simulation.solve(884): Cycle 88/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,853 - [NOTICE] simulation.solve(884): Cycle 88/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,870 - [NOTICE] simulation.solve(884): Cycle 88/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:57,911 - [NOTICE] simulation.solve(972): Capacity is now 2.576 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:57,912 - [NOTICE] simulation.solve(850): Cycle 89/500 (9.423 s elapsed) --------------------\n", + "2021-11-20 13:05:57,913 - [NOTICE] simulation.solve(884): Cycle 89/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:57,933 - [NOTICE] simulation.solve(884): Cycle 89/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:57,956 - [NOTICE] simulation.solve(884): Cycle 89/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:57,975 - [NOTICE] simulation.solve(884): Cycle 89/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,014 - [NOTICE] simulation.solve(972): Capacity is now 2.570 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,015 - [NOTICE] simulation.solve(850): Cycle 90/500 (9.526 s elapsed) --------------------\n", + "2021-11-20 13:05:58,016 - [NOTICE] simulation.solve(884): Cycle 90/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,036 - [NOTICE] simulation.solve(884): Cycle 90/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,060 - [NOTICE] simulation.solve(884): Cycle 90/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,076 - [NOTICE] simulation.solve(884): Cycle 90/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,116 - [NOTICE] simulation.solve(972): Capacity is now 2.563 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,117 - [NOTICE] simulation.solve(850): Cycle 91/500 (9.628 s elapsed) --------------------\n", + "2021-11-20 13:05:58,117 - [NOTICE] simulation.solve(884): Cycle 91/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,138 - [NOTICE] simulation.solve(884): Cycle 91/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,162 - [NOTICE] simulation.solve(884): Cycle 91/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,179 - [NOTICE] simulation.solve(884): Cycle 91/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,217 - [NOTICE] simulation.solve(972): Capacity is now 2.556 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,219 - [NOTICE] simulation.solve(850): Cycle 92/500 (9.730 s elapsed) --------------------\n", + "2021-11-20 13:05:58,220 - [NOTICE] simulation.solve(884): Cycle 92/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,240 - [NOTICE] simulation.solve(884): Cycle 92/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,263 - [NOTICE] simulation.solve(884): Cycle 92/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,281 - [NOTICE] simulation.solve(884): Cycle 92/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,323 - [NOTICE] simulation.solve(972): Capacity is now 2.550 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,324 - [NOTICE] simulation.solve(850): Cycle 93/500 (9.835 s elapsed) --------------------\n", + "2021-11-20 13:05:58,325 - [NOTICE] simulation.solve(884): Cycle 93/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,346 - [NOTICE] simulation.solve(884): Cycle 93/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,377 - [NOTICE] simulation.solve(884): Cycle 93/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,395 - [NOTICE] simulation.solve(884): Cycle 93/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,443 - [NOTICE] simulation.solve(972): Capacity is now 2.543 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,443 - [NOTICE] simulation.solve(850): Cycle 94/500 (9.955 s elapsed) --------------------\n", + "2021-11-20 13:05:58,444 - [NOTICE] simulation.solve(884): Cycle 94/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,469 - [NOTICE] simulation.solve(884): Cycle 94/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,492 - [NOTICE] simulation.solve(884): Cycle 94/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,511 - [NOTICE] simulation.solve(884): Cycle 94/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,550 - [NOTICE] simulation.solve(972): Capacity is now 2.537 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,551 - [NOTICE] simulation.solve(850): Cycle 95/500 (10.062 s elapsed) --------------------\n", + "2021-11-20 13:05:58,552 - [NOTICE] simulation.solve(884): Cycle 95/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,574 - [NOTICE] simulation.solve(884): Cycle 95/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,600 - [NOTICE] simulation.solve(884): Cycle 95/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,616 - [NOTICE] simulation.solve(884): Cycle 95/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,658 - [NOTICE] simulation.solve(972): Capacity is now 2.530 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,659 - [NOTICE] simulation.solve(850): Cycle 96/500 (10.170 s elapsed) --------------------\n", + "2021-11-20 13:05:58,659 - [NOTICE] simulation.solve(884): Cycle 96/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,680 - [NOTICE] simulation.solve(884): Cycle 96/500, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:05:58,705 - [NOTICE] simulation.solve(884): Cycle 96/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,724 - [NOTICE] simulation.solve(884): Cycle 96/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,765 - [NOTICE] simulation.solve(972): Capacity is now 2.523 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", + "2021-11-20 13:05:58,766 - [NOTICE] simulation.solve(850): Cycle 97/500 (10.277 s elapsed) --------------------\n", + "2021-11-20 13:05:58,767 - [NOTICE] simulation.solve(884): Cycle 97/500, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:05:58,787 - [NOTICE] simulation.solve(884): Cycle 97/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:05:58,811 - [NOTICE] simulation.solve(884): Cycle 97/500, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:05:58,828 - [NOTICE] simulation.solve(884): Cycle 97/500, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:05:58,867 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (2.517 Ah) is below stopping capacity (2.521 Ah).\n", + "2021-11-20 13:05:58,869 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 10.380 s\n" + ] + } + ], + "source": [ + "# With integer\n", + "sol_int = sim.solve(save_at_cycles=5)\n", + "# With list\n", + "sol_list = sim.solve(save_at_cycles=[30,45,55])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "severe-yorkshire", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_int.cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "unavailable-fetish", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_list.cycles" + ] + }, + { + "cell_type": "markdown", + "id": "guilty-nylon", + "metadata": {}, + "source": [ + "For the cycles that are saved, you can plot as usual (note off-by-1 indexing)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "architectural-signal", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1d714031744d429796a085c526489bc8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=104.97821887755418, description='t', max=107.33117354439943, min=104.9…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_list.cycles[44].plot([\"Current [A]\",\"Terminal voltage [V]\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "played-hundred", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,2,figsize=(10,5))\n", + "for cycle in sol_int.cycles:\n", + " if cycle is not None:\n", + " t = cycle[\"Time [h]\"].data - cycle[\"Time [h]\"].data[0]\n", + " ax[0].plot(t, cycle[\"Current [A]\"].data)\n", + " ax[0].set_xlabel(\"Time [h]\")\n", + " ax[0].set_title(\"Current [A]\")\n", + " ax[1].plot(t, cycle[\"Terminal voltage [V]\"].data)\n", + " ax[1].set_xlabel(\"Time [h]\")\n", + " ax[1].set_title(\"Terminal voltage [V]\")" + ] + }, + { + "cell_type": "markdown", + "id": "considered-rescue", + "metadata": {}, + "source": [ + "All summary variables are always available for every cycle, since these are much less memory-intensive" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "multiple-culture", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ]], dtype=object)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pybamm.plot_summary_variables(sol_list)" + ] + }, + { + "cell_type": "markdown", + "id": "convinced-winter", + "metadata": {}, + "source": [ + "## Starting solution" + ] + }, + { + "cell_type": "markdown", + "id": "unauthorized-fundamental", + "metadata": {}, + "source": [ + "A simulation can be performed iteratively by using the `starting_solution` feature. For example, we first solve for 10 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "posted-plastic", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:06:02,427 - [NOTICE] simulation.solve(850): Cycle 1/10 (267.851 ms elapsed) --------------------\n", + "2021-11-20 13:06:02,428 - [NOTICE] simulation.solve(884): Cycle 1/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:02,480 - [NOTICE] simulation.solve(884): Cycle 1/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:02,519 - [NOTICE] simulation.solve(884): Cycle 1/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:02,566 - [NOTICE] simulation.solve(884): Cycle 1/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:02,784 - [NOTICE] simulation.solve(972): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:02,785 - [NOTICE] simulation.solve(850): Cycle 2/10 (625.709 ms elapsed) --------------------\n", + "2021-11-20 13:06:02,786 - [NOTICE] simulation.solve(884): Cycle 2/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:02,816 - [NOTICE] simulation.solve(884): Cycle 2/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:02,839 - [NOTICE] simulation.solve(884): Cycle 2/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:02,871 - [NOTICE] simulation.solve(884): Cycle 2/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:02,907 - [NOTICE] simulation.solve(972): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:02,908 - [NOTICE] simulation.solve(850): Cycle 3/10 (749.307 ms elapsed) --------------------\n", + "2021-11-20 13:06:02,909 - [NOTICE] simulation.solve(884): Cycle 3/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:02,940 - [NOTICE] simulation.solve(884): Cycle 3/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:02,964 - [NOTICE] simulation.solve(884): Cycle 3/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:02,994 - [NOTICE] simulation.solve(884): Cycle 3/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,031 - [NOTICE] simulation.solve(972): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,032 - [NOTICE] simulation.solve(850): Cycle 4/10 (872.678 ms elapsed) --------------------\n", + "2021-11-20 13:06:03,033 - [NOTICE] simulation.solve(884): Cycle 4/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,063 - [NOTICE] simulation.solve(884): Cycle 4/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,088 - [NOTICE] simulation.solve(884): Cycle 4/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,117 - [NOTICE] simulation.solve(884): Cycle 4/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,156 - [NOTICE] simulation.solve(972): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,156 - [NOTICE] simulation.solve(850): Cycle 5/10 (997.666 ms elapsed) --------------------\n", + "2021-11-20 13:06:03,157 - [NOTICE] simulation.solve(884): Cycle 5/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,189 - [NOTICE] simulation.solve(884): Cycle 5/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,211 - [NOTICE] simulation.solve(884): Cycle 5/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,240 - [NOTICE] simulation.solve(884): Cycle 5/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,282 - [NOTICE] simulation.solve(972): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,284 - [NOTICE] simulation.solve(850): Cycle 6/10 (1.125 s elapsed) --------------------\n", + "2021-11-20 13:06:03,284 - [NOTICE] simulation.solve(884): Cycle 6/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,313 - [NOTICE] simulation.solve(884): Cycle 6/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,339 - [NOTICE] simulation.solve(884): Cycle 6/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,365 - [NOTICE] simulation.solve(884): Cycle 6/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,404 - [NOTICE] simulation.solve(972): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,405 - [NOTICE] simulation.solve(850): Cycle 7/10 (1.246 s elapsed) --------------------\n", + "2021-11-20 13:06:03,405 - [NOTICE] simulation.solve(884): Cycle 7/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,437 - [NOTICE] simulation.solve(884): Cycle 7/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,463 - [NOTICE] simulation.solve(884): Cycle 7/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,489 - [NOTICE] simulation.solve(884): Cycle 7/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,531 - [NOTICE] simulation.solve(972): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,532 - [NOTICE] simulation.solve(850): Cycle 8/10 (1.373 s elapsed) --------------------\n", + "2021-11-20 13:06:03,532 - [NOTICE] simulation.solve(884): Cycle 8/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,561 - [NOTICE] simulation.solve(884): Cycle 8/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,586 - [NOTICE] simulation.solve(884): Cycle 8/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,612 - [NOTICE] simulation.solve(884): Cycle 8/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,652 - [NOTICE] simulation.solve(972): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,653 - [NOTICE] simulation.solve(850): Cycle 9/10 (1.495 s elapsed) --------------------\n", + "2021-11-20 13:06:03,654 - [NOTICE] simulation.solve(884): Cycle 9/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,684 - [NOTICE] simulation.solve(884): Cycle 9/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,708 - [NOTICE] simulation.solve(884): Cycle 9/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,736 - [NOTICE] simulation.solve(884): Cycle 9/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,776 - [NOTICE] simulation.solve(972): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,777 - [NOTICE] simulation.solve(850): Cycle 10/10 (1.618 s elapsed) --------------------\n", + "2021-11-20 13:06:03,778 - [NOTICE] simulation.solve(884): Cycle 10/10, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,808 - [NOTICE] simulation.solve(884): Cycle 10/10, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:03,832 - [NOTICE] simulation.solve(884): Cycle 10/10, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:03,862 - [NOTICE] simulation.solve(884): Cycle 10/10, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:03,901 - [NOTICE] simulation.solve(972): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:03,902 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 1.743 s\n" + ] + } + ], + "source": [ + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\")\n", + "] * 10,\n", + "termination=\"80% capacity\"\n", + ")\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "weird-darkness", + "metadata": {}, + "source": [ + "If we give `sol` as the starting solution this will then solve for the next 10 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "moderate-pipeline", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-11-20 13:06:03,962 - [NOTICE] simulation.solve(850): Cycle 11/20 (37.058 ms elapsed) --------------------\n", + "2021-11-20 13:06:03,963 - [NOTICE] simulation.solve(884): Cycle 11/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:03,992 - [NOTICE] simulation.solve(884): Cycle 11/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,017 - [NOTICE] simulation.solve(884): Cycle 11/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,044 - [NOTICE] simulation.solve(884): Cycle 11/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,206 - [NOTICE] simulation.solve(972): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,207 - [NOTICE] simulation.solve(850): Cycle 12/20 (281.890 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,208 - [NOTICE] simulation.solve(884): Cycle 12/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,238 - [NOTICE] simulation.solve(884): Cycle 12/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,260 - [NOTICE] simulation.solve(884): Cycle 12/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,284 - [NOTICE] simulation.solve(884): Cycle 12/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,321 - [NOTICE] simulation.solve(972): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,324 - [NOTICE] simulation.solve(850): Cycle 13/20 (398.912 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,324 - [NOTICE] simulation.solve(884): Cycle 13/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,350 - [NOTICE] simulation.solve(884): Cycle 13/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,373 - [NOTICE] simulation.solve(884): Cycle 13/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,400 - [NOTICE] simulation.solve(884): Cycle 13/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,439 - [NOTICE] simulation.solve(972): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,439 - [NOTICE] simulation.solve(850): Cycle 14/20 (514.339 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,440 - [NOTICE] simulation.solve(884): Cycle 14/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,468 - [NOTICE] simulation.solve(884): Cycle 14/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,491 - [NOTICE] simulation.solve(884): Cycle 14/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,515 - [NOTICE] simulation.solve(884): Cycle 14/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,558 - [NOTICE] simulation.solve(972): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,559 - [NOTICE] simulation.solve(850): Cycle 15/20 (633.660 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,559 - [NOTICE] simulation.solve(884): Cycle 15/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,585 - [NOTICE] simulation.solve(884): Cycle 15/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,608 - [NOTICE] simulation.solve(884): Cycle 15/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,631 - [NOTICE] simulation.solve(884): Cycle 15/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,672 - [NOTICE] simulation.solve(972): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,673 - [NOTICE] simulation.solve(850): Cycle 16/20 (748.146 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,674 - [NOTICE] simulation.solve(884): Cycle 16/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,703 - [NOTICE] simulation.solve(884): Cycle 16/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,727 - [NOTICE] simulation.solve(884): Cycle 16/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,752 - [NOTICE] simulation.solve(884): Cycle 16/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,790 - [NOTICE] simulation.solve(972): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,791 - [NOTICE] simulation.solve(850): Cycle 17/20 (866.082 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,792 - [NOTICE] simulation.solve(884): Cycle 17/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,824 - [NOTICE] simulation.solve(884): Cycle 17/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,851 - [NOTICE] simulation.solve(884): Cycle 17/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,877 - [NOTICE] simulation.solve(884): Cycle 17/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:04,915 - [NOTICE] simulation.solve(972): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:04,916 - [NOTICE] simulation.solve(850): Cycle 18/20 (990.076 ms elapsed) --------------------\n", + "2021-11-20 13:06:04,916 - [NOTICE] simulation.solve(884): Cycle 18/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:04,946 - [NOTICE] simulation.solve(884): Cycle 18/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:04,968 - [NOTICE] simulation.solve(884): Cycle 18/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:04,993 - [NOTICE] simulation.solve(884): Cycle 18/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:05,029 - [NOTICE] simulation.solve(972): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:05,030 - [NOTICE] simulation.solve(850): Cycle 19/20 (1.105 s elapsed) --------------------\n", + "2021-11-20 13:06:05,031 - [NOTICE] simulation.solve(884): Cycle 19/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:05,060 - [NOTICE] simulation.solve(884): Cycle 19/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:05,084 - [NOTICE] simulation.solve(884): Cycle 19/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:05,107 - [NOTICE] simulation.solve(884): Cycle 19/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:05,147 - [NOTICE] simulation.solve(972): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:05,148 - [NOTICE] simulation.solve(850): Cycle 20/20 (1.222 s elapsed) --------------------\n", + "2021-11-20 13:06:05,149 - [NOTICE] simulation.solve(884): Cycle 20/20, step 1/4: Discharge at 1C until 3.0V\n", + "2021-11-20 13:06:05,178 - [NOTICE] simulation.solve(884): Cycle 20/20, step 2/4: Rest for 1 hour\n", + "2021-11-20 13:06:05,203 - [NOTICE] simulation.solve(884): Cycle 20/20, step 3/4: Charge at 1C until 4.2V\n", + "2021-11-20 13:06:05,229 - [NOTICE] simulation.solve(884): Cycle 20/20, step 4/4: Hold at 4.2V until C/50\n", + "2021-11-20 13:06:05,270 - [NOTICE] simulation.solve(972): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2021-11-20 13:06:05,271 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 1.346 s\n" + ] + } + ], + "source": [ + "sol2 = sim.solve(starting_solution=sol)" + ] + }, + { + "cell_type": "markdown", + "id": "leading-passport", + "metadata": {}, + "source": [ + "We have now simulated 20 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "higher-covering", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(sol2.cycles)" + ] + }, + { + "cell_type": "markdown", + "id": "plastic-framework", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "id": "drawn-fifty", + "metadata": {}, + "source": [ + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "driven-sensitivity", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[4] Peyman Mohtat, Suhak Lee, Jason B Siegel, and Anna G Stefanopoulou. Towards better estimability of electrode-specific state of health: decoding the cell expansion. Journal of Power Sources, 427:101–111, 2019.\n", + "[5] Peyman Mohtat, Suhak Lee, Valentin Sulzer, Jason B. Siegel, and Anna G. Stefanopoulou. Differential Expansion and Voltage Model for Li-ion Batteries at Practical Charging Rates. Journal of The Electrochemical Society, 167(11):110561, 2020. doi:10.1149/1945-7111/aba5d1.\n", + "[6] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "[7] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:34,816 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,854 - [NOTICE] simulation.solve(972): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,855 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.919 s elapsed) --------------------\n", - "2021-11-20 13:05:34,856 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:34,887 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:34,911 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:34,937 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:34,978 - [NOTICE] simulation.solve(972): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:34,979 - [NOTICE] simulation.solve(850): Cycle 15/500 (2.042 s elapsed) --------------------\n", - "2021-11-20 13:05:34,979 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,008 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,036 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,061 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,098 - [NOTICE] simulation.solve(972): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,099 - [NOTICE] simulation.solve(850): Cycle 16/500 (2.163 s elapsed) --------------------\n", - "2021-11-20 13:05:35,100 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,129 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,157 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,187 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,229 - [NOTICE] simulation.solve(972): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,230 - [NOTICE] simulation.solve(850): Cycle 17/500 (2.293 s elapsed) --------------------\n", - "2021-11-20 13:05:35,230 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,260 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,284 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,310 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,346 - [NOTICE] simulation.solve(972): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,347 - [NOTICE] simulation.solve(850): Cycle 18/500 (2.411 s elapsed) --------------------\n", - "2021-11-20 13:05:35,348 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,378 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,400 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,427 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,463 - [NOTICE] simulation.solve(972): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,464 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.528 s elapsed) --------------------\n", - "2021-11-20 13:05:35,465 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,492 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,515 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,538 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,577 - [NOTICE] simulation.solve(972): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,578 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.641 s elapsed) --------------------\n", - "2021-11-20 13:05:35,578 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,603 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,625 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,648 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,684 - [NOTICE] simulation.solve(972): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,686 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.749 s elapsed) --------------------\n", - "2021-11-20 13:05:35,686 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,711 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,733 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,756 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,791 - [NOTICE] simulation.solve(972): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,792 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.856 s elapsed) --------------------\n", - "2021-11-20 13:05:35,793 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:35,817 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:35,840 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:35,863 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:35,904 - [NOTICE] simulation.solve(972): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:35,905 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.969 s elapsed) --------------------\n", - "2021-11-20 13:05:35,906 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,108 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,133 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,158 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,199 - [NOTICE] simulation.solve(972): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,201 - [NOTICE] simulation.solve(850): Cycle 24/500 (3.265 s elapsed) --------------------\n", - "2021-11-20 13:05:36,202 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,231 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,257 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,284 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,325 - [NOTICE] simulation.solve(972): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,326 - [NOTICE] simulation.solve(850): Cycle 25/500 (3.390 s elapsed) --------------------\n", - "2021-11-20 13:05:36,326 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,359 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,383 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,410 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,452 - [NOTICE] simulation.solve(972): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,453 - [NOTICE] simulation.solve(850): Cycle 26/500 (3.517 s elapsed) --------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:36,454 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,484 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,508 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,533 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,568 - [NOTICE] simulation.solve(972): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,569 - [NOTICE] simulation.solve(850): Cycle 27/500 (3.633 s elapsed) --------------------\n", - "2021-11-20 13:05:36,570 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,595 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,618 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,639 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,674 - [NOTICE] simulation.solve(972): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,675 - [NOTICE] simulation.solve(850): Cycle 28/500 (3.739 s elapsed) --------------------\n", - "2021-11-20 13:05:36,676 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,703 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,726 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,748 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,784 - [NOTICE] simulation.solve(972): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,785 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.849 s elapsed) --------------------\n", - "2021-11-20 13:05:36,785 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,810 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,834 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,858 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:36,896 - [NOTICE] simulation.solve(972): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:36,897 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.961 s elapsed) --------------------\n", - "2021-11-20 13:05:36,898 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:36,923 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:36,946 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:36,970 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,010 - [NOTICE] simulation.solve(972): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,011 - [NOTICE] simulation.solve(850): Cycle 31/500 (4.075 s elapsed) --------------------\n", - "2021-11-20 13:05:37,011 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,035 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,057 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,081 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,117 - [NOTICE] simulation.solve(972): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,119 - [NOTICE] simulation.solve(850): Cycle 32/500 (4.183 s elapsed) --------------------\n", - "2021-11-20 13:05:37,120 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,143 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,166 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,189 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,225 - [NOTICE] simulation.solve(972): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,226 - [NOTICE] simulation.solve(850): Cycle 33/500 (4.289 s elapsed) --------------------\n", - "2021-11-20 13:05:37,226 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,252 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,275 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,301 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,340 - [NOTICE] simulation.solve(972): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,343 - [NOTICE] simulation.solve(850): Cycle 34/500 (4.406 s elapsed) --------------------\n", - "2021-11-20 13:05:37,343 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,370 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,395 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,422 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,462 - [NOTICE] simulation.solve(972): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,463 - [NOTICE] simulation.solve(850): Cycle 35/500 (4.527 s elapsed) --------------------\n", - "2021-11-20 13:05:37,464 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,498 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,527 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,551 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,591 - [NOTICE] simulation.solve(972): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,592 - [NOTICE] simulation.solve(850): Cycle 36/500 (4.656 s elapsed) --------------------\n", - "2021-11-20 13:05:37,593 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,625 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,650 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,674 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,711 - [NOTICE] simulation.solve(972): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,713 - [NOTICE] simulation.solve(850): Cycle 37/500 (4.777 s elapsed) --------------------\n", - "2021-11-20 13:05:37,714 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,743 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,769 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:37,796 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,834 - [NOTICE] simulation.solve(972): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,835 - [NOTICE] simulation.solve(850): Cycle 38/500 (4.899 s elapsed) --------------------\n", - "2021-11-20 13:05:37,836 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,859 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:37,884 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:37,922 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:37,969 - [NOTICE] simulation.solve(972): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:37,970 - [NOTICE] simulation.solve(850): Cycle 39/500 (5.034 s elapsed) --------------------\n", - "2021-11-20 13:05:37,971 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:37,994 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,017 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,039 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,076 - [NOTICE] simulation.solve(972): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,077 - [NOTICE] simulation.solve(850): Cycle 40/500 (5.140 s elapsed) --------------------\n", - "2021-11-20 13:05:38,077 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,100 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,123 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,153 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,191 - [NOTICE] simulation.solve(972): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,192 - [NOTICE] simulation.solve(850): Cycle 41/500 (5.255 s elapsed) --------------------\n", - "2021-11-20 13:05:38,193 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,219 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,244 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,269 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,310 - [NOTICE] simulation.solve(972): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,311 - [NOTICE] simulation.solve(850): Cycle 42/500 (5.375 s elapsed) --------------------\n", - "2021-11-20 13:05:38,312 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,339 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,366 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,393 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,438 - [NOTICE] simulation.solve(972): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,439 - [NOTICE] simulation.solve(850): Cycle 43/500 (5.503 s elapsed) --------------------\n", - "2021-11-20 13:05:38,441 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,467 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,490 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,514 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,552 - [NOTICE] simulation.solve(972): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,553 - [NOTICE] simulation.solve(850): Cycle 44/500 (5.617 s elapsed) --------------------\n", - "2021-11-20 13:05:38,554 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,580 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,603 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,627 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,666 - [NOTICE] simulation.solve(972): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,667 - [NOTICE] simulation.solve(850): Cycle 45/500 (5.731 s elapsed) --------------------\n", - "2021-11-20 13:05:38,667 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,696 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,721 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,745 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,783 - [NOTICE] simulation.solve(972): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,784 - [NOTICE] simulation.solve(850): Cycle 46/500 (5.848 s elapsed) --------------------\n", - "2021-11-20 13:05:38,786 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,813 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,839 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,862 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:38,906 - [NOTICE] simulation.solve(972): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:38,907 - [NOTICE] simulation.solve(850): Cycle 47/500 (5.971 s elapsed) --------------------\n", - "2021-11-20 13:05:38,908 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:38,936 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:38,960 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:38,983 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:39,024 - [NOTICE] simulation.solve(972): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:39,025 - [NOTICE] simulation.solve(850): Cycle 48/500 (6.088 s elapsed) --------------------\n", - "2021-11-20 13:05:39,025 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:39,049 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:39,071 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:39,093 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:39,131 - [NOTICE] simulation.solve(972): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:39,133 - [NOTICE] simulation.solve(850): Cycle 49/500 (6.197 s elapsed) --------------------\n", - "2021-11-20 13:05:39,133 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:39,155 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:39,181 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:39,207 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:39,251 - [NOTICE] simulation.solve(972): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:05:39,252 - [NOTICE] simulation.solve(850): Cycle 50/500 (6.315 s elapsed) --------------------\n", - "2021-11-20 13:05:39,252 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:39,278 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:39,304 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:39,329 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:39,375 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", - "2021-11-20 13:05:39,377 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 6.441 s\n" - ] - } - ], - "source": [ - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\")\n", - "] * 500,\n", - "termination=\"80% capacity\"\n", - ")\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "cloudy-lover", - "metadata": {}, - "source": [ - "### Summary variables" - ] - }, - { - "cell_type": "markdown", - "id": "shared-practitioner", - "metadata": {}, - "source": [ - "We can plot standard variables like the current and voltage, but it isn't very instructive on these timescales" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "personalized-oracle", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "bbb607c89ae24d26bdd9e89847c6ec01", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=147.0807212393683, step=1.470807212393683), …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol.plot([\"Current [A]\", \"Terminal voltage [V]\"])" - ] - }, - { - "cell_type": "markdown", - "id": "intense-princeton", - "metadata": {}, - "source": [ - "Instead, we plot \"summary variables\", which show how the battery degrades over time by various metrics. Some of the variables also have \"Change in ...\", which is how much that variable changes over each cycle. This can be achieved by using `plot_summary_variables` method of pybamm, which can also be used to compare \"summary variables\" extracted from 2 or more solutions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "right-skiing", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['C',\n", - " 'C_n',\n", - " 'C_n * (x_100 - x_0)',\n", - " 'C_p',\n", - " 'C_p * (y_100 - y_0)',\n", - " 'Capacity [A.h]',\n", - " 'Change in local ECM resistance [Ohm]',\n", - " 'Change in loss of active material in negative electrode [%]',\n", - " 'Change in loss of active material in positive electrode [%]',\n", - " 'Change in loss of capacity to SEI [A.h]',\n", - " 'Change in loss of capacity to lithium plating [A.h]',\n", - " 'Change in loss of lithium inventory [%]',\n", - " 'Change in loss of lithium inventory, including electrolyte [%]',\n", - " 'Change in loss of lithium to SEI [mol]',\n", - " 'Change in loss of lithium to lithium plating [mol]',\n", - " 'Change in negative electrode capacity [A.h]',\n", - " 'Change in positive electrode capacity [A.h]',\n", - " 'Change in total capacity lost to side reactions [A.h]',\n", - " 'Change in total lithium [mol]',\n", - " 'Change in total lithium in electrolyte [mol]',\n", - " 'Change in total lithium in negative electrode [mol]',\n", - " 'Change in total lithium in particles [mol]',\n", - " 'Change in total lithium in positive electrode [mol]',\n", - " 'Change in total lithium lost [mol]',\n", - " 'Change in total lithium lost from electrolyte [mol]',\n", - " 'Change in total lithium lost from particles [mol]',\n", - " 'Change in total lithium lost to side reactions [mol]',\n", - " 'Cycle number',\n", - " 'Local ECM resistance [Ohm]',\n", - " 'Loss of active material in negative electrode [%]',\n", - " 'Loss of active material in positive electrode [%]',\n", - " 'Loss of capacity to SEI [A.h]',\n", - " 'Loss of capacity to lithium plating [A.h]',\n", - " 'Loss of lithium inventory [%]',\n", - " 'Loss of lithium inventory, including electrolyte [%]',\n", - " 'Loss of lithium to SEI [mol]',\n", - " 'Loss of lithium to lithium plating [mol]',\n", - " 'Maximum measured discharge capacity [A.h]',\n", - " 'Measured capacity [A.h]',\n", - " 'Minimum measured discharge capacity [A.h]',\n", - " 'Negative electrode capacity [A.h]',\n", - " 'Positive electrode capacity [A.h]',\n", - " 'Total capacity lost to side reactions [A.h]',\n", - " 'Total lithium [mol]',\n", - " 'Total lithium in electrolyte [mol]',\n", - " 'Total lithium in negative electrode [mol]',\n", - " 'Total lithium in particles [mol]',\n", - " 'Total lithium in positive electrode [mol]',\n", - " 'Total lithium lost [mol]',\n", - " 'Total lithium lost from electrolyte [mol]',\n", - " 'Total lithium lost from particles [mol]',\n", - " 'Total lithium lost to side reactions [mol]',\n", - " 'Un(x_0)',\n", - " 'Un(x_100)',\n", - " 'Up(y_0)',\n", - " 'Up(y_0) - Un(x_0)',\n", - " 'Up(y_100)',\n", - " 'Up(y_100) - Un(x_100)',\n", - " 'n_Li',\n", - " 'n_Li_0',\n", - " 'n_Li_100',\n", - " 'x_0',\n", - " 'x_100',\n", - " 'y_0',\n", - " 'y_100']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted(sol.summary_variables.keys())" - ] - }, - { - "cell_type": "markdown", - "id": "approximate-error", - "metadata": {}, - "source": [ - "The \"summary variables\" associated with a particular model can also be accessed as a list (which can then be edited) -" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "romance-roulette", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Positive electrode capacity [A.h]',\n", - " 'Loss of active material in positive electrode [%]',\n", - " 'Loss of lithium inventory [%]',\n", - " 'Loss of lithium inventory, including electrolyte [%]',\n", - " 'Total lithium [mol]',\n", - " 'Total lithium in electrolyte [mol]',\n", - " 'Total lithium in positive electrode [mol]',\n", - " 'Total lithium in particles [mol]',\n", - " 'Total lithium lost [mol]',\n", - " 'Total lithium lost from particles [mol]',\n", - " 'Total lithium lost from electrolyte [mol]',\n", - " 'Loss of lithium to SEI [mol]',\n", - " 'Loss of lithium to lithium plating [mol]',\n", - " 'Loss of capacity to SEI [A.h]',\n", - " 'Loss of capacity to lithium plating [A.h]',\n", - " 'Total lithium lost to side reactions [mol]',\n", - " 'Total capacity lost to side reactions [A.h]',\n", - " 'Local ECM resistance [Ohm]',\n", - " 'Negative electrode capacity [A.h]',\n", - " 'Loss of active material in negative electrode [%]',\n", - " 'Total lithium in negative electrode [mol]']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spm.summary_variables" - ] - }, - { - "cell_type": "markdown", - "id": "given-telephone", - "metadata": {}, - "source": [ - "Here the only degradation mechanism is one that causes loss of lithium, so we don't see loss of active material" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "postal-butter", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "array([[,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ]], dtype=object)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pybamm.plot_summary_variables(sol)" - ] - }, - { - "cell_type": "markdown", - "id": "french-substance", - "metadata": {}, - "source": [ - "To suggest additional summary variables, open an issue!" - ] - }, - { - "cell_type": "markdown", - "id": "accepting-canada", - "metadata": {}, - "source": [ - "## Choosing which cycles to save" - ] - }, - { - "cell_type": "markdown", - "id": "employed-plate", - "metadata": {}, - "source": [ - "If the simulation contains thousands of cycles, saving each cycle in RAM might not be possible. To get around this, we can use `save_at_cycles`. If this is an integer `n`, every nth cycle is saved. If this is a list, all the cycles in the list are saved.\n", - "The first cycle is always saved." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "polished-trout", - "metadata": { - "tags": [ - "outputPrepend" - ] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:40,911 - [NOTICE] simulation.solve(850): Cycle 1/500 (43.152 ms elapsed) --------------------\n", - "2021-11-20 13:05:40,912 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:40,959 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:40,984 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,010 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,369 - [NOTICE] simulation.solve(972): Capacity is now 3.949 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,370 - [NOTICE] simulation.solve(850): Cycle 2/500 (502.929 ms elapsed) --------------------\n", - "2021-11-20 13:05:41,371 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,396 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:41,421 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,444 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,482 - [NOTICE] simulation.solve(972): Capacity is now 3.933 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,483 - [NOTICE] simulation.solve(850): Cycle 3/500 (615.314 ms elapsed) --------------------\n", - "2021-11-20 13:05:41,483 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,507 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:41,530 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,553 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,594 - [NOTICE] simulation.solve(972): Capacity is now 3.918 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,595 - [NOTICE] simulation.solve(850): Cycle 4/500 (727.418 ms elapsed) --------------------\n", - "2021-11-20 13:05:41,595 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,626 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:41,652 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,677 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,720 - [NOTICE] simulation.solve(972): Capacity is now 3.903 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,721 - [NOTICE] simulation.solve(850): Cycle 5/500 (853.912 ms elapsed) --------------------\n", - "2021-11-20 13:05:41,722 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,751 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:41,776 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,799 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,841 - [NOTICE] simulation.solve(972): Capacity is now 3.888 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,842 - [NOTICE] simulation.solve(850): Cycle 6/500 (975.009 ms elapsed) --------------------\n", - "2021-11-20 13:05:41,843 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,870 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:41,893 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:41,920 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:41,958 - [NOTICE] simulation.solve(972): Capacity is now 3.873 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:41,959 - [NOTICE] simulation.solve(850): Cycle 7/500 (1.092 s elapsed) --------------------\n", - "2021-11-20 13:05:41,959 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:41,986 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,009 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,033 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,085 - [NOTICE] simulation.solve(972): Capacity is now 3.858 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,086 - [NOTICE] simulation.solve(850): Cycle 8/500 (1.219 s elapsed) --------------------\n", - "2021-11-20 13:05:42,087 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,121 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,152 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,178 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,222 - [NOTICE] simulation.solve(972): Capacity is now 3.843 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,223 - [NOTICE] simulation.solve(850): Cycle 9/500 (1.355 s elapsed) --------------------\n", - "2021-11-20 13:05:42,224 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,252 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,276 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,296 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,336 - [NOTICE] simulation.solve(972): Capacity is now 3.829 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,336 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.468 s elapsed) --------------------\n", - "2021-11-20 13:05:42,337 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,359 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,382 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,402 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,441 - [NOTICE] simulation.solve(972): Capacity is now 3.814 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,441 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.573 s elapsed) --------------------\n", - "2021-11-20 13:05:42,442 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,464 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,486 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,510 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,550 - [NOTICE] simulation.solve(972): Capacity is now 3.800 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,551 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.683 s elapsed) --------------------\n", - "2021-11-20 13:05:42,552 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,575 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,598 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,620 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,657 - [NOTICE] simulation.solve(972): Capacity is now 3.786 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,658 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.790 s elapsed) --------------------\n", - "2021-11-20 13:05:42,659 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,683 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,706 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:42,729 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,768 - [NOTICE] simulation.solve(972): Capacity is now 3.772 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,768 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.900 s elapsed) --------------------\n", - "2021-11-20 13:05:42,769 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,794 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,819 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,842 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,881 - [NOTICE] simulation.solve(972): Capacity is now 3.758 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,881 - [NOTICE] simulation.solve(850): Cycle 15/500 (2.014 s elapsed) --------------------\n", - "2021-11-20 13:05:42,882 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:42,907 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:42,932 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:42,954 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:42,992 - [NOTICE] simulation.solve(972): Capacity is now 3.744 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:42,993 - [NOTICE] simulation.solve(850): Cycle 16/500 (2.126 s elapsed) --------------------\n", - "2021-11-20 13:05:42,994 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,017 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,040 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,062 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,104 - [NOTICE] simulation.solve(972): Capacity is now 3.730 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,105 - [NOTICE] simulation.solve(850): Cycle 17/500 (2.238 s elapsed) --------------------\n", - "2021-11-20 13:05:43,106 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,133 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,157 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,179 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,218 - [NOTICE] simulation.solve(972): Capacity is now 3.716 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,219 - [NOTICE] simulation.solve(850): Cycle 18/500 (2.351 s elapsed) --------------------\n", - "2021-11-20 13:05:43,219 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,243 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,269 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,288 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,326 - [NOTICE] simulation.solve(972): Capacity is now 3.703 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,327 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.460 s elapsed) --------------------\n", - "2021-11-20 13:05:43,328 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,353 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,377 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,396 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,432 - [NOTICE] simulation.solve(972): Capacity is now 3.689 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,433 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.565 s elapsed) --------------------\n", - "2021-11-20 13:05:43,433 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,458 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,481 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,500 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,536 - [NOTICE] simulation.solve(972): Capacity is now 3.676 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,537 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.669 s elapsed) --------------------\n", - "2021-11-20 13:05:43,537 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,563 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,586 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,605 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,642 - [NOTICE] simulation.solve(972): Capacity is now 3.663 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,643 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.775 s elapsed) --------------------\n", - "2021-11-20 13:05:43,644 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,668 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,694 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,718 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,757 - [NOTICE] simulation.solve(972): Capacity is now 3.650 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,758 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.890 s elapsed) --------------------\n", - "2021-11-20 13:05:43,759 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,782 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,807 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,831 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,872 - [NOTICE] simulation.solve(972): Capacity is now 3.637 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,873 - [NOTICE] simulation.solve(850): Cycle 24/500 (3.005 s elapsed) --------------------\n", - "2021-11-20 13:05:43,874 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:43,897 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:43,922 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:43,946 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:43,985 - [NOTICE] simulation.solve(972): Capacity is now 3.624 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:43,986 - [NOTICE] simulation.solve(850): Cycle 25/500 (3.118 s elapsed) --------------------\n", - "2021-11-20 13:05:43,986 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,009 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,034 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,056 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,092 - [NOTICE] simulation.solve(972): Capacity is now 3.611 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,093 - [NOTICE] simulation.solve(850): Cycle 26/500 (3.226 s elapsed) --------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:44,094 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,116 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,140 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,163 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,205 - [NOTICE] simulation.solve(972): Capacity is now 3.598 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,206 - [NOTICE] simulation.solve(850): Cycle 27/500 (3.339 s elapsed) --------------------\n", - "2021-11-20 13:05:44,207 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,231 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,257 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,280 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,324 - [NOTICE] simulation.solve(972): Capacity is now 3.585 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,325 - [NOTICE] simulation.solve(850): Cycle 28/500 (3.458 s elapsed) --------------------\n", - "2021-11-20 13:05:44,326 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,349 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,373 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,391 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,427 - [NOTICE] simulation.solve(972): Capacity is now 3.573 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,429 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.561 s elapsed) --------------------\n", - "2021-11-20 13:05:44,430 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,453 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,476 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,496 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,533 - [NOTICE] simulation.solve(972): Capacity is now 3.560 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,533 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.666 s elapsed) --------------------\n", - "2021-11-20 13:05:44,534 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,558 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,581 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,600 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,636 - [NOTICE] simulation.solve(972): Capacity is now 3.548 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,637 - [NOTICE] simulation.solve(850): Cycle 31/500 (3.770 s elapsed) --------------------\n", - "2021-11-20 13:05:44,638 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,662 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,687 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,705 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,741 - [NOTICE] simulation.solve(972): Capacity is now 3.535 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,742 - [NOTICE] simulation.solve(850): Cycle 32/500 (3.874 s elapsed) --------------------\n", - "2021-11-20 13:05:44,744 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,768 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,790 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,810 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,846 - [NOTICE] simulation.solve(972): Capacity is now 3.523 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,847 - [NOTICE] simulation.solve(850): Cycle 33/500 (3.979 s elapsed) --------------------\n", - "2021-11-20 13:05:44,847 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,871 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:44,896 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:44,917 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:44,954 - [NOTICE] simulation.solve(972): Capacity is now 3.511 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:44,955 - [NOTICE] simulation.solve(850): Cycle 34/500 (4.087 s elapsed) --------------------\n", - "2021-11-20 13:05:44,956 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:44,981 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,006 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,029 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,067 - [NOTICE] simulation.solve(972): Capacity is now 3.498 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,068 - [NOTICE] simulation.solve(850): Cycle 35/500 (4.200 s elapsed) --------------------\n", - "2021-11-20 13:05:45,068 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,091 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,116 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,138 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,178 - [NOTICE] simulation.solve(972): Capacity is now 3.486 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,179 - [NOTICE] simulation.solve(850): Cycle 36/500 (4.311 s elapsed) --------------------\n", - "2021-11-20 13:05:45,179 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,200 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,225 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,246 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,286 - [NOTICE] simulation.solve(972): Capacity is now 3.474 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,287 - [NOTICE] simulation.solve(850): Cycle 37/500 (4.419 s elapsed) --------------------\n", - "2021-11-20 13:05:45,288 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,314 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,337 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,360 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,398 - [NOTICE] simulation.solve(972): Capacity is now 3.463 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,400 - [NOTICE] simulation.solve(850): Cycle 38/500 (4.532 s elapsed) --------------------\n", - "2021-11-20 13:05:45,400 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,423 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,446 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:45,470 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,508 - [NOTICE] simulation.solve(972): Capacity is now 3.451 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,509 - [NOTICE] simulation.solve(850): Cycle 39/500 (4.641 s elapsed) --------------------\n", - "2021-11-20 13:05:45,510 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,533 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,556 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,577 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,615 - [NOTICE] simulation.solve(972): Capacity is now 3.439 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,616 - [NOTICE] simulation.solve(850): Cycle 40/500 (4.749 s elapsed) --------------------\n", - "2021-11-20 13:05:45,617 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,639 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,662 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,683 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,722 - [NOTICE] simulation.solve(972): Capacity is now 3.427 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,723 - [NOTICE] simulation.solve(850): Cycle 41/500 (4.855 s elapsed) --------------------\n", - "2021-11-20 13:05:45,724 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,745 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,767 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,787 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,833 - [NOTICE] simulation.solve(972): Capacity is now 3.416 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,834 - [NOTICE] simulation.solve(850): Cycle 42/500 (4.966 s elapsed) --------------------\n", - "2021-11-20 13:05:45,835 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,860 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,885 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:45,902 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:45,940 - [NOTICE] simulation.solve(972): Capacity is now 3.404 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:45,941 - [NOTICE] simulation.solve(850): Cycle 43/500 (5.073 s elapsed) --------------------\n", - "2021-11-20 13:05:45,942 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:45,966 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:45,990 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,012 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,047 - [NOTICE] simulation.solve(972): Capacity is now 3.393 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,048 - [NOTICE] simulation.solve(850): Cycle 44/500 (5.180 s elapsed) --------------------\n", - "2021-11-20 13:05:46,049 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,072 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,096 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,117 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,155 - [NOTICE] simulation.solve(972): Capacity is now 3.381 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,156 - [NOTICE] simulation.solve(850): Cycle 45/500 (5.288 s elapsed) --------------------\n", - "2021-11-20 13:05:46,157 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,184 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,207 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,227 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,266 - [NOTICE] simulation.solve(972): Capacity is now 3.370 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,267 - [NOTICE] simulation.solve(850): Cycle 46/500 (5.399 s elapsed) --------------------\n", - "2021-11-20 13:05:46,268 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,293 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,321 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,344 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,383 - [NOTICE] simulation.solve(972): Capacity is now 3.359 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,384 - [NOTICE] simulation.solve(850): Cycle 47/500 (5.516 s elapsed) --------------------\n", - "2021-11-20 13:05:46,385 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,415 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,441 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,461 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,518 - [NOTICE] simulation.solve(972): Capacity is now 3.348 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,519 - [NOTICE] simulation.solve(850): Cycle 48/500 (5.651 s elapsed) --------------------\n", - "2021-11-20 13:05:46,520 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,547 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,572 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,589 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,626 - [NOTICE] simulation.solve(972): Capacity is now 3.337 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,627 - [NOTICE] simulation.solve(850): Cycle 49/500 (5.759 s elapsed) --------------------\n", - "2021-11-20 13:05:46,628 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,647 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,669 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,689 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,725 - [NOTICE] simulation.solve(972): Capacity is now 3.326 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,726 - [NOTICE] simulation.solve(850): Cycle 50/500 (5.858 s elapsed) --------------------\n", - "2021-11-20 13:05:46,727 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,746 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,769 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,788 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,822 - [NOTICE] simulation.solve(972): Capacity is now 3.315 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,823 - [NOTICE] simulation.solve(850): Cycle 51/500 (5.956 s elapsed) --------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:46,823 - [NOTICE] simulation.solve(884): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,843 - [NOTICE] simulation.solve(884): Cycle 51/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,865 - [NOTICE] simulation.solve(884): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,885 - [NOTICE] simulation.solve(884): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:46,921 - [NOTICE] simulation.solve(972): Capacity is now 3.304 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:46,921 - [NOTICE] simulation.solve(850): Cycle 52/500 (6.054 s elapsed) --------------------\n", - "2021-11-20 13:05:46,922 - [NOTICE] simulation.solve(884): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:46,943 - [NOTICE] simulation.solve(884): Cycle 52/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:46,966 - [NOTICE] simulation.solve(884): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:46,986 - [NOTICE] simulation.solve(884): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,027 - [NOTICE] simulation.solve(972): Capacity is now 3.293 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,028 - [NOTICE] simulation.solve(850): Cycle 53/500 (6.161 s elapsed) --------------------\n", - "2021-11-20 13:05:47,029 - [NOTICE] simulation.solve(884): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,050 - [NOTICE] simulation.solve(884): Cycle 53/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,074 - [NOTICE] simulation.solve(884): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,095 - [NOTICE] simulation.solve(884): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,132 - [NOTICE] simulation.solve(972): Capacity is now 3.282 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,133 - [NOTICE] simulation.solve(850): Cycle 54/500 (6.266 s elapsed) --------------------\n", - "2021-11-20 13:05:47,134 - [NOTICE] simulation.solve(884): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,154 - [NOTICE] simulation.solve(884): Cycle 54/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,178 - [NOTICE] simulation.solve(884): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,198 - [NOTICE] simulation.solve(884): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,233 - [NOTICE] simulation.solve(972): Capacity is now 3.272 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,234 - [NOTICE] simulation.solve(850): Cycle 55/500 (6.367 s elapsed) --------------------\n", - "2021-11-20 13:05:47,235 - [NOTICE] simulation.solve(884): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,254 - [NOTICE] simulation.solve(884): Cycle 55/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,277 - [NOTICE] simulation.solve(884): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,297 - [NOTICE] simulation.solve(884): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,335 - [NOTICE] simulation.solve(972): Capacity is now 3.261 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,335 - [NOTICE] simulation.solve(850): Cycle 56/500 (6.468 s elapsed) --------------------\n", - "2021-11-20 13:05:47,336 - [NOTICE] simulation.solve(884): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,357 - [NOTICE] simulation.solve(884): Cycle 56/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,380 - [NOTICE] simulation.solve(884): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,399 - [NOTICE] simulation.solve(884): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,434 - [NOTICE] simulation.solve(972): Capacity is now 3.251 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,435 - [NOTICE] simulation.solve(850): Cycle 57/500 (6.567 s elapsed) --------------------\n", - "2021-11-20 13:05:47,436 - [NOTICE] simulation.solve(884): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,457 - [NOTICE] simulation.solve(884): Cycle 57/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,480 - [NOTICE] simulation.solve(884): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,501 - [NOTICE] simulation.solve(884): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,540 - [NOTICE] simulation.solve(972): Capacity is now 3.241 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,542 - [NOTICE] simulation.solve(850): Cycle 58/500 (6.674 s elapsed) --------------------\n", - "2021-11-20 13:05:47,543 - [NOTICE] simulation.solve(884): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,569 - [NOTICE] simulation.solve(884): Cycle 58/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,596 - [NOTICE] simulation.solve(884): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,620 - [NOTICE] simulation.solve(884): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,661 - [NOTICE] simulation.solve(972): Capacity is now 3.230 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,662 - [NOTICE] simulation.solve(850): Cycle 59/500 (6.794 s elapsed) --------------------\n", - "2021-11-20 13:05:47,663 - [NOTICE] simulation.solve(884): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,686 - [NOTICE] simulation.solve(884): Cycle 59/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,710 - [NOTICE] simulation.solve(884): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,729 - [NOTICE] simulation.solve(884): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,766 - [NOTICE] simulation.solve(972): Capacity is now 3.220 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,767 - [NOTICE] simulation.solve(850): Cycle 60/500 (6.899 s elapsed) --------------------\n", - "2021-11-20 13:05:47,767 - [NOTICE] simulation.solve(884): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,790 - [NOTICE] simulation.solve(884): Cycle 60/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,813 - [NOTICE] simulation.solve(884): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,830 - [NOTICE] simulation.solve(884): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,868 - [NOTICE] simulation.solve(972): Capacity is now 3.210 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,869 - [NOTICE] simulation.solve(850): Cycle 61/500 (7.001 s elapsed) --------------------\n", - "2021-11-20 13:05:47,870 - [NOTICE] simulation.solve(884): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,891 - [NOTICE] simulation.solve(884): Cycle 61/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:47,915 - [NOTICE] simulation.solve(884): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:47,932 - [NOTICE] simulation.solve(884): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:47,968 - [NOTICE] simulation.solve(972): Capacity is now 3.200 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:47,969 - [NOTICE] simulation.solve(850): Cycle 62/500 (7.102 s elapsed) --------------------\n", - "2021-11-20 13:05:47,970 - [NOTICE] simulation.solve(884): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:47,992 - [NOTICE] simulation.solve(884): Cycle 62/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,022 - [NOTICE] simulation.solve(884): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,039 - [NOTICE] simulation.solve(884): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,076 - [NOTICE] simulation.solve(972): Capacity is now 3.190 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:48,077 - [NOTICE] simulation.solve(850): Cycle 63/500 (7.210 s elapsed) --------------------\n", - "2021-11-20 13:05:48,078 - [NOTICE] simulation.solve(884): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,101 - [NOTICE] simulation.solve(884): Cycle 63/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,126 - [NOTICE] simulation.solve(884): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:48,145 - [NOTICE] simulation.solve(884): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,183 - [NOTICE] simulation.solve(972): Capacity is now 3.180 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:48,183 - [NOTICE] simulation.solve(850): Cycle 64/500 (7.316 s elapsed) --------------------\n", - "2021-11-20 13:05:48,184 - [NOTICE] simulation.solve(884): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,208 - [NOTICE] simulation.solve(884): Cycle 64/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,231 - [NOTICE] simulation.solve(884): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,249 - [NOTICE] simulation.solve(884): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,286 - [NOTICE] simulation.solve(972): Capacity is now 3.171 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:48,288 - [NOTICE] simulation.solve(850): Cycle 65/500 (7.420 s elapsed) --------------------\n", - "2021-11-20 13:05:48,288 - [NOTICE] simulation.solve(884): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,307 - [NOTICE] simulation.solve(884): Cycle 65/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,331 - [NOTICE] simulation.solve(884): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,350 - [NOTICE] simulation.solve(884): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,387 - [NOTICE] simulation.solve(972): Capacity is now 3.161 Ah (originally 3.949 Ah, will stop at 3.159 Ah)\n", - "2021-11-20 13:05:48,388 - [NOTICE] simulation.solve(850): Cycle 66/500 (7.520 s elapsed) --------------------\n", - "2021-11-20 13:05:48,389 - [NOTICE] simulation.solve(884): Cycle 66/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,410 - [NOTICE] simulation.solve(884): Cycle 66/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,433 - [NOTICE] simulation.solve(884): Cycle 66/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,450 - [NOTICE] simulation.solve(884): Cycle 66/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,486 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (3.152 Ah) is below stopping capacity (3.159 Ah).\n", - "2021-11-20 13:05:48,488 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 7.620 s\n", - "2021-11-20 13:05:48,522 - [NOTICE] simulation.solve(850): Cycle 1/500 (33.269 ms elapsed) --------------------\n", - "2021-11-20 13:05:48,523 - [NOTICE] simulation.solve(884): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,558 - [NOTICE] simulation.solve(884): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,580 - [NOTICE] simulation.solve(884): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,597 - [NOTICE] simulation.solve(884): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,745 - [NOTICE] simulation.solve(972): Capacity is now 3.152 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:48,746 - [NOTICE] simulation.solve(850): Cycle 2/500 (257.841 ms elapsed) --------------------\n", - "2021-11-20 13:05:48,747 - [NOTICE] simulation.solve(884): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,765 - [NOTICE] simulation.solve(884): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,787 - [NOTICE] simulation.solve(884): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,804 - [NOTICE] simulation.solve(884): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,839 - [NOTICE] simulation.solve(972): Capacity is now 3.142 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:48,840 - [NOTICE] simulation.solve(850): Cycle 3/500 (352.077 ms elapsed) --------------------\n", - "2021-11-20 13:05:48,841 - [NOTICE] simulation.solve(884): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,860 - [NOTICE] simulation.solve(884): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,883 - [NOTICE] simulation.solve(884): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,901 - [NOTICE] simulation.solve(884): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:48,939 - [NOTICE] simulation.solve(972): Capacity is now 3.133 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:48,940 - [NOTICE] simulation.solve(850): Cycle 4/500 (450.966 ms elapsed) --------------------\n", - "2021-11-20 13:05:48,941 - [NOTICE] simulation.solve(884): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:48,959 - [NOTICE] simulation.solve(884): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:48,982 - [NOTICE] simulation.solve(884): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:48,999 - [NOTICE] simulation.solve(884): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,035 - [NOTICE] simulation.solve(972): Capacity is now 3.124 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,036 - [NOTICE] simulation.solve(850): Cycle 5/500 (547.077 ms elapsed) --------------------\n", - "2021-11-20 13:05:49,037 - [NOTICE] simulation.solve(884): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,055 - [NOTICE] simulation.solve(884): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,078 - [NOTICE] simulation.solve(884): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,098 - [NOTICE] simulation.solve(884): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,134 - [NOTICE] simulation.solve(972): Capacity is now 3.115 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,135 - [NOTICE] simulation.solve(850): Cycle 6/500 (646.149 ms elapsed) --------------------\n", - "2021-11-20 13:05:49,136 - [NOTICE] simulation.solve(884): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,156 - [NOTICE] simulation.solve(884): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,180 - [NOTICE] simulation.solve(884): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,198 - [NOTICE] simulation.solve(884): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,235 - [NOTICE] simulation.solve(972): Capacity is now 3.107 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,235 - [NOTICE] simulation.solve(850): Cycle 7/500 (746.308 ms elapsed) --------------------\n", - "2021-11-20 13:05:49,236 - [NOTICE] simulation.solve(884): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,255 - [NOTICE] simulation.solve(884): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,277 - [NOTICE] simulation.solve(884): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,296 - [NOTICE] simulation.solve(884): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,335 - [NOTICE] simulation.solve(972): Capacity is now 3.098 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,335 - [NOTICE] simulation.solve(850): Cycle 8/500 (846.322 ms elapsed) --------------------\n", - "2021-11-20 13:05:49,336 - [NOTICE] simulation.solve(884): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,356 - [NOTICE] simulation.solve(884): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,379 - [NOTICE] simulation.solve(884): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,399 - [NOTICE] simulation.solve(884): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,437 - [NOTICE] simulation.solve(972): Capacity is now 3.090 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,437 - [NOTICE] simulation.solve(850): Cycle 9/500 (948.255 ms elapsed) --------------------\n", - "2021-11-20 13:05:49,438 - [NOTICE] simulation.solve(884): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,458 - [NOTICE] simulation.solve(884): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,482 - [NOTICE] simulation.solve(884): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,500 - [NOTICE] simulation.solve(884): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,534 - [NOTICE] simulation.solve(972): Capacity is now 3.082 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:49,535 - [NOTICE] simulation.solve(850): Cycle 10/500 (1.046 s elapsed) --------------------\n", - "2021-11-20 13:05:49,536 - [NOTICE] simulation.solve(884): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,556 - [NOTICE] simulation.solve(884): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,577 - [NOTICE] simulation.solve(884): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,597 - [NOTICE] simulation.solve(884): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,631 - [NOTICE] simulation.solve(972): Capacity is now 3.074 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,632 - [NOTICE] simulation.solve(850): Cycle 11/500 (1.143 s elapsed) --------------------\n", - "2021-11-20 13:05:49,633 - [NOTICE] simulation.solve(884): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,654 - [NOTICE] simulation.solve(884): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,676 - [NOTICE] simulation.solve(884): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,695 - [NOTICE] simulation.solve(884): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,730 - [NOTICE] simulation.solve(972): Capacity is now 3.066 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,731 - [NOTICE] simulation.solve(850): Cycle 12/500 (1.243 s elapsed) --------------------\n", - "2021-11-20 13:05:49,732 - [NOTICE] simulation.solve(884): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,753 - [NOTICE] simulation.solve(884): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,777 - [NOTICE] simulation.solve(884): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,794 - [NOTICE] simulation.solve(884): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,828 - [NOTICE] simulation.solve(972): Capacity is now 3.058 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,828 - [NOTICE] simulation.solve(850): Cycle 13/500 (1.340 s elapsed) --------------------\n", - "2021-11-20 13:05:49,829 - [NOTICE] simulation.solve(884): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,850 - [NOTICE] simulation.solve(884): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,872 - [NOTICE] simulation.solve(884): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,891 - [NOTICE] simulation.solve(884): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:49,927 - [NOTICE] simulation.solve(972): Capacity is now 3.051 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:49,928 - [NOTICE] simulation.solve(850): Cycle 14/500 (1.440 s elapsed) --------------------\n", - "2021-11-20 13:05:49,929 - [NOTICE] simulation.solve(884): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:49,951 - [NOTICE] simulation.solve(884): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:49,975 - [NOTICE] simulation.solve(884): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:49,996 - [NOTICE] simulation.solve(884): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,032 - [NOTICE] simulation.solve(972): Capacity is now 3.043 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,033 - [NOTICE] simulation.solve(850): Cycle 15/500 (1.545 s elapsed) --------------------\n", - "2021-11-20 13:05:50,034 - [NOTICE] simulation.solve(884): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,056 - [NOTICE] simulation.solve(884): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,080 - [NOTICE] simulation.solve(884): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,099 - [NOTICE] simulation.solve(884): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,141 - [NOTICE] simulation.solve(972): Capacity is now 3.036 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,142 - [NOTICE] simulation.solve(850): Cycle 16/500 (1.654 s elapsed) --------------------\n", - "2021-11-20 13:05:50,143 - [NOTICE] simulation.solve(884): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,165 - [NOTICE] simulation.solve(884): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,192 - [NOTICE] simulation.solve(884): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,216 - [NOTICE] simulation.solve(884): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,264 - [NOTICE] simulation.solve(972): Capacity is now 3.029 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,266 - [NOTICE] simulation.solve(850): Cycle 17/500 (1.777 s elapsed) --------------------\n", - "2021-11-20 13:05:50,267 - [NOTICE] simulation.solve(884): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,292 - [NOTICE] simulation.solve(884): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,335 - [NOTICE] simulation.solve(884): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,364 - [NOTICE] simulation.solve(884): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,402 - [NOTICE] simulation.solve(972): Capacity is now 3.022 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,404 - [NOTICE] simulation.solve(850): Cycle 18/500 (1.915 s elapsed) --------------------\n", - "2021-11-20 13:05:50,404 - [NOTICE] simulation.solve(884): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,428 - [NOTICE] simulation.solve(884): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,451 - [NOTICE] simulation.solve(884): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,470 - [NOTICE] simulation.solve(884): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,504 - [NOTICE] simulation.solve(972): Capacity is now 3.016 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,505 - [NOTICE] simulation.solve(850): Cycle 19/500 (2.017 s elapsed) --------------------\n", - "2021-11-20 13:05:50,506 - [NOTICE] simulation.solve(884): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,528 - [NOTICE] simulation.solve(884): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,553 - [NOTICE] simulation.solve(884): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,570 - [NOTICE] simulation.solve(884): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,612 - [NOTICE] simulation.solve(972): Capacity is now 3.009 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,614 - [NOTICE] simulation.solve(850): Cycle 20/500 (2.125 s elapsed) --------------------\n", - "2021-11-20 13:05:50,615 - [NOTICE] simulation.solve(884): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,645 - [NOTICE] simulation.solve(884): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,672 - [NOTICE] simulation.solve(884): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,692 - [NOTICE] simulation.solve(884): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,746 - [NOTICE] simulation.solve(972): Capacity is now 3.003 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,746 - [NOTICE] simulation.solve(850): Cycle 21/500 (2.258 s elapsed) --------------------\n", - "2021-11-20 13:05:50,747 - [NOTICE] simulation.solve(884): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,768 - [NOTICE] simulation.solve(884): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,795 - [NOTICE] simulation.solve(884): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,811 - [NOTICE] simulation.solve(884): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,846 - [NOTICE] simulation.solve(972): Capacity is now 2.997 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,847 - [NOTICE] simulation.solve(850): Cycle 22/500 (2.358 s elapsed) --------------------\n", - "2021-11-20 13:05:50,848 - [NOTICE] simulation.solve(884): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,866 - [NOTICE] simulation.solve(884): Cycle 22/500, step 2/4: Rest for 1 hour\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:50,889 - [NOTICE] simulation.solve(884): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:50,906 - [NOTICE] simulation.solve(884): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:50,942 - [NOTICE] simulation.solve(972): Capacity is now 2.990 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:50,942 - [NOTICE] simulation.solve(850): Cycle 23/500 (2.453 s elapsed) --------------------\n", - "2021-11-20 13:05:50,943 - [NOTICE] simulation.solve(884): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:50,962 - [NOTICE] simulation.solve(884): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:50,986 - [NOTICE] simulation.solve(884): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,003 - [NOTICE] simulation.solve(884): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,037 - [NOTICE] simulation.solve(972): Capacity is now 2.984 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,038 - [NOTICE] simulation.solve(850): Cycle 24/500 (2.549 s elapsed) --------------------\n", - "2021-11-20 13:05:51,038 - [NOTICE] simulation.solve(884): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,056 - [NOTICE] simulation.solve(884): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,079 - [NOTICE] simulation.solve(884): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,096 - [NOTICE] simulation.solve(884): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,131 - [NOTICE] simulation.solve(972): Capacity is now 2.978 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,131 - [NOTICE] simulation.solve(850): Cycle 25/500 (2.642 s elapsed) --------------------\n", - "2021-11-20 13:05:51,132 - [NOTICE] simulation.solve(884): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,152 - [NOTICE] simulation.solve(884): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,176 - [NOTICE] simulation.solve(884): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,195 - [NOTICE] simulation.solve(884): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,229 - [NOTICE] simulation.solve(972): Capacity is now 2.973 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,230 - [NOTICE] simulation.solve(850): Cycle 26/500 (2.741 s elapsed) --------------------\n", - "2021-11-20 13:05:51,231 - [NOTICE] simulation.solve(884): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,250 - [NOTICE] simulation.solve(884): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,274 - [NOTICE] simulation.solve(884): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,292 - [NOTICE] simulation.solve(884): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,327 - [NOTICE] simulation.solve(972): Capacity is now 2.967 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,328 - [NOTICE] simulation.solve(850): Cycle 27/500 (2.839 s elapsed) --------------------\n", - "2021-11-20 13:05:51,328 - [NOTICE] simulation.solve(884): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,348 - [NOTICE] simulation.solve(884): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,370 - [NOTICE] simulation.solve(884): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,392 - [NOTICE] simulation.solve(884): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,427 - [NOTICE] simulation.solve(972): Capacity is now 2.961 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,428 - [NOTICE] simulation.solve(850): Cycle 28/500 (2.939 s elapsed) --------------------\n", - "2021-11-20 13:05:51,429 - [NOTICE] simulation.solve(884): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,449 - [NOTICE] simulation.solve(884): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,473 - [NOTICE] simulation.solve(884): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,491 - [NOTICE] simulation.solve(884): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,528 - [NOTICE] simulation.solve(972): Capacity is now 2.956 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,529 - [NOTICE] simulation.solve(850): Cycle 29/500 (3.040 s elapsed) --------------------\n", - "2021-11-20 13:05:51,530 - [NOTICE] simulation.solve(884): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,549 - [NOTICE] simulation.solve(884): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,572 - [NOTICE] simulation.solve(884): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,591 - [NOTICE] simulation.solve(884): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,625 - [NOTICE] simulation.solve(972): Capacity is now 2.950 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,626 - [NOTICE] simulation.solve(850): Cycle 30/500 (3.137 s elapsed) --------------------\n", - "2021-11-20 13:05:51,626 - [NOTICE] simulation.solve(884): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,645 - [NOTICE] simulation.solve(884): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,668 - [NOTICE] simulation.solve(884): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,687 - [NOTICE] simulation.solve(884): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,723 - [NOTICE] simulation.solve(972): Capacity is now 2.944 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,724 - [NOTICE] simulation.solve(850): Cycle 31/500 (3.235 s elapsed) --------------------\n", - "2021-11-20 13:05:51,726 - [NOTICE] simulation.solve(884): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,745 - [NOTICE] simulation.solve(884): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,769 - [NOTICE] simulation.solve(884): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,790 - [NOTICE] simulation.solve(884): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,827 - [NOTICE] simulation.solve(972): Capacity is now 2.939 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,828 - [NOTICE] simulation.solve(850): Cycle 32/500 (3.339 s elapsed) --------------------\n", - "2021-11-20 13:05:51,828 - [NOTICE] simulation.solve(884): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,848 - [NOTICE] simulation.solve(884): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,874 - [NOTICE] simulation.solve(884): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,894 - [NOTICE] simulation.solve(884): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:51,931 - [NOTICE] simulation.solve(972): Capacity is now 2.934 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:51,932 - [NOTICE] simulation.solve(850): Cycle 33/500 (3.443 s elapsed) --------------------\n", - "2021-11-20 13:05:51,933 - [NOTICE] simulation.solve(884): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:51,952 - [NOTICE] simulation.solve(884): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:51,975 - [NOTICE] simulation.solve(884): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:51,995 - [NOTICE] simulation.solve(884): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,032 - [NOTICE] simulation.solve(972): Capacity is now 2.928 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,033 - [NOTICE] simulation.solve(850): Cycle 34/500 (3.544 s elapsed) --------------------\n", - "2021-11-20 13:05:52,034 - [NOTICE] simulation.solve(884): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,054 - [NOTICE] simulation.solve(884): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,078 - [NOTICE] simulation.solve(884): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,097 - [NOTICE] simulation.solve(884): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,139 - [NOTICE] simulation.solve(972): Capacity is now 2.923 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:52,141 - [NOTICE] simulation.solve(850): Cycle 35/500 (3.652 s elapsed) --------------------\n", - "2021-11-20 13:05:52,141 - [NOTICE] simulation.solve(884): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,163 - [NOTICE] simulation.solve(884): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,188 - [NOTICE] simulation.solve(884): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,207 - [NOTICE] simulation.solve(884): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,245 - [NOTICE] simulation.solve(972): Capacity is now 2.917 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,246 - [NOTICE] simulation.solve(850): Cycle 36/500 (3.757 s elapsed) --------------------\n", - "2021-11-20 13:05:52,247 - [NOTICE] simulation.solve(884): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,270 - [NOTICE] simulation.solve(884): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,293 - [NOTICE] simulation.solve(884): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,311 - [NOTICE] simulation.solve(884): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,349 - [NOTICE] simulation.solve(972): Capacity is now 2.912 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,349 - [NOTICE] simulation.solve(850): Cycle 37/500 (3.860 s elapsed) --------------------\n", - "2021-11-20 13:05:52,350 - [NOTICE] simulation.solve(884): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,371 - [NOTICE] simulation.solve(884): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,396 - [NOTICE] simulation.solve(884): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,414 - [NOTICE] simulation.solve(884): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,452 - [NOTICE] simulation.solve(972): Capacity is now 2.906 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,453 - [NOTICE] simulation.solve(850): Cycle 38/500 (3.964 s elapsed) --------------------\n", - "2021-11-20 13:05:52,454 - [NOTICE] simulation.solve(884): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,475 - [NOTICE] simulation.solve(884): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,498 - [NOTICE] simulation.solve(884): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,515 - [NOTICE] simulation.solve(884): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,553 - [NOTICE] simulation.solve(972): Capacity is now 2.901 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,554 - [NOTICE] simulation.solve(850): Cycle 39/500 (4.065 s elapsed) --------------------\n", - "2021-11-20 13:05:52,555 - [NOTICE] simulation.solve(884): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,576 - [NOTICE] simulation.solve(884): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,600 - [NOTICE] simulation.solve(884): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,616 - [NOTICE] simulation.solve(884): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,654 - [NOTICE] simulation.solve(972): Capacity is now 2.895 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,655 - [NOTICE] simulation.solve(850): Cycle 40/500 (4.166 s elapsed) --------------------\n", - "2021-11-20 13:05:52,656 - [NOTICE] simulation.solve(884): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,676 - [NOTICE] simulation.solve(884): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,699 - [NOTICE] simulation.solve(884): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,716 - [NOTICE] simulation.solve(884): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,753 - [NOTICE] simulation.solve(972): Capacity is now 2.890 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,754 - [NOTICE] simulation.solve(850): Cycle 41/500 (4.265 s elapsed) --------------------\n", - "2021-11-20 13:05:52,755 - [NOTICE] simulation.solve(884): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,778 - [NOTICE] simulation.solve(884): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,802 - [NOTICE] simulation.solve(884): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,819 - [NOTICE] simulation.solve(884): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,857 - [NOTICE] simulation.solve(972): Capacity is now 2.884 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,857 - [NOTICE] simulation.solve(850): Cycle 42/500 (4.368 s elapsed) --------------------\n", - "2021-11-20 13:05:52,858 - [NOTICE] simulation.solve(884): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,881 - [NOTICE] simulation.solve(884): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:52,904 - [NOTICE] simulation.solve(884): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:52,920 - [NOTICE] simulation.solve(884): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:52,956 - [NOTICE] simulation.solve(972): Capacity is now 2.879 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:52,957 - [NOTICE] simulation.solve(850): Cycle 43/500 (4.468 s elapsed) --------------------\n", - "2021-11-20 13:05:52,958 - [NOTICE] simulation.solve(884): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:52,979 - [NOTICE] simulation.solve(884): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,002 - [NOTICE] simulation.solve(884): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,019 - [NOTICE] simulation.solve(884): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,057 - [NOTICE] simulation.solve(972): Capacity is now 2.873 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,058 - [NOTICE] simulation.solve(850): Cycle 44/500 (4.569 s elapsed) --------------------\n", - "2021-11-20 13:05:53,058 - [NOTICE] simulation.solve(884): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,080 - [NOTICE] simulation.solve(884): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,103 - [NOTICE] simulation.solve(884): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,119 - [NOTICE] simulation.solve(884): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,157 - [NOTICE] simulation.solve(972): Capacity is now 2.867 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,158 - [NOTICE] simulation.solve(850): Cycle 45/500 (4.669 s elapsed) --------------------\n", - "2021-11-20 13:05:53,158 - [NOTICE] simulation.solve(884): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,180 - [NOTICE] simulation.solve(884): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,205 - [NOTICE] simulation.solve(884): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,222 - [NOTICE] simulation.solve(884): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,261 - [NOTICE] simulation.solve(972): Capacity is now 2.862 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,262 - [NOTICE] simulation.solve(850): Cycle 46/500 (4.773 s elapsed) --------------------\n", - "2021-11-20 13:05:53,263 - [NOTICE] simulation.solve(884): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,283 - [NOTICE] simulation.solve(884): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,307 - [NOTICE] simulation.solve(884): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,327 - [NOTICE] simulation.solve(884): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,366 - [NOTICE] simulation.solve(972): Capacity is now 2.856 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,367 - [NOTICE] simulation.solve(850): Cycle 47/500 (4.878 s elapsed) --------------------\n", - "2021-11-20 13:05:53,368 - [NOTICE] simulation.solve(884): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,391 - [NOTICE] simulation.solve(884): Cycle 47/500, step 2/4: Rest for 1 hour\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:53,414 - [NOTICE] simulation.solve(884): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,434 - [NOTICE] simulation.solve(884): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,631 - [NOTICE] simulation.solve(972): Capacity is now 2.850 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,632 - [NOTICE] simulation.solve(850): Cycle 48/500 (5.143 s elapsed) --------------------\n", - "2021-11-20 13:05:53,633 - [NOTICE] simulation.solve(884): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,655 - [NOTICE] simulation.solve(884): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,677 - [NOTICE] simulation.solve(884): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,697 - [NOTICE] simulation.solve(884): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,736 - [NOTICE] simulation.solve(972): Capacity is now 2.844 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,737 - [NOTICE] simulation.solve(850): Cycle 49/500 (5.249 s elapsed) --------------------\n", - "2021-11-20 13:05:53,738 - [NOTICE] simulation.solve(884): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,761 - [NOTICE] simulation.solve(884): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,784 - [NOTICE] simulation.solve(884): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,802 - [NOTICE] simulation.solve(884): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,841 - [NOTICE] simulation.solve(972): Capacity is now 2.838 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,842 - [NOTICE] simulation.solve(850): Cycle 50/500 (5.353 s elapsed) --------------------\n", - "2021-11-20 13:05:53,842 - [NOTICE] simulation.solve(884): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,860 - [NOTICE] simulation.solve(884): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,882 - [NOTICE] simulation.solve(884): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:53,901 - [NOTICE] simulation.solve(884): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:53,940 - [NOTICE] simulation.solve(972): Capacity is now 2.832 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:53,941 - [NOTICE] simulation.solve(850): Cycle 51/500 (5.453 s elapsed) --------------------\n", - "2021-11-20 13:05:53,942 - [NOTICE] simulation.solve(884): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:53,960 - [NOTICE] simulation.solve(884): Cycle 51/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:53,983 - [NOTICE] simulation.solve(884): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,002 - [NOTICE] simulation.solve(884): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,044 - [NOTICE] simulation.solve(972): Capacity is now 2.826 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,045 - [NOTICE] simulation.solve(850): Cycle 52/500 (5.556 s elapsed) --------------------\n", - "2021-11-20 13:05:54,045 - [NOTICE] simulation.solve(884): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,066 - [NOTICE] simulation.solve(884): Cycle 52/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,089 - [NOTICE] simulation.solve(884): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,107 - [NOTICE] simulation.solve(884): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,145 - [NOTICE] simulation.solve(972): Capacity is now 2.820 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,145 - [NOTICE] simulation.solve(850): Cycle 53/500 (5.657 s elapsed) --------------------\n", - "2021-11-20 13:05:54,146 - [NOTICE] simulation.solve(884): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,163 - [NOTICE] simulation.solve(884): Cycle 53/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,188 - [NOTICE] simulation.solve(884): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,206 - [NOTICE] simulation.solve(884): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,244 - [NOTICE] simulation.solve(972): Capacity is now 2.813 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,245 - [NOTICE] simulation.solve(850): Cycle 54/500 (5.757 s elapsed) --------------------\n", - "2021-11-20 13:05:54,246 - [NOTICE] simulation.solve(884): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,263 - [NOTICE] simulation.solve(884): Cycle 54/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,288 - [NOTICE] simulation.solve(884): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,309 - [NOTICE] simulation.solve(884): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,347 - [NOTICE] simulation.solve(972): Capacity is now 2.807 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,348 - [NOTICE] simulation.solve(850): Cycle 55/500 (5.859 s elapsed) --------------------\n", - "2021-11-20 13:05:54,349 - [NOTICE] simulation.solve(884): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,368 - [NOTICE] simulation.solve(884): Cycle 55/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,391 - [NOTICE] simulation.solve(884): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,406 - [NOTICE] simulation.solve(884): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,443 - [NOTICE] simulation.solve(972): Capacity is now 2.801 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,444 - [NOTICE] simulation.solve(850): Cycle 56/500 (5.955 s elapsed) --------------------\n", - "2021-11-20 13:05:54,446 - [NOTICE] simulation.solve(884): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,465 - [NOTICE] simulation.solve(884): Cycle 56/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,489 - [NOTICE] simulation.solve(884): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,504 - [NOTICE] simulation.solve(884): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,542 - [NOTICE] simulation.solve(972): Capacity is now 2.794 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,543 - [NOTICE] simulation.solve(850): Cycle 57/500 (6.054 s elapsed) --------------------\n", - "2021-11-20 13:05:54,543 - [NOTICE] simulation.solve(884): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,563 - [NOTICE] simulation.solve(884): Cycle 57/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,586 - [NOTICE] simulation.solve(884): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,601 - [NOTICE] simulation.solve(884): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,638 - [NOTICE] simulation.solve(972): Capacity is now 2.788 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,638 - [NOTICE] simulation.solve(850): Cycle 58/500 (6.150 s elapsed) --------------------\n", - "2021-11-20 13:05:54,639 - [NOTICE] simulation.solve(884): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,658 - [NOTICE] simulation.solve(884): Cycle 58/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,683 - [NOTICE] simulation.solve(884): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,700 - [NOTICE] simulation.solve(884): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,739 - [NOTICE] simulation.solve(972): Capacity is now 2.781 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,739 - [NOTICE] simulation.solve(850): Cycle 59/500 (6.251 s elapsed) --------------------\n", - "2021-11-20 13:05:54,740 - [NOTICE] simulation.solve(884): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,758 - [NOTICE] simulation.solve(884): Cycle 59/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,781 - [NOTICE] simulation.solve(884): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,796 - [NOTICE] simulation.solve(884): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,833 - [NOTICE] simulation.solve(972): Capacity is now 2.774 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:54,834 - [NOTICE] simulation.solve(850): Cycle 60/500 (6.346 s elapsed) --------------------\n", - "2021-11-20 13:05:54,835 - [NOTICE] simulation.solve(884): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,855 - [NOTICE] simulation.solve(884): Cycle 60/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,879 - [NOTICE] simulation.solve(884): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,894 - [NOTICE] simulation.solve(884): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:54,935 - [NOTICE] simulation.solve(972): Capacity is now 2.768 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:54,936 - [NOTICE] simulation.solve(850): Cycle 61/500 (6.447 s elapsed) --------------------\n", - "2021-11-20 13:05:54,937 - [NOTICE] simulation.solve(884): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:54,955 - [NOTICE] simulation.solve(884): Cycle 61/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:54,980 - [NOTICE] simulation.solve(884): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:54,996 - [NOTICE] simulation.solve(884): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,037 - [NOTICE] simulation.solve(972): Capacity is now 2.761 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,038 - [NOTICE] simulation.solve(850): Cycle 62/500 (6.549 s elapsed) --------------------\n", - "2021-11-20 13:05:55,039 - [NOTICE] simulation.solve(884): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,058 - [NOTICE] simulation.solve(884): Cycle 62/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,080 - [NOTICE] simulation.solve(884): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,097 - [NOTICE] simulation.solve(884): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,140 - [NOTICE] simulation.solve(972): Capacity is now 2.754 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,142 - [NOTICE] simulation.solve(850): Cycle 63/500 (6.653 s elapsed) --------------------\n", - "2021-11-20 13:05:55,143 - [NOTICE] simulation.solve(884): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,165 - [NOTICE] simulation.solve(884): Cycle 63/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,196 - [NOTICE] simulation.solve(884): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,212 - [NOTICE] simulation.solve(884): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,254 - [NOTICE] simulation.solve(972): Capacity is now 2.747 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,255 - [NOTICE] simulation.solve(850): Cycle 64/500 (6.767 s elapsed) --------------------\n", - "2021-11-20 13:05:55,256 - [NOTICE] simulation.solve(884): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,277 - [NOTICE] simulation.solve(884): Cycle 64/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,303 - [NOTICE] simulation.solve(884): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,319 - [NOTICE] simulation.solve(884): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,362 - [NOTICE] simulation.solve(972): Capacity is now 2.741 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,363 - [NOTICE] simulation.solve(850): Cycle 65/500 (6.874 s elapsed) --------------------\n", - "2021-11-20 13:05:55,364 - [NOTICE] simulation.solve(884): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,386 - [NOTICE] simulation.solve(884): Cycle 65/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,410 - [NOTICE] simulation.solve(884): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,444 - [NOTICE] simulation.solve(884): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,489 - [NOTICE] simulation.solve(972): Capacity is now 2.734 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,490 - [NOTICE] simulation.solve(850): Cycle 66/500 (7.001 s elapsed) --------------------\n", - "2021-11-20 13:05:55,491 - [NOTICE] simulation.solve(884): Cycle 66/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,513 - [NOTICE] simulation.solve(884): Cycle 66/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,537 - [NOTICE] simulation.solve(884): Cycle 66/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,555 - [NOTICE] simulation.solve(884): Cycle 66/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,598 - [NOTICE] simulation.solve(972): Capacity is now 2.727 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,599 - [NOTICE] simulation.solve(850): Cycle 67/500 (7.110 s elapsed) --------------------\n", - "2021-11-20 13:05:55,600 - [NOTICE] simulation.solve(884): Cycle 67/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,623 - [NOTICE] simulation.solve(884): Cycle 67/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,646 - [NOTICE] simulation.solve(884): Cycle 67/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,664 - [NOTICE] simulation.solve(884): Cycle 67/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,705 - [NOTICE] simulation.solve(972): Capacity is now 2.720 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,706 - [NOTICE] simulation.solve(850): Cycle 68/500 (7.218 s elapsed) --------------------\n", - "2021-11-20 13:05:55,707 - [NOTICE] simulation.solve(884): Cycle 68/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,731 - [NOTICE] simulation.solve(884): Cycle 68/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,757 - [NOTICE] simulation.solve(884): Cycle 68/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,776 - [NOTICE] simulation.solve(884): Cycle 68/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,825 - [NOTICE] simulation.solve(972): Capacity is now 2.713 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,825 - [NOTICE] simulation.solve(850): Cycle 69/500 (7.337 s elapsed) --------------------\n", - "2021-11-20 13:05:55,826 - [NOTICE] simulation.solve(884): Cycle 69/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,847 - [NOTICE] simulation.solve(884): Cycle 69/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:55,875 - [NOTICE] simulation.solve(884): Cycle 69/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:55,892 - [NOTICE] simulation.solve(884): Cycle 69/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:55,934 - [NOTICE] simulation.solve(972): Capacity is now 2.706 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:55,935 - [NOTICE] simulation.solve(850): Cycle 70/500 (7.447 s elapsed) --------------------\n", - "2021-11-20 13:05:55,937 - [NOTICE] simulation.solve(884): Cycle 70/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:55,975 - [NOTICE] simulation.solve(884): Cycle 70/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,006 - [NOTICE] simulation.solve(884): Cycle 70/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,026 - [NOTICE] simulation.solve(884): Cycle 70/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,068 - [NOTICE] simulation.solve(972): Capacity is now 2.699 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,069 - [NOTICE] simulation.solve(850): Cycle 71/500 (7.580 s elapsed) --------------------\n", - "2021-11-20 13:05:56,070 - [NOTICE] simulation.solve(884): Cycle 71/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,093 - [NOTICE] simulation.solve(884): Cycle 71/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,120 - [NOTICE] simulation.solve(884): Cycle 71/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,139 - [NOTICE] simulation.solve(884): Cycle 71/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,182 - [NOTICE] simulation.solve(972): Capacity is now 2.692 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,182 - [NOTICE] simulation.solve(850): Cycle 72/500 (7.694 s elapsed) --------------------\n", - "2021-11-20 13:05:56,183 - [NOTICE] simulation.solve(884): Cycle 72/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,205 - [NOTICE] simulation.solve(884): Cycle 72/500, step 2/4: Rest for 1 hour\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:56,227 - [NOTICE] simulation.solve(884): Cycle 72/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,245 - [NOTICE] simulation.solve(884): Cycle 72/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,288 - [NOTICE] simulation.solve(972): Capacity is now 2.686 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,289 - [NOTICE] simulation.solve(850): Cycle 73/500 (7.800 s elapsed) --------------------\n", - "2021-11-20 13:05:56,290 - [NOTICE] simulation.solve(884): Cycle 73/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,311 - [NOTICE] simulation.solve(884): Cycle 73/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,335 - [NOTICE] simulation.solve(884): Cycle 73/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,353 - [NOTICE] simulation.solve(884): Cycle 73/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,393 - [NOTICE] simulation.solve(972): Capacity is now 2.679 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,393 - [NOTICE] simulation.solve(850): Cycle 74/500 (7.905 s elapsed) --------------------\n", - "2021-11-20 13:05:56,394 - [NOTICE] simulation.solve(884): Cycle 74/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,416 - [NOTICE] simulation.solve(884): Cycle 74/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,440 - [NOTICE] simulation.solve(884): Cycle 74/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,457 - [NOTICE] simulation.solve(884): Cycle 74/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,498 - [NOTICE] simulation.solve(972): Capacity is now 2.672 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,499 - [NOTICE] simulation.solve(850): Cycle 75/500 (8.010 s elapsed) --------------------\n", - "2021-11-20 13:05:56,500 - [NOTICE] simulation.solve(884): Cycle 75/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,522 - [NOTICE] simulation.solve(884): Cycle 75/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,546 - [NOTICE] simulation.solve(884): Cycle 75/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,565 - [NOTICE] simulation.solve(884): Cycle 75/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,603 - [NOTICE] simulation.solve(972): Capacity is now 2.665 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,604 - [NOTICE] simulation.solve(850): Cycle 76/500 (8.115 s elapsed) --------------------\n", - "2021-11-20 13:05:56,604 - [NOTICE] simulation.solve(884): Cycle 76/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,621 - [NOTICE] simulation.solve(884): Cycle 76/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,644 - [NOTICE] simulation.solve(884): Cycle 76/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,659 - [NOTICE] simulation.solve(884): Cycle 76/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,700 - [NOTICE] simulation.solve(972): Capacity is now 2.658 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,700 - [NOTICE] simulation.solve(850): Cycle 77/500 (8.212 s elapsed) --------------------\n", - "2021-11-20 13:05:56,701 - [NOTICE] simulation.solve(884): Cycle 77/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,720 - [NOTICE] simulation.solve(884): Cycle 77/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,743 - [NOTICE] simulation.solve(884): Cycle 77/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,759 - [NOTICE] simulation.solve(884): Cycle 77/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,799 - [NOTICE] simulation.solve(972): Capacity is now 2.651 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,800 - [NOTICE] simulation.solve(850): Cycle 78/500 (8.312 s elapsed) --------------------\n", - "2021-11-20 13:05:56,801 - [NOTICE] simulation.solve(884): Cycle 78/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,820 - [NOTICE] simulation.solve(884): Cycle 78/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,846 - [NOTICE] simulation.solve(884): Cycle 78/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,864 - [NOTICE] simulation.solve(884): Cycle 78/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:56,912 - [NOTICE] simulation.solve(972): Capacity is now 2.644 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:56,912 - [NOTICE] simulation.solve(850): Cycle 79/500 (8.424 s elapsed) --------------------\n", - "2021-11-20 13:05:56,913 - [NOTICE] simulation.solve(884): Cycle 79/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:56,931 - [NOTICE] simulation.solve(884): Cycle 79/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:56,955 - [NOTICE] simulation.solve(884): Cycle 79/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:56,970 - [NOTICE] simulation.solve(884): Cycle 79/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,010 - [NOTICE] simulation.solve(972): Capacity is now 2.637 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,010 - [NOTICE] simulation.solve(850): Cycle 80/500 (8.521 s elapsed) --------------------\n", - "2021-11-20 13:05:57,011 - [NOTICE] simulation.solve(884): Cycle 80/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,029 - [NOTICE] simulation.solve(884): Cycle 80/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,052 - [NOTICE] simulation.solve(884): Cycle 80/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,067 - [NOTICE] simulation.solve(884): Cycle 80/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,108 - [NOTICE] simulation.solve(972): Capacity is now 2.631 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,109 - [NOTICE] simulation.solve(850): Cycle 81/500 (8.620 s elapsed) --------------------\n", - "2021-11-20 13:05:57,110 - [NOTICE] simulation.solve(884): Cycle 81/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,127 - [NOTICE] simulation.solve(884): Cycle 81/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,152 - [NOTICE] simulation.solve(884): Cycle 81/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,168 - [NOTICE] simulation.solve(884): Cycle 81/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,207 - [NOTICE] simulation.solve(972): Capacity is now 2.624 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,208 - [NOTICE] simulation.solve(850): Cycle 82/500 (8.719 s elapsed) --------------------\n", - "2021-11-20 13:05:57,208 - [NOTICE] simulation.solve(884): Cycle 82/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,226 - [NOTICE] simulation.solve(884): Cycle 82/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,252 - [NOTICE] simulation.solve(884): Cycle 82/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,267 - [NOTICE] simulation.solve(884): Cycle 82/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,307 - [NOTICE] simulation.solve(972): Capacity is now 2.617 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,309 - [NOTICE] simulation.solve(850): Cycle 83/500 (8.820 s elapsed) --------------------\n", - "2021-11-20 13:05:57,310 - [NOTICE] simulation.solve(884): Cycle 83/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,328 - [NOTICE] simulation.solve(884): Cycle 83/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,351 - [NOTICE] simulation.solve(884): Cycle 83/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,366 - [NOTICE] simulation.solve(884): Cycle 83/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,406 - [NOTICE] simulation.solve(972): Capacity is now 2.610 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,407 - [NOTICE] simulation.solve(850): Cycle 84/500 (8.918 s elapsed) --------------------\n", - "2021-11-20 13:05:57,408 - [NOTICE] simulation.solve(884): Cycle 84/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,426 - [NOTICE] simulation.solve(884): Cycle 84/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,451 - [NOTICE] simulation.solve(884): Cycle 84/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,466 - [NOTICE] simulation.solve(884): Cycle 84/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,512 - [NOTICE] simulation.solve(972): Capacity is now 2.603 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:57,513 - [NOTICE] simulation.solve(850): Cycle 85/500 (9.024 s elapsed) --------------------\n", - "2021-11-20 13:05:57,513 - [NOTICE] simulation.solve(884): Cycle 85/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,534 - [NOTICE] simulation.solve(884): Cycle 85/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,556 - [NOTICE] simulation.solve(884): Cycle 85/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,571 - [NOTICE] simulation.solve(884): Cycle 85/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,610 - [NOTICE] simulation.solve(972): Capacity is now 2.597 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,611 - [NOTICE] simulation.solve(850): Cycle 86/500 (9.122 s elapsed) --------------------\n", - "2021-11-20 13:05:57,612 - [NOTICE] simulation.solve(884): Cycle 86/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,630 - [NOTICE] simulation.solve(884): Cycle 86/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,653 - [NOTICE] simulation.solve(884): Cycle 86/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,668 - [NOTICE] simulation.solve(884): Cycle 86/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,709 - [NOTICE] simulation.solve(972): Capacity is now 2.590 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,710 - [NOTICE] simulation.solve(850): Cycle 87/500 (9.221 s elapsed) --------------------\n", - "2021-11-20 13:05:57,711 - [NOTICE] simulation.solve(884): Cycle 87/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,729 - [NOTICE] simulation.solve(884): Cycle 87/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,753 - [NOTICE] simulation.solve(884): Cycle 87/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,770 - [NOTICE] simulation.solve(884): Cycle 87/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,810 - [NOTICE] simulation.solve(972): Capacity is now 2.583 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,811 - [NOTICE] simulation.solve(850): Cycle 88/500 (9.322 s elapsed) --------------------\n", - "2021-11-20 13:05:57,811 - [NOTICE] simulation.solve(884): Cycle 88/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,830 - [NOTICE] simulation.solve(884): Cycle 88/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,853 - [NOTICE] simulation.solve(884): Cycle 88/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,870 - [NOTICE] simulation.solve(884): Cycle 88/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:57,911 - [NOTICE] simulation.solve(972): Capacity is now 2.576 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:57,912 - [NOTICE] simulation.solve(850): Cycle 89/500 (9.423 s elapsed) --------------------\n", - "2021-11-20 13:05:57,913 - [NOTICE] simulation.solve(884): Cycle 89/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:57,933 - [NOTICE] simulation.solve(884): Cycle 89/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:57,956 - [NOTICE] simulation.solve(884): Cycle 89/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:57,975 - [NOTICE] simulation.solve(884): Cycle 89/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,014 - [NOTICE] simulation.solve(972): Capacity is now 2.570 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,015 - [NOTICE] simulation.solve(850): Cycle 90/500 (9.526 s elapsed) --------------------\n", - "2021-11-20 13:05:58,016 - [NOTICE] simulation.solve(884): Cycle 90/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,036 - [NOTICE] simulation.solve(884): Cycle 90/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,060 - [NOTICE] simulation.solve(884): Cycle 90/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,076 - [NOTICE] simulation.solve(884): Cycle 90/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,116 - [NOTICE] simulation.solve(972): Capacity is now 2.563 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,117 - [NOTICE] simulation.solve(850): Cycle 91/500 (9.628 s elapsed) --------------------\n", - "2021-11-20 13:05:58,117 - [NOTICE] simulation.solve(884): Cycle 91/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,138 - [NOTICE] simulation.solve(884): Cycle 91/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,162 - [NOTICE] simulation.solve(884): Cycle 91/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,179 - [NOTICE] simulation.solve(884): Cycle 91/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,217 - [NOTICE] simulation.solve(972): Capacity is now 2.556 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,219 - [NOTICE] simulation.solve(850): Cycle 92/500 (9.730 s elapsed) --------------------\n", - "2021-11-20 13:05:58,220 - [NOTICE] simulation.solve(884): Cycle 92/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,240 - [NOTICE] simulation.solve(884): Cycle 92/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,263 - [NOTICE] simulation.solve(884): Cycle 92/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,281 - [NOTICE] simulation.solve(884): Cycle 92/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,323 - [NOTICE] simulation.solve(972): Capacity is now 2.550 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,324 - [NOTICE] simulation.solve(850): Cycle 93/500 (9.835 s elapsed) --------------------\n", - "2021-11-20 13:05:58,325 - [NOTICE] simulation.solve(884): Cycle 93/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,346 - [NOTICE] simulation.solve(884): Cycle 93/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,377 - [NOTICE] simulation.solve(884): Cycle 93/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,395 - [NOTICE] simulation.solve(884): Cycle 93/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,443 - [NOTICE] simulation.solve(972): Capacity is now 2.543 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,443 - [NOTICE] simulation.solve(850): Cycle 94/500 (9.955 s elapsed) --------------------\n", - "2021-11-20 13:05:58,444 - [NOTICE] simulation.solve(884): Cycle 94/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,469 - [NOTICE] simulation.solve(884): Cycle 94/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,492 - [NOTICE] simulation.solve(884): Cycle 94/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,511 - [NOTICE] simulation.solve(884): Cycle 94/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,550 - [NOTICE] simulation.solve(972): Capacity is now 2.537 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,551 - [NOTICE] simulation.solve(850): Cycle 95/500 (10.062 s elapsed) --------------------\n", - "2021-11-20 13:05:58,552 - [NOTICE] simulation.solve(884): Cycle 95/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,574 - [NOTICE] simulation.solve(884): Cycle 95/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,600 - [NOTICE] simulation.solve(884): Cycle 95/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,616 - [NOTICE] simulation.solve(884): Cycle 95/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,658 - [NOTICE] simulation.solve(972): Capacity is now 2.530 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,659 - [NOTICE] simulation.solve(850): Cycle 96/500 (10.170 s elapsed) --------------------\n", - "2021-11-20 13:05:58,659 - [NOTICE] simulation.solve(884): Cycle 96/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,680 - [NOTICE] simulation.solve(884): Cycle 96/500, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:05:58,705 - [NOTICE] simulation.solve(884): Cycle 96/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,724 - [NOTICE] simulation.solve(884): Cycle 96/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,765 - [NOTICE] simulation.solve(972): Capacity is now 2.523 Ah (originally 3.152 Ah, will stop at 2.521 Ah)\n", - "2021-11-20 13:05:58,766 - [NOTICE] simulation.solve(850): Cycle 97/500 (10.277 s elapsed) --------------------\n", - "2021-11-20 13:05:58,767 - [NOTICE] simulation.solve(884): Cycle 97/500, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:05:58,787 - [NOTICE] simulation.solve(884): Cycle 97/500, step 2/4: Rest for 1 hour\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:05:58,811 - [NOTICE] simulation.solve(884): Cycle 97/500, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:05:58,828 - [NOTICE] simulation.solve(884): Cycle 97/500, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:05:58,867 - [NOTICE] simulation.solve(978): Stopping experiment since capacity (2.517 Ah) is below stopping capacity (2.521 Ah).\n", - "2021-11-20 13:05:58,869 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 10.380 s\n" - ] - } - ], - "source": [ - "# With integer\n", - "sol_int = sim.solve(save_at_cycles=5)\n", - "# With list\n", - "sol_list = sim.solve(save_at_cycles=[30,45,55])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "severe-yorkshire", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_int.cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "unavailable-fetish", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_list.cycles" - ] - }, - { - "cell_type": "markdown", - "id": "guilty-nylon", - "metadata": {}, - "source": [ - "For the cycles that are saved, you can plot as usual (note off-by-1 indexing)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "architectural-signal", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1d714031744d429796a085c526489bc8", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=104.97821887755418, description='t', max=107.33117354439943, min=104.9…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_list.cycles[44].plot([\"Current [A]\",\"Terminal voltage [V]\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "played-hundred", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1,2,figsize=(10,5))\n", - "for cycle in sol_int.cycles:\n", - " if cycle is not None:\n", - " t = cycle[\"Time [h]\"].data - cycle[\"Time [h]\"].data[0]\n", - " ax[0].plot(t, cycle[\"Current [A]\"].data)\n", - " ax[0].set_xlabel(\"Time [h]\")\n", - " ax[0].set_title(\"Current [A]\")\n", - " ax[1].plot(t, cycle[\"Terminal voltage [V]\"].data)\n", - " ax[1].set_xlabel(\"Time [h]\")\n", - " ax[1].set_title(\"Terminal voltage [V]\")" - ] - }, - { - "cell_type": "markdown", - "id": "considered-rescue", - "metadata": {}, - "source": [ - "All summary variables are always available for every cycle, since these are much less memory-intensive" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "multiple-culture", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "array([[,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ]], dtype=object)" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pybamm.plot_summary_variables(sol_list)" - ] - }, - { - "cell_type": "markdown", - "id": "convinced-winter", - "metadata": {}, - "source": [ - "## Starting solution" - ] - }, - { - "cell_type": "markdown", - "id": "unauthorized-fundamental", - "metadata": {}, - "source": [ - "A simulation can be performed iteratively by using the `starting_solution` feature. For example, we first solve for 10 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "posted-plastic", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:06:02,427 - [NOTICE] simulation.solve(850): Cycle 1/10 (267.851 ms elapsed) --------------------\n", - "2021-11-20 13:06:02,428 - [NOTICE] simulation.solve(884): Cycle 1/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:02,480 - [NOTICE] simulation.solve(884): Cycle 1/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:02,519 - [NOTICE] simulation.solve(884): Cycle 1/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:02,566 - [NOTICE] simulation.solve(884): Cycle 1/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:02,784 - [NOTICE] simulation.solve(972): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:02,785 - [NOTICE] simulation.solve(850): Cycle 2/10 (625.709 ms elapsed) --------------------\n", - "2021-11-20 13:06:02,786 - [NOTICE] simulation.solve(884): Cycle 2/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:02,816 - [NOTICE] simulation.solve(884): Cycle 2/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:02,839 - [NOTICE] simulation.solve(884): Cycle 2/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:02,871 - [NOTICE] simulation.solve(884): Cycle 2/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:02,907 - [NOTICE] simulation.solve(972): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:02,908 - [NOTICE] simulation.solve(850): Cycle 3/10 (749.307 ms elapsed) --------------------\n", - "2021-11-20 13:06:02,909 - [NOTICE] simulation.solve(884): Cycle 3/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:02,940 - [NOTICE] simulation.solve(884): Cycle 3/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:02,964 - [NOTICE] simulation.solve(884): Cycle 3/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:02,994 - [NOTICE] simulation.solve(884): Cycle 3/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,031 - [NOTICE] simulation.solve(972): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,032 - [NOTICE] simulation.solve(850): Cycle 4/10 (872.678 ms elapsed) --------------------\n", - "2021-11-20 13:06:03,033 - [NOTICE] simulation.solve(884): Cycle 4/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,063 - [NOTICE] simulation.solve(884): Cycle 4/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,088 - [NOTICE] simulation.solve(884): Cycle 4/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,117 - [NOTICE] simulation.solve(884): Cycle 4/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,156 - [NOTICE] simulation.solve(972): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,156 - [NOTICE] simulation.solve(850): Cycle 5/10 (997.666 ms elapsed) --------------------\n", - "2021-11-20 13:06:03,157 - [NOTICE] simulation.solve(884): Cycle 5/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,189 - [NOTICE] simulation.solve(884): Cycle 5/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,211 - [NOTICE] simulation.solve(884): Cycle 5/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,240 - [NOTICE] simulation.solve(884): Cycle 5/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,282 - [NOTICE] simulation.solve(972): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,284 - [NOTICE] simulation.solve(850): Cycle 6/10 (1.125 s elapsed) --------------------\n", - "2021-11-20 13:06:03,284 - [NOTICE] simulation.solve(884): Cycle 6/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,313 - [NOTICE] simulation.solve(884): Cycle 6/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,339 - [NOTICE] simulation.solve(884): Cycle 6/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,365 - [NOTICE] simulation.solve(884): Cycle 6/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,404 - [NOTICE] simulation.solve(972): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,405 - [NOTICE] simulation.solve(850): Cycle 7/10 (1.246 s elapsed) --------------------\n", - "2021-11-20 13:06:03,405 - [NOTICE] simulation.solve(884): Cycle 7/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,437 - [NOTICE] simulation.solve(884): Cycle 7/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,463 - [NOTICE] simulation.solve(884): Cycle 7/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,489 - [NOTICE] simulation.solve(884): Cycle 7/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,531 - [NOTICE] simulation.solve(972): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,532 - [NOTICE] simulation.solve(850): Cycle 8/10 (1.373 s elapsed) --------------------\n", - "2021-11-20 13:06:03,532 - [NOTICE] simulation.solve(884): Cycle 8/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,561 - [NOTICE] simulation.solve(884): Cycle 8/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,586 - [NOTICE] simulation.solve(884): Cycle 8/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,612 - [NOTICE] simulation.solve(884): Cycle 8/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,652 - [NOTICE] simulation.solve(972): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,653 - [NOTICE] simulation.solve(850): Cycle 9/10 (1.495 s elapsed) --------------------\n", - "2021-11-20 13:06:03,654 - [NOTICE] simulation.solve(884): Cycle 9/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,684 - [NOTICE] simulation.solve(884): Cycle 9/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,708 - [NOTICE] simulation.solve(884): Cycle 9/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,736 - [NOTICE] simulation.solve(884): Cycle 9/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,776 - [NOTICE] simulation.solve(972): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,777 - [NOTICE] simulation.solve(850): Cycle 10/10 (1.618 s elapsed) --------------------\n", - "2021-11-20 13:06:03,778 - [NOTICE] simulation.solve(884): Cycle 10/10, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,808 - [NOTICE] simulation.solve(884): Cycle 10/10, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:03,832 - [NOTICE] simulation.solve(884): Cycle 10/10, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:03,862 - [NOTICE] simulation.solve(884): Cycle 10/10, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:03,901 - [NOTICE] simulation.solve(972): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:03,902 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 1.743 s\n" - ] - } - ], - "source": [ - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\")\n", - "] * 10,\n", - "termination=\"80% capacity\"\n", - ")\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "weird-darkness", - "metadata": {}, - "source": [ - "If we give `sol` as the starting solution this will then solve for the next 10 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "moderate-pipeline", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2021-11-20 13:06:03,962 - [NOTICE] simulation.solve(850): Cycle 11/20 (37.058 ms elapsed) --------------------\n", - "2021-11-20 13:06:03,963 - [NOTICE] simulation.solve(884): Cycle 11/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:03,992 - [NOTICE] simulation.solve(884): Cycle 11/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,017 - [NOTICE] simulation.solve(884): Cycle 11/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,044 - [NOTICE] simulation.solve(884): Cycle 11/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,206 - [NOTICE] simulation.solve(972): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,207 - [NOTICE] simulation.solve(850): Cycle 12/20 (281.890 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,208 - [NOTICE] simulation.solve(884): Cycle 12/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,238 - [NOTICE] simulation.solve(884): Cycle 12/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,260 - [NOTICE] simulation.solve(884): Cycle 12/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,284 - [NOTICE] simulation.solve(884): Cycle 12/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,321 - [NOTICE] simulation.solve(972): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,324 - [NOTICE] simulation.solve(850): Cycle 13/20 (398.912 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,324 - [NOTICE] simulation.solve(884): Cycle 13/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,350 - [NOTICE] simulation.solve(884): Cycle 13/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,373 - [NOTICE] simulation.solve(884): Cycle 13/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,400 - [NOTICE] simulation.solve(884): Cycle 13/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,439 - [NOTICE] simulation.solve(972): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,439 - [NOTICE] simulation.solve(850): Cycle 14/20 (514.339 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,440 - [NOTICE] simulation.solve(884): Cycle 14/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,468 - [NOTICE] simulation.solve(884): Cycle 14/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,491 - [NOTICE] simulation.solve(884): Cycle 14/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,515 - [NOTICE] simulation.solve(884): Cycle 14/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,558 - [NOTICE] simulation.solve(972): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,559 - [NOTICE] simulation.solve(850): Cycle 15/20 (633.660 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,559 - [NOTICE] simulation.solve(884): Cycle 15/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,585 - [NOTICE] simulation.solve(884): Cycle 15/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,608 - [NOTICE] simulation.solve(884): Cycle 15/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,631 - [NOTICE] simulation.solve(884): Cycle 15/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,672 - [NOTICE] simulation.solve(972): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,673 - [NOTICE] simulation.solve(850): Cycle 16/20 (748.146 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,674 - [NOTICE] simulation.solve(884): Cycle 16/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,703 - [NOTICE] simulation.solve(884): Cycle 16/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,727 - [NOTICE] simulation.solve(884): Cycle 16/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,752 - [NOTICE] simulation.solve(884): Cycle 16/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,790 - [NOTICE] simulation.solve(972): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,791 - [NOTICE] simulation.solve(850): Cycle 17/20 (866.082 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,792 - [NOTICE] simulation.solve(884): Cycle 17/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,824 - [NOTICE] simulation.solve(884): Cycle 17/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,851 - [NOTICE] simulation.solve(884): Cycle 17/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,877 - [NOTICE] simulation.solve(884): Cycle 17/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:04,915 - [NOTICE] simulation.solve(972): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:04,916 - [NOTICE] simulation.solve(850): Cycle 18/20 (990.076 ms elapsed) --------------------\n", - "2021-11-20 13:06:04,916 - [NOTICE] simulation.solve(884): Cycle 18/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:04,946 - [NOTICE] simulation.solve(884): Cycle 18/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:04,968 - [NOTICE] simulation.solve(884): Cycle 18/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:04,993 - [NOTICE] simulation.solve(884): Cycle 18/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:05,029 - [NOTICE] simulation.solve(972): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:05,030 - [NOTICE] simulation.solve(850): Cycle 19/20 (1.105 s elapsed) --------------------\n", - "2021-11-20 13:06:05,031 - [NOTICE] simulation.solve(884): Cycle 19/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:05,060 - [NOTICE] simulation.solve(884): Cycle 19/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:05,084 - [NOTICE] simulation.solve(884): Cycle 19/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:05,107 - [NOTICE] simulation.solve(884): Cycle 19/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:05,147 - [NOTICE] simulation.solve(972): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:05,148 - [NOTICE] simulation.solve(850): Cycle 20/20 (1.222 s elapsed) --------------------\n", - "2021-11-20 13:06:05,149 - [NOTICE] simulation.solve(884): Cycle 20/20, step 1/4: Discharge at 1C until 3.0V\n", - "2021-11-20 13:06:05,178 - [NOTICE] simulation.solve(884): Cycle 20/20, step 2/4: Rest for 1 hour\n", - "2021-11-20 13:06:05,203 - [NOTICE] simulation.solve(884): Cycle 20/20, step 3/4: Charge at 1C until 4.2V\n", - "2021-11-20 13:06:05,229 - [NOTICE] simulation.solve(884): Cycle 20/20, step 4/4: Hold at 4.2V until C/50\n", - "2021-11-20 13:06:05,270 - [NOTICE] simulation.solve(972): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2021-11-20 13:06:05,271 - [NOTICE] simulation.solve(990): Finish experiment simulation, took 1.346 s\n" - ] - } - ], - "source": [ - "sol2 = sim.solve(starting_solution=sol)" - ] - }, - { - "cell_type": "markdown", - "id": "leading-passport", - "metadata": {}, - "source": [ - "We have now simulated 20 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "higher-covering", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(sol2.cycles)" - ] - }, - { - "cell_type": "markdown", - "id": "plastic-framework", - "metadata": {}, - "source": [ - "## References" - ] - }, - { - "cell_type": "markdown", - "id": "drawn-fifty", - "metadata": {}, - "source": [ - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "driven-sensitivity", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[4] Peyman Mohtat, Suhak Lee, Jason B Siegel, and Anna G Stefanopoulou. Towards better estimability of electrode-specific state of health: decoding the cell expansion. Journal of Power Sources, 427:101–111, 2019.\n", - "[5] Peyman Mohtat, Suhak Lee, Valentin Sulzer, Jason B. Siegel, and Anna G. Stefanopoulou. Differential Expansion and Voltage Model for Li-ion Batteries at Practical Charging Rates. Journal of The Electrochemical Society, 167(11):110561, 2020. doi:10.1149/1945-7111/aba5d1.\n", - "[6] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "[7] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.0" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 6108036b9b..64cc05f05f 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -6,19 +6,26 @@ pybamm.set_logging_level("INFO") # load models +options = { + "particle phases": ("2", "1"), + "open circuit potential": (("single", "current sigmoid"), "single"), +} models = [ - pybamm.lithium_ion.SPM(), - pybamm.lithium_ion.SPMe(), - pybamm.lithium_ion.DFN(), - pybamm.lithium_ion.NewmanTobias(), + # pybamm.lithium_ion.SPM(options), + # pybamm.lithium_ion.SPMe(options), + # pybamm.lithium_ion.BasicDFNComposite(), + pybamm.lithium_ion.DFN({"particle size": "distribution"}), + # pybamm.lithium_ion.NewmanTobias(), ] +param = pybamm.ParameterValues("Chen2020_composite") + # create and run simulations sims = [] for model in models: - sim = pybamm.Simulation(model) + sim = pybamm.Simulation(model, parameter_values=param) sim.solve([0, 3600]) sims.append(sim) # plot -pybamm.dynamic_plot(sims) +pybamm.dynamic_plot(sims, ["Terminal voltage [V]"]) diff --git a/examples/scripts/compare_lithium_ion_half_cell.py b/examples/scripts/compare_lithium_ion_half_cell.py index b6396724f4..fef68bc22d 100644 --- a/examples/scripts/compare_lithium_ion_half_cell.py +++ b/examples/scripts/compare_lithium_ion_half_cell.py @@ -3,7 +3,7 @@ # import pybamm -pybamm.set_logging_level("INFO") +pybamm.set_logging_level("DEBUG") # load models models = [ diff --git a/pybamm/CITATIONS.txt b/pybamm/CITATIONS.txt index 34c50da52d..5da95f824c 100644 --- a/pybamm/CITATIONS.txt +++ b/pybamm/CITATIONS.txt @@ -10,6 +10,18 @@ doi = {10.1149/2.0122001JES}, } +@article{Ai2022, + title = {A composite electrode model for lithium-ion batteries with silicon/graphite negative electrodes}, + journal = {Journal of Power Sources}, + volume = {527}, + pages = {231142}, + year = {2022}, + issn = {0378-7753}, + doi = {https://doi.org/10.1016/j.jpowsour.2022.231142}, + url = {https://www.sciencedirect.com/science/article/pii/S0378775322001604}, + author = {Weilong Ai and Niall Kirkaldy and Yang Jiang and Gregory Offer and Huizhi Wang and Billy Wu}, +} + @article{Andersson2019, author = {Andersson, Joel A. E. and Gillis, Joris and Horn, Greg and Rawlings, James B. and Diehl, Moritz}, @@ -506,4 +518,4 @@ pages={A3169}, year={2018}, publisher={IOP Publishing} -} +} \ No newline at end of file diff --git a/pybamm/expression_tree/averages.py b/pybamm/expression_tree/averages.py index 23b881eaab..ab19c60c90 100644 --- a/pybamm/expression_tree/averages.py +++ b/pybamm/expression_tree/averages.py @@ -21,15 +21,9 @@ def __init__(self, child, name, integration_variable): class XAverage(_BaseAverage): def __init__(self, child): - if child.domain in [ - ["negative particle"], - ["negative particle size"], - ]: + if all(n in child.domain[0] for n in ["negative", "particle"]): x = pybamm.standard_spatial_vars.x_n - elif child.domain in [ - ["positive particle"], - ["positive particle size"], - ]: + elif all(n in child.domain[0] for n in ["positive", "particle"]): x = pybamm.standard_spatial_vars.x_p else: x = pybamm.SpatialVariable("x", domain=child.domain) @@ -270,12 +264,17 @@ def r_average(symbol): :class:`Symbol` the new averaged symbol """ + has_particle_domain = ( + symbol.domain != [] + and "particle" in symbol.domain[0] + and "size" not in symbol.domain[0] + ) # Can't take average if the symbol evaluates on edges if symbol.evaluates_on_edges("primary"): raise ValueError("Can't take the r-average of a symbol that evaluates on edges") # Otherwise, if symbol doesn't have a particle domain, # its r-averaged value is itself - elif symbol.domain not in [["positive particle"], ["negative particle"]]: + elif not has_particle_domain: return symbol # If symbol is a secondary broadcast onto "negative electrode" or # "positive electrode", take the r-average of the child then broadcast back @@ -286,9 +285,10 @@ def r_average(symbol): child_av = pybamm.r_average(child) return pybamm.PrimaryBroadcast(child_av, symbol.domains["secondary"]) # If symbol is a Broadcast onto a particle domain, its average value is its child - elif isinstance( - symbol, (pybamm.PrimaryBroadcast, pybamm.FullBroadcast) - ) and symbol.domain in [["positive particle"], ["negative particle"]]: + elif ( + isinstance(symbol, (pybamm.PrimaryBroadcast, pybamm.FullBroadcast)) + and has_particle_domain + ): return symbol.reduce_one_dimension() else: return RAverage(symbol) @@ -341,7 +341,7 @@ def size_average(symbol, f_a_dist=None): "R", domains=symbol.domains, coord_sys="cartesian" ) if ["negative particle size"] in symbol.domains.values(): - f_a_dist = geo.n.f_a_dist(R) + f_a_dist = geo.n.prim.f_a_dist(R) elif ["positive particle size"] in symbol.domains.values(): - f_a_dist = geo.p.f_a_dist(R) + f_a_dist = geo.p.prim.f_a_dist(R) return SizeAverage(symbol, f_a_dist) diff --git a/pybamm/expression_tree/broadcasts.py b/pybamm/expression_tree/broadcasts.py index 660bcf0d37..88514d8b64 100644 --- a/pybamm/expression_tree/broadcasts.py +++ b/pybamm/expression_tree/broadcasts.py @@ -89,29 +89,28 @@ def check_and_set_domains(self, child, broadcast_domain): # Note e.g. current collector to particle *is* allowed if child.domain == []: pass - elif child.domain == ["current collector"] and broadcast_domain[0] not in [ - "negative electrode", - "separator", - "positive electrode", - "negative particle size", - "positive particle size", - "negative particle", - "positive particle", - ]: + elif child.domain == ["current collector"] and not ( + broadcast_domain[0] + in [ + "negative electrode", + "separator", + "positive electrode", + ] + or "particle" in broadcast_domain[0] + ): raise pybamm.DomainError( """Primary broadcast from current collector domain must be to electrode or separator or particle or particle size domains""" ) - elif child.domain[0] in [ - "negative electrode", - "separator", - "positive electrode", - ] and broadcast_domain[0] not in [ - "negative particle", - "positive particle", - "negative particle size", - "positive particle size", - ]: + elif ( + child.domain[0] + in [ + "negative electrode", + "separator", + "positive electrode", + ] + and "particle" not in broadcast_domain[0] + ): raise pybamm.DomainError( """Primary broadcast from electrode or separator must be to particle or particle size domains""" diff --git a/pybamm/expression_tree/independent_variable.py b/pybamm/expression_tree/independent_variable.py index 6416d7c81b..1e1a71f97c 100644 --- a/pybamm/expression_tree/independent_variable.py +++ b/pybamm/expression_tree/independent_variable.py @@ -119,11 +119,15 @@ def __init__( raise ValueError("domain must be provided") # Check symbol name vs domain name - if name == "r_n" and domain != ["negative particle"]: + if name == "r_n" and not all(n in domain[0] for n in ["negative", "particle"]): + # catches "negative particle", "negative secondary particle", etc raise pybamm.DomainError( "domain must be negative particle if name is 'r_n'" ) - elif name == "r_p" and domain != ["positive particle"]: + elif name == "r_p" and not all( + n in domain[0] for n in ["positive", "particle"] + ): + # catches "positive particle", "positive secondary particle", etc raise pybamm.DomainError( "domain must be positive particle if name is 'r_p'" ) diff --git a/pybamm/expression_tree/parameter.py b/pybamm/expression_tree/parameter.py index cdff946c11..a40dd0114a 100644 --- a/pybamm/expression_tree/parameter.py +++ b/pybamm/expression_tree/parameter.py @@ -109,11 +109,16 @@ def __init__( self.print_name = None else: if print_name.endswith("_dimensional"): - self.print_name = print_name[: -len("_dimensional")] + print_name = print_name[: -len("_dimensional")] elif print_name.endswith("_dim"): - self.print_name = print_name[: -len("_dim")] - else: - self.print_name = print_name + print_name = print_name[: -len("_dim")] + parent_param = frame.f_locals["self"] + if hasattr(parent_param, "domain"): + # add "_n" or "_s" or "_p" if this comes from a Parameter class with + # a domain + d = getattr(parent_param, "domain").lower()[0] + print_name += f"_{d}" + self.print_name = print_name @property def input_names(self): @@ -161,7 +166,12 @@ def diff(self, variable): input_dict = {input_names[i]: children_list[i] for i in range(len(input_names))} - return FunctionParameter(self.name, input_dict, diff_variable=variable) + return FunctionParameter( + self.name, + input_dict, + diff_variable=variable, + print_name=self.print_name + "'", + ) def create_copy(self): """See :meth:`pybamm.Symbol.new_copy()`.""" diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index c60c71568d..cd3230a12a 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -54,10 +54,10 @@ def prettify_print_name(name): return PRINT_NAME_OVERRIDES[name] # Superscripts with comma separated (U_n_ref --> U_{n}^{ref}) - sup_re = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) + sup_re = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?((?:n|s|p))", name) if sup_re: sup_str = ( - r"{" + sup_re.group(1).replace("_", "\,") + r"}^{" + sup_re.group(2) + r"}" + r"{" + sup_re.group(2).replace("_", "\,") + r"}^{" + sup_re.group(1) + r"}" ) sup_var = sup_re.group(1) + "_" + sup_re.group(2) name = name.replace(sup_var, sup_str) diff --git a/pybamm/geometry/battery_geometry.py b/pybamm/geometry/battery_geometry.py index 32f8b5e6c7..4f6a89cc9c 100644 --- a/pybamm/geometry/battery_geometry.py +++ b/pybamm/geometry/battery_geometry.py @@ -47,18 +47,29 @@ def battery_geometry( } # Add particle domains if include_particles is True: + zero_one = {"min": 0, "max": 1} geometry.update( { - "negative particle": {"r_n": {"min": 0, "max": 1}}, - "positive particle": {"r_p": {"min": 0, "max": 1}}, + "negative particle": {"r_n": zero_one}, + "positive particle": {"r_p": zero_one}, } ) + if isinstance(options, pybamm.BatteryModelOptions): + for domain in ["negative", "positive"]: + phases = int(getattr(options, domain)["particle phases"]) + if phases >= 2: + geometry.update( + { + f"{domain} primary particle": {"r_n_prim": zero_one}, + f"{domain} secondary particle": {"r_n_sec": zero_one}, + } + ) # Add particle size domains if options is not None and options["particle size"] == "distribution": - R_min_n = geo.n.R_min - R_min_p = geo.p.R_min - R_max_n = geo.n.R_max - R_max_p = geo.p.R_max + R_min_n = geo.n.prim.R_min + R_min_p = geo.p.prim.R_min + R_max_n = geo.n.prim.R_max + R_max_p = geo.p.prim.R_max geometry.update( { "negative particle size": {"R_n": {"min": R_min_n, "max": R_max_n}}, diff --git a/pybamm/geometry/standard_spatial_vars.py b/pybamm/geometry/standard_spatial_vars.py index e70d773a16..565908deb9 100644 --- a/pybamm/geometry/standard_spatial_vars.py +++ b/pybamm/geometry/standard_spatial_vars.py @@ -52,6 +52,42 @@ }, coord_sys="spherical polar", ) +r_n_prim = pybamm.SpatialVariable( + "r_n_prim", + domain=["negative primary particle"], + auxiliary_domains={ + "secondary": "negative electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", +) +r_p_prim = pybamm.SpatialVariable( + "r_p_prim", + domain=["positive primary particle"], + auxiliary_domains={ + "secondary": "positive electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", +) +r_n_sec = pybamm.SpatialVariable( + "r_n_sec", + domain=["negative secondary particle"], + auxiliary_domains={ + "secondary": "negative electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", +) +r_p_sec = pybamm.SpatialVariable( + "r_p_sec", + domain=["positive secondary particle"], + auxiliary_domains={ + "secondary": "positive electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", +) R_n = pybamm.SpatialVariable( "R_n", diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/LiPF6_Mohtat2020/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/LiPF6_Mohtat2020/parameters.csv index 528ec51dab..534aae6cfc 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/LiPF6_Mohtat2020/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/LiPF6_Mohtat2020/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,Peyman MPM,from MPM code +Initial concentration in electrolyte [mol.m-3],1000,Peyman MPM,from MPM code Cation transference number,0.38,Peyman MPM, 1 + dlnf/dlnc,1,, Typical lithium ion diffusivity [m2.s-1],5.34E-10,Scott Moura FastDFN, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_DMC_1_1_Landesfeind2019/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_DMC_1_1_Landesfeind2019/parameters.csv index 46f3fc5232..998cfc30d4 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_DMC_1_1_Landesfeind2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_DMC_1_1_Landesfeind2019/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,default, +Initial concentration in electrolyte [mol.m-3],1000,default, Cation transference number,[function]electrolyte_transference_number_EC_DMC_1_1_Landesfeind2019,Landesfeind 2019, 1 + dlnf/dlnc,[function]electrolyte_TDF_EC_DMC_1_1_Landesfeind2019,Landesfeind 2019, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_EC_DMC_1_1_Landesfeind2019,Landesfeind 2019," " diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_EMC_3_7_Landesfeind2019/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_EMC_3_7_Landesfeind2019/parameters.csv index 4f3ae13761..b156009df7 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_EMC_3_7_Landesfeind2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EC_EMC_3_7_Landesfeind2019/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,default, +Initial concentration in electrolyte [mol.m-3],1000,default, Cation transference number,[function]electrolyte_transference_number_EC_EMC_3_7_Landesfeind2019,Landesfeind 2019, 1 + dlnf/dlnc,[function]electrolyte_TDF_EC_EMC_3_7_Landesfeind2019,Landesfeind 2019, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_EC_EMC_3_7_Landesfeind2019,Landesfeind 2019," " diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EMC_FEC_19_1_Landesfeind2019/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EMC_FEC_19_1_Landesfeind2019/parameters.csv index 2239aebfb4..fde3ede095 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EMC_FEC_19_1_Landesfeind2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_EMC_FEC_19_1_Landesfeind2019/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,default, +Initial concentration in electrolyte [mol.m-3],1000,default, Cation transference number,[function]electrolyte_transference_number_EMC_FEC_19_1_Landesfeind2019,Landesfeind 2019, 1 + dlnf/dlnc,[function]electrolyte_TDF_EMC_FEC_19_1_Landesfeind2019,Landesfeind 2019, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_EMC_FEC_19_1_Landesfeind2019,Landesfeind 2019," " diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ecker2015/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ecker2015/parameters.csv index 7ef0733506..6c1f86d3f4 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ecker2015/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ecker2015/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,, +Initial concentration in electrolyte [mol.m-3],1000,, Cation transference number,0.26,, 1 + dlnf/dlnc,1,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Ecker2015,, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Enertech_Ai2020/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Enertech_Ai2020/parameters.csv index 5d18c26c9a..726adfbf3e 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Enertech_Ai2020/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Enertech_Ai2020/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,Ai 2020, +Initial concentration in electrolyte [mol.m-3],1000,Ai 2020, Cation transference number,0.38,Ai 2020, 1 + dlnf/dlnc,[function]dlnf_dlnc_Ai2020,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Ai2020,, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Kim2011/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Kim2011/parameters.csv index c0a0b0d75b..cf4fb47f96 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Kim2011/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Kim2011/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1200,, +Initial concentration in electrolyte [mol.m-3],1200,, Cation transference number,0.4,Reported as a function in Kim2011 (Implement later), 1 + dlnf/dlnc,1,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Kim2011,, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Marquis2019/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Marquis2019/parameters.csv index ed7e67cff3..a935cd7da6 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Marquis2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Marquis2019/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,Scott Moura FastDFN, +Initial concentration in electrolyte [mol.m-3],1000,Scott Moura FastDFN, Cation transference number,0.4,Scott Moura FastDFN, 1 + dlnf/dlnc,1,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Capiglia1999,, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Nyman2008/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Nyman2008/parameters.csv index 238c6fb4c8..2d177004a3 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Nyman2008/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Nyman2008/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,Chen 2020, +Initial concentration in electrolyte [mol.m-3],1000,Chen 2020, Cation transference number,0.2594,Chen 2020, 1 + dlnf/dlnc,1,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Nyman2008,Nyman 2008, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ramadass2004/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ramadass2004/parameters.csv index c10a6d80d8..50374d9dd9 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ramadass2004/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Ramadass2004/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,Ramadass, +Initial concentration in electrolyte [mol.m-3],1000,Ramadass, Cation transference number,0.363,Ramadass, 1 + dlnf/dlnc,1,, Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Ramadass2004,, diff --git a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Valoen2005/parameters.csv b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Valoen2005/parameters.csv index 5d1360c33b..2c6d668798 100644 --- a/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Valoen2005/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/electrolytes/lipf6_Valoen2005/parameters.csv @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes ,,, # Electrolyte properties,,, Typical electrolyte concentration [mol.m-3],1000,,By convention +Initial concentration in electrolyte [mol.m-3],1000,,By convention Cation transference number,0.38,,Assumed to be constant Electrolyte diffusivity [m2.s-1],[function]electrolyte_diffusivity_Valoen2005,, Electrolyte conductivity [S.m-1],[function]electrolyte_conductivity_Valoen2005,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_charge_from_empty_Mohtat2020/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_charge_from_empty_Mohtat2020/parameters.csv index 7ec34bd29f..72098e6c04 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_charge_from_empty_Mohtat2020/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_charge_from_empty_Mohtat2020/parameters.csv @@ -20,5 +20,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3],48.8682,Peyman MPM, x0 (0.0017) * Csmax_n Initial concentration in positive electrode [mol.m-3],31513.0,Peyman MPM, y0 (0.8907) * Csmax_p -Initial concentration in electrolyte [mol.m-3],1000,Peyman MPM, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ai2020/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ai2020/parameters.csv index 7c9c919863..42a6665957 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ai2020/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ai2020/parameters.csv @@ -15,5 +15,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3],24108,Ai 2020, Initial concentration in positive electrode [mol.m-3],21725,Ai 2020, -Initial concentration in electrolyte [mol.m-3],1000,Ai 2020, Initial temperature [K],298.15,, \ No newline at end of file diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Chen2020/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Chen2020/parameters.csv index 15bc6f541e..398d5c26e8 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Chen2020/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Chen2020/parameters.csv @@ -15,5 +15,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3],29866,Chen 2020, Initial concentration in positive electrode [mol.m-3],17038,Chen 2020, -Initial concentration in electrolyte [mol.m-3],1000,Chen 2020, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ecker2015/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ecker2015/parameters.csv index 0b02ef3229..c5d0488ece 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ecker2015/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ecker2015/parameters.csv @@ -21,5 +21,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3], 26120.05,, Initial concentration in positive electrode [mol.m-3], 12630.8,, -Initial concentration in electrolyte [mol.m-3],1000,, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Kim2011/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Kim2011/parameters.csv index 150c0eaf83..35c17b584f 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Kim2011/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Kim2011/parameters.csv @@ -21,5 +21,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3],18081,0.63*2.84E4, Initial concentration in positive electrode [mol.m-3],20090,0.41*4.9E4, -Initial concentration in electrolyte [mol.m-3],1200,, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Marquis2019/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Marquis2019/parameters.csv index 7c0a2cc3cf..faa617476d 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Marquis2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Marquis2019/parameters.csv @@ -20,5 +20,4 @@ Upper voltage cut-off [V],4.1,, # Initial conditions Initial concentration in negative electrode [mol.m-3],19986.609595075,Scott Moura FastDFN, Initial concentration in positive electrode [mol.m-3],30730.7554385565,Scott Moura FastDFN, -Initial concentration in electrolyte [mol.m-3],1000,Scott Moura FastDFN, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_ORegan2021/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_ORegan2021/parameters.csv index a833784510..c613fd6f99 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_ORegan2021/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_ORegan2021/parameters.csv @@ -15,5 +15,4 @@ Upper voltage cut-off [V],4.4,, # Initial conditions Initial concentration in negative electrode [mol.m-3],28866,Chen 2020, Initial concentration in positive electrode [mol.m-3],13975,Chen 2020, -Initial concentration in electrolyte [mol.m-3],1000,Chen 2020, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ramadass2004/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ramadass2004/parameters.csv index 2ce1f5d908..09fdb802c8 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ramadass2004/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Ramadass2004/parameters.csv @@ -19,5 +19,4 @@ Upper voltage cut-off [V],4.2,, # Initial conditions Initial concentration in negative electrode [mol.m-3],22610.7,Ramadass 2002, Initial concentration in positive electrode [mol.m-3],25777.5,Ramadass 2002, -Initial concentration in electrolyte [mol.m-3],1000,Ramadass, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Xu2019/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Xu2019/parameters.csv index a9289f6fb9..dc33db77bf 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Xu2019/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/1C_discharge_from_full_Xu2019/parameters.csv @@ -14,5 +14,4 @@ Upper voltage cut-off [V],4.2,, ,,, # Initial conditions Initial concentration in positive electrode [mol.m-3],4631,48230*0.096 adjusted so that initial voltage is <4.2V, -Initial concentration in electrolyte [mol.m-3],1000,, Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv index ab919924f6..b931742fc7 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv @@ -14,7 +14,6 @@ Lower voltage cut-off [V],2,, Upper voltage cut-off [V],4.4,, ,,, # Initial conditions,,, -Initial concentration in negative electrode [mol.m-3],28831.45783,Minimized to Severson Data, Initial concentration in positive electrode [mol.m-3],35.3766672,Minimized to Severson Data, -Initial concentration in electrolyte [mol.m-3],1200,Lain, + Initial temperature [K],298.15,, diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py index d0ada14911..1236724fd8 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py @@ -1,7 +1,9 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_Dualfoil1998( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -18,6 +20,8 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T) Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -30,8 +34,6 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T) E_r = 5000 # activation energy for Temperature Dependent Reaction Constant [J/mol] arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_entropy_Enertech_Ai2020_function.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_entropy_Enertech_Ai2020_function.py index 1e86cb8cd7..3b93317540 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_entropy_Enertech_Ai2020_function.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_entropy_Enertech_Ai2020_function.py @@ -1,4 +1,4 @@ -def graphite_entropy_Enertech_Ai2020_function(sto): +def graphite_entropy_Enertech_Ai2020_function(sto, c_s_max): """ Lithium Cobalt Oxide (LiCO2) entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py index 9abea7e1bd..3ce8068a60 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -1,7 +1,9 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T): +def graphite_LGM50_electrolyte_exchange_current_density_Chen2020( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -21,19 +23,18 @@ def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- :class:`pybamm.Symbol` Exchange-current density [A.m-2] """ - m_ref = 6.48e-7 # (A/m2)(mol/m3)**1.5 - includes ref concentrations E_r = 35000 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py index 9abea7e1bd..df6cfe196d 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -1,7 +1,9 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T): +def graphite_LGM50_electrolyte_exchange_current_density_Chen2020( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -21,6 +23,8 @@ def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -32,8 +36,6 @@ def graphite_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, E_r = 35000 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py index de38edf18c..ffab715ae8 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -26,6 +26,8 @@ def graphite_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -41,8 +43,6 @@ def graphite_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): arrhenius = exp(-E_r / (constants.R * T)) * exp(E_r / (constants.R * 296.15)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py index c98aac2d18..4189c8375e 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py @@ -1,7 +1,7 @@ from pybamm import exp, constants, Parameter -def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC @@ -22,6 +22,8 @@ def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -31,13 +33,12 @@ def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): i0_ref = 36 # reference exchange current density at 100% SOC sto = 0.36 # stochiometry at 100% SOC - c_s_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - c_s_n_ref = sto * c_s_n_max # reference electrode concentration + c_s_n_ref = sto * c_s_max # reference electrode concentration c_e_ref = Parameter("Typical electrolyte concentration [mol.m-3]") alpha = 0.5 # charge transfer coefficient m_ref = i0_ref / ( - c_e_ref ** alpha * (c_s_n_max - c_s_n_ref) ** alpha * c_s_n_ref ** alpha + c_e_ref ** alpha * (c_s_max - c_s_n_ref) ** alpha * c_s_n_ref ** alpha ) E_r = 3e4 @@ -48,5 +49,5 @@ def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): * arrhenius * c_e ** alpha * c_s_surf ** alpha - * (c_s_n_max - c_s_surf) ** alpha + * (c_s_max - c_s_surf) ** alpha ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py index ea9645ca87..13cd4aa931 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py @@ -1,7 +1,9 @@ from pybamm import exp, constants, Parameter -def graphite_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf, T): +def graphite_LGM50_electrolyte_exchange_current_density_ORegan2021( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -21,6 +23,8 @@ def graphite_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -33,13 +37,12 @@ def graphite_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf E_r = 4e4 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") c_e_ref = Parameter("Typical electrolyte concentration [mol.m-3]") return ( i_ref * arrhenius * (c_e / c_e_ref) ** (1 - alpha) - * (c_s_surf / c_n_max) ** alpha - * (1 - c_s_surf / c_n_max) ** (1 - alpha) + * (c_s_surf / c_s_max) ** alpha + * (1 - c_s_surf / c_s_max) ** (1 - alpha) ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_entropic_change_ORegan2021.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_entropic_change_ORegan2021.py index 5386ab4c58..c1a634de5a 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_entropic_change_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_entropic_change_ORegan2021.py @@ -1,7 +1,7 @@ from pybamm import exp, tanh -def graphite_LGM50_entropic_change_ORegan2021(sto): +def graphite_LGM50_entropic_change_ORegan2021(sto, c_s_max): """ LG M50 Graphite entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken from [1]. diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py index 063bff2587..275d425d7a 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py @@ -1,7 +1,9 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_Ramadass2004( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -20,6 +22,8 @@ def graphite_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T) Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -30,8 +34,6 @@ def graphite_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T) E_r = 37480 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py index 2a83f7b6fa..5f350a8a79 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py @@ -1,7 +1,7 @@ from pybamm import exp, cosh, Parameter -def graphite_entropic_change_Moura2016(sto): +def graphite_entropic_change_Moura2016(sto, c_s_max): """ Graphite entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry taken from Scott Moura's FastDFN code @@ -17,18 +17,16 @@ def graphite_entropic_change_Moura2016(sto): Stochiometry of material (li-fraction) """ - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - du_dT = ( - -1.5 * (120.0 / c_n_max) * exp(-120 * sto) - + (0.0351 / (0.083 * c_n_max)) * ((cosh((sto - 0.286) / 0.083)) ** (-2)) - - (0.0045 / (0.119 * c_n_max)) * ((cosh((sto - 0.849) / 0.119)) ** (-2)) - - (0.035 / (0.05 * c_n_max)) * ((cosh((sto - 0.9233) / 0.05)) ** (-2)) - - (0.0147 / (0.034 * c_n_max)) * ((cosh((sto - 0.5) / 0.034)) ** (-2)) - - (0.102 / (0.142 * c_n_max)) * ((cosh((sto - 0.194) / 0.142)) ** (-2)) - - (0.022 / (0.0164 * c_n_max)) * ((cosh((sto - 0.9) / 0.0164)) ** (-2)) - - (0.011 / (0.0226 * c_n_max)) * ((cosh((sto - 0.124) / 0.0226)) ** (-2)) - + (0.0155 / (0.029 * c_n_max)) * ((cosh((sto - 0.105) / 0.029)) ** (-2)) + -1.5 * (120.0 / c_s_max) * exp(-120 * sto) + + (0.0351 / (0.083 * c_s_max)) * ((cosh((sto - 0.286) / 0.083)) ** (-2)) + - (0.0045 / (0.119 * c_s_max)) * ((cosh((sto - 0.849) / 0.119)) ** (-2)) + - (0.035 / (0.05 * c_s_max)) * ((cosh((sto - 0.9233) / 0.05)) ** (-2)) + - (0.0147 / (0.034 * c_s_max)) * ((cosh((sto - 0.5) / 0.034)) ** (-2)) + - (0.102 / (0.142 * c_s_max)) * ((cosh((sto - 0.194) / 0.142)) ** (-2)) + - (0.022 / (0.0164 * c_s_max)) * ((cosh((sto - 0.9) / 0.0164)) ** (-2)) + - (0.011 / (0.0226 * c_s_max)) * ((cosh((sto - 0.124) / 0.0226)) ** (-2)) + + (0.0155 / (0.029 * c_s_max)) * ((cosh((sto - 0.105) / 0.029)) ** (-2)) ) return du_dT diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py index ef13eb3862..a832c2d688 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -19,6 +19,8 @@ def graphite_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -30,8 +32,6 @@ def graphite_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): E_r = 37480 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_entropic_change_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_entropic_change_PeymanMPM.py index 12a56687c6..f857100eee 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_entropic_change_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_entropic_change_PeymanMPM.py @@ -1,4 +1,4 @@ -def graphite_entropic_change_PeymanMPM(sto): +def graphite_entropic_change_PeymanMPM(sto, c_s_max): """ Graphite entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry taken from [1] diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py index d618bd464b..48760a9a40 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py @@ -1,7 +1,9 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): +def graphite_electrolyte_exchange_current_density_Dualfoil1998( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between graphite and LiPF6 in EC:DMC. @@ -18,6 +20,8 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T) Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -28,8 +32,6 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T) E_r = 37480 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_n_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_entropic_change_Moura2016.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_entropic_change_Moura2016.py index 2a83f7b6fa..7547bcf332 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_entropic_change_Moura2016.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_entropic_change_Moura2016.py @@ -1,7 +1,7 @@ -from pybamm import exp, cosh, Parameter +from pybamm import exp, cosh -def graphite_entropic_change_Moura2016(sto): +def graphite_entropic_change_Moura2016(sto, c_s_max): """ Graphite entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry taken from Scott Moura's FastDFN code @@ -17,18 +17,16 @@ def graphite_entropic_change_Moura2016(sto): Stochiometry of material (li-fraction) """ - c_n_max = Parameter("Maximum concentration in negative electrode [mol.m-3]") - du_dT = ( - -1.5 * (120.0 / c_n_max) * exp(-120 * sto) - + (0.0351 / (0.083 * c_n_max)) * ((cosh((sto - 0.286) / 0.083)) ** (-2)) - - (0.0045 / (0.119 * c_n_max)) * ((cosh((sto - 0.849) / 0.119)) ** (-2)) - - (0.035 / (0.05 * c_n_max)) * ((cosh((sto - 0.9233) / 0.05)) ** (-2)) - - (0.0147 / (0.034 * c_n_max)) * ((cosh((sto - 0.5) / 0.034)) ** (-2)) - - (0.102 / (0.142 * c_n_max)) * ((cosh((sto - 0.194) / 0.142)) ** (-2)) - - (0.022 / (0.0164 * c_n_max)) * ((cosh((sto - 0.9) / 0.0164)) ** (-2)) - - (0.011 / (0.0226 * c_n_max)) * ((cosh((sto - 0.124) / 0.0226)) ** (-2)) - + (0.0155 / (0.029 * c_n_max)) * ((cosh((sto - 0.105) / 0.029)) ** (-2)) + -1.5 * (120.0 / c_s_max) * exp(-120 * sto) + + (0.0351 / (0.083 * c_s_max)) * ((cosh((sto - 0.286) / 0.083)) ** (-2)) + - (0.0045 / (0.119 * c_s_max)) * ((cosh((sto - 0.849) / 0.119)) ** (-2)) + - (0.035 / (0.05 * c_s_max)) * ((cosh((sto - 0.9233) / 0.05)) ** (-2)) + - (0.0147 / (0.034 * c_s_max)) * ((cosh((sto - 0.5) / 0.034)) ** (-2)) + - (0.102 / (0.142 * c_s_max)) * ((cosh((sto - 0.194) / 0.142)) ** (-2)) + - (0.022 / (0.0164 * c_s_max)) * ((cosh((sto - 0.9) / 0.0164)) ** (-2)) + - (0.011 / (0.0226 * c_s_max)) * ((cosh((sto - 0.124) / 0.0226)) ** (-2)) + + (0.0155 / (0.029 * c_s_max)) * ((cosh((sto - 0.105) / 0.029)) ** (-2)) ) return du_dT diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py index 083c352806..835f1b806b 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def LFP_electrolyte_exchange_current_density_kashkooli2017(c_e, c_s_surf, T): # , 1 +def LFP_electrolyte_exchange_current_density_kashkooli2017(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between LFP and electrolyte @@ -20,6 +20,8 @@ def LFP_electrolyte_exchange_current_density_kashkooli2017(c_e, c_s_surf, T): # Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -30,8 +32,7 @@ def LFP_electrolyte_exchange_current_density_kashkooli2017(c_e, c_s_surf, T): # m_ref = 6 * 10 ** (-7) # (A/m2)(mol/m3)**1.5 - includes ref concentrations E_r = 39570 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py index 65930905e2..ad38d9352e 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py @@ -1,14 +1,14 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def nco_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): +def nco_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between NCO and LiPF6 in EC:DMC [1, 2, 3]. References ---------- - .. [1] Ecker, Madeleine, et al. "Parameterization of a physico-chemical model of + .. [1] Ecker, Madeleine, et al. "Parameterization of a physico-chemical model of a lithium-ion battery i. determination of parameters." Journal of the Electrochemical Society 162.9 (2015): A1836-A1848. .. [2] Ecker, Madeleine, et al. "Parameterization of a physico-chemical model of @@ -26,6 +26,8 @@ def nco_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -41,8 +43,6 @@ def nco_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, T): E_r = 4.36e4 arrhenius = exp(-E_r / (constants.R * T)) * exp(E_r / (constants.R * 296.15)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py index 42e879018f..76b82eb113 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py @@ -1,7 +1,7 @@ -from pybamm import constants, Parameter +from pybamm import constants -def nmc_electrolyte_exchange_current_density_Xu2019(c_e, c_s_surf, T): +def nmc_electrolyte_exchange_current_density_Xu2019(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between NMC and LiPF6 in EC:DMC. @@ -21,6 +21,8 @@ def nmc_electrolyte_exchange_current_density_Xu2019(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -29,6 +31,5 @@ def nmc_electrolyte_exchange_current_density_Xu2019(c_e, c_s_surf, T): """ # assuming implicit correction of incorrect units from the paper m_ref = 5.76e-11 * constants.F # (A/m2)(mol/m3)**1.5 - includes ref concentrations - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return m_ref * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + return m_ref * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py index 4359ccd0e6..b7c12a4904 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def NMC_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): +def NMC_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between NMC and LiPF6 in EC:DMC. @@ -18,6 +18,8 @@ def NMC_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -28,8 +30,6 @@ def NMC_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, T): E_r = 39570 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_entropic_change_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_entropic_change_PeymanMPM.py index 854592c3ed..93baa06af6 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_entropic_change_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_entropic_change_PeymanMPM.py @@ -1,7 +1,7 @@ import pybamm -def NMC_entropic_change_PeymanMPM(sto): +def NMC_entropic_change_PeymanMPM(sto, c_s_max): """ Nickel Manganese Cobalt (NMC) entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the OCP. The fit is taken from [1]. diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py index 3fec659a0e..770bb239c7 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): +def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between lico2 and LiPF6 in EC:DMC. @@ -18,6 +18,8 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -29,8 +31,6 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): E_r = 5000 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_entropic_change_Ai2020_function.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_entropic_change_Ai2020_function.py index 34bc8e836e..bbe09b014b 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_entropic_change_Ai2020_function.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_entropic_change_Ai2020_function.py @@ -1,4 +1,4 @@ -def lico2_entropic_change_Ai2020_function(sto): +def lico2_entropic_change_Ai2020_function(sto, c_s_max): """ Lithium Cobalt Oxide (LiCO2) entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_volume_change_Ai2020.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_volume_change_Ai2020.py index 456a13fa90..16d7edab10 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_volume_change_Ai2020.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_volume_change_Ai2020.py @@ -1,7 +1,7 @@ from pybamm import Parameter -def lico2_volume_change_Ai2020(sto): +def lico2_volume_change_Ai2020(sto, c_s_max): """ lico2 particle volume change as a function of stochiometry [1, 2]. @@ -20,12 +20,12 @@ def lico2_volume_change_Ai2020(sto): sto: :class:`pybamm.Symbol` Electrode stochiometry, dimensionless should be R-averaged particle concentration + Returns ------- t_change:class:`pybamm.Symbol` volume change, dimensionless, normalised by particle volume """ omega = Parameter("Positive electrode partial molar volume [m3.mol-1]") - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - t_change = omega * c_p_max * sto + t_change = omega * c_s_max * sto return t_change diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py index b7955322f5..f8ff1d25db 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): +def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between lico2 and LiPF6 in EC:DMC. @@ -18,6 +18,8 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -28,8 +30,6 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, T): E_r = 39570 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_entropic_change_Moura2016.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_entropic_change_Moura2016.py index 2e4b5596f1..9ff64b554c 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_entropic_change_Moura2016.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_entropic_change_Moura2016.py @@ -1,7 +1,7 @@ -from pybamm import cosh, Parameter +from pybamm import cosh -def lico2_entropic_change_Moura2016(sto): +def lico2_entropic_change_Moura2016(sto, c_s_max): """ Lithium Cobalt Oxide (LiCO2) entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken @@ -15,22 +15,19 @@ def lico2_entropic_change_Moura2016(sto): ---------- sto : :class:`pybamm.Symbol` Stochiometry of material (li-fraction) - """ - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - # Since the equation for LiCo2 from this ref. has the stretch factor, # should this too? If not, the "bumps" in the OCV don't line up. stretch = 1.062 sto = stretch * sto du_dT = ( - 0.07645 * (-54.4806 / c_p_max) * ((1.0 / cosh(30.834 - 54.4806 * sto)) ** 2) - + 2.1581 * (-50.294 / c_p_max) * ((cosh(52.294 - 50.294 * sto)) ** (-2)) - + 0.14169 * (19.854 / c_p_max) * ((cosh(11.0923 - 19.8543 * sto)) ** (-2)) - - 0.2051 * (5.4888 / c_p_max) * ((cosh(1.4684 - 5.4888 * sto)) ** (-2)) - - (0.2531 / 0.1316 / c_p_max) * ((cosh((-sto + 0.56478) / 0.1316)) ** (-2)) - - (0.02167 / 0.006 / c_p_max) * ((cosh((sto - 0.525) / 0.006)) ** (-2)) + 0.07645 * (-54.4806 / c_s_max) * ((1.0 / cosh(30.834 - 54.4806 * sto)) ** 2) + + 2.1581 * (-50.294 / c_s_max) * ((cosh(52.294 - 50.294 * sto)) ** (-2)) + + 0.14169 * (19.854 / c_s_max) * ((cosh(11.0923 - 19.8543 * sto)) ** (-2)) + - 0.2051 * (5.4888 / c_s_max) * ((cosh(1.4684 - 5.4888 * sto)) ** (-2)) + - (0.2531 / 0.1316 / c_s_max) * ((cosh((-sto + 0.56478) / 0.1316)) ** (-2)) + - (0.02167 / 0.006 / c_s_max) * ((cosh((sto - 0.525) / 0.006)) ** (-2)) ) return du_dT diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py index bdd5256284..c690134f95 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def lico2_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T): +def lico2_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between lico2 and LiPF6 in EC:DMC. @@ -20,6 +20,8 @@ def lico2_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -30,8 +32,6 @@ def lico2_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, T): E_r = 39570 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_entropic_change_Moura2016.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_entropic_change_Moura2016.py index 26521581fa..9ff64b554c 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_entropic_change_Moura2016.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_entropic_change_Moura2016.py @@ -1,7 +1,7 @@ -from pybamm import cosh, Parameter +from pybamm import cosh -def lico2_entropic_change_Moura2016(sto): +def lico2_entropic_change_Moura2016(sto, c_s_max): """ Lithium Cobalt Oxide (LiCO2) entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken @@ -11,26 +11,23 @@ def lico2_entropic_change_Moura2016(sto): ---------- .. [1] https://github.com/scott-moura/fastDFN - Parameters - ---------- - sto : :class:`pybamm.Symbol` - Stochiometry of material (li-fraction) - + Parameters + ---------- + sto : :class:`pybamm.Symbol` + Stochiometry of material (li-fraction) """ - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - # Since the equation for LiCo2 from this ref. has the stretch factor, # should this too? If not, the "bumps" in the OCV don't line up. stretch = 1.062 sto = stretch * sto du_dT = ( - 0.07645 * (-54.4806 / c_p_max) * ((1.0 / cosh(30.834 - 54.4806 * sto)) ** 2) - + 2.1581 * (-50.294 / c_p_max) * ((cosh(52.294 - 50.294 * sto)) ** (-2)) - + 0.14169 * (19.854 / c_p_max) * ((cosh(11.0923 - 19.8543 * sto)) ** (-2)) - - 0.2051 * (5.4888 / c_p_max) * ((cosh(1.4684 - 5.4888 * sto)) ** (-2)) - - (0.2531 / 0.1316 / c_p_max) * ((cosh((-sto + 0.56478) / 0.1316)) ** (-2)) - - (0.02167 / 0.006 / c_p_max) * ((cosh((sto - 0.525) / 0.006)) ** (-2)) + 0.07645 * (-54.4806 / c_s_max) * ((1.0 / cosh(30.834 - 54.4806 * sto)) ** 2) + + 2.1581 * (-50.294 / c_s_max) * ((cosh(52.294 - 50.294 * sto)) ** (-2)) + + 0.14169 * (19.854 / c_s_max) * ((cosh(11.0923 - 19.8543 * sto)) ** (-2)) + - 0.2051 * (5.4888 / c_s_max) * ((cosh(1.4684 - 5.4888 * sto)) ** (-2)) + - (0.2531 / 0.1316 / c_s_max) * ((cosh((-sto + 0.56478) / 0.1316)) ** (-2)) + - (0.02167 / 0.006 / c_s_max) * ((cosh((sto - 0.525) / 0.006)) ** (-2)) ) return du_dT diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py index 52938cf215..7d08e47034 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py @@ -1,12 +1,12 @@ from pybamm import exp, constants, Parameter -def nca_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): +def nca_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between NCA and LiPF6 in EC:DMC [1]. - References + References ---------- .. [1] Kim, G. H., Smith, K., Lee, K. J., Santhanagopalan, S., & Pesaran, A. (2011). Multi-domain modeling of lithium-ion batteries encompassing @@ -21,6 +21,8 @@ def nca_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -29,7 +31,6 @@ def nca_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, T): """ i0_ref = 4 # reference exchange current density at 100% SOC sto = 0.41 # stochiometry at 100% SOC - c_s_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") c_s_ref = sto * c_s_max # reference electrode concentration c_e_ref = Parameter("Typical electrolyte concentration [mol.m-3]") alpha = 0.5 # charge transfer coefficient diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py index 0925f69260..ad4eca9fe4 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -1,7 +1,7 @@ -from pybamm import exp, constants, Parameter +from pybamm import exp, constants -def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T): +def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T, c_s_max): """ Exchange-current density for Butler-Volmer reactions between NMC and LiPF6 in EC:DMC. @@ -21,6 +21,8 @@ def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -31,8 +33,6 @@ def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, T): E_r = 17800 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") - return ( - m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_p_max - c_s_surf) ** 0.5 + m_ref * arrhenius * c_e ** 0.5 * c_s_surf ** 0.5 * (c_s_max - c_s_surf) ** 0.5 ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py index cb7525ac18..d812ffbca9 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py @@ -1,7 +1,9 @@ from pybamm import exp, constants, Parameter -def nmc_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf, T): +def nmc_LGM50_electrolyte_exchange_current_density_ORegan2021( + c_e, c_s_surf, T, c_s_max +): """ Exchange-current density for Butler-Volmer reactions between NMC and LiPF6 in EC:DMC. @@ -21,6 +23,8 @@ def nmc_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf, T): Particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] + c_s_max : :class:`pybamm.Symbol` + Maximum particle concentration [mol.m-3] Returns ------- @@ -32,13 +36,12 @@ def nmc_LGM50_electrolyte_exchange_current_density_ORegan2021(c_e, c_s_surf, T): E_r = 2.401e4 arrhenius = exp(E_r / constants.R * (1 / 298.15 - 1 / T)) - c_p_max = Parameter("Maximum concentration in positive electrode [mol.m-3]") c_e_ref = Parameter("Typical electrolyte concentration [mol.m-3]") return ( i_ref * arrhenius * (c_e / c_e_ref) ** (1 - alpha) - * (c_s_surf / c_p_max) ** alpha - * (1 - c_s_surf / c_p_max) ** (1 - alpha) + * (c_s_surf / c_s_max) ** alpha + * (1 - c_s_surf / c_s_max) ** (1 - alpha) ) diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_entropic_change_ORegan2021.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_entropic_change_ORegan2021.py index 0c288b0813..1f06012beb 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_entropic_change_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_entropic_change_ORegan2021.py @@ -1,7 +1,7 @@ from pybamm import exp -def nmc_LGM50_entropic_change_ORegan2021(sto): +def nmc_LGM50_entropic_change_ORegan2021(sto, c_s_max): """ LG M50 NMC 811 entropic change in open circuit potential (OCP) at a temperature of 298.15K as a function of the stochiometry. The fit is taken from [1]. diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index 69bdca6966..8739be9c47 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -73,6 +73,11 @@ class BatteryModelOptions(pybamm.FuzzyDict): "stress-driven", "reaction-driven", or "stress and reaction-driven". A 2-tuple can be provided for different behaviour in negative and positive electrodes. + * "particle phases": str + Number of phases present in the electrode. A 2-tuple can be provided for + different behaviour in negative and positive electrodes. + For example, set to ("2", "1") for a negative electrode with 2 phases, + e.g. graphite and silicon. * "operating mode" : str Sets the operating mode for the model. This determines how the current is set. Can be: @@ -211,6 +216,7 @@ def __init__(self, extra_options): "reaction-driven", "stress and reaction-driven", ], + "open circuit potential": ["single", "current sigmoid"], "operating mode": [ "current", "voltage", @@ -230,6 +236,7 @@ def __init__(self, extra_options): "quartic profile", ], "particle mechanics": ["none", "swelling only", "swelling and cracking"], + "particle phases": ["1", "2"], "particle shape": ["spherical", "no particles"], "particle size": ["single", "distribution"], "SEI": [ @@ -305,6 +312,16 @@ def __init__(self, extra_options): # The "stress-induced diffusion" option will still be overridden by # extra_options if provided + # Change the default for surface form based on which particle + # phases option is provided. + # return "1" if option not given + phases_option = extra_options.get("particle phases", "1") + if phases_option == "1": + default_options["surface form"] = "false" + else: + default_options["surface form"] = "algebraic" + # The "surface form" option will still be overridden by + # extra_options if provided # Change default SEI model based on which lithium plating option is provided # return "none" if option not given plating_option = extra_options.get("lithium plating", "none") @@ -441,9 +458,27 @@ def __init__(self, extra_options): "current collectors in a half-cell configuration" ) + if options["particle phases"] != "1": + if not ( + options["surface form"] != "false" + and options["particle size"] == "single" + and options["particle"] == "Fickian diffusion" + and options["SEI"] == "none" + and options["particle mechanics"] == "none" + and options["loss of active material"] == "none" + and options["lithium plating"] == "none" + ): + raise pybamm.OptionError( + "If there are multiple particle phases: 'surface form' cannot be " + "'false', 'particle size' must be 'false', 'particle' must be " + "'Fickian diffusion'. Also the following must " + "be 'none': 'SEI', 'particle mechanics', " + "'loss of active material', 'lithium plating'" + ) + # Check options are valid for option, value in options.items(): - if option == "external submodels" or option == "working electrode": + if option in ["external submodels", "working electrode"]: pass else: if isinstance(value, str) or option in [ @@ -460,8 +495,10 @@ def __init__(self, extra_options): "intercalation kinetics", "interface utilisation", "loss of active material", + "open circuit potential", "particle mechanics", "particle", + "particle phases", "stress-induced diffusion", ] and isinstance(value, tuple) @@ -475,7 +512,14 @@ def __init__(self, extra_options): "Values must be strings or (in some cases) " "2-tuples of strings" ) + # flatten value + value_list = [] for val in value: + if isinstance(val, tuple): + value_list.extend(val) + else: + value_list.append(val) + for val in value_list: if option == "timescale": if not (val == "default" or isinstance(val, numbers.Number)): raise pybamm.OptionError( @@ -491,6 +535,16 @@ def __init__(self, extra_options): super().__init__(options.items()) + def phase_number_to_names(self, number): + """ + Converts number of phases to a list ["primary", "secondary", ...] + """ + number = int(number) + phases = ["primary"] + if number >= 2: + phases.append("secondary") + return phases + def print_options(self): """ Print the possible options with the ones currently selected @@ -533,6 +587,29 @@ def __getitem__(self, key): # 2-tuple, first is negative domain, second is positive domain return options[self.index] + @property + def primary(self): + return BatteryModelPhaseOptions(self, 0) + + @property + def secondary(self): + return BatteryModelPhaseOptions(self, 1) + + +class BatteryModelPhaseOptions(dict): + def __init__(self, domain_options, index): + super().__init__(domain_options.items()) + self.domain_options = domain_options + self.index = index + + def __getitem__(self, key): + options = self.domain_options.__getitem__(key) + if isinstance(options, str): + return options + else: + # 2-tuple, first is primary phase, second is secondary phase + return options[self.index] + class BaseBatteryModel(pybamm.BaseModel): """ @@ -577,6 +654,10 @@ def default_var_pts(self): "x_p": 20, "r_n": 20, "r_p": 20, + "r_n_prim": 20, + "r_p_prim": 20, + "r_n_sec": 20, + "r_p_sec": 20, "y": 10, "z": 10, "R_n": 30, @@ -595,6 +676,10 @@ def default_submesh_types(self): "positive electrode": pybamm.Uniform1DSubMesh, "negative particle": pybamm.Uniform1DSubMesh, "positive particle": pybamm.Uniform1DSubMesh, + "negative primary particle": pybamm.Uniform1DSubMesh, + "positive primary particle": pybamm.Uniform1DSubMesh, + "negative secondary particle": pybamm.Uniform1DSubMesh, + "positive secondary particle": pybamm.Uniform1DSubMesh, "negative particle size": pybamm.Uniform1DSubMesh, "positive particle size": pybamm.Uniform1DSubMesh, } @@ -613,6 +698,10 @@ def default_spatial_methods(self): "macroscale": pybamm.FiniteVolume(), "negative particle": pybamm.FiniteVolume(), "positive particle": pybamm.FiniteVolume(), + "negative primary particle": pybamm.FiniteVolume(), + "positive primary particle": pybamm.FiniteVolume(), + "negative secondary particle": pybamm.FiniteVolume(), + "positive secondary particle": pybamm.FiniteVolume(), "negative particle size": pybamm.FiniteVolume(), "positive particle size": pybamm.FiniteVolume(), } @@ -712,33 +801,6 @@ def set_standard_output_variables(self): {"y": var.y, "y [m]": var.y * L_z, "z": var.z, "z [m]": var.z * L_z} ) - # Initialize "total reaction" variables - # These will get populated by the "get_coupled_variables" methods, and then used - # later by "set_rhs" or "set_algebraic", which ensures that we always have - # added all the necessary variables by the time the sum is used - self.variables.update( - { - "Sum of electrolyte reaction source terms": 0, - "Sum of positive electrode electrolyte reaction source terms": 0, - "Sum of x-averaged positive electrode " - "electrolyte reaction source terms": 0, - "Sum of interfacial current densities": 0, - "Sum of positive electrode interfacial current densities": 0, - "Sum of x-averaged positive electrode interfacial current densities": 0, - } - ) - if not self.half_cell: - self.variables.update( - { - "Sum of negative electrode electrolyte reaction source terms": 0, - "Sum of x-averaged negative electrode " - "electrolyte reaction source terms": 0, - "Sum of negative electrode interfacial current densities": 0, - "Sum of x-averaged negative electrode interfacial current densities" - "": 0, - } - ) - def build_fundamental_and_external(self): # Get the fundamental variables for submodel_name, submodel in self.submodels.items(): @@ -1058,23 +1120,38 @@ def set_interface_utilisation_submodel(self): ) def set_voltage_variables(self): - - ocp_n = self.variables["Negative electrode open circuit potential"] - ocp_p = self.variables["Positive electrode open circuit potential"] + if self.options.negative["particle phases"] == "1": + # Only one phase, no need to distinguish between + # "primary" and "secondary" + phase_n = "" + else: + # add a space so that we can use "" or (e.g.) "primary " interchangeably + # when naming variables + phase_n = "primary " + if self.options.positive["particle phases"] == "1": + phase_p = "" + else: + phase_p = "primary " + ocp_n = self.variables[f"Negative electrode {phase_n}open circuit potential"] + ocp_p = self.variables[f"Positive electrode {phase_p}open circuit potential"] ocp_n_av = self.variables[ - "X-averaged negative electrode open circuit potential" + f"X-averaged negative electrode {phase_n}open circuit potential" ] ocp_p_av = self.variables[ - "X-averaged positive electrode open circuit potential" + f"X-averaged positive electrode {phase_p}open circuit potential" ] - ocp_n_dim = self.variables["Negative electrode open circuit potential [V]"] - ocp_p_dim = self.variables["Positive electrode open circuit potential [V]"] + ocp_n_dim = self.variables[ + f"Negative electrode {phase_n}open circuit potential [V]" + ] + ocp_p_dim = self.variables[ + f"Positive electrode {phase_p}open circuit potential [V]" + ] ocp_n_av_dim = self.variables[ - "X-averaged negative electrode open circuit potential [V]" + f"X-averaged negative electrode {phase_n}open circuit potential [V]" ] ocp_p_av_dim = self.variables[ - "X-averaged positive electrode open circuit potential [V]" + f"X-averaged positive electrode {phase_p}open circuit potential [V]" ] ocp_n_left = pybamm.boundary_value(ocp_n, "left") @@ -1097,16 +1174,16 @@ def set_voltage_variables(self): ] else: eta_r_n_av = self.variables[ - "X-averaged negative electrode reaction overpotential" + f"X-averaged negative electrode {phase_n}reaction overpotential" ] eta_r_n_av_dim = self.variables[ - "X-averaged negative electrode reaction overpotential [V]" + f"X-averaged negative electrode {phase_n}reaction overpotential [V]" ] eta_r_p_av = self.variables[ - "X-averaged positive electrode reaction overpotential" + f"X-averaged positive electrode {phase_p}reaction overpotential" ] eta_r_p_av_dim = self.variables[ - "X-averaged positive electrode reaction overpotential [V]" + f"X-averaged positive electrode {phase_p}reaction overpotential [V]" ] delta_phi_s_n_av = self.variables["X-averaged negative electrode ohmic losses"] diff --git a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py index 797a01a131..4c62cb188b 100644 --- a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py +++ b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py @@ -86,21 +86,21 @@ def set_open_circuit_potential_submodel(self): self.submodels[ f"{domain.lower()} open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lead-acid main", self.options + self.param, domain, "lead-acid main", self.options, "primary" ) self.submodels[ f"{domain.lower()} oxygen open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lead-acid oxygen", self.options + self.param, domain, "lead-acid oxygen", self.options, "primary" ) def set_active_material_submodel(self): - self.submodels["negative active material"] = pybamm.active_material.Constant( - self.param, "Negative", self.options - ) - self.submodels["positive active material"] = pybamm.active_material.Constant( - self.param, "Positive", self.options - ) + for domain in ["negative", "positive"]: + self.submodels[ + f"{domain} active material" + ] = pybamm.active_material.Constant( + self.param, domain, self.options, "primary" + ) def set_sei_submodel(self): @@ -109,3 +109,8 @@ def set_sei_submodel(self): def set_lithium_plating_submodel(self): self.submodels["lithium plating"] = pybamm.lithium_plating.NoPlating(self.param) + + def set_total_kinetics_submodel(self): + self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + self.param, "lead-acid", self.options + ) diff --git a/pybamm/models/full_battery_models/lead_acid/basic_full.py b/pybamm/models/full_battery_models/lead_acid/basic_full.py index e698b8e033..fc91439448 100644 --- a/pybamm/models/full_battery_models/lead_acid/basic_full.py +++ b/pybamm/models/full_battery_models/lead_acid/basic_full.py @@ -106,18 +106,22 @@ def __init__(self, name="Basic full model"): ) # Interfacial reactions - j0_n = param.n.j0(c_e_n, T) + j0_n = param.n.prim.j0(c_e_n, T) j_n = ( 2 * j0_n - * pybamm.sinh(param.n.ne / 2 * (phi_s_n - phi_e_n - param.n.U(c_e_n, T))) + * pybamm.sinh( + param.n.prim.ne / 2 * (phi_s_n - phi_e_n - param.n.prim.U(c_e_n, T)) + ) ) - j0_p = param.p.j0(c_e_p, T) + j0_p = param.p.prim.j0(c_e_p, T) j_s = pybamm.PrimaryBroadcast(0, "separator") j_p = ( 2 * j0_p - * pybamm.sinh(param.p.ne / 2 * (phi_s_p - phi_e_p - param.p.U(c_e_p, T))) + * pybamm.sinh( + param.p.prim.ne / 2 * (phi_s_p - phi_e_p - param.p.prim.U(c_e_p, T)) + ) ) j = pybamm.concatenation(j_n, j_s, j_p) @@ -183,7 +187,7 @@ def __init__(self, name="Basic full model"): "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = -param.n.U_init + self.initial_conditions[phi_e] = -param.n.prim.U_init ###################### # Current in the solid @@ -246,9 +250,9 @@ def __init__(self, name="Basic full model"): + param.C_e * c_e * v ) s = pybamm.concatenation( - pybamm.PrimaryBroadcast(param.n.s_plus_S, "negative electrode"), + pybamm.PrimaryBroadcast(param.n.prim.s_plus_S, "negative electrode"), pybamm.PrimaryBroadcast(0, "separator"), - pybamm.PrimaryBroadcast(param.p.s_plus_S, "positive electrode"), + pybamm.PrimaryBroadcast(param.p.prim.s_plus_S, "positive electrode"), ) self.rhs[c_e] = (1 / eps) * ( -pybamm.div(N_e) / param.C_e @@ -279,7 +283,7 @@ def __init__(self, name="Basic full model"): "Electrolyte concentration": c_e, "Current [A]": I, "Negative electrode potential [V]": pot * phi_s_n, - "Electrolyte potential [V]": -param.n.U_ref + pot * phi_e, + "Electrolyte potential [V]": -param.n.prim.U_ref + pot * phi_e, "Positive electrode potential [V]": param.ocv_ref + pot * phi_s_p, "Terminal voltage [V]": param.ocv_ref + pot * voltage, "Porosity": eps, diff --git a/pybamm/models/full_battery_models/lead_acid/full.py b/pybamm/models/full_battery_models/lead_acid/full.py index 2d9e349a52..d4b992a7ae 100644 --- a/pybamm/models/full_battery_models/lead_acid/full.py +++ b/pybamm/models/full_battery_models/lead_acid/full.py @@ -49,6 +49,7 @@ def __init__(self, options=None, name="Full model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -85,7 +86,7 @@ def set_intercalation_kinetics_submodel(self): for domain in ["Negative", "Positive"]: intercalation_kinetics = self.get_intercalation_kinetics(domain) self.submodels[domain.lower() + " interface"] = intercalation_kinetics( - self.param, domain, "lead-acid main", self.options + self.param, domain, "lead-acid main", self.options, "primary" ) def set_solid_submodel(self): @@ -140,8 +141,8 @@ def set_side_reaction_submodels(self): self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.NoReaction( - self.param, "Positive", "lead-acid oxygen" + self.param, "Positive", "lead-acid oxygen", "primary" ) self.submodels["negative oxygen interface"] = pybamm.kinetics.NoReaction( - self.param, "Negative", "lead-acid oxygen" + self.param, "Negative", "lead-acid oxygen", "primary" ) diff --git a/pybamm/models/full_battery_models/lead_acid/higher_order.py b/pybamm/models/full_battery_models/lead_acid/higher_order.py index 8d42c60f4b..67c7dc6ae4 100644 --- a/pybamm/models/full_battery_models/lead_acid/higher_order.py +++ b/pybamm/models/full_battery_models/lead_acid/higher_order.py @@ -57,6 +57,7 @@ def __init__(self, options=None, name="Composite model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -157,14 +158,14 @@ def set_full_interface_submodel(self): self.param, "Negative", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ), ) self.submodels["positive interface"] = pybamm.kinetics.FirstOrderKinetics( self.param, "Positive", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ), ) @@ -176,7 +177,7 @@ def set_full_interface_submodel(self): self.param, "Positive", pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ), ) self.submodels[ diff --git a/pybamm/models/full_battery_models/lead_acid/loqs.py b/pybamm/models/full_battery_models/lead_acid/loqs.py index 8c83a2c734..0212ce9722 100644 --- a/pybamm/models/full_battery_models/lead_acid/loqs.py +++ b/pybamm/models/full_battery_models/lead_acid/loqs.py @@ -48,6 +48,7 @@ def __init__(self, options=None, name="LOQS model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -164,25 +165,25 @@ def set_intercalation_kinetics_submodel(self): self.submodels[ "leading-order negative interface" ] = pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ) self.submodels[ "leading-order positive interface" ] = pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ) # always use forward Butler-Volmer for the reaction submodel to be passed to the # higher order model self.reaction_submodels = { "Negative": [ pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ) ], "Positive": [ pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ) ], } @@ -240,10 +241,14 @@ def set_side_reaction_submodels(self): ] = pybamm.oxygen_diffusion.NoOxygen(self.param) self.submodels[ "leading-order negative oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, "Negative", "lead-acid oxygen") + ] = pybamm.kinetics.NoReaction( + self.param, "Negative", "lead-acid oxygen", "primary" + ) self.submodels[ "leading-order positive oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, "Positive", "lead-acid oxygen") + ] = pybamm.kinetics.NoReaction( + self.param, "Positive", "lead-acid oxygen", "primary" + ) self.reaction_submodels["Negative"].append( self.submodels["leading-order negative oxygen interface"] ) diff --git a/pybamm/models/full_battery_models/lithium_ion/__init__.py b/pybamm/models/full_battery_models/lithium_ion/__init__.py index 6d919b186e..3b0a6719da 100644 --- a/pybamm/models/full_battery_models/lithium_ion/__init__.py +++ b/pybamm/models/full_battery_models/lithium_ion/__init__.py @@ -11,5 +11,6 @@ from .basic_dfn import BasicDFN from .basic_spm import BasicSPM from .basic_dfn_half_cell import BasicDFNHalfCell +from .basic_dfn_composite import BasicDFNComposite from .Yang2017 import Yang2017 from .mpm import MPM diff --git a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py index 7799efdd42..d2dfe062c1 100644 --- a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py +++ b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py @@ -28,8 +28,9 @@ def __init__(self, options=None, name="Unnamed lithium-ion model", build=False): "negative electrode": self.param.L_x, "separator": self.param.L_x, "positive electrode": self.param.L_x, - "positive particle": self.param.p.R_typ, - "positive particle size": self.param.p.R_typ, + "positive particle": self.param.p.prim.R_typ, + "positive primary particle": self.param.p.prim.R_typ, + "positive particle size": self.param.p.prim.R_typ, "current collector y": self.param.L_z, "current collector z": self.param.L_z, } @@ -38,11 +39,19 @@ def __init__(self, options=None, name="Unnamed lithium-ion model", build=False): if not self.half_cell: self.length_scales.update( { - "negative particle": self.param.n.R_typ, - "negative particle size": self.param.n.R_typ, + "negative particle": self.param.n.prim.R_typ, + "negative primary particle": self.param.n.prim.R_typ, + "negative particle size": self.param.n.prim.R_typ, } ) - self.set_standard_output_variables() + + # Add relevant secondary length scales + phases_p = int(getattr(self.options, "positive")["particle phases"]) + if phases_p >= 2: + self._length_scales["positive secondary particle"] = self.param.p.sec.R_typ + phases_n = int(getattr(self.options, "negative")["particle phases"]) + if not self.half_cell and phases_n >= 2: + self._length_scales["negative secondary particle"] = self.param.n.sec.R_typ def set_submodels(self, build): self.set_external_circuit_submodel() @@ -64,12 +73,35 @@ def set_submodels(self, build): self.set_sei_submodel() self.set_lithium_plating_submodel() - if self.half_cell: - # This also removes "negative electrode" submodels, so should be done last - self.set_li_metal_counter_electrode_submodels() + self.set_standard_output_variables() - if build: - self.build_model() + if not isinstance(self, (pybamm.lithium_ion.BasicDFNComposite)): + self.set_external_circuit_submodel() + self.set_porosity_submodel() + self.set_interface_utilisation_submodel() + self.set_crack_submodel() + self.set_active_material_submodel() + self.set_transport_efficiency_submodels() + self.set_convection_submodel() + self.set_open_circuit_potential_submodel() + self.set_intercalation_kinetics_submodel() + self.set_other_reaction_submodels_to_zero() + self.set_particle_submodel() + self.set_solid_submodel() + self.set_electrolyte_submodel() + self.set_thermal_submodel() + self.set_current_collector_submodel() + + self.set_sei_submodel() + self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() + + if self.half_cell: + # This also removes "negative electrode" submodels, so should be done last + self.set_li_metal_counter_electrode_submodels() + + if build: + self.build_model() @property def default_parameter_values(self): @@ -106,16 +138,33 @@ def set_standard_output_variables(self): # Particle concentration position var = pybamm.standard_spatial_vars - self.variables.update({"r_p": var.r_p, "r_p [m]": var.r_p * self.param.p.R_typ}) + self.variables.update( + {"r_p": var.r_p, "r_p [m]": var.r_p * self.param.p.prim.R_typ} + ) if not self.half_cell: self.variables.update( - {"r_n": var.r_n, "r_n [m]": var.r_n * self.param.n.R_typ} + {"r_n": var.r_n, "r_n [m]": var.r_n * self.param.n.prim.R_typ} ) def set_degradation_variables(self): """Sets variables that quantify degradation (LAM, LLI, etc)""" param = self.param + if self.half_cell: + domains = ["positive"] + else: + domains = ["negative", "positive"] + for domain in domains: + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + self.variables[f"Total lithium in {domain} electrode [mol]"] = sum( + self.variables[ + f"Total lithium in {phase} phase in {domain} electrode [mol]" + ] + for phase in phases + ) + # LAM if self.half_cell: n_Li_n = pybamm.Scalar(0) @@ -217,12 +266,22 @@ def set_summary_variables(self): self.summary_variables = summary_variables def set_open_circuit_potential_submodel(self): - for domain in ["Negative", "Positive"]: - self.submodels[ - f"{domain.lower()} open circuit potential" - ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lithium-ion main", self.options + for domain in ["negative", "positive"]: + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] ) + domain_options = getattr(self.options, domain) + for phase in phases: + ocp_option = getattr(domain_options, phase)["open circuit potential"] + if ocp_option == "single": + ocp_model = pybamm.open_circuit_potential.SingleOpenCircuitPotential + elif ocp_option == "current sigmoid": + ocp_model = ( + pybamm.open_circuit_potential.CurrentSigmoidOpenCircuitPotential + ) + self.submodels[f"{domain} {phase} open circuit potential"] = ocp_model( + self.param, domain, "lithium-ion main", self.options, phase + ) def set_sei_submodel(self): if self.half_cell: @@ -251,15 +310,22 @@ def set_lithium_plating_submodel(self): self.param, self.x_average, self.options ) + def set_total_kinetics_submodel(self): + self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + self.param, "lithium-ion", self.options + ) + def set_other_reaction_submodels_to_zero(self): for domain in ["Negative", "Positive"]: self.submodels[ f"{domain.lower()} oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, domain, "lithium-ion oxygen") + ] = pybamm.kinetics.NoReaction( + self.param, domain, "lithium-ion oxygen", "primary" + ) self.submodels[ f"{domain.lower()} oxygen open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lithium-ion oxygen", self.options + self.param, domain, "lithium-ion oxygen", self.options, "primary" ) def set_crack_submodel(self): @@ -279,18 +345,27 @@ def set_crack_submodel(self): ) def set_active_material_submodel(self): - for domain in ["Negative", "Positive"]: - lam = getattr(self.options, domain.lower())["loss of active material"] - if lam == "none": - self.submodels[ - domain.lower() + " active material" - ] = pybamm.active_material.Constant(self.param, domain, self.options) - else: + for domain in ["negative", "positive"]: + lam = getattr(self.options, domain)["loss of active material"] + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + for phase in phases: + if lam == "none": + submod = pybamm.active_material.Constant( + self.param, domain, self.options, phase + ) + else: + submod = pybamm.active_material.LossActiveMaterial( + self.param, domain, self.options, self.x_average + ) + self.submodels[f"{domain} {phase} active material"] = submod + + # Submodel for the total active material, summing up each phase + if len(phases) > 1: self.submodels[ - domain.lower() + " active material" - ] = pybamm.active_material.LossActiveMaterial( - self.param, domain, self.options, self.x_average - ) + f"{domain} total active material" + ] = pybamm.active_material.Total(self.param, domain, self.options) def set_porosity_submodel(self): if ( @@ -340,7 +415,7 @@ def set_li_metal_counter_electrode_submodels(self): ] = pybamm.electrode.ohm.LithiumMetalSurfaceForm(self.param, self.options) neg_intercalation_kinetics = self.get_intercalation_kinetics("Negative") self.submodels["counter electrode interface"] = neg_intercalation_kinetics( - self.param, "Negative", "lithium metal plating", self.options + self.param, "Negative", "lithium metal plating", self.options, "primary" ) # For half-cell models, remove negative electrode submodels diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py index 5c6210bbb2..02a7d56421 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py @@ -123,22 +123,34 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # right side. This is also accessible via `boundary_value(x, "right")`, with # "left" providing the boundary value of the left side c_s_surf_n = pybamm.surf(c_s_n) - j0_n = param.n.gamma * param.n.j0(c_e_n, c_s_surf_n, T) / param.n.C_r + j0_n = ( + param.n.prim.gamma + * param.n.prim.j0(c_e_n, c_s_surf_n, T) + / param.n.prim.C_r + ) j_n = ( 2 * j0_n * pybamm.sinh( - param.n.ne / 2 * (phi_s_n - phi_e_n - param.n.U(c_s_surf_n, T)) + param.n.prim.ne + / 2 + * (phi_s_n - phi_e_n - param.n.prim.U(c_s_surf_n, T)) ) ) c_s_surf_p = pybamm.surf(c_s_p) - j0_p = param.p.gamma * param.p.j0(c_e_p, c_s_surf_p, T) / param.p.C_r + j0_p = ( + param.p.prim.gamma + * param.p.prim.j0(c_e_p, c_s_surf_p, T) + / param.p.prim.C_r + ) j_s = pybamm.PrimaryBroadcast(0, "separator") j_p = ( 2 * j0_p * pybamm.sinh( - param.p.ne / 2 * (phi_s_p - phi_e_p - param.p.U(c_s_surf_p, T)) + param.p.prim.ne + / 2 + * (phi_s_p - phi_e_p - param.p.prim.U(c_s_surf_p, T)) ) ) j = pybamm.concatenation(j_n, j_s, j_p) @@ -159,35 +171,35 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # The div and grad operators will be converted to the appropriate matrix # multiplication at the discretisation stage - N_s_n = -param.n.D(c_s_n, T) * pybamm.grad(c_s_n) - N_s_p = -param.p.D(c_s_p, T) * pybamm.grad(c_s_p) - self.rhs[c_s_n] = -(1 / param.n.C_diff) * pybamm.div(N_s_n) - self.rhs[c_s_p] = -(1 / param.p.C_diff) * pybamm.div(N_s_p) + N_s_n = -param.n.prim.D(c_s_n, T) * pybamm.grad(c_s_n) + N_s_p = -param.p.prim.D(c_s_p, T) * pybamm.grad(c_s_p) + self.rhs[c_s_n] = -(1 / param.n.prim.C_diff) * pybamm.div(N_s_n) + self.rhs[c_s_p] = -(1 / param.p.prim.C_diff) * pybamm.div(N_s_p) # Boundary conditions must be provided for equations with spatial derivatives self.boundary_conditions[c_s_n] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.n.C_diff + -param.n.prim.C_diff * j_n - / param.n.a_R - / param.n.gamma - / param.n.D(c_s_surf_n, T), + / param.n.prim.a_R + / param.n.prim.gamma + / param.n.prim.D(c_s_surf_n, T), "Neumann", ), } self.boundary_conditions[c_s_p] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.p.C_diff + -param.p.prim.C_diff * j_p - / param.p.a_R - / param.p.gamma - / param.p.D(c_s_surf_p, T), + / param.p.prim.a_R + / param.p.prim.gamma + / param.p.prim.D(c_s_surf_p, T), "Neumann", ), } - self.initial_conditions[c_s_n] = param.n.c_init - self.initial_conditions[c_s_p] = param.p.c_init + self.initial_conditions[c_s_n] = param.n.prim.c_init + self.initial_conditions[c_s_p] = param.p.prim.c_init # Events specify points at which a solution should terminate self.events += [ pybamm.Event( @@ -245,7 +257,7 @@ def __init__(self, name="Doyle-Fuller-Newman model"): "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = -param.n.U_init + self.initial_conditions[phi_e] = -param.n.prim.U_init ###################### # Electrolyte concentration @@ -270,6 +282,9 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # (Some) variables ###################### voltage = pybamm.boundary_value(phi_s_p, "right") + pot_scale = param.potential_scale + U_ref = param.ocv_ref + voltage_dim = U_ref + voltage * pot_scale # The `variables` dictionary contains all variables that might be useful for # visualising the solution of the model self.variables = { @@ -281,6 +296,8 @@ def __init__(self, name="Doyle-Fuller-Newman model"): "Electrolyte potential": phi_e, "Positive electrode potential": phi_s_p, "Terminal voltage": voltage, + "Terminal voltage [V]": voltage_dim, + "Time [s]": pybamm.t * self.param.timescale, } self.events += [ pybamm.Event("Minimum voltage", voltage - param.voltage_low_cut), diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py index 95ad8abf4a..94b27d6d70 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py @@ -51,7 +51,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # `ParameterValues` class when the model is processed. param = self.param - R_w_typ = param.p.R_typ + R_w_typ = param.p.prim.R_typ # Set default length scales self._length_scales = { @@ -124,16 +124,16 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): b_e_w = param.p.b_e # Interfacial reactions - j0_w = param.p.j0(c_e_w, c_s_surf_w, T) / param.p.C_r - U_w = param.p.U - ne_w = param.p.ne + j0_w = param.p.prim.j0(c_e_w, c_s_surf_w, T) / param.p.prim.C_r + U_w = param.p.prim.U + ne_w = param.p.prim.ne # Particle diffusion parameters - D_w = param.p.D - C_w = param.p.cap_init - a_R_w = param.p.a_R - gamma_e = param.c_e_typ / param.p.c_max - c_w_init = param.p.c_init + D_w = param.p.prim.D + C_w = param.p.prim.cap_init + a_R_w = param.p.prim.a_R + gamma_e = param.c_e_typ / param.p.prim.c_max + c_w_init = param.p.prim.c_init # Electrode equation parameters eps_s_w = pybamm.Parameter("Positive electrode active material volume fraction") @@ -141,9 +141,9 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): sigma_w = param.p.sigma # Other parameters (for outputs) - c_w_max = param.p.c_max - U_w_ref = param.p.U_ref - U_Li_ref = param.n.U_ref + c_w_max = param.p.prim.c_max + U_w_ref = param.p.prim.U_ref + U_Li_ref = param.n.prim.U_ref L_w = param.p.L # gamma_w is always 1 because we choose the timescale based on the working @@ -216,7 +216,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # Initial conditions must also be provided for algebraic equations, as an # initial guess for a root-finding algorithm which calculates consistent # initial conditions - self.initial_conditions[phi_s_w] = param.p.U_init + self.initial_conditions[phi_s_w] = param.p.prim.U_init ###################### # Electrolyte concentration @@ -269,7 +269,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = param.n.U_ref / pot_scale + self.initial_conditions[phi_e] = param.n.prim.U_ref / pot_scale ###################### # (Some) variables diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_spm.py b/pybamm/models/full_battery_models/lithium_ion/basic_spm.py index 727c7e2da2..a157b351a2 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_spm.py @@ -76,10 +76,10 @@ def __init__(self, name="Single Particle Model"): # The div and grad operators will be converted to the appropriate matrix # multiplication at the discretisation stage - N_s_n = -param.n.D(c_s_n, T) * pybamm.grad(c_s_n) - N_s_p = -param.p.D(c_s_p, T) * pybamm.grad(c_s_p) - self.rhs[c_s_n] = -(1 / param.n.C_diff) * pybamm.div(N_s_n) - self.rhs[c_s_p] = -(1 / param.p.C_diff) * pybamm.div(N_s_p) + N_s_n = -param.n.prim.D(c_s_n, T) * pybamm.grad(c_s_n) + N_s_p = -param.p.prim.D(c_s_p, T) * pybamm.grad(c_s_p) + self.rhs[c_s_n] = -(1 / param.n.prim.C_diff) * pybamm.div(N_s_n) + self.rhs[c_s_p] = -(1 / param.p.prim.C_diff) * pybamm.div(N_s_p) # Surf takes the surface value of a variable, i.e. its boundary value on the # right side. This is also accessible via `boundary_value(x, "right")`, with # "left" providing the boundary value of the left side @@ -89,29 +89,29 @@ def __init__(self, name="Single Particle Model"): self.boundary_conditions[c_s_n] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.n.C_diff + -param.n.prim.C_diff * j_n - / param.n.a_R - / param.n.gamma - / param.n.D(c_s_surf_n, T), + / param.n.prim.a_R + / param.n.prim.gamma + / param.n.prim.D(c_s_surf_n, T), "Neumann", ), } self.boundary_conditions[c_s_p] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.p.C_diff + -param.p.prim.C_diff * j_p - / param.p.a_R - / param.p.gamma - / param.p.D(c_s_surf_p, T), + / param.p.prim.a_R + / param.p.prim.gamma + / param.p.prim.D(c_s_surf_p, T), "Neumann", ), } # c_n_init and c_p_init are functions of r and x, but for the SPM we # take the x-averaged value since there is no x-dependence in the particles - self.initial_conditions[c_s_n] = pybamm.x_average(param.n.c_init) - self.initial_conditions[c_s_p] = pybamm.x_average(param.p.c_init) + self.initial_conditions[c_s_n] = pybamm.x_average(param.n.prim.c_init) + self.initial_conditions[c_s_p] = pybamm.x_average(param.p.prim.c_init) # Events specify points at which a solution should terminate self.events += [ pybamm.Event( @@ -139,13 +139,13 @@ def __init__(self, name="Single Particle Model"): # (Some) variables ###################### # Interfacial reactions - j0_n = param.n.gamma * param.n.j0(1, c_s_surf_n, T) / param.n.C_r - j0_p = param.p.gamma * param.p.j0(1, c_s_surf_p, T) / param.p.C_r - eta_n = (2 / param.n.ne) * pybamm.arcsinh(j_n / (2 * j0_n)) - eta_p = (2 / param.p.ne) * pybamm.arcsinh(j_p / (2 * j0_p)) + j0_n = param.n.prim.gamma * param.n.prim.j0(1, c_s_surf_n, T) / param.n.prim.C_r + j0_p = param.p.prim.gamma * param.p.prim.j0(1, c_s_surf_p, T) / param.p.prim.C_r + eta_n = (2 / param.n.prim.ne) * pybamm.arcsinh(j_n / (2 * j0_n)) + eta_p = (2 / param.p.prim.ne) * pybamm.arcsinh(j_p / (2 * j0_p)) phi_s_n = 0 - phi_e = -eta_n - param.n.U(c_s_surf_n, T) - phi_s_p = eta_p + phi_e + param.p.U(c_s_surf_p, T) + phi_e = -eta_n - param.n.prim.U(c_s_surf_n, T) + phi_s_p = eta_p + phi_e + param.p.prim.U(c_s_surf_p, T) V = phi_s_p pot_scale = self.param.potential_scale diff --git a/pybamm/models/full_battery_models/lithium_ion/dfn.py b/pybamm/models/full_battery_models/lithium_ion/dfn.py index 6e60f19c0c..87ecb73d5f 100644 --- a/pybamm/models/full_battery_models/lithium_ion/dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/dfn.py @@ -57,47 +57,54 @@ def set_convection_submodel(self): def set_intercalation_kinetics_submodel(self): for domain in ["Negative", "Positive"]: intercalation_kinetics = self.get_intercalation_kinetics(domain) - self.submodels[domain.lower() + " interface"] = intercalation_kinetics( - self.param, domain, "lithium-ion main", self.options + phases = self.options.phase_number_to_names( + getattr(self.options, domain.lower())["particle phases"] ) - - def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if self.options["particle size"] == "single": - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.FickianDiffusion( - self.param, - domain, - self.options, - ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.PolynomialProfile( - self.param, domain, particle, self.options - ) - elif self.options["particle size"] == "distribution": - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.size_distribution.FickianDiffusion( - self.param, domain + for phase in ["primary", "secondary"]: + # Add kinetics for each phase included in the options + # If a phase is not included, add "NoReaction" + if phase in phases: + submod = intercalation_kinetics( + self.param, domain, "lithium-ion main", self.options, phase ) - elif particle == "uniform profile": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.size_distribution.UniformProfile( - self.param, - domain, + else: + submod = pybamm.kinetics.NoReaction( + self.param, domain, "lithium-ion main", phase ) + self.submodels[f"{domain.lower()} {phase} interface"] = submod + + def set_particle_submodel(self): + for domain in ["negative", "positive"]: + particle = getattr(self.options, domain)["particle"] + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + for phase in phases: + if self.options["particle size"] == "single": + if particle == "Fickian diffusion": + submod = pybamm.particle.no_distribution.FickianDiffusion( + self.param, domain, self.options, phase + ) + elif particle in [ + "uniform profile", + "quadratic profile", + "quartic profile", + ]: + submod = pybamm.particle.no_distribution.PolynomialProfile( + self.param, domain, particle, self.options, phase + ) + elif self.options["particle size"] == "distribution": + if particle == "Fickian diffusion": + submod = pybamm.particle.size_distribution.FickianDiffusion( + self.param, domain + ) + elif particle == "uniform profile": + submod = pybamm.particle.size_distribution.UniformProfile( + self.param, domain + ) + self.submodels[f"{domain} {phase} particle"] = submod + def set_solid_submodel(self): if self.options["surface form"] == "false": diff --git a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py index ce0c2e299a..ee17368b3b 100644 --- a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py +++ b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py @@ -35,8 +35,8 @@ def __init__(self, name="Electrode-specific SOH model"): super().__init__(name) param = pybamm.LithiumIonParameters() - Un = param.n.U_dimensional - Up = param.p.U_dimensional + Un = param.n.prim.U_dimensional + Up = param.p.prim.U_dimensional T_ref = param.T_ref x_100 = pybamm.Variable("x_100", bounds=(0, 1)) diff --git a/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py index 28612047c0..ff71e1ac83 100644 --- a/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py @@ -42,7 +42,7 @@ def __init__(self, working_electrode, name="Electrode-specific SOH model"): if working_electrode == "negative": # pragma: no cover raise NotImplementedError elif working_electrode == "positive": - Uw = param.p.U_dimensional + Uw = param.p.prim.U_dimensional x_0 = x_100 + C / Cw V_max = pybamm.InputParameter("V_max") diff --git a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py index ba3be1c9be..03e84e24fb 100644 --- a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py +++ b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py @@ -55,26 +55,6 @@ def __init__(self, options=None, name="Newman-Tobias model", build=True): pybamm.citations.register("Newman1962") pybamm.citations.register("Chu2020") - def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedFickianDiffusion( - self.param, domain, self.options - ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - self.param, domain, particle, self.options - ) - def set_electrolyte_submodel(self): surf_form = pybamm.electrolyte_conductivity.surface_potential_form diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index 9fb32a2cee..3d945c275a 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -65,49 +65,57 @@ def set_convection_submodel(self): def set_intercalation_kinetics_submodel(self): - if self.options["surface form"] == "false": - self.submodels["negative interface"] = self.inverse_intercalation_kinetics( - self.param, "Negative", "lithium-ion main", self.options - ) - self.submodels["positive interface"] = self.inverse_intercalation_kinetics( - self.param, "Positive", "lithium-ion main", self.options - ) - self.submodels[ - "negative interface current" - ] = pybamm.kinetics.CurrentForInverseButlerVolmer( - self.param, "Negative", "lithium-ion main", self.options - ) - self.submodels[ - "positive interface current" - ] = pybamm.kinetics.CurrentForInverseButlerVolmer( - self.param, "Positive", "lithium-ion main", self.options - ) - else: - for domain in ["Negative", "Positive"]: - intercalation_kinetics = self.get_intercalation_kinetics(domain) - self.submodels[domain.lower() + " interface"] = intercalation_kinetics( + for domain in ["negative", "positive"]: + if self.options["surface form"] == "false": + self.submodels[ + f"{domain} interface" + ] = self.inverse_intercalation_kinetics( self.param, domain, "lithium-ion main", self.options ) - - def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if particle == "Fickian diffusion": self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedFickianDiffusion( - self.param, domain, self.options + f"{domain} interface current" + ] = pybamm.kinetics.CurrentForInverseButlerVolmer( + self.param, domain, "lithium-ion main", self.options ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - self.param, domain, particle, self.options + else: + intercalation_kinetics = self.get_intercalation_kinetics(domain) + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] ) + for phase in ["primary", "secondary"]: + # Add kinetics for each phase included in the options + # If a phase is not included, add "NoReaction" + if phase in phases: + submod = intercalation_kinetics( + self.param, domain, "lithium-ion main", self.options, phase + ) + else: + submod = pybamm.kinetics.NoReaction( + self.param, domain, "lithium-ion main", phase + ) + + self.submodels[f"{domain} {phase} interface"] = submod + + def set_particle_submodel(self): + for domain in ["negative", "positive"]: + particle = getattr(self.options, domain)["particle"] + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + for phase in phases: + if particle == "Fickian diffusion": + submod = pybamm.particle.no_distribution.XAveragedFickianDiffusion( + self.param, domain, self.options, phase + ) + elif particle in [ + "uniform profile", + "quadratic profile", + "quartic profile", + ]: + submod = pybamm.particle.no_distribution.XAveragedPolynomialProfile( + self.param, domain, particle, self.options, phase + ) + self.submodels[f"{domain} {phase} particle"] = submod def set_solid_submodel(self): diff --git a/pybamm/models/submodels/active_material/__init__.py b/pybamm/models/submodels/active_material/__init__.py index 1fd47a39d5..cb263eb4ff 100644 --- a/pybamm/models/submodels/active_material/__init__.py +++ b/pybamm/models/submodels/active_material/__init__.py @@ -1,3 +1,4 @@ from .base_active_material import BaseModel from .constant_active_material import Constant from .loss_active_material import LossActiveMaterial +from .total_active_material import Total diff --git a/pybamm/models/submodels/active_material/base_active_material.py b/pybamm/models/submodels/active_material/base_active_material.py index cdb0b3880f..d4e002fd4c 100644 --- a/pybamm/models/submodels/active_material/base_active_material.py +++ b/pybamm/models/submodels/active_material/base_active_material.py @@ -15,45 +15,47 @@ class BaseModel(pybamm.BaseSubModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, options, phase="primary"): + super().__init__(param, domain, options=options, phase=phase) def _get_standard_active_material_variables(self, eps_solid): param = self.param + phase_name = self.phase_name + Domain = self.domain + domain = Domain.lower() + if eps_solid.domain == []: eps_solid = pybamm.PrimaryBroadcast(eps_solid, "current collector") if eps_solid.domain == ["current collector"]: - eps_solid = pybamm.PrimaryBroadcast( - eps_solid, self.domain.lower() + " electrode" - ) + eps_solid = pybamm.PrimaryBroadcast(eps_solid, domain + " electrode") eps_solid_av = pybamm.x_average(eps_solid) variables = { - self.domain + " electrode active material volume fraction": eps_solid, - "X-averaged " - + self.domain.lower() - + " electrode active material volume fraction": eps_solid_av, + f"{Domain} electrode {phase_name}active material volume fraction": eps_solid, + f"X-averaged {domain} electrode {phase_name}active material volume fraction" + "": eps_solid_av, } # Update other microstructure variables # some models (e.g. lead-acid) do not have particles if self.options["particle shape"] == "no particles": - a = self.domain_param.a - a_typ = self.domain_param.a_typ + a = self.phase_param.a + a_typ = self.phase_param.a_typ variables.update( { - self.domain + " electrode surface area to volume ratio": a, - self.domain - + " electrode surface area to volume ratio [m-1]": a * a_typ, + f"{Domain} electrode surface area to volume ratio": a, + f"{Domain} electrode surface area to volume ratio [m-1]": a * a_typ, "X-averaged " - + self.domain.lower() + + domain + " electrode surface area to volume ratio": pybamm.x_average(a), "X-averaged " - + self.domain.lower() + + domain + " electrode surface area" + " to volume ratio [m-1]": pybamm.x_average(a) * a_typ, } @@ -63,7 +65,7 @@ def _get_standard_active_material_variables(self, eps_solid): else: # Update electrode capacity variables L = self.domain_param.L - c_s_max = self.domain_param.c_max + c_s_max = self.phase_param.c_max C = ( pybamm.yz_average(eps_solid_av) @@ -73,23 +75,28 @@ def _get_standard_active_material_variables(self, eps_solid): * param.F / 3600 ) - variables.update({self.domain + " electrode capacity [A.h]": C}) + if phase_name == "": + variables.update({f"{Domain} electrode capacity [A.h]": C}) + else: + variables.update( + {f"{Domain} electrode {phase_name}phase capacity [A.h]": C} + ) # If a single particle size at every x, use the parameters # R_n, R_p. For a size distribution, calculate the area-weighted # mean using the distribution instead. Then the surface area is # calculated the same way if self.options["particle size"] == "single": - R = self.domain_param.R - R_dim = self.domain_param.R_dimensional + R = self.phase_param.R + R_dim = self.phase_param.R_dimensional elif self.options["particle size"] == "distribution": if self.domain == "Negative": R_ = pybamm.standard_spatial_vars.R_n elif self.domain == "Positive": R_ = pybamm.standard_spatial_vars.R_p R = pybamm.size_average(R_) - R_dim = R * self.domain_param.R_typ - a_typ = self.domain_param.a_typ + R_dim = R * self.phase_param.R_typ + a_typ = self.phase_param.a_typ R_dim_av = pybamm.x_average(R_dim) @@ -104,24 +111,22 @@ def _get_standard_active_material_variables(self, eps_solid): a_av = a_dim_av / a_typ variables.update( { - self.domain + " particle radius": R, - self.domain + " particle radius [m]": R_dim, - self.domain + " electrode surface area to volume ratio": a, - self.domain - + " electrode surface area to volume ratio [m-1]": a_dim, - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio": a_av, - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio [m-1]": a_dim_av, + f"{Domain} {phase_name}particle radius": R, + f"{Domain} {phase_name}particle radius [m]": R_dim, + f"{Domain} electrode {phase_name}" + "surface area to volume ratio": a, + f"{Domain} electrode {phase_name}" + "surface area to volume ratio [m-1]": a_dim, + f"X-averaged {domain} electrode {phase_name}" + "surface area to volume ratio": a_av, + f"X-averaged {domain} electrode {phase_name}" + "surface area to volume ratio [m-1]": a_dim_av, } ) return variables def _get_standard_active_material_change_variables(self, deps_solid_dt): - if deps_solid_dt.domain == ["current collector"]: deps_solid_dt_av = deps_solid_dt deps_solid_dt = pybamm.PrimaryBroadcast( @@ -131,11 +136,10 @@ def _get_standard_active_material_change_variables(self, deps_solid_dt): deps_solid_dt_av = pybamm.x_average(deps_solid_dt) variables = { - self.domain - + " electrode active material volume fraction change": deps_solid_dt, - "X-averaged " - + self.domain.lower() - + " electrode active material volume fraction change": deps_solid_dt_av, + f"{self.domain} electrode {self.phase_name}" + "active material volume fraction change": deps_solid_dt, + f"X-averaged {self.domain.lower()} electrode {self.phase_name}" + "active material volume fraction change": deps_solid_dt_av, } return variables diff --git a/pybamm/models/submodels/active_material/constant_active_material.py b/pybamm/models/submodels/active_material/constant_active_material.py index 9adcf4aa7d..cc5021999e 100644 --- a/pybamm/models/submodels/active_material/constant_active_material.py +++ b/pybamm/models/submodels/active_material/constant_active_material.py @@ -17,12 +17,14 @@ class Constant(BaseModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model + phase : str + Phase of the particle **Extends:** :class:`pybamm.active_material.BaseModel` """ def get_fundamental_variables(self): - eps_solid = self.domain_param.epsilon_s + eps_solid = self.phase_param.epsilon_s deps_solid_dt = pybamm.FullBroadcast( 0, f"{self.domain.lower()} electrode", "current collector" ) diff --git a/pybamm/models/submodels/active_material/loss_active_material.py b/pybamm/models/submodels/active_material/loss_active_material.py index 6999b53c65..df95a5688a 100644 --- a/pybamm/models/submodels/active_material/loss_active_material.py +++ b/pybamm/models/submodels/active_material/loss_active_material.py @@ -145,7 +145,7 @@ def set_rhs(self, variables): def set_initial_conditions(self, variables): - eps_solid_init = self.domain_param.epsilon_s + eps_solid_init = self.domain_param.prim.epsilon_s if self.x_average is True: eps_solid_xav = variables[ diff --git a/pybamm/models/submodels/active_material/total_active_material.py b/pybamm/models/submodels/active_material/total_active_material.py new file mode 100644 index 0000000000..3ebab6cea8 --- /dev/null +++ b/pybamm/models/submodels/active_material/total_active_material.py @@ -0,0 +1,81 @@ +# +# Class for total active material volume fraction, for models with multiple phases +# +import pybamm + + +class Total(pybamm.BaseSubModel): + """Class for total active material volume fraction, for models with multiple phases + + Parameters + ---------- + param : parameter class + The parameters to use for this submodel + domain : str + The domain of the model either 'Negative' or 'Positive' + options : dict + Additional options to pass to the model + + **Extends:** :class:`pybamm.BaseSubModel` + """ + + def __init__(self, param, domain, options): + super().__init__(param, domain, options=options) + + def get_coupled_variables(self, variables): + # Creates "total" active material volume fraction and capacity variables + # by summing up all the phases + Domain = self.domain + domain = Domain.lower() + + phases = phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + eps_solid = sum( + variables[f"{Domain} electrode {phase} active material volume fraction"] + for phase in phases + ) + eps_solid_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} active material volume fraction" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode active material volume fraction": eps_solid, + f"X-averaged {domain} electrode active material volume fraction" + "": eps_solid_av, + } + ) + + if self.options["particle shape"] != "no particles": + C = sum( + variables[f"{Domain} electrode {phase} phase capacity [A.h]"] + for phase in phases + ) + variables.update({f"{Domain} electrode capacity [A.h]": C}) + + deps_solid_dt = sum( + variables[ + f"{Domain} electrode {phase} active material volume fraction change" + ] + for phase in phases + ) + deps_solid_dt_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} active material " + "volume fraction change" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode active material volume fraction change" + "": deps_solid_dt, + f"X-averaged {domain} electrode active material volume fraction change" + "": deps_solid_dt_av, + } + ) + + return variables diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index ae0dcae63c..30338d0b15 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -26,6 +26,8 @@ class BaseSubModel(pybamm.BaseModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle Attributes ---------- @@ -57,17 +59,17 @@ class BaseSubModel(pybamm.BaseModel): """ def __init__( - self, param, domain=None, name="Unnamed submodel", external=False, options=None + self, + param, + domain=None, + name="Unnamed submodel", + external=False, + options=None, + phase=None, ): super().__init__(name) - self.param = param - if param is None: - self.domain_param = None - else: - if domain == "Negative": - self.domain_param = param.n - elif domain == "Positive": - self.domain_param = param.p + if domain is not None: + domain = domain.capitalize() self.domain = domain self.set_domain_for_broadcast() @@ -80,6 +82,34 @@ def __init__( we = self.options["working electrode"] self.half_cell = we != "both" + self.param = param + if param is None: + self.domain_param = None + else: + if domain == "Negative": + self.domain_param = param.n + elif domain == "Positive": + self.domain_param = param.p + + if phase is not None: + if phase == "primary": + self.phase_param = self.domain_param.prim + elif phase == "secondary": + self.phase_param = self.domain_param.sec + + self.phase = phase + if phase is None or ( + phase == "primary" + and getattr(self.options, domain.lower())["particle phases"] == "1" + ): + # Only one phase, no need to distinguish between + # "primary" and "secondary" + self.phase_name = "" + else: + # add a space so that we can use "" or (e.g.) "primary " interchangeably + # when naming variables + self.phase_name = phase + " " + @property def domain(self): return self._domain diff --git a/pybamm/models/submodels/electrode/base_electrode.py b/pybamm/models/submodels/electrode/base_electrode.py index 775d451595..639f7d4d6a 100644 --- a/pybamm/models/submodels/electrode/base_electrode.py +++ b/pybamm/models/submodels/electrode/base_electrode.py @@ -136,8 +136,7 @@ def _get_standard_current_collector_potential_variables(self, phi_s_cn, phi_s_cp """ pot_scale = self.param.potential_scale - U_ref = self.param.ocv_ref - phi_s_cp_dim = U_ref + phi_s_cp * pot_scale + phi_s_cp_dim = self.param.ocv_ref + phi_s_cp * pot_scale # Local potential difference V_cc = phi_s_cp - phi_s_cn @@ -156,7 +155,7 @@ def _get_standard_current_collector_potential_variables(self, phi_s_cn, phi_s_cp "Positive current collector potential": phi_s_cp, "Positive current collector potential [V]": phi_s_cp_dim, "Local voltage": V_cc, - "Local voltage [V]": U_ref + V_cc * pot_scale, + "Local voltage [V]": self.param.ocv_ref + V_cc * pot_scale, "Terminal voltage": V, "Terminal voltage [V]": V_dim, } diff --git a/pybamm/models/submodels/electrode/ohm/full_ohm.py b/pybamm/models/submodels/electrode/ohm/full_ohm.py index 48e0b0e3ba..0ee68650cc 100644 --- a/pybamm/models/submodels/electrode/ohm/full_ohm.py +++ b/pybamm/models/submodels/electrode/ohm/full_ohm.py @@ -59,16 +59,13 @@ def set_algebraic(self, variables): phi_s = variables[self.domain + " electrode potential"] i_s = variables[self.domain + " electrode current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of area-weighted {self.domain.lower()} " + "electrode interfacial current densities" ] - self.algebraic[phi_s] = pybamm.div(i_s) + a * sum_j + self.algebraic[phi_s] = pybamm.div(i_s) + sum_a_j def set_boundary_conditions(self, variables): diff --git a/pybamm/models/submodels/electrode/ohm/li_metal.py b/pybamm/models/submodels/electrode/ohm/li_metal.py index 51c549bfee..a85ca59d32 100644 --- a/pybamm/models/submodels/electrode/ohm/li_metal.py +++ b/pybamm/models/submodels/electrode/ohm/li_metal.py @@ -22,7 +22,7 @@ def _get_li_metal_interface_variables(self, delta_phi_s, phi_s, phi_e): "Lithium metal interface electrode potential": phi_s, "Lithium metal interface electrode potential [V]": pot_scale * phi_s, "Lithium metal interface electrolyte potential": phi_e, - "Lithium metal interface electrolyte potential [V]": param.n.U_ref + "Lithium metal interface electrolyte potential [V]": param.n.prim.U_ref + pot_scale * phi_e, } return variables @@ -43,7 +43,7 @@ class LithiumMetalSurfaceForm(LithiumMetalBaseModel): """ def get_fundamental_variables(self): - ocp_ref = self.param.n.U_ref + ocp_ref = self.param.n.prim.U_ref pot_scale = self.param.potential_scale delta_phi = pybamm.Variable( @@ -80,7 +80,7 @@ def get_coupled_variables(self, variables): def set_initial_conditions(self, variables): delta_phi = variables["Lithium metal interface surface potential difference"] - delta_phi_init = self.param.n.U_init + delta_phi_init = self.param.n.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py index 483f274472..d1b7bf18d5 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py @@ -46,6 +46,7 @@ def _get_standard_potential_variables(self, phi_e_n, phi_e_s, phi_e_p): param = self.param pot_scale = param.potential_scale + U_ref = param.n.prim.U_ref phi_e = pybamm.concatenation(phi_e_n, phi_e_s, phi_e_p) @@ -61,24 +62,23 @@ def _get_standard_potential_variables(self, phi_e_n, phi_e_s, phi_e_p): variables = { "Negative electrolyte potential": phi_e_n, - "Negative electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_n, + "Negative electrolyte potential [V]": -U_ref + pot_scale * phi_e_n, "Separator electrolyte potential": phi_e_s, - "Separator electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_s, + "Separator electrolyte potential [V]": -U_ref + pot_scale * phi_e_s, "Positive electrolyte potential": phi_e_p, - "Positive electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_p, + "Positive electrolyte potential [V]": -U_ref + pot_scale * phi_e_p, "Electrolyte potential": phi_e, - "Electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e, + "Electrolyte potential [V]": -U_ref + pot_scale * phi_e, "X-averaged electrolyte potential": phi_e_av, - "X-averaged electrolyte potential [V]": -param.n.U_ref - + pot_scale * phi_e_av, + "X-averaged electrolyte potential [V]": -U_ref + pot_scale * phi_e_av, "X-averaged negative electrolyte potential": phi_e_n_av, - "X-averaged negative electrolyte potential [V]": -param.n.U_ref + "X-averaged negative electrolyte potential [V]": -U_ref + pot_scale * phi_e_n_av, "X-averaged separator electrolyte potential": phi_e_s_av, - "X-averaged separator electrolyte potential [V]": -param.n.U_ref + "X-averaged separator electrolyte potential [V]": -U_ref + pot_scale * phi_e_s_av, "X-averaged positive electrolyte potential": phi_e_p_av, - "X-averaged positive electrolyte potential [V]": -param.n.U_ref + "X-averaged positive electrolyte potential [V]": -U_ref + pot_scale * phi_e_p_av, "X-averaged electrolyte overpotential": eta_e_av, "X-averaged electrolyte overpotential [V]": pot_scale * eta_e_av, @@ -188,7 +188,7 @@ def _get_standard_average_surface_potential_difference_variables( The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.U_ref + ocp_ref = self.domain_param.prim.U_ref variables = { "X-averaged " @@ -218,7 +218,7 @@ def _get_standard_surface_potential_difference_variables(self, delta_phi): The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.U_ref + ocp_ref = self.domain_param.prim.U_ref # Broadcast if necessary if delta_phi.domain == []: diff --git a/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py index 77058cc239..d94ef566d8 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py @@ -59,28 +59,14 @@ def set_algebraic(self, variables): phi_e = variables["Electrolyte potential"] i_e = variables["Electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a_p = variables["Positive electrode surface area to volume ratio"] - if self.half_cell: - a = pybamm.concatenation( - pybamm.FullBroadcast(0, "separator", "current collector"), a_p - ) - else: - a_n = variables["Negative electrode surface area to volume ratio"] - a = pybamm.concatenation( - a_n, pybamm.FullBroadcast(0, "separator", "current collector"), a_p - ) - # Variable summing all of the interfacial current densities - sum_j = variables["Sum of interfacial current densities"] + sum_a_j = variables["Sum of area-weighted interfacial current densities"] # Override print_name - sum_j.print_name = "J" - a.print_name = "a" + sum_a_j.print_name = "aj" - self.algebraic = {phi_e: pybamm.div(i_e) - a * sum_j} + self.algebraic = {phi_e: pybamm.div(i_e) - sum_a_j} def set_initial_conditions(self, variables): phi_e = variables["Electrolyte potential"] - self.initial_conditions = {phi_e: -self.param.n.U_init} + self.initial_conditions = {phi_e: -self.param.n.prim.U_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py index 17ec7b233c..368834e82c 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py @@ -60,7 +60,7 @@ def set_initial_conditions(self, variables): + self.domain.lower() + " electrode surface potential difference" ] - delta_phi_init = self.domain_param.U_init + delta_phi_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py index 8a63bb2477..d8297ce704 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py @@ -140,7 +140,7 @@ def set_initial_conditions(self, variables): return delta_phi_e = variables[self.domain + " electrode surface potential difference"] - delta_phi_e_init = self.domain_param.U_init + delta_phi_e_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi_e: delta_phi_e_init} @@ -235,16 +235,13 @@ def set_algebraic(self, variables): delta_phi = variables[self.domain + " electrode surface potential difference"] i_e = variables[self.domain + " electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of area-weighted {self.domain.lower()} " + "electrode interfacial current densities" ] - self.algebraic[delta_phi] = pybamm.div(i_e) - a * sum_j + self.algebraic[delta_phi] = pybamm.div(i_e) - sum_a_j class FullDifferential(BaseModel): @@ -274,13 +271,10 @@ def set_rhs(self, variables): delta_phi = variables[self.domain + " electrode surface potential difference"] i_e = variables[self.domain + " electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of area-weighted {self.domain.lower()} " + "electrode interfacial current densities" ] - self.rhs[delta_phi] = 1 / C_dl * (pybamm.div(i_e) - a * sum_j) + self.rhs[delta_phi] = 1 / C_dl * (pybamm.div(i_e) - sum_a_j) diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py index 6141e0c200..95f4bbe75e 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py @@ -56,7 +56,7 @@ def set_initial_conditions(self, variables): + self.domain.lower() + " electrode surface potential difference" ] - delta_phi_init = self.domain_param.U_init + delta_phi_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 50264b191d..b9b38e8a30 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -20,30 +20,28 @@ class BaseInterface(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options=None): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, reaction, options=None, phase="primary"): + super().__init__(param, domain, options=options, phase=phase) if reaction in ["lithium-ion main", "lithium metal plating"]: - self.reaction_name = "" # empty reaction name for the main reaction - self.Reaction_icd = "Interfacial current density" + self.reaction_name = self.phase_name + # can be "" or "primary " or "secondary " elif reaction == "lead-acid main": self.reaction_name = "" # empty reaction name for the main reaction - self.Reaction_icd = "Interfacial current density" elif reaction == "lead-acid oxygen": - self.reaction_name = " oxygen" - self.Reaction_icd = "Oxygen interfacial current density" + self.reaction_name = "oxygen " elif reaction == "lithium-ion oxygen": - self.reaction_name = " oxygen" - self.Reaction_icd = "Oxygen interfacial current density" + self.reaction_name = "oxygen " elif reaction == "SEI": - self.reaction_name = " SEI" - self.Reaction_icd = "SEI interfacial current density" + self.reaction_name = "SEI " elif reaction == "lithium plating": - self.reaction_name = " lithium plating" - self.Reaction_icd = "Lithium plating interfacial current density" + self.reaction_name = "lithium plating " + self.reaction = reaction def _get_exchange_current_density(self, variables): @@ -61,17 +59,22 @@ def _get_exchange_current_density(self, variables): The exchange current density. """ param = self.param - domain_param = self.domain_param + phase_param = self.phase_param + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name - c_e = variables[self.domain + " electrolyte concentration"] - T = variables[self.domain + " electrode temperature"] + c_e = variables[f"{Domain} electrolyte concentration"] + T = variables[f"{Domain} electrode temperature"] - if self.reaction == "lithium-ion main": + if isinstance(self, pybamm.kinetics.NoReaction): + return pybamm.Scalar(0) + elif self.reaction == "lithium-ion main": # For "particle-size distribution" submodels, take distribution version # of c_s_surf that depends on particle size. if self.options["particle size"] == "distribution": c_s_surf = variables[ - self.domain + " particle surface concentration distribution" + f"{Domain} {phase_name}particle surface concentration distribution" ] # If all variables were broadcast (in "x"), take only the orphans, # then re-broadcast c_e @@ -88,14 +91,13 @@ def _get_exchange_current_density(self, variables): # "current collector" c_e = pybamm.PrimaryBroadcast(c_e, ["current collector"]) # broadcast c_e, T onto "particle size" - c_e = pybamm.PrimaryBroadcast( - c_e, [self.domain.lower() + " particle size"] - ) - T = pybamm.PrimaryBroadcast(T, [self.domain.lower() + " particle size"]) + c_e = pybamm.PrimaryBroadcast(c_e, [f"{domain} particle size"]) + T = pybamm.PrimaryBroadcast(T, [f"{domain} particle size"]) else: - c_s_surf = variables[self.domain + " particle surface concentration"] - + c_s_surf = variables[ + f"{Domain} {phase_name}particle surface concentration" + ] # If all variables were broadcast, take only the orphans if ( isinstance(c_s_surf, pybamm.Broadcast) @@ -110,11 +112,7 @@ def _get_exchange_current_density(self, variables): c_e = pybamm.maximum(tol, c_e) c_s_surf = pybamm.maximum(tol, pybamm.minimum(c_s_surf, 1 - tol)) - j0 = ( - domain_param.gamma - * domain_param.j0(c_e, c_s_surf, T) - / domain_param.C_r - ) + j0 = phase_param.gamma * phase_param.j0(c_e, c_s_surf, T) / phase_param.C_r elif self.reaction == "lithium metal plating": j0 = param.j0_plating(c_e, 1, T) @@ -124,7 +122,7 @@ def _get_exchange_current_density(self, variables): if isinstance(c_e, pybamm.Broadcast) and isinstance(T, pybamm.Broadcast): c_e = c_e.orphans[0] T = T.orphans[0] - j0 = domain_param.j0(c_e, T) + j0 = phase_param.j0(c_e, T) elif self.reaction == "lead-acid oxygen": # If variable was broadcast, take only the orphan @@ -134,7 +132,7 @@ def _get_exchange_current_density(self, variables): if self.domain == "Negative": j0 = pybamm.Scalar(0) elif self.domain == "Positive": - j0 = param.p.j0_Ox(c_e, T) + j0 = param.p.prim.j0_Ox(c_e, T) else: j0 = pybamm.Scalar(0) @@ -143,34 +141,17 @@ def _get_exchange_current_density(self, variables): def _get_number_of_electrons_in_reaction(self): """Returns the number of electrons in the reaction.""" if self.reaction in [ - "lead-acid main", "lithium-ion main", "lithium metal plating", ]: - return self.domain_param.ne + return self.phase_param.ne + elif self.reaction == "lead-acid main": + return self.phase_param.ne elif self.reaction == "lead-acid oxygen": return self.param.ne_Ox else: return pybamm.Scalar(0) - def _get_electrolyte_reaction_signed_stoichiometry(self): - """Returns the number of electrons in the reaction.""" - if self.reaction in [ - "lithium-ion main", - "SEI", - "lithium plating", - "lithium metal plating", - ]: - # Both the main reaction current contribute to the electrolyte reaction - # current - return pybamm.Scalar(1), pybamm.Scalar(1) - elif self.reaction == "lead-acid main": - return self.param.n.s_plus_S, self.param.p.s_plus_S - elif self.reaction == "lead-acid oxygen": - return self.param.s_plus_Ox, self.param.s_plus_Ox - else: - return pybamm.Scalar(0), pybamm.Scalar(0) - def _get_average_total_interfacial_current_density(self, variables): """ Method to obtain the average total interfacial current density. @@ -187,7 +168,7 @@ def _get_average_total_interfacial_current_density(self, variables): For "leading-order" and "composite" submodels (as used in the SPM and SPMe) there is only a single particle radius, so this method returns correct result. """ - + domain = self.domain.lower() i_boundary_cc = variables["Current collector current density"] if self.half_cell and self.domain == "Negative": @@ -197,9 +178,8 @@ def _get_average_total_interfacial_current_density(self, variables): j_total_average = i_boundary_cc else: a_av = variables[ - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio" + f"X-averaged {domain} electrode {self.phase_name}" + "surface area to volume ratio" ] sgn = 1 if self.domain == "Negative" else -1 @@ -208,8 +188,11 @@ def _get_average_total_interfacial_current_density(self, variables): return j_total_average def _get_standard_interfacial_current_variables(self, j): + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name param = self.param - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # Half-cell domain, j should not be broadcast @@ -234,42 +217,27 @@ def _get_standard_interfacial_current_variables(self, j): j = pybamm.PrimaryBroadcast(j, self.domain_for_broadcast) variables = { - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density": j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density": j_av, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density [A.m-2]": j_scale * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density [A.m-2]": j_scale * j_av, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density per volume [A.m-3]": i_typ / L_x * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density per volume [A.m-3]": i_typ / L_x * j_av, + f"{Domain} electrode {reaction_name}interfacial current density": j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density": j_av, + f"{Domain} electrode {reaction_name}" + "interfacial current density [A.m-2]": j_scale * j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density [A.m-2]": j_scale * j_av, + f"{Domain} electrode {reaction_name}" + "interfacial current density per volume [A.m-3]": i_typ / L_x * j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density per volume [A.m-3]": i_typ / L_x * j_av, } return variables def _get_standard_total_interfacial_current_variables(self, j_tot_av): + domain = self.domain.lower() i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.half_cell and self.domain == "Negative": variables = { @@ -279,129 +247,22 @@ def _get_standard_total_interfacial_current_variables(self, j_tot_av): } else: variables = { - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density": j_tot_av, - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density [A.m-2]": j_scale - * j_tot_av, - "X-averaged " + self.domain.lower() + " electrode total interfacial " + f"X-averaged {domain} electrode total interfacial " + "current density": j_tot_av, + f"X-averaged {domain} electrode total interfacial " + "current density [A.m-2]": j_scale * j_tot_av, + f"X-averaged {domain} electrode total interfacial " "current density per volume [A.m-3]": i_typ / L_x * j_tot_av, } return variables - def _get_standard_whole_cell_interfacial_current_variables(self, variables): - """ - Get variables associated with interfacial current over the whole cell domain - This function also automatically increments the "total source term" variables - """ - param = self.param - - i_typ = param.i_typ - L_x = param.L_x - j_n_scale = param.n.j_scale - j_p_scale = param.p.j_scale - - j_p_av = variables[ - "X-averaged positive electrode" - + self.reaction_name - + " interfacial current density" - ] - - zero_s = pybamm.FullBroadcast(0, "separator", "current collector") - j_p = variables[ - "Positive electrode" + self.reaction_name + " interfacial current density" - ] - if self.half_cell: - j = pybamm.concatenation(zero_s, j_p) - j_dim = pybamm.concatenation(zero_s, j_p_scale * j_p) - else: - j_n_av = variables[ - "X-averaged negative electrode" - + self.reaction_name - + " interfacial current density" - ] - j_n = variables[ - "Negative electrode" - + self.reaction_name - + " interfacial current density" - ] - j = pybamm.concatenation(j_n, zero_s, j_p) - j_dim = pybamm.concatenation(j_n_scale * j_n, zero_s, j_p_scale * j_p) - - # Create separate 'new_variables' so that variables only get updated once - # everything is computed - new_variables = variables.copy() - if self.reaction not in ["SEI", "lithium plating"]: - new_variables.update( - { - self.Reaction_icd: j, - self.Reaction_icd + " [A.m-2]": j_dim, - self.Reaction_icd + " per volume [A.m-3]": i_typ / L_x * j, - } - ) - - a_p = new_variables["Positive electrode surface area to volume ratio"] - - s_n, s_p = self._get_electrolyte_reaction_signed_stoichiometry() - if self.half_cell: - a_n = pybamm.Scalar(1) - a = pybamm.concatenation(zero_s, a_p) - s = pybamm.concatenation( - zero_s, - pybamm.FullBroadcast(s_p, "positive electrode", "current collector"), - ) - else: - a_n = new_variables["Negative electrode surface area to volume ratio"] - a = pybamm.concatenation(a_n, zero_s, a_p) - s = pybamm.concatenation( - pybamm.FullBroadcast(s_n, "negative electrode", "current collector"), - zero_s, - pybamm.FullBroadcast(s_p, "positive electrode", "current collector"), - ) - - # Override print_name - j.print_name = "J" - a.print_name = "a" - j_p.print_name = "j_p" - - new_variables["Sum of electrolyte reaction source terms"] += a * s * j - new_variables[ - "Sum of positive electrode electrolyte reaction source terms" - ] += (a_p * s_p * j_p) - new_variables[ - "Sum of x-averaged positive electrode electrolyte reaction source terms" - ] += pybamm.x_average(a_p * s_p * j_p) - - new_variables["Sum of interfacial current densities"] += j - new_variables["Sum of positive electrode interfacial current densities"] += j_p - new_variables[ - "Sum of x-averaged positive electrode interfacial current densities" - ] += j_p_av - - if not self.half_cell: - j_n.print_name = "j_n" - new_variables[ - "Sum of negative electrode electrolyte reaction source terms" - ] += (a_n * s_n * j_n) - new_variables[ - "Sum of x-averaged negative electrode electrolyte reaction source terms" - ] += pybamm.x_average(a_n * s_n * j_n) - new_variables[ - "Sum of negative electrode interfacial current densities" - ] += j_n - new_variables[ - "Sum of x-averaged negative electrode interfacial current densities" - ] += j_n_av - - variables.update(new_variables) - return variables - def _get_standard_exchange_current_variables(self, j0): + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name param = self.param - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # half-cell domain @@ -430,77 +291,24 @@ def _get_standard_exchange_current_variables(self, j0): j0 = pybamm.PrimaryBroadcast(j0, self.domain_for_broadcast) variables = { - self.domain - + " electrode" - + self.reaction_name - + " exchange current density": j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density": j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density [A.m-2]": j_scale * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density [A.m-2]": j_scale * j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0_av, + f"{Domain} electrode {reaction_name}" "exchange current density": j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density": j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density [A.m-2]": j_scale * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density [A.m-2]": j_scale * j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density per volume [A.m-3]": i_typ / L_x * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density per volume [A.m-3]": i_typ / L_x * j0_av, } return variables - def _get_standard_whole_cell_exchange_current_variables(self, variables): - param = self.param - i_typ = param.i_typ - L_x = param.L_x - j_n_scale = param.n.j_scale - j_p_scale = param.p.j_scale - - zero_s = pybamm.FullBroadcast(0, "separator", "current collector") - j0_p = variables[ - "Positive electrode" + self.reaction_name + " exchange current density" - ] - if self.half_cell: - j0 = pybamm.concatenation(zero_s, j0_p) - j0_dim = pybamm.concatenation(zero_s, j_p_scale * j0_p) - else: - j0_n = variables[ - "Negative electrode" + self.reaction_name + " exchange current density" - ] - j0 = pybamm.concatenation(j0_n, zero_s, j0_p) - j0_dim = pybamm.concatenation(j_n_scale * j0_n, zero_s, j_p_scale * j0_p) - - if self.reaction_name == "": - variables = { - "Exchange current density": j0, - "Exchange current density [A.m-2]": j0_dim, - "Exchange current density per volume [A.m-3]": i_typ / L_x * j0, - } - else: - reaction_name = self.reaction_name[1:].capitalize() - variables = { - reaction_name + " exchange current density": j0, - reaction_name + " exchange current density [A.m-2]": j0_dim, - reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0, - } - - return variables - def _get_standard_overpotential_variables(self, eta_r): - + Domain = self.domain + reaction_name = self.reaction_name pot_scale = self.param.potential_scale if self.reaction == "lithium metal plating": @@ -521,15 +329,13 @@ def _get_standard_overpotential_variables(self, eta_r): if eta_r.domain == ["current collector"]: eta_r = pybamm.PrimaryBroadcast(eta_r, self.domain_for_broadcast) - domain_reaction = ( - self.domain + " electrode" + self.reaction_name + " reaction overpotential" - ) + domain_reaction = f"{Domain} electrode {reaction_name}reaction overpotential" variables = { domain_reaction: eta_r, - "X-averaged " + domain_reaction.lower(): eta_r_av, - domain_reaction + " [V]": eta_r * pot_scale, - "X-averaged " + domain_reaction.lower() + " [V]": eta_r_av * pot_scale, + f"X-averaged {domain_reaction.lower()}": eta_r_av, + f"{domain_reaction} [V]": eta_r * pot_scale, + f"X-averaged {domain_reaction.lower()} [V]": eta_r_av * pot_scale, } return variables @@ -567,7 +373,9 @@ def _get_standard_sei_film_overpotential_variables(self, eta_sei): def _get_standard_average_surface_potential_difference_variables( self, delta_phi_av ): - ocp_ref = self.domain_param.U_ref + domain = self.domain.lower() + + ocp_ref = self.phase_param.U_ref delta_phi_av_dim = ocp_ref + delta_phi_av * self.param.potential_scale @@ -579,23 +387,20 @@ def _get_standard_average_surface_potential_difference_variables( } else: variables = { - "X-averaged " - + self.domain.lower() - + " electrode surface potential difference": delta_phi_av, - "X-averaged " - + self.domain.lower() - + " electrode surface potential difference [V]": delta_phi_av_dim, + f"X-averaged {domain} electrode " + "surface potential difference": delta_phi_av, + f"X-averaged {domain} electrode " + "surface potential difference [V]": delta_phi_av_dim, } return variables def _get_standard_surface_potential_difference_variables(self, delta_phi): - ocp_ref = self.domain_param.U_ref - pot_scale = self.param.potential_scale + ocp_ref = self.phase_param.U_ref # Broadcast if necessary - delta_phi_dim = ocp_ref + delta_phi * pot_scale + delta_phi_dim = ocp_ref + delta_phi * self.param.potential_scale if delta_phi.domain == ["current collector"]: delta_phi = pybamm.PrimaryBroadcast(delta_phi, self.domain_for_broadcast) delta_phi_dim = pybamm.PrimaryBroadcast( @@ -603,8 +408,8 @@ def _get_standard_surface_potential_difference_variables(self, delta_phi): ) variables = { - self.domain + " electrode surface potential difference": delta_phi, - self.domain + " electrode surface potential difference [V]": delta_phi_dim, + f"{self.domain} electrode surface potential difference": delta_phi, + f"{self.domain} electrode surface potential difference [V]": delta_phi_dim, } return variables @@ -614,40 +419,32 @@ def _get_standard_size_distribution_interfacial_current_variables(self, j): Interfacial current density variables that depend on particle size R, relevant if "particle size" option is "distribution". """ + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name + # X-average and broadcast if necessary - if j.domains["secondary"] == [self.domain.lower() + " electrode"]: + if j.domains["secondary"] == [f"{domain} electrode"]: # x-average j_xav = pybamm.x_average(j) else: j_xav = j - j = pybamm.SecondaryBroadcast(j_xav, [self.domain.lower() + " electrode"]) + j = pybamm.SecondaryBroadcast(j_xav, [f"{domain} electrode"]) # j scale i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = i_typ / (self.domain_param.a_typ * L_x) + j_scale = i_typ / (self.phase_param.a_typ * L_x) variables = { - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density distribution": j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density distribution": j_xav, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density" - + " distribution [A.m-2]": j_scale * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" - + " distribution [A.m-2]": j_scale * j_xav, + f"{Domain} electrode {reaction_name}" + "interfacial current density distribution": j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density distribution": j_xav, + f"{Domain} electrode {reaction_name}" + "interfacial current density distribution [A.m-2]": j_scale * j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density distribution [A.m-2]": j_scale * j_xav, } return variables @@ -656,46 +453,34 @@ def _get_standard_size_distribution_exchange_current_variables(self, j0): """ Exchange current variables that depend on particle size. """ + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = i_typ / (self.domain_param.a_typ * L_x) + j_scale = i_typ / (self.phase_param.a_typ * L_x) # X-average or broadcast to electrode if necessary - if j0.domains["secondary"] != [self.domain.lower() + " electrode"]: + if j0.domains["secondary"] != [f"{domain} electrode"]: j0_av = j0 j0 = pybamm.SecondaryBroadcast(j0, self.domain_for_broadcast) else: j0_av = pybamm.x_average(j0) variables = { - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution": j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution": j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution [A.m-2]": j_scale * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution [A.m-2]": j_scale * j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution" + f"{Domain} electrode {reaction_name}" + "exchange current density distribution": j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution": j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density distribution [A.m-2]": j_scale * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution [A.m-2]": j_scale * j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density distribution" + " per volume [A.m-3]": i_typ / L_x * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution" + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution" + " per volume [A.m-3]": i_typ / L_x * j0_av, } @@ -706,25 +491,25 @@ def _get_standard_size_distribution_overpotential_variables(self, eta_r): Overpotential variables that depend on particle size. """ pot_scale = self.param.potential_scale + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name # X-average or broadcast to electrode if necessary - if eta_r.domains["secondary"] != [self.domain.lower() + " electrode"]: + if eta_r.domains["secondary"] != [f"{domain} electrode"]: eta_r_av = eta_r eta_r = pybamm.SecondaryBroadcast(eta_r, self.domain_for_broadcast) else: eta_r_av = pybamm.x_average(eta_r) - domain_reaction = ( - self.domain + " electrode" + self.reaction_name + " reaction overpotential" - ) + domain_reaction = f"{Domain} electrode {reaction_name}reaction overpotential" variables = { domain_reaction: eta_r, - "X-averaged " + domain_reaction.lower() + " distribution": eta_r_av, - domain_reaction + " [V]": eta_r * pot_scale, - "X-averaged " - + domain_reaction.lower() - + " distribution [V]": eta_r_av * pot_scale, + f"X-averaged {domain_reaction.lower()} distribution": eta_r_av, + f"{domain_reaction} [V]": eta_r * pot_scale, + f"X-averaged {domain_reaction.lower()} distribution [V]": eta_r_av + * pot_scale, } return variables diff --git a/pybamm/models/submodels/interface/kinetics/__init__.py b/pybamm/models/submodels/interface/kinetics/__init__.py index 2c09e21047..73ead90257 100644 --- a/pybamm/models/submodels/interface/kinetics/__init__.py +++ b/pybamm/models/submodels/interface/kinetics/__init__.py @@ -1,4 +1,5 @@ from .base_kinetics import BaseKinetics +from .total_kinetics import TotalKinetics from .butler_volmer import SymmetricButlerVolmer, AsymmetricButlerVolmer from .linear import Linear from .marcus import Marcus, MarcusHushChidsey diff --git a/pybamm/models/submodels/interface/kinetics/base_kinetics.py b/pybamm/models/submodels/interface/kinetics/base_kinetics.py index d1bfe7dd7c..67bfceb222 100644 --- a/pybamm/models/submodels/interface/kinetics/base_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/base_kinetics.py @@ -20,12 +20,14 @@ class BaseKinetics(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options=options) + def __init__(self, param, domain, reaction, options, phase="primary"): + super().__init__(param, domain, reaction, options=options, phase=phase) def get_fundamental_variables(self): domain = self.domain.lower() @@ -49,7 +51,7 @@ def get_fundamental_variables(self): def get_coupled_variables(self, variables): Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name if self.reaction == "lithium metal plating": # li metal electrode (half-cell) delta_phi = variables[ @@ -73,14 +75,13 @@ def get_coupled_variables(self, variables): # Get open-circuit potential variables and reaction overpotential if self.options["particle size"] == "distribution": ocp = variables[ - f"{Domain} electrode{rxn} open circuit potential distribution" + f"{Domain} electrode {reaction_name}open circuit potential distribution" ] else: - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + ocp = variables[f"{Domain} electrode {reaction_name}open circuit potential"] # If ocp was broadcast, take only the orphan. if isinstance(ocp, pybamm.Broadcast): ocp = ocp.orphans[0] - eta_r = delta_phi - ocp # Get average interfacial current density @@ -166,31 +167,6 @@ def get_coupled_variables(self, variables): self._get_standard_sei_film_overpotential_variables(eta_sei) ) - if ( - ( - self.half_cell - or ( - "Negative electrode" - + self.reaction_name - + " interfacial current density" - ) - in variables - ) - and ( - "Positive electrode" - + self.reaction_name - + " interfacial current density" - ) - in variables - and self.Reaction_icd not in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables def set_algebraic(self, variables): @@ -281,9 +257,9 @@ def _get_interface_variables_for_first_order(self, variables): j0 = self._get_exchange_current_density(hacked_variables) ne = self._get_number_of_electrons_in_reaction() if self.reaction == "lead-acid main": - ocp = self.domain_param.U(c_e_0, self.param.T_init) + ocp = self.phase_param.U(c_e_0, self.param.T_init) elif self.reaction == "lead-acid oxygen": - ocp = self.domain_param.U_Ox + ocp = self.phase_param.U_Ox if j0.domain in ["current collector", ["current collector"]]: T = variables["X-averaged cell temperature"] diff --git a/pybamm/models/submodels/interface/kinetics/butler_volmer.py b/pybamm/models/submodels/interface/kinetics/butler_volmer.py index 2c85adbbe1..65f66e3327 100644 --- a/pybamm/models/submodels/interface/kinetics/butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/butler_volmer.py @@ -24,12 +24,14 @@ class SymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): prefactor = ne / (2 * (1 + self.param.Theta * T)) @@ -77,15 +79,17 @@ class AsymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv arg_ox = ne * alpha * eta_r / (1 + self.param.Theta * T) arg_red = -ne * (1 - alpha) * eta_r / (1 + self.param.Theta * T) return u * j0 * (pybamm.exp(arg_ox) - pybamm.exp(arg_red)) diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index ffdb17dbde..9e79a14d04 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -40,7 +40,12 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode{rxn} open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] eta_r = delta_phi_s - ocp # Get interfacial current densities @@ -58,21 +63,6 @@ def get_coupled_variables(self, variables): eta_sei = pybamm.Scalar(0) variables.update(self._get_standard_sei_film_overpotential_variables(eta_sei)) - if ( - "Negative electrode" + self.reaction_name + " interfacial current density" - in variables - and "Positive electrode" - + self.reaction_name - + " interfacial current density" - in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - if self.order == "composite": # For the composite model, adds the first-order x-averaged interfacial # current density to the dictionary of variables. diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index 3dfcd14bc9..1223ccb3c4 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -71,7 +71,12 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode{rxn} open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] eta_r = delta_phi - ocp variables.update(self._get_standard_interfacial_current_variables(j)) @@ -97,12 +102,4 @@ def get_coupled_variables(self, variables): } ) - if self.domain == "Positive": - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables diff --git a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py index c876e1c125..11be5e050e 100644 --- a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py @@ -33,7 +33,12 @@ def get_coupled_variables(self, variables): Domain = self.domain rxn = self.reaction_name - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode{rxn} open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] j0 = self._get_exchange_current_density(variables) # Broadcast to match j0's domain @@ -141,9 +146,8 @@ def __init__(self, param, domain, reaction, options=None): def get_coupled_variables(self, variables): j_tot = variables[ - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density" + f"X-averaged {self.domain.lower()} electrode " + "total interfacial current density" ] if self.domain == "Negative": j_sei = variables["SEI interfacial current density"] @@ -154,27 +158,6 @@ def get_coupled_variables(self, variables): variables.update(self._get_standard_interfacial_current_variables(j)) - if ( - self.half_cell - or ( - "Negative electrode" - + self.reaction_name - + " interfacial current density" - in variables - ) - and "Positive electrode" - + self.reaction_name - + " interfacial current density" - in variables - and self.Reaction_icd not in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables diff --git a/pybamm/models/submodels/interface/kinetics/linear.py b/pybamm/models/submodels/interface/kinetics/linear.py index 01bb5d7dfb..4c1000af77 100644 --- a/pybamm/models/submodels/interface/kinetics/linear.py +++ b/pybamm/models/submodels/interface/kinetics/linear.py @@ -20,12 +20,14 @@ class Linear(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): prefactor = ne / (2 * (1 + self.param.Theta * T)) diff --git a/pybamm/models/submodels/interface/kinetics/marcus.py b/pybamm/models/submodels/interface/kinetics/marcus.py index 01f38c4995..887d6d6e29 100644 --- a/pybamm/models/submodels/interface/kinetics/marcus.py +++ b/pybamm/models/submodels/interface/kinetics/marcus.py @@ -22,16 +22,18 @@ class Marcus(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") def _get_kinetics(self, j0, ne, eta_r, T, u): - mhc_lambda = self.domain_param.mhc_lambda + mhc_lambda = self.phase_param.mhc_lambda kT = 1 + self.param.Theta * T # dimensionless exp_arg_ox = -((mhc_lambda + eta_r) ** 2) / (4 * mhc_lambda * kT) @@ -62,16 +64,18 @@ class MarcusHushChidsey(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") def _get_kinetics(self, j0, ne, eta_r, T, u): - mhc_lambda = self.domain_param.mhc_lambda + mhc_lambda = self.phase_param.mhc_lambda kT = 1 + self.param.Theta * T # dimensionless lambda_T = mhc_lambda / kT diff --git a/pybamm/models/submodels/interface/kinetics/no_reaction.py b/pybamm/models/submodels/interface/kinetics/no_reaction.py index dea93e239e..7b5ab7720a 100644 --- a/pybamm/models/submodels/interface/kinetics/no_reaction.py +++ b/pybamm/models/submodels/interface/kinetics/no_reaction.py @@ -3,10 +3,10 @@ # import pybamm -from .base_kinetics import BaseKinetics +from ..base_interface import BaseInterface -class NoReaction(BaseKinetics): +class NoReaction(BaseInterface): """ Base submodel for when no reaction occurs @@ -18,16 +18,30 @@ class NoReaction(BaseKinetics): The domain to implement the model, either: 'Negative' or 'Positive'. reaction : str The name of the reaction being implemented + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction): + def __init__(self, param, domain, reaction, phase): options = { "SEI film resistance": "none", "total interfacial current density as a state": "false", } - super().__init__(param, domain, reaction, options) + super().__init__(param, domain, reaction, options, phase) - def _get_kinetics(self, j0, ne, eta_r, T, u): + def get_fundamental_variables(self): + zero = pybamm.Scalar(0) + variables = self._get_standard_interfacial_current_variables(zero) + variables.update(self._get_standard_exchange_current_variables(zero)) + return variables + + def _get_dj_dc(self, variables): + return pybamm.Scalar(0) + + def _get_dj_ddeltaphi(self, variables): + return pybamm.Scalar(0) + + def _get_j_diffusion_limited_first_order(self, variables): return pybamm.Scalar(0) diff --git a/pybamm/models/submodels/interface/kinetics/tafel.py b/pybamm/models/submodels/interface/kinetics/tafel.py index 3ae541d07b..ed187db82d 100644 --- a/pybamm/models/submodels/interface/kinetics/tafel.py +++ b/pybamm/models/submodels/interface/kinetics/tafel.py @@ -23,22 +23,24 @@ class ForwardTafel(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv return ( u * j0 * pybamm.exp((ne * alpha / (2 * (1 + self.param.Theta * T))) * eta_r) ) def _get_dj_dc(self, variables): """See :meth:`pybamm.interface.kinetics.BaseKinetics._get_dj_dc`""" - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv ( c_e, delta_phi, @@ -55,7 +57,7 @@ def _get_dj_dc(self, variables): def _get_dj_ddeltaphi(self, variables): """See :meth:`pybamm.interface.kinetics.BaseKinetics._get_dj_ddeltaphi`""" - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv _, delta_phi, j0, ne, ocp, T, u = self._get_interface_variables_for_first_order( variables ) diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py new file mode 100644 index 0000000000..18cbfc712b --- /dev/null +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -0,0 +1,274 @@ +# +# Total kinetics class, summing up contributions from all reactions +# +import pybamm + + +class TotalKinetics(pybamm.BaseSubModel): + """ + Total kinetics class, summing up contributions from all reactions + + Parameters + ---------- + param : + model parameters + domain : str + The domain to implement the model, either: 'Negative' or 'Positive'. + reaction : str + The name of the reaction being implemented + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + + **Extends:** :class:`pybamm.interface.BaseInterface` + """ + + def __init__(self, param, chemistry, options): + super().__init__(param, options=options) + self.chemistry = chemistry + + def get_coupled_variables(self, variables): + """ + Get variables associated with interfacial current over the whole cell domain + This function also creates the "total source term" variables by summing all + the reactions + """ + param = self.param + + i_typ = param.i_typ + L_x = param.L_x + + reaction_names = ["", "SEI "] + if self.chemistry == "lithium-ion": + phase_name = [] + for domain in ["negative", "positive"]: + num_phases = getattr(self.options, domain)["particle phases"] + if num_phases == "1": + # "primary" phase is not explicitly distinguished + phase_name.append("") + else: + # explicit "primary " and "secondary " + phase_name.append("primary ") + reaction_names = ["", "SEI "] + phase_names = [phase_name] * 2 + if not self.half_cell: + # no separate plating reaction in a half-cell, + # since plating is the main reaction + reaction_names.append("lithium plating ") + phase_names.append(phase_name) + if self.options["particle phases"] != "1": + reaction_names.append("secondary ") + phase_names.append(["secondary ", "secondary "]) + elif self.chemistry == "lead-acid": + reaction_names = ["", "oxygen "] + phase_names = [["", ""]] * 2 + + # Create separate 'new_variables' so that variables only get updated once + # everything is computed + new_variables = variables.copy() + + # Initialize "total reaction" variables + # These will get populated by each reaction, and then used + # later by "set_rhs" or "set_algebraic", which ensures that we always have + # added all the necessary variables by the time the sum is used + new_variables.update( + { + "Sum of electrolyte reaction source terms": 0, + "Sum of positive electrode electrolyte reaction source terms": 0, + "Sum of x-averaged positive electrode " + "electrolyte reaction source terms": 0, + "Sum of interfacial current densities": 0, + "Sum of area-weighted interfacial current densities": 0, + "Sum of positive electrode interfacial current densities": 0, + "Sum of x-averaged positive electrode interfacial current densities": 0, + "Sum of area-weighted positive electrode " + "interfacial current densities": 0, + "Sum of x-averaged area-weighted positive electrode " + "interfacial current densities": 0, + } + ) + if not self.half_cell: + new_variables.update( + { + "Sum of negative electrode electrolyte reaction source terms": 0, + "Sum of x-averaged negative electrode " + "electrolyte reaction source terms": 0, + "Sum of negative electrode interfacial current densities": 0, + "Sum of x-averaged negative electrode interfacial current densities" + "": 0, + "Sum of area-weighted negative electrode " + "interfacial current densities": 0, + "Sum of x-averaged area-weighted negative electrode " + "interfacial current densities": 0, + } + ) + for reaction_name, phase_name in zip(reaction_names, phase_names): + phase_n, phase_p = phase_name + if reaction_name == "": + reaction_n = phase_n + reaction_p = phase_p + reaction_tot = "" + else: + reaction_n = reaction_p = reaction_tot = reaction_name + if phase_n in ["primary ", ""]: + j_n_scale = param.n.prim.j_scale + j_p_scale = param.p.prim.j_scale + elif phase_n == "secondary ": + j_n_scale = param.n.sec.j_scale + j_p_scale = param.p.sec.j_scale + + j_p_av = variables[ + f"X-averaged positive electrode {reaction_p}" + "interfacial current density" + ] + + zero_s = pybamm.FullBroadcast(0, "separator", "current collector") + j_p = variables[ + f"Positive electrode {reaction_p}interfacial current density" + ] + + if self.half_cell: + j = pybamm.concatenation(zero_s, j_p) + j_dim = pybamm.concatenation(zero_s, j_p_scale * j_p) + else: + j_n_av = variables[ + f"X-averaged negative electrode {reaction_n}" + "interfacial current density" + ] + j_n = variables[ + f"Negative electrode {reaction_n}interfacial current density" + ] + j = pybamm.concatenation(j_n, zero_s, j_p) + j_dim = pybamm.concatenation(j_n_scale * j_n, zero_s, j_p_scale * j_p) + + if reaction_name not in ["SEI ", "lithium plating "]: + j0_p = variables[ + f"Positive electrode {reaction_p}exchange current density" + ] + + if self.half_cell: + j0 = pybamm.concatenation(zero_s, j0_p) + j0_dim = pybamm.concatenation(zero_s, j_p_scale * j0_p) + else: + j0_n = variables[ + f"Negative electrode {reaction_n}exchange current density" + ] + j0 = pybamm.concatenation(j0_n, zero_s, j0_p) + j0_dim = pybamm.concatenation( + j_n_scale * j0_n, zero_s, j_p_scale * j0_p + ) + new_variables.update( + { + f"{reaction_tot}interfacial ".capitalize() + + "current density": j, + f"{reaction_tot}interfacial ".capitalize() + + "current density [A.m-2]": j_dim, + f"{reaction_tot}interfacial ".capitalize() + + "current density per volume [A.m-3]": i_typ / L_x * j, + f"{reaction_tot}exchange ".capitalize() + "current density": j0, + f"{reaction_tot}exchange ".capitalize() + + "current density [A.m-2]": j0_dim, + f"{reaction_tot}exchange ".capitalize() + + "current density per volume [A.m-3]": i_typ / L_x * j0, + } + ) + + # Sum variables + if pybamm.xyz_average(j_p).id == pybamm.Scalar(0).id: + a_p = j_p # zero + else: + a_p = new_variables[ + f"Positive electrode {phase_p}surface area to volume ratio" + ] + + if self.chemistry == "lithium-ion": + # Both the main reaction current contribute to the electrolyte reaction + # current + s_n, s_p = 1, 1 + elif self.chemistry == "lead-acid": + if reaction_name == "": # main reaction + s_n, s_p = self.param.n.prim.s_plus_S, self.param.p.prim.s_plus_S + elif reaction_name == "oxygen ": + s_n, s_p = self.param.s_plus_Ox, self.param.s_plus_Ox + if self.half_cell: + a_n = pybamm.Scalar(1) + a = pybamm.concatenation(zero_s, a_p) + s = pybamm.concatenation( + zero_s, + pybamm.FullBroadcast( + s_p, "positive electrode", "current collector" + ), + ) + else: + if pybamm.xyz_average(j_n).id == pybamm.Scalar(0).id: + a_n = j_n + else: + a_n = new_variables[ + f"Negative electrode {phase_n}surface area to volume ratio" + ] + a = pybamm.concatenation(a_n, zero_s, a_p) + s = pybamm.concatenation( + pybamm.FullBroadcast( + s_n, "negative electrode", "current collector" + ), + zero_s, + pybamm.FullBroadcast( + s_p, "positive electrode", "current collector" + ), + ) + + # Override print_name + j.print_name = "J" + a.print_name = "a" + j_p.print_name = "j_p" + + new_variables["Sum of electrolyte reaction source terms"] += a * s * j + new_variables[ + "Sum of positive electrode electrolyte reaction source terms" + ] += (a_p * s_p * j_p) + new_variables[ + "Sum of x-averaged positive electrode electrolyte reaction source terms" + ] += pybamm.x_average(a_p * s_p * j_p) + + new_variables["Sum of interfacial current densities"] += j + new_variables["Sum of area-weighted interfacial current densities"] += a * j + new_variables[ + "Sum of positive electrode interfacial current densities" + ] += j_p + new_variables[ + "Sum of x-averaged positive electrode interfacial current densities" + ] += j_p_av + new_variables[ + "Sum of area-weighted positive electrode interfacial current densities" + ] += (a_p * j_p) + new_variables[ + "Sum of x-averaged area-weighted positive electrode" + " interfacial current densities" + ] += pybamm.x_average(a_p * j_p) + + if not self.half_cell: + j_n.print_name = "j_n" + new_variables[ + "Sum of negative electrode electrolyte reaction source terms" + ] += (a_n * s_n * j_n) + new_variables[ + "Sum of x-averaged negative electrode electrolyte " + "reaction source terms" + ] += pybamm.x_average(a_n * s_n * j_n) + new_variables[ + "Sum of negative electrode interfacial current densities" + ] += j_n + new_variables[ + "Sum of x-averaged negative electrode interfacial current densities" + ] += j_n_av + new_variables[ + "Sum of area-weighted negative electrode interfacial current densities" + ] += (a_n * j_n) + new_variables[ + "Sum of x-averaged area-weighted negative electrode " + "interfacial current densities" + ] += pybamm.x_average(a_n * j_n) + + variables.update(new_variables) + + return variables diff --git a/pybamm/models/submodels/interface/lithium_plating/base_plating.py b/pybamm/models/submodels/interface/lithium_plating/base_plating.py index 7d73574812..6e9076e19b 100644 --- a/pybamm/models/submodels/interface/lithium_plating/base_plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/base_plating.py @@ -50,9 +50,6 @@ def get_coupled_variables(self, variables): "Positive electrode lithium plating interfacial current density": zero, } ) - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) return variables @@ -78,7 +75,7 @@ def _get_standard_concentration_variables(self, c_plated_Li, c_dead_Li): L_scale = 1 else: c_scale = param.c_Li_typ - L_scale = param.V_bar_plated_Li * c_scale / param.n.a_typ + L_scale = param.V_bar_plated_Li * c_scale / param.n.prim.a_typ c_plated_Li_av = pybamm.x_average(c_plated_Li) L_plated_Li = c_plated_Li # plated Li thickness @@ -131,7 +128,7 @@ def _get_standard_reaction_variables(self, j_stripping): # Set scales to one for the "no plating" model so that they are not required # by parameter values in general param = self.param - j_scale = param.n.j_scale + j_scale = param.n.prim.j_scale j_stripping_av = pybamm.x_average(j_stripping) variables = { diff --git a/pybamm/models/submodels/interface/lithium_plating/plating.py b/pybamm/models/submodels/interface/lithium_plating/plating.py index cf6e2d7ca2..8a8f13a3c1 100644 --- a/pybamm/models/submodels/interface/lithium_plating/plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/plating.py @@ -74,7 +74,7 @@ def get_coupled_variables(self, variables): j0_stripping = param.j0_stripping(c_e_n, c_plated_Li, T) j0_plating = param.j0_plating(c_e_n, c_plated_Li, T) # phi_ref is part of the de-dimensionalization used in PyBaMM - phi_ref = param.n.U_ref / param.potential_scale + phi_ref = param.n.prim.U_ref / param.potential_scale eta_stripping = delta_phi + phi_ref + eta_sei eta_plating = -eta_stripping @@ -129,7 +129,7 @@ def set_rhs(self, variables): self.rhs = { c_plated_Li: -Gamma_plating * a * j_stripping - coupling_term, - c_dead_Li: coupling_term + c_dead_Li: coupling_term, } def set_initial_conditions(self, variables): diff --git a/pybamm/models/submodels/interface/open_circuit_potential/__init__.py b/pybamm/models/submodels/interface/open_circuit_potential/__init__.py index 066fddb0b2..d644b87e76 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/__init__.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/__init__.py @@ -1,2 +1,3 @@ from .base_ocp import BaseOpenCircuitPotential from .single_ocp import SingleOpenCircuitPotential +from .current_sigmoid_ocp import CurrentSigmoidOpenCircuitPotential diff --git a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py index 73abf39bfb..3cf9b73302 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py @@ -20,12 +20,14 @@ class BaseOpenCircuitPotential(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options=None): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options=options, phase=phase) def _get_standard_ocp_variables(self, ocp, dUdT): """ @@ -47,7 +49,7 @@ def _get_standard_ocp_variables(self, ocp, dUdT): """ Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name # Update size variables then size average. if ocp.domain in [["negative particle size"], ["positive particle size"]]: @@ -71,29 +73,26 @@ def _get_standard_ocp_variables(self, ocp, dUdT): ocp = pybamm.PrimaryBroadcast(ocp, self.domain_for_broadcast) pot_scale = self.param.potential_scale - ocp_dim = self.domain_param.U_ref + pot_scale * ocp - ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av - - variables.update( - { - f"{Domain} electrode{rxn} open circuit potential": ocp, - f"{Domain} electrode{rxn} open circuit potential [V]": ocp_dim, - f"X-averaged {domain} electrode{rxn} open circuit potential": ocp_av, - f"X-averaged {domain} electrode{rxn} " - "open circuit potential [V]": ocp_av_dim, - } - ) + ocp_dim = self.phase_param.U_ref + pot_scale * ocp + ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av + + variables = { + f"{Domain} electrode {reaction_name}open circuit potential": ocp, + f"{Domain} electrode {reaction_name}" "open circuit potential [V]": ocp_dim, + f"X-averaged {domain} electrode {reaction_name}" + "open circuit potential": ocp_av, + f"X-averaged {domain} electrode {reaction_name}" + "open circuit potential [V]": ocp_av_dim, + } if self.reaction in ["lithium-ion main", "lead-acid main"]: variables.update( { f"{Domain} electrode entropic change": dUdT, - f"{Domain} electrode entropic change [V.K-1]": pot_scale - * dUdT - / self.param.Delta_T, + f"{Domain} electrode entropic change [V.K-1]" + "": pot_scale * dUdT / self.param.Delta_T, f"X-averaged {domain} electrode entropic change": dUdT_av, - f"X-averaged {domain} electrode entropic change [V.K-1]": pot_scale - * dUdT_av - / self.param.Delta_T, + f"X-averaged {domain} electrode entropic change [V.K-1]" + "": pot_scale * dUdT_av / self.param.Delta_T, } ) @@ -106,7 +105,7 @@ def _get_standard_size_distribution_ocp_variables(self, ocp, dUdT): """ Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name # X-average or broadcast to electrode if necessary if ocp.domains["secondary"] != [f"{domain} electrode"]: @@ -122,28 +121,31 @@ def _get_standard_size_distribution_ocp_variables(self, ocp, dUdT): dUdT_av = pybamm.x_average(dUdT) pot_scale = self.param.potential_scale - Delta_T = self.param.Delta_T - ocp_dim = self.domain_param.U_ref + pot_scale * ocp - ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av + ocp_dim = self.phase_param.U_ref + pot_scale * ocp + ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av variables = { - f"{Domain} electrode{rxn} open circuit potential distribution": ocp, - f"{Domain} electrode{rxn} open circuit potential distribution [V]": ocp_dim, - f"X-averaged {domain} electrode{rxn} " + f"{Domain} electrode {reaction_name}" + "open circuit potential distribution": ocp, + f"{Domain} electrode {reaction_name}" + "open circuit potential distribution [V]": ocp_dim, + f"X-averaged {domain} electrode {reaction_name}" "open circuit potential distribution": ocp_av, - f"X-averaged {domain} electrode{rxn} " + f"X-averaged {domain} electrode {reaction_name}" "open circuit potential distribution [V]": ocp_av_dim, } if self.reaction_name == "": variables.update( { f"{Domain} electrode entropic change (size-dependent)": dUdT, - f"{Domain} electrode entropic change" - " (size-dependent) [V.K-1]": pot_scale * dUdT / Delta_T, - f"X-averaged {domain} electrode entropic change" - " (size-dependent)": dUdT_av, - f"X-averaged {domain} electrode entropic change" - " (size-dependent) [V.K-1]": pot_scale * dUdT_av / Delta_T, + f"{Domain} electrode entropic change " + "(size-dependent) [V.K-1]": pot_scale * dUdT / self.param.Delta_T, + f"X-averaged {domain} electrode entropic change " + "(size-dependent)": dUdT_av, + f"X-averaged {domain} electrode entropic change " + "(size-dependent) [V.K-1]": pot_scale + * dUdT_av + / self.param.Delta_T, } ) diff --git a/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py new file mode 100644 index 0000000000..0405c8e455 --- /dev/null +++ b/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py @@ -0,0 +1,38 @@ +# +# Different OCPs for charge and discharge, based on current +# +import pybamm +from . import BaseOpenCircuitPotential + + +class CurrentSigmoidOpenCircuitPotential(BaseOpenCircuitPotential): + def get_coupled_variables(self, variables): + current = variables["Total current density"] + k = 100 + m_lith = pybamm.sigmoid(current, 0, k) # for lithation (current < 0) + m_delith = 1 - m_lith # for delithiation (current > 0) + + Domain = self.domain + phase_name = self.phase_name + + if self.reaction == "lithium-ion main": + T = variables[f"{Domain} electrode temperature"] + # Particle size distribution is not yet implemented + if self.options["particle size"] != "distribution": + c_s_surf = variables[ + f"{Domain} {phase_name}particle surface concentration" + ] + # If variable was broadcast, take only the orphan + if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( + T, pybamm.Broadcast + ): + c_s_surf = c_s_surf.orphans[0] + T = T.orphans[0] + + U_lith = self.phase_param.U(c_s_surf, T, "lithiation") + U_delith = self.phase_param.U(c_s_surf, T, "delithiation") + ocp = m_lith * U_lith + m_delith * U_delith + dUdT = self.phase_param.dUdT(c_s_surf) + + variables.update(self._get_standard_ocp_variables(ocp, dUdT)) + return variables diff --git a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py index 47382c671e..0fe0598811 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py @@ -8,13 +8,20 @@ class SingleOpenCircuitPotential(BaseOpenCircuitPotential): def get_coupled_variables(self, variables): Domain = self.domain - if self.reaction == "lithium-ion main": + domain = Domain.lower() + phase_name = self.phase_name + + if isinstance(self, pybamm.kinetics.NoReaction): + ocp = pybamm.Scalar(0) + dUdT = pybamm.Scalar(0) + elif self.reaction == "lithium-ion main": + T = variables[f"{Domain} electrode temperature"] # For "particle-size distribution" models, take distribution version # of c_s_surf that depends on particle size. if self.options["particle size"] == "distribution": c_s_surf = variables[ - f"{Domain} particle surface concentration distribution" + f"{Domain} {phase_name}particle surface concentration distribution" ] # If variable was broadcast, take only the orphan if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( @@ -22,10 +29,11 @@ def get_coupled_variables(self, variables): ): c_s_surf = c_s_surf.orphans[0] T = T.orphans[0] - T = pybamm.PrimaryBroadcast(T, [self.domain.lower() + " particle size"]) + T = pybamm.PrimaryBroadcast(T, [f"{domain} particle size"]) else: - c_s_surf = variables[f"{Domain} particle surface concentration"] - + c_s_surf = variables[ + f"{Domain} {phase_name}particle surface concentration" + ] # If variable was broadcast, take only the orphan if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( T, pybamm.Broadcast @@ -33,18 +41,18 @@ def get_coupled_variables(self, variables): c_s_surf = c_s_surf.orphans[0] T = T.orphans[0] - ocp = self.domain_param.U(c_s_surf, T) - dUdT = self.domain_param.dUdT(c_s_surf) + ocp = self.phase_param.U(c_s_surf, T) + dUdT = self.phase_param.dUdT(c_s_surf) elif self.reaction == "lithium metal plating": T = variables[f"{Domain} electrode temperature"] - ocp = self.param.n.U_ref + ocp = self.param.n.prim.U_ref dUdT = 0 * T elif self.reaction == "lead-acid main": c_e = variables[f"{Domain} electrolyte concentration"] # If c_e was broadcast, take only the orphan if isinstance(c_e, pybamm.Broadcast): c_e = c_e.orphans[0] - ocp = self.domain_param.U(c_e, self.param.T_init) + ocp = self.phase_param.U(c_e, self.param.T_init) dUdT = pybamm.Scalar(0) elif self.reaction == "lead-acid oxygen": diff --git a/pybamm/models/submodels/interface/sei/base_sei.py b/pybamm/models/submodels/interface/sei/base_sei.py index 40c39556b1..2a81647dbf 100644 --- a/pybamm/models/submodels/interface/sei/base_sei.py +++ b/pybamm/models/submodels/interface/sei/base_sei.py @@ -44,9 +44,6 @@ def get_coupled_variables(self, variables): "Positive electrode SEI interfacial current density": zero, } ) - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) return variables @@ -151,10 +148,14 @@ def _get_standard_concentration_variables(self, variables): else: # scales in mol/m3 (n is a bulk quantity) n_scale = ( - param.L_sei_0_dim * param.n.a_typ / param.V_bar_inner_dimensional + param.L_sei_0_dim + * param.n.prim.a_typ + / param.V_bar_inner_dimensional ) n_outer_scale = ( - param.L_sei_0_dim * param.n.a_typ / param.V_bar_outer_dimensional + param.L_sei_0_dim + * param.n.prim.a_typ + / param.V_bar_outer_dimensional ) v_bar = param.v_bar # Set scales for the "EC Reaction Limited" model @@ -228,7 +229,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): variables : dict The variables which can be derived from the SEI thicknesses. """ - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale j_i_av = pybamm.x_average(j_inner) j_o_av = pybamm.x_average(j_outer) @@ -252,7 +253,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): def _get_standard_total_reaction_variables(self, j_sei): """Update variables related to total SEI interfacial current density.""" - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale variables = { "SEI interfacial current density": j_sei, diff --git a/pybamm/models/submodels/particle/base_particle.py b/pybamm/models/submodels/particle/base_particle.py index e7d839fbeb..b9e5617b18 100644 --- a/pybamm/models/submodels/particle/base_particle.py +++ b/pybamm/models/submodels/particle/base_particle.py @@ -17,12 +17,14 @@ class BaseParticle(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options=None): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, options=None, phase=None): + super().__init__(param, domain, options=options, phase=phase) def _get_standard_concentration_variables( self, c_s, c_s_xav=None, c_s_rav=None, c_s_av=None, c_s_surf=None @@ -36,13 +38,16 @@ def _get_standard_concentration_variables( passed as keyword arguments, the various average concentrations and surface concentration are computed automatically from the particle concentration. """ + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name # Get surface concentration if not provided as fundamental variable to # solve for c_s_surf = c_s_surf or pybamm.surf(c_s) c_s_surf_av = pybamm.x_average(c_s_surf) - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max # Get average concentration(s) if not provided as fundamental variable to # solve for @@ -51,96 +56,81 @@ def _get_standard_concentration_variables( c_s_av = c_s_av or pybamm.r_average(c_s_xav) variables = { - self.domain + " particle concentration": c_s, - self.domain + " particle concentration [mol.m-3]": c_s * c_scale, - self.domain + " particle concentration [mol.m-3]": c_s * c_scale, - "X-averaged " + self.domain.lower() + " particle concentration": c_s_xav, - "X-averaged " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_xav * c_scale, - "R-averaged " + self.domain.lower() + " particle concentration": c_s_rav, - "R-averaged " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_rav * c_scale, - "Average " + self.domain.lower() + " particle concentration": c_s_av, - "Average " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_av * c_scale, - self.domain + " particle surface concentration": c_s_surf, - self.domain - + " particle surface concentration [mol.m-3]": c_scale * c_s_surf, - "X-averaged " - + self.domain.lower() - + " particle surface concentration": c_s_surf_av, - "X-averaged " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": c_scale * c_s_surf_av, - self.domain + " electrode extent of lithiation": c_s_rav, - "X-averaged " - + self.domain.lower() - + " electrode extent of lithiation": c_s_av, - "Minimum " - + self.domain.lower() - + " particle concentration": pybamm.min(c_s), - "Maximum " - + self.domain.lower() - + " particle concentration": pybamm.max(c_s), - "Minimum " - + self.domain.lower() - + " particle concentration [mol.m-3]": pybamm.min(c_s) * c_scale, - "Maximum " - + self.domain.lower() - + " particle concentration [mol.m-3]": pybamm.max(c_s) * c_scale, - "Minimum " - + self.domain.lower() - + " particle surface concentration": pybamm.min(c_s_surf), - "Maximum " - + self.domain.lower() - + " particle surface concentration": pybamm.max(c_s_surf), - "Minimum " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": pybamm.min(c_s_surf) + f"{Domain} {phase_name}particle concentration": c_s, + f"{Domain} {phase_name}particle concentration [mol.m-3]": c_s * c_scale, + f"{Domain} {phase_name}particle concentration [mol.m-3]": c_s * c_scale, + f"X-averaged {domain} {phase_name}particle concentration": c_s_xav, + f"X-averaged {domain} {phase_name}particle concentration [mol.m-3]": c_s_xav * c_scale, - "Maximum " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": pybamm.max(c_s_surf) + f"R-averaged {domain} {phase_name}particle concentration": c_s_rav, + f"R-averaged {domain} {phase_name}particle concentration [mol.m-3]": c_s_rav * c_scale, + f"Average {domain} {phase_name}particle concentration": c_s_av, + f"Average {domain} {phase_name}particle concentration [mol.m-3]": c_s_av + * c_scale, + f"{Domain} {phase_name}particle " "surface concentration": c_s_surf, + f"{Domain} particle surface concentration [mol.m-3]": c_scale * c_s_surf, + f"X-averaged {domain} {phase_name}particle " + "surface concentration": c_s_surf_av, + f"X-averaged {domain} {phase_name}particle " + "surface concentration [mol.m-3]": c_scale * c_s_surf_av, + f"{Domain} electrode extent of lithiation": c_s_rav, + f"X-averaged {domain} electrode extent of lithiation": c_s_av, + f"Minimum {domain} {phase_name}particle concentration": pybamm.min(c_s), + f"Maximum {domain} {phase_name}particle concentration": pybamm.max(c_s), + f"Minimum {domain} {phase_name}particle concentration [mol.m-3]" + "": pybamm.min(c_s) * c_scale, + f"Maximum {domain} {phase_name}particle concentration [mol.m-3]" + "": pybamm.max(c_s) * c_scale, + f"Minimum {domain} {phase_name}particle " + "surface concentration": pybamm.min(c_s_surf), + f"Maximum {domain} {phase_name}particle " + "surface concentration": pybamm.max(c_s_surf), + f"Minimum {domain} {phase_name}particle " + "surface concentration [mol.m-3]": pybamm.min(c_s_surf) * c_scale, + f"Maximum {domain} {phase_name}particle " + "surface concentration [mol.m-3]": pybamm.max(c_s_surf) * c_scale, } return variables def _get_total_concentration_variables(self, variables): - c_s_rav = variables[ - "R-averaged " + self.domain.lower() + " particle concentration" + Domain = self.domain + domain = Domain.lower() + phase = self.phase + phase_name = self.phase_name + + c_s_rav = variables[f"R-averaged {domain} {phase_name}particle concentration"] + eps_s = variables[ + f"{Domain} electrode {phase_name}active material volume fraction" ] - eps_s = variables[self.domain + " electrode active material volume fraction"] eps_s_av = pybamm.x_average(eps_s) c_s_vol_av = pybamm.x_average(eps_s * c_s_rav) / eps_s_av - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max L = self.domain_param.L A = self.param.A_cc variables.update( { - self.domain + " electrode SOC": c_s_vol_av, - self.domain + " electrode volume-averaged concentration": c_s_vol_av, - self.domain - + " electrode " - + "volume-averaged concentration [mol.m-3]": c_s_vol_av * c_scale, - "Total lithium in " - + self.domain.lower() - + " electrode [mol]": pybamm.yz_average(c_s_vol_av * eps_s_av) - * c_scale - * L - * A, + f"{Domain} electrode {phase_name}SOC": c_s_vol_av, + f"{Domain} electrode {phase_name}volume-averaged " + "concentration": c_s_vol_av, + f"{Domain} electrode {phase_name}volume-averaged " + "concentration [mol.m-3]": c_s_vol_av * c_scale, + f"Total lithium in {phase} phase in {domain} electrode [mol]" + "": pybamm.yz_average(c_s_vol_av * eps_s_av) * c_scale * L * A, } ) return variables def _get_standard_flux_variables(self, N_s, N_s_xav): + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + variables = { - self.domain + " particle flux": N_s, - "X-averaged " + self.domain.lower() + " particle flux": N_s_xav, + f"{Domain} {phase_name}particle flux": N_s, + f"X-averaged {domain} {phase_name}particle flux": N_s_xav, } return variables diff --git a/pybamm/models/submodels/particle/no_distribution/base_fickian.py b/pybamm/models/submodels/particle/no_distribution/base_fickian.py index 93a11fead0..d865d59c6f 100644 --- a/pybamm/models/submodels/particle/no_distribution/base_fickian.py +++ b/pybamm/models/submodels/particle/no_distribution/base_fickian.py @@ -18,19 +18,22 @@ class BaseFickian(BaseParticle): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def _get_effective_diffusivity(self, c, T): param = self.param domain_param = self.domain_param + phase_param = self.phase_param # Get diffusivity - D = domain_param.D(c, T) + D = phase_param.D(c, T) # Account for stress-induced diffusion by defining a multiplicative # "stress factor" @@ -48,17 +51,18 @@ def _get_effective_diffusivity(self, c, T): return D * stress_factor def _get_standard_diffusivity_variables(self, D_eff): - D_scale = self.domain_param.D_typ_dim + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + D_scale = self.phase_param.D_typ_dim variables = { - self.domain + " effective diffusivity": D_eff, - self.domain + " effective diffusivity [m2.s-1]": D_eff * D_scale, - "X-averaged " - + self.domain.lower() - + " effective diffusivity": pybamm.x_average(D_eff), - "X-averaged " - + self.domain.lower() - + " effective diffusivity [m2.s-1]": pybamm.x_average(D_eff * D_scale), + f"{Domain} {phase_name}effective diffusivity": D_eff, + f"{Domain} {phase_name}effective diffusivity [m2.s-1]": D_eff * D_scale, + f"X-averaged {domain} {phase_name}effective " + "diffusivity": pybamm.x_average(D_eff), + f"X-averaged {domain} {phase_name}effective " + "diffusivity [m2.s-1]": pybamm.x_average(D_eff * D_scale), } return variables diff --git a/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py b/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py index dfb60b7d27..202ae4f4d6 100644 --- a/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py @@ -20,29 +20,37 @@ class FickianDiffusion(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): - if self.domain == "Negative": - c_s = pybamm.standard_variables.c_s_n - - elif self.domain == "Positive": - c_s = pybamm.standard_variables.c_s_p + domain = self.domain.lower() + + c_s = pybamm.Variable( + f"{self.domain} {self.phase_name}particle concentration", + domain=f"{domain} {self.phase_name}particle", + auxiliary_domains={ + "secondary": f"{domain} electrode", + "tertiary": "current collector", + }, + bounds=(0, 1), + ) variables = self._get_standard_concentration_variables(c_s) return variables def get_coupled_variables(self, variables): - c_s = variables[self.domain + " particle concentration"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] T = pybamm.PrimaryBroadcast( - variables[self.domain + " electrode temperature"], - [self.domain.lower() + " particle"], + variables[f"{self.domain} electrode temperature"], + [f"{self.domain.lower()} {self.phase_name}particle"], ) D_eff = self._get_effective_diffusivity(c_s, T) @@ -55,26 +63,28 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - c_s = variables[self.domain + " particle concentration"] - N_s = variables[self.domain + " particle flux"] - R = variables[self.domain + " particle radius"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + N_s = variables[f"{self.domain} {self.phase_name}particle flux"] + R = variables[f"{self.domain} {self.phase_name}particle radius"] - self.rhs = {c_s: -(1 / (R ** 2 * self.domain_param.C_diff)) * pybamm.div(N_s)} + self.rhs = {c_s: -(1 / (R ** 2 * self.phase_param.C_diff)) * pybamm.div(N_s)} def set_boundary_conditions(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param - c_s = variables[self.domain + " particle concentration"] - D_eff = variables[self.domain + " effective diffusivity"] - j = variables[self.domain + " electrode interfacial current density"] - R = variables[self.domain + " particle radius"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + D_eff = variables[f"{self.domain} {self.phase_name}effective diffusivity"] + j = variables[ + f"{self.domain} electrode {self.phase_name}interfacial current density" + ] + R = variables[f"{self.domain} {self.phase_name}particle radius"] rbc = ( - -domain_param.C_diff + -phase_param.C_diff * j * R - / domain_param.a_R - / domain_param.gamma + / phase_param.a_R + / phase_param.gamma / pybamm.surf(D_eff) ) @@ -83,6 +93,6 @@ def set_boundary_conditions(self, variables): } def set_initial_conditions(self, variables): - c_s = variables[self.domain + " particle concentration"] - c_init = self.domain_param.c_init + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + c_init = self.phase_param.c_init self.initial_conditions = {c_s: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py b/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py index e3e083d2fd..a497ee0a92 100644 --- a/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py +++ b/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py @@ -24,6 +24,8 @@ class PolynomialProfile(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -34,8 +36,8 @@ class PolynomialProfile(BaseFickian): **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, name, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, name, options, phase): + super().__init__(param, domain, options, phase) self.name = name pybamm.citations.register("Subramanian2005") @@ -187,7 +189,7 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_rav = variables[ "R-averaged " + self.domain.lower() + " particle concentration" @@ -195,7 +197,7 @@ def set_rhs(self, variables): j = variables[self.domain + " electrode interfacial current density"] R = variables[self.domain + " particle radius"] - self.rhs = {c_s_rav: -3 * j / domain_param.a_R / domain_param.gamma / R} + self.rhs = {c_s_rav: -3 * j / phase_param.a_R / phase_param.gamma / R} if self.name == "quartic profile": # We solve an extra ODE for the average particle flux @@ -212,13 +214,13 @@ def set_rhs(self, variables): q_s_rav: -30 * pybamm.r_average(D_eff) * q_s_rav - / domain_param.C_diff - - 45 * j / domain_param.a_R / domain_param.gamma / 2 + / phase_param.C_diff + - 45 * j / phase_param.a_R / phase_param.gamma / 2 } ) def set_algebraic(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_surf = variables[self.domain + " particle surface concentration"] c_s_rav = variables[ @@ -235,8 +237,7 @@ def set_algebraic(self, variables): # We solve an algebraic equation for the surface concentration self.algebraic = { c_s_surf: pybamm.surf(D_eff) * (c_s_surf - c_s_rav) - + domain_param.C_diff - * (j * R / domain_param.a_R / domain_param.gamma / 5) + + phase_param.C_diff * (j * R / phase_param.a_R / phase_param.gamma / 5) } elif self.name == "quartic profile": @@ -247,7 +248,7 @@ def set_algebraic(self, variables): ] self.algebraic = { c_s_surf: pybamm.surf(D_eff) * (35 * (c_s_surf - c_s_rav) - 8 * q_s_rav) - + domain_param.C_diff * (j * R / domain_param.a_R / domain_param.gamma) + + phase_param.C_diff * (j * R / phase_param.a_R / phase_param.gamma) } def set_initial_conditions(self, variables): @@ -255,7 +256,7 @@ def set_initial_conditions(self, variables): "R-averaged " + self.domain.lower() + " particle concentration" ] - c_init = pybamm.r_average(self.domain_param.c_init) + c_init = pybamm.r_average(self.phase_param.c_init) self.initial_conditions = {c_s_rav: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py b/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py index cf05401b45..cb8d5e0978 100644 --- a/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py +++ b/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py @@ -21,42 +21,43 @@ class XAveragedFickianDiffusion(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): - if self.domain == "Negative": - c_s_xav = pybamm.standard_variables.c_s_n_xav - c_s = pybamm.SecondaryBroadcast(c_s_xav, ["negative electrode"]) - - elif self.domain == "Positive": - c_s_xav = pybamm.standard_variables.c_s_p_xav - c_s = pybamm.SecondaryBroadcast(c_s_xav, ["positive electrode"]) - + domain = self.domain.lower() + c_s_xav = pybamm.Variable( + f"X-averaged {domain} {self.phase_name}particle concentration", + domain=f"{domain} {self.phase_name}particle", + auxiliary_domains={"secondary": "current collector"}, + bounds=(0, 1), + ) + c_s = pybamm.SecondaryBroadcast(c_s_xav, [f"{domain} electrode"]) variables = self._get_standard_concentration_variables(c_s, c_s_xav=c_s_xav) return variables def get_coupled_variables(self, variables): - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] + domain = self.domain.lower() + phase_name = self.phase_name + + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] T_xav = pybamm.PrimaryBroadcast( - variables["X-averaged " + self.domain.lower() + " electrode temperature"], - [self.domain.lower() + " particle"], + variables[f"X-averaged {domain} electrode temperature"], + [f"{domain} {phase_name}particle"], ) D_eff_xav = self._get_effective_diffusivity(c_s_xav, T_xav) N_s_xav = -D_eff_xav * pybamm.grad(c_s_xav) - D_eff = pybamm.SecondaryBroadcast( - D_eff_xav, [self._domain.lower() + " electrode"] - ) - N_s = pybamm.SecondaryBroadcast(N_s_xav, [self._domain.lower() + " electrode"]) + D_eff = pybamm.SecondaryBroadcast(D_eff_xav, [f"{domain} electrode"]) + N_s = pybamm.SecondaryBroadcast(N_s_xav, [f"{domain} electrode"]) variables.update(self._get_standard_flux_variables(N_s, N_s_xav)) variables.update(self._get_standard_diffusivity_variables(D_eff)) @@ -65,33 +66,28 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] - N_s_xav = variables["X-averaged " + self.domain.lower() + " particle flux"] + domain = self.domain.lower() + phase_name = self.phase_name + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] + N_s_xav = variables[f"X-averaged {domain} {phase_name}particle flux"] - self.rhs = {c_s_xav: -(1 / self.domain_param.C_diff) * pybamm.div(N_s_xav)} + self.rhs = {c_s_xav: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_xav)} def set_boundary_conditions(self, variables): - domain_param = self.domain_param - - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] - D_eff_xav = variables[ - "X-averaged " + self.domain.lower() + " effective diffusivity" - ] + phase_param = self.phase_param + domain = self.domain.lower() + phase_name = self.phase_name + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] + D_eff_xav = variables[f"X-averaged {domain} {phase_name}effective diffusivity"] j_xav = variables[ - "X-averaged " - + self.domain.lower() - + " electrode interfacial current density" + f"X-averaged {domain} electrode {phase_name}interfacial current density" ] rbc = ( - -domain_param.C_diff + -phase_param.C_diff * j_xav - / domain_param.a_R - / domain_param.gamma + / phase_param.a_R + / phase_param.gamma / pybamm.surf(D_eff_xav) ) @@ -104,10 +100,11 @@ def set_initial_conditions(self, variables): For single or x-averaged particle models, initial conditions can't depend on x so we take the x-average of the supplied initial conditions. """ - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] + domain = self.domain.lower() + phase_name = self.phase_name + + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] - c_init = pybamm.x_average(self.domain_param.c_init) + c_init = pybamm.x_average(self.phase_param.c_init) self.initial_conditions = {c_s_xav: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py b/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py index 22a1abd91e..6efb566266 100644 --- a/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py +++ b/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py @@ -23,6 +23,8 @@ class XAveragedPolynomialProfile(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -33,8 +35,8 @@ class XAveragedPolynomialProfile(BaseFickian): **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, name, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, name, options, phase): + super().__init__(param, domain, options, phase) self.name = name pybamm.citations.register("Subramanian2005") @@ -72,7 +74,7 @@ def get_fundamental_variables(self): return variables def get_coupled_variables(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] T_av = variables["X-averaged " + self.domain.lower() + " electrode temperature"] @@ -109,8 +111,8 @@ def get_coupled_variables(self, variables): # an extra algebraic equation to solve. For now, using the average c is an # ok approximation and means the SPM(e) still gives a system of ODEs rather # than DAEs. - c_s_surf_xav = c_s_av - domain_param.C_diff * ( - j_xav / 5 / domain_param.a_R / domain_param.gamma / D_eff_av + c_s_surf_xav = c_s_av - phase_param.C_diff * ( + j_xav / 5 / phase_param.a_R / phase_param.gamma / D_eff_av ) elif self.name == "quartic profile": # The surface concentration is computed from the average concentration, @@ -122,8 +124,8 @@ def get_coupled_variables(self, variables): c_s_surf_xav = ( c_s_av + 8 * q_s_av / 35 - - domain_param.C_diff - * (j_xav / 35 / domain_param.a_R / domain_param.gamma / D_eff_av) + - phase_param.C_diff + * (j_xav / 35 / phase_param.a_R / phase_param.gamma / D_eff_av) ) # Set concentration depending on polynomial order @@ -215,7 +217,7 @@ def set_rhs(self, variables): # the scalar source term gets multplied by the correct mass matrix when # using this model with 2D current collectors with the finite element # method (see #1399) - domain_param = self.domain_param + phase_param = self.phase_param c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] j_xav = variables[ @@ -226,7 +228,7 @@ def set_rhs(self, variables): self.rhs = { c_s_av: pybamm.source( - -3 * j_xav / domain_param.a_R / domain_param.gamma, c_s_av + -3 * j_xav / phase_param.a_R / phase_param.gamma, c_s_av ) } @@ -242,8 +244,8 @@ def set_rhs(self, variables): self.rhs.update( { q_s_av: pybamm.source( - -30 * pybamm.surf(D_eff_xav) * q_s_av / domain_param.C_diff - - 45 * j_xav / domain_param.a_R / domain_param.gamma / 2, + -30 * pybamm.surf(D_eff_xav) * q_s_av / phase_param.C_diff + - 45 * j_xav / phase_param.a_R / phase_param.gamma / 2, q_s_av, ) } @@ -256,7 +258,7 @@ def set_initial_conditions(self, variables): """ c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] - c_init = pybamm.x_average(pybamm.r_average(self.domain_param.c_init)) + c_init = pybamm.x_average(pybamm.r_average(self.phase_param.c_init)) self.initial_conditions = {c_s_av: c_init} if self.name == "quartic profile": diff --git a/pybamm/models/submodels/particle/size_distribution/base_distribution.py b/pybamm/models/submodels/particle/size_distribution/base_distribution.py index 83f4b071f8..edcd1038c2 100644 --- a/pybamm/models/submodels/particle/size_distribution/base_distribution.py +++ b/pybamm/models/submodels/particle/size_distribution/base_distribution.py @@ -21,7 +21,7 @@ class BaseSizeDistribution(BaseParticle): """ def __init__(self, param, domain): - super().__init__(param, domain) + super().__init__(param, domain, phase="primary") def _get_distribution_variables(self, R): """ @@ -29,9 +29,9 @@ def _get_distribution_variables(self, R): R. The domains of R will be different depending on the submodel, e.g. for the `SingleSizeDistribution` classes R does not have an "electrode" domain. """ - R_typ = self.domain_param.R_typ + R_typ = self.phase_param.R_typ # Particle-size distribution (area-weighted) - f_a_dist = self.domain_param.f_a_dist(R) + f_a_dist = self.phase_param.f_a_dist(R) # Ensure the distribution is normalised, irrespective of discretisation # or user input @@ -151,7 +151,7 @@ def _get_standard_concentration_distribution_variables(self, c_s): Forms standard concentration variables that depend on particle size R given the fundamental concentration distribution variable c_s from the submodel. """ - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max # Broadcast and x-average when necessary if c_s.domain == [self.domain.lower() + " particle size"] and c_s.domains[ "secondary" diff --git a/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py b/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py index 29b062b6f7..28fdf063df 100644 --- a/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py @@ -80,10 +80,10 @@ def get_coupled_variables(self, variables): [self.domain.lower() + " particle"], ) - N_s_distribution = -self.domain_param.D(c_s_distribution, T_k) * pybamm.grad( + N_s_distribution = -self.phase_param.D(c_s_distribution, T_k) * pybamm.grad( c_s_distribution ) - f_a_dist = self.domain_param.f_a_dist(R) + f_a_dist = self.phase_param.f_a_dist(R) # Size-dependent flux variables variables.update( @@ -109,7 +109,7 @@ def set_rhs(self, variables): ) self.rhs = { - c_s_distribution: -(1 / self.domain_param.C_diff) + c_s_distribution: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_distribution) / R ** 2 } @@ -133,12 +133,12 @@ def set_boundary_conditions(self, variables): # Set surface Neumann boundary values rbc = ( - -self.domain_param.C_diff + -self.phase_param.C_diff * R * j_distribution - / self.domain_param.a_R - / self.domain_param.gamma - / self.domain_param.D(c_s_surf_distribution, T_k) + / self.phase_param.a_R + / self.phase_param.gamma + / self.phase_param.D(c_s_surf_distribution, T_k) ) self.boundary_conditions = { c_s_distribution: { @@ -153,7 +153,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.SecondaryBroadcast( - self.domain_param.c_init, f"{self.domain.lower()} particle size" + self.phase_param.c_init, f"{self.domain.lower()} particle size" ) self.initial_conditions = {c_s_distribution: c_init} diff --git a/pybamm/models/submodels/particle/size_distribution/uniform_profile.py b/pybamm/models/submodels/particle/size_distribution/uniform_profile.py index fd1581ed76..3fb734e6a0 100644 --- a/pybamm/models/submodels/particle/size_distribution/uniform_profile.py +++ b/pybamm/models/submodels/particle/size_distribution/uniform_profile.py @@ -105,8 +105,8 @@ def set_rhs(self, variables): self.rhs = { c_s_surf_distribution: -3 * j_distribution - / self.domain_param.a_R - / self.domain_param.gamma + / self.phase_param.a_R + / self.phase_param.gamma / R } @@ -116,7 +116,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.PrimaryBroadcast( - pybamm.r_average(self.domain_param.c_init), + pybamm.r_average(self.phase_param.c_init), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py b/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py index 15d727cbd9..68ee2053ce 100644 --- a/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py +++ b/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py @@ -110,14 +110,9 @@ def get_coupled_variables(self, variables): [self.domain.lower() + " particle"], ) - if self.domain == "Negative": - N_s_xav_distribution = -self.param.n.D( - c_s_xav_distribution, T_k_xav - ) * pybamm.grad(c_s_xav_distribution) - elif self.domain == "Positive": - N_s_xav_distribution = -self.param.p.D( - c_s_xav_distribution, T_k_xav - ) * pybamm.grad(c_s_xav_distribution) + N_s_xav_distribution = -self.phase_param.D( + c_s_xav_distribution, T_k_xav + ) * pybamm.grad(c_s_xav_distribution) # Size-dependent flux variables variables.update( @@ -158,7 +153,7 @@ def set_rhs(self, variables): [self.domain.lower() + " particle"], ) self.rhs = { - c_s_xav_distribution: -(1 / self.domain_param.C_diff) + c_s_xav_distribution: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_xav_distribution) / R ** 2 } @@ -190,12 +185,12 @@ def set_boundary_conditions(self, variables): # Set surface Neumann boundary values rbc = ( - -self.domain_param.C_diff + -self.phase_param.C_diff * R * j_xav_distribution - / self.domain_param.a_R - / self.domain_param.gamma - / self.domain_param.D(c_s_surf_xav_distribution, T_k_xav) + / self.phase_param.a_R + / self.phase_param.gamma + / self.phase_param.D(c_s_surf_xav_distribution, T_k_xav) ) self.boundary_conditions = { @@ -218,7 +213,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.SecondaryBroadcast( - pybamm.x_average(self.domain_param.c_init), + pybamm.x_average(self.phase_param.c_init), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py b/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py index b60e18e5cf..1fae597027 100644 --- a/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py +++ b/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py @@ -120,8 +120,8 @@ def set_rhs(self, variables): self.rhs = { c_s_surf_xav_distribution: -3 * j_xav_distribution - / self.domain_param.a_R - / self.domain_param.gamma + / self.phase_param.a_R + / self.phase_param.gamma / R } @@ -140,7 +140,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.PrimaryBroadcast( - pybamm.x_average(pybamm.r_average(self.domain_param.c_init)), + pybamm.x_average(pybamm.r_average(self.phase_param.c_init)), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle_mechanics/base_mechanics.py b/pybamm/models/submodels/particle_mechanics/base_mechanics.py index 09867b231c..486890eb16 100644 --- a/pybamm/models/submodels/particle_mechanics/base_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/base_mechanics.py @@ -64,13 +64,13 @@ def _get_mechanical_results(self, variables): cell_thickness_change = variables["Cell thickness change [m]"] Omega = domain_param.Omega - R0 = domain_param.R - c_scale = domain_param.c_max + R0 = domain_param.prim.R + c_scale = domain_param.prim.c_max c_0 = domain_param.c_0 E0 = domain_param.E nu = domain_param.nu L0 = domain_param.L - c_init = pybamm.r_average(domain_param.c_init) + c_init = pybamm.r_average(domain_param.prim.c_init) v_change = pybamm.x_average( eps_s * domain_param.t_change(c_s_rav) ) - pybamm.x_average(eps_s * domain_param.t_change(c_init)) @@ -131,7 +131,7 @@ def _get_standard_surface_variables(self, variables): """ l_cr = variables[self.domain + " particle crack length"] a0 = variables[self.domain + " electrode surface area to volume ratio"] - R0 = self.domain_param.R + R0 = self.domain_param.prim.R rho_cr = self.domain_param.rho_cr roughness = l_cr * 2 * rho_cr + 1 # the ratio of cracks to normal surface a_cr = (roughness - 1) * a0 # normalised crack surface area diff --git a/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py b/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py index 989fccc237..e3c5972978 100644 --- a/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py +++ b/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py @@ -11,7 +11,7 @@ class BaseModel(pybamm.BaseSubModel): ---------- param : parameter class The parameters to use for this submodel - phase : str + component : str The material for the model ('electrolyte' or 'electrode'). options : dict, optional A dictionary of options to be passed to the model. @@ -19,9 +19,9 @@ class BaseModel(pybamm.BaseSubModel): **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, phase, options=None): + def __init__(self, param, component, options=None): super().__init__(param, options=options) - self.phase = phase + self.component = component def _get_standard_transport_efficiency_variables( self, tor_n, tor_s, tor_p, set_leading_order=False @@ -29,24 +29,22 @@ def _get_standard_transport_efficiency_variables( tor = pybamm.concatenation(tor_n, tor_s, tor_p) variables = { - self.phase + " transport efficiency": tor, - "Positive " + self.phase.lower() + " transport efficiency": tor_p, - "X-averaged positive " - + self.phase.lower() - + " transport efficiency": pybamm.x_average(tor_p), + f"{self.component} transport efficiency": tor, + f"Positive {self.component.lower()} transport efficiency": tor_p, + f"X-averaged positive {self.component.lower()} " + "transport efficiency": pybamm.x_average(tor_p), } if not self.half_cell: variables.update( { - "Negative " + self.phase.lower() + " transport efficiency": tor_n, - "X-averaged negative " - + self.phase.lower() - + " transport efficiency": pybamm.x_average(tor_n), + f"Negative {self.component.lower()} transport efficiency": tor_n, + f"X-averaged negative {self.component.lower()} " + "transport efficiency": pybamm.x_average(tor_n), } ) - if self.phase == "Electrolyte": + if self.component == "Electrolyte": variables.update( { "Separator transport efficiency": tor_s, diff --git a/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py b/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py index 2de6b0cc1e..c251ac6f20 100644 --- a/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py +++ b/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py @@ -13,7 +13,7 @@ class Bruggeman(BaseModel): ---------- param : parameter class The parameters to use for this submodel - phase : str + component : str The material for the model ('electrolyte' or 'electrode'). options : dict, optional A dictionary of options to be passed to the model. @@ -21,14 +21,14 @@ class Bruggeman(BaseModel): **Extends:** :class:`pybamm.transport_efficiency.BaseModel` """ - def __init__(self, param, phase, options=None, set_leading_order=False): - super().__init__(param, phase, options=options) + def __init__(self, param, component, options=None, set_leading_order=False): + super().__init__(param, component, options=options) self.set_leading_order = set_leading_order def get_coupled_variables(self, variables): param = self.param - if self.phase == "Electrolyte": + if self.component == "Electrolyte": if self.half_cell: tor_n = None else: @@ -39,7 +39,7 @@ def get_coupled_variables(self, variables): tor_s = eps_s ** param.s.b_e eps_p = variables["Positive electrode porosity"] tor_p = eps_p ** param.p.b_e - elif self.phase == "Electrode": + elif self.component == "Electrode": if self.half_cell: tor_n = None else: diff --git a/pybamm/parameters/base_parameters.py b/pybamm/parameters/base_parameters.py index eac99b321b..13f3c41e04 100644 --- a/pybamm/parameters/base_parameters.py +++ b/pybamm/parameters/base_parameters.py @@ -22,10 +22,24 @@ def __getattribute__(self, name): name_without_domain = name.replace(f"_{domain}_", "_").replace( f"_{domain}", "" ) - raise AttributeError( - f"param.{name} does not exist. It may have been renamed to " - f"param.{domain}.{name_without_domain}" - ) + if hasattr(self, domain): + self_domain = getattr(self, domain) + if hasattr(self_domain, name_without_domain): + raise AttributeError( + f"param.{name} does not exist. It has been renamed to " + f"param.{domain}.{name_without_domain}" + ) + elif hasattr(self_domain, "prim") and hasattr( + self_domain.prim, name_without_domain + ): + raise AttributeError( + f"param.{name} does not exist. It has been renamed to " + f"param.{domain}.prim.{name_without_domain}" + ) + else: + raise e + else: + raise e raise e def __setattr__(self, name, value): @@ -37,3 +51,45 @@ def __setattr__(self, name, value): if isinstance(value, pybamm.Symbol): value.print_name = print_name super().__setattr__(name, value) + + @property + def options(self): + return self._options + + @options.setter + def options(self, extra_options): + self._options = pybamm.BatteryModelOptions(extra_options) + + def set_phase_name(self): + if ( + self.phase == "primary" + and getattr(self.main_param.options, self.domain.lower())["particle phases"] + == "1" + ): + # Only one phase, no need to distinguish between + # "primary" and "secondary" + self.phase_name = "" + self.phase_prefactor = "" + else: + # add a space so that we can use "" or (e.g.) "primary " interchangeably + # when naming variables + self.phase_name = self.phase + " " + self.phase_prefactor = self.phase.capitalize() + ": " + + +class NullParameters: + def __getattribute__(self, name): + "Returns 0 for some parameters that aren't found by __getattribute__" + if name in ["epsilon_s", "cap_init", "n_Li_init", "R_typ", "j_scale"]: + return pybamm.Scalar(0) + else: + return super().__getattribute__(name) + + def _set_dimensional_parameters(self): + pass + + def _set_scales(self): + pass + + def _set_dimensionless_parameters(self): + pass diff --git a/pybamm/parameters/geometric_parameters.py b/pybamm/parameters/geometric_parameters.py index a3967424ee..78668f2852 100644 --- a/pybamm/parameters/geometric_parameters.py +++ b/pybamm/parameters/geometric_parameters.py @@ -17,7 +17,8 @@ class GeometricParameters(BaseParameters): 5. Dimensionless Functions """ - def __init__(self): + def __init__(self, options=None): + self.options = options self.n = DomainGeometricParameters("Negative", self) self.s = DomainGeometricParameters("Separator", self) self.p = DomainGeometricParameters("Positive", self) @@ -79,15 +80,25 @@ def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param + if self.domain != "Separator": + self.prim = ParticleGeometricParameters(domain, "primary", main_param) + self.sec = ParticleGeometricParameters(domain, "secondary", main_param) + self.phases = [self.prim, self.sec] + else: + self.phases = [] + def _set_dimensional_parameters(self): """Defines the dimensional parameters.""" - Domain = self.domain + for phase in self.phases: + phase._set_dimensional_parameters() if self.domain == "Separator": self.L = pybamm.Parameter("Separator thickness [m]") self.b_e = pybamm.Parameter("Separator Bruggeman coefficient (electrolyte)") return + Domain = self.domain + # Macroscale geometry self.L_cc = pybamm.Parameter(f"{Domain} current collector thickness [m]") self.L = pybamm.Parameter(f"{Domain} electrode thickness [m]") @@ -99,12 +110,6 @@ def _set_dimensional_parameters(self): self.A_tab = self.L_tab * self.L_cc # Area of tab # Microscale geometry - # Note: for li-ion cells, the definition of the surface area to - # volume ratio is overwritten in lithium_ion_parameters.py to be computed - # based on the assumed particle shape - self.a_dim = pybamm.Parameter( - f"{Domain} electrode surface area to volume ratio [m-1]" - ) self.b_e = pybamm.Parameter( f"{Domain} electrode Bruggeman coefficient (electrolyte)" ) @@ -112,11 +117,55 @@ def _set_dimensional_parameters(self): f"{Domain} electrode Bruggeman coefficient (electrode)" ) + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + for phase in self.phases: + phase._set_scales() + + def _set_dimensionless_parameters(self): + """Defines the dimensionless parameters.""" + for phase in self.phases: + phase._set_dimensionless_parameters() + main = self.main_param + + # Macroscale Geometry + self.l = self.L / main.L_x + if self.domain == "Separator": + return + + self.l_cc = self.L_cc / main.L_x + + # Tab geometry (for pouch cells) + self.l_tab = self.L_tab / main.L_z + self.centre_y_tab = self.Centre_y_tab / main.L_z + self.centre_z_tab = self.Centre_z_tab / main.L_z + + +class ParticleGeometricParameters(BaseParameters): + def __init__(self, domain, phase, main_param): + self.domain = domain + self.phase = phase + self.main_param = main_param + self.set_phase_name() + + def _set_dimensional_parameters(self): + """Defines the dimensional parameters.""" + Domain = self.domain + pref = self.phase_prefactor + + # Microscale geometry + # Note: for li-ion cells, the definition of the surface area to + # volume ratio is overwritten in lithium_ion_parameters.py to be computed + # based on the assumed particle shape + self.a_dim = pybamm.Parameter( + f"{pref}{Domain} electrode surface area to volume ratio [m-1]" + ) + # Particle-size distribution geometry - self.R_min_dim = pybamm.Parameter(f"{Domain} minimum particle radius [m]") - self.R_max_dim = pybamm.Parameter(f"{Domain} maximum particle radius [m]") + self.R_min_dim = pybamm.Parameter(f"{pref}{Domain} minimum particle radius [m]") + self.R_max_dim = pybamm.Parameter(f"{pref}{Domain} maximum particle radius [m]") self.sd_a_dim = pybamm.Parameter( - f"{Domain} area-weighted particle-size standard deviation [m]" + f"{pref}{Domain} area-weighted particle-size standard deviation [m]" ) @property @@ -126,24 +175,23 @@ def R_dimensional(self): elif self.domain == "Positive": x = pybamm.standard_spatial_vars.x_p + inputs = {"Through-cell distance (x) [m]": x * self.main_param.L_x} return pybamm.FunctionParameter( - f"{self.domain} particle radius [m]", - {"Through-cell distance (x) [m]": x * self.main_param.L_x}, + f"{self.phase_prefactor}{self.domain} particle radius [m]", inputs ) def f_a_dist_dimensional(self, R): """ Dimensional electrode area-weighted particle-size distribution """ - inputs = {f"{self.domain} particle-size variable [m]": R} + inputs = {f"{self.phase_prefactor}{self.domain} particle-size variable [m]": R} return pybamm.FunctionParameter( - f"{self.domain} area-weighted particle-size distribution [m-1]", inputs + f"{self.phase_prefactor}{self.domain} area-weighted particle-size distribution [m-1]", + inputs, ) def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" - if self.domain == "Separator": - return # Microscale geometry # Note: these scales are necessary here to non-dimensionalise the # particle size distributions. @@ -151,20 +199,6 @@ def _set_scales(self): def _set_dimensionless_parameters(self): """Defines the dimensionless parameters.""" - main = self.main_param - - # Macroscale Geometry - self.l = self.L / main.L_x - if self.domain == "Separator": - return - - self.l_cc = self.L_cc / main.L_x - - # Tab geometry (for pouch cells) - self.l_tab = self.L_tab / main.L_z - self.centre_y_tab = self.Centre_y_tab / main.L_z - self.centre_z_tab = self.Centre_z_tab / main.L_z - # Particle-size distribution geometry self.R_min = self.R_min_dim / self.R_typ self.R_max = self.R_max_dim / self.R_typ diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index a244dbaa97..3d0fbee1ec 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -3,7 +3,7 @@ # import pybamm -from .base_parameters import BaseParameters +from .base_parameters import BaseParameters, NullParameters class LeadAcidParameters(BaseParameters): @@ -26,14 +26,10 @@ def __init__(self): self.elec = pybamm.electrical_parameters self.therm = pybamm.thermal_parameters - # Spatial variables - x_n = pybamm.standard_spatial_vars.x_n * self.geo.L_x - x_p = pybamm.standard_spatial_vars.x_p * self.geo.L_x - # Initialize domain parameters - self.n = DomainLeadAcidParameters("Negative", self, x_n) - self.s = DomainLeadAcidParameters("Separator", self, None) - self.p = DomainLeadAcidParameters("Positive", self, x_p) + self.n = DomainLeadAcidParameters("Negative", self) + self.s = DomainLeadAcidParameters("Separator", self) + self.p = DomainLeadAcidParameters("Positive", self) self.domain_params = [self.n, self.s, self.p] # Set parameters and scales @@ -154,7 +150,7 @@ def _set_dimensional_parameters(self): + self.p.L * self.p.eps_max ) / self.L_x - / (self.p.s_plus_S - self.n.s_plus_S) + / (self.p.prim.s_plus_S - self.n.prim.s_plus_S) ) self.Q_e_max_dimensional = self.Q_e_max * self.c_e_typ * self.F self.capacity = ( @@ -335,7 +331,7 @@ def _set_dimensionless_parameters(self): ) # Electrical - self.ocv_ref = self.p.U_ref - self.n.U_ref + self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref self.voltage_low_cut = ( self.voltage_low_cut_dimensional - self.ocv_ref ) / self.potential_scale @@ -370,15 +366,15 @@ def _set_dimensionless_parameters(self): for domain in self.domain_params: domain._set_dimensionless_parameters() - self.ocv_init = self.p.U_init - self.n.U_init + self.ocv_init = self.p.prim.U_init - self.n.prim.U_init # Concatenations self.s_plus_S = pybamm.concatenation( pybamm.FullBroadcast( - self.n.s_plus_S, ["negative electrode"], "current collector" + self.n.prim.s_plus_S, ["negative electrode"], "current collector" ), pybamm.FullBroadcast(0, ["separator"], "current collector"), pybamm.FullBroadcast( - self.p.s_plus_S, ["positive electrode"], "current collector" + self.p.prim.s_plus_S, ["positive electrode"], "current collector" ), ) self.beta_surf = pybamm.concatenation( @@ -449,14 +445,19 @@ def _set_input_current(self): class DomainLeadAcidParameters(BaseParameters): - def __init__(self, domain, main_param, x): + def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param self.geo = getattr(main_param.geo, domain.lower()[0]) self.therm = getattr(main_param.therm, domain.lower()[0]) - self.x = x + if domain != "Separator": + self.prim = PhaseLeadAcidParameters("primary", self) + else: + self.prim = NullParameters() + + self.phases = [self.prim] def _set_dimensional_parameters(self): Domain = self.domain @@ -468,6 +469,10 @@ def _set_dimensional_parameters(self): self.b_e = self.geo.b_e self.epsilon_inactive = pybamm.Scalar(0) return + + for phase in self.phases: + phase._set_dimensional_parameters() + # Macroscale geometry self.L = self.geo.L @@ -477,10 +482,6 @@ def _set_dimensional_parameters(self): self.xi = pybamm.Parameter(f"{Domain} electrode morphological parameter") # no binder self.epsilon_inactive = pybamm.Scalar(0) - self.a_dimensional = pybamm.FunctionParameter( - f"{Domain} electrode surface area to volume ratio [m-1]", - {"Through-cell distance (x) [m]": self.x}, - ) # Electrode properties if self.domain == "Negative": @@ -503,7 +504,10 @@ def _set_dimensional_parameters(self): self.Q_max_dimensional = pybamm.Parameter( f"{Domain} electrode volumetric capacity [C.m-3]" ) - self.epsilon_s = 1 - self.eps_max + + self.C_dl_dimensional = pybamm.Parameter( + f"{Domain} electrode double-layer capacity [F.m-2]" + ) # In lead-acid the current collector and electrodes are the same (same # conductivity) but we correct here for Bruggeman. Note that because for @@ -514,20 +518,6 @@ def _set_dimensional_parameters(self): self.sigma_dimensional(main.T_ref) * (1 - self.eps_max) ** self.b_s ) - # Electrochemical reactions - # Main - self.s_plus_S_dim = pybamm.Parameter( - f"{Domain} electrode cation signed stoichiometry" - ) - self.ne_S = pybamm.Parameter(f"{Domain} electrode electrons in reaction") - self.s_plus_S = self.s_plus_S_dim / self.ne_S - self.C_dl_dimensional = pybamm.Parameter( - f"{Domain} electrode double-layer capacity [F.m-2]" - ) - self.alpha_bv = pybamm.Parameter( - f"{Domain} electrode Butler-Volmer transfer coefficient" - ) - def sigma_dimensional(self, T): """Dimensional electrical conductivity""" inputs = {"Temperature [K]": T} @@ -535,44 +525,13 @@ def sigma_dimensional(self, T): f"{self.domain} electrode conductivity [S.m-1]", inputs ) - def U_dimensional(self, c_e, T): - """Dimensional open-circuit voltage [V]""" - inputs = { - "Electrolyte molar mass [mol.kg-1]": self.main_param.m_dimensional(c_e) - } - return pybamm.FunctionParameter( - f"{self.domain} electrode open-circuit potential [V]", inputs - ) - - def j0_dimensional(self, c_e, T): - """Dimensional exchange-current density [A.m-2]""" - inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode exchange-current density [A.m-2]", inputs - ) - - def j0_Ox_dimensional(self, c_e, T): - """Dimensional oxygen electrode exchange-current density [A.m-2]""" - inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode oxygen exchange-current density [A.m-2]", inputs - ) - def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" if self.domain == "Separator": return - # Microscale (typical values at electrode/current collector interface) - self.a_typ = pybamm.xyz_average(self.a_dimensional) - # Electrical - self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) - - # Reference OCP - inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} - self.U_ref = pybamm.FunctionParameter( - f"{self.domain} electrode open-circuit potential [V]", inputs - ) + for phase in self.phases: + phase._set_scales() def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" @@ -585,6 +544,9 @@ def _set_dimensionless_parameters(self): self.lambda_ = self.therm.lambda_ return + for phase in self.phases: + phase._set_dimensionless_parameters() + # Macroscale Geometry self.l = self.geo.l @@ -598,36 +560,36 @@ def _set_dimensionless_parameters(self): self.centre_z_tab = self.geo.centre_z_tab # Electrode Properties - self.a = self.a_dimensional / self.a_typ self.sigma_cc = ( self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x ) self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 - self.delta_pore = 1 / (self.a_typ * main.L_x) self.Q_max = self.Q_max_dimensional / (main.c_e_typ * main.F) self.beta_U = 1 / self.Q_max # Electrochemical reactions - # Main - self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale - ) - self.ne = self.ne_S # Oxygen - self.U_Ox = (main.U_Ox_dim - self.U_ref) / main.potential_scale - self.U_Hy = (main.U_Hy_dim - self.U_ref) / main.potential_scale + self.U_Ox = (main.U_Ox_dim - self.prim.U_ref) / main.potential_scale + self.U_Hy = (main.U_Hy_dim - self.prim.U_ref) / main.potential_scale # Electrolyte properties self.beta_surf = ( - -main.c_e_typ * self.DeltaVsurf / self.ne_S + -main.c_e_typ * self.DeltaVsurf / self.prim.ne_S ) # Molar volume change (lead) self.beta_liq = ( - -main.c_e_typ * self.DeltaVliq / self.ne_S + -main.c_e_typ * self.DeltaVliq / self.prim.ne_S ) # Molar volume change (electrolyte, neg) self.beta = (self.beta_surf + self.beta_liq) * pybamm.Parameter( "Volume change factor" ) + self.C_dl = ( + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale + ) + # Thermal self.rho_cc = self.therm.rho_cc self.rho = self.therm.rho @@ -647,8 +609,6 @@ def _set_dimensionless_parameters(self): ) self.curlyU_init = main.Q_e_max * (1.2 - main.q_init) / (self.Q_max * self.l) - self.U_init = self.U(main.c_e_init, main.T_init) - def sigma(self, T): """Dimensionless negative electrode electrical conductivity""" T_dim = self.main_param.Delta_T * T + self.main_param.T_ref @@ -663,6 +623,100 @@ def sigma_prime(self, T): """Rescaled dimensionless negative electrode electrical conductivity""" return self.sigma(T) * self.main_param.delta ** 2 + +class PhaseLeadAcidParameters(BaseParameters): + def __init__(self, phase, domain_param): + self.phase = phase + + self.domain_param = domain_param + self.domain = domain_param.domain + self.main_param = domain_param.main_param + self.geo = domain_param.geo.prim + + def _set_dimensional_parameters(self): + Domain = self.domain + domain = Domain.lower() + + # Microstructure + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * self.main_param.L_x + ) + self.a_dimensional = pybamm.FunctionParameter( + f"{Domain} electrode surface area to volume ratio [m-1]", + {"Through-cell distance (x) [m]": x}, + ) + + # Electrochemical reactions + # Main + self.s_plus_S_dim = pybamm.Parameter( + f"{Domain} electrode cation signed stoichiometry" + ) + self.ne_S = pybamm.Parameter(f"{Domain} electrode electrons in reaction") + self.s_plus_S = self.s_plus_S_dim / self.ne_S + self.alpha_bv = pybamm.Parameter( + f"{Domain} electrode Butler-Volmer transfer coefficient" + ) + + def U_dimensional(self, c_e, T): + """Dimensional open-circuit voltage [V]""" + inputs = { + "Electrolyte molar mass [mol.kg-1]": self.main_param.m_dimensional(c_e) + } + return pybamm.FunctionParameter( + f"{self.domain} electrode open-circuit potential [V]", inputs + ) + + def j0_dimensional(self, c_e, T): + """Dimensional exchange-current density [A.m-2]""" + inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode exchange-current density [A.m-2]", inputs + ) + + def j0_Ox_dimensional(self, c_e, T): + """Dimensional oxygen electrode exchange-current density [A.m-2]""" + inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode oxygen exchange-current density [A.m-2]", inputs + ) + + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + # Microscale (typical values at electrode/current collector interface) + self.a_typ = pybamm.xyz_average(self.a_dimensional) + + # Electrical + self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) + + # Reference OCP + inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} + self.U_ref = pybamm.FunctionParameter( + f"{self.domain} electrode open-circuit potential [V]", inputs + ) + + def _set_dimensionless_parameters(self): + """Defines the dimensionless parameters""" + main = self.main_param + + # Microstructure + self.a = self.a_dimensional / self.a_typ + self.delta_pore = 1 / (self.a_typ * main.L_x) + self.epsilon_s = 1 - self.domain_param.eps_max + + # Electrochemical reactions + # Main + self.ne = self.ne_S + + # Initial conditions + self.c_init = main.c_e_init + self.U_init = self.U(main.c_e_init, main.T_init) + def U(self, c_e, T): """Dimensionless open-circuit voltage in the negative electrode""" c_e_dimensional = c_e * self.main_param.c_e_typ diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 34bbf985e6..c681d63059 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -2,7 +2,7 @@ # Standard parameters for lithium-ion battery models # import pybamm -from .base_parameters import BaseParameters +from .base_parameters import BaseParameters, NullParameters class LithiumIonParameters(BaseParameters): @@ -41,21 +41,14 @@ def __init__(self, options=None): self.half_cell = self.options["working electrode"] != "both" # Get geometric, electrical and thermal parameters - self.geo = pybamm.geometric_parameters + self.geo = pybamm.GeometricParameters(options) self.elec = pybamm.electrical_parameters self.therm = pybamm.thermal_parameters - # Spatial variables - r_n = pybamm.standard_spatial_vars.r_n * self.geo.n.R_typ - r_p = pybamm.standard_spatial_vars.r_p * self.geo.p.R_typ - x_n = pybamm.standard_spatial_vars.x_n * self.geo.L_x - x_s = pybamm.standard_spatial_vars.x_s * self.geo.L_x - x_p = pybamm.standard_spatial_vars.x_p * self.geo.L_x - # Initialize domain parameters - self.n = DomainLithiumIonParameters("Negative", self, x_n, r_n) - self.s = DomainLithiumIonParameters("Separator", self, x_s, None) - self.p = DomainLithiumIonParameters("Positive", self, x_p, r_p) + self.n = DomainLithiumIonParameters("Negative", self) + self.s = DomainLithiumIonParameters("Separator", self) + self.p = DomainLithiumIonParameters("Positive", self) self.domain_params = [self.n, self.s, self.p] # Set parameters and scales @@ -187,6 +180,7 @@ def _set_dimensional_parameters(self): ) # Total lithium + # Electrolyte c_e_av_init = pybamm.xyz_average(self.epsilon_init) * self.c_e_typ self.n_Li_e_init = c_e_av_init * self.L_x * self.A_cc @@ -194,8 +188,8 @@ def _set_dimensional_parameters(self): self.n_Li_init = self.n_Li_particles_init + self.n_Li_e_init # Reference OCP based on initial concentration - self.ocv_ref = self.p.U_ref - self.n.U_ref - self.ocv_init_dim = self.p.U_init_dim - self.n.U_init_dim + self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref + self.ocv_init_dim = self.p.prim.U_init_dim - self.n.prim.U_init_dim def D_e_dimensional(self, c_e, T): """Dimensional diffusivity in electrolyte""" @@ -254,9 +248,9 @@ def _set_scales(self): # Discharge timescale if self.options["working electrode"] == "positive": - self.c_max = self.p.c_max + self.c_max = self.p.prim.c_max else: - self.c_max = self.n.c_max + self.c_max = self.n.prim.c_max self.tau_discharge = self.F * self.c_max * self.L_x / self.i_typ # Electrolyte diffusion timescale @@ -328,25 +322,25 @@ def _set_dimensionless_parameters(self): ) # SEI parameters - self.C_sei_reaction = (self.n.j_scale / self.m_sei_dimensional) * pybamm.exp( - -(self.F * self.n.U_ref / (2 * self.R * self.T_ref)) - ) + self.C_sei_reaction = ( + self.n.prim.j_scale / self.m_sei_dimensional + ) * pybamm.exp(-(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref))) self.C_sei_solvent = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.c_sol_dimensional * self.F * self.D_sol_dimensional) ) self.C_sei_electron = ( - self.n.j_scale + self.n.prim.j_scale * self.F * self.L_sei_0_dim / (self.kappa_inner_dimensional * self.R * self.T_ref) ) self.C_sei_inter = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.D_li_dimensional * self.c_li_0_dimensional * self.F) ) @@ -355,7 +349,7 @@ def _set_dimensionless_parameters(self): self.R_sei = ( self.F - * self.n.j_scale + * self.n.prim.j_scale * self.R_sei_dimensional * self.L_sei_0_dim / self.R @@ -364,10 +358,10 @@ def _set_dimensionless_parameters(self): self.v_bar = self.V_bar_outer_dimensional / self.V_bar_inner_dimensional self.c_sei_scale = ( - self.L_sei_0_dim * self.n.a_typ / self.V_bar_inner_dimensional + self.L_sei_0_dim * self.n.prim.a_typ / self.V_bar_inner_dimensional ) self.c_sei_outer_scale = ( - self.L_sei_0_dim * self.n.a_typ / self.V_bar_outer_dimensional + self.L_sei_0_dim * self.n.prim.a_typ / self.V_bar_outer_dimensional ) self.L_inner_0 = self.L_inner_0_dim / self.L_sei_0_dim @@ -375,45 +369,43 @@ def _set_dimensionless_parameters(self): # ratio of SEI reaction scale to intercalation reaction self.Gamma_SEI = ( - self.V_bar_inner_dimensional * self.n.j_scale * self.timescale + self.V_bar_inner_dimensional * self.n.prim.j_scale * self.timescale ) / (self.F * self.L_sei_0_dim) # EC reaction self.C_ec = ( self.L_sei_0_dim - * self.n.j_scale + * self.n.prim.j_scale / (self.F * self.c_ec_0_dim * self.D_ec_dim) ) self.C_sei_ec = ( self.F * self.k_sei_dim * self.c_ec_0_dim - / self.n.j_scale + / self.n.prim.j_scale * ( pybamm.exp( -( self.F - * (self.n.U_ref - self.U_sei_dim) + * (self.n.prim.U_ref - self.U_sei_dim) / (2 * self.R * self.T_ref) ) ) ) ) - self.beta_sei = self.n.a_typ * self.L_sei_0_dim * self.Gamma_SEI + self.beta_sei = self.n.prim.a_typ * self.L_sei_0_dim * self.Gamma_SEI self.c_sei_init = self.c_ec_0_dim / self.c_sei_outer_scale # lithium plating parameters self.c_plated_Li_0 = self.c_plated_Li_0_dim / self.c_Li_typ - self.alpha_plating = pybamm.Parameter( - "Lithium plating transfer coefficient" - ) + self.alpha_plating = pybamm.Parameter("Lithium plating transfer coefficient") self.alpha_stripping = 1 - self.alpha_plating # ratio of lithium plating reaction scaled to intercalation reaction - self.Gamma_plating = (self.n.a_typ * self.n.j_scale * self.timescale) / ( - self.F * self.c_Li_typ - ) + self.Gamma_plating = ( + self.n.prim.a_typ * self.n.prim.j_scale * self.timescale + ) / (self.F * self.c_Li_typ) self.beta_plating = self.Gamma_plating * self.V_bar_plated_Li * self.c_Li_typ @@ -468,7 +460,10 @@ def j0_stripping(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) + / self.n.prim.j_scale + ) def j0_plating(self, c_e, c_Li, T): """Dimensionless reverse plating current""" @@ -476,7 +471,9 @@ def j0_plating(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.prim.j_scale + ) def dead_lithium_decay_rate(self, L_sei): """Dimensionless exchange-current density for stripping""" @@ -498,34 +495,37 @@ def _set_input_current(self): self.dimensional_current_with_time / self.I_typ * pybamm.sign(self.I_typ) ) - @property - def options(self): - return self._options - - @options.setter - def options(self, extra_options): - self._options = pybamm.BatteryModelOptions(extra_options) - class DomainLithiumIonParameters(BaseParameters): - def __init__(self, domain, main_param, x, r): + def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param self.geo = getattr(main_param.geo, domain.lower()[0]) self.therm = getattr(main_param.therm, domain.lower()[0]) - self.x = x - self.r = r + if domain != "Separator": + self.prim = ParticleLithiumIonParameters("primary", self) + phases_option = int( + getattr(main_param.options, domain.lower())["particle phases"] + ) + if phases_option >= 2: + self.sec = ParticleLithiumIonParameters("secondary", self) + else: + self.sec = NullParameters() + else: + self.prim = NullParameters() + self.sec = NullParameters() + + self.phases = [self.prim, self.sec] def _set_dimensional_parameters(self): main = self.main_param Domain = self.domain domain = Domain.lower() - x = self.x - r = self.r if Domain == "Separator": + x = pybamm.standard_spatial_vars.x_s * main.L_x self.epsilon_init = pybamm.FunctionParameter( "Separator porosity", {"Through-cell distance (x) [m]": x} ) @@ -534,13 +534,22 @@ def _set_dimensional_parameters(self): self.L = self.geo.L return + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * main.L_x + ) + # Macroscale geometry self.L_cc = self.geo.L_cc self.L = self.geo.L - # Note: the surface area to volume ratio is defined later with the function - # parameters. The particle size as a function of through-cell position is - # already defined in geometric_parameters.py - self.R_dimensional = self.geo.R_dimensional + + for phase in self.phases: + phase._set_dimensional_parameters() # Tab geometry (for pouch cells) self.L_tab = self.geo.L_tab @@ -549,39 +558,28 @@ def _set_dimensional_parameters(self): self.A_tab = self.geo.A_tab # Particle properties - self.c_max = pybamm.Parameter( - f"Maximum concentration in {domain} electrode [mol.m-3]" - ) self.sigma_cc_dimensional = pybamm.Parameter( f"{Domain} current collector conductivity [S.m-1]" ) - self.epsilon_init = pybamm.FunctionParameter( - f"{Domain} electrode porosity", {"Through-cell distance (x) [m]": x} - ) + if not (main.half_cell and domain == "negative"): + self.epsilon_init = pybamm.FunctionParameter( + f"{Domain} electrode porosity", {"Through-cell distance (x) [m]": x} + ) + epsilon_s_tot = sum(phase.epsilon_s for phase in self.phases) + self.epsilon_inactive = 1 - self.epsilon_init - epsilon_s_tot + + self.cap_init = sum(phase.cap_init for phase in self.phases) + self.n_Li_init = sum(phase.n_Li_init for phase in self.phases) + + # Tortuosity parameters self.b_e = self.geo.b_e self.b_s = self.geo.b_s - # Particle-size distribution parameters - self.R_min_dim = self.geo.R_min_dim - self.R_max_dim = self.geo.R_max_dim - self.sd_a_dim = self.geo.sd_a_dim - self.f_a_dist_dimensional = self.geo.f_a_dist_dimensional - - # Electrochemical reactions - self.ne = pybamm.Parameter(f"{Domain} electrode electrons in reaction") self.C_dl_dimensional = pybamm.Parameter( f"{Domain} electrode double-layer capacity [F.m-2]" ) - # Intercalation kinetics - self.mhc_lambda_dimensional = pybamm.Parameter( - f"{Domain} electrode reorganization energy [eV]" - ) - self.alpha_bv = pybamm.Parameter( - f"{Domain} electrode Butler-Volmer transfer coefficient" - ) - # Mechanical parameters self.nu = pybamm.Parameter(f"{Domain} electrode Poisson's ratio") self.E = pybamm.Parameter(f"{Domain} electrode Young's modulus [Pa]") @@ -629,23 +627,228 @@ def _set_dimensional_parameters(self): f"{Domain} electrode current-driven interface utilisation factor [m3.mol-1]" ) + def sigma_dimensional(self, T): + """Dimensional electrical conductivity in electrode""" + inputs = {"Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode conductivity [S.m-1]", inputs + ) + + def j0_stripping_dimensional(self, c_e, c_Li, T): + """Dimensional exchange-current density for stripping [A.m-2]""" + inputs = { + "Electrolyte concentration [mol.m-3]": c_e, + "Plated lithium concentration [mol.m-3]": c_Li, + "Temperature [K]": T, + } + return pybamm.FunctionParameter( + "Exchange-current density for stripping [A.m-2]", inputs + ) + + def j0_plating_dimensional(self, c_e, c_Li, T): + """Dimensional exchange-current density for plating [A.m-2]""" + inputs = { + "Electrolyte concentration [mol.m-3]": c_e, + "Plated lithium concentration [mol.m-3]": c_Li, + "Temperature [K]": T, + } + return pybamm.FunctionParameter( + "Exchange-current density for plating [A.m-2]", inputs + ) + + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + for phase in self.phases: + phase._set_scales() + + def _set_dimensionless_parameters(self): + for phase in self.phases: + phase._set_dimensionless_parameters() + + main = self.main_param + + if self.domain == "Separator": + self.l = self.geo.l + self.rho = self.therm.rho + self.lambda_ = self.therm.lambda_ + return + + # Macroscale Geometry + self.l_cc = self.geo.l_cc + self.l = self.geo.l + + # Thermal + self.rho_cc = self.therm.rho_cc + self.rho = self.therm.rho + self.lambda_cc = self.therm.lambda_cc + self.lambda_ = self.therm.lambda_ + self.h_tab = self.therm.h_tab + self.h_cc = self.therm.h_cc + + # Tab geometry (for pouch cells) + self.l_tab = self.geo.l_tab + self.centre_y_tab = self.geo.centre_y_tab + self.centre_z_tab = self.geo.centre_z_tab + + # Electrochemical Reactions + self.C_dl = ( + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale + ) + # Electrode Properties + self.sigma_cc = ( + self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x + ) + self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 + self.sigma_cc_dbl_prime = self.sigma_cc_prime * main.delta + + # Electrolyte Properties + self.beta_surf = pybamm.Scalar(0) + + # Dimensionless mechanical parameters + self.rho_cr = self.rho_cr_dim * self.l_cr_0 * self.w_cr + self.theta = self.theta_dim * self.prim.c_max / main.T_ref + self.c_0 = self.c_0_dim / self.prim.c_max + self.beta_LAM = self.beta_LAM_dimensional * main.timescale + # normalised typical time for one cycle + self.stress_critical = self.stress_critical_dim / self.E + # Reaction-driven LAM parameters + self.beta_LAM_sei = ( + self.beta_LAM_sei_dimensional + * self.prim.a_typ + * self.prim.j_scale + * main.timescale + ) / main.F + # Utilisation factors + self.beta_utilisation = ( + self.beta_utilisation_dimensional + * self.prim.a_typ + * self.prim.j_scale + * main.timescale + ) / main.F + + def sigma(self, T): + """Dimensionless electrode electrical conductivity""" + main = self.main_param + T_dim = self.main_param.Delta_T * T + self.main_param.T_ref + return ( + self.sigma_dimensional(T_dim) * main.potential_scale / main.i_typ / main.L_x + ) + + def sigma_prime(self, T): + """Rescaled dimensionless electrode electrical conductivity""" + return self.sigma(T) * self.main_param.delta + + def t_change(self, sto): + """ + Dimensionless volume change for the electrode; + sto should be R-averaged + """ + return pybamm.FunctionParameter( + f"{self.domain} electrode volume change", {"Particle stoichiometry": sto} + ) + + def k_cr(self, T): + """ + Dimensionless cracking rate for the electrode; + """ + T_dim = self.main_param.Delta_T * T + self.main_param.T_ref + delta_k_cr = self.E ** self.m_cr * self.l_cr_0 ** (self.m_cr / 2 - 1) + return ( + pybamm.FunctionParameter( + f"{self.domain} electrode cracking rate", {"Temperature [K]": T_dim} + ) + * delta_k_cr + ) + + +class ParticleLithiumIonParameters(BaseParameters): + def __init__(self, phase, domain_param): + self.domain_param = domain_param + self.domain = domain_param.domain + self.main_param = domain_param.main_param + self.phase = phase + self.set_phase_name() + if self.phase == "primary": + self.geo = domain_param.geo.prim + elif self.phase == "secondary": + self.geo = domain_param.geo.sec + + def _set_dimensional_parameters(self): + main = self.main_param + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + pref = self.phase_prefactor + + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * main.L_x + ) + r = ( + pybamm.SpatialVariable( + f"r_{domain[0]}", + domain=[f"{domain} {self.phase_name}particle"], + auxiliary_domains={ + "secondary": f"{domain} electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", + ) + * self.geo.R_typ + ) + + # Macroscale geometry + # Note: the surface area to volume ratio is defined later with the function + # parameters. The particle size as a function of through-cell position is + # already defined in geometric_parameters.py + self.R_dimensional = self.geo.R_dimensional + + # Particle properties + self.c_max = pybamm.Parameter( + f"{pref}Maximum concentration in {domain} electrode [mol.m-3]" + ) + + # Particle-size distribution parameters + self.R_min_dim = self.geo.R_min_dim + self.R_max_dim = self.geo.R_max_dim + self.sd_a_dim = self.geo.sd_a_dim + self.f_a_dist_dimensional = self.geo.f_a_dist_dimensional + + # Electrochemical reactions + self.ne = pybamm.Parameter(f"{pref}{Domain} electrode electrons in reaction") + + # Intercalation kinetics + self.mhc_lambda_dimensional = pybamm.Parameter( + f"{pref}{Domain} electrode reorganization energy [eV]" + ) + self.alpha_bv = pybamm.Parameter( + f"{pref}{Domain} electrode Butler-Volmer transfer coefficient" + ) + if self.main_param.half_cell and self.domain == "Negative": self.n_Li_init = pybamm.Scalar(0) self.U_ref = pybamm.Scalar(0) self.U_init_dim = pybamm.Scalar(0) else: self.epsilon_s = pybamm.FunctionParameter( - f"{Domain} electrode active material volume fraction", + f"{pref}{Domain} electrode active material volume fraction", {"Through-cell distance (x) [m]": x}, ) - self.epsilon_inactive = 1 - self.epsilon_init - self.epsilon_s self.c_init = ( pybamm.FunctionParameter( - f"Initial concentration in {domain} electrode [mol.m-3]", + f"{pref}Initial concentration in {domain} electrode [mol.m-3]", { "Radial distance (r) [m]": r, "Through-cell distance (x) [m]": pybamm.PrimaryBroadcast( - x, f"{domain} particle" + x, f"{domain} {phase_name}particle" ), }, ) @@ -655,50 +858,62 @@ def _set_dimensional_parameters(self): eps_c_init_av = pybamm.xyz_average( self.epsilon_s * pybamm.r_average(self.c_init) ) - self.n_Li_init = eps_c_init_av * self.c_max * self.L * main.A_cc + self.n_Li_init = ( + eps_c_init_av * self.c_max * self.domain_param.L * main.A_cc + ) eps_s_av = pybamm.xyz_average(self.epsilon_s) - self.elec_loading = eps_s_av * self.L * self.c_max * main.F / 3600 + self.elec_loading = ( + eps_s_av * self.domain_param.L * self.c_max * main.F / 3600 + ) self.cap_init = self.elec_loading * main.A_cc self.U_ref = self.U_dimensional(c_init_av, main.T_ref) self.U_init_dim = self.U_dimensional(c_init_av, main.T_init_dim) - def sigma_dimensional(self, T): - """Dimensional electrical conductivity in electrode""" - inputs = {"Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode conductivity [S.m-1]", inputs - ) - def D_dimensional(self, sto, T): """Dimensional diffusivity in particle. Note this is defined as a function of stochiometry""" - inputs = {f"{self.domain} particle stoichiometry": sto, "Temperature [K]": T} + inputs = { + f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto, + "Temperature [K]": T, + } return pybamm.FunctionParameter( - f"{self.domain} electrode diffusivity [m2.s-1]", inputs + f"{self.phase_prefactor}{self.domain} electrode diffusivity [m2.s-1]", + inputs, ) def j0_dimensional(self, c_e, c_s_surf, T): """Dimensional exchange-current density [A.m-2]""" inputs = { "Electrolyte concentration [mol.m-3]": c_e, - f"{self.domain} particle surface concentration [mol.m-3]": c_s_surf, + f"{self.phase_prefactor}{self.domain} particle " + "surface concentration [mol.m-3]": c_s_surf, "Temperature [K]": T, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, } return pybamm.FunctionParameter( - f"{self.domain} electrode exchange-current density [A.m-2]", inputs + f"{self.phase_prefactor}{self.domain} electrode " + "exchange-current density [A.m-2]", + inputs, ) - def U_dimensional(self, sto, T): + def U_dimensional(self, sto, T, lithiation=None): """Dimensional open-circuit potential [V]""" # bound stoichiometry between tol and 1-tol. Adding 1/sto + 1/(sto-1) later # will ensure that ocp goes to +- infinity if sto goes into that region # anyway tol = 1e-10 sto = pybamm.maximum(pybamm.minimum(sto, 1 - tol), tol) - inputs = {f"{self.domain} particle stoichiometry": sto} - u_ref = pybamm.FunctionParameter(f"{self.domain} electrode OCP [V]", inputs) + if lithiation is None: + lithiation = "" + else: + lithiation = lithiation + " " + inputs = {f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto} + u_ref = pybamm.FunctionParameter( + f"{self.phase_prefactor}{self.domain} electrode {lithiation}OCP [V]", inputs + ) # add a term to ensure that the OCP goes to infinity at 0 and -infinity at 1 # this will not affect the OCP for most values of sto # see #1435 @@ -712,16 +927,19 @@ def dUdT_dimensional(self, sto): """ Dimensional entropic change of the open-circuit potential [V.K-1] """ - inputs = {f"{self.domain} particle stoichiometry": sto} + inputs = { + f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, + } return pybamm.FunctionParameter( - f"{self.domain} electrode OCP entropic change [V.K-1]", inputs + f"{self.phase_prefactor}{self.domain} electrode " + "OCP entropic change [V.K-1]", + inputs, ) def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" - if self.domain == "Separator": - return - main = self.main_param # Microscale self.R_typ = self.geo.R_typ @@ -756,33 +974,10 @@ def _set_scales(self): def _set_dimensionless_parameters(self): main = self.main_param - if self.domain == "Separator": - self.l = self.geo.l - self.rho = self.therm.rho - self.lambda_ = self.therm.lambda_ - return - # Timescale ratios self.C_diff = self.tau_diffusion / main.timescale self.C_r = self.tau_r / main.timescale - # Macroscale Geometry - self.l_cc = self.geo.l_cc - self.l = self.geo.l - - # Thermal - self.rho_cc = self.therm.rho_cc - self.rho = self.therm.rho - self.lambda_cc = self.therm.lambda_cc - self.lambda_ = self.therm.lambda_ - self.h_tab = self.therm.h_tab - self.h_cc = self.therm.h_cc - - # Tab geometry (for pouch cells) - self.l_tab = self.geo.l_tab - self.centre_y_tab = self.geo.centre_y_tab - self.centre_z_tab = self.geo.centre_z_tab - # Microscale geometry self.R = self.geo.R self.a_R = self.a_typ * self.R_typ @@ -797,21 +992,9 @@ def _set_dimensionless_parameters(self): # In most cases gamma_n will be equal to 1 self.gamma = (main.tau_discharge / main.timescale) * self.c_max / main.c_max - # Electrode Properties - self.sigma_cc = ( - self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x - ) - self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 - self.sigma_cc_dbl_prime = self.sigma_cc_prime * main.delta - # Electrolyte Properties self.beta_surf = pybamm.Scalar(0) - # Electrochemical Reactions - self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale - ) - # Intercalation kinetics self.mhc_lambda = self.mhc_lambda_dimensional / main.potential_scale_eV @@ -821,37 +1004,6 @@ def _set_dimensionless_parameters(self): else: self.U_init = (self.U_init_dim - self.U_ref) / main.potential_scale - # Dimensionless mechanical parameters - self.rho_cr = self.rho_cr_dim * self.l_cr_0 * self.w_cr - self.theta = self.theta_dim * self.c_max / main.T_ref - self.c_0 = self.c_0_dim / self.c_max - self.beta_LAM = self.beta_LAM_dimensional * main.timescale - # normalised typical time for one cycle - self.stress_critical = self.stress_critical_dim / self.E - # Reaction-driven LAM parameters - self.beta_LAM_sei = ( - self.beta_LAM_sei_dimensional * self.a_typ * self.j_scale * main.timescale - ) / main.F - # Utilisation factors - self.beta_utilisation = ( - self.beta_utilisation_dimensional - * self.a_typ - * self.j_scale - * main.timescale - ) / main.F - - def sigma(self, T): - """Dimensionless electrode electrical conductivity""" - main = self.main_param - T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return ( - self.sigma_dimensional(T_dim) * main.potential_scale / main.i_typ / main.L_x - ) - - def sigma_prime(self, T): - """Rescaled dimensionless electrode electrical conductivity""" - return self.sigma(T) * self.main_param.delta - def D(self, c_s, T): """Dimensionless particle diffusivity""" sto = c_s @@ -868,37 +1020,17 @@ def j0(self, c_e, c_s_surf, T): self.j0_dimensional(c_e_dim, c_s_surf_dim, T_dim) / self.j0_ref_dimensional ) - def U(self, c_s, T): + def U(self, c_s, T, lithiation=None): """Dimensionless open-circuit potential in the electrode""" main = self.main_param sto = c_s T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return (self.U_dimensional(sto, T_dim) - self.U_ref) / main.potential_scale + return ( + self.U_dimensional(sto, T_dim, lithiation) - self.U_ref + ) / main.potential_scale def dUdT(self, c_s): """Dimensionless entropic change in open-circuit potential""" main = self.main_param sto = c_s return self.dUdT_dimensional(sto) * main.Delta_T / main.potential_scale - - def t_change(self, sto): - """ - Dimensionless volume change for the electrode; - sto should be R-averaged - """ - return pybamm.FunctionParameter( - f"{self.domain} electrode volume change", {"Particle stoichiometry": sto} - ) - - def k_cr(self, T): - """ - Dimensionless cracking rate for the electrode; - """ - T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - delta_k_cr = self.E ** self.m_cr * self.l_cr_0 ** (self.m_cr / 2 - 1) - return ( - pybamm.FunctionParameter( - f"{self.domain} electrode cracking rate", {"Temperature [K]": T_dim} - ) - * delta_k_cr - ) diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index 5d45e85f07..c0dad410e2 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -179,12 +179,15 @@ def update_from_chemistry(self, chemistry): ] # add SEI parameters if provided - if "sei" in chemistry: - component_groups += ["sei"] - - # add lithium plating parameters if provided - if "lithium plating" in chemistry: - component_groups += ["lithium plating"] + for extra_group in [ + "sei", + "lithium plating", + "negative secondary particle", + ]: + if extra_group in chemistry: + # do extra groups first, as later we will check whether a parameter + # appears with "Secondary:" (in which case we change it to "Primary:") + component_groups = [extra_group] + component_groups for component_group in component_groups: # Make sure component is provided @@ -197,13 +200,27 @@ def update_from_chemistry(self, chemistry): ) ) # Create path to component and load values + prefactor = "" + if component_group == "negative secondary particle": + component_group = "negative electrode" + prefactor = "Secondary: " component_path = os.path.join( base_chemistry, component_group.replace(" ", "_") + "s", component ) file_path = self.find_parameter( os.path.join(component_path, "parameters.csv") ) - component_params = self.read_parameters_csv(file_path) + component_params_tmp = self.read_parameters_csv(file_path) + + component_params = {} + for k, v in component_params_tmp.items(): + # If a parameter is already present as a secondary parameter, we + # distinguish it by adding "Primary:" to the given name + if "Secondary: " + k in self._dict_items: + component_params["Primary: " + k] = v + else: + # Add prefactor to distinguish e.g. secondary particles + component_params[prefactor + k] = v # Update parameters, making sure to check any conflicts self.update( diff --git a/pybamm/simulation.py b/pybamm/simulation.py index fc9c7f0f69..d4129053fd 100644 --- a/pybamm/simulation.py +++ b/pybamm/simulation.py @@ -609,8 +609,8 @@ def solve( "Initial concentration in positive electrode [mol.m-3]" ] param = pybamm.LithiumIonParameters() - c_n_max = self.parameter_values.evaluate(param.n.c_max) - c_p_max = self.parameter_values.evaluate(param.p.c_max) + c_n_max = self.parameter_values.evaluate(param.n.prim.c_max) + c_p_max = self.parameter_values.evaluate(param.p.prim.c_max) x, y = pybamm.lithium_ion.get_initial_stoichiometries( initial_soc, self.parameter_values ) diff --git a/requirements.txt b/requirements.txt index dfb257d3de..98206706a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed +numpy >= 1.16 scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 diff --git a/setup.py b/setup.py index 69d66ebca7..ff84b76c9b 100644 --- a/setup.py +++ b/setup.py @@ -191,7 +191,7 @@ def compile_KLU(): python_requires=">=3.7,<3.10", # List of dependencies install_requires=[ - "numpy<=1.22", # change back to numpy>=1.16 once scikit.odes is fixed + "numpy>=1.16", "scipy>=1.3", "pandas>=0.24", "anytree>=2.4.3", diff --git a/tests/unit/test_citations.py b/tests/unit/test_citations.py index 34f79ea484..8b9362906b 100644 --- a/tests/unit/test_citations.py +++ b/tests/unit/test_citations.py @@ -123,14 +123,14 @@ def test_subramanian_2005(self): citations._reset() self.assertNotIn("Subramanian2005", citations._papers_to_cite) pybamm.particle.no_distribution.XAveragedPolynomialProfile( - None, "Negative", "quadratic profile", None + None, "Negative", "quadratic profile", None, "primary" ) self.assertIn("Subramanian2005", citations._papers_to_cite) citations._reset() self.assertNotIn("Subramanian2005", citations._papers_to_cite) pybamm.particle.no_distribution.PolynomialProfile( - None, "Negative", "quadratic profile", None + None, "Negative", "quadratic profile", None, "primary" ) self.assertIn("Subramanian2005", citations._papers_to_cite) @@ -192,12 +192,12 @@ def test_sripad_2020(self): citations._reset() self.assertNotIn("Sripad2020", citations._papers_to_cite) - pybamm.kinetics.Marcus(None, None, None, None) + pybamm.kinetics.Marcus(None, None, None, None, None) self.assertIn("Sripad2020", citations._papers_to_cite) citations._reset() self.assertNotIn("Sripad2020", citations._papers_to_cite) - pybamm.kinetics.MarcusHushChidsey(None, None, None, None) + pybamm.kinetics.MarcusHushChidsey(None, None, None, None, None) self.assertIn("Sripad2020", citations._papers_to_cite) def test_parameter_citations(self): diff --git a/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py b/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py index 32b20ba610..b494a878b7 100644 --- a/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py +++ b/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py @@ -137,9 +137,7 @@ def test_special_functions(self): # pybamm.Function(np_fun, c).to_casadi() # ) - casadi.evalf(casadi.MX(np_fun(3))) # is not zero, but a small number of the order 10^-15 when np_func is np.cosh - for np_fun in [ - np.cosh - ]: + for np_fun in [np.cosh]: self.assert_casadi_almost_equal( pybamm.Function(np_fun, c).to_casadi(), casadi.MX(np_fun(3)), @@ -196,9 +194,11 @@ def test_interpolation(self): interp_casadi = interp.to_casadi(y=casadi_y) # error for converted children count - y3 = (pybamm.StateVector(slice(0, 1)), - pybamm.StateVector(slice(0, 1)), - pybamm.StateVector(slice(0, 1))) + y3 = ( + pybamm.StateVector(slice(0, 1)), + pybamm.StateVector(slice(0, 1)), + pybamm.StateVector(slice(0, 1)), + ) x3_ = [np.linspace(0, 1) for _ in range(3)] x3 = np.column_stack(x3_) data3 = 2 * x3 # np.tile(2 * x3, (10, 1)).T @@ -218,18 +218,14 @@ def test_interpolation_2d(self): y_test = np.array([0.4, 0.6]) Y = (2 * x).sum(axis=1).reshape(*[len(el) for el in x_]) for interpolator in ["linear"]: - interp = pybamm.Interpolant(x_, - Y, - y, interpolator=interpolator) + interp = pybamm.Interpolant(x_, Y, y, interpolator=interpolator) interp_casadi = interp.to_casadi(y=casadi_y) f = casadi.Function("f", [casadi_y], [interp_casadi]) np.testing.assert_array_almost_equal(interp.evaluate(y=y_test), f(y_test)) # square y = (pybamm.StateVector(slice(0, 1)), pybamm.StateVector(slice(0, 1))) Y = (x ** 2).sum(axis=1).reshape(*[len(el) for el in x_]) - interp = pybamm.Interpolant(x_, - Y, - y, interpolator="linear") + interp = pybamm.Interpolant(x_, Y, y, interpolator="linear") interp_casadi = interp.to_casadi(y=casadi_y) f = casadi.Function("f", [casadi_y], [interp_casadi]) np.testing.assert_array_almost_equal(interp.evaluate(y=y_test), f(y_test)) diff --git a/tests/unit/test_expression_tree/test_printing/__init__.py b/tests/unit/test_expression_tree/test_printing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index f3248e0b36..bc5a1c076c 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -16,14 +16,16 @@ def test_prettify_print_name(self): self.assertEqual(param.timescale.print_name, r"\tau") # Test superscripts - self.assertEqual(param.n.U_ref.print_name, r"U_{n}^{ref}") + self.assertEqual(param.n.prim.U_ref.print_name, r"U_{n}^{ref}") # Test subscripts - self.assertEqual(param.a_R_p.print_name, r"a_{R\,p}") + self.assertEqual(param.p.prim.a_R.print_name, r"a_{R\,p}") # Test dim and dimensional - self.assertEqual(param.j0_n_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}") - self.assertEqual(param.C_dl_n_dimensional.print_name, r"\hat{C}_{dl\,n}") + # self.assertEqual( + # param.n.prim.j0_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}" + # ) + # self.assertEqual(param.n.C_dl_dimensional.print_name, r"\hat{C}_{dl\,n}") # Test bar self.assertEqual(param1.c_s_n_xav.print_name, r"\bar{c}_{s\,n}") @@ -32,8 +34,7 @@ def test_prettify_print_name(self): self.assertEqual(param2.delta.print_name, r"\delta") # Test new_copy() - x_n = pybamm.standard_spatial_vars.x_n - a_n = param2.a_n(x_n) + a_n = param2.n.prim.a a_n.new_copy() # Test eps diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index fe62d5a73b..890ea416eb 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -30,6 +30,7 @@ 'operating mode': 'current' (possible: ['current', 'voltage', 'power', 'differential power', 'explicit power', 'resistance', 'differential resistance', 'explicit resistance', 'CCCV']) 'particle': 'Fickian diffusion' (possible: ['Fickian diffusion', 'fast diffusion', 'uniform profile', 'quadratic profile', 'quartic profile']) 'particle mechanics': 'swelling only' (possible: ['none', 'swelling only', 'swelling and cracking']) +'particle phases': '1' (possible: ['1', '2']) 'particle shape': 'spherical' (possible: ['spherical', 'no particles']) 'particle size': 'single' (possible: ['single', 'distribution']) 'SEI': 'none' (possible: ['none', 'constant', 'reaction limited', 'solvent-diffusion limited', 'electron-migration limited', 'interstitial-diffusion limited', 'ec reaction limited']) @@ -72,7 +73,7 @@ def test_process_parameters_and_discretise(self): model.variables["X-averaged negative electrode temperature"], ["negative particle"], ) - D = model.param.n.D(c_n, T) + D = model.param.n.prim.D(c_n, T) N = -D * pybamm.grad(c_n) flux_1 = model.process_parameters_and_discretise(N, parameter_values, disc) @@ -136,7 +137,11 @@ def test_default_var_pts(self): "x_s": 20, "x_p": 20, "r_n": 20, + "r_n_prim": 20, + "r_n_sec": 20, "r_p": 20, + "r_p_prim": 20, + "r_p_sec": 20, "y": 10, "z": 10, "R_n": 30, diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py index 6141770d66..98fdeb7767 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py @@ -10,6 +10,16 @@ def test_dfn_well_posed(self): model = pybamm.lithium_ion.BasicDFN() model.check_well_posedness() + copy = model.new_copy() + copy.check_well_posedness() + + def test_dfn_composite_well_posed(self): + model = pybamm.lithium_ion.BasicDFNComposite() + model.check_well_posedness() + + copy = model.new_copy() + copy.check_well_posedness() + def test_spm_well_posed(self): model = pybamm.lithium_ion.BasicSPM() model.check_well_posedness() diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py index e49197bd3a..37f3f8cb16 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py @@ -35,12 +35,11 @@ def test_new_model(self): self.assertEqual(new_model.timescale, model.timescale) # with custom submodels - options = {"stress-induced diffusion": "false", "thermal": "x-full"} - model = pybamm.lithium_ion.SPM(options, build=False) + model = pybamm.lithium_ion.SPM({"thermal": "x-full"}, build=False) particle_n = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - model.param, "Negative", "quadratic profile", options + model.param, "Negative", "quadratic profile", model.options, "primary" ) - model.submodels["negative particle"] = particle_n + model.submodels["negative primary particle"] = particle_n model.build_model() new_model = model.new_copy() new_model_cs_eqn = list(new_model.rhs.values())[1] diff --git a/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py b/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py new file mode 100644 index 0000000000..6ca166afea --- /dev/null +++ b/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py @@ -0,0 +1,52 @@ +# +# Standard tests for the public methods of submodels +# + + +class StandardSubModelTests(object): + + """Basic tests for submodels. Just tests everything runs without raising error""" + + def __init__(self, submodel, variables=None): + # variables should be a dict of variables which are needed by the submodels + # to run all its functions propertly + if not variables: + variables = {} + self.submodel = submodel + self.variables = variables + self.external_variables = [] + + def test_get_fundamental_variables(self): + self.variables.update(self.submodel.get_fundamental_variables()) + + def test_get_external_variables(self): + external_variables = self.submodel.get_external_variables() + self.external_variables += external_variables + + def test_get_coupled_variables(self): + self.variables.update(self.submodel.get_coupled_variables(self.variables)) + + def test_set_rhs(self): + self.submodel.set_rhs(self.variables) + + def test_set_algebraic(self): + self.submodel.set_algebraic(self.variables) + + def test_set_boundary_conditions(self): + self.submodel.set_boundary_conditions(self.variables) + + def test_set_initial_conditions(self): + self.submodel.set_initial_conditions(self.variables) + + def test_set_events(self): + self.submodel.set_events(self.variables) + + def test_all(self): + self.test_get_fundamental_variables() + self.test_get_external_variables() + self.test_get_coupled_variables() + self.test_set_rhs() + self.test_set_algebraic() + self.test_set_boundary_conditions() + self.test_set_initial_conditions() + self.test_set_events() diff --git a/tests/unit/test_parameters/test_base_parameters.py b/tests/unit/test_parameters/test_base_parameters.py index 8d75407619..5a3002a10d 100644 --- a/tests/unit/test_parameters/test_base_parameters.py +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -7,7 +7,7 @@ class TestBaseParameters(unittest.TestCase): def test_getattr__(self): - param = pybamm.GeometricParameters() + param = pybamm.LithiumIonParameters() # ending in _n / _s / _p with self.assertRaisesRegex(AttributeError, "param.n.l"): getattr(param, "l_n") @@ -16,10 +16,10 @@ def test_getattr__(self): with self.assertRaisesRegex(AttributeError, "param.p.l"): getattr(param, "l_p") # _n_ in the name - with self.assertRaisesRegex(AttributeError, "param.n.c_max"): + with self.assertRaisesRegex(AttributeError, "param.n.prim.c_max"): getattr(param, "c_n_max") # _p_ in the name, function - with self.assertRaisesRegex(AttributeError, "param.p.U_dimensional"): + with self.assertRaisesRegex(AttributeError, "param.p.prim.U_dimensional"): getattr(param, "U_p_dimensional") def test__setattr__(self): diff --git a/tests/unit/test_parameters/test_lead_acid_parameters.py b/tests/unit/test_parameters/test_lead_acid_parameters.py index f035d0150e..e1f79514ae 100644 --- a/tests/unit/test_parameters/test_lead_acid_parameters.py +++ b/tests/unit/test_parameters/test_lead_acid_parameters.py @@ -135,10 +135,10 @@ def test_functions_lead_acid(self): "kappa_e_0": param.kappa_e(pybamm.Scalar(0), pybamm.Scalar(0)), "chi_1": param.chi(pybamm.Scalar(1), pybamm.Scalar(0)), "chi_0.5": param.chi(pybamm.Scalar(0.5), pybamm.Scalar(0)), - "U_n_1": param.n.U(pybamm.Scalar(1), pybamm.Scalar(0)), - "U_n_0.5": param.n.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), - "U_p_1": param.p.U(pybamm.Scalar(1), pybamm.Scalar(0)), - "U_p_0.5": param.p.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), + "U_n_1": param.n.prim.U(pybamm.Scalar(1), pybamm.Scalar(0)), + "U_n_0.5": param.n.prim.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), + "U_p_1": param.p.prim.U(pybamm.Scalar(1), pybamm.Scalar(0)), + "U_p_0.5": param.p.prim.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), } # Process parameter_values = pybamm.ParameterValues("Sulzer2019") diff --git a/tests/unit/test_parameters/test_lithium_ion_parameters.py b/tests/unit/test_parameters/test_lithium_ion_parameters.py index d3b6028c19..d625e5cda6 100644 --- a/tests/unit/test_parameters/test_lithium_ion_parameters.py +++ b/tests/unit/test_parameters/test_lithium_ion_parameters.py @@ -34,54 +34,62 @@ def test_lithium_ion(self): # a_n_typ np.testing.assert_almost_equal( - values.evaluate(param.n.a_typ), 0.18 * 10 ** (6), 2 + values.evaluate(param.n.prim.a_typ), 0.18 * 10 ** (6), 2 ) # R_n dimensional np.testing.assert_almost_equal( - values.evaluate(param.n.R_typ), 1 * 10 ** (-5), 2 + values.evaluate(param.n.prim.R_typ), 1 * 10 ** (-5), 2 ) # a_R_n = a_n_typ * R_n_typ - np.testing.assert_almost_equal(values.evaluate(param.n.a_R), 1.8, 2) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.a_R), 1.8, 2) # a_p_typ np.testing.assert_almost_equal( - values.evaluate(param.p.a_typ), 0.15 * 10 ** (6), 2 + values.evaluate(param.p.prim.a_typ), 0.15 * 10 ** (6), 2 ) # R_p dimensional np.testing.assert_almost_equal( - values.evaluate(param.p.R_typ), 1 * 10 ** (-5), 2 + values.evaluate(param.p.prim.R_typ), 1 * 10 ** (-5), 2 ) # a_p = a_p_typ * R_p_typ - np.testing.assert_almost_equal(values.evaluate(param.p.a_R), 1.5, 2) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.a_R), 1.5, 2) # j0_m np.testing.assert_almost_equal( values.evaluate( - param.n.j0_dimensional(param.c_e_typ, param.n.c_max / 2, param.T_ref) + param.n.prim.j0_dimensional( + param.c_e_typ, param.n.prim.c_max / 2, param.T_ref + ) + ), + values.evaluate( + 2 * 10 ** (-5) * param.c_e_typ ** 0.5 * param.n.prim.c_max / 2 ), - values.evaluate(2 * 10 ** (-5) * param.c_e_typ ** 0.5 * param.n.c_max / 2), 8, ) np.testing.assert_almost_equal( - values.evaluate(param.n.gamma / param.n.C_r * c_rate), 26.6639, 3 + values.evaluate(param.n.prim.gamma / param.n.prim.C_r * c_rate), 26.6639, 3 ) # j0_p np.testing.assert_almost_equal( values.evaluate( - param.p.j0_dimensional(param.c_e_typ, param.p.c_max / 2, param.T_ref) + param.p.prim.j0_dimensional( + param.c_e_typ, param.p.prim.c_max / 2, param.T_ref + ) + ), + values.evaluate( + 6 * 10 ** (-7) * param.c_e_typ ** 0.5 * param.p.prim.c_max / 2 ), - values.evaluate(6 * 10 ** (-7) * param.c_e_typ ** 0.5 * param.p.c_max / 2), 8, ) # gamma_p / C_r_p np.testing.assert_almost_equal( - values.evaluate(param.p.gamma / param.p.C_r * c_rate), 1.366, 3 + values.evaluate(param.p.prim.gamma / param.p.prim.C_r * c_rate), 1.366, 3 ) # particle dynamics @@ -89,7 +97,9 @@ def test_lithium_ion(self): np.testing.assert_almost_equal( values.evaluate( pybamm.xyz_average( - pybamm.r_average(param.n.D_dimensional(param.n.c_init, param.T_ref)) + pybamm.r_average( + param.n.prim.D_dimensional(param.n.prim.c_init, param.T_ref) + ) ) ), 3.9 * 10 ** (-14), @@ -98,19 +108,21 @@ def test_lithium_ion(self): # neg diffusion timescale np.testing.assert_almost_equal( - values.evaluate(param.n.tau_diffusion), 2.5641 * 10 ** (3), 2 + values.evaluate(param.n.prim.tau_diffusion), 2.5641 * 10 ** (3), 2 ) # tau_n / tau_d (1/gamma_n in Scott's transfer) np.testing.assert_almost_equal( - values.evaluate(param.n.C_diff / c_rate), 0.11346, 3 + values.evaluate(param.n.prim.C_diff / c_rate), 0.11346, 3 ) # pos diffusion coefficient np.testing.assert_almost_equal( values.evaluate( pybamm.xyz_average( - pybamm.r_average(param.p.D_dimensional(param.p.c_init, param.T_ref)) + pybamm.r_average( + param.p.prim.D_dimensional(param.p.prim.c_init, param.T_ref) + ) ) ), 1 * 10 ** (-13), @@ -119,12 +131,12 @@ def test_lithium_ion(self): # pos diffusion timescale np.testing.assert_almost_equal( - values.evaluate(param.p.tau_diffusion), 1 * 10 ** (3), 2 + values.evaluate(param.p.prim.tau_diffusion), 1 * 10 ** (3), 2 ) # tau_p / tau_d (1/gamma_p in Scott's transfer) np.testing.assert_almost_equal( - values.evaluate(param.p.C_diff / c_rate), 0.044249, 3 + values.evaluate(param.p.prim.C_diff / c_rate), 0.044249, 3 ) # electrolyte dynamics diff --git a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py index 65b9c1b597..2c3b219381 100644 --- a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py +++ b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py @@ -49,11 +49,12 @@ def test_functions(self): p = "pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/" k_path = os.path.join(root, p) + c_p_max = param["Maximum concentration in positive electrode [mol.m-3]"] fun_test = { "lico2_cracking_rate_Ai2020": ([T], 3.9e-20), "lico2_diffusivity_Dualfoil1998": ([sto, T], 5.387e-15), "lico2_electrolyte_exchange_current_density_Dualfoil1998": ( - [1e3, 1e4, T], + [1e3, 1e4, T, c_p_max], 0.6098, ), "lico2_entropic_change_Ai2020_function": ([sto], -2.1373e-4), @@ -69,11 +70,12 @@ def test_functions(self): p = "pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/" k_path = os.path.join(root, p) + c_n_max = param["Maximum concentration in negative electrode [mol.m-3]"] fun_test = { "graphite_cracking_rate_Ai2020.py": ([T], 3.9e-20), "graphite_diffusivity_Dualfoil1998.py": ([sto, T], 3.9e-14), "graphite_electrolyte_exchange_current_density_Dualfoil1998.py": ( - [1e3, 1e4, T], + [1e3, 1e4, T, c_n_max], 0.4172, ), "graphite_entropy_Enertech_Ai2020_function.py": ([sto], -1.1033e-4), diff --git a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py index ee4e5be18e..93e5ced27f 100644 --- a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py +++ b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py @@ -54,10 +54,11 @@ def test_functions(self): ) k_path = os.path.join(root, p) + c_p_max = param["Maximum concentration in positive electrode [mol.m-3]"] fun_test = { "lico2_diffusivity_Ramadass2004.py": ([sto, T], 1e-14), "lico2_electrolyte_exchange_current_density_Ramadass2004.py": ( - [1e3, 1e4, T], + [1e3, 1e4, T, c_p_max], 1.4517, ), "lico2_entropic_change_Moura2016.py": ([sto], -3.4664e-5), @@ -75,10 +76,11 @@ def test_functions(self): ) k_path = os.path.join(root, p) + c_n_max = param["Maximum concentration in negative electrode [mol.m-3]"] fun_test = { "graphite_mcmb2528_diffusivity_Dualfoil1998.py": ([sto, T], 3.9e-14), "graphite_electrolyte_exchange_current_density_Ramadass2004.py": ( - [1e3, 1e4, T], + [1e3, 1e4, T, c_n_max], 2.2007, ), "graphite_entropic_change_Moura2016.py": ([sto], -1.5079e-5), diff --git a/tests/unit/test_parameters/test_parameter_sets/test_LGM50_ORegan2021.py b/tests/unit/test_parameters/test_parameter_sets/test_LGM50_ORegan2021.py index dc5f8a0416..60be4e284d 100644 --- a/tests/unit/test_parameters/test_parameter_sets/test_LGM50_ORegan2021.py +++ b/tests/unit/test_parameters/test_parameter_sets/test_LGM50_ORegan2021.py @@ -59,12 +59,13 @@ def test_functions(self): p = "pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/" k_path = os.path.join(root, p) + c_p_max = param["Maximum concentration in positive electrode [mol.m-3]"] fun_test = { "nmc_LGM50_entropic_change_ORegan2021.py": ([0.5], -9.7940e-07), "nmc_LGM50_heat_capacity_ORegan2021.py": ([298.15], 902.6502), "nmc_LGM50_diffusivity_ORegan2021.py": ([0.5, 298.15], 7.2627e-15), "nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py": ( - [1e3, 1e4, 298.15], + [1e3, 1e4, 298.15, c_p_max], 2.1939, ), "nmc_LGM50_ocp_Chen2020.py": ([0.5], 3.9720), @@ -83,12 +84,13 @@ def test_functions(self): ) k_path = os.path.join(root, p) + c_n_max = param["Maximum concentration in negative electrode [mol.m-3]"] fun_test = { "graphite_LGM50_entropic_change_ORegan2021.py": ([0.5], -2.6460e-07), "graphite_LGM50_heat_capacity_ORegan2021.py": ([298.15], 847.7155), "graphite_LGM50_diffusivity_ORegan2021.py": ([0.5, 298.15], 2.8655e-16), "graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py": ( - [1e3, 1e4, 298.15], + [1e3, 1e4, 298.15, c_n_max], 1.0372, ), "graphite_LGM50_ocp_Chen2020.py": ([0.5], 0.1331), diff --git a/tests/unit/test_parameters/test_size_distribution_parameters.py b/tests/unit/test_parameters/test_size_distribution_parameters.py index 857349ce97..26c3443594 100644 --- a/tests/unit/test_parameters/test_size_distribution_parameters.py +++ b/tests/unit/test_parameters/test_size_distribution_parameters.py @@ -19,19 +19,19 @@ def test_parameter_values(self): # check dimensionless parameters # min and max radii - np.testing.assert_almost_equal(values.evaluate(param.n.R_min), 0.0, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.R_min), 0.0, 3) - np.testing.assert_almost_equal(values.evaluate(param.n.R_max), 2.5, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.R_max), 2.5, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.R_min), 0.0, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.R_min), 0.0, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.R_max), 2.5, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.R_max), 2.5, 3) # standard deviations - np.testing.assert_almost_equal(values.evaluate(param.n.sd_a), 0.3, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.sd_a), 0.3, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.sd_a), 0.3, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.sd_a), 0.3, 3) # check function parameters (size distributions) evaluate R_test = pybamm.Scalar(1.0) - values.evaluate(param.n.f_a_dist(R_test)) - values.evaluate(param.p.f_a_dist(R_test)) + values.evaluate(param.n.prim.f_a_dist(R_test)) + values.evaluate(param.p.prim.f_a_dist(R_test)) if __name__ == "__main__": diff --git a/tests/unit/test_simulation.py b/tests/unit/test_simulation.py index b0c6f5840e..3035f0d818 100644 --- a/tests/unit/test_simulation.py +++ b/tests/unit/test_simulation.py @@ -145,7 +145,7 @@ def test_set_crate(self): def test_set_external_variable(self): model_options = { "thermal": "lumped", - "external submodels": ["thermal", "negative particle"], + "external submodels": ["thermal", "negative primary particle"], } model = pybamm.lithium_ion.SPMe(model_options) sim = pybamm.Simulation(model) diff --git a/tests/unit/test_solvers/test_idaklu_solver.py b/tests/unit/test_solvers/test_idaklu_solver.py index e0957c7082..61f6f9607a 100644 --- a/tests/unit/test_solvers/test_idaklu_solver.py +++ b/tests/unit/test_solvers/test_idaklu_solver.py @@ -72,9 +72,7 @@ def test_model_events(self): disc = pybamm.Discretisation() model_disc = disc.process_model(model, inplace=False) # Solve - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) t_eval = np.linspace(0, 1, 100) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) @@ -85,9 +83,7 @@ def test_model_events(self): # enforce events that won't be triggered model.events = [pybamm.Event("an event", var + 1)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) np.testing.assert_array_almost_equal( @@ -97,9 +93,7 @@ def test_model_events(self): # enforce events that will be triggered model.events = [pybamm.Event("an event", var - 1.01)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) solution = solver.solve(model_disc, t_eval) self.assertLess(len(solution.t), len(t_eval)) np.testing.assert_array_almost_equal( @@ -121,9 +115,7 @@ def test_model_events(self): disc = get_discretisation_for_testing() disc.process_model(model) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) t_eval = np.linspace(0, 5, 100) solution = solver.solve(model, t_eval) np.testing.assert_array_less(solution.y[0, :-1], 1.5) @@ -168,13 +160,13 @@ def test_input_params(self): b_value = np.array([[0.2], [0.3]]) sol = solver.solve( - model, t_eval, inputs={"a": a_value, "b": b_value}, + model, + t_eval, + inputs={"a": a_value, "b": b_value}, ) # test that y[3] remains constant - np.testing.assert_array_almost_equal( - sol.y[3, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[3, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -214,13 +206,13 @@ def test_ida_roberts_klu_sensitivities(self): # solve first without sensitivities sol = solver.solve( - model, t_eval, inputs={"a": a_value}, + model, + t_eval, + inputs={"a": a_value}, ) # test that y[1] remains constant - np.testing.assert_array_almost_equal( - sol.y[1, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -232,14 +224,11 @@ def test_ida_roberts_klu_sensitivities(self): # now solve with sensitivities (this should cause set_up to be run again) sol = solver.solve( - model, t_eval, inputs={"a": a_value}, - calculate_sensitivities=True + model, t_eval, inputs={"a": a_value}, calculate_sensitivities=True ) # test that y[1] remains constant - np.testing.assert_array_almost_equal( - sol.y[1, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -255,9 +244,7 @@ def test_ida_roberts_klu_sensitivities(self): dyda_fd = (sol_plus.y - sol_neg.y) / h dyda_fd = dyda_fd.transpose().reshape(-1, 1) - np.testing.assert_array_almost_equal( - dyda_ida, dyda_fd - ) + np.testing.assert_array_almost_equal(dyda_ida, dyda_fd) def test_set_atol(self): model = pybamm.lithium_ion.DFN() @@ -295,7 +282,7 @@ def test_set_atol(self): # wrong size (should fail) atol = [1, 2] solver = pybamm.IDAKLUSolver(atol=atol) - with self.assertRaisesRegex(pybamm.SolverError, 'Absolute tolerances'): + with self.assertRaisesRegex(pybamm.SolverError, "Absolute tolerances"): solver.solve(model, t_eval) def test_failures(self): @@ -330,7 +317,7 @@ def test_failures(self): # will give solver error t_eval = np.linspace(0, -3, 100) with self.assertRaisesRegex( - pybamm.SolverError, 't_eval must increase monotonically' + pybamm.SolverError, "t_eval must increase monotonically" ): solver.solve(model, t_eval) @@ -346,9 +333,7 @@ def test_failures(self): solver = pybamm.IDAKLUSolver() t_eval = np.linspace(0, 3, 100) - with self.assertRaisesRegex( - pybamm.SolverError, 'idaklu solver failed' - ): + with self.assertRaisesRegex(pybamm.SolverError, "idaklu solver failed"): solver.solve(model, t_eval) def test_dae_solver_algebraic_model(self): diff --git a/tests/unit/test_solvers/test_scipy_solver.py b/tests/unit/test_solvers/test_scipy_solver.py index 3a5625aace..916d1001ed 100644 --- a/tests/unit/test_solvers/test_scipy_solver.py +++ b/tests/unit/test_solvers/test_scipy_solver.py @@ -513,12 +513,11 @@ def test_solve_sensitivity_scalar_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) - solution = solver.solve(model, t_eval, inputs={"p": 0.1}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"p": 0.1}, calculate_sensitivities=True + ) np.testing.assert_array_equal(solution.t, t_eval) np.testing.assert_allclose(solution.y[0], np.exp(0.1 * solution.t)) np.testing.assert_allclose( @@ -549,13 +548,13 @@ def test_solve_sensitivity_scalar_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) solution = solver.solve( - model, t_eval, inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, - calculate_sensitivities=True + model, + t_eval, + inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, + calculate_sensitivities=True, ) np.testing.assert_allclose(solution.y[0], -1 + 0.2 * solution.t) np.testing.assert_allclose( @@ -625,8 +624,9 @@ def test_solve_sensitivity_vector_var_scalar_input(self): # Solve - scalar input solver = pybamm.ScipySolver() t_eval = np.linspace(0, 1) - solution = solver.solve(model, t_eval, inputs={"param": 7}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"param": 7}, calculate_sensitivities=True + ) np.testing.assert_array_almost_equal( solution["var"].data, np.tile(2 * np.exp(-7 * t_eval), (n, 1)), @@ -657,13 +657,13 @@ def test_solve_sensitivity_vector_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) solution = solver.solve( - model, t_eval, inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, - calculate_sensitivities=True + model, + t_eval, + inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, + calculate_sensitivities=True, ) np.testing.assert_allclose(solution.y, np.tile(-1 + 0.2 * solution.t, (n, 1))) np.testing.assert_allclose( @@ -737,12 +737,14 @@ def test_solve_sensitivity_vector_var_vector_input(self): n = disc.mesh["negative electrode"].npts # Solve - constant input - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1) - solution = solver.solve(model, t_eval, inputs={"param": 7 * np.ones(n)}, - calculate_sensitivities=True) + solution = solver.solve( + model, + t_eval, + inputs={"param": 7 * np.ones(n)}, + calculate_sensitivities=True, + ) l_n = mesh["negative electrode"].edges[-1] np.testing.assert_array_almost_equal( solution["var"].data, @@ -765,13 +767,12 @@ def test_solve_sensitivity_vector_var_vector_input(self): ) # Solve - linspace input - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1) p_eval = np.linspace(1, 2, n) - solution = solver.solve(model, t_eval, inputs={"param": p_eval}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"param": p_eval}, calculate_sensitivities=True + ) l_n = mesh["negative electrode"].edges[-1] np.testing.assert_array_almost_equal( solution["var"].data, 2 * np.exp(-p_eval[:, np.newaxis] * t_eval), decimal=4 diff --git a/tests/unit/test_solvers/test_solution.py b/tests/unit/test_solvers/test_solution.py index 244c70bd35..6b3dc0a068 100644 --- a/tests/unit/test_solvers/test_solution.py +++ b/tests/unit/test_solvers/test_solution.py @@ -279,11 +279,9 @@ def test_save(self): csv_str = solution.save_data(variables=["c", "2c"], to_format="csv") # check string is the same as the file - with open('test.csv') as f: + with open("test.csv") as f: # need to strip \r chars for windows - self.assertEqual( - csv_str.replace('\r', ''), f.read() - ) + self.assertEqual(csv_str.replace("\r", ""), f.read()) # read csv df = pd.read_csv("test.csv") @@ -295,11 +293,9 @@ def test_save(self): json_str = solution.save_data(to_format="json") # check string is the same as the file - with open('test.json') as f: + with open("test.json") as f: # need to strip \r chars for windows - self.assertEqual( - json_str.replace('\r', ''), f.read() - ) + self.assertEqual(json_str.replace("\r", ""), f.read()) # check if string has the right values json_data = json.loads(json_str) diff --git a/tests/unit/test_spatial_methods/test_base_spatial_method.py b/tests/unit/test_spatial_methods/test_base_spatial_method.py index bfc6ceddec..5d5fe8c46d 100644 --- a/tests/unit/test_spatial_methods/test_base_spatial_method.py +++ b/tests/unit/test_spatial_methods/test_base_spatial_method.py @@ -7,7 +7,7 @@ from tests import ( get_mesh_for_testing, get_1p1d_mesh_for_testing, - get_size_distribution_mesh_for_testing + get_size_distribution_mesh_for_testing, ) From 3c1c51bb4332f456728aafc3221c226be2594df4 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 28 Jun 2022 16:53:24 -0400 Subject: [PATCH 02/47] working on tests --- examples/scripts/compare_lithium_ion.py | 19 +++----- .../full_battery_models/base_battery_model.py | 2 - .../full_battery_models/lead_acid/full.py | 2 +- .../full_battery_models/lead_acid/loqs.py | 2 +- .../lithium_ion/__init__.py | 1 - .../lithium_ion/base_lithium_ion_model.py | 45 ++++--------------- .../interface/kinetics/diffusion_limited.py | 30 +++++-------- .../first_order_kinetics.py | 19 +++----- .../inverse_kinetics/inverse_butler_volmer.py | 4 +- .../open_circuit_potential/__init__.py | 1 - .../open_circuit_potential/base_ocp.py | 19 ++++---- .../current_sigmoid_ocp.py | 38 ---------------- .../open_circuit_potential/single_ocp.py | 2 +- pybamm/parameters/lead_acid_parameters.py | 10 ++--- .../test_lead_acid/test_loqs.py | 8 +++- .../base_lithium_ion_tests.py | 8 +++- .../test_parameter_sets/test_LCO_Ai2020.py | 9 ++-- .../test_LCO_Ramadass2004.py | 4 +- 18 files changed, 74 insertions(+), 149 deletions(-) delete mode 100644 pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 64cc05f05f..3ee7b2095e 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -3,27 +3,20 @@ # import pybamm -pybamm.set_logging_level("INFO") +pybamm.set_logging_level("DEBUG") # load models -options = { - "particle phases": ("2", "1"), - "open circuit potential": (("single", "current sigmoid"), "single"), -} models = [ - # pybamm.lithium_ion.SPM(options), - # pybamm.lithium_ion.SPMe(options), - # pybamm.lithium_ion.BasicDFNComposite(), - pybamm.lithium_ion.DFN({"particle size": "distribution"}), - # pybamm.lithium_ion.NewmanTobias(), + pybamm.lithium_ion.SPM(), + pybamm.lithium_ion.SPMe(), + pybamm.lithium_ion.DFN(), + pybamm.lithium_ion.NewmanTobias(), ] -param = pybamm.ParameterValues("Chen2020_composite") - # create and run simulations sims = [] for model in models: - sim = pybamm.Simulation(model, parameter_values=param) + sim = pybamm.Simulation(model) sim.solve([0, 3600]) sims.append(sim) diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index 8739be9c47..4dece2c05a 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -216,7 +216,6 @@ def __init__(self, extra_options): "reaction-driven", "stress and reaction-driven", ], - "open circuit potential": ["single", "current sigmoid"], "operating mode": [ "current", "voltage", @@ -495,7 +494,6 @@ def __init__(self, extra_options): "intercalation kinetics", "interface utilisation", "loss of active material", - "open circuit potential", "particle mechanics", "particle", "particle phases", diff --git a/pybamm/models/full_battery_models/lead_acid/full.py b/pybamm/models/full_battery_models/lead_acid/full.py index d4b992a7ae..0e5a1e0329 100644 --- a/pybamm/models/full_battery_models/lead_acid/full.py +++ b/pybamm/models/full_battery_models/lead_acid/full.py @@ -129,7 +129,7 @@ def set_side_reaction_submodels(self): self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ) self.submodels[ "negative oxygen interface" diff --git a/pybamm/models/full_battery_models/lead_acid/loqs.py b/pybamm/models/full_battery_models/lead_acid/loqs.py index 0212ce9722..076052669b 100644 --- a/pybamm/models/full_battery_models/lead_acid/loqs.py +++ b/pybamm/models/full_battery_models/lead_acid/loqs.py @@ -228,7 +228,7 @@ def set_side_reaction_submodels(self): self.submodels[ "leading-order positive oxygen interface" ] = pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ) self.submodels[ "leading-order negative oxygen interface" diff --git a/pybamm/models/full_battery_models/lithium_ion/__init__.py b/pybamm/models/full_battery_models/lithium_ion/__init__.py index 3b0a6719da..6d919b186e 100644 --- a/pybamm/models/full_battery_models/lithium_ion/__init__.py +++ b/pybamm/models/full_battery_models/lithium_ion/__init__.py @@ -11,6 +11,5 @@ from .basic_dfn import BasicDFN from .basic_spm import BasicSPM from .basic_dfn_half_cell import BasicDFNHalfCell -from .basic_dfn_composite import BasicDFNComposite from .Yang2017 import Yang2017 from .mpm import MPM diff --git a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py index d2dfe062c1..0cac1832ef 100644 --- a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py +++ b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py @@ -72,36 +72,16 @@ def set_submodels(self, build): self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() self.set_standard_output_variables() - if not isinstance(self, (pybamm.lithium_ion.BasicDFNComposite)): - self.set_external_circuit_submodel() - self.set_porosity_submodel() - self.set_interface_utilisation_submodel() - self.set_crack_submodel() - self.set_active_material_submodel() - self.set_transport_efficiency_submodels() - self.set_convection_submodel() - self.set_open_circuit_potential_submodel() - self.set_intercalation_kinetics_submodel() - self.set_other_reaction_submodels_to_zero() - self.set_particle_submodel() - self.set_solid_submodel() - self.set_electrolyte_submodel() - self.set_thermal_submodel() - self.set_current_collector_submodel() - - self.set_sei_submodel() - self.set_lithium_plating_submodel() - self.set_total_kinetics_submodel() - - if self.half_cell: - # This also removes "negative electrode" submodels, so should be done last - self.set_li_metal_counter_electrode_submodels() - - if build: - self.build_model() + if self.half_cell: + # This also removes "negative electrode" submodels, so should be done last + self.set_li_metal_counter_electrode_submodels() + + if build: + self.build_model() @property def default_parameter_values(self): @@ -270,15 +250,8 @@ def set_open_circuit_potential_submodel(self): phases = self.options.phase_number_to_names( getattr(self.options, domain)["particle phases"] ) - domain_options = getattr(self.options, domain) for phase in phases: - ocp_option = getattr(domain_options, phase)["open circuit potential"] - if ocp_option == "single": - ocp_model = pybamm.open_circuit_potential.SingleOpenCircuitPotential - elif ocp_option == "current sigmoid": - ocp_model = ( - pybamm.open_circuit_potential.CurrentSigmoidOpenCircuitPotential - ) + ocp_model = pybamm.open_circuit_potential.SingleOpenCircuitPotential self.submodels[f"{domain} {phase} open circuit potential"] = ocp_model( self.param, domain, "lithium-ion main", self.options, phase ) @@ -387,7 +360,7 @@ def set_li_metal_counter_electrode_submodels(self): self.submodels[ "counter electrode open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, "Negative", "lithium metal plating", self.options + self.param, "Negative", "lithium metal plating", self.options, "primary" ) if ( diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index 9e79a14d04..905182d19f 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -42,10 +42,10 @@ def get_coupled_variables(self, variables): # Get open-circuit potential variables and reaction overpotential if self.options["particle size"] == "distribution": ocp = variables[ - f"{Domain} electrode{rxn} open circuit potential distribution" + f"{Domain} electrode {rxn}open circuit potential distribution" ] else: - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi_s - ocp # Get interfacial current densities @@ -67,21 +67,15 @@ def get_coupled_variables(self, variables): # For the composite model, adds the first-order x-averaged interfacial # current density to the dictionary of variables. j_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order {self.domain.lower()} electrode {self.reaction_name}" + "interfacial current density" ] j_1_bar = (pybamm.x_average(j) - pybamm.x_average(j_0)) / self.param.C_e variables.update( { - "First-order x-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density": j_1_bar + f"First-order x-averaged {self.domain.lower()} electrode" + f" {self.reaction_name}interfacial current density": j_1_bar } ) @@ -92,9 +86,8 @@ def _get_diffusion_limited_current_density(self, variables): if self.domain == "Negative": if self.order == "leading": j_p = variables[ - "X-averaged positive electrode" - + self.reaction_name - + " interfacial current density" + f"X-averaged positive electrode {self.reaction_name}" + "interfacial current density" ] j = -self.param.p.l * j_p / self.param.n.l elif self.order in ["composite", "full"]: @@ -125,11 +118,8 @@ def _get_j_diffusion_limited_first_order(self, variables): """ if self.order == "leading": j_leading_order = variables[ - "Leading-order x-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order x-averaged {self.domain.lower()} electrode " + f"{self.reaction_name}interfacial current density" ] param = self.param if self.domain == "Negative": diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index 1223ccb3c4..cbf4796856 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -27,12 +27,11 @@ def __init__(self, param, domain, leading_order_model): def get_coupled_variables(self, variables): Domain = self.domain + domain = Domain.lower() rxn = self.reaction_name # Unpack - c_e_0 = variables[ - "Leading-order " + self.domain.lower() + " electrolyte concentration" - ] + c_e_0 = variables[f"Leading-order {domain} electrolyte concentration"] c_e = variables[self.domain + " electrolyte concentration"] c_e_1 = (c_e - c_e_0) / self.param.C_e @@ -53,18 +52,12 @@ def get_coupled_variables(self, variables): ) delta_phi_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode surface potential difference" + f"Leading-order {domain} electrode surface potential difference" ] delta_phi_1 = (delta_phi - delta_phi_0) / self.param.C_e j_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order {domain} electrode {rxn}interfacial current density" ] j_1 = dj_dc_0 * c_e_1 + dj_ddeltaphi_0 * delta_phi_1 j = j_0 + self.param.C_e * j_1 @@ -73,10 +66,10 @@ def get_coupled_variables(self, variables): # Get open-circuit potential variables and reaction overpotential if self.options["particle size"] == "distribution": ocp = variables[ - f"{Domain} electrode{rxn} open circuit potential distribution" + f"{Domain} electrode {rxn}open circuit potential distribution" ] else: - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi - ocp variables.update(self._get_standard_interfacial_current_variables(j)) diff --git a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py index 11be5e050e..523f6a1c2e 100644 --- a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py @@ -35,10 +35,10 @@ def get_coupled_variables(self, variables): if self.options["particle size"] == "distribution": ocp = variables[ - f"{Domain} electrode{rxn} open circuit potential distribution" + f"{Domain} electrode {rxn}open circuit potential distribution" ] else: - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] j0 = self._get_exchange_current_density(variables) # Broadcast to match j0's domain diff --git a/pybamm/models/submodels/interface/open_circuit_potential/__init__.py b/pybamm/models/submodels/interface/open_circuit_potential/__init__.py index d644b87e76..066fddb0b2 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/__init__.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/__init__.py @@ -1,3 +1,2 @@ from .base_ocp import BaseOpenCircuitPotential from .single_ocp import SingleOpenCircuitPotential -from .current_sigmoid_ocp import CurrentSigmoidOpenCircuitPotential diff --git a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py index 3cf9b73302..57dae2ea37 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py @@ -76,14 +76,17 @@ def _get_standard_ocp_variables(self, ocp, dUdT): ocp_dim = self.phase_param.U_ref + pot_scale * ocp ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av - variables = { - f"{Domain} electrode {reaction_name}open circuit potential": ocp, - f"{Domain} electrode {reaction_name}" "open circuit potential [V]": ocp_dim, - f"X-averaged {domain} electrode {reaction_name}" - "open circuit potential": ocp_av, - f"X-averaged {domain} electrode {reaction_name}" - "open circuit potential [V]": ocp_av_dim, - } + variables.update( + { + f"{Domain} electrode {reaction_name}open circuit potential": ocp, + f"{Domain} electrode {reaction_name}" + "open circuit potential [V]": ocp_dim, + f"X-averaged {domain} electrode {reaction_name}" + "open circuit potential": ocp_av, + f"X-averaged {domain} electrode {reaction_name}" + "open circuit potential [V]": ocp_av_dim, + } + ) if self.reaction in ["lithium-ion main", "lead-acid main"]: variables.update( { diff --git a/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py deleted file mode 100644 index 0405c8e455..0000000000 --- a/pybamm/models/submodels/interface/open_circuit_potential/current_sigmoid_ocp.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Different OCPs for charge and discharge, based on current -# -import pybamm -from . import BaseOpenCircuitPotential - - -class CurrentSigmoidOpenCircuitPotential(BaseOpenCircuitPotential): - def get_coupled_variables(self, variables): - current = variables["Total current density"] - k = 100 - m_lith = pybamm.sigmoid(current, 0, k) # for lithation (current < 0) - m_delith = 1 - m_lith # for delithiation (current > 0) - - Domain = self.domain - phase_name = self.phase_name - - if self.reaction == "lithium-ion main": - T = variables[f"{Domain} electrode temperature"] - # Particle size distribution is not yet implemented - if self.options["particle size"] != "distribution": - c_s_surf = variables[ - f"{Domain} {phase_name}particle surface concentration" - ] - # If variable was broadcast, take only the orphan - if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( - T, pybamm.Broadcast - ): - c_s_surf = c_s_surf.orphans[0] - T = T.orphans[0] - - U_lith = self.phase_param.U(c_s_surf, T, "lithiation") - U_delith = self.phase_param.U(c_s_surf, T, "delithiation") - ocp = m_lith * U_lith + m_delith * U_delith - dUdT = self.phase_param.dUdT(c_s_surf) - - variables.update(self._get_standard_ocp_variables(ocp, dUdT)) - return variables diff --git a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py index 0fe0598811..2677bf8c9e 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py @@ -56,7 +56,7 @@ def get_coupled_variables(self, variables): dUdT = pybamm.Scalar(0) elif self.reaction == "lead-acid oxygen": - ocp = self.domain_param.U_Ox + ocp = self.phase_param.U_Ox dUdT = pybamm.Scalar(0) else: diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index 3d0fbee1ec..0f57cd7ed4 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -567,11 +567,6 @@ def _set_dimensionless_parameters(self): self.Q_max = self.Q_max_dimensional / (main.c_e_typ * main.F) self.beta_U = 1 / self.Q_max - # Electrochemical reactions - # Oxygen - self.U_Ox = (main.U_Ox_dim - self.prim.U_ref) / main.potential_scale - self.U_Hy = (main.U_Hy_dim - self.prim.U_ref) / main.potential_scale - # Electrolyte properties self.beta_surf = ( -main.c_e_typ * self.DeltaVsurf / self.prim.ne_S @@ -717,6 +712,11 @@ def _set_dimensionless_parameters(self): self.c_init = main.c_e_init self.U_init = self.U(main.c_e_init, main.T_init) + # Electrochemical reactions + # Oxygen + self.U_Ox = (main.U_Ox_dim - self.U_ref) / main.potential_scale + self.U_Hy = (main.U_Hy_dim - self.U_ref) / main.potential_scale + def U(self, c_e, T): """Dimensionless open-circuit voltage in the negative electrode""" c_e_dimensional = c_e * self.main_param.c_e_typ diff --git a/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py b/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py index ba97870bab..ac0ae53fe0 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py +++ b/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py @@ -135,7 +135,13 @@ def test_well_posed_function(self): def external_circuit_function(variables): I = variables["Current [A]"] V = variables["Terminal voltage [V]"] - return V + I - pybamm.FunctionParameter("Function", {"Time [s]": pybamm.t}) + return ( + V + + I + - pybamm.FunctionParameter( + "Function", {"Time [s]": pybamm.t}, print_name="test_fun" + ) + ) options = {"operating mode": external_circuit_function} model = pybamm.lead_acid.LOQS(options) diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 07b3d88972..9a69bae87e 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -262,7 +262,13 @@ def test_well_posed_external_circuit_function(self): def external_circuit_function(variables): I = variables["Current [A]"] V = variables["Terminal voltage [V]"] - return V + I - pybamm.FunctionParameter("Function", {"Time [s]": pybamm.t}) + return ( + V + + I + - pybamm.FunctionParameter( + "Function", {"Time [s]": pybamm.t}, print_name="test_fun" + ) + ) options = {"operating mode": external_circuit_function} self.check_well_posedness(options) diff --git a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py index 2c3b219381..ebbe72e6c5 100644 --- a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py +++ b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ai2020.py @@ -57,9 +57,9 @@ def test_functions(self): [1e3, 1e4, T, c_p_max], 0.6098, ), - "lico2_entropic_change_Ai2020_function": ([sto], -2.1373e-4), + "lico2_entropic_change_Ai2020_function": ([sto, c_p_max], -2.1373e-4), "lico2_ocp_Ai2020_function.py": ([sto], 4.1638), - "lico2_volume_change_Ai2020": ([sto], -1.8179e-2), + "lico2_volume_change_Ai2020": ([sto, c_p_max], -1.8179e-2), } for name, value in fun_test.items(): @@ -78,7 +78,10 @@ def test_functions(self): [1e3, 1e4, T, c_n_max], 0.4172, ), - "graphite_entropy_Enertech_Ai2020_function.py": ([sto], -1.1033e-4), + "graphite_entropy_Enertech_Ai2020_function.py": ( + [sto, c_n_max], + -1.1033e-4, + ), "graphite_ocp_Enertech_Ai2020_function.py": ([sto], 0.1395), "graphite_volume_change_Ai2020.py": ([sto], 5.1921e-2), } diff --git a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py index 93e5ced27f..4bdebbe97a 100644 --- a/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py +++ b/tests/unit/test_parameters/test_parameter_sets/test_LCO_Ramadass2004.py @@ -61,7 +61,7 @@ def test_functions(self): [1e3, 1e4, T, c_p_max], 1.4517, ), - "lico2_entropic_change_Moura2016.py": ([sto], -3.4664e-5), + "lico2_entropic_change_Moura2016.py": ([sto, c_p_max], -3.4664e-5), "lico2_ocp_Ramadass2004.py": ([sto], 4.1249), } @@ -83,7 +83,7 @@ def test_functions(self): [1e3, 1e4, T, c_n_max], 2.2007, ), - "graphite_entropic_change_Moura2016.py": ([sto], -1.5079e-5), + "graphite_entropic_change_Moura2016.py": ([sto, c_n_max], -1.5079e-5), "graphite_ocp_Ramadass2004.py": ([sto], 0.1215), } From e814d0e530dcf439b316d0d0777b52e20f858880 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 29 Jun 2022 09:41:17 -0400 Subject: [PATCH 03/47] style --- .../graphite_entropic_change_Moura2016.py | 2 +- .../submodels/active_material/base_active_material.py | 7 ++++--- .../models/submodels/interface/kinetics/total_kinetics.py | 3 ++- pybamm/parameters/geometric_parameters.py | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py index 5f350a8a79..7547bcf332 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_entropic_change_Moura2016.py @@ -1,4 +1,4 @@ -from pybamm import exp, cosh, Parameter +from pybamm import exp, cosh def graphite_entropic_change_Moura2016(sto, c_s_max): diff --git a/pybamm/models/submodels/active_material/base_active_material.py b/pybamm/models/submodels/active_material/base_active_material.py index d4e002fd4c..243665d3ae 100644 --- a/pybamm/models/submodels/active_material/base_active_material.py +++ b/pybamm/models/submodels/active_material/base_active_material.py @@ -37,9 +37,10 @@ def _get_standard_active_material_variables(self, eps_solid): eps_solid_av = pybamm.x_average(eps_solid) variables = { - f"{Domain} electrode {phase_name}active material volume fraction": eps_solid, - f"X-averaged {domain} electrode {phase_name}active material volume fraction" - "": eps_solid_av, + f"{Domain} electrode {phase_name}" + "active material volume fraction": eps_solid, + f"X-averaged {domain} electrode {phase_name}" + "active material volume fraction": eps_solid_av, } # Update other microstructure variables diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py index 18cbfc712b..2192f32a41 100644 --- a/pybamm/models/submodels/interface/kinetics/total_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -262,7 +262,8 @@ def get_coupled_variables(self, variables): "Sum of x-averaged negative electrode interfacial current densities" ] += j_n_av new_variables[ - "Sum of area-weighted negative electrode interfacial current densities" + "Sum of area-weighted negative electrode " + "interfacial current densities" ] += (a_n * j_n) new_variables[ "Sum of x-averaged area-weighted negative electrode " diff --git a/pybamm/parameters/geometric_parameters.py b/pybamm/parameters/geometric_parameters.py index 78668f2852..7d7bf9d8e1 100644 --- a/pybamm/parameters/geometric_parameters.py +++ b/pybamm/parameters/geometric_parameters.py @@ -186,7 +186,8 @@ def f_a_dist_dimensional(self, R): """ inputs = {f"{self.phase_prefactor}{self.domain} particle-size variable [m]": R} return pybamm.FunctionParameter( - f"{self.phase_prefactor}{self.domain} area-weighted particle-size distribution [m-1]", + f"{self.phase_prefactor}{self.domain} " + "area-weighted particle-size distribution [m-1]", inputs, ) From c30390fa3a4097dce54800a90c538382bdfd1f50 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 1 Jul 2022 16:07:03 -0400 Subject: [PATCH 04/47] remove duplication --- ...raphite_electrolyte_exchange_current_density_Dualfoil1998.py | 2 -- ...phite_LGM50_electrolyte_exchange_current_density_Chen2020.py | 2 -- ...phite_LGM50_electrolyte_exchange_current_density_Chen2020.py | 2 -- .../graphite_electrolyte_exchange_current_density_Ecker2015.py | 2 -- .../graphite_electrolyte_exchange_current_density_Kim2011.py | 2 -- ...ite_LGM50_electrolyte_exchange_current_density_ORegan2021.py | 2 -- ...raphite_electrolyte_exchange_current_density_Ramadass2004.py | 2 -- .../graphite_electrolyte_exchange_current_density_PeymanMPM.py | 2 -- ...raphite_electrolyte_exchange_current_density_Dualfoil1998.py | 2 -- .../LFP_electrolyte_exchange_current_density_kashkooli2017.py | 2 -- .../nco_electrolyte_exchange_current_density_Ecker2015.py | 2 -- .../nmc_electrolyte_exchange_current_density_Xu2019.py | 2 -- .../NMC_electrolyte_exchange_current_density_PeymanMPM.py | 2 -- .../lico2_electrolyte_exchange_current_density_Dualfoil1998.py | 2 -- .../lico2_electrolyte_exchange_current_density_Dualfoil1998.py | 2 -- .../lico2_electrolyte_exchange_current_density_Ramadass2004.py | 2 -- .../nca_electrolyte_exchange_current_density_Kim2011.py | 2 -- .../nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py | 2 -- ...nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py | 2 -- 19 files changed, 38 deletions(-) diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py index c225dc14c3..915928a668 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ai2020/graphite_electrolyte_exchange_current_density_Dualfoil1998.py @@ -22,8 +22,6 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py index 6b702c73e3..53f35373a9 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -25,8 +25,6 @@ def graphite_LGM50_electrolyte_exchange_current_density_Chen2020( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py index 6a7df6093b..a42fe23efb 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Chen2020_plating/graphite_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -25,8 +25,6 @@ def graphite_LGM50_electrolyte_exchange_current_density_Chen2020( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py index ecc0c57a1d..a64946a6c0 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ecker2015/graphite_electrolyte_exchange_current_density_Ecker2015.py @@ -28,8 +28,6 @@ def graphite_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py index f3de680b39..d350faec71 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Kim2011/graphite_electrolyte_exchange_current_density_Kim2011.py @@ -24,8 +24,6 @@ def graphite_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, c_s_max Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py index 9c937c8d5b..c3d3c40af7 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_ORegan2021/graphite_LGM50_electrolyte_exchange_current_density_ORegan2021.py @@ -25,8 +25,6 @@ def graphite_LGM50_electrolyte_exchange_current_density_ORegan2021( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py index bf3df71978..fd7e924904 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_Ramadass2004/graphite_electrolyte_exchange_current_density_Ramadass2004.py @@ -24,8 +24,6 @@ def graphite_electrolyte_exchange_current_density_Ramadass2004( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py index e5f34f496c..8c7b9ad635 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_UMBL_Mohtat2020/graphite_electrolyte_exchange_current_density_PeymanMPM.py @@ -21,8 +21,6 @@ def graphite_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py index 94ccc20eec..1c70b3259c 100644 --- a/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/negative_electrodes/graphite_mcmb2528_Marquis2019/graphite_electrolyte_exchange_current_density_Dualfoil1998.py @@ -22,8 +22,6 @@ def graphite_electrolyte_exchange_current_density_Dualfoil1998( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py index 1b9736c51a..391f548166 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/LFP_Prada2013/LFP_electrolyte_exchange_current_density_kashkooli2017.py @@ -22,8 +22,6 @@ def LFP_electrolyte_exchange_current_density_kashkooli2017(c_e, c_s_surf, c_s_ma Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py index c63c14bfb6..5b83493c2d 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/LiNiCoO2_Ecker2015/nco_electrolyte_exchange_current_density_Ecker2015.py @@ -28,8 +28,6 @@ def nco_electrolyte_exchange_current_density_Ecker2015(c_e, c_s_surf, c_s_max, T Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py index 158bdd5942..0fb17546fd 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC532_Xu2019/nmc_electrolyte_exchange_current_density_Xu2019.py @@ -23,8 +23,6 @@ def nmc_electrolyte_exchange_current_density_Xu2019(c_e, c_s_surf, c_s_max, T): Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py index 1378dc82f3..69d4e40264 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/NMC_UMBL_Mohtat2020/NMC_electrolyte_exchange_current_density_PeymanMPM.py @@ -20,8 +20,6 @@ def NMC_electrolyte_exchange_current_density_PeymanMPM(c_e, c_s_surf, c_s_max, T Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py index 790b819b11..b378cf0e5f 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ai2020/lico2_electrolyte_exchange_current_density_Dualfoil1998.py @@ -20,8 +20,6 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py index 640ddb4270..60ce33b258 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Marquis2019/lico2_electrolyte_exchange_current_density_Dualfoil1998.py @@ -20,8 +20,6 @@ def lico2_electrolyte_exchange_current_density_Dualfoil1998(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py index 7a7b4f67fe..65f244a88b 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/lico2_Ramadass2004/lico2_electrolyte_exchange_current_density_Ramadass2004.py @@ -22,8 +22,6 @@ def lico2_electrolyte_exchange_current_density_Ramadass2004(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py index b0135d43ed..253b68a083 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nca_Kim2011/nca_electrolyte_exchange_current_density_Kim2011.py @@ -23,8 +23,6 @@ def nca_electrolyte_exchange_current_density_Kim2011(c_e, c_s_surf, c_s_max, T): Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py index 74d4bbb544..9e92d58676 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_Chen2020/nmc_LGM50_electrolyte_exchange_current_density_Chen2020.py @@ -23,8 +23,6 @@ def nmc_LGM50_electrolyte_exchange_current_density_Chen2020(c_e, c_s_surf, c_s_m Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- diff --git a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py index d2b1dc426b..caf90b3c2c 100644 --- a/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py +++ b/pybamm/input/parameters/lithium_ion/positive_electrodes/nmc_ORegan2021/nmc_LGM50_electrolyte_exchange_current_density_ORegan2021.py @@ -25,8 +25,6 @@ def nmc_LGM50_electrolyte_exchange_current_density_ORegan2021( Maximum particle concentration [mol.m-3] T : :class:`pybamm.Symbol` Temperature [K] - c_s_max : :class:`pybamm.Symbol` - Maximum particle concentration [mol.m-3] Returns ------- From aae977e3863c652fb8cc2dbd21ddcd2b39988565 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 6 Jul 2022 13:48:16 -0400 Subject: [PATCH 05/47] rename variables with {phase} and add param.prim --- CHANGELOG.md | 6 +- docs/requirements.txt | 2 +- examples/notebooks/compare-ecker-data.ipynb | 286 ++++++++++ pybamm/CITATIONS.txt | 14 +- pybamm/expression_tree/averages.py | 28 +- pybamm/expression_tree/broadcasts.py | 37 +- .../expression_tree/independent_variable.py | 8 +- pybamm/expression_tree/parameter.py | 20 +- pybamm/expression_tree/printing/print_name.py | 4 +- pybamm/geometry/battery_geometry.py | 13 +- .../parameters.csv | 1 - .../full_battery_models/base_battery_model.py | 102 ++-- .../lead_acid/base_lead_acid_model.py | 21 +- .../lead_acid/basic_full.py | 20 +- .../full_battery_models/lead_acid/full.py | 9 +- .../lead_acid/higher_order.py | 7 +- .../full_battery_models/lead_acid/loqs.py | 19 +- .../lithium_ion/base_lithium_ion_model.py | 92 ++-- .../lithium_ion/basic_dfn.py | 55 +- .../lithium_ion/basic_dfn_half_cell.py | 28 +- .../lithium_ion/basic_spm.py | 40 +- .../full_battery_models/lithium_ion/dfn.py | 71 ++- .../lithium_ion/electrode_soh.py | 4 +- .../lithium_ion/electrode_soh_half_cell.py | 2 +- .../lithium_ion/newman_tobias.py | 20 - .../full_battery_models/lithium_ion/spm.py | 74 ++- .../submodels/active_material/__init__.py | 1 + .../active_material/base_active_material.py | 83 +-- .../constant_active_material.py | 4 +- .../active_material/loss_active_material.py | 2 +- .../active_material/total_active_material.py | 79 +++ pybamm/models/submodels/base_submodel.py | 38 +- .../submodels/electrode/base_electrode.py | 5 +- .../submodels/electrode/ohm/full_ohm.py | 11 +- .../submodels/electrode/ohm/li_metal.py | 6 +- .../base_electrolyte_conductivity.py | 22 +- .../full_conductivity.py | 22 +- .../composite_surface_form_conductivity.py | 2 +- .../full_surface_form_conductivity.py | 24 +- .../leading_surface_form_conductivity.py | 2 +- .../submodels/interface/base_interface.py | 488 ++++++------------ .../submodels/interface/kinetics/__init__.py | 3 + .../interface/kinetics/base_kinetics.py | 46 +- .../interface/kinetics/butler_volmer.py | 14 +- .../interface/kinetics/diffusion_limited.py | 48 +- .../first_order_kinetics.py | 30 +- .../inverse_kinetics/inverse_butler_volmer.py | 37 +- .../submodels/interface/kinetics/linear.py | 6 +- .../submodels/interface/kinetics/marcus.py | 16 +- .../interface/kinetics/no_reaction.py | 24 +- .../submodels/interface/kinetics/tafel.py | 12 +- .../interface/kinetics/total_kinetics.py | 237 +++++++++ .../interface/lithium_plating/base_plating.py | 17 +- .../interface/lithium_plating/plating.py | 4 +- .../open_circuit_potential/base_ocp.py | 63 +-- .../open_circuit_potential/single_ocp.py | 28 +- .../submodels/interface/sei/base_sei.py | 22 +- .../submodels/particle/base_particle.py | 134 +++-- .../particle/no_distribution/base_fickian.py | 28 +- .../no_distribution/fickian_diffusion.py | 58 ++- .../no_distribution/polynomial_profile.py | 23 +- .../x_averaged_fickian_diffusion.py | 81 ++- .../x_averaged_polynomial_profile.py | 26 +- .../size_distribution/base_distribution.py | 8 +- .../size_distribution/fickian_diffusion.py | 16 +- .../size_distribution/uniform_profile.py | 6 +- .../x_averaged_fickian_diffusion.py | 23 +- .../x_averaged_uniform_profile.py | 6 +- .../particle_mechanics/base_mechanics.py | 8 +- .../base_transport_efficiency.py | 24 +- .../bruggeman_transport_efficiency.py | 10 +- pybamm/parameters/base_parameters.py | 52 +- pybamm/parameters/geometric_parameters.py | 96 ++-- pybamm/parameters/lead_acid_parameters.py | 220 +++++--- pybamm/parameters/lithium_ion_parameters.py | 480 +++++++++++------ pybamm/parameters/parameter_values.py | 31 +- pybamm/simulation.py | 4 +- requirements.txt | 2 +- setup.py | 2 +- tests/unit/test_citations.py | 8 +- .../test_operations/test_convert_to_casadi.py | 20 +- .../test_printing/__init__.py | 0 .../test_printing/test_print_name.py | 13 +- .../test_base_battery_model.py | 3 +- .../test_lead_acid/test_loqs.py | 8 +- .../base_lithium_ion_tests.py | 8 +- .../test_lithium_ion/test_basic_models.py | 10 + .../test_lithium_ion/test_spm.py | 5 +- .../standard_submodel_unit_tests.py | 52 ++ .../test_parameters/test_base_parameters.py | 6 +- .../test_lead_acid_parameters.py | 8 +- .../test_lithium_ion_parameters.py | 48 +- .../test_size_distribution_parameters.py | 16 +- tests/unit/test_simulation.py | 2 +- tests/unit/test_solvers/test_idaklu_solver.py | 51 +- tests/unit/test_solvers/test_scipy_solver.py | 55 +- .../test_base_spatial_method.py | 2 +- 97 files changed, 2435 insertions(+), 1597 deletions(-) create mode 100644 examples/notebooks/compare-ecker-data.ipynb create mode 100644 pybamm/models/submodels/active_material/total_active_material.py create mode 100644 pybamm/models/submodels/interface/kinetics/total_kinetics.py create mode 100644 tests/unit/test_expression_tree/test_printing/__init__.py create mode 100644 tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 41a7728a51..e8f6526312 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ ## Features - Added open-circuit potential as a separate submodel ([#2094](https://github.com/pybamm-team/PyBaMM/pull/2094)) +- Reformated submodel structure to allow composite electrodes, with an example for graphite/silicon. Composite positive electrode is now also possible. With current implementation, electrodes can have at most two phases. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) +- Added "Chen2020_composite" parameter set for a composite graphite/silicon electrode. Silicon parameters are added as a standard negative electrode parameter set, specified as the "negative electrode secondary" set, which automatically adds "Secondary:" to the start of each parameter name. Primary (graphite) parameter names are unchanged. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) - Added partially reversible lithium plating model and new `OKane2022` parameter set to go with it ([#2043](https://github.com/pybamm-team/PyBaMM/pull/2043)) - Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) @@ -34,6 +36,7 @@ ## Features +- Added a casadi version of the IDKLU solver, which is used for `model.convert_to_format = "casadi"` ([#2002](https://github.com/pybamm-team/PyBaMM/pull/2002)) - Added functionality to generate Julia expressions from a model. See [PyBaMM.jl](https://github.com/tinosulzer/PyBaMM.jl) for how to use these ([#1942](https://github.com/pybamm-team/PyBaMM/pull/1942))) - Added basic callbacks to the Simulation class, and a LoggingCallback ([#1880](https://github.com/pybamm-team/PyBaMM/pull/1880))) @@ -43,7 +46,8 @@ ## Breaking changes -- Changed domain-specific parameter names to a nested attribute, e.g. `param.c_n_max` is now `param.n.c_max` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) +- Exchange-current density functions now take a fourth argument, the maximum particle concentration for that phase +- Changed domain-specific parameter names to a nested attribute. `param.l_n` is now `param.n.l`. Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) # [v22.4](https://github.com/pybamm-team/PyBaMM/tree/v22.4) - 2022-04-30 diff --git a/docs/requirements.txt b/docs/requirements.txt index b5c1baf29b..d8a7ccb655 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ # Requirements for readthedocs.io -numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed +numpy >= 1.16 scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 diff --git a/examples/notebooks/compare-ecker-data.ipynb b/examples/notebooks/compare-ecker-data.ipynb new file mode 100644 index 0000000000..8d1c69380d --- /dev/null +++ b/examples/notebooks/compare-ecker-data.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparing with Experimental Data\n", + "\n", + "In this notebook we show how to compare results generated in PyBaMM with experimental data. We compare the results of the DFN model (see the [DFN notebook](./models/DFN.ipynb)) with the experimental data from Ecker et. al. [[3]](#References). Results are compared for a constant current discharge at 1C and at 5C." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we import pybamm and any other packages required by this example, and then change our working directory to the root of the pybamm folder." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import os\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "os.chdir(pybamm.__path__[0]+'/..')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then load the Ecker data in from the `.csv` files using `pandas`" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "voltage_data_1C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_1C.csv\", header=None).to_numpy()\n", + "voltage_data_5C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_5C.csv\", header=None).to_numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the data is Time [s] vs Voltage [V]." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We load the DFN model and select the parameter set from the Ecker paper [1]. We update the C-rate an `InputParameter` so that we can re-run the same model at different C-rates without the need to rebuild the model. This is done by passing the flag `[input]`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# choose DFN\n", + "model1 = pybamm.lithium_ion.SPMe()\n", + "model2 = pybamm.lithium_ion.DFN()\n", + "\n", + "# pick parameters, keeping C-rate as an input to be changed for each solve\n", + "chemistry = pybamm.parameter_sets.Ecker2015\n", + "parameter_values = pybamm.ParameterValues(chemistry=chemistry)\n", + "parameter_values.update({\"Current function [A]\": \"[input]\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this comparison we choose a fine mesh of 1 finite volume per micron in the electrodes and separator and 1 finite volume per 0.1 micron in the particles" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "var = pybamm.standard_spatial_vars\n", + "var_pts = {\n", + " var.x_n: int(parameter_values.evaluate(model1.param.L_n / 1e-6)),\n", + " var.x_s: int(parameter_values.evaluate(model1.param.L_s / 1e-6)),\n", + " var.x_p: int(parameter_values.evaluate(model1.param.L_p / 1e-6)),\n", + " var.r_n: int(parameter_values.evaluate(model1.param.R_n_typ / 1e-7)),\n", + " var.r_p: int(parameter_values.evaluate(model1.param.R_p_typ / 1e-7)),\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create a simulation using our model, parameters and number of grid points" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "sim1 = pybamm.Simulation(model1, parameter_values=parameter_values, var_pts=var_pts)\n", + "sim2 = pybamm.Simulation(model2, parameter_values=parameter_values, var_pts=var_pts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then solve the model for a 1C and 5C discharge " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "C_rates = [1, 5] # C-rates to solve for\n", + "capacity = parameter_values[\"Nominal cell capacity [A.h]\"]\n", + "t_evals = [\n", + " np.linspace(0, 3800, 100), \n", + " np.linspace(0, 720, 100)\n", + "] # times to return the solution at\n", + "solutions1 = [None] * len(C_rates) # empty list that will hold solutions\n", + "solutions2 = [None] * len(C_rates) # empty list that will hold solutions\n", + "\n", + "# loop over C-rates\n", + "for i, C_rate in enumerate(C_rates):\n", + " current = C_rate * capacity\n", + " sim1.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", + " solutions1[i] = sim1.solution\n", + " sim2.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", + " solutions2[i] = sim2.solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we plot the numerical solution against the experimental data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", + "\n", + "# plot the 1C results\n", + "t_sol = solutions1[0][\"Time [s]\"].entries\n", + "ax1.plot(t_sol, solutions1[0][\"Terminal voltage [V]\"](t_sol))\n", + "t_sol = solutions2[0][\"Time [s]\"].entries\n", + "ax1.plot(t_sol, solutions2[0][\"Terminal voltage [V]\"](t_sol))\n", + "ax1.plot(voltage_data_1C[:,0], voltage_data_1C[:,1], \"o\")\n", + "ax1.set_xlabel(\"Time [s]\")\n", + "ax1.set_ylabel(\"Voltage [V]\")\n", + "ax1.set_title(\"1C\")\n", + "ax1.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", + "\n", + "# plot the 5C results\n", + "t_sol = solutions1[1][\"Time [s]\"].entries\n", + "ax2.plot(t_sol, solutions1[1][\"Terminal voltage [V]\"](t_sol))\n", + "t_sol = solutions2[1][\"Time [s]\"].entries\n", + "ax2.plot(t_sol, solutions2[1][\"Terminal voltage [V]\"](t_sol))\n", + "ax2.plot(voltage_data_5C[:,0], voltage_data_5C[:,1], \"o\")\n", + "ax2.set_xlabel(\"Time [s]\")\n", + "ax2.set_ylabel(\"Voltage [V]\")\n", + "ax2.set_title(\"5C\")\n", + "ax2.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a 1C discharge we observe an excellent agreement between the model and experiment, both in terms of the overall shape of the curve and the capacity. The agreement between model and experiment is less good at 5C, but in line with other implementations of the DFN (e.g. [[6]](#References)). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", + "[3] Madeleine Ecker, Stefan Käbitz, Izaro Laresgoiti, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: II. Model Validation. Journal of The Electrochemical Society, 162(9):A1849–A1857, 2015. doi:10.1149/2.0541509jes.\n", + "[4] Madeleine Ecker, Thi Kim Dung Tran, Philipp Dechent, Stefan Käbitz, Alexander Warnecke, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: I. Determination of Parameters. Journal of the Electrochemical Society, 162(9):A1836–A1848, 2015. doi:10.1149/2.0551509jes.\n", + "[5] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[6] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[7] Giles Richardson, Ivan Korotkin, Rahifa Ranom, Michael Castle, and Jamie M. Foster. Generalised single particle models for high-rate operation of graded lithium-ion electrodes: systematic derivation and validation. Electrochimica Acta, 339:135862, 2020. doi:10.1016/j.electacta.2020.135862.\n", + "[8] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pybamm/CITATIONS.txt b/pybamm/CITATIONS.txt index 34c50da52d..5da95f824c 100644 --- a/pybamm/CITATIONS.txt +++ b/pybamm/CITATIONS.txt @@ -10,6 +10,18 @@ doi = {10.1149/2.0122001JES}, } +@article{Ai2022, + title = {A composite electrode model for lithium-ion batteries with silicon/graphite negative electrodes}, + journal = {Journal of Power Sources}, + volume = {527}, + pages = {231142}, + year = {2022}, + issn = {0378-7753}, + doi = {https://doi.org/10.1016/j.jpowsour.2022.231142}, + url = {https://www.sciencedirect.com/science/article/pii/S0378775322001604}, + author = {Weilong Ai and Niall Kirkaldy and Yang Jiang and Gregory Offer and Huizhi Wang and Billy Wu}, +} + @article{Andersson2019, author = {Andersson, Joel A. E. and Gillis, Joris and Horn, Greg and Rawlings, James B. and Diehl, Moritz}, @@ -506,4 +518,4 @@ pages={A3169}, year={2018}, publisher={IOP Publishing} -} +} \ No newline at end of file diff --git a/pybamm/expression_tree/averages.py b/pybamm/expression_tree/averages.py index 23b881eaab..ab19c60c90 100644 --- a/pybamm/expression_tree/averages.py +++ b/pybamm/expression_tree/averages.py @@ -21,15 +21,9 @@ def __init__(self, child, name, integration_variable): class XAverage(_BaseAverage): def __init__(self, child): - if child.domain in [ - ["negative particle"], - ["negative particle size"], - ]: + if all(n in child.domain[0] for n in ["negative", "particle"]): x = pybamm.standard_spatial_vars.x_n - elif child.domain in [ - ["positive particle"], - ["positive particle size"], - ]: + elif all(n in child.domain[0] for n in ["positive", "particle"]): x = pybamm.standard_spatial_vars.x_p else: x = pybamm.SpatialVariable("x", domain=child.domain) @@ -270,12 +264,17 @@ def r_average(symbol): :class:`Symbol` the new averaged symbol """ + has_particle_domain = ( + symbol.domain != [] + and "particle" in symbol.domain[0] + and "size" not in symbol.domain[0] + ) # Can't take average if the symbol evaluates on edges if symbol.evaluates_on_edges("primary"): raise ValueError("Can't take the r-average of a symbol that evaluates on edges") # Otherwise, if symbol doesn't have a particle domain, # its r-averaged value is itself - elif symbol.domain not in [["positive particle"], ["negative particle"]]: + elif not has_particle_domain: return symbol # If symbol is a secondary broadcast onto "negative electrode" or # "positive electrode", take the r-average of the child then broadcast back @@ -286,9 +285,10 @@ def r_average(symbol): child_av = pybamm.r_average(child) return pybamm.PrimaryBroadcast(child_av, symbol.domains["secondary"]) # If symbol is a Broadcast onto a particle domain, its average value is its child - elif isinstance( - symbol, (pybamm.PrimaryBroadcast, pybamm.FullBroadcast) - ) and symbol.domain in [["positive particle"], ["negative particle"]]: + elif ( + isinstance(symbol, (pybamm.PrimaryBroadcast, pybamm.FullBroadcast)) + and has_particle_domain + ): return symbol.reduce_one_dimension() else: return RAverage(symbol) @@ -341,7 +341,7 @@ def size_average(symbol, f_a_dist=None): "R", domains=symbol.domains, coord_sys="cartesian" ) if ["negative particle size"] in symbol.domains.values(): - f_a_dist = geo.n.f_a_dist(R) + f_a_dist = geo.n.prim.f_a_dist(R) elif ["positive particle size"] in symbol.domains.values(): - f_a_dist = geo.p.f_a_dist(R) + f_a_dist = geo.p.prim.f_a_dist(R) return SizeAverage(symbol, f_a_dist) diff --git a/pybamm/expression_tree/broadcasts.py b/pybamm/expression_tree/broadcasts.py index 660bcf0d37..88514d8b64 100644 --- a/pybamm/expression_tree/broadcasts.py +++ b/pybamm/expression_tree/broadcasts.py @@ -89,29 +89,28 @@ def check_and_set_domains(self, child, broadcast_domain): # Note e.g. current collector to particle *is* allowed if child.domain == []: pass - elif child.domain == ["current collector"] and broadcast_domain[0] not in [ - "negative electrode", - "separator", - "positive electrode", - "negative particle size", - "positive particle size", - "negative particle", - "positive particle", - ]: + elif child.domain == ["current collector"] and not ( + broadcast_domain[0] + in [ + "negative electrode", + "separator", + "positive electrode", + ] + or "particle" in broadcast_domain[0] + ): raise pybamm.DomainError( """Primary broadcast from current collector domain must be to electrode or separator or particle or particle size domains""" ) - elif child.domain[0] in [ - "negative electrode", - "separator", - "positive electrode", - ] and broadcast_domain[0] not in [ - "negative particle", - "positive particle", - "negative particle size", - "positive particle size", - ]: + elif ( + child.domain[0] + in [ + "negative electrode", + "separator", + "positive electrode", + ] + and "particle" not in broadcast_domain[0] + ): raise pybamm.DomainError( """Primary broadcast from electrode or separator must be to particle or particle size domains""" diff --git a/pybamm/expression_tree/independent_variable.py b/pybamm/expression_tree/independent_variable.py index 6416d7c81b..1e1a71f97c 100644 --- a/pybamm/expression_tree/independent_variable.py +++ b/pybamm/expression_tree/independent_variable.py @@ -119,11 +119,15 @@ def __init__( raise ValueError("domain must be provided") # Check symbol name vs domain name - if name == "r_n" and domain != ["negative particle"]: + if name == "r_n" and not all(n in domain[0] for n in ["negative", "particle"]): + # catches "negative particle", "negative secondary particle", etc raise pybamm.DomainError( "domain must be negative particle if name is 'r_n'" ) - elif name == "r_p" and domain != ["positive particle"]: + elif name == "r_p" and not all( + n in domain[0] for n in ["positive", "particle"] + ): + # catches "positive particle", "positive secondary particle", etc raise pybamm.DomainError( "domain must be positive particle if name is 'r_p'" ) diff --git a/pybamm/expression_tree/parameter.py b/pybamm/expression_tree/parameter.py index cdff946c11..a40dd0114a 100644 --- a/pybamm/expression_tree/parameter.py +++ b/pybamm/expression_tree/parameter.py @@ -109,11 +109,16 @@ def __init__( self.print_name = None else: if print_name.endswith("_dimensional"): - self.print_name = print_name[: -len("_dimensional")] + print_name = print_name[: -len("_dimensional")] elif print_name.endswith("_dim"): - self.print_name = print_name[: -len("_dim")] - else: - self.print_name = print_name + print_name = print_name[: -len("_dim")] + parent_param = frame.f_locals["self"] + if hasattr(parent_param, "domain"): + # add "_n" or "_s" or "_p" if this comes from a Parameter class with + # a domain + d = getattr(parent_param, "domain").lower()[0] + print_name += f"_{d}" + self.print_name = print_name @property def input_names(self): @@ -161,7 +166,12 @@ def diff(self, variable): input_dict = {input_names[i]: children_list[i] for i in range(len(input_names))} - return FunctionParameter(self.name, input_dict, diff_variable=variable) + return FunctionParameter( + self.name, + input_dict, + diff_variable=variable, + print_name=self.print_name + "'", + ) def create_copy(self): """See :meth:`pybamm.Symbol.new_copy()`.""" diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index c60c71568d..cd3230a12a 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -54,10 +54,10 @@ def prettify_print_name(name): return PRINT_NAME_OVERRIDES[name] # Superscripts with comma separated (U_n_ref --> U_{n}^{ref}) - sup_re = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) + sup_re = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?((?:n|s|p))", name) if sup_re: sup_str = ( - r"{" + sup_re.group(1).replace("_", "\,") + r"}^{" + sup_re.group(2) + r"}" + r"{" + sup_re.group(2).replace("_", "\,") + r"}^{" + sup_re.group(1) + r"}" ) sup_var = sup_re.group(1) + "_" + sup_re.group(2) name = name.replace(sup_var, sup_str) diff --git a/pybamm/geometry/battery_geometry.py b/pybamm/geometry/battery_geometry.py index 32f8b5e6c7..d25a207cf9 100644 --- a/pybamm/geometry/battery_geometry.py +++ b/pybamm/geometry/battery_geometry.py @@ -47,18 +47,19 @@ def battery_geometry( } # Add particle domains if include_particles is True: + zero_one = {"min": 0, "max": 1} geometry.update( { - "negative particle": {"r_n": {"min": 0, "max": 1}}, - "positive particle": {"r_p": {"min": 0, "max": 1}}, + "negative particle": {"r_n": zero_one}, + "positive particle": {"r_p": zero_one}, } ) # Add particle size domains if options is not None and options["particle size"] == "distribution": - R_min_n = geo.n.R_min - R_min_p = geo.p.R_min - R_max_n = geo.n.R_max - R_max_p = geo.p.R_max + R_min_n = geo.n.prim.R_min + R_min_p = geo.p.prim.R_min + R_max_n = geo.n.prim.R_max + R_max_p = geo.p.prim.R_max geometry.update( { "negative particle size": {"R_n": {"min": R_min_n, "max": R_max_n}}, diff --git a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv index ab13c6b7b4..3b6920c990 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv @@ -14,6 +14,5 @@ Lower voltage cut-off [V],2,, Upper voltage cut-off [V],4.4,, ,,, # Initial conditions,,, -Initial concentration in negative electrode [mol.m-3],28831.45783,Minimized to Severson Data, Initial concentration in positive electrode [mol.m-3],35.3766672,Minimized to Severson Data, Initial temperature [K],298.15,, diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index 69bdca6966..c487de0683 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -305,6 +305,8 @@ def __init__(self, extra_options): # The "stress-induced diffusion" option will still be overridden by # extra_options if provided + # The "surface form" option will still be overridden by + # extra_options if provided # Change default SEI model based on which lithium plating option is provided # return "none" if option not given plating_option = extra_options.get("lithium plating", "none") @@ -443,7 +445,7 @@ def __init__(self, extra_options): # Check options are valid for option, value in options.items(): - if option == "external submodels" or option == "working electrode": + if option in ["external submodels", "working electrode"]: pass else: if isinstance(value, str) or option in [ @@ -475,7 +477,14 @@ def __init__(self, extra_options): "Values must be strings or (in some cases) " "2-tuples of strings" ) + # flatten value + value_list = [] for val in value: + if isinstance(val, tuple): + value_list.extend(val) + else: + value_list.append(val) + for val in value_list: if option == "timescale": if not (val == "default" or isinstance(val, numbers.Number)): raise pybamm.OptionError( @@ -491,6 +500,16 @@ def __init__(self, extra_options): super().__init__(options.items()) + def phase_number_to_names(self, number): + """ + Converts number of phases to a list ["primary", "secondary", ...] + """ + number = int(number) + phases = ["primary"] + if number >= 2: + phases.append("secondary") + return phases + def print_options(self): """ Print the possible options with the ones currently selected @@ -533,6 +552,29 @@ def __getitem__(self, key): # 2-tuple, first is negative domain, second is positive domain return options[self.index] + @property + def primary(self): + return BatteryModelPhaseOptions(self, 0) + + @property + def secondary(self): + return BatteryModelPhaseOptions(self, 1) + + +class BatteryModelPhaseOptions(dict): + def __init__(self, domain_options, index): + super().__init__(domain_options.items()) + self.domain_options = domain_options + self.index = index + + def __getitem__(self, key): + options = self.domain_options.__getitem__(key) + if isinstance(options, str): + return options + else: + # 2-tuple, first is primary phase, second is secondary phase + return options[self.index] + class BaseBatteryModel(pybamm.BaseModel): """ @@ -712,33 +754,6 @@ def set_standard_output_variables(self): {"y": var.y, "y [m]": var.y * L_z, "z": var.z, "z [m]": var.z * L_z} ) - # Initialize "total reaction" variables - # These will get populated by the "get_coupled_variables" methods, and then used - # later by "set_rhs" or "set_algebraic", which ensures that we always have - # added all the necessary variables by the time the sum is used - self.variables.update( - { - "Sum of electrolyte reaction source terms": 0, - "Sum of positive electrode electrolyte reaction source terms": 0, - "Sum of x-averaged positive electrode " - "electrolyte reaction source terms": 0, - "Sum of interfacial current densities": 0, - "Sum of positive electrode interfacial current densities": 0, - "Sum of x-averaged positive electrode interfacial current densities": 0, - } - ) - if not self.half_cell: - self.variables.update( - { - "Sum of negative electrode electrolyte reaction source terms": 0, - "Sum of x-averaged negative electrode " - "electrolyte reaction source terms": 0, - "Sum of negative electrode interfacial current densities": 0, - "Sum of x-averaged negative electrode interfacial current densities" - "": 0, - } - ) - def build_fundamental_and_external(self): # Get the fundamental variables for submodel_name, submodel in self.submodels.items(): @@ -1058,23 +1073,28 @@ def set_interface_utilisation_submodel(self): ) def set_voltage_variables(self): - - ocp_n = self.variables["Negative electrode open circuit potential"] - ocp_p = self.variables["Positive electrode open circuit potential"] + phase_n = "" + phase_p = "" + ocp_n = self.variables[f"Negative electrode {phase_n}open circuit potential"] + ocp_p = self.variables[f"Positive electrode {phase_p}open circuit potential"] ocp_n_av = self.variables[ - "X-averaged negative electrode open circuit potential" + f"X-averaged negative electrode {phase_n}open circuit potential" ] ocp_p_av = self.variables[ - "X-averaged positive electrode open circuit potential" + f"X-averaged positive electrode {phase_p}open circuit potential" ] - ocp_n_dim = self.variables["Negative electrode open circuit potential [V]"] - ocp_p_dim = self.variables["Positive electrode open circuit potential [V]"] + ocp_n_dim = self.variables[ + f"Negative electrode {phase_n}open circuit potential [V]" + ] + ocp_p_dim = self.variables[ + f"Positive electrode {phase_p}open circuit potential [V]" + ] ocp_n_av_dim = self.variables[ - "X-averaged negative electrode open circuit potential [V]" + f"X-averaged negative electrode {phase_n}open circuit potential [V]" ] ocp_p_av_dim = self.variables[ - "X-averaged positive electrode open circuit potential [V]" + f"X-averaged positive electrode {phase_p}open circuit potential [V]" ] ocp_n_left = pybamm.boundary_value(ocp_n, "left") @@ -1097,16 +1117,16 @@ def set_voltage_variables(self): ] else: eta_r_n_av = self.variables[ - "X-averaged negative electrode reaction overpotential" + f"X-averaged negative electrode {phase_n}reaction overpotential" ] eta_r_n_av_dim = self.variables[ - "X-averaged negative electrode reaction overpotential [V]" + f"X-averaged negative electrode {phase_n}reaction overpotential [V]" ] eta_r_p_av = self.variables[ - "X-averaged positive electrode reaction overpotential" + f"X-averaged positive electrode {phase_p}reaction overpotential" ] eta_r_p_av_dim = self.variables[ - "X-averaged positive electrode reaction overpotential [V]" + f"X-averaged positive electrode {phase_p}reaction overpotential [V]" ] delta_phi_s_n_av = self.variables["X-averaged negative electrode ohmic losses"] diff --git a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py index 797a01a131..4c62cb188b 100644 --- a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py +++ b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py @@ -86,21 +86,21 @@ def set_open_circuit_potential_submodel(self): self.submodels[ f"{domain.lower()} open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lead-acid main", self.options + self.param, domain, "lead-acid main", self.options, "primary" ) self.submodels[ f"{domain.lower()} oxygen open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lead-acid oxygen", self.options + self.param, domain, "lead-acid oxygen", self.options, "primary" ) def set_active_material_submodel(self): - self.submodels["negative active material"] = pybamm.active_material.Constant( - self.param, "Negative", self.options - ) - self.submodels["positive active material"] = pybamm.active_material.Constant( - self.param, "Positive", self.options - ) + for domain in ["negative", "positive"]: + self.submodels[ + f"{domain} active material" + ] = pybamm.active_material.Constant( + self.param, domain, self.options, "primary" + ) def set_sei_submodel(self): @@ -109,3 +109,8 @@ def set_sei_submodel(self): def set_lithium_plating_submodel(self): self.submodels["lithium plating"] = pybamm.lithium_plating.NoPlating(self.param) + + def set_total_kinetics_submodel(self): + self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + self.param, "lead-acid", self.options + ) diff --git a/pybamm/models/full_battery_models/lead_acid/basic_full.py b/pybamm/models/full_battery_models/lead_acid/basic_full.py index e698b8e033..fc91439448 100644 --- a/pybamm/models/full_battery_models/lead_acid/basic_full.py +++ b/pybamm/models/full_battery_models/lead_acid/basic_full.py @@ -106,18 +106,22 @@ def __init__(self, name="Basic full model"): ) # Interfacial reactions - j0_n = param.n.j0(c_e_n, T) + j0_n = param.n.prim.j0(c_e_n, T) j_n = ( 2 * j0_n - * pybamm.sinh(param.n.ne / 2 * (phi_s_n - phi_e_n - param.n.U(c_e_n, T))) + * pybamm.sinh( + param.n.prim.ne / 2 * (phi_s_n - phi_e_n - param.n.prim.U(c_e_n, T)) + ) ) - j0_p = param.p.j0(c_e_p, T) + j0_p = param.p.prim.j0(c_e_p, T) j_s = pybamm.PrimaryBroadcast(0, "separator") j_p = ( 2 * j0_p - * pybamm.sinh(param.p.ne / 2 * (phi_s_p - phi_e_p - param.p.U(c_e_p, T))) + * pybamm.sinh( + param.p.prim.ne / 2 * (phi_s_p - phi_e_p - param.p.prim.U(c_e_p, T)) + ) ) j = pybamm.concatenation(j_n, j_s, j_p) @@ -183,7 +187,7 @@ def __init__(self, name="Basic full model"): "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = -param.n.U_init + self.initial_conditions[phi_e] = -param.n.prim.U_init ###################### # Current in the solid @@ -246,9 +250,9 @@ def __init__(self, name="Basic full model"): + param.C_e * c_e * v ) s = pybamm.concatenation( - pybamm.PrimaryBroadcast(param.n.s_plus_S, "negative electrode"), + pybamm.PrimaryBroadcast(param.n.prim.s_plus_S, "negative electrode"), pybamm.PrimaryBroadcast(0, "separator"), - pybamm.PrimaryBroadcast(param.p.s_plus_S, "positive electrode"), + pybamm.PrimaryBroadcast(param.p.prim.s_plus_S, "positive electrode"), ) self.rhs[c_e] = (1 / eps) * ( -pybamm.div(N_e) / param.C_e @@ -279,7 +283,7 @@ def __init__(self, name="Basic full model"): "Electrolyte concentration": c_e, "Current [A]": I, "Negative electrode potential [V]": pot * phi_s_n, - "Electrolyte potential [V]": -param.n.U_ref + pot * phi_e, + "Electrolyte potential [V]": -param.n.prim.U_ref + pot * phi_e, "Positive electrode potential [V]": param.ocv_ref + pot * phi_s_p, "Terminal voltage [V]": param.ocv_ref + pot * voltage, "Porosity": eps, diff --git a/pybamm/models/full_battery_models/lead_acid/full.py b/pybamm/models/full_battery_models/lead_acid/full.py index 2d9e349a52..0e5a1e0329 100644 --- a/pybamm/models/full_battery_models/lead_acid/full.py +++ b/pybamm/models/full_battery_models/lead_acid/full.py @@ -49,6 +49,7 @@ def __init__(self, options=None, name="Full model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -85,7 +86,7 @@ def set_intercalation_kinetics_submodel(self): for domain in ["Negative", "Positive"]: intercalation_kinetics = self.get_intercalation_kinetics(domain) self.submodels[domain.lower() + " interface"] = intercalation_kinetics( - self.param, domain, "lead-acid main", self.options + self.param, domain, "lead-acid main", self.options, "primary" ) def set_solid_submodel(self): @@ -128,7 +129,7 @@ def set_side_reaction_submodels(self): self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ) self.submodels[ "negative oxygen interface" @@ -140,8 +141,8 @@ def set_side_reaction_submodels(self): self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.NoReaction( - self.param, "Positive", "lead-acid oxygen" + self.param, "Positive", "lead-acid oxygen", "primary" ) self.submodels["negative oxygen interface"] = pybamm.kinetics.NoReaction( - self.param, "Negative", "lead-acid oxygen" + self.param, "Negative", "lead-acid oxygen", "primary" ) diff --git a/pybamm/models/full_battery_models/lead_acid/higher_order.py b/pybamm/models/full_battery_models/lead_acid/higher_order.py index 8d42c60f4b..67c7dc6ae4 100644 --- a/pybamm/models/full_battery_models/lead_acid/higher_order.py +++ b/pybamm/models/full_battery_models/lead_acid/higher_order.py @@ -57,6 +57,7 @@ def __init__(self, options=None, name="Composite model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -157,14 +158,14 @@ def set_full_interface_submodel(self): self.param, "Negative", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ), ) self.submodels["positive interface"] = pybamm.kinetics.FirstOrderKinetics( self.param, "Positive", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ), ) @@ -176,7 +177,7 @@ def set_full_interface_submodel(self): self.param, "Positive", pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ), ) self.submodels[ diff --git a/pybamm/models/full_battery_models/lead_acid/loqs.py b/pybamm/models/full_battery_models/lead_acid/loqs.py index 8c83a2c734..076052669b 100644 --- a/pybamm/models/full_battery_models/lead_acid/loqs.py +++ b/pybamm/models/full_battery_models/lead_acid/loqs.py @@ -48,6 +48,7 @@ def __init__(self, options=None, name="LOQS model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() if build: self.build_model() @@ -164,25 +165,25 @@ def set_intercalation_kinetics_submodel(self): self.submodels[ "leading-order negative interface" ] = pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ) self.submodels[ "leading-order positive interface" ] = pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ) # always use forward Butler-Volmer for the reaction submodel to be passed to the # higher order model self.reaction_submodels = { "Negative": [ pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options + self.param, "Negative", "lead-acid main", self.options, "primary" ) ], "Positive": [ pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options + self.param, "Positive", "lead-acid main", self.options, "primary" ) ], } @@ -227,7 +228,7 @@ def set_side_reaction_submodels(self): self.submodels[ "leading-order positive oxygen interface" ] = pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options + self.param, "Positive", "lead-acid oxygen", self.options, "primary" ) self.submodels[ "leading-order negative oxygen interface" @@ -240,10 +241,14 @@ def set_side_reaction_submodels(self): ] = pybamm.oxygen_diffusion.NoOxygen(self.param) self.submodels[ "leading-order negative oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, "Negative", "lead-acid oxygen") + ] = pybamm.kinetics.NoReaction( + self.param, "Negative", "lead-acid oxygen", "primary" + ) self.submodels[ "leading-order positive oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, "Positive", "lead-acid oxygen") + ] = pybamm.kinetics.NoReaction( + self.param, "Positive", "lead-acid oxygen", "primary" + ) self.reaction_submodels["Negative"].append( self.submodels["leading-order negative oxygen interface"] ) diff --git a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py index 7799efdd42..202f8caca9 100644 --- a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py +++ b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py @@ -28,8 +28,8 @@ def __init__(self, options=None, name="Unnamed lithium-ion model", build=False): "negative electrode": self.param.L_x, "separator": self.param.L_x, "positive electrode": self.param.L_x, - "positive particle": self.param.p.R_typ, - "positive particle size": self.param.p.R_typ, + "positive particle": self.param.p.prim.R_typ, + "positive particle size": self.param.p.prim.R_typ, "current collector y": self.param.L_z, "current collector z": self.param.L_z, } @@ -38,11 +38,10 @@ def __init__(self, options=None, name="Unnamed lithium-ion model", build=False): if not self.half_cell: self.length_scales.update( { - "negative particle": self.param.n.R_typ, - "negative particle size": self.param.n.R_typ, + "negative particle": self.param.n.prim.R_typ, + "negative particle size": self.param.n.prim.R_typ, } ) - self.set_standard_output_variables() def set_submodels(self, build): self.set_external_circuit_submodel() @@ -54,7 +53,6 @@ def set_submodels(self, build): self.set_convection_submodel() self.set_open_circuit_potential_submodel() self.set_intercalation_kinetics_submodel() - self.set_other_reaction_submodels_to_zero() self.set_particle_submodel() self.set_solid_submodel() self.set_electrolyte_submodel() @@ -63,6 +61,9 @@ def set_submodels(self, build): self.set_sei_submodel() self.set_lithium_plating_submodel() + self.set_total_kinetics_submodel() + + self.set_standard_output_variables() if self.half_cell: # This also removes "negative electrode" submodels, so should be done last @@ -106,16 +107,31 @@ def set_standard_output_variables(self): # Particle concentration position var = pybamm.standard_spatial_vars - self.variables.update({"r_p": var.r_p, "r_p [m]": var.r_p * self.param.p.R_typ}) + self.variables.update( + {"r_p": var.r_p, "r_p [m]": var.r_p * self.param.p.prim.R_typ} + ) if not self.half_cell: self.variables.update( - {"r_n": var.r_n, "r_n [m]": var.r_n * self.param.n.R_typ} + {"r_n": var.r_n, "r_n [m]": var.r_n * self.param.n.prim.R_typ} ) def set_degradation_variables(self): """Sets variables that quantify degradation (LAM, LLI, etc)""" param = self.param + if self.half_cell: + domains = ["positive"] + else: + domains = ["negative", "positive"] + for domain in domains: + phases = ["primary"] + self.variables[f"Total lithium in {domain} electrode [mol]"] = sum( + self.variables[ + f"Total lithium in {phase} phase in {domain} electrode [mol]" + ] + for phase in phases + ) + # LAM if self.half_cell: n_Li_n = pybamm.Scalar(0) @@ -217,12 +233,13 @@ def set_summary_variables(self): self.summary_variables = summary_variables def set_open_circuit_potential_submodel(self): - for domain in ["Negative", "Positive"]: - self.submodels[ - f"{domain.lower()} open circuit potential" - ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lithium-ion main", self.options - ) + for domain in ["negative", "positive"]: + phases = ["primary"] + for phase in phases: + ocp_model = pybamm.open_circuit_potential.SingleOpenCircuitPotential + self.submodels[f"{domain} {phase} open circuit potential"] = ocp_model( + self.param, domain, "lithium-ion main", self.options, phase + ) def set_sei_submodel(self): if self.half_cell: @@ -251,16 +268,10 @@ def set_lithium_plating_submodel(self): self.param, self.x_average, self.options ) - def set_other_reaction_submodels_to_zero(self): - for domain in ["Negative", "Positive"]: - self.submodels[ - f"{domain.lower()} oxygen interface" - ] = pybamm.kinetics.NoReaction(self.param, domain, "lithium-ion oxygen") - self.submodels[ - f"{domain.lower()} oxygen open circuit potential" - ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, domain, "lithium-ion oxygen", self.options - ) + def set_total_kinetics_submodel(self): + self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + self.param, "lithium-ion", self.options + ) def set_crack_submodel(self): for domain in ["Negative", "Positive"]: @@ -279,18 +290,25 @@ def set_crack_submodel(self): ) def set_active_material_submodel(self): - for domain in ["Negative", "Positive"]: - lam = getattr(self.options, domain.lower())["loss of active material"] - if lam == "none": - self.submodels[ - domain.lower() + " active material" - ] = pybamm.active_material.Constant(self.param, domain, self.options) - else: + for domain in ["negative", "positive"]: + lam = getattr(self.options, domain)["loss of active material"] + phases = ["primary"] + for phase in phases: + if lam == "none": + submod = pybamm.active_material.Constant( + self.param, domain, self.options, phase + ) + else: + submod = pybamm.active_material.LossActiveMaterial( + self.param, domain, self.options, self.x_average + ) + self.submodels[f"{domain} {phase} active material"] = submod + + # Submodel for the total active material, summing up each phase + if len(phases) > 1: self.submodels[ - domain.lower() + " active material" - ] = pybamm.active_material.LossActiveMaterial( - self.param, domain, self.options, self.x_average - ) + f"{domain} total active material" + ] = pybamm.active_material.Total(self.param, domain, self.options) def set_porosity_submodel(self): if ( @@ -312,7 +330,7 @@ def set_li_metal_counter_electrode_submodels(self): self.submodels[ "counter electrode open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - self.param, "Negative", "lithium metal plating", self.options + self.param, "Negative", "lithium metal plating", self.options, "primary" ) if ( @@ -340,7 +358,7 @@ def set_li_metal_counter_electrode_submodels(self): ] = pybamm.electrode.ohm.LithiumMetalSurfaceForm(self.param, self.options) neg_intercalation_kinetics = self.get_intercalation_kinetics("Negative") self.submodels["counter electrode interface"] = neg_intercalation_kinetics( - self.param, "Negative", "lithium metal plating", self.options + self.param, "Negative", "lithium metal plating", self.options, "primary" ) # For half-cell models, remove negative electrode submodels diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py index 5c6210bbb2..02a7d56421 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn.py @@ -123,22 +123,34 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # right side. This is also accessible via `boundary_value(x, "right")`, with # "left" providing the boundary value of the left side c_s_surf_n = pybamm.surf(c_s_n) - j0_n = param.n.gamma * param.n.j0(c_e_n, c_s_surf_n, T) / param.n.C_r + j0_n = ( + param.n.prim.gamma + * param.n.prim.j0(c_e_n, c_s_surf_n, T) + / param.n.prim.C_r + ) j_n = ( 2 * j0_n * pybamm.sinh( - param.n.ne / 2 * (phi_s_n - phi_e_n - param.n.U(c_s_surf_n, T)) + param.n.prim.ne + / 2 + * (phi_s_n - phi_e_n - param.n.prim.U(c_s_surf_n, T)) ) ) c_s_surf_p = pybamm.surf(c_s_p) - j0_p = param.p.gamma * param.p.j0(c_e_p, c_s_surf_p, T) / param.p.C_r + j0_p = ( + param.p.prim.gamma + * param.p.prim.j0(c_e_p, c_s_surf_p, T) + / param.p.prim.C_r + ) j_s = pybamm.PrimaryBroadcast(0, "separator") j_p = ( 2 * j0_p * pybamm.sinh( - param.p.ne / 2 * (phi_s_p - phi_e_p - param.p.U(c_s_surf_p, T)) + param.p.prim.ne + / 2 + * (phi_s_p - phi_e_p - param.p.prim.U(c_s_surf_p, T)) ) ) j = pybamm.concatenation(j_n, j_s, j_p) @@ -159,35 +171,35 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # The div and grad operators will be converted to the appropriate matrix # multiplication at the discretisation stage - N_s_n = -param.n.D(c_s_n, T) * pybamm.grad(c_s_n) - N_s_p = -param.p.D(c_s_p, T) * pybamm.grad(c_s_p) - self.rhs[c_s_n] = -(1 / param.n.C_diff) * pybamm.div(N_s_n) - self.rhs[c_s_p] = -(1 / param.p.C_diff) * pybamm.div(N_s_p) + N_s_n = -param.n.prim.D(c_s_n, T) * pybamm.grad(c_s_n) + N_s_p = -param.p.prim.D(c_s_p, T) * pybamm.grad(c_s_p) + self.rhs[c_s_n] = -(1 / param.n.prim.C_diff) * pybamm.div(N_s_n) + self.rhs[c_s_p] = -(1 / param.p.prim.C_diff) * pybamm.div(N_s_p) # Boundary conditions must be provided for equations with spatial derivatives self.boundary_conditions[c_s_n] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.n.C_diff + -param.n.prim.C_diff * j_n - / param.n.a_R - / param.n.gamma - / param.n.D(c_s_surf_n, T), + / param.n.prim.a_R + / param.n.prim.gamma + / param.n.prim.D(c_s_surf_n, T), "Neumann", ), } self.boundary_conditions[c_s_p] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.p.C_diff + -param.p.prim.C_diff * j_p - / param.p.a_R - / param.p.gamma - / param.p.D(c_s_surf_p, T), + / param.p.prim.a_R + / param.p.prim.gamma + / param.p.prim.D(c_s_surf_p, T), "Neumann", ), } - self.initial_conditions[c_s_n] = param.n.c_init - self.initial_conditions[c_s_p] = param.p.c_init + self.initial_conditions[c_s_n] = param.n.prim.c_init + self.initial_conditions[c_s_p] = param.p.prim.c_init # Events specify points at which a solution should terminate self.events += [ pybamm.Event( @@ -245,7 +257,7 @@ def __init__(self, name="Doyle-Fuller-Newman model"): "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = -param.n.U_init + self.initial_conditions[phi_e] = -param.n.prim.U_init ###################### # Electrolyte concentration @@ -270,6 +282,9 @@ def __init__(self, name="Doyle-Fuller-Newman model"): # (Some) variables ###################### voltage = pybamm.boundary_value(phi_s_p, "right") + pot_scale = param.potential_scale + U_ref = param.ocv_ref + voltage_dim = U_ref + voltage * pot_scale # The `variables` dictionary contains all variables that might be useful for # visualising the solution of the model self.variables = { @@ -281,6 +296,8 @@ def __init__(self, name="Doyle-Fuller-Newman model"): "Electrolyte potential": phi_e, "Positive electrode potential": phi_s_p, "Terminal voltage": voltage, + "Terminal voltage [V]": voltage_dim, + "Time [s]": pybamm.t * self.param.timescale, } self.events += [ pybamm.Event("Minimum voltage", voltage - param.voltage_low_cut), diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py index 95ad8abf4a..94b27d6d70 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py @@ -51,7 +51,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # `ParameterValues` class when the model is processed. param = self.param - R_w_typ = param.p.R_typ + R_w_typ = param.p.prim.R_typ # Set default length scales self._length_scales = { @@ -124,16 +124,16 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): b_e_w = param.p.b_e # Interfacial reactions - j0_w = param.p.j0(c_e_w, c_s_surf_w, T) / param.p.C_r - U_w = param.p.U - ne_w = param.p.ne + j0_w = param.p.prim.j0(c_e_w, c_s_surf_w, T) / param.p.prim.C_r + U_w = param.p.prim.U + ne_w = param.p.prim.ne # Particle diffusion parameters - D_w = param.p.D - C_w = param.p.cap_init - a_R_w = param.p.a_R - gamma_e = param.c_e_typ / param.p.c_max - c_w_init = param.p.c_init + D_w = param.p.prim.D + C_w = param.p.prim.cap_init + a_R_w = param.p.prim.a_R + gamma_e = param.c_e_typ / param.p.prim.c_max + c_w_init = param.p.prim.c_init # Electrode equation parameters eps_s_w = pybamm.Parameter("Positive electrode active material volume fraction") @@ -141,9 +141,9 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): sigma_w = param.p.sigma # Other parameters (for outputs) - c_w_max = param.p.c_max - U_w_ref = param.p.U_ref - U_Li_ref = param.n.U_ref + c_w_max = param.p.prim.c_max + U_w_ref = param.p.prim.U_ref + U_Li_ref = param.n.prim.U_ref L_w = param.p.L # gamma_w is always 1 because we choose the timescale based on the working @@ -216,7 +216,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # Initial conditions must also be provided for algebraic equations, as an # initial guess for a root-finding algorithm which calculates consistent # initial conditions - self.initial_conditions[phi_s_w] = param.p.U_init + self.initial_conditions[phi_s_w] = param.p.prim.U_init ###################### # Electrolyte concentration @@ -269,7 +269,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = param.n.U_ref / pot_scale + self.initial_conditions[phi_e] = param.n.prim.U_ref / pot_scale ###################### # (Some) variables diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_spm.py b/pybamm/models/full_battery_models/lithium_ion/basic_spm.py index 727c7e2da2..a157b351a2 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_spm.py @@ -76,10 +76,10 @@ def __init__(self, name="Single Particle Model"): # The div and grad operators will be converted to the appropriate matrix # multiplication at the discretisation stage - N_s_n = -param.n.D(c_s_n, T) * pybamm.grad(c_s_n) - N_s_p = -param.p.D(c_s_p, T) * pybamm.grad(c_s_p) - self.rhs[c_s_n] = -(1 / param.n.C_diff) * pybamm.div(N_s_n) - self.rhs[c_s_p] = -(1 / param.p.C_diff) * pybamm.div(N_s_p) + N_s_n = -param.n.prim.D(c_s_n, T) * pybamm.grad(c_s_n) + N_s_p = -param.p.prim.D(c_s_p, T) * pybamm.grad(c_s_p) + self.rhs[c_s_n] = -(1 / param.n.prim.C_diff) * pybamm.div(N_s_n) + self.rhs[c_s_p] = -(1 / param.p.prim.C_diff) * pybamm.div(N_s_p) # Surf takes the surface value of a variable, i.e. its boundary value on the # right side. This is also accessible via `boundary_value(x, "right")`, with # "left" providing the boundary value of the left side @@ -89,29 +89,29 @@ def __init__(self, name="Single Particle Model"): self.boundary_conditions[c_s_n] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.n.C_diff + -param.n.prim.C_diff * j_n - / param.n.a_R - / param.n.gamma - / param.n.D(c_s_surf_n, T), + / param.n.prim.a_R + / param.n.prim.gamma + / param.n.prim.D(c_s_surf_n, T), "Neumann", ), } self.boundary_conditions[c_s_p] = { "left": (pybamm.Scalar(0), "Neumann"), "right": ( - -param.p.C_diff + -param.p.prim.C_diff * j_p - / param.p.a_R - / param.p.gamma - / param.p.D(c_s_surf_p, T), + / param.p.prim.a_R + / param.p.prim.gamma + / param.p.prim.D(c_s_surf_p, T), "Neumann", ), } # c_n_init and c_p_init are functions of r and x, but for the SPM we # take the x-averaged value since there is no x-dependence in the particles - self.initial_conditions[c_s_n] = pybamm.x_average(param.n.c_init) - self.initial_conditions[c_s_p] = pybamm.x_average(param.p.c_init) + self.initial_conditions[c_s_n] = pybamm.x_average(param.n.prim.c_init) + self.initial_conditions[c_s_p] = pybamm.x_average(param.p.prim.c_init) # Events specify points at which a solution should terminate self.events += [ pybamm.Event( @@ -139,13 +139,13 @@ def __init__(self, name="Single Particle Model"): # (Some) variables ###################### # Interfacial reactions - j0_n = param.n.gamma * param.n.j0(1, c_s_surf_n, T) / param.n.C_r - j0_p = param.p.gamma * param.p.j0(1, c_s_surf_p, T) / param.p.C_r - eta_n = (2 / param.n.ne) * pybamm.arcsinh(j_n / (2 * j0_n)) - eta_p = (2 / param.p.ne) * pybamm.arcsinh(j_p / (2 * j0_p)) + j0_n = param.n.prim.gamma * param.n.prim.j0(1, c_s_surf_n, T) / param.n.prim.C_r + j0_p = param.p.prim.gamma * param.p.prim.j0(1, c_s_surf_p, T) / param.p.prim.C_r + eta_n = (2 / param.n.prim.ne) * pybamm.arcsinh(j_n / (2 * j0_n)) + eta_p = (2 / param.p.prim.ne) * pybamm.arcsinh(j_p / (2 * j0_p)) phi_s_n = 0 - phi_e = -eta_n - param.n.U(c_s_surf_n, T) - phi_s_p = eta_p + phi_e + param.p.U(c_s_surf_p, T) + phi_e = -eta_n - param.n.prim.U(c_s_surf_n, T) + phi_s_p = eta_p + phi_e + param.p.prim.U(c_s_surf_p, T) V = phi_s_p pot_scale = self.param.potential_scale diff --git a/pybamm/models/full_battery_models/lithium_ion/dfn.py b/pybamm/models/full_battery_models/lithium_ion/dfn.py index 6e60f19c0c..7b6b664da4 100644 --- a/pybamm/models/full_battery_models/lithium_ion/dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/dfn.py @@ -57,46 +57,41 @@ def set_convection_submodel(self): def set_intercalation_kinetics_submodel(self): for domain in ["Negative", "Positive"]: intercalation_kinetics = self.get_intercalation_kinetics(domain) - self.submodels[domain.lower() + " interface"] = intercalation_kinetics( - self.param, domain, "lithium-ion main", self.options - ) + for phase in ["primary"]: + submod = intercalation_kinetics( + self.param, domain, "lithium-ion main", self.options, phase + ) + + self.submodels[f"{domain.lower()} {phase} interface"] = submod def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if self.options["particle size"] == "single": - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.FickianDiffusion( - self.param, - domain, - self.options, - ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.PolynomialProfile( - self.param, domain, particle, self.options - ) - elif self.options["particle size"] == "distribution": - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.size_distribution.FickianDiffusion( - self.param, domain - ) - elif particle == "uniform profile": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.size_distribution.UniformProfile( - self.param, - domain, - ) + for domain in ["negative", "positive"]: + particle = getattr(self.options, domain)["particle"] + phases = ["primary"] + for phase in phases: + if self.options["particle size"] == "single": + if particle == "Fickian diffusion": + submod = pybamm.particle.no_distribution.FickianDiffusion( + self.param, domain, self.options, phase + ) + elif particle in [ + "uniform profile", + "quadratic profile", + "quartic profile", + ]: + submod = pybamm.particle.no_distribution.PolynomialProfile( + self.param, domain, particle, self.options, phase + ) + elif self.options["particle size"] == "distribution": + if particle == "Fickian diffusion": + submod = pybamm.particle.size_distribution.FickianDiffusion( + self.param, domain + ) + elif particle == "uniform profile": + submod = pybamm.particle.size_distribution.UniformProfile( + self.param, domain + ) + self.submodels[f"{domain} {phase} particle"] = submod def set_solid_submodel(self): diff --git a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py index ce0c2e299a..ee17368b3b 100644 --- a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py +++ b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py @@ -35,8 +35,8 @@ def __init__(self, name="Electrode-specific SOH model"): super().__init__(name) param = pybamm.LithiumIonParameters() - Un = param.n.U_dimensional - Up = param.p.U_dimensional + Un = param.n.prim.U_dimensional + Up = param.p.prim.U_dimensional T_ref = param.T_ref x_100 = pybamm.Variable("x_100", bounds=(0, 1)) diff --git a/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py index 28612047c0..ff71e1ac83 100644 --- a/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/electrode_soh_half_cell.py @@ -42,7 +42,7 @@ def __init__(self, working_electrode, name="Electrode-specific SOH model"): if working_electrode == "negative": # pragma: no cover raise NotImplementedError elif working_electrode == "positive": - Uw = param.p.U_dimensional + Uw = param.p.prim.U_dimensional x_0 = x_100 + C / Cw V_max = pybamm.InputParameter("V_max") diff --git a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py index ba3be1c9be..03e84e24fb 100644 --- a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py +++ b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py @@ -55,26 +55,6 @@ def __init__(self, options=None, name="Newman-Tobias model", build=True): pybamm.citations.register("Newman1962") pybamm.citations.register("Chu2020") - def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if particle == "Fickian diffusion": - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedFickianDiffusion( - self.param, domain, self.options - ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: - self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - self.param, domain, particle, self.options - ) - def set_electrolyte_submodel(self): surf_form = pybamm.electrolyte_conductivity.surface_potential_form diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index 9fb32a2cee..47ec6cf12b 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -65,49 +65,45 @@ def set_convection_submodel(self): def set_intercalation_kinetics_submodel(self): - if self.options["surface form"] == "false": - self.submodels["negative interface"] = self.inverse_intercalation_kinetics( - self.param, "Negative", "lithium-ion main", self.options - ) - self.submodels["positive interface"] = self.inverse_intercalation_kinetics( - self.param, "Positive", "lithium-ion main", self.options - ) - self.submodels[ - "negative interface current" - ] = pybamm.kinetics.CurrentForInverseButlerVolmer( - self.param, "Negative", "lithium-ion main", self.options - ) - self.submodels[ - "positive interface current" - ] = pybamm.kinetics.CurrentForInverseButlerVolmer( - self.param, "Positive", "lithium-ion main", self.options - ) - else: - for domain in ["Negative", "Positive"]: - intercalation_kinetics = self.get_intercalation_kinetics(domain) - self.submodels[domain.lower() + " interface"] = intercalation_kinetics( - self.param, domain, "lithium-ion main", self.options - ) - - def set_particle_submodel(self): - for domain in ["Negative", "Positive"]: - particle = getattr(self.options, domain.lower())["particle"] - if particle == "Fickian diffusion": + for domain in ["negative", "positive"]: + if self.options["surface form"] == "false": self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedFickianDiffusion( - self.param, domain, self.options + f"{domain} interface" + ] = self.inverse_intercalation_kinetics( + self.param, domain, "lithium-ion main", self.options ) - elif particle in [ - "uniform profile", - "quadratic profile", - "quartic profile", - ]: self.submodels[ - domain.lower() + " particle" - ] = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - self.param, domain, particle, self.options + f"{domain} interface current" + ] = pybamm.kinetics.CurrentForInverseButlerVolmer( + self.param, domain, "lithium-ion main", self.options ) + else: + intercalation_kinetics = self.get_intercalation_kinetics(domain) + for phase in ["primary"]: + submod = intercalation_kinetics( + self.param, domain, "lithium-ion main", self.options, phase + ) + + self.submodels[f"{domain} {phase} interface"] = submod + + def set_particle_submodel(self): + for domain in ["negative", "positive"]: + particle = getattr(self.options, domain)["particle"] + phases = ["primary"] + for phase in phases: + if particle == "Fickian diffusion": + submod = pybamm.particle.no_distribution.XAveragedFickianDiffusion( + self.param, domain, self.options, phase + ) + elif particle in [ + "uniform profile", + "quadratic profile", + "quartic profile", + ]: + submod = pybamm.particle.no_distribution.XAveragedPolynomialProfile( + self.param, domain, particle, self.options, phase + ) + self.submodels[f"{domain} {phase} particle"] = submod def set_solid_submodel(self): diff --git a/pybamm/models/submodels/active_material/__init__.py b/pybamm/models/submodels/active_material/__init__.py index 1fd47a39d5..cb263eb4ff 100644 --- a/pybamm/models/submodels/active_material/__init__.py +++ b/pybamm/models/submodels/active_material/__init__.py @@ -1,3 +1,4 @@ from .base_active_material import BaseModel from .constant_active_material import Constant from .loss_active_material import LossActiveMaterial +from .total_active_material import Total diff --git a/pybamm/models/submodels/active_material/base_active_material.py b/pybamm/models/submodels/active_material/base_active_material.py index cdb0b3880f..243665d3ae 100644 --- a/pybamm/models/submodels/active_material/base_active_material.py +++ b/pybamm/models/submodels/active_material/base_active_material.py @@ -15,45 +15,48 @@ class BaseModel(pybamm.BaseSubModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, options, phase="primary"): + super().__init__(param, domain, options=options, phase=phase) def _get_standard_active_material_variables(self, eps_solid): param = self.param + phase_name = self.phase_name + Domain = self.domain + domain = Domain.lower() + if eps_solid.domain == []: eps_solid = pybamm.PrimaryBroadcast(eps_solid, "current collector") if eps_solid.domain == ["current collector"]: - eps_solid = pybamm.PrimaryBroadcast( - eps_solid, self.domain.lower() + " electrode" - ) + eps_solid = pybamm.PrimaryBroadcast(eps_solid, domain + " electrode") eps_solid_av = pybamm.x_average(eps_solid) variables = { - self.domain + " electrode active material volume fraction": eps_solid, - "X-averaged " - + self.domain.lower() - + " electrode active material volume fraction": eps_solid_av, + f"{Domain} electrode {phase_name}" + "active material volume fraction": eps_solid, + f"X-averaged {domain} electrode {phase_name}" + "active material volume fraction": eps_solid_av, } # Update other microstructure variables # some models (e.g. lead-acid) do not have particles if self.options["particle shape"] == "no particles": - a = self.domain_param.a - a_typ = self.domain_param.a_typ + a = self.phase_param.a + a_typ = self.phase_param.a_typ variables.update( { - self.domain + " electrode surface area to volume ratio": a, - self.domain - + " electrode surface area to volume ratio [m-1]": a * a_typ, + f"{Domain} electrode surface area to volume ratio": a, + f"{Domain} electrode surface area to volume ratio [m-1]": a * a_typ, "X-averaged " - + self.domain.lower() + + domain + " electrode surface area to volume ratio": pybamm.x_average(a), "X-averaged " - + self.domain.lower() + + domain + " electrode surface area" + " to volume ratio [m-1]": pybamm.x_average(a) * a_typ, } @@ -63,7 +66,7 @@ def _get_standard_active_material_variables(self, eps_solid): else: # Update electrode capacity variables L = self.domain_param.L - c_s_max = self.domain_param.c_max + c_s_max = self.phase_param.c_max C = ( pybamm.yz_average(eps_solid_av) @@ -73,23 +76,28 @@ def _get_standard_active_material_variables(self, eps_solid): * param.F / 3600 ) - variables.update({self.domain + " electrode capacity [A.h]": C}) + if phase_name == "": + variables.update({f"{Domain} electrode capacity [A.h]": C}) + else: + variables.update( + {f"{Domain} electrode {phase_name}phase capacity [A.h]": C} + ) # If a single particle size at every x, use the parameters # R_n, R_p. For a size distribution, calculate the area-weighted # mean using the distribution instead. Then the surface area is # calculated the same way if self.options["particle size"] == "single": - R = self.domain_param.R - R_dim = self.domain_param.R_dimensional + R = self.phase_param.R + R_dim = self.phase_param.R_dimensional elif self.options["particle size"] == "distribution": if self.domain == "Negative": R_ = pybamm.standard_spatial_vars.R_n elif self.domain == "Positive": R_ = pybamm.standard_spatial_vars.R_p R = pybamm.size_average(R_) - R_dim = R * self.domain_param.R_typ - a_typ = self.domain_param.a_typ + R_dim = R * self.phase_param.R_typ + a_typ = self.phase_param.a_typ R_dim_av = pybamm.x_average(R_dim) @@ -104,24 +112,22 @@ def _get_standard_active_material_variables(self, eps_solid): a_av = a_dim_av / a_typ variables.update( { - self.domain + " particle radius": R, - self.domain + " particle radius [m]": R_dim, - self.domain + " electrode surface area to volume ratio": a, - self.domain - + " electrode surface area to volume ratio [m-1]": a_dim, - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio": a_av, - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio [m-1]": a_dim_av, + f"{Domain} {phase_name}particle radius": R, + f"{Domain} {phase_name}particle radius [m]": R_dim, + f"{Domain} electrode {phase_name}" + "surface area to volume ratio": a, + f"{Domain} electrode {phase_name}" + "surface area to volume ratio [m-1]": a_dim, + f"X-averaged {domain} electrode {phase_name}" + "surface area to volume ratio": a_av, + f"X-averaged {domain} electrode {phase_name}" + "surface area to volume ratio [m-1]": a_dim_av, } ) return variables def _get_standard_active_material_change_variables(self, deps_solid_dt): - if deps_solid_dt.domain == ["current collector"]: deps_solid_dt_av = deps_solid_dt deps_solid_dt = pybamm.PrimaryBroadcast( @@ -131,11 +137,10 @@ def _get_standard_active_material_change_variables(self, deps_solid_dt): deps_solid_dt_av = pybamm.x_average(deps_solid_dt) variables = { - self.domain - + " electrode active material volume fraction change": deps_solid_dt, - "X-averaged " - + self.domain.lower() - + " electrode active material volume fraction change": deps_solid_dt_av, + f"{self.domain} electrode {self.phase_name}" + "active material volume fraction change": deps_solid_dt, + f"X-averaged {self.domain.lower()} electrode {self.phase_name}" + "active material volume fraction change": deps_solid_dt_av, } return variables diff --git a/pybamm/models/submodels/active_material/constant_active_material.py b/pybamm/models/submodels/active_material/constant_active_material.py index 9adcf4aa7d..cc5021999e 100644 --- a/pybamm/models/submodels/active_material/constant_active_material.py +++ b/pybamm/models/submodels/active_material/constant_active_material.py @@ -17,12 +17,14 @@ class Constant(BaseModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model + phase : str + Phase of the particle **Extends:** :class:`pybamm.active_material.BaseModel` """ def get_fundamental_variables(self): - eps_solid = self.domain_param.epsilon_s + eps_solid = self.phase_param.epsilon_s deps_solid_dt = pybamm.FullBroadcast( 0, f"{self.domain.lower()} electrode", "current collector" ) diff --git a/pybamm/models/submodels/active_material/loss_active_material.py b/pybamm/models/submodels/active_material/loss_active_material.py index 6999b53c65..df95a5688a 100644 --- a/pybamm/models/submodels/active_material/loss_active_material.py +++ b/pybamm/models/submodels/active_material/loss_active_material.py @@ -145,7 +145,7 @@ def set_rhs(self, variables): def set_initial_conditions(self, variables): - eps_solid_init = self.domain_param.epsilon_s + eps_solid_init = self.domain_param.prim.epsilon_s if self.x_average is True: eps_solid_xav = variables[ diff --git a/pybamm/models/submodels/active_material/total_active_material.py b/pybamm/models/submodels/active_material/total_active_material.py new file mode 100644 index 0000000000..3bc94c2313 --- /dev/null +++ b/pybamm/models/submodels/active_material/total_active_material.py @@ -0,0 +1,79 @@ +# +# Class for total active material volume fraction, for models with multiple phases +# +import pybamm + + +class Total(pybamm.BaseSubModel): + """Class for total active material volume fraction, for models with multiple phases + + Parameters + ---------- + param : parameter class + The parameters to use for this submodel + domain : str + The domain of the model either 'Negative' or 'Positive' + options : dict + Additional options to pass to the model + + **Extends:** :class:`pybamm.BaseSubModel` + """ + + def __init__(self, param, domain, options): + super().__init__(param, domain, options=options) + + def get_coupled_variables(self, variables): + # Creates "total" active material volume fraction and capacity variables + # by summing up all the phases + Domain = self.domain + domain = Domain.lower() + + phases = ["primary"] + eps_solid = sum( + variables[f"{Domain} electrode {phase} active material volume fraction"] + for phase in phases + ) + eps_solid_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} active material volume fraction" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode active material volume fraction": eps_solid, + f"X-averaged {domain} electrode active material volume fraction" + "": eps_solid_av, + } + ) + + if self.options["particle shape"] != "no particles": + C = sum( + variables[f"{Domain} electrode {phase} phase capacity [A.h]"] + for phase in phases + ) + variables.update({f"{Domain} electrode capacity [A.h]": C}) + + deps_solid_dt = sum( + variables[ + f"{Domain} electrode {phase} active material volume fraction change" + ] + for phase in phases + ) + deps_solid_dt_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} active material " + "volume fraction change" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode active material volume fraction change" + "": deps_solid_dt, + f"X-averaged {domain} electrode active material volume fraction change" + "": deps_solid_dt_av, + } + ) + + return variables diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index ae0dcae63c..a5b050ebe6 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -26,6 +26,8 @@ class BaseSubModel(pybamm.BaseModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle Attributes ---------- @@ -57,17 +59,17 @@ class BaseSubModel(pybamm.BaseModel): """ def __init__( - self, param, domain=None, name="Unnamed submodel", external=False, options=None + self, + param, + domain=None, + name="Unnamed submodel", + external=False, + options=None, + phase=None, ): super().__init__(name) - self.param = param - if param is None: - self.domain_param = None - else: - if domain == "Negative": - self.domain_param = param.n - elif domain == "Positive": - self.domain_param = param.p + if domain is not None: + domain = domain.capitalize() self.domain = domain self.set_domain_for_broadcast() @@ -80,6 +82,24 @@ def __init__( we = self.options["working electrode"] self.half_cell = we != "both" + self.param = param + if param is None: + self.domain_param = None + else: + if domain == "Negative": + self.domain_param = param.n + elif domain == "Positive": + self.domain_param = param.p + + if phase is not None: + if phase == "primary": + self.phase_param = self.domain_param.prim + elif phase == "secondary": + self.phase_param = self.domain_param.sec + + self.phase = phase + self.phase_name = "" + @property def domain(self): return self._domain diff --git a/pybamm/models/submodels/electrode/base_electrode.py b/pybamm/models/submodels/electrode/base_electrode.py index 775d451595..639f7d4d6a 100644 --- a/pybamm/models/submodels/electrode/base_electrode.py +++ b/pybamm/models/submodels/electrode/base_electrode.py @@ -136,8 +136,7 @@ def _get_standard_current_collector_potential_variables(self, phi_s_cn, phi_s_cp """ pot_scale = self.param.potential_scale - U_ref = self.param.ocv_ref - phi_s_cp_dim = U_ref + phi_s_cp * pot_scale + phi_s_cp_dim = self.param.ocv_ref + phi_s_cp * pot_scale # Local potential difference V_cc = phi_s_cp - phi_s_cn @@ -156,7 +155,7 @@ def _get_standard_current_collector_potential_variables(self, phi_s_cn, phi_s_cp "Positive current collector potential": phi_s_cp, "Positive current collector potential [V]": phi_s_cp_dim, "Local voltage": V_cc, - "Local voltage [V]": U_ref + V_cc * pot_scale, + "Local voltage [V]": self.param.ocv_ref + V_cc * pot_scale, "Terminal voltage": V, "Terminal voltage [V]": V_dim, } diff --git a/pybamm/models/submodels/electrode/ohm/full_ohm.py b/pybamm/models/submodels/electrode/ohm/full_ohm.py index 48e0b0e3ba..aa0d83bcdd 100644 --- a/pybamm/models/submodels/electrode/ohm/full_ohm.py +++ b/pybamm/models/submodels/electrode/ohm/full_ohm.py @@ -59,16 +59,13 @@ def set_algebraic(self, variables): phi_s = variables[self.domain + " electrode potential"] i_s = variables[self.domain + " electrode current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of volumetric {self.domain.lower()} " + "electrode interfacial current densities" ] - self.algebraic[phi_s] = pybamm.div(i_s) + a * sum_j + self.algebraic[phi_s] = pybamm.div(i_s) + sum_a_j def set_boundary_conditions(self, variables): diff --git a/pybamm/models/submodels/electrode/ohm/li_metal.py b/pybamm/models/submodels/electrode/ohm/li_metal.py index 51c549bfee..a85ca59d32 100644 --- a/pybamm/models/submodels/electrode/ohm/li_metal.py +++ b/pybamm/models/submodels/electrode/ohm/li_metal.py @@ -22,7 +22,7 @@ def _get_li_metal_interface_variables(self, delta_phi_s, phi_s, phi_e): "Lithium metal interface electrode potential": phi_s, "Lithium metal interface electrode potential [V]": pot_scale * phi_s, "Lithium metal interface electrolyte potential": phi_e, - "Lithium metal interface electrolyte potential [V]": param.n.U_ref + "Lithium metal interface electrolyte potential [V]": param.n.prim.U_ref + pot_scale * phi_e, } return variables @@ -43,7 +43,7 @@ class LithiumMetalSurfaceForm(LithiumMetalBaseModel): """ def get_fundamental_variables(self): - ocp_ref = self.param.n.U_ref + ocp_ref = self.param.n.prim.U_ref pot_scale = self.param.potential_scale delta_phi = pybamm.Variable( @@ -80,7 +80,7 @@ def get_coupled_variables(self, variables): def set_initial_conditions(self, variables): delta_phi = variables["Lithium metal interface surface potential difference"] - delta_phi_init = self.param.n.U_init + delta_phi_init = self.param.n.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py index 483f274472..d1b7bf18d5 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py @@ -46,6 +46,7 @@ def _get_standard_potential_variables(self, phi_e_n, phi_e_s, phi_e_p): param = self.param pot_scale = param.potential_scale + U_ref = param.n.prim.U_ref phi_e = pybamm.concatenation(phi_e_n, phi_e_s, phi_e_p) @@ -61,24 +62,23 @@ def _get_standard_potential_variables(self, phi_e_n, phi_e_s, phi_e_p): variables = { "Negative electrolyte potential": phi_e_n, - "Negative electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_n, + "Negative electrolyte potential [V]": -U_ref + pot_scale * phi_e_n, "Separator electrolyte potential": phi_e_s, - "Separator electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_s, + "Separator electrolyte potential [V]": -U_ref + pot_scale * phi_e_s, "Positive electrolyte potential": phi_e_p, - "Positive electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e_p, + "Positive electrolyte potential [V]": -U_ref + pot_scale * phi_e_p, "Electrolyte potential": phi_e, - "Electrolyte potential [V]": -param.n.U_ref + pot_scale * phi_e, + "Electrolyte potential [V]": -U_ref + pot_scale * phi_e, "X-averaged electrolyte potential": phi_e_av, - "X-averaged electrolyte potential [V]": -param.n.U_ref - + pot_scale * phi_e_av, + "X-averaged electrolyte potential [V]": -U_ref + pot_scale * phi_e_av, "X-averaged negative electrolyte potential": phi_e_n_av, - "X-averaged negative electrolyte potential [V]": -param.n.U_ref + "X-averaged negative electrolyte potential [V]": -U_ref + pot_scale * phi_e_n_av, "X-averaged separator electrolyte potential": phi_e_s_av, - "X-averaged separator electrolyte potential [V]": -param.n.U_ref + "X-averaged separator electrolyte potential [V]": -U_ref + pot_scale * phi_e_s_av, "X-averaged positive electrolyte potential": phi_e_p_av, - "X-averaged positive electrolyte potential [V]": -param.n.U_ref + "X-averaged positive electrolyte potential [V]": -U_ref + pot_scale * phi_e_p_av, "X-averaged electrolyte overpotential": eta_e_av, "X-averaged electrolyte overpotential [V]": pot_scale * eta_e_av, @@ -188,7 +188,7 @@ def _get_standard_average_surface_potential_difference_variables( The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.U_ref + ocp_ref = self.domain_param.prim.U_ref variables = { "X-averaged " @@ -218,7 +218,7 @@ def _get_standard_surface_potential_difference_variables(self, delta_phi): The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.U_ref + ocp_ref = self.domain_param.prim.U_ref # Broadcast if necessary if delta_phi.domain == []: diff --git a/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py index 77058cc239..5c9a7a2811 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/full_conductivity.py @@ -59,28 +59,14 @@ def set_algebraic(self, variables): phi_e = variables["Electrolyte potential"] i_e = variables["Electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a_p = variables["Positive electrode surface area to volume ratio"] - if self.half_cell: - a = pybamm.concatenation( - pybamm.FullBroadcast(0, "separator", "current collector"), a_p - ) - else: - a_n = variables["Negative electrode surface area to volume ratio"] - a = pybamm.concatenation( - a_n, pybamm.FullBroadcast(0, "separator", "current collector"), a_p - ) - # Variable summing all of the interfacial current densities - sum_j = variables["Sum of interfacial current densities"] + sum_a_j = variables["Sum of volumetric interfacial current densities"] # Override print_name - sum_j.print_name = "J" - a.print_name = "a" + sum_a_j.print_name = "aj" - self.algebraic = {phi_e: pybamm.div(i_e) - a * sum_j} + self.algebraic = {phi_e: pybamm.div(i_e) - sum_a_j} def set_initial_conditions(self, variables): phi_e = variables["Electrolyte potential"] - self.initial_conditions = {phi_e: -self.param.n.U_init} + self.initial_conditions = {phi_e: -self.param.n.prim.U_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py index 17ec7b233c..368834e82c 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/composite_surface_form_conductivity.py @@ -60,7 +60,7 @@ def set_initial_conditions(self, variables): + self.domain.lower() + " electrode surface potential difference" ] - delta_phi_init = self.domain_param.U_init + delta_phi_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py index 8a63bb2477..3ad1fa98b1 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py @@ -140,7 +140,7 @@ def set_initial_conditions(self, variables): return delta_phi_e = variables[self.domain + " electrode surface potential difference"] - delta_phi_e_init = self.domain_param.U_init + delta_phi_e_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi_e: delta_phi_e_init} @@ -235,16 +235,13 @@ def set_algebraic(self, variables): delta_phi = variables[self.domain + " electrode surface potential difference"] i_e = variables[self.domain + " electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of volumetric {self.domain.lower()} " + "electrode interfacial current densities" ] - self.algebraic[delta_phi] = pybamm.div(i_e) - a * sum_j + self.algebraic[delta_phi] = pybamm.div(i_e) - sum_a_j class FullDifferential(BaseModel): @@ -274,13 +271,10 @@ def set_rhs(self, variables): delta_phi = variables[self.domain + " electrode surface potential difference"] i_e = variables[self.domain + " electrolyte current density"] - # Get surface area to volume ratio (could be a distribution in x to - # account for graded electrodes) - a = variables[self.domain + " electrode surface area to volume ratio"] - # Variable summing all of the interfacial current densities - sum_j = variables[ - "Sum of " + self.domain.lower() + " electrode interfacial current densities" + sum_a_j = variables[ + f"Sum of volumetric {self.domain.lower()} " + "electrode interfacial current densities" ] - self.rhs[delta_phi] = 1 / C_dl * (pybamm.div(i_e) - a * sum_j) + self.rhs[delta_phi] = 1 / C_dl * (pybamm.div(i_e) - sum_a_j) diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py index 6141e0c200..95f4bbe75e 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/leading_surface_form_conductivity.py @@ -56,7 +56,7 @@ def set_initial_conditions(self, variables): + self.domain.lower() + " electrode surface potential difference" ] - delta_phi_init = self.domain_param.U_init + delta_phi_init = self.domain_param.prim.U_init self.initial_conditions = {delta_phi: delta_phi_init} diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 50264b191d..4345184541 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -20,30 +20,28 @@ class BaseInterface(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options=None): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, reaction, options=None, phase="primary"): + super().__init__(param, domain, options=options, phase=phase) if reaction in ["lithium-ion main", "lithium metal plating"]: - self.reaction_name = "" # empty reaction name for the main reaction - self.Reaction_icd = "Interfacial current density" + self.reaction_name = self.phase_name + # can be "" or "primary " or "secondary " elif reaction == "lead-acid main": self.reaction_name = "" # empty reaction name for the main reaction - self.Reaction_icd = "Interfacial current density" elif reaction == "lead-acid oxygen": - self.reaction_name = " oxygen" - self.Reaction_icd = "Oxygen interfacial current density" + self.reaction_name = "oxygen " elif reaction == "lithium-ion oxygen": - self.reaction_name = " oxygen" - self.Reaction_icd = "Oxygen interfacial current density" + self.reaction_name = "oxygen " elif reaction == "SEI": - self.reaction_name = " SEI" - self.Reaction_icd = "SEI interfacial current density" + self.reaction_name = "SEI " elif reaction == "lithium plating": - self.reaction_name = " lithium plating" - self.Reaction_icd = "Lithium plating interfacial current density" + self.reaction_name = "lithium plating " + self.reaction = reaction def _get_exchange_current_density(self, variables): @@ -61,17 +59,22 @@ def _get_exchange_current_density(self, variables): The exchange current density. """ param = self.param - domain_param = self.domain_param + phase_param = self.phase_param + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name - c_e = variables[self.domain + " electrolyte concentration"] - T = variables[self.domain + " electrode temperature"] + c_e = variables[f"{Domain} electrolyte concentration"] + T = variables[f"{Domain} electrode temperature"] - if self.reaction == "lithium-ion main": + if isinstance(self, pybamm.kinetics.NoReaction): + return pybamm.Scalar(0) + elif self.reaction == "lithium-ion main": # For "particle-size distribution" submodels, take distribution version # of c_s_surf that depends on particle size. if self.options["particle size"] == "distribution": c_s_surf = variables[ - self.domain + " particle surface concentration distribution" + f"{Domain} {phase_name}particle surface concentration distribution" ] # If all variables were broadcast (in "x"), take only the orphans, # then re-broadcast c_e @@ -88,14 +91,13 @@ def _get_exchange_current_density(self, variables): # "current collector" c_e = pybamm.PrimaryBroadcast(c_e, ["current collector"]) # broadcast c_e, T onto "particle size" - c_e = pybamm.PrimaryBroadcast( - c_e, [self.domain.lower() + " particle size"] - ) - T = pybamm.PrimaryBroadcast(T, [self.domain.lower() + " particle size"]) + c_e = pybamm.PrimaryBroadcast(c_e, [f"{domain} particle size"]) + T = pybamm.PrimaryBroadcast(T, [f"{domain} particle size"]) else: - c_s_surf = variables[self.domain + " particle surface concentration"] - + c_s_surf = variables[ + f"{Domain} {phase_name}particle surface concentration" + ] # If all variables were broadcast, take only the orphans if ( isinstance(c_s_surf, pybamm.Broadcast) @@ -110,11 +112,7 @@ def _get_exchange_current_density(self, variables): c_e = pybamm.maximum(tol, c_e) c_s_surf = pybamm.maximum(tol, pybamm.minimum(c_s_surf, 1 - tol)) - j0 = ( - domain_param.gamma - * domain_param.j0(c_e, c_s_surf, T) - / domain_param.C_r - ) + j0 = phase_param.gamma * phase_param.j0(c_e, c_s_surf, T) / phase_param.C_r elif self.reaction == "lithium metal plating": j0 = param.j0_plating(c_e, 1, T) @@ -124,7 +122,7 @@ def _get_exchange_current_density(self, variables): if isinstance(c_e, pybamm.Broadcast) and isinstance(T, pybamm.Broadcast): c_e = c_e.orphans[0] T = T.orphans[0] - j0 = domain_param.j0(c_e, T) + j0 = phase_param.j0(c_e, T) elif self.reaction == "lead-acid oxygen": # If variable was broadcast, take only the orphan @@ -134,7 +132,7 @@ def _get_exchange_current_density(self, variables): if self.domain == "Negative": j0 = pybamm.Scalar(0) elif self.domain == "Positive": - j0 = param.p.j0_Ox(c_e, T) + j0 = param.p.prim.j0_Ox(c_e, T) else: j0 = pybamm.Scalar(0) @@ -143,34 +141,17 @@ def _get_exchange_current_density(self, variables): def _get_number_of_electrons_in_reaction(self): """Returns the number of electrons in the reaction.""" if self.reaction in [ - "lead-acid main", "lithium-ion main", "lithium metal plating", ]: - return self.domain_param.ne + return self.phase_param.ne + elif self.reaction == "lead-acid main": + return self.phase_param.ne elif self.reaction == "lead-acid oxygen": return self.param.ne_Ox else: return pybamm.Scalar(0) - def _get_electrolyte_reaction_signed_stoichiometry(self): - """Returns the number of electrons in the reaction.""" - if self.reaction in [ - "lithium-ion main", - "SEI", - "lithium plating", - "lithium metal plating", - ]: - # Both the main reaction current contribute to the electrolyte reaction - # current - return pybamm.Scalar(1), pybamm.Scalar(1) - elif self.reaction == "lead-acid main": - return self.param.n.s_plus_S, self.param.p.s_plus_S - elif self.reaction == "lead-acid oxygen": - return self.param.s_plus_Ox, self.param.s_plus_Ox - else: - return pybamm.Scalar(0), pybamm.Scalar(0) - def _get_average_total_interfacial_current_density(self, variables): """ Method to obtain the average total interfacial current density. @@ -187,7 +168,7 @@ def _get_average_total_interfacial_current_density(self, variables): For "leading-order" and "composite" submodels (as used in the SPM and SPMe) there is only a single particle radius, so this method returns correct result. """ - + domain = self.domain.lower() i_boundary_cc = variables["Current collector current density"] if self.half_cell and self.domain == "Negative": @@ -197,9 +178,8 @@ def _get_average_total_interfacial_current_density(self, variables): j_total_average = i_boundary_cc else: a_av = variables[ - "X-averaged " - + self.domain.lower() - + " electrode surface area to volume ratio" + f"X-averaged {domain} electrode {self.phase_name}" + "surface area to volume ratio" ] sgn = 1 if self.domain == "Negative" else -1 @@ -208,8 +188,11 @@ def _get_average_total_interfacial_current_density(self, variables): return j_total_average def _get_standard_interfacial_current_variables(self, j): + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name param = self.param - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # Half-cell domain, j should not be broadcast @@ -234,42 +217,23 @@ def _get_standard_interfacial_current_variables(self, j): j = pybamm.PrimaryBroadcast(j, self.domain_for_broadcast) variables = { - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density": j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density": j_av, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density [A.m-2]": j_scale * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density [A.m-2]": j_scale * j_av, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density per volume [A.m-3]": i_typ / L_x * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density per volume [A.m-3]": i_typ / L_x * j_av, + f"{Domain} electrode {reaction_name}interfacial current density": j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density": j_av, + f"{Domain} electrode {reaction_name}" + "interfacial current density [A.m-2]": j_scale * j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density [A.m-2]": j_scale * j_av, } return variables def _get_standard_total_interfacial_current_variables(self, j_tot_av): + domain = self.domain.lower() i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.half_cell and self.domain == "Negative": variables = { @@ -279,129 +243,22 @@ def _get_standard_total_interfacial_current_variables(self, j_tot_av): } else: variables = { - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density": j_tot_av, - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density [A.m-2]": j_scale - * j_tot_av, - "X-averaged " + self.domain.lower() + " electrode total interfacial " + f"X-averaged {domain} electrode total interfacial " + "current density": j_tot_av, + f"X-averaged {domain} electrode total interfacial " + "current density [A.m-2]": j_scale * j_tot_av, + f"X-averaged {domain} electrode total interfacial " "current density per volume [A.m-3]": i_typ / L_x * j_tot_av, } return variables - def _get_standard_whole_cell_interfacial_current_variables(self, variables): - """ - Get variables associated with interfacial current over the whole cell domain - This function also automatically increments the "total source term" variables - """ - param = self.param - - i_typ = param.i_typ - L_x = param.L_x - j_n_scale = param.n.j_scale - j_p_scale = param.p.j_scale - - j_p_av = variables[ - "X-averaged positive electrode" - + self.reaction_name - + " interfacial current density" - ] - - zero_s = pybamm.FullBroadcast(0, "separator", "current collector") - j_p = variables[ - "Positive electrode" + self.reaction_name + " interfacial current density" - ] - if self.half_cell: - j = pybamm.concatenation(zero_s, j_p) - j_dim = pybamm.concatenation(zero_s, j_p_scale * j_p) - else: - j_n_av = variables[ - "X-averaged negative electrode" - + self.reaction_name - + " interfacial current density" - ] - j_n = variables[ - "Negative electrode" - + self.reaction_name - + " interfacial current density" - ] - j = pybamm.concatenation(j_n, zero_s, j_p) - j_dim = pybamm.concatenation(j_n_scale * j_n, zero_s, j_p_scale * j_p) - - # Create separate 'new_variables' so that variables only get updated once - # everything is computed - new_variables = variables.copy() - if self.reaction not in ["SEI", "lithium plating"]: - new_variables.update( - { - self.Reaction_icd: j, - self.Reaction_icd + " [A.m-2]": j_dim, - self.Reaction_icd + " per volume [A.m-3]": i_typ / L_x * j, - } - ) - - a_p = new_variables["Positive electrode surface area to volume ratio"] - - s_n, s_p = self._get_electrolyte_reaction_signed_stoichiometry() - if self.half_cell: - a_n = pybamm.Scalar(1) - a = pybamm.concatenation(zero_s, a_p) - s = pybamm.concatenation( - zero_s, - pybamm.FullBroadcast(s_p, "positive electrode", "current collector"), - ) - else: - a_n = new_variables["Negative electrode surface area to volume ratio"] - a = pybamm.concatenation(a_n, zero_s, a_p) - s = pybamm.concatenation( - pybamm.FullBroadcast(s_n, "negative electrode", "current collector"), - zero_s, - pybamm.FullBroadcast(s_p, "positive electrode", "current collector"), - ) - - # Override print_name - j.print_name = "J" - a.print_name = "a" - j_p.print_name = "j_p" - - new_variables["Sum of electrolyte reaction source terms"] += a * s * j - new_variables[ - "Sum of positive electrode electrolyte reaction source terms" - ] += (a_p * s_p * j_p) - new_variables[ - "Sum of x-averaged positive electrode electrolyte reaction source terms" - ] += pybamm.x_average(a_p * s_p * j_p) - - new_variables["Sum of interfacial current densities"] += j - new_variables["Sum of positive electrode interfacial current densities"] += j_p - new_variables[ - "Sum of x-averaged positive electrode interfacial current densities" - ] += j_p_av - - if not self.half_cell: - j_n.print_name = "j_n" - new_variables[ - "Sum of negative electrode electrolyte reaction source terms" - ] += (a_n * s_n * j_n) - new_variables[ - "Sum of x-averaged negative electrode electrolyte reaction source terms" - ] += pybamm.x_average(a_n * s_n * j_n) - new_variables[ - "Sum of negative electrode interfacial current densities" - ] += j_n - new_variables[ - "Sum of x-averaged negative electrode interfacial current densities" - ] += j_n_av - - variables.update(new_variables) - return variables - def _get_standard_exchange_current_variables(self, j0): + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name param = self.param - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # half-cell domain @@ -430,77 +287,51 @@ def _get_standard_exchange_current_variables(self, j0): j0 = pybamm.PrimaryBroadcast(j0, self.domain_for_broadcast) variables = { - self.domain - + " electrode" - + self.reaction_name - + " exchange current density": j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density": j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density [A.m-2]": j_scale * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density [A.m-2]": j_scale * j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0_av, + f"{Domain} electrode {reaction_name}" "exchange current density": j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density": j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density [A.m-2]": j_scale * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density [A.m-2]": j_scale * j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density per volume [A.m-3]": i_typ / L_x * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density per volume [A.m-3]": i_typ / L_x * j0_av, } return variables - def _get_standard_whole_cell_exchange_current_variables(self, variables): - param = self.param - i_typ = param.i_typ - L_x = param.L_x - j_n_scale = param.n.j_scale - j_p_scale = param.p.j_scale + def _get_standard_volumetric_current_density_variables(self, variables): + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name - zero_s = pybamm.FullBroadcast(0, "separator", "current collector") - j0_p = variables[ - "Positive electrode" + self.reaction_name + " exchange current density" + a = variables[f"{Domain} electrode surface area to volume ratio"] + a_av = variables[f"X-averaged {domain} electrode surface area to volume ratio"] + j = variables[f"{Domain} electrode {reaction_name}interfacial current density"] + j_av = variables[ + f"X-averaged {domain} electrode {reaction_name}interfacial current density" ] - if self.half_cell: - j0 = pybamm.concatenation(zero_s, j0_p) - j0_dim = pybamm.concatenation(zero_s, j_p_scale * j0_p) - else: - j0_n = variables[ - "Negative electrode" + self.reaction_name + " exchange current density" - ] - j0 = pybamm.concatenation(j0_n, zero_s, j0_p) - j0_dim = pybamm.concatenation(j_n_scale * j0_n, zero_s, j_p_scale * j0_p) - - if self.reaction_name == "": - variables = { - "Exchange current density": j0, - "Exchange current density [A.m-2]": j0_dim, - "Exchange current density per volume [A.m-3]": i_typ / L_x * j0, + scale = self.param.i_typ / self.param.L_x + + variables.update( + { + f"{Domain} electrode {reaction_name}volumetric " + "interfacial current density": a * j, + f"X-averaged {domain} electrode {reaction_name}volumetric " + "interfacial current density": a_av * j_av, + f"{Domain} electrode {reaction_name}volumetric " + "interfacial current density [A.m-3]": scale * a * j, + f"X-averaged {domain} electrode {reaction_name}volumetric " + "interfacial current density [A.m-3]": scale * a_av * j_av, } - else: - reaction_name = self.reaction_name[1:].capitalize() - variables = { - reaction_name + " exchange current density": j0, - reaction_name + " exchange current density [A.m-2]": j0_dim, - reaction_name - + " exchange current density per volume [A.m-3]": i_typ / L_x * j0, - } - + ) return variables def _get_standard_overpotential_variables(self, eta_r): - + Domain = self.domain + reaction_name = self.reaction_name pot_scale = self.param.potential_scale if self.reaction == "lithium metal plating": @@ -521,15 +352,13 @@ def _get_standard_overpotential_variables(self, eta_r): if eta_r.domain == ["current collector"]: eta_r = pybamm.PrimaryBroadcast(eta_r, self.domain_for_broadcast) - domain_reaction = ( - self.domain + " electrode" + self.reaction_name + " reaction overpotential" - ) + domain_reaction = f"{Domain} electrode {reaction_name}reaction overpotential" variables = { domain_reaction: eta_r, - "X-averaged " + domain_reaction.lower(): eta_r_av, - domain_reaction + " [V]": eta_r * pot_scale, - "X-averaged " + domain_reaction.lower() + " [V]": eta_r_av * pot_scale, + f"X-averaged {domain_reaction.lower()}": eta_r_av, + f"{domain_reaction} [V]": eta_r * pot_scale, + f"X-averaged {domain_reaction.lower()} [V]": eta_r_av * pot_scale, } return variables @@ -567,7 +396,9 @@ def _get_standard_sei_film_overpotential_variables(self, eta_sei): def _get_standard_average_surface_potential_difference_variables( self, delta_phi_av ): - ocp_ref = self.domain_param.U_ref + domain = self.domain.lower() + + ocp_ref = self.phase_param.U_ref delta_phi_av_dim = ocp_ref + delta_phi_av * self.param.potential_scale @@ -579,23 +410,20 @@ def _get_standard_average_surface_potential_difference_variables( } else: variables = { - "X-averaged " - + self.domain.lower() - + " electrode surface potential difference": delta_phi_av, - "X-averaged " - + self.domain.lower() - + " electrode surface potential difference [V]": delta_phi_av_dim, + f"X-averaged {domain} electrode " + "surface potential difference": delta_phi_av, + f"X-averaged {domain} electrode " + "surface potential difference [V]": delta_phi_av_dim, } return variables def _get_standard_surface_potential_difference_variables(self, delta_phi): - ocp_ref = self.domain_param.U_ref - pot_scale = self.param.potential_scale + ocp_ref = self.phase_param.U_ref # Broadcast if necessary - delta_phi_dim = ocp_ref + delta_phi * pot_scale + delta_phi_dim = ocp_ref + delta_phi * self.param.potential_scale if delta_phi.domain == ["current collector"]: delta_phi = pybamm.PrimaryBroadcast(delta_phi, self.domain_for_broadcast) delta_phi_dim = pybamm.PrimaryBroadcast( @@ -603,8 +431,8 @@ def _get_standard_surface_potential_difference_variables(self, delta_phi): ) variables = { - self.domain + " electrode surface potential difference": delta_phi, - self.domain + " electrode surface potential difference [V]": delta_phi_dim, + f"{self.domain} electrode surface potential difference": delta_phi, + f"{self.domain} electrode surface potential difference [V]": delta_phi_dim, } return variables @@ -614,40 +442,32 @@ def _get_standard_size_distribution_interfacial_current_variables(self, j): Interfacial current density variables that depend on particle size R, relevant if "particle size" option is "distribution". """ + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name + # X-average and broadcast if necessary - if j.domains["secondary"] == [self.domain.lower() + " electrode"]: + if j.domains["secondary"] == [f"{domain} electrode"]: # x-average j_xav = pybamm.x_average(j) else: j_xav = j - j = pybamm.SecondaryBroadcast(j_xav, [self.domain.lower() + " electrode"]) + j = pybamm.SecondaryBroadcast(j_xav, [f"{domain} electrode"]) # j scale i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = i_typ / (self.domain_param.a_typ * L_x) + j_scale = i_typ / (self.phase_param.a_typ * L_x) variables = { - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density distribution": j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density distribution": j_xav, - self.domain - + " electrode" - + self.reaction_name - + " interfacial current density" - + " distribution [A.m-2]": j_scale * j, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" - + " distribution [A.m-2]": j_scale * j_xav, + f"{Domain} electrode {reaction_name}" + "interfacial current density distribution": j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density distribution": j_xav, + f"{Domain} electrode {reaction_name}" + "interfacial current density distribution [A.m-2]": j_scale * j, + f"X-averaged {domain} electrode {reaction_name}" + "interfacial current density distribution [A.m-2]": j_scale * j_xav, } return variables @@ -656,46 +476,34 @@ def _get_standard_size_distribution_exchange_current_variables(self, j0): """ Exchange current variables that depend on particle size. """ + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name i_typ = self.param.i_typ L_x = self.param.L_x - j_scale = i_typ / (self.domain_param.a_typ * L_x) + j_scale = i_typ / (self.phase_param.a_typ * L_x) # X-average or broadcast to electrode if necessary - if j0.domains["secondary"] != [self.domain.lower() + " electrode"]: + if j0.domains["secondary"] != [f"{domain} electrode"]: j0_av = j0 j0 = pybamm.SecondaryBroadcast(j0, self.domain_for_broadcast) else: j0_av = pybamm.x_average(j0) variables = { - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution": j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution": j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution [A.m-2]": j_scale * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution [A.m-2]": j_scale * j0_av, - self.domain - + " electrode" - + self.reaction_name - + " exchange current density distribution" + f"{Domain} electrode {reaction_name}" + "exchange current density distribution": j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution": j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density distribution [A.m-2]": j_scale * j0, + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution [A.m-2]": j_scale * j0_av, + f"{Domain} electrode {reaction_name}" + "exchange current density distribution" + " per volume [A.m-3]": i_typ / L_x * j0, - "X-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " exchange current density distribution" + f"X-averaged {domain} electrode {reaction_name}" + "exchange current density distribution" + " per volume [A.m-3]": i_typ / L_x * j0_av, } @@ -706,25 +514,25 @@ def _get_standard_size_distribution_overpotential_variables(self, eta_r): Overpotential variables that depend on particle size. """ pot_scale = self.param.potential_scale + Domain = self.domain + domain = Domain.lower() + reaction_name = self.reaction_name # X-average or broadcast to electrode if necessary - if eta_r.domains["secondary"] != [self.domain.lower() + " electrode"]: + if eta_r.domains["secondary"] != [f"{domain} electrode"]: eta_r_av = eta_r eta_r = pybamm.SecondaryBroadcast(eta_r, self.domain_for_broadcast) else: eta_r_av = pybamm.x_average(eta_r) - domain_reaction = ( - self.domain + " electrode" + self.reaction_name + " reaction overpotential" - ) + domain_reaction = f"{Domain} electrode {reaction_name}reaction overpotential" variables = { domain_reaction: eta_r, - "X-averaged " + domain_reaction.lower() + " distribution": eta_r_av, - domain_reaction + " [V]": eta_r * pot_scale, - "X-averaged " - + domain_reaction.lower() - + " distribution [V]": eta_r_av * pot_scale, + f"X-averaged {domain_reaction.lower()} distribution": eta_r_av, + f"{domain_reaction} [V]": eta_r * pot_scale, + f"X-averaged {domain_reaction.lower()} distribution [V]": eta_r_av + * pot_scale, } return variables diff --git a/pybamm/models/submodels/interface/kinetics/__init__.py b/pybamm/models/submodels/interface/kinetics/__init__.py index 2c09e21047..4808d27133 100644 --- a/pybamm/models/submodels/interface/kinetics/__init__.py +++ b/pybamm/models/submodels/interface/kinetics/__init__.py @@ -1,4 +1,5 @@ from .base_kinetics import BaseKinetics +from .total_kinetics import TotalKinetics from .butler_volmer import SymmetricButlerVolmer, AsymmetricButlerVolmer from .linear import Linear from .marcus import Marcus, MarcusHushChidsey @@ -13,3 +14,5 @@ ) from .first_order_kinetics.first_order_kinetics import FirstOrderKinetics from .first_order_kinetics.inverse_first_order_kinetics import InverseFirstOrderKinetics + +from .total_kinetics import TotalKinetics diff --git a/pybamm/models/submodels/interface/kinetics/base_kinetics.py b/pybamm/models/submodels/interface/kinetics/base_kinetics.py index d1bfe7dd7c..c018444a14 100644 --- a/pybamm/models/submodels/interface/kinetics/base_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/base_kinetics.py @@ -20,12 +20,14 @@ class BaseKinetics(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options=options) + def __init__(self, param, domain, reaction, options, phase="primary"): + super().__init__(param, domain, reaction, options=options, phase=phase) def get_fundamental_variables(self): domain = self.domain.lower() @@ -49,7 +51,7 @@ def get_fundamental_variables(self): def get_coupled_variables(self, variables): Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name if self.reaction == "lithium metal plating": # li metal electrode (half-cell) delta_phi = variables[ @@ -73,14 +75,13 @@ def get_coupled_variables(self, variables): # Get open-circuit potential variables and reaction overpotential if self.options["particle size"] == "distribution": ocp = variables[ - f"{Domain} electrode{rxn} open circuit potential distribution" + f"{Domain} electrode {reaction_name}open circuit potential distribution" ] else: - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + ocp = variables[f"{Domain} electrode {reaction_name}open circuit potential"] # If ocp was broadcast, take only the orphan. if isinstance(ocp, pybamm.Broadcast): ocp = ocp.orphans[0] - eta_r = delta_phi - ocp # Get average interfacial current density @@ -157,6 +158,10 @@ def get_coupled_variables(self, variables): variables.update(self._get_standard_exchange_current_variables(j0)) variables.update(self._get_standard_overpotential_variables(eta_r)) + variables.update( + self._get_standard_volumetric_current_density_variables(variables) + ) + if self.domain == "Negative" and self.reaction in [ "lithium-ion main", "lithium metal plating", @@ -166,31 +171,6 @@ def get_coupled_variables(self, variables): self._get_standard_sei_film_overpotential_variables(eta_sei) ) - if ( - ( - self.half_cell - or ( - "Negative electrode" - + self.reaction_name - + " interfacial current density" - ) - in variables - ) - and ( - "Positive electrode" - + self.reaction_name - + " interfacial current density" - ) - in variables - and self.Reaction_icd not in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables def set_algebraic(self, variables): @@ -281,9 +261,9 @@ def _get_interface_variables_for_first_order(self, variables): j0 = self._get_exchange_current_density(hacked_variables) ne = self._get_number_of_electrons_in_reaction() if self.reaction == "lead-acid main": - ocp = self.domain_param.U(c_e_0, self.param.T_init) + ocp = self.phase_param.U(c_e_0, self.param.T_init) elif self.reaction == "lead-acid oxygen": - ocp = self.domain_param.U_Ox + ocp = self.phase_param.U_Ox if j0.domain in ["current collector", ["current collector"]]: T = variables["X-averaged cell temperature"] diff --git a/pybamm/models/submodels/interface/kinetics/butler_volmer.py b/pybamm/models/submodels/interface/kinetics/butler_volmer.py index 2c85adbbe1..65f66e3327 100644 --- a/pybamm/models/submodels/interface/kinetics/butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/butler_volmer.py @@ -24,12 +24,14 @@ class SymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): prefactor = ne / (2 * (1 + self.param.Theta * T)) @@ -77,15 +79,17 @@ class AsymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv arg_ox = ne * alpha * eta_r / (1 + self.param.Theta * T) arg_red = -ne * (1 - alpha) * eta_r / (1 + self.param.Theta * T) return u * j0 * (pybamm.exp(arg_ox) - pybamm.exp(arg_red)) diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index ffdb17dbde..905182d19f 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -40,7 +40,12 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode {rxn}open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi_s - ocp # Get interfacial current densities @@ -58,40 +63,19 @@ def get_coupled_variables(self, variables): eta_sei = pybamm.Scalar(0) variables.update(self._get_standard_sei_film_overpotential_variables(eta_sei)) - if ( - "Negative electrode" + self.reaction_name + " interfacial current density" - in variables - and "Positive electrode" - + self.reaction_name - + " interfacial current density" - in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - if self.order == "composite": # For the composite model, adds the first-order x-averaged interfacial # current density to the dictionary of variables. j_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order {self.domain.lower()} electrode {self.reaction_name}" + "interfacial current density" ] j_1_bar = (pybamm.x_average(j) - pybamm.x_average(j_0)) / self.param.C_e variables.update( { - "First-order x-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density": j_1_bar + f"First-order x-averaged {self.domain.lower()} electrode" + f" {self.reaction_name}interfacial current density": j_1_bar } ) @@ -102,9 +86,8 @@ def _get_diffusion_limited_current_density(self, variables): if self.domain == "Negative": if self.order == "leading": j_p = variables[ - "X-averaged positive electrode" - + self.reaction_name - + " interfacial current density" + f"X-averaged positive electrode {self.reaction_name}" + "interfacial current density" ] j = -self.param.p.l * j_p / self.param.n.l elif self.order in ["composite", "full"]: @@ -135,11 +118,8 @@ def _get_j_diffusion_limited_first_order(self, variables): """ if self.order == "leading": j_leading_order = variables[ - "Leading-order x-averaged " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order x-averaged {self.domain.lower()} electrode " + f"{self.reaction_name}interfacial current density" ] param = self.param if self.domain == "Negative": diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index 3dfcd14bc9..cbf4796856 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -27,12 +27,11 @@ def __init__(self, param, domain, leading_order_model): def get_coupled_variables(self, variables): Domain = self.domain + domain = Domain.lower() rxn = self.reaction_name # Unpack - c_e_0 = variables[ - "Leading-order " + self.domain.lower() + " electrolyte concentration" - ] + c_e_0 = variables[f"Leading-order {domain} electrolyte concentration"] c_e = variables[self.domain + " electrolyte concentration"] c_e_1 = (c_e - c_e_0) / self.param.C_e @@ -53,25 +52,24 @@ def get_coupled_variables(self, variables): ) delta_phi_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode surface potential difference" + f"Leading-order {domain} electrode surface potential difference" ] delta_phi_1 = (delta_phi - delta_phi_0) / self.param.C_e j_0 = variables[ - "Leading-order " - + self.domain.lower() - + " electrode" - + self.reaction_name - + " interfacial current density" + f"Leading-order {domain} electrode {rxn}interfacial current density" ] j_1 = dj_dc_0 * c_e_1 + dj_ddeltaphi_0 * delta_phi_1 j = j_0 + self.param.C_e * j_1 # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode {rxn}open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi - ocp variables.update(self._get_standard_interfacial_current_variables(j)) @@ -97,12 +95,4 @@ def get_coupled_variables(self, variables): } ) - if self.domain == "Positive": - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables diff --git a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py index c876e1c125..8deb86f486 100644 --- a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py @@ -33,7 +33,12 @@ def get_coupled_variables(self, variables): Domain = self.domain rxn = self.reaction_name - ocp = variables[f"{Domain} electrode{rxn} open circuit potential"] + if self.options["particle size"] == "distribution": + ocp = variables[ + f"{Domain} electrode {rxn}open circuit potential distribution" + ] + else: + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] j0 = self._get_exchange_current_density(variables) # Broadcast to match j0's domain @@ -97,6 +102,10 @@ def get_coupled_variables(self, variables): ) ) + variables.update( + self._get_standard_volumetric_current_density_variables(variables) + ) + return variables def _get_overpotential(self, j, j0, ne, T, u): @@ -141,9 +150,8 @@ def __init__(self, param, domain, reaction, options=None): def get_coupled_variables(self, variables): j_tot = variables[ - "X-averaged " - + self.domain.lower() - + " electrode total interfacial current density" + f"X-averaged {self.domain.lower()} electrode " + "total interfacial current density" ] if self.domain == "Negative": j_sei = variables["SEI interfacial current density"] @@ -154,27 +162,6 @@ def get_coupled_variables(self, variables): variables.update(self._get_standard_interfacial_current_variables(j)) - if ( - self.half_cell - or ( - "Negative electrode" - + self.reaction_name - + " interfacial current density" - in variables - ) - and "Positive electrode" - + self.reaction_name - + " interfacial current density" - in variables - and self.Reaction_icd not in variables - ): - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) - variables.update( - self._get_standard_whole_cell_exchange_current_variables(variables) - ) - return variables diff --git a/pybamm/models/submodels/interface/kinetics/linear.py b/pybamm/models/submodels/interface/kinetics/linear.py index 01bb5d7dfb..4c1000af77 100644 --- a/pybamm/models/submodels/interface/kinetics/linear.py +++ b/pybamm/models/submodels/interface/kinetics/linear.py @@ -20,12 +20,14 @@ class Linear(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): prefactor = ne / (2 * (1 + self.param.Theta * T)) diff --git a/pybamm/models/submodels/interface/kinetics/marcus.py b/pybamm/models/submodels/interface/kinetics/marcus.py index 01f38c4995..887d6d6e29 100644 --- a/pybamm/models/submodels/interface/kinetics/marcus.py +++ b/pybamm/models/submodels/interface/kinetics/marcus.py @@ -22,16 +22,18 @@ class Marcus(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") def _get_kinetics(self, j0, ne, eta_r, T, u): - mhc_lambda = self.domain_param.mhc_lambda + mhc_lambda = self.phase_param.mhc_lambda kT = 1 + self.param.Theta * T # dimensionless exp_arg_ox = -((mhc_lambda + eta_r) ** 2) / (4 * mhc_lambda * kT) @@ -62,16 +64,18 @@ class MarcusHushChidsey(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") def _get_kinetics(self, j0, ne, eta_r, T, u): - mhc_lambda = self.domain_param.mhc_lambda + mhc_lambda = self.phase_param.mhc_lambda kT = 1 + self.param.Theta * T # dimensionless lambda_T = mhc_lambda / kT diff --git a/pybamm/models/submodels/interface/kinetics/no_reaction.py b/pybamm/models/submodels/interface/kinetics/no_reaction.py index dea93e239e..7b5ab7720a 100644 --- a/pybamm/models/submodels/interface/kinetics/no_reaction.py +++ b/pybamm/models/submodels/interface/kinetics/no_reaction.py @@ -3,10 +3,10 @@ # import pybamm -from .base_kinetics import BaseKinetics +from ..base_interface import BaseInterface -class NoReaction(BaseKinetics): +class NoReaction(BaseInterface): """ Base submodel for when no reaction occurs @@ -18,16 +18,30 @@ class NoReaction(BaseKinetics): The domain to implement the model, either: 'Negative' or 'Positive'. reaction : str The name of the reaction being implemented + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction): + def __init__(self, param, domain, reaction, phase): options = { "SEI film resistance": "none", "total interfacial current density as a state": "false", } - super().__init__(param, domain, reaction, options) + super().__init__(param, domain, reaction, options, phase) - def _get_kinetics(self, j0, ne, eta_r, T, u): + def get_fundamental_variables(self): + zero = pybamm.Scalar(0) + variables = self._get_standard_interfacial_current_variables(zero) + variables.update(self._get_standard_exchange_current_variables(zero)) + return variables + + def _get_dj_dc(self, variables): + return pybamm.Scalar(0) + + def _get_dj_ddeltaphi(self, variables): + return pybamm.Scalar(0) + + def _get_j_diffusion_limited_first_order(self, variables): return pybamm.Scalar(0) diff --git a/pybamm/models/submodels/interface/kinetics/tafel.py b/pybamm/models/submodels/interface/kinetics/tafel.py index 3ae541d07b..ed187db82d 100644 --- a/pybamm/models/submodels/interface/kinetics/tafel.py +++ b/pybamm/models/submodels/interface/kinetics/tafel.py @@ -23,22 +23,24 @@ class ForwardTafel(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv return ( u * j0 * pybamm.exp((ne * alpha / (2 * (1 + self.param.Theta * T))) * eta_r) ) def _get_dj_dc(self, variables): """See :meth:`pybamm.interface.kinetics.BaseKinetics._get_dj_dc`""" - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv ( c_e, delta_phi, @@ -55,7 +57,7 @@ def _get_dj_dc(self, variables): def _get_dj_ddeltaphi(self, variables): """See :meth:`pybamm.interface.kinetics.BaseKinetics._get_dj_ddeltaphi`""" - alpha = self.domain_param.alpha_bv + alpha = self.phase_param.alpha_bv _, delta_phi, j0, ne, ocp, T, u = self._get_interface_variables_for_first_order( variables ) diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py new file mode 100644 index 0000000000..30f4348e23 --- /dev/null +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -0,0 +1,237 @@ +# +# Total kinetics class, summing up contributions from all reactions +# +import pybamm + + +class TotalKinetics(pybamm.BaseSubModel): + """ + Total kinetics class, summing up contributions from all reactions + + Parameters + ---------- + param : + model parameters + chemistry : str + The name of the battery chemistry whose reactions need to be summed up + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + + **Extends:** :class:`pybamm.interface.BaseInterface` + """ + + def __init__(self, param, chemistry, options): + super().__init__(param, options=options) + self.chemistry = chemistry + + def get_coupled_variables(self, variables): + """ + Get variables associated with interfacial current over the whole cell domain + This function also creates the "total source term" variables by summing all + the reactions + """ + param = self.param + + i_typ = param.i_typ + L_x = param.L_x + + if self.chemistry == "lithium-ion": + reaction_names = ["", "SEI "] + if not self.half_cell: + # no separate plating reaction in a half-cell, + # since plating is the main reaction + reaction_names.append("lithium plating ") + elif self.chemistry == "lead-acid": + reaction_names = ["", "oxygen "] + + # Create separate 'new_variables' so that variables only get updated once + # everything is computed + new_variables = variables.copy() + + # Initialize "total reaction" variables + # These will get populated by each reaction, and then used + # later by "set_rhs" or "set_algebraic", which ensures that we always have + # added all the necessary variables by the time the sum is used + new_variables.update( + { + "Sum of electrolyte reaction source terms": 0, + "Sum of positive electrode electrolyte reaction source terms": 0, + "Sum of x-averaged positive electrode " + "electrolyte reaction source terms": 0, + "Sum of interfacial current densities": 0, + "Sum of volumetric interfacial current densities": 0, + "Sum of positive electrode interfacial current densities": 0, + "Sum of x-averaged positive electrode interfacial current densities": 0, + "Sum of volumetric positive electrode interfacial current densities": 0, + "Sum of x-averaged volumetric positive electrode " + "interfacial current densities": 0, + } + ) + if not self.half_cell: + new_variables.update( + { + "Sum of negative electrode electrolyte reaction source terms": 0, + "Sum of x-averaged negative electrode " + "electrolyte reaction source terms": 0, + "Sum of negative electrode interfacial current densities": 0, + "Sum of x-averaged negative electrode " + "interfacial current densities": 0, + "Sum of volumetric negative electrode " + "interfacial current densities": 0, + "Sum of x-averaged volumetric negative electrode " + "interfacial current densities": 0, + } + ) + for reaction_name in reaction_names: + j_n_scale = param.n.prim.j_scale + j_p_scale = param.p.prim.j_scale + + j_p_av = variables[ + f"X-averaged positive electrode {reaction_name}" + "interfacial current density" + ] + + zero_s = pybamm.FullBroadcast(0, "separator", "current collector") + j_p = variables[ + f"Positive electrode {reaction_name}interfacial current density" + ] + + if self.half_cell: + j = pybamm.concatenation(zero_s, j_p) + j_dim = pybamm.concatenation(zero_s, j_p_scale * j_p) + else: + j_n_av = variables[ + f"X-averaged negative electrode {reaction_name}" + "interfacial current density" + ] + j_n = variables[ + f"Negative electrode {reaction_name}interfacial current density" + ] + j = pybamm.concatenation(j_n, zero_s, j_p) + j_dim = pybamm.concatenation(j_n_scale * j_n, zero_s, j_p_scale * j_p) + + if reaction_name not in ["SEI ", "lithium plating "]: + j0_p = variables[ + f"Positive electrode {reaction_name}exchange current density" + ] + + if self.half_cell: + j0 = pybamm.concatenation(zero_s, j0_p) + j0_dim = pybamm.concatenation(zero_s, j_p_scale * j0_p) + else: + j0_n = variables[ + f"Negative electrode {reaction_name}exchange current density" + ] + j0 = pybamm.concatenation(j0_n, zero_s, j0_p) + j0_dim = pybamm.concatenation( + j_n_scale * j0_n, zero_s, j_p_scale * j0_p + ) + new_variables.update( + { + f"{reaction_name}interfacial ".capitalize() + + "current density": j, + f"{reaction_name}interfacial ".capitalize() + + "current density [A.m-2]": j_dim, + f"{reaction_name}exchange ".capitalize() + + "current density": j0, + f"{reaction_name}exchange ".capitalize() + + "current density [A.m-2]": j0_dim, + } + ) + + # Sum variables + a_j_p = new_variables[ + f"Positive electrode {reaction_name}volumetric " + "interfacial current density" + ] + + if self.chemistry == "lithium-ion": + # Both the main reaction current contribute to the electrolyte reaction + # current + s_n, s_p = 1, 1 + elif self.chemistry == "lead-acid": + if reaction_name == "": # main reaction + s_n, s_p = self.param.n.s_plus_S, self.param.p.s_plus_S + elif reaction_name == "oxygen ": + s_n, s_p = self.param.s_plus_Ox, self.param.s_plus_Ox + if self.half_cell: + a_j = pybamm.concatenation(zero_s, a_j_p) + s = pybamm.concatenation( + zero_s, + pybamm.FullBroadcast( + s_p, "positive electrode", "current collector" + ), + ) + else: + a_j_n = new_variables[ + f"Negative electrode {reaction_name}volumetric " + "interfacial current density" + ] + a_j = pybamm.concatenation(a_j_n, zero_s, a_j_p) + s = pybamm.concatenation( + pybamm.FullBroadcast( + s_n, "negative electrode", "current collector" + ), + zero_s, + pybamm.FullBroadcast( + s_p, "positive electrode", "current collector" + ), + ) + + # Override print_name + j.print_name = "J" + a_j.print_name = "aj" + j_p.print_name = "j_p" + + new_variables["Sum of electrolyte reaction source terms"] += s * a_j + new_variables[ + "Sum of positive electrode electrolyte reaction source terms" + ] += (s_p * a_j_p) + new_variables[ + "Sum of x-averaged positive electrode electrolyte reaction source terms" + ] += pybamm.x_average(s_p * a_j_p) + + new_variables["Sum of interfacial current densities"] += j + new_variables["Sum of volumetric interfacial current densities"] += a_j + new_variables[ + "Sum of positive electrode interfacial current densities" + ] += j_p + new_variables[ + "Sum of x-averaged positive electrode interfacial current densities" + ] += j_p_av + new_variables[ + "Sum of volumetric positive electrode interfacial current densities" + ] += a_j_p + new_variables[ + "Sum of x-averaged volumetric positive electrode" + " interfacial current densities" + ] += pybamm.x_average(a_j_p) + + if not self.half_cell: + j_n.print_name = "j_n" + new_variables[ + "Sum of negative electrode electrolyte reaction source terms" + ] += (s_n * a_j_n) + new_variables[ + "Sum of x-averaged negative electrode electrolyte " + "reaction source terms" + ] += pybamm.x_average(s_n * a_j_n) + new_variables[ + "Sum of negative electrode interfacial current densities" + ] += j_n + new_variables[ + "Sum of x-averaged negative electrode interfacial current densities" + ] += j_n_av + new_variables[ + "Sum of volumetric negative electrode " + "interfacial current densities" + ] += a_j_n + new_variables[ + "Sum of x-averaged volumetric negative electrode " + "interfacial current densities" + ] += pybamm.x_average(a_j_n) + + variables.update(new_variables) + + return variables diff --git a/pybamm/models/submodels/interface/lithium_plating/base_plating.py b/pybamm/models/submodels/interface/lithium_plating/base_plating.py index 7d73574812..ef1f88fdb3 100644 --- a/pybamm/models/submodels/interface/lithium_plating/base_plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/base_plating.py @@ -45,13 +45,18 @@ def get_coupled_variables(self, variables): ], "X-averaged positive electrode lithium plating interfacial current " "density": zero_av, + "X-averaged positive electrode lithium plating volumetric " + "interfacial current density": zero_av, "Negative electrode lithium plating interfacial current " "density": variables["Lithium plating interfacial current density"], "Positive electrode lithium plating interfacial current density": zero, + "Positive electrode lithium plating volumetric " + "interfacial current density": zero, } ) + variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) + self._get_standard_volumetric_current_density_variables(variables) ) return variables @@ -78,7 +83,7 @@ def _get_standard_concentration_variables(self, c_plated_Li, c_dead_Li): L_scale = 1 else: c_scale = param.c_Li_typ - L_scale = param.V_bar_plated_Li * c_scale / param.n.a_typ + L_scale = param.V_bar_plated_Li * c_scale / param.n.prim.a_typ c_plated_Li_av = pybamm.x_average(c_plated_Li) L_plated_Li = c_plated_Li # plated Li thickness @@ -109,8 +114,10 @@ def _get_standard_concentration_variables(self, c_plated_Li, c_dead_Li): "X-averaged dead lithium thickness [m]": L_dead_Li_av * L_scale, "Loss of lithium to lithium plating [mol]": (Q_plated_Li + Q_dead_Li) * c_scale, - "Loss of capacity to lithium plating [A.h]": - (Q_plated_Li + Q_dead_Li) * c_scale * param.F / 3600, + "Loss of capacity to lithium plating [A.h]": (Q_plated_Li + Q_dead_Li) + * c_scale + * param.F + / 3600, } return variables @@ -131,7 +138,7 @@ def _get_standard_reaction_variables(self, j_stripping): # Set scales to one for the "no plating" model so that they are not required # by parameter values in general param = self.param - j_scale = param.n.j_scale + j_scale = param.n.prim.j_scale j_stripping_av = pybamm.x_average(j_stripping) variables = { diff --git a/pybamm/models/submodels/interface/lithium_plating/plating.py b/pybamm/models/submodels/interface/lithium_plating/plating.py index cf6e2d7ca2..8a8f13a3c1 100644 --- a/pybamm/models/submodels/interface/lithium_plating/plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/plating.py @@ -74,7 +74,7 @@ def get_coupled_variables(self, variables): j0_stripping = param.j0_stripping(c_e_n, c_plated_Li, T) j0_plating = param.j0_plating(c_e_n, c_plated_Li, T) # phi_ref is part of the de-dimensionalization used in PyBaMM - phi_ref = param.n.U_ref / param.potential_scale + phi_ref = param.n.prim.U_ref / param.potential_scale eta_stripping = delta_phi + phi_ref + eta_sei eta_plating = -eta_stripping @@ -129,7 +129,7 @@ def set_rhs(self, variables): self.rhs = { c_plated_Li: -Gamma_plating * a * j_stripping - coupling_term, - c_dead_Li: coupling_term + c_dead_Li: coupling_term, } def set_initial_conditions(self, variables): diff --git a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py index 73abf39bfb..57dae2ea37 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py @@ -20,12 +20,14 @@ class BaseOpenCircuitPotential(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options=None): - super().__init__(param, domain, reaction, options) + def __init__(self, param, domain, reaction, options, phase): + super().__init__(param, domain, reaction, options=options, phase=phase) def _get_standard_ocp_variables(self, ocp, dUdT): """ @@ -47,7 +49,7 @@ def _get_standard_ocp_variables(self, ocp, dUdT): """ Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name # Update size variables then size average. if ocp.domain in [["negative particle size"], ["positive particle size"]]: @@ -71,15 +73,17 @@ def _get_standard_ocp_variables(self, ocp, dUdT): ocp = pybamm.PrimaryBroadcast(ocp, self.domain_for_broadcast) pot_scale = self.param.potential_scale - ocp_dim = self.domain_param.U_ref + pot_scale * ocp - ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av + ocp_dim = self.phase_param.U_ref + pot_scale * ocp + ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av variables.update( { - f"{Domain} electrode{rxn} open circuit potential": ocp, - f"{Domain} electrode{rxn} open circuit potential [V]": ocp_dim, - f"X-averaged {domain} electrode{rxn} open circuit potential": ocp_av, - f"X-averaged {domain} electrode{rxn} " + f"{Domain} electrode {reaction_name}open circuit potential": ocp, + f"{Domain} electrode {reaction_name}" + "open circuit potential [V]": ocp_dim, + f"X-averaged {domain} electrode {reaction_name}" + "open circuit potential": ocp_av, + f"X-averaged {domain} electrode {reaction_name}" "open circuit potential [V]": ocp_av_dim, } ) @@ -87,13 +91,11 @@ def _get_standard_ocp_variables(self, ocp, dUdT): variables.update( { f"{Domain} electrode entropic change": dUdT, - f"{Domain} electrode entropic change [V.K-1]": pot_scale - * dUdT - / self.param.Delta_T, + f"{Domain} electrode entropic change [V.K-1]" + "": pot_scale * dUdT / self.param.Delta_T, f"X-averaged {domain} electrode entropic change": dUdT_av, - f"X-averaged {domain} electrode entropic change [V.K-1]": pot_scale - * dUdT_av - / self.param.Delta_T, + f"X-averaged {domain} electrode entropic change [V.K-1]" + "": pot_scale * dUdT_av / self.param.Delta_T, } ) @@ -106,7 +108,7 @@ def _get_standard_size_distribution_ocp_variables(self, ocp, dUdT): """ Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name # X-average or broadcast to electrode if necessary if ocp.domains["secondary"] != [f"{domain} electrode"]: @@ -122,28 +124,31 @@ def _get_standard_size_distribution_ocp_variables(self, ocp, dUdT): dUdT_av = pybamm.x_average(dUdT) pot_scale = self.param.potential_scale - Delta_T = self.param.Delta_T - ocp_dim = self.domain_param.U_ref + pot_scale * ocp - ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av + ocp_dim = self.phase_param.U_ref + pot_scale * ocp + ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av variables = { - f"{Domain} electrode{rxn} open circuit potential distribution": ocp, - f"{Domain} electrode{rxn} open circuit potential distribution [V]": ocp_dim, - f"X-averaged {domain} electrode{rxn} " + f"{Domain} electrode {reaction_name}" + "open circuit potential distribution": ocp, + f"{Domain} electrode {reaction_name}" + "open circuit potential distribution [V]": ocp_dim, + f"X-averaged {domain} electrode {reaction_name}" "open circuit potential distribution": ocp_av, - f"X-averaged {domain} electrode{rxn} " + f"X-averaged {domain} electrode {reaction_name}" "open circuit potential distribution [V]": ocp_av_dim, } if self.reaction_name == "": variables.update( { f"{Domain} electrode entropic change (size-dependent)": dUdT, - f"{Domain} electrode entropic change" - " (size-dependent) [V.K-1]": pot_scale * dUdT / Delta_T, - f"X-averaged {domain} electrode entropic change" - " (size-dependent)": dUdT_av, - f"X-averaged {domain} electrode entropic change" - " (size-dependent) [V.K-1]": pot_scale * dUdT_av / Delta_T, + f"{Domain} electrode entropic change " + "(size-dependent) [V.K-1]": pot_scale * dUdT / self.param.Delta_T, + f"X-averaged {domain} electrode entropic change " + "(size-dependent)": dUdT_av, + f"X-averaged {domain} electrode entropic change " + "(size-dependent) [V.K-1]": pot_scale + * dUdT_av + / self.param.Delta_T, } ) diff --git a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py index 47382c671e..2677bf8c9e 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py @@ -8,13 +8,20 @@ class SingleOpenCircuitPotential(BaseOpenCircuitPotential): def get_coupled_variables(self, variables): Domain = self.domain - if self.reaction == "lithium-ion main": + domain = Domain.lower() + phase_name = self.phase_name + + if isinstance(self, pybamm.kinetics.NoReaction): + ocp = pybamm.Scalar(0) + dUdT = pybamm.Scalar(0) + elif self.reaction == "lithium-ion main": + T = variables[f"{Domain} electrode temperature"] # For "particle-size distribution" models, take distribution version # of c_s_surf that depends on particle size. if self.options["particle size"] == "distribution": c_s_surf = variables[ - f"{Domain} particle surface concentration distribution" + f"{Domain} {phase_name}particle surface concentration distribution" ] # If variable was broadcast, take only the orphan if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( @@ -22,10 +29,11 @@ def get_coupled_variables(self, variables): ): c_s_surf = c_s_surf.orphans[0] T = T.orphans[0] - T = pybamm.PrimaryBroadcast(T, [self.domain.lower() + " particle size"]) + T = pybamm.PrimaryBroadcast(T, [f"{domain} particle size"]) else: - c_s_surf = variables[f"{Domain} particle surface concentration"] - + c_s_surf = variables[ + f"{Domain} {phase_name}particle surface concentration" + ] # If variable was broadcast, take only the orphan if isinstance(c_s_surf, pybamm.Broadcast) and isinstance( T, pybamm.Broadcast @@ -33,22 +41,22 @@ def get_coupled_variables(self, variables): c_s_surf = c_s_surf.orphans[0] T = T.orphans[0] - ocp = self.domain_param.U(c_s_surf, T) - dUdT = self.domain_param.dUdT(c_s_surf) + ocp = self.phase_param.U(c_s_surf, T) + dUdT = self.phase_param.dUdT(c_s_surf) elif self.reaction == "lithium metal plating": T = variables[f"{Domain} electrode temperature"] - ocp = self.param.n.U_ref + ocp = self.param.n.prim.U_ref dUdT = 0 * T elif self.reaction == "lead-acid main": c_e = variables[f"{Domain} electrolyte concentration"] # If c_e was broadcast, take only the orphan if isinstance(c_e, pybamm.Broadcast): c_e = c_e.orphans[0] - ocp = self.domain_param.U(c_e, self.param.T_init) + ocp = self.phase_param.U(c_e, self.param.T_init) dUdT = pybamm.Scalar(0) elif self.reaction == "lead-acid oxygen": - ocp = self.domain_param.U_Ox + ocp = self.phase_param.U_Ox dUdT = pybamm.Scalar(0) else: diff --git a/pybamm/models/submodels/interface/sei/base_sei.py b/pybamm/models/submodels/interface/sei/base_sei.py index 40c39556b1..193964b434 100644 --- a/pybamm/models/submodels/interface/sei/base_sei.py +++ b/pybamm/models/submodels/interface/sei/base_sei.py @@ -37,16 +37,20 @@ def get_coupled_variables(self, variables): "density": variables["SEI interfacial current density"], } ) + variables.update( + self._get_standard_volumetric_current_density_variables(variables) + ) + variables.update( { "X-averaged positive electrode SEI interfacial current " "density": zero_av, "Positive electrode SEI interfacial current density": zero, + "X-averaged positive electrode SEI volumetric interfacial current " + "density": zero_av, + "Positive electrode SEI volumetric interfacial current density": zero, } ) - variables.update( - self._get_standard_whole_cell_interfacial_current_variables(variables) - ) return variables @@ -151,10 +155,14 @@ def _get_standard_concentration_variables(self, variables): else: # scales in mol/m3 (n is a bulk quantity) n_scale = ( - param.L_sei_0_dim * param.n.a_typ / param.V_bar_inner_dimensional + param.L_sei_0_dim + * param.n.prim.a_typ + / param.V_bar_inner_dimensional ) n_outer_scale = ( - param.L_sei_0_dim * param.n.a_typ / param.V_bar_outer_dimensional + param.L_sei_0_dim + * param.n.prim.a_typ + / param.V_bar_outer_dimensional ) v_bar = param.v_bar # Set scales for the "EC Reaction Limited" model @@ -228,7 +236,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): variables : dict The variables which can be derived from the SEI thicknesses. """ - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale j_i_av = pybamm.x_average(j_inner) j_o_av = pybamm.x_average(j_outer) @@ -252,7 +260,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): def _get_standard_total_reaction_variables(self, j_sei): """Update variables related to total SEI interfacial current density.""" - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale variables = { "SEI interfacial current density": j_sei, diff --git a/pybamm/models/submodels/particle/base_particle.py b/pybamm/models/submodels/particle/base_particle.py index 0d1514f558..5c47492563 100644 --- a/pybamm/models/submodels/particle/base_particle.py +++ b/pybamm/models/submodels/particle/base_particle.py @@ -17,12 +17,14 @@ class BaseParticle(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options=None): - super().__init__(param, domain, options=options) + def __init__(self, param, domain, options=None, phase=None): + super().__init__(param, domain, options=options, phase=phase) def _get_standard_concentration_variables( self, c_s, c_s_xav=None, c_s_rav=None, c_s_av=None, c_s_surf=None @@ -36,6 +38,9 @@ def _get_standard_concentration_variables( passed as keyword arguments, the various average concentrations and surface concentration are computed automatically from the particle concentration. """ + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name # Get surface concentration if not provided as fundamental variable to # solve for @@ -43,7 +48,7 @@ def _get_standard_concentration_variables( c_s_surf = pybamm.surf(c_s) c_s_surf_av = pybamm.x_average(c_s_surf) - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max # Get average concentration(s) if not provided as fundamental variable to # solve for @@ -55,96 +60,81 @@ def _get_standard_concentration_variables( c_s_av = pybamm.r_average(c_s_xav) variables = { - self.domain + " particle concentration": c_s, - self.domain + " particle concentration [mol.m-3]": c_s * c_scale, - self.domain + " particle concentration [mol.m-3]": c_s * c_scale, - "X-averaged " + self.domain.lower() + " particle concentration": c_s_xav, - "X-averaged " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_xav * c_scale, - "R-averaged " + self.domain.lower() + " particle concentration": c_s_rav, - "R-averaged " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_rav * c_scale, - "Average " + self.domain.lower() + " particle concentration": c_s_av, - "Average " - + self.domain.lower() - + " particle concentration [mol.m-3]": c_s_av * c_scale, - self.domain + " particle surface concentration": c_s_surf, - self.domain - + " particle surface concentration [mol.m-3]": c_scale * c_s_surf, - "X-averaged " - + self.domain.lower() - + " particle surface concentration": c_s_surf_av, - "X-averaged " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": c_scale * c_s_surf_av, - self.domain + " electrode extent of lithiation": c_s_rav, - "X-averaged " - + self.domain.lower() - + " electrode extent of lithiation": c_s_av, - "Minimum " - + self.domain.lower() - + " particle concentration": pybamm.min(c_s), - "Maximum " - + self.domain.lower() - + " particle concentration": pybamm.max(c_s), - "Minimum " - + self.domain.lower() - + " particle concentration [mol.m-3]": pybamm.min(c_s) * c_scale, - "Maximum " - + self.domain.lower() - + " particle concentration [mol.m-3]": pybamm.max(c_s) * c_scale, - "Minimum " - + self.domain.lower() - + " particle surface concentration": pybamm.min(c_s_surf), - "Maximum " - + self.domain.lower() - + " particle surface concentration": pybamm.max(c_s_surf), - "Minimum " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": pybamm.min(c_s_surf) + f"{Domain} {phase_name}particle concentration": c_s, + f"{Domain} {phase_name}particle concentration [mol.m-3]": c_s * c_scale, + f"{Domain} {phase_name}particle concentration [mol.m-3]": c_s * c_scale, + f"X-averaged {domain} {phase_name}particle concentration": c_s_xav, + f"X-averaged {domain} {phase_name}particle concentration [mol.m-3]": c_s_xav * c_scale, - "Maximum " - + self.domain.lower() - + " particle surface concentration [mol.m-3]": pybamm.max(c_s_surf) + f"R-averaged {domain} {phase_name}particle concentration": c_s_rav, + f"R-averaged {domain} {phase_name}particle concentration [mol.m-3]": c_s_rav * c_scale, + f"Average {domain} {phase_name}particle concentration": c_s_av, + f"Average {domain} {phase_name}particle concentration [mol.m-3]": c_s_av + * c_scale, + f"{Domain} {phase_name}particle " "surface concentration": c_s_surf, + f"{Domain} particle surface concentration [mol.m-3]": c_scale * c_s_surf, + f"X-averaged {domain} {phase_name}particle " + "surface concentration": c_s_surf_av, + f"X-averaged {domain} {phase_name}particle " + "surface concentration [mol.m-3]": c_scale * c_s_surf_av, + f"{Domain} electrode extent of lithiation": c_s_rav, + f"X-averaged {domain} electrode extent of lithiation": c_s_av, + f"Minimum {domain} {phase_name}particle concentration": pybamm.min(c_s), + f"Maximum {domain} {phase_name}particle concentration": pybamm.max(c_s), + f"Minimum {domain} {phase_name}particle concentration [mol.m-3]" + "": pybamm.min(c_s) * c_scale, + f"Maximum {domain} {phase_name}particle concentration [mol.m-3]" + "": pybamm.max(c_s) * c_scale, + f"Minimum {domain} {phase_name}particle " + "surface concentration": pybamm.min(c_s_surf), + f"Maximum {domain} {phase_name}particle " + "surface concentration": pybamm.max(c_s_surf), + f"Minimum {domain} {phase_name}particle " + "surface concentration [mol.m-3]": pybamm.min(c_s_surf) * c_scale, + f"Maximum {domain} {phase_name}particle " + "surface concentration [mol.m-3]": pybamm.max(c_s_surf) * c_scale, } return variables def _get_total_concentration_variables(self, variables): - c_s_rav = variables[ - "R-averaged " + self.domain.lower() + " particle concentration" + Domain = self.domain + domain = Domain.lower() + phase = self.phase + phase_name = self.phase_name + + c_s_rav = variables[f"R-averaged {domain} {phase_name}particle concentration"] + eps_s = variables[ + f"{Domain} electrode {phase_name}active material volume fraction" ] - eps_s = variables[self.domain + " electrode active material volume fraction"] eps_s_av = pybamm.x_average(eps_s) c_s_vol_av = pybamm.x_average(eps_s * c_s_rav) / eps_s_av - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max L = self.domain_param.L A = self.param.A_cc variables.update( { - self.domain + " electrode SOC": c_s_vol_av, - self.domain + " electrode volume-averaged concentration": c_s_vol_av, - self.domain - + " electrode " - + "volume-averaged concentration [mol.m-3]": c_s_vol_av * c_scale, - "Total lithium in " - + self.domain.lower() - + " electrode [mol]": pybamm.yz_average(c_s_vol_av * eps_s_av) - * c_scale - * L - * A, + f"{Domain} electrode {phase_name}SOC": c_s_vol_av, + f"{Domain} electrode {phase_name}volume-averaged " + "concentration": c_s_vol_av, + f"{Domain} electrode {phase_name}volume-averaged " + "concentration [mol.m-3]": c_s_vol_av * c_scale, + f"Total lithium in {phase} phase in {domain} electrode [mol]" + "": pybamm.yz_average(c_s_vol_av * eps_s_av) * c_scale * L * A, } ) return variables def _get_standard_flux_variables(self, N_s, N_s_xav): + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + variables = { - self.domain + " particle flux": N_s, - "X-averaged " + self.domain.lower() + " particle flux": N_s_xav, + f"{Domain} {phase_name}particle flux": N_s, + f"X-averaged {domain} {phase_name}particle flux": N_s_xav, } return variables diff --git a/pybamm/models/submodels/particle/no_distribution/base_fickian.py b/pybamm/models/submodels/particle/no_distribution/base_fickian.py index 93a11fead0..d865d59c6f 100644 --- a/pybamm/models/submodels/particle/no_distribution/base_fickian.py +++ b/pybamm/models/submodels/particle/no_distribution/base_fickian.py @@ -18,19 +18,22 @@ class BaseFickian(BaseParticle): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def _get_effective_diffusivity(self, c, T): param = self.param domain_param = self.domain_param + phase_param = self.phase_param # Get diffusivity - D = domain_param.D(c, T) + D = phase_param.D(c, T) # Account for stress-induced diffusion by defining a multiplicative # "stress factor" @@ -48,17 +51,18 @@ def _get_effective_diffusivity(self, c, T): return D * stress_factor def _get_standard_diffusivity_variables(self, D_eff): - D_scale = self.domain_param.D_typ_dim + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + D_scale = self.phase_param.D_typ_dim variables = { - self.domain + " effective diffusivity": D_eff, - self.domain + " effective diffusivity [m2.s-1]": D_eff * D_scale, - "X-averaged " - + self.domain.lower() - + " effective diffusivity": pybamm.x_average(D_eff), - "X-averaged " - + self.domain.lower() - + " effective diffusivity [m2.s-1]": pybamm.x_average(D_eff * D_scale), + f"{Domain} {phase_name}effective diffusivity": D_eff, + f"{Domain} {phase_name}effective diffusivity [m2.s-1]": D_eff * D_scale, + f"X-averaged {domain} {phase_name}effective " + "diffusivity": pybamm.x_average(D_eff), + f"X-averaged {domain} {phase_name}effective " + "diffusivity [m2.s-1]": pybamm.x_average(D_eff * D_scale), } return variables diff --git a/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py b/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py index dfb60b7d27..202ae4f4d6 100644 --- a/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/no_distribution/fickian_diffusion.py @@ -20,29 +20,37 @@ class FickianDiffusion(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): - if self.domain == "Negative": - c_s = pybamm.standard_variables.c_s_n - - elif self.domain == "Positive": - c_s = pybamm.standard_variables.c_s_p + domain = self.domain.lower() + + c_s = pybamm.Variable( + f"{self.domain} {self.phase_name}particle concentration", + domain=f"{domain} {self.phase_name}particle", + auxiliary_domains={ + "secondary": f"{domain} electrode", + "tertiary": "current collector", + }, + bounds=(0, 1), + ) variables = self._get_standard_concentration_variables(c_s) return variables def get_coupled_variables(self, variables): - c_s = variables[self.domain + " particle concentration"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] T = pybamm.PrimaryBroadcast( - variables[self.domain + " electrode temperature"], - [self.domain.lower() + " particle"], + variables[f"{self.domain} electrode temperature"], + [f"{self.domain.lower()} {self.phase_name}particle"], ) D_eff = self._get_effective_diffusivity(c_s, T) @@ -55,26 +63,28 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - c_s = variables[self.domain + " particle concentration"] - N_s = variables[self.domain + " particle flux"] - R = variables[self.domain + " particle radius"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + N_s = variables[f"{self.domain} {self.phase_name}particle flux"] + R = variables[f"{self.domain} {self.phase_name}particle radius"] - self.rhs = {c_s: -(1 / (R ** 2 * self.domain_param.C_diff)) * pybamm.div(N_s)} + self.rhs = {c_s: -(1 / (R ** 2 * self.phase_param.C_diff)) * pybamm.div(N_s)} def set_boundary_conditions(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param - c_s = variables[self.domain + " particle concentration"] - D_eff = variables[self.domain + " effective diffusivity"] - j = variables[self.domain + " electrode interfacial current density"] - R = variables[self.domain + " particle radius"] + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + D_eff = variables[f"{self.domain} {self.phase_name}effective diffusivity"] + j = variables[ + f"{self.domain} electrode {self.phase_name}interfacial current density" + ] + R = variables[f"{self.domain} {self.phase_name}particle radius"] rbc = ( - -domain_param.C_diff + -phase_param.C_diff * j * R - / domain_param.a_R - / domain_param.gamma + / phase_param.a_R + / phase_param.gamma / pybamm.surf(D_eff) ) @@ -83,6 +93,6 @@ def set_boundary_conditions(self, variables): } def set_initial_conditions(self, variables): - c_s = variables[self.domain + " particle concentration"] - c_init = self.domain_param.c_init + c_s = variables[f"{self.domain} {self.phase_name}particle concentration"] + c_init = self.phase_param.c_init self.initial_conditions = {c_s: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py b/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py index e3e083d2fd..a497ee0a92 100644 --- a/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py +++ b/pybamm/models/submodels/particle/no_distribution/polynomial_profile.py @@ -24,6 +24,8 @@ class PolynomialProfile(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -34,8 +36,8 @@ class PolynomialProfile(BaseFickian): **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, name, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, name, options, phase): + super().__init__(param, domain, options, phase) self.name = name pybamm.citations.register("Subramanian2005") @@ -187,7 +189,7 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_rav = variables[ "R-averaged " + self.domain.lower() + " particle concentration" @@ -195,7 +197,7 @@ def set_rhs(self, variables): j = variables[self.domain + " electrode interfacial current density"] R = variables[self.domain + " particle radius"] - self.rhs = {c_s_rav: -3 * j / domain_param.a_R / domain_param.gamma / R} + self.rhs = {c_s_rav: -3 * j / phase_param.a_R / phase_param.gamma / R} if self.name == "quartic profile": # We solve an extra ODE for the average particle flux @@ -212,13 +214,13 @@ def set_rhs(self, variables): q_s_rav: -30 * pybamm.r_average(D_eff) * q_s_rav - / domain_param.C_diff - - 45 * j / domain_param.a_R / domain_param.gamma / 2 + / phase_param.C_diff + - 45 * j / phase_param.a_R / phase_param.gamma / 2 } ) def set_algebraic(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_surf = variables[self.domain + " particle surface concentration"] c_s_rav = variables[ @@ -235,8 +237,7 @@ def set_algebraic(self, variables): # We solve an algebraic equation for the surface concentration self.algebraic = { c_s_surf: pybamm.surf(D_eff) * (c_s_surf - c_s_rav) - + domain_param.C_diff - * (j * R / domain_param.a_R / domain_param.gamma / 5) + + phase_param.C_diff * (j * R / phase_param.a_R / phase_param.gamma / 5) } elif self.name == "quartic profile": @@ -247,7 +248,7 @@ def set_algebraic(self, variables): ] self.algebraic = { c_s_surf: pybamm.surf(D_eff) * (35 * (c_s_surf - c_s_rav) - 8 * q_s_rav) - + domain_param.C_diff * (j * R / domain_param.a_R / domain_param.gamma) + + phase_param.C_diff * (j * R / phase_param.a_R / phase_param.gamma) } def set_initial_conditions(self, variables): @@ -255,7 +256,7 @@ def set_initial_conditions(self, variables): "R-averaged " + self.domain.lower() + " particle concentration" ] - c_init = pybamm.r_average(self.domain_param.c_init) + c_init = pybamm.r_average(self.phase_param.c_init) self.initial_conditions = {c_s_rav: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py b/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py index cf05401b45..cb8d5e0978 100644 --- a/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py +++ b/pybamm/models/submodels/particle/no_distribution/x_averaged_fickian_diffusion.py @@ -21,42 +21,43 @@ class XAveragedFickianDiffusion(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): - if self.domain == "Negative": - c_s_xav = pybamm.standard_variables.c_s_n_xav - c_s = pybamm.SecondaryBroadcast(c_s_xav, ["negative electrode"]) - - elif self.domain == "Positive": - c_s_xav = pybamm.standard_variables.c_s_p_xav - c_s = pybamm.SecondaryBroadcast(c_s_xav, ["positive electrode"]) - + domain = self.domain.lower() + c_s_xav = pybamm.Variable( + f"X-averaged {domain} {self.phase_name}particle concentration", + domain=f"{domain} {self.phase_name}particle", + auxiliary_domains={"secondary": "current collector"}, + bounds=(0, 1), + ) + c_s = pybamm.SecondaryBroadcast(c_s_xav, [f"{domain} electrode"]) variables = self._get_standard_concentration_variables(c_s, c_s_xav=c_s_xav) return variables def get_coupled_variables(self, variables): - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] + domain = self.domain.lower() + phase_name = self.phase_name + + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] T_xav = pybamm.PrimaryBroadcast( - variables["X-averaged " + self.domain.lower() + " electrode temperature"], - [self.domain.lower() + " particle"], + variables[f"X-averaged {domain} electrode temperature"], + [f"{domain} {phase_name}particle"], ) D_eff_xav = self._get_effective_diffusivity(c_s_xav, T_xav) N_s_xav = -D_eff_xav * pybamm.grad(c_s_xav) - D_eff = pybamm.SecondaryBroadcast( - D_eff_xav, [self._domain.lower() + " electrode"] - ) - N_s = pybamm.SecondaryBroadcast(N_s_xav, [self._domain.lower() + " electrode"]) + D_eff = pybamm.SecondaryBroadcast(D_eff_xav, [f"{domain} electrode"]) + N_s = pybamm.SecondaryBroadcast(N_s_xav, [f"{domain} electrode"]) variables.update(self._get_standard_flux_variables(N_s, N_s_xav)) variables.update(self._get_standard_diffusivity_variables(D_eff)) @@ -65,33 +66,28 @@ def get_coupled_variables(self, variables): return variables def set_rhs(self, variables): - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] - N_s_xav = variables["X-averaged " + self.domain.lower() + " particle flux"] + domain = self.domain.lower() + phase_name = self.phase_name + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] + N_s_xav = variables[f"X-averaged {domain} {phase_name}particle flux"] - self.rhs = {c_s_xav: -(1 / self.domain_param.C_diff) * pybamm.div(N_s_xav)} + self.rhs = {c_s_xav: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_xav)} def set_boundary_conditions(self, variables): - domain_param = self.domain_param - - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] - D_eff_xav = variables[ - "X-averaged " + self.domain.lower() + " effective diffusivity" - ] + phase_param = self.phase_param + domain = self.domain.lower() + phase_name = self.phase_name + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] + D_eff_xav = variables[f"X-averaged {domain} {phase_name}effective diffusivity"] j_xav = variables[ - "X-averaged " - + self.domain.lower() - + " electrode interfacial current density" + f"X-averaged {domain} electrode {phase_name}interfacial current density" ] rbc = ( - -domain_param.C_diff + -phase_param.C_diff * j_xav - / domain_param.a_R - / domain_param.gamma + / phase_param.a_R + / phase_param.gamma / pybamm.surf(D_eff_xav) ) @@ -104,10 +100,11 @@ def set_initial_conditions(self, variables): For single or x-averaged particle models, initial conditions can't depend on x so we take the x-average of the supplied initial conditions. """ - c_s_xav = variables[ - "X-averaged " + self.domain.lower() + " particle concentration" - ] + domain = self.domain.lower() + phase_name = self.phase_name + + c_s_xav = variables[f"X-averaged {domain} {phase_name}particle concentration"] - c_init = pybamm.x_average(self.domain_param.c_init) + c_init = pybamm.x_average(self.phase_param.c_init) self.initial_conditions = {c_s_xav: c_init} diff --git a/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py b/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py index 22a1abd91e..6efb566266 100644 --- a/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py +++ b/pybamm/models/submodels/particle/no_distribution/x_averaged_polynomial_profile.py @@ -23,6 +23,8 @@ class XAveragedPolynomialProfile(BaseFickian): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -33,8 +35,8 @@ class XAveragedPolynomialProfile(BaseFickian): **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, name, options): - super().__init__(param, domain, options) + def __init__(self, param, domain, name, options, phase): + super().__init__(param, domain, options, phase) self.name = name pybamm.citations.register("Subramanian2005") @@ -72,7 +74,7 @@ def get_fundamental_variables(self): return variables def get_coupled_variables(self, variables): - domain_param = self.domain_param + phase_param = self.phase_param c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] T_av = variables["X-averaged " + self.domain.lower() + " electrode temperature"] @@ -109,8 +111,8 @@ def get_coupled_variables(self, variables): # an extra algebraic equation to solve. For now, using the average c is an # ok approximation and means the SPM(e) still gives a system of ODEs rather # than DAEs. - c_s_surf_xav = c_s_av - domain_param.C_diff * ( - j_xav / 5 / domain_param.a_R / domain_param.gamma / D_eff_av + c_s_surf_xav = c_s_av - phase_param.C_diff * ( + j_xav / 5 / phase_param.a_R / phase_param.gamma / D_eff_av ) elif self.name == "quartic profile": # The surface concentration is computed from the average concentration, @@ -122,8 +124,8 @@ def get_coupled_variables(self, variables): c_s_surf_xav = ( c_s_av + 8 * q_s_av / 35 - - domain_param.C_diff - * (j_xav / 35 / domain_param.a_R / domain_param.gamma / D_eff_av) + - phase_param.C_diff + * (j_xav / 35 / phase_param.a_R / phase_param.gamma / D_eff_av) ) # Set concentration depending on polynomial order @@ -215,7 +217,7 @@ def set_rhs(self, variables): # the scalar source term gets multplied by the correct mass matrix when # using this model with 2D current collectors with the finite element # method (see #1399) - domain_param = self.domain_param + phase_param = self.phase_param c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] j_xav = variables[ @@ -226,7 +228,7 @@ def set_rhs(self, variables): self.rhs = { c_s_av: pybamm.source( - -3 * j_xav / domain_param.a_R / domain_param.gamma, c_s_av + -3 * j_xav / phase_param.a_R / phase_param.gamma, c_s_av ) } @@ -242,8 +244,8 @@ def set_rhs(self, variables): self.rhs.update( { q_s_av: pybamm.source( - -30 * pybamm.surf(D_eff_xav) * q_s_av / domain_param.C_diff - - 45 * j_xav / domain_param.a_R / domain_param.gamma / 2, + -30 * pybamm.surf(D_eff_xav) * q_s_av / phase_param.C_diff + - 45 * j_xav / phase_param.a_R / phase_param.gamma / 2, q_s_av, ) } @@ -256,7 +258,7 @@ def set_initial_conditions(self, variables): """ c_s_av = variables["Average " + self.domain.lower() + " particle concentration"] - c_init = pybamm.x_average(pybamm.r_average(self.domain_param.c_init)) + c_init = pybamm.x_average(pybamm.r_average(self.phase_param.c_init)) self.initial_conditions = {c_s_av: c_init} if self.name == "quartic profile": diff --git a/pybamm/models/submodels/particle/size_distribution/base_distribution.py b/pybamm/models/submodels/particle/size_distribution/base_distribution.py index 83f4b071f8..edcd1038c2 100644 --- a/pybamm/models/submodels/particle/size_distribution/base_distribution.py +++ b/pybamm/models/submodels/particle/size_distribution/base_distribution.py @@ -21,7 +21,7 @@ class BaseSizeDistribution(BaseParticle): """ def __init__(self, param, domain): - super().__init__(param, domain) + super().__init__(param, domain, phase="primary") def _get_distribution_variables(self, R): """ @@ -29,9 +29,9 @@ def _get_distribution_variables(self, R): R. The domains of R will be different depending on the submodel, e.g. for the `SingleSizeDistribution` classes R does not have an "electrode" domain. """ - R_typ = self.domain_param.R_typ + R_typ = self.phase_param.R_typ # Particle-size distribution (area-weighted) - f_a_dist = self.domain_param.f_a_dist(R) + f_a_dist = self.phase_param.f_a_dist(R) # Ensure the distribution is normalised, irrespective of discretisation # or user input @@ -151,7 +151,7 @@ def _get_standard_concentration_distribution_variables(self, c_s): Forms standard concentration variables that depend on particle size R given the fundamental concentration distribution variable c_s from the submodel. """ - c_scale = self.domain_param.c_max + c_scale = self.phase_param.c_max # Broadcast and x-average when necessary if c_s.domain == [self.domain.lower() + " particle size"] and c_s.domains[ "secondary" diff --git a/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py b/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py index 29b062b6f7..28fdf063df 100644 --- a/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/size_distribution/fickian_diffusion.py @@ -80,10 +80,10 @@ def get_coupled_variables(self, variables): [self.domain.lower() + " particle"], ) - N_s_distribution = -self.domain_param.D(c_s_distribution, T_k) * pybamm.grad( + N_s_distribution = -self.phase_param.D(c_s_distribution, T_k) * pybamm.grad( c_s_distribution ) - f_a_dist = self.domain_param.f_a_dist(R) + f_a_dist = self.phase_param.f_a_dist(R) # Size-dependent flux variables variables.update( @@ -109,7 +109,7 @@ def set_rhs(self, variables): ) self.rhs = { - c_s_distribution: -(1 / self.domain_param.C_diff) + c_s_distribution: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_distribution) / R ** 2 } @@ -133,12 +133,12 @@ def set_boundary_conditions(self, variables): # Set surface Neumann boundary values rbc = ( - -self.domain_param.C_diff + -self.phase_param.C_diff * R * j_distribution - / self.domain_param.a_R - / self.domain_param.gamma - / self.domain_param.D(c_s_surf_distribution, T_k) + / self.phase_param.a_R + / self.phase_param.gamma + / self.phase_param.D(c_s_surf_distribution, T_k) ) self.boundary_conditions = { c_s_distribution: { @@ -153,7 +153,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.SecondaryBroadcast( - self.domain_param.c_init, f"{self.domain.lower()} particle size" + self.phase_param.c_init, f"{self.domain.lower()} particle size" ) self.initial_conditions = {c_s_distribution: c_init} diff --git a/pybamm/models/submodels/particle/size_distribution/uniform_profile.py b/pybamm/models/submodels/particle/size_distribution/uniform_profile.py index fd1581ed76..3fb734e6a0 100644 --- a/pybamm/models/submodels/particle/size_distribution/uniform_profile.py +++ b/pybamm/models/submodels/particle/size_distribution/uniform_profile.py @@ -105,8 +105,8 @@ def set_rhs(self, variables): self.rhs = { c_s_surf_distribution: -3 * j_distribution - / self.domain_param.a_R - / self.domain_param.gamma + / self.phase_param.a_R + / self.phase_param.gamma / R } @@ -116,7 +116,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.PrimaryBroadcast( - pybamm.r_average(self.domain_param.c_init), + pybamm.r_average(self.phase_param.c_init), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py b/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py index 15d727cbd9..68ee2053ce 100644 --- a/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py +++ b/pybamm/models/submodels/particle/size_distribution/x_averaged_fickian_diffusion.py @@ -110,14 +110,9 @@ def get_coupled_variables(self, variables): [self.domain.lower() + " particle"], ) - if self.domain == "Negative": - N_s_xav_distribution = -self.param.n.D( - c_s_xav_distribution, T_k_xav - ) * pybamm.grad(c_s_xav_distribution) - elif self.domain == "Positive": - N_s_xav_distribution = -self.param.p.D( - c_s_xav_distribution, T_k_xav - ) * pybamm.grad(c_s_xav_distribution) + N_s_xav_distribution = -self.phase_param.D( + c_s_xav_distribution, T_k_xav + ) * pybamm.grad(c_s_xav_distribution) # Size-dependent flux variables variables.update( @@ -158,7 +153,7 @@ def set_rhs(self, variables): [self.domain.lower() + " particle"], ) self.rhs = { - c_s_xav_distribution: -(1 / self.domain_param.C_diff) + c_s_xav_distribution: -(1 / self.phase_param.C_diff) * pybamm.div(N_s_xav_distribution) / R ** 2 } @@ -190,12 +185,12 @@ def set_boundary_conditions(self, variables): # Set surface Neumann boundary values rbc = ( - -self.domain_param.C_diff + -self.phase_param.C_diff * R * j_xav_distribution - / self.domain_param.a_R - / self.domain_param.gamma - / self.domain_param.D(c_s_surf_xav_distribution, T_k_xav) + / self.phase_param.a_R + / self.phase_param.gamma + / self.phase_param.D(c_s_surf_xav_distribution, T_k_xav) ) self.boundary_conditions = { @@ -218,7 +213,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.SecondaryBroadcast( - pybamm.x_average(self.domain_param.c_init), + pybamm.x_average(self.phase_param.c_init), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py b/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py index b60e18e5cf..1fae597027 100644 --- a/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py +++ b/pybamm/models/submodels/particle/size_distribution/x_averaged_uniform_profile.py @@ -120,8 +120,8 @@ def set_rhs(self, variables): self.rhs = { c_s_surf_xav_distribution: -3 * j_xav_distribution - / self.domain_param.a_R - / self.domain_param.gamma + / self.phase_param.a_R + / self.phase_param.gamma / R } @@ -140,7 +140,7 @@ def set_initial_conditions(self, variables): ] c_init = pybamm.PrimaryBroadcast( - pybamm.x_average(pybamm.r_average(self.domain_param.c_init)), + pybamm.x_average(pybamm.r_average(self.phase_param.c_init)), f"{self.domain.lower()} particle size", ) diff --git a/pybamm/models/submodels/particle_mechanics/base_mechanics.py b/pybamm/models/submodels/particle_mechanics/base_mechanics.py index 09867b231c..486890eb16 100644 --- a/pybamm/models/submodels/particle_mechanics/base_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/base_mechanics.py @@ -64,13 +64,13 @@ def _get_mechanical_results(self, variables): cell_thickness_change = variables["Cell thickness change [m]"] Omega = domain_param.Omega - R0 = domain_param.R - c_scale = domain_param.c_max + R0 = domain_param.prim.R + c_scale = domain_param.prim.c_max c_0 = domain_param.c_0 E0 = domain_param.E nu = domain_param.nu L0 = domain_param.L - c_init = pybamm.r_average(domain_param.c_init) + c_init = pybamm.r_average(domain_param.prim.c_init) v_change = pybamm.x_average( eps_s * domain_param.t_change(c_s_rav) ) - pybamm.x_average(eps_s * domain_param.t_change(c_init)) @@ -131,7 +131,7 @@ def _get_standard_surface_variables(self, variables): """ l_cr = variables[self.domain + " particle crack length"] a0 = variables[self.domain + " electrode surface area to volume ratio"] - R0 = self.domain_param.R + R0 = self.domain_param.prim.R rho_cr = self.domain_param.rho_cr roughness = l_cr * 2 * rho_cr + 1 # the ratio of cracks to normal surface a_cr = (roughness - 1) * a0 # normalised crack surface area diff --git a/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py b/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py index 989fccc237..e3c5972978 100644 --- a/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py +++ b/pybamm/models/submodels/transport_efficiency/base_transport_efficiency.py @@ -11,7 +11,7 @@ class BaseModel(pybamm.BaseSubModel): ---------- param : parameter class The parameters to use for this submodel - phase : str + component : str The material for the model ('electrolyte' or 'electrode'). options : dict, optional A dictionary of options to be passed to the model. @@ -19,9 +19,9 @@ class BaseModel(pybamm.BaseSubModel): **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, phase, options=None): + def __init__(self, param, component, options=None): super().__init__(param, options=options) - self.phase = phase + self.component = component def _get_standard_transport_efficiency_variables( self, tor_n, tor_s, tor_p, set_leading_order=False @@ -29,24 +29,22 @@ def _get_standard_transport_efficiency_variables( tor = pybamm.concatenation(tor_n, tor_s, tor_p) variables = { - self.phase + " transport efficiency": tor, - "Positive " + self.phase.lower() + " transport efficiency": tor_p, - "X-averaged positive " - + self.phase.lower() - + " transport efficiency": pybamm.x_average(tor_p), + f"{self.component} transport efficiency": tor, + f"Positive {self.component.lower()} transport efficiency": tor_p, + f"X-averaged positive {self.component.lower()} " + "transport efficiency": pybamm.x_average(tor_p), } if not self.half_cell: variables.update( { - "Negative " + self.phase.lower() + " transport efficiency": tor_n, - "X-averaged negative " - + self.phase.lower() - + " transport efficiency": pybamm.x_average(tor_n), + f"Negative {self.component.lower()} transport efficiency": tor_n, + f"X-averaged negative {self.component.lower()} " + "transport efficiency": pybamm.x_average(tor_n), } ) - if self.phase == "Electrolyte": + if self.component == "Electrolyte": variables.update( { "Separator transport efficiency": tor_s, diff --git a/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py b/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py index 2de6b0cc1e..c251ac6f20 100644 --- a/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py +++ b/pybamm/models/submodels/transport_efficiency/bruggeman_transport_efficiency.py @@ -13,7 +13,7 @@ class Bruggeman(BaseModel): ---------- param : parameter class The parameters to use for this submodel - phase : str + component : str The material for the model ('electrolyte' or 'electrode'). options : dict, optional A dictionary of options to be passed to the model. @@ -21,14 +21,14 @@ class Bruggeman(BaseModel): **Extends:** :class:`pybamm.transport_efficiency.BaseModel` """ - def __init__(self, param, phase, options=None, set_leading_order=False): - super().__init__(param, phase, options=options) + def __init__(self, param, component, options=None, set_leading_order=False): + super().__init__(param, component, options=options) self.set_leading_order = set_leading_order def get_coupled_variables(self, variables): param = self.param - if self.phase == "Electrolyte": + if self.component == "Electrolyte": if self.half_cell: tor_n = None else: @@ -39,7 +39,7 @@ def get_coupled_variables(self, variables): tor_s = eps_s ** param.s.b_e eps_p = variables["Positive electrode porosity"] tor_p = eps_p ** param.p.b_e - elif self.phase == "Electrode": + elif self.component == "Electrode": if self.half_cell: tor_n = None else: diff --git a/pybamm/parameters/base_parameters.py b/pybamm/parameters/base_parameters.py index eac99b321b..2461646fc3 100644 --- a/pybamm/parameters/base_parameters.py +++ b/pybamm/parameters/base_parameters.py @@ -22,10 +22,24 @@ def __getattribute__(self, name): name_without_domain = name.replace(f"_{domain}_", "_").replace( f"_{domain}", "" ) - raise AttributeError( - f"param.{name} does not exist. It may have been renamed to " - f"param.{domain}.{name_without_domain}" - ) + if hasattr(self, domain): + self_domain = getattr(self, domain) + if hasattr(self_domain, name_without_domain): + raise AttributeError( + f"param.{name} does not exist. It has been renamed to " + f"param.{domain}.{name_without_domain}" + ) + elif hasattr(self_domain, "prim") and hasattr( + self_domain.prim, name_without_domain + ): + raise AttributeError( + f"param.{name} does not exist. It has been renamed to " + f"param.{domain}.prim.{name_without_domain}" + ) + else: + raise e + else: + raise e raise e def __setattr__(self, name, value): @@ -37,3 +51,33 @@ def __setattr__(self, name, value): if isinstance(value, pybamm.Symbol): value.print_name = print_name super().__setattr__(name, value) + + @property + def options(self): + return self._options + + @options.setter + def options(self, extra_options): + self._options = pybamm.BatteryModelOptions(extra_options) + + def set_phase_name(self): + self.phase_name = "" + self.phase_prefactor = "" + + +class NullParameters: + def __getattribute__(self, name): + "Returns 0 for some parameters that aren't found by __getattribute__" + if name in ["epsilon_s", "cap_init", "n_Li_init", "R_typ", "j_scale"]: + return pybamm.Scalar(0) + else: + return super().__getattribute__(name) + + def _set_dimensional_parameters(self): + pass + + def _set_scales(self): + pass + + def _set_dimensionless_parameters(self): + pass diff --git a/pybamm/parameters/geometric_parameters.py b/pybamm/parameters/geometric_parameters.py index a3967424ee..3b1aad7da0 100644 --- a/pybamm/parameters/geometric_parameters.py +++ b/pybamm/parameters/geometric_parameters.py @@ -17,7 +17,8 @@ class GeometricParameters(BaseParameters): 5. Dimensionless Functions """ - def __init__(self): + def __init__(self, options=None): + self.options = options self.n = DomainGeometricParameters("Negative", self) self.s = DomainGeometricParameters("Separator", self) self.p = DomainGeometricParameters("Positive", self) @@ -79,15 +80,24 @@ def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param + if self.domain != "Separator": + self.prim = ParticleGeometricParameters(domain, "primary", main_param) + self.phases = [self.prim] + else: + self.phases = [] + def _set_dimensional_parameters(self): """Defines the dimensional parameters.""" - Domain = self.domain + for phase in self.phases: + phase._set_dimensional_parameters() if self.domain == "Separator": self.L = pybamm.Parameter("Separator thickness [m]") self.b_e = pybamm.Parameter("Separator Bruggeman coefficient (electrolyte)") return + Domain = self.domain + # Macroscale geometry self.L_cc = pybamm.Parameter(f"{Domain} current collector thickness [m]") self.L = pybamm.Parameter(f"{Domain} electrode thickness [m]") @@ -99,12 +109,6 @@ def _set_dimensional_parameters(self): self.A_tab = self.L_tab * self.L_cc # Area of tab # Microscale geometry - # Note: for li-ion cells, the definition of the surface area to - # volume ratio is overwritten in lithium_ion_parameters.py to be computed - # based on the assumed particle shape - self.a_dim = pybamm.Parameter( - f"{Domain} electrode surface area to volume ratio [m-1]" - ) self.b_e = pybamm.Parameter( f"{Domain} electrode Bruggeman coefficient (electrolyte)" ) @@ -112,11 +116,55 @@ def _set_dimensional_parameters(self): f"{Domain} electrode Bruggeman coefficient (electrode)" ) + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + for phase in self.phases: + phase._set_scales() + + def _set_dimensionless_parameters(self): + """Defines the dimensionless parameters.""" + for phase in self.phases: + phase._set_dimensionless_parameters() + main = self.main_param + + # Macroscale Geometry + self.l = self.L / main.L_x + if self.domain == "Separator": + return + + self.l_cc = self.L_cc / main.L_x + + # Tab geometry (for pouch cells) + self.l_tab = self.L_tab / main.L_z + self.centre_y_tab = self.Centre_y_tab / main.L_z + self.centre_z_tab = self.Centre_z_tab / main.L_z + + +class ParticleGeometricParameters(BaseParameters): + def __init__(self, domain, phase, main_param): + self.domain = domain + self.phase = phase + self.main_param = main_param + self.set_phase_name() + + def _set_dimensional_parameters(self): + """Defines the dimensional parameters.""" + Domain = self.domain + pref = self.phase_prefactor + + # Microscale geometry + # Note: for li-ion cells, the definition of the surface area to + # volume ratio is overwritten in lithium_ion_parameters.py to be computed + # based on the assumed particle shape + self.a_dim = pybamm.Parameter( + f"{pref}{Domain} electrode surface area to volume ratio [m-1]" + ) + # Particle-size distribution geometry - self.R_min_dim = pybamm.Parameter(f"{Domain} minimum particle radius [m]") - self.R_max_dim = pybamm.Parameter(f"{Domain} maximum particle radius [m]") + self.R_min_dim = pybamm.Parameter(f"{pref}{Domain} minimum particle radius [m]") + self.R_max_dim = pybamm.Parameter(f"{pref}{Domain} maximum particle radius [m]") self.sd_a_dim = pybamm.Parameter( - f"{Domain} area-weighted particle-size standard deviation [m]" + f"{pref}{Domain} area-weighted particle-size standard deviation [m]" ) @property @@ -126,24 +174,24 @@ def R_dimensional(self): elif self.domain == "Positive": x = pybamm.standard_spatial_vars.x_p + inputs = {"Through-cell distance (x) [m]": x * self.main_param.L_x} return pybamm.FunctionParameter( - f"{self.domain} particle radius [m]", - {"Through-cell distance (x) [m]": x * self.main_param.L_x}, + f"{self.phase_prefactor}{self.domain} particle radius [m]", inputs ) def f_a_dist_dimensional(self, R): """ Dimensional electrode area-weighted particle-size distribution """ - inputs = {f"{self.domain} particle-size variable [m]": R} + inputs = {f"{self.phase_prefactor}{self.domain} particle-size variable [m]": R} return pybamm.FunctionParameter( - f"{self.domain} area-weighted particle-size distribution [m-1]", inputs + f"{self.phase_prefactor}{self.domain} " + "area-weighted particle-size distribution [m-1]", + inputs, ) def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" - if self.domain == "Separator": - return # Microscale geometry # Note: these scales are necessary here to non-dimensionalise the # particle size distributions. @@ -151,20 +199,6 @@ def _set_scales(self): def _set_dimensionless_parameters(self): """Defines the dimensionless parameters.""" - main = self.main_param - - # Macroscale Geometry - self.l = self.L / main.L_x - if self.domain == "Separator": - return - - self.l_cc = self.L_cc / main.L_x - - # Tab geometry (for pouch cells) - self.l_tab = self.L_tab / main.L_z - self.centre_y_tab = self.Centre_y_tab / main.L_z - self.centre_z_tab = self.Centre_z_tab / main.L_z - # Particle-size distribution geometry self.R_min = self.R_min_dim / self.R_typ self.R_max = self.R_max_dim / self.R_typ diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index a244dbaa97..0f57cd7ed4 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -3,7 +3,7 @@ # import pybamm -from .base_parameters import BaseParameters +from .base_parameters import BaseParameters, NullParameters class LeadAcidParameters(BaseParameters): @@ -26,14 +26,10 @@ def __init__(self): self.elec = pybamm.electrical_parameters self.therm = pybamm.thermal_parameters - # Spatial variables - x_n = pybamm.standard_spatial_vars.x_n * self.geo.L_x - x_p = pybamm.standard_spatial_vars.x_p * self.geo.L_x - # Initialize domain parameters - self.n = DomainLeadAcidParameters("Negative", self, x_n) - self.s = DomainLeadAcidParameters("Separator", self, None) - self.p = DomainLeadAcidParameters("Positive", self, x_p) + self.n = DomainLeadAcidParameters("Negative", self) + self.s = DomainLeadAcidParameters("Separator", self) + self.p = DomainLeadAcidParameters("Positive", self) self.domain_params = [self.n, self.s, self.p] # Set parameters and scales @@ -154,7 +150,7 @@ def _set_dimensional_parameters(self): + self.p.L * self.p.eps_max ) / self.L_x - / (self.p.s_plus_S - self.n.s_plus_S) + / (self.p.prim.s_plus_S - self.n.prim.s_plus_S) ) self.Q_e_max_dimensional = self.Q_e_max * self.c_e_typ * self.F self.capacity = ( @@ -335,7 +331,7 @@ def _set_dimensionless_parameters(self): ) # Electrical - self.ocv_ref = self.p.U_ref - self.n.U_ref + self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref self.voltage_low_cut = ( self.voltage_low_cut_dimensional - self.ocv_ref ) / self.potential_scale @@ -370,15 +366,15 @@ def _set_dimensionless_parameters(self): for domain in self.domain_params: domain._set_dimensionless_parameters() - self.ocv_init = self.p.U_init - self.n.U_init + self.ocv_init = self.p.prim.U_init - self.n.prim.U_init # Concatenations self.s_plus_S = pybamm.concatenation( pybamm.FullBroadcast( - self.n.s_plus_S, ["negative electrode"], "current collector" + self.n.prim.s_plus_S, ["negative electrode"], "current collector" ), pybamm.FullBroadcast(0, ["separator"], "current collector"), pybamm.FullBroadcast( - self.p.s_plus_S, ["positive electrode"], "current collector" + self.p.prim.s_plus_S, ["positive electrode"], "current collector" ), ) self.beta_surf = pybamm.concatenation( @@ -449,14 +445,19 @@ def _set_input_current(self): class DomainLeadAcidParameters(BaseParameters): - def __init__(self, domain, main_param, x): + def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param self.geo = getattr(main_param.geo, domain.lower()[0]) self.therm = getattr(main_param.therm, domain.lower()[0]) - self.x = x + if domain != "Separator": + self.prim = PhaseLeadAcidParameters("primary", self) + else: + self.prim = NullParameters() + + self.phases = [self.prim] def _set_dimensional_parameters(self): Domain = self.domain @@ -468,6 +469,10 @@ def _set_dimensional_parameters(self): self.b_e = self.geo.b_e self.epsilon_inactive = pybamm.Scalar(0) return + + for phase in self.phases: + phase._set_dimensional_parameters() + # Macroscale geometry self.L = self.geo.L @@ -477,10 +482,6 @@ def _set_dimensional_parameters(self): self.xi = pybamm.Parameter(f"{Domain} electrode morphological parameter") # no binder self.epsilon_inactive = pybamm.Scalar(0) - self.a_dimensional = pybamm.FunctionParameter( - f"{Domain} electrode surface area to volume ratio [m-1]", - {"Through-cell distance (x) [m]": self.x}, - ) # Electrode properties if self.domain == "Negative": @@ -503,7 +504,10 @@ def _set_dimensional_parameters(self): self.Q_max_dimensional = pybamm.Parameter( f"{Domain} electrode volumetric capacity [C.m-3]" ) - self.epsilon_s = 1 - self.eps_max + + self.C_dl_dimensional = pybamm.Parameter( + f"{Domain} electrode double-layer capacity [F.m-2]" + ) # In lead-acid the current collector and electrodes are the same (same # conductivity) but we correct here for Bruggeman. Note that because for @@ -514,20 +518,6 @@ def _set_dimensional_parameters(self): self.sigma_dimensional(main.T_ref) * (1 - self.eps_max) ** self.b_s ) - # Electrochemical reactions - # Main - self.s_plus_S_dim = pybamm.Parameter( - f"{Domain} electrode cation signed stoichiometry" - ) - self.ne_S = pybamm.Parameter(f"{Domain} electrode electrons in reaction") - self.s_plus_S = self.s_plus_S_dim / self.ne_S - self.C_dl_dimensional = pybamm.Parameter( - f"{Domain} electrode double-layer capacity [F.m-2]" - ) - self.alpha_bv = pybamm.Parameter( - f"{Domain} electrode Butler-Volmer transfer coefficient" - ) - def sigma_dimensional(self, T): """Dimensional electrical conductivity""" inputs = {"Temperature [K]": T} @@ -535,44 +525,13 @@ def sigma_dimensional(self, T): f"{self.domain} electrode conductivity [S.m-1]", inputs ) - def U_dimensional(self, c_e, T): - """Dimensional open-circuit voltage [V]""" - inputs = { - "Electrolyte molar mass [mol.kg-1]": self.main_param.m_dimensional(c_e) - } - return pybamm.FunctionParameter( - f"{self.domain} electrode open-circuit potential [V]", inputs - ) - - def j0_dimensional(self, c_e, T): - """Dimensional exchange-current density [A.m-2]""" - inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode exchange-current density [A.m-2]", inputs - ) - - def j0_Ox_dimensional(self, c_e, T): - """Dimensional oxygen electrode exchange-current density [A.m-2]""" - inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode oxygen exchange-current density [A.m-2]", inputs - ) - def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" if self.domain == "Separator": return - # Microscale (typical values at electrode/current collector interface) - self.a_typ = pybamm.xyz_average(self.a_dimensional) - # Electrical - self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) - - # Reference OCP - inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} - self.U_ref = pybamm.FunctionParameter( - f"{self.domain} electrode open-circuit potential [V]", inputs - ) + for phase in self.phases: + phase._set_scales() def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" @@ -585,6 +544,9 @@ def _set_dimensionless_parameters(self): self.lambda_ = self.therm.lambda_ return + for phase in self.phases: + phase._set_dimensionless_parameters() + # Macroscale Geometry self.l = self.geo.l @@ -598,36 +560,31 @@ def _set_dimensionless_parameters(self): self.centre_z_tab = self.geo.centre_z_tab # Electrode Properties - self.a = self.a_dimensional / self.a_typ self.sigma_cc = ( self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x ) self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 - self.delta_pore = 1 / (self.a_typ * main.L_x) self.Q_max = self.Q_max_dimensional / (main.c_e_typ * main.F) self.beta_U = 1 / self.Q_max - # Electrochemical reactions - # Main - self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale - ) - self.ne = self.ne_S - # Oxygen - self.U_Ox = (main.U_Ox_dim - self.U_ref) / main.potential_scale - self.U_Hy = (main.U_Hy_dim - self.U_ref) / main.potential_scale - # Electrolyte properties self.beta_surf = ( - -main.c_e_typ * self.DeltaVsurf / self.ne_S + -main.c_e_typ * self.DeltaVsurf / self.prim.ne_S ) # Molar volume change (lead) self.beta_liq = ( - -main.c_e_typ * self.DeltaVliq / self.ne_S + -main.c_e_typ * self.DeltaVliq / self.prim.ne_S ) # Molar volume change (electrolyte, neg) self.beta = (self.beta_surf + self.beta_liq) * pybamm.Parameter( "Volume change factor" ) + self.C_dl = ( + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale + ) + # Thermal self.rho_cc = self.therm.rho_cc self.rho = self.therm.rho @@ -647,8 +604,6 @@ def _set_dimensionless_parameters(self): ) self.curlyU_init = main.Q_e_max * (1.2 - main.q_init) / (self.Q_max * self.l) - self.U_init = self.U(main.c_e_init, main.T_init) - def sigma(self, T): """Dimensionless negative electrode electrical conductivity""" T_dim = self.main_param.Delta_T * T + self.main_param.T_ref @@ -663,6 +618,105 @@ def sigma_prime(self, T): """Rescaled dimensionless negative electrode electrical conductivity""" return self.sigma(T) * self.main_param.delta ** 2 + +class PhaseLeadAcidParameters(BaseParameters): + def __init__(self, phase, domain_param): + self.phase = phase + + self.domain_param = domain_param + self.domain = domain_param.domain + self.main_param = domain_param.main_param + self.geo = domain_param.geo.prim + + def _set_dimensional_parameters(self): + Domain = self.domain + domain = Domain.lower() + + # Microstructure + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * self.main_param.L_x + ) + self.a_dimensional = pybamm.FunctionParameter( + f"{Domain} electrode surface area to volume ratio [m-1]", + {"Through-cell distance (x) [m]": x}, + ) + + # Electrochemical reactions + # Main + self.s_plus_S_dim = pybamm.Parameter( + f"{Domain} electrode cation signed stoichiometry" + ) + self.ne_S = pybamm.Parameter(f"{Domain} electrode electrons in reaction") + self.s_plus_S = self.s_plus_S_dim / self.ne_S + self.alpha_bv = pybamm.Parameter( + f"{Domain} electrode Butler-Volmer transfer coefficient" + ) + + def U_dimensional(self, c_e, T): + """Dimensional open-circuit voltage [V]""" + inputs = { + "Electrolyte molar mass [mol.kg-1]": self.main_param.m_dimensional(c_e) + } + return pybamm.FunctionParameter( + f"{self.domain} electrode open-circuit potential [V]", inputs + ) + + def j0_dimensional(self, c_e, T): + """Dimensional exchange-current density [A.m-2]""" + inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode exchange-current density [A.m-2]", inputs + ) + + def j0_Ox_dimensional(self, c_e, T): + """Dimensional oxygen electrode exchange-current density [A.m-2]""" + inputs = {"Electrolyte concentration [mol.m-3]": c_e, "Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode oxygen exchange-current density [A.m-2]", inputs + ) + + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + # Microscale (typical values at electrode/current collector interface) + self.a_typ = pybamm.xyz_average(self.a_dimensional) + + # Electrical + self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) + + # Reference OCP + inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} + self.U_ref = pybamm.FunctionParameter( + f"{self.domain} electrode open-circuit potential [V]", inputs + ) + + def _set_dimensionless_parameters(self): + """Defines the dimensionless parameters""" + main = self.main_param + + # Microstructure + self.a = self.a_dimensional / self.a_typ + self.delta_pore = 1 / (self.a_typ * main.L_x) + self.epsilon_s = 1 - self.domain_param.eps_max + + # Electrochemical reactions + # Main + self.ne = self.ne_S + + # Initial conditions + self.c_init = main.c_e_init + self.U_init = self.U(main.c_e_init, main.T_init) + + # Electrochemical reactions + # Oxygen + self.U_Ox = (main.U_Ox_dim - self.U_ref) / main.potential_scale + self.U_Hy = (main.U_Hy_dim - self.U_ref) / main.potential_scale + def U(self, c_e, T): """Dimensionless open-circuit voltage in the negative electrode""" c_e_dimensional = c_e * self.main_param.c_e_typ diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index ef53971cdd..3c068232ea 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -2,7 +2,7 @@ # Standard parameters for lithium-ion battery models # import pybamm -from .base_parameters import BaseParameters +from .base_parameters import BaseParameters, NullParameters class LithiumIonParameters(BaseParameters): @@ -41,21 +41,14 @@ def __init__(self, options=None): self.half_cell = self.options["working electrode"] != "both" # Get geometric, electrical and thermal parameters - self.geo = pybamm.geometric_parameters + self.geo = pybamm.GeometricParameters(options) self.elec = pybamm.electrical_parameters self.therm = pybamm.thermal_parameters - # Spatial variables - r_n = pybamm.standard_spatial_vars.r_n * self.geo.n.R_typ - r_p = pybamm.standard_spatial_vars.r_p * self.geo.p.R_typ - x_n = pybamm.standard_spatial_vars.x_n * self.geo.L_x - x_s = pybamm.standard_spatial_vars.x_s * self.geo.L_x - x_p = pybamm.standard_spatial_vars.x_p * self.geo.L_x - # Initialize domain parameters - self.n = DomainLithiumIonParameters("Negative", self, x_n, r_n) - self.s = DomainLithiumIonParameters("Separator", self, x_s, None) - self.p = DomainLithiumIonParameters("Positive", self, x_p, r_p) + self.n = DomainLithiumIonParameters("Negative", self) + self.s = DomainLithiumIonParameters("Separator", self) + self.p = DomainLithiumIonParameters("Positive", self) self.domain_params = [self.n, self.s, self.p] # Set parameters and scales @@ -187,6 +180,7 @@ def _set_dimensional_parameters(self): ) # Total lithium + # Electrolyte c_e_av_init = pybamm.xyz_average(self.epsilon_init) * self.c_e_typ self.n_Li_e_init = c_e_av_init * self.L_x * self.A_cc @@ -194,8 +188,8 @@ def _set_dimensional_parameters(self): self.n_Li_init = self.n_Li_particles_init + self.n_Li_e_init # Reference OCP based on initial concentration - self.ocv_ref = self.p.U_ref - self.n.U_ref - self.ocv_init_dim = self.p.U_init_dim - self.n.U_init_dim + self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref + self.ocv_init_dim = self.p.prim.U_init_dim - self.n.prim.U_init_dim def D_e_dimensional(self, c_e, T): """Dimensional diffusivity in electrolyte""" @@ -254,9 +248,9 @@ def _set_scales(self): # Discharge timescale if self.options["working electrode"] == "positive": - self.c_max = self.p.c_max + self.c_max = self.p.prim.c_max else: - self.c_max = self.n.c_max + self.c_max = self.n.prim.c_max self.tau_discharge = self.F * self.c_max * self.L_x / self.i_typ # Electrolyte diffusion timescale @@ -328,25 +322,25 @@ def _set_dimensionless_parameters(self): ) # SEI parameters - self.C_sei_reaction = (self.n.j_scale / self.m_sei_dimensional) * pybamm.exp( - -(self.F * self.n.U_ref / (2 * self.R * self.T_ref)) - ) + self.C_sei_reaction = ( + self.n.prim.j_scale / self.m_sei_dimensional + ) * pybamm.exp(-(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref))) self.C_sei_solvent = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.c_sol_dimensional * self.F * self.D_sol_dimensional) ) self.C_sei_electron = ( - self.n.j_scale + self.n.prim.j_scale * self.F * self.L_sei_0_dim / (self.kappa_inner_dimensional * self.R * self.T_ref) ) self.C_sei_inter = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.D_li_dimensional * self.c_li_0_dimensional * self.F) ) @@ -355,7 +349,7 @@ def _set_dimensionless_parameters(self): self.R_sei = ( self.F - * self.n.j_scale + * self.n.prim.j_scale * self.R_sei_dimensional * self.L_sei_0_dim / self.R @@ -364,10 +358,10 @@ def _set_dimensionless_parameters(self): self.v_bar = self.V_bar_outer_dimensional / self.V_bar_inner_dimensional self.c_sei_scale = ( - self.L_sei_0_dim * self.n.a_typ / self.V_bar_inner_dimensional + self.L_sei_0_dim * self.n.prim.a_typ / self.V_bar_inner_dimensional ) self.c_sei_outer_scale = ( - self.L_sei_0_dim * self.n.a_typ / self.V_bar_outer_dimensional + self.L_sei_0_dim * self.n.prim.a_typ / self.V_bar_outer_dimensional ) self.L_inner_0 = self.L_inner_0_dim / self.L_sei_0_dim @@ -375,31 +369,31 @@ def _set_dimensionless_parameters(self): # ratio of SEI reaction scale to intercalation reaction self.Gamma_SEI = ( - self.V_bar_inner_dimensional * self.n.j_scale * self.timescale + self.V_bar_inner_dimensional * self.n.prim.j_scale * self.timescale ) / (self.F * self.L_sei_0_dim) # EC reaction self.C_ec = ( self.L_sei_0_dim - * self.n.j_scale + * self.n.prim.j_scale / (self.F * self.c_ec_0_dim * self.D_ec_dim) ) self.C_sei_ec = ( self.F * self.k_sei_dim * self.c_ec_0_dim - / self.n.j_scale + / self.n.prim.j_scale * ( pybamm.exp( -( self.F - * (self.n.U_ref - self.U_sei_dim) + * (self.n.prim.U_ref - self.U_sei_dim) / (2 * self.R * self.T_ref) ) ) ) ) - self.beta_sei = self.n.a_typ * self.L_sei_0_dim * self.Gamma_SEI + self.beta_sei = self.n.prim.a_typ * self.L_sei_0_dim * self.Gamma_SEI self.c_sei_init = self.c_ec_0_dim / self.c_sei_outer_scale # lithium plating parameters @@ -409,9 +403,9 @@ def _set_dimensionless_parameters(self): self.alpha_stripping = 1 - self.alpha_plating # ratio of lithium plating reaction scaled to intercalation reaction - self.Gamma_plating = (self.n.a_typ * self.n.j_scale * self.timescale) / ( - self.F * self.c_Li_typ - ) + self.Gamma_plating = ( + self.n.prim.a_typ * self.n.prim.j_scale * self.timescale + ) / (self.F * self.c_Li_typ) self.beta_plating = self.Gamma_plating * self.V_bar_plated_Li * self.c_Li_typ @@ -466,7 +460,10 @@ def j0_stripping(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) + / self.n.prim.j_scale + ) def j0_plating(self, c_e, c_Li, T): """Dimensionless reverse plating current""" @@ -474,7 +471,9 @@ def j0_plating(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.prim.j_scale + ) def dead_lithium_decay_rate(self, L_sei): """Dimensionless exchange-current density for stripping""" @@ -496,34 +495,29 @@ def _set_input_current(self): self.dimensional_current_with_time / self.I_typ * pybamm.sign(self.I_typ) ) - @property - def options(self): - return self._options - - @options.setter - def options(self, extra_options): - self._options = pybamm.BatteryModelOptions(extra_options) - class DomainLithiumIonParameters(BaseParameters): - def __init__(self, domain, main_param, x, r): + def __init__(self, domain, main_param): self.domain = domain self.main_param = main_param self.geo = getattr(main_param.geo, domain.lower()[0]) self.therm = getattr(main_param.therm, domain.lower()[0]) - self.x = x - self.r = r + if domain != "Separator": + self.prim = ParticleLithiumIonParameters("primary", self) + else: + self.prim = NullParameters() + + self.phases = [self.prim] def _set_dimensional_parameters(self): main = self.main_param Domain = self.domain domain = Domain.lower() - x = self.x - r = self.r if Domain == "Separator": + x = pybamm.standard_spatial_vars.x_s * main.L_x self.epsilon_init = pybamm.FunctionParameter( "Separator porosity", {"Through-cell distance (x) [m]": x} ) @@ -532,13 +526,22 @@ def _set_dimensional_parameters(self): self.L = self.geo.L return + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * main.L_x + ) + # Macroscale geometry self.L_cc = self.geo.L_cc self.L = self.geo.L - # Note: the surface area to volume ratio is defined later with the function - # parameters. The particle size as a function of through-cell position is - # already defined in geometric_parameters.py - self.R_dimensional = self.geo.R_dimensional + + for phase in self.phases: + phase._set_dimensional_parameters() # Tab geometry (for pouch cells) self.L_tab = self.geo.L_tab @@ -547,39 +550,28 @@ def _set_dimensional_parameters(self): self.A_tab = self.geo.A_tab # Particle properties - self.c_max = pybamm.Parameter( - f"Maximum concentration in {domain} electrode [mol.m-3]" - ) self.sigma_cc_dimensional = pybamm.Parameter( f"{Domain} current collector conductivity [S.m-1]" ) - self.epsilon_init = pybamm.FunctionParameter( - f"{Domain} electrode porosity", {"Through-cell distance (x) [m]": x} - ) + if not (main.half_cell and domain == "negative"): + self.epsilon_init = pybamm.FunctionParameter( + f"{Domain} electrode porosity", {"Through-cell distance (x) [m]": x} + ) + epsilon_s_tot = sum(phase.epsilon_s for phase in self.phases) + self.epsilon_inactive = 1 - self.epsilon_init - epsilon_s_tot + + self.cap_init = sum(phase.cap_init for phase in self.phases) + + self.n_Li_init = sum(phase.n_Li_init for phase in self.phases) + # Tortuosity parameters self.b_e = self.geo.b_e self.b_s = self.geo.b_s - # Particle-size distribution parameters - self.R_min_dim = self.geo.R_min_dim - self.R_max_dim = self.geo.R_max_dim - self.sd_a_dim = self.geo.sd_a_dim - self.f_a_dist_dimensional = self.geo.f_a_dist_dimensional - - # Electrochemical reactions - self.ne = pybamm.Parameter(f"{Domain} electrode electrons in reaction") self.C_dl_dimensional = pybamm.Parameter( f"{Domain} electrode double-layer capacity [F.m-2]" ) - # Intercalation kinetics - self.mhc_lambda_dimensional = pybamm.Parameter( - f"{Domain} electrode reorganization energy [eV]" - ) - self.alpha_bv = pybamm.Parameter( - f"{Domain} electrode Butler-Volmer transfer coefficient" - ) - # Mechanical parameters self.nu = pybamm.Parameter(f"{Domain} electrode Poisson's ratio") self.E = pybamm.Parameter(f"{Domain} electrode Young's modulus [Pa]") @@ -627,23 +619,228 @@ def _set_dimensional_parameters(self): f"{Domain} electrode current-driven interface utilisation factor [m3.mol-1]" ) + def sigma_dimensional(self, T): + """Dimensional electrical conductivity in electrode""" + inputs = {"Temperature [K]": T} + return pybamm.FunctionParameter( + f"{self.domain} electrode conductivity [S.m-1]", inputs + ) + + def j0_stripping_dimensional(self, c_e, c_Li, T): + """Dimensional exchange-current density for stripping [A.m-2]""" + inputs = { + "Electrolyte concentration [mol.m-3]": c_e, + "Plated lithium concentration [mol.m-3]": c_Li, + "Temperature [K]": T, + } + return pybamm.FunctionParameter( + "Exchange-current density for stripping [A.m-2]", inputs + ) + + def j0_plating_dimensional(self, c_e, c_Li, T): + """Dimensional exchange-current density for plating [A.m-2]""" + inputs = { + "Electrolyte concentration [mol.m-3]": c_e, + "Plated lithium concentration [mol.m-3]": c_Li, + "Temperature [K]": T, + } + return pybamm.FunctionParameter( + "Exchange-current density for plating [A.m-2]", inputs + ) + + def _set_scales(self): + """Define the scales used in the non-dimensionalisation scheme""" + for phase in self.phases: + phase._set_scales() + + def _set_dimensionless_parameters(self): + for phase in self.phases: + phase._set_dimensionless_parameters() + + main = self.main_param + + if self.domain == "Separator": + self.l = self.geo.l + self.rho = self.therm.rho + self.lambda_ = self.therm.lambda_ + return + + # Macroscale Geometry + self.l_cc = self.geo.l_cc + self.l = self.geo.l + + # Thermal + self.rho_cc = self.therm.rho_cc + self.rho = self.therm.rho + self.lambda_cc = self.therm.lambda_cc + self.lambda_ = self.therm.lambda_ + self.h_tab = self.therm.h_tab + self.h_cc = self.therm.h_cc + + # Tab geometry (for pouch cells) + self.l_tab = self.geo.l_tab + self.centre_y_tab = self.geo.centre_y_tab + self.centre_z_tab = self.geo.centre_z_tab + + # Electrochemical Reactions + self.C_dl = ( + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale + ) + # Electrode Properties + self.sigma_cc = ( + self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x + ) + self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 + self.sigma_cc_dbl_prime = self.sigma_cc_prime * main.delta + + # Electrolyte Properties + self.beta_surf = pybamm.Scalar(0) + + # Dimensionless mechanical parameters + self.rho_cr = self.rho_cr_dim * self.l_cr_0 * self.w_cr + self.theta = self.theta_dim * self.prim.c_max / main.T_ref + self.c_0 = self.c_0_dim / self.prim.c_max + self.beta_LAM = self.beta_LAM_dimensional * main.timescale + # normalised typical time for one cycle + self.stress_critical = self.stress_critical_dim / self.E + # Reaction-driven LAM parameters + self.beta_LAM_sei = ( + self.beta_LAM_sei_dimensional + * self.prim.a_typ + * self.prim.j_scale + * main.timescale + ) / main.F + # Utilisation factors + self.beta_utilisation = ( + self.beta_utilisation_dimensional + * self.prim.a_typ + * self.prim.j_scale + * main.timescale + ) / main.F + + def sigma(self, T): + """Dimensionless electrode electrical conductivity""" + main = self.main_param + T_dim = self.main_param.Delta_T * T + self.main_param.T_ref + return ( + self.sigma_dimensional(T_dim) * main.potential_scale / main.i_typ / main.L_x + ) + + def sigma_prime(self, T): + """Rescaled dimensionless electrode electrical conductivity""" + return self.sigma(T) * self.main_param.delta + + def t_change(self, sto): + """ + Dimensionless volume change for the electrode; + sto should be R-averaged + """ + return pybamm.FunctionParameter( + f"{self.domain} electrode volume change", {"Particle stoichiometry": sto} + ) + + def k_cr(self, T): + """ + Dimensionless cracking rate for the electrode; + """ + T_dim = self.main_param.Delta_T * T + self.main_param.T_ref + delta_k_cr = self.E ** self.m_cr * self.l_cr_0 ** (self.m_cr / 2 - 1) + return ( + pybamm.FunctionParameter( + f"{self.domain} electrode cracking rate", {"Temperature [K]": T_dim} + ) + * delta_k_cr + ) + + +class ParticleLithiumIonParameters(BaseParameters): + def __init__(self, phase, domain_param): + self.domain_param = domain_param + self.domain = domain_param.domain + self.main_param = domain_param.main_param + self.phase = phase + self.set_phase_name() + if self.phase == "primary": + self.geo = domain_param.geo.prim + elif self.phase == "secondary": + self.geo = domain_param.geo.sec + + def _set_dimensional_parameters(self): + main = self.main_param + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + pref = self.phase_prefactor + + x = ( + pybamm.SpatialVariable( + f"x_{domain[0]}", + domain=[f"{domain} electrode"], + auxiliary_domains={"secondary": "current collector"}, + coord_sys="cartesian", + ) + * main.L_x + ) + r = ( + pybamm.SpatialVariable( + f"r_{domain[0]}", + domain=[f"{domain} {self.phase_name}particle"], + auxiliary_domains={ + "secondary": f"{domain} electrode", + "tertiary": "current collector", + }, + coord_sys="spherical polar", + ) + * self.geo.R_typ + ) + + # Macroscale geometry + # Note: the surface area to volume ratio is defined later with the function + # parameters. The particle size as a function of through-cell position is + # already defined in geometric_parameters.py + self.R_dimensional = self.geo.R_dimensional + + # Particle properties + self.c_max = pybamm.Parameter( + f"{pref}Maximum concentration in {domain} electrode [mol.m-3]" + ) + + # Particle-size distribution parameters + self.R_min_dim = self.geo.R_min_dim + self.R_max_dim = self.geo.R_max_dim + self.sd_a_dim = self.geo.sd_a_dim + self.f_a_dist_dimensional = self.geo.f_a_dist_dimensional + + # Electrochemical reactions + self.ne = pybamm.Parameter(f"{pref}{Domain} electrode electrons in reaction") + + # Intercalation kinetics + self.mhc_lambda_dimensional = pybamm.Parameter( + f"{pref}{Domain} electrode reorganization energy [eV]" + ) + self.alpha_bv = pybamm.Parameter( + f"{pref}{Domain} electrode Butler-Volmer transfer coefficient" + ) + if self.main_param.half_cell and self.domain == "Negative": self.n_Li_init = pybamm.Scalar(0) self.U_ref = pybamm.Scalar(0) self.U_init_dim = pybamm.Scalar(0) else: self.epsilon_s = pybamm.FunctionParameter( - f"{Domain} electrode active material volume fraction", + f"{pref}{Domain} electrode active material volume fraction", {"Through-cell distance (x) [m]": x}, ) - self.epsilon_inactive = 1 - self.epsilon_init - self.epsilon_s self.c_init = ( pybamm.FunctionParameter( - f"Initial concentration in {domain} electrode [mol.m-3]", + f"{pref}Initial concentration in {domain} electrode [mol.m-3]", { "Radial distance (r) [m]": r, "Through-cell distance (x) [m]": pybamm.PrimaryBroadcast( - x, f"{domain} particle" + x, f"{domain} {phase_name}particle" ), }, ) @@ -653,28 +850,29 @@ def _set_dimensional_parameters(self): eps_c_init_av = pybamm.xyz_average( self.epsilon_s * pybamm.r_average(self.c_init) ) - self.n_Li_init = eps_c_init_av * self.c_max * self.L * main.A_cc + self.n_Li_init = ( + eps_c_init_av * self.c_max * self.domain_param.L * main.A_cc + ) eps_s_av = pybamm.xyz_average(self.epsilon_s) - self.elec_loading = eps_s_av * self.L * self.c_max * main.F / 3600 + self.elec_loading = ( + eps_s_av * self.domain_param.L * self.c_max * main.F / 3600 + ) self.cap_init = self.elec_loading * main.A_cc self.U_ref = self.U_dimensional(c_init_av, main.T_ref) self.U_init_dim = self.U_dimensional(c_init_av, main.T_init_dim) - def sigma_dimensional(self, T): - """Dimensional electrical conductivity in electrode""" - inputs = {"Temperature [K]": T} - return pybamm.FunctionParameter( - f"{self.domain} electrode conductivity [S.m-1]", inputs - ) - def D_dimensional(self, sto, T): """Dimensional diffusivity in particle. Note this is defined as a function of stochiometry""" - inputs = {f"{self.domain} particle stoichiometry": sto, "Temperature [K]": T} + inputs = { + f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto, + "Temperature [K]": T, + } return pybamm.FunctionParameter( - f"{self.domain} electrode diffusivity [m2.s-1]", inputs + f"{self.phase_prefactor}{self.domain} electrode diffusivity [m2.s-1]", + inputs, ) def j0_dimensional(self, c_e, c_s_surf, T): @@ -682,22 +880,31 @@ def j0_dimensional(self, c_e, c_s_surf, T): inputs = { "Electrolyte concentration [mol.m-3]": c_e, f"{self.domain} particle surface concentration [mol.m-3]": c_s_surf, - f"{self.domain} particle maximum concentration [mol.m-3]": self.c_max, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, "Temperature [K]": T, } return pybamm.FunctionParameter( - f"{self.domain} electrode exchange-current density [A.m-2]", inputs + f"{self.phase_prefactor}{self.domain} electrode " + "exchange-current density [A.m-2]", + inputs, ) - def U_dimensional(self, sto, T): + def U_dimensional(self, sto, T, lithiation=None): """Dimensional open-circuit potential [V]""" # bound stoichiometry between tol and 1-tol. Adding 1/sto + 1/(sto-1) later # will ensure that ocp goes to +- infinity if sto goes into that region # anyway tol = 1e-10 sto = pybamm.maximum(pybamm.minimum(sto, 1 - tol), tol) - inputs = {f"{self.domain} particle stoichiometry": sto} - u_ref = pybamm.FunctionParameter(f"{self.domain} electrode OCP [V]", inputs) + if lithiation is None: + lithiation = "" + else: + lithiation = lithiation + " " + inputs = {f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto} + u_ref = pybamm.FunctionParameter( + f"{self.phase_prefactor}{self.domain} electrode {lithiation}OCP [V]", inputs + ) # add a term to ensure that the OCP goes to infinity at 0 and -infinity at 1 # this will not affect the OCP for most values of sto # see #1435 @@ -713,17 +920,17 @@ def dUdT_dimensional(self, sto): """ inputs = { f"{self.domain} particle stoichiometry": sto, - f"{self.domain} particle maximum concentration [mol.m-3]": self.c_max, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, } return pybamm.FunctionParameter( - f"{self.domain} electrode OCP entropic change [V.K-1]", inputs + f"{self.phase_prefactor}{self.domain} electrode " + "OCP entropic change [V.K-1]", + inputs, ) def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" - if self.domain == "Separator": - return - main = self.main_param # Microscale self.R_typ = self.geo.R_typ @@ -758,33 +965,10 @@ def _set_scales(self): def _set_dimensionless_parameters(self): main = self.main_param - if self.domain == "Separator": - self.l = self.geo.l - self.rho = self.therm.rho - self.lambda_ = self.therm.lambda_ - return - # Timescale ratios self.C_diff = self.tau_diffusion / main.timescale self.C_r = self.tau_r / main.timescale - # Macroscale Geometry - self.l_cc = self.geo.l_cc - self.l = self.geo.l - - # Thermal - self.rho_cc = self.therm.rho_cc - self.rho = self.therm.rho - self.lambda_cc = self.therm.lambda_cc - self.lambda_ = self.therm.lambda_ - self.h_tab = self.therm.h_tab - self.h_cc = self.therm.h_cc - - # Tab geometry (for pouch cells) - self.l_tab = self.geo.l_tab - self.centre_y_tab = self.geo.centre_y_tab - self.centre_z_tab = self.geo.centre_z_tab - # Microscale geometry self.R = self.geo.R self.a_R = self.a_typ * self.R_typ @@ -799,21 +983,9 @@ def _set_dimensionless_parameters(self): # In most cases gamma_n will be equal to 1 self.gamma = (main.tau_discharge / main.timescale) * self.c_max / main.c_max - # Electrode Properties - self.sigma_cc = ( - self.sigma_cc_dimensional * main.potential_scale / main.i_typ / main.L_x - ) - self.sigma_cc_prime = self.sigma_cc * main.delta ** 2 - self.sigma_cc_dbl_prime = self.sigma_cc_prime * main.delta - # Electrolyte Properties self.beta_surf = pybamm.Scalar(0) - # Electrochemical Reactions - self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale - ) - # Intercalation kinetics self.mhc_lambda = self.mhc_lambda_dimensional / main.potential_scale_eV @@ -823,37 +995,6 @@ def _set_dimensionless_parameters(self): else: self.U_init = (self.U_init_dim - self.U_ref) / main.potential_scale - # Dimensionless mechanical parameters - self.rho_cr = self.rho_cr_dim * self.l_cr_0 * self.w_cr - self.theta = self.theta_dim * self.c_max / main.T_ref - self.c_0 = self.c_0_dim / self.c_max - self.beta_LAM = self.beta_LAM_dimensional * main.timescale - # normalised typical time for one cycle - self.stress_critical = self.stress_critical_dim / self.E - # Reaction-driven LAM parameters - self.beta_LAM_sei = ( - self.beta_LAM_sei_dimensional * self.a_typ * self.j_scale * main.timescale - ) / main.F - # Utilisation factors - self.beta_utilisation = ( - self.beta_utilisation_dimensional - * self.a_typ - * self.j_scale - * main.timescale - ) / main.F - - def sigma(self, T): - """Dimensionless electrode electrical conductivity""" - main = self.main_param - T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return ( - self.sigma_dimensional(T_dim) * main.potential_scale / main.i_typ / main.L_x - ) - - def sigma_prime(self, T): - """Rescaled dimensionless electrode electrical conductivity""" - return self.sigma(T) * self.main_param.delta - def D(self, c_s, T): """Dimensionless particle diffusivity""" sto = c_s @@ -870,12 +1011,14 @@ def j0(self, c_e, c_s_surf, T): self.j0_dimensional(c_e_dim, c_s_surf_dim, T_dim) / self.j0_ref_dimensional ) - def U(self, c_s, T): + def U(self, c_s, T, lithiation=None): """Dimensionless open-circuit potential in the electrode""" main = self.main_param sto = c_s T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return (self.U_dimensional(sto, T_dim) - self.U_ref) / main.potential_scale + return ( + self.U_dimensional(sto, T_dim, lithiation) - self.U_ref + ) / main.potential_scale def dUdT(self, c_s): """Dimensionless entropic change in open-circuit potential""" @@ -890,7 +1033,8 @@ def t_change(self, sto): """ inputs = { f"{self.domain} particle stoichiometry": sto, - f"{self.domain} particle maximum concentration [mol.m-3]": self.c_max, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, } return pybamm.FunctionParameter( f"{self.domain} electrode volume change", inputs diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index 5d45e85f07..c0dad410e2 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -179,12 +179,15 @@ def update_from_chemistry(self, chemistry): ] # add SEI parameters if provided - if "sei" in chemistry: - component_groups += ["sei"] - - # add lithium plating parameters if provided - if "lithium plating" in chemistry: - component_groups += ["lithium plating"] + for extra_group in [ + "sei", + "lithium plating", + "negative secondary particle", + ]: + if extra_group in chemistry: + # do extra groups first, as later we will check whether a parameter + # appears with "Secondary:" (in which case we change it to "Primary:") + component_groups = [extra_group] + component_groups for component_group in component_groups: # Make sure component is provided @@ -197,13 +200,27 @@ def update_from_chemistry(self, chemistry): ) ) # Create path to component and load values + prefactor = "" + if component_group == "negative secondary particle": + component_group = "negative electrode" + prefactor = "Secondary: " component_path = os.path.join( base_chemistry, component_group.replace(" ", "_") + "s", component ) file_path = self.find_parameter( os.path.join(component_path, "parameters.csv") ) - component_params = self.read_parameters_csv(file_path) + component_params_tmp = self.read_parameters_csv(file_path) + + component_params = {} + for k, v in component_params_tmp.items(): + # If a parameter is already present as a secondary parameter, we + # distinguish it by adding "Primary:" to the given name + if "Secondary: " + k in self._dict_items: + component_params["Primary: " + k] = v + else: + # Add prefactor to distinguish e.g. secondary particles + component_params[prefactor + k] = v # Update parameters, making sure to check any conflicts self.update( diff --git a/pybamm/simulation.py b/pybamm/simulation.py index 9b80574cf5..074dfc0ed8 100644 --- a/pybamm/simulation.py +++ b/pybamm/simulation.py @@ -613,8 +613,8 @@ def solve( "Initial concentration in positive electrode [mol.m-3]" ] param = pybamm.LithiumIonParameters() - c_n_max = self.parameter_values.evaluate(param.n.c_max) - c_p_max = self.parameter_values.evaluate(param.p.c_max) + c_n_max = self.parameter_values.evaluate(param.n.prim.c_max) + c_p_max = self.parameter_values.evaluate(param.p.prim.c_max) x, y = pybamm.lithium_ion.get_initial_stoichiometries( initial_soc, self.parameter_values ) diff --git a/requirements.txt b/requirements.txt index dfb257d3de..98206706a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed +numpy >= 1.16 scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 diff --git a/setup.py b/setup.py index 69d66ebca7..ff84b76c9b 100644 --- a/setup.py +++ b/setup.py @@ -191,7 +191,7 @@ def compile_KLU(): python_requires=">=3.7,<3.10", # List of dependencies install_requires=[ - "numpy<=1.22", # change back to numpy>=1.16 once scikit.odes is fixed + "numpy>=1.16", "scipy>=1.3", "pandas>=0.24", "anytree>=2.4.3", diff --git a/tests/unit/test_citations.py b/tests/unit/test_citations.py index 34f79ea484..8b9362906b 100644 --- a/tests/unit/test_citations.py +++ b/tests/unit/test_citations.py @@ -123,14 +123,14 @@ def test_subramanian_2005(self): citations._reset() self.assertNotIn("Subramanian2005", citations._papers_to_cite) pybamm.particle.no_distribution.XAveragedPolynomialProfile( - None, "Negative", "quadratic profile", None + None, "Negative", "quadratic profile", None, "primary" ) self.assertIn("Subramanian2005", citations._papers_to_cite) citations._reset() self.assertNotIn("Subramanian2005", citations._papers_to_cite) pybamm.particle.no_distribution.PolynomialProfile( - None, "Negative", "quadratic profile", None + None, "Negative", "quadratic profile", None, "primary" ) self.assertIn("Subramanian2005", citations._papers_to_cite) @@ -192,12 +192,12 @@ def test_sripad_2020(self): citations._reset() self.assertNotIn("Sripad2020", citations._papers_to_cite) - pybamm.kinetics.Marcus(None, None, None, None) + pybamm.kinetics.Marcus(None, None, None, None, None) self.assertIn("Sripad2020", citations._papers_to_cite) citations._reset() self.assertNotIn("Sripad2020", citations._papers_to_cite) - pybamm.kinetics.MarcusHushChidsey(None, None, None, None) + pybamm.kinetics.MarcusHushChidsey(None, None, None, None, None) self.assertIn("Sripad2020", citations._papers_to_cite) def test_parameter_citations(self): diff --git a/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py b/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py index 32b20ba610..b494a878b7 100644 --- a/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py +++ b/tests/unit/test_expression_tree/test_operations/test_convert_to_casadi.py @@ -137,9 +137,7 @@ def test_special_functions(self): # pybamm.Function(np_fun, c).to_casadi() # ) - casadi.evalf(casadi.MX(np_fun(3))) # is not zero, but a small number of the order 10^-15 when np_func is np.cosh - for np_fun in [ - np.cosh - ]: + for np_fun in [np.cosh]: self.assert_casadi_almost_equal( pybamm.Function(np_fun, c).to_casadi(), casadi.MX(np_fun(3)), @@ -196,9 +194,11 @@ def test_interpolation(self): interp_casadi = interp.to_casadi(y=casadi_y) # error for converted children count - y3 = (pybamm.StateVector(slice(0, 1)), - pybamm.StateVector(slice(0, 1)), - pybamm.StateVector(slice(0, 1))) + y3 = ( + pybamm.StateVector(slice(0, 1)), + pybamm.StateVector(slice(0, 1)), + pybamm.StateVector(slice(0, 1)), + ) x3_ = [np.linspace(0, 1) for _ in range(3)] x3 = np.column_stack(x3_) data3 = 2 * x3 # np.tile(2 * x3, (10, 1)).T @@ -218,18 +218,14 @@ def test_interpolation_2d(self): y_test = np.array([0.4, 0.6]) Y = (2 * x).sum(axis=1).reshape(*[len(el) for el in x_]) for interpolator in ["linear"]: - interp = pybamm.Interpolant(x_, - Y, - y, interpolator=interpolator) + interp = pybamm.Interpolant(x_, Y, y, interpolator=interpolator) interp_casadi = interp.to_casadi(y=casadi_y) f = casadi.Function("f", [casadi_y], [interp_casadi]) np.testing.assert_array_almost_equal(interp.evaluate(y=y_test), f(y_test)) # square y = (pybamm.StateVector(slice(0, 1)), pybamm.StateVector(slice(0, 1))) Y = (x ** 2).sum(axis=1).reshape(*[len(el) for el in x_]) - interp = pybamm.Interpolant(x_, - Y, - y, interpolator="linear") + interp = pybamm.Interpolant(x_, Y, y, interpolator="linear") interp_casadi = interp.to_casadi(y=casadi_y) f = casadi.Function("f", [casadi_y], [interp_casadi]) np.testing.assert_array_almost_equal(interp.evaluate(y=y_test), f(y_test)) diff --git a/tests/unit/test_expression_tree/test_printing/__init__.py b/tests/unit/test_expression_tree/test_printing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index f3248e0b36..bc5a1c076c 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -16,14 +16,16 @@ def test_prettify_print_name(self): self.assertEqual(param.timescale.print_name, r"\tau") # Test superscripts - self.assertEqual(param.n.U_ref.print_name, r"U_{n}^{ref}") + self.assertEqual(param.n.prim.U_ref.print_name, r"U_{n}^{ref}") # Test subscripts - self.assertEqual(param.a_R_p.print_name, r"a_{R\,p}") + self.assertEqual(param.p.prim.a_R.print_name, r"a_{R\,p}") # Test dim and dimensional - self.assertEqual(param.j0_n_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}") - self.assertEqual(param.C_dl_n_dimensional.print_name, r"\hat{C}_{dl\,n}") + # self.assertEqual( + # param.n.prim.j0_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}" + # ) + # self.assertEqual(param.n.C_dl_dimensional.print_name, r"\hat{C}_{dl\,n}") # Test bar self.assertEqual(param1.c_s_n_xav.print_name, r"\bar{c}_{s\,n}") @@ -32,8 +34,7 @@ def test_prettify_print_name(self): self.assertEqual(param2.delta.print_name, r"\delta") # Test new_copy() - x_n = pybamm.standard_spatial_vars.x_n - a_n = param2.a_n(x_n) + a_n = param2.n.prim.a a_n.new_copy() # Test eps diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index fe62d5a73b..7bdfb9227d 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -30,6 +30,7 @@ 'operating mode': 'current' (possible: ['current', 'voltage', 'power', 'differential power', 'explicit power', 'resistance', 'differential resistance', 'explicit resistance', 'CCCV']) 'particle': 'Fickian diffusion' (possible: ['Fickian diffusion', 'fast diffusion', 'uniform profile', 'quadratic profile', 'quartic profile']) 'particle mechanics': 'swelling only' (possible: ['none', 'swelling only', 'swelling and cracking']) +'particle phases': '1' (possible: ['1', '2']) 'particle shape': 'spherical' (possible: ['spherical', 'no particles']) 'particle size': 'single' (possible: ['single', 'distribution']) 'SEI': 'none' (possible: ['none', 'constant', 'reaction limited', 'solvent-diffusion limited', 'electron-migration limited', 'interstitial-diffusion limited', 'ec reaction limited']) @@ -72,7 +73,7 @@ def test_process_parameters_and_discretise(self): model.variables["X-averaged negative electrode temperature"], ["negative particle"], ) - D = model.param.n.D(c_n, T) + D = model.param.n.prim.D(c_n, T) N = -D * pybamm.grad(c_n) flux_1 = model.process_parameters_and_discretise(N, parameter_values, disc) diff --git a/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py b/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py index ba97870bab..ac0ae53fe0 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py +++ b/tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py @@ -135,7 +135,13 @@ def test_well_posed_function(self): def external_circuit_function(variables): I = variables["Current [A]"] V = variables["Terminal voltage [V]"] - return V + I - pybamm.FunctionParameter("Function", {"Time [s]": pybamm.t}) + return ( + V + + I + - pybamm.FunctionParameter( + "Function", {"Time [s]": pybamm.t}, print_name="test_fun" + ) + ) options = {"operating mode": external_circuit_function} model = pybamm.lead_acid.LOQS(options) diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 07b3d88972..9a69bae87e 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -262,7 +262,13 @@ def test_well_posed_external_circuit_function(self): def external_circuit_function(variables): I = variables["Current [A]"] V = variables["Terminal voltage [V]"] - return V + I - pybamm.FunctionParameter("Function", {"Time [s]": pybamm.t}) + return ( + V + + I + - pybamm.FunctionParameter( + "Function", {"Time [s]": pybamm.t}, print_name="test_fun" + ) + ) options = {"operating mode": external_circuit_function} self.check_well_posedness(options) diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py index 6141770d66..98fdeb7767 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py @@ -10,6 +10,16 @@ def test_dfn_well_posed(self): model = pybamm.lithium_ion.BasicDFN() model.check_well_posedness() + copy = model.new_copy() + copy.check_well_posedness() + + def test_dfn_composite_well_posed(self): + model = pybamm.lithium_ion.BasicDFNComposite() + model.check_well_posedness() + + copy = model.new_copy() + copy.check_well_posedness() + def test_spm_well_posed(self): model = pybamm.lithium_ion.BasicSPM() model.check_well_posedness() diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py index e49197bd3a..98de93c8c3 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py @@ -35,10 +35,9 @@ def test_new_model(self): self.assertEqual(new_model.timescale, model.timescale) # with custom submodels - options = {"stress-induced diffusion": "false", "thermal": "x-full"} - model = pybamm.lithium_ion.SPM(options, build=False) + model = pybamm.lithium_ion.SPM({"thermal": "x-full"}, build=False) particle_n = pybamm.particle.no_distribution.XAveragedPolynomialProfile( - model.param, "Negative", "quadratic profile", options + model.param, "Negative", "quadratic profile", model.options, "primary" ) model.submodels["negative particle"] = particle_n model.build_model() diff --git a/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py b/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py new file mode 100644 index 0000000000..6ca166afea --- /dev/null +++ b/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py @@ -0,0 +1,52 @@ +# +# Standard tests for the public methods of submodels +# + + +class StandardSubModelTests(object): + + """Basic tests for submodels. Just tests everything runs without raising error""" + + def __init__(self, submodel, variables=None): + # variables should be a dict of variables which are needed by the submodels + # to run all its functions propertly + if not variables: + variables = {} + self.submodel = submodel + self.variables = variables + self.external_variables = [] + + def test_get_fundamental_variables(self): + self.variables.update(self.submodel.get_fundamental_variables()) + + def test_get_external_variables(self): + external_variables = self.submodel.get_external_variables() + self.external_variables += external_variables + + def test_get_coupled_variables(self): + self.variables.update(self.submodel.get_coupled_variables(self.variables)) + + def test_set_rhs(self): + self.submodel.set_rhs(self.variables) + + def test_set_algebraic(self): + self.submodel.set_algebraic(self.variables) + + def test_set_boundary_conditions(self): + self.submodel.set_boundary_conditions(self.variables) + + def test_set_initial_conditions(self): + self.submodel.set_initial_conditions(self.variables) + + def test_set_events(self): + self.submodel.set_events(self.variables) + + def test_all(self): + self.test_get_fundamental_variables() + self.test_get_external_variables() + self.test_get_coupled_variables() + self.test_set_rhs() + self.test_set_algebraic() + self.test_set_boundary_conditions() + self.test_set_initial_conditions() + self.test_set_events() diff --git a/tests/unit/test_parameters/test_base_parameters.py b/tests/unit/test_parameters/test_base_parameters.py index 8d75407619..5a3002a10d 100644 --- a/tests/unit/test_parameters/test_base_parameters.py +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -7,7 +7,7 @@ class TestBaseParameters(unittest.TestCase): def test_getattr__(self): - param = pybamm.GeometricParameters() + param = pybamm.LithiumIonParameters() # ending in _n / _s / _p with self.assertRaisesRegex(AttributeError, "param.n.l"): getattr(param, "l_n") @@ -16,10 +16,10 @@ def test_getattr__(self): with self.assertRaisesRegex(AttributeError, "param.p.l"): getattr(param, "l_p") # _n_ in the name - with self.assertRaisesRegex(AttributeError, "param.n.c_max"): + with self.assertRaisesRegex(AttributeError, "param.n.prim.c_max"): getattr(param, "c_n_max") # _p_ in the name, function - with self.assertRaisesRegex(AttributeError, "param.p.U_dimensional"): + with self.assertRaisesRegex(AttributeError, "param.p.prim.U_dimensional"): getattr(param, "U_p_dimensional") def test__setattr__(self): diff --git a/tests/unit/test_parameters/test_lead_acid_parameters.py b/tests/unit/test_parameters/test_lead_acid_parameters.py index f035d0150e..e1f79514ae 100644 --- a/tests/unit/test_parameters/test_lead_acid_parameters.py +++ b/tests/unit/test_parameters/test_lead_acid_parameters.py @@ -135,10 +135,10 @@ def test_functions_lead_acid(self): "kappa_e_0": param.kappa_e(pybamm.Scalar(0), pybamm.Scalar(0)), "chi_1": param.chi(pybamm.Scalar(1), pybamm.Scalar(0)), "chi_0.5": param.chi(pybamm.Scalar(0.5), pybamm.Scalar(0)), - "U_n_1": param.n.U(pybamm.Scalar(1), pybamm.Scalar(0)), - "U_n_0.5": param.n.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), - "U_p_1": param.p.U(pybamm.Scalar(1), pybamm.Scalar(0)), - "U_p_0.5": param.p.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), + "U_n_1": param.n.prim.U(pybamm.Scalar(1), pybamm.Scalar(0)), + "U_n_0.5": param.n.prim.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), + "U_p_1": param.p.prim.U(pybamm.Scalar(1), pybamm.Scalar(0)), + "U_p_0.5": param.p.prim.U(pybamm.Scalar(0.5), pybamm.Scalar(0)), } # Process parameter_values = pybamm.ParameterValues("Sulzer2019") diff --git a/tests/unit/test_parameters/test_lithium_ion_parameters.py b/tests/unit/test_parameters/test_lithium_ion_parameters.py index d3b6028c19..d625e5cda6 100644 --- a/tests/unit/test_parameters/test_lithium_ion_parameters.py +++ b/tests/unit/test_parameters/test_lithium_ion_parameters.py @@ -34,54 +34,62 @@ def test_lithium_ion(self): # a_n_typ np.testing.assert_almost_equal( - values.evaluate(param.n.a_typ), 0.18 * 10 ** (6), 2 + values.evaluate(param.n.prim.a_typ), 0.18 * 10 ** (6), 2 ) # R_n dimensional np.testing.assert_almost_equal( - values.evaluate(param.n.R_typ), 1 * 10 ** (-5), 2 + values.evaluate(param.n.prim.R_typ), 1 * 10 ** (-5), 2 ) # a_R_n = a_n_typ * R_n_typ - np.testing.assert_almost_equal(values.evaluate(param.n.a_R), 1.8, 2) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.a_R), 1.8, 2) # a_p_typ np.testing.assert_almost_equal( - values.evaluate(param.p.a_typ), 0.15 * 10 ** (6), 2 + values.evaluate(param.p.prim.a_typ), 0.15 * 10 ** (6), 2 ) # R_p dimensional np.testing.assert_almost_equal( - values.evaluate(param.p.R_typ), 1 * 10 ** (-5), 2 + values.evaluate(param.p.prim.R_typ), 1 * 10 ** (-5), 2 ) # a_p = a_p_typ * R_p_typ - np.testing.assert_almost_equal(values.evaluate(param.p.a_R), 1.5, 2) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.a_R), 1.5, 2) # j0_m np.testing.assert_almost_equal( values.evaluate( - param.n.j0_dimensional(param.c_e_typ, param.n.c_max / 2, param.T_ref) + param.n.prim.j0_dimensional( + param.c_e_typ, param.n.prim.c_max / 2, param.T_ref + ) + ), + values.evaluate( + 2 * 10 ** (-5) * param.c_e_typ ** 0.5 * param.n.prim.c_max / 2 ), - values.evaluate(2 * 10 ** (-5) * param.c_e_typ ** 0.5 * param.n.c_max / 2), 8, ) np.testing.assert_almost_equal( - values.evaluate(param.n.gamma / param.n.C_r * c_rate), 26.6639, 3 + values.evaluate(param.n.prim.gamma / param.n.prim.C_r * c_rate), 26.6639, 3 ) # j0_p np.testing.assert_almost_equal( values.evaluate( - param.p.j0_dimensional(param.c_e_typ, param.p.c_max / 2, param.T_ref) + param.p.prim.j0_dimensional( + param.c_e_typ, param.p.prim.c_max / 2, param.T_ref + ) + ), + values.evaluate( + 6 * 10 ** (-7) * param.c_e_typ ** 0.5 * param.p.prim.c_max / 2 ), - values.evaluate(6 * 10 ** (-7) * param.c_e_typ ** 0.5 * param.p.c_max / 2), 8, ) # gamma_p / C_r_p np.testing.assert_almost_equal( - values.evaluate(param.p.gamma / param.p.C_r * c_rate), 1.366, 3 + values.evaluate(param.p.prim.gamma / param.p.prim.C_r * c_rate), 1.366, 3 ) # particle dynamics @@ -89,7 +97,9 @@ def test_lithium_ion(self): np.testing.assert_almost_equal( values.evaluate( pybamm.xyz_average( - pybamm.r_average(param.n.D_dimensional(param.n.c_init, param.T_ref)) + pybamm.r_average( + param.n.prim.D_dimensional(param.n.prim.c_init, param.T_ref) + ) ) ), 3.9 * 10 ** (-14), @@ -98,19 +108,21 @@ def test_lithium_ion(self): # neg diffusion timescale np.testing.assert_almost_equal( - values.evaluate(param.n.tau_diffusion), 2.5641 * 10 ** (3), 2 + values.evaluate(param.n.prim.tau_diffusion), 2.5641 * 10 ** (3), 2 ) # tau_n / tau_d (1/gamma_n in Scott's transfer) np.testing.assert_almost_equal( - values.evaluate(param.n.C_diff / c_rate), 0.11346, 3 + values.evaluate(param.n.prim.C_diff / c_rate), 0.11346, 3 ) # pos diffusion coefficient np.testing.assert_almost_equal( values.evaluate( pybamm.xyz_average( - pybamm.r_average(param.p.D_dimensional(param.p.c_init, param.T_ref)) + pybamm.r_average( + param.p.prim.D_dimensional(param.p.prim.c_init, param.T_ref) + ) ) ), 1 * 10 ** (-13), @@ -119,12 +131,12 @@ def test_lithium_ion(self): # pos diffusion timescale np.testing.assert_almost_equal( - values.evaluate(param.p.tau_diffusion), 1 * 10 ** (3), 2 + values.evaluate(param.p.prim.tau_diffusion), 1 * 10 ** (3), 2 ) # tau_p / tau_d (1/gamma_p in Scott's transfer) np.testing.assert_almost_equal( - values.evaluate(param.p.C_diff / c_rate), 0.044249, 3 + values.evaluate(param.p.prim.C_diff / c_rate), 0.044249, 3 ) # electrolyte dynamics diff --git a/tests/unit/test_parameters/test_size_distribution_parameters.py b/tests/unit/test_parameters/test_size_distribution_parameters.py index 857349ce97..26c3443594 100644 --- a/tests/unit/test_parameters/test_size_distribution_parameters.py +++ b/tests/unit/test_parameters/test_size_distribution_parameters.py @@ -19,19 +19,19 @@ def test_parameter_values(self): # check dimensionless parameters # min and max radii - np.testing.assert_almost_equal(values.evaluate(param.n.R_min), 0.0, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.R_min), 0.0, 3) - np.testing.assert_almost_equal(values.evaluate(param.n.R_max), 2.5, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.R_max), 2.5, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.R_min), 0.0, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.R_min), 0.0, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.R_max), 2.5, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.R_max), 2.5, 3) # standard deviations - np.testing.assert_almost_equal(values.evaluate(param.n.sd_a), 0.3, 3) - np.testing.assert_almost_equal(values.evaluate(param.p.sd_a), 0.3, 3) + np.testing.assert_almost_equal(values.evaluate(param.n.prim.sd_a), 0.3, 3) + np.testing.assert_almost_equal(values.evaluate(param.p.prim.sd_a), 0.3, 3) # check function parameters (size distributions) evaluate R_test = pybamm.Scalar(1.0) - values.evaluate(param.n.f_a_dist(R_test)) - values.evaluate(param.p.f_a_dist(R_test)) + values.evaluate(param.n.prim.f_a_dist(R_test)) + values.evaluate(param.p.prim.f_a_dist(R_test)) if __name__ == "__main__": diff --git a/tests/unit/test_simulation.py b/tests/unit/test_simulation.py index b0c6f5840e..5ad44650fb 100644 --- a/tests/unit/test_simulation.py +++ b/tests/unit/test_simulation.py @@ -145,7 +145,7 @@ def test_set_crate(self): def test_set_external_variable(self): model_options = { "thermal": "lumped", - "external submodels": ["thermal", "negative particle"], + "external submodels": ["thermal"], } model = pybamm.lithium_ion.SPMe(model_options) sim = pybamm.Simulation(model) diff --git a/tests/unit/test_solvers/test_idaklu_solver.py b/tests/unit/test_solvers/test_idaklu_solver.py index e0957c7082..61f6f9607a 100644 --- a/tests/unit/test_solvers/test_idaklu_solver.py +++ b/tests/unit/test_solvers/test_idaklu_solver.py @@ -72,9 +72,7 @@ def test_model_events(self): disc = pybamm.Discretisation() model_disc = disc.process_model(model, inplace=False) # Solve - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) t_eval = np.linspace(0, 1, 100) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) @@ -85,9 +83,7 @@ def test_model_events(self): # enforce events that won't be triggered model.events = [pybamm.Event("an event", var + 1)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) np.testing.assert_array_almost_equal( @@ -97,9 +93,7 @@ def test_model_events(self): # enforce events that will be triggered model.events = [pybamm.Event("an event", var - 1.01)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) solution = solver.solve(model_disc, t_eval) self.assertLess(len(solution.t), len(t_eval)) np.testing.assert_array_almost_equal( @@ -121,9 +115,7 @@ def test_model_events(self): disc = get_discretisation_for_testing() disc.process_model(model) - solver = pybamm.IDAKLUSolver( - rtol=1e-8, atol=1e-8, root_method=root_method - ) + solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) t_eval = np.linspace(0, 5, 100) solution = solver.solve(model, t_eval) np.testing.assert_array_less(solution.y[0, :-1], 1.5) @@ -168,13 +160,13 @@ def test_input_params(self): b_value = np.array([[0.2], [0.3]]) sol = solver.solve( - model, t_eval, inputs={"a": a_value, "b": b_value}, + model, + t_eval, + inputs={"a": a_value, "b": b_value}, ) # test that y[3] remains constant - np.testing.assert_array_almost_equal( - sol.y[3, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[3, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -214,13 +206,13 @@ def test_ida_roberts_klu_sensitivities(self): # solve first without sensitivities sol = solver.solve( - model, t_eval, inputs={"a": a_value}, + model, + t_eval, + inputs={"a": a_value}, ) # test that y[1] remains constant - np.testing.assert_array_almost_equal( - sol.y[1, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -232,14 +224,11 @@ def test_ida_roberts_klu_sensitivities(self): # now solve with sensitivities (this should cause set_up to be run again) sol = solver.solve( - model, t_eval, inputs={"a": a_value}, - calculate_sensitivities=True + model, t_eval, inputs={"a": a_value}, calculate_sensitivities=True ) # test that y[1] remains constant - np.testing.assert_array_almost_equal( - sol.y[1, :], np.ones(sol.t.shape) - ) + np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -255,9 +244,7 @@ def test_ida_roberts_klu_sensitivities(self): dyda_fd = (sol_plus.y - sol_neg.y) / h dyda_fd = dyda_fd.transpose().reshape(-1, 1) - np.testing.assert_array_almost_equal( - dyda_ida, dyda_fd - ) + np.testing.assert_array_almost_equal(dyda_ida, dyda_fd) def test_set_atol(self): model = pybamm.lithium_ion.DFN() @@ -295,7 +282,7 @@ def test_set_atol(self): # wrong size (should fail) atol = [1, 2] solver = pybamm.IDAKLUSolver(atol=atol) - with self.assertRaisesRegex(pybamm.SolverError, 'Absolute tolerances'): + with self.assertRaisesRegex(pybamm.SolverError, "Absolute tolerances"): solver.solve(model, t_eval) def test_failures(self): @@ -330,7 +317,7 @@ def test_failures(self): # will give solver error t_eval = np.linspace(0, -3, 100) with self.assertRaisesRegex( - pybamm.SolverError, 't_eval must increase monotonically' + pybamm.SolverError, "t_eval must increase monotonically" ): solver.solve(model, t_eval) @@ -346,9 +333,7 @@ def test_failures(self): solver = pybamm.IDAKLUSolver() t_eval = np.linspace(0, 3, 100) - with self.assertRaisesRegex( - pybamm.SolverError, 'idaklu solver failed' - ): + with self.assertRaisesRegex(pybamm.SolverError, "idaklu solver failed"): solver.solve(model, t_eval) def test_dae_solver_algebraic_model(self): diff --git a/tests/unit/test_solvers/test_scipy_solver.py b/tests/unit/test_solvers/test_scipy_solver.py index 3a5625aace..916d1001ed 100644 --- a/tests/unit/test_solvers/test_scipy_solver.py +++ b/tests/unit/test_solvers/test_scipy_solver.py @@ -513,12 +513,11 @@ def test_solve_sensitivity_scalar_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) - solution = solver.solve(model, t_eval, inputs={"p": 0.1}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"p": 0.1}, calculate_sensitivities=True + ) np.testing.assert_array_equal(solution.t, t_eval) np.testing.assert_allclose(solution.y[0], np.exp(0.1 * solution.t)) np.testing.assert_allclose( @@ -549,13 +548,13 @@ def test_solve_sensitivity_scalar_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) solution = solver.solve( - model, t_eval, inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, - calculate_sensitivities=True + model, + t_eval, + inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, + calculate_sensitivities=True, ) np.testing.assert_allclose(solution.y[0], -1 + 0.2 * solution.t) np.testing.assert_allclose( @@ -625,8 +624,9 @@ def test_solve_sensitivity_vector_var_scalar_input(self): # Solve - scalar input solver = pybamm.ScipySolver() t_eval = np.linspace(0, 1) - solution = solver.solve(model, t_eval, inputs={"param": 7}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"param": 7}, calculate_sensitivities=True + ) np.testing.assert_array_almost_equal( solution["var"].data, np.tile(2 * np.exp(-7 * t_eval), (n, 1)), @@ -657,13 +657,13 @@ def test_solve_sensitivity_vector_var_scalar_input(self): # Solve # Make sure that passing in extra options works - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1, 80) solution = solver.solve( - model, t_eval, inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, - calculate_sensitivities=True + model, + t_eval, + inputs={"p": 0.1, "q": 2, "r": -1, "s": 0.5}, + calculate_sensitivities=True, ) np.testing.assert_allclose(solution.y, np.tile(-1 + 0.2 * solution.t, (n, 1))) np.testing.assert_allclose( @@ -737,12 +737,14 @@ def test_solve_sensitivity_vector_var_vector_input(self): n = disc.mesh["negative electrode"].npts # Solve - constant input - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1) - solution = solver.solve(model, t_eval, inputs={"param": 7 * np.ones(n)}, - calculate_sensitivities=True) + solution = solver.solve( + model, + t_eval, + inputs={"param": 7 * np.ones(n)}, + calculate_sensitivities=True, + ) l_n = mesh["negative electrode"].edges[-1] np.testing.assert_array_almost_equal( solution["var"].data, @@ -765,13 +767,12 @@ def test_solve_sensitivity_vector_var_vector_input(self): ) # Solve - linspace input - solver = pybamm.ScipySolver( - rtol=1e-10, atol=1e-10 - ) + solver = pybamm.ScipySolver(rtol=1e-10, atol=1e-10) t_eval = np.linspace(0, 1) p_eval = np.linspace(1, 2, n) - solution = solver.solve(model, t_eval, inputs={"param": p_eval}, - calculate_sensitivities=True) + solution = solver.solve( + model, t_eval, inputs={"param": p_eval}, calculate_sensitivities=True + ) l_n = mesh["negative electrode"].edges[-1] np.testing.assert_array_almost_equal( solution["var"].data, 2 * np.exp(-p_eval[:, np.newaxis] * t_eval), decimal=4 diff --git a/tests/unit/test_spatial_methods/test_base_spatial_method.py b/tests/unit/test_spatial_methods/test_base_spatial_method.py index bfc6ceddec..5d5fe8c46d 100644 --- a/tests/unit/test_spatial_methods/test_base_spatial_method.py +++ b/tests/unit/test_spatial_methods/test_base_spatial_method.py @@ -7,7 +7,7 @@ from tests import ( get_mesh_for_testing, get_1p1d_mesh_for_testing, - get_size_distribution_mesh_for_testing + get_size_distribution_mesh_for_testing, ) From 235a0b5c8425075196cfa0c08a9ec788cccff2db Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 8 Jul 2022 13:02:31 -0400 Subject: [PATCH 06/47] fixing tests --- .../full_battery_models/base_battery_model.py | 25 ------------ .../submodels/electrode/ohm/full_ohm.py | 4 +- .../full_surface_form_conductivity.py | 8 ++-- .../interface/kinetics/no_reaction.py | 6 +++ .../interface/kinetics/total_kinetics.py | 2 +- .../particle_mechanics/base_mechanics.py | 4 +- .../particle_mechanics/crack_propagation.py | 3 +- pybamm/parameters/lithium_ion_parameters.py | 39 ++++--------------- 8 files changed, 24 insertions(+), 67 deletions(-) diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index c487de0683..c2ca5ef37e 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -500,16 +500,6 @@ def __init__(self, extra_options): super().__init__(options.items()) - def phase_number_to_names(self, number): - """ - Converts number of phases to a list ["primary", "secondary", ...] - """ - number = int(number) - phases = ["primary"] - if number >= 2: - phases.append("secondary") - return phases - def print_options(self): """ Print the possible options with the ones currently selected @@ -561,21 +551,6 @@ def secondary(self): return BatteryModelPhaseOptions(self, 1) -class BatteryModelPhaseOptions(dict): - def __init__(self, domain_options, index): - super().__init__(domain_options.items()) - self.domain_options = domain_options - self.index = index - - def __getitem__(self, key): - options = self.domain_options.__getitem__(key) - if isinstance(options, str): - return options - else: - # 2-tuple, first is primary phase, second is secondary phase - return options[self.index] - - class BaseBatteryModel(pybamm.BaseModel): """ Base model class with some default settings and required variables diff --git a/pybamm/models/submodels/electrode/ohm/full_ohm.py b/pybamm/models/submodels/electrode/ohm/full_ohm.py index aa0d83bcdd..baa59e8043 100644 --- a/pybamm/models/submodels/electrode/ohm/full_ohm.py +++ b/pybamm/models/submodels/electrode/ohm/full_ohm.py @@ -61,8 +61,8 @@ def set_algebraic(self, variables): # Variable summing all of the interfacial current densities sum_a_j = variables[ - f"Sum of volumetric {self.domain.lower()} " - "electrode interfacial current densities" + f"Sum of {self.domain.lower()} electrode volumetric " + "interfacial current densities" ] self.algebraic[phi_s] = pybamm.div(i_s) + sum_a_j diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py index 3ad1fa98b1..cb4de62a62 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py @@ -237,8 +237,8 @@ def set_algebraic(self, variables): # Variable summing all of the interfacial current densities sum_a_j = variables[ - f"Sum of volumetric {self.domain.lower()} " - "electrode interfacial current densities" + f"Sum of {self.domain.lower()} electrode volumetric " + "interfacial current densities" ] self.algebraic[delta_phi] = pybamm.div(i_e) - sum_a_j @@ -273,8 +273,8 @@ def set_rhs(self, variables): # Variable summing all of the interfacial current densities sum_a_j = variables[ - f"Sum of volumetric {self.domain.lower()} " - "electrode interfacial current densities" + f"Sum of {self.domain.lower()} electrode volumetric " + "interfacial current densities" ] self.rhs[delta_phi] = 1 / C_dl * (pybamm.div(i_e) - sum_a_j) diff --git a/pybamm/models/submodels/interface/kinetics/no_reaction.py b/pybamm/models/submodels/interface/kinetics/no_reaction.py index 7b5ab7720a..b586c0a531 100644 --- a/pybamm/models/submodels/interface/kinetics/no_reaction.py +++ b/pybamm/models/submodels/interface/kinetics/no_reaction.py @@ -37,6 +37,12 @@ def get_fundamental_variables(self): variables.update(self._get_standard_exchange_current_variables(zero)) return variables + def get_coupled_variables(self, variables): + variables.update( + self._get_standard_volumetric_current_density_variables(variables) + ) + return variables + def _get_dj_dc(self, variables): return pybamm.Scalar(0) diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py index 76a0878cb6..84d23cab34 100644 --- a/pybamm/models/submodels/interface/kinetics/total_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -157,7 +157,7 @@ def get_coupled_variables(self, variables): s_n, s_p = 1, 1 elif self.chemistry == "lead-acid": if reaction_name == "": # main reaction - s_n, s_p = self.param.n.s_plus_S, self.param.p.s_plus_S + s_n, s_p = self.param.n.prim.s_plus_S, self.param.p.prim.s_plus_S elif reaction_name == "oxygen ": s_n, s_p = self.param.s_plus_Ox, self.param.s_plus_Ox if self.half_cell: diff --git a/pybamm/models/submodels/particle_mechanics/base_mechanics.py b/pybamm/models/submodels/particle_mechanics/base_mechanics.py index 486890eb16..837ef97ab9 100644 --- a/pybamm/models/submodels/particle_mechanics/base_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/base_mechanics.py @@ -72,8 +72,8 @@ def _get_mechanical_results(self, variables): L0 = domain_param.L c_init = pybamm.r_average(domain_param.prim.c_init) v_change = pybamm.x_average( - eps_s * domain_param.t_change(c_s_rav) - ) - pybamm.x_average(eps_s * domain_param.t_change(c_init)) + eps_s * domain_param.prim.t_change(c_s_rav) + ) - pybamm.x_average(eps_s * domain_param.prim.t_change(c_init)) cell_thickness_change += self.param.n_electrodes_parallel * v_change * L0 disp_surf_dim = Omega * R0 / 3 * (c_s_rav - c_0) * c_scale diff --git a/pybamm/models/submodels/particle_mechanics/crack_propagation.py b/pybamm/models/submodels/particle_mechanics/crack_propagation.py index c723a2e323..cc9d0120fa 100644 --- a/pybamm/models/submodels/particle_mechanics/crack_propagation.py +++ b/pybamm/models/submodels/particle_mechanics/crack_propagation.py @@ -102,7 +102,8 @@ def set_events(self, variables): self.events.append( pybamm.Event( f"{domain} particle crack length larger than particle radius", - pybamm.max(l_cr) - self.domain_param.R_typ / self.domain_param.l_cr_0, + pybamm.max(l_cr) + - self.domain_param.prim.R_typ / self.domain_param.l_cr_0, pybamm.EventType.TERMINATION, ) ) diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 3c068232ea..070d3458a5 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -733,15 +733,6 @@ def sigma_prime(self, T): """Rescaled dimensionless electrode electrical conductivity""" return self.sigma(T) * self.main_param.delta - def t_change(self, sto): - """ - Dimensionless volume change for the electrode; - sto should be R-averaged - """ - return pybamm.FunctionParameter( - f"{self.domain} electrode volume change", {"Particle stoichiometry": sto} - ) - def k_cr(self, T): """ Dimensionless cracking rate for the electrode; @@ -763,10 +754,7 @@ def __init__(self, phase, domain_param): self.main_param = domain_param.main_param self.phase = phase self.set_phase_name() - if self.phase == "primary": - self.geo = domain_param.geo.prim - elif self.phase == "secondary": - self.geo = domain_param.geo.sec + self.geo = domain_param.geo.prim def _set_dimensional_parameters(self): main = self.main_param @@ -1031,24 +1019,11 @@ def t_change(self, sto): Dimensionless volume change for the electrode; sto should be R-averaged """ - inputs = { - f"{self.domain} particle stoichiometry": sto, - f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " - "surface concentration [mol.m-3]": self.c_max, - } return pybamm.FunctionParameter( - f"{self.domain} electrode volume change", inputs - ) - - def k_cr(self, T): - """ - Dimensionless cracking rate for the electrode; - """ - T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - delta_k_cr = self.E ** self.m_cr * self.l_cr_0 ** (self.m_cr / 2 - 1) - return ( - pybamm.FunctionParameter( - f"{self.domain} electrode cracking rate", {"Temperature [K]": T_dim} - ) - * delta_k_cr + f"{self.domain} electrode volume change", + { + "Particle stoichiometry": sto, + f"{self.phase_prefactor}Maximum {self.domain.lower()} particle " + "surface concentration [mol.m-3]": self.c_max, + }, ) From 1942deb6ea9f422227e1832de54264188cf8a67f Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 8 Jul 2022 13:16:09 -0400 Subject: [PATCH 07/47] minor bug fixes --- CHANGELOG.md | 6 ++---- docs/requirements.txt | 2 +- pybamm/CITATIONS.txt | 12 ------------ .../parameters.csv | 1 + .../full_battery_models/base_battery_model.py | 15 --------------- requirements.txt | 2 +- 6 files changed, 5 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8f6526312..5afa8826be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ## Breaking changes +- Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2166](https://github.com/pybamm-team/PyBaMM/pull/2166)) - Exchange-current density functions (and some other functions) now take an additional argument, the maximum particle concentration for that phase ([#2134](https://github.com/pybamm-team/PyBaMM/pull/2134)) # [v22.6](https://github.com/pybamm-team/PyBaMM/tree/v22.6) - 2022-06-30 @@ -19,8 +20,6 @@ ## Features - Added open-circuit potential as a separate submodel ([#2094](https://github.com/pybamm-team/PyBaMM/pull/2094)) -- Reformated submodel structure to allow composite electrodes, with an example for graphite/silicon. Composite positive electrode is now also possible. With current implementation, electrodes can have at most two phases. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) -- Added "Chen2020_composite" parameter set for a composite graphite/silicon electrode. Silicon parameters are added as a standard negative electrode parameter set, specified as the "negative electrode secondary" set, which automatically adds "Secondary:" to the start of each parameter name. Primary (graphite) parameter names are unchanged. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) - Added partially reversible lithium plating model and new `OKane2022` parameter set to go with it ([#2043](https://github.com/pybamm-team/PyBaMM/pull/2043)) - Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) @@ -36,7 +35,6 @@ ## Features -- Added a casadi version of the IDKLU solver, which is used for `model.convert_to_format = "casadi"` ([#2002](https://github.com/pybamm-team/PyBaMM/pull/2002)) - Added functionality to generate Julia expressions from a model. See [PyBaMM.jl](https://github.com/tinosulzer/PyBaMM.jl) for how to use these ([#1942](https://github.com/pybamm-team/PyBaMM/pull/1942))) - Added basic callbacks to the Simulation class, and a LoggingCallback ([#1880](https://github.com/pybamm-team/PyBaMM/pull/1880))) @@ -47,7 +45,7 @@ ## Breaking changes - Exchange-current density functions now take a fourth argument, the maximum particle concentration for that phase -- Changed domain-specific parameter names to a nested attribute. `param.l_n` is now `param.n.l`. Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) +- Changed domain-specific parameter names to a nested attribute. `param.l_n` is now `param.n.l` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) # [v22.4](https://github.com/pybamm-team/PyBaMM/tree/v22.4) - 2022-04-30 diff --git a/docs/requirements.txt b/docs/requirements.txt index d8a7ccb655..b5c1baf29b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ # Requirements for readthedocs.io -numpy >= 1.16 +numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 diff --git a/pybamm/CITATIONS.txt b/pybamm/CITATIONS.txt index 5da95f824c..8286209bc5 100644 --- a/pybamm/CITATIONS.txt +++ b/pybamm/CITATIONS.txt @@ -10,18 +10,6 @@ doi = {10.1149/2.0122001JES}, } -@article{Ai2022, - title = {A composite electrode model for lithium-ion batteries with silicon/graphite negative electrodes}, - journal = {Journal of Power Sources}, - volume = {527}, - pages = {231142}, - year = {2022}, - issn = {0378-7753}, - doi = {https://doi.org/10.1016/j.jpowsour.2022.231142}, - url = {https://www.sciencedirect.com/science/article/pii/S0378775322001604}, - author = {Weilong Ai and Niall Kirkaldy and Yang Jiang and Gregory Offer and Huizhi Wang and Billy Wu}, -} - @article{Andersson2019, author = {Andersson, Joel A. E. and Gillis, Joris and Horn, Greg and Rawlings, James B. and Diehl, Moritz}, diff --git a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv index 3b6920c990..ab13c6b7b4 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv @@ -14,5 +14,6 @@ Lower voltage cut-off [V],2,, Upper voltage cut-off [V],4.4,, ,,, # Initial conditions,,, +Initial concentration in negative electrode [mol.m-3],28831.45783,Minimized to Severson Data, Initial concentration in positive electrode [mol.m-3],35.3766672,Minimized to Severson Data, Initial temperature [K],298.15,, diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index c2ca5ef37e..ad8cededbf 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -477,14 +477,7 @@ def __init__(self, extra_options): "Values must be strings or (in some cases) " "2-tuples of strings" ) - # flatten value - value_list = [] for val in value: - if isinstance(val, tuple): - value_list.extend(val) - else: - value_list.append(val) - for val in value_list: if option == "timescale": if not (val == "default" or isinstance(val, numbers.Number)): raise pybamm.OptionError( @@ -542,14 +535,6 @@ def __getitem__(self, key): # 2-tuple, first is negative domain, second is positive domain return options[self.index] - @property - def primary(self): - return BatteryModelPhaseOptions(self, 0) - - @property - def secondary(self): - return BatteryModelPhaseOptions(self, 1) - class BaseBatteryModel(pybamm.BaseModel): """ diff --git a/requirements.txt b/requirements.txt index 98206706a9..dfb257d3de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy >= 1.16 +numpy <= 1.22 # change back to numpy>=1.16 once scikit.odes is fixed scipy >= 1.3 pandas >= 0.24 anytree >= 2.4.3 From a5e813e14a43424a3335d50938f78b4f275c8559 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 8 Jul 2022 13:21:23 -0400 Subject: [PATCH 08/47] flake8 --- pybamm/models/submodels/interface/base_interface.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index a49f0e0e07..3a8e55fc65 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -185,7 +185,6 @@ def _get_standard_interfacial_current_variables(self, j): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - param = self.param j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": @@ -244,7 +243,6 @@ def _get_standard_exchange_current_variables(self, j0): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - param = self.param j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": From 64ff67d619d3d63da5ba4ff4afc05b14b7143dee Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 12 Jul 2022 17:32:23 -0400 Subject: [PATCH 09/47] fix print_name and remove tests accidentally added --- pybamm/expression_tree/parameter.py | 5 ++++- .../test_full_battery_models/test_base_battery_model.py | 1 - .../test_lithium_ion/test_basic_models.py | 7 ------- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pybamm/expression_tree/parameter.py b/pybamm/expression_tree/parameter.py index a40dd0114a..7b7d619da7 100644 --- a/pybamm/expression_tree/parameter.py +++ b/pybamm/expression_tree/parameter.py @@ -112,7 +112,10 @@ def __init__( print_name = print_name[: -len("_dimensional")] elif print_name.endswith("_dim"): print_name = print_name[: -len("_dim")] - parent_param = frame.f_locals["self"] + try: + parent_param = frame.f_locals["self"] + except KeyError: + parent_param = None if hasattr(parent_param, "domain"): # add "_n" or "_s" or "_p" if this comes from a Parameter class with # a domain diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index 7bdfb9227d..2bb6196e5c 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -30,7 +30,6 @@ 'operating mode': 'current' (possible: ['current', 'voltage', 'power', 'differential power', 'explicit power', 'resistance', 'differential resistance', 'explicit resistance', 'CCCV']) 'particle': 'Fickian diffusion' (possible: ['Fickian diffusion', 'fast diffusion', 'uniform profile', 'quadratic profile', 'quartic profile']) 'particle mechanics': 'swelling only' (possible: ['none', 'swelling only', 'swelling and cracking']) -'particle phases': '1' (possible: ['1', '2']) 'particle shape': 'spherical' (possible: ['spherical', 'no particles']) 'particle size': 'single' (possible: ['single', 'distribution']) 'SEI': 'none' (possible: ['none', 'constant', 'reaction limited', 'solvent-diffusion limited', 'electron-migration limited', 'interstitial-diffusion limited', 'ec reaction limited']) diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py index 98fdeb7767..2b2b1e022b 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_basic_models.py @@ -13,13 +13,6 @@ def test_dfn_well_posed(self): copy = model.new_copy() copy.check_well_posedness() - def test_dfn_composite_well_posed(self): - model = pybamm.lithium_ion.BasicDFNComposite() - model.check_well_posedness() - - copy = model.new_copy() - copy.check_well_posedness() - def test_spm_well_posed(self): model = pybamm.lithium_ion.BasicSPM() model.check_well_posedness() From 8e356ddc97ae5c57720746e073a8508da1f7bbc3 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 22 Jul 2022 15:43:24 -0400 Subject: [PATCH 10/47] more test fixes --- pybamm/expression_tree/parameter.py | 4 ++-- pybamm/models/submodels/particle/base_particle.py | 2 +- pybamm/models/submodels/particle/polynomial_profile.py | 4 ++-- .../submodels/particle/x_averaged_polynomial_profile.py | 2 +- .../test_full_battery_models/test_lithium_ion/test_spm.py | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pybamm/expression_tree/parameter.py b/pybamm/expression_tree/parameter.py index 7b7d619da7..15de38b763 100644 --- a/pybamm/expression_tree/parameter.py +++ b/pybamm/expression_tree/parameter.py @@ -116,10 +116,10 @@ def __init__( parent_param = frame.f_locals["self"] except KeyError: parent_param = None - if hasattr(parent_param, "domain"): + if hasattr(parent_param, "domain") and parent_param.domain != None: # add "_n" or "_s" or "_p" if this comes from a Parameter class with # a domain - d = getattr(parent_param, "domain").lower()[0] + d = parent_param.domain.lower()[0] print_name += f"_{d}" self.print_name = print_name diff --git a/pybamm/models/submodels/particle/base_particle.py b/pybamm/models/submodels/particle/base_particle.py index 2b4c6571ef..5471ad0bf2 100644 --- a/pybamm/models/submodels/particle/base_particle.py +++ b/pybamm/models/submodels/particle/base_particle.py @@ -37,7 +37,7 @@ def _get_effective_diffusivity(self, c, T): # Get diffusivity D = phase_param.D(c, T) - # Account for stress-induced diffusion by defining a multiplicative + # Account for stress-induced difftusion by defining a multiplicative # "stress factor" stress_option = getattr(self.options, domain)["stress-induced diffusion"] diff --git a/pybamm/models/submodels/particle/polynomial_profile.py b/pybamm/models/submodels/particle/polynomial_profile.py index b1328c240c..3454124bab 100644 --- a/pybamm/models/submodels/particle/polynomial_profile.py +++ b/pybamm/models/submodels/particle/polynomial_profile.py @@ -237,7 +237,7 @@ def set_rhs(self, variables): # We solve an extra ODE for the average particle flux q_s_rav = variables[f"R-averaged {domain} particle concentration gradient"] c_s_rav = variables[f"R-averaged {domain} particle concentration"] - D_eff = variables[f"{Domain} effective diffusivity"] + D_eff = variables[f"{Domain} particle effective diffusivity"] self.rhs.update( { @@ -260,7 +260,7 @@ def set_algebraic(self, variables): c_s_surf = variables[f"{Domain} particle surface concentration"] c_s_rav = variables[f"R-averaged {domain} particle concentration"] - D_eff = variables[f"{Domain} effective diffusivity"] + D_eff = variables[f"{Domain} particle effective diffusivity"] j = variables[f"{Domain} electrode interfacial current density"] R = variables[f"{Domain} particle radius"] diff --git a/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py b/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py index d66329f8d1..33c6baf93f 100644 --- a/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py +++ b/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py @@ -251,7 +251,7 @@ def set_rhs(self, variables): if self.name == "quartic profile": # We solve an extra ODE for the average particle concentration gradient q_s_av = variables[f"Average {domain} particle concentration gradient"] - D_eff_xav = variables[f"X-averaged {domain} effective diffusivity"] + D_eff_xav = variables[f"X-averaged {domain} particle effective diffusivity"] self.rhs.update( { diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py index b88b1a3402..3f07707038 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py @@ -43,7 +43,7 @@ def test_new_model(self): {**options, "particle": "quadratic profile"}, "primary", ) - model.submodels["negative particle"] = particle_n + model.submodels["negative primary particle"] = particle_n model.build_model() new_model = model.new_copy() new_model_cs_eqn = list(new_model.rhs.values())[1] From 1afa5ba7b30c862252e82bc971845f39af2436d1 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Sun, 24 Jul 2022 19:42:15 -0400 Subject: [PATCH 11/47] working on print_name --- pybamm/expression_tree/parameter.py | 2 +- .../test_expression_tree/test_printing/test_print_name.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pybamm/expression_tree/parameter.py b/pybamm/expression_tree/parameter.py index 15de38b763..38056fba6a 100644 --- a/pybamm/expression_tree/parameter.py +++ b/pybamm/expression_tree/parameter.py @@ -116,7 +116,7 @@ def __init__( parent_param = frame.f_locals["self"] except KeyError: parent_param = None - if hasattr(parent_param, "domain") and parent_param.domain != None: + if hasattr(parent_param, "domain") and parent_param.domain is not None: # add "_n" or "_s" or "_p" if this comes from a Parameter class with # a domain d = parent_param.domain.lower()[0] diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index bc5a1c076c..2eb55f821f 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -22,10 +22,10 @@ def test_prettify_print_name(self): self.assertEqual(param.p.prim.a_R.print_name, r"a_{R\,p}") # Test dim and dimensional - # self.assertEqual( - # param.n.prim.j0_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}" - # ) - # self.assertEqual(param.n.C_dl_dimensional.print_name, r"\hat{C}_{dl\,n}") + self.assertEqual( + param.n.prim.j0_ref_dimensional.print_name, r"\hat{j0}_{n}^{ref}" + ) + self.assertEqual(param.n.C_dl_dimensional.print_name, r"\hat{C}_{dl\,n}") # Test bar self.assertEqual(param1.c_s_n_xav.print_name, r"\bar{c}_{s\,n}") From 550f43300573607e947e91dc132173a801a13615 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 29 Jul 2022 10:13:49 -0400 Subject: [PATCH 12/47] unit tests --- examples/notebooks/models/SEI-on-cracks.ipynb | 15 +++++++++------ .../lithium_ion/electrode_soh.py | 11 ++++++----- .../models/full_battery_models/lithium_ion/mpm.py | 4 ++-- .../interface/kinetics/total_kinetics.py | 5 +++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/examples/notebooks/models/SEI-on-cracks.ipynb b/examples/notebooks/models/SEI-on-cracks.ipynb index e93529d79d..71d70bd47e 100644 --- a/examples/notebooks/models/SEI-on-cracks.ipynb +++ b/examples/notebooks/models/SEI-on-cracks.ipynb @@ -20,9 +20,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.\n", - "You should consider upgrading via the '/home/sokane/PyBaMM/env/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", - "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" + "Note: you may need to restart the kernel to use updated packages.\n" ] } ], @@ -126,7 +124,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -197,7 +195,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3.8.12 ('conda_jl')", "language": "python", "name": "python3" }, @@ -211,7 +209,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.12" + }, + "vscode": { + "interpreter": { + "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" + } } }, "nbformat": 4, diff --git a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py index 01194515bc..4f87ca0426 100644 --- a/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py +++ b/pybamm/models/full_battery_models/lithium_ion/electrode_soh.py @@ -107,8 +107,8 @@ def __init__(self, name="ElectrodeSOHx100 model", param=None): param = param or pybamm.LithiumIonParameters() - Un = param.n.U_dimensional - Up = param.p.U_dimensional + Un = param.n.prim.U_dimensional + Up = param.p.prim.U_dimensional T_ref = param.T_ref n_Li = pybamm.InputParameter("n_Li") @@ -155,8 +155,8 @@ def __init__(self, name="ElectrodeSOHx0 model", param=None): param = param or pybamm.LithiumIonParameters() - Un = param.n.U_dimensional - Up = param.p.U_dimensional + Un = param.n.prim.U_dimensional + Up = param.p.prim.U_dimensional T_ref = param.T_ref n_Li = pybamm.InputParameter("n_Li") @@ -236,7 +236,8 @@ def __init__(self, parameter_values, param=None): x = pybamm.InputParameter("x") y = pybamm.InputParameter("y") self.OCV_function = parameter_values.process_symbol( - self.param.p.U_dimensional(y, T) - self.param.n.U_dimensional(x, T) + self.param.p.prim.U_dimensional(y, T) + - self.param.n.prim.U_dimensional(x, T) ) def create_electrode_soh_sims(self, parameter_values, param): diff --git a/pybamm/models/full_battery_models/lithium_ion/mpm.py b/pybamm/models/full_battery_models/lithium_ion/mpm.py index a4a89cb39d..1320d72932 100644 --- a/pybamm/models/full_battery_models/lithium_ion/mpm.py +++ b/pybamm/models/full_battery_models/lithium_ion/mpm.py @@ -67,11 +67,11 @@ def set_particle_submodel(self): for domain in ["negative", "positive"]: if self.options["particle"] == "Fickian diffusion": submod = pybamm.particle.FickianDiffusion( - self.param, domain, self.options, x_average=True + self.param, domain, self.options, x_average=True, phase="primary" ) elif self.options["particle"] == "uniform profile": submod = pybamm.particle.XAveragedPolynomialProfile( - self.param, domain, self.options + self.param, domain, self.options, phase="primary" ) self.submodels[f"{domain} particle"] = submod diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py index 9b0ca22e4b..1b2724d40c 100644 --- a/pybamm/models/submodels/interface/kinetics/total_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -32,11 +32,12 @@ def get_coupled_variables(self, variables): the reactions """ if self.chemistry == "lithium-ion": - reaction_names = ["", "SEI ", "SEI on cracks "] + reaction_names = ["", "SEI "] if not self.half_cell: # no separate plating reaction in a half-cell, # since plating is the main reaction - reaction_names.append("lithium plating ") + # no SEI on cracks with half-cell model + reaction_names.extend(["lithium plating ", "SEI on cracks "]) elif self.chemistry == "lead-acid": reaction_names = ["", "oxygen "] From df9c5822348ed45b70b5f48143c94c888eabb241 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Mon, 1 Aug 2022 23:58:20 +0530 Subject: [PATCH 13/47] Fix tests --- .../unit/test_expression_tree/test_printing/test_print_name.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index 2eb55f821f..387ac3fa30 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -28,7 +28,7 @@ def test_prettify_print_name(self): self.assertEqual(param.n.C_dl_dimensional.print_name, r"\hat{C}_{dl\,n}") # Test bar - self.assertEqual(param1.c_s_n_xav.print_name, r"\bar{c}_{s\,n}") + self.assertEqual(param1.c_e_av.print_name, r"\bar{c}_{e}") # Test greek letters self.assertEqual(param2.delta.print_name, r"\delta") From 5782ec0e2da93d4438c2a3acbda27be5f9eae673 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Mon, 1 Aug 2022 23:59:03 +0530 Subject: [PATCH 14/47] Add more print names --- pybamm/expression_tree/printing/print_name.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index cd3230a12a..b62f9dc0ef 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -53,8 +53,8 @@ def prettify_print_name(name): if name in PRINT_NAME_OVERRIDES: return PRINT_NAME_OVERRIDES[name] - # Superscripts with comma separated (U_n_ref --> U_{n}^{ref}) - sup_re = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?((?:n|s|p))", name) + # Superscripts with comma separated (U_ref_n --> U_{n}^{ref}) + sup_re = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?(.*)", name) if sup_re: sup_str = ( r"{" + sup_re.group(2).replace("_", "\,") + r"}^{" + sup_re.group(1) + r"}" @@ -62,6 +62,15 @@ def prettify_print_name(name): sup_var = sup_re.group(1) + "_" + sup_re.group(2) name = name.replace(sup_var, sup_str) + # Superscripts with comma separated (U_n_ref --> U_{n}^{ref}) + sup_re = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) + if sup_re: + sup_str = ( + r"{" + sup_re.group(1).replace("_", "\,") + r"}^{" + sup_re.group(2) + r"}" + ) + sup_var = sup_re.group(1) + "_" + sup_re.group(2) + name = name.replace(sup_var, sup_str) + # Subscripts with comma separated (a_R_p --> a_{R\,p}) sub_re = re.search(r"^a_+(\w+)", name) if sub_re: From 591127aff2ce6a977f77aa7fb9126fc6738cbe79 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Tue, 2 Aug 2022 00:27:31 +0530 Subject: [PATCH 15/47] Fix tests --- pybamm/expression_tree/printing/print_name.py | 16 ++++++++-------- .../test_printing/test_print_name.py | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index b62f9dc0ef..a988ff081c 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -54,21 +54,21 @@ def prettify_print_name(name): return PRINT_NAME_OVERRIDES[name] # Superscripts with comma separated (U_ref_n --> U_{n}^{ref}) - sup_re = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?(.*)", name) - if sup_re: + sup_re1 = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?(.*)", name) + if sup_re1: sup_str = ( - r"{" + sup_re.group(2).replace("_", "\,") + r"}^{" + sup_re.group(1) + r"}" + r"{" + sup_re1.group(2).replace("_", "\,") + r"}^{" + sup_re1.group(1) + r"}" ) - sup_var = sup_re.group(1) + "_" + sup_re.group(2) + sup_var = sup_re1.group(1) + "_" + sup_re1.group(2) name = name.replace(sup_var, sup_str) # Superscripts with comma separated (U_n_ref --> U_{n}^{ref}) - sup_re = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) - if sup_re: + sup_re2 = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) + if sup_re2: sup_str = ( - r"{" + sup_re.group(1).replace("_", "\,") + r"}^{" + sup_re.group(2) + r"}" + r"{" + sup_re2.group(1).replace("_", "\,") + r"}^{" + sup_re2.group(2) + r"}" ) - sup_var = sup_re.group(1) + "_" + sup_re.group(2) + sup_var = sup_re2.group(1) + "_" + sup_re2.group(2) name = name.replace(sup_var, sup_str) # Subscripts with comma separated (a_R_p --> a_{R\,p}) diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index 387ac3fa30..ca8d5a84d6 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -17,6 +17,7 @@ def test_prettify_print_name(self): # Test superscripts self.assertEqual(param.n.prim.U_ref.print_name, r"U_{n}^{ref}") + self.assertEqual(param.D_e_typ.print_name, r"D_{e}^{typ}") # Test subscripts self.assertEqual(param.p.prim.a_R.print_name, r"a_{R\,p}") From a4805ca6aa13a55098b7487c4046deb97f95beb8 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Tue, 2 Aug 2022 00:30:14 +0530 Subject: [PATCH 16/47] flake8 --- pybamm/expression_tree/printing/print_name.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index a988ff081c..de1ce19a4d 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -57,7 +57,11 @@ def prettify_print_name(name): sup_re1 = re.search(r"^[\da-zA-Z]+_?((?:init|ref|typ|max|0))_?(.*)", name) if sup_re1: sup_str = ( - r"{" + sup_re1.group(2).replace("_", "\,") + r"}^{" + sup_re1.group(1) + r"}" + r"{" + + sup_re1.group(2).replace("_", "\,") + + r"}^{" + + sup_re1.group(1) + + r"}" ) sup_var = sup_re1.group(1) + "_" + sup_re1.group(2) name = name.replace(sup_var, sup_str) @@ -66,7 +70,11 @@ def prettify_print_name(name): sup_re2 = re.search(r"^[\da-zA-Z]+_?(.*?)_?((?:init|ref|typ|max|0))", name) if sup_re2: sup_str = ( - r"{" + sup_re2.group(1).replace("_", "\,") + r"}^{" + sup_re2.group(2) + r"}" + r"{" + + sup_re2.group(1).replace("_", "\,") + + r"}^{" + + sup_re2.group(2) + + r"}" ) sup_var = sup_re2.group(1) + "_" + sup_re2.group(2) name = name.replace(sup_var, sup_str) From 735ab9f91acd307d8e397cd371795a697c485478 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 3 Aug 2022 11:38:39 -0400 Subject: [PATCH 17/47] remove init to be in line with develop --- tests/unit/test_expression_tree/test_printing/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/unit/test_expression_tree/test_printing/__init__.py diff --git a/tests/unit/test_expression_tree/test_printing/__init__.py b/tests/unit/test_expression_tree/test_printing/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 9bed19065874c48c85d1a41da9693cbec8f59e81 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 3 Aug 2022 12:56:33 -0400 Subject: [PATCH 18/47] test fix? --- pybamm/expression_tree/printing/print_name.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pybamm/expression_tree/printing/print_name.py b/pybamm/expression_tree/printing/print_name.py index de1ce19a4d..5d250a29bb 100644 --- a/pybamm/expression_tree/printing/print_name.py +++ b/pybamm/expression_tree/printing/print_name.py @@ -119,4 +119,7 @@ def prettify_print_name(name): greek_re = r"(? Date: Wed, 3 Aug 2022 13:32:56 -0400 Subject: [PATCH 19/47] debugging --- .../notebooks/models/using-submodels.ipynb | 6 ++--- examples/scripts/compare_lithium_ion.py | 10 +++---- examples/scripts/custom_model.py | 12 ++++----- .../lithium_ion/base_lithium_ion_model.py | 18 +++++++++---- .../full_battery_models/lithium_ion/spm.py | 8 +++--- .../submodels/interface/base_interface.py | 14 ++++++++-- .../interface/kinetics/base_kinetics.py | 2 +- .../interface/kinetics/total_kinetics.py | 4 --- .../particle_mechanics/base_mechanics.py | 26 ++++++++++++------- .../particle_mechanics/crack_propagation.py | 9 +++++-- .../particle_mechanics/no_mechanics.py | 9 +++++-- .../particle_mechanics/swelling_only.py | 9 +++++-- 12 files changed, 82 insertions(+), 45 deletions(-) diff --git a/examples/notebooks/models/using-submodels.ipynb b/examples/notebooks/models/using-submodels.ipynb index 2ee317e4dd..fccff4c859 100644 --- a/examples/notebooks/models/using-submodels.ipynb +++ b/examples/notebooks/models/using-submodels.ipynb @@ -480,10 +480,10 @@ "source": [ "model.submodels[\n", " \"Negative particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\")\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options, \"primary\")\n", "model.submodels[\n", " \"Positive particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\")\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options, \"primary\")\n", "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" @@ -624,7 +624,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.12" }, "toc": { "base_numbering": 1, diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 3ee7b2095e..f54735ac58 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -3,14 +3,14 @@ # import pybamm -pybamm.set_logging_level("DEBUG") +pybamm.set_logging_level("INFO") # load models models = [ - pybamm.lithium_ion.SPM(), - pybamm.lithium_ion.SPMe(), - pybamm.lithium_ion.DFN(), - pybamm.lithium_ion.NewmanTobias(), + pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), + # pybamm.lithium_ion.SPMe(), + # pybamm.lithium_ion.DFN(), + # pybamm.lithium_ion.NewmanTobias(), ] # create and run simulations diff --git a/examples/scripts/custom_model.py b/examples/scripts/custom_model.py index 10cc27dfe2..d01694c027 100644 --- a/examples/scripts/custom_model.py +++ b/examples/scripts/custom_model.py @@ -86,12 +86,12 @@ ] = pybamm.electrolyte_conductivity.surface_potential_form.Explicit( model.param, "Positive" ) -model.submodels[ - "Negative particle mechanics" -] = pybamm.particle_mechanics.NoMechanics(model.param, "Negative") -model.submodels[ - "Positive particle mechanics" -] = pybamm.particle_mechanics.NoMechanics(model.param, "Positive") +model.submodels["Negative particle mechanics"] = pybamm.particle_mechanics.NoMechanics( + model.param, "Negative", model.options, "primary" +) +model.submodels["Positive particle mechanics"] = pybamm.particle_mechanics.NoMechanics( + model.param, "Positive", model.options, "primary" +) model.submodels["sei"] = pybamm.sei.NoSEI(model.param) model.submodels["sei on cracks"] = pybamm.sei.NoSEI(model.param, cracks=True) model.submodels["lithium plating"] = pybamm.lithium_plating.NoPlating(model.param) diff --git a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py index 98e494faf0..c35268e874 100644 --- a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py +++ b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py @@ -296,7 +296,7 @@ def set_lithium_plating_submodel(self): self.param, self.options ) else: - x_average = (self.options["x-average side reactions"] == "true") + x_average = self.options["x-average side reactions"] == "true" self.submodels["lithium plating"] = pybamm.lithium_plating.Plating( self.param, x_average, self.options ) @@ -312,16 +312,24 @@ def set_crack_submodel(self): if crack == "none": self.submodels[ domain.lower() + " particle mechanics" - ] = pybamm.particle_mechanics.NoMechanics(self.param, domain) + ] = pybamm.particle_mechanics.NoMechanics( + self.param, domain, options=self.options, phase="primary" + ) elif crack == "swelling only": self.submodels[ domain.lower() + " particle mechanics" - ] = pybamm.particle_mechanics.SwellingOnly(self.param, domain) + ] = pybamm.particle_mechanics.SwellingOnly( + self.param, domain, options=self.options, phase="primary" + ) elif crack == "swelling and cracking": self.submodels[ domain.lower() + " particle mechanics" ] = pybamm.particle_mechanics.CrackPropagation( - self.param, domain, self.x_average + self.param, + domain, + self.x_average, + options=self.options, + phase="primary", ) def set_active_material_submodel(self): @@ -359,7 +367,7 @@ def set_porosity_submodel(self): self.options["SEI porosity change"] == "true" or self.options["lithium plating porosity change"] == "true" ): - x_average = (self.options["x-average side reactions"] == "true") + x_average = self.options["x-average side reactions"] == "true" self.submodels["porosity"] = pybamm.porosity.ReactionDriven( self.param, self.options, x_average ) diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index 0c246428c8..18c92dd190 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -51,10 +51,10 @@ def __init__(self, options=None, name="Single Particle Model", build=True): # Set "x-average side reactions" to "true" if the model is SPM x_average_side_reactions = options.get("x-average side reactions") - if ( - x_average_side_reactions is None - and self.__class__ in [pybamm.lithium_ion.SPM, pybamm.lithium_ion.MPM] - ): + if x_average_side_reactions is None and self.__class__ in [ + pybamm.lithium_ion.SPM, + pybamm.lithium_ion.MPM, + ]: options["x-average side reactions"] = "true" super().__init__(options, name) diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index d50da3fe6f..fddb3cc848 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -286,9 +286,19 @@ def _get_standard_volumetric_current_density_variables(self, variables): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name + phase_name = self.phase_name - a = variables[f"{Domain} electrode surface area to volume ratio"] - a_av = variables[f"X-averaged {domain} electrode surface area to volume ratio"] + if isinstance(self, pybamm.kinetics.NoReaction): + a = 1 + a_av = 1 + else: + a = variables[ + f"{Domain} electrode {phase_name}surface area to volume ratio" + ] + a_av = variables[ + f"X-averaged {domain} electrode {phase_name}" + "surface area to volume ratio" + ] j = variables[f"{Domain} electrode {reaction_name}interfacial current density"] j_av = variables[ f"X-averaged {domain} electrode {reaction_name}interfacial current density" diff --git a/pybamm/models/submodels/interface/kinetics/base_kinetics.py b/pybamm/models/submodels/interface/kinetics/base_kinetics.py index c018444a14..6f0db9bdd2 100644 --- a/pybamm/models/submodels/interface/kinetics/base_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/base_kinetics.py @@ -26,7 +26,7 @@ class BaseKinetics(BaseInterface): **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, reaction, options, phase="primary"): + def __init__(self, param, domain, reaction, options, phase): super().__init__(param, domain, reaction, options=options, phase=phase) def get_fundamental_variables(self): diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_kinetics.py index 49dc4d19eb..1b2724d40c 100644 --- a/pybamm/models/submodels/interface/kinetics/total_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/total_kinetics.py @@ -113,11 +113,7 @@ def get_coupled_variables(self, variables): if reaction_name not in ["SEI ", "SEI on cracks ", "lithium plating "]: j0_p = variables[ -<<<<<<< HEAD - f"Positive electrode {reaction_p}exchange current density" -======= f"Positive electrode {reaction_name}exchange current density" ->>>>>>> issue-2026-total-reaction ] j0_p_dim = variables[ f"Positive electrode {reaction_name}" diff --git a/pybamm/models/submodels/particle_mechanics/base_mechanics.py b/pybamm/models/submodels/particle_mechanics/base_mechanics.py index 837ef97ab9..89a9036b7b 100644 --- a/pybamm/models/submodels/particle_mechanics/base_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/base_mechanics.py @@ -15,6 +15,11 @@ class BaseMechanics(pybamm.BaseSubModel): The parameters to use for this submodel domain : dict, optional Dictionary of either the electrode for "Positive" or "Nagative" + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -28,8 +33,8 @@ class BaseMechanics(pybamm.BaseSubModel): **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain): - super().__init__(param, domain) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options=options, phase=phase) pybamm.citations.register("Ai2019") pybamm.citations.register("Deshpande2012") @@ -129,8 +134,12 @@ def _get_standard_surface_variables(self, variables): variables : dict The variables which can be derived from the crack length. """ - l_cr = variables[self.domain + " particle crack length"] - a0 = variables[self.domain + " electrode surface area to volume ratio"] + Domain = self.domain + domain = Domain.lower() + phase_name = self.phase_name + + l_cr = variables[f"{Domain} particle crack length"] + a0 = variables[f"{Domain} electrode {phase_name}surface area to volume ratio"] R0 = self.domain_param.prim.R rho_cr = self.domain_param.rho_cr roughness = l_cr * 2 * rho_cr + 1 # the ratio of cracks to normal surface @@ -139,10 +148,9 @@ def _get_standard_surface_variables(self, variables): roughness_xavg = pybamm.x_average(roughness) variables = { - self.domain + " crack surface to volume ratio [m-1]": a_cr_dim, - self.domain + " crack surface to volume ratio": a_cr, - self.domain + " electrode roughness ratio": roughness, - f"X-averaged {self.domain.lower()} " - "electrode roughness ratio": roughness_xavg, + f"{Domain} crack surface to volume ratio [m-1]": a_cr_dim, + f"{Domain} crack surface to volume ratio": a_cr, + f"{Domain} electrode roughness ratio": roughness, + f"X-averaged {domain} electrode roughness ratio": roughness_xavg, } return variables diff --git a/pybamm/models/submodels/particle_mechanics/crack_propagation.py b/pybamm/models/submodels/particle_mechanics/crack_propagation.py index cc9d0120fa..fa39793d94 100644 --- a/pybamm/models/submodels/particle_mechanics/crack_propagation.py +++ b/pybamm/models/submodels/particle_mechanics/crack_propagation.py @@ -18,6 +18,11 @@ class CrackPropagation(BaseMechanics): The domain of the model either 'Negative' or 'Positive' x_average : bool Whether to use x-averaged variables (SPM, SPMe, etc) or full variables (DFN) + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle References ---------- @@ -28,8 +33,8 @@ class CrackPropagation(BaseMechanics): **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain, x_average): - super().__init__(param, domain) + def __init__(self, param, domain, x_average, options, phase): + super().__init__(param, domain, options, phase) self.x_average = x_average def get_fundamental_variables(self): diff --git a/pybamm/models/submodels/particle_mechanics/no_mechanics.py b/pybamm/models/submodels/particle_mechanics/no_mechanics.py index 5715eafbfe..7d3f219759 100644 --- a/pybamm/models/submodels/particle_mechanics/no_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/no_mechanics.py @@ -15,12 +15,17 @@ class NoMechanics(BaseMechanics): The parameters to use for this submodel domain : str The domain of the model either 'Negative' or 'Positive' + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain): - super().__init__(param, domain) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): zero = pybamm.FullBroadcast( diff --git a/pybamm/models/submodels/particle_mechanics/swelling_only.py b/pybamm/models/submodels/particle_mechanics/swelling_only.py index bc755a3451..937ecdcb54 100644 --- a/pybamm/models/submodels/particle_mechanics/swelling_only.py +++ b/pybamm/models/submodels/particle_mechanics/swelling_only.py @@ -15,12 +15,17 @@ class SwellingOnly(BaseMechanics): The parameters to use for this submodel domain : str The domain of the model either 'Negative' or 'Positive' + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + phase : str + Phase of the particle **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain): - super().__init__(param, domain) + def __init__(self, param, domain, options, phase): + super().__init__(param, domain, options, phase) def get_fundamental_variables(self): zero = pybamm.FullBroadcast( From cbabe834f15808a875835ab4ee34f92c1a06fb48 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 11 Aug 2022 10:03:54 +0200 Subject: [PATCH 20/47] SPM with two phases builds --- .../notebooks/models/using-submodels.ipynb | 1296 ++++++++--------- .../lead_acid/base_lead_acid_model.py | 4 +- .../full_battery_models/lead_acid/full.py | 2 +- .../lead_acid/higher_order.py | 2 +- .../full_battery_models/lead_acid/loqs.py | 2 +- .../lithium_ion/base_lithium_ion_model.py | 6 +- .../full_battery_models/lithium_ion/spm.py | 6 + pybamm/models/submodels/interface/__init__.py | 1 + .../submodels/interface/kinetics/__init__.py | 4 +- .../interface/kinetics/total_main_kinetics.py | 115 ++ ...netics.py => total_interfacial_current.py} | 6 +- 11 files changed, 782 insertions(+), 662 deletions(-) create mode 100644 pybamm/models/submodels/interface/kinetics/total_main_kinetics.py rename pybamm/models/submodels/interface/{kinetics/total_kinetics.py => total_interfacial_current.py} (98%) diff --git a/examples/notebooks/models/using-submodels.ipynb b/examples/notebooks/models/using-submodels.ipynb index fccff4c859..d17dfdc91a 100644 --- a/examples/notebooks/models/using-submodels.ipynb +++ b/examples/notebooks/models/using-submodels.ipynb @@ -1,650 +1,650 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using submodels in PyBaMM\n", - "In this notebook we show how to modify existing models by swapping out submodels, and how to build your own model from scratch using existing submodels. To see all of the models and submodels available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/models/index.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Changing a submodel in an exisiting battery model\n", - "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](./models/SPM.ipynb)). \n", - "\n", - "First we import pybamm" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we load the SPM" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.SPM()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can look at the submodels that make up the SPM by accessing `model.submodels`, which is a dictionary of the submodel's name (i.e. the physics it represents) and the submodel that is selected" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external circuit \n", - "porosity \n", - "negative interface utilisation \n", - "positive interface utilisation \n", - "negative active material \n", - "positive active material \n", - "electrolyte transport efficiency \n", - "electrode transport efficiency \n", - "through-cell convection \n", - "transverse convection \n", - "negative open circuit potential \n", - "positive open circuit potential \n", - "negative interface \n", - "positive interface \n", - "negative interface current \n", - "positive interface current \n", - "negative particle \n", - "positive particle \n", - "negative electrode potential \n", - "positive electrode potential \n", - "leading-order electrolyte conductivity \n", - "negative surface potential difference \n", - "positive surface potential difference \n", - "electrolyte diffusion \n", - "thermal \n", - "current collector \n", - "sei \n", - "lithium plating \n", - "total interface \n" - ] - } - ], - "source": [ - "for name, submodel in model.submodels.items():\n", - " print(name, submodel)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you load a model in PyBaMM it builds by default. Building the model sets all of the model variables and sets up any variables which are coupled between different submodels: this is the process which couples the submodels together and allows one submodel to access variables from another. If you would like to swap out a submodel in an existing battery model you need to load it without building it by passing the keyword `build=False`" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.SPM(build=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This collects all of the submodels which make up the SPM, but doesn't build the model. Now you are free to swap out one submodel for another. For instance, you may want to assume that diffusion within the negative particles is infinitely fast, so that the PDE describing diffusion is replaced with an ODE for the uniform particle concentration. To change a submodel you simply update the dictionary entry, in this case to the `XAveragedPolynomialProfile` submodel" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(\n", - " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "where we pass in the model parameters, the electrode (negative or positive) the submodel corresponds to, and the name of the polynomial we want to use. In the example we assume uniform concentration within the particle, corresponding to a zero-order polynomial." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if we look at the submodels again we see that the model for the negative particle has been changed" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external circuit \n", - "porosity \n", - "negative interface utilisation \n", - "positive interface utilisation \n", - "negative active material \n", - "positive active material \n", - "electrolyte transport efficiency \n", - "electrode transport efficiency \n", - "through-cell convection \n", - "transverse convection \n", - "negative open circuit potential \n", - "positive open circuit potential \n", - "negative interface \n", - "positive interface \n", - "negative interface current \n", - "positive interface current \n", - "negative particle \n", - "positive particle \n", - "negative electrode potential \n", - "positive electrode potential \n", - "leading-order electrolyte conductivity \n", - "negative surface potential difference \n", - "positive surface potential difference \n", - "electrolyte diffusion \n", - "thermal \n", - "current collector \n", - "sei \n", - "lithium plating \n", - "total interface \n" - ] - } - ], - "source": [ - "for name, submodel in model.submodels.items():\n", - " print(name, submodel)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Building the model also sets up the equations, boundary and initial conditions for the model. For example, if we look at `model.rhs` before building we see that it is empty " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we try to use this empty model, PyBaMM will give an error. So, before proceeding we must build the model" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "model.build_model()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if we look at `model.rhs` we see that it contains an entry relating to the concentration in each particle, as expected for the SPM" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{Variable(-0x4b0b269084f8a9c1, Discharge capacity [A.h], children=[], domains={}): Division(0x704fc9d8b071d981, /, children=['Current function [A] * 96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))', '3600.0'], domains={}),\n", - " Variable(0x590e79b37031c600, Average negative particle concentration, children=[], domains={'primary': ['current collector']}): MatrixMultiplication(0x167f327ce6113b29, @, children=['mass(Average negative particle concentration)', '-3.0 * (Current function [A] / Typical current [A]) * sign(Typical current [A]) / ((3.0 * x-average(Negative electrode active material volume fraction) / x-average(Negative particle radius [m]) / (3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m])))) * Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m])) / ((3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m]))) * yz-average(x-average(Negative particle radius [m])))'], domains={'primary': ['current collector']}),\n", - " Variable(0x789277e6f3450770, X-averaged positive particle concentration, children=[], domains={'primary': ['positive particle'], 'secondary': ['current collector']}): Multiplication(-0x7cc78dcd6ab6fd8a, *, children=['1.0 / ((yz-average(x-average(Positive particle radius [m])) ** 2.0) / Positive electrode diffusivity [m2.s-1] / (96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))))', 'div((Positive electrode diffusivity [m2.s-1] / Positive electrode diffusivity [m2.s-1]) * grad(X-averaged positive particle concentration))'], domains={'primary': ['positive particle'], 'secondary': ['current collector']})}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the model can be used in a simulation and solved in the usual way, and we still have access to model defaults such as the default geometry and default spatial methods which are used in the simulation" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9e7b0bdbd39b46b0a2129ff89eb9cffe", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using submodels in PyBaMM\n", + "In this notebook we show how to modify existing models by swapping out submodels, and how to build your own model from scratch using existing submodels. To see all of the models and submodels available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/models/index.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Changing a submodel in an exisiting battery model\n", + "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](./models/SPM.ipynb)). \n", + "\n", + "First we import pybamm" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we load the SPM" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.SPM()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can look at the submodels that make up the SPM by accessing `model.submodels`, which is a dictionary of the submodel's name (i.e. the physics it represents) and the submodel that is selected" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "external circuit \n", + "porosity \n", + "negative interface utilisation \n", + "positive interface utilisation \n", + "negative active material \n", + "positive active material \n", + "electrolyte transport efficiency \n", + "electrode transport efficiency \n", + "through-cell convection \n", + "transverse convection \n", + "negative open circuit potential \n", + "positive open circuit potential \n", + "negative interface \n", + "positive interface \n", + "negative interface current \n", + "positive interface current \n", + "negative particle \n", + "positive particle \n", + "negative electrode potential \n", + "positive electrode potential \n", + "leading-order electrolyte conductivity \n", + "negative surface potential difference \n", + "positive surface potential difference \n", + "electrolyte diffusion \n", + "thermal \n", + "current collector \n", + "sei \n", + "lithium plating \n", + "total interface \n" + ] + } + ], + "source": [ + "for name, submodel in model.submodels.items():\n", + " print(name, submodel)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you load a model in PyBaMM it builds by default. Building the model sets all of the model variables and sets up any variables which are coupled between different submodels: this is the process which couples the submodels together and allows one submodel to access variables from another. If you would like to swap out a submodel in an existing battery model you need to load it without building it by passing the keyword `build=False`" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.SPM(build=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This collects all of the submodels which make up the SPM, but doesn't build the model. Now you are free to swap out one submodel for another. For instance, you may want to assume that diffusion within the negative particles is infinitely fast, so that the PDE describing diffusion is replaced with an ODE for the uniform particle concentration. To change a submodel you simply update the dictionary entry, in this case to the `XAveragedPolynomialProfile` submodel" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(\n", + " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where we pass in the model parameters, the electrode (negative or positive) the submodel corresponds to, and the name of the polynomial we want to use. In the example we assume uniform concentration within the particle, corresponding to a zero-order polynomial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if we look at the submodels again we see that the model for the negative particle has been changed" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "external circuit \n", + "porosity \n", + "negative interface utilisation \n", + "positive interface utilisation \n", + "negative active material \n", + "positive active material \n", + "electrolyte transport efficiency \n", + "electrode transport efficiency \n", + "through-cell convection \n", + "transverse convection \n", + "negative open circuit potential \n", + "positive open circuit potential \n", + "negative interface \n", + "positive interface \n", + "negative interface current \n", + "positive interface current \n", + "negative particle \n", + "positive particle \n", + "negative electrode potential \n", + "positive electrode potential \n", + "leading-order electrolyte conductivity \n", + "negative surface potential difference \n", + "positive surface potential difference \n", + "electrolyte diffusion \n", + "thermal \n", + "current collector \n", + "sei \n", + "lithium plating \n", + "total interface \n" + ] + } + ], + "source": [ + "for name, submodel in model.submodels.items():\n", + " print(name, submodel)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Building the model also sets up the equations, boundary and initial conditions for the model. For example, if we look at `model.rhs` before building we see that it is empty " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.rhs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we try to use this empty model, PyBaMM will give an error. So, before proceeding we must build the model" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model.build_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if we look at `model.rhs` we see that it contains an entry relating to the concentration in each particle, as expected for the SPM" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{Variable(-0x4b0b269084f8a9c1, Discharge capacity [A.h], children=[], domains={}): Division(0x704fc9d8b071d981, /, children=['Current function [A] * 96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))', '3600.0'], domains={}),\n", + " Variable(0x590e79b37031c600, Average negative particle concentration, children=[], domains={'primary': ['current collector']}): MatrixMultiplication(0x167f327ce6113b29, @, children=['mass(Average negative particle concentration)', '-3.0 * (Current function [A] / Typical current [A]) * sign(Typical current [A]) / ((3.0 * x-average(Negative electrode active material volume fraction) / x-average(Negative particle radius [m]) / (3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m])))) * Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m])) / ((3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m]))) * yz-average(x-average(Negative particle radius [m])))'], domains={'primary': ['current collector']}),\n", + " Variable(0x789277e6f3450770, X-averaged positive particle concentration, children=[], domains={'primary': ['positive particle'], 'secondary': ['current collector']}): Multiplication(-0x7cc78dcd6ab6fd8a, *, children=['1.0 / ((yz-average(x-average(Positive particle radius [m])) ** 2.0) / Positive electrode diffusivity [m2.s-1] / (96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))))', 'div((Positive electrode diffusivity [m2.s-1] / Positive electrode diffusivity [m2.s-1]) * grad(X-averaged positive particle concentration))'], domains={'primary': ['positive particle'], 'secondary': ['current collector']})}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.rhs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the model can be used in a simulation and solved in the usual way, and we still have access to model defaults such as the default geometry and default spatial methods which are used in the simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9e7b0bdbd39b46b0a2129ff89eb9cffe", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = pybamm.Simulation(model)\n", + "simulation.solve([0, 3600])\n", + "simulation.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building a custom model from submodels\n", + "Instead of editing a pre-existing model, you may wish to build your own model from scratch by combining existing submodels of you choice. In this section, we build a Single Particle Model in which the diffusion is assumed infinitely fast in both particles. \n", + "\n", + "To begin, we load a base lithium-ion model. This sets up the basic model structure behind the scenes, and also sets the default parameters to be those corresponding to a lithium-ion battery. Note that the base model does not select any default submodels, so there is no need to pass `build=False`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.BaseModel()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Submodels can be added to the `model.submodels` dictionary in the same way that we changed the submodels earlier. \n", + "\n", + "We use the simplest model for the external circuit, which is the explicit \"current control\" submodel" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"external circuit\"] = pybamm.external_circuit.ExplicitCurrentControl(model.param, model.options)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to build a 1D model, so select the `Uniform` current collector model (if the current collectors are behaving uniformly, then a 1D model is appropriate). We also want the model to be isothermal, so select the thermal model accordingly. Further, we assume that the porosity and active material are constant in space and time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"current collector\"] = pybamm.current_collector.Uniform(model.param)\n", + "model.submodels[\"thermal\"] = pybamm.thermal.isothermal.Isothermal(model.param)\n", + "model.submodels[\"porosity\"] = pybamm.porosity.Constant(model.param, model.options)\n", + "model.submodels[\"negative active material\"] = pybamm.active_material.Constant(\n", + " model.param, \"Negative\", model.options\n", + ")\n", + "model.submodels[\"positive active material\"] = pybamm.active_material.Constant(\n", + " model.param, \"Positive\", model.options\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We assume that the current density varies linearly in the electrodes. This corresponds the the leading-order terms in Ohm's law in the limit in which the SPM is derived in [[3]](#References)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"negative electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", + " model.param, \"Negative\"\n", + ")\n", + "model.submodels[\"positive electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", + " model.param, \"Positive\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We assume uniform concentration in both the negative and positive particles " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "options = {**model.options, \"particle\": \"uniform profile\"}\n", + "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options)\n", + "model.submodels[\"positive particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the Single Particle Model, the overpotential can be obtained by inverting the Butler-Volmer relation, so we choose the `InverseButlerVolmer` submodel for the interface, with the \"main\" lithium-ion reaction (and default lithium ion options). Because of how the current is implemented, we also need to separately specify the `CurrentForInverseButlerVolmer` submodel. We also need to specify the submodel for open-circuit potential." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\n", + " \"negative open circuit potential\"\n", + "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", + " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"positive open circuit potential\"\n", + "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", + " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"negative interface\"\n", + "] = pybamm.kinetics.InverseButlerVolmer(\n", + " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"positive interface\"\n", + "] = pybamm.kinetics.InverseButlerVolmer(\n", + " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"negative interface current\"\n", + "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", + " model.param, \"Negative\", \"lithium-ion main\"\n", + ")\n", + "model.submodels[\n", + " \"positive interface current\"\n", + "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", + " model.param, \"Positive\", \"lithium-ion main\"\n", + ")\n", + "model.submodels[\"negative interface utilisation\"] = pybamm.interface_utilisation.Full(\n", + " model.param, \"Negative\", model.options\n", + ")\n", + "model.submodels[\"positive interface utilisation\"] = pybamm.interface_utilisation.Full(\n", + " model.param, \"Positive\", model.options\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We don't want any particle mechanics, SEI formation or lithium plating in this model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\n", + " \"Negative particle mechanics\"\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options, \"primary\")\n", + "model.submodels[\n", + " \"Positive particle mechanics\"\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options, \"primary\")\n", + "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", + "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", + "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, for the electrolyte we assume that diffusion is infinitely fast so that the concentration is uniform, and also use the leading-order model for charge conservation, which leads to a linear variation in ionic current in the electrodes" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"electrolyte diffusion\"] = pybamm.electrolyte_diffusion.ConstantConcentration(\n", + " model.param\n", + ")\n", + "model.submodels[\"electrolyte conductivity\"] = pybamm.electrolyte_conductivity.LeadingOrder(\n", + " model.param\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have set all of the submodels we can build the model" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "model.build_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then use the model in a simulation in the usual way" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fd40a5d4f51f45c6b7f552355bdfe452", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = pybamm.Simulation(model)\n", + "simulation.solve([0, 3600])\n", + "simulation.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[4] Venkat R. Subramanian, Vinten D. Diwakar, and Deepak Tapriyal. Efficient macro-micro scale coupled modeling of batteries. Journal of The Electrochemical Society, 152(10):A2002, 2005. doi:10.1149/1.2032427.\n", + "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" + } + } }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation = pybamm.Simulation(model)\n", - "simulation.solve([0, 3600])\n", - "simulation.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Building a custom model from submodels\n", - "Instead of editing a pre-existing model, you may wish to build your own model from scratch by combining existing submodels of you choice. In this section, we build a Single Particle Model in which the diffusion is assumed infinitely fast in both particles. \n", - "\n", - "To begin, we load a base lithium-ion model. This sets up the basic model structure behind the scenes, and also sets the default parameters to be those corresponding to a lithium-ion battery. Note that the base model does not select any default submodels, so there is no need to pass `build=False`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.BaseModel()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Submodels can be added to the `model.submodels` dictionary in the same way that we changed the submodels earlier. \n", - "\n", - "We use the simplest model for the external circuit, which is the explicit \"current control\" submodel" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"external circuit\"] = pybamm.external_circuit.ExplicitCurrentControl(model.param, model.options)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to build a 1D model, so select the `Uniform` current collector model (if the current collectors are behaving uniformly, then a 1D model is appropriate). We also want the model to be isothermal, so select the thermal model accordingly. Further, we assume that the porosity and active material are constant in space and time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"current collector\"] = pybamm.current_collector.Uniform(model.param)\n", - "model.submodels[\"thermal\"] = pybamm.thermal.isothermal.Isothermal(model.param)\n", - "model.submodels[\"porosity\"] = pybamm.porosity.Constant(model.param, model.options)\n", - "model.submodels[\"negative active material\"] = pybamm.active_material.Constant(\n", - " model.param, \"Negative\", model.options\n", - ")\n", - "model.submodels[\"positive active material\"] = pybamm.active_material.Constant(\n", - " model.param, \"Positive\", model.options\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We assume that the current density varies linearly in the electrodes. This corresponds the the leading-order terms in Ohm's law in the limit in which the SPM is derived in [[3]](#References)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"negative electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", - " model.param, \"Negative\"\n", - ")\n", - "model.submodels[\"positive electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", - " model.param, \"Positive\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We assume uniform concentration in both the negative and positive particles " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "options = {**model.options, \"particle\": \"uniform profile\"}\n", - "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options)\n", - "model.submodels[\"positive particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the Single Particle Model, the overpotential can be obtained by inverting the Butler-Volmer relation, so we choose the `InverseButlerVolmer` submodel for the interface, with the \"main\" lithium-ion reaction (and default lithium ion options). Because of how the current is implemented, we also need to separately specify the `CurrentForInverseButlerVolmer` submodel. We also need to specify the submodel for open-circuit potential." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\n", - " \"negative open circuit potential\"\n", - "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"positive open circuit potential\"\n", - "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"negative interface\"\n", - "] = pybamm.kinetics.InverseButlerVolmer(\n", - " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"positive interface\"\n", - "] = pybamm.kinetics.InverseButlerVolmer(\n", - " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"negative interface current\"\n", - "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", - " model.param, \"Negative\", \"lithium-ion main\"\n", - ")\n", - "model.submodels[\n", - " \"positive interface current\"\n", - "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", - " model.param, \"Positive\", \"lithium-ion main\"\n", - ")\n", - "model.submodels[\"negative interface utilisation\"] = pybamm.interface_utilisation.Full(\n", - " model.param, \"Negative\", model.options\n", - ")\n", - "model.submodels[\"positive interface utilisation\"] = pybamm.interface_utilisation.Full(\n", - " model.param, \"Positive\", model.options\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We don't want any particle mechanics, SEI formation or lithium plating in this model" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\n", - " \"Negative particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options, \"primary\")\n", - "model.submodels[\n", - " \"Positive particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options, \"primary\")\n", - "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", - "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", - "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, for the electrolyte we assume that diffusion is infinitely fast so that the concentration is uniform, and also use the leading-order model for charge conservation, which leads to a linear variation in ionic current in the electrodes" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"electrolyte diffusion\"] = pybamm.electrolyte_diffusion.ConstantConcentration(\n", - " model.param\n", - ")\n", - "model.submodels[\"electrolyte conductivity\"] = pybamm.electrolyte_conductivity.LeadingOrder(\n", - " model.param\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have set all of the submodels we can build the model" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "model.build_model()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then use the model in a simulation in the usual way" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fd40a5d4f51f45c6b7f552355bdfe452", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation = pybamm.Simulation(model)\n", - "simulation.solve([0, 3600])\n", - "simulation.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[4] Venkat R. Subramanian, Vinten D. Diwakar, and Deepak Tapriyal. Efficient macro-micro scale coupled modeling of batteries. Journal of The Electrochemical Society, 152(10):A2002, 2005. doi:10.1149/1.2032427.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - }, - "vscode": { - "interpreter": { - "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py index 4c62cb188b..d4cf410895 100644 --- a/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py +++ b/pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py @@ -110,7 +110,7 @@ def set_lithium_plating_submodel(self): self.submodels["lithium plating"] = pybamm.lithium_plating.NoPlating(self.param) - def set_total_kinetics_submodel(self): - self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + def set_total_interface_submodel(self): + self.submodels["total interface"] = pybamm.interface.TotalInterfacialCurrent( self.param, "lead-acid", self.options ) diff --git a/pybamm/models/full_battery_models/lead_acid/full.py b/pybamm/models/full_battery_models/lead_acid/full.py index 86849ea48f..9f9ea760ba 100644 --- a/pybamm/models/full_battery_models/lead_acid/full.py +++ b/pybamm/models/full_battery_models/lead_acid/full.py @@ -51,7 +51,7 @@ def __init__(self, options=None, name="Full model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() - self.set_total_kinetics_submodel() + self.set_total_interface_submodel() if build: self.build_model() diff --git a/pybamm/models/full_battery_models/lead_acid/higher_order.py b/pybamm/models/full_battery_models/lead_acid/higher_order.py index 28aa9d555b..27a6d10f11 100644 --- a/pybamm/models/full_battery_models/lead_acid/higher_order.py +++ b/pybamm/models/full_battery_models/lead_acid/higher_order.py @@ -59,7 +59,7 @@ def __init__(self, options=None, name="Composite model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() - self.set_total_kinetics_submodel() + self.set_total_interface_submodel() if build: self.build_model() diff --git a/pybamm/models/full_battery_models/lead_acid/loqs.py b/pybamm/models/full_battery_models/lead_acid/loqs.py index 9fa28a25cb..9578a17c33 100644 --- a/pybamm/models/full_battery_models/lead_acid/loqs.py +++ b/pybamm/models/full_battery_models/lead_acid/loqs.py @@ -50,7 +50,7 @@ def __init__(self, options=None, name="LOQS model", build=True): self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() - self.set_total_kinetics_submodel() + self.set_total_interface_submodel() if build: self.build_model() diff --git a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py index c35268e874..501291fcac 100644 --- a/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py +++ b/pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py @@ -71,7 +71,7 @@ def set_submodels(self, build): self.set_sei_submodel() self.set_lithium_plating_submodel() - self.set_total_kinetics_submodel() + self.set_total_interface_submodel() self.set_standard_output_variables() @@ -301,8 +301,8 @@ def set_lithium_plating_submodel(self): self.param, x_average, self.options ) - def set_total_kinetics_submodel(self): - self.submodels["total interface"] = pybamm.kinetics.TotalKinetics( + def set_total_interface_submodel(self): + self.submodels["total interface"] = pybamm.interface.TotalInterfacialCurrent( self.param, "lithium-ion", self.options ) diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index 18c92dd190..f1c672dcae 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -111,6 +111,12 @@ def set_intercalation_kinetics_submodel(self): ) self.submodels[f"{domain} {phase} interface"] = submod + if len(phases) > 1: + self.submodels[ + f"total {domain} interface" + ] = pybamm.kinetics.TotalMainKinetics( + self.param, domain, "lithium-ion main", self.options + ) def set_particle_submodel(self): for domain in ["negative", "positive"]: diff --git a/pybamm/models/submodels/interface/__init__.py b/pybamm/models/submodels/interface/__init__.py index 962f741057..1a3ffd6876 100644 --- a/pybamm/models/submodels/interface/__init__.py +++ b/pybamm/models/submodels/interface/__init__.py @@ -1 +1,2 @@ from .base_interface import BaseInterface +from .total_interfacial_current import TotalInterfacialCurrent diff --git a/pybamm/models/submodels/interface/kinetics/__init__.py b/pybamm/models/submodels/interface/kinetics/__init__.py index 4808d27133..1acd63947b 100644 --- a/pybamm/models/submodels/interface/kinetics/__init__.py +++ b/pybamm/models/submodels/interface/kinetics/__init__.py @@ -1,5 +1,5 @@ from .base_kinetics import BaseKinetics -from .total_kinetics import TotalKinetics +from .total_main_kinetics import TotalMainKinetics from .butler_volmer import SymmetricButlerVolmer, AsymmetricButlerVolmer from .linear import Linear from .marcus import Marcus, MarcusHushChidsey @@ -14,5 +14,3 @@ ) from .first_order_kinetics.first_order_kinetics import FirstOrderKinetics from .first_order_kinetics.inverse_first_order_kinetics import InverseFirstOrderKinetics - -from .total_kinetics import TotalKinetics diff --git a/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py new file mode 100644 index 0000000000..1ee053b4b2 --- /dev/null +++ b/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py @@ -0,0 +1,115 @@ +# +# Class summing up contributions to the main (e.g. intercalation) reaction +# for cases with primary, secondary, ... reactions e.g. silicon-graphite +# +import pybamm + + +class TotalMainKinetics(pybamm.BaseSubModel): + """ + Class summing up contributions to the main (e.g. intercalation) reaction + for cases with primary, secondary, ... reactions e.g. silicon-graphite + + Parameters + ---------- + Parameters + ---------- + param : + model parameters + domain : str + The domain to implement the model, either: 'Negative' or 'Positive'. + reaction : str + The name of the reaction being implemented + options: dict + A dictionary of options to be passed to the model. + See :class:`pybamm.BaseBatteryModel` + + **Extends:** :class:`pybamm.interface.BaseInterface` + """ + + def __init__(self, param, domain, reaction, options): + super().__init__(param, domain, reaction, options=options) + + def get_coupled_variables(self, variables): + # Creates "total" active material volume fraction and capacity variables + # by summing up all the phases + Domain = self.domain + domain = Domain.lower() + + phases = phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) + + j = sum( + variables[f"{Domain} electrode {phase} interfacial current density"] + for phase in phases + ) + j_dim = sum( + variables[f"{Domain} electrode {phase} interfacial current density [A.m-2]"] + for phase in phases + ) + j_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} interfacial current density" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode interfacial current density": j, + f"{Domain} electrode interfacial current density [A.m-2]": j_dim, + f"X-averaged {domain} electrode interfacial current density": j_av, + } + ) + + a_j = sum( + variables[ + f"{Domain} electrode {phase} volumetric interfacial current density" + ] + for phase in phases + ) + a_j_dim = sum( + variables[ + f"{Domain} electrode {phase} volumetric " + "interfacial current density [A.m-3]" + ] + for phase in phases + ) + a_j_av = sum( + variables[ + f"X-averaged {domain} electrode {phase} volumetric " + "interfacial current density" + ] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode volumetric interfacial current density": a_j, + f"{Domain} electrode volumetric " + "interfacial current density [A.m-2]": a_j_dim, + f"X-averaged {domain} electrode volumetric " + "interfacial current density": a_j_av, + } + ) + + j0 = sum( + variables[f"{Domain} electrode {phase} exchange current density"] + for phase in phases + ) + j0_dim = sum( + variables[f"{Domain} electrode {phase} exchange current density [A.m-2]"] + for phase in phases + ) + j0_av = sum( + variables[f"X-averaged {domain} electrode {phase} exchange current density"] + for phase in phases + ) + variables.update( + { + f"{Domain} electrode exchange current density": j0, + f"{Domain} electrode exchange current density [A.m-2]": j0_dim, + f"X-averaged {domain} electrode exchange current density": j0_av, + } + ) + + return variables diff --git a/pybamm/models/submodels/interface/kinetics/total_kinetics.py b/pybamm/models/submodels/interface/total_interfacial_current.py similarity index 98% rename from pybamm/models/submodels/interface/kinetics/total_kinetics.py rename to pybamm/models/submodels/interface/total_interfacial_current.py index 1b2724d40c..2404037716 100644 --- a/pybamm/models/submodels/interface/kinetics/total_kinetics.py +++ b/pybamm/models/submodels/interface/total_interfacial_current.py @@ -1,12 +1,12 @@ # -# Total kinetics class, summing up contributions from all reactions +# Total interfacial current class, summing up contributions from all reactions # import pybamm -class TotalKinetics(pybamm.BaseSubModel): +class TotalInterfacialCurrent(pybamm.BaseSubModel): """ - Total kinetics class, summing up contributions from all reactions + Total interfacial current, summing up contributions from all reactions Parameters ---------- From 5d472b6ad4a4c06060ed34bdea1f1f3861f682ad Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 11 Aug 2022 10:38:05 +0200 Subject: [PATCH 21/47] all lithium-ion models run with composite graphite/graphite --- examples/scripts/compare_lithium_ion.py | 10 ++-- .../scripts/compare_lithium_ion_two_phase.py | 46 +++++++++++++++++++ .../full_battery_models/lithium_ion/dfn.py | 7 +++ pybamm/parameters/parameter_values.py | 6 +++ 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 examples/scripts/compare_lithium_ion_two_phase.py diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index f54735ac58..6108036b9b 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -7,10 +7,10 @@ # load models models = [ - pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), - # pybamm.lithium_ion.SPMe(), - # pybamm.lithium_ion.DFN(), - # pybamm.lithium_ion.NewmanTobias(), + pybamm.lithium_ion.SPM(), + pybamm.lithium_ion.SPMe(), + pybamm.lithium_ion.DFN(), + pybamm.lithium_ion.NewmanTobias(), ] # create and run simulations @@ -21,4 +21,4 @@ sims.append(sim) # plot -pybamm.dynamic_plot(sims, ["Terminal voltage [V]"]) +pybamm.dynamic_plot(sims) diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py new file mode 100644 index 0000000000..45baa97645 --- /dev/null +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -0,0 +1,46 @@ +# +# Compare lithium-ion battery models +# +import pybamm + +pybamm.set_logging_level("INFO") + +# load models +models = [ + # pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), + # pybamm.lithium_ion.SPMe({"particle phases": ("2", "1")}), + pybamm.lithium_ion.DFN({"particle phases": ("2", "1")}), +] + +parameter_set = pybamm.parameter_sets.Chen2020 +parameter_values = pybamm.ParameterValues(parameter_set) + +for parameter in [ + "Negative electrode OCP [V]", + "Negative electrode OCP entropic change [V.K-1]", + "Maximum concentration in negative electrode [mol.m-3]", + "Initial concentration in negative electrode [mol.m-3]", + "Negative particle radius [m]", + "Negative electrode diffusivity [m2.s-1]", + "Negative electrode exchange-current density [A.m-2]", + "Negative electrode active material volume fraction", + "Negative electrode electrons in reaction", +]: + parameter_values.update( + { + f"Primary: {parameter}": parameter_values[parameter], + f"Secondary: {parameter}": parameter_values[parameter], + }, + check_already_exists=False, + ) + del parameter_values[parameter] + +# create and run simulations +sims = [] +for model in models: + sim = pybamm.Simulation(model, parameter_values=parameter_values) + sim.solve([0, 3600]) + sims.append(sim) + +# plot +pybamm.dynamic_plot(sims, ["Terminal voltage [V]"]) diff --git a/pybamm/models/full_battery_models/lithium_ion/dfn.py b/pybamm/models/full_battery_models/lithium_ion/dfn.py index 4e41a3d2c3..3296a8581a 100644 --- a/pybamm/models/full_battery_models/lithium_ion/dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/dfn.py @@ -76,6 +76,13 @@ def set_intercalation_kinetics_submodel(self): self.submodels[f"{domain.lower()} {phase} interface"] = submod + if len(phases) > 1: + self.submodels[ + f"total {domain} interface" + ] = pybamm.kinetics.TotalMainKinetics( + self.param, domain, "lithium-ion main", self.options + ) + def set_particle_submodel(self): for domain in ["negative", "positive"]: particle = getattr(self.options, domain)["particle"] diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index c0dad410e2..382fbea8ad 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -204,6 +204,11 @@ def update_from_chemistry(self, chemistry): if component_group == "negative secondary particle": component_group = "negative electrode" prefactor = "Secondary: " + elif ( + "negative secondary particle" in component_groups + and component_group == "negative electrode" + ): + prefactor = "Primary: " component_path = os.path.join( base_chemistry, component_group.replace(" ", "_") + "s", component ) @@ -217,6 +222,7 @@ def update_from_chemistry(self, chemistry): # If a parameter is already present as a secondary parameter, we # distinguish it by adding "Primary:" to the given name if "Secondary: " + k in self._dict_items: + print(k) component_params["Primary: " + k] = v else: # Add prefactor to distinguish e.g. secondary particles From d0ac36f971693f6618d514d8590117808f6f50d7 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 11 Aug 2022 10:54:10 +0200 Subject: [PATCH 22/47] fix tests --- tests/unit/test_citations.py | 2 +- .../test_base_battery_model.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/unit/test_citations.py b/tests/unit/test_citations.py index 5b6f13e3b6..63aaf3b2e2 100644 --- a/tests/unit/test_citations.py +++ b/tests/unit/test_citations.py @@ -198,7 +198,7 @@ def test_reniers_2019(self): citations._reset() self.assertNotIn("Reniers2019", citations._papers_to_cite) - pybamm.active_material.LossActiveMaterial(None, None, None, True) + pybamm.active_material.LossActiveMaterial(None, "Negative", None, True) self.assertIn("Reniers2019", citations._papers_to_cite) def test_mohtat_2019(self): diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index 265c50536c..815c928db6 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -30,6 +30,7 @@ 'operating mode': 'current' (possible: ['current', 'voltage', 'power', 'differential power', 'explicit power', 'resistance', 'differential resistance', 'explicit resistance', 'CCCV']) 'particle': 'Fickian diffusion' (possible: ['Fickian diffusion', 'fast diffusion', 'uniform profile', 'quadratic profile', 'quartic profile']) 'particle mechanics': 'swelling only' (possible: ['none', 'swelling only', 'swelling and cracking']) +'particle phases': '1' (possible: ['1', '2']) 'particle shape': 'spherical' (possible: ['spherical', 'no particles']) 'particle size': 'single' (possible: ['single', 'distribution']) 'SEI': 'none' (possible: ['none', 'constant', 'reaction limited', 'solvent-diffusion limited', 'electron-migration limited', 'interstitial-diffusion limited', 'ec reaction limited']) @@ -284,10 +285,12 @@ def test_options(self): with self.assertRaisesRegex(pybamm.OptionError, "SEI on cracks"): pybamm.BaseBatteryModel({"SEI on cracks": "bad SEI on cracks"}) with self.assertRaisesRegex(NotImplementedError, "SEI on cracks not yet"): - pybamm.BaseBatteryModel({ - "SEI on cracks": "true", - "working electrode": "positive", - }) + pybamm.BaseBatteryModel( + { + "SEI on cracks": "true", + "working electrode": "positive", + } + ) # plating model with self.assertRaisesRegex(pybamm.OptionError, "lithium plating"): From 40c185083825196ea8d70ac74dc8316bf51fc59b Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 15 Aug 2022 12:10:22 +0200 Subject: [PATCH 23/47] fix test --- examples/scripts/compare_lead_acid.py | 8 +++++--- .../full_surface_form_conductivity.py | 6 ++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/scripts/compare_lead_acid.py b/examples/scripts/compare_lead_acid.py index 9f73046d35..dc4ff038f3 100644 --- a/examples/scripts/compare_lead_acid.py +++ b/examples/scripts/compare_lead_acid.py @@ -10,7 +10,7 @@ pybamm.lead_acid.LOQS(), pybamm.lead_acid.FOQS(), pybamm.lead_acid.Composite(), - pybamm.lead_acid.Full(), + pybamm.lead_acid.Full({"surface form": "differential"}), ] # create and run simulations @@ -18,8 +18,10 @@ for model in models: model.convert_to_format = None sim = pybamm.Simulation(model) - sim.solve([0, 3600 * 17]) + sim.solve([0, 10]) sims.append(sim) # plot -pybamm.dynamic_plot(sims) +pybamm.dynamic_plot( + sims, ["Sum of negative electrode volumetric interfacial current densities"] +) diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py index 2a7804de9a..6ff779dbf8 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py @@ -271,10 +271,8 @@ def set_rhs(self, variables): # Variable summing all of the interfacial current densities sum_a_j = variables[ - f"Sum of {domain} electrode volumetric " "interfacial current densities" - ] - a = variables[ - f"{Domain} electrode {phase_name}surface area to volume ratio [m-1]" + f"Sum of {domain} electrode volumetric interfacial current densities" ] + a = variables[f"{Domain} electrode {phase_name}surface area to volume ratio"] self.rhs[delta_phi] = 1 / (a * C_dl) * (pybamm.div(i_e) - sum_a_j) From 7c2683539867341ba21a89a9256adb88318e189a Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 15 Aug 2022 12:10:51 +0200 Subject: [PATCH 24/47] revert lead-acid example --- examples/scripts/compare_lead_acid.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/scripts/compare_lead_acid.py b/examples/scripts/compare_lead_acid.py index dc4ff038f3..9f73046d35 100644 --- a/examples/scripts/compare_lead_acid.py +++ b/examples/scripts/compare_lead_acid.py @@ -10,7 +10,7 @@ pybamm.lead_acid.LOQS(), pybamm.lead_acid.FOQS(), pybamm.lead_acid.Composite(), - pybamm.lead_acid.Full({"surface form": "differential"}), + pybamm.lead_acid.Full(), ] # create and run simulations @@ -18,10 +18,8 @@ for model in models: model.convert_to_format = None sim = pybamm.Simulation(model) - sim.solve([0, 10]) + sim.solve([0, 3600 * 17]) sims.append(sim) # plot -pybamm.dynamic_plot( - sims, ["Sum of negative electrode volumetric interfacial current densities"] -) +pybamm.dynamic_plot(sims) From 6b7dfbe0c00cc7d6353b66b80d16034976f446c7 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 16 Aug 2022 11:59:45 +0100 Subject: [PATCH 25/47] fix integration tests --- .../test_interface/test_butler_volmer.py | 10 ++++++++++ tests/integration/test_solvers/test_solution.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_models/test_submodels/test_interface/test_butler_volmer.py b/tests/integration/test_models/test_submodels/test_interface/test_butler_volmer.py index 36e743ac7b..d7f6e761e2 100644 --- a/tests/integration/test_models/test_submodels/test_interface/test_butler_volmer.py +++ b/tests/integration/test_models/test_submodels/test_interface/test_butler_volmer.py @@ -90,6 +90,7 @@ def test_creation(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_n = model_n.get_coupled_variables(self.variables)[ "Negative electrode interfacial current density" @@ -103,6 +104,7 @@ def test_creation(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_p = model_p.get_coupled_variables(self.variables)[ "Positive electrode interfacial current density" @@ -127,6 +129,7 @@ def test_set_parameters(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_n = model_n.get_coupled_variables(self.variables)[ "Negative electrode interfacial current density" @@ -140,6 +143,7 @@ def test_set_parameters(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_p = model_p.get_coupled_variables(self.variables)[ "Positive electrode interfacial current density" @@ -167,6 +171,7 @@ def test_discretisation(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_n = model_n.get_coupled_variables(self.variables)[ "Negative electrode interfacial current density" @@ -180,6 +185,7 @@ def test_discretisation(self): "total interfacial current density as a state": "false", "particle size": "single", }, + "primary", ) j_p = model_p.get_coupled_variables(self.variables)[ "Positive electrode interfacial current density" @@ -234,6 +240,7 @@ def test_diff_c_e_lead_acid(self): "SEI film resistance": "none", "total interfacial current density as a state": "false", }, + "primary", ) model_p = pybamm.kinetics.SymmetricButlerVolmer( param, @@ -243,6 +250,7 @@ def test_diff_c_e_lead_acid(self): "SEI film resistance": "none", "total interfacial current density as a state": "false", }, + "primary", ) parameter_values = pybamm.lead_acid.BaseModel().default_parameter_values @@ -303,6 +311,7 @@ def test_diff_delta_phi_e_lead_acid(self): "SEI film resistance": "none", "total interfacial current density as a state": "false", }, + "primary", ) model_p = pybamm.kinetics.SymmetricButlerVolmer( param, @@ -312,6 +321,7 @@ def test_diff_delta_phi_e_lead_acid(self): "SEI film resistance": "none", "total interfacial current density as a state": "false", }, + "primary", ) parameter_values = pybamm.lead_acid.BaseModel().default_parameter_values diff --git a/tests/integration/test_solvers/test_solution.py b/tests/integration/test_solvers/test_solution.py index b2442e8974..3493f66e46 100644 --- a/tests/integration/test_solvers/test_solution.py +++ b/tests/integration/test_solvers/test_solution.py @@ -54,7 +54,7 @@ def test_append_external_variables(self): model = pybamm.lithium_ion.SPM( { "thermal": "lumped", - "external submodels": ["thermal", "negative particle"], + "external submodels": ["thermal", "negative primary particle"], } ) # create geometry From 273d0dd6c851e25f0af18d1a133576a523e8c189 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 16 Aug 2022 14:06:04 +0100 Subject: [PATCH 26/47] change to domain-specific j_scale --- .../submodels/interface/base_interface.py | 10 +-- .../interface/lithium_plating/base_plating.py | 2 +- .../submodels/interface/sei/base_sei.py | 34 +++++----- pybamm/parameters/lead_acid_parameters.py | 15 ++--- pybamm/parameters/lithium_ion_parameters.py | 67 +++++++++---------- 5 files changed, 60 insertions(+), 68 deletions(-) diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 2d1b8ad99e..6e7612c46f 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -179,7 +179,7 @@ def _get_standard_interfacial_current_variables(self, j): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.phase_param.j_scale + j_scale = self.domain_param.j_scale if self.reaction == "lithium metal plating": # Half-cell domain, j should not be broadcast @@ -215,7 +215,7 @@ def _get_standard_interfacial_current_variables(self, j): def _get_standard_total_interfacial_current_variables(self, j_tot_av): domain = self.domain.lower() - j_scale = self.phase_param.j_scale + j_scale = self.domain_param.j_scale if self.half_cell and self.domain == "Negative": variables = { @@ -237,7 +237,7 @@ def _get_standard_exchange_current_variables(self, j0): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.phase_param.j_scale + j_scale = self.domain_param.j_scale if self.reaction == "lithium metal plating": # half-cell domain @@ -431,7 +431,7 @@ def _get_standard_size_distribution_interfacial_current_variables(self, j): j = pybamm.SecondaryBroadcast(j_xav, [f"{domain} electrode"]) # j scale - j_scale = self.phase_param.j_scale + j_scale = self.domain_param.j_scale variables = { f"{Domain} electrode {reaction_name}" @@ -453,7 +453,7 @@ def _get_standard_size_distribution_exchange_current_variables(self, j0): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.phase_param.j_scale + j_scale = self.domain_param.j_scale # X-average or broadcast to electrode if necessary if j0.domains["secondary"] != [f"{domain} electrode"]: diff --git a/pybamm/models/submodels/interface/lithium_plating/base_plating.py b/pybamm/models/submodels/interface/lithium_plating/base_plating.py index 2292be3605..4aa672ddca 100644 --- a/pybamm/models/submodels/interface/lithium_plating/base_plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/base_plating.py @@ -147,7 +147,7 @@ def _get_standard_reaction_variables(self, j_stripping): # Set scales to one for the "no plating" model so that they are not required # by parameter values in general param = self.param - j_scale = param.n.prim.j_scale + j_scale = param.n.j_scale j_stripping_av = pybamm.x_average(j_stripping) variables = { diff --git a/pybamm/models/submodels/interface/sei/base_sei.py b/pybamm/models/submodels/interface/sei/base_sei.py index 1b5fcfe4c3..c36534e368 100644 --- a/pybamm/models/submodels/interface/sei/base_sei.py +++ b/pybamm/models/submodels/interface/sei/base_sei.py @@ -218,12 +218,7 @@ def _get_standard_concentration_variables(self, variables): L_n = self.param.n.L Q_sei = ( - z_sei - * delta_n_SEI - * n_scale - * L_n - * self.param.L_y - * self.param.L_z + z_sei * delta_n_SEI * n_scale * L_n * self.param.L_y * self.param.L_z ) variables.update( @@ -273,18 +268,19 @@ def _get_standard_concentration_variables(self, variables): variables.update( { "Inner SEI on cracks concentration [mol.m-3]": n_inner_cr * n_scale, - "X-averaged inner SEI on cracks concentration [mol.m-3]": - n_inner_cr_av * n_scale, + "X-averaged inner SEI on cracks concentration [mol.m-3]": n_inner_cr_av + * n_scale, "Outer SEI on cracks concentration [mol.m-3]": n_outer_cr * n_outer_scale, - "X-averaged outer SEI on cracks concentration [mol.m-3]": - n_outer_cr_av * n_outer_scale, + "X-averaged outer SEI on cracks concentration [mol.m-3]": n_outer_cr_av + * n_outer_scale, "SEI on cracks concentration [mol.m-3]": n_SEI_cr * n_scale, "X-averaged SEI on cracks concentration [mol.m-3]": n_SEI_cr_av * n_scale, "Loss of lithium to SEI on cracks [mol]": Q_sei_cr, "Loss of capacity to SEI on cracks [A.h]": Q_sei_cr - * self.param.F / 3600, + * self.param.F + / 3600, } ) @@ -307,7 +303,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): variables : dict The variables which can be derived from the SEI currents. """ - j_scale = self.param.n.prim.j_scale + j_scale = self.param.n.j_scale j_i_av = pybamm.x_average(j_inner) j_o_av = pybamm.x_average(j_outer) @@ -316,14 +312,14 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): f"Inner {self.reaction} interfacial current density [A.m-2]": j_inner * j_scale, f"X-averaged inner {self.reaction} interfacial current density": j_i_av, - f"X-averaged inner {self.reaction} interfacial current density [A.m-2]": - j_i_av * j_scale, + f"X-averaged inner {self.reaction} interfacial current density [A.m-2]": j_i_av + * j_scale, f"Outer {self.reaction} interfacial current density": j_outer, f"Outer {self.reaction} interfacial current density [A.m-2]": j_outer * j_scale, f"X-averaged outer {self.reaction} interfacial current density": j_o_av, - f"X-averaged outer {self.reaction} interfacial current density [A.m-2]": - j_o_av * j_scale, + f"X-averaged outer {self.reaction} interfacial current density [A.m-2]": j_o_av + * j_scale, } j_sei = j_inner + j_outer @@ -333,7 +329,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): def _get_standard_total_reaction_variables(self, j_sei): """Update variables related to total SEI interfacial current density.""" - j_scale = self.param.n.prim.j_scale + j_scale = self.param.n.j_scale variables = { f"{self.reaction} interfacial current density": j_sei, @@ -345,8 +341,8 @@ def _get_standard_total_reaction_variables(self, j_sei): variables.update( { f"X-averaged {self.reaction} interfacial current density": j_sei_av, - f"X-averaged {self.reaction} interfacial current density [A.m-2]": - j_sei_av * j_scale, + f"X-averaged {self.reaction} interfacial current density [A.m-2]": j_sei_av + * j_scale, } ) diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index ad16c2007b..856157fcf5 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -540,6 +540,9 @@ def _set_scales(self): for phase in self.phases: phase._set_scales() + # Electrical + self.j_scale = self.main_param.i_typ / (self.prim.a_typ * self.main_param.L_x) + def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" main = self.main_param @@ -586,10 +589,7 @@ def _set_dimensionless_parameters(self): ) self.C_dl = ( - self.C_dl_dimensional - * main.potential_scale - / self.prim.j_scale - / main.timescale + self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale ) # Thermal @@ -693,9 +693,6 @@ def _set_scales(self): # Microscale (typical values at electrode/current collector interface) self.a_typ = pybamm.xyz_average(self.a_dimensional) - # Electrical - self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) - # Reference OCP inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} self.U_ref = pybamm.FunctionParameter( @@ -736,10 +733,10 @@ def j0(self, c_e, T): """Dimensionless exchange-current density in the negative electrode""" c_e_dim = c_e * self.main_param.c_e_typ T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return self.j0_dimensional(c_e_dim, T_dim) / self.j_scale + return self.j0_dimensional(c_e_dim, T_dim) / self.domain_param.j_scale def j0_Ox(self, c_e, T): """Dimensionless oxygen exchange-current density in the positive electrode""" c_e_dim = c_e * self.main_param.c_e_typ T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return self.j0_Ox_dimensional(c_e_dim, T_dim) / self.j_scale + return self.j0_Ox_dimensional(c_e_dim, T_dim) / self.domain_param.j_scale diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 0b73dbf6b9..b7d80c7bcb 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -332,25 +332,25 @@ def _set_dimensionless_parameters(self): self.E_over_RT_sei = self.E_sei_dimensional / self.R / self.T_ref - self.C_sei_reaction = ( - self.n.prim.j_scale / self.m_sei_dimensional - ) * pybamm.exp(-(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref))) + self.C_sei_reaction = (self.n.j_scale / self.m_sei_dimensional) * pybamm.exp( + -(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref)) + ) self.C_sei_solvent = ( - self.n.prim.j_scale + self.n.j_scale * self.L_sei_0_dim / (self.c_sol_dimensional * self.F * self.D_sol_dimensional) ) self.C_sei_electron = ( - self.n.prim.j_scale + self.n.j_scale * self.F * self.L_sei_0_dim / (self.kappa_inner_dimensional * self.R * self.T_ref) ) self.C_sei_inter = ( - self.n.prim.j_scale + self.n.j_scale * self.L_sei_0_dim / (self.D_li_dimensional * self.c_li_0_dimensional * self.F) ) @@ -359,7 +359,7 @@ def _set_dimensionless_parameters(self): self.R_sei = ( self.F - * self.n.prim.j_scale + * self.n.j_scale * self.R_sei_dimensional * self.L_sei_0_dim / self.R @@ -379,20 +379,20 @@ def _set_dimensionless_parameters(self): # ratio of SEI reaction scale to intercalation reaction self.Gamma_SEI = ( - self.V_bar_inner_dimensional * self.n.prim.j_scale * self.timescale + self.V_bar_inner_dimensional * self.n.j_scale * self.timescale ) / (self.F * self.z_sei * self.L_sei_0_dim) # EC reaction self.C_ec = ( self.L_sei_0_dim - * self.n.prim.j_scale + * self.n.j_scale / (self.F * self.c_ec_0_dim * self.D_ec_dim) ) self.C_sei_ec = ( self.F * self.k_sei_dim * self.c_ec_0_dim - / self.n.prim.j_scale + / self.n.j_scale * ( pybamm.exp( -( @@ -412,9 +412,9 @@ def _set_dimensionless_parameters(self): self.alpha_stripping = 1 - self.alpha_plating # ratio of lithium plating reaction scaled to intercalation reaction - self.Gamma_plating = ( - self.n.prim.a_typ * self.n.prim.j_scale * self.timescale - ) / (self.F * self.c_Li_typ) + self.Gamma_plating = (self.n.prim.a_typ * self.n.j_scale * self.timescale) / ( + self.F * self.c_Li_typ + ) # Initial conditions self.c_e_init = self.c_e_init_dimensional / self.c_e_typ @@ -476,10 +476,7 @@ def j0_stripping(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return ( - self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) - / self.n.prim.j_scale - ) + return self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale def j0_plating(self, c_e, c_Li, T): """Dimensionless reverse plating current""" @@ -487,9 +484,7 @@ def j0_plating(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return ( - self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.prim.j_scale - ) + return self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale def dead_lithium_decay_rate(self, L_sei): """Dimensionless exchange-current density for stripping""" @@ -666,9 +661,24 @@ def j0_plating_dimensional(self, c_e, c_Li, T): def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" + main = self.main_param + for phase in self.phases: phase._set_scales() + if self.domain == "Separator": + return + + # Scale for interfacial current density in A/m2 + # Use same scale for all phases since they all appear in the same equation + # for total current + if main.half_cell and self.domain == "Negative": + # metal electrode (boundary condition between negative and separator) + self.j_scale = main.i_typ + else: + # porous electrode + self.j_scale = main.i_typ / (self.prim.a_typ * main.L_x) + def _set_dimensionless_parameters(self): for phase in self.phases: phase._set_dimensionless_parameters() @@ -700,10 +710,7 @@ def _set_dimensionless_parameters(self): # Electrochemical Reactions self.C_dl = ( - self.C_dl_dimensional - * main.potential_scale - / self.prim.j_scale - / main.timescale + self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale ) # Electrode Properties self.sigma_cc = ( @@ -726,14 +733,14 @@ def _set_dimensionless_parameters(self): self.beta_LAM_sei = ( self.beta_LAM_sei_dimensional * self.prim.a_typ - * self.prim.j_scale + * self.j_scale * main.timescale ) / main.F # Utilisation factors self.beta_utilisation = ( self.beta_utilisation_dimensional * self.prim.a_typ - * self.prim.j_scale + * self.j_scale * main.timescale ) / main.F @@ -947,14 +954,6 @@ def _set_scales(self): # Concentration self.particle_concentration_scale = self.c_max - # Scale for interfacial current density in A/m2 - if main.half_cell and self.domain == "Negative": - # metal electrode (boundary condition between negative and separator) - self.j_scale = main.i_typ - else: - # porous electrode - self.j_scale = main.i_typ / (self.a_typ * main.L_x) - # Reference exchange-current density self.j0_ref_dimensional = ( self.j0_dimensional(main.c_e_typ, self.c_max / 2, main.T_ref) * 2 From 8781f29d2ba032f9e37b948b38521072a9875617 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 16 Aug 2022 23:45:21 +0100 Subject: [PATCH 27/47] revert j_scale change --- .../submodels/interface/base_interface.py | 10 +-- .../interface/lithium_plating/base_plating.py | 2 +- .../submodels/interface/sei/base_sei.py | 4 +- pybamm/parameters/lithium_ion_parameters.py | 67 ++++++++++--------- 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 3159b84db0..785c846ba3 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -179,7 +179,7 @@ def _get_standard_interfacial_current_variables(self, j): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # Half-cell domain, j should not be broadcast @@ -215,7 +215,7 @@ def _get_standard_interfacial_current_variables(self, j): def _get_standard_total_interfacial_current_variables(self, j_tot_av): domain = self.domain.lower() - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.half_cell and self.domain == "Negative": variables = { @@ -237,7 +237,7 @@ def _get_standard_exchange_current_variables(self, j0): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale if self.reaction == "lithium metal plating": # half-cell domain @@ -431,7 +431,7 @@ def _get_standard_size_distribution_interfacial_current_variables(self, j): j = pybamm.SecondaryBroadcast(j_xav, [f"{domain} electrode"]) # j scale - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale variables = { f"{Domain} electrode {reaction_name}" @@ -453,7 +453,7 @@ def _get_standard_size_distribution_exchange_current_variables(self, j0): Domain = self.domain domain = Domain.lower() reaction_name = self.reaction_name - j_scale = self.domain_param.j_scale + j_scale = self.phase_param.j_scale # X-average or broadcast to electrode if necessary if j0.domains["secondary"] != [f"{domain} electrode"]: diff --git a/pybamm/models/submodels/interface/lithium_plating/base_plating.py b/pybamm/models/submodels/interface/lithium_plating/base_plating.py index 4aa672ddca..2292be3605 100644 --- a/pybamm/models/submodels/interface/lithium_plating/base_plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/base_plating.py @@ -147,7 +147,7 @@ def _get_standard_reaction_variables(self, j_stripping): # Set scales to one for the "no plating" model so that they are not required # by parameter values in general param = self.param - j_scale = param.n.j_scale + j_scale = param.n.prim.j_scale j_stripping_av = pybamm.x_average(j_stripping) variables = { diff --git a/pybamm/models/submodels/interface/sei/base_sei.py b/pybamm/models/submodels/interface/sei/base_sei.py index c36534e368..9acbd846c7 100644 --- a/pybamm/models/submodels/interface/sei/base_sei.py +++ b/pybamm/models/submodels/interface/sei/base_sei.py @@ -303,7 +303,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): variables : dict The variables which can be derived from the SEI currents. """ - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale j_i_av = pybamm.x_average(j_inner) j_o_av = pybamm.x_average(j_outer) @@ -329,7 +329,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): def _get_standard_total_reaction_variables(self, j_sei): """Update variables related to total SEI interfacial current density.""" - j_scale = self.param.n.j_scale + j_scale = self.param.n.prim.j_scale variables = { f"{self.reaction} interfacial current density": j_sei, diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 39d7b96500..f6701b5e78 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -332,25 +332,25 @@ def _set_dimensionless_parameters(self): self.E_over_RT_sei = self.E_sei_dimensional / self.R / self.T_ref - self.C_sei_reaction = (self.n.j_scale / self.m_sei_dimensional) * pybamm.exp( - -(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref)) - ) + self.C_sei_reaction = ( + self.n.prim.j_scale / self.m_sei_dimensional + ) * pybamm.exp(-(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref))) self.C_sei_solvent = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.c_sol_dimensional * self.F * self.D_sol_dimensional) ) self.C_sei_electron = ( - self.n.j_scale + self.n.prim.j_scale * self.F * self.L_sei_0_dim / (self.kappa_inner_dimensional * self.R * self.T_ref) ) self.C_sei_inter = ( - self.n.j_scale + self.n.prim.j_scale * self.L_sei_0_dim / (self.D_li_dimensional * self.c_li_0_dimensional * self.F) ) @@ -359,7 +359,7 @@ def _set_dimensionless_parameters(self): self.R_sei = ( self.F - * self.n.j_scale + * self.n.prim.j_scale * self.R_sei_dimensional * self.L_sei_0_dim / self.R @@ -379,20 +379,20 @@ def _set_dimensionless_parameters(self): # ratio of SEI reaction scale to intercalation reaction self.Gamma_SEI = ( - self.V_bar_inner_dimensional * self.n.j_scale * self.timescale + self.V_bar_inner_dimensional * self.n.prim.j_scale * self.timescale ) / (self.F * self.z_sei * self.L_sei_0_dim) # EC reaction self.C_ec = ( self.L_sei_0_dim - * self.n.j_scale + * self.n.prim.j_scale / (self.F * self.c_ec_0_dim * self.D_ec_dim) ) self.C_sei_ec = ( self.F * self.k_sei_dim * self.c_ec_0_dim - / self.n.j_scale + / self.n.prim.j_scale * ( pybamm.exp( -( @@ -412,9 +412,9 @@ def _set_dimensionless_parameters(self): self.alpha_stripping = 1 - self.alpha_plating # ratio of lithium plating reaction scaled to intercalation reaction - self.Gamma_plating = (self.n.prim.a_typ * self.n.j_scale * self.timescale) / ( - self.F * self.c_Li_typ - ) + self.Gamma_plating = ( + self.n.prim.a_typ * self.n.prim.j_scale * self.timescale + ) / (self.F * self.c_Li_typ) # Initial conditions self.c_e_init = self.c_e_init_dimensional / self.c_e_typ @@ -476,7 +476,10 @@ def j0_stripping(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_stripping_dimensional(c_e_dim, c_Li_dim, T_dim) + / self.n.prim.j_scale + ) def j0_plating(self, c_e, c_Li, T): """Dimensionless reverse plating current""" @@ -484,7 +487,9 @@ def j0_plating(self, c_e, c_Li, T): c_Li_dim = c_Li * self.c_Li_typ T_dim = self.Delta_T * T + self.T_ref - return self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.j_scale + return ( + self.j0_plating_dimensional(c_e_dim, c_Li_dim, T_dim) / self.n.prim.j_scale + ) def dead_lithium_decay_rate(self, L_sei): """Dimensionless exchange-current density for stripping""" @@ -669,16 +674,6 @@ def _set_scales(self): if self.domain == "Separator": return - # Scale for interfacial current density in A/m2 - # Use same scale for all phases since they all appear in the same equation - # for total current - if main.half_cell and self.domain == "Negative": - # metal electrode (boundary condition between negative and separator) - self.j_scale = main.i_typ - else: - # porous electrode - self.j_scale = main.i_typ / (self.prim.a_typ * main.L_x) - def _set_dimensionless_parameters(self): for phase in self.phases: phase._set_dimensionless_parameters() @@ -710,7 +705,10 @@ def _set_dimensionless_parameters(self): # Electrochemical Reactions self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale ) # Electrode Properties self.sigma_cc = ( @@ -733,14 +731,14 @@ def _set_dimensionless_parameters(self): self.beta_LAM_sei = ( self.beta_LAM_sei_dimensional * self.prim.a_typ - * self.j_scale + * self.prim.j_scale * main.timescale ) / main.F # Utilisation factors self.beta_utilisation = ( self.beta_utilisation_dimensional * self.prim.a_typ - * self.j_scale + * self.prim.j_scale * main.timescale ) / main.F @@ -951,6 +949,14 @@ def _set_scales(self): elif main.options["particle shape"] == "spherical": self.a_typ = 3 * pybamm.xyz_average(self.epsilon_s) / self.R_typ + # Scale for interfacial current density in A/m2 + if main.half_cell and self.domain == "Negative": + # metal electrode (boundary condition between negative and separator) + self.j_scale = main.i_typ + else: + # porous electrode + self.j_scale = main.i_typ / (self.a_typ * main.L_x) + # Concentration self.particle_concentration_scale = self.c_max @@ -1014,10 +1020,7 @@ def j0(self, c_e, c_s_surf, T): c_s_surf_dim = c_s_surf * self.c_max T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return ( - self.j0_dimensional(c_e_dim, c_s_surf_dim, T_dim) - / self.domain_param.j_scale - ) + return self.j0_dimensional(c_e_dim, c_s_surf_dim, T_dim) / self.j_scale def U(self, c_s, T, lithiation=None): """Dimensionless open-circuit potential in the electrode""" From a19f2f648925476cda37d8eece5496058974e43a Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 17 Aug 2022 00:00:36 +0100 Subject: [PATCH 28/47] flake8 --- .../submodels/interface/sei/base_sei.py | 20 +++++++++---------- pybamm/parameters/lithium_ion_parameters.py | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/pybamm/models/submodels/interface/sei/base_sei.py b/pybamm/models/submodels/interface/sei/base_sei.py index 9acbd846c7..480211c692 100644 --- a/pybamm/models/submodels/interface/sei/base_sei.py +++ b/pybamm/models/submodels/interface/sei/base_sei.py @@ -268,12 +268,12 @@ def _get_standard_concentration_variables(self, variables): variables.update( { "Inner SEI on cracks concentration [mol.m-3]": n_inner_cr * n_scale, - "X-averaged inner SEI on cracks concentration [mol.m-3]": n_inner_cr_av - * n_scale, + "X-averaged inner SEI on cracks " + "concentration [mol.m-3]": n_inner_cr_av * n_scale, "Outer SEI on cracks concentration [mol.m-3]": n_outer_cr * n_outer_scale, - "X-averaged outer SEI on cracks concentration [mol.m-3]": n_outer_cr_av - * n_outer_scale, + "X-averaged outer SEI on cracks " + "concentration [mol.m-3]": n_outer_cr_av * n_outer_scale, "SEI on cracks concentration [mol.m-3]": n_SEI_cr * n_scale, "X-averaged SEI on cracks concentration [mol.m-3]": n_SEI_cr_av * n_scale, @@ -312,14 +312,14 @@ def _get_standard_reaction_variables(self, j_inner, j_outer): f"Inner {self.reaction} interfacial current density [A.m-2]": j_inner * j_scale, f"X-averaged inner {self.reaction} interfacial current density": j_i_av, - f"X-averaged inner {self.reaction} interfacial current density [A.m-2]": j_i_av - * j_scale, + f"X-averaged inner {self.reaction} " + "interfacial current density [A.m-2]": j_i_av * j_scale, f"Outer {self.reaction} interfacial current density": j_outer, f"Outer {self.reaction} interfacial current density [A.m-2]": j_outer * j_scale, f"X-averaged outer {self.reaction} interfacial current density": j_o_av, - f"X-averaged outer {self.reaction} interfacial current density [A.m-2]": j_o_av - * j_scale, + f"X-averaged outer {self.reaction} " + "interfacial current density [A.m-2]": j_o_av * j_scale, } j_sei = j_inner + j_outer @@ -341,8 +341,8 @@ def _get_standard_total_reaction_variables(self, j_sei): variables.update( { f"X-averaged {self.reaction} interfacial current density": j_sei_av, - f"X-averaged {self.reaction} interfacial current density [A.m-2]": j_sei_av - * j_scale, + f"X-averaged {self.reaction} " + "interfacial current density [A.m-2]": j_sei_av * j_scale, } ) diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index f6701b5e78..b0732f4fc6 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -666,8 +666,6 @@ def j0_plating_dimensional(self, c_e, c_Li, T): def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" - main = self.main_param - for phase in self.phases: phase._set_scales() From 120b2b4d332269cc4d38708a725b7a9cc53afc8b Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 17 Aug 2022 07:46:13 +0100 Subject: [PATCH 29/47] fix tests --- .../lithium_ion/basic_dfn_half_cell.py | 4 ++-- pybamm/parameters/lead_acid_parameters.py | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py index 99f476001a..4fcec55709 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py @@ -125,8 +125,8 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # Interfacial reactions j0_w = param.p.prim.j0(c_e_w, c_s_surf_w, T) - U_w = param.p.U - ne_w = param.p.ne + U_w = param.p.prim.U + ne_w = param.p.prim.ne # Particle diffusion parameters D_w = param.p.prim.D diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index 856157fcf5..ad16c2007b 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -540,9 +540,6 @@ def _set_scales(self): for phase in self.phases: phase._set_scales() - # Electrical - self.j_scale = self.main_param.i_typ / (self.prim.a_typ * self.main_param.L_x) - def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" main = self.main_param @@ -589,7 +586,10 @@ def _set_dimensionless_parameters(self): ) self.C_dl = ( - self.C_dl_dimensional * main.potential_scale / self.j_scale / main.timescale + self.C_dl_dimensional + * main.potential_scale + / self.prim.j_scale + / main.timescale ) # Thermal @@ -693,6 +693,9 @@ def _set_scales(self): # Microscale (typical values at electrode/current collector interface) self.a_typ = pybamm.xyz_average(self.a_dimensional) + # Electrical + self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) + # Reference OCP inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} self.U_ref = pybamm.FunctionParameter( @@ -733,10 +736,10 @@ def j0(self, c_e, T): """Dimensionless exchange-current density in the negative electrode""" c_e_dim = c_e * self.main_param.c_e_typ T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return self.j0_dimensional(c_e_dim, T_dim) / self.domain_param.j_scale + return self.j0_dimensional(c_e_dim, T_dim) / self.j_scale def j0_Ox(self, c_e, T): """Dimensionless oxygen exchange-current density in the positive electrode""" c_e_dim = c_e * self.main_param.c_e_typ T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - return self.j0_Ox_dimensional(c_e_dim, T_dim) / self.domain_param.j_scale + return self.j0_Ox_dimensional(c_e_dim, T_dim) / self.j_scale From 98be82cc540ae88abde62d42947edd830e29ed5c Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 17 Aug 2022 17:25:15 +0100 Subject: [PATCH 30/47] debugging composite graphite-graphite --- examples/scripts/compare_lithium_ion.py | 14 ++++- .../scripts/compare_lithium_ion_two_phase.py | 52 +++++++++++++++++-- pybamm/util.py | 3 ++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 6108036b9b..00cf6c8898 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -12,13 +12,23 @@ pybamm.lithium_ion.DFN(), pybamm.lithium_ion.NewmanTobias(), ] +parameter_values = pybamm.ParameterValues("Chen2020") # create and run simulations sims = [] for model in models: - sim = pybamm.Simulation(model) + sim = pybamm.Simulation(model, parameter_values=parameter_values) sim.solve([0, 3600]) sims.append(sim) # plot -pybamm.dynamic_plot(sims) +pybamm.dynamic_plot( + sims, + [ + "Terminal voltage [V]", + "X-averaged negative electrode active material volume fraction", + "Average negative particle concentration", + "X-averaged negative electrode interfacial current density", + "Current [A]", + ], +) diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py index 45baa97645..c0d4e85769 100644 --- a/examples/scripts/compare_lithium_ion_two_phase.py +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -23,7 +23,6 @@ "Negative particle radius [m]", "Negative electrode diffusivity [m2.s-1]", "Negative electrode exchange-current density [A.m-2]", - "Negative electrode active material volume fraction", "Negative electrode electrons in reaction", ]: parameter_values.update( @@ -34,13 +33,60 @@ check_already_exists=False, ) del parameter_values[parameter] +parameter_values.update( + { + "Primary: Negative electrode active material volume fraction": parameter_values[ + "Negative electrode active material volume fraction" + ] + * 0.4, + "Secondary: Negative electrode active material volume " + "fraction": parameter_values[ + "Negative electrode active material volume fraction" + ] + * 0.6, + }, + check_already_exists=False, +) +del parameter_values["Negative electrode active material volume fraction"] + +# print(parameter_values.evaluate(models[0].param.n.prim.a_R)) +# print(parameter_values.evaluate(models[0].param.n.sec.a_R)) # create and run simulations sims = [] for model in models: sim = pybamm.Simulation(model, parameter_values=parameter_values) - sim.solve([0, 3600]) + sim.solve([0, 1000]) sims.append(sim) # plot -pybamm.dynamic_plot(sims, ["Terminal voltage [V]"]) +pybamm.dynamic_plot( + sims, + [ + "Terminal voltage [V]", + [ + "X-averaged negative electrode primary active material volume fraction", + "X-averaged negative electrode secondary active material volume fraction", + "X-averaged negative electrode active material volume fraction", + ], + [ + "X-averaged negative electrode primary surface area to volume ratio [m-1]", + "X-averaged negative electrode secondary surface area to volume ratio [m-1]", + ], + [ + "Average negative primary particle concentration", + "Average negative secondary particle concentration", + ], + [ + "X-averaged negative electrode primary interfacial current density", + "X-averaged negative electrode secondary interfacial current density", + "X-averaged negative electrode interfacial current density", + ], + [ + "X-averaged negative electrode primary volumetric interfacial current density", + "X-averaged negative electrode secondary volumetric interfacial current density", + "X-averaged negative electrode volumetric interfacial current density", + ], + "Current [A]", + ], +) diff --git a/pybamm/util.py b/pybamm/util.py index 8faa19803d..7cfc5c8532 100644 --- a/pybamm/util.py +++ b/pybamm/util.py @@ -88,6 +88,9 @@ def search(self, key, print_values=False): # Just print keys print("\n".join("{}".format(k) for k in results.keys())) + def copy(self): + return FuzzyDict(super().copy()) + class Timer(object): """ From 591a9ed49b8e752978c58e5691d3a7009d23f14f Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 18 Aug 2022 13:59:35 +0100 Subject: [PATCH 31/47] add tests for two phases --- .../scripts/compare_lithium_ion_two_phase.py | 13 +- pybamm/expression_tree/averages.py | 6 +- .../submodels/particle/fickian_diffusion.py | 2 +- pybamm/solvers/processed_variable.py | 50 ++----- .../base_lithium_ion_tests.py | 24 ++-- .../test_compare_outputs_two_phase.py | 129 ++++++++++++++++++ .../base_lithium_ion_tests.py | 11 ++ .../test_lithium_ion/test_newman_tobias.py | 3 + 8 files changed, 180 insertions(+), 58 deletions(-) create mode 100644 tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py index c83e06a57e..c6d46b323f 100644 --- a/examples/scripts/compare_lithium_ion_two_phase.py +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -8,8 +8,8 @@ # load models models = [ # pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), - # pybamm.lithium_ion.SPMe({"particle phases": ("2", "1")}), - pybamm.lithium_ion.DFN({"particle phases": ("2", "1")}), + pybamm.lithium_ion.SPMe({"particle phases": ("2", "1")}), + # pybamm.lithium_ion.DFN({"particle phases": ("2", "1")}), ] parameter_set = pybamm.parameter_sets.Chen2020 @@ -69,10 +69,6 @@ "X-averaged negative electrode secondary active material volume fraction", "X-averaged negative electrode active material volume fraction", ], - [ - "X-averaged negative electrode primary surface area to volume ratio [m-1]", - "X-averaged negative electrode secondary surface area to volume ratio [m-1]", - ], [ "Average negative primary particle concentration", "Average negative secondary particle concentration", @@ -82,6 +78,11 @@ "X-averaged negative electrode secondary interfacial current density", "X-averaged negative electrode interfacial current density", ], + [ + "Negative electrode primary interfacial current density", + "Negative electrode secondary interfacial current density", + "Negative electrode interfacial current density", + ], [ "X-averaged negative electrode primary volumetric interfacial current density", "X-averaged negative electrode secondary volumetric interfacial current density", diff --git a/pybamm/expression_tree/averages.py b/pybamm/expression_tree/averages.py index b34ef9ab69..69f9d6275c 100644 --- a/pybamm/expression_tree/averages.py +++ b/pybamm/expression_tree/averages.py @@ -266,11 +266,7 @@ def r_average(symbol): :class:`Symbol` the new averaged symbol """ - has_particle_domain = ( - symbol.domain != [] - and "particle" in symbol.domain[0] - and "size" not in symbol.domain[0] - ) + has_particle_domain = symbol.domain != [] and symbol.domain[0].endswith("particle") # Can't take average if the symbol evaluates on edges if symbol.evaluates_on_edges("primary"): raise ValueError("Can't take the r-average of a symbol that evaluates on edges") diff --git a/pybamm/models/submodels/particle/fickian_diffusion.py b/pybamm/models/submodels/particle/fickian_diffusion.py index b4acc07763..7a5f1a67d5 100644 --- a/pybamm/models/submodels/particle/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/fickian_diffusion.py @@ -209,7 +209,7 @@ def get_coupled_variables(self, variables): if self.size_distribution is True: # Size-dependent flux variables variables.update(self._get_standard_flux_distribution_variables(N_s)) - f_a_dist = self.domain_param.f_a_dist(R) + f_a_dist = self.phase_param.f_a_dist(R) # Size-averaged flux variables (perform area-weighted avg manually as flux # evals on edges) N_s = pybamm.Integral(f_a_dist * N_s, R) diff --git a/pybamm/solvers/processed_variable.py b/pybamm/solvers/processed_variable.py index 7615ae1b6f..2771f2e5e6 100644 --- a/pybamm/solvers/processed_variable.py +++ b/pybamm/solvers/processed_variable.py @@ -171,7 +171,7 @@ def initialise_1D(self, fixed_t=False): # assign attributes for reference (either x_sol or r_sol) self.entries = entries self.dimensions = 1 - if self.domain[0] in ["negative particle", "positive particle"]: + if self.domain[0].endswith("particle"): self.first_dimension = "r" self.r_sol = space elif self.domain[0] in [ @@ -184,10 +184,7 @@ def initialise_1D(self, fixed_t=False): elif self.domain == ["current collector"]: self.first_dimension = "z" self.z_sol = space - elif self.domain[0] in [ - "negative particle size", - "positive particle size", - ]: + elif self.domain[0].endswith("particle size"): self.first_dimension = "R" self.R_sol = space else: @@ -303,13 +300,9 @@ def initialise_2D(self): ) # Process r-x, x-z, r-R, R-x, or R-z - if self.domain[0] in [ - "negative particle", - "positive particle", - ] and self.domains["secondary"][0] in [ - "negative electrode", - "positive electrode", - ]: + if self.domain[0].endswith("particle") and self.domains["secondary"][ + 0 + ].endswith("electrode"): self.first_dimension = "r" self.second_dimension = "x" self.r_sol = first_dim_pts @@ -327,43 +320,30 @@ def initialise_2D(self): self.second_dimension = "z" self.x_sol = first_dim_pts self.z_sol = second_dim_pts - elif self.domain[0] in [ - "negative particle", - "positive particle", - ] and self.domains["secondary"][0] in [ - "negative particle size", - "positive particle size", - ]: + elif self.domain[0].endswith("particle") and self.domains["secondary"][ + 0 + ].endswith("particle size"): self.first_dimension = "r" self.second_dimension = "R" self.r_sol = first_dim_pts self.R_sol = second_dim_pts - elif self.domain[0] in [ - "negative particle size", - "positive particle size", - ] and self.domains["secondary"][0] in [ - "negative electrode", - "positive electrode", - ]: + elif self.domain[0].endswith("particle size") and self.domains["secondary"][ + 0 + ].endswith("electrode"): self.first_dimension = "R" self.second_dimension = "x" self.R_sol = first_dim_pts self.x_sol = second_dim_pts - elif ( - self.domain[0] - in [ - "negative particle size", - "positive particle size", - ] - and self.domains["secondary"] == ["current collector"] - ): + elif self.domain[0].endswith("particle size") and self.domains["secondary"] == [ + "current collector" + ]: self.first_dimension = "R" self.second_dimension = "z" self.R_sol = first_dim_pts self.z_sol = second_dim_pts else: raise pybamm.DomainError( - f"Cannot process 3D object with domains '{self.domains}'." + f"Cannot process 2D object with domains '{self.domains}'." ) # assign attributes for reference diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 9ddbe4e6d8..68b8e622bc 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -162,17 +162,19 @@ def test_irreversible_plating_with_porosity(self): "lithium plating": "irreversible", "lithium plating porosity change": "true", } - param = pybamm.ParameterValues({ - "chemistry": "lithium_ion", - "cell": "LGM50_Chen2020", - "negative electrode": "graphite_Chen2020", - "separator": "separator_Chen2020", - "positive electrode": "nmc_Chen2020", - "electrolyte": "lipf6_Nyman2008", - "experiment": "1C_discharge_from_full_Chen2020", - "sei": "example", - "lithium plating": "okane2020_Li_plating", - }) + param = pybamm.ParameterValues( + { + "chemistry": "lithium_ion", + "cell": "LGM50_Chen2020", + "negative electrode": "graphite_Chen2020", + "separator": "separator_Chen2020", + "positive electrode": "nmc_Chen2020", + "electrolyte": "lipf6_Nyman2008", + "experiment": "1C_discharge_from_full_Chen2020", + "sei": "example", + "lithium plating": "okane2020_Li_plating", + } + ) self.run_basic_processing_test(options, parameter_values=param) def test_sei_reaction_limited(self): diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py new file mode 100644 index 0000000000..a3462c937e --- /dev/null +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py @@ -0,0 +1,129 @@ +# +# Tests for the surface formulation +# +import pybamm +import numpy as np +import unittest +from tests import StandardOutputComparison + + +class TestCompareOutputsTwoPhase(unittest.TestCase): + def compare_outputs_two_phase(self, model_class): + """ + Check that a two-phase graphite-graphite model gives the same results as a + standard one-phase graphite model + """ + # Standard model + model = model_class() + parameter_values = pybamm.ParameterValues("Chen2020") + sim = pybamm.Simulation(model, parameter_values=parameter_values) + sol = sim.solve([0, 3600]) + + # Two phase model + model_two_phase = model_class({"particle phases": ("2", "1")}) + + ratio = pybamm.InputParameter("ratio") + parameter_values_two_phase = pybamm.ParameterValues("Chen2020") + + for parameter in [ + "Negative electrode OCP [V]", + "Negative electrode OCP entropic change [V.K-1]", + "Maximum concentration in negative electrode [mol.m-3]", + "Initial concentration in negative electrode [mol.m-3]", + "Negative particle radius [m]", + "Negative electrode diffusivity [m2.s-1]", + "Negative electrode exchange-current density [A.m-2]", + "Negative electrode electrons in reaction", + ]: + parameter_values_two_phase.update( + { + f"Primary: {parameter}": parameter_values_two_phase[parameter], + f"Secondary: {parameter}": parameter_values_two_phase[parameter], + }, + check_already_exists=False, + ) + del parameter_values_two_phase[parameter] + parameter_values_two_phase.update( + { + "Primary: Negative electrode active material volume fraction" + "": parameter_values_two_phase[ + "Negative electrode active material volume fraction" + ] + * ratio, + "Secondary: Negative electrode active material volume " + "fraction": parameter_values_two_phase[ + "Negative electrode active material volume fraction" + ] + * (1 - ratio), + }, + check_already_exists=False, + ) + del parameter_values_two_phase[ + "Negative electrode active material volume fraction" + ] + + sim = pybamm.Simulation( + model_two_phase, parameter_values=parameter_values_two_phase + ) + for x in [0.1, 0.3, 0.5]: + sol_two_phase = sim.solve([0, 3600], inputs={"ratio": x}) + # Compare two phase model to standard model + for variable in [ + "X-averaged negative electrode active material volume fraction", + "X-averaged negative electrode interfacial current density", + "X-averaged negative electrode volumetric interfacial current density", + "Terminal voltage [V]", + ]: + np.testing.assert_array_almost_equal( + sol[variable].entries, sol_two_phase[variable].entries, decimal=2 + ) + + # Compare each phase in the two-phase model + np.testing.assert_array_almost_equal( + sol_two_phase["Negative primary particle concentration"].entries, + sol_two_phase["Negative secondary particle concentration"].entries, + decimal=6, + ) + np.testing.assert_array_almost_equal( + sol_two_phase[ + "Negative electrode primary interfacial current density" + ].entries + / x, + sol_two_phase[ + "Negative electrode secondary interfacial current density" + ].entries + / (1 - x), + decimal=6, + ) + np.testing.assert_array_almost_equal( + sol_two_phase[ + "Negative electrode primary active material volume fraction" + ].entries + / x, + sol_two_phase[ + "Negative electrode secondary active material volume fraction" + ].entries + / (1 - x), + decimal=6, + ) + + def test_compare_SPM(self): + model_class = pybamm.lithium_ion.SPM + self.compare_outputs_two_phase(model_class) + + def test_compare_SPMe(self): + model_class = pybamm.lithium_ion.SPMe + self.compare_outputs_two_phase(model_class) + + def test_compare_DFN(self): + model_class = pybamm.lithium_ion.DFN + self.compare_outputs_two_phase(model_class) + + +if __name__ == "__main__": + print("Add -v for more debug output") + import sys + + if "-v" in sys.argv: + debug = True + unittest.main() diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index ea80b10e36..c6ca49b3f3 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -313,3 +313,14 @@ def external_circuit_function(variables): options = {"operating mode": external_circuit_function} self.check_well_posedness(options) + + def test_wel_posed_particle_phases(self): + options = {"particle phases": "2"} + self.check_well_posedness(options) + + options = {"particle phases": ("2", "1")} + self.check_well_posedness(options) + + options = {"particle phases": ("1", "2")} + self.check_well_posedness(options) + \ No newline at end of file diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py index ec97b3e80b..1916c8818c 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py @@ -15,6 +15,9 @@ def test_electrolyte_options(self): with self.assertRaisesRegex(pybamm.OptionError, "electrolyte conductivity"): pybamm.lithium_ion.NewmanTobias(options) + def test_wel_posed_particle_phases(self): + pass # skip this test + if __name__ == "__main__": print("Add -v for more debug output") From fe2e2110189bcb4452c3a44da9f7484f762bbede Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 18 Aug 2022 15:31:12 +0100 Subject: [PATCH 32/47] revert some unneeded changes, fix flake8 and changelog --- CHANGELOG.md | 16 +- examples/notebooks/compare-ecker-data.ipynb | 286 ------------------ examples/notebooks/models/DFN.ipynb | 15 +- examples/notebooks/models/MPM.ipynb | 2 +- examples/notebooks/models/SEI-on-cracks.ipynb | 15 +- .../change-input-current.ipynb | 8 +- examples/scripts/compare_lithium_ion.py | 14 +- .../scripts/compare_lithium_ion_half_cell.py | 2 +- .../scripts/compare_lithium_ion_two_phase.py | 10 - .../lithium_ion/seis/OKane2022/README 2.md | 12 - .../test_compare_outputs_two_phase.py | 1 - .../base_lithium_ion_tests.py | 3 +- .../standard_submodel_unit_tests.py | 52 ---- tests/unit/test_solvers/test_idaklu_solver.py | 51 ++-- .../test_base_spatial_method.py | 2 +- 15 files changed, 60 insertions(+), 429 deletions(-) delete mode 100644 examples/notebooks/compare-ecker-data.ipynb delete mode 100644 pybamm/input/parameters/lithium_ion/seis/OKane2022/README 2.md delete mode 100644 tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c2364b5384..5a1378bdd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # [Unreleased](https://github.com/pybamm-team/PyBaMM/) +## Features + +- Reformated submodel structure to allow composite electrodes. Composite positive electrode is now also possible. With current implementation, electrodes can have at most two phases. ([#2248](https://github.com/pybamm-team/PyBaMM/pull/2248)) + ## Bug fixes - Added new parameter `Ratio of lithium moles to SEI moles` (short name z_sei) to fix a bug where this number was incorrectly hardcoded to 1. ([#2222](https://github.com/pybamm-team/PyBaMM/pull/2222)) @@ -11,6 +15,10 @@ - Added limits for variables in some functions to avoid division by zero, sqrt(negative number), etc ([#2213](https://github.com/pybamm-team/PyBaMM/pull/2213)) +## Breaking changes + +- Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2248](https://github.com/pybamm-team/PyBaMM/pull/2248)) + # [v22.7](https://github.com/pybamm-team/PyBaMM/tree/v22.7) - 2022-07-31 ## Features @@ -44,17 +52,14 @@ ## Breaking changes -- Parameters specific to a (primary/secondary) phase in a domain are doubly nested. e.g. `param.c_n_max` is now `param.n.prim.c_max` ([#2166](https://github.com/pybamm-team/PyBaMM/pull/2166)) - Exchange-current density functions (and some other functions) now take an additional argument, the maximum particle concentration for that phase ([#2134](https://github.com/pybamm-team/PyBaMM/pull/2134)) -- Loss of lithium to SEI on cracks is now a degradation variable, so setting a particle mechanics submodel is now compulsory (NoMechanics will suffice) +- Loss of lithium to SEI on cracks is now a degradation variable, so setting a particle mechanics submodel is now compulsory (NoMechanics will suffice) ([#2104](https://github.com/pybamm-team/PyBaMM/pull/2104)) # [v22.6](https://github.com/pybamm-team/PyBaMM/tree/v22.6) - 2022-06-30 ## Features - Added open-circuit potential as a separate submodel ([#2094](https://github.com/pybamm-team/PyBaMM/pull/2094)) -- Reformated submodel structure to allow composite electrodes, with an example for graphite/silicon. Composite positive electrode is now also possible. With current implementation, electrodes can have at most two phases. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) -- Added "Chen2020_composite" parameter set for a composite graphite/silicon electrode. Silicon parameters are added as a standard negative electrode parameter set, specified as the "negative electrode secondary" set, which automatically adds "Secondary:" to the start of each parameter name. Primary (graphite) parameter names are unchanged. ([#2073](https://github.com/pybamm-team/PyBaMM/pull/2073)) - Added partially reversible lithium plating model and new `OKane2022` parameter set to go with it ([#2043](https://github.com/pybamm-team/PyBaMM/pull/2043)) - Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) @@ -80,8 +85,7 @@ ## Breaking changes -- Exchange-current density functions now take a fourth argument, the maximum particle concentration for that phase -- Changed domain-specific parameter names to a nested attribute. `param.l_n` is now `param.n.l` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) +- Changed domain-specific parameter names to a nested attribute. `param.n.l_n` is now `param.n.l` ([#2063](https://github.com/pybamm-team/PyBaMM/pull/2063)) # [v22.4](https://github.com/pybamm-team/PyBaMM/tree/v22.4) - 2022-04-30 diff --git a/examples/notebooks/compare-ecker-data.ipynb b/examples/notebooks/compare-ecker-data.ipynb deleted file mode 100644 index 8d1c69380d..0000000000 --- a/examples/notebooks/compare-ecker-data.ipynb +++ /dev/null @@ -1,286 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Comparing with Experimental Data\n", - "\n", - "In this notebook we show how to compare results generated in PyBaMM with experimental data. We compare the results of the DFN model (see the [DFN notebook](./models/DFN.ipynb)) with the experimental data from Ecker et. al. [[3]](#References). Results are compared for a constant current discharge at 1C and at 5C." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we import pybamm and any other packages required by this example, and then change our working directory to the root of the pybamm folder." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "import os\n", - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "os.chdir(pybamm.__path__[0]+'/..')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We then load the Ecker data in from the `.csv` files using `pandas`" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "voltage_data_1C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_1C.csv\", header=None).to_numpy()\n", - "voltage_data_5C = pd.read_csv(\"pybamm/input/discharge_data/Ecker2015/Ecker_5C.csv\", header=None).to_numpy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the data is Time [s] vs Voltage [V]." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We load the DFN model and select the parameter set from the Ecker paper [1]. We update the C-rate an `InputParameter` so that we can re-run the same model at different C-rates without the need to rebuild the model. This is done by passing the flag `[input]`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# choose DFN\n", - "model1 = pybamm.lithium_ion.SPMe()\n", - "model2 = pybamm.lithium_ion.DFN()\n", - "\n", - "# pick parameters, keeping C-rate as an input to be changed for each solve\n", - "chemistry = pybamm.parameter_sets.Ecker2015\n", - "parameter_values = pybamm.ParameterValues(chemistry=chemistry)\n", - "parameter_values.update({\"Current function [A]\": \"[input]\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this comparison we choose a fine mesh of 1 finite volume per micron in the electrodes and separator and 1 finite volume per 0.1 micron in the particles" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "var = pybamm.standard_spatial_vars\n", - "var_pts = {\n", - " var.x_n: int(parameter_values.evaluate(model1.param.L_n / 1e-6)),\n", - " var.x_s: int(parameter_values.evaluate(model1.param.L_s / 1e-6)),\n", - " var.x_p: int(parameter_values.evaluate(model1.param.L_p / 1e-6)),\n", - " var.r_n: int(parameter_values.evaluate(model1.param.R_n_typ / 1e-7)),\n", - " var.r_p: int(parameter_values.evaluate(model1.param.R_p_typ / 1e-7)),\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We create a simulation using our model, parameters and number of grid points" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "sim1 = pybamm.Simulation(model1, parameter_values=parameter_values, var_pts=var_pts)\n", - "sim2 = pybamm.Simulation(model2, parameter_values=parameter_values, var_pts=var_pts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then solve the model for a 1C and 5C discharge " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "C_rates = [1, 5] # C-rates to solve for\n", - "capacity = parameter_values[\"Nominal cell capacity [A.h]\"]\n", - "t_evals = [\n", - " np.linspace(0, 3800, 100), \n", - " np.linspace(0, 720, 100)\n", - "] # times to return the solution at\n", - "solutions1 = [None] * len(C_rates) # empty list that will hold solutions\n", - "solutions2 = [None] * len(C_rates) # empty list that will hold solutions\n", - "\n", - "# loop over C-rates\n", - "for i, C_rate in enumerate(C_rates):\n", - " current = C_rate * capacity\n", - " sim1.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", - " solutions1[i] = sim1.solution\n", - " sim2.solve(t_eval=t_evals[i], solver=pybamm.CasadiSolver(mode=\"fast\"),inputs={\"Current function [A]\": current})\n", - " solutions2[i] = sim2.solution" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally we plot the numerical solution against the experimental data" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 4))\n", - "\n", - "# plot the 1C results\n", - "t_sol = solutions1[0][\"Time [s]\"].entries\n", - "ax1.plot(t_sol, solutions1[0][\"Terminal voltage [V]\"](t_sol))\n", - "t_sol = solutions2[0][\"Time [s]\"].entries\n", - "ax1.plot(t_sol, solutions2[0][\"Terminal voltage [V]\"](t_sol))\n", - "ax1.plot(voltage_data_1C[:,0], voltage_data_1C[:,1], \"o\")\n", - "ax1.set_xlabel(\"Time [s]\")\n", - "ax1.set_ylabel(\"Voltage [V]\")\n", - "ax1.set_title(\"1C\")\n", - "ax1.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", - "\n", - "# plot the 5C results\n", - "t_sol = solutions1[1][\"Time [s]\"].entries\n", - "ax2.plot(t_sol, solutions1[1][\"Terminal voltage [V]\"](t_sol))\n", - "t_sol = solutions2[1][\"Time [s]\"].entries\n", - "ax2.plot(t_sol, solutions2[1][\"Terminal voltage [V]\"](t_sol))\n", - "ax2.plot(voltage_data_5C[:,0], voltage_data_5C[:,1], \"o\")\n", - "ax2.set_xlabel(\"Time [s]\")\n", - "ax2.set_ylabel(\"Voltage [V]\")\n", - "ax2.set_title(\"5C\")\n", - "ax2.legend([\"SPMe\", \"DFN\", \"Experiment\"], loc=\"best\")\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For a 1C discharge we observe an excellent agreement between the model and experiment, both in terms of the overall shape of the curve and the capacity. The agreement between model and experiment is less good at 5C, but in line with other implementations of the DFN (e.g. [[6]](#References)). " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", - "[3] Madeleine Ecker, Stefan Käbitz, Izaro Laresgoiti, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: II. Model Validation. Journal of The Electrochemical Society, 162(9):A1849–A1857, 2015. doi:10.1149/2.0541509jes.\n", - "[4] Madeleine Ecker, Thi Kim Dung Tran, Philipp Dechent, Stefan Käbitz, Alexander Warnecke, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: I. Determination of Parameters. Journal of the Electrochemical Society, 162(9):A1836–A1848, 2015. doi:10.1149/2.0551509jes.\n", - "[5] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[6] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[7] Giles Richardson, Ivan Korotkin, Rahifa Ranom, Michael Castle, and Jamie M. Foster. Generalised single particle models for high-rate operation of graded lithium-ion electrodes: systematic derivation and validation. Electrochimica Acta, 339:135862, 2020. doi:10.1016/j.electacta.2020.135862.\n", - "[8] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/models/DFN.ipynb b/examples/notebooks/models/DFN.ipynb index 2cd768ed2e..10ca9f8b43 100644 --- a/examples/notebooks/models/DFN.ipynb +++ b/examples/notebooks/models/DFN.ipynb @@ -297,20 +297,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true + "version": "3.9.0" } }, "nbformat": 4, diff --git a/examples/notebooks/models/MPM.ipynb b/examples/notebooks/models/MPM.ipynb index 3660f3ba7b..df3bbf649a 100644 --- a/examples/notebooks/models/MPM.ipynb +++ b/examples/notebooks/models/MPM.ipynb @@ -973,7 +973,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.9.0" }, "toc": { "base_numbering": 1, diff --git a/examples/notebooks/models/SEI-on-cracks.ipynb b/examples/notebooks/models/SEI-on-cracks.ipynb index 71d70bd47e..e93529d79d 100644 --- a/examples/notebooks/models/SEI-on-cracks.ipynb +++ b/examples/notebooks/models/SEI-on-cracks.ipynb @@ -20,7 +20,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" + "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.\n", + "You should consider upgrading via the '/home/sokane/PyBaMM/env/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" ] } ], @@ -124,7 +126,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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\n", "text/plain": [ "
" ] @@ -195,7 +197,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.8.12 ('conda_jl')", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -209,12 +211,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "vscode": { - "interpreter": { - "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" - } + "version": "3.8.10" } }, "nbformat": 4, diff --git a/examples/notebooks/parameterization/change-input-current.ipynb b/examples/notebooks/parameterization/change-input-current.ipynb index 4a296b7ac3..44c17514cf 100644 --- a/examples/notebooks/parameterization/change-input-current.ipynb +++ b/examples/notebooks/parameterization/change-input-current.ipynb @@ -72,7 +72,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "34863ef9d7fb4b83a9db107cbe534616", + "model_id": "aef64b871f1346a4b42c722c7eecfe38", "version_major": 2, "version_minor": 0 }, @@ -111,7 +111,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "590814de9055434f959b6925097c76a4", + "model_id": "6447d4f706374208b5cbd283577b5da5", "version_major": 2, "version_minor": 0 }, @@ -183,7 +183,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0f52c24ce31b4ff9bad73c37e9d0dd32", + "model_id": "84f87c3d21644c20bafdac8e9b69247d", "version_major": 2, "version_minor": 0 }, @@ -275,7 +275,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b0d73894ac2a4609acb7751a644ba65b", + "model_id": "6c06d938eca0491d88cdcbb29c59cd2a", "version_major": 2, "version_minor": 0 }, diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 00cf6c8898..6108036b9b 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -12,23 +12,13 @@ pybamm.lithium_ion.DFN(), pybamm.lithium_ion.NewmanTobias(), ] -parameter_values = pybamm.ParameterValues("Chen2020") # create and run simulations sims = [] for model in models: - sim = pybamm.Simulation(model, parameter_values=parameter_values) + sim = pybamm.Simulation(model) sim.solve([0, 3600]) sims.append(sim) # plot -pybamm.dynamic_plot( - sims, - [ - "Terminal voltage [V]", - "X-averaged negative electrode active material volume fraction", - "Average negative particle concentration", - "X-averaged negative electrode interfacial current density", - "Current [A]", - ], -) +pybamm.dynamic_plot(sims) diff --git a/examples/scripts/compare_lithium_ion_half_cell.py b/examples/scripts/compare_lithium_ion_half_cell.py index fef68bc22d..b6396724f4 100644 --- a/examples/scripts/compare_lithium_ion_half_cell.py +++ b/examples/scripts/compare_lithium_ion_half_cell.py @@ -3,7 +3,7 @@ # import pybamm -pybamm.set_logging_level("DEBUG") +pybamm.set_logging_level("INFO") # load models models = [ diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py index c6d46b323f..1a33061d73 100644 --- a/examples/scripts/compare_lithium_ion_two_phase.py +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -78,16 +78,6 @@ "X-averaged negative electrode secondary interfacial current density", "X-averaged negative electrode interfacial current density", ], - [ - "Negative electrode primary interfacial current density", - "Negative electrode secondary interfacial current density", - "Negative electrode interfacial current density", - ], - [ - "X-averaged negative electrode primary volumetric interfacial current density", - "X-averaged negative electrode secondary volumetric interfacial current density", - "X-averaged negative electrode volumetric interfacial current density", - ], "Current [A]", ], ) diff --git a/pybamm/input/parameters/lithium_ion/seis/OKane2022/README 2.md b/pybamm/input/parameters/lithium_ion/seis/OKane2022/README 2.md deleted file mode 100644 index 7e4df9e041..0000000000 --- a/pybamm/input/parameters/lithium_ion/seis/OKane2022/README 2.md +++ /dev/null @@ -1,12 +0,0 @@ -# SEI parameters - -Some example parameters for SEI growth from the papers: - -> Ramadass, P., Haran, B., Gomadam, P. M., White, R., & Popov, B. N. (2004). Development of first principles capacity fade model for Li-ion cells. Journal of the Electrochemical Society, 151(2), A196-A203. -> Ploehn, H. J., Ramadass, P., & White, R. E. (2004). Solvent diffusion model for aging of lithium-ion battery cells. Journal of The Electrochemical Society, 151(3), A456-A462. -> Single, F., Latz, A., & Horstmann, B. (2018). Identifying the mechanism of continued growth of the solid–electrolyte interphase. ChemSusChem, 11(12), 1950-1955. -> Safari, M., Morcrette, M., Teyssot, A., & Delacour, C. (2009). Multimodal Physics-Based Aging Model for Life Prediction of Li-Ion Batteries. Journal of The Electrochemical Society, 156(3), -> Yang, X., Leng, Y., Zhang, G., Ge, S., Wang, C. (2017). Modeling of lithium plating induced aging of lithium-ion batteries: Transition from linear to nonlinear aging. Journal of Power Sources, 360, 28-40. -> Waldmann, T., Wilka, M., Kasper, M., Fleischammer M., Wohlfahrt-Mehrens M. (2014). Temperature dependent ageing mechanisms in Lithium-ion batteris: A Post-Mortem study. Journal of Power Sources, 262, 129-135. - -Note: this parameter set does not claim to be representative of the true parameter values. Instead these are parameter values that were used to fit SEI models to observed experimental data in the referenced papers. diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py index a3462c937e..20ba690f4a 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_outputs_two_phase.py @@ -4,7 +4,6 @@ import pybamm import numpy as np import unittest -from tests import StandardOutputComparison class TestCompareOutputsTwoPhase(unittest.TestCase): diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index c6ca49b3f3..71dec123b0 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -320,7 +320,6 @@ def test_wel_posed_particle_phases(self): options = {"particle phases": ("2", "1")} self.check_well_posedness(options) - + options = {"particle phases": ("1", "2")} self.check_well_posedness(options) - \ No newline at end of file diff --git a/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py b/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py deleted file mode 100644 index 6ca166afea..0000000000 --- a/tests/unit/test_models/test_submodels/standard_submodel_unit_tests.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# Standard tests for the public methods of submodels -# - - -class StandardSubModelTests(object): - - """Basic tests for submodels. Just tests everything runs without raising error""" - - def __init__(self, submodel, variables=None): - # variables should be a dict of variables which are needed by the submodels - # to run all its functions propertly - if not variables: - variables = {} - self.submodel = submodel - self.variables = variables - self.external_variables = [] - - def test_get_fundamental_variables(self): - self.variables.update(self.submodel.get_fundamental_variables()) - - def test_get_external_variables(self): - external_variables = self.submodel.get_external_variables() - self.external_variables += external_variables - - def test_get_coupled_variables(self): - self.variables.update(self.submodel.get_coupled_variables(self.variables)) - - def test_set_rhs(self): - self.submodel.set_rhs(self.variables) - - def test_set_algebraic(self): - self.submodel.set_algebraic(self.variables) - - def test_set_boundary_conditions(self): - self.submodel.set_boundary_conditions(self.variables) - - def test_set_initial_conditions(self): - self.submodel.set_initial_conditions(self.variables) - - def test_set_events(self): - self.submodel.set_events(self.variables) - - def test_all(self): - self.test_get_fundamental_variables() - self.test_get_external_variables() - self.test_get_coupled_variables() - self.test_set_rhs() - self.test_set_algebraic() - self.test_set_boundary_conditions() - self.test_set_initial_conditions() - self.test_set_events() diff --git a/tests/unit/test_solvers/test_idaklu_solver.py b/tests/unit/test_solvers/test_idaklu_solver.py index 61f6f9607a..e0957c7082 100644 --- a/tests/unit/test_solvers/test_idaklu_solver.py +++ b/tests/unit/test_solvers/test_idaklu_solver.py @@ -72,7 +72,9 @@ def test_model_events(self): disc = pybamm.Discretisation() model_disc = disc.process_model(model, inplace=False) # Solve - solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) + solver = pybamm.IDAKLUSolver( + rtol=1e-8, atol=1e-8, root_method=root_method + ) t_eval = np.linspace(0, 1, 100) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) @@ -83,7 +85,9 @@ def test_model_events(self): # enforce events that won't be triggered model.events = [pybamm.Event("an event", var + 1)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) + solver = pybamm.IDAKLUSolver( + rtol=1e-8, atol=1e-8, root_method=root_method + ) solution = solver.solve(model_disc, t_eval) np.testing.assert_array_equal(solution.t, t_eval) np.testing.assert_array_almost_equal( @@ -93,7 +97,9 @@ def test_model_events(self): # enforce events that will be triggered model.events = [pybamm.Event("an event", var - 1.01)] model_disc = disc.process_model(model, inplace=False) - solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) + solver = pybamm.IDAKLUSolver( + rtol=1e-8, atol=1e-8, root_method=root_method + ) solution = solver.solve(model_disc, t_eval) self.assertLess(len(solution.t), len(t_eval)) np.testing.assert_array_almost_equal( @@ -115,7 +121,9 @@ def test_model_events(self): disc = get_discretisation_for_testing() disc.process_model(model) - solver = pybamm.IDAKLUSolver(rtol=1e-8, atol=1e-8, root_method=root_method) + solver = pybamm.IDAKLUSolver( + rtol=1e-8, atol=1e-8, root_method=root_method + ) t_eval = np.linspace(0, 5, 100) solution = solver.solve(model, t_eval) np.testing.assert_array_less(solution.y[0, :-1], 1.5) @@ -160,13 +168,13 @@ def test_input_params(self): b_value = np.array([[0.2], [0.3]]) sol = solver.solve( - model, - t_eval, - inputs={"a": a_value, "b": b_value}, + model, t_eval, inputs={"a": a_value, "b": b_value}, ) # test that y[3] remains constant - np.testing.assert_array_almost_equal(sol.y[3, :], np.ones(sol.t.shape)) + np.testing.assert_array_almost_equal( + sol.y[3, :], np.ones(sol.t.shape) + ) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -206,13 +214,13 @@ def test_ida_roberts_klu_sensitivities(self): # solve first without sensitivities sol = solver.solve( - model, - t_eval, - inputs={"a": a_value}, + model, t_eval, inputs={"a": a_value}, ) # test that y[1] remains constant - np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) + np.testing.assert_array_almost_equal( + sol.y[1, :], np.ones(sol.t.shape) + ) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -224,11 +232,14 @@ def test_ida_roberts_klu_sensitivities(self): # now solve with sensitivities (this should cause set_up to be run again) sol = solver.solve( - model, t_eval, inputs={"a": a_value}, calculate_sensitivities=True + model, t_eval, inputs={"a": a_value}, + calculate_sensitivities=True ) # test that y[1] remains constant - np.testing.assert_array_almost_equal(sol.y[1, :], np.ones(sol.t.shape)) + np.testing.assert_array_almost_equal( + sol.y[1, :], np.ones(sol.t.shape) + ) # test that y[0] = to true solution true_solution = a_value * sol.t @@ -244,7 +255,9 @@ def test_ida_roberts_klu_sensitivities(self): dyda_fd = (sol_plus.y - sol_neg.y) / h dyda_fd = dyda_fd.transpose().reshape(-1, 1) - np.testing.assert_array_almost_equal(dyda_ida, dyda_fd) + np.testing.assert_array_almost_equal( + dyda_ida, dyda_fd + ) def test_set_atol(self): model = pybamm.lithium_ion.DFN() @@ -282,7 +295,7 @@ def test_set_atol(self): # wrong size (should fail) atol = [1, 2] solver = pybamm.IDAKLUSolver(atol=atol) - with self.assertRaisesRegex(pybamm.SolverError, "Absolute tolerances"): + with self.assertRaisesRegex(pybamm.SolverError, 'Absolute tolerances'): solver.solve(model, t_eval) def test_failures(self): @@ -317,7 +330,7 @@ def test_failures(self): # will give solver error t_eval = np.linspace(0, -3, 100) with self.assertRaisesRegex( - pybamm.SolverError, "t_eval must increase monotonically" + pybamm.SolverError, 't_eval must increase monotonically' ): solver.solve(model, t_eval) @@ -333,7 +346,9 @@ def test_failures(self): solver = pybamm.IDAKLUSolver() t_eval = np.linspace(0, 3, 100) - with self.assertRaisesRegex(pybamm.SolverError, "idaklu solver failed"): + with self.assertRaisesRegex( + pybamm.SolverError, 'idaklu solver failed' + ): solver.solve(model, t_eval) def test_dae_solver_algebraic_model(self): diff --git a/tests/unit/test_spatial_methods/test_base_spatial_method.py b/tests/unit/test_spatial_methods/test_base_spatial_method.py index 5d5fe8c46d..bfc6ceddec 100644 --- a/tests/unit/test_spatial_methods/test_base_spatial_method.py +++ b/tests/unit/test_spatial_methods/test_base_spatial_method.py @@ -7,7 +7,7 @@ from tests import ( get_mesh_for_testing, get_1p1d_mesh_for_testing, - get_size_distribution_mesh_for_testing, + get_size_distribution_mesh_for_testing ) From d2bc3c1df038ef1c8418214450eef121297f49fc Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 18 Aug 2022 19:52:37 +0100 Subject: [PATCH 33/47] add parameter back to Prada2013 --- .../experiments/4C_discharge_from_full_Prada2013/parameters.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv index 3b6920c990..ab13c6b7b4 100644 --- a/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv +++ b/pybamm/input/parameters/lithium_ion/experiments/4C_discharge_from_full_Prada2013/parameters.csv @@ -14,5 +14,6 @@ Lower voltage cut-off [V],2,, Upper voltage cut-off [V],4.4,, ,,, # Initial conditions,,, +Initial concentration in negative electrode [mol.m-3],28831.45783,Minimized to Severson Data, Initial concentration in positive electrode [mol.m-3],35.3766672,Minimized to Severson Data, Initial temperature [K],298.15,, From ad617f59aefc2400329d8c7465157b041eb51acd Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 19 Aug 2022 14:41:05 +0100 Subject: [PATCH 34/47] fix U_ref bug, working on coverage --- pybamm/geometry/battery_geometry.py | 20 ++++----- .../lead_acid/basic_full.py | 2 +- .../lithium_ion/basic_dfn_half_cell.py | 6 +-- .../submodels/electrode/ohm/li_metal.py | 4 +- .../base_electrolyte_conductivity.py | 6 +-- .../submodels/interface/base_interface.py | 4 +- .../interface/lithium_plating/plating.py | 2 +- .../open_circuit_potential/base_ocp.py | 8 ++-- .../open_circuit_potential/single_ocp.py | 2 +- pybamm/parameters/lead_acid_parameters.py | 20 ++++----- pybamm/parameters/lithium_ion_parameters.py | 44 ++++++------------- pybamm/parameters/parameter_values.py | 26 +---------- .../test_printing/test_print_name.py | 2 +- .../test_geometry/test_battery_geometry.py | 10 +++++ 14 files changed, 63 insertions(+), 93 deletions(-) diff --git a/pybamm/geometry/battery_geometry.py b/pybamm/geometry/battery_geometry.py index 4f6a89cc9c..4a71011411 100644 --- a/pybamm/geometry/battery_geometry.py +++ b/pybamm/geometry/battery_geometry.py @@ -32,6 +32,7 @@ def battery_geometry( A geometry class for the battery """ + options = pybamm.BatteryModelOptions(options or {}) geo = pybamm.geometric_parameters l_n = geo.n.l l_s = geo.s.l @@ -54,16 +55,15 @@ def battery_geometry( "positive particle": {"r_p": zero_one}, } ) - if isinstance(options, pybamm.BatteryModelOptions): - for domain in ["negative", "positive"]: - phases = int(getattr(options, domain)["particle phases"]) - if phases >= 2: - geometry.update( - { - f"{domain} primary particle": {"r_n_prim": zero_one}, - f"{domain} secondary particle": {"r_n_sec": zero_one}, - } - ) + for domain in ["negative", "positive"]: + phases = int(getattr(options, domain)["particle phases"]) + if phases >= 2: + geometry.update( + { + f"{domain} primary particle": {"r_n_prim": zero_one}, + f"{domain} secondary particle": {"r_n_sec": zero_one}, + } + ) # Add particle size domains if options is not None and options["particle size"] == "distribution": R_min_n = geo.n.prim.R_min diff --git a/pybamm/models/full_battery_models/lead_acid/basic_full.py b/pybamm/models/full_battery_models/lead_acid/basic_full.py index ce4005abf9..e821608da5 100644 --- a/pybamm/models/full_battery_models/lead_acid/basic_full.py +++ b/pybamm/models/full_battery_models/lead_acid/basic_full.py @@ -284,7 +284,7 @@ def __init__(self, name="Basic full model"): "Electrolyte concentration": c_e, "Current [A]": I, "Negative electrode potential [V]": pot * phi_s_n, - "Electrolyte potential [V]": -param.n.prim.U_ref + pot * phi_e, + "Electrolyte potential [V]": -param.n.U_ref + pot * phi_e, "Positive electrode potential [V]": param.ocv_ref + pot * phi_s_p, "Terminal voltage [V]": param.ocv_ref + pot * voltage, "Porosity": eps, diff --git a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py index 4fcec55709..8f92cee63d 100644 --- a/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py +++ b/pybamm/models/full_battery_models/lithium_ion/basic_dfn_half_cell.py @@ -142,8 +142,8 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): # Other parameters (for outputs) c_w_max = param.p.prim.c_max - U_w_ref = param.p.prim.U_ref - U_Li_ref = param.n.prim.U_ref + U_w_ref = param.p.U_ref + U_Li_ref = param.n.U_ref L_w = param.p.L # gamma_w is always 1 because we choose the timescale based on the working @@ -269,7 +269,7 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman half cell model"): "right": (pybamm.Scalar(0), "Neumann"), } - self.initial_conditions[phi_e] = param.n.prim.U_ref / pot_scale + self.initial_conditions[phi_e] = param.n.U_ref / pot_scale ###################### # (Some) variables diff --git a/pybamm/models/submodels/electrode/ohm/li_metal.py b/pybamm/models/submodels/electrode/ohm/li_metal.py index a85ca59d32..b8d624f7bf 100644 --- a/pybamm/models/submodels/electrode/ohm/li_metal.py +++ b/pybamm/models/submodels/electrode/ohm/li_metal.py @@ -22,7 +22,7 @@ def _get_li_metal_interface_variables(self, delta_phi_s, phi_s, phi_e): "Lithium metal interface electrode potential": phi_s, "Lithium metal interface electrode potential [V]": pot_scale * phi_s, "Lithium metal interface electrolyte potential": phi_e, - "Lithium metal interface electrolyte potential [V]": param.n.prim.U_ref + "Lithium metal interface electrolyte potential [V]": param.n.U_ref + pot_scale * phi_e, } return variables @@ -43,7 +43,7 @@ class LithiumMetalSurfaceForm(LithiumMetalBaseModel): """ def get_fundamental_variables(self): - ocp_ref = self.param.n.prim.U_ref + ocp_ref = self.param.n.U_ref pot_scale = self.param.potential_scale delta_phi = pybamm.Variable( diff --git a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py index d2b8912d07..be11743f2e 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/base_electrolyte_conductivity.py @@ -46,7 +46,7 @@ def _get_standard_potential_variables(self, phi_e_n, phi_e_s, phi_e_p): param = self.param pot_scale = param.potential_scale - U_ref = param.n.prim.U_ref + U_ref = param.n.U_ref phi_e = pybamm.concatenation(phi_e_n, phi_e_s, phi_e_p) @@ -188,7 +188,7 @@ def _get_standard_average_surface_potential_difference_variables( The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.prim.U_ref + ocp_ref = self.domain_param.U_ref variables = { "X-averaged " @@ -218,7 +218,7 @@ def _get_standard_surface_potential_difference_variables(self, delta_phi): The variables which can be derived from the surface potential difference. """ - ocp_ref = self.domain_param.prim.U_ref + ocp_ref = self.domain_param.U_ref # Broadcast if necessary if delta_phi.domain == []: diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 9795c26af2..9216c6fe82 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -384,7 +384,7 @@ def _get_standard_average_surface_potential_difference_variables( ): domain = self.domain.lower() - ocp_ref = self.phase_param.U_ref + ocp_ref = self.domain_param.U_ref delta_phi_av_dim = ocp_ref + delta_phi_av * self.param.potential_scale @@ -406,7 +406,7 @@ def _get_standard_average_surface_potential_difference_variables( def _get_standard_surface_potential_difference_variables(self, delta_phi): - ocp_ref = self.phase_param.U_ref + ocp_ref = self.domain_param.U_ref # Broadcast if necessary delta_phi_dim = ocp_ref + delta_phi * self.param.potential_scale diff --git a/pybamm/models/submodels/interface/lithium_plating/plating.py b/pybamm/models/submodels/interface/lithium_plating/plating.py index 8a8f13a3c1..f9994b1568 100644 --- a/pybamm/models/submodels/interface/lithium_plating/plating.py +++ b/pybamm/models/submodels/interface/lithium_plating/plating.py @@ -74,7 +74,7 @@ def get_coupled_variables(self, variables): j0_stripping = param.j0_stripping(c_e_n, c_plated_Li, T) j0_plating = param.j0_plating(c_e_n, c_plated_Li, T) # phi_ref is part of the de-dimensionalization used in PyBaMM - phi_ref = param.n.prim.U_ref / param.potential_scale + phi_ref = param.n.U_ref / param.potential_scale eta_stripping = delta_phi + phi_ref + eta_sei eta_plating = -eta_stripping diff --git a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py index 57dae2ea37..30c06bb782 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py @@ -73,8 +73,8 @@ def _get_standard_ocp_variables(self, ocp, dUdT): ocp = pybamm.PrimaryBroadcast(ocp, self.domain_for_broadcast) pot_scale = self.param.potential_scale - ocp_dim = self.phase_param.U_ref + pot_scale * ocp - ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av + ocp_dim = self.domain_param.U_ref + pot_scale * ocp + ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av variables.update( { @@ -124,8 +124,8 @@ def _get_standard_size_distribution_ocp_variables(self, ocp, dUdT): dUdT_av = pybamm.x_average(dUdT) pot_scale = self.param.potential_scale - ocp_dim = self.phase_param.U_ref + pot_scale * ocp - ocp_av_dim = self.phase_param.U_ref + pot_scale * ocp_av + ocp_dim = self.domain_param.U_ref + pot_scale * ocp + ocp_av_dim = self.domain_param.U_ref + pot_scale * ocp_av variables = { f"{Domain} electrode {reaction_name}" diff --git a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py index f994145cfd..ad01dbd867 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py @@ -45,7 +45,7 @@ def get_coupled_variables(self, variables): dUdT = self.phase_param.dUdT(c_s_surf) elif self.reaction == "lithium metal plating": T = variables[f"{Domain} electrode temperature"] - ocp = self.param.n.prim.U_ref + ocp = self.param.n.U_ref dUdT = 0 * T elif self.reaction == "lead-acid main": c_e = variables[f"{Domain} electrolyte concentration"] diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index ad16c2007b..211c069a2d 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -331,7 +331,7 @@ def _set_dimensionless_parameters(self): ) # Electrical - self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref + self.ocv_ref = self.p.U_ref - self.n.U_ref self.voltage_low_cut = ( self.voltage_low_cut_dimensional - self.ocv_ref ) / self.potential_scale @@ -540,6 +540,12 @@ def _set_scales(self): for phase in self.phases: phase._set_scales() + # Reference OCP + inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} + self.U_ref = pybamm.FunctionParameter( + f"{self.domain} electrode open-circuit potential [V]", inputs + ) + def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" main = self.main_param @@ -696,12 +702,6 @@ def _set_scales(self): # Electrical self.j_scale = self.main_param.i_typ / (self.a_typ * self.main_param.L_x) - # Reference OCP - inputs = {"Electrolyte concentration [mol.m-3]": pybamm.Scalar(1)} - self.U_ref = pybamm.FunctionParameter( - f"{self.domain} electrode open-circuit potential [V]", inputs - ) - def _set_dimensionless_parameters(self): """Defines the dimensionless parameters""" main = self.main_param @@ -721,15 +721,15 @@ def _set_dimensionless_parameters(self): # Electrochemical reactions # Oxygen - self.U_Ox = (main.U_Ox_dim - self.U_ref) / main.potential_scale - self.U_Hy = (main.U_Hy_dim - self.U_ref) / main.potential_scale + self.U_Ox = (main.U_Ox_dim - self.domain_param.U_ref) / main.potential_scale + self.U_Hy = (main.U_Hy_dim - self.domain_param.U_ref) / main.potential_scale def U(self, c_e, T): """Dimensionless open-circuit voltage in the negative electrode""" c_e_dimensional = c_e * self.main_param.c_e_typ T_dim = self.main_param.Delta_T * T + self.main_param.T_ref return ( - self.U_dimensional(c_e_dimensional, T_dim) - self.U_ref + self.U_dimensional(c_e_dimensional, T_dim) - self.domain_param.U_ref ) / self.main_param.potential_scale def j0(self, c_e, T): diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 53a6bb16f6..c75096f4bb 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -188,7 +188,7 @@ def _set_dimensional_parameters(self): self.n_Li_init = self.n_Li_particles_init + self.n_Li_e_init # Reference OCP based on initial concentration - self.ocv_ref = self.p.prim.U_ref - self.n.prim.U_ref + self.ocv_ref = self.p.U_ref - self.n.U_ref self.ocv_init_dim = self.p.prim.U_init_dim - self.n.prim.U_init_dim def D_e_dimensional(self, c_e, T): @@ -334,7 +334,7 @@ def _set_dimensionless_parameters(self): self.C_sei_reaction = ( self.n.prim.j_scale / self.m_sei_dimensional - ) * pybamm.exp(-(self.F * self.n.prim.U_ref / (2 * self.R * self.T_ref))) + ) * pybamm.exp(-(self.F * self.n.U_ref / (2 * self.R * self.T_ref))) self.C_sei_solvent = ( self.n.prim.j_scale @@ -397,7 +397,7 @@ def _set_dimensionless_parameters(self): pybamm.exp( -( self.F - * (self.n.prim.U_ref - self.U_sei_dim) + * (self.n.U_ref - self.U_sei_dim) / (2 * self.R * self.T_ref) ) ) @@ -585,6 +585,10 @@ def _set_dimensional_parameters(self): self.epsilon_inactive = 1 - self.epsilon_init - epsilon_s_tot self.cap_init = sum(phase.cap_init for phase in self.phases) + # Use primary phase to set the reference potential + self.U_ref = self.prim.U_dimensional(self.prim.c_init_av, main.T_ref) + else: + self.U_ref = pybamm.Scalar(0) self.n_Li_init = sum(phase.n_Li_init for phase in self.phases) @@ -650,28 +654,6 @@ def sigma_dimensional(self, T): f"{self.domain} electrode conductivity [S.m-1]", inputs ) - def j0_stripping_dimensional(self, c_e, c_Li, T): - """Dimensional exchange-current density for stripping [A.m-2]""" - inputs = { - "Electrolyte concentration [mol.m-3]": c_e, - "Plated lithium concentration [mol.m-3]": c_Li, - "Temperature [K]": T, - } - return pybamm.FunctionParameter( - "Exchange-current density for stripping [A.m-2]", inputs - ) - - def j0_plating_dimensional(self, c_e, c_Li, T): - """Dimensional exchange-current density for plating [A.m-2]""" - inputs = { - "Electrolyte concentration [mol.m-3]": c_e, - "Plated lithium concentration [mol.m-3]": c_Li, - "Temperature [K]": T, - } - return pybamm.FunctionParameter( - "Exchange-current density for plating [A.m-2]", inputs - ) - def _set_scales(self): """Define the scales used in the non-dimensionalisation scheme""" for phase in self.phases: @@ -845,7 +827,6 @@ def _set_dimensional_parameters(self): if self.main_param.half_cell and self.domain == "Negative": self.n_Li_init = pybamm.Scalar(0) - self.U_ref = pybamm.Scalar(0) self.U_init_dim = pybamm.Scalar(0) else: self.epsilon_s = pybamm.FunctionParameter( @@ -864,7 +845,7 @@ def _set_dimensional_parameters(self): ) / self.c_max ) - c_init_av = pybamm.xyz_average(pybamm.r_average(self.c_init)) + self.c_init_av = pybamm.xyz_average(pybamm.r_average(self.c_init)) eps_c_init_av = pybamm.xyz_average( self.epsilon_s * pybamm.r_average(self.c_init) ) @@ -878,8 +859,7 @@ def _set_dimensional_parameters(self): ) self.cap_init = self.elec_loading * main.A_cc - self.U_ref = self.U_dimensional(c_init_av, main.T_ref) - self.U_init_dim = self.U_dimensional(c_init_av, main.T_init_dim) + self.U_init_dim = self.U_dimensional(self.c_init_av, main.T_init_dim) def D_dimensional(self, sto, T): """Dimensional diffusivity in particle. Note this is defined as a @@ -1013,7 +993,9 @@ def _set_dimensionless_parameters(self): if main.half_cell and self.domain == "Negative": self.U_init = pybamm.Scalar(0) else: - self.U_init = (self.U_init_dim - self.U_ref) / main.potential_scale + self.U_init = ( + self.U_init_dim - self.domain_param.U_ref + ) / main.potential_scale def D(self, c_s, T): """Dimensionless particle diffusivity""" @@ -1039,7 +1021,7 @@ def U(self, c_s, T, lithiation=None): sto = c_s T_dim = self.main_param.Delta_T * T + self.main_param.T_ref return ( - self.U_dimensional(sto, T_dim, lithiation) - self.U_ref + self.U_dimensional(sto, T_dim, lithiation) - self.domain_param.U_ref ) / main.potential_scale def dUdT(self, c_s): diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index 382fbea8ad..6252b80c92 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -179,14 +179,8 @@ def update_from_chemistry(self, chemistry): ] # add SEI parameters if provided - for extra_group in [ - "sei", - "lithium plating", - "negative secondary particle", - ]: + for extra_group in ["sei", "lithium plating"]: if extra_group in chemistry: - # do extra groups first, as later we will check whether a parameter - # appears with "Secondary:" (in which case we change it to "Primary:") component_groups = [extra_group] + component_groups for component_group in component_groups: @@ -200,15 +194,6 @@ def update_from_chemistry(self, chemistry): ) ) # Create path to component and load values - prefactor = "" - if component_group == "negative secondary particle": - component_group = "negative electrode" - prefactor = "Secondary: " - elif ( - "negative secondary particle" in component_groups - and component_group == "negative electrode" - ): - prefactor = "Primary: " component_path = os.path.join( base_chemistry, component_group.replace(" ", "_") + "s", component ) @@ -219,14 +204,7 @@ def update_from_chemistry(self, chemistry): component_params = {} for k, v in component_params_tmp.items(): - # If a parameter is already present as a secondary parameter, we - # distinguish it by adding "Primary:" to the given name - if "Secondary: " + k in self._dict_items: - print(k) - component_params["Primary: " + k] = v - else: - # Add prefactor to distinguish e.g. secondary particles - component_params[prefactor + k] = v + component_params[k] = v # Update parameters, making sure to check any conflicts self.update( diff --git a/tests/unit/test_expression_tree/test_printing/test_print_name.py b/tests/unit/test_expression_tree/test_printing/test_print_name.py index ca8d5a84d6..a4363dee99 100644 --- a/tests/unit/test_expression_tree/test_printing/test_print_name.py +++ b/tests/unit/test_expression_tree/test_printing/test_print_name.py @@ -16,7 +16,7 @@ def test_prettify_print_name(self): self.assertEqual(param.timescale.print_name, r"\tau") # Test superscripts - self.assertEqual(param.n.prim.U_ref.print_name, r"U_{n}^{ref}") + self.assertEqual(param.n.U_ref.print_name, r"U_{n}^{ref}") self.assertEqual(param.D_e_typ.print_name, r"D_{e}^{typ}") # Test subscripts diff --git a/tests/unit/test_geometry/test_battery_geometry.py b/tests/unit/test_geometry/test_battery_geometry.py index c01b8b13a9..1ba3ddac03 100644 --- a/tests/unit/test_geometry/test_battery_geometry.py +++ b/tests/unit/test_geometry/test_battery_geometry.py @@ -50,6 +50,16 @@ def test_geometry(self): self.assertEqual(geometry["current collector"]["r_macro"]["min"], geo.r_inner) self.assertEqual(geometry["current collector"]["r_macro"]["max"], 1) + geometry = pybamm.battery_geometry(options={"particle phases": "2"}) + self.assertEqual(geometry["negative primary particle"]["r_n_prim"]["min"], 0) + self.assertEqual(geometry["negative primary particle"]["r_n_prim"]["max"], 1) + self.assertEqual(geometry["negative secondary particle"]["r_n_sec"]["min"], 0) + self.assertEqual(geometry["negative secondary particle"]["r_n_sec"]["max"], 1) + self.assertEqual(geometry["positive primary particle"]["r_n_prim"]["min"], 0) + self.assertEqual(geometry["positive primary particle"]["r_n_prim"]["max"], 1) + self.assertEqual(geometry["positive secondary particle"]["r_n_sec"]["min"], 0) + self.assertEqual(geometry["positive secondary particle"]["r_n_sec"]["max"], 1) + def test_geometry_error(self): with self.assertRaisesRegex(pybamm.GeometryError, "Invalid current"): pybamm.battery_geometry(current_collector_dimension=4) From 1cf37f1444d8702f9d0f9ed7466106f4b66d0f1a Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 19 Aug 2022 15:15:01 +0100 Subject: [PATCH 35/47] more coverage improvements --- examples/scripts/compare_lead_acid.py | 8 ++-- .../interface/kinetics/base_kinetics.py | 37 ++----------------- .../interface/kinetics/diffusion_limited.py | 7 +--- .../first_order_kinetics.py | 7 +--- .../inverse_kinetics/inverse_butler_volmer.py | 7 +--- .../open_circuit_potential/single_ocp.py | 5 +-- pybamm/solvers/processed_variable.py | 2 +- 7 files changed, 12 insertions(+), 61 deletions(-) diff --git a/examples/scripts/compare_lead_acid.py b/examples/scripts/compare_lead_acid.py index 9f73046d35..d52a30cd29 100644 --- a/examples/scripts/compare_lead_acid.py +++ b/examples/scripts/compare_lead_acid.py @@ -7,10 +7,10 @@ # load models models = [ - pybamm.lead_acid.LOQS(), - pybamm.lead_acid.FOQS(), - pybamm.lead_acid.Composite(), - pybamm.lead_acid.Full(), + pybamm.lead_acid.LOQS({"surface form": "differential", "hydrolysis": "true"}), + # pybamm.lead_acid.FOQS(), + # pybamm.lead_acid.Composite(), + # pybamm.lead_acid.Full(), ] # create and run simulations diff --git a/pybamm/models/submodels/interface/kinetics/base_kinetics.py b/pybamm/models/submodels/interface/kinetics/base_kinetics.py index 6f0db9bdd2..2da1d9acaa 100644 --- a/pybamm/models/submodels/interface/kinetics/base_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/base_kinetics.py @@ -214,34 +214,6 @@ def set_initial_conditions(self, variables): self.initial_conditions[j_tot_var] = j_tot_av_init - def _get_dj_dc(self, variables): - """ - Default to calculate derivative of interfacial current density with respect to - concentration. Can be overwritten by specific kinetic functions. - """ - ( - c_e, - delta_phi, - j0, - ne, - ocp, - T, - u, - ) = self._get_interface_variables_for_first_order(variables) - j = self._get_kinetics(j0, ne, delta_phi - ocp, T, u) - return j.diff(c_e) - - def _get_dj_ddeltaphi(self, variables): - """ - Default to calculate derivative of interfacial current density with respect to - surface potential difference. Can be overwritten by specific kinetic functions. - """ - _, delta_phi, j0, ne, ocp, T, u = self._get_interface_variables_for_first_order( - variables - ) - j = self._get_kinetics(j0, ne, delta_phi - ocp, T, u) - return j.diff(delta_phi) - def _get_interface_variables_for_first_order(self, variables): # This is a bit of a hack, but we need to wrap electrolyte concentration with # the NotConstant class @@ -265,12 +237,9 @@ def _get_interface_variables_for_first_order(self, variables): elif self.reaction == "lead-acid oxygen": ocp = self.phase_param.U_Ox - if j0.domain in ["current collector", ["current collector"]]: - T = variables["X-averaged cell temperature"] - u = variables[f"X-averaged {domain} electrode interface utilisation"] - else: - T = variables[f"{Domain} electrode temperature"] - u = variables[f"{Domain} electrode interface utilisation"] + T = variables["X-averaged cell temperature"] + u = variables[f"X-averaged {domain} electrode interface utilisation"] + return c_e_0, delta_phi, j0, ne, ocp, T, u def _get_j_diffusion_limited_first_order(self, variables): diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index 436f7751e3..c5aa6b30de 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -40,12 +40,7 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - if self.options["particle size"] == "distribution": - ocp = variables[ - f"{Domain} electrode {rxn}open circuit potential distribution" - ] - else: - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi_s - ocp # Get interfacial current densities diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index cbf4796856..9035bf6ec1 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -64,12 +64,7 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - if self.options["particle size"] == "distribution": - ocp = variables[ - f"{Domain} electrode {rxn}open circuit potential distribution" - ] - else: - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] eta_r = delta_phi - ocp variables.update(self._get_standard_interfacial_current_variables(j)) diff --git a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py index 2487c7a739..6b0151e895 100644 --- a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py @@ -33,12 +33,7 @@ def get_coupled_variables(self, variables): Domain = self.domain rxn = self.reaction_name - if self.options["particle size"] == "distribution": - ocp = variables[ - f"{Domain} electrode {rxn}open circuit potential distribution" - ] - else: - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] j0 = self._get_exchange_current_density(variables) # Broadcast to match j0's domain diff --git a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py index ad01dbd867..a7a9fd4726 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/single_ocp.py @@ -11,10 +11,7 @@ def get_coupled_variables(self, variables): domain = Domain.lower() phase_name = self.phase_name - if isinstance(self, pybamm.kinetics.NoReaction): - ocp = pybamm.Scalar(0) - dUdT = pybamm.Scalar(0) - elif self.reaction == "lithium-ion main": + if self.reaction == "lithium-ion main": T = variables[f"{Domain} electrode temperature"] # For "particle-size distribution" models, take distribution version diff --git a/pybamm/solvers/processed_variable.py b/pybamm/solvers/processed_variable.py index 2771f2e5e6..e03754cb5f 100644 --- a/pybamm/solvers/processed_variable.py +++ b/pybamm/solvers/processed_variable.py @@ -341,7 +341,7 @@ def initialise_2D(self): self.second_dimension = "z" self.R_sol = first_dim_pts self.z_sol = second_dim_pts - else: + else: # pragma: no cover raise pybamm.DomainError( f"Cannot process 2D object with domains '{self.domains}'." ) From 4f17b00c908ebd69af01513f5aea6477e76d743c Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 22 Aug 2022 09:59:03 +0100 Subject: [PATCH 36/47] fix examples --- .../notebooks/models/compare-ecker-data.ipynb | 35 +- .../models/electrode-state-of-health.ipynb | 10 +- .../notebooks/models/using-submodels.ipynb | 1304 ++--- .../simulating-long-experiments.ipynb | 4433 ++++++++--------- examples/scripts/compare_lead_acid.py | 8 +- examples/scripts/custom_model.py | 18 +- 6 files changed, 2742 insertions(+), 3066 deletions(-) diff --git a/examples/notebooks/models/compare-ecker-data.ipynb b/examples/notebooks/models/compare-ecker-data.ipynb index 84bef377a8..3bf332f918 100644 --- a/examples/notebooks/models/compare-ecker-data.ipynb +++ b/examples/notebooks/models/compare-ecker-data.ipynb @@ -102,8 +102,8 @@ " var.x_n: int(parameter_values.evaluate(model.param.n.L / 1e-6)),\n", " var.x_s: int(parameter_values.evaluate(model.param.s.L / 1e-6)),\n", " var.x_p: int(parameter_values.evaluate(model.param.p.L / 1e-6)),\n", - " var.r_n: int(parameter_values.evaluate(model.param.n.R_typ / 1e-7)),\n", - " var.r_p: int(parameter_values.evaluate(model.param.p.R_typ / 1e-7)),\n", + " var.r_n: int(parameter_values.evaluate(model.param.n.prim.R_typ / 1e-7)),\n", + " var.r_p: int(parameter_values.evaluate(model.param.p.prim.R_typ / 1e-7)),\n", "}" ] }, @@ -167,7 +167,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -228,15 +228,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", - "[3] Madeleine Ecker, Stefan Käbitz, Izaro Laresgoiti, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: II. Model Validation. Journal of The Electrochemical Society, 162(9):A1849–A1857, 2015. doi:10.1149/2.0541509jes.\n", - "[4] Madeleine Ecker, Thi Kim Dung Tran, Philipp Dechent, Stefan Käbitz, Alexander Warnecke, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: I. Determination of Parameters. Journal of the Electrochemical Society, 162(9):A1836–A1848, 2015. doi:10.1149/2.0551509jes.\n", - "[5] Alastair Hales, Laura Bravo Diaz, Mohamed Waseem Marzook, Yan Zhao, Yatish Patel, and Gregory Offer. The cell cooling coefficient: a standard to define heat rejection from lithium-ion batteries. Journal of The Electrochemical Society, 166(12):A2383, 2019.\n", - "[6] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[7] Giles Richardson, Ivan Korotkin, Rahifa Ranom, Michael Castle, and Jamie M. Foster. Generalised single particle models for high-rate operation of graded lithium-ion electrodes: systematic derivation and validation. Electrochimica Acta, 339:135862, 2020. doi:10.1016/j.electacta.2020.135862.\n", - "[8] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "[9] Yan Zhao, Yatish Patel, Teng Zhang, and Gregory J Offer. Modeling the effects of thermal gradients induced by tab and surface cooling on lithium ion cell performance. Journal of The Electrochemical Society, 165(13):A3169, 2018.\n", + "[1] Weilong Ai, Ludwig Kraft, Johannes Sturm, Andreas Jossen, and Billy Wu. Electrochemical thermal-mechanical modelling of stress inhomogeneity in lithium-ion pouch cells. Journal of The Electrochemical Society, 167(1):013512, 2019. doi:10.1149/2.0122001JES.\n", + "[2] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[3] Rutooj Deshpande, Mark Verbrugge, Yang-Tse Cheng, John Wang, and Ping Liu. Battery cycle life prediction with coupled chemical degradation and fatigue mechanics. Journal of the Electrochemical Society, 159(10):A1730, 2012. doi:10.1149/2.049210jes.\n", + "[4] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", + "[5] Madeleine Ecker, Stefan Käbitz, Izaro Laresgoiti, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: II. Model Validation. Journal of The Electrochemical Society, 162(9):A1849–A1857, 2015. doi:10.1149/2.0541509jes.\n", + "[6] Madeleine Ecker, Thi Kim Dung Tran, Philipp Dechent, Stefan Käbitz, Alexander Warnecke, and Dirk Uwe Sauer. Parameterization of a Physico-Chemical Model of a Lithium-Ion Battery: I. Determination of Parameters. Journal of the Electrochemical Society, 162(9):A1836–A1848, 2015. doi:10.1149/2.0551509jes.\n", + "[7] Alastair Hales, Laura Bravo Diaz, Mohamed Waseem Marzook, Yan Zhao, Yatish Patel, and Gregory Offer. The cell cooling coefficient: a standard to define heat rejection from lithium-ion batteries. Journal of The Electrochemical Society, 166(12):A2383, 2019.\n", + "[8] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[9] Giles Richardson, Ivan Korotkin, Rahifa Ranom, Michael Castle, and Jamie M. Foster. Generalised single particle models for high-rate operation of graded lithium-ion electrodes: systematic derivation and validation. Electrochimica Acta, 339:135862, 2020. doi:10.1016/j.electacta.2020.135862.\n", + "[10] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "[11] Yan Zhao, Yatish Patel, Teng Zhang, and Gregory J Offer. Modeling the effects of thermal gradients induced by tab and surface cooling on lithium ion cell performance. Journal of The Electrochemical Society, 165(13):A3169, 2018.\n", "\n" ] } @@ -248,7 +250,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3.8.12 ('conda_jl')", "language": "python", "name": "python3" }, @@ -262,7 +264,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.12" }, "toc": { "base_numbering": 1, @@ -276,6 +278,11 @@ "toc_position": {}, "toc_section_display": true, "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" + } } }, "nbformat": 4, diff --git a/examples/notebooks/models/electrode-state-of-health.ipynb b/examples/notebooks/models/electrode-state-of-health.ipynb index da0ed43070..5427d77b32 100644 --- a/examples/notebooks/models/electrode-state-of-health.ipynb +++ b/examples/notebooks/models/electrode-state-of-health.ipynb @@ -51,12 +51,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "97443d8234c241ca8c2fcaad3e21e416", + "model_id": "34d757993a5247958345757ac4f7cbef", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=2.3248422253249537, step=0.02324842225324953…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=2.324842225325321, step=0.023248422253253208…" ] }, "metadata": {}, @@ -65,7 +65,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -146,8 +146,8 @@ "Cp = parameter_values.evaluate(param.p.cap_init)\n", "n_Li = parameter_values.evaluate(param.n_Li_particles_init)\n", "\n", - "Un = param.n.U_dimensional\n", - "Up = param.p.U_dimensional\n", + "Un = param.n.prim.U_dimensional\n", + "Up = param.p.prim.U_dimensional\n", "T_ref = param.T_ref" ] }, diff --git a/examples/notebooks/models/using-submodels.ipynb b/examples/notebooks/models/using-submodels.ipynb index d17dfdc91a..abdef90119 100644 --- a/examples/notebooks/models/using-submodels.ipynb +++ b/examples/notebooks/models/using-submodels.ipynb @@ -1,650 +1,658 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using submodels in PyBaMM\n", - "In this notebook we show how to modify existing models by swapping out submodels, and how to build your own model from scratch using existing submodels. To see all of the models and submodels available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/models/index.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Changing a submodel in an exisiting battery model\n", - "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](./models/SPM.ipynb)). \n", - "\n", - "First we import pybamm" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we load the SPM" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.SPM()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can look at the submodels that make up the SPM by accessing `model.submodels`, which is a dictionary of the submodel's name (i.e. the physics it represents) and the submodel that is selected" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external circuit \n", - "porosity \n", - "negative interface utilisation \n", - "positive interface utilisation \n", - "negative active material \n", - "positive active material \n", - "electrolyte transport efficiency \n", - "electrode transport efficiency \n", - "through-cell convection \n", - "transverse convection \n", - "negative open circuit potential \n", - "positive open circuit potential \n", - "negative interface \n", - "positive interface \n", - "negative interface current \n", - "positive interface current \n", - "negative particle \n", - "positive particle \n", - "negative electrode potential \n", - "positive electrode potential \n", - "leading-order electrolyte conductivity \n", - "negative surface potential difference \n", - "positive surface potential difference \n", - "electrolyte diffusion \n", - "thermal \n", - "current collector \n", - "sei \n", - "lithium plating \n", - "total interface \n" - ] - } - ], - "source": [ - "for name, submodel in model.submodels.items():\n", - " print(name, submodel)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you load a model in PyBaMM it builds by default. Building the model sets all of the model variables and sets up any variables which are coupled between different submodels: this is the process which couples the submodels together and allows one submodel to access variables from another. If you would like to swap out a submodel in an existing battery model you need to load it without building it by passing the keyword `build=False`" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.SPM(build=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This collects all of the submodels which make up the SPM, but doesn't build the model. Now you are free to swap out one submodel for another. For instance, you may want to assume that diffusion within the negative particles is infinitely fast, so that the PDE describing diffusion is replaced with an ODE for the uniform particle concentration. To change a submodel you simply update the dictionary entry, in this case to the `XAveragedPolynomialProfile` submodel" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(\n", - " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "where we pass in the model parameters, the electrode (negative or positive) the submodel corresponds to, and the name of the polynomial we want to use. In the example we assume uniform concentration within the particle, corresponding to a zero-order polynomial." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if we look at the submodels again we see that the model for the negative particle has been changed" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external circuit \n", - "porosity \n", - "negative interface utilisation \n", - "positive interface utilisation \n", - "negative active material \n", - "positive active material \n", - "electrolyte transport efficiency \n", - "electrode transport efficiency \n", - "through-cell convection \n", - "transverse convection \n", - "negative open circuit potential \n", - "positive open circuit potential \n", - "negative interface \n", - "positive interface \n", - "negative interface current \n", - "positive interface current \n", - "negative particle \n", - "positive particle \n", - "negative electrode potential \n", - "positive electrode potential \n", - "leading-order electrolyte conductivity \n", - "negative surface potential difference \n", - "positive surface potential difference \n", - "electrolyte diffusion \n", - "thermal \n", - "current collector \n", - "sei \n", - "lithium plating \n", - "total interface \n" - ] - } - ], - "source": [ - "for name, submodel in model.submodels.items():\n", - " print(name, submodel)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Building the model also sets up the equations, boundary and initial conditions for the model. For example, if we look at `model.rhs` before building we see that it is empty " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we try to use this empty model, PyBaMM will give an error. So, before proceeding we must build the model" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "model.build_model()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if we look at `model.rhs` we see that it contains an entry relating to the concentration in each particle, as expected for the SPM" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{Variable(-0x4b0b269084f8a9c1, Discharge capacity [A.h], children=[], domains={}): Division(0x704fc9d8b071d981, /, children=['Current function [A] * 96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))', '3600.0'], domains={}),\n", - " Variable(0x590e79b37031c600, Average negative particle concentration, children=[], domains={'primary': ['current collector']}): MatrixMultiplication(0x167f327ce6113b29, @, children=['mass(Average negative particle concentration)', '-3.0 * (Current function [A] / Typical current [A]) * sign(Typical current [A]) / ((3.0 * x-average(Negative electrode active material volume fraction) / x-average(Negative particle radius [m]) / (3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m])))) * Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m])) / ((3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m]))) * yz-average(x-average(Negative particle radius [m])))'], domains={'primary': ['current collector']}),\n", - " Variable(0x789277e6f3450770, X-averaged positive particle concentration, children=[], domains={'primary': ['positive particle'], 'secondary': ['current collector']}): Multiplication(-0x7cc78dcd6ab6fd8a, *, children=['1.0 / ((yz-average(x-average(Positive particle radius [m])) ** 2.0) / Positive electrode diffusivity [m2.s-1] / (96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))))', 'div((Positive electrode diffusivity [m2.s-1] / Positive electrode diffusivity [m2.s-1]) * grad(X-averaged positive particle concentration))'], domains={'primary': ['positive particle'], 'secondary': ['current collector']})}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the model can be used in a simulation and solved in the usual way, and we still have access to model defaults such as the default geometry and default spatial methods which are used in the simulation" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9e7b0bdbd39b46b0a2129ff89eb9cffe", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation = pybamm.Simulation(model)\n", - "simulation.solve([0, 3600])\n", - "simulation.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Building a custom model from submodels\n", - "Instead of editing a pre-existing model, you may wish to build your own model from scratch by combining existing submodels of you choice. In this section, we build a Single Particle Model in which the diffusion is assumed infinitely fast in both particles. \n", - "\n", - "To begin, we load a base lithium-ion model. This sets up the basic model structure behind the scenes, and also sets the default parameters to be those corresponding to a lithium-ion battery. Note that the base model does not select any default submodels, so there is no need to pass `build=False`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybamm.lithium_ion.BaseModel()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Submodels can be added to the `model.submodels` dictionary in the same way that we changed the submodels earlier. \n", - "\n", - "We use the simplest model for the external circuit, which is the explicit \"current control\" submodel" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"external circuit\"] = pybamm.external_circuit.ExplicitCurrentControl(model.param, model.options)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to build a 1D model, so select the `Uniform` current collector model (if the current collectors are behaving uniformly, then a 1D model is appropriate). We also want the model to be isothermal, so select the thermal model accordingly. Further, we assume that the porosity and active material are constant in space and time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"current collector\"] = pybamm.current_collector.Uniform(model.param)\n", - "model.submodels[\"thermal\"] = pybamm.thermal.isothermal.Isothermal(model.param)\n", - "model.submodels[\"porosity\"] = pybamm.porosity.Constant(model.param, model.options)\n", - "model.submodels[\"negative active material\"] = pybamm.active_material.Constant(\n", - " model.param, \"Negative\", model.options\n", - ")\n", - "model.submodels[\"positive active material\"] = pybamm.active_material.Constant(\n", - " model.param, \"Positive\", model.options\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We assume that the current density varies linearly in the electrodes. This corresponds the the leading-order terms in Ohm's law in the limit in which the SPM is derived in [[3]](#References)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"negative electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", - " model.param, \"Negative\"\n", - ")\n", - "model.submodels[\"positive electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", - " model.param, \"Positive\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We assume uniform concentration in both the negative and positive particles " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "options = {**model.options, \"particle\": \"uniform profile\"}\n", - "model.submodels[\"negative particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options)\n", - "model.submodels[\"positive particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the Single Particle Model, the overpotential can be obtained by inverting the Butler-Volmer relation, so we choose the `InverseButlerVolmer` submodel for the interface, with the \"main\" lithium-ion reaction (and default lithium ion options). Because of how the current is implemented, we also need to separately specify the `CurrentForInverseButlerVolmer` submodel. We also need to specify the submodel for open-circuit potential." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\n", - " \"negative open circuit potential\"\n", - "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"positive open circuit potential\"\n", - "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"negative interface\"\n", - "] = pybamm.kinetics.InverseButlerVolmer(\n", - " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"positive interface\"\n", - "] = pybamm.kinetics.InverseButlerVolmer(\n", - " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", - ")\n", - "model.submodels[\n", - " \"negative interface current\"\n", - "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", - " model.param, \"Negative\", \"lithium-ion main\"\n", - ")\n", - "model.submodels[\n", - " \"positive interface current\"\n", - "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", - " model.param, \"Positive\", \"lithium-ion main\"\n", - ")\n", - "model.submodels[\"negative interface utilisation\"] = pybamm.interface_utilisation.Full(\n", - " model.param, \"Negative\", model.options\n", - ")\n", - "model.submodels[\"positive interface utilisation\"] = pybamm.interface_utilisation.Full(\n", - " model.param, \"Positive\", model.options\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We don't want any particle mechanics, SEI formation or lithium plating in this model" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\n", - " \"Negative particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options, \"primary\")\n", - "model.submodels[\n", - " \"Positive particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options, \"primary\")\n", - "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", - "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", - "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, for the electrolyte we assume that diffusion is infinitely fast so that the concentration is uniform, and also use the leading-order model for charge conservation, which leads to a linear variation in ionic current in the electrodes" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "model.submodels[\"electrolyte diffusion\"] = pybamm.electrolyte_diffusion.ConstantConcentration(\n", - " model.param\n", - ")\n", - "model.submodels[\"electrolyte conductivity\"] = pybamm.electrolyte_conductivity.LeadingOrder(\n", - " model.param\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have set all of the submodels we can build the model" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "model.build_model()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then use the model in a simulation in the usual way" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fd40a5d4f51f45c6b7f552355bdfe452", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation = pybamm.Simulation(model)\n", - "simulation.solve([0, 3600])\n", - "simulation.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "\n", - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[2] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[3] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[4] Venkat R. Subramanian, Vinten D. Diwakar, and Deepak Tapriyal. Efficient macro-micro scale coupled modeling of batteries. Journal of The Electrochemical Society, 152(10):A2002, 2005. doi:10.1149/1.2032427.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - }, - "vscode": { - "interpreter": { - "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using submodels in PyBaMM\n", + "In this notebook we show how to modify existing models by swapping out submodels, and how to build your own model from scratch using existing submodels. To see all of the models and submodels available in PyBaMM, please take a look at the documentation [here](https://pybamm.readthedocs.io/en/latest/source/models/index.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Changing a submodel in an exisiting battery model\n", + "PyBaMM is designed to be a flexible modelling package that allows users to easily compare different models and numerical techniques within a common framework. Battery models within PyBaMM are built up using a number of submodels that describe different physics included within the model, such as mass conservation in the electrolyte or charge conservation in the solid. For ease of use, a number of popular battery models are pre-configured in PyBaMM. As an example, we look at the Single Particle Model (for more information see [here](./models/SPM.ipynb)). \n", + "\n", + "First we import pybamm" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we load the SPM" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.SPM()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can look at the submodels that make up the SPM by accessing `model.submodels`, which is a dictionary of the submodel's name (i.e. the physics it represents) and the submodel that is selected" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "external circuit \n", + "porosity \n", + "negative interface utilisation \n", + "positive interface utilisation \n", + "negative particle mechanics \n", + "positive particle mechanics \n", + "negative primary active material \n", + "positive primary active material \n", + "electrolyte transport efficiency \n", + "electrode transport efficiency \n", + "through-cell convection \n", + "transverse convection \n", + "negative primary open circuit potential \n", + "positive primary open circuit potential \n", + "negative interface \n", + "negative interface current \n", + "positive interface \n", + "positive interface current \n", + "negative primary particle \n", + "positive primary particle \n", + "negative electrode potential \n", + "positive electrode potential \n", + "leading-order electrolyte conductivity \n", + "negative surface potential difference \n", + "positive surface potential difference \n", + "electrolyte diffusion \n", + "thermal \n", + "current collector \n", + "sei \n", + "sei on cracks \n", + "lithium plating \n", + "total interface \n" + ] + } + ], + "source": [ + "for name, submodel in model.submodels.items():\n", + " print(name, submodel)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you load a model in PyBaMM it builds by default. Building the model sets all of the model variables and sets up any variables which are coupled between different submodels: this is the process which couples the submodels together and allows one submodel to access variables from another. If you would like to swap out a submodel in an existing battery model you need to load it without building it by passing the keyword `build=False`" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.SPM(build=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This collects all of the submodels which make up the SPM, but doesn't build the model. Now you are free to swap out one submodel for another. For instance, you may want to assume that diffusion within the negative particles is infinitely fast, so that the PDE describing diffusion is replaced with an ODE for the uniform particle concentration. To change a submodel you simply update the dictionary entry, in this case to the `XAveragedPolynomialProfile` submodel" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"negative primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(\n", + " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}, phase=\"primary\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where we pass in the model parameters, the electrode (negative or positive) the submodel corresponds to, and the name of the polynomial we want to use. In the example we assume uniform concentration within the particle, corresponding to a zero-order polynomial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if we look at the submodels again we see that the model for the negative particle has been changed" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "external circuit \n", + "porosity \n", + "negative interface utilisation \n", + "positive interface utilisation \n", + "negative particle mechanics \n", + "positive particle mechanics \n", + "negative primary active material \n", + "positive primary active material \n", + "electrolyte transport efficiency \n", + "electrode transport efficiency \n", + "through-cell convection \n", + "transverse convection \n", + "negative primary open circuit potential \n", + "positive primary open circuit potential \n", + "negative interface \n", + "negative interface current \n", + "positive interface \n", + "positive interface current \n", + "negative primary particle \n", + "positive primary particle \n", + "negative electrode potential \n", + "positive electrode potential \n", + "leading-order electrolyte conductivity \n", + "negative surface potential difference \n", + "positive surface potential difference \n", + "electrolyte diffusion \n", + "thermal \n", + "current collector \n", + "sei \n", + "sei on cracks \n", + "lithium plating \n", + "total interface \n" + ] + } + ], + "source": [ + "for name, submodel in model.submodels.items():\n", + " print(name, submodel)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Building the model also sets up the equations, boundary and initial conditions for the model. For example, if we look at `model.rhs` before building we see that it is empty " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.rhs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we try to use this empty model, PyBaMM will give an error. So, before proceeding we must build the model" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model.build_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if we look at `model.rhs` we see that it contains an entry relating to the concentration in each particle, as expected for the SPM" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{Variable(0x65d4c6febc20d32b, Discharge capacity [A.h], children=[], domains={}): Division(0x23e022223d306029, /, children=['Current function [A] * 96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))', '3600.0'], domains={}),\n", + " Variable(0x45ef5e4c9eb0aef1, Average negative particle concentration, children=[], domains={'primary': ['current collector']}): MatrixMultiplication(-0x5b1fafc4bb5b0718, @, children=['mass(Average negative particle concentration)', '-3.0 * (Current function [A] / Typical current [A]) * sign(Typical current [A]) / ((3.0 * x-average(Negative electrode active material volume fraction) / x-average(Negative particle radius [m]) / (3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m])))) * Negative electrode thickness [m] / (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m])) / ((3.0 * yz-average(x-average(Negative electrode active material volume fraction)) / yz-average(x-average(Negative particle radius [m]))) * yz-average(x-average(Negative particle radius [m])))'], domains={'primary': ['current collector']}),\n", + " Variable(-0x7593c47afc4ed028, X-averaged positive particle concentration, children=[], domains={'primary': ['positive particle'], 'secondary': ['current collector']}): Multiplication(0x60b1379eb6357a21, *, children=['1.0 / ((yz-average(x-average(Positive particle radius [m])) ** 2.0) / Positive electrode diffusivity [m2.s-1] / (96485.33212 * Maximum concentration in negative electrode [mol.m-3] * (Negative electrode thickness [m] + Separator thickness [m] + Positive electrode thickness [m]) / absolute(Typical current [A] / (Number of electrodes connected in parallel to make a cell * Electrode width [m] * Electrode height [m]))))', 'div((Positive electrode diffusivity [m2.s-1] / Positive electrode diffusivity [m2.s-1]) * grad(X-averaged positive particle concentration))'], domains={'primary': ['positive particle'], 'secondary': ['current collector']})}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.rhs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the model can be used in a simulation and solved in the usual way, and we still have access to model defaults such as the default geometry and default spatial methods which are used in the simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bd9c07c6f60940e697ce80429735ad03", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = pybamm.Simulation(model)\n", + "simulation.solve([0, 3600])\n", + "simulation.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building a custom model from submodels\n", + "Instead of editing a pre-existing model, you may wish to build your own model from scratch by combining existing submodels of you choice. In this section, we build a Single Particle Model in which the diffusion is assumed infinitely fast in both particles. \n", + "\n", + "To begin, we load a base lithium-ion model. This sets up the basic model structure behind the scenes, and also sets the default parameters to be those corresponding to a lithium-ion battery. Note that the base model does not select any default submodels, so there is no need to pass `build=False`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybamm.lithium_ion.BaseModel()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Submodels can be added to the `model.submodels` dictionary in the same way that we changed the submodels earlier. \n", + "\n", + "We use the simplest model for the external circuit, which is the explicit \"current control\" submodel" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"external circuit\"] = pybamm.external_circuit.ExplicitCurrentControl(model.param, model.options)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to build a 1D model, so select the `Uniform` current collector model (if the current collectors are behaving uniformly, then a 1D model is appropriate). We also want the model to be isothermal, so select the thermal model accordingly. Further, we assume that the porosity and active material are constant in space and time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"current collector\"] = pybamm.current_collector.Uniform(model.param)\n", + "model.submodels[\"thermal\"] = pybamm.thermal.isothermal.Isothermal(model.param)\n", + "model.submodels[\"porosity\"] = pybamm.porosity.Constant(model.param, model.options)\n", + "model.submodels[\"negative active material\"] = pybamm.active_material.Constant(\n", + " model.param, \"Negative\", model.options\n", + ")\n", + "model.submodels[\"positive active material\"] = pybamm.active_material.Constant(\n", + " model.param, \"Positive\", model.options\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We assume that the current density varies linearly in the electrodes. This corresponds the the leading-order terms in Ohm's law in the limit in which the SPM is derived in [[3]](#References)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"negative electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", + " model.param, \"Negative\"\n", + ")\n", + "model.submodels[\"positive electrode potentials\"] = pybamm.electrode.ohm.LeadingOrder(\n", + " model.param, \"Positive\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We assume uniform concentration in both the negative and positive particles " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "options = {**model.options, \"particle\": \"uniform profile\"}\n", + "model.submodels[\"negative primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options, \"primary\")\n", + "model.submodels[\"positive primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options, \"primary\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the Single Particle Model, the overpotential can be obtained by inverting the Butler-Volmer relation, so we choose the `InverseButlerVolmer` submodel for the interface, with the \"main\" lithium-ion reaction (and default lithium ion options). Because of how the current is implemented, we also need to separately specify the `CurrentForInverseButlerVolmer` submodel. We also need to specify the submodel for open-circuit potential." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\n", + " \"negative open circuit potential\"\n", + "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", + " model.param, \"Negative\", \"lithium-ion main\", options=model.options, phase=\"primary\"\n", + ")\n", + "model.submodels[\n", + " \"positive open circuit potential\"\n", + "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", + " model.param, \"Positive\", \"lithium-ion main\", options=model.options, phase=\"primary\"\n", + ")\n", + "model.submodels[\n", + " \"negative interface\"\n", + "] = pybamm.kinetics.InverseButlerVolmer(\n", + " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"positive interface\"\n", + "] = pybamm.kinetics.InverseButlerVolmer(\n", + " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", + ")\n", + "model.submodels[\n", + " \"negative interface current\"\n", + "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", + " model.param, \"Negative\", \"lithium-ion main\"\n", + ")\n", + "model.submodels[\n", + " \"positive interface current\"\n", + "] = pybamm.kinetics.CurrentForInverseButlerVolmer(\n", + " model.param, \"Positive\", \"lithium-ion main\"\n", + ")\n", + "model.submodels[\"negative interface utilisation\"] = pybamm.interface_utilisation.Full(\n", + " model.param, \"Negative\", model.options\n", + ")\n", + "model.submodels[\"positive interface utilisation\"] = pybamm.interface_utilisation.Full(\n", + " model.param, \"Positive\", model.options\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We don't want any particle mechanics, SEI formation or lithium plating in this model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\n", + " \"Negative particle mechanics\"\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\")\n", + "model.submodels[\n", + " \"Positive particle mechanics\"\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\")\n", + "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", + "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", + "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, for the electrolyte we assume that diffusion is infinitely fast so that the concentration is uniform, and also use the leading-order model for charge conservation, which leads to a linear variation in ionic current in the electrodes" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "model.submodels[\"electrolyte diffusion\"] = pybamm.electrolyte_diffusion.ConstantConcentration(\n", + " model.param\n", + ")\n", + "model.submodels[\"electrolyte conductivity\"] = pybamm.electrolyte_conductivity.LeadingOrder(\n", + " model.param\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have set all of the submodels we can build the model" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "model.build_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then use the model in a simulation in the usual way" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f9ed6bbb2d9f4953a855c0388f01b3f3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.0, step=0.01), Output()), _dom_classes=('w…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = pybamm.Simulation(model)\n", + "simulation.solve([0, 3600])\n", + "simulation.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Weilong Ai, Ludwig Kraft, Johannes Sturm, Andreas Jossen, and Billy Wu. Electrochemical thermal-mechanical modelling of stress inhomogeneity in lithium-ion pouch cells. Journal of The Electrochemical Society, 167(1):013512, 2019. doi:10.1149/2.0122001JES.\n", + "[2] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[3] Rutooj Deshpande, Mark Verbrugge, Yang-Tse Cheng, John Wang, and Ping Liu. Battery cycle life prediction with coupled chemical degradation and fatigue mechanics. Journal of the Electrochemical Society, 159(10):A1730, 2012. doi:10.1149/2.049210jes.\n", + "[4] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[5] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[6] Venkat R. Subramanian, Vinten D. Diwakar, and Deepak Tapriyal. Efficient macro-micro scale coupled modeling of batteries. Journal of The Electrochemical Society, 152(10):A2002, 2005. doi:10.1149/1.2032427.\n", + "[7] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/simulating-long-experiments.ipynb b/examples/notebooks/simulating-long-experiments.ipynb index 4d9b3a38d8..c93df5cf6a 100644 --- a/examples/notebooks/simulating-long-experiments.ipynb +++ b/examples/notebooks/simulating-long-experiments.ipynb @@ -1,2392 +1,2047 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "regional-bedroom", - "metadata": {}, - "source": [ - "# Simulating long experiments" - ] - }, - { - "cell_type": "markdown", - "id": "quantitative-radar", - "metadata": {}, - "source": [ - "This notebook introduces functionality for simulating experiments over hundreds or even thousands of cycles. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "novel-spectacular", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pybamm -q # install PyBaMM if it is not installed\n", - "import pybamm\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "mounted-seven", - "metadata": {}, - "source": [ - "## Simulating long experiments" - ] - }, - { - "cell_type": "markdown", - "id": "chronic-consensus", - "metadata": {}, - "source": [ - "In the interest of simplicity and running time, we consider a SPM with SEI effects leading to linear degradation, with parameter values chosen so that the capacity fades by 20% in just a few cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "limiting-making", - "metadata": {}, - "outputs": [], - "source": [ - "parameter_values = pybamm.ParameterValues(\"Mohtat2020\")\n", - "parameter_values.update({\"SEI kinetic rate constant [m.s-1]\": 1e-14})\n", - "spm = pybamm.lithium_ion.SPM({\"SEI\": \"ec reaction limited\"})" - ] - }, - { - "cell_type": "markdown", - "id": "compact-teddy", - "metadata": {}, - "source": [ - "Using the \"Electrode SOH\" (eSOH) model, we initialize the concentration in each electrode at 100% State of Charge" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "photographic-sussex", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial negative electrode SOC: 0.833\n", - "Initial positive electrode SOC: 0.034\n" - ] - } - ], - "source": [ - "# Calculate stoichiometries at 100% SOC\n", - "\n", - "param = spm.param\n", - "esoh_solver = pybamm.lithium_ion.ElectrodeSOHSolver(parameter_values, param)\n", - "\n", - "Vmin = 3.0\n", - "Vmax = 4.2\n", - "Cn = parameter_values.evaluate(param.n.cap_init)\n", - "Cp = parameter_values.evaluate(param.p.cap_init)\n", - "n_Li_init = parameter_values.evaluate(param.n_Li_particles_init)\n", - "\n", - "inputs={ \"V_min\": Vmin, \"V_max\": Vmax, \"C_n\": Cn, \"C_p\": Cp, \"n_Li\": n_Li_init}\n", - "esoh_sol = esoh_solver.solve(inputs)\n", - "\n", - "print(f\"Initial negative electrode SOC: {esoh_sol['x_100'].data[0]:.3f}\")\n", - "print(f\"Initial positive electrode SOC: {esoh_sol['y_100'].data[0]:.3f}\")\n", - "\n", - "# Update parameter values with initial conditions\n", - "c_n_max = parameter_values.evaluate(param.n.c_max)\n", - "c_p_max = parameter_values.evaluate(param.p.c_max)\n", - "parameter_values.update(\n", - " {\n", - " \"Initial concentration in negative electrode [mol.m-3]\": esoh_sol[\"x_100\"].data[0] * c_n_max,\n", - " \"Initial concentration in positive electrode [mol.m-3]\": esoh_sol[\"y_100\"].data[0] * c_p_max,\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "focused-substitute", - "metadata": {}, - "source": [ - "We can now simulate a single CCCV cycle using the `Experiment` class (see [this notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%205%20-%20Run%20experiments.ipynb) for more details)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "religious-primary", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-07-28 20:34:01.093 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/1 (20.155 ms elapsed) --------------------\n", - "2022-07-28 20:34:01.093 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:01.148 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:01.186 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:01.236 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:01.380 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 20.155 ms\n" - ] - } - ], - "source": [ - "pybamm.set_logging_level(\"NOTICE\")\n", - "\n", - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\"\n", - " )\n", - "])\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "heavy-crisis", - "metadata": {}, - "source": [ - "Alternatively, we can simulate many CCCV cycles. Here we simulate either 100 cycles or until the capacity is 80% of the initial capacity, whichever is first. The capacity is calculated by the eSOH model" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "stupid-abortion", - "metadata": { - "tags": [ - "outputPrepend" - ] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-07-28 20:34:02.619 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (19.928 ms elapsed) --------------------\n", - "2022-07-28 20:34:02.619 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:02.669 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:02.709 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:02.797 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:02.960 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:02.960 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (361.483 ms elapsed) --------------------\n", - "2022-07-28 20:34:02.961 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:02.984 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.000 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.022 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.062 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.063 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (464.075 ms elapsed) --------------------\n", - "2022-07-28 20:34:03.064 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.099 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.120 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.152 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.193 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.194 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (594.879 ms elapsed) --------------------\n", - "2022-07-28 20:34:03.194 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.224 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.246 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.277 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.317 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.318 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (719.373 ms elapsed) --------------------\n", - "2022-07-28 20:34:03.319 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.347 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.365 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.390 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.429 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.430 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (830.976 ms elapsed) --------------------\n", - "2022-07-28 20:34:03.430 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.451 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.470 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.493 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.532 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.532 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (933.394 ms elapsed) --------------------\n", - "2022-07-28 20:34:03.533 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.553 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.574 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.595 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.637 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.639 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (1.040 s elapsed) --------------------\n", - "2022-07-28 20:34:03.640 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.665 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.685 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.711 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.753 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.754 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (1.155 s elapsed) --------------------\n", - "2022-07-28 20:34:03.755 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.781 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.801 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.828 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.869 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.870 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (1.271 s elapsed) --------------------\n", - "2022-07-28 20:34:03.871 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:03.896 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:03.916 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:03.947 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:03.984 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:03.985 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (1.386 s elapsed) --------------------\n", - "2022-07-28 20:34:03.985 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.008 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.028 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.050 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.087 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.088 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.489 s elapsed) --------------------\n", - "2022-07-28 20:34:04.089 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.112 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.129 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.150 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.198 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.199 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.600 s elapsed) --------------------\n", - "2022-07-28 20:34:04.199 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.220 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.239 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.260 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.299 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.300 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.701 s elapsed) --------------------\n", - "2022-07-28 20:34:04.300 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.320 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.342 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.363 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.399 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.400 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.801 s elapsed) --------------------\n", - "2022-07-28 20:34:04.400 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.429 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.455 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.482 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.542 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.543 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.944 s elapsed) --------------------\n", - "2022-07-28 20:34:04.544 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.575 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.592 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.623 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.666 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.667 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (2.068 s elapsed) --------------------\n", - "2022-07-28 20:34:04.667 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.691 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.709 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.733 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.774 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.774 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (2.175 s elapsed) --------------------\n", - "2022-07-28 20:34:04.775 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.798 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.816 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.838 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.873 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.873 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (2.274 s elapsed) --------------------\n", - "2022-07-28 20:34:04.873 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.896 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:04.914 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:04.934 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:04.977 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:04.977 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (2.379 s elapsed) --------------------\n", - "2022-07-28 20:34:04.978 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:04.997 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.015 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.033 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.072 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.075 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (2.476 s elapsed) --------------------\n", - "2022-07-28 20:34:05.077 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.100 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.119 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.145 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.189 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.190 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.591 s elapsed) --------------------\n", - "2022-07-28 20:34:05.190 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.211 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.229 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.251 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.299 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.299 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.700 s elapsed) --------------------\n", - "2022-07-28 20:34:05.300 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.323 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.342 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.368 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.409 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.410 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.811 s elapsed) --------------------\n", - "2022-07-28 20:34:05.410 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.434 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.454 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.541 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.584 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.584 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.986 s elapsed) --------------------\n", - "2022-07-28 20:34:05.585 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.608 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.625 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.646 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.681 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.681 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (3.083 s elapsed) --------------------\n", - "2022-07-28 20:34:05.682 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.714 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.732 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.757 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.797 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.798 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (3.199 s elapsed) --------------------\n", - "2022-07-28 20:34:05.798 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.821 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.838 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.860 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:05.896 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:05.900 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (3.301 s elapsed) --------------------\n", - "2022-07-28 20:34:05.903 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:05.927 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:05.946 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:05.966 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.031 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.032 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (3.433 s elapsed) --------------------\n", - "2022-07-28 20:34:06.032 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.059 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.082 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.104 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.141 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.142 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (3.543 s elapsed) --------------------\n", - "2022-07-28 20:34:06.142 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.166 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.187 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.208 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.249 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.250 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (3.651 s elapsed) --------------------\n", - "2022-07-28 20:34:06.250 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.288 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.320 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.356 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.433 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.461 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (3.862 s elapsed) --------------------\n", - "2022-07-28 20:34:06.463 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.485 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.503 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.536 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.571 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.571 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.972 s elapsed) --------------------\n", - "2022-07-28 20:34:06.571 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.596 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.617 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.643 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.686 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.688 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (4.089 s elapsed) --------------------\n", - "2022-07-28 20:34:06.688 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.711 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.729 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.750 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.788 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.789 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (4.190 s elapsed) --------------------\n", - "2022-07-28 20:34:06.790 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.811 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.828 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.846 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.881 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.882 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (4.283 s elapsed) --------------------\n", - "2022-07-28 20:34:06.882 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:06.905 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:06.922 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:06.940 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:06.980 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:06.980 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (4.382 s elapsed) --------------------\n", - "2022-07-28 20:34:06.981 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.004 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.022 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.041 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.077 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.078 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (4.479 s elapsed) --------------------\n", - "2022-07-28 20:34:07.079 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.097 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.115 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.132 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.169 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.170 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (4.571 s elapsed) --------------------\n", - "2022-07-28 20:34:07.170 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.190 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.209 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.228 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.262 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.263 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (4.664 s elapsed) --------------------\n", - "2022-07-28 20:34:07.263 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.281 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.299 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.318 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.355 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.356 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (4.757 s elapsed) --------------------\n", - "2022-07-28 20:34:07.356 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.376 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.394 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.418 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.458 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.459 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (4.860 s elapsed) --------------------\n", - "2022-07-28 20:34:07.460 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.481 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.503 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.529 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.570 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.572 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (4.973 s elapsed) --------------------\n", - "2022-07-28 20:34:07.573 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.595 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.613 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.633 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.670 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.671 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (5.072 s elapsed) --------------------\n", - "2022-07-28 20:34:07.672 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.695 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.717 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.737 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.773 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.776 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (5.177 s elapsed) --------------------\n", - "2022-07-28 20:34:07.781 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.807 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.832 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.853 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:07.899 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:07.900 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (5.301 s elapsed) --------------------\n", - "2022-07-28 20:34:07.900 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:07.921 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:07.940 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:07.960 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:08.002 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:08.002 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (5.404 s elapsed) --------------------\n", - "2022-07-28 20:34:08.004 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:08.026 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:08.045 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:08.065 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:08.104 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:08.107 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (5.508 s elapsed) --------------------\n", - "2022-07-28 20:34:08.107 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:08.127 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:08.145 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:08.162 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:08.202 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:08.204 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (5.605 s elapsed) --------------------\n", - "2022-07-28 20:34:08.205 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:08.224 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:08.242 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:08.262 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:08.302 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:08.303 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (5.704 s elapsed) --------------------\n", - "2022-07-28 20:34:08.304 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:08.323 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:08.345 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:08.366 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:08.409 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", - "2022-07-28 20:34:08.410 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 5.704 s\n" - ] - } - ], - "source": [ - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\")\n", - "] * 500,\n", - "termination=\"80% capacity\"\n", - ")\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "cloudy-lover", - "metadata": {}, - "source": [ - "### Summary variables" - ] - }, - { - "cell_type": "markdown", - "id": "shared-practitioner", - "metadata": {}, - "source": [ - "We can plot standard variables like the current and voltage, but it isn't very instructive on these timescales" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "personalized-oracle", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8af2561816b940e0a3f37d7ddf27262f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=147.0807222457463, step=1.470807222457463), …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol.plot([\"Current [A]\", \"Terminal voltage [V]\"])" - ] - }, - { - "cell_type": "markdown", - "id": "intense-princeton", - "metadata": {}, - "source": [ - "Instead, we plot \"summary variables\", which show how the battery degrades over time by various metrics. Some of the variables also have \"Change in ...\", which is how much that variable changes over each cycle. This can be achieved by using `plot_summary_variables` method of pybamm, which can also be used to compare \"summary variables\" extracted from 2 or more solutions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "right-skiing", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['C',\n", - " 'C_n',\n", - " 'C_n * (x_100 - x_0)',\n", - " 'C_p',\n", - " 'C_p * (y_100 - y_0)',\n", - " 'Capacity [A.h]',\n", - " 'Change in local ECM resistance [Ohm]',\n", - " 'Change in loss of active material in negative electrode [%]',\n", - " 'Change in loss of active material in positive electrode [%]',\n", - " 'Change in loss of capacity to SEI [A.h]',\n", - " 'Change in loss of capacity to SEI on cracks [A.h]',\n", - " 'Change in loss of capacity to lithium plating [A.h]',\n", - " 'Change in loss of lithium inventory [%]',\n", - " 'Change in loss of lithium inventory, including electrolyte [%]',\n", - " 'Change in loss of lithium to SEI [mol]',\n", - " 'Change in loss of lithium to SEI on cracks [mol]',\n", - " 'Change in loss of lithium to lithium plating [mol]',\n", - " 'Change in negative electrode capacity [A.h]',\n", - " 'Change in positive electrode capacity [A.h]',\n", - " 'Change in total capacity lost to side reactions [A.h]',\n", - " 'Change in total lithium [mol]',\n", - " 'Change in total lithium in electrolyte [mol]',\n", - " 'Change in total lithium in negative electrode [mol]',\n", - " 'Change in total lithium in particles [mol]',\n", - " 'Change in total lithium in positive electrode [mol]',\n", - " 'Change in total lithium lost [mol]',\n", - " 'Change in total lithium lost from electrolyte [mol]',\n", - " 'Change in total lithium lost from particles [mol]',\n", - " 'Change in total lithium lost to side reactions [mol]',\n", - " 'Cycle number',\n", - " 'Local ECM resistance [Ohm]',\n", - " 'Loss of active material in negative electrode [%]',\n", - " 'Loss of active material in positive electrode [%]',\n", - " 'Loss of capacity to SEI [A.h]',\n", - " 'Loss of capacity to SEI on cracks [A.h]',\n", - " 'Loss of capacity to lithium plating [A.h]',\n", - " 'Loss of lithium inventory [%]',\n", - " 'Loss of lithium inventory, including electrolyte [%]',\n", - " 'Loss of lithium to SEI [mol]',\n", - " 'Loss of lithium to SEI on cracks [mol]',\n", - " 'Loss of lithium to lithium plating [mol]',\n", - " 'Maximum measured discharge capacity [A.h]',\n", - " 'Measured capacity [A.h]',\n", - " 'Minimum measured discharge capacity [A.h]',\n", - " 'Negative electrode capacity [A.h]',\n", - " 'Positive electrode capacity [A.h]',\n", - " 'Total capacity lost to side reactions [A.h]',\n", - " 'Total lithium [mol]',\n", - " 'Total lithium in electrolyte [mol]',\n", - " 'Total lithium in negative electrode [mol]',\n", - " 'Total lithium in particles [mol]',\n", - " 'Total lithium in positive electrode [mol]',\n", - " 'Total lithium lost [mol]',\n", - " 'Total lithium lost from electrolyte [mol]',\n", - " 'Total lithium lost from particles [mol]',\n", - " 'Total lithium lost to side reactions [mol]',\n", - " 'Un(x_0)',\n", - " 'Un(x_100)',\n", - " 'Up(y_0)',\n", - " 'Up(y_0) - Un(x_0)',\n", - " 'Up(y_100)',\n", - " 'Up(y_100) - Un(x_100)',\n", - " 'n_Li',\n", - " 'n_Li_0',\n", - " 'n_Li_100',\n", - " 'x_0',\n", - " 'x_100',\n", - " 'y_0',\n", - " 'y_100']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted(sol.summary_variables.keys())" - ] - }, - { - "cell_type": "markdown", - "id": "approximate-error", - "metadata": {}, - "source": [ - "The \"summary variables\" associated with a particular model can also be accessed as a list (which can then be edited) -" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "romance-roulette", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Positive electrode capacity [A.h]',\n", - " 'Loss of active material in positive electrode [%]',\n", - " 'Loss of lithium inventory [%]',\n", - " 'Loss of lithium inventory, including electrolyte [%]',\n", - " 'Total lithium [mol]',\n", - " 'Total lithium in electrolyte [mol]',\n", - " 'Total lithium in positive electrode [mol]',\n", - " 'Total lithium in particles [mol]',\n", - " 'Total lithium lost [mol]',\n", - " 'Total lithium lost from particles [mol]',\n", - " 'Total lithium lost from electrolyte [mol]',\n", - " 'Loss of lithium to SEI [mol]',\n", - " 'Loss of capacity to SEI [A.h]',\n", - " 'Total lithium lost to side reactions [mol]',\n", - " 'Total capacity lost to side reactions [A.h]',\n", - " 'Local ECM resistance [Ohm]',\n", - " 'Negative electrode capacity [A.h]',\n", - " 'Loss of active material in negative electrode [%]',\n", - " 'Total lithium in negative electrode [mol]',\n", - " 'Loss of lithium to lithium plating [mol]',\n", - " 'Loss of capacity to lithium plating [A.h]',\n", - " 'Loss of lithium to SEI on cracks [mol]',\n", - " 'Loss of capacity to SEI on cracks [A.h]']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spm.summary_variables" - ] - }, - { - "cell_type": "markdown", - "id": "given-telephone", - "metadata": {}, - "source": [ - "Here the only degradation mechanism is one that causes loss of lithium, so we don't see loss of active material" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "postal-butter", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "array([[,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ]], dtype=object)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pybamm.plot_summary_variables(sol)" - ] - }, - { - "cell_type": "markdown", - "id": "french-substance", - "metadata": {}, - "source": [ - "To suggest additional summary variables, open an issue!" - ] - }, - { - "cell_type": "markdown", - "id": "accepting-canada", - "metadata": {}, - "source": [ - "## Choosing which cycles to save" - ] - }, - { - "cell_type": "markdown", - "id": "employed-plate", - "metadata": {}, - "source": [ - "If the simulation contains thousands of cycles, saving each cycle in RAM might not be possible. To get around this, we can use `save_at_cycles`. If this is an integer `n`, every nth cycle is saved. If this is a list, all the cycles in the list are saved.\n", - "The first cycle is always saved." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "polished-trout", - "metadata": { - "tags": [ - "outputPrepend" - ] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-07-28 20:34:10.209 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (12.892 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.210 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.255 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.272 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.291 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.369 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.947 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.370 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (173.172 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.370 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.388 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.405 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.424 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.460 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.932 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.460 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (263.853 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.461 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.480 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.497 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.516 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.553 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.916 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.554 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (357.004 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.554 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.574 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.593 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.611 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.648 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.901 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.648 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (451.624 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.649 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.668 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.687 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.704 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.740 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.886 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.740 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (543.656 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.740 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.761 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.778 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.794 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.831 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.871 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.831 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (634.669 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.832 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.851 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.868 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.885 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:10.923 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.856 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:10.924 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (727.375 ms elapsed) --------------------\n", - "2022-07-28 20:34:10.924 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:10.944 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:10.961 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:10.977 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.014 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.842 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.015 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (818.209 ms elapsed) --------------------\n", - "2022-07-28 20:34:11.015 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.036 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.054 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.071 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.106 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.827 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.107 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (910.080 ms elapsed) --------------------\n", - "2022-07-28 20:34:11.107 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.124 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.141 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.157 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.193 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.813 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.194 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (997.306 ms elapsed) --------------------\n", - "2022-07-28 20:34:11.194 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.211 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.228 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.246 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.283 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.798 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.283 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.087 s elapsed) --------------------\n", - "2022-07-28 20:34:11.284 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.301 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.319 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.337 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.374 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.784 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.374 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.178 s elapsed) --------------------\n", - "2022-07-28 20:34:11.375 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.393 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.412 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.430 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.468 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.770 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.469 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.272 s elapsed) --------------------\n", - "2022-07-28 20:34:11.469 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.486 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.503 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.521 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.561 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.756 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.561 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.364 s elapsed) --------------------\n", - "2022-07-28 20:34:11.561 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.581 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.599 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.619 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.657 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.742 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.657 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.461 s elapsed) --------------------\n", - "2022-07-28 20:34:11.658 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.678 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.697 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.715 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.752 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.728 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.753 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (1.556 s elapsed) --------------------\n", - "2022-07-28 20:34:11.753 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.773 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.792 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.811 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.847 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.715 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.848 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (1.651 s elapsed) --------------------\n", - "2022-07-28 20:34:11.849 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.869 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.887 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:11.904 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:11.944 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.701 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:11.945 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (1.749 s elapsed) --------------------\n", - "2022-07-28 20:34:11.946 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:11.969 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:11.991 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.015 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.059 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.687 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.060 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (1.864 s elapsed) --------------------\n", - "2022-07-28 20:34:12.061 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.083 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.102 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.119 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.156 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.674 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.156 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (1.960 s elapsed) --------------------\n", - "2022-07-28 20:34:12.157 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.179 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.197 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.213 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.251 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.661 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.252 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.055 s elapsed) --------------------\n", - "2022-07-28 20:34:12.252 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.269 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.287 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.306 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.342 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.647 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.342 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.146 s elapsed) --------------------\n", - "2022-07-28 20:34:12.343 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.360 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.378 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.397 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.435 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.634 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.435 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.239 s elapsed) --------------------\n", - "2022-07-28 20:34:12.436 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.453 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.470 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.490 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.526 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.621 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.526 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.330 s elapsed) --------------------\n", - "2022-07-28 20:34:12.527 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.544 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.563 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.581 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.619 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.608 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.619 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (2.423 s elapsed) --------------------\n", - "2022-07-28 20:34:12.620 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.637 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.654 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.673 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.709 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.595 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.709 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (2.513 s elapsed) --------------------\n", - "2022-07-28 20:34:12.710 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.727 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.745 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.763 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.799 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.583 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.800 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (2.603 s elapsed) --------------------\n", - "2022-07-28 20:34:12.800 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.818 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.836 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.852 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.885 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.570 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.885 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (2.689 s elapsed) --------------------\n", - "2022-07-28 20:34:12.886 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.904 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:12.924 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:12.939 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:12.974 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.557 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:12.975 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (2.778 s elapsed) --------------------\n", - "2022-07-28 20:34:12.975 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:12.994 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.011 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.026 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.062 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.545 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.062 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (2.866 s elapsed) --------------------\n", - "2022-07-28 20:34:13.063 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.082 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.099 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.114 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.150 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.532 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.150 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (2.954 s elapsed) --------------------\n", - "2022-07-28 20:34:13.151 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.170 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.188 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.204 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.238 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.520 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.239 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.042 s elapsed) --------------------\n", - "2022-07-28 20:34:13.239 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.258 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.278 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.293 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.327 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.508 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.328 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (3.131 s elapsed) --------------------\n", - "2022-07-28 20:34:13.328 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.347 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.365 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.384 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.423 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.496 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.423 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (3.227 s elapsed) --------------------\n", - "2022-07-28 20:34:13.424 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.441 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.459 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.477 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.510 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.484 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.511 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (3.314 s elapsed) --------------------\n", - "2022-07-28 20:34:13.511 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.527 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.544 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.562 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.598 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.472 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.599 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (3.402 s elapsed) --------------------\n", - "2022-07-28 20:34:13.599 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.616 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.636 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.653 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.688 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.460 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.689 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (3.492 s elapsed) --------------------\n", - "2022-07-28 20:34:13.689 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.707 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.724 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.742 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.778 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.448 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.779 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (3.582 s elapsed) --------------------\n", - "2022-07-28 20:34:13.779 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.796 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.813 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.831 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.866 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.436 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.866 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (3.670 s elapsed) --------------------\n", - "2022-07-28 20:34:13.867 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.884 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.902 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:13.922 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:13.956 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.424 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:13.956 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (3.760 s elapsed) --------------------\n", - "2022-07-28 20:34:13.957 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:13.973 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:13.991 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.006 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.043 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.413 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.044 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (3.848 s elapsed) --------------------\n", - "2022-07-28 20:34:14.045 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.063 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.080 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.095 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.131 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.401 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.132 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (3.935 s elapsed) --------------------\n", - "2022-07-28 20:34:14.132 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.150 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.168 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.184 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.219 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.389 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.220 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (4.024 s elapsed) --------------------\n", - "2022-07-28 20:34:14.220 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.240 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.257 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.271 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.305 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.378 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.306 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (4.109 s elapsed) --------------------\n", - "2022-07-28 20:34:14.306 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.324 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.344 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.359 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.393 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.367 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.394 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (4.197 s elapsed) --------------------\n", - "2022-07-28 20:34:14.394 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.414 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.431 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.446 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.481 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.355 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.482 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (4.286 s elapsed) --------------------\n", - "2022-07-28 20:34:14.483 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.502 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.520 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.536 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.572 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.344 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.573 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (4.376 s elapsed) --------------------\n", - "2022-07-28 20:34:14.573 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.591 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.609 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.624 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.661 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.333 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.661 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (4.465 s elapsed) --------------------\n", - "2022-07-28 20:34:14.662 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.678 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.697 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.714 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.749 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.322 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.750 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (4.553 s elapsed) --------------------\n", - "2022-07-28 20:34:14.750 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.767 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.785 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.801 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.839 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.311 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.840 - [NOTICE] callbacks.on_cycle_start(174): Cycle 51/500 (4.643 s elapsed) --------------------\n", - "2022-07-28 20:34:14.840 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.855 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.872 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.889 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:14.925 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.300 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:14.926 - [NOTICE] callbacks.on_cycle_start(174): Cycle 52/500 (4.730 s elapsed) --------------------\n", - "2022-07-28 20:34:14.927 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:14.942 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:14.961 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:14.978 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.015 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.289 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.016 - [NOTICE] callbacks.on_cycle_start(174): Cycle 53/500 (4.820 s elapsed) --------------------\n", - "2022-07-28 20:34:15.017 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.032 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.050 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.070 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.109 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.279 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.109 - [NOTICE] callbacks.on_cycle_start(174): Cycle 54/500 (4.913 s elapsed) --------------------\n", - "2022-07-28 20:34:15.110 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.126 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.144 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.163 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.226 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.268 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.226 - [NOTICE] callbacks.on_cycle_start(174): Cycle 55/500 (5.030 s elapsed) --------------------\n", - "2022-07-28 20:34:15.227 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.247 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.267 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.284 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.321 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.257 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.322 - [NOTICE] callbacks.on_cycle_start(174): Cycle 56/500 (5.125 s elapsed) --------------------\n", - "2022-07-28 20:34:15.322 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.340 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.360 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.382 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.430 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.247 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.430 - [NOTICE] callbacks.on_cycle_start(174): Cycle 57/500 (5.234 s elapsed) --------------------\n", - "2022-07-28 20:34:15.431 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.465 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.504 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.533 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.574 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.236 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.574 - [NOTICE] callbacks.on_cycle_start(174): Cycle 58/500 (5.378 s elapsed) --------------------\n", - "2022-07-28 20:34:15.575 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.594 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.612 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.630 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.668 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.226 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.669 - [NOTICE] callbacks.on_cycle_start(174): Cycle 59/500 (5.472 s elapsed) --------------------\n", - "2022-07-28 20:34:15.669 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.689 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.707 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.722 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.759 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.216 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.759 - [NOTICE] callbacks.on_cycle_start(174): Cycle 60/500 (5.563 s elapsed) --------------------\n", - "2022-07-28 20:34:15.759 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.777 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.795 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.812 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.865 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.206 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.883 - [NOTICE] callbacks.on_cycle_start(174): Cycle 61/500 (5.686 s elapsed) --------------------\n", - "2022-07-28 20:34:15.883 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:15.903 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:15.931 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:15.948 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:15.985 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.196 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:15.985 - [NOTICE] callbacks.on_cycle_start(174): Cycle 62/500 (5.789 s elapsed) --------------------\n", - "2022-07-28 20:34:15.985 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.008 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.029 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.044 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.084 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.186 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:16.085 - [NOTICE] callbacks.on_cycle_start(174): Cycle 63/500 (5.889 s elapsed) --------------------\n", - "2022-07-28 20:34:16.086 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.104 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.123 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.137 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.174 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.176 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:16.175 - [NOTICE] callbacks.on_cycle_start(174): Cycle 64/500 (5.978 s elapsed) --------------------\n", - "2022-07-28 20:34:16.175 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.194 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.212 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.227 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.267 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.166 Ah (originally 3.947 Ah, will stop at 3.158 Ah)\n", - "2022-07-28 20:34:16.268 - [NOTICE] callbacks.on_cycle_start(174): Cycle 65/500 (6.072 s elapsed) --------------------\n", - "2022-07-28 20:34:16.269 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.286 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.304 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.320 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.361 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (3.156 Ah) is below stopping capacity (3.158 Ah).\n", - "2022-07-28 20:34:16.362 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 6.072 s\n", - "2022-07-28 20:34:16.376 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (12.409 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.376 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.417 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.434 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.449 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.530 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.156 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.530 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (167.059 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.530 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.545 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.562 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.576 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.612 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.147 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.612 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (248.944 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.612 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.630 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.648 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.663 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.700 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.138 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.700 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (337.105 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.701 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.716 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.734 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.749 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.786 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.128 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.787 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (423.988 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.788 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.804 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.822 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.836 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.874 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.119 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.875 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (511.622 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.875 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.891 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.908 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:16.925 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:16.964 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.110 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:16.964 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (601.291 ms elapsed) --------------------\n", - "2022-07-28 20:34:16.965 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:16.980 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:16.999 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.015 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.053 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.102 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.053 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (690.029 ms elapsed) --------------------\n", - "2022-07-28 20:34:17.053 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.068 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.086 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.104 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.143 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.093 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.146 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (782.853 ms elapsed) --------------------\n", - "2022-07-28 20:34:17.148 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.176 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.202 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.226 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.265 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.085 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.266 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (902.458 ms elapsed) --------------------\n", - "2022-07-28 20:34:17.266 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.283 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.301 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.318 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.362 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.076 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.362 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (999.062 ms elapsed) --------------------\n", - "2022-07-28 20:34:17.363 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.389 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.410 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.429 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.462 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.068 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.463 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.100 s elapsed) --------------------\n", - "2022-07-28 20:34:17.463 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.481 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.498 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.516 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.554 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.060 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.555 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.192 s elapsed) --------------------\n", - "2022-07-28 20:34:17.556 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.579 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.601 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.621 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.659 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.053 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.660 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.297 s elapsed) --------------------\n", - "2022-07-28 20:34:17.661 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.680 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.697 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.714 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.751 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.045 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.752 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.389 s elapsed) --------------------\n", - "2022-07-28 20:34:17.752 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.772 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.790 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.807 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.843 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.038 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.844 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.481 s elapsed) --------------------\n", - "2022-07-28 20:34:17.845 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.863 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.883 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.898 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:17.935 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.031 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:17.936 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (1.573 s elapsed) --------------------\n", - "2022-07-28 20:34:17.936 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:17.955 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:17.973 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:17.988 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.028 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.024 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.029 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (1.665 s elapsed) --------------------\n", - "2022-07-28 20:34:18.029 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.050 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.104 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.131 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.177 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.017 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.177 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (1.814 s elapsed) --------------------\n", - "2022-07-28 20:34:18.177 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.200 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.224 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.243 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.289 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.010 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.290 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (1.927 s elapsed) --------------------\n", - "2022-07-28 20:34:18.290 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.310 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.329 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.344 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.380 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.003 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.380 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (2.017 s elapsed) --------------------\n", - "2022-07-28 20:34:18.381 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.399 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.416 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.431 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.479 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.997 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.480 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.117 s elapsed) --------------------\n", - "2022-07-28 20:34:18.481 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.497 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.516 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.533 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.583 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.991 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.585 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.222 s elapsed) --------------------\n", - "2022-07-28 20:34:18.586 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.603 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.632 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.647 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.685 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.984 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.686 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.323 s elapsed) --------------------\n", - "2022-07-28 20:34:18.686 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.704 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.725 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.740 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.781 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.978 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.781 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.418 s elapsed) --------------------\n", - "2022-07-28 20:34:18.782 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.800 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.818 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.833 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.875 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.972 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.875 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (2.512 s elapsed) --------------------\n", - "2022-07-28 20:34:18.876 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.898 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:18.923 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:18.943 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:18.978 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.966 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:18.979 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (2.616 s elapsed) --------------------\n", - "2022-07-28 20:34:18.979 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:18.995 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.013 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.030 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.068 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.961 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.068 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (2.705 s elapsed) --------------------\n", - "2022-07-28 20:34:19.069 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.084 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.102 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.119 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.159 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.955 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.159 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (2.796 s elapsed) --------------------\n", - "2022-07-28 20:34:19.160 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.180 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.211 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.231 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.274 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.949 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.275 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (2.912 s elapsed) --------------------\n", - "2022-07-28 20:34:19.276 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.292 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.309 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.326 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.360 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.943 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.361 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (2.998 s elapsed) --------------------\n", - "2022-07-28 20:34:19.361 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.377 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.399 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.422 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.466 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.938 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.466 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (3.103 s elapsed) --------------------\n", - "2022-07-28 20:34:19.467 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.483 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.510 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.526 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.560 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.932 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.561 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.198 s elapsed) --------------------\n", - "2022-07-28 20:34:19.561 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.578 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.596 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.615 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.652 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.927 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.653 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (3.290 s elapsed) --------------------\n", - "2022-07-28 20:34:19.654 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.669 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.688 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.704 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.739 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.921 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.739 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (3.376 s elapsed) --------------------\n", - "2022-07-28 20:34:19.740 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.755 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.774 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.790 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.826 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.916 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.826 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (3.463 s elapsed) --------------------\n", - "2022-07-28 20:34:19.827 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.842 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.861 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.876 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:19.914 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.910 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:19.914 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (3.551 s elapsed) --------------------\n", - "2022-07-28 20:34:19.915 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:19.932 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:19.949 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:19.963 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.010 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.905 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.011 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (3.648 s elapsed) --------------------\n", - "2022-07-28 20:34:20.013 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.035 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.058 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.073 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.130 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.899 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.130 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (3.767 s elapsed) --------------------\n", - "2022-07-28 20:34:20.131 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.153 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.182 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.201 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.250 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.894 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.251 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (3.888 s elapsed) --------------------\n", - "2022-07-28 20:34:20.252 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.280 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.297 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.315 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.353 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.888 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.353 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (3.990 s elapsed) --------------------\n", - "2022-07-28 20:34:20.354 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.371 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.389 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.404 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.444 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.883 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.445 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (4.082 s elapsed) --------------------\n", - "2022-07-28 20:34:20.445 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.463 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.481 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.495 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.534 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.877 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.537 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (4.174 s elapsed) --------------------\n", - "2022-07-28 20:34:20.538 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.569 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.598 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.613 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.661 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.871 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.661 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (4.298 s elapsed) --------------------\n", - "2022-07-28 20:34:20.662 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.680 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.699 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.713 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.770 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.866 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.774 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (4.411 s elapsed) --------------------\n", - "2022-07-28 20:34:20.779 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.813 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.831 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.845 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.883 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.860 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.883 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (4.520 s elapsed) --------------------\n", - "2022-07-28 20:34:20.884 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.902 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:20.920 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:20.937 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:20.973 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.854 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:20.974 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (4.611 s elapsed) --------------------\n", - "2022-07-28 20:34:20.974 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:20.993 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.012 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.028 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.069 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.848 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.070 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (4.707 s elapsed) --------------------\n", - "2022-07-28 20:34:21.071 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.088 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.106 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.123 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.165 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.842 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.166 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (4.803 s elapsed) --------------------\n", - "2022-07-28 20:34:21.167 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.184 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.202 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.218 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.260 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.836 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.262 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (4.899 s elapsed) --------------------\n", - "2022-07-28 20:34:21.263 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.281 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.301 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.317 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.357 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.830 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.359 - [NOTICE] callbacks.on_cycle_start(174): Cycle 51/500 (4.996 s elapsed) --------------------\n", - "2022-07-28 20:34:21.361 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.384 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.402 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.419 - [NOTICE] callbacks.on_step_start(182): Cycle 51/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.461 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.824 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.463 - [NOTICE] callbacks.on_cycle_start(174): Cycle 52/500 (5.100 s elapsed) --------------------\n", - "2022-07-28 20:34:21.464 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.486 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.504 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.523 - [NOTICE] callbacks.on_step_start(182): Cycle 52/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.564 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.818 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.564 - [NOTICE] callbacks.on_cycle_start(174): Cycle 53/500 (5.201 s elapsed) --------------------\n", - "2022-07-28 20:34:21.565 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.581 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.599 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.614 - [NOTICE] callbacks.on_step_start(182): Cycle 53/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.651 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.812 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.652 - [NOTICE] callbacks.on_cycle_start(174): Cycle 54/500 (5.289 s elapsed) --------------------\n", - "2022-07-28 20:34:21.652 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.667 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.684 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.699 - [NOTICE] callbacks.on_step_start(182): Cycle 54/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.735 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.805 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.735 - [NOTICE] callbacks.on_cycle_start(174): Cycle 55/500 (5.372 s elapsed) --------------------\n", - "2022-07-28 20:34:21.736 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.750 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.767 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.784 - [NOTICE] callbacks.on_step_start(182): Cycle 55/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.833 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.799 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.833 - [NOTICE] callbacks.on_cycle_start(174): Cycle 56/500 (5.470 s elapsed) --------------------\n", - "2022-07-28 20:34:21.834 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.853 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:21.875 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:21.891 - [NOTICE] callbacks.on_step_start(182): Cycle 56/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:21.950 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.792 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:21.952 - [NOTICE] callbacks.on_cycle_start(174): Cycle 57/500 (5.589 s elapsed) --------------------\n", - "2022-07-28 20:34:21.953 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:21.979 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.014 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.039 - [NOTICE] callbacks.on_step_start(182): Cycle 57/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.096 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.786 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.097 - [NOTICE] callbacks.on_cycle_start(174): Cycle 58/500 (5.734 s elapsed) --------------------\n", - "2022-07-28 20:34:22.097 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.115 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.137 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.154 - [NOTICE] callbacks.on_step_start(182): Cycle 58/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.210 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.779 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.211 - [NOTICE] callbacks.on_cycle_start(174): Cycle 59/500 (5.848 s elapsed) --------------------\n", - "2022-07-28 20:34:22.212 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.244 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.283 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.307 - [NOTICE] callbacks.on_step_start(182): Cycle 59/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.379 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.773 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.380 - [NOTICE] callbacks.on_cycle_start(174): Cycle 60/500 (6.017 s elapsed) --------------------\n", - "2022-07-28 20:34:22.380 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.395 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.413 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.426 - [NOTICE] callbacks.on_step_start(182): Cycle 60/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.463 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.766 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.464 - [NOTICE] callbacks.on_cycle_start(174): Cycle 61/500 (6.101 s elapsed) --------------------\n", - "2022-07-28 20:34:22.465 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.480 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.498 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.511 - [NOTICE] callbacks.on_step_start(182): Cycle 61/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.554 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.759 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.555 - [NOTICE] callbacks.on_cycle_start(174): Cycle 62/500 (6.192 s elapsed) --------------------\n", - "2022-07-28 20:34:22.556 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.571 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.589 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.603 - [NOTICE] callbacks.on_step_start(182): Cycle 62/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.654 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.752 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.654 - [NOTICE] callbacks.on_cycle_start(174): Cycle 63/500 (6.291 s elapsed) --------------------\n", - "2022-07-28 20:34:22.655 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.670 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.688 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.702 - [NOTICE] callbacks.on_step_start(182): Cycle 63/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.751 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.746 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.752 - [NOTICE] callbacks.on_cycle_start(174): Cycle 64/500 (6.389 s elapsed) --------------------\n", - "2022-07-28 20:34:22.752 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.770 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.791 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.805 - [NOTICE] callbacks.on_step_start(182): Cycle 64/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.849 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.739 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.849 - [NOTICE] callbacks.on_cycle_start(174): Cycle 65/500 (6.486 s elapsed) --------------------\n", - "2022-07-28 20:34:22.850 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.868 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.886 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.899 - [NOTICE] callbacks.on_step_start(182): Cycle 65/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:22.945 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.732 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:22.945 - [NOTICE] callbacks.on_cycle_start(174): Cycle 66/500 (6.582 s elapsed) --------------------\n", - "2022-07-28 20:34:22.946 - [NOTICE] callbacks.on_step_start(182): Cycle 66/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:22.963 - [NOTICE] callbacks.on_step_start(182): Cycle 66/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:22.980 - [NOTICE] callbacks.on_step_start(182): Cycle 66/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:22.997 - [NOTICE] callbacks.on_step_start(182): Cycle 66/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.037 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.725 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.037 - [NOTICE] callbacks.on_cycle_start(174): Cycle 67/500 (6.674 s elapsed) --------------------\n", - "2022-07-28 20:34:23.038 - [NOTICE] callbacks.on_step_start(182): Cycle 67/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.054 - [NOTICE] callbacks.on_step_start(182): Cycle 67/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.071 - [NOTICE] callbacks.on_step_start(182): Cycle 67/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.088 - [NOTICE] callbacks.on_step_start(182): Cycle 67/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.136 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.718 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.137 - [NOTICE] callbacks.on_cycle_start(174): Cycle 68/500 (6.774 s elapsed) --------------------\n", - "2022-07-28 20:34:23.137 - [NOTICE] callbacks.on_step_start(182): Cycle 68/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.156 - [NOTICE] callbacks.on_step_start(182): Cycle 68/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.174 - [NOTICE] callbacks.on_step_start(182): Cycle 68/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.189 - [NOTICE] callbacks.on_step_start(182): Cycle 68/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.233 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.711 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.233 - [NOTICE] callbacks.on_cycle_start(174): Cycle 69/500 (6.870 s elapsed) --------------------\n", - "2022-07-28 20:34:23.234 - [NOTICE] callbacks.on_step_start(182): Cycle 69/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.252 - [NOTICE] callbacks.on_step_start(182): Cycle 69/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.275 - [NOTICE] callbacks.on_step_start(182): Cycle 69/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.293 - [NOTICE] callbacks.on_step_start(182): Cycle 69/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.342 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.704 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.343 - [NOTICE] callbacks.on_cycle_start(174): Cycle 70/500 (6.980 s elapsed) --------------------\n", - "2022-07-28 20:34:23.344 - [NOTICE] callbacks.on_step_start(182): Cycle 70/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.378 - [NOTICE] callbacks.on_step_start(182): Cycle 70/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.399 - [NOTICE] callbacks.on_step_start(182): Cycle 70/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.416 - [NOTICE] callbacks.on_step_start(182): Cycle 70/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.460 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.697 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.462 - [NOTICE] callbacks.on_cycle_start(174): Cycle 71/500 (7.099 s elapsed) --------------------\n", - "2022-07-28 20:34:23.464 - [NOTICE] callbacks.on_step_start(182): Cycle 71/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.485 - [NOTICE] callbacks.on_step_start(182): Cycle 71/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.507 - [NOTICE] callbacks.on_step_start(182): Cycle 71/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.522 - [NOTICE] callbacks.on_step_start(182): Cycle 71/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.757 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.690 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.758 - [NOTICE] callbacks.on_cycle_start(174): Cycle 72/500 (7.395 s elapsed) --------------------\n", - "2022-07-28 20:34:23.759 - [NOTICE] callbacks.on_step_start(182): Cycle 72/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.778 - [NOTICE] callbacks.on_step_start(182): Cycle 72/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.797 - [NOTICE] callbacks.on_step_start(182): Cycle 72/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.816 - [NOTICE] callbacks.on_step_start(182): Cycle 72/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.863 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.683 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.864 - [NOTICE] callbacks.on_cycle_start(174): Cycle 73/500 (7.501 s elapsed) --------------------\n", - "2022-07-28 20:34:23.866 - [NOTICE] callbacks.on_step_start(182): Cycle 73/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.884 - [NOTICE] callbacks.on_step_start(182): Cycle 73/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:23.902 - [NOTICE] callbacks.on_step_start(182): Cycle 73/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:23.919 - [NOTICE] callbacks.on_step_start(182): Cycle 73/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:23.980 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.676 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:23.980 - [NOTICE] callbacks.on_cycle_start(174): Cycle 74/500 (7.617 s elapsed) --------------------\n", - "2022-07-28 20:34:23.981 - [NOTICE] callbacks.on_step_start(182): Cycle 74/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:23.999 - [NOTICE] callbacks.on_step_start(182): Cycle 74/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.017 - [NOTICE] callbacks.on_step_start(182): Cycle 74/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.033 - [NOTICE] callbacks.on_step_start(182): Cycle 74/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.078 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.669 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.079 - [NOTICE] callbacks.on_cycle_start(174): Cycle 75/500 (7.716 s elapsed) --------------------\n", - "2022-07-28 20:34:24.080 - [NOTICE] callbacks.on_step_start(182): Cycle 75/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.099 - [NOTICE] callbacks.on_step_start(182): Cycle 75/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.116 - [NOTICE] callbacks.on_step_start(182): Cycle 75/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.131 - [NOTICE] callbacks.on_step_start(182): Cycle 75/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.173 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.662 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.179 - [NOTICE] callbacks.on_cycle_start(174): Cycle 76/500 (7.816 s elapsed) --------------------\n", - "2022-07-28 20:34:24.181 - [NOTICE] callbacks.on_step_start(182): Cycle 76/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.209 - [NOTICE] callbacks.on_step_start(182): Cycle 76/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.229 - [NOTICE] callbacks.on_step_start(182): Cycle 76/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.260 - [NOTICE] callbacks.on_step_start(182): Cycle 76/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.299 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.655 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.301 - [NOTICE] callbacks.on_cycle_start(174): Cycle 77/500 (7.938 s elapsed) --------------------\n", - "2022-07-28 20:34:24.302 - [NOTICE] callbacks.on_step_start(182): Cycle 77/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.316 - [NOTICE] callbacks.on_step_start(182): Cycle 77/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.334 - [NOTICE] callbacks.on_step_start(182): Cycle 77/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.349 - [NOTICE] callbacks.on_step_start(182): Cycle 77/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.391 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.648 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.391 - [NOTICE] callbacks.on_cycle_start(174): Cycle 78/500 (8.028 s elapsed) --------------------\n", - "2022-07-28 20:34:24.391 - [NOTICE] callbacks.on_step_start(182): Cycle 78/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.406 - [NOTICE] callbacks.on_step_start(182): Cycle 78/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.424 - [NOTICE] callbacks.on_step_start(182): Cycle 78/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.436 - [NOTICE] callbacks.on_step_start(182): Cycle 78/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.476 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.642 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.477 - [NOTICE] callbacks.on_cycle_start(174): Cycle 79/500 (8.114 s elapsed) --------------------\n", - "2022-07-28 20:34:24.478 - [NOTICE] callbacks.on_step_start(182): Cycle 79/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.492 - [NOTICE] callbacks.on_step_start(182): Cycle 79/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.510 - [NOTICE] callbacks.on_step_start(182): Cycle 79/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.522 - [NOTICE] callbacks.on_step_start(182): Cycle 79/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.563 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.635 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.564 - [NOTICE] callbacks.on_cycle_start(174): Cycle 80/500 (8.201 s elapsed) --------------------\n", - "2022-07-28 20:34:24.564 - [NOTICE] callbacks.on_step_start(182): Cycle 80/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.581 - [NOTICE] callbacks.on_step_start(182): Cycle 80/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.600 - [NOTICE] callbacks.on_step_start(182): Cycle 80/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.613 - [NOTICE] callbacks.on_step_start(182): Cycle 80/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.657 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.628 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.657 - [NOTICE] callbacks.on_cycle_start(174): Cycle 81/500 (8.294 s elapsed) --------------------\n", - "2022-07-28 20:34:24.658 - [NOTICE] callbacks.on_step_start(182): Cycle 81/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.673 - [NOTICE] callbacks.on_step_start(182): Cycle 81/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.693 - [NOTICE] callbacks.on_step_start(182): Cycle 81/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.705 - [NOTICE] callbacks.on_step_start(182): Cycle 81/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.742 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.621 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.742 - [NOTICE] callbacks.on_cycle_start(174): Cycle 82/500 (8.380 s elapsed) --------------------\n", - "2022-07-28 20:34:24.743 - [NOTICE] callbacks.on_step_start(182): Cycle 82/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.756 - [NOTICE] callbacks.on_step_start(182): Cycle 82/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.773 - [NOTICE] callbacks.on_step_start(182): Cycle 82/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.785 - [NOTICE] callbacks.on_step_start(182): Cycle 82/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.826 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.614 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.826 - [NOTICE] callbacks.on_cycle_start(174): Cycle 83/500 (8.463 s elapsed) --------------------\n", - "2022-07-28 20:34:24.827 - [NOTICE] callbacks.on_step_start(182): Cycle 83/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.842 - [NOTICE] callbacks.on_step_start(182): Cycle 83/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.862 - [NOTICE] callbacks.on_step_start(182): Cycle 83/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.880 - [NOTICE] callbacks.on_step_start(182): Cycle 83/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:24.922 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.607 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:24.923 - [NOTICE] callbacks.on_cycle_start(174): Cycle 84/500 (8.560 s elapsed) --------------------\n", - "2022-07-28 20:34:24.924 - [NOTICE] callbacks.on_step_start(182): Cycle 84/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:24.939 - [NOTICE] callbacks.on_step_start(182): Cycle 84/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:24.957 - [NOTICE] callbacks.on_step_start(182): Cycle 84/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:24.972 - [NOTICE] callbacks.on_step_start(182): Cycle 84/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.016 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.600 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.016 - [NOTICE] callbacks.on_cycle_start(174): Cycle 85/500 (8.653 s elapsed) --------------------\n", - "2022-07-28 20:34:25.017 - [NOTICE] callbacks.on_step_start(182): Cycle 85/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.033 - [NOTICE] callbacks.on_step_start(182): Cycle 85/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.050 - [NOTICE] callbacks.on_step_start(182): Cycle 85/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.062 - [NOTICE] callbacks.on_step_start(182): Cycle 85/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.105 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.593 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.105 - [NOTICE] callbacks.on_cycle_start(174): Cycle 86/500 (8.742 s elapsed) --------------------\n", - "2022-07-28 20:34:25.106 - [NOTICE] callbacks.on_step_start(182): Cycle 86/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.122 - [NOTICE] callbacks.on_step_start(182): Cycle 86/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.144 - [NOTICE] callbacks.on_step_start(182): Cycle 86/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.156 - [NOTICE] callbacks.on_step_start(182): Cycle 86/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.201 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.587 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.201 - [NOTICE] callbacks.on_cycle_start(174): Cycle 87/500 (8.838 s elapsed) --------------------\n", - "2022-07-28 20:34:25.202 - [NOTICE] callbacks.on_step_start(182): Cycle 87/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.223 - [NOTICE] callbacks.on_step_start(182): Cycle 87/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.241 - [NOTICE] callbacks.on_step_start(182): Cycle 87/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.256 - [NOTICE] callbacks.on_step_start(182): Cycle 87/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.299 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.580 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.336 - [NOTICE] callbacks.on_cycle_start(174): Cycle 88/500 (8.973 s elapsed) --------------------\n", - "2022-07-28 20:34:25.349 - [NOTICE] callbacks.on_step_start(182): Cycle 88/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.388 - [NOTICE] callbacks.on_step_start(182): Cycle 88/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.433 - [NOTICE] callbacks.on_step_start(182): Cycle 88/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.452 - [NOTICE] callbacks.on_step_start(182): Cycle 88/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.500 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.573 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.501 - [NOTICE] callbacks.on_cycle_start(174): Cycle 89/500 (9.138 s elapsed) --------------------\n", - "2022-07-28 20:34:25.501 - [NOTICE] callbacks.on_step_start(182): Cycle 89/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.523 - [NOTICE] callbacks.on_step_start(182): Cycle 89/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.564 - [NOTICE] callbacks.on_step_start(182): Cycle 89/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.582 - [NOTICE] callbacks.on_step_start(182): Cycle 89/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.633 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.566 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.634 - [NOTICE] callbacks.on_cycle_start(174): Cycle 90/500 (9.271 s elapsed) --------------------\n", - "2022-07-28 20:34:25.634 - [NOTICE] callbacks.on_step_start(182): Cycle 90/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.651 - [NOTICE] callbacks.on_step_start(182): Cycle 90/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.674 - [NOTICE] callbacks.on_step_start(182): Cycle 90/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.691 - [NOTICE] callbacks.on_step_start(182): Cycle 90/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.735 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.559 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.735 - [NOTICE] callbacks.on_cycle_start(174): Cycle 91/500 (9.372 s elapsed) --------------------\n", - "2022-07-28 20:34:25.735 - [NOTICE] callbacks.on_step_start(182): Cycle 91/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.752 - [NOTICE] callbacks.on_step_start(182): Cycle 91/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.772 - [NOTICE] callbacks.on_step_start(182): Cycle 91/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.786 - [NOTICE] callbacks.on_step_start(182): Cycle 91/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.827 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.553 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.828 - [NOTICE] callbacks.on_cycle_start(174): Cycle 92/500 (9.465 s elapsed) --------------------\n", - "2022-07-28 20:34:25.828 - [NOTICE] callbacks.on_step_start(182): Cycle 92/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.846 - [NOTICE] callbacks.on_step_start(182): Cycle 92/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:25.864 - [NOTICE] callbacks.on_step_start(182): Cycle 92/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:25.880 - [NOTICE] callbacks.on_step_start(182): Cycle 92/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:25.923 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.546 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:25.934 - [NOTICE] callbacks.on_cycle_start(174): Cycle 93/500 (9.571 s elapsed) --------------------\n", - "2022-07-28 20:34:25.938 - [NOTICE] callbacks.on_step_start(182): Cycle 93/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:25.966 - [NOTICE] callbacks.on_step_start(182): Cycle 93/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:26.016 - [NOTICE] callbacks.on_step_start(182): Cycle 93/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:26.032 - [NOTICE] callbacks.on_step_start(182): Cycle 93/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:26.074 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.539 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:26.075 - [NOTICE] callbacks.on_cycle_start(174): Cycle 94/500 (9.712 s elapsed) --------------------\n", - "2022-07-28 20:34:26.075 - [NOTICE] callbacks.on_step_start(182): Cycle 94/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:26.093 - [NOTICE] callbacks.on_step_start(182): Cycle 94/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:26.111 - [NOTICE] callbacks.on_step_start(182): Cycle 94/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:26.128 - [NOTICE] callbacks.on_step_start(182): Cycle 94/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:26.171 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.533 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:26.172 - [NOTICE] callbacks.on_cycle_start(174): Cycle 95/500 (9.809 s elapsed) --------------------\n", - "2022-07-28 20:34:26.173 - [NOTICE] callbacks.on_step_start(182): Cycle 95/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:26.193 - [NOTICE] callbacks.on_step_start(182): Cycle 95/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:26.214 - [NOTICE] callbacks.on_step_start(182): Cycle 95/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:26.231 - [NOTICE] callbacks.on_step_start(182): Cycle 95/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:26.277 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 2.526 Ah (originally 3.156 Ah, will stop at 2.525 Ah)\n", - "2022-07-28 20:34:26.278 - [NOTICE] callbacks.on_cycle_start(174): Cycle 96/500 (9.915 s elapsed) --------------------\n", - "2022-07-28 20:34:26.278 - [NOTICE] callbacks.on_step_start(182): Cycle 96/500, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:26.296 - [NOTICE] callbacks.on_step_start(182): Cycle 96/500, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:26.315 - [NOTICE] callbacks.on_step_start(182): Cycle 96/500, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:26.331 - [NOTICE] callbacks.on_step_start(182): Cycle 96/500, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:26.373 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (2.519 Ah) is below stopping capacity (2.525 Ah).\n", - "2022-07-28 20:34:26.375 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 9.915 s\n" - ] - } - ], - "source": [ - "# With integer\n", - "sol_int = sim.solve(save_at_cycles=5)\n", - "# With list\n", - "sol_list = sim.solve(save_at_cycles=[30,45,55])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "severe-yorkshire", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_int.cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "unavailable-fetish", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " ,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_list.cycles" - ] - }, - { - "cell_type": "markdown", - "id": "guilty-nylon", - "metadata": {}, - "source": [ - "For the cycles that are saved, you can plot as usual (note off-by-1 indexing)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "architectural-signal", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "cce3d0c7e266450585ed9aa32d99333d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=105.0977277146772, description='t', max=107.45055589875335, min=105.09…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol_list.cycles[44].plot([\"Current [A]\",\"Terminal voltage [V]\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "played-hundred", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1,2,figsize=(10,5))\n", - "for cycle in sol_int.cycles:\n", - " if cycle is not None:\n", - " t = cycle[\"Time [h]\"].data - cycle[\"Time [h]\"].data[0]\n", - " ax[0].plot(t, cycle[\"Current [A]\"].data)\n", - " ax[0].set_xlabel(\"Time [h]\")\n", - " ax[0].set_title(\"Current [A]\")\n", - " ax[1].plot(t, cycle[\"Terminal voltage [V]\"].data)\n", - " ax[1].set_xlabel(\"Time [h]\")\n", - " ax[1].set_title(\"Terminal voltage [V]\")" - ] - }, - { - "cell_type": "markdown", - "id": "considered-rescue", - "metadata": {}, - "source": [ - "All summary variables are always available for every cycle, since these are much less memory-intensive" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "multiple-culture", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "array([[,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ],\n", - " [,\n", - " ,\n", - " ]], dtype=object)" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pybamm.plot_summary_variables(sol_list)" - ] - }, - { - "cell_type": "markdown", - "id": "convinced-winter", - "metadata": {}, - "source": [ - "## Starting solution" - ] - }, - { - "cell_type": "markdown", - "id": "unauthorized-fundamental", - "metadata": {}, - "source": [ - "A simulation can be performed iteratively by using the `starting_solution` feature. For example, we first solve for 10 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "posted-plastic", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-07-28 20:34:29.314 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/10 (19.656 ms elapsed) --------------------\n", - "2022-07-28 20:34:29.315 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:29.363 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:29.401 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:29.454 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:29.611 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:29.612 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/10 (317.477 ms elapsed) --------------------\n", - "2022-07-28 20:34:29.612 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:29.641 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:29.665 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:29.691 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:29.733 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:29.735 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/10 (440.360 ms elapsed) --------------------\n", - "2022-07-28 20:34:29.736 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:29.764 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:29.784 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:29.812 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:29.851 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:29.852 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/10 (557.569 ms elapsed) --------------------\n", - "2022-07-28 20:34:29.852 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:29.881 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:29.900 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:29.927 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:29.965 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:29.966 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/10 (671.074 ms elapsed) --------------------\n", - "2022-07-28 20:34:29.966 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:29.994 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.018 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.043 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.087 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.087 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/10 (792.944 ms elapsed) --------------------\n", - "2022-07-28 20:34:30.088 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:30.114 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.136 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.167 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.212 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.213 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/10 (918.697 ms elapsed) --------------------\n", - "2022-07-28 20:34:30.214 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:30.234 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.254 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.277 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.317 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.318 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/10 (1.023 s elapsed) --------------------\n", - "2022-07-28 20:34:30.318 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:30.343 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.363 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.385 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.423 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.424 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/10 (1.129 s elapsed) --------------------\n", - "2022-07-28 20:34:30.424 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:30.576 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.594 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.618 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.654 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.655 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/10 (1.360 s elapsed) --------------------\n", - "2022-07-28 20:34:30.655 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:30.683 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:30.703 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:30.726 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:30.764 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:30.765 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 1.360 s\n" - ] - } - ], - "source": [ - "experiment = pybamm.Experiment([\n", - " (f\"Discharge at 1C until {Vmin}V\",\n", - " \"Rest for 1 hour\",\n", - " f\"Charge at 1C until {Vmax}V\", \n", - " f\"Hold at {Vmax}V until C/50\")\n", - "] * 10,\n", - "termination=\"80% capacity\"\n", - ")\n", - "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", - "sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "id": "weird-darkness", - "metadata": {}, - "source": [ - "If we give `sol` as the starting solution this will then solve for the next 10 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "moderate-pipeline", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-07-28 20:34:30.985 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/20 (12.251 ms elapsed) --------------------\n", - "2022-07-28 20:34:30.986 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.015 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.034 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.062 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.155 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.156 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/20 (183.170 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.156 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.180 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.198 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.217 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.256 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.256 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/20 (283.604 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.256 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.277 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.294 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.315 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.356 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.357 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/20 (384.113 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.357 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.379 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.398 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.419 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.461 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.462 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/20 (489.028 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.462 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.484 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.502 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.524 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.568 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.569 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/20 (596.375 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.569 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.595 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.614 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.636 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.674 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.675 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/20 (702.551 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.676 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.718 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.735 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.757 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.792 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.793 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/20 (820.334 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.793 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.817 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.835 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.857 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:31.897 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:31.898 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/20 (925.110 ms elapsed) --------------------\n", - "2022-07-28 20:34:31.898 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:31.921 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:31.942 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:31.964 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:32.004 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:32.005 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/20 (1.032 s elapsed) --------------------\n", - "2022-07-28 20:34:32.005 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 1/4: Discharge at 1C until 3.0V\n", - "2022-07-28 20:34:32.025 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 2/4: Rest for 1 hour\n", - "2022-07-28 20:34:32.044 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 3/4: Charge at 1C until 4.2V\n", - "2022-07-28 20:34:32.065 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 4/4: Hold at 4.2V until C/50\n", - "2022-07-28 20:34:32.104 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", - "2022-07-28 20:34:32.105 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 1.032 s\n" - ] - } - ], - "source": [ - "sol2 = sim.solve(starting_solution=sol)" - ] - }, - { - "cell_type": "markdown", - "id": "leading-passport", - "metadata": {}, - "source": [ - "We have now simulated 20 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "higher-covering", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(sol2.cycles)" - ] - }, - { - "cell_type": "markdown", - "id": "plastic-framework", - "metadata": {}, - "source": [ - "## References" - ] - }, - { - "cell_type": "markdown", - "id": "drawn-fifty", - "metadata": {}, - "source": [ - "The relevant papers for this notebook are:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "driven-sensitivity", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] Weilong Ai, Ludwig Kraft, Johannes Sturm, Andreas Jossen, and Billy Wu. Electrochemical thermal-mechanical modelling of stress inhomogeneity in lithium-ion pouch cells. Journal of The Electrochemical Society, 167(1):013512, 2019. doi:10.1149/2.0122001JES.\n", - "[2] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", - "[3] Ferran Brosa Planella and W. Dhammika Widanage. Systematic derivation of a Single Particle Model with Electrolyte and Side Reactions (SPMe+SR) for degradation of lithium-ion batteries. Submitted for publication, ():, 2022. doi:.\n", - "[4] Rutooj Deshpande, Mark Verbrugge, Yang-Tse Cheng, John Wang, and Ping Liu. Battery cycle life prediction with coupled chemical degradation and fatigue mechanics. Journal of the Electrochemical Society, 159(10):A1730, 2012. doi:10.1149/2.049210jes.\n", - "[5] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", - "[6] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[7] Peyman Mohtat, Suhak Lee, Jason B Siegel, and Anna G Stefanopoulou. Towards better estimability of electrode-specific state of health: decoding the cell expansion. Journal of Power Sources, 427:101–111, 2019.\n", - "[8] Peyman Mohtat, Suhak Lee, Valentin Sulzer, Jason B. Siegel, and Anna G. Stefanopoulou. Differential Expansion and Voltage Model for Li-ion Batteries at Practical Charging Rates. Journal of The Electrochemical Society, 167(11):110561, 2020. doi:10.1149/1945-7111/aba5d1.\n", - "[9] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", - "[10] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", - "\n" - ] - } - ], - "source": [ - "pybamm.print_citations()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.12 ('conda_jl')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - }, - "vscode": { - "interpreter": { - "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" - } - } + "cells": [ + { + "cell_type": "markdown", + "id": "regional-bedroom", + "metadata": {}, + "source": [ + "# Simulating long experiments" + ] + }, + { + "cell_type": "markdown", + "id": "quantitative-radar", + "metadata": {}, + "source": [ + "This notebook introduces functionality for simulating experiments over hundreds or even thousands of cycles. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "novel-spectacular", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pybamm -q # install PyBaMM if it is not installed\n", + "import pybamm\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "mounted-seven", + "metadata": {}, + "source": [ + "## Simulating long experiments" + ] + }, + { + "cell_type": "markdown", + "id": "chronic-consensus", + "metadata": {}, + "source": [ + "In the interest of simplicity and running time, we consider a SPM with SEI effects leading to linear degradation, with parameter values chosen so that the capacity fades by 20% in just a few cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "limiting-making", + "metadata": {}, + "outputs": [], + "source": [ + "parameter_values = pybamm.ParameterValues(\"Mohtat2020\")\n", + "parameter_values.update({\"SEI kinetic rate constant [m.s-1]\": 1e-14})\n", + "spm = pybamm.lithium_ion.SPM({\"SEI\": \"ec reaction limited\"})" + ] + }, + { + "cell_type": "markdown", + "id": "compact-teddy", + "metadata": {}, + "source": [ + "Using the \"Electrode SOH\" (eSOH) model, we initialize the concentration in each electrode at 100% State of Charge" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "photographic-sussex", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial negative electrode SOC: 0.833\n", + "Initial positive electrode SOC: 0.034\n" + ] + } + ], + "source": [ + "# Calculate stoichiometries at 100% SOC\n", + "\n", + "param = spm.param\n", + "esoh_solver = pybamm.lithium_ion.ElectrodeSOHSolver(parameter_values, param)\n", + "\n", + "Vmin = 3.0\n", + "Vmax = 4.2\n", + "Cn = parameter_values.evaluate(param.n.cap_init)\n", + "Cp = parameter_values.evaluate(param.p.cap_init)\n", + "n_Li_init = parameter_values.evaluate(param.n_Li_particles_init)\n", + "\n", + "inputs={ \"V_min\": Vmin, \"V_max\": Vmax, \"C_n\": Cn, \"C_p\": Cp, \"n_Li\": n_Li_init}\n", + "esoh_sol = esoh_solver.solve(inputs)\n", + "\n", + "print(f\"Initial negative electrode SOC: {esoh_sol['x_100'].data[0]:.3f}\")\n", + "print(f\"Initial positive electrode SOC: {esoh_sol['y_100'].data[0]:.3f}\")\n", + "\n", + "# Update parameter values with initial conditions\n", + "c_n_max = parameter_values.evaluate(param.n.prim.c_max)\n", + "c_p_max = parameter_values.evaluate(param.p.prim.c_max)\n", + "parameter_values.update(\n", + " {\n", + " \"Initial concentration in negative electrode [mol.m-3]\": esoh_sol[\"x_100\"].data[0] * c_n_max,\n", + " \"Initial concentration in positive electrode [mol.m-3]\": esoh_sol[\"y_100\"].data[0] * c_p_max,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "focused-substitute", + "metadata": {}, + "source": [ + "We can now simulate a single CCCV cycle using the `Experiment` class (see [this notebook](https://github.com/pybamm-team/PyBaMM/blob/develop/examples/notebooks/Getting%20Started/Tutorial%205%20-%20Run%20experiments.ipynb) for more details)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "religious-primary", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:25.066 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/1 (19.498 ms elapsed) --------------------\n", + "2022-08-17 18:31:25.066 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:25.117 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:25.152 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:25.198 - [NOTICE] callbacks.on_step_start(182): Cycle 1/1, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:25.345 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 298.915 ms\n" + ] + } + ], + "source": [ + "pybamm.set_logging_level(\"NOTICE\")\n", + "\n", + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\"\n", + " )\n", + "])\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "heavy-crisis", + "metadata": {}, + "source": [ + "Alternatively, we can simulate many CCCV cycles. Here we simulate either 100 cycles or until the capacity is 80% of the initial capacity, whichever is first. The capacity is calculated by the eSOH model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "stupid-abortion", + "metadata": { + "tags": [ + "outputPrepend" + ] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:26.075 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (19.178 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.076 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.121 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.155 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.201 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.343 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.344 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (287.799 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.344 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.366 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.382 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.404 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.440 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.440 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (384.481 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.441 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.463 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.480 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.502 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.542 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.542 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (486.398 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.543 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.566 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.583 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.605 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.641 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.642 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (586.213 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.642 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.665 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.682 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.704 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.743 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.744 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (688.528 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.745 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.767 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.783 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.803 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.842 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.842 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (786.367 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.843 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.863 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.879 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.898 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:26.936 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:26.936 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (880.557 ms elapsed) --------------------\n", + "2022-08-17 18:31:26.937 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:26.956 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:26.973 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:26.992 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.029 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.030 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (973.950 ms elapsed) --------------------\n", + "2022-08-17 18:31:27.030 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.053 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.069 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.090 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.128 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.128 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (1.073 s elapsed) --------------------\n", + "2022-08-17 18:31:27.129 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.151 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.168 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.189 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.228 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.229 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (1.173 s elapsed) --------------------\n", + "2022-08-17 18:31:27.229 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.253 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.269 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.289 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.329 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.329 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.274 s elapsed) --------------------\n", + "2022-08-17 18:31:27.330 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.353 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.369 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.389 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:27.427 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.428 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.372 s elapsed) --------------------\n", + "2022-08-17 18:31:27.428 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.448 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.464 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.481 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.522 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.522 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.467 s elapsed) --------------------\n", + "2022-08-17 18:31:27.523 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.544 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.559 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.579 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.620 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.621 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.565 s elapsed) --------------------\n", + "2022-08-17 18:31:27.621 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.641 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.658 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.676 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.714 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.715 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.659 s elapsed) --------------------\n", + "2022-08-17 18:31:27.715 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.736 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.752 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.773 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.811 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.811 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (1.755 s elapsed) --------------------\n", + "2022-08-17 18:31:27.811 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.832 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.848 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.868 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:27.906 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:27.907 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (1.851 s elapsed) --------------------\n", + "2022-08-17 18:31:27.907 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:27.928 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:27.944 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:27.964 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.000 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.001 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (1.945 s elapsed) --------------------\n", + "2022-08-17 18:31:28.001 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.022 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.038 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.056 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.094 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.094 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (2.038 s elapsed) --------------------\n", + "2022-08-17 18:31:28.094 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.113 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.129 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.147 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.184 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.184 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (2.129 s elapsed) --------------------\n", + "2022-08-17 18:31:28.185 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.203 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.218 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.236 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.272 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.273 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.217 s elapsed) --------------------\n", + "2022-08-17 18:31:28.273 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.291 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.308 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.325 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.362 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.363 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.307 s elapsed) --------------------\n", + "2022-08-17 18:31:28.363 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.382 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.398 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.418 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.456 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.456 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.400 s elapsed) --------------------\n", + "2022-08-17 18:31:28.456 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.536 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.552 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:28.572 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.610 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.611 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.555 s elapsed) --------------------\n", + "2022-08-17 18:31:28.611 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.631 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.647 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.666 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.702 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.703 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (2.647 s elapsed) --------------------\n", + "2022-08-17 18:31:28.703 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.724 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.740 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.759 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.794 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.794 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (2.738 s elapsed) --------------------\n", + "2022-08-17 18:31:28.795 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.815 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.832 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.849 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.884 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.885 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (2.829 s elapsed) --------------------\n", + "2022-08-17 18:31:28.885 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.907 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:28.922 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:28.939 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:28.976 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:28.977 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (2.921 s elapsed) --------------------\n", + "2022-08-17 18:31:28.977 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:28.995 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.012 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.029 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.070 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.070 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (3.014 s elapsed) --------------------\n", + "2022-08-17 18:31:29.070 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.091 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.108 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.127 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.166 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.166 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (3.111 s elapsed) --------------------\n", + "2022-08-17 18:31:29.167 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.185 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.201 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.220 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.258 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.258 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (3.203 s elapsed) --------------------\n", + "2022-08-17 18:31:29.259 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.277 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.294 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.313 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.348 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.348 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.292 s elapsed) --------------------\n", + "2022-08-17 18:31:29.348 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.368 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.384 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.402 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.439 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.440 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (3.384 s elapsed) --------------------\n", + "2022-08-17 18:31:29.440 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.460 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.476 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.494 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.530 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.530 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (3.474 s elapsed) --------------------\n", + "2022-08-17 18:31:29.530 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.551 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.567 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.583 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.619 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.620 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (3.564 s elapsed) --------------------\n", + "2022-08-17 18:31:29.620 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.640 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:29.656 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.672 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.709 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.709 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (3.653 s elapsed) --------------------\n", + "2022-08-17 18:31:29.710 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.730 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.746 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.762 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.798 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.798 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (3.742 s elapsed) --------------------\n", + "2022-08-17 18:31:29.798 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.816 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.833 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.850 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.889 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.889 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (3.833 s elapsed) --------------------\n", + "2022-08-17 18:31:29.889 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.907 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:29.924 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:29.940 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:29.977 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:29.977 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (3.921 s elapsed) --------------------\n", + "2022-08-17 18:31:29.977 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:29.995 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.010 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.029 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.065 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.065 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (4.009 s elapsed) --------------------\n", + "2022-08-17 18:31:30.065 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.083 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.098 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.116 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.152 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.153 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (4.097 s elapsed) --------------------\n", + "2022-08-17 18:31:30.153 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.171 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.186 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.204 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.239 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.240 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (4.184 s elapsed) --------------------\n", + "2022-08-17 18:31:30.240 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.259 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.274 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.292 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.329 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.329 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (4.273 s elapsed) --------------------\n", + "2022-08-17 18:31:30.329 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.349 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.364 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.383 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.418 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.419 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (4.363 s elapsed) --------------------\n", + "2022-08-17 18:31:30.419 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.439 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.455 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.470 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.506 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.507 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (4.451 s elapsed) --------------------\n", + "2022-08-17 18:31:30.507 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.527 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.543 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.558 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.596 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.597 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (4.541 s elapsed) --------------------\n", + "2022-08-17 18:31:30.598 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.617 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.634 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.650 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.690 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.691 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (4.635 s elapsed) --------------------\n", + "2022-08-17 18:31:30.691 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:30.708 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.725 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.740 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.778 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.779 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (4.723 s elapsed) --------------------\n", + "2022-08-17 18:31:30.780 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.796 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.812 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.829 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.868 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:30.869 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (4.813 s elapsed) --------------------\n", + "2022-08-17 18:31:30.869 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:30.887 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:30.903 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:30.922 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:30.961 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", + "2022-08-17 18:31:30.963 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 4.905 s\n" + ] + } + ], + "source": [ + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\")\n", + "] * 500,\n", + "termination=\"80% capacity\"\n", + ")\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "cloudy-lover", + "metadata": {}, + "source": [ + "### Summary variables" + ] + }, + { + "cell_type": "markdown", + "id": "shared-practitioner", + "metadata": {}, + "source": [ + "We can plot standard variables like the current and voltage, but it isn't very instructive on these timescales" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "personalized-oracle", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d4db2155b19b4f25bdb25d9b120b5f70", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=147.08072177593596, step=1.4708072177593596)…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol.plot([\"Current [A]\", \"Terminal voltage [V]\"])" + ] + }, + { + "cell_type": "markdown", + "id": "intense-princeton", + "metadata": {}, + "source": [ + "Instead, we plot \"summary variables\", which show how the battery degrades over time by various metrics. Some of the variables also have \"Change in ...\", which is how much that variable changes over each cycle. This can be achieved by using `plot_summary_variables` method of pybamm, which can also be used to compare \"summary variables\" extracted from 2 or more solutions." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "right-skiing", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['C',\n", + " 'C_n',\n", + " 'C_n * (x_100 - x_0)',\n", + " 'C_p',\n", + " 'C_p * (y_100 - y_0)',\n", + " 'Capacity [A.h]',\n", + " 'Change in local ECM resistance [Ohm]',\n", + " 'Change in loss of active material in negative electrode [%]',\n", + " 'Change in loss of active material in positive electrode [%]',\n", + " 'Change in loss of capacity to SEI [A.h]',\n", + " 'Change in loss of capacity to SEI on cracks [A.h]',\n", + " 'Change in loss of capacity to lithium plating [A.h]',\n", + " 'Change in loss of lithium inventory [%]',\n", + " 'Change in loss of lithium inventory, including electrolyte [%]',\n", + " 'Change in loss of lithium to SEI [mol]',\n", + " 'Change in loss of lithium to SEI on cracks [mol]',\n", + " 'Change in loss of lithium to lithium plating [mol]',\n", + " 'Change in negative electrode capacity [A.h]',\n", + " 'Change in positive electrode capacity [A.h]',\n", + " 'Change in total capacity lost to side reactions [A.h]',\n", + " 'Change in total lithium [mol]',\n", + " 'Change in total lithium in electrolyte [mol]',\n", + " 'Change in total lithium in negative electrode [mol]',\n", + " 'Change in total lithium in particles [mol]',\n", + " 'Change in total lithium in positive electrode [mol]',\n", + " 'Change in total lithium lost [mol]',\n", + " 'Change in total lithium lost from electrolyte [mol]',\n", + " 'Change in total lithium lost from particles [mol]',\n", + " 'Change in total lithium lost to side reactions [mol]',\n", + " 'Cycle number',\n", + " 'Local ECM resistance [Ohm]',\n", + " 'Loss of active material in negative electrode [%]',\n", + " 'Loss of active material in positive electrode [%]',\n", + " 'Loss of capacity to SEI [A.h]',\n", + " 'Loss of capacity to SEI on cracks [A.h]',\n", + " 'Loss of capacity to lithium plating [A.h]',\n", + " 'Loss of lithium inventory [%]',\n", + " 'Loss of lithium inventory, including electrolyte [%]',\n", + " 'Loss of lithium to SEI [mol]',\n", + " 'Loss of lithium to SEI on cracks [mol]',\n", + " 'Loss of lithium to lithium plating [mol]',\n", + " 'Maximum measured discharge capacity [A.h]',\n", + " 'Maximum voltage [V]',\n", + " 'Measured capacity [A.h]',\n", + " 'Minimum measured discharge capacity [A.h]',\n", + " 'Minimum voltage [V]',\n", + " 'Negative electrode capacity [A.h]',\n", + " 'Positive electrode capacity [A.h]',\n", + " 'Total capacity lost to side reactions [A.h]',\n", + " 'Total lithium [mol]',\n", + " 'Total lithium in electrolyte [mol]',\n", + " 'Total lithium in negative electrode [mol]',\n", + " 'Total lithium in particles [mol]',\n", + " 'Total lithium in positive electrode [mol]',\n", + " 'Total lithium lost [mol]',\n", + " 'Total lithium lost from electrolyte [mol]',\n", + " 'Total lithium lost from particles [mol]',\n", + " 'Total lithium lost to side reactions [mol]',\n", + " 'Un(x_0)',\n", + " 'Un(x_100)',\n", + " 'Up(y_0)',\n", + " 'Up(y_0) - Un(x_0)',\n", + " 'Up(y_100)',\n", + " 'Up(y_100) - Un(x_100)',\n", + " 'n_Li',\n", + " 'n_Li_0',\n", + " 'n_Li_100',\n", + " 'x_0',\n", + " 'x_100',\n", + " 'y_0',\n", + " 'y_100']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(sol.summary_variables.keys())" + ] + }, + { + "cell_type": "markdown", + "id": "approximate-error", + "metadata": {}, + "source": [ + "The \"summary variables\" associated with a particular model can also be accessed as a list (which can then be edited) -" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "romance-roulette", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Positive electrode capacity [A.h]',\n", + " 'Loss of active material in positive electrode [%]',\n", + " 'Loss of lithium inventory [%]',\n", + " 'Loss of lithium inventory, including electrolyte [%]',\n", + " 'Total lithium [mol]',\n", + " 'Total lithium in electrolyte [mol]',\n", + " 'Total lithium in positive electrode [mol]',\n", + " 'Total lithium in particles [mol]',\n", + " 'Total lithium lost [mol]',\n", + " 'Total lithium lost from particles [mol]',\n", + " 'Total lithium lost from electrolyte [mol]',\n", + " 'Loss of lithium to SEI [mol]',\n", + " 'Loss of capacity to SEI [A.h]',\n", + " 'Total lithium lost to side reactions [mol]',\n", + " 'Total capacity lost to side reactions [A.h]',\n", + " 'Local ECM resistance [Ohm]',\n", + " 'Negative electrode capacity [A.h]',\n", + " 'Loss of active material in negative electrode [%]',\n", + " 'Total lithium in negative electrode [mol]',\n", + " 'Loss of lithium to lithium plating [mol]',\n", + " 'Loss of capacity to lithium plating [A.h]',\n", + " 'Loss of lithium to SEI on cracks [mol]',\n", + " 'Loss of capacity to SEI on cracks [A.h]']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spm.summary_variables" + ] + }, + { + "cell_type": "markdown", + "id": "given-telephone", + "metadata": {}, + "source": [ + "Here the only degradation mechanism is one that causes loss of lithium, so we don't see loss of active material" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "postal-butter", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ]], dtype=object)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pybamm.plot_summary_variables(sol)" + ] + }, + { + "cell_type": "markdown", + "id": "french-substance", + "metadata": {}, + "source": [ + "To suggest additional summary variables, open an issue!" + ] + }, + { + "cell_type": "markdown", + "id": "accepting-canada", + "metadata": {}, + "source": [ + "## Choosing which cycles to save" + ] + }, + { + "cell_type": "markdown", + "id": "employed-plate", + "metadata": {}, + "source": [ + "If the simulation contains thousands of cycles, saving each cycle in RAM might not be possible. To get around this, we can use `save_at_cycles`. If this is an integer `n`, every nth cycle is saved. If this is a list, all the cycles in the list are saved.\n", + "The first cycle is always saved." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "polished-trout", + "metadata": { + "tags": [ + "outputPrepend" + ] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:32.193 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (11.042 us elapsed) --------------------\n", + "2022-08-17 18:31:32.193 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.240 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.258 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.279 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.319 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.319 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (126.729 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.320 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.343 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.361 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.383 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.423 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.423 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (230.655 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.424 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.447 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.465 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.487 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.523 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.523 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (330.770 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.524 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.550 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.569 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.592 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.628 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.628 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (435.830 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.629 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.652 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.669 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.692 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.730 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.731 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (538.518 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.732 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.753 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.770 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.790 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.828 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.829 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (636.187 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.829 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.849 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.866 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.885 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:32.925 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:32.926 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (733.131 ms elapsed) --------------------\n", + "2022-08-17 18:31:32.926 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:32.946 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:32.963 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:32.983 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.023 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.023 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (830.410 ms elapsed) --------------------\n", + "2022-08-17 18:31:33.023 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.046 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.062 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.083 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.123 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.124 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (930.958 ms elapsed) --------------------\n", + "2022-08-17 18:31:33.124 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.146 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.163 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.185 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.224 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.225 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (1.032 s elapsed) --------------------\n", + "2022-08-17 18:31:33.225 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.248 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.264 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.288 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.326 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.326 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.134 s elapsed) --------------------\n", + "2022-08-17 18:31:33.327 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.349 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.368 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.388 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:33.427 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.428 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.236 s elapsed) --------------------\n", + "2022-08-17 18:31:33.429 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.448 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.464 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.482 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.522 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.522 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.330 s elapsed) --------------------\n", + "2022-08-17 18:31:33.523 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.542 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.559 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.579 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.616 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.616 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.424 s elapsed) --------------------\n", + "2022-08-17 18:31:33.617 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.636 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.653 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.672 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.708 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.709 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.516 s elapsed) --------------------\n", + "2022-08-17 18:31:33.709 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.729 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.745 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.765 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.803 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.803 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (1.610 s elapsed) --------------------\n", + "2022-08-17 18:31:33.803 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.824 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.840 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.860 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.897 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.898 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (1.705 s elapsed) --------------------\n", + "2022-08-17 18:31:33.898 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:33.919 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:33.935 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:33.956 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:33.993 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:33.993 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (1.801 s elapsed) --------------------\n", + "2022-08-17 18:31:33.994 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.015 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.033 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.050 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.088 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.089 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (1.896 s elapsed) --------------------\n", + "2022-08-17 18:31:34.089 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.108 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.125 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.142 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.180 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.180 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (1.988 s elapsed) --------------------\n", + "2022-08-17 18:31:34.180 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.198 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.214 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.231 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.270 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.270 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.078 s elapsed) --------------------\n", + "2022-08-17 18:31:34.271 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.290 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.306 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.323 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.362 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.363 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.170 s elapsed) --------------------\n", + "2022-08-17 18:31:34.363 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.382 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.398 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.418 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.455 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.455 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.263 s elapsed) --------------------\n", + "2022-08-17 18:31:34.456 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.476 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.493 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:34.512 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.554 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.554 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.362 s elapsed) --------------------\n", + "2022-08-17 18:31:34.554 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.575 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.592 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.611 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.648 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.649 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (2.456 s elapsed) --------------------\n", + "2022-08-17 18:31:34.649 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.670 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.688 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.712 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.749 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.750 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (2.557 s elapsed) --------------------\n", + "2022-08-17 18:31:34.750 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.772 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.788 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.806 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.843 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.844 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (2.651 s elapsed) --------------------\n", + "2022-08-17 18:31:34.844 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.865 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.882 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.900 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:34.937 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:34.938 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (2.745 s elapsed) --------------------\n", + "2022-08-17 18:31:34.938 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:34.957 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:34.974 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:34.991 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.029 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.030 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (2.837 s elapsed) --------------------\n", + "2022-08-17 18:31:35.030 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.049 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.066 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.085 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.122 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.122 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (2.930 s elapsed) --------------------\n", + "2022-08-17 18:31:35.123 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.141 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.157 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.177 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.215 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.215 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (3.022 s elapsed) --------------------\n", + "2022-08-17 18:31:35.215 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.234 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.250 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.270 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.308 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.309 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.116 s elapsed) --------------------\n", + "2022-08-17 18:31:35.309 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.330 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.346 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.366 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.403 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.404 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (3.211 s elapsed) --------------------\n", + "2022-08-17 18:31:35.404 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.425 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.441 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.462 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.499 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.500 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (3.307 s elapsed) --------------------\n", + "2022-08-17 18:31:35.500 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.521 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.538 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.556 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.594 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.594 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (3.402 s elapsed) --------------------\n", + "2022-08-17 18:31:35.595 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.617 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:35.635 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.652 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.694 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.695 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (3.502 s elapsed) --------------------\n", + "2022-08-17 18:31:35.695 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.717 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.736 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.753 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.790 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.790 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (3.597 s elapsed) --------------------\n", + "2022-08-17 18:31:35.790 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.807 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.825 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.840 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.875 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.876 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (3.683 s elapsed) --------------------\n", + "2022-08-17 18:31:35.876 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.893 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.909 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:35.925 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:35.960 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:35.961 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (3.768 s elapsed) --------------------\n", + "2022-08-17 18:31:35.961 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:35.978 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:35.994 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.012 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.046 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.046 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (3.854 s elapsed) --------------------\n", + "2022-08-17 18:31:36.047 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.064 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.079 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.098 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.134 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.135 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (3.942 s elapsed) --------------------\n", + "2022-08-17 18:31:36.135 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.152 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.169 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.187 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.222 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.223 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (4.030 s elapsed) --------------------\n", + "2022-08-17 18:31:36.223 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.242 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.258 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.276 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.311 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.311 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (4.119 s elapsed) --------------------\n", + "2022-08-17 18:31:36.312 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.331 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.347 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.365 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.401 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.402 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (4.209 s elapsed) --------------------\n", + "2022-08-17 18:31:36.402 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.423 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.440 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.456 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.493 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.494 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (4.301 s elapsed) --------------------\n", + "2022-08-17 18:31:36.494 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.513 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.529 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.544 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.583 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.583 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (4.391 s elapsed) --------------------\n", + "2022-08-17 18:31:36.583 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.602 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.618 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.634 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.672 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.673 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (4.480 s elapsed) --------------------\n", + "2022-08-17 18:31:36.673 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:36.690 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.706 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.722 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.760 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.760 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (4.568 s elapsed) --------------------\n", + "2022-08-17 18:31:36.760 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.777 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.793 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.810 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.849 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:36.849 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (4.657 s elapsed) --------------------\n", + "2022-08-17 18:31:36.849 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.866 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.881 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:36.899 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:36.937 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", + "2022-08-17 18:31:36.938 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 4.744 s\n", + "2022-08-17 18:31:36.938 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/500 (8.833 us elapsed) --------------------\n", + "2022-08-17 18:31:36.938 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:36.983 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:36.999 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.019 - [NOTICE] callbacks.on_step_start(182): Cycle 1/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.054 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.054 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/500 (116.200 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.055 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.076 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.092 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.112 - [NOTICE] callbacks.on_step_start(182): Cycle 2/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.147 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.147 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/500 (208.914 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.147 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.170 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.187 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.209 - [NOTICE] callbacks.on_step_start(182): Cycle 3/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.244 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.244 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/500 (305.856 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.244 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.267 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.283 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.304 - [NOTICE] callbacks.on_step_start(182): Cycle 4/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.339 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.340 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/500 (401.432 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.340 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.362 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.379 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.400 - [NOTICE] callbacks.on_step_start(182): Cycle 5/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.438 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.438 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/500 (500.057 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.439 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.458 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.474 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.493 - [NOTICE] callbacks.on_step_start(182): Cycle 6/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.531 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.531 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/500 (592.769 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.531 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.551 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.569 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.588 - [NOTICE] callbacks.on_step_start(182): Cycle 7/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.625 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.625 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/500 (686.972 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.625 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.645 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.661 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.680 - [NOTICE] callbacks.on_step_start(182): Cycle 8/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.718 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.719 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/500 (780.639 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.719 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.741 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.757 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.778 - [NOTICE] callbacks.on_step_start(182): Cycle 9/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.817 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:37.817 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/500 (879.076 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.818 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.840 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.856 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.877 - [NOTICE] callbacks.on_step_start(182): Cycle 10/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:37.914 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:37.914 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/500 (975.982 ms elapsed) --------------------\n", + "2022-08-17 18:31:37.915 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:37.936 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:37.955 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:37.975 - [NOTICE] callbacks.on_step_start(182): Cycle 11/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.013 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.013 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/500 (1.075 s elapsed) --------------------\n", + "2022-08-17 18:31:38.014 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.035 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.051 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.069 - [NOTICE] callbacks.on_step_start(182): Cycle 12/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.107 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.107 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/500 (1.169 s elapsed) --------------------\n", + "2022-08-17 18:31:38.108 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.127 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.143 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.160 - [NOTICE] callbacks.on_step_start(182): Cycle 13/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.197 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.198 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/500 (1.260 s elapsed) --------------------\n", + "2022-08-17 18:31:38.198 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.217 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.234 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.251 - [NOTICE] callbacks.on_step_start(182): Cycle 14/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.289 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.289 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/500 (1.351 s elapsed) --------------------\n", + "2022-08-17 18:31:38.290 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.309 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.328 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.346 - [NOTICE] callbacks.on_step_start(182): Cycle 15/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.383 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.383 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/500 (1.445 s elapsed) --------------------\n", + "2022-08-17 18:31:38.384 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.405 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.421 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.441 - [NOTICE] callbacks.on_step_start(182): Cycle 16/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.479 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.480 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/500 (1.542 s elapsed) --------------------\n", + "2022-08-17 18:31:38.480 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.501 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.518 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.537 - [NOTICE] callbacks.on_step_start(182): Cycle 17/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.576 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.577 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/500 (1.638 s elapsed) --------------------\n", + "2022-08-17 18:31:38.577 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.599 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.616 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.638 - [NOTICE] callbacks.on_step_start(182): Cycle 18/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.676 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.676 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/500 (1.738 s elapsed) --------------------\n", + "2022-08-17 18:31:38.677 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.699 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.717 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.735 - [NOTICE] callbacks.on_step_start(182): Cycle 19/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.773 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.774 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/500 (1.835 s elapsed) --------------------\n", + "2022-08-17 18:31:38.774 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.792 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.810 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.828 - [NOTICE] callbacks.on_step_start(182): Cycle 20/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:38.869 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.869 - [NOTICE] callbacks.on_cycle_start(174): Cycle 21/500 (1.931 s elapsed) --------------------\n", + "2022-08-17 18:31:38.870 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.890 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:38.906 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:38.926 - [NOTICE] callbacks.on_step_start(182): Cycle 21/500, step 4/4: Hold at 4.2V until C/50\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:38.967 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.463 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:38.967 - [NOTICE] callbacks.on_cycle_start(174): Cycle 22/500 (2.029 s elapsed) --------------------\n", + "2022-08-17 18:31:38.968 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:38.988 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.006 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.026 - [NOTICE] callbacks.on_step_start(182): Cycle 22/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.075 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.442 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.076 - [NOTICE] callbacks.on_cycle_start(174): Cycle 23/500 (2.138 s elapsed) --------------------\n", + "2022-08-17 18:31:39.077 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.098 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.118 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.139 - [NOTICE] callbacks.on_step_start(182): Cycle 23/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.180 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.422 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.182 - [NOTICE] callbacks.on_cycle_start(174): Cycle 24/500 (2.243 s elapsed) --------------------\n", + "2022-08-17 18:31:39.182 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.203 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.221 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.243 - [NOTICE] callbacks.on_step_start(182): Cycle 24/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.286 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.402 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.286 - [NOTICE] callbacks.on_cycle_start(174): Cycle 25/500 (2.348 s elapsed) --------------------\n", + "2022-08-17 18:31:39.287 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.309 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.326 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.347 - [NOTICE] callbacks.on_step_start(182): Cycle 25/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.384 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.382 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.385 - [NOTICE] callbacks.on_cycle_start(174): Cycle 26/500 (2.447 s elapsed) --------------------\n", + "2022-08-17 18:31:39.385 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.406 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.423 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.443 - [NOTICE] callbacks.on_step_start(182): Cycle 26/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.481 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.362 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.481 - [NOTICE] callbacks.on_cycle_start(174): Cycle 27/500 (2.543 s elapsed) --------------------\n", + "2022-08-17 18:31:39.482 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.503 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.522 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.540 - [NOTICE] callbacks.on_step_start(182): Cycle 27/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.577 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.343 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.577 - [NOTICE] callbacks.on_cycle_start(174): Cycle 28/500 (2.639 s elapsed) --------------------\n", + "2022-08-17 18:31:39.578 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.599 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.616 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.633 - [NOTICE] callbacks.on_step_start(182): Cycle 28/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.671 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.324 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.672 - [NOTICE] callbacks.on_cycle_start(174): Cycle 29/500 (2.734 s elapsed) --------------------\n", + "2022-08-17 18:31:39.672 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.691 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.708 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.726 - [NOTICE] callbacks.on_step_start(182): Cycle 29/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.764 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.305 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.765 - [NOTICE] callbacks.on_cycle_start(174): Cycle 30/500 (2.826 s elapsed) --------------------\n", + "2022-08-17 18:31:39.765 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.786 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.803 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.821 - [NOTICE] callbacks.on_step_start(182): Cycle 30/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.858 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.286 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.858 - [NOTICE] callbacks.on_cycle_start(174): Cycle 31/500 (2.920 s elapsed) --------------------\n", + "2022-08-17 18:31:39.858 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.879 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.896 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:39.916 - [NOTICE] callbacks.on_step_start(182): Cycle 31/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:39.952 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.267 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:39.953 - [NOTICE] callbacks.on_cycle_start(174): Cycle 32/500 (3.014 s elapsed) --------------------\n", + "2022-08-17 18:31:39.953 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:39.972 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:39.989 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.008 - [NOTICE] callbacks.on_step_start(182): Cycle 32/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.046 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.249 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.046 - [NOTICE] callbacks.on_cycle_start(174): Cycle 33/500 (3.108 s elapsed) --------------------\n", + "2022-08-17 18:31:40.047 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.068 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.085 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 3/4: Charge at 1C until 4.2V\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:40.105 - [NOTICE] callbacks.on_step_start(182): Cycle 33/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.142 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.231 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.143 - [NOTICE] callbacks.on_cycle_start(174): Cycle 34/500 (3.205 s elapsed) --------------------\n", + "2022-08-17 18:31:40.143 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.164 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.180 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.201 - [NOTICE] callbacks.on_step_start(182): Cycle 34/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.238 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.213 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.239 - [NOTICE] callbacks.on_cycle_start(174): Cycle 35/500 (3.300 s elapsed) --------------------\n", + "2022-08-17 18:31:40.239 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.259 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.278 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.294 - [NOTICE] callbacks.on_step_start(182): Cycle 35/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.330 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.195 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.331 - [NOTICE] callbacks.on_cycle_start(174): Cycle 36/500 (3.392 s elapsed) --------------------\n", + "2022-08-17 18:31:40.331 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.350 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.366 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.383 - [NOTICE] callbacks.on_step_start(182): Cycle 36/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.419 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.177 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.420 - [NOTICE] callbacks.on_cycle_start(174): Cycle 37/500 (3.482 s elapsed) --------------------\n", + "2022-08-17 18:31:40.420 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.441 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.458 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.474 - [NOTICE] callbacks.on_step_start(182): Cycle 37/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.511 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.160 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.512 - [NOTICE] callbacks.on_cycle_start(174): Cycle 38/500 (3.573 s elapsed) --------------------\n", + "2022-08-17 18:31:40.512 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.530 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.546 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.563 - [NOTICE] callbacks.on_step_start(182): Cycle 38/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.598 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.143 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.599 - [NOTICE] callbacks.on_cycle_start(174): Cycle 39/500 (3.661 s elapsed) --------------------\n", + "2022-08-17 18:31:40.600 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.617 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.635 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.653 - [NOTICE] callbacks.on_step_start(182): Cycle 39/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.688 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.126 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.689 - [NOTICE] callbacks.on_cycle_start(174): Cycle 40/500 (3.751 s elapsed) --------------------\n", + "2022-08-17 18:31:40.689 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.708 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.725 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.743 - [NOTICE] callbacks.on_step_start(182): Cycle 40/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.781 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.109 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.781 - [NOTICE] callbacks.on_cycle_start(174): Cycle 41/500 (3.843 s elapsed) --------------------\n", + "2022-08-17 18:31:40.782 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.800 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.816 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.835 - [NOTICE] callbacks.on_step_start(182): Cycle 41/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.870 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.092 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.871 - [NOTICE] callbacks.on_cycle_start(174): Cycle 42/500 (3.933 s elapsed) --------------------\n", + "2022-08-17 18:31:40.871 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.888 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.905 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:40.923 - [NOTICE] callbacks.on_step_start(182): Cycle 42/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:40.959 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.075 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:40.959 - [NOTICE] callbacks.on_cycle_start(174): Cycle 43/500 (4.021 s elapsed) --------------------\n", + "2022-08-17 18:31:40.959 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:40.978 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:40.996 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.014 - [NOTICE] callbacks.on_step_start(182): Cycle 43/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.050 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.059 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.051 - [NOTICE] callbacks.on_cycle_start(174): Cycle 44/500 (4.113 s elapsed) --------------------\n", + "2022-08-17 18:31:41.051 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.071 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.087 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.105 - [NOTICE] callbacks.on_step_start(182): Cycle 44/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.140 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.042 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.141 - [NOTICE] callbacks.on_cycle_start(174): Cycle 45/500 (4.203 s elapsed) --------------------\n", + "2022-08-17 18:31:41.141 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.160 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 2/4: Rest for 1 hour\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:41.177 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.192 - [NOTICE] callbacks.on_step_start(182): Cycle 45/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.228 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.026 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.228 - [NOTICE] callbacks.on_cycle_start(174): Cycle 46/500 (4.290 s elapsed) --------------------\n", + "2022-08-17 18:31:41.228 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.248 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.264 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.279 - [NOTICE] callbacks.on_step_start(182): Cycle 46/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.317 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.010 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.318 - [NOTICE] callbacks.on_cycle_start(174): Cycle 47/500 (4.380 s elapsed) --------------------\n", + "2022-08-17 18:31:41.318 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.339 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.355 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.370 - [NOTICE] callbacks.on_step_start(182): Cycle 47/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.407 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.994 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.408 - [NOTICE] callbacks.on_cycle_start(174): Cycle 48/500 (4.470 s elapsed) --------------------\n", + "2022-08-17 18:31:41.408 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.425 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.441 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.456 - [NOTICE] callbacks.on_step_start(182): Cycle 48/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.494 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.978 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.495 - [NOTICE] callbacks.on_cycle_start(174): Cycle 49/500 (4.556 s elapsed) --------------------\n", + "2022-08-17 18:31:41.495 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.511 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.527 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.545 - [NOTICE] callbacks.on_step_start(182): Cycle 49/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.582 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 3.962 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:41.583 - [NOTICE] callbacks.on_cycle_start(174): Cycle 50/500 (4.645 s elapsed) --------------------\n", + "2022-08-17 18:31:41.583 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:41.600 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:41.617 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:41.641 - [NOTICE] callbacks.on_step_start(182): Cycle 50/500, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:41.688 - [NOTICE] callbacks.on_cycle_end(201): Stopping experiment since capacity (3.947 Ah) is below stopping capacity (3.952 Ah).\n", + "2022-08-17 18:31:41.690 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 4.750 s\n" + ] + } + ], + "source": [ + "# With integer\n", + "sol_int = sim.solve(save_at_cycles=5)\n", + "# With list\n", + "sol_list = sim.solve(save_at_cycles=[30,45,55])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "severe-yorkshire", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_int.cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "unavailable-fetish", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " ,\n", + " None,\n", + " None,\n", + " None,\n", + " None,\n", + " None]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_list.cycles" + ] + }, + { + "cell_type": "markdown", + "id": "guilty-nylon", + "metadata": {}, + "source": [ + "For the cycles that are saved, you can plot as usual (note off-by-1 indexing)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "architectural-signal", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5816da86d1b94fc29df61094599e93e0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=130.34699999381687, description='t', max=133.15054515610723, min=130.3…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sol_list.cycles[44].plot([\"Current [A]\",\"Terminal voltage [V]\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "played-hundred", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,2,figsize=(10,5))\n", + "for cycle in sol_int.cycles:\n", + " if cycle is not None:\n", + " t = cycle[\"Time [h]\"].data - cycle[\"Time [h]\"].data[0]\n", + " ax[0].plot(t, cycle[\"Current [A]\"].data)\n", + " ax[0].set_xlabel(\"Time [h]\")\n", + " ax[0].set_title(\"Current [A]\")\n", + " ax[1].plot(t, cycle[\"Terminal voltage [V]\"].data)\n", + " ax[1].set_xlabel(\"Time [h]\")\n", + " ax[1].set_title(\"Terminal voltage [V]\")" + ] + }, + { + "cell_type": "markdown", + "id": "considered-rescue", + "metadata": {}, + "source": [ + "All summary variables are always available for every cycle, since these are much less memory-intensive" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "multiple-culture", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAAI4CAYAAACcFxlBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAD060lEQVR4nOzdd3yV5fnH8c+VEPaGsDIIYe8VhogsJ4ji3tZVKY6qtdbRX62t1lbrqFon7r0X7s1QZtggssJIwgYZgsxcvz/OoU0xQCAnec45+b5fr/PKefb1KNw8uZ77vm5zd0REREREREREollC0AGIiIiIiIiIiByMEhgiIiIiIiIiEvWUwBARERERERGRqKcEhoiIiIiIiIhEPSUwRERERERERCTqVQg6gGhWv359z8jICDoMEYlxU6dOXefuyUHHEcvUHotIpKhNLhm1xyISKYfTHiuBcQAZGRlkZ2cHHYaIxDgzWxZ0DLFO7bGIRIra5JJReywikXI47bGGkIiIiIiIiIhI1FMPDBERKZKZzSrGbmvd/ej9HJ8GvAA0AgqAke7+oJnVBV4HMoClwFnu/mNEghYRERGRuKUEhoiI7E8iMOQA2w0YdYDtu4Hfu/s0M6sBTDWzL4CLga/c/S4zuxm4GbgpQjGLiIiISJxSAkNERPbnN+5+wLGJZnbl/ra5+0pgZfj7FjObB6QAw4AB4d2eB0ajBIaIiIiIHIQSGAewcdtO3B0zCzoUEZEy5+7f7rvOzJoDVd199v72KYqZZQBdgUlAw3ByA3dfaWYN9nPMcGA4QHp6+uHcgogIAD/t2M2nc1bx3vT8oEMpNjPbfLBdgJXu3qos4hERiQR3Z9ryjYfdHiuBcQC5P/7MJc9N4c5TO5JSu0rQ4YiIBMrM/gh0BArMrMDdLyzmcdWBt4Hr3H1zcZPC7j4SGAmQlZXlhxe1iJRXu/cUMG7ROt6dls/n369i+64C0urG1PPcYnfveqAdzGx6WQUjIlISS9dt5d3p+bw3I59l67dRqcLhzSeiBMYBNKlVmclLNnDc/WO4eUhbzu+ZTkKCemOISPlgZr8FHnX3PeFVnd397PC24hT4xMySCCUvXnb3d8KrV5tZ43Dvi8bAmkjHLiLlk7szd8Vm3p2ez/szVrDupx3UqpLE6d1SObVrCt2b1iEhdgasnV7SfczsGWAosMbdOxSx3YAHCdU72gZc7O7TDiNWEZFf2LhtJx/MWsk70/KYvnwjZtCneT2uHtiCEzo0ouadh35OJTAOoF71Srx7XT9ueWc2t743hw9mruDu0zvRrH61oEMTESkLPwKfmtlD7v4B8LmZjSE0BfdnBzs4/GD8NDDP3e8vtGkUcBFwV/jn+xGPXETKlVWbtvPejHzenZbP/NVbSEo0BrVpwKldUxnYJplKFRKDDvGQuXtOBPZ5DniY0IxQRRkMtAx/egGPhX+KiByWHbv38M0Pa3l3eh5f/7CGXXuc1g1rcPPgNgzr0oTGtUrWE04JjINIq1uVFy/ryZvZedzx0fec8MBYrj2mJZcflUlS4uF1exERiQXu/pKZvQX8wcx+DfwZeBVIcvdNxTjFkcCFwGwzmxFe90dCiYs3zOwyYDlwZsSDF5G4t23nbj6bu4p3puXz7aJ1uEP3pnX42ykdGNqpMbWrVgw6xIgws9OAu4EGhOpeGODuXvNgx7r72HANov0ZBrzg7g5MNLPae3vIRSB0ESkn3J0ZuRt5Z1o+H8xawcZtu6hfvRIXHZHBqd1SaNe4ZsTqSiqBUQxmxlk90ujfOpnb3p/LPz+dzwczV3LXaR3pnFY76PBEREpTc+B14EngDsAJJTIOmsAIF/jc379WR0cqQBEpPwoKnIlL1vP21Hw+mbOSbTv3kFa3CtcMasmpXVPIiM9esv8ETnL3eaVw7hQgt9ByXnjd/yQwVFRZRIqSv/Fn3puez9vT8shZu5VKFRI4rn0jTu+WQt8W9alQCi/8lcA4BA1rVubxC7vz2dxV/Pn9OZz66HdccmQzfn9cK6pW1H9KEYkvZvYcoX8nqhAqJne5mXUFnjSzye5+R6ABiki5kbP2J96else70/JZsWk7NSpV4OTOTTitWyo9MurE+4xxq0speQFFJ5l/UTRZRZVFZK+tO3bzyZxVvD01j4lL1uMOPZvVZUS/5gzu2IgalZNK9fr6rfswHN++EUc0r8c/P/2Bp79dwqdzVnHnqR0Y0LrImQBFRGJVV3fvDP+tdO/u04GTzGxYoJGJSNzbtG0XH8xawdvh4m8JBke1TObmIW05rl1DKifFXl2LQxEeOgKQbWavA+8BO/ZuL1QYuSTygLRCy6nAigicV0TiSEGBMzFnPW9Ny+PTOavYtnMPTetV5bqjW3FatxTS6lYts1iUwDhMNSsn8bdTOjKsSwo3vz2Li5+dwtBOjfnzSe1oUKNy0OGJiETCp+GinRWBVwpvcHcV3hSRiNu9p4BxC9fx1tQ8vpi3mp27C2jdsAZ/HNKGU7qk0KBmuXrGOqnQ923AcYWWHYhEAmMUcLWZvUaoeOcm1b8Qkb2WrNvK21PzeHd6Pvkbf6ZGpQoM69KE07ul0r1pML3flMAooR4Zdfn42qN4YkwOD3+9iDEL1nLz4Dac20NTropIbHP3m8ysJlDg7j8FHY+IxK8Fq7fw9tQ83pmez9otO6hTNYnzeqZzRvdU2jeJXPG3WOLul5T0HGb2KjAAqG9mecBtQFL4/I8DHxOaQnURoSRJia8pIrFty/ZdfDRrJW9NzSN72Y8kGPRtmcxNg9tERe83JTAioFKFRK45uiVDOzXm/96dw/+9O4d3puXz91M70rpRjaDDExE5LGY21N0/LOk+IiJF2bRtF6Nm5vPW1Dxm5m2iQoIxsE0DzuieysDWDahYQbO97U9x2153P/cg2x24KmKBiUhMKihwJuSs562peXwyZyXbdxXQPLkaN53QhlO7ptCoVvT0flMCI4Iyk6vzyuW9eHtaPnd+9D0nPjSOy/tlcs2gllSpGN/jNEUkLt1jZvnsfyYRgL8DSmCISLHsKXDGLVzLm1Pz+GLuanbuKaBNoxrcOrQdw7o0oX71SkGHGCt6oLZXREpo+fptvDU1l7enhYeIVK7A6d1SOaN7Kl3Sakdl7zclMCLMzDijeyqD2jTg7x/P47HRi/lg5gr+enJ7jm7bMOjwREQOxWrg/oPss7AsAhGR2Jaz9ifemprHO9PyWbV5O7WrJnFer9AQkQ4ptYIOLxY9GnQAIhKb9s4i8mZ2LpOWbMDCBZKjZYjIwSiBUUrqVqvIvWd25szuqfzpvTlc9nw2x7dvyG0ntadJ7SpBhyciclDuPiDoGEQkdm3dsZuPZq/kzexcpiwNjaMe0LoBt53UjkFtG1CpQnQ/JEcbM6sFnA6cB7QFUoKNSERihbszbfmPvDEljw9nrWDrzj1k1KvKH45vzWndUmhcK3Z+P1UCo5T1yqzHR9ccxVPf5vDQVws55v4x/O6YVlx8ZAZJiRrbKSIiIvHD3cle9iNvZufy4ayVbNu5h8zkatw8uA2ndS13s4iUmJlVAU4mlLToBtQATgHGBhiWiMSINZu38870fN7IziVn7VaqVkzkxI6NOTMrjR4ZwcwiUlJKYJSBihUSuHJAC07q1ITbRs3lzo/n8dbUPG4f1p5emfWCDk9ERESkRNZs3s7b0/J5MzuXnHVbqVYxkZM7N+HMrFS6pcfmQ3LQzOxloB/wOfAw8DWwyN1HBxmXiES3XXsK+OaHNbyRncs389eyp8DpkVGHEf2bc2LHxlSrFNspgNiOvhAzSwSygXx3H7rPtlrAS0A6oXu+192fLesY0+pW5emLsvji+9X89YPvOXvkRE7rmsItQ9qSXENFq0RERCR2FPWQ3DOjLlcMaM6JnRpTtWLcPGYGpQPwIzAP+MHd95iZBxyTiESpRWt+4o3sXN6Zlse6n3bSoEYlhvfL5MzuqWQmVw86vIiJp39ZriXUwNcsYttVwPfufpKZJQPzzexld99ZphESKvJ5XPtGHNUymYe/WcjIsTl8MW81NxzXmgt6NyUxQW8oRCS6mFk28Czwirv/GHQ8IhKsnLU/8Xp2Lm9PzWfdTzvi9iE5aO7e2czaEBo+8qWZrQFqmFkjd18VcHgiEgX21hp6fUouU5f9SIUEY1CbBpzdI43+rZKpEIclC+IigWFmqcCJwJ3A9UXs4oQafAOqAxuA3WUX4S9VqZjIH45vw2ndUrnt/bncNmour0/J5fZh7cnKqBtkaCIi+zoHuASYUiiZ8bm7602gSDmxbeduPp69ijem5DJ56QYS9z4kZ6UxoHV8PiRHA3f/Afgz8GczywLOBSabWZ679wk2OhEJgrszI3cjr0/J5YOZoYKcmcnVuGVw6HfLeO/ZHxcJDOAB4EZChY2K8jAwClgR3udsdy8oakczGw4MB0hPT494oPtqnlydFy/rycezV/G3j77njMcncFq3FG4e3IYGNVToSkSC5+6LgP8zs1uBocAzQIGZPQM86O4bAg1QRErN7LxNvDZlOaNmrGDLjt00q1+Nm05ow+ndU/ScUsbcPRvINrMbCNXGEJFy5MetO3l3ej6vT8ll/uotVElK5MROjTmnRxrdm5afWkMxn8Aws6HAGnefamYD9rPb8cAMYBDQHPjCzMa5++Z9d3T3kcBIgKysrDJ5u2hmnNipMQPbJPPw14t4clwOn89dzXXHtOSiPpqtRESCZ2adCPXCGAK8DbwM9CVUVK5LcJGJSKRt+nkXo2bk89qUXOau2EylCgmc2LExZ/dIo2ezuuXmITloZjY8/Fz6P8K938YcaB8RiQ8FBc7EnPW8NiWXT+esYueeAjqn1uLvp3bkpM6NqVE5KegQy1zMJzCAI4GTzWwIUBmoaWYvufsFhfa5BLgr3OAvMrMlQBtgctmHu39VK1bgxhPacEb3VP76wff87aN5vJGdy19Oak+fFvWDDk9EyikzmwpsBJ4Gbnb3HeFNk8zsyMACE5GI2Tv96auTl/Px7JVs31VAu8Y1uWNYe07ukkKtKuXvITkK3Gxm6w6w3QjVgFMCQyTOrNmynTez83gjO5dl67dRs3IFzuuVztk90mjbuKiSj+VHzCcw3P0W4BaAcA+MG/ZJXgAsB44GxplZQ6A1kFOGYR6SzOTqPHdJD774fjW3f/g95z01icEdGvHHIW1Jq1s16PBEpBwxswTgbXf/e1Hb3f20Mg5JRCLox607eXtaHq9NyWXRmp+oXqkCp3VL5dwe6XRIqaneFsEaA5x0kH2+KItARKT07Slwxi5cy2uTl/PVvDXsLnB6NavL745pxQkdGlE5KTHoEKNCzCcw9sfMRgC4++PAHcBzZjabULb6Jnc/UEY7cHtnK+nXKpknx+bwyOhFfP3DGkb0b86I/s2pUlF/gEWk9Ll7gZmdABSZwBCR2OPuTMzZwKuTl/+nS3LX9Nr88/RODO2s6U+jhbtfEnQMIlL6Vm76mTemhHpb5G/8mXrVKnJZ32ac3SNNMzsVIa7+hXL30cDo8PfHC61fARwXTFQlUzkpkd8e3ZLTu6fyj09+4MGvFvLW1Dz+OKQtQzo20psRESkLX4SLxr0ObN27UsU7RWLLhq07eWtqLq9OzmXJuq3/6ZJ8Ts802jQq312SRUTK0p4CZ8yCNbwyKZevf1hNgcNRLevzxyFtObZdQypWUA3E/YmrBEY8a1K7Cv8+tysX9ErntlFzueqVafRsVpfbTmpH+ya1gg5PROLbpeGfVxVa50BmALGIyCHY29vilcnL+Szc2yKraR2uHtiCEzs1VpdkEZEytGrTdl6fksvrU5azYtN26levyG/6N+fcHumk11OpgOJQAiPG9Mqsx0fXHMVrU5Zz3+cLGPrvbzmnRxq/P6419avH95y/IhIMd28WdAwicmj21rZ4ZdJycgr1tji3ZzqtG+1v1nkREYm0gnBti5cnLefrH9awp8A5qmV9bh3ajqPbqrfFoVICIwYlJhjn92rK0E5NeOirhTw/fikfzlzJNUeHpl3VXwIRiSQzSwKuAPqFV40GnnD3XYEFJSK/4O5MXfYjL09azkezV7JzdwHdm9bhPvW2iElmdv2Btrv7/WUVi4gcur0zibw6eTl5P/5M/eoVGd4vU70tSkgJjBhWq0oStw5tx7k907nzo++58+N5vDxp2X/GTqk+hohEyGNAEvBoePnC8LpfBxaRiPzH5u27eG96Pi9PXM781VuoUakC5/RI47xe6aptEdtK3FUmXIT5QSAReMrd79pney3gJSCd0O8F97r7syW9rkh55e5MWLyelyct57O5q9hd4PRpXo+bB7fhuHaN9KI5ApTAiAMtGlTn2Ut68s38Ndz50TyGvziVIzLr8aehbVUfQ0QioYe7dy60/LWZzQwsGhEBYE7+Jl6auIz3Z6zg51176JRai7tP78hJnZtoJpE44O5/LcnxZpYIPAIcC+QBU8xslLt/X2i3q4Dv3f0kM0sG5pvZy+6+syTXFilvNm7byVtT/ztsr3bVJC7uk8F5vdI1k0iE6V+3ODKwdQP6tqjPq5OX868vQvUxzuqexu+Pb0WDGpWDDk9EYtceM2vu7osBzCwT2BNwTCLl0s879/DBrBW8PHEZM/M2UTkpgWGdUzi/dzqdUmsHHZ5EkJm94e5nhb/f7e43Fdr2ubsfbIa9nsAid88JH/MaMAwonMBwoIaFuu1WBzYAuyN4GyJxy92ZkbuRlyYu58NZK9gRHrZ3/6AWDOmoYXulRQmMOJOUmMCvjshgWOcUHvo6XB9j1gquGNCcXx+Vqb9IInI4/gB8Y2Y5gAFN+e/MJPtlZs8AQ4E17t4hvO4vwOXA2vBuf3T3j0sjaJF4krP2J16etJw3s3PZvH03LRpU5y8ntePUbqnUqpIUdHhSOloW+n4scFOh5eRiHJ8C5BZazgN67bPPw8AoYAWhIStnu3vBvicys+HAcID09PRiXFokfm3buZtRM1bw0qRlzMnfTLWKiZyZlcp5PZvSromG7ZU2JTDiVK2qofoY5/dK565PfuDezxfw8qTl/OH41pzSJYWEBNXHEJFi+5bQg3RrQgmMH4p53HOEHo5f2Gf9v9z93ohFJxKndu8p4Mt5a3hp4jK+XbSOCgnGCR0acWHvpvRsVle1ruKfH+a2vYr6A7LvcccDM4BBQHPgCzMb5+6b/+cg95HASICsrKziXFsk7ixa8xMvTVzG29Py2LJ9N20a1eCOUzpwatcUqlfSr9VlJSr+S5tZ3WLsVuDuG0s7lniTmVydkb/KYmLOeu78aB7XvzGTZ79byp9ObEuvzHpBhycisWGCu3cDZu1dYWbTgG4HOsjdx5pZRinHJhJ31mzZzmuTc3ll0nJWbd5Ok1qVueG4VpzVI01DQsuXqmbWFUgAqoS/W/hTpRjH5wFphZZTCfW0KOwS4C53d2CRmS0B2gCTSxq8SDwIJZJX88KEZYxfvJ6kRGNIx8Zc0LspWU3rKJEcgKhIYBBqTFdQdKZ4r0RCFZLlMPTOrMf7Vx3J+zPzuefT+Zw9ciLHtmvIzYPb0FyFZUSkCGbWiFAX5MIPzgA1gZLM/3W1mf0KyAZ+7+4/7uf66rIs5Ya7M2Xpj7wwYSmfzglVrj+qZX1uH9aeQW0aUCFRlevLoVXA/UV837t8MFOAlmbWDMgHzgHO22ef5cDRwDgza0iop11OSYIWiQdrNm/ntSn/TSSn1K7CH45vzdk90qhfvVLQ4ZVr0ZLAmOfuXQ+0g5lNL6tg4lVCgnFq11QGd2jM098u4bHRiznuX2M5t2ca1x7diuQa+ssoIv/jeOBiQm/tCj84bwH+eJjnfAy4g1A35juA+9hPPQ11WZbyYOuO3bw3I58XJyzjh1VbqFm5Ahf1yeCC3k1pVr9a0OFJgNx9QAmP321mVwOfEXoR+Iy7zzWzEeHtjxNqh58zs9mEktQ3ufu6kkUuEpvcnexlP/L8+P9NJN9xSgcGtWlAoobgR4VoSWAcEaF9pBgqJyVy1cAWnN0jjYe+Wsgrk5bz7rR8RvQPFfqsUlGFPkUE3P154HkzO93d347QOVfv/W5mTwIfRuK8IrEmZ+1PvDhxGW9l57Flx27aN6nJ3ad35OTOKfp3WAAwsx5ArruvCi//CjgdWAb8xd03HOwc4SLJH++z7vFC31cAB5vNRCSubdu5m/dnrOD58UuVSI4BUZHAcPfte7+H56xuSKHY3H154X0kMupXr8TtwzpwcZ8M7v70B+77YgEvTVrG745pxRndU9VdVUT2+tDMzgMy+N+2+fZDPZGZNXb3leHFU4E5EYlQJAbsKXC++WENz09YyriF6/4zlvpXR2TQLb22xlLLvp4AjgEws37AXcBvgS6EeqedEVhkInFg2fqtvDhhGW+EZ3dq06gG/zitI8O6NKFqxaj4NVmKEFX/Z8zst8BtwGpg7xRODnQKLKhyIDO5Ok9cmEX20g3c+fE8bn5nNk9/u4QbT2jDMW0b6IFKRN4HNgFTgR3FPcjMXgUGAPXNLI9Q+z7AzLoQatuXAr+JcKwiUWfTtl28kZ3LCxOXkrvhZxrWrMT1x7binJ4qyikHlFiol8XZwMhwb7i3zWxGcGGJxK6CAmfswrW8MGEZ38xfQ6KFZne6qE+GinLGiKhKYADXAq3dfX3QgZRHWRl1eeeKPnw2dxX//HQ+l7+QTY+MOtwypC3d0usEHZ6IBCfV3U841IPc/dwiVj8dgXhEYsIPqzbz/PilvDs9n+27CuiZUZebT2jLce0bkqRejnJwiWZWwd13Eyq0ObzQtmh7hheJalu27+KtqXm8MGEZS9ZtpX71Svx2UEvO75VOw5pKJMeSaGv8cgm95ZOAmBkndGjM0W0b8vqUXB74ciGnPTqeE9o34objW9OigWYsESmHxptZR3efHXQgItFuT4HzxfereW78EibmbKBShQRO6ZLCRX0yaNekZtDhSWx5FRhjZuuAn4FxAGbWAj0vixTL4rU/8cL4pbw1NY+tO/fQNb02D5zdhSEdG1OxghLJsSgqEhhmdn34aw4w2sw+olA3ZXe/v8gDpdQkJSZwQe+mnNo1hafGLWHk2MV8MW81Z3ZP5bpjWtGoljKVIuVIX+BiM1tCqG02wN1dw/tEwjZu28nrU3J5YcIy8jf+TErtKtw8uA3n9EijdtWKQYcnMcjd7zSzr4DGwOfuvnc2pgRCtTBEpAgFBc6YhWt57ruljFmwloqJCQzt3JiLjsigc1rtoMOTEoqKBAZQI/xzefhTMfyRgFWrVIFrj2nJBb3TefibRbw0cRnvTs/n4iMzuLJ/C2pVTQo6RBEpfYODDkAkWi1YvYVnv1vKu9Pz2L6rgN6Zdbl1aDuOadtAxbClxNx9YhHrFgQRi0i0+2nHbt7KzuX58DCRBjVC9YbO7ZlOco1KQYcnERIVCQx3/2tJzxGevSQbyHf3oUVsHwA8ACQB69y9f0mvWZ7Uq16J205qz6VHNuNfXyxg5NgcXp20nBEDmnNJn2aa8k0kjrn7MjPrC7R092fNLBnQeDIptwoKnG/mr+HZ75by7aJ1VKqQwKldQ8NE2jbWMBERkbK0fP02nhu/lDezc9myYzdd02vz0LldOaF9Iw0TiUNRkcA4EDMb7u4ji7HrtcA84BdPDmZWG3gUOMHdl5tZg8hGWX6k1a3K/Wd34fJ+mdzz2Xz++el8nv1uKdcMasHZPdLVSIjEITO7DcgCWgPPEkoEvwQcGWRcImXtpx27eTM7l+fHL2Xp+m00qlmZPxzfmnN7plO3mjqOioiUFXdnQs56nv1uKV/OW02iGSd2aswlRzaji4aJxLWoT2AQGmt94B3MUoETgTuB64vY5TzgHXdfDuDuayIaYTnUtnFNnrm4B9lLN/DPT+dz6/tzGTkuh98d04phXVJITNAURCJx5FSgKzANwN1XmFmNAx8iEj9yN4Te7r0xJfR2r1t6bX5/XGtO6NBIs4lImTCzhkCP8OJkPctKebV91x5GzVzBM98u4YdVW6hbrSJXDWjBhUc01Wwi5UQsJDCmFWOfB4Ab+W8tjX21ApLMbHR4nwfd/YWidjSz4YSnqUpPTz/UWMudrIy6vP6b3oxesJZ7Pp3P9W/M5IkxOVx/XCuOa9dQcymLxIed7u5m5gBmVi3ogERKm7szZemPPPPtEj7/fhUJZgzp2JhLjsygq6YWlzJkZmcB9wCjCb3Y+7eZ/cHd3wo0MJEytHbLDl6auIyXJy1j3U87adOoBnef3pFhXVKonKSh7OVJVCYwzKwdcA5wLqFporIOsO9QYI27Tw3XuShKBaA7oTm0qwATzGxiUUWQwsNVRgJkZWX5vtvll8yMga0b0L9lMh/PWcn9ny/gNy9OpXNqLX5/XGuOallfiQyR2PaGmT0B1Dazy4FLgScDjkmkVOzcXcBHs1fw9LdLmJO/mdpVkxjRvzkXHtGUxrWqBB2elE//B/TY2+siXIfoS0AJDIl781Zu5ulvlzBqxgp27ing6DYNuLRvM/o0r6ffL8qpqElgmFlTQgmLc4HdQFMgy92XHuTQI4GTzWwIUBmoaWYvufsFhfbJI1S4cyuw1czGAp0BVXGOoIQEY2inJpzQvhHvTMvnwa8W8qtnJtOzWV3+cHxremTUDTpEETkM7n6vmR0LbCZUB+PP7v5FwGGJRNTGbTt5edJyXpiwlNWbd9A8uRp/P7Ujp3ZNUaFqCVrCPkNG1hOaSlUkLhUUOKMXrOGpcUsYv3g9VZISOadnGhf3ySAzWTXEy7uoSGCY2XigFvAacIa7LzSzJcVIXuDutwC3hM8zALhhn+QFwPvAw2ZWgdD0rL2Af0XsBuR/VEhM4KweaQzr2oTXJufy768XcebjE+jfKpnfH9eKTqm1gw5RRA6Bmf0OeFNJC4lHOWt/4tnvlvLW1Dx+3rWHo1rW5+7TO9GvZTIJquck0eFTM/sMeDW8fDbwSYDxiJSKn3fu4e1peTzz3RJy1m6lUc3K3Dy4Def2SKdW1aSgw5MoERUJDGAtkAo0BJKBhUCJhm+Y2QgAd3/c3eeZ2afALKAAeMrd55QsZDmYShUSuahPBmdmpfL8+GU8MXYxJz/8Hce2a8j1x7bSVHMisaMm8JmZbSCUaH7L3VcHHJPIYXN3Ji/ZwJPjlvDVD6tJSkjglK5NuLRvM9o00r9NEl3c/Q9mdhrQl1ANjJHu/m7AYYlEzJot23lxwjJemriMH7ftolNqLR48pwtDOjZWoWT5BXOPjjIPZlYLOJ3QEJIWQG3geHefHFRMWVlZnp2dHdTl486W7bt45tulPDUuhy07dnNip8b87piWtGigyQwkvpnZVHffby2fWGFmnQi9+TsdyHP3Y8rq2mqPJRJ27Sng49krefrbJczK20Sdqklc2LspFx6RQXKNSkGHJ2Uk1tpkM7vb3W862LqyovZYImX+qi08NS6H92esYFdBAce0bciv+zajZ7O6qm9RThxOexwtPTBw903AM8AzZtaA0EPyA2aW5u5pwUYnkVCjchLXHtOSi/o05clxOTz73VI+mb2SYV1SuOboljSrr4kNRKLcGmAVofHXDQKORaTYtmzfxetTcnn2u6Xkb/yZzPrVuPPUDpzWNVX1LSQWHAvsm6wYXMQ6kajn7oxfvJ6RY3MYs2AtlZMSOLtHGpf2babfBaRYoiaBUVi4UNG/CU0T1TToeCSyaletyB+Ob8OlRzbj8TGLeXHiMkbNXMGpXVO4ZlBL0utVDTpEESnEzK4glFROJlT1/nJ3/z7YqEQObtWm7Tz73RJembScLTt207NZXf56cnsGtWmg+hYS9cJt75VAppnNKrSpBvBdMFGJHJ5dewr4aNZKRo7N4fuVm6lfvRI3HNeK83s1pU61ikGHJzEkKhIYZvYXd/9LUdvcfdnB9pHYVK96Jf7vxHZc3i+TJ8bk8NLEZbw7PZ8zuqVy9aAWpNVVIkMkSjQFrnP3GUEHIlIc81Zu5slxOYyasYICd4Z0bMzlR2XSOa120KGJHIpXCBXr/Adwc6H1W9x9Q3FOYGYnAA8CiYRqwN1VxD4DgAeAJEKz9vUvUdQihWzZvovXJufyzHdLWLlpOy0aVOfu0zsyrEsKlZPUA04OXVQkMIBfm9nmA2w34BzgL2UTjpSlBjUqc+vQdgzvl8ljoxfzyqTlvD0tjzOzUrlygBIZIkFz95vNLNHMmlDo3w13Xx5gWCL/w92ZsHg9j4/NYeyCtVStmMgFvZtyWd9m+ndEYlJ4ePUmQvXhDpmZJQKPEBqCkgdMMbNRhXvQmVlt4FHgBHdfHh7GLVJiqzdv55nvlvDKxFAPuN6Zdbnz1A4MaKUecFIy0ZLAeJJQd7iD7SNxrGHNyvzl5Pb8pn8okfHa5FzezFYiQyRoZnY1oQTyakIzOUFopqhOQcUkstfuPQV8MmcVT4xdzJz8/3ZLvqB3U2pXVbdkKdd6AovcPQfAzF4DhgGFhwCeB7yzNyEdHsYtctgWrt7CyLE5vDcjnz0FzuCOjRmuHnASQVGRwHD3vwYdg0SPxrWqcPuwDlwxoLkSGSLR4TqgtbuvDzoQkb1+3rmHN7JzeXJcDnk/hgpz/uO0jpzaVd2SRcJSgNxCy3lAr332aQUkmdloQi8TH3T3F/Y9kZkNB4YDpKenl0qwEtumLN3AE2MW8+W8NVROSuDcnun8um+mattJxEVFAkOkKPtLZJzeLZWrBrZQgyhSdnIJdWMWCdyPW3fy/ISlPD9+KT9u20X3pnX489B2HNO2obolS1wK94J72d1/PNRDi1jn+yxXALoDRwNVgAlmNtHdF/zPQe4jgZEQmkb1EOOQOFVQ4Hw5bzVPjM1h6rIfqVutIr87phUXHtGUuirMKaVECQyJeoUTGY+PXsyrU3J5a1oep3ZN4aqBLTTlkkjpywFGm9lHwI69K939/uBCkvIm78dtPDVuCa9PyeXnXXs4pm0DRvRvTlZG3aBDEyltjQjVr5gGPAN85u7FSSLkAWmFllOBFUXss87dtwJbzWws0BlYgMh+7NxdwHsz8hk5NodFa34itU4Vbh/WnjO7p2lqail1UZXAMLO6xa2qLOVP41pV+OuwDlw5sAVPjMnh5UnLeGdaHqd0SeHKgS1o0aB60CGKxKvl4U/F8EekzMxftYUnxizm/ZkrMGBYlxR+0z+TVg0PVjpLJD64+5/M7FbgOOAS4GEzewN42t0XH+DQKUBLM2sG5BMqiH/ePvu8Hz5fBULtey/gX5G+B4kPP+3YzWuTl/PUuCWs2rydto1r8uA5XTixY2MqJCYEHZ6UE1GVwAAmmdkM4Fngk2Jml6WcaVizMn8+qR0jBmTy5NgcXpq4nHdn5HNix8ZcPagFbRrVDDpEkbiiOkUShKnLfuSx0Yv4ct4aqlZM5KIjMvj1Uc1oUrtK0KGJlDl3dzNbBawCdgN1gLfM7At3v3E/x+wODz/5jNA0qs+4+1wzGxHe/ri7zzOzT4FZhIo0P+Xuc8riniR2rP9pB8+PX8rzE5ax6eddHJFZj7vP6ES/lvUx09A9KVsWTTkCC/0NOAa4lFDl5NeB5/Ydh1dWsrKyPDs7O4hLyyFY/9MOnvp2CS+MX8rWnXs4rl1DfjuoJR1TawUdmggAZjbV3bOCjuNQmdkD7n6dmX3AL8dN4+4nl1Usao/LB3dn9IK1PDZ6MZOXbKBO1SQu7tOMXx3RlDoaTy0REmttspldA1wErAOeAt5z911mlgAsdPfmZRmP2uPyI3/jzzw5NofXpixn+64Cjm/fkBH9m9M1vU7QoUmcOJz2OKp6YIR7XHwBfGFmA4GXgCvNbCZws7tPCDRAiUr1qlfiphPa8Jt+mTzz3VKe/W4Jn3+/moGtk7l6UAu6N9X4aJHD9GL4572BRiFxb0+B8+mcVTzyzSK+X7mZxrUq8+eh7TinZxpVK0bVo4pIEOoDp7n7ssIr3b3AzIYGFJPEsUVrfuLxMYt5b3o+AKd0TWFE/0xaNNDQPQleVD0VmFk94ALgQmA18FtgFNAFeBNoFlhwEvVqV63I9ce24tdHNePFCct4alwOpz82gSMy63H1oBb0aV5P3dxEDoG7Tw3/HBN0LBKfdu4u4L3p+Tw+ZjE567aSmVyNe87oxLAuKVSsoPHUImHN9k1emNmL7n6hu88LKiiJP3PyN/Ho6EV8MmcVlSokcEHvplzeL5MUDd2TKBJVCQxgAqE3fqe4e16h9dlm9nhAMUmMqVk5iasGtuCSIzN4ZdJyRo7N4fynJtE1vTZXD2zBoDYNlMgQKQNm9gwwFFjj7h3C6+oSGh6YASwFzjqMqQElxv28cw+vTQm1zys3bad9k5o8en43jm/fiERNhSqyr/aFF8wskdDUpyIRMXnJBh75ZhFjFqylRuUKXDUg9Bxdr3qloEMT+YVoS2D8yd3fKLzCzM509zfd/e6ggpLYVLViBX59VCYX9G7KW1PzeGz0Yi57Pps2jWpw1cAWDOnYWA/KIqXrOeBh4IVC624GvnL3u8zs5vDyTQHEJgHYsn0XL05cxtPjlrB+6056ZtTlrtNVCE6kKGZ2C/BHoIqZbd67GtgJjAwsMIkL7s64het4+JtFTF6ygXrVKnLjCa25oHdTalZOCjo8kf2KtiKe09y928HWlRUVKYovu/YU8P6MFTw2ehGL124lo15VRvRvzqndUqhUQXNWS+mJtYJxkWRmGcCHhXpgzAcGuPtKM2sMjHb31gc7j9rj2Pbj1p08O34pz323hM3bd9OvVTJXD2xBz2aqUSRlL9baZDP7h7vfEnQce6k9jm0FBc4X81bzyDeLmJW3ica1KjO8Xybn9EinSkU9D0vZitkinmY2GBgCpJjZQ4U21SQ0VZRIiSUlJnBG91RO65rC59+v4pFvFnPzO7N54MuFXN4vk3NVLE6kSGaWBfwf0JTQvxtGqO5yp8M4XUN3X0noBCvNrMEBrjscGA6Qnp5+GJeSoK3dsoOnvs3hpQnL2LpzD8e3b8hVA1vQKbV20KGJRD0za+PuPwBvmtkvXua5+7QAwpIYtafA+Xj2Sh75ZhE/rNpC03pVueu0jpzWLVU1hySmRMtvayuAbOBkYGqh9VuA3xXnBOHxgNlAvrsXWZHZzHoAE4Gz3f2tEkUsMSshwTihQ2OOb9+IcQvX8cg3i7jjw+/599cLubhPBhcdkaHp+kT+18vAH4DZQEFZXdTdRxLuJp2VlRU93QXloFZt2s4TYxfz6uTl7NxdwNBOTbhqYAtaN1IFe5FDcD2hJO59RWxzYFDZhiOxaHe4B/IjoxeRs3YrLRtU54GzuzC0U2MqJCpxIbEnKhIY7j4TmGlmL7v74fa4uBaYR6jXxi+EExx3A58d5vklzpgZ/Vol069VMlOXbeCx0Yt54MuFjBybw7k90/n1Uc1oXEtVl0WAte4+KkLnWm1mjQsNIVkTofNKFMj7cRuPj1nMG1Py2OPOqV1TuHJAczKTqwcdmkjMcffh4Z8Dg45FYs/O3QW8My2PR0cvZvmGbbRtHCqWfEL7RiSoBpzEsKhIYJjZG+5+FjDdzH7xlu1g3ZTNLBU4EbiTULa6KL8F3gZ6lDBciUPdm9blqYvqMn/VFh4fs5jnxi/lhQlLOaVLCr/RvNcit5nZU8BXwI69K939ncM41yjgIuCu8M/3IxKhBGr5+m08OnoRb03NwwzOzErjiv7NSatbNejQRGKemV0FvOzuG8PLdYBz3f3RQAOTqLRj9x7ezA4Vr8/f+DOdU2vx56FZHN1Ws/BJfIiKBAah3hMQmm7vcDwA3AgU+VummaUApxLqanfABIbGXJdvrRvV4F9nd+H6Y1vx5LgcXp+Sy5tT8zi2XUNG9G9O96Z1gg5RJAiXAG2AJP47hMSBAyYwzOxVYABQ38zygNsIJS7eMLPLgOXAmaUUs5SBpeu28sg3i3hnej6JCcb5vdIZMaC5eq+JRNbl7v7I3gV3/9HMLgeUwJD/2L5rD69PyeWx0YtZtXk73dJrc+epHejfKlmJC4krUZHA2FvQDUgAVrr7dgAzqwI0PNCxZjYUWOPuU81swH52ewC4yd33HOwvsMZcC0Ba3arcPqwD1x7dkufHL+X5Ccv44vvV9Myoy4gBmQxsrSy2lCud3b3joR7k7ufuZ9PRJYxHApaz9ice/noR783IJykxgV8d0ZQR/ZvTsGbloEMTiUcJZmYenjowPCxaxboECCUuXpm0nMfHLGbNlh30yKjDvWd25sgW9fSsKnEpKhIYhbwJ9Cm0vCe87kC9Jo4ETjazIUBloKaZveTuFxTaJwt4LfyXuD4wxMx2u/t7kQxe4k+96pW4/rjW/KZ/c16bksvT43K49LlsWjWszvB+zTm5cxNVbpbyYKKZtXP374MORIJVOHFRsUIClx7ZjOH9M2lQQ4kLkVL0GaGea48T6v02Avg02JAkaHsTF4+NWczaLTvo1awuD5zThSMylbiQ+BZtCYwK7r5z74K77zSzA2aYw/Ni3wIQ7oFxwz7JC9y92d7vZvYc8KGSF3IoqlWqwGV9m/GrI5oyasYKRo7N4YY3Z3LvZ/O5rG8zzumZRo3KSUGHKVJa+gIXmdkSQjUwSjKNqsSgfRMXvz4qk8uPyiS5RqWgQxMpD24CfgNcQaj9/Rx4KtCIJDD7Ji56Z9bloXO6ckTzekGHJlImoi2BsdbMTt5b7d7MhgHrDudEZjYCwN0fj2B8Us4lJSZwevdUTuuWwpgFa3liTA53fjyPh75eyPm9mnLJkRnqQi3x6ISgA5BgLFm3lX9/tVCJC5EAuXsB8Fj4I+WUEhciIdGWwBgBvGxmDxPKMOcCvyruwe4+Ghgd/l5k4sLdLy5pkCJmxoDWDRjQugGz8jbyxNgcRo5dzNPf5jCsSwqXH5VJ60aauUTihuoBlTPL12/joa8X8u70fJISjcv6NmN4v+ZKXIgEwMxaAv8A2hEaLg2Au2cGFpSUmR279/Da5FweHb2I1ZuVuBCJqgSGuy8GeptZdcDcfUvQMYkcTKfU2jxyXjeWr9/GM98t4fUpubw1NY/+rZL5Tb9MjmiusYgS8z4ilMQwQg/PzYD5QPsgg5LIy92wjYe/XsRb0/KokGBc3CeDEf2VuBAJ2LOEZnH6FzCQ0MxQerCIczt3F/BGdi6PfLOIlZu20zOjLv86uwt9mtcPOjSRQEVVAgPAzE4k9FBcee8vfe5+e6BBiRRDer2q/OXk9lx7dEtemriM5ycs5bynJtG+SU0uPyqTEzs1JilRBT8l9uw7A4mZdSM0HlvixMpNP/PvrxfxxpRcEhKMC3s35coBzWmgIXEi0aCKu38VnolkGfAXMxtHKKkhcWbXngLemZbHQ18tIn/jz3RvWod7ztCsIiJ7RVUCI1xduSqh7PJTwBnA5ECDEjlEdapV5LdHt+Tyfpm8Oz2fp8blcN3rM7j70x+4uE8G5/RMp1YVFfyU2OXu08zsQLNDSYxYs2U7j36zmFcmL8fdOadnGlcNbEHjWlWCDk1E/mu7mSUAC83saiAfaFCcA83sBOBBIBF4yt3v2s9+PYCJwNnu/lZkwpZDsafAeX9GPg9+tZBl67fROa02fz+tI/1a1lfiQqSQqEpgAH3cvZOZzXL3v5rZfcA7QQclcjgqJyVybs90zs5KY/SCNTw5dgn/+OQHHvpqIWf3SOeSIzNIq1s16DBFDsrMri+0mAB0A9YGFI5EwIatO3lizGKen7CUXXucM7uncvWgFqTWUZskEoWuI/SC7xrgDmAQcNHBDjKzROAR4FggD5hiZqP2nRI7vN/dhKZrlTJWUOB8PGclD3y5kEVrfqJd45o8fVEWg9o0UOJCpAjRlsD4Ofxzm5k1AdYTGmstErMSEoxBbRoyqE1D5uRv4qlxObwwYSnPjV/CCR0acVnfTLo3rRN0mCIHUrgi7W5CNTHeDigWKYHN23fx1Ngcnv52Cdt27eHULilcc3RLMupXCzo0EdkPd58CEO6Fcc0h1IjrCSxy95zw8a8Bw4Dv99nvt4TadPWsK0Puzlfz1nDfFwuYt3IzLRtU57Hzu3F8+0YkJChxIbI/0ZbA+NDMagP3ANMIFY17MtCIRCKoQ0otHjinKzcNbsPz45fxyqRlfDx7FV3Ta/Prvpkc374hFVQnQ6KMu/816BikZLbt3M1z45fyxJgcNv28ixM7NuZ3x7akRQPNliQS7cwsi1Ahzxrh5U3Ape4+9SCHphCa0W+vPKDXPudOAU4l1KtjvwkMMxsODAdIT08/xDuQfY1ftI5/fjafGbkbyahXlQfO7sJJnZuQqMSFyEFFVQLD3e8If33bzD4EKrv7piBjEikNjWtV4ebBbfjtoBa8NTWPZ79bwlWvTCOldhUu7pPBWT3SVCdDAmdmD7j7dWb2AUVMperuJwcQlhyCHbv38Oqk5Tz8zWLW/bSDQW0acP2xreiQUivo0ESk+J4BrnT3cQBm1pdQQqPTQY4r6rfhfdvyB4Cb3H3PgYYruPtIYCRAVlaWptY+TNOW/8i9n81n/OL1NKlVmbtO68jp3VNV5F3kEERVAsPMKgNXAn0JNbDfmtlj7r492MhESke1ShW4qE8GF/RuylfzVvP0t0u48+N5PPDlAs7MSuPiPhnq2i1BejH8895Ao5BDtqfAeWdaHg98uZD8jT/TO7MuT1zYje5N6wYdmogcui17kxcA7v6tmRVnGEkekFZoORVYsc8+WcBr4eRFfWCIme129/dKFrIU9sOqzdz72Xy+nLeG+tUr8ueh7TivVzqVkxKDDk0k5kRVAgN4AdgC/Du8fC6hB+gzA4tIpAwkJhjHtW/Ece0bMSd/E898t4SXJ4WmYj26TUMu7ZvBEZmaPkvK1t7uye4+JuhYpHjcnc/mruLezxewaM1PdEqtxV2nd6RvC1WxF4lhk83sCeBVQi/4zgZGh6e0xt2n7ee4KUBLM2tGaOaSc4DzCu/g7v+pNWdmzwEfKnkROcvXb+P+L+bz/swVVK9UgT8c35qL+2RQrVK0/QomEjui7W9Pa3fvXGj5GzObGVg0IgHokFKL+8/qws0ntOGlict4adJyvnxyNW0a1eDSI5txcpcmythLmTKzI4G/AE0J/bthgLt7ZpBxyf/6btE6/vnpD8zM20SLBtV5/IJQMTglLkRiXpfwz9v2Wd+HUEJjUFEHufvu8LSrnxGaRvUZd59rZiPC2x8vnXBlzebt/PvrRbw6eTkVEo3f9GvOiP6Z1K5aMejQRGJetCUwpptZb3efCGBmvYDvAo5JJBANalbm+uNac+XAFoyasYJnvlvCjW/P4q5Pf+D8Xulc0LspDWtWDjpMKR+eBn4HTAX2BByL7GNW3kb++el8vl20jpTaVfjnGZ04rWuKCgKLxAl3H1iCYz8GPt5nXZGJC3e/+HCvIyGbt+/iiTGLeebbpezaU8DZPdK45uiWel4TiaBoS2D0An5lZsvDy+nAPDObTeht38GKFYnEncpJiZzVI40zs1KZkLOeZ79bysPfLOKx0YsZ0rExlxyZQdd0TcMqpWqTu38SdBDyv5as28q9n83no9krqVutIrcObccFvdOpVEE9tETijZmdCLQH/vObsLvfHlxEUtj2XXt4ccIyHhm9iI3bdnFy5yZcf2wr1TETKQXRlsA4IegARKKVmdGneX36NK/PsvVbeX78Mt7MzmXUzBV0TqvNJX0yGNKxMRUr6K2rRMbe8dWEhvPdA7wD7Ni7/QDjrqUUrdm8nQe/WshrU3KpVCGBawa14PJ+mdSorJmLROKRmT0OVAUGAk8BZwCTAw1KgFDB5Len5fHAFwtYsWk7/Volc+PxrTXTk0gpiqoEhrsvAzCzBvxvhnn5fg8SKYea1qvGn09qx/XHteKdaXk8991Srnt9Bnd+PI/ze6VzXq90GtRQd0Upsfv2Wc4q9H2/466ldGzZvosnxuTw9LdL2LWngPN7pfPbQS1JrlEp6NBEpHT1cfdOZjbL3f9qZvcRSihLQNydr39Yw92f/sCC1T/RObUW957VmT7N6wcdmkjci6oEhpmdTOiBuQmwhlDBuHmEusyJyD6qV6rAr47I4IJeTRm3aB3PfreEB75cyCPfLGJIx8Zc3EfDS+Tw7R13bWaZ7p5TeJuZqYBnGdm5u4CXJy3j318vYsPWnZzUuQk3HNeKpvXUNVmknPg5/HObmTUB1gPNDrC/lKLpy3/kH5/8wOQlG2hWvxqPnt+NwR1UMFmkrERVAgO4A+gNfOnuXc1sIKGpVEXkABISjP6tkunfKpmctT/xwoRlvDU1j/dnrKBzai0u6pPBiZ0aa2y8HK63gG77rHsT6B5ALOVGQYHz0eyV3PPZfJZv2Eaf5vW4eXAbOqXWDjo0ESlbH5pZbeAeYBqhHnBPBRpRObRk3Vbu+ewHPp69ivrVK3LHKR04p0caSSqYLFKmoi2Bscvd15tZgpkluPs3ZnZ30EGJxJLM5Or85eT23HB8a96dlsdz45dy/RszufOjeZzTM43zezWlSe0qQYcpMcDM2hDqAVfLzE4rtKkmhYb5SeRNzFnPPz6ex8y8TbRpVIPnLulB/1bJesMnUg65+x3hr2+b2YdAZXffFGRM5cn6n3bw0FcLeXnScipWSODao1tyeb9MqleKtl+jRMqHaPubt9HMqgNjgZfNbA2wuzgHmlkikA3ku/vQfbadD9wUXvwJuMLdZ0YubJHoU71SBS48IoMLejfl20XreGHCMh4bvZjHx+RwbNuG/KpPU47IrKdfiORAWgNDgdrASYXWbwEuDyKgeLdozU/c9ckPfDlvNY1rVebeMztzatcUEhP091SkvDKzq4CX3X2ju+8ws6pmdqW7Pxp0bPFs+649PP3tEh4bvZifd+3hnB5pXHtMS9UYEwlYtCUwhhEa5/c74HygFlDcKaKuJVQvo2YR25YA/d39RzMbDIwkNGWrSNwzM45qmcxRLZPJ3bCNlyct57Upy/l07ipaNazOhb2bcmq3VL1JkF9w9/eB983sCHefEHQ88Wztlh088OUCXpuSS5WkRP5wfGsu69uMykka9iUiXO7uj+xdCD/PXg4ogVEKCgqcd6fnc9/n81mxaTvHtG3IzYPb0KJB9aBDExGiJIFhZi2Ahu7+XXhVAfC8mfUj9OZv/UGOTwVOBO4Ert93u7uPL7Q4EUiNQNgiMSetblVuHtyG645pyQczV/D8hKXc+v5c7v50Pqd1S+HC3k1p2bBG0GFKlDCzG939n8B5ZvaLekTufk0AYcWVn3fu4elvc3hs9GJ27C7ggl7pXHN0S+pV18wiIvIfCWZm7u7wn17HFQOOKS6NX7SOv300j+9XbqZzai3uP7sLvTPrBR2WiBQSFQkM4AHgj0Ws3xbedlIR2/Y9/kagOL95XQZ8UvzQROJP5aREzsxK44zuqczI3ciLE5bx2uRcXpiwjCMy6/GrI5pyTLuGKkwl88I/swONIg4VFDjvzcjnns/ms3LTdo5v35CbTmhDZrLe8InIL3wGvGFmjxMq4DkC+DTYkOJLaPjePL6ct4aU2lV48JwunNSpCQkavicSdaIlgZHh7rP2Xenu2WaWcaADzWwosMbdp5rZgIPsO5BQAqPvAfYZDgwHSE9PP2jgIrHMzOiaXoeu6XX4vxPb8kZ2Hi9NXMYVL0+jYc1KnNsznXN7ptOwpsZ7lkfu/kH45/ORPreZLSVUS2MPsNvdsyJ9jWg1KWc9f/toHrPzN9EptRYPnN2FXnrDJyL7dxOhZ9MrAAM+R7OQRMSGrTt54MsFvDxpOVWTErl5cBsu7pOh4XsiUSxaEhgH+u3oYNMlHAmcbGZDwuepaWYvufsFhXcys06EGvvB7r7fISnuPpJQjQyysrK8OMGLxIN61StxxYDmDO+Xyej5a3hx4jIe/Goh//56Ece1a8gFvZvSp7mKfpYnZvYBobd9RXL3k0t4iYHuvq6E54gZS9dt5R+fzOOzuaECnf86uzPDOqfoDZ+IHJC7FwCPhz8SATt27+H58Uv599eL2LZzD+f1TOe6YzR8TyQWREsCY4qZXe7uTxZeaWaXAVMPdKC73wLcEt5/AHBDEcmLdOAd4EJ3XxDBuEXiTmKCcXTbhhzdtiHL1m/llUnLeSM7l0/mrCKzfjXO65XOmd3TqFU1KehQpfTdG3QA8WDz9l08/PUinv1uCUmJCfz+2Fb8+qhMqlTUGz4RkbLk7nw2dzX/+GQey9ZvY2DrZP44pK3qf4nEkGhJYFwHvBue7nRvwiKLUIGiUw/nhGY2AsDdHwf+DNQDHg2/PS5X3ZVFDlfTetW4ZUhbfndsKz6evZKXJi7jbx/N457P5nNS5yZc0LspnVNrqVdGnHL3MaV5euBzM3PgiXDvt/8R60P6du8p4LUpudz/xQJ+3LaTM7uncsNxrWmgIVkiImVu7opN3PHh90zM2UCrhtV54dKe9GuVHHRYInKILFzQOCqEa1R0CC/Odfevg4wnKyvLs7NVu06ksLkrNvHypOW8Nz2fbTv30CGlJuf3asrJnZtQTVOxFsnMpipp+r/MrIm7rzCzBsAXwG/dfez+9o+19vjbheu448Pvmb96C72a1eXWoe3okFIr6LBEhNhpk83sRXe/0MyudfcHg45nr1hrj9ds2c59ny3gjam51K6SxPXHtebcHmlUUKFykcAdTnscVb9tuPs3wDdBxyEi+9e+SS3+fmpHbhnchvem5/PSxOXc8s5s7vxoHqd2TeG8Xum0bVwz6DAlyrn7ivDPNWb2LtAT2G8CI1YsW7+Vv300jy++X0163ao8fkE3jm/fSL2URORwdDezpsClZvYCoQKe/+HuG4IJKzbs2L2H574L1bnYsXsPv+7bjKsHtaRWFQ2BFYllUZXAEJHYUaNyEhcekcEFvZsybfmPvDxxOa9n5/LixGV0S6/Neb2aMrRTY1XyjmGl9fbPzKoBCe6+Jfz9OOD2SJ0/CD/t2M3DXy/imW+XkJRo3HRCGy7tm0GlCvrzLyKH7XFC06VmEhpiXTiB4eH1sg9356t5a/jbR9+zdP02jm7TgP87sa2mqRaJE0pgiEiJmBndm9ale9NQN/m3p+XxyqTl3PDmTG7/YC6ndUvlvF7ptFKBrFhUWm//GhKqewShf4decfdPSxRpQAoKnHem53P3pz+wdssOzuieyo3Hq86FiJScuz8EPGRmj7n7FYdzDjM7AXgQSASecve79tl+PqFpWgF+Aq5w95klCDtQi9Zs4fYP5zF2wVqaJ1fjuUt6MKB1g6DDEpEIUgJDRCKmTrWK/PqoTC7r24yJORt4ZfJyXp60jOfGLyWraR3O65XOkI7qlRFDSuXtn7vnAJ1LHF3AZuZu5LZRc5mRu5Gu6bV56ldZdE6rHXRYIhJn3P0KM+sMHBVeNdbdZx3sODNLBB4BjgXyCM36N8rdvy+02xKgv7v/aGaDgZFAr8jeQenbvH0XD365kOfHL6VKxUT+PLQdFx7RlCTVuRCJO0pgiEjEmRlHNK/HEc3rsf6nUK+MVyfncv0bM/nLKPXKiBWRePsXj9Zu2cE9n/3AG9l5JNeoxP1ndeaULikkJKjOhYhEnpldQ2hGpnfCq142s5Hu/u+DHNoTWBROGmNmrwHDgP8kMNx9fKH9JwKpEQu8DBQUOG9Ny+Ofn/7A+q07OadHOjcc14p61SsFHZqIlBIlMESkVNWrXonh/Zrz676ZTMxZz6tTcv/TK6N70zqc2zOdEzs2pkpF9cqIVof79i/e7NpTwAsTlvHAFwvYvnsPv+mXyW+Pbkl1zb4jIqXr10Avd98KYGZ3AxOAgyUwUoDcQst5HLh3xWXAJyWIs0zNCPeCm5m7ke5N6/DcJT0125NIOaCnLhEpEwkJRp8W9enToj7rf2rHO9PyeXVyqFbGXz+YyyldUjinZxrtm+jhI9qU4O1f3Bi/eB23vT+XhWt+ol+rZG47qR3NVRBORMqGAXsKLe9hn5pEBzhuX17kjmYDCSUw+u5n+3BC/w6Qnp5ejEuXnvU/7eCfn87n9ezc//SCO7VrimZ7EiknlMAQkTJXr3olLu+Xya+PasakJRt4bfJ/ZzDplFqLc3qkc3KXJnqzHT0O9+1fzFu56Wfu/GgeH85aSVrdKjz5qyyOadtAD8oiUpaeBSaFp5wGOAV4uhjH5QFphZZTgRX77mRmnYCngMHuvr6oE7n7SEL1McjKyioyCVLa9hQ4L09axr2fzWfbzj0M75fJbwe1oEZlTYsqUp7otwMRCYyZ0TuzHr0z6/GXbTt5d3o+r03O5Y/vzuZvH33PSZ2acHbPNLqm1dYvjME63Ld/MWvn7gKe+W4JD321kD0FznXHtGRE/+YqQCsiZc7d7zez0YR6RxhwibtPL8ahU4CWZtYMyAfOAc4rvIOZpRPqXXehuy+IaOARNHXZBm59by7fr9zMkS3q8deT29OigepoiZRHSmCISFSoXbUilxzZjIv7ZDA9dyOvTV7OB7NW8Hp2Lq0aVuesrDRO65ZK3WoVgw61PDrct38x6btF6/jz+3NYvHYrx7RtwJ+Htie9XtWgwxKRcszdpwHTDvGY3WZ2NfAZoWlUn3H3uWY2Irz9ceDPQD3g0fCLgt3unhXR4Etg3U87uOuTH3hrah6NalbmkfO6MaRjI73UECnHzD2QXmAxISsry7Ozs4MOQ6Tc+mnHbj6cuYLXpuQyI3cjFRMTOLZ9Q87OSqNvi/oxM+uDmU2NpgfCw2Fm3fjv27+xxXz7FzFl0R6v3rydv300jw9mriC9blX+cnI7BrVpWKrXFJGyFw9tcpDKoj3eU+C8Mnk593z6Az/v2sNlfUPDRappaKlIXDmc9litgIhEreqVKnBOz3TO6ZnOD6s28/qUXN6dns9Hs1aSUrsKZ3RP5cysVFLr6O14aTuct3+xYnd4dpH7v1jAzj0FGi4iIhKgWXkb+dN7c5iVt4k+zetx+7AOtGigoskiEqIEhojEhDaNanLbSe25eXAbPp+7mjeyc3no64U89PVC+raoz9k90ji2XUMqVdAvnVJ8U5dt4E/vzWXeys30b5XMX09uT0b9akGHJSLyH2ZWDfjZ3QvMrBXQBvjE3XcFHFpEbdq2i3s/n89Lk5ZRv3olHjynCyd3bqLhIiLyP5TAEJGYUqlCIid1bsJJnZuQ9+M23szO462peVz9ynRqV03ilC4pnJmVqulY5YA2btvJ3Z/+wKuTc2lcqzKPX9CN49trXLWIRKWxwFFmVgf4CsgGzgbODzSqCHF3Rs1cwR0ffs+GrTu56IgMrj+uFTU1u4iIFEEJDBGJWal1qvK7Y1txzdEtGb94HW9k5/HKpOU8N34p7ZvU5KysNIZ1aULtqir8WRLx9PbP3Xl3ej53fjSPjT/v4vKjmnHdMa00rlpEopm5+zYzuwz4t7v/08zKtA5RaVmybiu3vjeHbxeto3NqLZ67pCcdUvQCQkT2T09sIhLzEhOMo1omc1TLZDZu28n7M1bwRnYut42ay50fzePY9g05s3sqR7VMJjFGCn9Gmbh4+7d47U/c+t4cxi9eT9f02rx4SkfaNakZdFgiIgdjZnYEoTb3svC6mH6G37F7D4+NXsyjoxdTqUICd5zSgfN6puvfaBE5qJhu/ERE9lW7akUu6pPBRX0ymJO/ibem5vHejFDhz0Y1K3NatxTOzEqjmeocHIqYfvu3fVfoQfmx0YupnJTAnad24Nwe6TEzi42IlHvXAbcA74anQc0Evgk2pMM3fvE6/vTuHHLWbeWkzk24dWhbGtSoHHRYIhIjlMAQkbjVIaUWHVJqccuQNnw1bw1vZOfy+JjQG5+spnU4MyuVIR0bU0PjbA8mZt/+TcxZzx/fnU3O2q0M69KEP53YjuQalYIOS0Sk2Nx9DDAGwMwSgHXufk2wUR26H7fu5M6P5/HW1Dya1qvKC5f2pF+r5KDDEpEYExMPoMVhZomEujXnu/vQfbYZ8CAwBNgGXByeElBEyoFKFRIZ0rExQzo2ZtWm7bwzPVT486a3Z/OXUd8zuEMjzuieSu/MenorX7TriLG3fxu37eTvH8/jjew80upW0YOyiMQsM3sFGAHsAaYCtczsfne/J9jIisfdeW9GPnd8OI/NP+/iygHNuebolpqqWkQOS9wkMIBrgXlAUQOaBwMtw59ewGPhnyJSzjSqVZkrB7Tgiv7NmbZ8I29NzePDmSt4Z3o+KbWrcHq3FE7vnkrTehpislcsvf0rXM3+x227GNG/Odce3ZIqFfWgLCIxq527bzaz84GPgZsIJTKiPoGxbP1W/vTeHMYtXEeXtNrcdXpH2jRS7SEROXxxkcAws1TgROBO4PoidhkGvODuDkw0s9pm1tjdV5ZlnCISPcyM7k3r0L1pHW47qR2fzV3FW1Pz+Pc3i3jo60X0zKjL6d1TNMSE2Hn7l/fjNv703hxGz19L59RavHBpLxXpFJF4kGRmScApwMPuvsvMPOCYDmj3ngKe+W4J93+xgAoJCdw+rD3n92qqIp0iUmJxkcAAHgBuBGrsZ3sKkFtoOS+87hcJDDMbDgwHSE9Pj2iQIhKdKiclMqxLCsO6pLBy08+8My2ft6eFhpjcNmoux7dvxOndUjmyRf3y+vAV1W//9hQ4L0xYyj2fzQfgz0PbcVGfjPL6/0pE4s8TwFJgJjDWzJoCmwON6ADmrtjEzW/PZnb+Jo5t15Dbh7Wnca0qQYclInEi5hMYZjYUWOPuU81swP52K2JdkZlrdx8JjATIysqK6uy2iERe41pVuGpgC64c0JzpuRt5e2oeH8xcwfszVtCoZmVO6ZrCGd1TaNFgf/nSuBS1b/8WrN7CTW/PYvryjfRvlcydp3YgtU7VoMMSEYkYd38IeKjQqmVmNjCoePZn+649PPjVQkaOzaFO1SQeOa8bQzo2IlSKTkQkMmI+gQEcCZxsZkOAykBNM3vJ3S8otE8ekFZoORVYUYYxikiMMTO6pdehW3odbh3ajq/mreHtaXk8OS6Hx8cspnNqLU7rlspJnZtQt1rFoMMtbVH39m/n7gIeHb2IR75ZRPVKFfjX2Z05pUuKHpRFJO6YWS3gNqBfeNUY4HZgU2BB7WNSznpufmc2S9Zt5czuqfzfiW2pXTXu/20UkQDEfALD3W8hVB2fcA+MG/ZJXgCMAq42s9cIFe/cpPoXIlJclZMSObFTY07s1Jg1W7YzasYK3pmWz22j5nLHh98zsE0DTu+WwsA2DahUIf6KRUbb279ZeRu58a1Z/LBqCyd3bsJtJ7WjXnVNjSoicesZYA5wVnj5QuBZ4LTAIgr7acdu7v7kB16cuIy0ulV46bJe9G1ZP+iwRCSOxXwCY3/MbASAuz9OaMz2EGARoWlULwkwNBGJYQ1qVObXR2Xy66MymbdyM+9Oz+fd6fl88f1qalVJYminxpzWLYVu6XXipjdAtLz9275rDw98uZCRYxeTXKMST1+UxdFtG5ZlCCIiQWju7qcXWv6rmc0IKpi9xi5Yyy3vzGbFpp+59Mhm3HB8K6pWjNtfLUQkSsRVK+Puo4HR4e+PF1rvwFXBRCUi8apt45q0bVyTG49vzXeL1/P21DzenpbHy5OW07ReVU7pksJp3VKCDjMSAn/7t23nboY8NI6ctVs5p0catwxpS60q5Xt2GBEpN342s77u/i2AmR0J/BxUMHsKnBvfmskb2XlkJlfjrRFH0L1p3aDCEZFyJq4SGCIiQaiQmED/Vsn0b5XMlu27+HTOKt6dns9DXy/kwa8WBh1eJAT+9m/x2q3U2VXAi5f15KiWyWV5aRGRoI0AXgj3hgP4EbgoqGAWrN7C5mn5XDGgOdce3ZLKSfE3dFJEopcSGCIiEVSjchJnZqVxZlYaKzb+zPszVnDl3UFHVWKBv/2rV60in/+uH9Uq6Z8tESlf3H0m0NnMaoaXN5vZdcCsIOJJSkzgvSuPpGNqrYPvLCISYQlBByAiEq+a1K7CFQOaBx1GJIwAHjGzpWa2FHgY+E1JTmhmJ5jZfDNbZGY3H2z/JrWrKHkhIuWau292970zQF1fnGMO1tZayEPh7bPMrNvBztmiQXUlL0QkMEpgiIjIAbn7THfvDHQCOrl7V2DQ4Z7PzBKBR4DBQDvgXDNrF5FgRUTKh4NWiS5mWzsYaBn+DAcei3CcIiIRpQSGiIgUy+G8/duPnsAid89x953Aa8CwEgcoIlJ+eDH2KU5bOwx4wUMmArXNrHGEYxURiRglMERE5HCUZI7YFCC30HJeeN3/XsBsuJllm1n22rVrS3A5EZHYY2ZbzGxzEZ8tQJNinKI4ba3aYxGJKREbUGxmxSkktNbdj47UNUVEJDDFefu3P0UlP35xPncfCYwEyMrKKsn1RERijrvXKOEpitPWqj0WkZgSyYpoicCQA2w3YFQEryciIqUo/JavqAdVA6qU4NR5QFqh5VRgRQnOJyIiv1SctlbtsYjEFHOPTBK18BR7JdknmpjZWmBZ0HFEQH1gXdBBlLJ4v0fdX2xrHYE3acVWnCrywC53n13qwRTBzCoAC4CjgXxgCnCeu889wDHx0h5D/P951/3Fvni/xzJtk4NSnLbWzE4Erib0ErIX8JC79zzIedUex454vz+I/3uM9/s75PY4Yj0wikpMmFlzoOreh+RYSl4AuHty0DFEgpllu3tW0HGUpni/R91fbDOz7DK+5BhCD6oHqlPRDMgok2j24e67zexq4DNCvfeeOVDyInxMXLTHUD7+vOv+Ylu832MAbXIg9tfWmtmI8PbHgY8JJS8WAduAS4pxXrXHMSLe7w/i/x7Lw/0d6jGRHELyP8zsj0BHoMDMCtz9wtK6loiI/I8p7n7AaU7N7OuyCqYo7v4xoQdnEREpJUW1teHExd7vDlxV1nGJiByuiM1CYma/Dc83vVdndz/X3c8HOkfqOiIicmAHS14Udx8RERERkWgSyWlUfwQ+NbOTwsufm9kYMxtHqOuaBGdk0AGUgXi/R91fbAv0/sws2cz+Zmb3mVmLIGMRQH/eY1283x/E/z3G+/1J8cX7n4V4vz+I/3vU/e0jYkU8AcysMvAHIAv4M7AQSHL3TRG7iIiIHBIzewF4idCMIn939x4BhyQiIiIicsgi2QMDoDnwOvAbQhWNH6BkU+2JiMghMrNPzeyoQqsqAkvDn0pBxCQiIiIiUlKRrIHxHHAL8A/gene/HHgMeNLMbo3UdeTAzOwZM1tjZnMKratrZl+Y2cLwzzpBxlgSZpZmZt+Y2Twzm2tm14bXx8U9mlllM5tsZjPD9/fX8Pq4uL+9zCzRzKab2Yfh5Xi7v6VmNtvMZuytrlzG93g2MMzMXgnPBnUroV5xdwFXluJ1pRC1x3Fxj2qTY/z+oqA9liihNjm271HtcdzcX4nb5Ej2wOjq7he4++nAsQDuPt3dTwJmRfA6cmDPASfss+5m4Ct3bwl8FV6OVbuB37t7W6A3cJWZtSN+7nEHMMjdOwNdgBPMrDfxc397XQvMK7Qcb/cHMNDduxSa+qrM7tHdN7n7DcCfgL8R6hV3lbufHmvTWce451B7HOv3qDY5Pu4vsPZYospzqE2O5XtUexwf9wclbZPdPSIf4G5gDDAB+EOkzqvPYf2/yADmFFqeDzQOf28MzA86xgje6/uEEmZxd49AVWAa0Cue7g9IDTdOg4APw+vi5v7C97AUqL/PujK7RyATuAf4O9AEOIpQMeXfAolB//cpTx+1x/Fzj2qTg4/1MO8v0PZYn+j6qE2Oj3tUexx8rCW4xxK3yRHrgeHuNwEnAce6+z2ROq9EREN3XwkQ/tkg4HgiwswygK7AJOLoHsNdx2YAa4Av3D2u7o9QbZwbgYJC6+Lp/iBULPNzM5tqZsPD68ryHl8FPgUmAi+6+zh3Px7YDHxeiteVg4u3P+tA/LbHoDY5Du4v6PZYoltc/lmI1zZZ7XHM3x9EoE2uEKlIzGyou39Y0n1EisPMqgNvA9e5+2YzCzqkiHH3PUAXM6sNvGtmHQIOKWLMbCiwxt2nmtmAgMMpTUe6+wozawB8YWY/lPH1KwNLgGqE3lIA4O7Pm9kbZRyLxLl4bo9BbXIcCLo9FilT8dwmqz2OCyVukyOWwADuMbN84EB/S/4OKIFR9labWWN3X2lmjQllLWOWmSURaphfdvd3wqvj6h4B3H2jmY0mNF4zXu7vSOBkMxtC6Jfsmmb2EvFzfwC4+4rwzzVm9i7Qk7K9xysIDSHZCYzYJ7afS/G6cnBx9We9vLTHoDY50ChLIAraY4lucfVnoby0yWqPY1ck2uRIFvFcDdwP3HeAz8IIXk+KbxRwUfj7RYTGxMUkC6WRnwbmufv9hTbFxT2aWXI4q4yZVQGOAX4gTu7P3W9x91R3zwDOAb529wuIk/sDMLNqZlZj73fgOGAOZXiP7j7eQwU7z3X3maV1HTks8fRnPa7bY1CbHN4tZu8vGtpjiXpx82ch3ttktcdADN8fRK5NtnCxDIkTZvYqMACoTyipdBvwHvAGkA4sB8509w0BhVgiZtYXGAfM5r/jw/5IaIxfzN+jmXUCngcSCSUY33D3282sHnFwf4WFu8fd4O5D4+n+zCwTeDe8WAF4xd3vLMt7NLOR7j68pPtIyag9jot7VJscw/cXDe2xRA+1ybF9j2qPY//+ItUmK4EhIhJnzGwN8NqBdgFO8NB0VSIiIiIiMSGSNTBERCQ6/KEY+4wr9ShERERERCJIPTBEREREREREJOpFsognAGZW1cxuNbMnw8stw9PCiIiIiIiIiIgclognMIBngR3AEeHlPOBvpXAdERERERERESknSiOB0dzd/wnsAnD3nwkVjBMRkQCEp6oSEREREYlppZHA2Bmem9cBzKw5oR4ZIhFlZo3M7DUzW2xm35vZx2bW6jDOM9rMskojxkOM42IzezjoOCR+mFkfM/semBde7mxmjwYclsQhtcciItFDbbLEs9JIYNwGfAqkmdnLwFfAjaVwHSnHzMwIzSM82t2bu3s7QnNdNww2suCYWWLQMUjU+RdwPLAewN1nAv0CjUjijtrjX1J7LCJBUZv8S2qT40vEExju/gVwGnAx8CqQ5e6jI30dKfcGArvc/fG9K9x9hruPM7MXzWzY3vVm9rKZnWxmiWZ2r5nNNrNZZvbbfU9qZseZ2QQzm2Zmb5pZ9SL2GW1md5vZZDNbYGZHhdf/T3bYzD40swHh7z+Fj5lqZl+aWc/weXLM7ORCp08zs0/NbL6Z3VboXBeErzfDzJ7Y2xCHz3u7mU3iv3VnRP7D3XP3WbUnkEAknqk9Ru2xiEQNtcmoTY5nEUtgmFm3vR+gKbASWAGkh9eJRFIHYOp+tj0FXAJgZrWAPsDHwHCgGdDV3TsBLxc+yMzqA38CjnH3bkA2cP1+rlHB3XsC1xHqdXQw1QhlwrsDWwgVtj0WOBW4vdB+PYHzgS7AmWaWZWZtgbOBI929C6FfQM8vdN457t7L3b8tRhxSvuSaWR/Azayimd1AeDiJSASpPf7vedUei0jQ1Cb/97xqk+NQhQie677wz8pAFjCTUPHOTsAkoG8EryWyX+4+xsweMbMGhHoDve3uu83sGOBxd98d3m/DPof2BtoB35kZQEVgwn4u807451Qgoxhh7SQ0tApgNrDD3XeZ2ex9jv/C3dcDmNk7hP7e7Aa6A1PCcVUB1oT33wO8XYzrS/k0AngQSCE0I9TnwFWBRiTlitpjEZHooTZZ4kHEEhjuPhDAzF4Dhrv77PByB+CGSF1HJGwucMYBtr9IKAN7DnBpeJ0RLi67H0aocTy3GNffW5h2D//9e7Sb/+3VVLnQ913uvvfaBXuPd/cCMyv893Df+Dwc1/PufksRcWx3dw0JkCK5+zr++yZCpLSoPQ5Reywi0UBtcoja5DhVGkU82+xNXgC4+xxCXX1EIulroJKZXb53hZn1MLP+4cXnCHVdw93nhtd9DozY2xiaWd19zjkRONLMWoS3V7VDq9i8FOhiZglmlkaoq9uhOtbM6lpoJp9TgO8IFcI9I5wtJ7y96WGcW8oJM/u3mT20v0/Q8UncUXssIhI91CZLXCuNBMY8M3vKzAaYWX8zexKNuZYIC2dqTyXUmC02s7nAXwjVXcHdVxP6c/dsocOeApYDs8xsJnDePudcS7j4rJnNItRYtzmEsL4DlhDq/nYvMO2Qbwy+JZQZn0GoW1+2u39PaNzh5+G4vgAaH8a5pfzIJtR1szLQDVgY/nRBRTwlwtQeqz0WkeihNlltcryz//bYidAJzSoDV/DfqfrGAo+5+/aIXkjkAMysKqFGspu7bwo6HpEgmNk3wHHuviu8nAR8vnfIn0hZUHssIhI91CZLrItkEU8A3H27mT0CfElobNL8vQ/PImUhXIjoGeB+NcxSzjUBagB7i3FVD68TKRNqj0VEoofaZIkHpdEDYwDwPKGxTgakARe5+9iIXkhERA7IzC4h1G30m/Cq/sBf3P35wIISERERETlMpZHAmAqc5+7zw8utgFfDc/uKiEgZMrNGQC9CPeImu/uqgEMSERERETksER9CAiTtTV4AuPuC8LhrEREpez2Bo8LfHfggwFhERERERA5bafTAeJbQHL4vhledD1Rw90sieiERETkgM7sL6AG8HF51LpC9n/nSRURERESiWmkkMCoBVwF9CdXAGAs86u47InohERE5oPCUYl3cvSC8nAhMd/dOwUYmIiIiInLoIjqExMwSgKnu3gG4P5LnFhGRw1Kb/85CUivAOERERERESiSiCQx3LzCzmWaW7u7LI3luERE5ZH8HppvZN4R6xPUDNHxERERERGJSaRTxbAzMNbPJwNa9K9395FK4loiIFCHcI64A6E2oDoYBN2kWEhERERGJVaVRA6N/UevdfUxELyQiIgdkZmPdvV/QcYiIiIiIREJp9MAY4u43FV5hZncDSmCIiJStL8zsBuB1/rdH3Ib9HyIiIiIiEp1KowfGNHfvts+6Wap6LyJStsxsSRGr3d0zyzwYEREREZESilgPDDO7ArgSaB6eum+vGsD4SF1HRESKra27by+8wswqBxWMiIiIiEhJRKwHhpnVAuoA/wBuLrRpi7ori4iUvf30iPvFOhERERGRWBCxHhjuvgnYZGYPAhvcfQuAmdUws17uPilS1xIRkf0zs0ZAClDFzLoSmoEEoCZQNbDARERERERKoDRqYEwHunn4xOGp/LJj8Y1f/fr1PSMjI+gwRCTGTZ06dZ27J5fV9czsIuBiIAuYwn8TGJuB5939nbKKJVLUHotIpJR1mxxv1B6LSKQcTntcGrOQmBfKirh7gZmVxnVKXUZGBtnZ2UGHISIxzsyWleX13P154HkzO93d3y7La5cWtcciEill3SbHG7XHIhIph9MeJ5RCHDlmdo2ZJYU/1wI5pXAdERE5sO5mVnvvgpnVMbO/BRiPiIiIiMhhK40ExgigD5AP5AG9gOGlcB0RETmwwe6+ce+Cu/8IDAkuHBERERGRwxfxoR3uvgY4J9LnFRGRQ5ZoZpXcfQeAmVUBKgUck4iIiIjIYYl4Dwwza2VmX5nZnPByJzP7U6SvIyIiB/US8JWZXWZmlwJfAM8HHJOIiMSwbTt3Bx2CiJRjpTGE5EngFmAXgLvPQj0yRETKnLv/E/gb0BZoD9wRXiciInJYFq/dyk1vzWLTz7uCDkVEyqHSmB2kqrtPNrPC65SqFREJxjxgt7t/aWZVzayGu28JOigREYlNydUr8ebUXEYvWMOdp3TkmHYNgw5JRMqR0uiBsc7MmgMOYGZnACtL4ToiInIAZnY58BbwRHhVCvBeYAGJiEjMa1SrMu9ddSR1qlbk1y9kc+1r09mwdWfQYYlIOVEaCYyrCD0stzGzfOA64IpSuI6IiBzYVcCRwGYAd18INAg0IhERiXmdUmsz6uq+XHdMSz6atZJj7x/Dh7NW4O5BhyYicS7iCQx3z3H3Y4BkoI2793X3pZG+joiIHNQOd//PazEzq0C4d5yIiEhJVKyQwHXHtOLDa/qSUqcKV78ynctfmMrKTT8HHZqIxLGI1cAws+v3sx4Ad78/UtcSEZFiGWNmfwSqmNmxwJXABwHHJCIicaRNo5q8c0Ufnv1uKfd9MZ9j7x/LzYPbcF7PdBIS7OAnEBE5BJHsgVHjIB8RESlbNwNrgdnAb4CPAU1rLSIiEVUhMYHL+2Xy2XX96JxWiz+9N4dzRk5k8dqfgg5NROJMxHpguPtfI3UuEREpOXcvIDS19ZNBxyIiIvGvab1qvHRZL96cmsedH81j8APj+O2gFvymf3MqViiN0nsiUt5EfBpVM2sFPAY0dPcOZtYJONnd/xbpa4mIyC+Z2WwOUOvC3TuVYTgiIlKOmBlnZaUxoHUyf/3ge+77YgGjZq7gH6d1JCujbtDhiUiMi3gCg9Cbvj8QnrbP3WeZ2SuAEhgiImVjaNABiIhI+dagRmUeOa8bp3dbza3vzeWMxydwXq90bjqhDbWqJAUdnojEqNLoy1XV3Sfvs253JE5sZieY2XwzW2RmNxex3czsofD2WWbWbZ/tiWY23cw+jEQ8IiLRyN2X7f2EV7UMf18DbIjENdQei4hIcQxq05DPf9ePX/dtxmuTl3OMplwVkRIojQTGOjNrTrj7spmdAaws6UnNLBF4BBgMtAPONbN2++w2GGgZ/gwnNJSlsGuBeSWNRUQkFpjZ5cBbhHvEAanAexE4r9pjEREptmqVKvCnoe0YdXVfGtWszNWvTOeS56awfP22oEMTkRhTGgmMqwg9LLcxs3zgOmBEBM7bE1jk7jnuvhN4DRi2zz7DgBc8ZCJQ28waA5hZKnAi8FQEYhERiQVXAUcCmwHcfSHQIALnVXssIiKHrENKLd69sg9/HtqOKUs2cOy/xvDIN4vYubsg6NBEJEZEPIERfqA9BkgG2rh730LdmEsiBcgttJwXXlfcfR4AbgTUQopIebEjnGAAwMwqcIDinodA7bGIiByWCokJXNq3GV/9fgCD2jTgns/mc+JD45i8JCIjHEUkzpXafEbuvtXdt0TwlFbUZYqzj5kNBda4+9SDXsRsuJllm1n22rVrDydOEZFoMcbM/ghUMbNjgTeBDyJwXrXHIiJSIo1qVeaxC7rzzMVZ/LxrD2c9MYEb3pzJ+p92BB2aiESxWJqQOQ9IK7ScCqwo5j5HAieb2VJCXZ0HmdlLRV3E3Ue6e5a7ZyUnJ0cqdhGRINwMrAVmA78BPgb+FIHzqj0WEZGIGNSmIV/8rj9XDGjOe9PzGXTfGF6etIyCAhX5FJFfiqUExhSgpZk1M7OKwDnAqH32GQX8Klz9vjewyd1Xuvst7p7q7hnh47529wvKNHoRkTLm7gXu/qS7n+nuZ4S/R+KJUO2xiIhETJWKidx0Qhs+ufYo2jauwf+9O4dTHxvP7LxNQYcmIlEm4gkMM6tqZrea2ZPh5ZbhLsMl4u67gauBzwhVrn/D3eea2Qgz21sk9GMgB1gEPAlcWdLriojI/1J7LCIipaFlwxq8enlvHjynC/k//sywR77lz+/PYdPPu4IOTUSihEV6DmYzex2YCvzK3TuYWRVggrt3ieiFykBWVpZnZ2cHHYaIxDgzm+ruWUHHEcvUHotIpKhNLpmyao83b9/F/Z8v4IUJS6lTtSI3DW7DGd1SSUgoqsSSiMSiw2mPS2MISXN3/yewC8Ddf6boYm4iIlIGzKxa0DGIiIgcipqVk/jLye354Ld9yahfjRvfmsUZj49nTr6GlYiUZ6WRwNgZ7nXhAGbWHFA5YRGRMmZmfczse0LDPDCzzmb2aMBhiYhIhJnZCWY238wWmdnNRWyvZWYfmNlMM5trZpcU99igtW9Sizd/cwT3ntmZ5Ru2cdLD3/Kn92azcdvOgx8sInGnNBIYfwE+BdLM7GXgK+DGUriOiIgc2L+A44H1AO4+E+gXaEQiIhJRZpYIPAIMBtoB55pZu312uwr43t07AwOA+8ysYjGPDVxCgnFG91S++v0ALjoig1cmLWfgvaN5edIy9mi2EpFyJeIJDHf/HDgNuBh4Fchy99GRvo6IiBycu+fus2pPIIGIiEhp6Qkscvccd99JaIrqYfvs40ANMzOgOrAB2F3MY6NGrSqhYSUf/vYoWjYMzVZy8sPfkr10Q9ChiUgZKY1ZSEYBxwGj3f1Dd18X6WuIiEix5JpZH8DDb9puIDycRERE4kYKUDhZnRdeV9jDQFtgBTAbuNbdC4p5LGY23MyyzSx77dq1kYz9sLRrUpPXh/fmoXO7sv6nnZzx+AR+9/oMVm/eHnRoIlLKSmMIyX3AUcD3ZvammZ1hZpVL4ToiInJgIwh1G04h9FDaJbwsIiLxo6hi+fuOqzgemAE0IfRvwcNmVrOYx+LuI909y92zkpOTSxZthJgZJ3duwle/789VA5vz0ayVDLx3NI+NXsyO3epsKBKvSmMIyRh3vxLIBEYCZwFrIn0dERE5KHP38929obs3cPcL3H190EGJiEhE5QFphZZTCfW0KOwS4B0PWQQsAdoU89ioVq1SBf5wfBu+uL4ffZrX5+5Pf+C4f43l87mrcFd9DJF4Uxo9MAjPQnI6obd/PYDnS+M6IiJyQOPN7HMzu8zMagcdjIiIlIopQEsza2ZmFYFzgFH77LMcOBrAzBoCrYGcYh4bE5rWq8ZTF2XxwqU9SUpMYPiLU7nw6cksWL0l6NBEJIJKowbG64TGWA8iVNW4ubv/NtLXERGRA3P3lsCfgPbANDP70MwuCDgsERGJIHffDVwNfEboGfwNd59rZiPMbER4tzuAPmY2m9AMgTe5+7r9HVv2dxE5/Vol88m1R/GXk9oxK28jgx8cx23vz+HHrZp2VSQeWKS7VpnZCcAX7h7zg8+ysrI8Ozs76DBEJMaZ2VR3zwo4hvrA/cD57p4YZCyHQ+2xiERKNLTJsSyW2uMNW3fyry8W8PKkZdSonMR1x7Tkgt5NSUoslU7oInKIDqc9jtjfXjMbFP5aFRhmZqcV/kTqOiIiUjxmVtPMLjKzT4DxwEpCU+aJiIjEvbrVKnLHKR345Np+dEqtxV8/+J7jHxjLV/NWqz6GSIyqEMFz9Qe+Bk4qYpsD70TwWiIicnAzgfeA2919QsCxiIiIBKJ1oxq8cGlPvpm/hr99OI/Lns/mqJb1+dOJ7WjdqEbQ4YnIIYhYAsPdbwt/vd3dlxTeZmbNInUdEREptkzXKyYRERHMjEFtGtK3RTIvTVzGA18uYPCDYzm7RzrXH9uK5BqVgg5RRIohkj0w9nob6LbPureA7qVwLRER2YeZPeDu1wGjzOwXCQx3P7nsoxIREQlexQoJXNq3Gad2TeHBrxby0sRljJqRz5UDW3BZ32ZUToq5MlEi5UrEEhhm1oZQpfta+9S8qAlUjtR1RETkoF4M/7w30ChERESiVJ1qFfnLye351RFN+ccnP3DPZ/N5eeIybjyhDSd3bkJCggUdoogUIZIleFsDQ4HahOpg7P10Ay6P4HVEROQA3H1q+GsXdx9T+AN0CTA0ERGRqJKZXJ0nf5XFq5f3pm71ilz3+gxOefQ7JuasDzo0ESlCJGtgvA+8b2ZHqFiciEhUuAh4cJ91FxexTkREpFw7onk9Rl3Vl3en53Pv5/M5Z+REjmnbgJsHt6FFAxX6FIkWpVEDY7qZXUVoOMl/ho64+6WlcC0REdmHmZ0LnAc0M7NRhTbVAPRKSUREpAgJCcbp3VM5sVNjnvluCY99s5jjHxjHOT3SuO4YFfoUiQaRHEKy14tAI+B4YAyQCmyJxInN7AQzm29mi8zs5iK2m5k9FN4+y8y6hdenmdk3ZjbPzOaa2bWRiEdEJEqNB+4Dfgj/3Pv5PXBCJC6g9lhEROJV5aRErhzQgtF/GMCFvZvy+pRc+t/zDQ98uYCtO3YHHZ5IuVYaCYwW7n4rsNXdnwdOBDqW9KRmlgg8AgwG2gHnmlm7fXYbDLQMf4YDj4XX7wZ+7+5tgd7AVUUcKyISF9x9mbuPdvcj9qmBMc3dS/zkpfZYRETKg3rVK/GXk9vzxfX9GdA6mQe+XEj/e0bz4sRl7NpTEHR4IuVSaSQwdoV/bjSzDkAtICMC5+0JLHL3HHffCbwGDNtnn2HACx4yEahtZo3dfaW7TwNw9y3APCAlAjGJiEQdM/s2/HOLmW0u9NliZpsjcAm1xyIiUm40q1+NR8/vzjtX9iGzfjVufW8Ox/9rLJ/OWYn7L2YrF5FSVBoJjJFmVge4FRgFfA/8MwLnTQFyCy3n8cuH3oPuY2YZQFdgUlEXMbPhZpZtZtlr164tacwiImXO3fuGf9Zw95qFPjXcvWYELqH2WEREyp1u6XV4/Te9eepXWSQmGCNemsZpj41nkmYsESkzEU9guPtT7v5juLtyprs3cPfHI3DqoiZj3jflecB9zKw68DZwnbsX+RbS3Ue6e5a7ZyUnJx92sCIiQTOz5mZWKfx9gJldY2a1I3HqItapPRYRkbhnZhzTriGfXHsUd5/ekZUbt3P2yIlc8uxk5q2MRCdHETmQiM9CYmbXF7F6EzDV3WeU4NR5QFqh5VRgRXH3MbMkQg/LL7v7OyWIQ0QkVrwNZJlZC+BpQr3iXgGGlPC8ao9FRKRcq5CYwNk90hnWJYXnxi/l0W8WMeShcZzaJYXfHduKtLpVgw5RJC6VxhCSLGAEoa7CKYSKtw0AnjSzG0tw3ilASzNrZmYVgXMIPYwXNgr4Vbj6fW9gk7uvNDMj9PA+z93vL0EMIiKxpCBctPNU4AF3/x3QOALnVXssIiJCaMaSEf2bM+7GQQzvl8lHs1dy9H1j+Muouaz7aUfQ4YnEndJIYNQDurn7793994QSGslAP+Diwz1p+CH8auAzQkXf3nD3uWY2wsxGhHf7GMgBFgFPAleG1x8JXAgMMrMZ4U9J30CKiES7XWZ2LnAR8GF4XVJJT6r2WERE5H/VqprELYPbMvoPAzitWwovTlxGv39+w32fz2fz9l0HP4GIFEvEh5AA6cDOQsu7gKbu/rOZlSgN6e4fE3ooLrzu8ULfHbiqiOO+pejx2CIi8ewSQj3i7nT3JWbWDHgpEidWeywiIvJLjWtV4a7TOzG8Xyb3fbGAf3+9iBcnLuOK/s25qE8GlZMSgw5RJKaVRg+MV4CJZnabmd0GfAe8ambVCM1IIiIiZcDdvwduAGaHp7XOc/e7Ag5LREQk7mUmV+eR87rx4W/70jm1Nv/45Af63/MNL01cxs7dBUGHJxKzSmMWkjuAy4GNhIp3jnD32919q7ufH+nriYhI0cxsALAQeAR4FFhgZv2CjElERKQ86ZBSi+cv7clrw3uTVqcqf3pvDkffP5q3p+axp2DfCbxE5GBKowcGQBVgs7s/ACwLd1sWEZGydR9wnLv3d/d+wPHAvwKOSUREpNzpnVmPN0ccwbOX9KBm5SR+/+ZMTnhgLJ/MXklo1KWIFEfEExjhYSM3AbeEVyURoTHXIiJySJLcff7eBXdfQASKeIqIiMihMzMGtm7AB1f35dHzu1HgzhUvT+Okh7/l6x9WK5EhUgyl0QPjVOBkYCuAu68AapTCdURE5MCyzexpMxsQ/jwJTA06KBERkfIsIcEY0rExn/+uP/ee2ZlNP+/i0ueyOe2x8Xy7cJ0SGSIHUBoJjJ3h6vMOEC7eKSIiZe8KYC5wDXAtoULKIw54hIiIiJSJxATjjO6pfP37AfzjtI6s3rSdC56exNkjJzJ5yYagwxOJSqUxjeobZvYEUNvMLgcuBZ4sheuIiMgBuPsOM3sY+AooAOa7+86DHCYiIiJlKCkxgXN7pnNatxRem5zLw98s4qwnJtC3RX1+d2wrujetE3SIIlEj4gkMd7/XzI4FNgOtgT+7+xeRvo6IiByYmZ0IPA4sBgxoZma/cfdPgo1MRERE9lWpQiIX9cngrKw0Xpq4jMfHLOb0x8bTv1Uyvzu2FV3SagcdokjgSqMHBuGEhZIWIiLBug8Y6O6LAMysOfARoASGiEiUMbOGQAqhYdgr3H11wCFJQKpUTOTyfpmc3zudFyYs44kxiznlke8Y1KYBvzumFR1TawUdokhgIp7AMLPTgLuBBoTe+Bng7l4z0tcSEZEDWrM3eRGWA6wJKhgREfklM+tCqLdcLSA/vDrVzDYCV7r7tIBCk4BVrViBEf2bc0Hvpjw/fikjx+Zw0sPfckzbBlx7tBIZUj6VRg+MfwInufu8Uji3iIgU31wz+xh4g9AbvTOBKeFEM+7+TpDBiYgIAM8Bv3H3SYVXmllv4FmgcxBBSfSoXqkCVw1swa+OCCUynhy3RIkMKbdKYxaS1UpeiIhEhcrAaqA/MABYC9QFTgKGBheWiIgUUm3f5AWAu08ENJuf/EeNyklcPagl3940kBuOa8WUpT9y0sPf8uvnpzArb2PQ4YmUidLogZFtZq8D7wE79q7Umz4RkbLl7pcEHYOIiBzUJ2b2EfACkBtelwb8Cvg0sKgkau1NZFzUJ+M/PTJOfvg7BrZO5tpjVOxT4ltpJDBqAtuA4wqtc0AJDBERERGRQtz9GjMbDAwjVMTTgDzgEXf/uDjnMLMTgAeBROApd79rn+1/AM4PL1YA2gLJ7r7BzJYCW4A9wG53zyr5XUlZKJzIeGHCMp4cl8Mpj3xHv1bJXHt0S02/KnGpNKZR1Rs/EREREZFiCk9vfVgzRJlZIvAIcCyhxMcUMxvl7t8XOv89wD3h/U8CfufuGwqdZqC7rzvc+CVYNSoncdXAFlzUJ4MXw4mM0x8bz1Et6/PbQS3p2axu0CGKRExp1MAQEREREZFiMLMKZvYbM/vEzGaZ2czw9xFmllSMU/QEFrl7jrvvBF4j1Jtjf84FXo1E7BJdqleqwBUDmvPtTQP5vyFtmbdyM2c9MYGznpjAtwvX4e5BhyhSYqUxhERERKKAmVUCTgcyKNTeu/vtQcUkIiK/8CKwEfgroR4UAKnARcBLwNkHOT6F/9bOIHyOXkXtaGZVgROAqwutduBzM3PgCXcfWcRxw4HhAOnp6QcJR4JWtWIFLu+XyYVHNOXVyct5YkwOFzw9ia7ptblmUEsGtE7GzIIOU+SwxFQPDDM7wczmm9kiM7u5iO1mZg+Ft88ys27FPVZEJA69T+gt3G5ga6FPiak9FhGJmG7ufoW7T3T3vPBnortfAXQtxvFF/Sa6v1ftJwHf7TN85Eh37wYMBq4ys36/OJn7SHfPcves5OTkYoQk0aByUiKXHNmMMTcO4M5TO7Bm8w4ueW4KJz38LZ/OWUlBgXpkSOyJeA+M0nrjV5zxfYQa3pbhTy/gMaBXMY8VEYk3qe5+QqRPqvZYRCSifjSzM4G33b0AwMwSgDOBH4txfB6hWUv2SgVW7Gffc9hn+Ii7rwj/XGNm7xIakjL2kO5AolqlComc36spZ2X9P3t3HSZnefVx/HtWk2zcN9m4h3g2ShISNMGCuxaaQqFIi7dvjdJidawUlwChQKEQJEAEQmzj7u7usnLeP+ZZWJZNssnO7MzO/j7XNdfMPHpuupwO57mlEe9NX8vTY5Zy02vTaFW3Mj8d1IJzOjUgKbFMPdeWciwSQ0jeB3YCUymwjGoYfDu+D8DM8sf3FfzROxR4xUMDvCaaWXUzSydUTDnauT+wbPNeLv3XhDA2QUSkVH1jZh3dfXaYr6t8LCISPpcBjwBPmVl+waI6MDrYdzRTgFZm1gxYG5xzReGDzKwacBJwVYFtaUCCu+8OPp8OaJhhnEpOTOCSzEZc2C2Dj2av56nRS7jzrZn8ddRibjqpBRd2b0hqUmK0wxQ5okgUMCLyxI/ije8r6piGxTwX+P4Yv8rpLUoWsYhIdPUDrjOz5YQKyga4u3cq4XWVj0VEwsTdVxDMc2FmtQA7lhVB3D3HzG4FPiW0jOoL7j7XzG4K9j8THHo+8Jm7FxxKWA94L5gPIQkY7u6flLBJEuMSE4xzOzfg7I7pfLFgE098uZgH3pvN379YxI/7N+eKXo2plKKpEiU2ReIvM1JP/Iozvu9wxxR7bGAwcdGzAJmZmf7WT/ocS4wiIj8w4qao3XpIhK6rfCwiZVYUc/JRufvWgt/N7DR3H1WM80YCIwtte6bQ95eAlwptWwZ0Ps5wpYxLSDBOa1+PU9vV5eslW3hq9FL+8NF8nhy9hOv6NuPavk2oXikl2mGKfE8kChiReuJXnPF9hzsmpRjniojEBTOr6u67gN0RuoXysYhI6Xge0LIfElFmRv9Wdejfqg5TV27n6TFL+Ovni3h23FKu7N2EG/s1o27VCtEOUwSITAEjUk/8ijO+7wPg1mBMdS9gp7uvN7PNxThXRCReDAfOJjQXUeFeDw40L+H1lY9FRMLEzD443C6gVmnGItK9SQ2eu7YHCzbs4qnRS3nuq2W8NH4FF3bP4CcDmtO0dlq0Q5RyLmwFjEg/8Svm+L6RwJnAEmAfcP2Rzo1EnCIi0ebuZwfvzSJ0feVjEZHw6U9oYs09hbYboUmTRUpd2/pV+cflXfnF6a15dtwy3p66hremrGJIx3RuPqkFHRpWi3aIUk5ZaIL4MFzI7EN3PzsYOvKDJ37uXtInfqUuMzPTs7Kyoh2GiJRxZjbV3TOjHUdZpnwsIuESaznZzD4GHnX30UXsG+fuA6IQ1mEpH5dPm3Yf4IWvV/DaxJXsOZhD/1a1ufmkFvRpUYtgEliRY3Y8+ThsPTAi/cRPRERERCTeuPthh1/HWvFCyq+6VSpw35C23DywBa9PWskLX6/giucm0SmjGj8Z0ILBHeqTmKBChkReQrQDEBERERGRIzOzCdGOQaRaxWR+OrAlX987iD+e35Fd+7O5Zfg0TvnzGF6ftJID2bnRDlHinBb4FRGJM2ZW80j73X1bacUiIiJho2UgJGZUSE7kil6NubRHIz6du4Fnxi7ll+/N4a+jFnFd36Zc1VtLsEpkqIAhIhJ/ilp9JF84ViEREZHSF56J60TCKDHBOLNjOkM61GfCsq08O24Zj3+2iKfGLOXSHo24oV8zMmpUinaYEkfCuQqJnviJiMQAzUUkIiIipcnM6NuiNn1b1GbBhl08O24Zr05YySsTVnJ2p3R+3L+5Vi6RsAhnDww98RMRiTFmVgNoRYGux+4+LnoRiYhIUcysvbvPK7RtoLuPyf9a+lGJHLu29avyl0u6cNfpbXjh6+W8OWU1789YR98WtRg2oDknta6jlUvkuIVzFRI98RMRiSFmdiNwO5ABzAB6AxOAk6MYloiIFG2Emb0KPEqo6PwokAn0CfZfHa3ARI5Hg+oV+dXZ7fnZKa14c/IqXhy/gutenEKbelW4sX8zzu3SgNSkxGiHKWVMRFYhMbMaZtbTzAbkvyJxHxEROaLbgR7ASncfBHQFNkc3JBEROYxeQCPgG2AKsA44MX+nu8+JUlwiJVKtYjI/OakF4+4ZxJ8v7owZ3P2fWfR/ZDRPjl7Cjn2Hoh2ilCFhn8RTT/xERGLGAXc/YGaYWaq7LzCzNtEOSkREipQN7AcqEuqBsdzd86Ibkkj4pCQlcGH3DC7o1pCvFm/h318t47FPF/LEl0u4ODODH53YjKa106IdpsS4SKxCkv/Eb6K7DzKztsDvInAfERE5sjVmVh34LzDKzLYTeqInIiKxZwrwPqHf0bWAf5nZRe5+UXTDEgkvM2NA6zoMaF2HBRt28dxXy3lj8ipenbiS09rV48b+zenRtIbmyZAiRaKAoSd+IiIxwN3PDz7+1sxGA9WAT6IYkoiIHN4N7p4VfN4ADDUzzXshca1t/ao8fnFn7jmjDa9MWMlrk1by2byNdMqoxg39mnFmx3SSEyMy64GUUZH4ayj8xO999MRPRKTUmFnV4L1m/guYDXwNVI5qcCIiUqQCxYuC216NRiwipa1u1QrcdUYbJtx3Cn84rwN7DuRw+5sz6P/IaJ4es5Sd+7KjHaLEiLD3wNATPxGRqBsOnM33l7cu+K5lrUVERCTmVExJ5KreTbiiZ2PGLNrEc18t55FPFvCPLxZzUfcMrjuxKS3q6FlMeRa2AoaZVXX3XcGTvnyzg/fKwLZw3UtERA7P3c+20MDRk9x9VbTjERERETkWCQnGyW3rcXLbesxbt4sXxi/nrSmreXXiSk5uW5cfndiME1vW0jwZ5VA4e2DoiZ+ISIxwdzez94Du0Y5FRERE5Hi1bxCaJ+PewW15fdJKXpu4kquen0SbelW4/sSmnNe1IRWSE6MdppSSsM2BUeiJX3N3b1bwPVz3ERGRYptoZj2iHYSIiIhISdWpksodp7Zm/H0n89hFnUhIMO57dzZ9/vQFj326gA07D0Q7RCkFYZ0DQ0/8RERiyiDgJjNbAewl6BHn7p2iGpWIiIjIcUpNSuTizEZc1D2DScu38cLXy3lqzFL+NXYZQzqmc/2JTenWuEa0w5QIicQyqhPNrIe7TwnXBYN5Nd4CmgIrgEvcfXsRxw0G/g4kAs+5+8PB9seAc4BDwFLgenffEa74RERi1JBwX1D5WERERGKBmdG7eS16N6/F6m37ePmbFbyVtZr/zVxH50bVua5vE87smE5qkoaXxJNILKM6iFARY6mZzTKz2WY2q4TXvA/4wt1bAV8E37/HzBKBJwn9YG8PXG5m7YPdo4AOwVPHRcD9JYxHRCTmuftKoBFwcvB5HyXP+8rHIiIiElMa1azEr85uz8T7T+HBoSew+0A2d741kxMfHs1fRy1i0y4NL4kXkeiBEfYnfsBQYGDw+WVgDHBvoWN6AkvcfRmAmb0ZnDfP3T8rcNxE4KIIxCgiElPM7DdAJtAGeBFIBl4DTizBZZWPRUREJCalpSZxdZ+mXNmrCV8v2cJL36zg718s5qkxSzizYzrX9m1K10bVtXpJGRb2Aoa7rzSzfkArd3/RzOoQWka1JOq5+/rg+uvNrG4RxzQEVhf4vgboVcRxPyLU/blIZjYMGAbQuHHj4w5YRCQGnA90BaYBuPs6M6tSwmsqH4uIiEhMS0gwBrSuw4DWdVi+ZS+vTFjBf7LW8P6MdXTKqMa1fZpydmcNLymLwj6EJHjidy/fdQvOf+J3tPM+N7M5RbyGFvfWRWzzQvf4JZADvH64i7j7s+6e6e6ZderUKeatRURi0iF3d4JcaGZpxTlJ+VhERETiRbPaafzmnBOY8EBoeMm+Q7n84u2Z9P3Tlzz+6ULW79wf7RDlGERiCMlxPfFz91MPt8/MNppZevC0Lx3YVMRhawiN9c6XAawrcI1rgbOBU4If9CIi8W6Emf0LqG5mPybU4+G5o52kfCwiIiLxpnIwvOSq3k0Yv2QrL09YwZNjlvD02KWc3r4eV/dpQp/mtTS8JMZFooBxKFhO9Zie+B3FB8C1wMPB+/tFHDMFaGVmzYC1wGXAFUEMgwn1CjnJ3feFIR4RkZjn7o+b2WnALkLzYPza3UeV8LLKxyIiIlJmmRn9WtWmX6varN62j9cnreLNKav4eM4GWtWtzDV9m3J+14ZUTo3EfypLSUViFZLCT/w+pxhP/I7iYeA0M1sMnBZ8x8wamNlIAHfPAW4FPgXmAyPcfW5w/hNAFWCUmc0ws2dKGI+ISMwzs0fcfZS73+3ud7n7KDN7pISXVT4WERGRuNCoZiXuG9KWifefwmMXdSI1OYH/++8cev/xC37z/hwWb9wd7RClEItE793gid/phMZBfxqGJ35RkZmZ6VlZWdEOQ0TKODOb6u6ZUbjvNHfvVmjbrGAJ0zJF+VhEwiVaOTleKB9LPHN3pq/ewasTVvLRrPUcys2jT/NaXN2nCae1r0dyYiSe/5dfx5OPw94vJnjidy8wqohtIiISYWZ2M/BToLmZzSqwqwowPjpRiYhIpATD8/4OJALPufvDhfbfDVwZfE0C2gF13H3b0c4VKU/MjG6Na9CtcQ1+eVY7RmSt5vWJq/jp69OoVzWVy3s25vKejalXtUK0Qy23IlFCOq2IbUMicB8RESnacOAcQvNVnFPg1d3dr4pmYCIiEl5mlgg8Sej3dnvgcjNrX/AYd3/M3bu4exdCKwWODYoXRz1XpLyqXTmVnw5sybh7BvHcNZm0qV+Vv32+mL4Pf8nNr03lmyVb0FzkpS9sPTD0xE9EJDa4+05gJ3A5gJnVBSoAlc2ssruvimZ8IiISVj2BJe6+DMDM3gSGAvMOc/zlwBvHea5IuZOYYJzavh6ntq/Hii17GT55FSOyVvPxnA00r5PGVb2acGG3DKpVSo52qOVCOHtg6ImfiEgMMbNzgsk2lwNjgRXAx1ENSkREwq0hsLrA9zXBth8ws0rAYOCdYznXzIaZWZaZZW3evDksQYuURU1rp/HAme2YeP8p/OWSzlSrmMzvP5xHrz99zt1vz2Tm6h3qlRFhYeuBoSd+IiIx5w9Ab+Bzd+9qZoMIcrSIiMQNK2Lb4f4L6hxgvLtvO5Zz3f1Z4FkITeJ5PEGKxJMKyYlc0C2DC7plMHfdTl6buIr3Z6zl7alr6NCwKlf2asLQLg2olKKlWMMt7HNg6ImfiEjMyHb3rUCCmSW4+2igS5RjEhGR8FoDNCrwPQNYd5hjL+O74SPHeq6IFOGEBtX40wUdmfTAKTw49ASyc5z7351Nr4e+4P/+O4f563dFO8S4EomSkJ74iYjEhh1mVhkYB7xuZpuAnCjHJCIi4TUFaGVmzYC1hIoUVxQ+yMyqAScBVx3ruSJydFUqJHN1n6Zc1bsJU1du5/VJq3grazWvTlxJt8bVubJXE87qlE6F5MRoh1qmRWIVEj3xExGJDUOB/cCdwCfAUkLdh0VEJE64ew5wK/ApMB8Y4e5zzewmM7upwKHnA5+5+96jnVt60YvEHzMjs2lN/nppFybdfwq/OqsdO/Zl84u3Z9Lrj1/wu//NZfHG3dEOs8yKRA8MPfETEYkB+T9Szawq8L8ohyMiIhHi7iOBkYW2PVPo+0vAS8U5V0TCo0ZaCjf2b84N/Zoxcdk2hk9exWsTV/Li+BX0aFqDK3o1ZkgH9co4FpEoYAwFDhB64nclUA34fQTuIyIiR2BmPyGUf/cDeYQma3OgeTTjEhERESlPzIw+LWrRp0Uttu5pzzvT1vDG5NXc+dZMfvvBPC7slsHlPRvRql6VaIca88JewNATPxGRmHEXcIK7b4l2ICIiIiICtSqnMmxAC37cvzkTlm1l+KRVvDpxBS+MX05mkxpc1rMxZ3VMp2KKemUUJewFDD3xExGJGUuBfdEOQkRERES+z8zo26I2fVvUZuueg7w7bS1vTF7FXW/P5Hf/m8v5XRtyWY/GtG9QNdqhxpRIDCHREz8RkdhwP/CNmU0CDuZvdPfboheSiIiIiBRUq3IqPx7QnBv7N2Py8m28MXkVb05ZzSsTVtI5oxqX9mjMuV0aUDk1Ev/5XrZE4p+AnviJiMSGfwFfArMJ9YgTERERkRhlZvRqXotezWvx232HeG/6Wt6cvJoH3pvNHz6ax9md0rmsZ2O6NqqOmUU73KiIRAFDT/xERGJDjrv/PNpBiIiIiMixqV4phetPbMZ1fZsyY/UO3py8mv/NWseIrDW0rleZSzIbcUG3DGqmpUQ71FIViQKGnviJiMSG0WY2jNCEygULytuiF5KIiIiIFJeZ0bVxDbo2rsH/ndOe/81cx1tTVvOHj+bzyCcLOP2E+lya2Yh+LWuTkBD/vTIiUcDQEz8RkdhwRfB+f4FtmlRZREREpAyqnJrE5T0bc3nPxizcsJu3pqzm3elr+GjWehpWr8hF3TO4ODODjBqVoh1qxCRE4JqjzWyYmaWbWc38V0kuGFxjlJktDt5rHOa4wWa20MyWmNl9Rey/y8zczGqXJB4RkbLA3ZsV8SpR8UL5WERERCT62tSvwq/Pac+kB07hn5d3pXmdNP7x5WL6Pzqaq5+fxAcz13EgOzfaYYZdJAoYVxDMgwFMDV5ZJbzmfcAX7t4K+CL4/j1mlgg8CQwB2gOXm1n7AvsbAacBq0oYi4hIeaZ8LCIiIhIjUpMSOadzA169oRdf3TOI209pxbLNe7ntjen0+uMX/Ob9OcxZuzPaYYZN2IeQuHuzcF8TGAoMDD6/DIwB7i10TE9gibsvAzCzN4Pz5gX7/wrcA7wfgfhERMoL5WMRERGRGJRRoxJ3nNqa205uxTdLt/JW1mremLKalyespH16VS7JzGBol4bUKMMTf5aVhWTruft6AHdfb2Z1izimIbC6wPc1QC8AMzsXWOvuM8vrcjMiImGifCwiIiISwxISjH6tatOvVW127svmg5lrGZG1ht/+bx5/HLmA09rX46LMDAa0qkNiGZv4M2YKGGb2OVC/iF2/LO4litjmZlYpuMbpxYxjGDAMoHHjxsW8tYhI7LFQheBKoLm7/97MGgP13X3yUc5TPhYRERGJA9UqJXN1n6Zc3acp89bt4u2pq/nv9LV8NHs99aqmckG3DC7qnkGLOpWjHWqxxEwBw91PPdw+M9toZunB0750YFMRh60BGhX4ngGsA1oAzYD8p30ZwDQz6+nuG4qI41ngWYDMzEw/3vaIiMSApwgtZ30y8HtgN/AO0ONIJykfi4iIiMSf9g2q8psGJ3D/kHZ8uWAjb2et4dlxy3h6zFK6Na7OxZmNOKtTOlUrJEc71MMK+ySeFnKVmf06+N7YzHqW8LIfANcGn6+l6HHTU4BWZtbMzFKAy4AP3H22u9d196bu3pTQD+tuRf1YFhGJM73c/RbgAIC7bwdKOuhR+VhERESkDEtJSmBwh3Sev64HE+47mfuHtGXXgRzuf3c2PR/6nNvfnM5XizeTmxd7z48i0QPjuJ74HcXDwAgzu4HQrPUXA5hZA+A5dz/T3XPM7FbgUyAReMHd55bgniIiZV12sCKIA5hZHUL5uSSUj0VERETiRN2qFfjJSS0YNqA5M9fs5D9TV/PBjHW8P2Md6dUqcEG3hlzYLYPmMTLEJBIFjF7u3s3MpkPoiV/wBO64uftW4JQitq8DzizwfSQw8ijXalqSWEREypB/AO8Bdc3sIeAi4FcluaDysYiIiEj8MTO6NKpOl0bV+dVZ7fl8/kb+M3UNT49ZypOjQ0NMLuyewdmdGlCtYvSGmESigBGJJ34iInKM3P11M5tKqOBgwHnuPj/KYYmIiIhIDKuQnMjZnRpwdqcGbNx1gP9OX8t/pq7hl+/N4Xf/m8fp7etxYfcM+resTVJi2GelOKJIFDDC/sRPRESOnZn9HXjL3Z+MdiwiIiIiUvbUKzDEZPbanbwzdQ3vz1zHh7PWU6dKKud1acAF3TJol161VOIJewFDT/xERGLGNOBXZtaaUGH5LXfPinJMIiIiIlLGmBmdMqrTKaM6vzyrPV8u2MS709bw0jcr+PdXy2mfXpULujVkaJeG1KmSGrE4wl7A0BM/EZHY4O4vAy+bWU3gQuARM2vs7q2iHJqIiIiIlFGhVUzqM7hDfbbtPcT/Zq7j3Wlr+MNH8/nTxwvo36o2F3TL4PT29aiQnBjWe0diCIme+ImIxJaWQFugKTAvuqGIiIiISLyomZbCtX2bcm3fpizZtJt3p63lv9PXctsb06mcmsSZHetzftcMejWrSUKClfh+kRhCoid+IiIxwMweAS4AlgIjgAfdfUdUgxIRERGRuNSybhXuGdyWu05vw8TlW3l32lo+mrWeEVlraFi9IkO7NOCCbg1pWbfKcd8jEj0w8umJn4hIdC0H+rj7lmgHIiIiIiLlQ0KC0bdFbfq2qM2DQzvw2bwNvDttLc+MXcpTY5bSoWFVzu+acVzXjsQcGHriJyISRWbW1t0XAJOBxmbWuOB+d58WnchEREREpDypmJLI0C6hyT037T7A/2au573pa3jww+Pr4xCJHhh64iciEl0/B4YBfy5inwMnl244IiIiIlLe1a1SgRv6NeOGfs1YvHE3rR859muErYChJ34iIrHB3YcFH4e4+4GC+8ysQhRCEhERERH5Vqt6xzcPRjh7YOiJn4hIbPkG6FaMbSIiIiIiMS9sBQw98RMRiQ1mVh9oCFQ0s65A/ppVVYFKUQtMRERERKQEIjEHhp74iYhE1xnAdUAGoV5x+QWMXcADUYpJRERERKREwjkHhp74iYjEAHd/GXjZzC5093eiHY+IiIiISDiYu4fnQmbXEnrilwlM4ftP/F5293fDcqNSZGabgZXRjiMMagPxvipMvLdR7Svb2rj78c1UVAJm9kfg0fylrM2sBvALd/9VacdSUnGUjyH+/97VvrIv3tsYlZwcL5SPy5R4bx/EfxvjvX3HnI/DVsD49oJ64hdzzCzL3TOjHUckxXsb1b6yLVrtM7Pp7t610LZp7q4hfVGkv/eyLd7bB/HfxnhvnxRfvP8txHv7IP7bqPb9UEIE4uhuZtXzv5hZDTP7QwTuIyIiR5ZoZqn5X8ysIpB6hONFRERERGJWJAoYQ/K7KwO4+3bgzAjcR0REjuw14Aszu8HMfgSMAl6OckwiIiIiIsclEquQJJpZqrsfBD3xixHPRjuAUhDvbVT7yraotM/dHzWz2cAphOYletDdP41GLPI9+nsv2+K9fRD/bYz39knxxfvfQry3D+K/jWpfIZGYA+Me4FzgRcCBHwEfuPujYb2RiIiIiIiIiJQbYS9gAJjZEL574veZnviJiJQ+M+sN/BNoB6QAicBed68a1cBERERERI5DRAoYIiISfWaWBVwGvE1oietrgJbu/suoBiYiIiIichzCPomnmfU2sylmtsfMDplZrpntCvd9pGhm9oKZbTKzOQW21TSzUWa2OHivEc0YS8LMGpnZaDObb2Zzzez2YHtctNHMKpjZZDObGbTvd8H2uGhfPjNLNLPpZvZh8D3e2rfCzGab2YygiBC1Nrr7EiDR3XPd/UVgUGncV5SP46SNysllvH2xlI8lupSTy3YblY/jpn0lzsmRWIXkCeByYDFQEbiRUBdmKR0vAYMLbbsP+MLdWwFfBN/LqhzgF+7eDugN3GJm7YmfNh4ETnb3zkAXYLCFhgHES/vy3Q7ML/A93toHMMjduxRY2zoabdxnZinADDN71MzuBNJK4b4S8hLKx2W9jcrJ8dG+WMjHEn0voZxcltuofBwf7YOS5mR3D+sLyAreZxXY9k2476PXEf83aArMKfB9IZAefE4HFkY7xjC29X3gtHhsI1AJmAb0iqf2ARlBcjoZ+DDYFjftC9qwAqhdaFuptxFoAlQAqgK/Af5CaAhJ1P8ZlZeX8nH8tFE5OfqxHmf7YiIf6xUbL+Xk+Gij8nH0Yy1BG0uckyPRA0NP/GJPPXdfDxC8141yPGFhZk2BrsAk4qiNQdexGcAmYJS7x1X7gL8B9wB5BbbFU/sgtALTZ2Y21cyGBdtKvY3uvtLdD7j7Lnf/nbv/3ENDSiR64u1vHYjffAzKyXHQvpjIxxKz4vJvIV5zsvJxmW8fhCEnJ0UgqKsJDU25FbgTaARcGIH7SDlmZpWBd4A73H2XmUU7pLBx91ygi5lVB94zsw5RDilszOxsYJO7TzWzgVEOJ5JOdPd1ZlYXGGVmC6IdkEikxHM+BuXkOKB8LOVKPOdk5eO4UOKcHPYChruvDD4eAH4X7uvLcdloZunuvt7M0glVLcssM0smlJhfd/d3g81x1UYAd99hZmMIjdeMl/adCJxrZmcSDG0ws9eIn/YB4O7rgvdNZvYe0JM4a6Mct7j6Oygv+RiUk6MaZQkoH8tRxNXfQnnJycrHZVc4cnIkhpBI7PkAuDb4fC2hMXFlkoXKyM8D8939LwV2xUUbzaxOUFXGzCoCpwILiJP2ufv97p7h7k0JLe/5pbtfRZy0D8DM0sysSv5n4HRgDqXYRjN7NXi/PVL3kOMWT3/rcZ2PQTk5OKzMti8W8rHEvLj5W4j3nKx8DJTh9kH4crIFk2VInDCzN4CBQG1gI6GJ+/4LjAAaA6uAi919W5RCLBEz6wd8Bczmu/FhDxAa41fm22hmnYCXgURCBcYR7v57M6tFHLSvoKB73F3ufnY8tc/MmgPvBV+TgOHu/lBpttHM5gFDCP0fwkDge/1Hy+o/27JG+Tgu2qicXIbbFwv5WGKHcnLZbqPycdlvX7hyctgKGGb2qrtfbWa3u/vfw3JRERE5ZmZ2G3Az0BxYy/cLGO7uzaMSmIiIiIhICYSzgKEnfiIiMcTMnnb3m6Mdh4iIiIhIOISzgKEnfiIiMcbMOgP9g6/j3H1WNOMRERERETleYZ8DQ0/8RERiQ1BYHgbkz0R+PvCsu/8zelGJiIiIiByfiEziqSd+IiLRZ2azgD7uvjf4ngZMcPdO0Y1MREREROTYhX0Z1eCJ3+tA3eD1upn9LNz3ERGRozIgt8D3XArNTyQiIiIiUlaEvYAB3Aj0cvdfu/uvgd7AjyNwHynnzKy+mb1pZkvNbJ6ZjTSz1sdxnTFmlhmJGI8xjuvM7IloxyFx5UVgkpn91sx+C0wktEa8SFgpH4uIxA7lZIlnSRG4pp74ScSZmRFaR/hld78s2NYFqAcsimJoUWNmie6ee/Qjpbxw97+Y2RigH6E8fL27T49uVBJvlI9/SPlYRKJFOfmHlJPjSyR6YOiJn5SGQUC2uz+Tv8HdZ7j7V2b2qpkNzd9uZq+b2blmlmhmj5vZbDObVdTQJjM73cwmmNk0M3vbzCoXccwYM3vEzCab2SIz6x9s/1512Mw+NLOBwec9wTlTzexzM+sZXGeZmZ1b4PKNzOwTM1toZr8pcK2rgvvNMLN/mVligev+3swmAX1K8M9T4pS7T3P3f7j731W8kAhRPkb5WERihnIyysnxLOwFDHf/C3A9sA3YTuiJ39/CfR8p9zoAUw+z7zlCf4OYWTWgLzCS0GoMzYCuwSSGrxc8ycxqA78CTnX3bkAW8PPD3CPJ3XsCdwC/OcwxBaUBY9y9O7Ab+ANwGqFVIX5f4LiewJVAF+BiM8s0s3bApcCJ7t6FUK+mKwtcd46793L3r4sRh4hIuCkff3dd5WMRiTbl5O+uq5wchyIxhAR3nwZMi8S1RY7G3cea2ZNmVhe4AHjH3XPM7FTgGXfPCY7bVujU3kB7YLyZAaQAEw5zm/xlKacCTYsR1iHgk+DzbOCgu2eb2exC549y960AZvYuoa7/OUB3YEoQV0VgU3B8LvBOMe4vIlLqlI9FRGKHcrLEg4gUMERKwVzgoiPsf5VQBfYy4EfBNgOOtG6wEUqOlxfj/geD91y++/coh+/3aqpQ4HO2f7dmcV7++e6eZ2YF/z0sHJ8Hcb3s7vcXEccBjemTw7HQsqn7g7+z1kBb4GN3z45yaBJflI9DlI9FJBYoJ4coJ8epSMyBIVIavgRSzezbFW7MrIeZnRR8fYlQ1zXcfW6w7TPgpvxkaGY1C11zInCimbUM9leyY5uxeQXQxcwSzKwRoa5ux+o0M6tpZhWB84DxwBfARUG1nGB/k+O4tpQ/44AKZtaQ0N/R9YT+3RAJJ+VjEZHYoZwscS3sBQwzSzOzhOBzawtNDJMc7vtI+RZUas8nlMyWmtlc4LfAumD/RmA+oUll8z0HrAJmmdlM4IpC19wMXAe8YWazCCXrtscQ1nhgOaHub49zfMOoviZUGZ9BqFtflrvPIzTu8LMgrlFA+nFcW8ofc/d9hLqJ/tPdzyfUBVQkbJSPlY9FJHYoJysnxzv7rsdOmC5oNhXoD9Qg9MedBexz9yuPeKJIGJlZJUJJspu774x2PCLRYGbTgZ8CfwVucPe5Zjbb3TtGOTQpR5SPRURih3KylHWRGEKiJ34SVcFERAsI/f0pMUt5dgdwP/BeULxoDoyObkhSnigfi4jEDuVkiQeR6IGhJ34iIjEmGNpX2d13RTsWEREREZHjEYkeGHegJ34iIlFnZsPNrGqwGsk8YKGZ3R3tuEREREREjkfYe2B87+J64iciEjVmNsPdu5jZlYTWSb8XmOrunaIcmoiIiIjIMYvEKiR64iciEhuSg1WgzgPed/dsjrzOu4iIiIhIzIrEEJL2QY+L84CRQGPg6gjcR0REjuxfhNZeTwPGBWujq0eciIiIiJRJkZjEcy7QBRgOPOHuY81sprt3DuuNRETkmJlZkrvnRDsOEREREZFjFYkeGHriJyISA8ysmpn9xcyygtefCeVmEREREZEyJ6KTeH57Ez3xExEpdWb2DjAHeDnYdDXQ2d0viF5UIiIiIiLHJxJDSKoBvwEGBJvGAr93951hvZGIiBxR/iokR9smIiIiIlIWRGIIyQvAbuCS4LULeDEC9xERkSPbb2b98r+Y2YnA/ijGIyIiIiJy3CLRA0NP/EREYoCZdQZeAaoFm7YD17r7rOhFJSIiIiJyfCLRA6PwE7+fA23MbImZ3Vf4YAv5R7B/lpl1K7BvsJktLHyumV1sZnPNLM/MMgtsb2pm+81sRvB6psC+7mY2O7jWP8zMItB2EZGY4e75K0B1Ajq5e1fg5CiHJSIiIiJyXCJRwLgJeNLMVpjZCuBPwAVAe+ByM2tf6PghQKvgNQx4GsDMEoEng/2Fz50TXHNcEfdf6u5dgtdNBbY/HVw//16DS9pQEZGywN13uXv+alA/j2owIiIiIiLHKewFjEJP/G4AxgBt3P0Q8CYwtNApQ4FXPGQiUN3M0oGewBJ3X1b4XHef7+4LixtTcL2q7j7BQ2NmXgHOK0k7RUTKKPU+ExEREZEyKSlSF3b3XWZWA1hN6Inf34A1QK9ChzYMjsm3JthW1PbC5xalmZlNJzR56K/c/avgWmuKuMcPmNkwQj01SEtL6962bdti3FJE5PCmTp26xd3rRDuOQOTXzo6A2rVre9OmTaMdhojEgRjLyWWO8rGIhMvx5OOIFTACVugdfvjjuaingX6E7UeyHmjs7lvNrDvwXzM74Viu5e7PAs8CZGZmelZW1lFuKSJyZGa2spTvt5uic5wBFUszlnBp2rQpysciEg6lnZPjjfKxiITL8eTjSBcw1gCN+O6HdAaw7jDHUOiYlMNsPyx3PwgcDD5PNbOlQOvgHhnHci0RkbLK3atEOwYRERERkXALWwHjCE/8KgN5ZpYCXAZcUWj/B8CtZvYmoSEiO919vZltBlqZWTNg7WHOLRxDHWCbu+eaWXNCk3Uuc/dtZrbbzHoDk4BrgH8ed2NFREREREREpFSFrYBxuCd+ZnYmofkv5gMvuPtcM7spOOcZYCRwJrAE2AdcH+zLMbNbgU+BxPxzg2ueT6gAUQf4yMxmuPsZwADg92aWA+QCN7n7tiCUm4GXCHWf/jh4iYiIiIiIiEgZEOkhJLj7SEJFioLbninw2YFbintusP094L0itr8DvHOYa2UBHY4l9uzcMjnXnYhI3Nm651C0QxAREWDt9v1s23uImmkp0Q5FRMqhsC+jGk9Wbt3LgezcaIchIlLubdlzkFC9W0REomn7vkOc9pex/G/mOuVlESl1KmAcwf7sXO5/d7aSs4hIlB3KzWPF1n3RDkNEpNxrWbcyDWtU5GdvTGfYq1PZuOtAtEMSkXJEBYwjqFe1Au9NX8tzXy2PdigiIuXe2IWboh2CiEi5VyE5kXdv7ssDZ7Zl3KLNnPqXsbw1ZZUe+IlIqVAB4wjqVknlzI71+dPH8xm7aHO0wxERKbdSEhMYt3hLtMMQEREgKTGBYQNa8MkdA2iXXpV735nNVc9PYuXWvdEOTUTinAoYR/HYRZ1pXa8KPxs+jeVblJRFRKKhSoUkJizdysEczUskIhIrmtVO480f9+bB8zowc/VOzvjbOJ4dt5Sc3LxohyYicUoFjKNIS03i39dkkphg3PjyFHYfyI52SCIi5U7lCknsz85l6ort0Q5FREQKSEgwru7dhFE/H0C/lnX448gFnPfUeOas3Rnt0EQkDqmAUQyNalbiqSu7s3LrPm5/cwa5eRrjJyJSmiqnJpGUYIxdrOF8IiKxKL1aRf59TXeeurIbG3cdZOiT4/nTx/PZf0g950QkfFTAKKY+LWrxm3NP4MsFm3jww3nRDkdEpFxJMCOzaQ3GLdI8GCIiscrMOLNjOp/feRIXd8/gX2OXcfrfxmouOREJGxUwjsHVvZtwQ79mvPTNCl74WiuTiIiUpgGt6zB//S427daSfSIisaxapWQevrATb/y4N8mJCVz7wmRue2M6m3cfjHZoIlLGqYBxjB44sx1nnFCPBz+ax2dzN0Q7HBGRcmNAqzoAfKVeGCIiZUKfFrX4+Pb+3HFqKz6Zs4FT/jyGNyevIk/DsUXkOKmAcYwSE4y/XdqVTg2rcdub05m5eke0QxIRKRfap1elduUUxmkeDBGRMiM1KZE7Tm3NyNv70y69Kve9O5vLnp3Ioo27ox2aiJRBKmAch4opiTx3bQ9qV07lhpezWL1tX7RDEhGJewkJRv9Wdfhq8RY9vRMRKWNa1q3Mm8N68+hFnVi0aTdn/v0rHvlkgSb5FJFjogLGcapTJZWXru/BoZxcrn9pCjv3a3lVEZFIG9C6Ntv2HmLuul3RDkVERI6RmXFJZiO+/MVALujWkKfHLOW0v47lywUbox2aiJQRKmCUQMu6VXjm6u6s3LqXYa9kcSBbFWQRkUjqH8yDoWEkIiJlV820FB69qDMjftKHismJ/OilLH7yahbrduyPdmgiEuNUwCihvi1q8/jFnZm0fBs/e2M6Obl50Q5JRCRu1a6cygkNqmpJPhGRONCzWU0+uq0/9w5uy9hFmzn1L2N5ZuxSDuXo97SIFE0FjDAY2qUhvz2nPaPmbeSB92bjrrHZIiKRMqB1Haat3M7uAxq6JyJS1qUkJXDzwBaMuvMkTmxZm4c/XsCZ//iKCUu3Rjs0EYlBES9gmNlgM1toZkvM7L4i9puZ/SPYP8vMuh3tXDO72MzmmlmemWUW2H6amU01s9nB+8kF9o0JrjUjeNUNZzuvO7EZt53ckhFZa3j4kwXhvLSIiBQwoFUdcvJcP25FROJIo5qV+Pc1mTx/bSYHsnO5/N8TuePN6WzafSDaoYlIDIloAcPMEoEngSFAe+ByM2tf6LAhQKvgNQx4uhjnzgEuAMYVutYW4Bx37whcC7xaaP+V7t4leG0KQxO/587TWnNV78b8a+wynh23NNyXFxERoHuTGqSlJGoYiYhIHDqlXT0+//lJ3HZyS0bO3sApj4/l+a+Xk61h2iJC5Htg9ASWuPsydz8EvAkMLXTMUOAVD5kIVDez9COd6+7z3X1h4Zu5+3R3Xxd8nQtUMLPUyDTth8yM353bgbM7pfPHkQt4O2t1ad1aRKTcSElKoE+LWoxbvFlD9kRE4lCF5ER+fnobPr1zAF2b1ODBD+dx9j++Vs87EYl4AaMhUPC/4tcE24pzTHHOPZILgenufrDAtheD4SP/Z2ZW1ElmNszMsswsa/PmY3+6l5hg/OWSLvRvVZv73p3Nx7PXH/M1RETkyAa0rsPqbftZsXVftEMREZEIaVY7jZev78G/ru7OnoM5XP7vifzsjels2KlhJSLlVaQLGEUVCQo/LjvcMcU5t+ibmp0APAL8pMDmK4OhJf2D19VFnevuz7p7prtn1qlTpzi3+4GUpASeuao7XRpV52dvTOfzeVrbWkSi73jnJDKzCmY22cxmBvMP/a7AOQ8Gx84ws8/MrEGwvamZ7S8w79AzwfZKZvaRmS0IrvXw8bTlpNah/PzlgrCPBhQRkRhiZpxxQv3QsJJTWvHp3A2c/OcxPDN2KQdzcqMdnoiUskgXMNYAjQp8zwDWFfOY4pz7A2aWAbwHXOPu305E4e5rg/fdwHBCQ1QiJi01iRev78EJDary09enMWahfmSLSPSUZE4i4CBwsrt3BroAg82sd7DvMXfv5O5dgA+BXxe43tIC8w7dVGD74+7eFugKnGhmQ461PU1qpdEuvSoj1ctNRKRcqJiSyM9Pa83nd55E3xa1ePjjBQz+21eMViFbpFyJdAFjCtDKzJqZWQpwGfBBoWM+AK4Jnvz1Bna6+/pinvs9ZlYd+Ai4393HF9ieZGa1g8/JwNmEJgKNqKoVknnlR71oWbcyP3l1KuOXbIn0LUVEDue45yQKvu8JjkkOXg7g7rsKnJ/GUXrKufs+dx8dfD4ETCNUoD5mZ3Wsz9SV21m3Y//xnC4iImVQ41qVeO7aHrx4fQ8MuP6lKfzopSms2LI32qGJSCmIaAHD3XOAW4FPgfnACHefa2Y3mVn+07iRwDJgCfBv4KdHOhfAzM43szVAH+AjM/s0uNatQEvg/wotl5oKfGpms4AZwNrgXhFXrVIyr93Yi2a107jx5SwmL99WGrcVESmsJHMSYWaJZjYD2ASMcvdJ+QeZ2UNmthq4ku/3wGhmZtPNbKyZ9S8cUFB0Pgf44ngadGbHdAA+nrPheE4XEZEybFCbunxyxwAeOLMtk5Zt5fS/juPhjxew52BOtEMTkQiKdA8M3H2ku7d29xbu/lCw7Rl3fyb47O5+S7C/o7tnHencYPt77p7h7qnuXs/dzwi2/8Hd0wp0We7i7pvcfa+7dw+6OZ/g7re7e6kNmquZlsJrN/aiQfUKXP/iZKau3F5atxYRyVeSOYlw99xgmEgG0NPMOnx7gPsv3b0R8DqhQjLAeqCxu3cFfg4MN7Oq397ILAl4A/iHuy8rMuCjTKrcvE5l2qdX5aNZRx1dKCIS14oxx1E1M/tfgbmMri+wb4WZzQ4e/GUVPjeWpSQlMGxAC0bfNZBzOjfgmbFLOfnxMfxn6hry8rRKlUg8ingBQ0JqV05l+I97U6dKKte+MJmsFeqJISKlqiRzEn3L3XcAY4DBRdxjOKEVoHD3g+6+Nfg8FVgKtC5w7LPAYnf/2+ECLs6kymd1Smfaqh2s1TASESmnijnH0S3AvGAuo4HAn4Mh2vkGBQ/+Mksj5nCrW7UCf76kM+/9tC/p1Sty19szOf+p8XpoKBKHVMAoRfWqVuCNYb2pWyWVa16YrLWsRaQ0HfecRGZWJxjugZlVBE4FFgTfWxU4/9wC2+sEP6oxs+aEJgZdFnz/A1ANuKOkjTorfxiJJvMUkfKrOHMcOVDFzAyoDGwD4m6sRdfGNXjv5r785ZLObNh1gAuf/oY735qhZVdF4ogKGKUsvVpF3vxJbxpWr8h1L05m3KIfdosWEQm3ksxJBKQDo4N5hKYQmgPjw2Dfw2Y2J9h3OnB7sH0AMMvMZgL/AW5y923BSlG/JPSUcFrQZfnG421X09ppnNCgKh+pgCEi5Vdx5jh6AmhHqFfdbOB2d88L9jnwmZlNNbNhkQ420hISjAu6ZfDlLwZy66CWfDR7PYMeH8PfP1/M/kNadlWkrEuKdgDlUd0qFXhzWG+uen4yN76cxTNXd+PktvWiHZaIxDl3H0moSFFw2zMFPjuhbsaFz5tFaMnToq554WG2vwO8U8T2NRQ918ZxO6tTOo9+spA12/eRUaNSOC8tIlIWFGeOozMITWR/MtACGGVmXwUrSZ3o7uuCie9HmdkCdx/3vRuEChvDABo3bhzu+CMiLTWJu85ow6U9GvHwxwv46+eLeHPKKu4Z3IahnRuSkBDW/ysSkVKiHhhRUqtyKm/8uBdt6lfhJ69O5RPNoi8icly+G0aiPCoi5VJx5ji6Hng3mDx/CbAcaAvg7uuC903Ae4SGpHxPceYkilWNalbiySu7MeInfahdOZU735rJ+U9/w9SVmo9OpCxSASOKqldK4fUf96JDw2rcMnwa789YG+2QRETKnCa10ujQsCofahiJiJRPxZnjaBVwCoCZ1QPaAMvMLM3MqgTb0wgNBZxTapGXop7NavL+LSfy54s7s2Hnfi58egK3Dp/G6m37oh2aiBwDFTCirGqFZF69oReZTWpwx1szePmbFdEOSUSkzDmrYwNmrt6hH6IiUu4Uc46jB4G+ZjYb+AK41923APWAr4P5iiYDH7n7J6XfitKRkGBc2D2D0XcN5LZTWvH5/I2c8uex/GnkfHbuz452eCJSDCpgxIDKqUm8/KOenNquHr/5YC5/HbWI0FB0EREpjm+HkcxRLwwRKX/cfaS7t3b3Fu7+ULDtmfx5jtx9nbuf7u4d3b2Du78WbF/m7p2D1wn558a7SilJ/Py01oy+ayDndG7As18tY+Bjo3n5mxVk5+Yd/QIiEjUqYMSICsmJPH1lNy7unsHfv1jMr9+fS16eihgiIsXRuFYlOjasxkezVMAQEZHiSa9WkT9f0pn/3dqPtvWr8psP5nLG38bx2dwNepgoEqNUwIghSYkJPHpRJ34yoDmvTlzJbW9O51COqsAiIsVxVqd0Zq7ZqWEkIiJyTDo0rMbwH/fiuWsyARj26lQufXYiM1bviG5gIvIDKmDEGDPj/jPbcf+Qtnw4az03vDyFPQdzoh2WiEjMyx9G8pEm8xQRkWNkZpzavh6f3jGAB8/rwLLNezjvyfH87I3pKoyLxBAVMGLUT05qwaMXduKbpVu55JkJbNx1INohiYjEtEY1K9E5oxojVcAQEZHjlJyYwNW9mzDm7kH87OSWjJq3gVP+PJYHP5zH9r2Hoh2eSLmnAkYMu6RHI567NpOVW/dy3pPjWbBhV7RDEhGJaWd3asCsNTtZtHF3tEMREZEyrHJqEr84vQ1j7hrEeV0b8OL45Qx4bDRPjVnCgezcaIcnUm6pgBHjBrWpy4ib+pDnzsVPT+DrxVuiHZKISMy6oFtDkhON4ZNWRTsUERGJA/WrVeDRizrz8e0D6Nm0Jo9+spCBj41hxJTV5GrCfZFSpwJGGXBCg2q899MTaVijIte9OJkRWaujHZKISEyqVTmVwR3SeXfaGj0hExGRsGlTvwrPX9eDN4f1pl61CtzzziyG/H0cX8zfqBVLREqRChhlRIPqFRlxUx/6tKjFPf+ZxZ8/W6hlVkVEinBFz8bsOpDDh1pSVUREwqx381r896d9eerKbmTnOje8nMUl/5pA1opt0Q5NpFyIeAHDzAab2UIzW2Jm9xWx38zsH8H+WWbW7WjnmtnFZjbXzPLMLLPQ9e4Pjl9oZmcU2N7dzGYH+/5hZhapNkdK1QrJvHBdDy7NbMQ/v1zCT1+fxr5DWqFERKSg3s1r0rxOGsMnrYx2KCIiEofMjDM7pvPZnQP4w3kdWLF1Hxc9M4EbX57Cwg2ag0kkkiJawDCzROBJYAjQHrjczNoXOmwI0Cp4DQOeLsa5c4ALgHGF7tceuAw4ARgMPBVch+C6wwrca3DYGlqKkhMTePjCjvzqrHZ8Nm8DFz49gTXbtbSTiEg+M+OKno2ZtmqHJj8WEZGISU5M4KreTRh790DuPqMNk5ZtY/Dfx/GLETP1+1wkQiLdA6MnsMTdl7n7IeBNYGihY4YCr3jIRKC6maUf6Vx3n+/uC4u431DgTXc/6O7LgSVAz+B6Vd19gocGqb0CnBf+5pYOM+PG/s154boerNm+j6FPjFe3NRGRAi7slkFKUoIm8xQRkYirlJLELYNaMu6eQfy4f3P+N2sdJz8+lt9+MJctew5GOzyRuBLpAkZDoOCMk2uCbcU5pjjnFvd+DYPPR72WmQ0zsywzy9q8efNRbhddA9vU5b+3nEjVislc/u+JjJiiyT1FRABqpKVwZof6vDdtrYbaiYhIqaiRlsIDZ7ZjzF0DuaBbQ16duJIBj47m8U8XsutAdrTDE4kLkS5gFDXPROGZJw93THHOLe79in0td3/W3TPdPbNOnTpHuV30tahTmf/+9ER6NavFPe/M4rcfzOVQTl60wxIRiborejVh98EcPpypyTxFRKT0NKhekYcv7MSoOwcwqG1dnhi9hP6PjOaZsUvZf0grZImURKQLGGuARgW+ZwDrinlMcc4t7v3WBJ+P5VplRrVKybx0fQ9u6NeMl75ZwRX/nsjGXQeiHZaISFT1aFqDlnUr8/pkDSMREZHS17xOZZ68ohsf/qwfXRpV5+GPFzDgsdG8MmGFHjiKHKdIFzCmAK3MrJmZpRCaYPODQsd8AFwTrEbSG9jp7uuLeW5hHwCXmVmqmTUjNFnn5OB6u82sd7D6yDXA+2FrZQxISkzg/85uzz8v78q89bs4+59fM3m55sUQkfLLzLiyV2Nmrt7B3HU7ox2OiIiUUx0aVuPlH/VkxE/60KxWGr9+fy6DHh/DiKzV5OSqkCFyLCJawHD3HOBW4FNgPjDC3eea2U1mdlNw2EhgGaEJN/8N/PRI5wKY2flmtgboA3xkZp8G58wFRgDzgE+AW9w9v5/WzcBzwX2WAh9Hsu3Rck7nBvz3lhOpnJrE5f+eyPNfLyc0b6mISPlzQdcMUjWZp4iIxICezWry1k968/KPelIzLYV7/jOL0/82jv/NXEdenn6vixSH6T9uDy8zM9OzsrKiHcZx2XUgm7tGzOSzeRs5p3MD/nRBRyqnJkU7LJFyycymuntmtOMoy0qSj38xYiafzt3ApAdOIU15UKTcU04umbL8+ziWuDufzt3Anz9bxOJNe2hbvwp3ntaa09vXI9RhXCT+HU8+jvQQEomSqhWSeeaq7tx9Rhs+mrWOc//5tbpQi0i5dEWvxuw5mMMHM+Nm6iMRESnjzIzBHdL55I4B/P2yLhzMyeMnr07l3CfGM3rBJvWgFjkMFTDiWEKCccuglgz/cW/2Hsrh/Ke+4dWJK5UQRaRc6da4Ou3Sq/L818vVRVdERGJKYoIxtEtDRt05gMcu6sSO/Ye4/qUpXPj0N3y9eIt+t4sUogJGOdC7eS1G3tafPs1r8X//ncOtb0zXWtQiUm6YGTcPbMGSTXv4dO6GaIcjIiLyA0mJCVyc2Ygvfj6QP57fkfU7D3DV85O49F8TmbB0a7TDE4kZKmCUE7Uqp/LidT24d3BbPpmzgbP/8TWz1uyIdlgiIqXirI7pNKudxhOjl+hploiIxKyUpASu6NWYMXcP5PdDT2Dltr1c/u+JXPbsBK0wKIIKGOVKQkLoKeRbw3qTnZvHBU99w1NjlpCrLtUiZYqZ1TOzbmbW1czqRTuesiAxyH9z1+1izMLN0Q5HRETkiFKTErmmT1PG3j2I35zTnqWb93LJvyZw5XMTmbJChQwpv1TAKIcym9bk49v7c8YJ9Xn0k4Vc/u+JrN2xP9phichRmFkXM5sIjAEeBR4DxprZRDPrFtXgyoDzuzakYfWK/PPLxeqFISIiZUKF5ESuP7EZ4+4exK/OasfCDbu5+JkJXPXcJBUypFxSAaOcql4phSeu6MrjF3dm7tqdDP7bOM3QLxL7XgJud/d27n5q8GoL3AG8GNXIyoDkxARuOqk501btYMIyjScWEZGyo2JKIjf2b85X95zMr85qx4INu1TIkHJJBYxyzMy4qHsGI2/vT8u6lbntjenc+dYMTfApErvS3H1S4Y3uPhFIi0I8Zc7FmY2oUyWVJ0cviXYoIiIix+xwhYwrn5vIJBXnpRxQAUNoUiuNt3/Sh9tPacX7M9Zyxl/HMW6RxoiLxKCPzewjM7vUzPoGr0vN7CPgk6OdbGaDzWyhmS0xs/uK2G9m9o9g/6z8YSlmVsHMJpvZTDOba2a/K3DOg8GxM8zsMzNrEGxvamb7g+0zzOyZAud0N7PZwX3+YWYWln86xVAhOZFh/ZszfslWpq3aXlq3FRERCavChYxFG/dw6bMTufRfE/hmqZZflfilAoYAoaWb7jytNe/+9EQqpSRyzQuTeeC92ew5mBPt0EQk4O63AU8Ag4D7gQeCz0+6+61HOtfMEoEngSFAe+ByM2tf6LAhQKvgNQx4Oth+EDjZ3TsDXYDBZtY72PeYu3dy9y7Ah8CvC1xvqbt3CV43Fdj+dHD9/HsNLt4/gfC4oldjqldK5skv1QtDRETKtu8KGaHJPlds3csV/w4tv/r1YhUyJP4kHe0AM6tG6MdlQ8CBdcCn7r4jsqFJNHRpVJ2PbuvPnz9byHNfL2fcos08dlFn+rSoFe3QRARw94+Bj4/j1J7AEndfBmBmbwJDgXkFjhkKvOKhXzsTzay6maW7+3pgT3BMcvDyIJ5dBc5Py99+OGaWDlR19wnB91eA846zTcclLTWJG05sxp9HLWLuup2c0KBaad1aRKRI+r0tJZU/2eflPRszIms1T49ZylXPT6Jr4+r87OSWDGpTl1Ls8CgSMUfsgWFm1wDTgIFAJUI/TgcBU4N9EocqJCfyy7PaM+InfUhMMC7/90R++8Fc9qo3hkhUmVmSmf3EzD4Ohm3MDD7fZGbJRzm9IbC6wPc1wbZiHWNmiWY2A9gEjCo4F4eZPWRmq4Er+X4PjGZmNt3MxppZ/wL3WHOUOPKvO8zMsswsa/Pm8A5ru6ZvU6qkJvHU6KVhva6IyLHS720JpwrJoeVXx9w9kIfO78CmXQf50UtZnPPE13wyZwN5eeqRIWXb0Xpg/BLoXrj6a2Y1gEnAKxGKS2JAj2C51Uc/WchL36xg1LyN/PGCjpzUuk60QxMpr14FdgC/47siQAZwLfAacOkRzi3qsUvhXzGHPcbdc4EuZlYdeM/MOrj7nGDfL4Ffmtn9wK3Ab4D1QGN332pm3YH/mtkJxYyD4LrPAs8CZGZmhvUXV7WKyVzdpwlPj13Koo27aV2vSjgvLyJyLPR7W8IuNSmRK3s14ZLMRrw3fS1PjV7CTa9NpU29KtxyckvO6phOYoJ6ZEjZc7Q5MIyif1jmUfSPUIkzlVKS+O25J/Cfm/pQITmBa1+YzM/fmsH2vYeiHZpIedTN3W9294nuviZ4TXT3m4GuRzl3DdCowPcMQl2Uj+mY4Af2GIqet2I4cGFw3EF33xp8ngosBVoH98g4Shyl4sb+zamcmsRDH82Pxu1FRPKV+Pd2MSZprmZm/yswGfP1xT1XyrbkxAQuyWzE5z8/ib9f1oU8d257Yzqn/WUsI7JWk52bF+0QRY7J0QoYDwHTzOxpM3sgeD1DqJvbQ5EPT2JFZtOafHRbf352cks+mLmOU/8ylg9mrtPEQCKla7uZXWxm3+ZuM0sws0uBoy2pMQVoZWbNzCwFuAz4oNAxHwDXBKuR9AZ2uvt6M6sT9LzAzCoCpwILgu+tCpx/boHtdYKJQzGz5oQm61wWzKex28x6B6uPXAO8f+z/KEquZloKt5/SirGLNjN6waZohCAiAiX8vV3MSZpvAeYFkzEPBP5sZinFPFfiQFJiAkO7NOTTOwbw9JXdqJiSyD3/mcXAx8bwyoQVHMjOjXaIIsVyxAKGu78MZAJjCc1Cf4jQk7dMd38p0sFJbKmQnMgvTm/D/37Wj4waFbntjelc/9IUVm3dF+3QRMqLy4CLgI1mtsjMFgEbgAuCfYfl7jmEhnd8CswHRrj73GD+jPwVQkYCy4AlwL+Bnwbb04HRZjaLUCFklLt/GOx72MzmBPtOB24Ptg8AZpnZTOA/wE3uvi3YdzPwXHCfpZTiBJ6FXdOnKc1rp/HgR/P0FEpEoiIMv7e/naTZ3Q8B+ZM0f+82QJWgcFwZ2AbkFPNciSMJCcaQjul8+LN+vHhdD+pXq8Cv359L/0dH86+xS7UCocQ8C8cTdDOb4O59DrNvMPB3IBF4zt0fLrTfgv1nAvuA69x92pHONbOawFtAU2AFcIm7bzezK4G7C1y+E6Eu1zPMbAyhH+H7g32nu/sRH7llZmZ6VlZWsf4ZlDe5ec5L36zgL58tJCfP+dnJLfnxgOakJiVGOzSRmGNmU909M8zXrEUoh28J53VjVSTz8ZcLNvKjl7L4v7Pbc0O/ZhG5h4jEjkjk5NJwuN/bZnYRMNjdbwy+Xw30Kri8tplVIdTLri1QBbjU3T8qzrnB9mGElr+mcePG3VeuXBmRNkrpc3cmLtvGE6MXM37JVqpVTObavk25vm9TaqSlRDs8iXPHk4+PNoSkuCoUtbGY3dKGEOpa3IpQYny6GOfeB3zh7q2AL4LvuPvr7t7F3bsAVwMr3H1GgXtdmb//aMULObLEBOOGfs34/BcncUq7ujz+2SKG/P0rvllaLv5bSiTq3H1rweKFmZ0WzXjKskFt6jKgdR3+9vkitu45GO1wREQOp8jf2xRvcuQzgBlAA6AL8ISZVS3mubj7s+6e6e6ZdepoMvd4Ymb0aVGL12/szX9vOZFezWryjy8W0/fhL3nww3ls2Hkg2iGKfE+4ChiH68ZRnG5pQ4FXPGQiUN3M0o9y7lDg5eDzy8B5Rdz7cuCN422QFE96tYo8dWV3Xry+Bzm5zhX/nsQdb05n0y4lO5FS9ny0AyirzIz/O6sd+w7l8pdRi6IdjojI4Rzu93ZxJmm+Hng3+L29BFhOqDdGcc6VcqJLo+o8e00mn905gMEd6vPSNyvo/+iX3PufWSzbvCfa4YkAR19GtaQaAqsLfF8D9CrGMQ2Pcm69YCI4ggnm6hZx70v5YbHkRTPLBd4B/uCagTJsBrWpS587a/HU6CU8M3YZn8/fxG2ntOS6vs1ISQpXnUykfDOzwpNufrsLqFWascSbVvWqcHXvJrwyYQVX9W5Cu/Sq0Q5JRKS4vp2kGVhLaE6kKwodswo4BfjKzOoBbQjNebSjGOdKOdO6XhX+emkX7jy1Nf/+ahlvZa1mxNTVDOlQn5tPaknHjGrRDlHKsWL9l2VRsxGb2cCCXw93ahHbChcNDndMsbq0FXlTs17APnefU2Dzle7eEegfvK4+zLnDzCzLzLI2b95cnNtJoEJyIj8/vQ2f3TmA3s1r8seRCxj8t3GMWajROiJh0h/4F/DnIl56NFJCd5zaiqoVk3nww3laYUlESp2Z3WpmNY50SFEbizlJ84NAXzObTWj49b3uvuVw54apSVLGNa5ViQfP68D4e0/m5pNa8NWiLZzzxNdc9dwkxi/Zov+vlKgo7qPxEWZ2b7C0XkUz+yfwpwL7iywGULxuaYc75kjnbgyGmRC8F/4v5MsoNHzE3dcG77uB4YSGqPyAxviVXNPaaTx3bQ9evL4HANe9OIUbX57Cii17oxyZSJk3kVBxdmyh1xhgYZRjK/OqV0rh56e15pulW/ls3sZohyMi5U99YIqZjTCzwcFE9wUd7vc27j7S3Vu7ewt3fyjY9oy7PxN8Xufup7t7R3fv4O6vHelckYLqVEnlnsFtGX//ydw3pC0LN+7myucmce4T4/lo1npy81TIkNJT3AJGL0LFhG8IdVNbB5yYv7NQT4eCvu3SZmYphAoLhbtAfwBcExRHegM7g+EhRzr3A+Da4PO1wPv5FzOzBOBiQnNm5G9LMrPawedk4GzgcDFLmAxqU5dP7hjAfUPaMmHpVk7761ge+mgeO/dlRzs0kTLJ3Ye4++jD7BtQ2vHEoyt6NqZ1vco8+OE89mopOREpRe7+K0KT2j8PXAcsNrM/mlmLYL9+u0pUVa2QzE0nteCrewbxx/M7svtANrcMn8Ypfx7D8EmrOJCdG+0QpRwobgEjm9DyoxUJzYC83N3zjnZSMbu0jSQ0Bm8J8G/gp0c6NzjnYeA0M1sMnBZ8zzcAWOPuywpsSwU+NbNZhGZgXhvcSyIsJSmBm05qwei7BnJB1wye+3o5Jz0+mpfGLyc796h/QiJyHMxsQrRjKKuSEhN46PyOrN2xn4dGzo92OCJSzgTzs20IXjlADeA/ZvZoVAMTKaBCciJX9GrMF78YyFNXdqNqxWQeeG82/R4ZzZOjl+hhpUSUFWfskpnNJNTL4UFCE8X9C8h294siG150ZWZmelZWVrTDiCvz1u3ioZHzGL9kK81rp3H/me04tV1dfthLUiR+HM8a1yW833R371pa9ysNpZ2P/zhyPs+OW8ZL1/dgYJui5okWkbKqtHNycZnZbYR6Fm8BngP+6+7ZQe/ixe7eIqoBBvT7WApzdyYs28ozY5cxbtFm0lISuaxnY37UrxkNq1eMdngSw44nHxe3B8YN7v5rd8929w3uPpQCwzZEiqt9g6q8dkMvXrguEzP48StZXPrsRKat2h7t0ETiiQajltDPT2tN63qVufedWXqSJCKlpTZwgbuf4e5vu3s2QNDr+ezohiZyeGZG3xa1eeVHPRl5W39OPyG0BOtJj47mzrdmMG/drmiHKHGkWAUMd/9BmdXdXw1/OFIemBknt63HJ3cM4MHzOrBs814ueOobfvJqFks2aSEFEYm+CsmJ/OWSLmzdc4hff6Bh5yISecHDwpWH2acxbVImtG9Qlb9e2oWxdw/kmj5N+XTuBs78x1dc/fwkvlq8WSuXSIkVtweGSNglJyZwde8mjL17IL84rTXjl2zl9L+O5b53ZrFh54FohycSs453qT05Nh0aVuO2U1rx/ox1fDRrfbTDERERKTMyalTi1+e0Z8J9p3D3GW1YsGE3Vz8/mTP/8TXvTV+jufDkuKmAIVGXlprEz05pxdi7B3Jt36a8M20NJz02mgc/nMeWPQejHZ5ILDrupfbk2Px0YAs6Z1TjV/+dzabdKqyKiIgci2qVkrllUEu+vncQj17YiezcPO58ayYDHh3Ns+OWsuuAhmnKsVEBQ2JGrcqp/OacE/jyFwM5p3MDXhy/nAGPjubRTxawY9+haIcnEjO01F7pSUpM4M+XdGHfoVzuf2e2ur6KiIgch9SkRC7p0YjP7hjAi9f1oEmtSvxx5AL6/ulLHvxwHmu274t2iFJGqIAhMadRzUo8fnFnRv38JE5pV4+nxy6l/yOj+dvni1SlFQloqb3S07JuZe4Z3JYvFmzijcmrox2OiIhImZWQYAxqW5c3h/Xhw5/145R2dUMTfj42hluHT2Pm6h3RDlFinAoYErNa1KnMPy/vyie3D+DElrX52+eL6ffwl/zt80Xs3K9ChpRfZnabmU0FHgXGAx3d/WagO3BhVIOLU9f3bUr/VrX57QdzmbpSqyaJiIiUVIeG1fj7ZV356p5B3NivGWMXbmbok+O5+Jlv+GTOBnLz1OtRfkgFDIl5bepX4Zmru/Phz/rRu3mtbwsZf/lsoYaWSHmlpfZKWUKC8c/Lu5JevQI3vTZVEw2LiIiESYPqFbn/zHZMeOAU/u/s9qzfeYCbXpvKoMfH8NL45ew9mBPtECWGmMbzHl5mZqZnZf1gBVmJsrnrdvLEl0v4eM4G0lISuaZvU27o14zalVOjHZpIkcxsqrtnRjuOsixW8vGijbs5/8nxtKxXhbeG9aZCcmK0QxKRY6ScXDKxko8lfuXk5jFq3kae+3o5U1dup0qFJC7v2Zhr+zalYfWK0Q5Pwuh48rF6YEiZc0KDajx9VXc+vWMAg9rW5ZmxSznx4S/5zftzNAGQiERU63pV+MulXZi5ege/fG+OJvUUEREJs6TEBIZ0TOedm/vy3k/7MqB1HZ7/OjS5/y3Dp2koZzmXFO0ARI5Xm/pVeOKKbty5eQ/PjFnK65NW8dqkVQzt3ICbB7agVb0q0Q5RROLQGSfU545TW/G3zxfTvkFVbujXLNohiYiIxKWujWvw5BU1WLtjP698s4Lhk1fx0az1dGlUnR/1a8aQDvVJTtQz+fJE/2tLmdeiTmUeu7gz4+4ZxDV9mvDxnA2c9tdx/PiVLLJWbNMTUhEJu9tObsUZJ9TjjyPn8/XiLdEOR0REJK41DObJmHj/Kfx+6Ans2HeI296YTv9HRvPk6CVs36t58coLzYFxBBrjVzZt23uIl75ZwSsTVrBjXzZdG1dnWP/mnH5CfRITLNrhSTmk8dYlF4v5eM/BHC54ajybdh/kPzf1oWVd9foSKQuUk0smFvOxlD95ec6XCzbx4jfLGb9kK6lJCVzQrSHX9W1Gm/r6/+Oy4njysQoYR6AEXbbtO5TDO1PX8NzXy1m5dR+Na1bixv7NuKh7BpVSNHpKSo9+LJdcrObjVVv3ceEz32DA2zf1oUmttGiHJCJHoZxcMrGaj6X8WrhhNy99s5x3p63lYE4eJ7asxfV9mzGobV09vIxxKmCEmRJ0fMjNc0bN28C/xi1j+qodVK2QxOW9GnNNH81kLKVDP5ZLLpbz8aKNu7n0XxOolJLEiJv6KK+IxDjl5JKJ5Xws5du2vYd4Y/IqXp2wkg27DtC4ZiWu6dOEizMbUa1icrTDkyKogBFmStDxZ+rKbbzw9Qo+mbsBgDNOqMf1JzYjs0kNzFShlcjQj+WSi/V8PGftTi7/90RqpaUw4id9qFu1QrRDEpHDUE4umVjPxyLZuXl8NncjL32znCkrtlMpJZELu2Vwbd+mtKxbOdrhSQExuYyqmQ02s4VmtsTM7itiv5nZP4L9s8ys29HONbOaZjbKzBYH7zWC7U3NbL+ZzQhezxQ4p7uZzQ6u9Q/Tf62WS92b1OTJK7sx7p5B3Ni/GeOXbOXiZyZw7hPjeTtrNQeyc6MdooiUQR0aVuOl63uyafdBrnxuEts0mZiIiEhUJCcmcFandN6+qS8f/qwfQzqk89aU1Zz6l7Fc/fwkPp+3kdw8PcQvqyJawDCzROBJYAjQHrjczNoXOmwI0Cp4DQOeLsa59wFfuHsr4Ivge76l7t4leN1UYPvTwfXz7zU4bA2VMqdh9YrcP6QdE+4/mT+c14H92bnc/Z9Z9P7TF/xp5HxWb9sX7RBFpIzp3qQGz12byapt+7j6+Uns3J8d7ZBERETKtQ4Nq/HnSzrzzf0nc9fprVm8cQ83vpLFwMdH8+9xy9i5T/9fXdZEugdGT2CJuy9z90PAm8DQQscMBV7xkIlAdTNLP8q5Q4GXg88vA+cdKYjgelXdfYKHxsy8crRzpHyolJLEVb2bMOrOAQz/cS/6NK/Fc18vZ8Bjo7n+xcmMXrBJFVoRKba+LWrzzNXdWbRxN9c8P4ktew5GOyQREZFyr3blVG49uRVf3TuIJ67oSv2qFXho5Hx6/+kL7n93NvPX74p2iFJMkV6KoSGwusD3NUCvYhzT8Cjn1nP39QDuvt7M6hY4rpmZTQd2Ab9y96+Ca60p4h4iAJgZfVvUpm+L2qzfuZ83Jq/mjcmruP6lKTSsXpHLejTikh6NqKdx7SJyFIPa1OXpK7tzy/BpXPj0N7x8fU+a1tbqJCIiItGWnJjA2Z0acHanBsxdt5OXv1nBu9PW8MbkVfRsVpNr+zTl9BPqkZwY8ZkW5DhF+n+ZouaZKPw4+3DHFOfcwtYDjd29K/BzYLiZVT2Wa5nZMDPLMrOszZs3H+V2Eo/Sq1Xk56e1Zvy9J/PUld1oVjuNP49aRN+Hv2TYK1mMXqheGVI2He+cRGZWwcwmm9lMM5trZr8rcM6DwbEzzOwzM2tQ6JqNzWyPmd1VYNvlwZxEs8zsEzOrHcl2R8Op7esx/Me92bU/mwuf/oYZq3dEOyQREREp4IQG1Xj0os5MeuAUHjizLet37ueW4dPo98iX/P3zxWzadSDaIUoRIl3AWAM0KvA9A1hXzGOOdO7GYFhI/vCQTQDuftDdtwafpwJLgdbBtTKOEgfBec+6e6a7Z9apU6eYzZR4lJKUwJkd03ntxl6MuWsgN/ZvxtSV27n+xSn0f+RL/jJqkebKkDKjJHMSAQeBk929M9AFGGxmvYN9j7l7J3fvAnwI/LrQNf8KfFwgjiTg78Agd+8EzAJuDUcbY033JjV45+a+VEpN5PJnJ/Llgo3RDklEREQKqV4phWEDWjDmrkE8f20mbepX5a+fhx5e3jp8GpOXb0Mrd8aOSBcwpgCtzKyZmaUAlwEfFDrmA+Ca4Mlfb2BnMDzkSOd+AFwbfL4WeB/AzOoEP9Ixs+aEfoQvC66328x6B6uPXJN/jkhxNK2dxv1D2vHN/SfzxBVdaVG3Mv/8cjEDHhvNVc9N4oOZ67SCicS6456TKPi+JzgmOXg5gLsXHDSaRoHebWZ2HrAMmFvgGAteaUE+rsphCsrxoHmdyrx784m0rFuZH78ylTcnr4p2SCIiIlKExATjlHb1eOVHPRl910Cu7duUcYs2c8m/JjDk71/x+qSV7D2YE+0wy72IzoHh7jlmdivwKZAIvODuc83spmD/M8BI4ExgCbAPuP5I5waXfhgYYWY3AKuAi4PtA4Dfm1kOkAvc5O7bgn03Ay8BFQk9Dfz2iaBIcaUmJX47bm7N9n38Z+oa3s5aw21vTKdaxWTO6ZzOhd0y6NKoOlqpV2JMSeYkWh8Uh6cCLYEn3X1S/kFm9hChwvBOYFCwLQ24FzgN+Hb4iLtnm9nNwGxgL7AYuCUM7YtZdaqk8uaw3twyfBr3vTubJZv2cO+QthpfKyIiEqOa1U7j/85uzy9Ob80HM9bxyoSV/PK9Ofxp5AIu7NaQq3o3oVW9KtEOs1wydYc5vMzMTM/Kyop2GBLj8vKcb5Zu5e2pq/l07gYOZOfRok4aF3TL4IJuDUmvVjHaIUqUmdlUd8+McgwXA2e4+43B96uBnu7+swLHfAT8yd2/Dr5/AdwTDMnLP6Y68B7wM3efU+ge9wMV3P03ZvY4MNndR5jZb4E97v64mSUDnxAaorIM+Cewwd3/UETMw4LjaNy4cfeVK1eG6Z9GdGTn5vHQR/N56ZsVdG1cnSeu6EbD6soPIqUtFnJyWabfx1IeuTvTVm3ntYmr+GjWeg7l5tG7eU2u6t2E09vXJyVJDyWOx/Hk40ivQiIS9xISjH6tatOvVW12H8hm5Oz1vDN1LY99upDHP1tI3xa1OK9LQwZ3qE+VCsnRDlfKr5LMSfQtd99hZmOAwcD3ChjAcOAj4DeEendcZGaPAtWBPDM7AEwKrrMUwMxGAD+YUDQ45lngWQj9YC5GG2NacmICvz33BHo0rcm978zirH98xV8u6czJbetFOzQRERE5AjOje5OadG9Sk1+d1Y4RWWt4fdJKbh0+nTpVUrmsRyMu79mYBnowEXEqFYmEUZUKyVzaozEjburDuLsHcdvJrVizfT93/2cWmX/4nFten8ZnczdwKCcv2qFK+XPccxIF8wtVBzCzisCpwILge6sC55+bv93d+7t7U3dvCvwN+KO7PwGsBdqbWf4syacB88Pe2hh2Vqd0/vezfjSoVpEfvZTFwx8vIDtXOUFEjl8xVpm6O1gtaoaZzTGzXDOrGexbEawMNcPM1LVC5ChqVU7l5oEtGHv3IF68rgcdG1bjidFL6PfIl9z4cmjFwjytWBgx6oEhEiGNa1XiztNac8eprZi+egfvT1/L/2at56PZ66leKZkhHepzTqcG9Gpei8QEzZchkVWSOYmAdODlYB6MBGCEu38Y7HvYzNoAecBK4KajxLEuWIZ1nJllB+dcF76Wlg3Naqfx7k/78vsP5/HM2KVkrdjGYxd3plnttGiHJiJlTIFVpk4j1JNuipl94O7z8o9x98eAx4LjzwHuLDBPHIRWhtpSimGLlHmJCcagtnUZ1LYua7bv443Jq3hrymo+n7+RRjUrckXPJlycmUHtyqnRDjWuaA6MI9AYPwm37Nw8vl68hf/OWMuoeRvZdyiXOlVSOatjOud0TqdroxokqJgRdzTeuuTiOR+/P2Mtv/rvHA7l5HHHqa35cf9mJGmCT5GIibecbGZ9gN+6+xnB9/sB3P1Phzl+ODDa3f8dfF8BZBa3gBHP+VikpA7l5PHZvA28NnElE5dtIznROOOE+lzZqwm9m9fUJP+FaA4MkRiXnJjwbaV2/6Fcvlywif/NXMfwyat46ZsVNKxekcEd6nNmx3S6NqquYoZIOTC0S0N6N6/Fr9+fwyOfLODDWet45MJOdGhYLdqhiUjZUJxVpgAws0qE5jC6tcBmBz4zMwf+Fcw/VPi8gpMqhylskfiTkpTw7YqFSzbtYfikVfxn6mo+nLWe5nXSuKJnYy7qnkH1SinRDrXMUg+MI1CFWUrL7gPZfDZ3IyNnr+erxVs4lJtHerUK3xYzujdWz4yyLN6e9kVDecnHH89ez/+9P5ft+w4xbEBzbj+lFRWSE6MdlkhcibecXJxVpgoceylwlbufU2Bbg2B4X11gFKFVpsYd7n7lJR+LhMuB7Fw+nLWe4ZNWMm3VDlKSEjirYzpX9GpMZpMa5bpXhnpgiJRRVSokc2H3DC7snsGuA9l8MX8jH83awOsTV/Hi+BXUrZLKae3rMbhDfXo3r0WyupeLxKUhHdPp26I2D42cx9NjlvK/meu4+4w2nNOpgYqYInI4xVllKt9lwBsFN7j7uuB9k5m9B/QEDlvAEJFjUyE5kYu6Z3BR9wzmrdvFG5NX8d/pa3lv+lpa1a3MFb0ac0HXDKpV0mqFxaEeGEegCrNE2+4D2XwxfxOfzt3AmIWb2Z+dS9UKSZzarh6nn1CfAa1rUylFdchYF29P+6KhPObjb5Zu4Q8fzmfe+l10yqjGA2e2o3fzWtEOS6TMi7ecbGZJwCLgFEIrPU0BrnD3uYWOqwYsBxq5+95gWxqQ4O67g8+jgN+7+yeHu195zMci4bbvUE4wjHw1M1fvIDXolXF5OeuVcTz5WAWMI1CCllhyIDuXcYs28+ncjXyxYCM79mWTkpRAv5a1Oa19PU5pW5e6VStEO0wpQrz9WI6G8pqP8/Kc96av5fHPFrJ+5wFObVeP+4a0pWXdytEOTaTMisecbGZnElqyOn+VqYcKrTKFmV0HDHb3ywqc1xx4L/iaBAx394eOdK/ymo9FImXuup0Mn7SK92esY8/BHFrWrczlPRtzQdeG1EiL77kyVMAIMyVoiVU5uXlMXr6NUfM3MmreRtZs3w9A50bVOa1daJLQ9ulVy031NtbF44/l0lbe8/GB7Fye/3o5T49Zyv7sXIZ2bsDNA1vQql6VaIcmUuYoJ5dMec/HIpGy71AOH85cz/DJq5ixOjRXxuAT6nNZz0b0aV4rLn/Xq4ARZkrQUha4Ows37ubzeaFixsw1OwFIr1aBgW3qckrbuvRtWUtDTaJIP5ZLTvk4ZMuegzw9ZinDJ61if3Yup7evx08HtaRLo+rRDk2kzFBOLhnlY5HIm78+NFfGe9PXsvtADk1rVeLSHqEVTOpUSY12eGGjAkaYKUFLWbRp9wHGLNjMlws28dXizew9lEtKUgK9m9fipNZ1GNimDs1rp8VlFTdW6cdyySkff9+2vYd46ZsVvDR+ObsO5HBiy1rcdFIL+rWsrX+3RY5COblklI9FSs/+Q7l8PGc9b05ezeQV20hKME5tV4/Lejaif6s6JJbxCb5VwAgzJWgp6w7m5DJl+Xa+XLCJMYs2sWzzXgAyalRkYJs6nNS6Lr2b16RKBc16HEn6sVxyysdF23Mwh+GTVvLvr5azefdBmtdO44peWmNe5EiUk0tG+VgkOpZs2sOIrNX8Z+oatu09RINqFbgosxGXZGaQUaNStMM7LipghJkStMSb1dv2MXbRZsYs3Mw3S7ew71AuSQlG18bV6d+qDv1a1aZTw2okaZnWsNKP5ZJTPj6yA9m5jJy9ntcmhtaYT01K4OxODbiqd2O6NKquXhkiBSgnl4zysUh0HcrJ4/P5G3lzymq+WrwZgH4ta3NZj8ac2r4uqUmJUY6w+FTACDMlaIlnh3LyyFq5ja8Xb+GrxVuYs24n7lC1QhJ9WtTixJa16duiNi3qaLhJSenHcskpHxffvHW7eH3SSv47fS17D+XSqm5lzuvakHM7N6BRzbL5hEYknJSTS0b5WCR2rNm+j7ez1vB21mrW7TxAjUrJnN81g0t7NKJN/dif6FsFjDBTgpbyZNveQ4xfsoWvFm9m/JKtrN0RWtmkXtVUTmxRm74ta9OnRS0aVq8Y5UjLHv1YLjnl42O352AO789Yy3+nr2XKiu0AdGtcnaFdGnJWp3RqV46fScBEjoVycskoH4vEntw85+slWxgxZTWfzdtAdq7TuVF1Ls1sxDmd02N2uLgKGGGmBC3llbuzats+xi/ZyvilW5iwdCvb9h4CoHHNSvRuXpPezWvRu3ktGqigcVT6sVxyyscls2b7Pj6YuY4PZqxjwYbdJBhkNq3Jae3qcVr7ejStnRbtEEVKjXJyySgfi8S2rXsO8t70tYzIWs2ijXuokJzAmR3TuSSzEb2a1YypntUxWcAws8HA34FE4Dl3f7jQfgv2nwnsA65z92lHOtfMagJvAU2BFcAl7r7dzE4DHgZSgEPA3e7+ZXDOGCAd2B/c+nR333Sk2JWgRULy8kJLtU5ctpWJy7Yyafk2duzLBkIFjR5Na9KrWU16NKtJ01qVYioxxgL9WC455ePwWbBhFx/NWs+oeRtZsGE3AC3rVubUdvU4pV1dujSqTrLmwZE4ppxcMsrHImWDuzNj9Q7enrqG/81Yx+6DOTSpVYmLu2dwYfcM0qtF/yFkzBUwzCwRWAScBqwBpgCXu/u8AsecCfyMUAGjF/B3d+91pHPN7FFgm7s/bGb3ATXc/V4z6wpsdPd1ZtYB+NTdGwb3GQPc5e7FzrhK0CJFy8tzFmz4rqCRtXL7tz006lRJpWfTmvRoWoPMpjVpW79KuZ8UVD+WS075ODJWb9vH5/M38vn8jUxato2cPCctJZFezUPz4PRrWZvW9SqrKClxRTm5ZJSPRcqe/OVYR2StZuKybSQY9GtVh0syMzi1XT0qJEdn4s/jycdJkQom0BNY4u7LAMzsTWAoMK/AMUOBVzxUSZloZtXNLJ1Q74rDnTsUGBic/zIwBrjX3acXuO5coIKZpbr7wcg0T6R8Skgw2jeoSvsGVflRv2a4O0s372HS8m1MWb6NScu38dHs9QBUSkmka+PqdG9Sk8wmNejSuDpVY3Qcnkh506hmJa4/sRnXn9iMnfuzmbB0C18v2cL4JVv5ckGok2Ltyqn0alaT7k1qkNm0Bu3Tq5b7oqSIiEhZUjElkQu6ZXBBtwxWbt3Lf6au4Z2pa7h1+HSqVUxmaJcGXNy9ER0aVo35hxaRLmA0BFYX+L6GUC+Lox3T8Cjn1nP39QDuvt7M6hZx7wuB6YWKFy+aWS7wDvAHL6L7iZkNA4YBNG7c+MitExEAzIyWdavQsm4VruzVBIC1O/aTtWIbU1duJ2vFdp74cjF5DmbQqm5lujaqQdfG1enWpAYt61QmISG2k6VIvKtWMZnBHdIZ3CEdCP07PH7JFsYv2ULWiu3fK0p2aVSd7k1q0CmjOp0yqlGvaoVohi4iIiLF1KRWGr84vQ13nNqab5ZuYUTWGt6csppXJqykbf0qXNQ9g/O6NozZyb4jXcAo6r9IChcNDndMcc4t+qZmJwCPAKcX2Hylu681syqEChhXA6/84AbuzwLPQqiLXHHuJyI/1LB6RRp2acjQLg2B0IoIM1btYPqq7UxbtZ1P523graxQjbJyahKdMqrRKaM6XRpVo3Oj6tSvWiHmK8Ai8axh9YpcktmISzIbAbB+536yVmwPFSVXbuPJ0UvIC/5fsk6VVDo1rEbHjGq0T69K2/pVyahRUYVJERGRGJWYYPRvVYf+reqwc182H8xax3+yVvOHj+bz8McLGNS2Lhd1z+DktnVjam6sSBcw1gCNCnzPANYV85iUI5y70czSg94X6cC3k3GaWQbwHnCNuy/N3+7ua4P33WY2nNDwlh8UMEQkMiqnJtGvVW36taoNhCYWWr5lL9NW7WDm6h3MXLOD579eRnZu6L+I6lZJpVNGNTo2rE7HjKp0aFiNulX0lFckWtKrVeSczhU5p3MDIDSedt76ncxes5NZa0PvXy7cRH7fxrSURFrXr0Lb+lVoUy/UQ6t5nTTSq6k4KSIiEkuqVUrm6t5NuLp3ExZt3M1/pq7h3WlrGTVvI7XSUhjapSEXdc+gfYOq0Q414gWMKUArM2sGrAUuA64odMwHwK3BHBe9gJ1BYWLzEc79ALiW0Ioj1wLvA5hZdeAj4H53H59/AzNLAqq7+xYzSwbOBj6PQHtFpJjMjOZ1KtO8TmUu6p4BwIHsXOav3xUUNHYye+1Ovljw3X8Q1a9agQ4Nq3FCg6qhV8NqNNB/DIlERcWURLo3qUn3JjW/3bb3YA4LN+5m4YbQa8GGXXw8ZwNvTP5uRGillESa1U6jRZ3KNKudRpNalWhSqxKNa6ZRu3KK/n0WERGJotb1qvDAme2454w2jF20mbez1vDqxBW8MH457dKrclH3DIZ2aRC1ISalsYzqmcDfCC2F+oK7P2RmNwG4+zPBMqpPAIMJLaN6ff5KIUWdG2yvBYwAGgOrgIvdfZuZ/Qq4H1hcIITTgb3AOCA5uNbnwM/dPfdIsWuWZZHo23Mwh3nrdjFrzQ7mrA0VNZZt2fttUaN6pWROaFCV9ulVaRd0XW9ZtzIpSbHT1U0z3pec8nHZ5e5s3n2QJZv3sGzzXpYWeF+7Yz8Ff4akpSTSqGYlMmpUIqNGRRpWr0iD6hVpWKMiDapXoHZaqoalSIkpJ5eM8rFI+bN97yH+N2sd/5m6hllrdpKUYAxsU5eLujdkUNu6pCYd3yomMbeMalmnBC0Sm/YdymH++t3MW7eTeet3MXfdLhZs2M2hnDwAkhONFnUq0y69Km2C7uut61eJWm8N/VguOeXj+HQgO5c12/ezatteVm7dx6pt+1i1dR9rtu9n7Y797DmY873jkxONulUqUK9qKunVKlKvauhznSoFXpVTqVEpRYUOOSzl5JJRPhYp3xZt3M07U9fw3vS1bNp9kOqVkjmnUwMu7J5B54xqx/RbWwWMMFOCFik7cnLzWLF1L/PW72b++l0sWL+L+et3s2HXgW+PqZKaROv6VWhdrzIt61ahVd3KtKpXOeIThurHcskpH5c/7s6uAzmsDYoZ63bsZ8OuA2zceYANuw6wIXjfd+iHnSmTEowaaSnUSkuhVuUUaqalhj6npVA9LYUalZKpUSmF6gXeKyYnavhKOaGcXDLKxyICod/eXy/ZwrvT1vLp3A0czMmjRZ00LuiWwfldG9KgesWjXuN48nGk58AQESkVSYkJ3y7lem4wySDAzn3ZLNoUGo+/aONuFmzYzcdzNrBj33dj8iunJtGybmVa1q1MizqVaV4nND6/Sa1KMTXrskh5YmZUq5hMtYrJh500zN3ZczCHLXsOsXn3weB1gM17DrJ1zyG27j3E1j0Hmb19B1v3HGJ3oR4dBSUnhu5XtWIyVSskf/u5SoUkqlbIf0+iSoVkKqcmkZaaRJUKoffKwatCcoKKICIiUi4kJSYwsE1dBrapy64D2YyctZ53pq3hsU8X8vhnC+nTvBYXdMtgSIf6pKWGr+ygHhhHoAqzSHxyd7buPcTijXtYsmk3SzbtYdHGPSzdvIdNuw9+e1xSgtG4ZiWa1U6jae00mgWvprXTSK9aodhd1PW0r+SUjyUcDubksnNfNtv3ZbN93yF27DvE9n3Z7Nz//deu4H33gRx2H8hm1/4cDuXmHfX6ZpCWkkSllEQqpyZRKTWRSslJVExJpFJK4rfvlVKSqJCcSMXkRComJ1AxJZEKyYnfbgt9Tgi9JyWSmpxAalLoe0pigobHlJBycskoH4vIkazauo/3pq/l3elrWLl1HxWTExncoT4XdGtI3xa1SSzw/2HqgSEiUgxmRu3KqdSunEqfFrW+t2/3gWyWbd7Lsi17WLopNNHg8i17Gb90Cweyv/sPmNSkBBrVrETTYPWEJrUq0bhWJRrXDE0+eLyTGYlI5KQmJVK3aiJ1qx77kswHsnO/LWjsPZjL7oPZ7DmQw95DOew+kMPeg7nsOxR633swtH3fodC2HfsOsW5HLvsO5bI/O7StYD45VimJoYJGSlLoPTUobKQmJ5CSmEByYmjft6/EYHuSkZKYSHKSkRocl5SYQHKikZKUQFJC6HPyt/vs2+/5+5ISE0hKCG1LTLBvtyUnGIkJ3+1PSjSSEhJIMNQrRUSkHGlcqxK3n9qK205pybRV23ln2lo+nLmO96avpV7VVIZ2acj5XRvSLv34lmRVAUNEpIAqFZLp3Kg6nRtV/972vDxn4+4DLN+yl+Vb9rJiy3eTDo5fspX92d+NwzeDelUq0KhmRRrVrFTKLRCRSMjvIVGnSniWjXN3Dubksf/bokYuB7JzOZiTy4Hs0PYDweeDObkczM7jYE7et/sP5uRyKCePQzmh7YeCfYdyQ5/37csJbQ++Z+fmkZ3rZOfkcTDYVlqSE4PiRkJC8G7fvScaifb9/T942fe/J9h31yi4LTGBAp+/e//efhVTRERKhZl9u9z6r89uz+gFm3hn2lpe+Ho5z45bRtv6VY7ruipgiIgUQ0KCkV6tIunVKtK3Re3v7ctfJnJlsILC6u37WL1tP6u372Pi0q1RilhEYpmZfVsUqRGF+7s7uXkeKmrk5ZGdExQ4ckPFjpw851BO6D0nN1QIycl1cvJCx+V//vY9L7Qt/9zc4Htu3nffs3OdPA8dn78/f1+uO7nffg+dkxfEmJOXx8GcAsflhYrKOXl55Dmh9zy+3Z/37XHffc7L49ttIiJSuiokJzKkYzpDOqazbe8hPpy1jnenrT2ua6mAISJSQmZG3aoVqFu1Aj2a1vzh/geiEJSIyBGYBcM8EqEi5WvImz0S7QhERMqvmmkpXNOnKdf0aYrdeuzna3p9EZFywswGm9lCM1tiZvcVsd/M7B/B/llm1i3YXsHMJpvZTDOba2a/K3DOg8GxM8zsMzNrUOiajc1sj5ndVWBbipk9a2aLzGyBmV0YyXaLiIiISHxQAUNEpBwws0TgSWAI0B643MzaFzpsCNAqeA0Dng62HwROdvfOQBdgsJn1DvY95u6d3L0L8CHw60LX/CvwcaFtvwQ2uXvrIJaxJWudiIiIiJQHGkIiIlI+9ASWuPsyADN7ExgKzCtwzFDgFQ+trz3RzKqbWbq7rwf2BMckBy8HcPddBc5Py98e3OM8YBmwt1AsPwLaBufnAVvC0UARERERiW/qgSEiUj40BFYX+L4m2FasY8ws0cxmAJuAUe4+Kf8gM3vIzFYDVxL0wDCzNOBe4HcFroeZVQ8+Pmhm08zsbTOrV1TAZjbMzLLMLGvz5s3H0lYRERERiUMqYIiIlA9FrR1YeDr+wx7j7rnBMJEMoKeZdfj2APdfunsj4HUgfzqm3wF/dfc9ha6XFFxjvLt3AyYAjxcVsLs/6+6Z7p5Zp06dIzZOREREROKfhpAcwdSpU7eY2cpoxxEGtYn/Ltrx3ka1r2xrE+0ACPWmaFTgewaw7liPcfcdZjYGGAzMKXT+cOAj4DdAL+AiM3sUqA7kmdkBQvNw7APeC855G7jhaMHHUT6G+P97V/vKvnhvYyzk5DJL+bhMiff2Qfy3Md7bd8z5WAWMI3D3uHjkZ2ZZ7p4Z7TgiKd7bqPaVbWaWFe0YgClAKzNrBqwFLgOuKHTMB8CtwfwYvYCd7r7ezOoA2UHxoiJwKvAIgJm1cvfFwfnnAgsA3L1//kXN7LfAHnd/Ivj+P2Ag8CVwCt+fh6NI8ZKPoXz8vat9ZVu8tzFGcnKZpXxcdsR7+yD+21ge2nes56iAISJSDrh7jpndCnwKJAIvuPtcM7sp2P8MMBI4E1hCqJfE9cHp6cDLwUomCcAId/8w2PewmbUB8oCVwE3FCOde4FUz+xuwucB9REREREQOSwUMEZFywt1HEipSFNz2TIHPDtxSxHmzgK6HueaFxbjvbwt9XwkMKFbQIiIiIiIBTeJZPjwb7QBKQby3Ue0r2+K9fXJs4v3vQe0r++K9jfHePim+eP9biPf2Qfy3Ue0rxEIP3EREREREREREYpd6YIiIiIiIiIhIzFMBQ0RERERERERingoYccbMXjCzTWY2p8C2mmY2yswWB+81ohljSZhZIzMbbWbzzWyumd0ebI+LNppZBTObbGYzg/b9LtgeF+3LZ2aJZjbdzD4Mvsdb+1aY2Wwzm5G/PFS8tVGOTvk4LtqonFzG26d8LPmUk8t2G5WP46Z9Jc7JKmDEn5eAwYW23Qd84e6tgC+C72VVDvALd28H9AZuMbP2xE8bDwInu3tnoAsw2Mx6Ez/ty3c7ML/A93hrH8Agd+9SYO3ueGyjHNlLKB+X9TYqJ8dH+5SPBZSTy3oblY/jo31QwpysAkaccfdxwLZCm4cCLwefXwbOK82Ywsnd17v7tODzbkL/gjckTtroIXuCr8nBy4mT9gGYWQZwFvBcgc1x074jKA9tlAKUj4Gy30bl5DLevsOI9/ZJEZSTgTLcRuVjoIy37wiOqY0qYJQP9dx9PYSSG1A3yvGEhZk1BboCk4ijNgZdx2YAm4BR7h5X7QP+BtwD5BXYFk/tg9D/oX5mZlPNbFiwLd7aKMcnLv8O4jUfg3JyHLRP+ViOJC7/FuI1Jysfl/n2QRhyclKEAxSJCDOrDLwD3OHuu8ws2iGFjbvnAl3MrDrwnpl1iHJIYWNmZwOb3H2qmQ2McjiRdKK7rzOzusAoM1sQ7YBEIiWe8zEoJ8cB5WMpV+I5Jysfx4US52T1wCgfNppZOkDwvinK8ZSImSUTSsyvu/u7wea4aiOAu+8AxhAarxkv7TsRONfMVgBvAieb2WvET/sAcPd1wfsm4D2gJ3HWRjlucfV3UF7yMSgnRy/EklE+lqOIq7+F8pKTlY/LrnDkZBUwyocPgGuDz9cC70cxlhKxUBn5eWC+u/+lwK64aKOZ1QmqyphZReBUYAFx0j53v9/dM9y9KXAZ8KW7X0WctA/AzNLMrEr+Z+B0YA5x1EYpkbj5O4j3fAzKycFhZbZ9ysdSDHHztxDvOVn5GCjD7YPw5WRz90jGKaXMzN4ABgK1gY3Ab4D/AiOAxsAq4GJ3LzyJUZlgZv2Ar4DZfDc+7AFCY/zKfBvNrBOhyWsSCRUYR7j7782sFnHQvoKC7nF3ufvZ8dQ+M2tOqKIMoWF6w939oXhqoxSP8nFctFE5uQy3T/lYClJOLtttVD4u++0LV05WAUNEREREREREYp6GkIiIiIiIiIhIzFMBQ0RERERERERingoYIiIiIiIiIhLzVMAQERERERERkZinAoaIiIiIiIiIxDwVMKTMMrP6ZvammS01s3lmNtLMWh/HdcaYWWYkYjzGOK4zsyeiHYeIyLFSPhYRiR3KyRLPVMCQMsnMjNA6wmPcvYW7tye01nW96EYWPWaWGO0YRKT8UT7+IeVjEYkW5eQfUk6OLypgSFk1CMh292fyN7j7DHf/ysxeNbOh+dvN7HUzO9fMEs3scTObbWazzOxnhS9qZqeb2QQzm2Zmb5tZ5SKOGWNmj5jZZDNbZGb9g+3fqw6b2YdmNjD4vCc4Z6qZfW5mPYPrLDOzcwtcvpGZfWJmC83sNwWudVVwvxlm9q/8RBxc9/dmNgnoU4J/niIix0v5GOVjEYkZyskoJ8czFTCkrOoATD3MvueA6wHMrBrQFxgJDAOaAV3dvRPwesGTzKw28CvgVHfvBmQBPz/MPZLcvSdwB/CbwxxTUBqhSnh3YDfwB+A04Hzg9wWO6wlcCXQBLjazTDNrB1wKnOjuXYDc4Jj8685x917u/nUx4hARCTfl4++uq3wsItGmnPzddZWT41BStAMQCTd3H2tmT5pZXeAC4B13zzGzU4Fn3D0nOG5boVN7A+2B8WYGkAJMOMxt3g3epwJNixHWIeCT4PNs4KC7Z5vZ7ELnj3L3rQBm9i7QD8gBugNTgrgqApuC43OBd4pxfxGRUqd8LCISO5STJR6ogCFl1VzgoiPsf5VQBfYy4EfBNgP8COcYoeR4eTHufzB4z+W7f49y+H6vpgoFPme7e/698/LPd/c8Myv472Hh+DyI62V3v7+IOA64e24x4hURiRTl4xDlYxGJBcrJIcrJcUpDSKSs+hJINbMf528wsx5mdlLw9SVCXddw97nBts+Am/KToZnVLHTNicCJZtYy2F/Jjm3G5hVAFzNLMLNGhLq6HavTzKymmVUEzgPGA18AFwXVcoL9TY7j2iIikaB8LCISO5STJa6pgPH/7dw7SgRBFAXQ+1J34A6M3YmpkUtxAWamgqF70FQzER3wk4hgMCBGrqAMqkExGxGmpj0nbbp4ndzg8qrZSFNTu5ceZs9VdZ/kMMlyev6W5DHJ6bfXTpK8JllU1V2S/R9nvic5SHJWVYv0sN5ZYayrJC/p629HSW5W/rDkMr0Zv01f67turT2k3zs8n+a6SLL9i7MB/pw8lsfAOGSyTJ67+trYgfmoqq30kNxtrX2sex6A/0oeA4xDJrPpbGAwO9OPiJ6SHAtmgPWRxwDjkMnMgQ0MAAAAYHg2MAAAAIDhKTAAAACA4SkwAAAAgOEpMAAAAIDhKTAAAACA4X0CbxKy1Z49lukAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ]], dtype=object)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pybamm.plot_summary_variables(sol_list)" + ] + }, + { + "cell_type": "markdown", + "id": "convinced-winter", + "metadata": {}, + "source": [ + "## Starting solution" + ] + }, + { + "cell_type": "markdown", + "id": "unauthorized-fundamental", + "metadata": {}, + "source": [ + "A simulation can be performed iteratively by using the `starting_solution` feature. For example, we first solve for 10 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "posted-plastic", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:43.716 - [NOTICE] callbacks.on_cycle_start(174): Cycle 1/10 (18.851 ms elapsed) --------------------\n", + "2022-08-17 18:31:43.717 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:43.764 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:43.800 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:43.848 - [NOTICE] callbacks.on_step_start(182): Cycle 1/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:43.993 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.941 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:43.994 - [NOTICE] callbacks.on_cycle_start(174): Cycle 2/10 (296.416 ms elapsed) --------------------\n", + "2022-08-17 18:31:43.994 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.021 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.039 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.063 - [NOTICE] callbacks.on_step_start(182): Cycle 2/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.105 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.913 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.106 - [NOTICE] callbacks.on_cycle_start(174): Cycle 3/10 (408.187 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.106 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.131 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.149 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.178 - [NOTICE] callbacks.on_step_start(182): Cycle 3/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.218 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.886 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.219 - [NOTICE] callbacks.on_cycle_start(174): Cycle 4/10 (521.346 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.219 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.243 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.260 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.283 - [NOTICE] callbacks.on_step_start(182): Cycle 4/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.323 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.859 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.323 - [NOTICE] callbacks.on_cycle_start(174): Cycle 5/10 (625.601 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.323 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.349 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.366 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.391 - [NOTICE] callbacks.on_step_start(182): Cycle 5/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.436 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.833 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.436 - [NOTICE] callbacks.on_cycle_start(174): Cycle 6/10 (738.635 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.436 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.460 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.477 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.499 - [NOTICE] callbacks.on_step_start(182): Cycle 6/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.540 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.807 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.541 - [NOTICE] callbacks.on_cycle_start(174): Cycle 7/10 (843.043 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.541 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.562 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.581 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.604 - [NOTICE] callbacks.on_step_start(182): Cycle 7/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.648 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.781 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.649 - [NOTICE] callbacks.on_cycle_start(174): Cycle 8/10 (951.227 ms elapsed) --------------------\n", + "2022-08-17 18:31:44.649 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.672 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.689 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.710 - [NOTICE] callbacks.on_step_start(182): Cycle 8/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.751 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.756 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.752 - [NOTICE] callbacks.on_cycle_start(174): Cycle 9/10 (1.054 s elapsed) --------------------\n", + "2022-08-17 18:31:44.752 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.776 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.794 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.816 - [NOTICE] callbacks.on_step_start(182): Cycle 9/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.858 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.732 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.859 - [NOTICE] callbacks.on_cycle_start(174): Cycle 10/10 (1.162 s elapsed) --------------------\n", + "2022-08-17 18:31:44.859 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:44.882 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:44.901 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:44.923 - [NOTICE] callbacks.on_step_start(182): Cycle 10/10, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:44.967 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.708 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:44.968 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 1.269 s\n" + ] + } + ], + "source": [ + "experiment = pybamm.Experiment([\n", + " (f\"Discharge at 1C until {Vmin}V\",\n", + " \"Rest for 1 hour\",\n", + " f\"Charge at 1C until {Vmax}V\", \n", + " f\"Hold at {Vmax}V until C/50\")\n", + "] * 10,\n", + "termination=\"80% capacity\"\n", + ")\n", + "sim = pybamm.Simulation(spm, experiment=experiment, parameter_values=parameter_values)\n", + "sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "id": "weird-darkness", + "metadata": {}, + "source": [ + "If we give `sol` as the starting solution this will then solve for the next 10 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "moderate-pipeline", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-08-17 18:31:44.978 - [NOTICE] callbacks.on_cycle_start(174): Cycle 11/20 (17.042 us elapsed) --------------------\n", + "2022-08-17 18:31:44.979 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.003 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.019 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.040 - [NOTICE] callbacks.on_step_start(182): Cycle 11/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.079 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.684 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.080 - [NOTICE] callbacks.on_cycle_start(174): Cycle 12/20 (101.735 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.080 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.105 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.121 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.140 - [NOTICE] callbacks.on_step_start(182): Cycle 12/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.181 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.660 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.181 - [NOTICE] callbacks.on_cycle_start(174): Cycle 13/20 (203.262 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.182 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.201 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.219 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.238 - [NOTICE] callbacks.on_step_start(182): Cycle 13/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.276 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.637 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.276 - [NOTICE] callbacks.on_cycle_start(174): Cycle 14/20 (298.422 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.277 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.297 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.314 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.333 - [NOTICE] callbacks.on_step_start(182): Cycle 14/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.372 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.614 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.373 - [NOTICE] callbacks.on_cycle_start(174): Cycle 15/20 (394.783 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.373 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.394 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.410 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.429 - [NOTICE] callbacks.on_step_start(182): Cycle 15/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.468 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.592 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.468 - [NOTICE] callbacks.on_cycle_start(174): Cycle 16/20 (490.195 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.468 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.490 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.507 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.528 - [NOTICE] callbacks.on_step_start(182): Cycle 16/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.567 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.570 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.568 - [NOTICE] callbacks.on_cycle_start(174): Cycle 17/20 (589.953 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.568 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.592 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.610 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.632 - [NOTICE] callbacks.on_step_start(182): Cycle 17/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.676 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.548 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.677 - [NOTICE] callbacks.on_cycle_start(174): Cycle 18/20 (698.997 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.677 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.701 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.721 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.743 - [NOTICE] callbacks.on_step_start(182): Cycle 18/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.784 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.526 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.784 - [NOTICE] callbacks.on_cycle_start(174): Cycle 19/20 (806.118 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.784 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.808 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.825 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.844 - [NOTICE] callbacks.on_step_start(182): Cycle 19/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.884 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.505 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.884 - [NOTICE] callbacks.on_cycle_start(174): Cycle 20/20 (906.135 ms elapsed) --------------------\n", + "2022-08-17 18:31:45.884 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 1/4: Discharge at 1C until 3.0V\n", + "2022-08-17 18:31:45.906 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 2/4: Rest for 1 hour\n", + "2022-08-17 18:31:45.922 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 3/4: Charge at 1C until 4.2V\n", + "2022-08-17 18:31:45.942 - [NOTICE] callbacks.on_step_start(182): Cycle 20/20, step 4/4: Hold at 4.2V until C/50\n", + "2022-08-17 18:31:45.984 - [NOTICE] callbacks.on_cycle_end(196): Capacity is now 4.484 Ah (originally 4.941 Ah, will stop at 3.952 Ah)\n", + "2022-08-17 18:31:45.985 - [NOTICE] callbacks.on_experiment_end(222): Finish experiment simulation, took 1.006 s\n" + ] + } + ], + "source": [ + "sol2 = sim.solve(starting_solution=sol)" + ] + }, + { + "cell_type": "markdown", + "id": "leading-passport", + "metadata": {}, + "source": [ + "We have now simulated 20 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "higher-covering", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(sol2.cycles)" + ] + }, + { + "cell_type": "markdown", + "id": "plastic-framework", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "id": "drawn-fifty", + "metadata": {}, + "source": [ + "The relevant papers for this notebook are:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "driven-sensitivity", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] Weilong Ai, Ludwig Kraft, Johannes Sturm, Andreas Jossen, and Billy Wu. Electrochemical thermal-mechanical modelling of stress inhomogeneity in lithium-ion pouch cells. Journal of The Electrochemical Society, 167(1):013512, 2019. doi:10.1149/2.0122001JES.\n", + "[2] Joel A. E. Andersson, Joris Gillis, Greg Horn, James B. Rawlings, and Moritz Diehl. CasADi – A software framework for nonlinear optimization and optimal control. Mathematical Programming Computation, 11(1):1–36, 2019. doi:10.1007/s12532-018-0139-4.\n", + "[3] Ferran Brosa Planella and W. Dhammika Widanage. Systematic derivation of a Single Particle Model with Electrolyte and Side Reactions (SPMe+SR) for degradation of lithium-ion batteries. Submitted for publication, ():, 2022. doi:.\n", + "[4] Rutooj Deshpande, Mark Verbrugge, Yang-Tse Cheng, John Wang, and Ping Liu. Battery cycle life prediction with coupled chemical degradation and fatigue mechanics. Journal of the Electrochemical Society, 159(10):A1730, 2012. doi:10.1149/2.049210jes.\n", + "[5] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", + "[6] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", + "[7] Peyman Mohtat, Suhak Lee, Jason B Siegel, and Anna G Stefanopoulou. Towards better estimability of electrode-specific state of health: decoding the cell expansion. Journal of Power Sources, 427:101–111, 2019.\n", + "[8] Peyman Mohtat, Suhak Lee, Valentin Sulzer, Jason B. Siegel, and Anna G. Stefanopoulou. Differential Expansion and Voltage Model for Li-ion Batteries at Practical Charging Rates. Journal of The Electrochemical Society, 167(11):110561, 2020. doi:10.1149/1945-7111/aba5d1.\n", + "[9] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "[10] Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, David Cournapeau, Evgeni Burovski, Pearu Peterson, Warren Weckesser, Jonathan Bright, and others. SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature Methods, 17(3):261–272, 2020. doi:10.1038/s41592-019-0686-2.\n", + "\n" + ] + } + ], + "source": [ + "pybamm.print_citations()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "593ae90b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "vscode": { + "interpreter": { + "hash": "612adcc456652826e82b485a1edaef831aa6d5abc680d008e93d513dd8724f14" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/scripts/compare_lead_acid.py b/examples/scripts/compare_lead_acid.py index d52a30cd29..9f73046d35 100644 --- a/examples/scripts/compare_lead_acid.py +++ b/examples/scripts/compare_lead_acid.py @@ -7,10 +7,10 @@ # load models models = [ - pybamm.lead_acid.LOQS({"surface form": "differential", "hydrolysis": "true"}), - # pybamm.lead_acid.FOQS(), - # pybamm.lead_acid.Composite(), - # pybamm.lead_acid.Full(), + pybamm.lead_acid.LOQS(), + pybamm.lead_acid.FOQS(), + pybamm.lead_acid.Composite(), + pybamm.lead_acid.Full(), ] # create and run simulations diff --git a/examples/scripts/custom_model.py b/examples/scripts/custom_model.py index d01694c027..a6e137d6ad 100644 --- a/examples/scripts/custom_model.py +++ b/examples/scripts/custom_model.py @@ -29,24 +29,30 @@ model.submodels["positive electrode potential"] = pybamm.electrode.ohm.LeadingOrder( model.param, "Positive" ) -particle_n = pybamm.particle.PolynomialProfile( - model.param, "Negative", options={**model.options, "particle": "uniform profile"} +particle_n = pybamm.particle.XAveragedPolynomialProfile( + model.param, + "Negative", + options={**model.options, "particle": "uniform profile"}, + phase="primary", ) model.submodels["negative particle"] = particle_n -particle_p = pybamm.particle.PolynomialProfile( - model.param, "Positive", options={**model.options, "particle": "uniform profile"} +particle_p = pybamm.particle.XAveragedPolynomialProfile( + model.param, + "Positive", + options={**model.options, "particle": "uniform profile"}, + phase="primary", ) model.submodels["positive particle"] = particle_p model.submodels[ "negative open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - model.param, "Negative", "lithium-ion main", options=model.options + model.param, "Negative", "lithium-ion main", options=model.options, phase="primary" ) model.submodels[ "positive open circuit potential" ] = pybamm.open_circuit_potential.SingleOpenCircuitPotential( - model.param, "Positive", "lithium-ion main", options=model.options + model.param, "Positive", "lithium-ion main", options=model.options, phase="primary" ) model.submodels["negative interface"] = pybamm.kinetics.InverseButlerVolmer( model.param, "Negative", "lithium-ion main", options=model.options From 109aae0452a16ae690093e7c0a8477a92bd3f857 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 22 Aug 2022 11:05:50 +0100 Subject: [PATCH 37/47] coverage --- .../scripts/compare_lithium_ion_two_phase.py | 4 +-- .../full_battery_models/base_battery_model.py | 2 +- .../submodels/interface/base_interface.py | 4 +-- pybamm/parameters/lithium_ion_parameters.py | 25 +++---------------- .../test_base_battery_model.py | 20 +++++++++++++++ .../test_parameters/test_base_parameters.py | 9 +++++++ 6 files changed, 37 insertions(+), 27 deletions(-) diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py index 1a33061d73..ddb97a482e 100644 --- a/examples/scripts/compare_lithium_ion_two_phase.py +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -7,9 +7,9 @@ # load models models = [ - # pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), + pybamm.lithium_ion.SPM({"particle phases": ("2", "1")}), pybamm.lithium_ion.SPMe({"particle phases": ("2", "1")}), - # pybamm.lithium_ion.DFN({"particle phases": ("2", "1")}), + pybamm.lithium_ion.DFN({"particle phases": ("2", "1")}), ] parameter_set = pybamm.parameter_sets.Chen2020 diff --git a/pybamm/models/full_battery_models/base_battery_model.py b/pybamm/models/full_battery_models/base_battery_model.py index 6f16f4f992..3ead49e7ab 100644 --- a/pybamm/models/full_battery_models/base_battery_model.py +++ b/pybamm/models/full_battery_models/base_battery_model.py @@ -539,7 +539,7 @@ def __init__(self, extra_options): value_list = [] for val in value: if isinstance(val, tuple): - value_list.extend(val) + value_list.extend(list(val)) else: value_list.append(val) for val in value_list: diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 9216c6fe82..010f24c68b 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -63,9 +63,7 @@ def _get_exchange_current_density(self, variables): c_e = variables[f"{Domain} electrolyte concentration"] T = variables[f"{Domain} electrode temperature"] - if isinstance(self, pybamm.kinetics.NoReaction): - return pybamm.Scalar(0) - elif self.reaction == "lithium-ion main": + if self.reaction == "lithium-ion main": # For "particle-size distribution" submodels, take distribution version # of c_s_surf that depends on particle size. if self.options["particle size"] == "distribution": diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index c75096f4bb..ef1abd9262 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -890,20 +890,16 @@ def j0_dimensional(self, c_e, c_s_surf, T): inputs, ) - def U_dimensional(self, sto, T, lithiation=None): + def U_dimensional(self, sto, T): """Dimensional open-circuit potential [V]""" # bound stoichiometry between tol and 1-tol. Adding 1/sto + 1/(sto-1) later # will ensure that ocp goes to +- infinity if sto goes into that region # anyway tol = pybamm.settings.tolerances["U__c_s"] sto = pybamm.maximum(pybamm.minimum(sto, 1 - tol), tol) - if lithiation is None: - lithiation = "" - else: - lithiation = lithiation + " " inputs = {f"{self.phase_prefactor}{self.domain} particle stoichiometry": sto} u_ref = pybamm.FunctionParameter( - f"{self.phase_prefactor}{self.domain} electrode {lithiation}OCP [V]", inputs + f"{self.phase_prefactor}{self.domain} electrode OCP [V]", inputs ) # add a term to ensure that the OCP goes to infinity at 0 and -infinity at 1 # this will not affect the OCP for most values of sto @@ -1015,13 +1011,13 @@ def j0(self, c_e, c_s_surf, T): return self.j0_dimensional(c_e_dim, c_s_surf_dim, T_dim) / self.j_scale - def U(self, c_s, T, lithiation=None): + def U(self, c_s, T): """Dimensionless open-circuit potential in the electrode""" main = self.main_param sto = c_s T_dim = self.main_param.Delta_T * T + self.main_param.T_ref return ( - self.U_dimensional(sto, T_dim, lithiation) - self.domain_param.U_ref + self.U_dimensional(sto, T_dim) - self.domain_param.U_ref ) / main.potential_scale def dUdT(self, c_s): @@ -1043,16 +1039,3 @@ def t_change(self, sto): "surface concentration [mol.m-3]": self.c_max, }, ) - - def k_cr(self, T): - """ - Dimensionless cracking rate for the electrode; - """ - T_dim = self.main_param.Delta_T * T + self.main_param.T_ref - delta_k_cr = self.E ** self.m_cr * self.l_cr_0 ** (self.m_cr / 2 - 1) - return ( - pybamm.FunctionParameter( - f"{self.domain} electrode cracking rate", {"Temperature [K]": T_dim} - ) - * delta_k_cr - ) diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index 815c928db6..f58afe5785 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -337,6 +337,10 @@ def test_options(self): } ) + # phases + with self.assertRaisesRegex(pybamm.OptionError, "multiple particle phases"): + pybamm.BaseBatteryModel({"particle phases": "2", "surface form": "false"}) + def test_build_twice(self): model = pybamm.lithium_ion.SPM() # need to pick a model to set vars and build with self.assertRaisesRegex(pybamm.ModelError, "Model already built"): @@ -387,6 +391,22 @@ def test_domain_options(self): self.assertEqual(options.negative["thermal"], "isothermal") self.assertEqual(options.positive["thermal"], "isothermal") + def test_domain_phase_options(self): + options = BatteryModelOptions( + {"particle mechanics": (("swelling only", "swelling and cracking"), "none")} + ) + self.assertEqual( + options.negative["particle mechanics"], + ("swelling only", "swelling and cracking"), + ) + self.assertEqual( + options.negative.primary["particle mechanics"], "swelling only" + ) + self.assertEqual( + options.negative.secondary["particle mechanics"], "swelling and cracking" + ) + self.assertEqual(options.positive["particle mechanics"], "none") + if __name__ == "__main__": print("Add -v for more debug output") diff --git a/tests/unit/test_parameters/test_base_parameters.py b/tests/unit/test_parameters/test_base_parameters.py index 5a3002a10d..02cdcc9984 100644 --- a/tests/unit/test_parameters/test_base_parameters.py +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -22,6 +22,15 @@ def test_getattr__(self): with self.assertRaisesRegex(AttributeError, "param.p.prim.U_dimensional"): getattr(param, "U_p_dimensional") + # _n_ or _p_ not in name + with self.assertRaisesRegex( + AttributeError, "has no attribute 'c_n_not_a_parameter" + ): + getattr(param, "c_n_not_a_parameter") + + with self.assertRaisesRegex(AttributeError, "has no attribute 'c_s_test"): + getattr(pybamm.electrical_parameters, "c_s_test") + def test__setattr__(self): param = pybamm.ElectricalParameters() self.assertEqual(param.I_typ.print_name, r"I{}^{typ}") From 79b6fe4f3d8f2ef724b5d71f7bc0c7b52a09d87f Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 22 Aug 2022 12:13:50 +0100 Subject: [PATCH 38/47] coverage --- .../test_base_battery_model.py | 2 ++ .../test_lead_acid_parameters.py | 17 +++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index f58afe5785..a3a54eed12 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -406,6 +406,8 @@ def test_domain_phase_options(self): options.negative.secondary["particle mechanics"], "swelling and cracking" ) self.assertEqual(options.positive["particle mechanics"], "none") + self.assertEqual(options.positive.primary["particle mechanics"], "none") + self.assertEqual(options.positive.secondary["particle mechanics"], "none") if __name__ == "__main__": diff --git a/tests/unit/test_parameters/test_lead_acid_parameters.py b/tests/unit/test_parameters/test_lead_acid_parameters.py index e1f79514ae..7a05e910d0 100644 --- a/tests/unit/test_parameters/test_lead_acid_parameters.py +++ b/tests/unit/test_parameters/test_lead_acid_parameters.py @@ -34,20 +34,17 @@ def test_parameters_defaults_lead_acid(self): self.assertLess(param_eval["C_e"], param_eval["C_rate"]) # Dimensionless electrode conductivities should be large + self.assertGreater(parameter_values.evaluate(parameters.n.sigma(0)), 10) + self.assertGreater(parameter_values.evaluate(parameters.p.sigma(0)), 10) + + # Dimensionless oxygen exchange current density should be small self.assertGreater( - parameter_values.evaluate(parameters.n.sigma(parameters.T_ref)), 10 - ) - self.assertGreater( - parameter_values.evaluate(parameters.p.sigma(parameters.T_ref)), 10 + 1e-10, parameter_values.evaluate(parameters.p.prim.j0_Ox(1, 0)) ) # Rescaled dimensionless electrode conductivities should still be large - self.assertGreater( - parameter_values.evaluate(parameters.n.sigma_prime(parameters.T_ref)), 10 - ) - self.assertGreater( - parameter_values.evaluate(parameters.p.sigma_prime(parameters.T_ref)), 10 - ) + self.assertGreater(parameter_values.evaluate(parameters.n.sigma_prime(0)), 10) + self.assertGreater(parameter_values.evaluate(parameters.p.sigma_prime(0)), 10) # Dimensionless double-layer capacity should be small self.assertLess(param_eval["n.C_dl"], 1e-3) self.assertLess(param_eval["p.C_dl"], 1e-3) From 6062891335ab96b0fe6679cfb580354a45632bb5 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 22 Aug 2022 15:21:31 +0100 Subject: [PATCH 39/47] codacy? --- .../models/full_battery_models/lithium_ion/newman_tobias.py | 4 +++- .../models/submodels/active_material/total_active_material.py | 2 +- .../submodels/interface/kinetics/total_main_kinetics.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py index 7e07ec4301..35e835638b 100644 --- a/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py +++ b/pybamm/models/full_battery_models/lithium_ion/newman_tobias.py @@ -59,7 +59,9 @@ def __init__(self, options=None, name="Newman-Tobias model", build=True): def set_particle_submodel(self): for domain in ["negative", "positive"]: particle = getattr(self.options, domain)["particle"] - phases = ["primary"] + phases = self.options.phase_number_to_names( + getattr(self.options, domain)["particle phases"] + ) for phase in phases: if particle == "Fickian diffusion": submod = pybamm.particle.FickianDiffusion( diff --git a/pybamm/models/submodels/active_material/total_active_material.py b/pybamm/models/submodels/active_material/total_active_material.py index 3ebab6cea8..1eea78852c 100644 --- a/pybamm/models/submodels/active_material/total_active_material.py +++ b/pybamm/models/submodels/active_material/total_active_material.py @@ -28,7 +28,7 @@ def get_coupled_variables(self, variables): Domain = self.domain domain = Domain.lower() - phases = phases = self.options.phase_number_to_names( + phases = self.options.phase_number_to_names( getattr(self.options, domain)["particle phases"] ) eps_solid = sum( diff --git a/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py b/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py index 1ee053b4b2..fbf88e91df 100644 --- a/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/total_main_kinetics.py @@ -36,7 +36,7 @@ def get_coupled_variables(self, variables): Domain = self.domain domain = Domain.lower() - phases = phases = self.options.phase_number_to_names( + phases = self.options.phase_number_to_names( getattr(self.options, domain)["particle phases"] ) From 0e565177565024d9ee576d4ec5b8989267b6d85c Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 12:49:39 +0100 Subject: [PATCH 40/47] Ferran comments --- .../scripts/compare_lithium_ion_two_phase.py | 3 --- .../submodels/interface/base_interface.py | 18 ++++++------------ .../interface/kinetics/diffusion_limited.py | 4 ++-- .../first_order_kinetics.py | 7 ++++--- .../inverse_kinetics/inverse_butler_volmer.py | 4 ++-- .../test_lithium_ion/base_lithium_ion_tests.py | 2 +- .../test_lithium_ion/test_newman_tobias.py | 2 +- 7 files changed, 16 insertions(+), 24 deletions(-) diff --git a/examples/scripts/compare_lithium_ion_two_phase.py b/examples/scripts/compare_lithium_ion_two_phase.py index ddb97a482e..303ef7356b 100644 --- a/examples/scripts/compare_lithium_ion_two_phase.py +++ b/examples/scripts/compare_lithium_ion_two_phase.py @@ -49,9 +49,6 @@ ) del parameter_values["Negative electrode active material volume fraction"] -# print(parameter_values.evaluate(models[0].param.n.prim.a_R)) -# print(parameter_values.evaluate(models[0].param.n.sec.a_R)) - # create and run simulations sims = [] for model in models: diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 010f24c68b..21a6ba13ac 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -284,31 +284,25 @@ def _get_standard_volumetric_current_density_variables(self, variables): if isinstance(self, pybamm.kinetics.NoReaction): a = 1 - a_av = 1 else: a = variables[ f"{Domain} electrode {phase_name}surface area to volume ratio" ] - a_av = variables[ - f"X-averaged {domain} electrode {phase_name}" - "surface area to volume ratio" - ] j = variables[f"{Domain} electrode {reaction_name}interfacial current density"] - j_av = variables[ - f"X-averaged {domain} electrode {reaction_name}interfacial current density" - ] + a_j = a * j + a_j_av = pybamm.x_average(a_j) scale = self.param.i_typ / self.param.L_x variables.update( { f"{Domain} electrode {reaction_name}volumetric " - "interfacial current density": a * j, + "interfacial current density": a_j, f"X-averaged {domain} electrode {reaction_name}volumetric " - "interfacial current density": a_av * j_av, + "interfacial current density": a_j_av, f"{Domain} electrode {reaction_name}volumetric " - "interfacial current density [A.m-3]": scale * a * j, + "interfacial current density [A.m-3]": scale * a_j, f"X-averaged {domain} electrode {reaction_name}volumetric " - "interfacial current density [A.m-3]": scale * a_av * j_av, + "interfacial current density [A.m-3]": scale * a_j_av, } ) return variables diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index c5aa6b30de..9a9ae8a9b7 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -30,7 +30,7 @@ def __init__(self, param, domain, reaction, order): def get_coupled_variables(self, variables): Domain = self.domain - rxn = self.reaction_name + reaction_name = self.reaction_name delta_phi_s = variables[self.domain + " electrode surface potential difference"] # If delta_phi_s was broadcast, take only the orphan @@ -40,7 +40,7 @@ def get_coupled_variables(self, variables): # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {reaction_name}open circuit potential"] eta_r = delta_phi_s - ocp # Get interfacial current densities diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index 9035bf6ec1..78c753892f 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -28,7 +28,7 @@ def __init__(self, param, domain, leading_order_model): def get_coupled_variables(self, variables): Domain = self.domain domain = Domain.lower() - rxn = self.reaction_name + reaction_name = self.reaction_name # Unpack c_e_0 = variables[f"Leading-order {domain} electrolyte concentration"] @@ -57,14 +57,15 @@ def get_coupled_variables(self, variables): delta_phi_1 = (delta_phi - delta_phi_0) / self.param.C_e j_0 = variables[ - f"Leading-order {domain} electrode {rxn}interfacial current density" + f"Leading-order {domain} electrode {reaction_name}" + "interfacial current density" ] j_1 = dj_dc_0 * c_e_1 + dj_ddeltaphi_0 * delta_phi_1 j = j_0 + self.param.C_e * j_1 # Get exchange-current density j0 = self._get_exchange_current_density(variables) # Get open-circuit potential variables and reaction overpotential - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {reaction_name}open circuit potential"] eta_r = delta_phi - ocp variables.update(self._get_standard_interfacial_current_variables(j)) diff --git a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py index 6b0151e895..3915d700da 100644 --- a/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/inverse_kinetics/inverse_butler_volmer.py @@ -31,9 +31,9 @@ def __init__(self, param, domain, reaction, options=None): def get_coupled_variables(self, variables): Domain = self.domain - rxn = self.reaction_name + reaction_name = self.reaction_name - ocp = variables[f"{Domain} electrode {rxn}open circuit potential"] + ocp = variables[f"{Domain} electrode {reaction_name}open circuit potential"] j0 = self._get_exchange_current_density(variables) # Broadcast to match j0's domain diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 71dec123b0..c3c2761e34 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -314,7 +314,7 @@ def external_circuit_function(variables): options = {"operating mode": external_circuit_function} self.check_well_posedness(options) - def test_wel_posed_particle_phases(self): + def test_well_posed_particle_phases(self): options = {"particle phases": "2"} self.check_well_posedness(options) diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py index 1916c8818c..17480d538c 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_newman_tobias.py @@ -15,7 +15,7 @@ def test_electrolyte_options(self): with self.assertRaisesRegex(pybamm.OptionError, "electrolyte conductivity"): pybamm.lithium_ion.NewmanTobias(options) - def test_wel_posed_particle_phases(self): + def test_well_posed_particle_phases(self): pass # skip this test From 64484f64725aafa71d836ff2653e6a39d7d3bec9 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 14:46:06 +0100 Subject: [PATCH 41/47] make 'phase' optional --- .../full_battery_models/lithium_ion/dfn.py | 4 -- .../full_battery_models/lithium_ion/spm.py | 4 -- .../active_material/base_active_material.py | 4 +- .../constant_active_material.py | 4 +- pybamm/models/submodels/base_submodel.py | 38 ++++++++++++------- .../submodels/interface/base_interface.py | 6 +-- .../interface/kinetics/base_kinetics.py | 6 +-- .../interface/kinetics/butler_volmer.py | 12 +++--- .../submodels/interface/kinetics/linear.py | 6 +-- .../submodels/interface/kinetics/marcus.py | 14 +++---- .../interface/kinetics/no_reaction.py | 4 +- .../submodels/interface/kinetics/tafel.py | 6 +-- .../open_circuit_potential/base_ocp.py | 6 +-- .../submodels/particle/base_particle.py | 8 ++-- .../submodels/particle/fickian_diffusion.py | 8 ++-- .../submodels/particle/polynomial_profile.py | 10 ++--- .../particle/x_averaged_polynomial_profile.py | 10 ++--- .../particle_mechanics/base_mechanics.py | 6 +-- .../particle_mechanics/crack_propagation.py | 8 ++-- .../particle_mechanics/no_mechanics.py | 6 +-- .../particle_mechanics/swelling_only.py | 6 +-- .../test_submodels/test_base_submodel.py | 37 +++++++++++++++++- 22 files changed, 125 insertions(+), 88 deletions(-) diff --git a/pybamm/models/full_battery_models/lithium_ion/dfn.py b/pybamm/models/full_battery_models/lithium_ion/dfn.py index 3296a8581a..a11dee1d65 100644 --- a/pybamm/models/full_battery_models/lithium_ion/dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/dfn.py @@ -69,10 +69,6 @@ def set_intercalation_kinetics_submodel(self): submod = intercalation_kinetics( self.param, domain, "lithium-ion main", self.options, phase ) - else: - submod = pybamm.kinetics.NoReaction( - self.param, domain, "lithium-ion main", phase - ) self.submodels[f"{domain.lower()} {phase} interface"] = submod diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index f1c672dcae..8d15c717fe 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -105,10 +105,6 @@ def set_intercalation_kinetics_submodel(self): submod = intercalation_kinetics( self.param, domain, "lithium-ion main", self.options, phase ) - else: - submod = pybamm.kinetics.NoReaction( - self.param, domain, "lithium-ion main", phase - ) self.submodels[f"{domain} {phase} interface"] = submod if len(phases) > 1: diff --git a/pybamm/models/submodels/active_material/base_active_material.py b/pybamm/models/submodels/active_material/base_active_material.py index 243665d3ae..dd4a1ecbaa 100644 --- a/pybamm/models/submodels/active_material/base_active_material.py +++ b/pybamm/models/submodels/active_material/base_active_material.py @@ -15,8 +15,8 @@ class BaseModel(pybamm.BaseSubModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.BaseSubModel` """ diff --git a/pybamm/models/submodels/active_material/constant_active_material.py b/pybamm/models/submodels/active_material/constant_active_material.py index cc5021999e..020fde9757 100644 --- a/pybamm/models/submodels/active_material/constant_active_material.py +++ b/pybamm/models/submodels/active_material/constant_active_material.py @@ -17,8 +17,8 @@ class Constant(BaseModel): The domain of the model either 'Negative' or 'Positive' options : dict Additional options to pass to the model - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.active_material.BaseModel` """ diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index ff53a041cb..c816e74dfc 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -26,8 +26,8 @@ class BaseSubModel(pybamm.BaseModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is None). Attributes ---------- @@ -88,19 +88,29 @@ def __init__( elif self.domain == "Positive": self.domain_param = param.p - if phase is not None: - if phase == "primary": - self.phase_param = self.domain_param.prim - elif phase == "secondary": - self.phase_param = self.domain_param.sec - + if phase == "primary": + self.phase_param = self.domain_param.prim + elif phase == "secondary": + self.phase_param = self.domain_param.sec + + # Error checks for phase and domain + if phase is not None: + if domain is None: + raise ValueError("Phase must be None if domain is None") + options_phase = getattr(self.options, domain.lower())["particle phases"] + if options_phase == "1" and phase != "primary": + raise ValueError("Phase must be 'primary' if there is only one phase") + elif options_phase == "2" and phase not in ["primary", "secondary"]: + raise ValueError( + "Phase must be either 'primary' or 'secondary' " + "if there are two phases" + ) self.phase = phase - if phase is None or ( - phase == "primary" - and getattr(self.options, domain.lower())["particle phases"] == "1" - ): - # Only one phase, no need to distinguish between - # "primary" and "secondary" + + if phase is None: + self.phase_name = None + elif options_phase == "1": + # Only one phase, no need to distinguish between "primary" and "secondary" self.phase_name = "" else: # add a space so that we can use "" or (e.g.) "primary " interchangeably diff --git a/pybamm/models/submodels/interface/base_interface.py b/pybamm/models/submodels/interface/base_interface.py index 21a6ba13ac..1b9cd8c1fa 100644 --- a/pybamm/models/submodels/interface/base_interface.py +++ b/pybamm/models/submodels/interface/base_interface.py @@ -20,13 +20,13 @@ class BaseInterface(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options=None, phase="primary"): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, options=options, phase=phase) if reaction in ["lithium-ion main", "lithium metal plating"]: self.reaction_name = self.phase_name diff --git a/pybamm/models/submodels/interface/kinetics/base_kinetics.py b/pybamm/models/submodels/interface/kinetics/base_kinetics.py index 2da1d9acaa..d49f2309db 100644 --- a/pybamm/models/submodels/interface/kinetics/base_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/base_kinetics.py @@ -20,13 +20,13 @@ class BaseKinetics(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options=options, phase=phase) def get_fundamental_variables(self): diff --git a/pybamm/models/submodels/interface/kinetics/butler_volmer.py b/pybamm/models/submodels/interface/kinetics/butler_volmer.py index 65f66e3327..68bdc7461b 100644 --- a/pybamm/models/submodels/interface/kinetics/butler_volmer.py +++ b/pybamm/models/submodels/interface/kinetics/butler_volmer.py @@ -24,13 +24,13 @@ class SymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): @@ -79,13 +79,13 @@ class AsymmetricButlerVolmer(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): diff --git a/pybamm/models/submodels/interface/kinetics/linear.py b/pybamm/models/submodels/interface/kinetics/linear.py index 4c1000af77..ac806b1877 100644 --- a/pybamm/models/submodels/interface/kinetics/linear.py +++ b/pybamm/models/submodels/interface/kinetics/linear.py @@ -20,13 +20,13 @@ class Linear(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): diff --git a/pybamm/models/submodels/interface/kinetics/marcus.py b/pybamm/models/submodels/interface/kinetics/marcus.py index 887d6d6e29..3bd3a1d13f 100644 --- a/pybamm/models/submodels/interface/kinetics/marcus.py +++ b/pybamm/models/submodels/interface/kinetics/marcus.py @@ -22,13 +22,13 @@ class Marcus(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") @@ -64,13 +64,13 @@ class MarcusHushChidsey(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) pybamm.citations.register("Sripad2020") @@ -81,6 +81,6 @@ def _get_kinetics(self, j0, ne, eta_r, T, u): lambda_T = mhc_lambda / kT eta = eta_r / kT a = 1 + pybamm.sqrt(lambda_T) - arg = (lambda_T - pybamm.sqrt(a + eta ** 2)) / (2 * pybamm.sqrt(lambda_T)) + arg = (lambda_T - pybamm.sqrt(a + eta**2)) / (2 * pybamm.sqrt(lambda_T)) pref = pybamm.sqrt(np.pi * lambda_T) * pybamm.tanh(eta / 2) return u * j0 * pref * pybamm.erfc(arg) diff --git a/pybamm/models/submodels/interface/kinetics/no_reaction.py b/pybamm/models/submodels/interface/kinetics/no_reaction.py index b586c0a531..0e01f19a1e 100644 --- a/pybamm/models/submodels/interface/kinetics/no_reaction.py +++ b/pybamm/models/submodels/interface/kinetics/no_reaction.py @@ -18,8 +18,8 @@ class NoReaction(BaseInterface): The domain to implement the model, either: 'Negative' or 'Positive'. reaction : str The name of the reaction being implemented - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ diff --git a/pybamm/models/submodels/interface/kinetics/tafel.py b/pybamm/models/submodels/interface/kinetics/tafel.py index ed187db82d..eb9083d068 100644 --- a/pybamm/models/submodels/interface/kinetics/tafel.py +++ b/pybamm/models/submodels/interface/kinetics/tafel.py @@ -23,13 +23,13 @@ class ForwardTafel(BaseKinetics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.interface.kinetics.BaseKinetics` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options, phase) def _get_kinetics(self, j0, ne, eta_r, T, u): diff --git a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py index 30c06bb782..bf8010b9ee 100644 --- a/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py +++ b/pybamm/models/submodels/interface/open_circuit_potential/base_ocp.py @@ -20,13 +20,13 @@ class BaseOpenCircuitPotential(BaseInterface): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, reaction, options, phase): + def __init__(self, param, domain, reaction, options, phase="primary"): super().__init__(param, domain, reaction, options=options, phase=phase) def _get_standard_ocp_variables(self, ocp, dUdT): diff --git a/pybamm/models/submodels/particle/base_particle.py b/pybamm/models/submodels/particle/base_particle.py index 5471ad0bf2..6272f509b4 100644 --- a/pybamm/models/submodels/particle/base_particle.py +++ b/pybamm/models/submodels/particle/base_particle.py @@ -17,13 +17,13 @@ class BaseParticle(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options=None, phase=None): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options=options, phase=phase) # Read from options to see if we have a particle size distribution self.size_distribution = self.options["particle size"] == "distribution" @@ -188,7 +188,7 @@ def _get_distribution_variables(self, R): f_v_dist = R * f_a_dist / pybamm.Integral(R * f_a_dist, R) # Number-based particle-size distribution - f_num_dist = (f_a_dist / R ** 2) / pybamm.Integral(f_a_dist / R ** 2, R) + f_num_dist = (f_a_dist / R**2) / pybamm.Integral(f_a_dist / R**2, R) # True mean radii and standard deviations, calculated from the f_a_dist that # was given diff --git a/pybamm/models/submodels/particle/fickian_diffusion.py b/pybamm/models/submodels/particle/fickian_diffusion.py index 7a5f1a67d5..87e6b4b5ac 100644 --- a/pybamm/models/submodels/particle/fickian_diffusion.py +++ b/pybamm/models/submodels/particle/fickian_diffusion.py @@ -18,15 +18,15 @@ class FickianDiffusion(BaseParticle): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") x_average : bool Whether the particle concentration is averaged over the x-direction **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options, phase=None, x_average=False): + def __init__(self, param, domain, options, phase="primary", x_average=False): super().__init__(param, domain, options, phase) self.x_average = x_average @@ -194,7 +194,7 @@ def get_coupled_variables(self, variables): variables.update( { f"{Domain} {phase_name}particle rhs": -( - 1 / (R_broad ** 2 * phase_param.C_diff) + 1 / (R_broad**2 * phase_param.C_diff) ) * pybamm.div(N_s), f"{Domain} {phase_name}particle bc": -phase_param.C_diff diff --git a/pybamm/models/submodels/particle/polynomial_profile.py b/pybamm/models/submodels/particle/polynomial_profile.py index 3454124bab..f49598a93a 100644 --- a/pybamm/models/submodels/particle/polynomial_profile.py +++ b/pybamm/models/submodels/particle/polynomial_profile.py @@ -21,8 +21,8 @@ class PolynomialProfile(BaseParticle): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") References ---------- @@ -33,7 +33,7 @@ class PolynomialProfile(BaseParticle): **Extends:** :class:`pybamm.particle.BaseParticle` """ - def __init__(self, param, domain, options, phase=None): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options, phase) self.name = getattr(self.options, domain.lower())["particle"] if self.name == "Fickian diffusion": @@ -150,7 +150,7 @@ def get_fundamental_variables(self): }, coord_sys="spherical polar", ) - c_s = A + B * r ** 2 + C * r ** 4 + c_s = A + B * r**2 + C * r**4 variables.update( self._get_standard_concentration_variables( @@ -205,7 +205,7 @@ def get_coupled_variables(self, variables): # The flux may be computed directly from the polynomial for c N_s = -D_eff * ( (-70 * c_s_surf + 20 * q_s_rav + 70 * c_s_rav) * r - + (105 * c_s_surf - 28 * q_s_rav - 105 * c_s_rav) * r ** 3 + + (105 * c_s_surf - 28 * q_s_rav - 105 * c_s_rav) * r**3 ) variables.update(self._get_standard_flux_variables(N_s)) diff --git a/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py b/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py index 33c6baf93f..40a83f4fb6 100644 --- a/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py +++ b/pybamm/models/submodels/particle/x_averaged_polynomial_profile.py @@ -20,8 +20,8 @@ class XAveragedPolynomialProfile(PolynomialProfile): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") References ---------- @@ -32,7 +32,7 @@ class XAveragedPolynomialProfile(PolynomialProfile): **Extends:** :class:`pybamm.particle.PolynomialProfile` """ - def __init__(self, param, domain, options, phase=None): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options, phase) def get_fundamental_variables(self): @@ -182,7 +182,7 @@ def get_coupled_variables(self, variables): A = pybamm.PrimaryBroadcast(A, [f"{domain} particle"]) B = pybamm.PrimaryBroadcast(B, [f"{domain} particle"]) C = pybamm.PrimaryBroadcast(C, [f"{domain} particle"]) - c_s_xav = A + B * r ** 2 + C * r ** 4 + c_s_xav = A + B * r**2 + C * r**4 c_s = pybamm.SecondaryBroadcast(c_s_xav, [f"{domain} electrode"]) c_s_surf = pybamm.PrimaryBroadcast(c_s_surf_xav, [f"{domain} electrode"]) @@ -205,7 +205,7 @@ def get_coupled_variables(self, variables): # The flux may be computed directly from the polynomial for c N_s_xav = -D_eff_xav * ( (-70 * c_s_surf_xav + 20 * q_s_av + 70 * c_s_av) * r - + (105 * c_s_surf_xav - 28 * q_s_av - 105 * c_s_av) * r ** 3 + + (105 * c_s_surf_xav - 28 * q_s_av - 105 * c_s_av) * r**3 ) N_s = pybamm.SecondaryBroadcast(N_s_xav, [f"{domain} electrode"]) diff --git a/pybamm/models/submodels/particle_mechanics/base_mechanics.py b/pybamm/models/submodels/particle_mechanics/base_mechanics.py index 89a9036b7b..e22614082e 100644 --- a/pybamm/models/submodels/particle_mechanics/base_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/base_mechanics.py @@ -18,8 +18,8 @@ class BaseMechanics(pybamm.BaseSubModel): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") References ---------- @@ -33,7 +33,7 @@ class BaseMechanics(pybamm.BaseSubModel): **Extends:** :class:`pybamm.BaseSubModel` """ - def __init__(self, param, domain, options, phase): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options=options, phase=phase) pybamm.citations.register("Ai2019") diff --git a/pybamm/models/submodels/particle_mechanics/crack_propagation.py b/pybamm/models/submodels/particle_mechanics/crack_propagation.py index fa39793d94..43741b9605 100644 --- a/pybamm/models/submodels/particle_mechanics/crack_propagation.py +++ b/pybamm/models/submodels/particle_mechanics/crack_propagation.py @@ -21,8 +21,8 @@ class CrackPropagation(BaseMechanics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") References ---------- @@ -33,7 +33,7 @@ class CrackPropagation(BaseMechanics): **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain, x_average, options, phase): + def __init__(self, param, domain, x_average, options, phase="primary"): super().__init__(param, domain, options, phase) self.x_average = x_average @@ -63,7 +63,7 @@ def get_coupled_variables(self, variables): l_cr = variables[self.domain + " particle crack length"] # # compressive stress will not lead to crack propagation dK_SIF = stress_t_surf * b_cr * pybamm.Sqrt(np.pi * l_cr) * (stress_t_surf >= 0) - dl_cr = k_cr * (dK_SIF ** m_cr) / self.param.t0_cr + dl_cr = k_cr * (dK_SIF**m_cr) / self.param.t0_cr variables.update( { self.domain + " particle cracking rate": dl_cr, diff --git a/pybamm/models/submodels/particle_mechanics/no_mechanics.py b/pybamm/models/submodels/particle_mechanics/no_mechanics.py index 7d3f219759..1d3eb567c1 100644 --- a/pybamm/models/submodels/particle_mechanics/no_mechanics.py +++ b/pybamm/models/submodels/particle_mechanics/no_mechanics.py @@ -18,13 +18,13 @@ class NoMechanics(BaseMechanics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain, options, phase): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options, phase) def get_fundamental_variables(self): diff --git a/pybamm/models/submodels/particle_mechanics/swelling_only.py b/pybamm/models/submodels/particle_mechanics/swelling_only.py index 937ecdcb54..83291566ae 100644 --- a/pybamm/models/submodels/particle_mechanics/swelling_only.py +++ b/pybamm/models/submodels/particle_mechanics/swelling_only.py @@ -18,13 +18,13 @@ class SwellingOnly(BaseMechanics): options: dict A dictionary of options to be passed to the model. See :class:`pybamm.BaseBatteryModel` - phase : str - Phase of the particle + phase : str, optional + Phase of the particle (default is "primary") **Extends:** :class:`pybamm.particle_mechanics.BaseMechanics` """ - def __init__(self, param, domain, options, phase): + def __init__(self, param, domain, options, phase="primary"): super().__init__(param, domain, options, phase) def get_fundamental_variables(self): diff --git a/tests/unit/test_models/test_submodels/test_base_submodel.py b/tests/unit/test_models/test_submodels/test_base_submodel.py index 9a2bbc8a24..2f59d164c4 100644 --- a/tests/unit/test_models/test_submodels/test_base_submodel.py +++ b/tests/unit/test_models/test_submodels/test_base_submodel.py @@ -9,7 +9,7 @@ class TestBaseSubModel(unittest.TestCase): def test_domain(self): # Accepted string - submodel = pybamm.BaseSubModel(None, "Negative") + submodel = pybamm.BaseSubModel(None, "Negative", phase="primary") self.assertEqual(submodel.domain, "Negative") # None @@ -20,6 +20,41 @@ def test_domain(self): with self.assertRaises(pybamm.DomainError): pybamm.BaseSubModel(None, "bad string") + def test_phase(self): + # Without domain + submodel = pybamm.BaseSubModel(None, None) + self.assertEqual(submodel.phase, None) + self.assertEqual(submodel.phase_name, None) + + with self.assertRaisesRegex(ValueError, "Phase must be None"): + pybamm.BaseSubModel(None, None, phase="primary") + + # With domain + submodel = pybamm.BaseSubModel(None, "Negative", phase="primary") + self.assertEqual(submodel.phase, "primary") + self.assertEqual(submodel.phase_name, "") + + submodel = pybamm.BaseSubModel( + None, "Negative", options={"particle phases": "2"}, phase="secondary" + ) + self.assertEqual(submodel.phase, "secondary") + self.assertEqual(submodel.phase_name, "secondary ") + + with self.assertRaisesRegex(ValueError, "Phase must be 'primary'"): + pybamm.BaseSubModel(None, "Negative", phase="secondary") + with self.assertRaisesRegex(ValueError, "Phase must be either 'primary'"): + pybamm.BaseSubModel( + None, "Negative", options={"particle phases": "2"}, phase="tertiary" + ) + with self.assertRaisesRegex(ValueError, "Phase must be 'primary'"): + # 2 phases in the negative but only 1 in the positive + pybamm.BaseSubModel( + None, + "Positive", + options={"particle phases": ("2", "1")}, + phase="secondary", + ) + if __name__ == "__main__": print("Add -v for more debug output") From 85cddeb23bd8f2d1bc6d9e713124e9c9ebd6e766 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 16:33:04 +0100 Subject: [PATCH 42/47] fix some tests --- examples/scripts/compare_lithium_ion.py | 14 ++++++++--- .../full_battery_models/lead_acid/full.py | 2 +- .../lead_acid/higher_order.py | 25 ++++++++++++++----- .../full_battery_models/lead_acid/loqs.py | 6 ++++- .../full_battery_models/lithium_ion/dfn.py | 2 +- pybamm/models/submodels/base_submodel.py | 19 +++++++------- .../full_surface_form_conductivity.py | 3 +-- .../interface/kinetics/diffusion_limited.py | 7 ++++-- .../first_order_kinetics.py | 7 ++++-- .../inverse_first_order_kinetics.py | 7 ++++-- 10 files changed, 61 insertions(+), 31 deletions(-) diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index 6108036b9b..a0fecc26bf 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -7,10 +7,16 @@ # load models models = [ - pybamm.lithium_ion.SPM(), - pybamm.lithium_ion.SPMe(), - pybamm.lithium_ion.DFN(), - pybamm.lithium_ion.NewmanTobias(), + # pybamm.lithium_ion.SPM(), + # pybamm.lithium_ion.SPMe(), + pybamm.lithium_ion.DFN( + { + "SEI": "solvent-diffusion limited", + "SEI on cracks": "true", + "particle mechanics": "swelling and cracking", + } + ), + # pybamm.lithium_ion.NewmanTobias(), ] # create and run simulations diff --git a/pybamm/models/full_battery_models/lead_acid/full.py b/pybamm/models/full_battery_models/lead_acid/full.py index 9f9ea760ba..a3e0a0d64b 100644 --- a/pybamm/models/full_battery_models/lead_acid/full.py +++ b/pybamm/models/full_battery_models/lead_acid/full.py @@ -136,7 +136,7 @@ def set_side_reaction_submodels(self): self.submodels[ "negative oxygen interface" ] = pybamm.kinetics.DiffusionLimited( - self.param, "Negative", "lead-acid oxygen", order="full" + self.param, "Negative", "lead-acid oxygen", self.options, order="full" ) else: self.submodels["oxygen diffusion"] = pybamm.oxygen_diffusion.NoOxygen( diff --git a/pybamm/models/full_battery_models/lead_acid/higher_order.py b/pybamm/models/full_battery_models/lead_acid/higher_order.py index 27a6d10f11..b023045eb7 100644 --- a/pybamm/models/full_battery_models/lead_acid/higher_order.py +++ b/pybamm/models/full_battery_models/lead_acid/higher_order.py @@ -125,12 +125,18 @@ def set_average_interfacial_submodel(self): self.submodels[ "x-averaged negative interface" ] = pybamm.kinetics.InverseFirstOrderKinetics( - self.param, "Negative", self.leading_order_reaction_submodels["Negative"] + self.param, + "Negative", + self.leading_order_reaction_submodels["Negative"], + self.options, ) self.submodels[ "x-averaged positive interface" ] = pybamm.kinetics.InverseFirstOrderKinetics( - self.param, "Positive", self.leading_order_reaction_submodels["Positive"] + self.param, + "Positive", + self.leading_order_reaction_submodels["Positive"], + self.options, ) def set_electrolyte_conductivity_submodel(self): @@ -160,15 +166,17 @@ def set_full_interface_submodel(self): self.param, "Negative", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Negative", "lead-acid main", self.options, "primary" + self.param, "Negative", "lead-acid main", self.options ), + self.options, ) self.submodels["positive interface"] = pybamm.kinetics.FirstOrderKinetics( self.param, "Positive", pybamm.kinetics.SymmetricButlerVolmer( - self.param, "Positive", "lead-acid main", self.options, "primary" + self.param, "Positive", "lead-acid main", self.options ), + self.options, ) # Oxygen @@ -179,13 +187,18 @@ def set_full_interface_submodel(self): self.param, "Positive", pybamm.kinetics.ForwardTafel( - self.param, "Positive", "lead-acid oxygen", self.options, "primary" + self.param, "Positive", "lead-acid oxygen", self.options ), + self.options, ) self.submodels[ "negative oxygen interface" ] = pybamm.kinetics.DiffusionLimited( - self.param, "Negative", "lead-acid oxygen", order="composite" + self.param, + "Negative", + "lead-acid oxygen", + self.options, + order="composite", ) def set_full_convection_submodel(self): diff --git a/pybamm/models/full_battery_models/lead_acid/loqs.py b/pybamm/models/full_battery_models/lead_acid/loqs.py index 9578a17c33..08e067da87 100644 --- a/pybamm/models/full_battery_models/lead_acid/loqs.py +++ b/pybamm/models/full_battery_models/lead_acid/loqs.py @@ -235,7 +235,11 @@ def set_side_reaction_submodels(self): self.submodels[ "leading-order negative oxygen interface" ] = pybamm.kinetics.DiffusionLimited( - self.param, "Negative", "lead-acid oxygen", order="leading" + self.param, + "Negative", + "lead-acid oxygen", + self.options, + order="leading", ) else: self.submodels[ diff --git a/pybamm/models/full_battery_models/lithium_ion/dfn.py b/pybamm/models/full_battery_models/lithium_ion/dfn.py index a11dee1d65..0ddf43924a 100644 --- a/pybamm/models/full_battery_models/lithium_ion/dfn.py +++ b/pybamm/models/full_battery_models/lithium_ion/dfn.py @@ -70,7 +70,7 @@ def set_intercalation_kinetics_submodel(self): self.param, domain, "lithium-ion main", self.options, phase ) - self.submodels[f"{domain.lower()} {phase} interface"] = submod + self.submodels[f"{domain.lower()} {phase} interface"] = submod if len(phases) > 1: self.submodels[ diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index c816e74dfc..5c5dcfe604 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -105,17 +105,16 @@ def __init__( "Phase must be either 'primary' or 'secondary' " "if there are two phases" ) - self.phase = phase - if phase is None: - self.phase_name = None - elif options_phase == "1": - # Only one phase, no need to distinguish between "primary" and "secondary" - self.phase_name = "" - else: - # add a space so that we can use "" or (e.g.) "primary " interchangeably - # when naming variables - self.phase_name = phase + " " + if options_phase == "1": + # Only one phase, no need to distinguish between "primary" and "secondary" + self.phase_name = "" + else: + # add a space so that we can use "" or (e.g.) "primary " interchangeably + # when naming variables + self.phase_name = phase + " " + + self.phase = phase @property def domain(self): diff --git a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py index 6ff779dbf8..c255bb1f8c 100644 --- a/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py +++ b/pybamm/models/submodels/electrolyte_conductivity/surface_potential_form/full_surface_form_conductivity.py @@ -262,7 +262,6 @@ def set_rhs(self, variables): Domain = self.domain domain = Domain.lower() - phase_name = self.phase_name C_dl = self.domain_param.C_dl @@ -273,6 +272,6 @@ def set_rhs(self, variables): sum_a_j = variables[ f"Sum of {domain} electrode volumetric interfacial current densities" ] - a = variables[f"{Domain} electrode {phase_name}surface area to volume ratio"] + a = variables[f"{Domain} electrode surface area to volume ratio"] self.rhs[delta_phi] = 1 / (a * C_dl) * (pybamm.div(i_e) - sum_a_j) diff --git a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py index 9a9ae8a9b7..520ee795f5 100644 --- a/pybamm/models/submodels/interface/kinetics/diffusion_limited.py +++ b/pybamm/models/submodels/interface/kinetics/diffusion_limited.py @@ -18,14 +18,17 @@ class DiffusionLimited(BaseInterface): The domain to implement the model, either: 'Negative' or 'Positive'. reaction : str The name of the reaction being implemented + options: dict + A dictionary of options to be passed to the model. See + :class:`pybamm.BaseBatteryModel` order : str The order of the model ("leading" or "full") **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, reaction, order): - super().__init__(param, domain, reaction) + def __init__(self, param, domain, reaction, options, order): + super().__init__(param, domain, reaction, options) self.order = order def get_coupled_variables(self, variables): diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py index 78c753892f..0daaff9357 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/first_order_kinetics.py @@ -17,12 +17,15 @@ class FirstOrderKinetics(BaseInterface): The domain to implement the model, either: 'Negative' or 'Positive'. leading_order_model : :class:`pybamm.interface.kinetics.BaseKinetics` The leading-order model with respect to which this is first-order + options: dict + A dictionary of options to be passed to the model. See + :class:`pybamm.BaseBatteryModel` **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, leading_order_model): - super().__init__(param, domain, leading_order_model.reaction) + def __init__(self, param, domain, leading_order_model, options): + super().__init__(param, domain, leading_order_model.reaction, options) self.leading_order_model = leading_order_model def get_coupled_variables(self, variables): diff --git a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/inverse_first_order_kinetics.py b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/inverse_first_order_kinetics.py index b88176d788..7209f83253 100644 --- a/pybamm/models/submodels/interface/kinetics/first_order_kinetics/inverse_first_order_kinetics.py +++ b/pybamm/models/submodels/interface/kinetics/first_order_kinetics/inverse_first_order_kinetics.py @@ -19,12 +19,15 @@ class InverseFirstOrderKinetics(BaseInterface): The domain to implement the model, either: 'Negative' or 'Positive'. leading_order_models : :class:`pybamm.interface.kinetics.BaseKinetics` The leading-order models with respect to which this is first-order + options: dict + A dictionary of options to be passed to the model. See + :class:`pybamm.BaseBatteryModel` **Extends:** :class:`pybamm.interface.BaseInterface` """ - def __init__(self, param, domain, leading_order_models): - super().__init__(param, domain, "inverse") + def __init__(self, param, domain, leading_order_models, options): + super().__init__(param, domain, "inverse", options) self.leading_order_models = leading_order_models def _get_die1dx(self, variables): From 25af82c60bf80dd4ab24ecfdc35443bacb05c766 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 16:34:19 +0100 Subject: [PATCH 43/47] revert example --- examples/scripts/compare_lithium_ion.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/scripts/compare_lithium_ion.py b/examples/scripts/compare_lithium_ion.py index a0fecc26bf..6108036b9b 100644 --- a/examples/scripts/compare_lithium_ion.py +++ b/examples/scripts/compare_lithium_ion.py @@ -7,16 +7,10 @@ # load models models = [ - # pybamm.lithium_ion.SPM(), - # pybamm.lithium_ion.SPMe(), - pybamm.lithium_ion.DFN( - { - "SEI": "solvent-diffusion limited", - "SEI on cracks": "true", - "particle mechanics": "swelling and cracking", - } - ), - # pybamm.lithium_ion.NewmanTobias(), + pybamm.lithium_ion.SPM(), + pybamm.lithium_ion.SPMe(), + pybamm.lithium_ion.DFN(), + pybamm.lithium_ion.NewmanTobias(), ] # create and run simulations From 575dcc2b37a91352cb333a5f9c162e725fc16273 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 16:44:15 +0100 Subject: [PATCH 44/47] flake8 --- pybamm/models/submodels/base_submodel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index 5c5dcfe604..d67563b799 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -107,7 +107,8 @@ def __init__( ) if options_phase == "1": - # Only one phase, no need to distinguish between "primary" and "secondary" + # Only one phase, no need to distinguish between + # "primary" and "secondary" self.phase_name = "" else: # add a space so that we can use "" or (e.g.) "primary " interchangeably From 3c7dcae2e77e9425375035ea8a9a923ec27ac9f0 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 17:36:42 +0100 Subject: [PATCH 45/47] fix submodel test --- tests/unit/test_models/test_submodels/test_base_submodel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_models/test_submodels/test_base_submodel.py b/tests/unit/test_models/test_submodels/test_base_submodel.py index 2f59d164c4..4a609c30d5 100644 --- a/tests/unit/test_models/test_submodels/test_base_submodel.py +++ b/tests/unit/test_models/test_submodels/test_base_submodel.py @@ -24,7 +24,6 @@ def test_phase(self): # Without domain submodel = pybamm.BaseSubModel(None, None) self.assertEqual(submodel.phase, None) - self.assertEqual(submodel.phase_name, None) with self.assertRaisesRegex(ValueError, "Phase must be None"): pybamm.BaseSubModel(None, None, phase="primary") From e71f30ded81d19e12e7d015078267cfb8842db0d Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 22:15:43 +0100 Subject: [PATCH 46/47] integration tests --- .../test_interface/test_lead_acid.py | 26 ++++++++++++++----- .../test_interface/test_lithium_ion.py | 26 ++++++++++++++----- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/tests/integration/test_models/test_submodels/test_interface/test_lead_acid.py b/tests/integration/test_models/test_submodels/test_interface/test_lead_acid.py index 840b85ac99..2ba4c2cff5 100644 --- a/tests/integration/test_models/test_submodels/test_interface/test_lead_acid.py +++ b/tests/integration/test_models/test_submodels/test_interface/test_lead_acid.py @@ -30,9 +30,13 @@ def tearDown(self): def test_creation_main_reaction(self): # With intercalation param = pybamm.LeadAcidParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lead-acid main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lead-acid main", {} + ) j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lead-acid main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lead-acid main", {} + ) j0_p = model_p._get_exchange_current_density(self.variables) self.assertEqual(j0_n.domain, ["negative electrode"]) self.assertEqual(j0_p.domain, ["positive electrode"]) @@ -40,9 +44,13 @@ def test_creation_main_reaction(self): def test_set_parameters_main_reaction(self): # With intercalation param = pybamm.LeadAcidParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lead-acid main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lead-acid main", {} + ) j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lead-acid main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lead-acid main", {} + ) j0_p = model_p._get_exchange_current_density(self.variables) # Process parameters parameter_values = pybamm.lead_acid.BaseModel().default_parameter_values @@ -57,9 +65,13 @@ def test_set_parameters_main_reaction(self): def test_discretisation_main_reaction(self): # With intercalation param = pybamm.LeadAcidParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lead-acid main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lead-acid main", {} + ) j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lead-acid main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lead-acid main", {} + ) j0_p = model_p._get_exchange_current_density(self.variables) # Process parameters and discretise parameter_values = pybamm.lead_acid.BaseModel().default_parameter_values @@ -72,7 +84,7 @@ def test_discretisation_main_reaction(self): # Test whole_cell = ["negative electrode", "separator", "positive electrode"] submesh = mesh.combine_submeshes(*whole_cell) - y = submesh.nodes ** 2 + y = submesh.nodes**2 # should evaluate to vectors with the right shape self.assertEqual(j0_n.evaluate(y=y).shape, (mesh["negative electrode"].npts, 1)) self.assertEqual(j0_p.evaluate(y=y).shape, (mesh["positive electrode"].npts, 1)) diff --git a/tests/integration/test_models/test_submodels/test_interface/test_lithium_ion.py b/tests/integration/test_models/test_submodels/test_interface/test_lithium_ion.py index 5e3b0a2194..000160c423 100644 --- a/tests/integration/test_models/test_submodels/test_interface/test_lithium_ion.py +++ b/tests/integration/test_models/test_submodels/test_interface/test_lithium_ion.py @@ -38,10 +38,14 @@ def tearDown(self): def test_creation_lithium_ion(self): param = pybamm.LithiumIonParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lithium-ion main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lithium-ion main", {} + ) model_n.options = self.options j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lithium-ion main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lithium-ion main", {} + ) model_p.options = self.options j0_p = model_p._get_exchange_current_density(self.variables) self.assertEqual(j0_n.domain, ["negative electrode"]) @@ -49,10 +53,14 @@ def test_creation_lithium_ion(self): def test_set_parameters_lithium_ion(self): param = pybamm.LithiumIonParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lithium-ion main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lithium-ion main", {} + ) model_n.options = self.options j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lithium-ion main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lithium-ion main", {} + ) model_p.options = self.options j0_p = model_p._get_exchange_current_density(self.variables) # Process parameters @@ -67,10 +75,14 @@ def test_set_parameters_lithium_ion(self): def test_discretisation_lithium_ion(self): param = pybamm.LithiumIonParameters() - model_n = pybamm.interface.BaseInterface(param, "Negative", "lithium-ion main") + model_n = pybamm.interface.BaseInterface( + param, "Negative", "lithium-ion main", {} + ) model_n.options = self.options j0_n = model_n._get_exchange_current_density(self.variables) - model_p = pybamm.interface.BaseInterface(param, "Positive", "lithium-ion main") + model_p = pybamm.interface.BaseInterface( + param, "Positive", "lithium-ion main", {} + ) model_p.options = self.options j0_p = model_p._get_exchange_current_density(self.variables) # Process parameters and discretise @@ -88,7 +100,7 @@ def test_discretisation_lithium_ion(self): submesh = mesh.combine_submeshes(*whole_cell) y = np.concatenate( [ - submesh.nodes ** 2, + submesh.nodes**2, mesh["negative particle"].nodes, mesh["positive particle"].nodes, ] From 0c4b97215d86b4f621a791d6ed075c4e5e967a59 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Tue, 23 Aug 2022 23:18:40 +0100 Subject: [PATCH 47/47] fix examples --- examples/notebooks/models/using-submodels.ipynb | 14 +++++++------- examples/scripts/custom_model.py | 4 ++-- .../models/full_battery_models/lithium_ion/spm.py | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/notebooks/models/using-submodels.ipynb b/examples/notebooks/models/using-submodels.ipynb index eefe7df315..e7eb75704d 100644 --- a/examples/notebooks/models/using-submodels.ipynb +++ b/examples/notebooks/models/using-submodels.ipynb @@ -138,7 +138,7 @@ "outputs": [], "source": [ "model.submodels[\"negative primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(\n", - " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}, phase=\"primary\"\n", + " model.param, \"Negative\", options={**model.options, \"particle\": \"uniform profile\"}\n", ")" ] }, @@ -416,8 +416,8 @@ "outputs": [], "source": [ "options = {**model.options, \"particle\": \"uniform profile\"}\n", - "model.submodels[\"negative primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options, \"primary\")\n", - "model.submodels[\"positive primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options, \"primary\")" + "model.submodels[\"negative primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Negative\", options)\n", + "model.submodels[\"positive primary particle\"] = pybamm.particle.XAveragedPolynomialProfile(model.param, \"Positive\", options)" ] }, { @@ -436,12 +436,12 @@ "model.submodels[\n", " \"negative open circuit potential\"\n", "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Negative\", \"lithium-ion main\", options=model.options, phase=\"primary\"\n", + " model.param, \"Negative\", \"lithium-ion main\", options=model.options\n", ")\n", "model.submodels[\n", " \"positive open circuit potential\"\n", "] = pybamm.open_circuit_potential.SingleOpenCircuitPotential(\n", - " model.param, \"Positive\", \"lithium-ion main\", options=model.options, phase=\"primary\"\n", + " model.param, \"Positive\", \"lithium-ion main\", options=model.options\n", ")\n", "model.submodels[\n", " \"negative interface\"\n", @@ -486,10 +486,10 @@ "source": [ "model.submodels[\n", " \"Negative particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options, \"primary\")\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Negative\", model.options)\n", "model.submodels[\n", " \"Positive particle mechanics\"\n", - "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options, \"primary\")\n", + "] = pybamm.particle_mechanics.NoMechanics(model.param, \"Positive\", model.options)\n", "model.submodels[\"sei\"] = pybamm.sei.NoSEI(model.param)\n", "model.submodels[\"sei on cracks\"] = pybamm.sei.NoSEI(model.param, cracks=True)\n", "model.submodels[\"lithium plating\"] = pybamm.lithium_plating.NoPlating(model.param)" diff --git a/examples/scripts/custom_model.py b/examples/scripts/custom_model.py index a6e137d6ad..56c4fa098b 100644 --- a/examples/scripts/custom_model.py +++ b/examples/scripts/custom_model.py @@ -93,10 +93,10 @@ model.param, "Positive" ) model.submodels["Negative particle mechanics"] = pybamm.particle_mechanics.NoMechanics( - model.param, "Negative", model.options, "primary" + model.param, "Negative", model.options ) model.submodels["Positive particle mechanics"] = pybamm.particle_mechanics.NoMechanics( - model.param, "Positive", model.options, "primary" + model.param, "Positive", model.options ) model.submodels["sei"] = pybamm.sei.NoSEI(model.param) model.submodels["sei on cracks"] = pybamm.sei.NoSEI(model.param, cracks=True) diff --git a/pybamm/models/full_battery_models/lithium_ion/spm.py b/pybamm/models/full_battery_models/lithium_ion/spm.py index 8d15c717fe..1cefa8c915 100644 --- a/pybamm/models/full_battery_models/lithium_ion/spm.py +++ b/pybamm/models/full_battery_models/lithium_ion/spm.py @@ -106,7 +106,7 @@ def set_intercalation_kinetics_submodel(self): self.param, domain, "lithium-ion main", self.options, phase ) - self.submodels[f"{domain} {phase} interface"] = submod + self.submodels[f"{domain} {phase} interface"] = submod if len(phases) > 1: self.submodels[ f"total {domain} interface"