Skip to content

Commit 7203297

Browse files
committed
#729 tried adding entropic change functions
1 parent bbba976 commit 7203297

File tree

7 files changed

+67
-22
lines changed

7 files changed

+67
-22
lines changed

examples/scripts/ecker_set.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import pybamm as pb
2+
3+
pb.set_logging_level("DEBUG")
4+
5+
model = pb.lithium_ion.DFN()
6+
# model.convert_to_format = "python"
7+
8+
chemistry = pb.parameter_sets.Ecker2015
9+
# chemistry = pb.parameter_sets.Marquis2019
10+
parameter_values = pb.ParameterValues(chemistry=chemistry)
11+
12+
sim = pb.Simulation(model, parameter_values=parameter_values)
13+
14+
solver = pb.CasadiSolver(mode="safe")
15+
sim.solve(solver=solver)
16+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
def graphite_entropic_change_NULL(sto, c_n_max):
2+
"""
3+
Entered as a function to be consistent with
4+
other PyBaMM parameter sets.
5+
6+
7+
"""
8+
return 0 * sto

input/parameters/lithium-ion/anodes/graphite_Ecker2015/parameters.csv

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Negative electrode charge transfer coefficient,0.489,,
2626
Negative electrode double-layer capacity [F.m-2],0.2,,
2727
,,,
2828
# Thermal parameters,,,
29-
Negative electrode OCP entropic change [V.K-1],0,,
29+
Negative electrode OCP entropic change [V.K-1],[function]graphite_entropic_change_NULL,,
3030
,,,
3131
# Activation energies,,,
3232
Reference temperature [K],296.15,23C,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def nco_entropic_change_NULL(sto, c_p_max):
2+
"""
3+
Entered as a function to be consistent with other PyBaMM parameter sets.
4+
"""
5+
6+
return 0 * sto

input/parameters/lithium-ion/cathodes/LiNiCoO2_Ecker2015/parameters.csv

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Positive electrode double-layer capacity [F.m-2],0.2,,
2727

2828
,,,
2929
# Thermal parameters,,,
30-
Positive electrode OCP entropic change [V.K-1],0,,
30+
Positive electrode OCP entropic change [V.K-1],[function]nco_entropic_change_NULL,,
3131
,,,
3232
# Activation energies,,,
3333
Reference temperature [K],296.15,23C,

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Heat transfer coefficient [W.m-2.K-1],1, dummy value,
88
# Electrical
99
Number of electrodes connected in parallel to make a cell,1,,
1010
Number of cells connected in series to make a battery,1,,
11-
Lower voltage cut-off [V],2.8,,
12-
Upper voltage cut-off [V],4.7,,
13-
C-rate,0.0001,,
11+
Lower voltage cut-off [V],0,,
12+
Upper voltage cut-off [V],10,,
13+
C-rate,0.1,,
1414
,,,
1515
# Initial conditions
1616
Initial concentration in negative electrode [mol.m-3], 26356,

pybamm/solvers/base_solver.py

+32-17
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,20 @@ def report(string):
216216
# Check for heaviside functions in rhs and algebraic and add discontinuity
217217
# events if these exist.
218218
# Note: only checks for the case of t < X, t <= X, X < t, or X <= t
219-
for symbol in itertools.chain(model.concatenated_rhs.pre_order(),
220-
model.concatenated_algebraic.pre_order()):
219+
for symbol in itertools.chain(
220+
model.concatenated_rhs.pre_order(), model.concatenated_algebraic.pre_order()
221+
):
221222
if isinstance(symbol, pybamm.Heaviside):
222223
if symbol.right.id == pybamm.t.id:
223224
expr = symbol.left
224225
elif symbol.left.id == pybamm.t.id:
225226
expr = symbol.right
226227

227-
model.events.append(pybamm.Event(str(symbol), expr.new_copy(),
228-
pybamm.EventType.DISCONTINUITY))
228+
model.events.append(
229+
pybamm.Event(
230+
str(symbol), expr.new_copy(), pybamm.EventType.DISCONTINUITY
231+
)
232+
)
229233

