Skip to content

Commit a3b302e

Browse files
#492 updating current function and C-rate
1 parent 172f1ec commit a3b302e

File tree

46 files changed

+134
-132
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+134
-132
lines changed

examples/scripts/DFN.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
# load parameter values and process model and geometry
1717
param = model.default_parameter_values
18-
param["Voltage function"] = 4.1
18+
param["Voltage function [V]"] = 4.1
1919
param.process_model(model)
2020
param.process_geometry(geometry)
2121

examples/scripts/SPMe_SOC.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"Initial concentration in positive electrode [mol.m-3]": 25000,
5858
"Negative electrode surface area density [m-1]": 180000.0,
5959
"Positive electrode surface area density [m-1]": 150000.0,
60-
"Typical current [A]": I_app,
60+
"Current function [A]": I_app,
6161
}
6262
)
6363
param.process_model(model)

examples/scripts/charging_strategies.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
params = [model.default_parameter_values for model in models]
3333

3434
# 1. Charge at 1A
35-
params[0]["Typical current [A]"] = -0.1
35+
params[0]["Current function [A]"] = -0.1
3636

3737
# # 2. CV: Charge at 4.1V
38-
params[1]["Voltage function"] = 4.1
38+
params[1]["Voltage function [V]"] = 4.1
3939

4040
# 3. CP-CV: Charge at 4W
41-
params[2]["Power function"] = -0.4
41+
params[2]["Power function [W]"] = -0.4
4242

4343

4444
solutions = []

examples/scripts/compare_SPM_diffusion_models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
# load parameter values and process models and geometry
2525
param = models[0].default_parameter_values
26-
param.update({"Typical current [A]": 1})
26+
param.update({"Current function [A]": 1})
2727
for model in models:
2828
param.process_model(model)
2929

examples/scripts/compare_comsol/compare_comsol_DFN.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
param = pybamm_model.default_parameter_values
3434
param["Electrode width [m]"] = 1
3535
param["Electrode height [m]"] = 1
36-
param["Typical current [A]"] = 24 * C_rates[C_rate]
36+
param["Current function [A]"] = 24 * C_rates[C_rate]
3737
param.process_model(pybamm_model)
3838
param.process_geometry(geometry)
3939

examples/scripts/compare_comsol/discharge_curve.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
comsol_voltage = comsol_variables["voltage"]
5858

5959
# update current density
60-
param["Typical current [A]"] = 24 * C_rate
60+
param["Current function [A]"] = 24 * C_rate
6161
param.update_model(model, disc)
6262

6363
# discharge timescale

examples/scripts/compare_lead_acid.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
param = models[0].default_parameter_values
2929
param.update(
3030
{
31-
"Typical current [A]": 10,
31+
"Current function [A]": 10,
3232
"Initial State of Charge": 1,
33-
"Voltage function": 14 / 6,
33+
"Voltage function [V]": 14 / 6,
3434
}
3535
)
3636
for model in models:

