Skip to content

Commit 9aeae8b

Browse files
#836 coverage
1 parent cc041dd commit 9aeae8b

File tree

11 files changed

+106
-76
lines changed

11 files changed

+106
-76
lines changed

examples/scripts/cycling_ageing_yang.py

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"Electrolyte concentration [mol.m-3]",
4545
"Total negative electrode sei thickness",
4646
"Negative electrode porosity",
47+
"X-averaged negative electrode porosity",
4748
"Negative electrode sei interfacial current density [A.m-2]",
4849
"X-averaged total negative electrode sei thickness [m]",
4950
]

pybamm/models/submodels/interface/sei/base_sei.py

+59-25
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,6 @@ def _get_standard_thickness_variables(self, L_inner, L_outer):
6363
L_inner_av = pybamm.x_average(L_inner)
6464
L_outer_av = pybamm.x_average(L_outer)
6565

66-
L_sei = L_inner + L_outer
67-
L_sei_av = pybamm.x_average(L_sei)
68-
6966
n_inner = L_inner # inner SEI concentration
7067
n_outer = L_outer # outer SEI concentration
7168
n_inner_av = pybamm.x_average(L_inner)
@@ -87,10 +84,6 @@ def _get_standard_thickness_variables(self, L_inner, L_outer):
8784
"Outer " + domain + " sei thickness [m]": L_outer * L_scale,
8885
"X-averaged outer " + domain + " sei thickness": L_outer_av,
8986
"X-averaged outer " + domain + " sei thickness [m]": L_outer_av * L_scale,
90-
"Total " + domain + " sei thickness": L_sei,
91-
"Total " + domain + " sei thickness [m]": L_sei * L_scale,
92-
"X-averaged total " + domain + " sei thickness": L_sei_av,
93-
"X-averaged total " + domain + " sei thickness [m]": L_sei_av * L_scale,
9487
"Inner " + domain + " sei concentration [mol.m-3]": n_inner * n_scale,
9588
"X-averaged inner "
9689
+ domain
@@ -104,24 +97,49 @@ def _get_standard_thickness_variables(self, L_inner, L_outer):
10497
"Loss of lithium to " + domain + " sei [mol]": Q_sei * n_scale,
10598
}
10699

100+
L_sei = L_inner + L_outer
101+
102+
variables.update(self._get_standard_total_thickness_variables(L_sei))
103+
104+
return variables
105+
106+
def _get_standard_total_thickness_variables(self, L_sei):
107+
"Update variables related to total SEI thickness"
108+
domain = self.domain.lower() + " electrode"
109+
if isinstance(self, pybamm.sei.NoSEI):
110+
L_scale = 1
111+
else:
112+
L_scale = self.param.L_sei_0_dim
113+
R_sei_dim = self.param.R_sei_dimensional
114+
L_sei_av = pybamm.x_average(L_sei)
115+
116+
variables = {
117+
"Total " + domain + " sei thickness": L_sei,
118+
"Total " + domain + " sei thickness [m]": L_sei * L_scale,
119+
"X-averaged total " + domain + " sei thickness": L_sei_av,
120+
"X-averaged total " + domain + " sei thickness [m]": L_sei_av * L_scale,
121+
"X-averaged "
122+
+ self.domain.lower()
123+
+ " electrode resistance [Ohm.m2]": L_sei_av * L_scale * R_sei_dim,
124+
}
107125
return variables
108126

109127
def _get_standard_reaction_variables(self, j_inner, j_outer):
110128
"""
111-
A private function to obtain the standard variables which
112-
can be derived from the SEI interfacial reaction current
113-
114-
Parameters
115-
----------
116-
j_inner : :class:`pybamm.Symbol`
117-
The inner SEI interfacial reaction current.
118-
j_outer : :class:`pybamm.Symbol`
119-
The outer SEI interfacial reaction current.
120-
121-
Returns
122-
-------
123-
variables : dict
124-
The variables which can be derived from the SEI thicknesses.
129+
A private function to obtain the standard variables which
130+
can be derived from the SEI interfacial reaction current
131+
132+
Parameters
133+
----------
134+
j_inner : :class:`pybamm.Symbol`
135+
The inner SEI interfacial reaction current.
136+
j_outer : :class:`pybamm.Symbol`
137+
The outer SEI interfacial reaction current.
138+
139+
Returns
140+
-------
141+
variables : dict
142+
The variables which can be derived from the SEI thicknesses.
125143
"""
126144
if self.domain == "Negative":
127145
j_scale = self.param.j_scale_n
@@ -130,11 +148,7 @@ def _get_standard_reaction_variables(self, j_inner, j_outer):
130148
j_i_av = pybamm.x_average(j_inner)
131149
j_o_av = pybamm.x_average(j_outer)
132150

