Skip to content

Commit 7b748f8

Browse files
Merge pull request #1731 from pybamm-team/li-metal-spm
Li metal spm
2 parents 93ead88 + bfd4df3 commit 7b748f8

File tree

20 files changed

+564
-310
lines changed

20 files changed

+564
-310
lines changed

examples/scripts/DFN_half_cell.py

Lines changed: 0 additions & 58 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#
2+
# Compare half-cell lithium-ion battery models
3+
#
4+
import pybamm
5+
6+
pybamm.set_logging_level("INFO")
7+
8+
# load models
9+
models = [
10+
pybamm.lithium_ion.SPM({"working electrode": "positive"}),
11+
pybamm.lithium_ion.SPMe({"working electrode": "positive"}),
12+
pybamm.lithium_ion.DFN({"working electrode": "positive"}),
13+
]
14+
15+
chemistry = pybamm.parameter_sets.Xu2019
16+
param = pybamm.ParameterValues(chemistry=chemistry)
17+
18+
# create and run simulations
19+
sims = []
20+
for model in models:
21+
sim = pybamm.Simulation(model, parameter_values=param)
22+
sim.solve([0, 3600])
23+
sims.append(sim)
24+
25+
# plot
26+
pybamm.dynamic_plot(sims)

pybamm/models/full_battery_models/base_battery_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ def build_model(self):
715715

716716
# Massive hack for consistent delta_phi = phi_s - phi_e with SPMe
717717
# This needs to be corrected
718-
if isinstance(self, pybamm.lithium_ion.SPMe):
718+
if isinstance(self, pybamm.lithium_ion.SPMe) and not self.half_cell:
719719
for domain in ["Negative", "Positive"]:
720720
phi_s = self.variables[domain + " electrode potential"]
721721
phi_e = self.variables[domain + " electrolyte potential"]

pybamm/models/full_battery_models/lithium_ion/base_lithium_ion_model.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,42 @@ def set_porosity_submodel(self):
304304
self.submodels["porosity"] = pybamm.porosity.ReactionDriven(
305305
self.param, self.options, self.x_average
306306
)
307+
308+
def set_li_metal_counter_electrode_submodels(self):
309+
if self.options["SEI"] in ["none", "constant"]:
310+
self.submodels[
311+
"counter electrode potential"
312+
] = pybamm.electrode.ohm.LithiumMetalExplicit(self.param, self.options)
313+
self.submodels[
314+
"counter electrode interface"
315+
] = pybamm.interface.InverseButlerVolmer(
316+
self.param, "Negative", "lithium metal plating", self.options
317+
) # assuming symmetric reaction for now so we can take the inverse
318+
self.submodels[
319+
"counter electrode interface current"
320+
] = pybamm.interface.CurrentForInverseButlerVolmerLithiumMetal(
321+
self.param, "Negative", "lithium metal plating", self.options
322+
)
323+
else:
324+
self.submodels[
325+
"counter electrode potential"
326+
] = pybamm.electrode.ohm.LithiumMetalSurfaceForm(self.param, self.options)
327+
self.submodels[
328+
"counter electrode interface"
329+
] = pybamm.interface.ButlerVolmer(
330+
self.param, "Negative", "lithium metal plating", self.options
331+
)
332+
333+
# For half-cell models, remove negative electrode submodels
334+
# that are not needed before building
335+
# We do this whether the working electrode is 'positive' or 'negative' since
336+
# the half-cell models are always defined assuming the positive electrode is
337+
# the working electrode
338+
339+
# This should be done before `self.build_model`, which is the expensive part
340+
341+
# Models added specifically for the counter electrode have been labelled with
342+
# "counter electrode" so as not to be caught by this check
343+
self.submodels = {
344+
k: v for k, v in self.submodels.items() if not k.startswith("negative")
345+
}

pybamm/models/full_battery_models/lithium_ion/dfn.py

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,9 @@ def __init__(self, options=None, name="Doyle-Fuller-Newman model", build=True):
5151
self.set_sei_submodel()
5252
self.set_lithium_plating_submodel()
5353

54-
# For half-cell models, remove negative electrode submodels
55-
# that are not needed before building
56-
# We do this whether the working electrode is 'positive' or 'negative' since
57-
# the half-cell models are always defined assuming the positive electrode is
58-
# the working electrode
59-
# It's ok to only do this now since `build_model` is the expensive part
60-
if self.options["working electrode"] != "both":
61-
self.submodels = {
62-
k: v for k, v in self.submodels.items() if not k.startswith("negative")
63-
}
64-
# Models added specifically for the counter electrode should be labelled with
65-
# "counter electrode" so as not to be caught by this check
54+
if self.half_cell:
55+
# This also removes "negative electrode" submodels, so should be done last
56+
self.set_li_metal_counter_electrode_submodels()
6657

6758
if build:
6859
self.build_model()
@@ -87,27 +78,6 @@ def set_interfacial_submodel(self):
8778
self.param, "Positive", "lithium-ion main", self.options
8879
)
8980