examples/scripts/compare_lead_acid_3D.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
param = models[0].default_parameter_values
4646
param.update(
4747
{
48-
"Typical current [A]": 1,
48+
"Current function [A]": 1,
4949
"Bruggeman coefficient": 0.001,
5050
"Initial State of Charge": 1,
5151
"Typical electrolyte concentration [mol.m-3]": 5600,

examples/scripts/compare_lithium_ion.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
# load parameter values and process models and geometry
2828
param = models[0].default_parameter_values
29-
param["Typical current [A]"] = 1.0
29+
param["Current function [A]"] = 1.0
3030

3131
for model in models:
3232
param.process_model(model)

input/parameters/lead-acid/cells/BBOXX_Sulzer2019/parameters.csv

+1
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ Positive tab centre z-coordinate [m],0.114,Tab at top,
1616
,,,
1717
# Electrical,,,
1818
Cell capacity [A.h],17,Manufacturer,
19+
Typical current [A],1,,

input/parameters/lead-acid/experiments/1C_discharge_from_full/parameters.csv

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ Number of cells connected in series to make a battery,6,Manufacturer,
1111
Lower voltage cut-off [V],1.73,,(just under) 10.5V across 6-cell battery
1212
Upper voltage cut-off [V],2.44,,(just over) 14.5V across 6-cell battery
1313
C-rate,1,,
14-
Current function,[constant],,
1514
,,,
1615
# Initial conditions
1716
Initial State of Charge,1,-,

input/parameters/lithium-ion/cells/kokam_Marquis2019/parameters.csv

+1
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ Positive current collector thermal conductivity [W.m-1.K-1],237,,
3434
,,,
3535
# Electrical,,,
3636
Cell capacity [A.h],0.680616,,24 Ah/m2 * 0.137m * 0.207m
37+
Typical current [A],1.46925726107,,1C current

input/parameters/lithium-ion/experiments/1C_discharge_from_full_Marquis2019/parameters.csv

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ Number of cells connected in series to make a battery,1,,
1111
Lower voltage cut-off [V],3.105,,
1212
Upper voltage cut-off [V],4.7,,
1313
C-rate,1,,
14-
Current function,[constant],,
1514
,,,
1615
# Initial conditions
1716
Initial concentration in negative electrode [mol.m-3],19986.609595075,Scott Moura FastDFN,

pybamm/models/submodels/external_circuit/base_external_circuit.py

+14
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ class BaseModel(pybamm.BaseSubModel):
1010
def __init__(self, param):
1111
super().__init__(param)
1212

13+
def _get_current_variables(self, i_cell):
14+
param = self.param
15+
I = i_cell * abs(param.I_typ)
16+
i_cell_dim = I / (param.n_electrodes_parallel * param.A_cc)
17+
18+
variables = {
19+
"Total current density": i_cell,
20+
"Total current density [A.m-2]": i_cell_dim,
21+
"Current [A]": I,
22+
"C-rate": I / param.Q,
23+
}
24+
25+
return variables
26+
1327
def get_fundamental_variables(self):
1428
Q = pybamm.Variable("Discharge capacity [A.h]")
1529
variables = {"Discharge capacity [A.h]": Q}

pybamm/models/submodels/external_circuit/current_control_external_circuit.py

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def get_fundamental_variables(self):
2121
"Total current density": i_cell,
2222
"Total current density [A.m-2]": i_cell_dim,
2323
"Current [A]": I,
24+
"C-rate": I / self.param.Q,
2425
}
2526

2627
# Add discharge capacity variable

pybamm/models/submodels/external_circuit/function_control_external_circuit.py

+3-11
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,8 @@ def __init__(self, param, external_circuit_class):
1414

1515
def get_fundamental_variables(self):
1616
# Current is a variable
17-
param = self.param
1817
i_cell = pybamm.Variable("Total current density")
19-
I = i_cell * abs(param.I_typ)
20-
i_cell_dim = I / (param.n_electrodes_parallel * param.A_cc)
21-
22-
variables = {
23-
"Total current density": i_cell,
24-
"Total current density [A.m-2]": i_cell_dim,
25-
"Current [A]": I,
26-
}
18+
variables = self._get_current_variables(i_cell)
2719

2820
# Add discharge capacity variable
2921
variables.update(super().get_fundamental_variables())
@@ -78,7 +70,7 @@ class ConstantVoltage:
7870

7971
def __call__(self, variables):
8072
V = variables["Terminal voltage [V]"]
81-
return V - pybamm.FunctionParameter("Voltage function", pybamm.t)
73+
return V - pybamm.FunctionParameter("Voltage function [V]", pybamm.t)
8274

8375

8476
class PowerFunctionControl(FunctionControl):
@@ -94,5 +86,5 @@ class ConstantPower:
9486
def __call__(self, variables):
9587
I = variables["Current [A]"]
9688
V = variables["Terminal voltage [V]"]
97-
return I * V - pybamm.FunctionParameter("Power function", pybamm.t)
89+
return I * V - pybamm.FunctionParameter("Power function [W]", pybamm.t)
9890

pybamm/models/submodels/external_circuit/voltage_control_external_circuit.py

+2-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def __init__(self, param):
1515

1616
def get_fundamental_variables(self):
1717
# Voltage is given as a function of time
18-
V_dim = pybamm.FunctionParameter("Voltage function", pybamm.t)
18+
V_dim = pybamm.FunctionParameter("Voltage function [V]", pybamm.t)
1919

2020
param = self.param
2121
V = (V_dim - (param.U_p_ref - param.U_n_ref)) / param.potential_scale
@@ -37,13 +37,6 @@ def get_coupled_variables(self, variables):
3737
param.sigma_p * tor, "right"
3838
) * pybamm.BoundaryGradient(phi_s_p, "right")
3939
i_cell = pybamm.BoundaryValue(i_boundary_cc, "positive tab")
40-
I = i_cell * abs(param.I_typ)
41-
i_cell_dim = I / (param.n_electrodes_parallel * param.A_cc)
42-
43-
variables = {
44-
"Total current density": i_cell,
45-
"Total current density [A.m-2]": i_cell_dim,
46-
"Current [A]": I,
47-
}
40+
variables = self._get_current_variables(i_cell)
4841

