Skip to content

Commit 3ef3e59

Browse files
committed
#492 added potentiostatic option to dfn
1 parent 0399aba commit 3ef3e59

File tree

3 files changed

+87
-42
lines changed
  • pybamm/models
  • tests/integration/test_models/test_full_battery_models/test_lithium_ion

3 files changed

+87
-42
lines changed

pybamm/models/full_battery_models/lithium_ion/dfn.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ def set_particle_submodel(self):
6262
def set_solid_submodel(self):
6363

6464
self.submodels["negative electrode"] = pybamm.electrode.ohm.Full(
65-
self.param, "Negative", self.reactions
65+
self.param, "Negative", self.reactions, self.options
6666
)
6767
self.submodels["positive electrode"] = pybamm.electrode.ohm.Full(
68-
self.param, "Positive", self.reactions
68+
self.param, "Positive", self.reactions, self.options
6969
)
7070

7171
def set_electrolyte_submodel(self):

pybamm/models/submodels/electrode/ohm/full_ohm.py

+34-1
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ class Full(BaseModel):
1919
**Extends:** :class:`pybamm.electrode.ohm.BaseModel`
2020
"""
2121

22-
def __init__(self, param, domain, reactions):
22+
def __init__(self, param, domain, reactions, options=None):
2323
super().__init__(param, domain, reactions)
2424

25+
if options:
26+
self.options = options
27+
else:
28+
self.options = {"probelem type": "galvanostatic"}
29+
2530
def get_fundamental_variables(self):
2631

2732
if self.domain == "Negative":
@@ -68,6 +73,19 @@ def set_algebraic(self, variables):
6873

6974
def set_boundary_conditions(self, variables):
7075

76+
if self.options["problem type"] == "galvanostatic":
77+
self._set_galvanostatic_boundary_conditions(variables)
78+
elif self.options["problem type"] == "potentiostatic":
79+
self._set_potentiostatic_boundary_conditions(variables)
80+
else:
81+
raise pybamm.OptionError(
82+
"""The option 'problem type' must be either: 'galvanostatic'
83+
or 'potentiostatic' and not {}.""".format(
84+
self.options["problem type"]
85+
)
86+
)
87+
88+
def _set_galvanostatic_boundary_conditions(self, variables):
7189
phi_s = variables[self.domain + " electrode potential"]
7290
eps = variables[self.domain + " electrode porosity"]
7391
i_boundary_cc = variables["Current collector current density"]
@@ -86,6 +104,21 @@ def set_boundary_conditions(self, variables):
86104

87105
self.boundary_conditions[phi_s] = {"left": lbc, "right": rbc}
88106

107+
def _set_potentiostatic_boundary_conditions(self, variables):
108+
109+
phi_s = variables[self.domain + " electrode potential"]
110+
v = variables["Applied voltage"]
111+
112+
if self.domain == "Negative":
113+
lbc = (pybamm.Scalar(0), "Dirichlet")
114+
rbc = (pybamm.Scalar(0), "Neumann")
115+
116+
elif self.domain == "Positive":
117+
lbc = (pybamm.Scalar(0), "Neumann")
118+
rbc = (v, "Dirichlet")
119+
120+
self.boundary_conditions[phi_s] = {"left": lbc, "right": rbc}
121+
89122
def set_initial_conditions(self, variables):
90123

91124
phi_s = variables[self.domain + " electrode potential"]

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

+51-39
Original file line numberDiff line numberDiff line change
@@ -8,47 +8,59 @@
88
import unittest
99

1010

11+
def run_standard_dfn_tests(options):
12+
model = pybamm.lithium_ion.DFN(options)
13+
var = pybamm.standard_spatial_vars
14+
var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
15+
modeltest = tests.StandardModelTest(model, var_pts=var_pts)
16+
modeltest.test_all()
17+
18+
1119
@unittest.skipIf(pybamm.have_scikits_odes(), "scikits.odes not installed")
1220
class TestDFN(unittest.TestCase):
13-
def test_basic_processing(self):
14-
options = {"thermal": None}
15-
model = pybamm.lithium_ion.DFN(options)
16-
var = pybamm.standard_spatial_vars
17-
var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
18-
modeltest = tests.StandardModelTest(model, var_pts=var_pts)
19-
modeltest.test_all()
20-
21-
def test_optimisations(self):
22-
options = {"thermal": None}
23-
model = pybamm.lithium_ion.DFN(options)
24-
optimtest = tests.OptimisationsTest(model)
25-
26-
original = optimtest.evaluate_model()
27-
simplified = optimtest.evaluate_model(simplify=True)
28-
using_known_evals = optimtest.evaluate_model(use_known_evals=True)
29-
simp_and_known = optimtest.evaluate_model(simplify=True, use_known_evals=True)
30-
simp_and_python = optimtest.evaluate_model(simplify=True, to_python=True)
31-
np.testing.assert_array_almost_equal(original, simplified)
32-
np.testing.assert_array_almost_equal(original, using_known_evals)
33-
np.testing.assert_array_almost_equal(original, simp_and_known)
34-
35-
np.testing.assert_array_almost_equal(original, simp_and_python)
36-
37-
def test_full_thermal(self):
38-
options = {"thermal": "full"}
39-
model = pybamm.lithium_ion.DFN(options)
40-
var = pybamm.standard_spatial_vars
41-
var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
42-
modeltest = tests.StandardModelTest(model, var_pts=var_pts)
43-
modeltest.test_all()
44-
45-
def test_lumped_thermal(self):
46-
options = {"thermal": "lumped"}
47-
model = pybamm.lithium_ion.DFN(options)
48-
var = pybamm.standard_spatial_vars
49-
var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
50-
modeltest = tests.StandardModelTest(model, var_pts=var_pts)
51-
modeltest.test_all()
21+
# def test_basic_processing(self):
22+
# options = {"thermal": None}
23+
# model = pybamm.lithium_ion.DFN(options)
24+
# var = pybamm.standard_spatial_vars
25+
# var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
26+
# modeltest = tests.StandardModelTest(model, var_pts=var_pts)
27+
# modeltest.test_all()
28+
29+
# def test_optimisations(self):
30+
# options = {"thermal": None}
31+
# model = pybamm.lithium_ion.DFN(options)
32+
# optimtest = tests.OptimisationsTest(model)
33+
34+
# original = optimtest.evaluate_model()
35+
# simplified = optimtest.evaluate_model(simplify=True)
36+
# using_known_evals = optimtest.evaluate_model(use_known_evals=True)
37+
# simp_and_known = optimtest.evaluate_model(simplify=True, use_known_evals=True)
38+
# simp_and_python = optimtest.evaluate_model(simplify=True, to_python=True)
39+
# np.testing.assert_array_almost_equal(original, simplified)
40+
# np.testing.assert_array_almost_equal(original, using_known_evals)
41+
# np.testing.assert_array_almost_equal(original, simp_and_known)
42+
43+
# np.testing.assert_array_almost_equal(original, simp_and_python)
44+
45+
# def test_full_thermal(self):
46+
# options = {"thermal": "full"}
47+
# model = pybamm.lithium_ion.DFN(options)
48+
# var = pybamm.standard_spatial_vars
49+
# var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
50+
# modeltest = tests.StandardModelTest(model, var_pts=var_pts)
51+
# modeltest.test_all()
52+
53+
# def test_lumped_thermal(self):
54+
# options = {"thermal": "lumped"}
55+
# model = pybamm.lithium_ion.DFN(options)
56+
# var = pybamm.standard_spatial_vars
57+
# var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 5, var.r_p: 5}
58+
# modeltest = tests.StandardModelTest(model, var_pts=var_pts)
59+
# modeltest.test_all()
60+
61+
def test_potentiostatic(self):
62+
options = {"thermal": None, "problem type": "potentiostatic"}
63+
run_standard_dfn_tests(options)
5264

5365

5466
if __name__ == "__main__":

0 commit comments

Comments
 (0)