Skip to content

Commit 53cf744

Browse files
authored
Merge pull request #2478 from pybamm-team/issue-1143-equivalent-circuit-model
Issue 1143 equivalent circuit model
2 parents 76072c8 + 9241251 commit 53cf744

Some content is hidden

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

50 files changed

+17265
-22
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
!CMakeLists.txt
1414
!pybamm/CITATIONS.txt
1515
!pybamm/input/**/*.csv
16+
!tests/unit/test_parameters/*.csv
1617
!benchmarks/benchmark_images/*.png
1718

1819
# running files

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Features
44

5+
- Equivalent circuit models ([#2478](https://github.com/pybamm-team/PyBaMM/pull/2478))
56
- Added `scale` and `reference` attributes to `Variable` objects, which can be use to make the ODE/DAE solver better conditioned ([#2440](https://github.com/pybamm-team/PyBaMM/pull/2440))
67
- SEI reactions can now be asymmetric ([#2425](https://github.com/pybamm-team/PyBaMM/pull/2425))
78
- New Idaklu solver options for jacobian type and linear solver, support Sundials v6 ([#2444](https://github.com/pybamm-team/PyBaMM/pull/2444))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Equivalent Circuit Models
2+
=========================
3+
4+
.. toctree::
5+
:maxdepth: 1
6+
7+
thevenin
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Thevenin Model
2+
==============
3+
4+
.. autoclass:: pybamm.equivalent_circuit.Thevenin
5+
:members:

docs/source/models/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ to see how these models can be solved, and compared, using PyBaMM.
1414
base_models/index
1515
lithium_ion/index
1616
lead_acid/index
17+
equivalent_circuit/index
1718
submodels/index
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Equivalent Circuit Elements
2+
===========================
3+
4+
.. toctree::
5+
6+
ocv_element
7+
resistor_element
8+
rc_element
9+
thermal
10+
voltage_model
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
OCV Element
2+
===========
3+
4+
.. autoclass:: pybamm.equivalent_circuit_elements.OCVElement
5+
:members:
6+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
RC Element
2+
==========
3+
4+
.. autoclass:: pybamm.equivalent_circuit_elements.RCElement
5+
:members:
6+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Resistor Element
2+
================
3+
4+
.. autoclass:: pybamm.equivalent_circuit_elements.ResistorElement
5+
:members:
6+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Thermal SubModel
2+
================
3+
4+
.. autoclass:: pybamm.equivalent_circuit_elements.ThermalSubModel
5+
:members:
6+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Voltage Model
2+
=============
3+
4+
.. autoclass:: pybamm.equivalent_circuit_elements.VoltageModel
5+
:members:
6+

docs/source/models/submodels/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ Submodels
1919
porosity/index
2020
thermal/index
2121
transport_efficiency/index
22+
equivalent_circuit_elements/index

docs/source/parameters/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ Parameters
1010
lithium_ion_parameters
1111
lead_acid_parameters
1212
parameter_sets
13+
process_parameter_data
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Process Parameter Data
2+
======================
3+
4+
.. autofunction:: pybamm.parameters.process_1D_data
5+
6+
.. autofunction:: pybamm.parameters.process_2D_data
7+
8+
.. autofunction:: pybamm.parameters.process_2D_data_csv
9+
10+
.. autofunction:: pybamm.parameters.process_3D_data_csv

examples/scripts/run_ecm.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pybamm
2+
3+
pybamm.set_logging_level("INFO")
4+
5+
# options = {"number of rc elements": 2}
6+
options = {}
7+
model = pybamm.equivalent_circuit.Thevenin(options=options)
8+
9+
parameter_values = model.default_parameter_values
10+
# parameter_values.update(
11+
# {
12+
# "R2 [Ohm]": 0.3e-3,
13+
# "C2 [F]": 1000 / 0.3e-3,
14+
# "Element-2 initial overpotential [V]": 0,
15+
# },
16+
# check_already_exists=False,
17+
# )
18+
19+
experiment = pybamm.Experiment(
20+
[
21+
(
22+
"Discharge at C/10 for 10 hours or until 3.3 V",
23+
"Rest for 1 hour",
24+
"Charge at 100 A until 4.1 V (1 second period)",
25+
"Hold at 4.1 V until 5 A (1 seconds period)",
26+
"Rest for 1 hour",
27+
),
28+
]
29+
)
30+
31+
sim = pybamm.Simulation(model, experiment=experiment, parameter_values=parameter_values)
32+
sim.solve()
33+
sim.plot(
34+
output_variables=[
35+
"SoC",
36+
"Open circuit voltage [V]",
37+
"Current [A]",
38+
"Cell temperature [degC]",
39+
"Entropic change [V/K]",
40+
"R0 [Ohm]",
41+
"R1 [Ohm]",
42+
"C1 [F]",
43+
]
44+
)

pybamm/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
)
112112
from .models.full_battery_models import lead_acid
113113
from .models.full_battery_models import lithium_ion
114+
from .models.full_battery_models import equivalent_circuit
114115

115116
#
116117
# Submodel classes
@@ -132,6 +133,7 @@
132133
thermal,
133134
transport_efficiency,
134135
particle_mechanics,
136+
equivalent_circuit_elements,
135137
)
136138
from .models.submodels.interface import kinetics
137139
from .models.submodels.interface import sei
@@ -161,6 +163,7 @@
161163
from .parameters.thermal_parameters import thermal_parameters, ThermalParameters
162164
from .parameters.lithium_ion_parameters import LithiumIonParameters
163165
from .parameters.lead_acid_parameters import LeadAcidParameters
166+
from .parameters.ecm_parameters import EcmParameters
164167
from .parameters.size_distribution_parameters import *
165168
from .parameters.parameter_sets import parameter_sets
166169
from .parameters_cli import add_parameter, remove_parameter, edit_parameter

pybamm/expression_tree/broadcasts.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,9 @@ def full_like(symbols, fill_value):
549549
return array_type(entries, domains=sum_symbol.domains)
550550

551551
except NotImplementedError:
552-
if sum_symbol.shape_for_testing == (1, 1):
552+
if sum_symbol.shape_for_testing == (1, 1) or sum_symbol.shape_for_testing == (
553+
1,
554+
):
553555
return pybamm.Scalar(fill_value)
554556
if sum_symbol.evaluates_on_edges("primary"):
555557
return FullBroadcastToEdges(

pybamm/expression_tree/interpolant.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ def __init__(
6868
x1, x2 = x
6969
if y.ndim != 2:
7070
raise ValueError("y should be two-dimensional if len(x)=2")
71-
if x1.shape[0] != y.shape[1]:
71+
if x1.shape[0] != y.shape[0]:
7272
raise ValueError(
7373
"len(x1) should equal y=shape[1], "
7474
f"but x1.shape={x1.shape} and y.shape={y.shape}"
7575
)
76-
if x2 is not None and x2.shape[0] != y.shape[0]:
76+
if x2 is not None and x2.shape[0] != y.shape[1]:
7777
raise ValueError(
7878
"len(x2) should equal y=shape[0], "
7979
f"but x2.shape={x2.shape} and y.shape={y.shape}"
@@ -153,9 +153,18 @@ def __init__(
153153
"interpolator should be 'linear' or 'cubic' if x is two-dimensional"
154154
)
155155
else:
156-
interpolating_function = interpolate.interp2d(
157-
x1, x2, y, kind=interpolator
156+
if extrapolate:
157+
fill_value = None
158+
else:
159+
fill_value = np.nan
160+
interpolating_function = interpolate.RegularGridInterpolator(
161+
(x1, x2),
162+
y,
163+
method=interpolator,
164+
bounds_error=False,
165+
fill_value=fill_value,
158166
)
167+
159168
elif len(x) == 3:
160169
self.dimension = 3
161170

@@ -241,13 +250,7 @@ def _function_evaluate(self, evaluated_children):
241250
children_eval_flat.append(child)
242251
if self.dimension == 1:
243252
return self.function(*children_eval_flat).flatten()[:, np.newaxis]
244-
elif self.dimension == 2:
245-
res = self.function(*children_eval_flat)
246-
if res.ndim > 1:
247-
return np.diagonal(res)[:, np.newaxis]
248-
else:
249-
return res[:, np.newaxis]
250-
elif self.dimension == 3:
253+
elif self.dimension in [2, 3]:
251254

252255
# If the children are scalars, we need to add a dimension
253256
shapes = []

pybamm/input/parameters/ecm/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)