-
-
Notifications
You must be signed in to change notification settings - Fork 33
Open
Labels
bugSomething isn't workingSomething isn't working
Description
liionpack Version
0.4.1.dev2
Python Version
3.11.11
Describe the bug
I would like to simulate a pack that consists of cells with different capacities.
I'm using the ECM Thévenin model.
As I understood from the provided examples, cell-specific parameters can be set via input parameters.
However, as soon as I define "Cell capacity [A.h]" as an input parameter, the simulation crashes.
Questions:
- Is this a known problem?
- Is there a known solution?
- What are your recommendations?
Steps to Reproduce
Variant 1: works for me (capacity defined as general parameter)
import liionpack as lp
import pybamm
import numpy as np
import matplotlib.pyplot as plt
I_mag = 5.0
OCV_init = 4.0 # used for intial guess
Ri_init = 1e-6 # used for intial guess
R_busbar = 1e-6
R_connection = 1e-6
Np = 1
Ns = 4
Nbatt = Np * Ns
netlist = lp.setup_circuit(
Np=Np, Ns=Ns, Rb=R_busbar, Rc=R_connection, Ri=Ri_init, V=OCV_init, I=I_mag
)
def ecm_model(parameter_values = None):
# Create the pybamm model
model = pybamm.equivalent_circuit.Thevenin(options = {"number of rc elements":0, "calculate discharge energy":"true"})
# Add events to the model
model = lp.add_events_to_model(model)
# Set up parameter value
if parameter_values is None:
parameter_values = pybamm.ParameterValues("ECM_Example")
# Change parameter to be an input controlled by the external circuit
#parameter_values.update({"Cell capacity [A.h]": "[input]"})
# Set up solver and simulation
solver = pybamm.CasadiSolver(mode="safe")
sim = pybamm.Simulation(
model=model,
parameter_values=parameter_values,
solver=solver,
)
return sim
# Define parameters
parameter_values = pybamm.ParameterValues("ECM_Example")
inputs={
"Cell capacity [A.h]": (100*np.ones(Np * Ns)),
}
# Define experiment
I_pack = "100 A"
experiment = pybamm.Experiment(
[
f"Charge at {I_pack} for 30 minutes",
"Rest for 15 minutes",
F"Discharge at {I_pack} for 30 minutes",
"Rest for 15 minutes",
],
period= "10 seconds",
)
# Simulate pack
output = lp.solve(
netlist=netlist,
sim_func=ecm_model,
parameter_values=parameter_values,
experiment=experiment,
#inputs=inputs,
)
# Plot output
lp.plot_output(output)
Note: In liionpack.solvers.py, I had to make the following small modification to make the ECM within Liiionpack work:
Original:
self.variable_names = [
"Terminal voltage [V]",
"Surface open-circuit voltage [V]",
]
Modified:
self.variable_names = [
"Battery voltage [V]",
"Open-circuit voltage [V]",
]
Variant 2: does not work for me (capacity defined as input parameter)
import liionpack as lp
import pybamm
import numpy as np
import matplotlib.pyplot as plt
I_mag = 5.0
OCV_init = 4.0 # used for intial guess
Ri_init = 1e-6 # used for intial guess
R_busbar = 1e-6
R_connection = 1e-6
Np = 1
Ns = 4
Nbatt = Np * Ns
netlist = lp.setup_circuit(
Np=Np, Ns=Ns, Rb=R_busbar, Rc=R_connection, Ri=Ri_init, V=OCV_init, I=I_mag
)
def ecm_model(parameter_values = None):
# Create the pybamm model
model = pybamm.equivalent_circuit.Thevenin(options = {"number of rc elements":0, "calculate discharge energy":"true"})
# Add events to the model
model = lp.add_events_to_model(model)
# Set up parameter value
if parameter_values is None:
parameter_values = pybamm.ParameterValues("ECM_Example")
# Change parameter to be an input controlled by the external circuit
parameter_values.update({"Cell capacity [A.h]": "[input]"})
# Set up solver and simulation
solver = pybamm.CasadiSolver(mode="safe")
sim = pybamm.Simulation(
model=model,
parameter_values=parameter_values,
solver=solver,
)
return sim
# Define parameters
parameter_values = pybamm.ParameterValues("ECM_Example")
inputs={
"Cell capacity [A.h]": (100*np.ones(Np * Ns)),
}
# Define experiment
I_pack = "100 A"
experiment = pybamm.Experiment(
[
f"Charge at {I_pack} for 30 minutes",
"Rest for 15 minutes",
F"Discharge at {I_pack} for 30 minutes",
"Rest for 15 minutes",
],
period= "10 seconds",
)
# Simulate pack
output = lp.solve(
netlist=netlist,
sim_func=ecm_model,
parameter_values=parameter_values,
experiment=experiment,
inputs=inputs,
)
# Plot output
lp.plot_output(output)
Expected behaviour
No response
Relevant log output
Additional context
No response
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working