90-
# Set the counter-electrode model for the half-cell model
91-
# The negative electrode model will be ignored
92-
if self.half_cell:
93-
if self.options["SEI"] in ["none", "constant"]:
94-
self.submodels[
95-
"counter electrode interface"
96-
] = pybamm.interface.InverseButlerVolmer(
97-
self.param, "Negative", "lithium metal plating", self.options
98-
) # assuming symmetric reaction for now so we can take the inverse
99-
self.submodels[
100-
"counter electrode interface current"
101-
] = pybamm.interface.CurrentForInverseButlerVolmerLithiumMetal(
102-
self.param, "Negative", "lithium metal plating", self.options
103-
)
104-
else:
105-
self.submodels[
106-
"counter electrode interface"
107-
] = pybamm.interface.ButlerVolmer(
108-
self.param, "Negative", "lithium metal plating", self.options
109-
)
110-
11181
def set_particle_submodel(self):
11282

11383
if isinstance(self.options["particle"], str):
@@ -166,20 +136,6 @@ def set_solid_submodel(self):
166136
self.submodels["negative electrode potential"] = submod_n
167137
self.submodels["positive electrode potential"] = submod_p
168138

169-
# Set the counter-electrode model for the half-cell model
170-
# The negative electrode model will be ignored
171-
if self.half_cell:
172-
if self.options["SEI"] in ["none", "constant"]:
173-
self.submodels[
174-
"counter electrode potential"
175-
] = pybamm.electrode.ohm.LithiumMetalExplicit(self.param, self.options)
176-
else:
177-
self.submodels[
178-
"counter electrode potential"
179-
] = pybamm.electrode.ohm.LithiumMetalSurfaceForm(
180-
self.param, self.options
181-
)
182-
183139
def set_electrolyte_submodel(self):
184140

185141
surf_form = pybamm.electrolyte_conductivity.surface_potential_form

pybamm/models/full_battery_models/lithium_ion/spm.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,18 @@ def __init__(self, options=None, name="Single Particle Model", build=True):
4444
self.set_interfacial_submodel()
4545
self.set_other_reaction_submodels_to_zero()
4646
self.set_particle_submodel()
47-
self.set_negative_electrode_submodel()
47+
self.set_solid_submodel()
4848
self.set_electrolyte_submodel()
49-
self.set_positive_electrode_submodel()
5049
self.set_thermal_submodel()
5150
self.set_current_collector_submodel()
5251

5352
self.set_sei_submodel()
5453
self.set_lithium_plating_submodel()
5554

55+
if self.half_cell:
56+
# This also removes "negative electrode" submodels, so should be done last
57+
self.set_li_metal_counter_electrode_submodels()
58+
5659
if build:
5760
self.build_model()
5861

@@ -63,10 +66,10 @@ def set_convection_submodel(self):
6366

6467
self.submodels[
6568
"through-cell convection"
66-
] = pybamm.convection.through_cell.NoConvection(self.param)
69+
] = pybamm.convection.through_cell.NoConvection(self.param, self.options)
6770
self.submodels[
6871
"transverse convection"
69-
] = pybamm.convection.transverse.NoConvection(self.param)
72+
] = pybamm.convection.transverse.NoConvection(self.param, self.options)
7073

7174
def set_interfacial_submodel(self):
7275

@@ -80,12 +83,12 @@ def set_interfacial_submodel(self):
8083
self.submodels[
8184
"negative interface current"
8285
] = pybamm.interface.CurrentForInverseButlerVolmer(
83-
self.param, "Negative", "lithium-ion main"
86+
self.param, "Negative", "lithium-ion main", self.options
8487
)
8588
self.submodels[
8689
"positive interface current"
8790
] = pybamm.interface.CurrentForInverseButlerVolmer(
88-
self.param, "Positive", "lithium-ion main"
91+
self.param, "Positive", "lithium-ion main", self.options
8992
)
9093
else:
9194
self.submodels["negative interface"] = pybamm.interface.ButlerVolmer(
@@ -123,17 +126,18 @@ def set_particle_submodel(self):
123126
self.param, domain, particle_side
124127
)
125128

126-
def set_negative_electrode_submodel(self):
129+
def set_solid_submodel(self):
127130

128131
self.submodels[
129132
"negative electrode potential"
130-
] = pybamm.electrode.ohm.LeadingOrder(self.param, "Negative")
131-
132-
def set_positive_electrode_submodel(self):
133-
133+
] = pybamm.electrode.ohm.LeadingOrder(
134+
self.param, "Negative", options=self.options
135+
)
134136
self.submodels[
135137
"positive electrode potential"
136-
] = pybamm.electrode.ohm.LeadingOrder(self.param, "Positive")
138+
] = pybamm.electrode.ohm.LeadingOrder(
139+
self.param, "Positive", options=self.options
140+
)
137141

138142
def set_electrolyte_submodel(self):
139143

@@ -149,7 +153,9 @@ def set_electrolyte_submodel(self):
149153
if self.options["surface form"] == "false":
150154
self.submodels[
151155
"leading-order electrolyte conductivity"
152-
] = pybamm.electrolyte_conductivity.LeadingOrder(self.param)
156+
] = pybamm.electrolyte_conductivity.LeadingOrder(
157+
self.param, options=self.options
158+
)
153159

154160
elif self.options["surface form"] == "differential":
155161
for domain in ["Negative", "Separator", "Positive"]:
@@ -165,4 +171,4 @@ def set_electrolyte_submodel(self):
165171

166172
self.submodels[
167173
"electrolyte diffusion"
168-
] = pybamm.electrolyte_diffusion.ConstantConcentration(self.param)
174+
] = pybamm.electrolyte_diffusion.ConstantConcentration(self.param, self.options)

0 commit comments

Comments
 (0)