Skip to content

Commit 1f5c22c

Browse files
authored
Remove harmonic mean regularization (#4977)
* smaller magic number in `FunctionParameter` * remove regularization in harmonic mean change the functional form of the harmonic mean to reduce number of diffusion variables in codegen * fix tests * style * Update CHANGELOG.md
1 parent 1afcea2 commit 1f5c22c

File tree

6 files changed

+27
-14
lines changed

6 files changed

+27
-14
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# [Unreleased](https://github.com/pybamm-team/PyBaMM/)
22

3+
## Bug fixes
4+
5+
- Remove a regularization term in the harmonic mean. ([#4977](https://github.com/pybamm-team/PyBaMM/pull/4977))
6+
37
# [v25.4.0](https://github.com/pybamm-team/PyBaMM/tree/v25.4.0) - 2025-04-02
48

59
## Features

src/pybamm/expression_tree/parameter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ def _evaluate_for_shape(self):
217217
Returns the sum of the evaluated children
218218
See :meth:`pybamm.Symbol.evaluate_for_shape()`
219219
"""
220-
# add 1e-16 to avoid division by zero
221-
return sum(child.evaluate_for_shape() for child in self.children) + 1e-16
220+
# add 1e-300 to avoid division by zero
221+
return sum(child.evaluate_for_shape() for child in self.children) + 1e-300
222222

223223
def to_equation(self) -> sympy.Symbol:
224224
"""Convert the node and its subtree into a SymPy equation."""

src/pybamm/spatial_methods/finite_volume.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,7 @@ def harmonic_mean(array):
13341334
The harmonic mean is computed as
13351335
13361336
.. math::
1337-
D_{eff} = \\frac{D_1 D_2}{\\beta D_2 + (1 - \\beta) D_1},
1337+
D_{eff} = \\frac{1}{\\frac{\\beta}{D_1} + \\frac{1 - \\beta}{D_2}},
13381338
13391339
where
13401340
@@ -1409,8 +1409,7 @@ def harmonic_mean(array):
14091409

14101410
# dx_real = dx * length, therefore, beta is unchanged
14111411
# Compute harmonic mean on internal edges
1412-
# Note: add small number to denominator to regularise D_eff
1413-
D_eff = D1 * D2 / (D2 * beta + D1 * (1 - beta) + 1e-16)
1412+
D_eff = 1 / (beta / D1 + (1 - beta) / D2)
14141413

14151414
# Matrix to pad zeros at the beginning and end of the array where
14161415
# the exterior edge values will be added
@@ -1452,8 +1451,7 @@ def harmonic_mean(array):
14521451
beta = pybamm.Array(np.kron(np.ones((second_dim_repeats, 1)), sub_beta))
14531452

14541453
# Compute harmonic mean on nodes
1455-
# Note: add small number to denominator to regularise D_eff
1456-
D_eff = D1 * D2 / (D2 * beta + D1 * (1 - beta) + 1e-16)
1454+
D_eff = 1 / (beta / D1 + (1 - beta) / D2)
14571455

14581456
return D_eff
14591457

tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_compare_basic_models.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ def test_compare_dfns(self):
1313
dfn = pybamm.lithium_ion.DFN()
1414

1515
# Solve basic DFN
16-
basic_sim = pybamm.Simulation(basic_dfn, parameter_values=parameter_values)
16+
solver = pybamm.IDAKLUSolver(atol=1e-8, rtol=1e-8)
17+
basic_sim = pybamm.Simulation(
18+
basic_dfn, parameter_values=parameter_values, solver=solver
19+
)
1720
t_eval = [0, 3600]
1821
t_interp = np.linspace(0, 3600)
1922
basic_sim.solve(t_eval=t_eval, t_interp=t_interp)
2023
basic_sol = basic_sim.solution
2124

2225
# Solve main DFN
23-
sim = pybamm.Simulation(dfn, parameter_values=parameter_values)
26+
sim = pybamm.Simulation(dfn, parameter_values=parameter_values, solver=solver)
2427
sim.solve(t_eval=t_eval, t_interp=t_interp)
2528
sol = sim.solution
2629

@@ -43,7 +46,10 @@ def test_compare_dfns_composite(self):
4346
parameter_values = pybamm.ParameterValues("Chen2020_composite")
4447

4548
# Solve basic DFN
46-
basic_sim = pybamm.Simulation(basic_dfn, parameter_values=parameter_values)
49+
solver = pybamm.IDAKLUSolver(atol=1e-8, rtol=1e-8)
50+
basic_sim = pybamm.Simulation(
51+
basic_dfn, parameter_values=parameter_values, solver=solver
52+
)
4753
t_eval = [0, 3600]
4854
t_interp = np.linspace(0, 3600)
4955
basic_sim.solve(t_eval=t_eval, t_interp=t_interp)
@@ -69,14 +75,17 @@ def test_compare_spms(self):
6975
spm = pybamm.lithium_ion.SPM()
7076

7177
# Solve basic SPM
72-
basic_sim = pybamm.Simulation(basic_spm, parameter_values=parameter_values)
78+
solver = pybamm.IDAKLUSolver(atol=1e-8, rtol=1e-8)
79+
basic_sim = pybamm.Simulation(
80+
basic_spm, parameter_values=parameter_values, solver=solver
81+
)
7382
t_eval = [0, 3600]
7483
t_interp = np.linspace(0, 3600)
7584
basic_sim.solve(t_eval=t_eval, t_interp=t_interp)
7685
basic_sol = basic_sim.solution
7786

7887
# Solve main SPM
79-
sim = pybamm.Simulation(spm, parameter_values=parameter_values)
88+
sim = pybamm.Simulation(spm, parameter_values=parameter_values, solver=solver)
8089
sim.solve(t_eval=t_eval, t_interp=t_interp)
8190
sol = sim.solution
8291

tests/unit/test_experiments/test_experiment.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,8 @@ def test_voltage_without_directions(self):
276276
step = pybamm.step.voltage(2.5, termination="2.5 V")
277277
experiment = pybamm.Experiment([step])
278278

279-
sim = pybamm.Simulation(model, experiment=experiment)
279+
solver = pybamm.IDAKLUSolver(atol=1e-8, rtol=1e-8)
280+
sim = pybamm.Simulation(model, experiment=experiment, solver=solver)
280281

281282
sim.solve()
282283
solution = sim.solution

tests/unit/test_experiments/test_simulation_with_experiment.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ def test_run_experiment(self):
7373
temperature="-14oC",
7474
)
7575
model = pybamm.lithium_ion.SPM()
76-
sim = pybamm.Simulation(model, experiment=experiment)
76+
solver = pybamm.IDAKLUSolver(atol=1e-8, rtol=1e-8)
77+
sim = pybamm.Simulation(model, experiment=experiment, solver=solver)
7778
# test the callback here
7879
sol = sim.solve(callbacks=pybamm.callbacks.Callback())
7980
assert sol.termination == "final time"

0 commit comments

Comments
 (0)