Skip to content

Commit 3f609c1

Browse files
committed
#2669 MPM half-cell
1 parent 5e2a92a commit 3f609c1

File tree

6 files changed

+122
-23
lines changed

6 files changed

+122
-23
lines changed

pybamm/geometry/battery_geometry.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,41 +44,56 @@ def battery_geometry(
4444
"separator": {"x_s": {"min": l_n, "max": l_n_l_s}},
4545
"positive electrode": {"x_p": {"min": l_n_l_s, "max": 1}},
4646
}
47+
4748
# Add particle domains
4849
if include_particles is True:
4950
zero_one = {"min": 0, "max": 1}
50-
geometry.update(
51-
{
52-
"negative particle": {"r_n": zero_one},
53-
"positive particle": {"r_p": zero_one},
54-
}
55-
)
5651
for domain in ["negative", "positive"]:
57-
phases = int(getattr(options, domain)["particle phases"])
58-
if phases >= 2:
52+
if options.electrode_types[domain] == "porous":
5953
geometry.update(
6054
{
61-
f"{domain} primary particle": {"r_n_prim": zero_one},
62-
f"{domain} secondary particle": {"r_n_sec": zero_one},
55+
f"{domain} particle": {f"r_{domain[0]}": zero_one},
6356
}
6457
)
58+
phases = int(getattr(options, domain)["particle phases"])
59+
if phases >= 2:
60+
geometry.update(
61+
{
62+
f"{domain} primary particle": {
63+
f"r_{domain[0]}_prim": zero_one
64+
},
65+
f"{domain} secondary particle": {
66+
f"r_{domain[0]}_sec": zero_one
67+
},
68+
}
69+
)
70+
6571
# Add particle size domains
66-
if options is not None and options.negative["particle size"] == "distribution":
72+
if (
73+
options is not None
74+
and options.negative["particle size"] == "distribution"
75+
and options.electrode_types["negative"] == "porous"
76+
):
6777
R_min_n = geo.n.prim.R_min
6878
R_max_n = geo.n.prim.R_max
6979
geometry.update(
7080
{
7181
"negative particle size": {"R_n": {"min": R_min_n, "max": R_max_n}},
7282
}
7383
)
74-
if options is not None and options.positive["particle size"] == "distribution":
84+
if (
85+
options is not None
86+
and options.positive["particle size"] == "distribution"
87+
and options.electrode_types["positive"] == "porous"
88+
):
7589
R_min_p = geo.p.prim.R_min
7690
R_max_p = geo.p.prim.R_max
7791
geometry.update(
7892
{
7993
"positive particle size": {"R_p": {"min": R_min_p, "max": R_max_p}},
8094
}
8195
)
96+
8297
# Add current collector domains
8398
current_collector_dimension = options["dimensionality"]
8499
if form_factor == "pouch":

pybamm/models/full_battery_models/lithium_ion/mpm.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,7 @@ def __init__(self, options=None, name="Many-Particle Model", build=True):
5454
@property
5555
def default_parameter_values(self):
5656
default_params = super().default_parameter_values
57-
default_params = pybamm.get_size_distribution_parameters(default_params)
57+
default_params = pybamm.get_size_distribution_parameters(
58+
default_params, electrode=self.options["working electrode"]
59+
)
5860
return default_params

pybamm/models/submodels/interface/kinetics/base_kinetics.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ def get_coupled_variables(self, variables):
8282
# Get exchange-current density
8383
j0 = self._get_exchange_current_density(variables)
8484
# Get open-circuit potential variables and reaction overpotential
85-
if domain_options["particle size"] == "distribution":
85+
if (
86+
domain_options["particle size"] == "distribution"
87+
and self.options.electrode_types[domain] == "porous"
88+
):
8689
ocp = variables[
8790
f"{Domain} electrode {reaction_name}open circuit potential distribution"
8891
]

pybamm/parameters/size_distribution_parameters.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
"""
2-
Adding particle-size distribution parameter values to a parameter set
3-
"""
4-
5-
1+
#
2+
# Helper function for adding particle-size distribution parameter values
3+
# to a parameter set
4+
#
65
import pybamm
76
import numpy as np
87

