Skip to content

Commit c16b916

Browse files
committedNov 14, 2019
#492 reformat constant current to be a submodel
1 parent 81bc4b6 commit c16b916

12 files changed

+105
-29
lines changed
 

‎examples/scripts/compare_lead_acid_3D.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,20 @@
2121
# {"current collector": "potential pair", "dimensionality": 2}, name="2+1D LOQS"
2222
# ),
2323
pybamm.lead_acid.Full(
24-
{"current collector": "potential pair", "dimensionality": 1}, name="1+1D Full"
24+
{"current collector": "uniform", "dimensionality": 1}, name="1+1D Full"
2525
),
2626
# pybamm.lead_acid.Full(
2727
# {"dimensionality": 1}, name="1+1D uniform Full"
2828
# ),
2929
pybamm.lead_acid.Composite(
30-
{"current collector": "potential pair quite conductive", "dimensionality": 1},
31-
name="1+1D composite",
30+
{"current collector": "uniform", "dimensionality": 1}, name="1+1D composite"
3231
),
3332
pybamm.lead_acid.Composite(
34-
{"current collector": "potential pair", "dimensionality": 1},
35-
name="1+1D composite",
33+
{"current collector": "uniform", "dimensionality": 1}, name="1+1D composite"
3634
),
3735
# # pybamm.lead_acid.Composite({"dimensionality": 1}, name="composite"),
3836
pybamm.lead_acid.LOQS(
39-
{"current collector": "potential pair", "dimensionality": 1}, name="1+1D LOQS"
37+
{"current collector": "uniform", "dimensionality": 1}, name="1+1D LOQS"
4038
),
4139
# pybamm.lead_acid.LOQS({"dimensionality": 1}, name="LOQS"),
4240
]

‎pybamm/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def version(formatted=False):
159159
current_collector,
160160
electrolyte,
161161
electrode,
162+
external_circuit,
162163
interface,
163164
oxygen_diffusion,
164165
particle,

‎pybamm/models/full_battery_models/base_battery_model.py