133-
j_sei = j_inner + j_outer
134-
j_sei_av = pybamm.x_average(j_sei)
135-
136151
domain = self.domain.lower() + " electrode"
137-
Domain = domain.capitalize()
138152

139153
variables = {
140154
"Inner " + domain + " sei interfacial current density": j_inner,
@@ -153,6 +167,26 @@ def _get_standard_reaction_variables(self, j_inner, j_outer):
153167
"X-averaged outer "
154168
+ domain
155169
+ " sei interfacial current density [A.m-2]": j_o_av * j_scale,
170+
}
171+
172+
j_sei = j_inner + j_outer
173+
variables.update(self._get_standard_total_reaction_variables(j_sei))
174+
175+
return variables
176+
177+
def _get_standard_total_reaction_variables(self, j_sei):
178+
"Update variables related to total SEI interfacial current density"
179+
if self.domain == "Negative":
180+
j_scale = self.param.j_scale_n
181+
elif self.domain == "Positive":
182+
j_scale = self.param.j_scale_p
183+
184+
j_sei_av = pybamm.x_average(j_sei)
185+
186+
domain = self.domain.lower() + " electrode"
187+
Domain = domain.capitalize()
188+
189+
variables = {
156190
Domain + " sei interfacial current density": j_sei,
157191
Domain + " sei interfacial current density [A.m-2]": j_sei * j_scale,
158192
"X-averaged " + domain + " sei interfacial current density": j_sei_av,

pybamm/models/submodels/interface/sei/ec_reaction_limited.py

+16-45
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,9 @@ def get_fundamental_variables(self):
3333
domain=self.domain.lower() + " electrode",
3434
auxiliary_domains={"secondary": "current collector"},
3535
)
36-
L_sei_av = pybamm.x_average(L_sei)
37-
j_sei_av = pybamm.x_average(j_sei)
38-
39-
L_scale = self.param.L_sei_0_dim
40-
# in this model the scale is identical to the intercalation current
41-
j_scale = self.param.j_scale_n
42-
R_sei_dim = self.param.R_sei_dimensional
43-
44-
variables = {
45-
"Total " + self.domain.lower() + " electrode sei thickness": L_sei,
46-
"Total " + self.domain.lower() + " sei thickness [m]": L_sei * L_scale,
47-
"X-averaged total "
48-
+ self.domain.lower()
49-
+ " electrode sei thickness": L_sei_av,
50-
"X-averaged total "
51-
+ self.domain.lower()
52-
+ " electrode sei thickness [m]": L_sei_av * L_scale,
53-
self.domain + " electrode sei interfacial current density": j_sei,
54-
self.domain + " electrode scaled sei interfacial current density": j_sei,
55-
self.domain
56-
+ " electrode sei interfacial current density [A.m-2]": j_sei * j_scale,
57-
"X-averaged "
58-
+ self.domain.lower()
59-
+ " electrode sei interfacial current density": j_sei_av,
60-
"X-averaged "
61-
+ self.domain.lower()
62-
+ " electrode sei interfacial current density [A.m-2]": j_sei_av * j_scale,
63-
"X-averaged "
64-
+ self.domain.lower()
65-
+ " electrode scaled sei interfacial current density": j_sei_av,
66-
"X-averaged "
67-
+ self.domain.lower()
68-
+ " electrode resistance [Ohm.m2]": L_sei_av * L_scale * R_sei_dim,
69-
}
36+
37+
variables = self._get_standard_total_thickness_variables(L_sei)
38+
variables.update(self._get_standard_total_reaction_variables(j_sei))
7039

7140
return variables
7241

@@ -81,17 +50,19 @@ def get_coupled_variables(self, variables):
8150

