Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ecm with diffusion #4254

Merged
merged 28 commits into from
Aug 5, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1bad235
add diffusion element for ECM
MehrdadBabazadeh Jul 4, 2024
4d97040
fix bugs
brosaplanella Jul 5, 2024
8397583
An example to compare ECM with ECMD model
MehrdadBabazadeh Jul 9, 2024
923a51f
style: pre-commit fixes
pre-commit-ci[bot] Jul 9, 2024
dae8856
Merge branch 'develop' into ecm-diffusion
brosaplanella Jul 10, 2024
8476fb3
We removed the example to compare two models.
MehrdadBabazadeh Jul 15, 2024
72e6cd6
Added citation.
MehrdadBabazadeh Jul 15, 2024
47b1beb
Fixed typo.
MehrdadBabazadeh Jul 15, 2024
23ab917
Merge branch 'ecm-diffusion' of https://github.com/MehrdadBabazadeh/P…
MehrdadBabazadeh Jul 15, 2024
d4096e3
Added entry to change log.
MehrdadBabazadeh Jul 15, 2024
ac5c4af
style: pre-commit fixes
pre-commit-ci[bot] Jul 15, 2024
e0b5e8b
Added test
MehrdadBabazadeh Jul 15, 2024
c98f592
style: pre-commit fixes
pre-commit-ci[bot] Jul 15, 2024
d60d16d
Fixed citation error.
MehrdadBabazadeh Jul 15, 2024
de0b00d
Merge branch 'ecm-diffusion' of https://github.com/MehrdadBabazadeh/P…
MehrdadBabazadeh Jul 15, 2024
8fb974c
Merge branch 'develop' into ecm-diffusion
brosaplanella Jul 15, 2024
952698a
Merge branch 'develop' into ecm-diffusion
kratman Jul 15, 2024
dad4f16
Merge branch 'develop' into ecm-diffusion
brosaplanella Jul 17, 2024
310651f
Changed line 39.
MehrdadBabazadeh Jul 18, 2024
f2907d6
Merge branch 'ecm-diffusion' of https://github.com/MehrdadBabazadeh/P…
MehrdadBabazadeh Jul 18, 2024
ee34c29
Merge branch 'develop' into ecm-diffusion
brosaplanella Aug 1, 2024
25d0a2d
New test_default_properties definition added.
MehrdadBabazadeh Aug 2, 2024
5406cf7
Merge branch 'ecm-diffusion' of https://github.com/MehrdadBabazadeh/P…
MehrdadBabazadeh Aug 2, 2024
5bb124f
style: pre-commit fixes
pre-commit-ci[bot] Aug 2, 2024
83514a0
Merge branch 'develop' into ecm-diffusion
agriyakhetarpal Aug 2, 2024
1ff0c8d
Increased cover
MehrdadBabazadeh Aug 5, 2024
95d101f
Merge branch 'ecm-diffusion' of https://github.com/MehrdadBabazadeh/P…
MehrdadBabazadeh Aug 5, 2024
fde2343
style: pre-commit fixes
pre-commit-ci[bot] Aug 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# [Unreleased](https://github.com/pybamm-team/PyBaMM/)

## Features