+19-13
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def options(self):
141141
@options.setter
142142
def options(self, extra_options):
143143
default_options = {
144+
"operating mode": "current",
144145
"dimensionality": 0,
145146
"surface form": False,
146147
"convection": False,
@@ -161,6 +162,10 @@ def options(self, extra_options):
161162
raise pybamm.OptionError("option {} not recognised".format(name))
162163

163164
# Some standard checks to make sure options are compatible
165+
if options["operating mode"] not in ["current", "potential"]:
166+
raise pybamm.OptionError(
167+
"operating mode '{}' not recognised".format(options["operating mode"])
168+
)
164169
if (
165170
isinstance(self, (pybamm.lead_acid.LOQS, pybamm.lead_acid.Composite))
166171
and options["surface form"] is False
@@ -341,18 +346,6 @@ def set_standard_output_variables(self):
341346

342347
self.variables = {}
343348

344-
# Current
345-
i_cell = pybamm.electrical_parameters.current_with_time
346-
i_cell_dim = pybamm.electrical_parameters.dimensional_current_density_with_time
347-
I = pybamm.electrical_parameters.dimensional_current_with_time
348-
self.variables.update(
349-
{
350-
"Total current density": i_cell,
351-
"Total current density [A.m-2]": i_cell_dim,
352-
"Current [A]": I,
353-
}
354-
)
355-
356349
# Time
357350
time_scale = pybamm.electrical_parameters.timescale
358351
self.variables.update(
@@ -361,7 +354,6 @@ def set_standard_output_variables(self):
361354
"Time [s]": pybamm.t * time_scale,
362355
"Time [min]": pybamm.t * time_scale / 60,
363356
"Time [h]": pybamm.t * time_scale / 3600,
364-
"Discharge capacity [A.h]": I * pybamm.t * time_scale / 3600,
365357
}
366358
)
367359

@@ -491,6 +483,20 @@ def build_model(self):
491483

492484
self._built = True
493485

486+
def set_external_circuit_submodel(self):
487+
"""
488+
Define how the external circuit defines the boundary conditions for the model,
489+
e.g. (not necessarily constant-) current, voltage, etc
490+
"""
491+
if self.options["operating mode"] == "current":
492+
self.submodels[
493+
"external circuit"
494+
] = pybamm.external_circuit.ConstantCurrent(self.param)
495+
if self.options["operating mode"] == "voltage":
496+
self.submodels[
497+
"external circuit"
498+
] = pybamm.external_circuit.ConstantVoltage(self.param)
499+
494500
def set_thermal_submodel(self):
495501

496502
if self.options["thermal"] == "isothermal":

‎pybamm/models/full_battery_models/lead_acid/base_lead_acid_model.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,5 @@ def set_soc_variables(self):
116116
if "Fractional Charge Input" not in self.variables:
117117
fci = pybamm.Variable("Fractional Charge Input", domain="current collector")
118118
self.variables["Fractional Charge Input"] = fci
119-
self.rhs[fci] = -self.param.current_with_time * 100
119+
self.rhs[fci] = -self.variables["Total current density"] * 100
120120
self.initial_conditions[fci] = self.param.q_init * 100

‎pybamm/models/submodels/current_collector/homogeneous_current_collector.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ class Uniform(BaseModel):
2121
def __init__(self, param):
2222
super().__init__(param)
2323

24-
def get_fundamental_variables(self):
24+
def get_derived_variables(self, variables):
2525

2626
# TODO: grad not implemented for 2D yet
2727
i_cc = pybamm.Scalar(0)
28+
import ipdb
29+
30+
ipdb.set_trace()
2831
i_boundary_cc = pybamm.PrimaryBroadcast(
29-
self.param.current_with_time, "current collector"
32+
variables["Total current density"], "current collector"
3033
)
3134
phi_s_cn = pybamm.PrimaryBroadcast(0, "current collector")
3235

‎pybamm/models/submodels/current_collector/potential_pair.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def set_algebraic(self, variables):
6060

6161
def set_initial_conditions(self, variables):
6262

63-
param = self.param
64-
applied_current = param.current_with_time
63+
applied_current = variables["Total current density"]
6564
cc_area = self._get_effective_current_collector_area()
6665
phi_s_cn = variables["Negative current collector potential"]
6766
i_boundary_cc = variables["Current collector current density"]
@@ -84,7 +83,7 @@ def set_boundary_conditions(self, variables):
8483
phi_s_cp = variables["Positive current collector potential"]
8584

8685
param = self.param
87-
applied_current = param.current_with_time
86+
applied_current = variables["Total current density"]
8887
cc_area = self._get_effective_current_collector_area()
8988

9089
# cc_area appears here due to choice of non-dimensionalisation
@@ -124,7 +123,7 @@ def set_boundary_conditions(self, variables):
124123
phi_s_cp = variables["Positive current collector potential"]
125124

126125
param = self.param
127-
applied_current = param.current_with_time
126+
applied_current = variables["Total current density"]
128127
cc_area = self._get_effective_current_collector_area()
129128

130129
# Note: we divide by the *numerical* tab area so that the correct total

‎pybamm/models/submodels/current_collector/quite_conductive_potential_pair.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def get_fundamental_variables(self):
4747
def set_algebraic(self, variables):
4848

4949
param = self.param
50-
applied_current = param.current_with_time
50+
applied_current = variables["Total current density"]
5151
cc_area = self._get_effective_current_collector_area()
5252
z = pybamm.standard_spatial_vars.z
5353

@@ -73,7 +73,7 @@ def set_algebraic(self, variables):
7373
def set_initial_conditions(self, variables):
7474

7575
param = self.param
76-
applied_current = param.current_with_time
76+
applied_current = variables["Total current density"]
7777
cc_area = self._get_effective_current_collector_area()
7878
phi_s_cn = variables["Negative current collector potential"]
7979
i_boundary_cc = variables["Current collector current density"]

‎pybamm/models/submodels/current_collector/set_potential_single_particle.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def set_algebraic(self, variables):
8585
def set_initial_conditions(self, variables):
8686

8787
param = self.param
88-
applied_current = param.current_with_time
88+
applied_current = variables["Total current density"]
8989
cc_area = self._get_effective_current_collector_area()
9090
phi_s_cn = variables["Negative current collector potential"]
9191
phi_s_cp = variables["Positive current collector potential"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from .base_external_circuit import BaseModel
2+
from .current_control_external_circuit import CurrentControl
3+
4+
# from .voltage_control_external_circuit import VoltageControl
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#
2+
# Base model for the external circuit
3+
#
4+
import pybamm
5+
6+
7+
class BaseModel(pybamm.BaseSubModel):
8+
"""Model to represent the behaviour of the external circuit. """
9+
10+
def __init__(self, param):
11+
super().__init__(param)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#
2+
# External circuit with current control
3+
#
4+
import pybamm
5+
from .base_external_circuit import BaseModel
6+
7+
8+
class CurrentControl(BaseModel):
9+
"""External circuit with current control. """
10+
11+
def __init__(self, param):
12+
super().__init__(param)
13+
14+
def get_fundamental_variables(self):
15+
# Current is given as a function of time
16+
i_cell = self.param.current_with_time
17+
i_cell_dim = self.param.dimensional_current_density_with_time
18+
I = self.param.dimensional_current_with_time
19+
20+
variables = {
21+
"Total current density": i_cell,
22+
"Total current density [A.m-2]": i_cell_dim,
23+
"Current [A]": I,
24+
"Discharge capacity [A.h]": I * pybamm.t * self.param.time_scale / 3600,
25+
}
26+
27+
return variables
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#
2+
# External circuit with voltage control
3+
#
4+
import pybamm
5+
from .base_external_circuit import BaseModel
6+
7+
8+
class VoltageControl(BaseModel):
9+
"""External circuit with voltage control. """
10+
11+
def __init__(self, param):
12+
super().__init__(param)
13+
14+
def get_fundamental_variables(self):
15+
# Current is given as a function of time
16+
i_cell = pybamm.electrical_parameters.current_with_time
17+
i_cell_dim = pybamm.electrical_parameters.dimensional_current_density_with_time
18+
I = pybamm.electrical_parameters.dimensional_current_with_time
19+
20+
variables = {
21+
"Total current density": i_cell,
22+
"Total current density [A.m-2]": i_cell_dim,
23+
"Current [A]": I,
24+
"Discharge capacity [A.h]": I * pybamm.t * self.param.time_scale / 3600,
25+
}
26+
27+
return variables

0 commit comments

Comments
 (0)