From 9c0c0a700d49f57af4040668f6a0ae5bcdd2022a Mon Sep 17 00:00:00 2001 From: Robert Timms <43040151+rtimms@users.noreply.github.com> Date: Wed, 24 Jan 2024 13:00:52 +0000 Subject: [PATCH] #3630 fix interpolant shape error (#3761) * #3630 fix interpolant shape error * #3630 changelog --- CHANGELOG.md | 1 + pybamm/models/submodels/thermal/isothermal.py | 18 +++++++++++++-- .../base_lithium_ion_tests.py | 22 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1651ed889c..18cb46a557 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ ## Bug fixes +- Fixed a bug that lead to a `ShapeError` when specifying "Ambient temperature [K]" as an `Interpolant` with an isothermal model ([#3761](https://github.com/pybamm-team/PyBaMM/pull/3761)) - Fixed a bug where if the first step(s) in a cycle are skipped then the cycle solution started from the model's initial conditions instead of from the last state of the previous cycle ([#3708](https://github.com/pybamm-team/PyBaMM/pull/3708)) - Fixed a bug where the lumped thermal model conflates cell volume with electrode volume ([#3707](https://github.com/pybamm-team/PyBaMM/pull/3707)) - Reverted a change to the coupled degradation example notebook that caused it to be unstable for large numbers of cycles ([#3691](https://github.com/pybamm-team/PyBaMM/pull/3691)) diff --git a/pybamm/models/submodels/thermal/isothermal.py b/pybamm/models/submodels/thermal/isothermal.py index d8070f6eba..52b5277986 100644 --- a/pybamm/models/submodels/thermal/isothermal.py +++ b/pybamm/models/submodels/thermal/isothermal.py @@ -26,13 +26,17 @@ def get_fundamental_variables(self): # specified as a function of space (y, z) only and time y = pybamm.standard_spatial_vars.y z = pybamm.standard_spatial_vars.z - T_x_av = self.param.T_amb(y, z, pybamm.t) + # Broadcast t to be the same size as y and z (to catch cases where the ambient + # temperature is a function of time only) + t_broadcast = pybamm.PrimaryBroadcast(pybamm.t, "current collector") + T_x_av = self.param.T_amb(y, z, t_broadcast) + T_vol_av = self._yz_average(T_x_av) T_dict = { "negative current collector": T_x_av, "positive current collector": T_x_av, "x-averaged cell": T_x_av, - "volume-averaged cell": T_x_av, + "volume-averaged cell": T_vol_av, } for domain in ["negative electrode", "separator", "positive electrode"]: T_dict[domain] = pybamm.PrimaryBroadcast(T_x_av, domain) @@ -50,15 +54,25 @@ def get_coupled_variables(self, variables): "Ohmic heating [W.m-3]", "X-averaged Ohmic heating [W.m-3]", "Volume-averaged Ohmic heating [W.m-3]", + "Ohmic heating per unit electrode-pair area [W.m-2]", + "Ohmic heating [W]", "Irreversible electrochemical heating [W.m-3]", "X-averaged irreversible electrochemical heating [W.m-3]", "Volume-averaged irreversible electrochemical heating [W.m-3]", + "Irreversible electrochemical heating per unit electrode-pair area [W.m-2]", + "Irreversible electrochemical heating [W]", "Reversible heating [W.m-3]", "X-averaged reversible heating [W.m-3]", "Volume-averaged reversible heating [W.m-3]", + "Reversible heating per unit electrode-pair area [W.m-2]", + "Reversible heating [W]", "Total heating [W.m-3]", "X-averaged total heating [W.m-3]", "Volume-averaged total heating [W.m-3]", + "Total heating per unit electrode-pair area [W.m-2]", + "Total heating [W]", + "Negative current collector Ohmic heating [W.m-3]", + "Positive current collector Ohmic heating [W.m-3]", ]: # All variables are zero variables.update({var: zero}) diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 6694248b5d..4db5ddea61 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -347,3 +347,25 @@ def test_basic_processing_msmr(self): model = self.model(options) modeltest = tests.StandardModelTest(model, parameter_values=parameter_values) modeltest.test_all(skip_output_tests=True) + + def test_basic_processing_temperature_interpolant(self): + times = np.arange(0, 4000, 10) + tmax = max(times) + + def temp_drive_cycle(y, z, t): + return pybamm.Interpolant( + times, + 298.15 + 20 * (times / tmax), + t, + ) + + parameter_values = pybamm.ParameterValues("Chen2020") + parameter_values.update( + { + "Initial temperature [K]": 298.15, + "Ambient temperature [K]": temp_drive_cycle, + } + ) + model = self.model() + modeltest = tests.StandardModelTest(model, parameter_values=parameter_values) + modeltest.test_all(skip_output_tests=True)