- Added the diffusion element to be used in the Thevenin model. ([#4254](https://github.com/pybamm-team/PyBaMM/pull/4254))

# [v24.5rc0](https://github.com/pybamm-team/PyBaMM/tree/v24.5rc0) - 2024-05-01

## Features
Expand Down
28 changes: 28 additions & 0 deletions examples/scripts/run_ecmd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import pybamm

pybamm.set_logging_level("INFO")

model = pybamm.equivalent_circuit.Thevenin(options={"diffusion element": "true"})
parameter_values = model.default_parameter_values

parameter_values.update(
{"Diffusion time constant [s]": 580}, check_already_exists=False
)

experiment = pybamm.Experiment(
[
(
"Discharge at C/10 for 10 hours or until 3.3 V",
"Rest for 30 minutes",
"Rest for 2 hours",
"Charge at 100 A until 4.1 V",
"Hold at 4.1 V until 5 A",
"Rest for 30 minutes",
"Rest for 1 hour",
),
]
)

sim = pybamm.Simulation(model, experiment=experiment, parameter_values=parameter_values)
sim.solve()
sim.plot()
10 changes: 10 additions & 0 deletions pybamm/CITATIONS.bib
Original file line number Diff line number Diff line change
Expand Up @@ -794,3 +794,13 @@ @article{Wycisk2022
author = {Dominik Wycisk and Marc Oldenburger and Marc Gerry Stoye and Toni Mrkonjic and Arnulf Latz},
keywords = {Lithium-ion battery, Voltage hysteresis, Plett-model, Silicon–graphite anode},
}

@article{Fan2022,
title={Data-driven identification of lithium-ion batteries: A nonlinear equivalent circuit model with diffusion dynamics},
author={Fan, Chuanxin and O’Regan, Kieran and Li, Liuying and Higgins, Matthew D and Kendrick, Emma and Widanage, Widanalage D},
journal={Applied Energy},
volume={321},
pages={119336},
year={2022},
publisher={Elsevier}
}
39 changes: 39 additions & 0 deletions pybamm/models/full_battery_models/equivalent_circuit/thevenin.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
throughput capacity in addition to discharge capacity. Must be one of
"true" or "false". "false" is the default, since calculating discharge
energy can be computationally expensive for simple models like SPM.
* "diffusion element" : str
Whether to include the diffusion element to the model. Must be one of
"true" or "false". "false" is the default.
* "operating mode" : str
brosaplanella marked this conversation as resolved.
Show resolved Hide resolved
Sets the operating mode for the model. This determines how the current
is set. Can be:
Expand Down Expand Up @@ -73,6 +76,7 @@
def set_options(self, extra_options=None):
possible_options = {
"calculate discharge energy": ["false", "true"],
"diffusion element": ["false", "true"],
"operating mode": OperatingModes("current"),
"number of rc elements": NaturalNumberOption(1),
}
Expand Down Expand Up @@ -165,6 +169,18 @@
)
self.element_counter += 1

def set_diffusion_submodel(self):
if self.options["diffusion element"] == "false":
self.submodels["Diffusion"] = (
pybamm.equivalent_circuit_elements.NoDiffusion(self.param, self.options)
)
elif self.options["diffusion element"] == "true":
self.submodels["Diffusion"] = (

Check warning on line 178 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L177-L178

Added lines #L177 - L178 were not covered by tests
pybamm.equivalent_circuit_elements.DiffusionElement(
self.param, self.options
)
)

def set_thermal_submodel(self):
self.submodels["Thermal"] = pybamm.equivalent_circuit_elements.ThermalSubModel(
self.param, self.options
Expand All @@ -180,6 +196,7 @@
self.set_ocv_submodel()
self.set_resistor_submodel()
self.set_rc_submodels()
self.set_diffusion_submodel()
self.set_thermal_submodel()
self.set_voltage_submodel()

Expand Down Expand Up @@ -227,3 +244,25 @@
"Irreversible heat generation [W]",
],
]

@property
def default_var_pts(self):
x = pybamm.SpatialVariable(

Check warning on line 250 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L250

Added line #L250 was not covered by tests
"x ECMD", domain=["ECMD particle"], coord_sys="Cartesian"
)
return {x: 20}

Check warning on line 253 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L253

Added line #L253 was not covered by tests

@property
def default_geometry(self):
x = pybamm.SpatialVariable(

Check warning on line 257 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L257

Added line #L257 was not covered by tests
"x ECMD", domain=["ECMD particle"], coord_sys="Cartesian"
)
return {"ECMD particle": {x: {"min": 0, "max": 1}}}

Check warning on line 260 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L260

Added line #L260 was not covered by tests

@property
def default_submesh_types(self):
return {"ECMD particle": pybamm.Uniform1DSubMesh}

Check warning on line 264 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L264

Added line #L264 was not covered by tests

@property
def default_spatial_methods(self):
return {"ECMD particle": pybamm.FiniteVolume()}

Check warning on line 268 in pybamm/models/full_battery_models/equivalent_circuit/thevenin.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/full_battery_models/equivalent_circuit/thevenin.py#L268

Added line #L268 was not covered by tests
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from .rc_element import RCElement
from .thermal import ThermalSubModel
from .voltage_model import VoltageModel
from .diffusion_element import NoDiffusion, DiffusionElement

__all__ = ['ocv_element', 'rc_element', 'resistor_element', 'thermal',
'voltage_model']
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import pybamm


class NoDiffusion(pybamm.BaseSubModel):
"""
Without Diffusion element for
equivalent circuits.

Parameters
----------
param : parameter class
The parameters to use for this submodel
options : dict, optional
A dictionary of options to be passed to the model.
"""

def __init__(self, param, options=None):
super().__init__(param)
pybamm.citations.register("Fan2022")
kratman marked this conversation as resolved.
Show resolved Hide resolved
self.model_options = options

