From 686b62af7b402444b7a8494ec34f9eb0e9bc0e75 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Wed, 10 Sep 2025 16:34:24 +0000 Subject: [PATCH 1/6] feat: EvaluateAt: add support for children evaluated at edges --- src/pybamm/expression_tree/unary_operators.py | 3 +++ src/pybamm/spatial_methods/finite_volume.py | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pybamm/expression_tree/unary_operators.py b/src/pybamm/expression_tree/unary_operators.py index b4610898a3..bb771fa7db 100644 --- a/src/pybamm/expression_tree/unary_operators.py +++ b/src/pybamm/expression_tree/unary_operators.py @@ -1288,6 +1288,9 @@ def _evaluate_for_shape(self): """See :meth:`pybamm.Symbol.evaluate_for_shape_using_domain()`""" return pybamm.evaluate_for_shape_using_domain(self.domains) + def _evaluates_on_edges(self, dimension: str) -> bool: + return False + class UpwindDownwind(SpatialOperator): """ diff --git a/src/pybamm/spatial_methods/finite_volume.py b/src/pybamm/spatial_methods/finite_volume.py index e5ea4055a2..ce1cde56bd 100644 --- a/src/pybamm/spatial_methods/finite_volume.py +++ b/src/pybamm/spatial_methods/finite_volume.py @@ -1357,7 +1357,10 @@ def evaluate_at(self, symbol, discretised_child, position): # Get mesh nodes domain = discretised_child.domain mesh = self.mesh[domain] - nodes = mesh.nodes + if symbol.children[0].evaluates_on_edges("primary"): + nodes = mesh.edges + else: + nodes = mesh.nodes if hasattr(mesh, "length"): domain = discretised_child.domain raise NotImplementedError( @@ -1369,7 +1372,7 @@ def evaluate_at(self, symbol, discretised_child, position): index = np.argmin(np.abs(nodes - position.value)) # Create a sparse matrix with a 1 at the index - sub_matrix = csr_matrix(([1], ([0], [index])), shape=(1, mesh.npts)) + sub_matrix = csr_matrix(([1], ([0], [index])), shape=(1, len(nodes))) # repeat across auxiliary domains matrix = csr_matrix(kron(eye(repeats), sub_matrix)) From 0dc79646746395a5b9e85c4e7efc36322694dce9 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Wed, 17 Sep 2025 14:14:01 +0000 Subject: [PATCH 2/6] add test for evaluate at edges --- .../test_finite_volume/test_finite_volume.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py index 5f311c75d4..0ac1df0199 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py @@ -673,6 +673,19 @@ def test_evaluate_at(self): y = np.arange(n)[:, np.newaxis] assert evaluate_at_disc.evaluate(y=y) == y[idx] + disc.bcs = { + var: { + "left": (pybamm.Scalar(0), "Dirichlet"), + "right": (pybamm.Scalar(n - 1), "Dirichlet"), + } + } + position = pybamm.Scalar(mesh["negative electrode"].edges[-1]) + downwind_var = pybamm.downwind(var) + evaluate_at = pybamm.EvaluateAt(downwind_var, position) + evaluate_at_disc = disc.process_symbol(evaluate_at) + + assert evaluate_at_disc.evaluate(y=y) == n - 1 + mesh = get_mesh_for_testing_symbolic() spatial_methods = {"domain": pybamm.FiniteVolume()} var = pybamm.Variable("var", domain="domain") From 5bdedfe1a1cc32a2ebb1284b1d8046b8235b7146 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Wed, 17 Sep 2025 15:30:31 +0000 Subject: [PATCH 3/6] coverage --- .../test_finite_volume/test_finite_volume.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py index 0ac1df0199..218506b6f9 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py @@ -682,6 +682,9 @@ def test_evaluate_at(self): position = pybamm.Scalar(mesh["negative electrode"].edges[-1]) downwind_var = pybamm.downwind(var) evaluate_at = pybamm.EvaluateAt(downwind_var, position) + + assert evaluate_at.evaluates_on_edges("primary") is False + evaluate_at_disc = disc.process_symbol(evaluate_at) assert evaluate_at_disc.evaluate(y=y) == n - 1 From a7e21e9e422d5cfe30be849c00ba1bf89c7b87a2 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Mon, 29 Sep 2025 18:25:48 +0000 Subject: [PATCH 4/6] add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87b428edc3..c36387a23a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Added support for algebraic and differential surface form in composite models. ([#5165](https://github.com/pybamm-team/PyBaMM/pull/5165)) - Adds a composite electrode electrode soh model ([#5160](https://github.com/pybamm-team/PyBaMM/pull/5129)) - Generalises `set_initial_soc` to `set_initial_state` and adds Thevenin initial state setting. ([#5129](https://github.com/pybamm-team/PyBaMM/pull/5129)) +- EvaluateAt symbol: add support for children evaluated at edges ([#5901](https://github.com/pybamm-team/PyBaMM/pull/5190)) ## Bug fixes From 8f9748d2328496ca744ee43df083cde71df58ba7 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Wed, 1 Oct 2025 08:25:31 +0100 Subject: [PATCH 5/6] Update CHANGELOG.md Co-authored-by: Ferran Brosa Planella --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c36387a23a..cc2bc47bda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - Added support for algebraic and differential surface form in composite models. ([#5165](https://github.com/pybamm-team/PyBaMM/pull/5165)) - Adds a composite electrode electrode soh model ([#5160](https://github.com/pybamm-team/PyBaMM/pull/5129)) - Generalises `set_initial_soc` to `set_initial_state` and adds Thevenin initial state setting. ([#5129](https://github.com/pybamm-team/PyBaMM/pull/5129)) -- EvaluateAt symbol: add support for children evaluated at edges ([#5901](https://github.com/pybamm-team/PyBaMM/pull/5190)) +- EvaluateAt symbol: add support for children evaluated at edges ([#5190](https://github.com/pybamm-team/PyBaMM/pull/5190)) ## Bug fixes From 491219efebf552ccefac759a7e06430783c0d68a Mon Sep 17 00:00:00 2001 From: Ferran Brosa Planella Date: Mon, 6 Oct 2025 10:35:42 +0100 Subject: [PATCH 6/6] Change order in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc2bc47bda..5f46b4b175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,11 @@ ## Features - Added the `num_steps_no_progress` and `t_no_progress` options in the `IDAKLUSolver` to early terminate the simulation if little progress is detected. ([#5201](https://github.com/pybamm-team/PyBaMM/pull/5201)) +- EvaluateAt symbol: add support for children evaluated at edges ([#5190](https://github.com/pybamm-team/PyBaMM/pull/5190)) - Added helper functions to import external 3D meshes in PyBaMM ([#5162](https://github.com/pybamm-team/PyBaMM/pull/5162)) - Added support for algebraic and differential surface form in composite models. ([#5165](https://github.com/pybamm-team/PyBaMM/pull/5165)) - Adds a composite electrode electrode soh model ([#5160](https://github.com/pybamm-team/PyBaMM/pull/5129)) - Generalises `set_initial_soc` to `set_initial_state` and adds Thevenin initial state setting. ([#5129](https://github.com/pybamm-team/PyBaMM/pull/5129)) -- EvaluateAt symbol: add support for children evaluated at edges ([#5190](https://github.com/pybamm-team/PyBaMM/pull/5190)) ## Bug fixes