230234
# Process rhs, algebraic and event expressions
231235
rhs, rhs_eval, jac_rhs = process(model.concatenated_rhs, "RHS")
@@ -241,7 +245,8 @@ def report(string):
241245
# discontinuity events are evaluated before the solver is called, so don't need
242246
# to process them
243247
discontinuity_events_eval = [
244-
event for event in model.events
248+
event
249+
for event in model.events
245250
if event.event_type == pybamm.EventType.DISCONTINUITY
246251
]
247252

@@ -448,11 +453,12 @@ def solve(self, model, t_eval, external_variables=None, inputs=None):
448453
# make sure they are increasing in time
449454
discontinuities = sorted(discontinuities)
450455
pybamm.logger.info(
451-
'Discontinuity events found at t = {}'.format(discontinuities)
456+
"Discontinuity events found at t = {}".format(discontinuities)
452457
)
453458
# remove any identical discontinuities
454459
discontinuities = [
455-
v for i, v in enumerate(discontinuities)
460+
v
461+
for i, v in enumerate(discontinuities)
456462
if i == len(discontinuities) - 1
457463
or discontinuities[i] < discontinuities[i + 1]
458464
]
@@ -462,16 +468,18 @@ def solve(self, model, t_eval, external_variables=None, inputs=None):
462468
start_indices = [0]
463469
end_indices = []
464470
for dtime in discontinuities:
465-
dindex = np.searchsorted(t_eval, dtime, side='left')
471+
dindex = np.searchsorted(t_eval, dtime, side="left")
466472
end_indices.append(dindex + 1)
467473
start_indices.append(dindex + 1)
468474
if t_eval[dindex] == dtime:
469475
t_eval[dindex] += sys.float_info.epsilon
470476
t_eval = np.insert(t_eval, dindex, dtime - sys.float_info.epsilon)
471477
else:
472-
t_eval = np.insert(t_eval, dindex,
473-
[dtime - sys.float_info.epsilon,
474-
dtime + sys.float_info.epsilon])
478+
t_eval = np.insert(
479+
t_eval,
480+
dindex,
481+
[dtime - sys.float_info.epsilon, dtime + sys.float_info.epsilon],
482+
)
475483
end_indices.append(len(t_eval))
476484

477485
# integrate separatly over each time segment and accumulate into the solution
@@ -480,16 +488,21 @@ def solve(self, model, t_eval, external_variables=None, inputs=None):
480488
old_y0 = model.y0
481489
solution = None
482490
for start_index, end_index in zip(start_indices, end_indices):
483-
pybamm.logger.info("Calling solver for {} < t < {}"
484-
.format(t_eval[start_index], t_eval[end_index - 1]))
491+
pybamm.logger.info(
492+
"Calling solver for {} < t < {}".format(
493+
t_eval[start_index], t_eval[end_index - 1]
494+
)
495+
)
485496
timer.reset()
486497
if solution is None:
487498
solution = self._integrate(
488-
model, t_eval[start_index:end_index], ext_and_inputs)
499+
model, t_eval[start_index:end_index], ext_and_inputs
500+
)
489501
solution.solve_time = timer.time()
490502
else:
491503
new_solution = self._integrate(
492-
model, t_eval[start_index:end_index], ext_and_inputs)
504+
model, t_eval[start_index:end_index], ext_and_inputs
505+
)
493506
new_solution.solve_time = timer.time()
494507
solution.append(new_solution, start_index=0)
495508

@@ -501,14 +514,16 @@ def solve(self, model, t_eval, external_variables=None, inputs=None):
501514
y0_guess = solution.y[:, -1]
502515
if model.algebraic:
503516
model.y0 = self.calculate_consistent_state(
504-
model, t_eval[end_index], y0_guess)
517+
model, t_eval[end_index], y0_guess
518+
)
505519
else:
506520
model.y0 = y0_guess
507521

508522
last_state = solution.y[:, -1]
509523
if len(model.algebraic) > 0:
510524
model.y0 = self.calculate_consistent_state(
511-
model, t_eval[end_index], last_state)
525+
model, t_eval[end_index], last_state
526+
)
512527
else:
513528
model.y0 = last_state
514529

0 commit comments

Comments
 (0)