From a05a4616153b0c4eb638f54f4bf3154b2026c392 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Thu, 7 Sep 2023 10:48:03 +0000 Subject: [PATCH 1/5] #3130 use model.y_slices rather than var.y_slice --- pybamm/solvers/solution.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pybamm/solvers/solution.py b/pybamm/solvers/solution.py index 411341f887..9284aa942b 100644 --- a/pybamm/solvers/solution.py +++ b/pybamm/solvers/solution.py @@ -308,7 +308,8 @@ def check_ys_are_not_too_large(self): y = y[:, -1] if np.any(y > pybamm.settings.max_y_value): for var in [*model.rhs.keys(), *model.algebraic.keys()]: - y_var = y[model.variables[var.name].y_slices[0]] + first_index = model.y_slices[var][0] + y_var = y[first_index] if np.any(y_var > pybamm.settings.max_y_value): pybamm.logger.error( f"Solution for '{var}' exceeds the maximum allowed value " From c5bdce7e7414a988ef685710cfd71b1c50427902 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Thu, 7 Sep 2023 10:48:48 +0000 Subject: [PATCH 2/5] #3130 use a more accurate name --- pybamm/solvers/solution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pybamm/solvers/solution.py b/pybamm/solvers/solution.py index 9284aa942b..3da5673e34 100644 --- a/pybamm/solvers/solution.py +++ b/pybamm/solvers/solution.py @@ -308,8 +308,8 @@ def check_ys_are_not_too_large(self): y = y[:, -1] if np.any(y > pybamm.settings.max_y_value): for var in [*model.rhs.keys(), *model.algebraic.keys()]: - first_index = model.y_slices[var][0] - y_var = y[first_index] + slice = model.y_slices[var][0] + y_var = y[slice] if np.any(y_var > pybamm.settings.max_y_value): pybamm.logger.error( f"Solution for '{var}' exceeds the maximum allowed value " From 209ad4761ee3c70ab2a3b24642015753aab38a70 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Thu, 7 Sep 2023 11:07:58 +0000 Subject: [PATCH 3/5] #3130 fix case where model isnt discretised --- pybamm/solvers/solution.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pybamm/solvers/solution.py b/pybamm/solvers/solution.py index 3da5673e34..d6f8b03f3e 100644 --- a/pybamm/solvers/solution.py +++ b/pybamm/solvers/solution.py @@ -308,8 +308,18 @@ def check_ys_are_not_too_large(self): y = y[:, -1] if np.any(y > pybamm.settings.max_y_value): for var in [*model.rhs.keys(), *model.algebraic.keys()]: - slice = model.y_slices[var][0] - y_var = y[slice] + var = model.variables[var.name] + # find the statevector corresponding to this variable + statevector = None + for node in var.pre_order(): + if isinstance(node, pybamm.StateVector): + statevector = node + if statevector is None: + raise RuntimeError( + "Cannot find statevector corresponding to variable {}" + .format(var.name) + ) + y_var = y[statevector.y_slices[0]] if np.any(y_var > pybamm.settings.max_y_value): pybamm.logger.error( f"Solution for '{var}' exceeds the maximum allowed value " From 52ab34103514b6c68205c294508d99995d829dbb Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Thu, 7 Sep 2023 12:42:08 +0000 Subject: [PATCH 4/5] #3130 no cover for branch --- pybamm/solvers/solution.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pybamm/solvers/solution.py b/pybamm/solvers/solution.py index d6f8b03f3e..65c3e0b5a7 100644 --- a/pybamm/solvers/solution.py +++ b/pybamm/solvers/solution.py @@ -314,7 +314,9 @@ def check_ys_are_not_too_large(self): for node in var.pre_order(): if isinstance(node, pybamm.StateVector): statevector = node - if statevector is None: + + # there will always be a statevector, but just in case + if statevector is None: # pragma: no cover raise RuntimeError( "Cannot find statevector corresponding to variable {}" .format(var.name) From ccd53ebb0823189d5851485707a02945432ecf7c Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Thu, 7 Sep 2023 14:59:10 +0000 Subject: [PATCH 5/5] #3130 add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec5e39b8b..d6927f20bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ## Bug fixes +- Fixed a bug that occured in `check_ys_are_not_too_large` when trying to reference `y-slice` where the referenced variable was not a `pybamm.StateVector` ([#3313](https://github.com/pybamm-team/PyBaMM/pull/3313) - Fixed a bug with `_Heaviside._evaluate_for_shape` which meant some expressions involving heaviside function and subtractions did not work ([#3306](https://github.com/pybamm-team/PyBaMM/pull/3306)) - The `OneDimensionalX` thermal model has been updated to account for edge/tab cooling and account for the current collector volumetric heat capacity. It now gives the correct behaviour compared with a lumped model with the correct total heat transfer coefficient and surface area for cooling. ([#3042](https://github.com/pybamm-team/PyBaMM/pull/3042)) - 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))