From 1cdbf74f061bfebc8c33758deadd556735c46ccd Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Wed, 9 Aug 2023 15:59:08 +0100 Subject: [PATCH 01/12] #3081 add test --- .../test_simulation_with_experiment.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unit/test_experiments/test_simulation_with_experiment.py b/tests/unit/test_experiments/test_simulation_with_experiment.py index 460d82c8c6..48ca702a4e 100644 --- a/tests/unit/test_experiments/test_simulation_with_experiment.py +++ b/tests/unit/test_experiments/test_simulation_with_experiment.py @@ -640,6 +640,30 @@ def test_run_time_stamped_experiment(self): sol = sim.solve(calc_esoh=False) self.assertEqual(sol["Time [s]"].entries[-1], 10800) + def test_experiment_start_time_identical_steps(self): + # Test that if we have the same step twice, with different start times, + # they get processed only once + model = pybamm.lithium_ion.SPM() + + experiment = pybamm.Experiment( + [ + pybamm.step.string( + "Discharge at C/2 for 10 minutes", + start_time=datetime(2023, 1, 1, 8, 0, 0), + ), + pybamm.step.string("Discharge at C/3 for 10 minutes"), + pybamm.step.string( + "Discharge at C/2 for 10 minutes", + start_time=datetime(2023, 1, 1, 10, 0, 0), + ), + pybamm.step.string("Discharge at C/3 for 10 minutes"), + ] + ) + + sim = pybamm.Simulation(model, experiment=experiment) + sim.solve(calc_esoh=False) + 2 + 2 + if __name__ == "__main__": print("Add -v for more debug output") From 59e7f8fceb2d9217d039b0416593411139425809 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Wed, 9 Aug 2023 15:59:34 +0100 Subject: [PATCH 02/12] #3081 change __hash__ and __eq__ to only check certain arguments --- pybamm/step/_steps_util.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/pybamm/step/_steps_util.py b/pybamm/step/_steps_util.py index 879461b73c..dc3423ed6e 100644 --- a/pybamm/step/_steps_util.py +++ b/pybamm/step/_steps_util.py @@ -71,22 +71,25 @@ def __init__( ): self.type = typ - # Record all the args for repr - self.args = f"{typ}, {value}" + # Record all the args for repr and hash + self.repr_args = f"{typ}, {value}" + self.hash_args = f"{typ}, {value}" if duration: - self.args += f", duration={duration}" + self.repr_args += f", duration={duration}" if termination: - self.args += f", termination={termination}" + self.repr_args += f", termination={termination}" + self.hash_args += f", termination={termination}" if period: - self.args += f", period={period}" + self.repr_args += f", period={period}" if temperature: - self.args += f", temperature={temperature}" + self.repr_args += f", temperature={temperature}" + self.hash_args += f", temperature={temperature}" if tags: - self.args += f", tags={tags}" + self.repr_args += f", tags={tags}" if start_time: - self.args += f", start_time={start_time}" + self.repr_args += f", start_time={start_time}" if description: - self.args += f", description={description}" + self.repr_args += f", description={description}" # Check if drive cycle self.is_drive_cycle = isinstance(value, np.ndarray) @@ -158,7 +161,7 @@ def __str__(self): return repr(self) def __repr__(self): - return f"_Step({self.args})" + return f"_Step({self.repr_args})" def to_dict(self): """ @@ -184,13 +187,11 @@ def to_dict(self): def __eq__(self, other): return ( isinstance(other, _Step) - and self.__repr__() == other.__repr__() - and self.next_start_time == other.next_start_time - and self.end_time == other.end_time + and self.hash_args == other.hash_args ) def __hash__(self): - return hash(repr(self)) + return hash(f"_Step({self.hash_args})") @property def unit(self): From 1461fc85b9f2bca577206eb83b14d0df08f43075 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Thu, 10 Aug 2023 09:03:26 +0100 Subject: [PATCH 03/12] #3081 remove unused variable --- pybamm/experiment/experiment.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pybamm/experiment/experiment.py b/pybamm/experiment/experiment.py index edcaeb8f58..d2909d4d3c 100644 --- a/pybamm/experiment/experiment.py +++ b/pybamm/experiment/experiment.py @@ -68,11 +68,6 @@ def __init__( termination, ) - self.datetime_formats = [ - "Day %j %H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - operating_conditions_cycles = [] for cycle in operating_conditions: # Check types and convert to list From 60b9100db8eea4adf649e03f17e79f88fca0a51a Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Thu, 10 Aug 2023 10:13:05 +0100 Subject: [PATCH 04/12] #3081 redefine step processing to avoid processing redundant models --- pybamm/experiment/experiment.py | 40 +++++++++++++++++++-------------- pybamm/simulation.py | 6 ++--- pybamm/step/_steps_util.py | 10 ++++++++- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/pybamm/experiment/experiment.py b/pybamm/experiment/experiment.py index d2909d4d3c..d1c45015b6 100644 --- a/pybamm/experiment/experiment.py +++ b/pybamm/experiment/experiment.py @@ -84,21 +84,36 @@ def __init__( # Convert strings to pybamm.step._Step objects # We only do this once per unique step, do avoid unnecessary conversions - unique_steps_unprocessed = set(operating_conditions_steps_unprocessed) + # Assign experiment period and temperature if not specified in step + self.period = _convert_time_to_seconds(period) + self.temperature = _convert_temperature_to_kelvin(temperature) + processed_steps = {} - for step in unique_steps_unprocessed: - if isinstance(step, str): - processed_steps[step] = pybamm.step.string(step) + for step in operating_conditions_steps_unprocessed: + if repr(step) in processed_steps: + continue + elif isinstance(step, str): + processed_step = pybamm.step.string(step) elif isinstance(step, pybamm.step._Step): - processed_steps[step] = step + processed_step = step + + if processed_step.period is None: + processed_step.period = self.period + if processed_step.temperature is None: + processed_step.temperature = self.temperature + + processed_steps[repr(step)] = processed_step + + self.operating_conditions_steps = [ + processed_steps[repr(step)] + for step in operating_conditions_steps_unprocessed + ] # Save the processed unique steps and the processed operating conditions # for every step self.unique_steps = set(processed_steps.values()) - self.operating_conditions_steps = [ - processed_steps[step] for step in operating_conditions_steps_unprocessed - ] + # Allocate experiment global variables self.initial_start_time = self.operating_conditions_steps[0].start_time if ( @@ -113,15 +128,6 @@ def __init__( self.termination_string = termination self.termination = self.read_termination(termination) - # Modify steps with period and temperature in place - self.period = _convert_time_to_seconds(period) - self.temperature = _convert_temperature_to_kelvin(temperature) - for step in self.unique_steps: - if step.period is None: - step.period = self.period - if step.temperature is None: - step.temperature = self.temperature - def __str__(self): return str(self.operating_conditions_cycles) diff --git a/pybamm/simulation.py b/pybamm/simulation.py index 8511d01af6..c68b80ae55 100644 --- a/pybamm/simulation.py +++ b/pybamm/simulation.py @@ -255,7 +255,7 @@ def set_up_and_parameterise_model_for_experiment(self): parameterised_model = new_parameter_values.process_model( new_model, inplace=False ) - self.experiment_unique_steps_to_model[repr(op)] = parameterised_model + self.experiment_unique_steps_to_model[op.basic_repr()] = parameterised_model # Set up rest model if experiment has start times if self.experiment.initial_start_time: @@ -771,8 +771,8 @@ def solve( else: dt = op_conds.duration op_conds_str = str(op_conds) - model = self.op_conds_to_built_models[repr(op_conds)] - solver = self.op_conds_to_built_solvers[repr(op_conds)] + model = self.op_conds_to_built_models[op_conds.basic_repr()] + solver = self.op_conds_to_built_solvers[op_conds.basic_repr()] logs["step number"] = (step_num, cycle_length) logs["step operating conditions"] = op_conds_str diff --git a/pybamm/step/_steps_util.py b/pybamm/step/_steps_util.py index dc3423ed6e..e524bc6064 100644 --- a/pybamm/step/_steps_util.py +++ b/pybamm/step/_steps_util.py @@ -163,6 +163,14 @@ def __str__(self): def __repr__(self): return f"_Step({self.repr_args})" + def basic_repr(self): + """ + Return a basic representation of the step, only with type, value, termination + and temperature, which are the variables involved in processing the model. Also + used for hashing. + """ + return f"_Step({self.hash_args})" + def to_dict(self): """ Convert the step to a dictionary. @@ -191,7 +199,7 @@ def __eq__(self, other): ) def __hash__(self): - return hash(f"_Step({self.hash_args})") + return hash(self.basic_repr()) @property def unit(self): From 16be997e19fb3c71f49e330f22338ea05ab582c1 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Thu, 10 Aug 2023 10:13:29 +0100 Subject: [PATCH 05/12] #3081 add test --- .../test_simulation_with_experiment.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_experiments/test_simulation_with_experiment.py b/tests/unit/test_experiments/test_simulation_with_experiment.py index 930f811620..27590cff58 100644 --- a/tests/unit/test_experiments/test_simulation_with_experiment.py +++ b/tests/unit/test_experiments/test_simulation_with_experiment.py @@ -751,7 +751,15 @@ def test_experiment_start_time_identical_steps(self): sim = pybamm.Simulation(model, experiment=experiment) sim.solve(calc_esoh=False) - 2 + 2 + + # Check that there are 4 steps + self.assertEqual(len(experiment.operating_conditions_steps), 4) + + # Check that there are only 2 unique steps + self.assertEqual(len(sim.experiment.unique_steps), 2) + + # Check that there are only 3 built models (unique steps + padding rest) + self.assertEqual(len(sim.op_conds_to_built_models), 3) if __name__ == "__main__": From eddd93765e0709d2e16f7d8488fa09188c84c0c4 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Thu, 10 Aug 2023 10:24:12 +0100 Subject: [PATCH 06/12] #3081 fix failing test --- .../test_experiments/test_simulation_with_experiment.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_experiments/test_simulation_with_experiment.py b/tests/unit/test_experiments/test_simulation_with_experiment.py index 27590cff58..6688fae5b1 100644 --- a/tests/unit/test_experiments/test_simulation_with_experiment.py +++ b/tests/unit/test_experiments/test_simulation_with_experiment.py @@ -38,8 +38,12 @@ def test_set_up(self): [3600, 3 / Crate * 3600, 24 * 3600, 24 * 3600], ) - model_I = sim.experiment_unique_steps_to_model[repr(op_conds[1])] # CC charge - model_V = sim.experiment_unique_steps_to_model[repr(op_conds[2])] # CV hold + model_I = sim.experiment_unique_steps_to_model[ + op_conds[1].basic_repr() + ] # CC charge + model_V = sim.experiment_unique_steps_to_model[ + op_conds[2].basic_repr() + ] # CV hold self.assertIn( "Current cut-off [A] [experiment]", [event.name for event in model_V.events], From 02804c4a17ca0fa33fa7ff5259988462a26f3a24 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Thu, 10 Aug 2023 11:41:51 +0100 Subject: [PATCH 07/12] #3081 update CHANGELOG --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd396050b..949f6b1a36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,6 @@ - Spherical and cylindrical shell domains can now be solved with any boundary conditions ([#3237](https://github.com/pybamm-team/PyBaMM/pull/3237)) - Processed variables now get the spatial variables automatically, allowing plotting of more generic models ([#3234](https://github.com/pybamm-team/PyBaMM/pull/3234)) -## Breaking changes - -- Numpy functions now work with PyBaMM symbols (e.g. `np.exp(pybamm.Symbol("a"))` returns `pybamm.Exp(pybamm.Symbol("a"))`). This means that parameter functions can be specified using numpy functions instead of pybamm functions. Additionally, combining numpy arrays with pybamm objects now works (the numpy array is converted to a pybamm array) ([#3205](https://github.com/pybamm-team/PyBaMM/pull/3205)) - ## Bug fixes - Fixed a bug where the "basic" lithium-ion models gave incorrect results when using nonlinear particle diffusivity ([#3207](https://github.com/pybamm-team/PyBaMM/pull/3207)) @@ -20,10 +16,13 @@ - Error generated when invalid parameter values are passed ([#3132](https://github.com/pybamm-team/PyBaMM/pull/3132)) - Parameters in `Prada2013` have been updated to better match those given in the paper, which is a 2.3 Ah cell, instead of the mix-and-match with the 1.1 Ah cell from Lain2019 ([#3096](https://github.com/pybamm-team/PyBaMM/pull/3096)) +## Optimizations +- Improved how steps are processed in simulations to reduce memory usage ([#3261](https://github.com/pybamm-team/PyBaMM/pull/3261)) ## Breaking changes +- Numpy functions now work with PyBaMM symbols (e.g. `np.exp(pybamm.Symbol("a"))` returns `pybamm.Exp(pybamm.Symbol("a"))`). This means that parameter functions can be specified using numpy functions instead of pybamm functions. Additionally, combining numpy arrays with pybamm objects now works (the numpy array is converted to a pybamm array) ([#3205](https://github.com/pybamm-team/PyBaMM/pull/3205)) - Added option to use an empirical hysteresis model for the diffusivity and exchange-current density ([#3194](https://github.com/pybamm-team/PyBaMM/pull/3194)) - Double-layer capacity can now be provided as a function of temperature ([#3174](https://github.com/pybamm-team/PyBaMM/pull/3174)) - `pybamm_install_jax` is deprecated. It is now replaced with `pip install pybamm[jax]` ([#3163](https://github.com/pybamm-team/PyBaMM/pull/3163)) From 64cd12ce1772caa3d17cc3d28c9fd9eff70dbbda Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Tue, 15 Aug 2023 11:31:17 +0100 Subject: [PATCH 08/12] #3081 add non-battery PDE test --- tests/__init__.py | 1 + tests/shared.py | 74 +++++++++++++++++++++++++++++++++++ tests/unit/test_simulation.py | 18 ++++++++- 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index 919605998e..d2f05f6bcb 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -23,6 +23,7 @@ ) from .shared import ( + NonBatteryModel, get_mesh_for_testing, get_p2d_mesh_for_testing, get_size_distribution_mesh_for_testing, diff --git a/tests/shared.py b/tests/shared.py index 1f0b033582..c2aef60f9b 100644 --- a/tests/shared.py +++ b/tests/shared.py @@ -2,6 +2,7 @@ # Shared methods and classes for testing # import pybamm +import numpy as np from scipy.sparse import eye @@ -41,6 +42,79 @@ def mass_matrix(self, symbol, boundary_conditions): return mass_matrix +class NonBatteryModel(pybamm.BaseModel): + def __init__(self, name="heat equation"): + super().__init__(name=name) + + x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") + T = pybamm.Variable("Temperature [K]", domain="rod") + k = pybamm.Parameter("Thermal diffusivity [m2.s-1]") + L = pybamm.Parameter("Rod length [m]") + T0 = pybamm.Parameter("Initial temperature [K]") + + dTdt = pybamm.div(k * pybamm.grad(T)) + self.rhs = {T: dTdt} + + self.boundary_conditions = { + T: { + "left": (pybamm.Scalar(0), "Dirichlet"), + "right": (pybamm.Scalar(0), "Dirichlet"), + } + } + self.initial_conditions = {T: T0} + + # Define analytical solution for comparison + def analytical_solution(N, x, t): + solution = 0 + for n in range(N): + solution += ( + 4 + * T0 + / np.pi / (2 * n + 1) + * np.sin((2 * n + 1) * np.pi * x / L) + * np.exp(-k * ((2 * n + 1) * np.pi / L) ** 2 * t) + ) + return solution + + T_an = analytical_solution(10, x, pybamm.t) + + # Add desired output variables + self.variables = {"Temperature [K]": T, "Analytical temperature [K]": T_an} + + @property + def default_geometry(self): + L = pybamm.Parameter("Rod length [m]") + x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") + return pybamm.Geometry({"rod": {x: {"min": pybamm.Scalar(0), "max": L}}}) + + @property + def default_parameter_values(self): + return pybamm.ParameterValues( + { + "Rod length [m]": 1, + "Initial temperature [K]": 1, + "Thermal diffusivity [m2.s-1]": 1, + } + ) + + @property + def default_submesh_types(self): + return {"rod": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh)} + + @property + def default_var_pts(self): + x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") + return {x: 50} + + @property + def default_spatial_methods(self): + return {"rod": pybamm.FiniteVolume()} + + @property + def default_solver(self): + return pybamm.CasadiSolver("fast") + + def get_mesh_for_testing( xpts=None, rpts=10, diff --git a/tests/unit/test_simulation.py b/tests/unit/test_simulation.py index 83ec42ef6c..6335646caa 100644 --- a/tests/unit/test_simulation.py +++ b/tests/unit/test_simulation.py @@ -1,7 +1,7 @@ import pybamm import numpy as np import pandas as pd -from tests import TestCase +from tests import TestCase, NonBatteryModel import os import sys import unittest @@ -82,7 +82,7 @@ def test_solve(self): with self.assertRaisesRegex(ValueError, "starting_solution"): sim.solve(starting_solution=sol) - def test_solve_non_battery_model(self): + def test_solve_non_battery_model_ode(self): model = pybamm.BaseModel() v = pybamm.Variable("v") model.rhs = {v: -v} @@ -98,6 +98,20 @@ def test_solve_non_battery_model(self): sim.solution["v"].entries, np.exp(-np.linspace(0, 1, 100)) ) + def test_solve_non_battery_model_pde(self): + model = NonBatteryModel() + sim = pybamm.Simulation(model) + + solution = sim.solve(np.linspace(0, 1, 100)) + np.testing.assert_array_equal(sim.solution.t, np.linspace(0, 1, 100)) + # Compare with analytical temperature (drop first few terms as agreement of + # early states is not great) + np.testing.assert_array_almost_equal( + solution["Temperature [K]"].entries[:, 2:], + solution["Analytical temperature [K]"].entries[:, 2:], + decimal=3, + ) + def test_solve_already_partially_processed_model(self): model = pybamm.lithium_ion.SPM() From 6f0b6a88997cd121f64b71d4e703fbf8b241a92b Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Tue, 15 Aug 2023 11:37:51 +0100 Subject: [PATCH 09/12] #3081 fix failing notebooks --- .../tutorial-4-setting-parameter-values.ipynb | 142 ++++++++---------- .../initialize-model-with-solution.ipynb | 28 ++-- .../change-input-current.ipynb | 116 ++++++++------ 3 files changed, 154 insertions(+), 132 deletions(-) diff --git a/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb index b3c9e256f5..a48fc75a72 100644 --- a/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb @@ -25,9 +25,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.\n", - "You should consider upgrading via the '/home/siegeljb/Documents/PyBaMM_Master/PyBaMM/.tox/dev/bin/python3.9 -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" + "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" ] } ], @@ -79,20 +82,24 @@ { "data": { "text/plain": [ - "{'Thermodynamic factor': 1.0,\n", - " 'Ambient temperature [K]': 298.15,\n", + "{'Ambient temperature [K]': 298.15,\n", + " 'Boltzmann constant [J.K-1]': 1.380649e-23,\n", " 'Bulk solvent concentration [mol.m-3]': 2636.0,\n", " 'Cation transference number': 0.2594,\n", " 'Cell cooling surface area [m2]': 0.00531,\n", " 'Cell thermal expansion coefficient [m.K-1]': 1.1e-06,\n", " 'Cell volume [m3]': 2.42e-05,\n", + " 'Contact resistance [Ohm]': 0,\n", " 'Current function [A]': 5.0,\n", " 'EC diffusivity [m2.s-1]': 2e-18,\n", " 'EC initial concentration in electrolyte [mol.m-3]': 4541.0,\n", " 'Electrode height [m]': 0.065,\n", " 'Electrode width [m]': 1.58,\n", - " 'Electrolyte conductivity [S.m-1]': ,\n", - " 'Electrolyte diffusivity [m2.s-1]': ,\n", + " 'Electrolyte conductivity [S.m-1]': ,\n", + " 'Electrolyte diffusivity [m2.s-1]': ,\n", + " 'Electron charge [C]': 1.602176634e-19,\n", + " 'Faraday constant [C.mol-1]': 96485.33212,\n", + " 'Ideal gas constant [J.K-1.mol-1]': 8.314462618,\n", " 'Initial concentration in electrolyte [mol.m-3]': 1000.0,\n", " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", @@ -113,19 +120,17 @@ " 'Negative current collector specific heat capacity [J.kg-1.K-1]': 385.0,\n", " 'Negative current collector thermal conductivity [W.m-1.K-1]': 401.0,\n", " 'Negative current collector thickness [m]': 1.2e-05,\n", - " 'Negative electrode Bruggeman coefficient (electrode)': 1.5,\n", + " 'Negative electrode Bruggeman coefficient (electrode)': 0,\n", " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode OCP [V]': ,\n", + " 'Negative electrode OCP [V]': ,\n", " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", " 'Negative electrode active material volume fraction': 0.75,\n", - " 'Negative electrode cation signed stoichiometry': -1.0,\n", " 'Negative electrode charge transfer coefficient': 0.5,\n", " 'Negative electrode conductivity [S.m-1]': 215.0,\n", " 'Negative electrode density [kg.m-3]': 1657.0,\n", " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", " 'Negative electrode double-layer capacity [F.m-2]': 0.2,\n", - " 'Negative electrode electrons in reaction': 1.0,\n", - " 'Negative electrode exchange-current density [A.m-2]': ,\n", + " 'Negative electrode exchange-current density [A.m-2]': ,\n", " 'Negative electrode porosity': 0.25,\n", " 'Negative electrode reaction-driven LAM factor [m3.mol-1]': 0.0,\n", " 'Negative electrode specific heat capacity [J.kg-1.K-1]': 700.0,\n", @@ -145,19 +150,17 @@ " 'Positive current collector specific heat capacity [J.kg-1.K-1]': 897.0,\n", " 'Positive current collector thermal conductivity [W.m-1.K-1]': 237.0,\n", " 'Positive current collector thickness [m]': 1.6e-05,\n", - " 'Positive electrode Bruggeman coefficient (electrode)': 1.5,\n", + " 'Positive electrode Bruggeman coefficient (electrode)': 0,\n", " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode OCP [V]': ,\n", + " 'Positive electrode OCP [V]': ,\n", " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", " 'Positive electrode active material volume fraction': 0.665,\n", - " 'Positive electrode cation signed stoichiometry': -1.0,\n", " 'Positive electrode charge transfer coefficient': 0.5,\n", " 'Positive electrode conductivity [S.m-1]': 0.18,\n", " 'Positive electrode density [kg.m-3]': 3262.0,\n", " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", " 'Positive electrode double-layer capacity [F.m-2]': 0.2,\n", - " 'Positive electrode electrons in reaction': 1.0,\n", - " 'Positive electrode exchange-current density [A.m-2]': ,\n", + " 'Positive electrode exchange-current density [A.m-2]': ,\n", " 'Positive electrode porosity': 0.335,\n", " 'Positive electrode reaction-driven LAM factor [m3.mol-1]': 0.0,\n", " 'Positive electrode specific heat capacity [J.kg-1.K-1]': 700.0,\n", @@ -177,9 +180,8 @@ " 'Separator specific heat capacity [J.kg-1.K-1]': 700.0,\n", " 'Separator thermal conductivity [W.m-1.K-1]': 0.16,\n", " 'Separator thickness [m]': 1.2e-05,\n", + " 'Thermodynamic factor': 1.0,\n", " 'Total heat transfer coefficient [W.m-2.K-1]': 10.0,\n", - " 'Typical current [A]': 5.0,\n", - " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", " 'Upper voltage cut-off [V]': 4.2,\n", " 'citations': ['Chen2020']}" ] @@ -211,13 +213,12 @@ "output_type": "stream", "text": [ "EC initial concentration in electrolyte [mol.m-3]\t4541.0\n", - "Electrolyte conductivity [S.m-1]\t\n", - "Electrolyte diffusivity [m2.s-1]\t\n", + "Electrolyte conductivity [S.m-1]\t\n", + "Electrolyte diffusivity [m2.s-1]\t\n", "Initial concentration in electrolyte [mol.m-3]\t1000.0\n", "Negative electrode Bruggeman coefficient (electrolyte)\t1.5\n", "Positive electrode Bruggeman coefficient (electrolyte)\t1.5\n", - "Separator Bruggeman coefficient (electrolyte)\t1.5\n", - "Typical electrolyte concentration [mol.m-3]\t1000.0\n" + "Separator Bruggeman coefficient (electrolyte)\t1.5\n" ] } ], @@ -243,12 +244,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e17d8edf481748daaef3f3b237bddd71", + "model_id": "64d6972b4d0847088197e17b67ab3fa4", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=3554.184719744867, step=35.54184719744867), …" + "interactive(children=(FloatSlider(value=0.0, description='t', max=3555.4480183305172, step=35.554480183305174)…" ] }, "metadata": {}, @@ -257,7 +258,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -318,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -337,18 +338,26 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "At t = 233.183 and h = 1.51902e-15, the corrector convergence failed repeatedly or with |h| = hmin.\n", + "At t = 233.183 and h = 5.64685e-15, the corrector convergence failed repeatedly or with |h| = hmin.\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "517cb023cdd54c27b20efccb17ce081c", + "model_id": "1322b6651c3e47c6a560784dc8b9d4ee", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1720.7505603255456, step=17.207505603255456)…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=136.50794742114383, step=1.3650794742114383)…" ] }, "metadata": {}, @@ -357,10 +366,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 12, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -397,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -418,23 +427,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that your drive cycle data can be stored anywhere, you just need to pass the path of the file. Then, again, the model can be solved as usual but notice that now, if `t_eval` is not specified, the solver will take the time points from the data set." + "Note that your drive cycle data can be stored anywhere, you just need to pass the path of the file." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "62d76f560ead4218ba0b3d4da49b7ba0", + "model_id": "6c0f7ee37b19429082b2e940457c1ac9", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=97.84197033486475, step=0.9784197033486476),…" + "interactive(children=(FloatSlider(value=0.0, description='t', step=1.0), Output()), _dom_classes=('widget-inte…" ] }, "metadata": {}, @@ -443,30 +452,18 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ "model = pybamm.lithium_ion.SPMe()\n", "sim = pybamm.Simulation(model, parameter_values=parameter_values)\n", - "sim.solve()\n", + "sim.solve([0, 100])\n", "sim.plot([\"Current [A]\", \"Voltage [V]\"])" ] }, @@ -488,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -512,18 +509,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1016bbebb3744513b4e92b0e53351deb", + "model_id": "8342108d4f9540959a60e0c753c40eb1", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=36.02442143490834, step=0.3602442143490834),…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=120.0, step=1.2), Output()), _dom_classes=('…" ] }, "metadata": {}, @@ -532,24 +529,12 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ @@ -580,21 +565,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "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] 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", - "[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] 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", - "[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] 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", - "[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", + "[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] 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", + "[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] 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", + "[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", + "[8] 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", + "[9] Andrew Weng, Jason B Siegel, and Anna Stefanopoulou. Differential voltage analysis for battery manufacturing process control. arXiv preprint arXiv:2303.07088, 2023.\n", "\n" ] } @@ -620,7 +606,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12 (main, Apr 15 2022, 23:10:21) \n[GCC 11.2.0]" + "version": "3.9.17" }, "toc": { "base_numbering": 1, diff --git a/docs/source/examples/notebooks/initialize-model-with-solution.ipynb b/docs/source/examples/notebooks/initialize-model-with-solution.ipynb index 758257071e..449d8ba93a 100644 --- a/docs/source/examples/notebooks/initialize-model-with-solution.ipynb +++ b/docs/source/examples/notebooks/initialize-model-with-solution.ipynb @@ -23,8 +23,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: You are using pip version 21.0.1; however, version 21.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", + "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -102,7 +105,7 @@ "sim_US06_1 = pybamm.Simulation(\n", " model, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_1 = sim_US06_1.solve()" + "sol_US06_1 = sim_US06_1.solve([0, 600])" ] }, { @@ -142,7 +145,7 @@ "sim_US06_2 = pybamm.Simulation(\n", " new_model, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_2 = sim_US06_2.solve()" + "sol_US06_2 = sim_US06_2.solve([0, 600])" ] }, { @@ -160,7 +163,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7ad44c260ec446e0bd04a2f7dfbf8c65", + "model_id": "c40a4502c5d84c2e8c21531050985a45", "version_major": 2, "version_minor": 0 }, @@ -174,7 +177,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -223,7 +226,7 @@ "sim_US06_3 = pybamm.Simulation(\n", " new_dfn, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_3 = sim_US06_3.solve()" + "sol_US06_3 = sim_US06_3.solve([0, 600])" ] }, { @@ -241,7 +244,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "aaf63750ed354d1987703fd2fdde83af", + "model_id": "795de038e9834b709f21c499b6cb217f", "version_major": 2, "version_minor": 0 }, @@ -255,7 +258,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -292,7 +295,10 @@ "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\n", + "[5] 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", + "[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", + "[8] Andrew Weng, Jason B Siegel, and Anna Stefanopoulou. Differential voltage analysis for battery manufacturing process control. arXiv preprint arXiv:2303.07088, 2023.\n", "\n" ] } @@ -325,7 +331,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.9.17" }, "toc": { "base_numbering": 1, diff --git a/docs/source/examples/notebooks/parameterization/change-input-current.ipynb b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb index 52ed915327..bdc711e2ea 100644 --- a/docs/source/examples/notebooks/parameterization/change-input-current.ipynb +++ b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb @@ -36,6 +36,11 @@ "name": "stdout", "output_type": "stream", "text": [ + "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -75,7 +80,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "aef64b871f1346a4b42c722c7eecfe38", + "model_id": "5f8373ac3af9468f8dcec84fb9726892", "version_major": 2, "version_minor": 0 }, @@ -85,6 +90,16 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -115,7 +130,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6447d4f706374208b5cbd283577b5da5", + "model_id": "b9bc6672ae6642dcaa2637282615f528", "version_major": 2, "version_minor": 0 }, @@ -125,6 +140,16 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -149,7 +174,32 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "86ba62b0adc1409b83c97437c085b299", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=600.0, step=6.0), Output()), _dom_classes=('…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import pandas as pd # needed to read the csv data file\n", "\n", @@ -169,40 +219,10 @@ "\n", "# set up simulation - for drive cycles we recommend using the CasadiSolver in \"fast\" mode\n", "solver = pybamm.CasadiSolver(mode=\"fast\")\n", - "simulation = pybamm.Simulation(model, parameter_values=param, solver=solver)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that when simulating drive cycles there is no need to pass a list of times at which to return the solution, the results are automatically returned at the time points in the data. If you would like the solution returned at times different to those in the data then you can pass an array of times `t_eval` to `solve` in the usual way." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "84f87c3d21644c20bafdac8e9b69247d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=600.0, step=6.0), Output()), _dom_classes=('…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ + "simulation = pybamm.Simulation(model, parameter_values=param, solver=solver)\n", + "\n", "# simulate US06 drive cycle (duration 600 seconds)\n", - "simulation.solve()\n", + "simulation.solve([0, 600])\n", "\n", "# plot\n", "simulation.plot()" @@ -230,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -255,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -280,13 +300,13 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6c06d938eca0491d88cdcbb29c59cd2a", + "model_id": "e0f9fb9e85fb4818adc5e1f454945449", "version_major": 2, "version_minor": 0 }, @@ -296,6 +316,16 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -326,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -337,7 +367,7 @@ "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). ECSarXiv. February, 2020. doi:10.1149/osf.io/67ckj.\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" ] } @@ -363,7 +393,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.9.17" }, "toc": { "base_numbering": 1, From 2e5c6984ac988695d0370accbd5da17f6b39e7b8 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Tue, 15 Aug 2023 11:44:45 +0100 Subject: [PATCH 10/12] Revert "#3081 fix failing notebooks" This reverts commit 6f0b6a88997cd121f64b71d4e703fbf8b241a92b. --- .../tutorial-4-setting-parameter-values.ipynb | 142 ++++++++++-------- .../initialize-model-with-solution.ipynb | 28 ++-- .../change-input-current.ipynb | 116 ++++++-------- 3 files changed, 132 insertions(+), 154 deletions(-) diff --git a/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb b/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb index a48fc75a72..b3c9e256f5 100644 --- a/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb +++ b/docs/source/examples/notebooks/getting_started/tutorial-4-setting-parameter-values.ipynb @@ -25,12 +25,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", - "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", - "Note: you may need to restart the kernel to use updated packages.\n" + "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.\n", + "You should consider upgrading via the '/home/siegeljb/Documents/PyBaMM_Master/PyBaMM/.tox/dev/bin/python3.9 -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" ] } ], @@ -82,24 +79,20 @@ { "data": { "text/plain": [ - "{'Ambient temperature [K]': 298.15,\n", - " 'Boltzmann constant [J.K-1]': 1.380649e-23,\n", + "{'Thermodynamic factor': 1.0,\n", + " 'Ambient temperature [K]': 298.15,\n", " 'Bulk solvent concentration [mol.m-3]': 2636.0,\n", " 'Cation transference number': 0.2594,\n", " 'Cell cooling surface area [m2]': 0.00531,\n", " 'Cell thermal expansion coefficient [m.K-1]': 1.1e-06,\n", " 'Cell volume [m3]': 2.42e-05,\n", - " 'Contact resistance [Ohm]': 0,\n", " 'Current function [A]': 5.0,\n", " 'EC diffusivity [m2.s-1]': 2e-18,\n", " 'EC initial concentration in electrolyte [mol.m-3]': 4541.0,\n", " 'Electrode height [m]': 0.065,\n", " 'Electrode width [m]': 1.58,\n", - " 'Electrolyte conductivity [S.m-1]': ,\n", - " 'Electrolyte diffusivity [m2.s-1]': ,\n", - " 'Electron charge [C]': 1.602176634e-19,\n", - " 'Faraday constant [C.mol-1]': 96485.33212,\n", - " 'Ideal gas constant [J.K-1.mol-1]': 8.314462618,\n", + " 'Electrolyte conductivity [S.m-1]': ,\n", + " 'Electrolyte diffusivity [m2.s-1]': ,\n", " 'Initial concentration in electrolyte [mol.m-3]': 1000.0,\n", " 'Initial concentration in negative electrode [mol.m-3]': 29866.0,\n", " 'Initial concentration in positive electrode [mol.m-3]': 17038.0,\n", @@ -120,17 +113,19 @@ " 'Negative current collector specific heat capacity [J.kg-1.K-1]': 385.0,\n", " 'Negative current collector thermal conductivity [W.m-1.K-1]': 401.0,\n", " 'Negative current collector thickness [m]': 1.2e-05,\n", - " 'Negative electrode Bruggeman coefficient (electrode)': 0,\n", + " 'Negative electrode Bruggeman coefficient (electrode)': 1.5,\n", " 'Negative electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Negative electrode OCP [V]': ,\n", + " 'Negative electrode OCP [V]': ,\n", " 'Negative electrode OCP entropic change [V.K-1]': 0.0,\n", " 'Negative electrode active material volume fraction': 0.75,\n", + " 'Negative electrode cation signed stoichiometry': -1.0,\n", " 'Negative electrode charge transfer coefficient': 0.5,\n", " 'Negative electrode conductivity [S.m-1]': 215.0,\n", " 'Negative electrode density [kg.m-3]': 1657.0,\n", " 'Negative electrode diffusivity [m2.s-1]': 3.3e-14,\n", " 'Negative electrode double-layer capacity [F.m-2]': 0.2,\n", - " 'Negative electrode exchange-current density [A.m-2]': ,\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 reaction-driven LAM factor [m3.mol-1]': 0.0,\n", " 'Negative electrode specific heat capacity [J.kg-1.K-1]': 700.0,\n", @@ -150,17 +145,19 @@ " 'Positive current collector specific heat capacity [J.kg-1.K-1]': 897.0,\n", " 'Positive current collector thermal conductivity [W.m-1.K-1]': 237.0,\n", " 'Positive current collector thickness [m]': 1.6e-05,\n", - " 'Positive electrode Bruggeman coefficient (electrode)': 0,\n", + " 'Positive electrode Bruggeman coefficient (electrode)': 1.5,\n", " 'Positive electrode Bruggeman coefficient (electrolyte)': 1.5,\n", - " 'Positive electrode OCP [V]': ,\n", + " 'Positive electrode OCP [V]': ,\n", " 'Positive electrode OCP entropic change [V.K-1]': 0.0,\n", " 'Positive electrode active material volume fraction': 0.665,\n", + " 'Positive electrode cation signed stoichiometry': -1.0,\n", " 'Positive electrode charge transfer coefficient': 0.5,\n", " 'Positive electrode conductivity [S.m-1]': 0.18,\n", " 'Positive electrode density [kg.m-3]': 3262.0,\n", " 'Positive electrode diffusivity [m2.s-1]': 4e-15,\n", " 'Positive electrode double-layer capacity [F.m-2]': 0.2,\n", - " 'Positive electrode exchange-current density [A.m-2]': ,\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 reaction-driven LAM factor [m3.mol-1]': 0.0,\n", " 'Positive electrode specific heat capacity [J.kg-1.K-1]': 700.0,\n", @@ -180,8 +177,9 @@ " 'Separator specific heat capacity [J.kg-1.K-1]': 700.0,\n", " 'Separator thermal conductivity [W.m-1.K-1]': 0.16,\n", " 'Separator thickness [m]': 1.2e-05,\n", - " 'Thermodynamic factor': 1.0,\n", " 'Total heat transfer coefficient [W.m-2.K-1]': 10.0,\n", + " 'Typical current [A]': 5.0,\n", + " 'Typical electrolyte concentration [mol.m-3]': 1000.0,\n", " 'Upper voltage cut-off [V]': 4.2,\n", " 'citations': ['Chen2020']}" ] @@ -213,12 +211,13 @@ "output_type": "stream", "text": [ "EC initial concentration in electrolyte [mol.m-3]\t4541.0\n", - "Electrolyte conductivity [S.m-1]\t\n", - "Electrolyte diffusivity [m2.s-1]\t\n", + "Electrolyte conductivity [S.m-1]\t\n", + "Electrolyte diffusivity [m2.s-1]\t\n", "Initial concentration in electrolyte [mol.m-3]\t1000.0\n", "Negative electrode Bruggeman coefficient (electrolyte)\t1.5\n", "Positive electrode Bruggeman coefficient (electrolyte)\t1.5\n", - "Separator Bruggeman coefficient (electrolyte)\t1.5\n" + "Separator Bruggeman coefficient (electrolyte)\t1.5\n", + "Typical electrolyte concentration [mol.m-3]\t1000.0\n" ] } ], @@ -244,12 +243,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "64d6972b4d0847088197e17b67ab3fa4", + "model_id": "e17d8edf481748daaef3f3b237bddd71", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=3555.4480183305172, step=35.554480183305174)…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=3554.184719744867, step=35.54184719744867), …" ] }, "metadata": {}, @@ -258,7 +257,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -319,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -338,26 +337,18 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "At t = 233.183 and h = 1.51902e-15, the corrector convergence failed repeatedly or with |h| = hmin.\n", - "At t = 233.183 and h = 5.64685e-15, the corrector convergence failed repeatedly or with |h| = hmin.\n" - ] - }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1322b6651c3e47c6a560784dc8b9d4ee", + "model_id": "517cb023cdd54c27b20efccb17ce081c", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=136.50794742114383, step=1.3650794742114383)…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=1720.7505603255456, step=17.207505603255456)…" ] }, "metadata": {}, @@ -366,10 +357,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -406,7 +397,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -427,23 +418,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that your drive cycle data can be stored anywhere, you just need to pass the path of the file." + "Note that your drive cycle data can be stored anywhere, you just need to pass the path of the file. Then, again, the model can be solved as usual but notice that now, if `t_eval` is not specified, the solver will take the time points from the data set." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6c0f7ee37b19429082b2e940457c1ac9", + "model_id": "62d76f560ead4218ba0b3d4da49b7ba0", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', step=1.0), Output()), _dom_classes=('widget-inte…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=97.84197033486475, step=0.9784197033486476),…" ] }, "metadata": {}, @@ -452,18 +443,30 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAEYCAYAAABRMYxdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAABe6ElEQVR4nO29eXgc1ZX+/x5JtmzZ8iZ5lbxb3jAGBy8YA2ExhLCYLDCQBAIZGIaEhCy/SQYmCSFMkm8gIUAykwwECIQsLCYhhkAAA2bHYIyNbYwt2Za8IHmVbcmrlvP74/RNl1q9VHfX3ufzPP1Ud3VX1ZW669Zb7zn3XGJmKIqiKIqiRIkivxugKIqiKIriNCpwFEVRFEWJHCpwFEVRFEWJHCpwFEVRFEWJHCpwFEVRFEWJHCpwFEVRFEWJHCpwFEVRFAAAEVUQ0YrYo4mItlle93ToGG/kse0DRHSRA21YQkQzY8//K9/92TjelUS0k4juJaIyItpNRP0SPvMEEV0Se9QR0VNutyvqqMApQIhoGBE9TEQbiOhdInqaiCZ63IbTiOikFO/dHOtYb0lY/wQRvZWw7ptEtJmI/sfN9ipKIcDMu5n5eGY+HsD/AbjDvGbmo6m2I6KSLI6R9Lz3EdcFToxHmPlqZj4I4FkAnzZvEFF/ACcDeJKZHwFwtUdtijQqcAoMIiIAfwWwhJnHM/MJAG4EMDSLfRSne22T0wCk6+juYOabLMcYAOAEAP2JaJxZz8x3ALip++aKojgBEZ1ARC/HboaeJaLhsfVLiOhOIloG4Oux13cQ0TIiWktEs4joL0RUS0Q/suyvNbY8LbbNQiL6kIj+GOufQEQ3EdE7RLSaiO4x61O0bzIRvW15PYaIVsWen0lE7xHRKiK6n4hKE7b9KYDeMYfqj7F1T8T+1jVEdI3ls1cR0XoiepuIfmtuqohoMBE9HmvvO0Q0z8a/9c8ALrW8/jSAZ2PiR3EIFTiFx+kA2pj5/8wKZl7JzK/GOpx/2qJE9D9EdGXseT0R3UpEywFcnOT12UT0JhEtJ6LHiKivZbsfxtavinVGYwBcC+CbsY7lFBvt/gyAJwE8jK4dg6Io7kEAfgXgotjN0P0Afmx5vyczz2Tm22OvjzLzTIj78zcA1wGYBuBKIqpIsv8ZAL4BYCqAcQCMOPgfZp7FzNMA9AZwfqoGMvOHAHoS0djYqksAPEJEvQA8AOASZj4WQAmALydsewOAQzGH6gux1f8a+1tnArieJGw3AsD3AZwYa+Nky27ugtyQzQLwWQD3pmqrhWcBfMzyP7kUInoUB1GBU3hMA/BujtvuZuaPMfPD1tcAFgP4HoD5sdfLAHzLst2u2PrfAPgPZq5HV/v7VRvH/hykA/hz7LmiKO5TCukznieiFZDzvNry/iMJn18UW64CsIaZG5n5CICNAEYm2f/bzLyVmTsBrAAwJrb+dCJaGnNizgBwTIZ2PgoRNogtHwEwCcAmZl4fW/8ggFMz7AcQUbMSwFuxNtcAmA3gZWbew8xtAB6zfH4+gP+J/X8WAehnbvBSEQv3LQJwERFVQoTeszbapmSB7bipoqB7Z2Zenwi5A3s95iT3BPCm5XN/iS3fhTgxWUFEQyGdzGvMzETURkTTmHl1tvtSFCUrCCJU5qZ4/0DC6yOxZafluXmd7Hpj/UwHgJKY8/JrADOZeQsR3QygV4Z2PgLgMSL6CwBm5loiOi7DNt0gotMggmUuMx8koiU2jl0E4ERmPpzl4f4McYUIwN9iwklxEHVwCo81kFyWZLSj628i8cRO7MzMawLwvCUZcSozX2X5nOnEOpCbqP4XAAMBbCKieshdnro4iuI+RwAMJqK5AEBEPYgok5uSL6bf2RVzQjKOmmLmDZD+5fuI33itAzCGiCbEXl8O4OUkm7cRUY/Y8/4AmmPiZjLk5g0A3gHwcSIaGEuo/qxl++cAfM28IKLjM7U3xhLIjdt10PCUK6jAKTxeBFCakDw3PZYH0wBgKhGVxpJ6z7S5z7cAzDMdCRH1ocyjsloAlNvc/+cAnMPMY5h5DESgaR6OorhPJ0Rg3BoL26xA+sEBecPMewH8FsBqSNjmHZubPgLgMki4CjFH5UsQZ2cV5G/5vyTb3QPg/ViS8T8gLtJaAD+F9G1g5m0AfgLgbQCvA6gHsC+2/fUAZhLR+0T0ASS/0M7f2QlgIYAKJBdeSp4QM/vdBsVjYglzd0KEwmHIyfqNmK17GySjfxOAVgCLmPmBmHMyk5l3xfaR+PoMALdCYvYA8D1mXmT9HEndiZ8z82kxAbQQ0ul8zZqHE7OkW5n557GE5NcBVLPlxxpLbv4yMy+NJULPZOavOvufUhRFEYioLzO3xhycvwK4n5n/anPbK5FFHxULlf0HM6dMrlYyowJHCRxWgWPz81dCBY6iKC5CRD+H5Of0goSlvs42L6BEdAnEAXqJmdPWuIl99gcA3mXmy/NrdWGjAkcJHET0HwCuAfCwtRZOis9+E2IJP87MXhXsUhRFUQKOChxFURRFUSKHJhkriqIoihI5fKmDU1lZyWPGjPHj0IqiuMS77767i5kH+92OVGi/oyjRJFXf44vAGTZsGJYtW+bHoRVFcQkiavC7DenQfkdRokmqvseXEFVDQ6D7QUVRIoj2O4pSWGgOjqIoiqIokUMFjqIoiqIokUMFjqIoiqIokUMFjqIoiqIokcMXgTN8+HA/DqsoSgGj/Y6iFBa+CJx+/fr5cVhFUQoY7XcUpbDwpQ7OwYMH/TisoijJ2LkT6OgAhg3zuyWuov2Oi7S1Aa+9Jr+jHj2A448H+vf3u1VKgeOLwNmyZYsfh1UUJRmXXAK0twOvvOJ3S1xF+x2X2L0buOgiYMmS+LqLLwYefdS3JikK4JPAURQlILS0AK++CvTpAzADRH63SAkTa9cCF1wAbNkC/OY3wLRpwK23Ai+/rL8nxXdU4ChKIfPKK+Le7NsH7NoFDA7sVFJKEPnc50Qkv/wycOKJsm71auCpp4BNm4Bx4/xtn1LQ6DBxRSlkFi+OP1+/3r92KOGkrg74/Ofj4gYA5s6V5Ztv+tMmRYmhAkdRCpnFi4GxY+W5ChwlGw4ckMfQoV3XT5sG9O2rAkfxHV8ETlVVlR+HVaLEK69oB5ovTU0STrjqKqCkBKit9btFrqL9jsNs3y7LRIFTXAzMnq3np+I7vgicvn37+nFYJUpcey1w2mnAk0/63ZLw8uKLsjznHMmViLiDo/2Ow6QSOICEqVauFIdHUXzCF4HT2trqx2GVqNDeLrH/jg7gM58BHn/c7xaFk8WLgUGDpGbJxImRd3C033GYTAKnowNYtszbNimKBV8EzrZt2/w4rBIVGhqksNjPfy5W+CWXABs2+N2qcMEsAueMMySkUFMjAqez0++WuYb2Ow6TTuDMmSNLDVMpPqJJxkr4MKGUWbOAO++UO8XVq31tUuiorZXaJfPny+uJE4FDhwAVAYpdjMAZMqT7e5WVIppV4Cg+ogJHCR9G4EycCJjE0Y8+8q89YeSdd2Q5b54sa2pkGfEwleIgO3YAAwcCPXsmf3/uXBE4zN62S1FiqMBRwsf69dKxVlaKPV5crM5DtqxYIRemSZPk9cSJsox4orHiINu3Jw9PGebOlXnOPvzQuzYpigUVOEr4WL9eLshEIm6GDVOBky0rVwLHHCMTIwLihPXqpQ6OYp9MAufCC4HSUuAXv/CuTYpiwReBM3LkSD8Oq0SFdevijgMAjBihIapsWbkSOO64+OuiIglTGQdnwwZg1Sp/2uYS2u84zPbtyfNvDMOHA1dfDTz4oAwMUBSP8UXglJWV+XFYJQocPCjJsVaBU1WlDk42NDVJ/oRV4ADyP12/HmhsBE4+GbjiCtebQkTFRPQeET2V5L1vEdEHRPQ+Eb1ARKMt73UQ0YrYY5GdY2m/4zCZHBwA+M//lOWtt7rfHkVJwBeBs3//fj8Oq0SBujpZqsDJnZUrZZkocGpqgI0bgX/5FxFB3rhiXwewNsV77wGYyczTASwEcJvlvUPMfHzsscDOgbTfcZDDh2WC1kwCZ+RI4EtfAu67T89RxXN8ETiNjY1+HFaJAtYRVIYRI4C9e8XdUeI88ADw2GPd16cSOBMnShHF114Dpk+X2cVdrItDRNUAzgNwb7L3mfklZjZf6lsAqvM5nvY7DrJjhywzCRwAuPFG+R3dfru7bVKUBDTJWAkXRuBMmBBfp0PFu9PeDnzjG8C//RuQ6FysXAlUV0sVYytTp8ryq1+Vu+6ODhGO7nEngO8AsKOirgLwjOV1LyJaRkRvEdGnUm1ERNfEPresra0tr8YqFtIV+UtkzBjg9NOBV191tUmKkogKHCVcrF8vgsY6r5AROGqBx3nzTQkh7NsH/OY3Xd9LTDA2zJ4t81P94hfA4MGybudOV5pHROcD2MHM79r47GUAZgL4mWX1aGaeCeDzAO4kovHJtmXme5h5JjPP7GFGjCn5k43AAYDJk2VwgNbEUTxEBY4SLswQcSsjRshSHZw4Tz8tM4SfdBJwxx1SpRiQ3IkPP0wucIjkTrtHD9cFDoB5ABYQUT2AhwGcQUR/6N4kmg/guwAWMPMRs56Zt8WWGwEsATDDrYYqSchW4EycCLS0xLdTFA9QgaOEi2QCRx2c7vz978AppwA/+pFcVB54QNZ/8IGEnpIJHCsuCxxmvpGZq5l5DIBLAbzIzJdZP0NEMwDcDRE3OyzrBxJRaex5JUQsfeBKQ5XkZJODA2ghScUXfBE4o0ePzvwhRUlk9255JAqcfv2AsjIVOIYtW6SGzbnnAqedBpx4InDbbZKEbRKMjz8+/T7cd3CSQkS3EJEZFfUzAH0BPJYwHHwKgGVEtBLASwB+yswZBY72Ow6yfTtQXg707m3v8+acXbfOvTYpSgIlfhy0V69efhxWCQsdHcCSJdIZfvnLEjoBko+gAuT9qioNURmeieXinnee/G9uuknEzvjxklxcVibP0+GhwGHmJZAwE5j5Jsv6+Sk+/waAY7M9jvY7DmKnBo6VUaOkqrE6OIqH+OLg7Nu3z4/DKmHgrrukdsb8+cB11wFr1sTf27xZlmPGdN9Oa+HE+fvf5X80ebK8/uQngVdekVFSy5aJe1NcnH4fpaVyh+6xg+Mm2u84SLYCJ7FStqJ4gC8Cp6mpyY/DKmHg1ltl+LKpgLprV/y93btlWVnZfTudrkE4cgRYvFgcG+N8AZKP88ILwFtvxfNxMjF4cKQEjvY7DpKtwAHEedUQleIhmmScCLMOZfQLZmDPHgmtXHqprNuzJ/6+eZ5YvwWIh6gK/bt7/XXJtfnkJ5O/P2eO3EnbIWICR3GQXAXOhg1So0lRPKDwBA4zcPfdUoo+Gb/+teQnFPqF0g8OHhQHYtAgoKJC1hnXxjzv2xfo2bP7tlVVsq3184WIuUOe4cCoaRU4SjLa2uQ8y0XgtLcD9fWuNEtREnFM4KSbNC9QvPIKcO21yUvYA5KjsGkTcOCAt+1S4g5NRUXcpUl0cIzwSURr4QgNDVLHZvjw/PelAkdJhvlNpJtJPBmTJslS83AUj3DSwUk3aV5wuP9+WR4+nPz9rVtlac39ULzBGoIqK5NE10QHJ1l4CtBaOIaGBhmxUuTAqW0EjrqZipVsi/wZdKi44jGOCJxMk+YlMnbsWCcOmz379wMLF8rzo0eTf0YFjn8YMTNokCTIVlR0dXB2787s4KjAAZyq9zJ4sJwnLS3O7M9nfOt3okauAqeiAhg4UB0cxTOccnDuRIZJ86yT3vk2XPPRR+MzTicTOMxSJA1QgeMH1hAVIELH6uDs2ZPawdEQleC0wAHiVWtDTs9kuVuFxoYN8Wk7csX8HrINURGJi6MCR/GIvAWO3UnzrJPelZT4Ul8Q+N3vgClTJEchmcDZvz+ee6MCx3sSR0ll4+D07CkX5EJ2cI4eBRobnRc4EcnDaW5u9rsJ/tLRITWQfvWr/PZjHL3+/bPfdtIkDVEpnuGEg2Nr0jwrO/y4I/zwQ+CNN4AvfUkuhskEjglPASpw/MAaojJLs66zE2huTu3gAOLiFLLA2bJFXEgVOEnxpd8JEnv3Aq2tQF1dfvsxN4F9+mS/7cSJco62tubXBkWxQd4Cx86keYHgj3+U6q2XX64CJ6js2SNz25j5bawOzr59InJSOTiA5ARE5GKcEw0NslSBoyTDOFj5Fjw0AsfuPFRWTKJxviJLUWxQOHVwamulvs2wYZkFDpEKHD9IzLExDo4pAAikFziVlYX9vanAUdJhziEnBE5ZWW4j9caNk+WmTfm1QVFs4GgyjHXSvMCxY0c8KS6dwCESIVTIF0q/SBwGXlEh39PBg93DV8moqCjsQn8NDfL7ra52Zn99+siFTAVONHDSwSkry21bI76NGFcUFykcB8cqcEpLUwucoUMll0MFjvckFvIzYmb3bnsOTkWFhLLa2tIfp60tdZmAMNPQIL9dJ0cLabG/6GAVOPnUNjp4MLf8G0DO0bIyFTiKJ/gicMaPH+/9Qe06ONXVEurQTt17EkNURszs2WPPwTGTcFpHXiXji19MPVdTmHFyiLghQgLHl34nSJjzoq0t8zmSjgMHchc4RDLTvU7XoHiALwLH82HiHR3iyGQjcNTB8Z7EYeBWB8cInEwOjvl8KpqbgccflxF1UZv0r75eBU4afCtPERSsw+TzCVPlI3AA+Y2qg6N4gC8CZ7fXeRImUTUbgbN7t4zaUbzBJBKncnDMHeeAAan3YT5vFadHj3YtbPbEE3IHe/iwJJ5HhY4OGSauAiclnvc7QcPq2jQ25r4fFThKSPBF4Ozy2h1JrLyZTOC0tkqdCCNwOjokn0PxhoMH5TtJJnCMgzNgAJDuLtyEqKwXsi9+ETj5ZPk+AeCRR+LDW99/37Hm+05jozhSKnBS4nm/EzSC5ODs2aO1cBTXKYwkYzsCxxSIq66OD4+12yHefTewfHn+7SxkkoWgrDOKp5umwZAsRPXBB/Ld3HeffJ+LF8ts8iUl0RI4Tg8RNwweLA6YqX2ihJc9eyT/BfBX4Jg2qIujuIwKHIOpgWMcHMCewGEGrr8+//LnhU7iNA2AjHbr0yfu4KTLvwGSh6jM3FTf+x7wwAPi5Fx+OTB5sgocO2gtnOjQ3CwzzZeV+R+iAjTRWHEdFTiGXAXOvn2yLy1clR/JBI55bdfBKSsDevWKOzhHj8rzBQvku7zhBqmkevzxwPTpKnDsoAInOpipToYN8z9EBaiDo7hO4Qic4mJg4EB5nU7gVFVlJ3CMeFKBkx+pRkmZ4n12HByirsX+TCd+/vnAFVeIe3PJJfK5444DNm/umpcQZhoa5G/P58KTDBU40WHPHukDhw/3V+CYavIqcBSX8UXg1NTUeHvAHTukozalxVMJnMpKcQByEThbt2YuMKekxgkHB+g6xN/Y8MOHA//v/wEXXQRcfbWsmz5dlqtW5d/2IOBGDRwg/j+PgBD0vN8JGk44OO3t0nfmI3CKioCRI1XgKK7ji8ApymUOk3ywFvkDUgscU+K+Tx/J/8hG4HR2yjBdJTdSCZyKCvkf792b2cExnzcOjhE4I0ZIp/7YY5KDAMQFTlTCVJs3x/82J+nfX5YRGFHoeb8TJI4ckZGKAwfKuZBrDk4+M4lb0WJ/igf4csbv9NruzlbgENkv9mcEDqBhqnzYvTueQ2Nl0KD4/zVXgTN8ePfPDR8un42KwGlqEiHnNBESOJ73O0HCOHDGwWluFtGTLU4JHK2Fo3iALwJnTz5lwnMhW4ED2J+uQQWOM6QKQVVUxCsOZxui+ugjscOt372BKDqJxkePyv9v6FDn911aCvToAezf7/y+YxBRMRG9R0RPJXnvW0T0ARG9T0QvENFoy3tXEFFt7HFFpuN43u8ECfO3mxwcANi+Pfv9OClwmpqk4KaiuERheLYmB8eQKHCOHJGLYlVVfF02Dk6/flJXRQVO7qQTOMmep6KiQu5OOzrEwRkyRBLMk3HccZKDE/aK1UZkDxvm/L6JxMVx18H5OoC1Kd57D8BMZp4OYCGA26RZNAjADwDMATAbwA+IaKCbjQw1iQ4OkFuYykmBA2hYX3GV6AucQ4eAlpb0Ds7Bg7IsL4+vy0bgjBghSXMqcHIn1Sgpq+ix4+BUVIhg2btXOvBk4SnD9Ony3W/YkHVzA4W5E3fDwQFcFThEVA3gPAD3JnufmV9i5tgJircAGJv1EwCeZ+Y9zNwM4HkA57jSyChgBI7JwQFySzQ2AqesLL/2aLE/xQk++gg4J/VpH32BY8JMyQQOs7w2Nqk1/8OuwNm+XfY9dqwmzeWDUw6OdbqGTALnuONk+eab9tsZRMyFyg0HBxCH0r0Q1Z0AvgPAjo12FYBnYs+rAFhv/7fG1nWBiK4homVEtKytkEc5WkNUTggcpxwc7TOVfGhuBp59NuXb0Rc4iUX+ABE4QHxYdyqB09ycecZpk98zdqw6OPngpINj9tfYmD7x9vjj5U7yoYeyaWnwMBeqkDk4RHQ+gB3M/K6Nz14GYCaAn2VzDGa+h5lnMvPMHj165NjSCGANUQ0ZIqFHP0NUVVWSH6cOjpIP1omUk+CLwJk0aZJ3B0sncEyYyowmKC2Nf8Y4AZkSE43AGTNGLjQZ/uFKEpLNJG4wgqWoKD6iJx3m89u3y3eTzsEpKgK+9CXghRfCfScZ3hDVPAALiKgewMMAziCiPyR+iIjmA/gugAXMbIb+bAMw0vKx6ti6lHja7wQN04/17y9J45WV/jo4PXqIyFGBo+RDEAWOp9gROMkcHDsTbra1ScdhHBwg3BdKvzhwQP6XyQSOWTdwYLxQYzqMMF27VnJx0gkcQCocA8CDD9pvb9BoapILl5kl3WlcClEx843MXM3MYwBcCuBFZr7M+hkimgHgboi4sQxZxLMAziaigbHk4rNj65RkNDcDAwbEE+5zLfbnlMABgHHjgPXr89+PUriY/NkU+CJwtucyPDFXchU4dqoZm/esAkfDVNmTapoGIC5w7OTfWD9nKhRnEjijRwPz5wO/+114R1Nt3+6eewN4MYqqC0R0CxEtiL38GYC+AB4johVEtAgAmHkPgP8G8E7scUtsXUo87XeCRnNzfKoaIPfpGpwUOHPmAMuXq+ut5E4QHZy9e/d6d7AdO+TO1npCZhOiSidwrOJJBU7upKpiDMjw+3797OXfAPEh+6tXy+tMAgeQMFVDA7Bkib1jBI2mJvcSjAEROPv3x5PyXYCZlzDz+bHnNzGzETLzmXkoMx8feyywbHM/M0+IPX6X6Rie9jtBIzEEnGs1Y3PH7ITAOflkcW7ffjv/fSmFSRAFjqeYHBmi+DqnHBwjcIYOlQ6jVy8VOLmQTuAA4srYdXDMhJsffiiv7QicT31K7Pv77rN3jKDhtoPTr5/UFcpgBysBJtHBMSGqbF3LAwckf8aJhO1582T56qv570spTFTg7OheydaOwDEX1HSFqKwODpHOr5Ir6UJUAPDd7wJf+Yr9/VVUxEfI2XE2evcGLrhAko3DiBcODhCJ6RoKFjOTuOFjH5P+75VXsttPvjOJWxk0CJg2DXjtNWf2pxQeKnBsCJxkIapevYCTTgIefzy1NZ+Y36NDxXPD/B+Na5bIVVcB555rf39mP5WV8e86E9OmiRMStjDG4cMiPNzOwQFU4IQZM5O44YILgL59gT/+Mbv9OClwAAlTvfGGOISK+7zzDvDww363wjmCKHA8ndU3mcAxQiadgwPICJu1a4Fly1Lvu0eP+AVgzBgVOLmwZYt8J9bpNPLBOEF2wlMGM4R43Tpn2uAVJnHWTQenXz9ZujgflRcU7GzipgyD1cEpKwM+/Wngsceymw/KaYFzyilSaT4Kc8KFgZ/+FPja1/xuhXMEUeDU1NR4cyDm3ENUAPAv/yIX3t//Xl63tYmb8Nxz8tpUMTb5PWPHyp1SyC8EnrN5s0x14dQFKBeBM3myLFXgdCciDo5n/U7QOHBACpYm5rhddpl8p08/nd2+nHZwAM3D8YraWkkJiIpjduiQDCpJQbRvafbtE1GSS4gKkMTTT30K+POf5bM33wzcfz/wq1/J+4niyTw3OSWKPYzAcQoTospG4IwbJyeKSU4OC25XMQYiI3AKFus8VFbOOEN+N3/oVlsxNU4LnFGj5KF5OO7DDNTVydL8JsLOoUNp63+llj4u0pjL8MRcSDU6x66DA0iY6pFHgBtuAO68U6zdJUtk20SBM2CALMOWx+E3mzcDZ57p3P5ycXB69ADGjw+fg+P2PFRAPEQVcoHTWFcH3H23OK6pHkD8eVGRPIqLpW8YPVpcWjsVtYNEqn6wpAS49FLgN7/pPsoqFQcO2PtcNpxyiiT4M3cd7ao4S2NjPKSzc2fqnMcwceiQXJNbWpK+7YvA2e9VCMf80dZZwoHUAifRwQGAs86Si8cddwA1NcD3vw988YvAW2+JwDGhDUAFTi60t8uMsKNGObdPI3DSzUOVjEmTwufgmBBVokvpJOaCHvLQ6/59+4Brr81/R/36AdXVInjmzQNOPx2YPTutVd6FrVuBqVMluXbatPzbk4lUDg4gYaq77pLBFFdfnXlfBw7I3+4kJ58syc633w4sWCD9rAod56mriz/fuROYMsW/tjjFwYPBc3A8w67AOXJE7tKSdVAlJeLi3H67nIQ1NXJX99xzInCsoQEVONnz0UdSi8PvEBUgYvUf/xDRZfdi5TdNTXJnbne0WC6Y8yfkDg769JGpAZiTP4Curzs75WFqADU0ABs3SlL8tm2Sz/C978l2V1wBPPCAvXbU10vfVFvrjcBJV2fqhBNE+Cxfbm9fToeoAEkD+OUvgW9/Wx59+0q/OmSI3KwMGiSPAQNEbPfrJ4/ycmmLeZSVyefdmrIk7NTWxp/v3OlfO5wkiCEqz8jGwUkWnjLcfDNwzTWSpwFIifG//lX+uRqiyo/Nm2XppIMzYwZw7LHArFnZbTdpkvwm6uuBCROca4+buF3kDxBBX14efoFDlL2rZ2XmzO7rdu2SwQhLl9rfT6Jz7DbpHBwicWS2pZ2nNM6BAyIknGTYMGDNGhGPixeLi7pjhzy2bZMRVnv2AK2tmfdVVAQcc4w4arfckt/3HTUSHZwoUNACx5wQfft2XZ+twOnVKy5uAAlb3XKLPFeBkx9uCJzq6tyGnVpHUoVF4Lhd5M9gpmtQulJZKRfTX/zCvvNnBjV4JXCMg5Mqd2bECHFS7eCGgwOI0Bo/Xh6paG+X3+D+/XLz2tIi7WltFYft0CHpT5YularkM2YA113nfFvDSl2dhFUbGlTguEmJV/Z/NiGqZPk3qTj77OQCp7xcTlQVOPYxlaKdDFHliqmF8+GHwHnn+dsWu2zfnr1TlQseT7jpBq71O5MmyWhNu86fEThm6RZ1dZI7+MAD0jcl3ugZqqrs3RB0doqQcEPg2KGkJB6uSsfRo9Kfaz/clbo6cbeam6MlcNL8Hn0ZJj4+nUp3EqdCVInMnh3fp1XgFBXJhUBPrNQwd53TaPNmubNM1fl6SUWF3JGHaSRVU5P7ISpAch5CLnBc63cmTpTl+vX2Pu+Fg3P0KHDcccC99wKXXCKDIlIl7o4YIUK5vT39Ps0IHL8Ejl169pQwmvbDcZglB2fCBCmomm6OxTCRwcGJdh0ctwROjx5SQwLoPnpFBU56Fi6UkIo5wTZvdjY8lS+TJ4dnJJWx5zVE5S/ZVsH2IgenuVluJG6/XWp3TZ2a+rNVVeLOmBF5qThwQJZBFziApAtoPxxn+3b5/ozAiZKDEzSBs81uQlu+tLaKGEkcYZJviAoALr9cLoaJd896YqVnxQoRnmaSP6eL/OXLpEnhcXDMBckLBycCISrX+p2KCnEhg+TgGDFqp2aNScTNlIejAie8mATjmhoVOG7Taicb3glaWrq7N4CIHiB3BwcAPvtZmacqUTzpiZUek3NjBM6WLcFzcHbsCEelTy+maTBEIETlWr9DlJ0w9kLgmO/KFGlMR1WVLDMJQBU44cUIHHVwIkQqgVNcLA9rR5Otg5MKPbHSs3WrLF9+Wb6f5uZgCZwwTbrpxTQNBg1RpWfixOwdHDeTjM13ZafqchQdHE0V6EptrVzzRo+WPMOdO+O1n8JMQQuc1tbkAgcQ58UaosrWwUmFCpz0GAdn5Upg1Sp5HqQQlZmQccMGf9thBzNz/ejR7h+rf3/pTNra3D9WGJk0SRwQOy5R0BycIUPk4pfMwensFEcTCJfA0X64K3V1Ms1Ijx7i4LS1hf+GxQxYKViB09KSenSOVeDkEqJKhZ5YqWEWB2fWLHn+5z/L+iA5OCZnIQzhmNpae8NmnSAi81G5hhlJZa0WmwovkoyzcXCKiyXMmczBefRREdC7dqnACTN1dfESBoMHyzLsYaq2NhHgaQpP5i1wiGgkEb1ERB8Q0Roi+nqmbXq6WVbeSqoQlTSia0fjZIhq//7oTEfvJLt3y//6s5+V///DD8v6IAkc83tJMXlboDDDPr0gAvNRudrvmNCmnTBV0BwcQPJwkjk4mzZJO1esiJd3CJPAiUIYJl/MLOKJAifsQ8VN2QKXHZx2AP8fM08FcCKA64gozZhEYOzYsQ4c1gZ2BY7TISog1BcC1zD5NzU1Ukto1y6pHRSkcuq9e0ubwiJwTEjNbYzACbGD42q/Yy4ednK3vBxFZVfgpKpmbFyQlSvD5+C0t3etuVWo7NwpvwfTV0TFwfFC4DBzIzMvjz1vAbAWQFW++3UEuzk4ToeoALVHk2GtWvzxj8vzESOCNbElkfxmgi5QDx+W/6cKnGDQu7c4kdk4OG4mGe/bJ20yI0YzkcrBMd/3+++HT+AA2g8DUmEbAMaMkaUKnNwgojEAZgDoNvMcEV1DRMuIaNl6u6MN8iWbHBwnQ1SAnljJMA5OdTVw6qnyPEjhKUN5efAdnI0bxXr2SuAYJyDowi8NW4zAdgu7Q8W9ysGxk39jGDFC+qxEx8P0Yypwgsc77wA33pj5nDS/e9PXVlbKUgWOfYioL4DHAXyDmbv9x5n5HmaeGXs4ddjUMPsbooryiZUrW7aIWzNkCHDSSZLcGKQRVIZ+/YIvcEwyqzo4tjnodrjCDBXP1L95lYNjNzwFxGvhJIapzPf9wQfynMi5vtJNotwPr10LnHOOhPl/+lPgqafSfz5xvr8+feQ7VIFjDyLqARE3f2Tmvzixz7w5ckRisJkEDrOGqLxi61bpSIuLxVm76y7gq1/1u1XdCYODYwSO10nGIRY4rjNpktxNm2HVqfAqBydbBwfoLnBMP3b0KLB8uVwcU81pFSSi3A9fe63MmG4mfG5oSP/5zZtlpJEZbUkUjWJ/XggcIiIA9wFYy8y/yHd/jmHqUWQSOMbF0RCV+2zZIuEpw3XXASef7F97UhEWgWOmCPACl0JURFRMRO8RUbfbUCI6lYiWE1E7EV2U8F4HEa2IPRY52qhcMZN5btyY/nNeFfrLxsExAicxD2ffvvgIsaVL0w7JDRRR7Yfb2yU0deWVwPe/L0LF5NikYssWcW+swlQFjm3mAbgcwBmWDudcB/abH+YClSoHp7RUxI3pZNTBcZ+tW4MZkkokDEnGXo6gAuR8KS11w8H5OmRgQjI2A7gSwJ+SvHeImY+PPRY43aicMOd+pv+RFzk4ToWo9u4F5syRZOV9+8KRfwNEtx9eu1Yu7DNnyusxYzILnGQTGkdhRnGPRlG9xszEzNMtHc7T6bbp5UUMN9VM4gbj4JhOxqk29esnSjlqJ1a+mCJ/VgcnqITBwamr81bgAI5PuElE1QDOA3BvsveZuZ6Z3wfQ6cTxXO937NZQCmKIqn9/uVAkc3CGDAGmTJHXYRE45m+PWj/8zjuyzEbgGAfHijo47jHai9LydkNUppNxKkRVVCQiJ2onVr6YIn9hcXCCLHAOHfJ2iLihXz+nna07AXwHuQmYXrFRmW8R0adSfcg6erPM7fBKkAROtg4Okbg4Vgfn6FEZVdW/PzB9uqwLi8ApLZULX9T64WXL5Hs15/7o0ZKD05niFDp6VOasS+x3zXxUYcYMGgiawPGETCEqI3CcDlEBYo9qMmZXTCZ/GBwcM4oqqFVQzTxZXiUYGxx0cIjofAA7mPndHHcxmplnAvg8gDuJaHyyD1lHbw429T/cIigChzl7BweQPByrg2O+6wEDwidwgGhO17BsGXDCCXIjDYiDc+RI6sT2bdvk95AsRHXgQNwFCSNBdXAaMmV9O4FfISogmidWvpgaOGFxcNrb3U0CzQevh4gbnA1RzQOwgIjqATwMyeH7g92NmXlbbLkRwBJI/a20uN7vZCtw3Pp9tbbKRS0bBwfo7uCY7zqMDg4QvX746FGpKD1rVnydKd6XKkyVOETcEIVif0EVOIfdtGYN2Qocp0JUQPROLCcIk4MT9Pmo/BI4/foBe/Y4sitmvpGZq5l5DIBLAbzIzJfZ2ZaIBhJRaex5JUQsfZBpO9f7nZ49pR/J9LsxScYdHSKknSabiTatGAfHOJemD1MHJxisWiW/HZN/A2QWOJs3yzKZgwNEQ+C4OdlmYLGbg+NWiCpKJ5YTbN0qRf6GDvW7JZkxv5mgjqSqrZUOKtsLWL6ceKKM4lixwrVDENEtRLQg9nwWEW0FcDGAu4loTexjUwAsI6KVAF4C8FNmzihwPMFO/pbVuXFDdGU70aZhxAhpW3Nz1/307y+zjVdVScJxWIhaP2wSjK0OjslnLVQHp7g47XQkAZoEyGHs5uBoiMobtmyRDrIoBJo66A6OHyOoAODf/x340Y+An/0M+OMfHdstMy+BhJnAzDdZ1r8DoJvlx8xvADjWsQY4SS4CJ1UflSu5OjjDhsly+3YpCmd1cIiAV1+ND78OAwMGxN3OKLBsmdS+sg7S6dtXEobTOTgVFd1djqgInDThKSDKDk5LizgGqUJPiQ6OhqjcJSw1cID4nW9QBU5trfcJxoD8rv/934FHHslcPbVQsStwzF2nG3k4uTo4xl3dvr3rfoxQGjvWu8KSThC1fnjZMglPJVaSHj06vYOTrN8dOVKugS66sa4TVIHj+nBNID4PVaqy4m47OPv3px66ZxdmKY8eBRKrGAeZIDs4ra2SJ2Gqy3rNN74h59Qdd/hz/DzwpN+xI3COHo2LBjdCVLk6OIkCx+rghBEjcII6GjIbDh4EVq/uGp4yjBmT+oYjlcDp3VvmA3zhBUeb6SlBFTgjvbiTb21NnX8DuC9wzFDNfHjpJRkSGGaVbWhsjJeDDzpBFjjGcp840Z/jV1cDX/gC8NvfSm2jEOFJv2PXwTHuSpBycEyIqqkpvh+i9P1okBkwQJK43Z5k1QtWr5ak9BNO6P6eKfaXTMglq2JsOPNMGZUV1jBVUAWOJ7S0pI9t9+wpDov58TsdogLyt0dNvZPE6qJh4/Bh+T9XVvrdEnsEWeCsXy9LvxwcALj+evk+//53/9oQVDJN88EsN1ZuCpxcHZxBgyRp0+rg9OsXjry5ZERpugaTLDx2bPf3xoyR31FiLZyWFvnbUwn7M8+U5UsvOdVKbwmqwNm0aZP7BzEhqlT07ClLc7fjtIMD5H9imZoUDg3N9Q1zp19R4W877BLkUVTr1snSjxwcgxFXjY3+tSEHPOl3Mjk4Zoi4myEq47xkm7xcVCSjpKw5OF6P1HOSKAkc46oZl81KqqHiRhSlcnBmzZLf64svOtFC7zl4MJgC56g5yd3ETogKiF/EVOC4hxE4gwb52w67mAtDUB2cUaMyntiu0qePPMyFMCR40u9kK3DcSDLev1/akYvzMmxY/GK6d29482+A6Amc4uLkLngmgZPKwSkpAT7+8fDm4QTVwfEEuw6O6YyCGKKKmsAJi4NTUiLDKoMqcPzKv7EydGjoBI4nlJfHKwknwwgat3Nwss2/MVi/V3VwgkNTk7hrxcXd30tVCyeTgwNImKquLl4QMEwUvMDJlIMDxB0c89oJVOB0JWwCBwjmhJvMInD8zL8xDB2aev6bQqa8XL6nAweSv++FwMllHiqDVeCogxMcGhuTh6cA+c0NGtR9JNXmzeLipRvcYfJwwujiFLzAsRui6tUr9XDyXFCB0xUVOM6wY4fcVQfBwbHmaihxMtVQMgLH7RycXB2cYcPke2WW/ksdHH9I/P00NaUWOEB8JJWVLVuA4cPFkU7FtGlyLj/5JPDWW8DTT4dn1FlQBU5fpyt3JsNuDk5Li7PhKUA6F6L8Tqz29vgFxJRODytGoIVN4AQtydiMoAqCwAlhiMqTfifTCDwvBE6+Dk5bm/Q5+/aF28Ex/4OwCZwVK6Sg4geW2UfsCJzEJPr6+nh+TiqIxMX561+BuXOB884D7rort3Z7zaFDaeehAnwSOFVVVe4e4OhReWTj4DhJUZGInHxOrB074nH8KDg4ZWXO/5/dJF8Hp6VF5m1ykiAMETcMHQrs2iW1OUKC6/0OkFngeJFknG8ODiAX1LDn4JSWyh1+2ATOxo1yXpn6Z52dcjMxfHjqbcaOFUFjLS67aVNmgQMAt90GPPCAuDfHHAM891zubfeSoDo4rpNpHirAXYEDyJ1PPsLEhKf69ImGwAmTewPkL3Buu02GYba1Odemdevkd5suadArhg6VznTXLr9bEizsOjhBzcExLsGGDfL9htnBAcI5XYP57ZiQ0+7d4uinc3DGjZPfkhkB194u0+Mkq5uTSHU1cMUVwCc/CZx7LvD666lzyIJEUAXOBlPAzi3MD8SvEBUgFmM+oSUjcI45RgWOH/Trl5/AWbVKOolUc8Tkwvr1Uv8m2UgKr0ks6x8CXO93gGAIHCccHFNvSQWO95jfjgk5pauBYzBCxmyzZYu4QHYcHCvz58tN2auvZred17S3yyOIAqe9vd3dA7S2ytKvEBUgWe1OCZzm5vzntfKTMAqcRAdn587s5rQxUyo4OZtxUIaIA6EUOK73O4D/AsdMTZBPDg4QFzhhDlEBhSNwxo2T5caNXbe14+BYOeUUueFfvDi77bzm0CFZBlHguE42Do5bAscJB6eoCJg8WcRN0Eb0ZMPu3eEp8mewCpwdO6RY1sKF9rbt6IhPs2HyZvKlvV3qVQQh/wYIpcDxhExVsE0OTq9eciFxOgfHHDdXB2fQIBl1ExUHp3//whA4phaO2cY4x9kKnN69gXnzgi9wzEivghY46XJwTFiqs9OdENWgQfnn4AwZIg8g3GGqsDo4Bw+KsFi7Vi5Eq1bZ23bLlviFyykHp6FBrGN1cIKNXQentFQeTjs4uc5DZTDTNaiD4x/mt7N5s9wsmSlR0iUZ9+oFVFXFBc6mTfJdVldnf/z582USziCf2wXt4GQTogLcdXCyCWtY+egjKdBknI+wCpzOTml7GAUOIL8lI1JMZdBMmM+XlOQvcBYtAr7/fXkAwRE4/frJOaTF/rrSp48sMwmcnj2l33Fa4OQ6k7gVaxHHsDs4AweGbtb7f/522ttlouWmJvldZSpzMHZsPERVXy+uc48e2R9//nxZBnmOKpsCJ00FIPfol8/JZ4dsQlSAewLnyBFbY/WT8tFH8gMNu8DZt09ETlgFTkuLhIaA7AXOySfnF6I6cAC45BL5HZWWSpx9+vTc9+ckRKGrheN6vwPIXXPfvvYcHDcETr4ODtA1FBJ2B2fkSLnRPHAgLj6DjvW3s2lT5ho4hnHj4jOD2x0inoyPfUyuX4sXA5/7XG77cJsgOzjD01ltTpDNMHHAvRAVkHsejnFwBg6U12EVOGGsYgx0rUibrcBZv14601NPFZs514vY88/LtosXywm9YUN+d+ZOEzKB43q/Y0hXYsDk4LglcJxycAxhFzimpEKY5lpqaQEGD5bn2QqcrVtFRG/alH3+jaG4GDjjDOBPfwKOO04m5Hzrrdz25RZBFjiuExQHB8hNmBw9KqN2ohCiCmMVYyC5g7N1q72QY22tDOeeOFE+b2zjbFm0SC4wp5yS2/ZuEzKB4xnpBE6igxO0JGMgLnBMG8OMSb4Nk8DZvx+YOlVc0vp6+wJn7Fjpb2pr5QY5V4EDADfcAFx8sezjzTeBxx7LfV9uEGSBU+vk0NlktLaKCk13crotcPJxcMxFw+rghHW6hrA6ONbRMHV18ns5eNDe91BbC9TUxPNlcglTdXQATz0lhbdyiaN7QcgEjuv9jiFdDSVrDo4bScbGwXEiRBX2/Bsg7uAkTkQZZFpapL80ScONjekTjA1mqPiSJbLMNUQFADNnAr//PfDEEzJy06tzxy7mxjnD6FxfBE6n2zVdzESb6SbQdDtElY8wMTVwRowQ8VVWFl4HJ+wCp7ZW4vcnnSSvM4Wp2tqkU5o4UUSO2Ue2LF0qLt6CBdlv6xUmGTUkNZpc73cM2Tg4buXgOOHghD08BUgfWlwcLgfHXL/GjpURnHv32ndwgHhycD4OjpWamuAJnJ07ZWlCeSmIZohq377MGedeOTi5CBOrwDH7UoHjLUbgvPeeLE8/XZaZBE59vYx+qKmRO+DKytw6h0WLZBTWOedkv61XDB0qf2tY3UW3sCNw3BxFVVKS0bpPixE4UXBwSkrECQmbg2MEjpmPyo7AGT5chLMTDo6VCRPi82MFBSNwgujguM7atfG751SExcEx+wqzwCEKX2eZq8AxYsb8/iZOzF3gnHZasP9vWgsnOZmSjHv2lHPCDYGzd684L+nc60yYi2kUHBxA8nDC4uAwdxU4Zi47OwKnqEhETXOzhLXN9SNfamrkd2t3kIUX7Nwp18UM4fvoCZy2NuD992WoWzqKi+OdgBsOTnm5/OBydXCKi+P2W9gdnIED5X8RJozFv2qV3AXOni3LbAVOTY39HJx164BnnwUefVREepDDU4AKnFRkcnDMDZUblYydKKoZJQcHkDycsDg4hw+LU1Je3tWBsTsC0OThjB7t3Jx1+YTa3WLnzozhKcAngTPAzRPHVJ2dMSP954jiLo4bAqeoKPfpGj76SH7QRhTkO6+Vn4SxijEgF5+SErlzGTNGXo8YYU/g9O8fP/lqauT7zDQ77+HDwJw5EpK65BL57i+4wJE/xTVMle08i/0RUTERvUdETyV571QiWk5E7UR0UcJ7VxBRbexxRabjuNrvWCkvTz1Vw5EjXfsdpx0cJ4pqDhwov/0oOThbtwYrxJIK6whgaw6NHQcHiG/jVHgKUIGTLUOtdRacxoQUMjk4QLyjcSNEBeQeWjICx2B1cA4dAn7yE3dmIXaDsAoconiYasIEWY4cmVngrF8vHYJxB81IKjPUPBUvvST5E7/8JfDyyxJ7d7KTcgPnHJyvA1ib4r3NAK4E8CfrSiIaBOAHAOYAmA3gB0Q0MN1BXO13rJSXi5Ax4QUrVgfHDYHjxPlWVAR8+9syTDgKjBol4saE/oNMMoFDZOtiDiDu4DiVYAzItah378x9mJfs2hVcgeMqy5fLqCM7Je3ddHCA3J2XrVslMc5gFUqLFgHf/W7wp7M3hFXgALkJHDNE3GCeZwpTLVokxQH/7d+kQOCxx+bWZi8ZNEhs8DwEDhFVAzgPwL3J3mfmemZ+H0DiEKhPAHiemfcwczOA5wEEIyM73XxUR4+6L3CcmNj2Jz8Bzj47//0EgTDVwrEKnKoqcdIqK+2XinDDwSkqkj5QHRx7rDMTubnBe+9J9UU78Ue3BU4uISpmGYlj/YEOGiQd4aFD8YqSYZldPIzzUBmSCZytW1MPiz5yRDpRq8Ax26brHDo7ReCcc064CquZiRnzc3DuBPAddBcwmagCYFWbW2PrukBE1xDRMiJatnr16pwbmRXpBE6ig+N0Dk6Yzze3CFMtHKvAKS6WttsNTwHA5MmynDTJ2XYFaah4Z2eBOjidnSJw7ISnAPdDVLkkB+/cKQXlrBajdch52ARO1BwcU2U6GRs3ym/QKnD69hWLN13nsHy52OdBTypORh7F/ojofAA7mPldZxsVh5nvYeaZzDyzh1cFEzMJHGu/c/hw7hPyJnL0qBQ5dcLBiRKJDk5Hh/SxQSSxCv8nPiGjKe0ydSrwxhvApz7lbLtqaqR/a293dr+5sHevfIeVlRk/Gi2BU1cnJ3imBGNDEB2c+npZJjo4gJTsXr5cnodB4JgON6wCx4yksgocQFycZCSOoDJkuvv529/kbu2883Jvq1/kV814HoAFRFQP4GEAZxDRH2xuuw3ASMvr6tg6/8nGwensdO6iEdZpUdymTx/5nxgH56abgClTnBOWTpIocH79a8nLy4a5c50bQWWYMEFyyoIwVNxmkT8gagInmwRjwLscnGwqqBqBk8zBeeGF+GR9ra2ONNFVwlrkz2CG+pvvwgicVCd5rgJn0SKZeTyM/6chQ1I7Whlg5huZuZqZxwC4FMCLzHyZzc2fBXA2EQ2MJRefHVvnP9aJWhNJzMEBnMvDMeebOjjdGTVKHJz2duC+++T5rl1+t6o7duZR9IMgjaQqWIGzfLkkYx1zjL3PezGKqrMzO7dl0yZZWh0cUzTw6afj68Lg4IRd4EyYIG6g+Z3YETiDBnW/wEycKEOpkw0d3rRJ6jaFMTwFSAgu0xD4LCGiW4hoQez5LCLaCuBiAHcT0RoAYOY9AP4bwDuxxy2xdf6TjYMDOCdw1MFJzejR4uC88ELccdywwd82JUMFTmaCLnAGuXWH8d57wLRpXasUp8OLEBWQXR5Ofb10UNYfuPl/vf663In07x8ugRPWO8of/1j+54bBg+XilErgmCHiiaTrHJ6NmQ5hFThlZY7kMzDzEmY+P/b8JmZeFHv+Tszl6cPMFcx8jGWb+5l5Quzxu0zHcK3fScSuwDFLpxKNw35D4Sam2N9DD8XDNypw7DN8uIT6giBwjPPmlcAhonOIaB0R1RHRDZk+P9jumP5sYBYHx254CvAmRAVkl4ezaVP3IX5mP+3tEl8tL9cQlRcUF3d194iA6ur0Dk46gZNsqHh9vfwOx4/Pu7m+0Lu3CJwg5jMk4Eq/kwy7ScYaovKO0aOlz1y4EPj852VdUAVOr14yPDxIEAVnqHgWDk7e/0UiKgbwvwDOggzVfIeIFjHzB6m26Tx6NLvqp8zy6OwUm7+pSR67dslJvXGjuDe7d+cmcNwMUQHZCZz6enGhrJghgx0dwIknAitXuuvgMEvROZPvky2dnfL9vPKKvA6rwElGqlo4Bw9K8nEygWPES7LOoalJEnXzmTvIT8rK5PeS62/FQzydTRzQEFWQMEPFjxyRWlMvvBBcgRM098YwYYJMXeM3O3dKaNyGMeGETJwNoI6ZNwIAET0M4EIAKQVO7apV8SqoTjB8uORKXHhhXJ3bwSsHx26Iills1MQS/USyr507ReD86U/uCJy//AX44Q/FRXJq/wMHxkv6R4GRI6XqcCKms0wmcHr3lu1SCZxs6lwEjbIyWQZ12K2FWq/uPktLJRcwWc6V20nGPXpIKEHpihkqPno0MG+e3HSowMmOmhoZ8dnWZr/woBvYLPIHOCNwkhXcmpP4ISK6BsA1ANC7pAS4667sjlJUJI8+fUTQDBsmf6SZNyUXvMrBsevgNDVJZ5esCuXAgeKqzJjhXojq1lulk7zySukIevfOfV9Dh8roo4kT3XPI/GDGDInjNzTEO00gLl5SVdBONZKqqSl+dxlGzG8kBALHU1JNuJnMwXEqB8cU+QurG+gmY8fK9eOyy2Q5fjzwj3/43aruBFngTJ4saRIbNzpfSDAbdu60VQMHcEbg2IKZ7wFwDwCUl5czvvIVrw6dGi8K/QH2HZxkQ8QNw4fLl1paKvac00McP/oIePttSaz9r/9ydt9RwpSvf/554Oqr4+tTDRE31NQAjz3Wff327TJTeVgxDs6hQ/62I2ikEziJ/Y6TDo6Gp5JTWQm89lq8Rtr48XJzceBAsByvIAucKVNkuXat/wLH5uzqTiQZB7fgViYS76ScpndvOYZdByfZEHHDvfcCf4jVQHPDwVm0SJYXXujsfqPG1Kkyq/jzz3ddX1sroThTAyWRmhoRulax29EhuWgaoooe2Tg4TgocTTBOzdy58f+5yYszfW5QCLLAMdNAfPihv+3IIkTlhMB5B0ANEY0lop6Qgl2LHNiv+7jt4ADZzSierIqxYcKEuLOTqvPMhyeekGNMnersfqMGEXDWWcDixSJQDKlGUBmSDRXftUsSssMscDRElZx+/SSknIibOTg6D5V9jMAJWh5OkAVOv35yc7d2rX9tYLY9DxXggMBh5nYAX4VUEV0L4FFmXpNum0qb8TPX6dlT8necLmttJZsZxevrxQUwd8Wp6NvXWYGzfz/w4ovi3mj8PjNnny0XEzNtBpCbwGlqkmWYBU6IQlSe9jsjRkjY10pnpyRoqoPjPypwcmPKFH8FzoEDcr546OCAmZ9m5onMPJ6Zf5zp8xVBucvo1SuzmMiXbOajSlYDJxnl5fIlOzWHzTPPSMer4Sl7zJ8vSxOmam0FGhvTC5xx4yS5MWoCJ0QOjqf9jpkawFofyAyld6vQnzo49hk0SAqmqsDJjsmTJUTlV92rLGrgAD5VMm4PwoykAPDVr8bzWtwimxnF6+uTJxgnYk4Ap/Jw/vY3ScI76SRn9hd1hgwBjj8eeO45eV1XJ8t0Aqe0VC56yQSOkyUTvCZEOTie9jsjR4qrZT33jZBxo9DfwYOyH3Vw7EEUvKHinZ3SpwdZ4EyZIiIs0Z30ijAInA1B+VGNH9+95ozT2HVwOjpk6LEdB6dvX1k6EaZqa5M5ri64wN1QXdQ4+2zgjTekQ8o0gsqQOFQ8SgInBCEqT/sdM/R/8+b4OiNw3AhRhb1quB8ETeCYOd2CLnAA/8JUYRA4BYVdB6exUcSG1w7OunWSDGnCLoo9zj5bvq/PfAb46U9l3YQJ6bcxAsfYu01NIlaNYA0jIQpReUoygZMYonJS4GgV4+wZP15c86BEFMwNa6qRmEHA75FURuDYzKdTgeM2AwfKD7etLf3n0o2gSiRdKfhsyVSgTknOyScDp58urltrK3DJJZmFyuTJIiaNc7N9e7jzb4BQhag8JdnM84kOjglVOengaIjKPuPHi7hJNbec1wR1ok0rw4eLAPPLwcliok1ABY77mGrGs2bJBe7ee5N/bskSWSbOQ5UMJ0NUJn8kk/ugdKW0VEaerVsnj4cfzryN+W5Xr5Zl2KdpAEIVovIUM/N8shCVETZE8plskozb24FbbpF5z6yog5M9QRtJFQaBQ+TvSKqdO+X8sfk/UoHjNvPnSzijulouaH//e/fPMAMPPCCOQFVV5n06GaKqrRW7b8CA/PelpCeKAqdHD8ndUgenK0VF4uKky8EBJEyVjYPzxBPAD34APPpo1/Xq4GSPCpzcMCOp/MAU+bNZzsQXgTMkSpMvZmLKFODZZ4GnngKOOy7eEVl5/XU5ya680t4+nQxR1dVlTo5VnGHwYEkoNjPyRkHgAOLihEDgeN7vJAqcxBwcILPAWbOma0HJ//1fWSaGVYyDowLHPlVVIs6t35GfhEXgTJkiOaPJClm6TRZVjAGfBM5AE7YpNCoqkiccP/CAzIfymc/Y24+TIaraWg1Pecm0aeLgHDkio+uiInBCEKLyvN8ZNSp9Dg6QXuA8+qj8Xr79bXm9Zk08lJ14Ud69WxK+85kgt9AoLpbzz68hz4mESeAA3oepmMUIyOJGxReBc9TcyRQaFRXdHZyDB6Uju/hi+6NpnApRHToksXx1cLxj2jS5UDU2yuswDxE39O4dCgfH835n1Ci5eJoBBok5OIAInGQ5ONu3A1/5ioihO+8EXn4Z+PWv5fXMmckFjubfZE9VlQqcbPFrJNWLL4qouugi25v4InA2BW2CM68wAsdaBfKvf5Uftt3wFCB3zET5Ozgm9qwCxzuOPVbEwJtvyuuoODghEDie9zujRknxNnMBTebglJZ2d3CYgS9/WW5gXntNqmBfeSXw+9/LaL0ZM7oLHK1inBsjRgDbAjI3dFgEzrhxMsXRunXeHvfWW6W/vPxy25tokrGXVFTI3ZzVeXnoIRkafsop9vdTVCQhrXwFjo6g8h6TaLx4sSyjInBCEKLynMSh4nZzcB55RG58fvQjcWsefDBejuC660Q47djRdTudhyo3ks0Z5hctLXLj2qeP3y1JT0mJDJppaPDumMuXy9Q43/hGvH6UDVTgeIm5w7KGqVavBk47TURLNpSX5x+iMjVwVOB4h5mtPUoCJyQhKs9JLPZnNwfnoYfEVf3mN+X1vHnAz38uLs7s2fH9WoeKq4OTGyNGSC5cEAR6S4ukKYRhwuPRo70VOLfdJvV3rr02q81U4HhJosBhljuxXC5y5eX5Ozg6RNx7ysulWrW56EVhRKE6OMkxDk62AmfDBmD69K5Tp3zrW8DvfifPk1VJVgcnN0aMkKXJibPS0eHMQA67BH2iTSujR3s3+mzTJuCxx0Tc9O+f1aYqcLwkUeA0N0vIKpdE0759nQlRaf6N95gwVUVF14TTsBKSHBzP6dtXCn0mChzrd96nD7B/f/x1Z6d06KZGSzIShROzOji5YuqOJQtT/fa3cjPiVXJ62ASONYHeTd5+W86LL3wh6019ETjDomDL54K5wzICZ/t2WeYicJwKUWl4ynuMwInKeRCSEJUv/Y51qHgyB2f8eGDjxnitm23b5II6blzqfVZXy9Lsd+9eqXCsAid7jIOTLNF4+XLpq5O5O24QNoHT2dm9orYbmOkZcjh/fRE4/bO0mSJDooOTr8DJx8HRIeL+ceyxsoyKwMkzREVExUT0HhE9leS9UiJ6hIjqiGgpEY2JrR9DRIeIaEXs8X+ZjuNLvzNqVNxpSZZkPGmSCB/zmY0bZZnOwSktld+O2eb992Vp6pMo9jECJ5mDY+YH9GqUVdgEDuBNHk4eVbp9ETiHnZhcLow46eDkG6LSIeL+YRycKNTAAZxwcL4OIFXVsKsANDPzBAB3ALjV8t4GZj4+9siYfehLv2OtZpzMwZk0SZZmyK05L9M5OEBX4fTOO7KcNSv/9hYaAwfK9+GUwHnwQWDp0tzasnFjXHAFHS8Fzq5dkidaUpL1pr4InAYvs6+DRI8ekgkehBCVDhH3j0mTJLnU5FKEnTxycIioGsB5AFLMQosLATwYe74QwJlEuQ0z8aXfGTVKQkgtLXGBY+2oTdE0I3A2bpTkYpNInAqrcHr7bSk1kUUJeyUGUfJif52d8Yu3XYHDDHztazLiLVu2bpU2zJ6d/bZ+YPourxycHMOvmmTsNdZqxtu3S2eWy+iHfENUOkTcP3r2lMq0//EffrfEGcrK8knEvBPAdwB0pni/CsAWAGDmdgD7AJjebmwstPUyEWVRSMpDjFDZskUETmlp12HAlZXiIpiqsBs2yN1xprtV4+Awi8AJy4UxiCSrhdPUFP9N2xU4+/ZJn5zL5J1vvy3LOXOy39YPevWSMKlXDk5lZU6bqsDxmkSBM2RI9jVwAAlRHTggdxq5UFenQ8T9ZPbsnE/awJHj/EdEdD6AHcz8bg6bNwIYxcwzAHwLwJ+IqF+SY1xDRMuIaFmbFyM+Epk4UZZLl8oF0xqekgaKo2d1cDKFpwAROAcPynYNDSpw8iGZwDHhKcC+wDEX+w0bulart8PSpeLwH398dtv5iTVM6ia7dqmDExqsAqepKfc8DJOMduBAbtvX1al7ozhDWVmuW84DsICI6gE8DOAMIvpDwme2ARgJAERUAqA/gN3MfISZdwNATCBtADAx8QDMfA8zz2TmmT169Mi1nbnzsY+JyLn//riDk4hV4GzYkD7B2GBCBI8/LkvNv8kdM12DVZQYgTN4sH2BYy72+/d3n3MwE0uXirhJ9vsIKl4V+9u9Wx2c0JDo4OQrcHINU6nAUZwiR4HDzDcyczUzjwFwKYAXmfmyhI8tAnBF7PlFsc8wEQ0momIAIKJxAGoAbMypIW5CBPzrv8qcUqtWJb+ATZ4sDsK2bdI32HVwAGDhQnGAP/YxZ9tdSIwYITeK1r7UCJyTTsrewQGyC1N1dADLloUnPGUwxf5yjSLYJWwOzvDhw/04bDBwSuCYmcdzSTQ+ckRyAlTgKE6QY4gqFUR0CxEtiL28D0AFEdVBQlE3xNafCuB9IloBST6+lpn3pNuvb/3OFVdIrt1rryUv7GhGUj3zjCztODhG4KxYIdN/mP5AyZ5kxf42bZK+uaamu7uTCmu4JhuBs2aNCKwwCpwjR6Qav1scPiz/mzA5OP36dQuVFw4VFWJhtrX55+Bs2iQnrJ2OVFEykXuI6p8w8xJmPj/2/CZmXhR7fpiZL2bmCcw8m5k3xtY/zszHxIaIf4yZn8x0DN/6nWHDgPPOk+epQlQA8PTTsrTj4AweHN+X5t/kR7JaOPX1MjKtqkouss3NmffT0BAXS9kInLAlGBu8GCpuzIAwOTgHQ1D11DXMF1VfL0mHfggcHSKuOIkDAscLfO13rrpKlskEzvjxEmYyE7DaEThFRfGKxipw8iOTwAHsVezdvFnCjSNGZCdwli6VkXRh64+9FDhhcnC2mBLjhYgROB98IEs/QlQqcBQncThE5Ra+9jvnnitOTq9e3d8rLRVR09Ii/YPdissmTKUJxvlhQpcm18bUwLEKHDt5OA0N8p2MH5+9wJk9OxyziFvxQuCYaRpydHCyLw2o5IdTAicfB2fDBik4qHPXKE4QEgfHV0pKpMqtmXMqkUmT5MbDjntjGD1aBJOZ+kPJjfJyeRgHp7FRUgiyEThHjsh2o0dL+P/ZZ+0du7VVcnA+/emcm+8b/fvLw82h4nk6OCpwvCYIAseMoArbHYMSTFTg2OPss1O/N2kS8Pe/Z5cXd+ONwMUXS/0UJT+s1YzNCKqxY7u7O6kwIaxRoyShvLFR6hRlOjdeeUUco7Dl3xjcHiquDk7ICEqISoeVKk4RkhBVoDGJxtk4OBMnxgsJKvlhLfZnBM6YMTLqbciQzALHuBjGVQOkaKOZdy4Zhw4B3/qWiKKPfzyf1vvHqFGaZKxYMF/U2rWSKJhrNVsjcLJ1cNrb5QTWEVSKU6iDkz9mTqpsBI7iHMkEjslxqqrKLHDMRd7k4ACZ83BuvlkKPP72t0CfPrm02n+8cHDKy5OXV7CBLwKnysQ1C5G+fcVSPnRIxE1xcW77KS6WC0u2AmfzZhE5mmCsOEVIBE6g+525c4Hvfz+cuRhRYNQoCTOtWSMCZ9iwuDNZXW3fwRk50p7AefttmZTzqqvShy6DzrhxMgeXCSU5TR5VjAGfBE7fQi5KRRR3cXINTxn69s0+RKUjqBSnSTYyKIAEut/p0QO45ZbcJt5V8ucrX5EL6QUXAO+9J+Epg10HZ9gwGRE3aJAk36YTONdfL67R7bc70nzfMCG41avd2X8eVYwBnwROay55I1HCKYGTy4zi5qTTEJXiFEVFoRA5Bd/vKKmpqgKeeELCVO++213g7NolI6VSsXlzPKRFlH6oeH29DA2//nr7JQGCihcCJ2wOzja7c3tEFSNwhg3Lbz+5CJy6OrFeC3m6DMV5QhCmKvh+R0nPnDnAfffJc+sNYLKpHBJpaIjXhTHbb9ggOTbnngvceWf8vSeekGUUwpHDh4tjtWqVO/vfvTsvB0dHUfmB3yGqcePkrltRnEJHUilR4AtfkIv29OnxddZaOGPHdt+GWRycBQvi68aPl5nejztOnJ833gCuvlr67CeeEOcjCmkCRPK3qIOj/BOnBM6AAfbmSLGyYUM0TiwlWITAwVEUW5xxRteLaqZifzt2iIixOjjTp0t9m09+UgTNvn1S6HHnTuDVV6Ph3hiOPVYEjp0JSbPh6FGJUOQhcNTB8QOnBE5lJbBypf3Pd3aKwDnnnPyOqyiJqIOjRJVM81GZEVQmBwcALrlE3JspU8TlmD0b+OUvJVetsxP41KdcbbKnTJsmE0hv2dL1f5AvedbAAdTB8QenBE5FRXbD87ZskZlxNcFYcRp1cJSo0r+/TG2TKmnYWuTPUFQETJ0arxZ//fXA+vVSCmD0aGDGDHfb7CVuJRrnOU0D4JPAGTlypB+HDQ5OOjiHDklJcDs884wsTzklv+MqSiIhEDgF3+8ouUEEnHCC1K5Jxrp1skyWn2O4+GLJ7WlsFPcmStPkGIHjdKJxntM0AD4JnLIQdIaucuGFwA9/mP8keUbZGqWbiYULpST8Mcfkd1xFSSQEIaqC73eU3JkzR9IBDh3q/t7bb8uUGemGfPfsCXz5y/I8Svk3gOSCVldHz8Ehop8R0YdE9D4R/ZWIBtjZbv/+/fkcNvxUVAA33ZR7FWOD+eLthKl27QKWLAE++9lo3T0owSAE4qHg+x0ld+bMkQrw773XdT2z1LSZPTvzPr79bUk4PvVUV5roK8ceG0kH53kA05h5OoD1AG60s1FjY2Oeh1UAxL94OwLnb38DOjqAiy5yt01KYRICgaP9jpIzZrbvpUu7rt+6FWhqsidwevUS9z6KN5jTpsn8iu3tzu3T7yRjZn6Omc1f9BaA6nz2p2RJNiGqhQul/s3xx7vaJKVACUGISlFyZvhwmWcqUeCYvBwjgAqVY4+VYd1mKiAn2LVLJiHNo0q6kzk4/wrgmVRvEtE1RLSMiJa1tbU5eNgCxm6IqrkZeOEFDU8p7hECB0dR8mLOnOQCp0cPGRJeyLiRaJznRJuADYFDRIuJaHWSx4WWz3wXQDuAP6baDzPfw8wzmXlmjx498mq0EmPgQBEsmQTOk08CbW0anlLcQwWOEnXmzJF5pHbsiK97+21xxUtL/WpVMJgyRYbGL1/u3D7znGgTsCFwmHk+M09L8vgbABDRlQDOB/AFZqdLGSppKSmRDPZMIaqnn5ZiVbNmedIspQA56yy/W6Ao7pKYh9PRASxbpuEpQMJIp50GPPaYcxWNvXBw0kFE5wD4DoAFzGyzGAsw2loQScmPysrMDs6HH4qFquEpxS1CMDJE+x0lL044QUa+GoGzdq3MBWgnwbgQuPxyKYb41lvO7G/zZmDEiLx2kW8Ozv8AKAfwPBGtIKL/s7NRrzyShpQEMgkcZkn8qqnxrk2KEkC031HyoqxMkmmNwDEJxipwhM9+VgYbPPRQ/vtqbZWiiHlet/IdRTWBmUcy8/Gxx7V2ttu3b18+h1WsZBI4jY3AgQMqcJSCR/sdJW9MovGbb8pywADtWw3l5VKl+eGHZfLRfDCjsSZOzGs3vlQybmpq8uOw0aSiIn0OTm2tLPUkVAIKERUT0XtE9FSS90qJ6BEiqiOipUQ0xvLejbH164joE5mOo/2OkjdXXCGh/pNOAu67T/Iai3RKx39y+eUyavfpp+V1U5O4Mdmyfr0s/XRwlACQycFRgaMEn68DWJvivasANDPzBAB3ALgVAIhoKoBLARwD4BwAvyaiPEuDK0oG5s4Ftm0Dfv1rycn5whf8blGwOOssmWPx9ttlSooRI+T1FVdkl5tjrlsTJuTVHBU4YSfThJu1tTIPipPT2CuKQxBRNYDzANyb4iMXAngw9nwhgDOJiGLrH2bmI8y8CUAdAE2GUNynb1+ZV2rpUrlwK3FKSoDPfx54/XXg1VeBG24QEfjEEzLJs5l5PRO1tTLyt0+fvJqjAifsZJquobZWKhjnO++VorjDnZCRmJ0p3q8CsAUAYlXT9wGosK6PsTW2rgtaYFRRPOYHP5DK+Zs3Az/5CXDPPSJ42tuB556zt4/16x2JOqjACTuZpmuordXwlBJIiOh8ADuY+V23jqEFRhXFY/r3lxFV1uKfxxwj4arnn7e3j9ravBOMAZ8EztixY/04bDRJN11DZ6cOEVeCzDwAC4ioHsDDAM4goj8kfGYbgJEAQEQlAPoD2G1dH6M6ti4l2u8oik8QAfPny5RBnanM2hjNzXI9C6uD07NnTz8OG03SCZxt24DDh1XgKIGEmW9k5mpmHgNJGH6RmS9L+NgiACbR4aLYZzi2/tLYKKuxAGoAvJ3ueNrvKIqPnHWWRBreey/95xwcGOOLwGlubvbjsNEkXQ6OjqBSQggR3UJEC2Iv7wNQQUR1AL4F4AYAYOY1AB4F8AGAfwC4jpk70u1X+x1F8ZH582WZKUxlrlsOhKhK8t5DDuywTlam5IeZcDNZDo4KHCUkMPMSAEtiz2+yrD8M4OIU2/wYwI/tHkP7HUXxkWHDpBL04sUyuioV69dLbaFx4/I+pCYZh52SEhE5qRycXr2A6mrv26UoiqIoVs46C3jtNSltkoraWmD0aEdmaFeBEwVSFfurrQXGj9dKm4qiKIr/nHWWTOPw6qtd1z/0kDg7gGNDxAEVONGgoiK1wNHwlKIoihIETj1VCs8++2x83b59wNVXAxdcALz7rmNDxAEVONGgsrJ7Dk5Hh0xdrwJHURRFCQJlZcDZZwOPPCLXKAB48kng6FEJSZ1/PrB/f7gdnPHjx/tx2OiSLERVVyc/GhU4igJA+x1FCQSXXy4lTJYskdePPSZ5os8/LzVwgHALnJISXwZvRZdEgcMMfPObQO/eEvNUFEX7HUUJAhdcINWOf/97cWuefVYqH8+aBdx9twyamTHDkUP5InB2p5pWQMmNigop6Gcm3Lz/fuCZZ4BbbwXGjPG1aYoSFLTfUZQA0Ls3cPHFwOOPS6jqyBHgoovkvSuukHSLYcMcOZQvAmdXqokhldywVjNuaBD35vTTgeuu87ddihIgtN9RlIBw+eXAgQPAd74DDB8OnHRS/D0ixw6jScZRwAicm28G5s6VENX99+vwcEVRFCV4nHyyRBf27pXwlEvXKr0CRoEhQ2T5u98B06dLTFNDU4qiKEoQKSoCLotNO2fCUy6gWXdRYM4ccWzmzXOsfoCiKIqiuMa3vy2jpU491bVDkEzM6y3l5eXc0tLi+XEVRXEPInqXmWf63Y5UaL+jKNEkVd/jS4iqRmuzKIriMdrvKEph4YvAKdLkV0VRPEb7HUUpLHw543fu3OnHYRVFKWC031GUwsIXgbNnzx4/DqsoSgGj/Y6iFBbq2SqKoiiKEjlU4CiKoiiKEjlU4CiKoiiKEjlU4CiKoiiKEjl8KfRHRC0A1nl+YCUdlQB0NsLgEMbvYzQzD/a7EanQfieQhPF3HnXC+J0k7Xv8mqphXZArnhYiRLRMv5PgoN+HK2i/EzD0dx48ovSdaIhKURRFUZTIoQJHURRFUZTI4ZfAucen4yqp0e8kWOj34Tz6Pw0e+p0Ej8h8J74kGSuKoiiKoriJhqgURVEURYkcKnAURVEURYkcngocIjqHiNYRUR0R3eDlsZWuEFExEb1HRE/FXo8loqWx7+YRIurpdxsLCSL6JhGtIaLVRPRnIuql34lzaN8TDLTfCRZR73c8EzhEVAzgfwF8EsBUAJ8joqleHV/pxtcBrLW8vhXAHcw8AUAzgKt8aVUBQkRVAK4HMJOZpwEoBnAp9DtxBO17AoX2OwGhEPodLx2c2QDqmHkjMx8F8DCACz08vhKDiKoBnAfg3thrAnAGgIWxjzwI4FO+NK5wKQHQm4hKAJQBaIR+J06hfU8A0H4nkES63/FS4FQB2GJ5vTW2TvGeOwF8B0Bn7HUFgL3M3B57rd+NhzDzNgA/B7AZ0sHsA/Au9DtxCu17gsGd0H4nMBRCv6NJxgUGEZ0PYAczv+t3WxSBiAZCHIWxAEYA6APgHF8bpSgOov1O8CiEfsfLuai2ARhpeV0dW6d4yzwAC4joXAC9APQDcBeAAURUElPu+t14y3wAm5h5JwAQ0V8g35N+J86gfY//aL8TPCLf73jp4LwDoCaWod0Tksy0yMPjKwCY+UZmrmbmMZDv4EVm/gKAlwBcFPvYFQD+5lMTC5HNAE4korJYXsKZAD6AfidOoX2Pz2i/E0gi3+94JnBiavCrAJ6FZNE/ysxrvDq+kpH/BPAtIqqDxMbv87k9BQMzL4Uk9S0HsApyXt4D/U4cQfueQKO/cZ8ohH5Hp2pQFEVRFCVyaJKxoiiKoiiRQwWOoiiKoiiRQwWOoiiKoiiRQwWOoiiKoiiRQwWOoiiKoiiRQwWOoiiKoiiRQwWO0gUiqiCiFbFHExFtiz1vJaJfu3C8B4hoExFdm+YzpxDRB0S02unjK4riP9rvKG6gdXCUlBDRzQBamfnnLh7jAQBPMfPCDJ8bE/vcNLfaoiiK/2i/oziFOjiKLYjoNCJ6Kvb8ZiJ6kIheJaIGIvoMEd1GRKuI6B9E1CP2uROI6GUiepeIniWi4TaOczERrSailUT0itt/l6IowUX7HSUfVOAouTIewBkAFgD4A4CXmPlYAIcAnBfrbH4F4CJmPgHA/QB+bGO/NwH4BDMfF9u3oiiKQfsdxTZeziauRItnmLmNiFYBKAbwj9j6VQDGAJgEYBqA52UeNxQDaLSx39cBPEBEjwL4i9ONVhQl1Gi/o9hGBY6SK0cAgJk7iaiN48lcnZDfFQFYw8xzs9kpM19LRHMAnAfgXSI6gZl3O9lwRVFCi/Y7im00RKW4xToAg4loLgAQUQ8iOibTRkQ0npmXMvNNAHYCGOlyOxVFiQ7a7yj/RB0cxRWY+SgRXQTgl0TUH/JbuxPAmgyb/oyIaiB3Yi8AWOlqQxVFiQza7yhWdJi44is6XFNRFK/Rfqcw0BCV4jf7APx3poJbAJ4EsMuzVimKEmW03ykA1MFRFEVRFCVyqIOjKIqiKErkUIGjKIqiKErkUIGjKIqiKErkUIGjKIqiKErk+P8BAEJxDtMy4S8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ "model = pybamm.lithium_ion.SPMe()\n", "sim = pybamm.Simulation(model, parameter_values=parameter_values)\n", - "sim.solve([0, 100])\n", + "sim.solve()\n", "sim.plot([\"Current [A]\", \"Voltage [V]\"])" ] }, @@ -485,7 +488,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -509,18 +512,18 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8342108d4f9540959a60e0c753c40eb1", + "model_id": "1016bbebb3744513b4e92b0e53351deb", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=120.0, step=1.2), Output()), _dom_classes=('…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=36.02442143490834, step=0.3602442143490834),…" ] }, "metadata": {}, @@ -529,12 +532,24 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAEYCAYAAABRMYxdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAABJVklEQVR4nO3dd5hUVdLA4V+RRZKIAYEFFhFFRUTEnHVFcTGh4ppwVcxiQElKkCBRMAMmzIgJWFZFDKgfJkCQKAKCAqIoIEEk1/dHXdZhmNAzHe7t7nqfp5/pcPvegpk5U31CHVFVnHPOOecySYmwA3DOOeecSzRPcJxzzjmXcTzBcc4551zG8QTHOeeccxnHExznnHPOZRxPcJxzzjmXcTzBcc45txMR2VNEpge3n0VkWY7HZRJ0jc/ieO8IEWmVgBgmikjT4H7neM8Xw/XaiMivIvKUiJQXkZUiUinXMaNF5JLgtkBExiU7rkzlCY7bhYjsKyIjRWShiEwVkbdF5IAUx3CyiBybz2vdgwb3/lzPjxaRL3I9d4eI/CgijyYzXucyiaquVNXGqtoYGAoM3vFYVTfn9z4RKVWEa+T5+x2ipCc4gVdV9VpV3QCMB87f8YKIVAaOB/6jqq8C16YopozkCY7biYgI8BYwUVXrqeoRQCdgnyKco2RBj2N0MlBQAzhYVbvmuEYV4Aigsoj8fcfzqjoY6Lrr251zRSEiR4jIx8GHnvEiUj14fqKIDBGRKUC74PFgEZkiInNF5EgReVNE5otIrxznWx98PTl4z+si8q2IvBS0Q4hIVxGZLCKzRGT4jufzie9AEfkqx+M6IjIzuH+aiEwTkZki8oyIlM313r7AbkEP1UvBc6ODf+tsEWmb49hrROQ7EflKRJ7c8eFJRPYSkTeCeCeLyHEx/Le+ArTO8fh8YHyQ/Lg4eYLjcjsF2KKqQ3c8oarfqOqnQUP0v+5SEXlURNoE9xeLSD8R+Rq4KI/H/xCRz0XkaxF5TUQq5Hhfj+D5mUEjVQe4AbgjaHBOiCHuC4D/ACPZucFwzsVPgEeAVsGHnmeA3jleL6OqTVV1UPB4s6o2xXp/xgA3A4cAbURkzzzOfzhwO9AQ+DuwIzl4VFWPVNVDgN2Ac/ILUFW/BcqISN3gqUuAV0WkHDACuERVDwVKATfmem9H4M+gh+qy4Ol/B//WpsBtYsN2+wH3AUcHMR6Y4zQPYR+8jgQuBJ7KL9YcxgNNcvyftMaSHpcAnuC43A4BphbzvStVtYmqjsz5GHgfuBc4PXg8Bbgzx/t+C55/AmivqovZuVv80xiufSnWMLwS3HfOJU5ZrG2YICLTsd/nmjlefzXX8WODrzOB2aq6XFU3Ad8DtfI4/1equlRVtwPTgTrB86eIyJdBT8ypwMGFxDkKS2wIvr4KNAAWqep3wfPPAScWch6wpOYb4Isg5vpAM+BjVV2lqluA13IcfzrwaPD/MxaotOODXH6C4b6xQCsRqYYleuNjiM3FIObxUudikLuR2/H4aOyT2aSgh7kM8HmO494Mvk7FemKKRET2wRqf/1NVFZEtInKIqs4q6rmcc3kSLFE5Jp/X/8j1eFPwdXuO+zse5/V3J+cx24BSQc/L40BTVV0iIt2BcoXE+Srwmoi8CaiqzheRwwp5zy5E5GQsYTlGVTeIyMQYrl0COFpVNxbxcq9gvUICjAkSJ5cA3oPjcpuNzWXJy1Z2/pnJ/Qufu5Hb8ViACTkmKTZU1WtyHLejcdtG8ZLui4E9gEUishj79Oe9OM4lziZgLxE5BkBESotIYb0p8drRvvwW9IQUumpKVRdi7ch9/PUBax5QR0T2Dx5fAXycx9u3iEjp4H5lYHWQ3ByIfUgDmAycJCJ7BBOqL8zx/veAW3c8EJHGhcUbmIh9QLsZH55KKE9wXG4fAmVzTaprFMyD+QFoKCJlg0m9p8V4zi+A43Y0MCKyuxS+KmsdUDHG818KNFfVOqpaB0vQfB6Oc4mzHUsw+gXDNtMpeBFA3FT1d+BJYBY2bDM5xre+ClyODVcR9KhcjfXszMT+LUPzeN9wYEYwyfhdrBdpLtAXa8NQ1WVAH+ArYBKwGFgTvP82oKmIzBCROdg8wlj+nduB14E9yTvxcsUkqhp2DC5igol0Q7BEYSP2S3x70N3bH5vpvwhYD4xV1RFBz0lTVf0tOEfux6cC/bCxfIB7VXVszuPE6lEMVNWTgwTodawxujXnPJygq3q9qg4MJiRPAmpqjh/mYHLzjar6ZTARuqmq3pLY/ynnXLYRkQqquj7owXkLeEZV34rxvW0oQlsUDJW1V9V8J1e7/HmC49JOzgQnxuPb4AmOcy4BRGQgNj+nHDYs1U5j/EMqIpdgPUAfqWqBNW6CY7sBU1X1iviizk6e4Li0IyLtgbbAyJy1cPI59g6sq/gNVU1VIS/nnHMh8wTHOeeccxnHJxk755xzLuNEtg5OtWrVtE6dOmGH4ZyLw9SpU39T1b3CjiM/3s44l/7ya2cim+Dsu+++TJkyJewwnHNxEJEfwo6hIN7OOJf+8mtnIjtE9cMPkW4XnXMZwNsZ5zJXZBMc55xzzrni8gTHOeeccxnHExznnHPOZRxPcJxzzjmXcRKS4IjIMyKyQkRm5fO6iMjDIrIg2IisSWHnrF69eiJCc86lGREpKSLTRGRcHq/dKSJzgnbkAxGpneO1q0RkfnC7KpZreTvjXOZKVA/OCKB5Aa+fhW0HXx8rsf9EYSesVKlSQgJzzqWddsDcfF6bhu0r1gjbjLU/gIhUxfbtOQpoBnQTkT0Ku5C3M85lroQkOKr6CbCqgEPOBZ5X8wVQRUQK/Oi0YcOGRITm4vXnn/D99/Dpp/DJJ7BgAfj3xiWJiNQEWgBP5fW6qn6kqjt+AL8Aagb3zwQmqOoqVV0NTKDgD12AtzPOpTVVePXVfF9OVaG/GsCSHI+XBs8tz3mQiLTFengoW7ZsikJzAPz6K/z3v5bILF0KP/0Ey5bB6tV5H1+lCuy3H9SoYbdjj4V//hP23TelYbuMMwS4B6gYw7HXAO8E9/NrY3bh7YxzGeKDD6B163xfjlQlY1UdDgwHqFixou8Cmmzz58OYMXb77DPYvh322gvq1IH994cTT7TkZb/97CZiic+O27Jl9nXGDBgxwl4/6ig491w47zw48MCQ/4EunYjIOcAKVZ0qIicXcuzlQFPgpKJex9sZ5zKAKnTtCjVr2ofyPKQqwVkG1MrxuGbwnEu1X36BRx+FN9+EOXPsucMOg3vvtcTk8MMtUSkKVZg5869kqVMnux1wAJx/Ptx6qyVKzhXsOKCliJwNlAMqiciLqnp5zoNE5HSgC3CSqm4Knl4GnJzjsJrAxKRH7JwLx/jx8PnnMHQo3HBDnoeIamI+wIhIHWCcqh6Sx2stgFuAs7FJgA+rarOCzlexYkVdt25dQmJzwMqV0L+/JTcbN8JJJ1kvS8uW1mOTSEuXwtixlux8+CGULAk33ggdOvgQVpYRkamq2rQY7zsZaK+q5+R6/nBscnFzVZ2f4/mqwFRgxwrNr4EjVLWguYHezjiXjlTh6KPtA/t33yFly+bZziRqmfgrwOdAAxFZKiLXiMgNIrIjrXob+B5YADwJ3JSI67oY/P473HefJTEDBliPyrffWuJx222JT27Augxvusky7Pnz4bLL4JFH4O9/h3vugd9+S/w1XcYSkftFpGXwcABQAXhNRKaLyFiAIJHpCUwObvcXltw459LU22/DV1/ZyEOZMvkelrAenEQ78MAD9dtvvw07jPS1di089BAMGgRr1sBFF0H37tCwYTjxzJ8PPXrAyy/D7rtDu3Zw112wR6EreV0aK24PTqp4O+NcmlGFI4+EVatg3jwoXTrfdiaylYwrVKgQdgjpa8IEm+DbtasNRU2bBqNGhZfcANSvDy++CLNmwVlnQe/eNkdn7NjwYnJZz9sZ59LMf/4DU6fayETp0gUeGtkEZ/369WGHkH42boQ774R//MOWcX/xhc2Dadw47Mj+0rChJVvTptlQ1rnn2gSxP/4IOzKXhbydcS6NqEK3blCvHlxxRaGHRzbBWbbMF1kVyaxZ0KwZDB4MN98MU6bYku2oatzYErD27WHYMDjiCMvKnUshb2ecSyOjR8P06ZbklCp8EXhkExwXI1V4+GFo2tRmlI8bZyulypcPO7LClS1rE58/+ADWr7dZ8X37wrZtYUfmnHMuSrZvt8TmgAPg0ktjeosnOOnsl19sPku7dnD66VaLpkWLsKMqulNPtWKB551n9XNOOy3fwk3OOeey0Btv2N+4GHtvwBOc9DVvnvV4fPwxPP64Tbzae++woyq+qlVtbs6zz9pQ1VFH2Q+zc8657LZtm60CPugguOSSmN/mCU46+vJLOO44m5j76adWRK+o1YejSATatLHqlCJw/PEwcWLYUTnnnAvTa69Z5f1u3axwbIwim+DUqlWr8IOy0X//C6ecYqukPvvM5t5kmkMOsSSnRg0480z74XYuCbydcS7itm2zGmoHH2z13IogsglO+XSYJJtqzzxjy6obNoRJk2xDzExVqxb83/9ZQadLLrFKyM4lmLczzkXcG29Y9f1u3aBE0VKWyCY4a9euDTuE6FCFXr3gmmtsAu7EibDPPmFHlXxVq1rRwnPPtW0lOnWy/wvnEsTbGeciTNWKwh54IFx4YZHfHtkEZ/ny5WGHEA3btsEtt1jVxssvt8nE2VR9dbfd4PXX4frrbQl5mzawZUvYUbkM4e2McxE2bpytsO3Uqci9NwCxrbVy4VC1on3DhsHdd9sf+GJ8k9NeyZLwxBM2J6drV0v6nn8+O/8vnHMuG+zovalbN+a6N7l5ghNlXbpYctOpE/TpE3Y04RKxXqxSpaBzZ9uk8+GHM2P1mHPOuZ198IGtGB46tNA9p/LjCU5UDRwIDzxgQzO9e4cdTXR07Gi7yA4caHN0evQIOyLnnHOJ1rs37LefTUsoJk9woujpp21I6pJL4LHHvJciJxHo39+SnPvvt56c228POyrnnHOJMmmSLaYZPNi29CmmyCY4tWvXDjuEcLzxBrRtC82b2zyTIhQ1yhoiNnT3++9wxx3Wk3PllWFH5dJQ1rYzzkVZ796w115w3XVxnSayszTLlSsXdgipN2EC/OtftgXD669DmTJhRxRdpUrByy/bsvl//xvGjAk7IpeGsrKdcS7Kpk6Fd96xD6+77x7XqRKS4IhIcxGZJyILRKRjHq//TUQ+EpFpIjJDRM4u7Jxr1qxJRGjp48sv4fzzbb3/uHFxf2OzQtmyMHq0VXO+5BL46KOwI3JpJuvaGeeirk8fqFwZbrop7lPFneCISEngMeAsoCFwqYg0zHXYvcAoVT0caA08Xth5f/7553hDSx+LFtku4PvuC+PH27wSF5sKFWz7iv33t4KAc+aEHZFLI1nVzjgXdbNnw5tvWmHXypXjPl0ienCaAQtU9XtV3QyMBM7NdYwClYL7lYGfEnDdzPDHH3DeeVbb5d13LclxRbPnnvZ/t9tu9n/5++9hR+TiICIlg97ecXm8dqKIfC0iW0WkVa7X+onIrOAW+5bDzrloeOABG71o1y4hp0tEglMDWJLj8dLguZy6A5eLyFLgbeDWvE4kIm1FZIqITNmSDdVqVW3+yKxZMHJkZu8tlWw1a9oE7UWLbB7Ttm1hR+SKrx0wN5/XfgTaAC/nfFJEWgBNgMbAUUB7EamU+83OuYhauBBeeQVuvNE+tCZAqiYZXwqMUNWawNnACyKyy7VVdbiqNlXVpqWLWdgnrfTvD6NGWYXiM88MO5r0d/zxtinnO+9YxWOXdkSkJtACeCqv11V1sarOALbneqkh8ImqblXVP4AZQPOkBuucS5x+/ayg3513JuyUiUhwlgG1cjyuGTyX0zXAKABV/RwoB1RLwLXT17vvWoXi1q2hffuwo8kc119vSwv79LGVaC7dDAHuYdcEpjDfAM1FpLyIVANOYed26X+yrqfYuahbvhyee85GNKpXT9hpE5HgTAbqi0hdESmDTSIem+uYH4HTAETkICzB+bWgk9atWzcBoUXU/Pm2t8Zhh1lRPy/klzgi1otzzDFWAXPmzLAjcjESkXOAFao6tajvVdX3sOHvz4BXgM+BPMcpc/YUH3DAAfGE7JxLhCFDYOvWhH/YjzvBUdWtwC3AeGzcfJSqzhaR+0WkZXDYXcB1IvIN1vi0UVUt6LxlMrUGzLp1NhG2ZEl46y0oXz7siDJP2bI2H6dSJfu/XrUq7IhcbI4DWorIYmyxwqki8mKsb1bV3qraWFXPAAT4rrD3ZGw741y6WLPG9pu66CL4+98TeuqEVDJW1bexT085n+ua4/4crPGK2erVqxMRWrRs324Vd+fNs+XgdeqEHVHmql7dlhuedJINA779thUHdJGlqp2ATgAicjLQXlUvj+W9QbmKKqq6UkQaAY2A9wp7X0a2M86lk6FDYe1a6NAh4aeObCXjFStWhB1C4j3wgBWmGzjQKvC65Dr6aNvLa8IEuPfesKNxxZSzN1hEjgxWY14EDBOR2cFhpYFPRWQOMBy4POhdLlBGtjPOpYuNG2146owz4PDDE356KWSkKDQVK1bUdevWhR1G4nz+OZxwAlx8Mbz0ks+7SaXrr4fhwy3ROf30sKPJKiIyVVWbhh1HfjKunXEunTz5pO29+P77cX3oz6+d8QQnFdauhcaNre7N9OkJqdDoimDDBtvO4fffYcYMqJbdC/hSyRMc51yetm2Dgw6yuZKTJ8f1oT+/diayQ1QZ5eab4ccfbXNIT25Sr3x5+79fuRKuvdYSTeecc+EZPdpWFHfokLQRDU9wku2ll+DFF63w3DHHhB1N9mrc2AoqjhkDw4aFHY1zzmUvVSvst//+cMEFSbtMZBOcevXqhR1C/BYtsrLTxx0HnTuHHY1r1w7+8Q+rlDk3v50AXDbJiHbGuXQzcaINS7VvbyVTkiSyCU6pdF/Su3UrXHaZdb29+KIvUY6CEiVgxAjbzO3SS2HTprAjciFL+3bGuXTUrx/ssw9cdVVSLxPZBGflypVhhxCfXr1s5dTQoV7vJkqqV4dnn4VvvvFeNZf+7Yxz6Wb6dKsD164dlCuX1EtFNsH57bffwg6h+CZNgp49rajfpZeGHY3L7ZxzbOL3gw/Ce4XWgnMZLK3bGefSUf/+ULGiTd9IssgmOGlrzRq4/HLrtXn00bCjcfkZMAAOPti6SH8tcFs055xzibBoEbz6qtUmq1Il6ZfzBCfR7roLliyx1VMVK4YdjcvPbrvZ0vFVq+CWW8KOxjnnMt+DD9qk4ttvT8nlPMFJpPfft93B27e3bQJctDVqZMv3R42ymgzOOeeSY+VKeOYZW3xTo0ZKLumVjBPljz/gkEOgTBmbRLXbbmFH5GKxZQs0awY//wxz5sAee4QdUUbxSsbOOQB697Y9AWfOtL+VCZR2lYzr168fdghF06ULLF5sPTie3KSP0qXte/brr9bz5rJK2rUzzqWjjRvhkUegefOEJzcFiWyCU6JEZEPb1WefwcMP28qc448POxpXVE2awN13W/fphAlhR+NSKK3aGefS1Ysvwi+/WDubQpEdoqpdu7b+8MMPYYdRuI0bbZv3DRtg1iyfWJyuNm6Eww6DzZutC7VChbAjyghRH6JKm3bGuXS1fbutWN1tN5g6NSn7TiV1iEpEmovIPBFZICId8znmYhGZIyKzReTlws65atWqRISWfL16wbffwvDhntyks3LlbKjqhx9suNFlhbRpZ5xLV2+/bX8j27dP2qaa+Ym7B0dESgLfAWcAS4HJwKWqOifHMfWBUcCpqrpaRPZW1RUFnTctJv9Nnw5Nm1rdmxEjwo7GJcKtt8Jjj8Gnn9oeYi4uUe/BSYt2xrl0dvLJ8P33sHChzXlMgmT24DQDFqjq96q6GRgJnJvrmOuAx1R1NUBhyU1a2LoV/v1vqFbN1va7zPDAA1CrFlx7rQ1bOeecK57Jk+Hjj+GOO5KW3BQkEQlODWBJjsdLg+dyOgA4QEQmicgXItI8rxOJSFsRmSIiU7Zs2ZKA0JJo4ECYNs0+7VetGnY0LlEqVIAnn7Qu1Z49w47GOefS18CBULmyfWAMQaqWEJQC6gMnA5cCT4pIldwHqepwVW2qqk1Lh5DtxWzBAujeHS680G4us/zjH9Cmje14O3Nm2NG4ZIroIgvn0t6iRfD667YtQ0jzUxOR4CwDauV4XDN4LqelwFhV3aKqi7A5OwUWoGjQoEECQksCVbjtNivo9/DDYUfjkmXQINsr5eab/Y9giolISRGZJiLj8njtRBH5WkS2ikirXK/1DxYxzBWRh0UKn9HYAPz761wyDBkCJUrY38uQJCLBmQzUF5G6IlIGaA2MzXXMaKz3BhGphg1ZfZ+Aa6femDHwzjtw//2w335hR+OSpWpV68H59FOr4eBSqR0wN5/XfgTaADutxBSRY4HjgEbAIcCRwEmFXumPP2yOgHMucVatslWp//pXyrZlyEvcCY6qbgVuAcZjjdIoVZ0tIveLSMvgsPHAShGZA3wE3K2qKws67y+//BJvaIn3xx/Qrh0ceqhv0JgNrr7a9hRr3x5+/z3saLKCiNQEWgBP5fW6qi5W1RnA9twvAeWAMkBZoDRQaCPyS4kSVkLeOZc4Q4fa38uQq8MnZA6Oqr6tqgeoaj1V7R0811VVxwb3VVXvVNWGqnqoqo4s7Jy/R/EPSp8+8OOPNrG4VKmwo3HJVqKEfa9/+8025XSpMAS4h10TmAKp6ufYh6flwW28qubZC5RzMcPKEiVsk9yvvoozbOccAJs22bYMZ55pnQEh8jrlsZo3DwYMgCuvhBNOCDsalypNmsCNN1qiM21a2NFkNBE5B1ihqlOL8d79gYOwOYA1gFNFJM9f1JyLGUqWK2cbrHovjnOJ8dJLtnnxXXeFHYknODFRtQJw5ctD//5hR+NSrVcv2HNPm3C8vUgdC65ojgNaishirJ7WqSIS6wSo84EvVHW9qq4H3gGOiemd7drB2LG+Ys65eKlaXbhGjeD008OOxhOcmLz+um3C2KsX7LNP2NG4VKtSxXrvPv/cK1Ynkap2UtWaqloHW6zwoapeHuPbfwROEpFSIlIam2Cc30Tlnd16q9U/6tOnOGE753YYPx5mz7bemxRvy5CXyCY4kdnld/16q8LYuDHccEPY0biwXHml7RTfoYOtEHApk3PBgogcKSJLgYuAYSIyOzjsdWAhMBP4BvhGVf9T2LlLlChhK+ZuuglGjYL585P0r3AuCwwaZKuLW7cOOxIgwglO/foFlslJnfvvh2XL4PHHfWJxNhOxeTirV/tmnCmgqhNV9Zzgfs4FC5ODXp7dVXVPVT04eH6bql6vqgcFixnujOU6/2tn7rzTalv17Zucf5Bzme6bb2zC/q232u9SBEQ2wYmEOXNg8GDbc+qY2IbzXQZr1Mh+eYcNgylTwo7GJdI++1g5+eeft5WSzrmiefBB2H13q1wcEZFNcJYvXx5uADsmFles6J/q3F+6d7c/hj7hOCPs1M7cfbd9HTAgnGCcS1c//QSvvGKdAXvsEXY0/xPZBGft2rXhBjB2LHz4oQ1R7bVXuLG46Khc2Socf/UVvPxy4ce7SNupnfnb3+CKK+CppyCKhUadi6pHHoFt2+D228OOZCeiEd2HpWLFirpu3bpwLr55Mxx8sG3v/s03oWzz7iJs+3Y46ihYvtzqI+2+e9gRRZaITFXVpmHHkZ9d2pnvvoODDrLeHO+5da5w69dDrVpw2mm24jgE+bUzke3BCdWjj9qO4YMGeXLjdlWihM3NWrYMBg4MOxqXSAccABddZIsKVq8OOxrnou/ZZ20rmwgU9svNE5zcfvvNhqWaN4ezzgo7GhdVxx9vfwj794elS8OOxiVS586wbp11uzvn8rdtm+0afuyxkVyIE9kEp1RYS7K7dbMut0GDwrm+Sx/9+tkveOfOYUfiiinPdqZRI/jnP+Ghh6wtcM7lbfRo+P77SPbeQIQTnHr16qX+orNn2xLgG26Ahg1Tf32XXurWtSKQL7wAkyeHHY0rhnzbmc6draDj8OGpDci5dDJoENSrB+eeG3YkeYpsghOKu+6yku3du4cdiUsXnTrB3ntbohPRCfuuGI4+Gk45xeZYbdoUdjTORc/nn9vt9tuhZMmwo8lTZBOcZcuWpfaC77xj+2h07QrVqqX22i59VapkO1FPmgSvvRZ2NK6ICmxnOne2lXLPPZe6gJxLF4MGWc2bq68OO5J8+TJxgC1b4LDD7Ovs2ZEpM+3SxLZtcMQRtpLg22+hXLmwI4qMtFsmnpOqlQNYudLKAfhWLc6ZhQuhfn3o2DESm9QmdZm4iDQXkXkiskBEOhZw3IUioiISrQZv2DCYO9e6oz25cUVVsqSVKf/hB1s+7jKDiPXifP+9bcTpnDNDhljCf+utYUdSoLh7cESkJPAdcAawFJgMXKqqc3IdVxH4L1AGuEVVC9zMJ2U9OKtXw/77227h778fiS3eXZo67zz44APbkXrffcOOJhLSugcHrKjjoYda7aNvvrGvzmWzVaussN/FF1sNnAhIZg9OM2CBqn6vqpuBkUBeU6p7Av2AjQm4ZuL07m1JzoMPenLj4jNggE1I7do17EhcopQoYRPJZ82C//437GicC9/QobBhQ2SXhueUiASnBrAkx+OlwXP/IyJNgFqqWmALISJtRWSKiEzZnoqNDH/4wYp5tWljc3Cci0f9+nDjjfD00zYXx0VemViGpFu3hjp17MNQROcsOpcSmzbZ38wzz4RDDgk7mkIlvb9VREoADwKFpnuqOlxVm6pq04MOOijZocF999kntB49kn8tlx3uvdf2purUKexIXAzq1q1b+EGlSkGHDvDllzBxYtJjci6yXn4Zfv4Z2rcPO5KYJCLBWQbUyvG4ZvDcDhWBQ4CJIrIYOBoYG/pE42++gRdfhNtus/FE5xJhr73gnnuswuekSWFH4xKlTRubVxWBFSPOhULVloY3amQba6aBRCQ4k4H6IlJXRMoArYGxO15U1TWqWk1V66hqHeALoGVhk4yXLFlS0Mvx69gRqlSxr84l0h13QPXq9qnfhzQiLeZ2plw5m3Pw/vvw1VfJDcq5KBo/3sqo3HVX2sxXjTvBUdWtwC3AeGAuMEpVZ4vI/SLSsrjn3bBhQ7yh5e/DD+Hdd6FLFytU5Fwi7b67VcOeNAnGji30cBeeIrUz119v7cUDDyQvIOeiatAg2G8/m5OWJrKv0N/27dCsGfz6qxXv8qJsLhm2brVJeCIwc2bWFokrzjLxoPTEFGCZqp6T67UTgSFAI6C1qr4ePH8KkLMI0YHB66MLulaR25nu3W3O3syZaTHJ0rmEmD4dDj8c+va1numISWqhv7QyahRMnQo9e3py45KnVCn7pP/tt5GpFZFG2mG9wXn5EWgDvJzzSVX9SFUbq2pj4FRgA/BewiO77TbrofNeHJdNHnzQ9mm8/vqwIymS7EpwNm+2YalGjeCyy8KOxmW6886DY4+Fbt2sboQrlIjUBFoAT+X1uqouVtUZQEF1JFoB76hq4v/Tq1a1UgAjR8KCBQk/vXORs3QpvPIKXHONzVtNI5FNcMolo3dl2DAru96vX2R3P3UZRAT697cNG4cMCTuadDEEuIeCE5jCtAZeye/FnPW2inX2O++E0qWtHXEu0z3yiE3tuP32sCMpssgmOLVr107sCdeuhfvvh1NPtSJFzqXCccfBuefaH8Pffgs7mkgTkXOAFao6NY5zVAcOxRY95Clnva0GDRoU/SLVq9un2eeeg2Sv9nQuTOvWWcdAq1ZW7DLNRDbBSbgBA+wPTL9+abPEzWWIPn1g/Xro1SvsSKLuOKBlUC9rJHCqiLxYxHNcDLylqlsSHdxO7rnHSgAMHJjUyzgXqqefhjVr0qawX26RTXB++OGHxJ3s559tktQll0DTyO775zJVw4bw73/D44/DokVhRxNZqtpJVWsG9bJaAx+q6uVFPM2lFDA8lVux25nateGKK+DJJ+GXX4p3DueibMsWGDwYTjgBjjwy7GiKJbIJzsaNCdyTs1cvm2Dsn6BdWLp3t3lf3buHHUnayVlTS0SOFJGlwEXAMBGZneO4OlhV9Y9jPXdc7UzHjrY3z+DBhR/rXLoZNQp+/NF6K9NU5tfBWbQIGjSwT9BDh8Z/PueK6+67rVjWzJlw8MFhR5MSxamDk0pxtzOtW8Pbb9vGvV401GUKVWjc2Op5zZxpezZGWPbWwenRw745990XdiQu23XoYLUkunYNOxKXKJ0720TMRx4JOxLnEmfCBJgxw+beRDy5KUj6Rh6LOXPghRfgllugRo2wo3HZrlo128flzTdh8uSwo3GJ0KgR/POf8NBDNpHcuUzQv79ty/Cvf4UdSVwim+CUL18+/pN07WpVR31DTRcVd9wBe+4J994bdiSOBLUzXbrAqlU+BO4yw9dfwwcfWN2bsmXDjiYukU1watWqFd8JpkyBN96wT8zVqiUmKOfiVamSDWu89x5MnBh2NFkv7nYG4Kij4LTTbH5VIhdHOBeGAQOgYkVo2zbsSOIW2QQnbvfea5+U77gj7Eic29mNN9qQaZcuNpnPpb9777VyFM88E3YkzhXfokW2euqGG6By5bCjiVtkE5xF8dQL+fhjGD8eOnWyT8zORcluu9nw6Wef2QocF5q42pmcTjrJ9h3r189KUjiXjgYPtnIW7dqFHUlCRDbB2VzcRkLVPhnvtx/cdFNig3IuUa6+GurVs5/V7fFsu+TiUex2JjcRW6n544/w/POJOadzqbRypVUuvuyyjFmUE9kEp9jeeQcmTbJPyLvtFnY0zuWtdGnbG+2bb+C118KOxiXCmWdaxdc+fawKrHPp5PHHYcOGtN2WIS+ZVehv+3Zo0sTqUnz7rf0RcS6qtm+3YlobN8Ls2Rn585rxhf5yGzfOlo0/+yy0aZO48zqXTH/+CX/7m02YHzcu7GiKLKmF/kSkuYjME5EFIrLLmmwRuVNE5ojIDBH5QEQSvFV44LXX7BPx/fdn5B8Ll2FKlLDtQ+bPt52pXfpr0QIOPxx697YqsM6lgxEjbDPqNN6WIS9x9+CISEngO+AMYCkwGbhUVefkOOYU4EtV3SAiNwInq+olBZ23evXqunz58tgD2brVyt+XKQPTp9tEKeeiThWOOQaWLbNEp1y5sCNKqKj34BS5nYnF6NFw/vlWZPTyou4V6lyKbdtm2xntuSd88YXNJ0szyezBaQYsUNXvVXUzMBI4N+cBqvqRqm4IHn4B1CzspDWKOsnpxRfhu++s98aTG5cuRKwXZ+lS25napVSR25lYtGxpFY579bI/Hs5F2ZtvwsKFtldeGiY3BUlEglMDWJLj8dLgufxcA7yT1wsi0lZEpojIlF9//TX2CLZsscSmSRM477zY3+dcFJx2mi0z7tPHJvm59LZj77t583wCuYs2VWt3DjjAeh0zTEpXUYnI5UBTYEBer6vqcFVtqqpN165dG/uJn33WChT17JlxGajLAiL2s/vzz/DEE2FHk1UWLlyYnBNfcIENmffs6WUAXHSNH29TOjp0yMiRj0QkOMuAnPXOawbP7URETge6AC1VdVNhJ90a6wS9TZusK/joo+Gss2J7j3NRc8IJcMYZ0Levb9qYQjG3M0W1oxdnzhzbMsa5KOrTB2rWzNi5YolIcCYD9UWkroiUAVoDY3MeICKHA8Ow5GZFAq75lyefhCVLvPfGpb+ePW0lwyOPhB2JS4RWreDAA70Xx0XT//0ffPqpzb0pUybsaJIi7gRHVbcCtwDjgbnAKFWdLSL3i0jL4LABQAXgNRGZLiJj8zld0WzYYMsxTzzR5jE4l86OOsqWGQ8YAGvWhB2Ni1fJkrZH1cyZMGZM2NE4t7MHHrCNqK+9NuxIkia9C/0NGmRVFz/+2JIc59Ld11/DEUdAt27QvXvY0cQt6svEE17oL7etW6FhQ9h9d/veei+zi4Lp061eU69etl1Mmktqob9kqFTYJpnr19t8hTPO8OTGZY4mTWyC6uDBsGpV2NFkvELbmXiVKmV/QKZPh//8J7nXci5WfftCxYpw881hR5JUkU1wqlevXvABjzxi8xV69kxNQM6lSo8ett3IwIFhRxIKESkpItNEZJea8SJyooh8LSJbRaRVrtf+JiLvicjcoHJ6ncKuVWg7kwiXXQZ//7v1yEW0x9xlkfnzrXzBTTdBlSphR5NUkU1wCrRmjc1TaNHC5i04l0kOOQQuuQQefhiKUg8qc7TD5vPl5UegDfByHq89DwxQ1YOwAqSJXdBQXKVK2ZDjtGnw1lthR+OyXf/+tpXR7beHHUnSRTbBmT9/fv4vDhkCq1dbcT/nMlH37rYBXr9+YUeSUiJSE2gBPJXX66q6WFVnANtzva8hUEpVJwTHrc9RPT1fBbYziXTZZVYOv1s3X1HlwrNsme17d801sO++YUeTdJFNcLbn1wisWgUPPmhVF5s0SW1QzqVKgwZWm+KxxyDReyVF2xDgHnIlMDE4APhdRN4MhrcGBPvk7SJnxfRNmwotyZUYJUta0jprFowalZprOpfboEGWYN99d9iRpERkE5x8DRpk8xN69Ag7EueSq2tX24akT5+wI0kJETkHWKGqU4vx9lLACUB74Ejg79hQ1i5yVkwvXbp0ccMtuosvtuHHbt18p3GXeitXwrBh8K9/QZ06YUeTEumV4Pz2Gzz0kDUUhx4adjTOJVe9enD11TB8uG3GmfmOA1qKyGJs095TReTFGN+7FJgebPq7FRgNRKuLt0QJG1b/7jt46aWwo3HZ5uGHrXZcx45hR5Iy6ZXgDBhg36Bu3cKOxLnU6NLlrw3xMpyqdlLVmqpaB6uI/qGqxlpDfjJQRUT2Ch6fCsxJQpjxOe88G1rv0cN655xLhbVrbeXxeedZXaYsEdkEp0ru5WsrVsCjj1r32kEHhRKTcylXp45NCHzqKfjxx7CjCUXOqugicqSILAUuAoaJyGwAVd2GDU99ICIzAQGeLOzcu7QzybZjY9VFi2yTYOdS4ZFHbGHOvfeGHUlKRbaScdOmTXXKlCl/PdG+vRU/mzvXtnZ3LlssWQL77w9t2tgYehqJeiXjXdqZVFCFY4+1FS3z50PZsqm9vssua9faB6Xjj4exidklKWrSrpLxTpYvt9Ukl1/uyY3LPrVqwXXXwTPP2Cd/l9529OIsWWKbBTuXTI8+ar03WTi1I7I9ODvtEXP77fZN+vZb+yTrXLZZtswmHV92GTz9dNjRxCzqPThJ34sqP6pwyikwbx4sXAjly6c+Bpf51q6FunWtxzCDtwpJ3x6cn36CoUPhqqs8uXHZq0YNuOEGK9K1cGHY0bh47ejF+flneOKJsKNxmerRR612XBb23kA6JDgPPADbtmXd5CjndtGxI5Qp4/uvZYoTToB//MM2Ply/PuxoXKZZt87qxrVoAU0j24maVNFOcJYssRogV19t3WzOZbN994Ubb4QXXrBaKi799exp9b0GDw47Epdpsrz3BqKe4PTpY2PVXbqEHYlz0XDPPVCunO/DlimaNYMLLrANELNzY1WXDDt6b84+G448MuxoQpOQBEdEmovIPBFZICK7lEkUkbIi8mrw+pciUqewc1atVMkmU15zDdSunYgwnUt/++wDt9wCr7xiJRNcXKpWrRp2CPZB7s8/fejRJc5jj9nWDFncewMJSHCCDe0eA84CGgKXBjv75nQNsFpV9wcGA4VukbzX5s02Ea9z53hDdC6z3H23rbrxXpy47bXXXoUflGwNGsC119piCp9A7uK1fj0MHAhnnWU9hFksET04zYAFwR4wm7E9ZM7Ndcy5wHPB/deB00RECjrp9t9+g7ZtrQaIc+4v1arBrbfCq6/a7tSu2LZvL+qm5UnSrRuULu2LKVz8vPfmfxKR4NQAluR4vDR4Ls9jgo3w1gB75j6RiLQVkSkiMmU+QKdOCQjPuQx0111QoYL34sRp/vz5YYdgqleHO++EkSNhanE2U3cO670ZMACaN4ejjgo7mtBFapKxqg5X1aaq2pQKFWC//cIOyblo2nNPK4D52mswY0bY0bhEuPtu653r0MEWVzhXVN57s5NEJDjLgJzjSDWD5/I8RkRKAZWBlQm4tnPZ6447oHJl6N497EhcIlSqBPfdBx98ABMmhB2NSze//w79+lnvzdFHhx1NJCQiwZkM1BeRuiJSBmgN5N7RayxwVXC/FfChRnWPCOfSxR57WJLz1lvw9ddhR+MS4frrreZXhw4QlflBLj0MHGh7TvXpE3YkkRF3ghPMqbkFGA/MBUap6mwRuV9EWgaHPQ3sKSILgDuBXZaSO+eK4fbboUoV78XJFGXLQu/eMH06vPxy2NG4dPHzz1YssnVrOPzwsKOJjMhutlm3bl1d5DsnO1e4Xr1saGPy5MiVZI/6ZpuRbGe2b7fibCtX2macZcuGHZGLuptvtqr/c+dm5Z6NabfZ5p577rLIyjmXl9tug6pVfWJhMUSynSlRwuZS/PADPP542NG4qFu40JKba6/NyuSmIJFNcLZu3Rp2CM6lh0qVbAXO22/DF1+EHU1aiWw7c/rpcMYZ1ju3enXY0bgo69rVaijdd1/YkUROZBOchV7R07nY3XKLLTH2XpwiiXQ7M2CArYzp0SPsSFxU7Zir1a6dl1XJQ2QTHOdcEVSoYBtxvvceTJoUdjQuEQ47DK67znaFnjMn7GhcFHXpYqspO3QIO5JI8gTHuUxx002w995p34sjIiVFZJqIjMvjtRNF5GsR2SoirXK9tk1Epge33KUq0lPPnlCxoq2Wi+iCEBeSTz6xYemOHW0lpduFJzjOZYrdd7dPch98AB9/HHY08WiHlZzIy49AGyCvNdR/qmrj4NYyj9fTz157WQmACRNg3C75nstWqraV0X772fC0y5MnOM5lkhtugH33tYmHafiJX0RqAi2Ap/J6XVUXq+oMIHuq4N10Exx0kBV13LQp7GhcFIwbB599Zr215cuHHU1kRTbB2XvvvcMOwbn0U768fbL75BP48MOwoymOIcA9FC+BKRds1vuFiJyX30E5N/UtV65cMcNModKlrYjbwoXw0ENhR+PCtm0bdO4M9evD1VeHHU2kRTbB2WOPPcIOwbn01LYt1Khhy0bTqBdHRM4BVqhqcbfTrh0U+/oXMERE6uV1UM5NfWvXrl3ccFPrzDPhn/+0OTk//xx2NC5ML7wAs2ZZCYHSpcOOJtIim+Bs3rw57BCcS0/lysG998Lnn8O774YdTVEcB7QUkcXASOBUEXkx1jer6rLg6/fARKDQmvVp1c48+KANUXXqFHYkLizr1tn3/6ijoFWrwo/PcpFNcCJXPt25dPLvf0OdOmk1F0dVO6lqTVWtg23a+6GqXh7Le0VkDxEpG9yvhiVLha6tTqt2Zv/9bR7OiBG2LYfLPn36WA/eQw9ZxWtXIP8fci4TlSljQ1RTpsDY9F4xnXPjXhE5UkSWAhcBw0RkdnDYQcAUEfkG+Ajoq6qZVzymSxfYZx/bniNNEleXIN9/b714V15pPTiuUJHdbLNixYq6bt26sMNwLn1t3Wqrb8qXh2nTQvnEF/XNNtOynRkxwiaXvvACXB5TB5fLBBdcYIU8v/vOqxbnknabbTrn4lSqlNVQmTED3ngj7Ghcolx5pe02fvfdtpWDy3wffghvvWWrpzy5iZn34DiXybZtg0aNbDhj5kwoWTKll/cenCT5+mtLcq67DoYODTsal0xbt0KTJjbBeO5cW0TgdpJ2PTj77rtv2CE4l/5KlrRenLlzYeTIsKOJnLRtZ5o0se0bhg3zvccy3VNP2YeTgQM9uSmiuBIcEakqIhNEZH7wdZfiNSLSWEQ+F5HZIjJDRC6J5dyVK1eOJzTn3A4XXmi9OD162KdB9z9p3c706AF/+5vVPUqn5e4udqtXW8mHk0+2OTiuSOLtwekIfKCq9YEPgse5bQCuVNWDgeZYAa4qhZ1448aNcYbmnANscnHPnjB/vk1Mdf+T1u1MhQrw+OO20/iAAWFH45KhRw9LcoYMAZGwo0k7cc3BEZF5wMmqulxEqgMTVbVBIe/5BmilqvMLOi5tx8adiyJVW1r6668wb54tI08Bn4OTAhdfbKUAZsyAAw4IOxqXKHPnWs/rNdf4PKtCJGsOzj6qujy4/zOwTyFBNAPKAAvzef1/e8Rs2bIlztCcc/8jAvffD4sXw7PPhh2NS6SHHrK5GTfc4LVxMoUq3Hkn7L679b66Yik0wRGR90VkVh63c3Mep9YVlO9vV9DD8wJwtarmuZFezj1iSvseG84l1plnwnHHWYOZzkMzbmfVq0PfvvDRR/D882FH4xLhzTdtm5Vu3WCvvcKOJm2lZIhKRCphe8P0UdXXYzl3RnQdOxc1H39sExYHDbJPiEnmQ1Qpsn07nHCCDT9++y1UqxZ2RK64Vq+Ghg2t3s2XX1o9K1egZA1RjQWuCu5fBYzJ48JlgLeA52NNbpxzSXLSSfCPf9ieNmvXhh2NS5QSJWzJ+Jo1cNddYUfj4tGhg82Ve/JJT27iFG+C0xc4Q0TmA6cHjxGRpiLyVHDMxcCJQBsRmR7cGhd24urVq8cZmnMuT717w8qVtjIjy2VUO3PIIfbH8fnn4f33w47GFcfHH1tic8cdVuvIxSWylYybNm2qU6ZMCTsM5zLThRfChAmwaBHsuWfSLhP1IaqMa2f+/BMOPxz++MOKw1WpEnZELlYbN8Jhh8GWLTBrlu0h52KSdpWMN2zYEHYIzmWunj1h/Xro1y/sSEKVce3MbrtZraPly+HWW8OOxhVF7962keawYZ7cJEhkE5wlS5aEHYJzmathQ7jiCnjkEfjpp7CjCU1GtjNHHgldu8KLL8KoUWFH42Ixc6athLviCjjjjLCjyRiRTXCcc0nWvbttxtmrV9iRuETr3BmaNbPaOMuWhR2NK8i2bbZpapUq8OCDYUeTUTzBcS5b1a1r+xg9+SR8/33Y0bhEKlXKhqo2boR//9sLAEbZ44/bcvDBg315f4J5guNcNuvSBUqXtoJiLrMccIDVO3rvPfsj6qJnyRLrbTvzTLjssrCjyTie4DiXzapXh9tug5despUbLrPccAM0bw53321FAF10qML111uRxiee8M00kyCyCU6NGjXCDsG57HDPPVCxItx3X9iRpFzGtzMi8MwztrrqiitsCbKLhsceg3fescnFdeuGHU1GimyCU6FChbBDcC47VK1qn/BHj7a5ACETkZIiMk1ExuXx2oki8rWIbBWRVnm8XklElorIo7FcKyvamerVbenx5Mm2FNmFb+ZMaN8ezj4bbrkl7GgyVmQTnPXr14cdgnPZo10729SvY8coTEhtB8zN57UfgTbAy/m83hP4JNYLZU0706qV9eD06gWffhp2NNntzz/h0ktt1dSzz/rQVBJFNsFZ5ksbnUudihWtdsrEibaLcUhEpCbQAngqr9dVdbGqzgC25/HeI4B9gPdivV5WtTOPPgr16sHFF1shQBeOu++G2bPhuedg773DjiajRTbBcc6lWNu29gewQwerzRGOIcA95JHAFERESgCDgPYxHNtWRKaIyJQt2TQnpVIlePNN22T1oot8Pk4Y/vMfm3tz5522csollSc4zjlTpozN0Zg506rgppiInAOsUNWpxXj7TcDbqrq0sANVdbiqNlXVpqVLly7GpdLYwQfD00/DpEk2udylzk8/wdVXQ+PG0KdP2NFkBU9wnHN/uegiaNrUVlRt3Jjqqx8HtBSRxcBI4FQRiTXTOga4JXjvQOBKEemblCjTXevWcPvttpv8yJFhR5Mdtm+Hq66CDRvglVegbNmwI8oKnuA45/5SogT0728FyB6NaSFSwqhqJ1Wtqap1gNbAh6p6eYzvvUxV/xa8tz3wvKp2TF60aa5/fzj+eLjmGpsP4pJr8GB4/31LKg88MOxoskZkE5xatWqFHYJz2emUU+Css6wbffXqsKNBRO4XkZbB/SNFZClwETBMROL665y17Uzp0rYRZ6VKcMEFsGZN2BFlrqlToVMnOP9823PKpUxkE5zyvl28c+Hp2xd+/x0eeCCUy6vqRFU9J7jfVVXHBvcnB708u6vqnqp6cB7vHaGqMRUXyep2pnp1S3IWLoQ2baJQHiDz/PwznHce7Luv7fnmS8JTKrIJztq1a8MOwbns1aiR1U15+GH48cewo0marG9nTjgBBg60Io/9+oUdTWbZuNGSm1WrYMwY2HPPsCPKOnElOCJSVUQmiMj84OseBRxbpAqjy71Og3Ph6tnTvmbwRpzezmBFHlu3tmEUn3ScGKo2HPXll7ar++GHhx1RVoq3B6cj8IGq1gc+CB7np0gVRp1zIfvb3+DWW60g2cyZYUfjkkXEKuqeeCJceSV8+GHYEaW/fv2s1ELPnjbHyYUi3gTnXOC54P5zwHl5HVScCqPOuQjo1AkqV7YtHFzmKlfOhlEaNLBhlenTw44ofY0ZA507W69Yly5hR5PV4k1w9lHVHX28P2NJzE68wqhzaaxqVUty3n7bP9lnuipVbJuOKlVsFd2iRWFHlH5mzIDLLoMjjrBd3H1ScagKTXBE5H0RmZXH7dycx6mqAnlNw/cKo86ls9tug9q14Y47wtzCwaVCjRowfjxs2mRbCfz6a9gRpY8VK+Cf/7QezzFjYLfdwo4o6xWa4Kjq6ap6SB63McAvIlIdIPi6Io9TFKvCaO3atYv0D3HOJUm5clYYbsYMm6uRQbydycNBB8G4cVbs8Zxz4I8/wo4o+jZutLk2K1ZYcrPffmFH5Ih/iGoscFVw/ypgTO4DilthtFy5cnGG5pxLmIsuguOOszkFGbS02tuZfBx7LLz6KkyZYruP+5SB/G3caEX8Jk2CESNsqxMXCfEmOH2BM0RkPnB68BgRaSoiT8Vz4jVeWdO56BCxcvMrVoRW/C8ZvJ0pQMuWMHSozb+6/HLYvDnsiKJn0ya48EKbu/Tkk3DJJWFH5HIQjWj1yooVK+q6devCDsM5l9NVV1mtlG+/hbp1Cz1cRKaqamQ/0no7E4NBg6B9ezj7bHjtNcjm6s85bdoErVrZcN6wYdC2bdgRZa382pnIVjJ2zkVQnz5QqhR06BB2JC5V7roLhg+Hd96x1VUZNERZbJs329DduHHwxBOe3ESUJzjOudjVqAH33GOf5P/v/8KOxqXKddfBK6/AZ5/BqafCb7+FHVF4tmyxoaixY+Gxx+CGG8KOyOXDExznXNHcfTfUrAm33w7bt4cdjUuVSy6xFUKzZ1vV42XLwo4o9bZssQJ+o0fDI4/ATTeFHZErgCc4zrmiKV/eJhpPnWrl6F32OPtsq5OzdCkcfzwsWBB2RKmzYYMleW++CQ89BLfEtGG9C1FkE5y6MUxgdM6F5F//gmbNrMpxGtdJ8XamGE48ET76CNats93Iv/gi7IiS74cfrEzC6NHw8MNW/NJFXmQTnDJlyoQdgnMuPyVK2LLxn36yIoBpytuZYjriCPjkEysCecIJMGSI7aCdiT7+2GrbLFpkk4pvvTXsiFyMIpvgrF69OuwQnHMFOfZYm4/Qv3/a7lvk7UwcGjaEr7+GFi1sG49WrSCT6gqpwuOPw+mnQ7Vq8NVXNkTn0kZkE5wVK/La9cE5FykDBkDJkjbhOA15OxOnPfaAt96yWjljx0KTJpb0pLtNm2zp9803Q/PmNgx3wAFhR+WKKLIJjnMuDdSsCd262R+3cePCjsaFQQTuvNOGcjZvtp69oUPTd8hq+XJbCv/UU7Y1yZgxtoGmSzue4Djn4nP77TZccdtt8OefcZ9OREqKyDQR2SVjEpETReRrEdkqIq1yPF87eH66iMwWES9OkmrHHgvTpsEpp8CNN9rw5U8/hR1V7LZts7o2Bx0E06fDqFHQq5fNN3Npyb9zzrn4lC4Njz5q83D69k3EGdsBc/N57UegDfByrueXA8eoamPgKKCjiPiWzqlWrRr8979W8Xr0aBvW6d07IYlvUk2eDEcdZUu/mza1YbaLLgo7KhcnT3Ccc/E75RS49FLo1y+u2igiUhNoAeS5Wa+qLlbVGcD2XM9vVtVNwcOyeNsWnhIlrHzAnDlw5plw773WKzJqVPSGrVavtmJ9Rx1lvU0jR8KECdCgQdiRuQSIbCNQr169sENwzhXFwIFQpowNVRX/D9kQ4B5yJTCxEJFaIjIDWAL0U9U8x0dEpK2ITBGRKVWqVClunK4w9erBG2/Ahx9ClSpWJO+EE2DKlLAjs+Go55+3RGbYMPuZ/fZbi1Ek7OhcgkQ2wSlVqlTYITjnimK//aBHD9uUccyYIr9dRM4BVqjq1OJcXlWXqGojYH/gKhHZJ5/jhqtqU1Vtus8+eR7iEumUU6zq9ZNPwvz5cOSRcOGF8PbbsHVramNZscKqcO+/P1x1lSVhU6daHZ9KlVIbi0u6yCY4K1euDDsE51xR3XorHHootGtXnArHxwEtRWQxMBI4VUSKvBdE0HMzCzihsGO9nUmRkiXh2mstwenc2YoEtmgBtWvb4/nzk3dtVVvhdemltuqvc2eoW9eGzCZNgsaNk3dtF6rIJji/ZfNutc6lq1KlbCXKjz/aRNMiUNVOqlpTVesArYEPVfXyWN4rIjVFZLfg/h7A8cC8wt7n7UyKVapkk46XLbM9nZo0sXlbBxxgw1fPPAOLF8c/V+fPP23n84ED4ZBD4OST4d13ra7N3Lk2bHbRRb5CKsOJxvGDJCJVgVeBOsBi4GJV3aU0qIj8DZs0WAtQ4GxVXVzQuStWrKjr1q0rdmzOuRBdeSWMHIls2TJVVZsW9e0icjLQXlXPEZH7gSmqOlZEjgTeAvYANgI/q+rBInIGMAhrXwR4VFWHF3Ydb2ci4Kef4IUXLLn57jt7rnJl61nJeWvQwBKS7dt3vm3bZgn15Ml/3WbOtOfBhsRuvNHm15QvH86/0SWViOTZzsSb4PQHVqlqXxHpCOyhqh3yOG4i0FtVJ4hIBWC7qm4o6Nze8DiXxn75BRo0QNasKVaCkyrezkSIqtXRmTLFvk6fDjNm2C7esdpjD1vm3ayZJTZHHmlzw1xGyy/BiXcm77nAycH954CJwE4Jjog0BEqp6gQAVV0f5zWdc1G3zz42VHV5TCNMztnqpSZN7LbDtm1WdmD6dPsqYr04JUrYvJ4d9/fe25KZevV8FZT7n3h7cH5X1SrBfQFW73ic45jzgGuBzUBd4H2go6puy+N8bYG2AGXLlj1i48aNxY7NORe+/D5ZRYX34DiX/ordgyMi7wP75vFSl5wPVFVFJK9sqRS2muFwrArpq1gl0qdzHxiMmQ8HaNKkScQqQjnnMk39+vXDDsE5lySFJjiqenp+r4nILyJSXVWXi0h1IK+teZcC01X1++A9o4GjySPByamEz253ziWZtzPOZa54f7vHAlcF968C8qruNRmoIiJ7BY9PBeYUduJff/01ztCcc65g3s44l7niTXD6AmeIyHzg9OAxItJURJ4CCObatAc+EJGZ2BLOJws78apVq+IMzTnnCubtjHOZK65VVKq6Ejgtj+enYBOLdzyeADSK51rOOeecc7HyAWjnnHPOZRxPcJxzzjmXcTzBcc4551zGiavQXzKJyDpi2CzPpVQ1wHcnjJaof09qq+pehR8WDm9nIinqP9PZJh2+H3m2M/Fu1ZBM86JcATUbicgU/55Ei39P4ubtTMT4z3S0pPP3w4eonHPOOZdxPMFxzjnnXMaJcoIzPOwA3C78exI9/j2Jj///RY9/T6Ilbb8fkZ1k7JxzzjlXXFHuwXHOOeecKxZPcJxzzjmXcSKZ4IhIcxGZJyILRKRj2PFkIxF5RkRWiMisHM91F5FlIjI9uJ0dZozZRETKichXIvKNiMwWkR7B83VF5Mvgd+VVESkTdqzpwtuZcHkbEz2Z1s5ELsERkZLAY8BZQEPgUhFpGG5UWWkE0DyP5werauPg9naKY8pmm4BTVfUwoDHQXESOBvph35P9gdXANeGFmD68nYmEEXgbEzUZ1c5ELsEBmgELVPV7Vd0MjATODTmmrKOqnwCrwo7DGTXrg4elg5sCpwKvB88/B5yX+ujSkrczIfM2JnoyrZ2JYoJTA1iS4/HS4DkXDbeIyIyge3mPsIPJJiJSUkSmAyuACcBC4HdV3Roc4r8rsfN2Jrq8jQlRJrUzUUxwXHQ9AdTDui6XA4NCjSbLqOo2VW0M1MR6IA4MNyLnEs7bmJBlUjsTxQRnGVArx+OawXMuZKr6S/DDvx14Evvhdymmqr8DHwHHAFVEZMeecv67EjtvZyLI25joyIR2JooJzmSgfjBruwzQGhgbckwOEJHqOR6eD8zK71iXWCKyl4hUCe7vBpwBzMUaoFbBYVcBY0IJMP14OxNB3saEK9PamcjtJq6qW0XkFmA8UBJ4RlVnhxxW1hGRV4CTgWoishToBpwsIo2xSWeLgevDii8LVQeeC1b/lABGqeo4EZkDjBSRXsA04Okwg0wX3s6Ez9uYSMqodsa3anDOOedcxoniEJVzzjnnXFw8wXHOOedcxvEExznnnHMZxxMc55xzzmUcT3Ccc845l3E8wXHOOedcxvEEx8VMRPYUkenB7WcRWRbcXy8ijyfheiNEZJGI3FDAMSeIyBwR8YJgzqU5b2NcInkdHFcsItIdWK+qA5N4jRHAOFV9vZDj6gTHHZKsWJxzqeVtjIuX9+C4uInIySIyLrjfXUSeE5FPReQHEblARPqLyEwReVdESgfHHSEiH4vIVBEZn6tEe37XuUhEZonINyLySbL/Xc65aPA2xhWHJzguGeoBpwItgReBj1T1UOBPoEXQAD0CtFLVI4BngN4xnLcrcKaqHhac2zmXnbyNcYWK3F5ULiO8o6pbRGQmts/Pu8HzM4E6QAPgEGCCiBAcszyG804CRojIKODNRAftnEsb3sa4QnmC45JhE4CqbheRLfrXRK/t2M+cALNV9ZiinFRVbxCRo4AWwFQROUJVVyYycOdcWvA2xhXKh6hcGOYBe4nIMQAiUlpEDi7sTSJST1W/VNWuwK9ArSTH6ZxLT97GOO/BcamnqptFpBXwsIhUxn4OhwCzC3nrABGpj306+wD4JqmBOufSkrcxDnyZuIswX8LpnEsmb2Mymw9RuShbA/QsrAgX8B/gt5RF5ZzLFN7GZDDvwXHOOedcxvEeHOecc85lHE9wnHPOOZdxPMFxzjnnXMbxBMc555xzGef/AYbst54Mck3iAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ @@ -565,22 +580,21 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "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] 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", - "[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] 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", - "[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", - "[8] 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", - "[9] Andrew Weng, Jason B Siegel, and Anna Stefanopoulou. Differential voltage analysis for battery manufacturing process control. arXiv preprint arXiv:2303.07088, 2023.\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] 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", + "[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] 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", + "[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] 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", + "[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", "\n" ] } @@ -606,7 +620,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.9.12 (main, Apr 15 2022, 23:10:21) \n[GCC 11.2.0]" }, "toc": { "base_numbering": 1, diff --git a/docs/source/examples/notebooks/initialize-model-with-solution.ipynb b/docs/source/examples/notebooks/initialize-model-with-solution.ipynb index 449d8ba93a..758257071e 100644 --- a/docs/source/examples/notebooks/initialize-model-with-solution.ipynb +++ b/docs/source/examples/notebooks/initialize-model-with-solution.ipynb @@ -23,11 +23,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", - "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "\u001b[33mWARNING: You are using pip version 21.0.1; however, version 21.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" ] } @@ -105,7 +102,7 @@ "sim_US06_1 = pybamm.Simulation(\n", " model, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_1 = sim_US06_1.solve([0, 600])" + "sol_US06_1 = sim_US06_1.solve()" ] }, { @@ -145,7 +142,7 @@ "sim_US06_2 = pybamm.Simulation(\n", " new_model, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_2 = sim_US06_2.solve([0, 600])" + "sol_US06_2 = sim_US06_2.solve()" ] }, { @@ -163,7 +160,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c40a4502c5d84c2e8c21531050985a45", + "model_id": "7ad44c260ec446e0bd04a2f7dfbf8c65", "version_major": 2, "version_minor": 0 }, @@ -177,7 +174,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -226,7 +223,7 @@ "sim_US06_3 = pybamm.Simulation(\n", " new_dfn, parameter_values=param, solver=pybamm.CasadiSolver(mode=\"fast\")\n", ")\n", - "sol_US06_3 = sim_US06_3.solve([0, 600])" + "sol_US06_3 = sim_US06_3.solve()" ] }, { @@ -244,7 +241,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "795de038e9834b709f21c499b6cb217f", + "model_id": "aaf63750ed354d1987703fd2fdde83af", "version_major": 2, "version_minor": 0 }, @@ -258,7 +255,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -295,10 +292,7 @@ "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[5] 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", - "[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", - "[8] Andrew Weng, Jason B Siegel, and Anna Stefanopoulou. Differential voltage analysis for battery manufacturing process control. arXiv preprint arXiv:2303.07088, 2023.\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", "\n" ] } @@ -331,7 +325,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.9.16" }, "toc": { "base_numbering": 1, diff --git a/docs/source/examples/notebooks/parameterization/change-input-current.ipynb b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb index bdc711e2ea..52ed915327 100644 --- a/docs/source/examples/notebooks/parameterization/change-input-current.ipynb +++ b/docs/source/examples/notebooks/parameterization/change-input-current.ipynb @@ -36,11 +36,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'cite'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: pybamm 23.5 does not provide the extra 'plot'\u001b[0m\u001b[33m\n", - "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -80,7 +75,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5f8373ac3af9468f8dcec84fb9726892", + "model_id": "aef64b871f1346a4b42c722c7eecfe38", "version_major": 2, "version_minor": 0 }, @@ -90,16 +85,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -130,7 +115,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b9bc6672ae6642dcaa2637282615f528", + "model_id": "6447d4f706374208b5cbd283577b5da5", "version_major": 2, "version_minor": 0 }, @@ -140,16 +125,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -174,32 +149,7 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "86ba62b0adc1409b83c97437c085b299", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=600.0, step=6.0), Output()), _dom_classes=('…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import pandas as pd # needed to read the csv data file\n", "\n", @@ -219,10 +169,40 @@ "\n", "# set up simulation - for drive cycles we recommend using the CasadiSolver in \"fast\" mode\n", "solver = pybamm.CasadiSolver(mode=\"fast\")\n", - "simulation = pybamm.Simulation(model, parameter_values=param, solver=solver)\n", - "\n", + "simulation = pybamm.Simulation(model, parameter_values=param, solver=solver)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when simulating drive cycles there is no need to pass a list of times at which to return the solution, the results are automatically returned at the time points in the data. If you would like the solution returned at times different to those in the data then you can pass an array of times `t_eval` to `solve` in the usual way." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84f87c3d21644c20bafdac8e9b69247d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=600.0, step=6.0), Output()), _dom_classes=('…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ "# simulate US06 drive cycle (duration 600 seconds)\n", - "simulation.solve([0, 600])\n", + "simulation.solve()\n", "\n", "# plot\n", "simulation.plot()" @@ -250,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -275,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -300,13 +280,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e0f9fb9e85fb4818adc5e1f454945449", + "model_id": "6c06d938eca0491d88cdcbb29c59cd2a", "version_major": 2, "version_minor": 0 }, @@ -316,16 +296,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -356,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -367,7 +337,7 @@ "[2] Marc Doyle, Thomas F. Fuller, and John Newman. Modeling of galvanostatic charge and discharge of the lithium/polymer/insertion cell. Journal of the Electrochemical society, 140(6):1526–1533, 1993. doi:10.1149/1.2221597.\n", "[3] Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, Pauli Virtanen, David Cournapeau, Eric Wieser, Julian Taylor, Sebastian Berg, Nathaniel J. Smith, and others. Array programming with NumPy. Nature, 585(7825):357–362, 2020. doi:10.1038/s41586-020-2649-2.\n", "[4] Scott G. Marquis, Valentin Sulzer, Robert Timms, Colin P. Please, and S. Jon Chapman. An asymptotic derivation of a single particle model with electrolyte. Journal of The Electrochemical Society, 166(15):A3693–A3706, 2019. doi:10.1149/2.0341915jes.\n", - "[5] Valentin Sulzer, Scott G. Marquis, Robert Timms, Martin Robinson, and S. Jon Chapman. Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1):14, 2021. doi:10.5334/jors.309.\n", + "[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", "\n" ] } @@ -393,7 +363,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.9.13" }, "toc": { "base_numbering": 1, From 4d8854871d1b664ed2efae54524fccf8fef00ca1 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Tue, 15 Aug 2023 11:44:56 +0100 Subject: [PATCH 11/12] Revert "#3081 add non-battery PDE test" This reverts commit 64cd12ce1772caa3d17cc3d28c9fd9eff70dbbda. --- tests/__init__.py | 1 - tests/shared.py | 74 ----------------------------------- tests/unit/test_simulation.py | 18 +-------- 3 files changed, 2 insertions(+), 91 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index d2f05f6bcb..919605998e 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -23,7 +23,6 @@ ) from .shared import ( - NonBatteryModel, get_mesh_for_testing, get_p2d_mesh_for_testing, get_size_distribution_mesh_for_testing, diff --git a/tests/shared.py b/tests/shared.py index c2aef60f9b..1f0b033582 100644 --- a/tests/shared.py +++ b/tests/shared.py @@ -2,7 +2,6 @@ # Shared methods and classes for testing # import pybamm -import numpy as np from scipy.sparse import eye @@ -42,79 +41,6 @@ def mass_matrix(self, symbol, boundary_conditions): return mass_matrix -class NonBatteryModel(pybamm.BaseModel): - def __init__(self, name="heat equation"): - super().__init__(name=name) - - x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") - T = pybamm.Variable("Temperature [K]", domain="rod") - k = pybamm.Parameter("Thermal diffusivity [m2.s-1]") - L = pybamm.Parameter("Rod length [m]") - T0 = pybamm.Parameter("Initial temperature [K]") - - dTdt = pybamm.div(k * pybamm.grad(T)) - self.rhs = {T: dTdt} - - self.boundary_conditions = { - T: { - "left": (pybamm.Scalar(0), "Dirichlet"), - "right": (pybamm.Scalar(0), "Dirichlet"), - } - } - self.initial_conditions = {T: T0} - - # Define analytical solution for comparison - def analytical_solution(N, x, t): - solution = 0 - for n in range(N): - solution += ( - 4 - * T0 - / np.pi / (2 * n + 1) - * np.sin((2 * n + 1) * np.pi * x / L) - * np.exp(-k * ((2 * n + 1) * np.pi / L) ** 2 * t) - ) - return solution - - T_an = analytical_solution(10, x, pybamm.t) - - # Add desired output variables - self.variables = {"Temperature [K]": T, "Analytical temperature [K]": T_an} - - @property - def default_geometry(self): - L = pybamm.Parameter("Rod length [m]") - x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") - return pybamm.Geometry({"rod": {x: {"min": pybamm.Scalar(0), "max": L}}}) - - @property - def default_parameter_values(self): - return pybamm.ParameterValues( - { - "Rod length [m]": 1, - "Initial temperature [K]": 1, - "Thermal diffusivity [m2.s-1]": 1, - } - ) - - @property - def default_submesh_types(self): - return {"rod": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh)} - - @property - def default_var_pts(self): - x = pybamm.SpatialVariable("x [m]", domain="rod", coord_sys="cartesian") - return {x: 50} - - @property - def default_spatial_methods(self): - return {"rod": pybamm.FiniteVolume()} - - @property - def default_solver(self): - return pybamm.CasadiSolver("fast") - - def get_mesh_for_testing( xpts=None, rpts=10, diff --git a/tests/unit/test_simulation.py b/tests/unit/test_simulation.py index 6335646caa..83ec42ef6c 100644 --- a/tests/unit/test_simulation.py +++ b/tests/unit/test_simulation.py @@ -1,7 +1,7 @@ import pybamm import numpy as np import pandas as pd -from tests import TestCase, NonBatteryModel +from tests import TestCase import os import sys import unittest @@ -82,7 +82,7 @@ def test_solve(self): with self.assertRaisesRegex(ValueError, "starting_solution"): sim.solve(starting_solution=sol) - def test_solve_non_battery_model_ode(self): + def test_solve_non_battery_model(self): model = pybamm.BaseModel() v = pybamm.Variable("v") model.rhs = {v: -v} @@ -98,20 +98,6 @@ def test_solve_non_battery_model_ode(self): sim.solution["v"].entries, np.exp(-np.linspace(0, 1, 100)) ) - def test_solve_non_battery_model_pde(self): - model = NonBatteryModel() - sim = pybamm.Simulation(model) - - solution = sim.solve(np.linspace(0, 1, 100)) - np.testing.assert_array_equal(sim.solution.t, np.linspace(0, 1, 100)) - # Compare with analytical temperature (drop first few terms as agreement of - # early states is not great) - np.testing.assert_array_almost_equal( - solution["Temperature [K]"].entries[:, 2:], - solution["Analytical temperature [K]"].entries[:, 2:], - decimal=3, - ) - def test_solve_already_partially_processed_model(self): model = pybamm.lithium_ion.SPM() From 62d844fee924d54f2c03c2044fc2aaa5f6a66208 Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Fri, 15 Sep 2023 12:27:14 +0100 Subject: [PATCH 12/12] #3081 update docstring --- pybamm/solvers/solution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pybamm/solvers/solution.py b/pybamm/solvers/solution.py index ecc8f7b702..4c9ccb993d 100644 --- a/pybamm/solvers/solution.py +++ b/pybamm/solvers/solution.py @@ -443,7 +443,7 @@ def initial_start_time(self): @initial_start_time.setter def initial_start_time(self, value): - """Updates the reason for termination""" + """Updates the initial start time of the experiment""" self._initial_start_time = value def set_summary_variables(self, all_summary_variables):