4942
return variables

pybamm/parameters/electrical_parameters.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# the user may provide the typical timescale as a parameter.
2626
timescale = pybamm.Parameter("Typical timescale [s]")
2727
dimensional_current_with_time = pybamm.FunctionParameter(
28-
"Current function", pybamm.t * timescale
28+
"Current function [A]", pybamm.t * timescale
2929
)
3030
dimensional_current_density_with_time = dimensional_current_with_time / (
3131
n_electrodes_parallel * pybamm.geometric_parameters.A_cc

pybamm/parameters/parameter_values.py

+41-33
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ def update(self, values, check_conflict=False, path=""):
178178
).to_numpy()
179179
# Save name and data
180180
super().__setitem__(name, (function_name, data))
181-
# Special case (hacky) for zero current
182-
elif value == "[zero]":
183-
super().__setitem__(name, 0)
184181
# Anything else should be a converted to a float
185182
else:
186183
super().__setitem__(name, float(value))
@@ -190,19 +187,18 @@ def update(self, values, check_conflict=False, path=""):
190187
self._processed_symbols = {}
191188

192189
def check_and_update_parameter_values(self, values):
193-
# Make sure "C-rate" and current are both non-zero
194-
if "C-rate" in values and values["C-rate"] == 0:
190+
# Make typical current is non-zero
191+
if "Typical current [A]" in values and values["Typical current [A]"] == 0:
195192
raise ValueError(
196193
"""
197-
"C-rate" cannot be zero. A possible alternative is to set
198-
"Current function" to `0` instead.
194+
"Typical current [A]" cannot be zero. A possible alternative is to set
195+
"Current function [A]" to `0` instead.
199196
"""
200197
)
201-
if "Typical current [A]" in values and values["Typical current [A]"] == 0:
198+
if "C-rate" in values and "Current function [A]" in values:
202199
raise ValueError(
203200
"""
204-
"Typical current [A]" cannot be zero. A possible alternative is to set
205-
"Current function" to `0` instead.
201+
Cannot provide both "C-rate" and "Current function [A]" simultaneously
206202
"""
207203
)
208204
# If the capacity of the cell has been provided, make sure "C-rate" and current
@@ -214,30 +210,22 @@ def check_and_update_parameter_values(self, values):
214210
else:
215211
capacity = self["Cell capacity [A.h]"]
216212
# Make sure they match if both provided
217-
if "C-rate" in values and "Typical current [A]" in values:
218-
if values["C-rate"] * capacity != values["Typical current [A]"]:
219-
raise ValueError(
220-
"""
221-
"C-rate" ({}C) and Typical current ({} A) provided do not match
222-
given capacity ({} Ah). These can be updated individually
223-
instead.
224-
""".format(
225-
values["C-rate"], values["Typical current [A]"], capacity
226-
)
227-
)
228213
# Update the other if only one provided
229-
elif "C-rate" in values:
230-
values["Typical current [A]"] = float(values["C-rate"]) * capacity
231-
elif "Typical current [A]" in values:
232-
values["C-rate"] = float(values["Typical current [A]"]) / capacity
233-
234-
# Update the current function if it is constant
235-
self_and_values = {**self, **values}
236-
if "Current function" in self_and_values and (
237-
self_and_values["Current function"] == "[constant]"
238-
or isinstance(self_and_values["Current function"], numbers.Number)
239-
):
240-
values["Current function"] = {**self, **values}["Typical current [A]"]
214+
if "C-rate" in values:
215+
# Can't provide C-rate as a function
216+
if callable(values["C-rate"]):
217+
values["Current function [A]"] = CrateToCurrent(
218+
values["C-rate"], capacity
219+
)
220+
else:
221+
values["Current function [A]"] = float(values["C-rate"]) * capacity
222+
elif "Current function [A]" in values:
223+
if callable(values["Current function [A]"]):
224+
values["C-rate"] = CurrentToCrate(
225+
values["Current function [A]"], capacity
226+
)
227+
else:
228+
values["C-rate"] = float(values["Current function [A]"]) / capacity
241229

242230
return values
243231