8251
c_ec = pybamm.Scalar(1) + j_sei * L_sei * C_ec
8352
c_ec_av = pybamm.x_average(c_ec)
84-
variables = {
85-
self.domain + " electrode EC surface concentration": c_ec,
86-
self.domain
87-
+ " electrode EC surface concentration [mol.m-3]": c_ec * c_scale,
88-
"X-averaged "
89-
+ self.domain.lower()
90-
+ " electrode EC surface concentration": c_ec_av,
91-
"X-averaged "
92-
+ self.domain.lower()
93-
+ " electrode EC surface concentration": c_ec_av * c_scale,
94-
}
53+
variables.update(
54+
{
55+
self.domain + " electrode EC surface concentration": c_ec,
56+
self.domain
57+
+ " electrode EC surface concentration [mol.m-3]": c_ec * c_scale,
58+
"X-averaged "
59+
+ self.domain.lower()
60+
+ " electrode EC surface concentration": c_ec_av,
61+
"X-averaged "
62+
+ self.domain.lower()
63+
+ " electrode EC surface concentration": c_ec_av * c_scale,
64+
}
65+
)
9566
# Update whole cell variables, which also updates the "sum of" variables
9667
if (
9768
"Negative electrode sei interfacial current density" in variables

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
161161
modeltest.test_all()
162162

163163
def test_well_posed_ec_reaction_limited(self):
164-
options = {"sei": "ec reaction limited"}
164+
options = {"sei": "ec reaction limited", "sei porosity change": True}
165165
model = pybamm.lithium_ion.DFN(options)
166166
modeltest = tests.StandardModelTest(model)
167167
modeltest.test_all()

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
142142
modeltest.test_all()
143143

144144
def test_well_posed_ec_reaction_limited(self):
145-
options = {"sei": "ec reaction limited"}
145+
options = {"sei": "ec reaction limited", "sei porosity change": True}
146146
model = pybamm.lithium_ion.SPM(options)
147147
modeltest = tests.StandardModelTest(model)
148148
modeltest.test_all()

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
134134
modeltest.test_all()
135135

136136
def test_well_posed_ec_reaction_limited(self):
137-
options = {"sei": "ec reaction limited"}
137+
options = {"sei": "ec reaction limited", "sei porosity change": True}
138138
model = pybamm.lithium_ion.SPMe(options)
139139
modeltest = tests.StandardModelTest(model)
140140
modeltest.test_all()

tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_dfn.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
136136
model.check_well_posedness()
137137

138138
def test_well_posed_ec_reaction_limited(self):
139-
options = {"sei": "ec reaction limited"}
139+
options = {"sei": "ec reaction limited", "sei porosity change": True}
140140
model = pybamm.lithium_ion.DFN(options)
141141
model.check_well_posedness()
142142

tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
149149
model.check_well_posedness()
150150

151151
def test_well_posed_ec_reaction_limited(self):
152-
options = {"sei": "ec reaction limited"}
152+
options = {"sei": "ec reaction limited", "sei porosity change": True}
153153
model = pybamm.lithium_ion.SPM(options)
154154
model.check_well_posedness()
155155

tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spme.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def test_well_posed_interstitial_diffusion_limited(self):
126126
model.check_well_posedness()
127127

128128
def test_well_posed_ec_reaction_limited(self):
129-
options = {"sei": "ec reaction limited"}
129+
options = {"sei": "ec reaction limited", "sei porosity change": True}
130130
model = pybamm.lithium_ion.SPMe(options)
131131
model.check_well_posedness()
132132

tests/unit/test_models/test_submodels/test_interface/test_sei/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#
2+
# Test base SEI submodel
3+
#
4+
import pybamm
5+
import unittest
6+
7+
8+
class TestBaseSEI(unittest.TestCase):
9+
def test_not_implemented(self):
10+
with self.assertRaisesRegex(
11+
NotImplementedError,
12+
"SEI models are not implemented for the positive electrode",
13+
):
14+
pybamm.sei.ReactionLimited(None, "Positive")
15+
16+
17+
if __name__ == "__main__":
18+
print("Add -v for more debug output")
19+
import sys
20+
21+
if "-v" in sys.argv:
22+
debug = True
23+
pybamm.settings.debug_mode = True
24+
unittest.main()

0 commit comments

Comments
 (0)