def get_coupled_variables(self, variables):
z = pybamm.PrimaryBroadcast(variables["SoC"], "ECMD particle")
x = pybamm.SpatialVariable(
"x ECMD", domain=["ECMD particle"], coord_sys="Cartesian"
)
z_surf = pybamm.surf(z)
eta_diffusion = pybamm.Scalar(0)

variables.update(
{
"Distributed SoC": z,
"x ECMD": x,
"Diffusion overpotential [V]": eta_diffusion,
"Surface SoC": z_surf,
}
)

return variables


class DiffusionElement(pybamm.BaseSubModel):
"""
With Diffusion element for
equivalent circuits.

Parameters
----------
param : parameter class
The parameters to use for this submodel
options : dict, optional
A dictionary of options to be passed to the model.
"""

def __init__(self, param, options=None):
super().__init__(param)
self.model_options = options

Check warning on line 57 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L56-L57

Added lines #L56 - L57 were not covered by tests

def get_fundamental_variables(self):
z = pybamm.Variable("Distributed SoC", domain="ECMD particle")
x = pybamm.SpatialVariable(

Check warning on line 61 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L60-L61

Added lines #L60 - L61 were not covered by tests
"x ECMD", domain=["ECMD particle"], coord_sys="Cartesian"
)
variables = {

Check warning on line 64 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L64

Added line #L64 was not covered by tests
"Distributed SoC": z,
"x ECMD": x,
}
return variables

Check warning on line 68 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L68

Added line #L68 was not covered by tests

def get_coupled_variables(self, variables):
z = variables["Distributed SoC"]
soc = variables["SoC"]
z_surf = pybamm.surf(z)
eta_diffusion = -(self.param.ocv(z_surf) - self.param.ocv(soc))

Check warning on line 74 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L71-L74

Added lines #L71 - L74 were not covered by tests

variables.update(

Check warning on line 76 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L76

Added line #L76 was not covered by tests
{
"Diffusion overpotential [V]": eta_diffusion,
"Surface SoC": z_surf,
}
)

return variables

Check warning on line 83 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L83

Added line #L83 was not covered by tests

def set_rhs(self, variables):
cell_capacity = self.param.cell_capacity
current = variables["Current [A]"]
z = variables["Distributed SoC"]

Check warning on line 88 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L86-L88

Added lines #L86 - L88 were not covered by tests

# governing equations
dzdt = pybamm.div(pybamm.grad(z)) / self.param.tau_D
self.rhs = {z: dzdt}

Check warning on line 92 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L91-L92

Added lines #L91 - L92 were not covered by tests

# boundary conditions
lbc = pybamm.Scalar(0)
rbc = -self.param.tau_D * current / (cell_capacity * 3600)
self.boundary_conditions = {

Check warning on line 97 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L95-L97

Added lines #L95 - L97 were not covered by tests
z: {"left": (lbc, "Neumann"), "right": (rbc, "Neumann")}
}

def set_initial_conditions(self, variables):
z = variables["Distributed SoC"]
self.initial_conditions = {z: self.param.initial_soc}

Check warning on line 103 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L102-L103

Added lines #L102 - L103 were not covered by tests

def set_events(self, variables):
z_surf = variables["Surface SoC"]
self.events += [

Check warning on line 107 in pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py

View check run for this annotation

Codecov / codecov/patch

pybamm/models/submodels/equivalent_circuit_elements/diffusion_element.py#L106-L107

Added lines #L106 - L107 were not covered by tests
kratman marked this conversation as resolved.
Show resolved Hide resolved
pybamm.Event("Minimum surface SoC", z_surf),
pybamm.Event("Maximum surface SoC", 1 - z_surf),
]
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def set_initial_conditions(self, variables):

def set_events(self, variables):
soc = variables["SoC"]
self.events = [
self.events += [
pybamm.Event("Minimum SoC", soc),
pybamm.Event("Maximum SoC", 1 - soc),
]
kratman marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ def get_coupled_variables(self, variables):
for i in range(number_of_elements):
overpotential += variables[f"Element-{i} overpotential [V]"]

voltage = ocv + overpotential
diffusion_overpotential = variables["Diffusion overpotential [V]"]

voltage = ocv + overpotential + diffusion_overpotential

# Power and Resistance
current = variables["Current [A]"]
Expand Down
1 change: 1 addition & 0 deletions pybamm/parameters/ecm_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
class EcmParameters:
def __init__(self):
self.cell_capacity = pybamm.Parameter("Cell capacity [A.h]")
self.tau_D = pybamm.Parameter("Diffusion time constant [s]")

self._set_current_parameters()
self._set_voltage_parameters()
Expand Down
Loading