@@ -546,3 +534,23 @@ def evaluate(self, symbol):
546534
return processed_symbol.evaluate()
547535
else:
548536
raise ValueError("symbol must evaluate to a constant scalar")
537+
538+
539+
class CurrentToCrate:
540+
"Convert a current function to a C-rate function"
541+
def __init__(self, function, capacity):
542+
self.function = function
543+
self.capacity = capacity
544+
545+
def __call__(self, t):
546+
return self.function(t) / self.capacity
547+
548+
549+
class CrateToCurrent:
550+
"Convert a C-rate function to a current function"
551+
def __init__(self, function, capacity):
552+
self.function = function
553+
self.capacity = capacity
554+
555+
def __call__(self, t):
556+
return self.function(t) * self.capacity

pybamm/parameters/standard_parameters_lead_acid.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ def U_p(c_e_p, T):
487487
# 6. Input current and voltage
488488

489489
dimensional_current_with_time = pybamm.FunctionParameter(
490-
"Current function", pybamm.t * timescale
490+
"Current function [A]", pybamm.t * timescale
491491
)
492492
dimensional_current_density_with_time = dimensional_current_with_time / (
493493
n_electrodes_parallel * pybamm.geometric_parameters.A_cc

pybamm/parameters/standard_parameters_lithium_ion.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ def dUdT_p(c_s_p):
443443
# 6. Input current and voltage
444444

445445
dimensional_current_with_time = pybamm.FunctionParameter(
446-
"Current function", pybamm.t * timescale
446+
"Current function [A]", pybamm.t * timescale
447447
)
448448
dimensional_current_density_with_time = dimensional_current_with_time / (
449449
n_electrodes_parallel * pybamm.geometric_parameters.A_cc

results/2019_08_sulzer_thesis/self_discharge.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ def self_discharge_states(compute):
3131
name="LOQS, with oxygen",
3232
),
3333
]
34-
extra_parameter_values = {
35-
"Current function": "[zero]"
36-
}
34+
extra_parameter_values = {"Current function [A]": 0}
3735
t_eval = np.linspace(0, 1000, 100)
3836
all_variables, t_eval = model_comparison(
3937
models, [1], t_eval, extra_parameter_values=extra_parameter_values

results/2019_08_sulzer_thesis/shared_solutions.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def model_comparison(models, Crates, t_eval, extra_parameter_values=None):
3636
all_variables[Crate] = {}
3737
current = Crate * 17
3838
pybamm.logger.info("Setting typical current to {} A".format(current))
39-
param.update({"Typical current [A]": current})
39+
param.update({"Current function [A]": current})
4040
for model in models:
4141
param.update_model(model, discs[model])
4242
solution = model.default_solver.solve(model, t_eval)
@@ -86,7 +86,7 @@ def convergence_study(models, Crates, all_npts, t_eval, extra_parameter_values=N
8686
for Crate in Crates:
8787
current = Crate * 17
8888
pybamm.logger.info("Setting typical current to {} A".format(current))
89-
param.update({"Typical current [A]": current})
89+
param.update({"Current function [A]": current})
9090
for model in models:
9191
model_disc = models_disc[model.name]
9292
disc = discs[model.name]

results/2plus1D/spm_1plus1D.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
current_1C = 24 * param.process_symbol(pybamm.geometric_parameters.A_cc).evaluate()
2323
param.update(
2424
{
25-
"Typical current [A]": C_rate * current_1C,
25+
"Current function [A]": C_rate * current_1C,
2626
"Initial temperature [K]": 298.15,
2727
"Negative current collector conductivity [S.m-1]": 1e7,
2828
"Positive current collector conductivity [S.m-1]": 1e7,

results/2plus1D/user_mesh_spm_1plus1D.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
current_1C = 24 * param.evaluate(pybamm.geometric_parameters.A_cc)
2323
param.update(
2424
{
25-
"Typical current [A]": C_rate * current_1C,
25+
"Current function [A]": C_rate * current_1C,
2626
"Initial temperature [K]": 298.15,
2727
"Negative current collector conductivity [S.m-1]": 1e5,
2828
"Positive current collector conductivity [S.m-1]": 1e5,

results/drive_cycles/US06_simulation.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# load parameter values and process model and geometry
1515
param = model.default_parameter_values
16-
param["Current function"] = "[current data]US06"
16+
param["Current function [A]"] = "[current data]US06"
1717
param.process_model(model)
1818
param.process_geometry(geometry)
1919

0 commit comments

Comments
 (0)