tests/unit/test_geometry/test_battery_geometry.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ def test_geometry(self):
5959
self.assertEqual(geometry["negative primary particle"]["r_n_prim"]["max"], 1)
6060
self.assertEqual(geometry["negative secondary particle"]["r_n_sec"]["min"], 0)
6161
self.assertEqual(geometry["negative secondary particle"]["r_n_sec"]["max"], 1)
62-
self.assertEqual(geometry["positive primary particle"]["r_n_prim"]["min"], 0)
63-
self.assertEqual(geometry["positive primary particle"]["r_n_prim"]["max"], 1)
64-
self.assertEqual(geometry["positive secondary particle"]["r_n_sec"]["min"], 0)
65-
self.assertEqual(geometry["positive secondary particle"]["r_n_sec"]["max"], 1)
62+
self.assertEqual(geometry["positive primary particle"]["r_p_prim"]["min"], 0)
63+
self.assertEqual(geometry["positive primary particle"]["r_p_prim"]["max"], 1)
64+
self.assertEqual(geometry["positive secondary particle"]["r_p_sec"]["min"], 0)
65+
self.assertEqual(geometry["positive secondary particle"]["r_p_sec"]["max"], 1)
6666

6767
def test_geometry_error(self):
6868
with self.assertRaisesRegex(pybamm.GeometryError, "Invalid current"):
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#
2+
# Tests for the lithium-ion MPM model
3+
#
4+
import pybamm
5+
import unittest
6+
7+
8+
class TestMPM(unittest.TestCase):
9+
def test_well_posed(self):
10+
options = {"thermal": "isothermal", "working electrode": "positive"}
11+
model = pybamm.lithium_ion.MPM(options)
12+
model.check_well_posedness()
13+
14+
# Test build after init
15+
model = pybamm.lithium_ion.MPM({"working electrode": "positive"}, build=False)
16+
model.build_model()
17+
model.check_well_posedness()
18+
19+
def test_default_parameter_values(self):
20+
# check default parameters are added correctly
21+
model = pybamm.lithium_ion.MPM({"working electrode": "positive"})
22+
self.assertEqual(
23+
model.default_parameter_values[
24+
"Positive area-weighted mean particle radius [m]"
25+
],
26+
5.3e-06,
27+
)
28+
29+
def test_lumped_thermal_model_1D(self):
30+
options = {"thermal": "lumped", "working electrode": "positive"}
31+
model = pybamm.lithium_ion.MPM(options)
32+
model.check_well_posedness()
33+
34+
def test_particle_uniform(self):
35+
options = {"particle": "uniform profile", "working electrode": "positive"}
36+
model = pybamm.lithium_ion.MPM(options)
37+
model.check_well_posedness()
38+
39+
def test_differential_surface_form(self):
40+
options = {
41+
"surface form": "differential",
42+
"working electrode": "positive",
43+
}
44+
model = pybamm.lithium_ion.MPM(options)
45+
model.check_well_posedness()
46+
47+
48+
class TestMPMExternalCircuits(unittest.TestCase):
49+
def test_well_posed_voltage(self):
50+
options = {"operating mode": "voltage", "working electrode": "positive"}
51+
model = pybamm.lithium_ion.MPM(options)
52+
model.check_well_posedness()
53+
54+
def test_well_posed_power(self):
55+
options = {"operating mode": "power", "working electrode": "positive"}
56+
model = pybamm.lithium_ion.MPM(options)
57+
model.check_well_posedness()
58+
59+
def test_well_posed_function(self):
60+
def external_circuit_function(variables):
61+
I = variables["Current [A]"]
62+
V = variables["Terminal voltage [V]"]
63+
return V + I - pybamm.FunctionParameter("Function", {"Time [s]": pybamm.t})
64+
65+
options = {
66+
"operating mode": external_circuit_function,
67+
"working electrode": "positive",
68+
}
69+
model = pybamm.lithium_ion.MPM(options)
70+
model.check_well_posedness()
71+
72+
73+
if __name__ == "__main__":
74+
print("Add -v for more debug output")
75+
import sys
76+
77+
if "-v" in sys.argv:
78+
debug = True
79+
pybamm.settings.debug_mode = True
80+
unittest.main()

0 commit comments

Comments
 (0)