SDBMS Battery Simulation
Install Pybamm on Jupyer
In [ ]:
%pip install pybamm
%pip install pandas
Initiating PyBamm
In [ ]:
import pybamm
from pybamm import BaseModel
from pprint import pprint
Choose Battery Chemical & Model
In [ ]:
## [1] Doyle Fuller newman [2] Single Particle Model (SPM) [3] Single Particle Model with Electrolyte (SPMe)
availableModel = ["DFN","SPM", "SPME"]
selectedModel = availableModel[0]
model : BaseModel
match selectedModel:
case "DFN":
model : BaseModel = pybamm.lithium_ion.DFN()
case "SPM":
model : BaseModel = pybamm.lithium_ion.SPM()
case "SPME":
model : BaseModel = pybamm.lithium_ion.SPMe()
Print Available Model Input Parameter. Input Parameter = predefined config / parameter for physical, chemical and electrochemical properties of battery.
In [ ]:
modelInputParameters = list(pybamm.parameter_sets)
pprint(modelInputParameters)
Display Selected Model input parameter value
In [ ]:
selectedInputParameter = pybamm.ParameterValues("Chen2020")
## DFN => Chen2020, Ai2020. SPME = Marquis2019, SPM = Marquis2019
pprint(selectedInputParameter)
Get Q (Battery Capacity)
In [ ]:
batteryCapacity = selectedInputParameter['Nominal cell capacity [A.h]']
maxVoltage = selectedInputParameter['Open-circuit voltage at 100% SOC [V]']
pprint(batteryCapacity)
pprint(maxVoltage)
Print Available Model Output Parameter
In [ ]:
availableOutputModelVariable = model.variable_names()
pprint(availableOutputModelVariable)
Available Instructions
- "Discharge at 1C for 0.5 hours",
- "Discharge at C/20 for 0.5 hours",
- "Charge at 0.5 C for 45 minutes",
- "Discharge at 1 A for 90 seconds",
- "Charge at 200mA for 45 minutes",
- "Discharge at 1 W for 0.5 hours",
- "Charge at 200 mW for 45 minutes",
- "Rest for 10 minutes",
- "Hold at 1 V for 20 seconds",
- "Charge at 1 C until 4.1V",
- "Hold at 4.1 V until 50 mA",
- "Hold at 3V until C/50",
Run Simulation
In [ ]:
experiment = pybamm.Experiment(
[
(
"Charge at 1 C until 4.2 V",
"Discharge at C/0.5 for 2 hours or until 2.5 V"
)
],
period="1 second" # <-- This sets data points every 1 second
)
sim = pybamm.Simulation(model, experiment=experiment, parameter_values=selectedInputParameter)
sim.solve()
Visualize
In [ ]:
#pybamm.dynamic_plot(sim)
Custom Plot with Selected Model Result Parameter
In [ ]:
output_variables = ["Time [s]", "Current [A]", "Voltage [V]", "X-averaged cell temperature [K]"]
sim.plot(output_variables=output_variables)
Store to pandas data frame and Compute SOC
In [ ]:
import pandas as pd
output_variables.append("TimeDiff")
output_variables.append("CapacityDiff")
output_variables.append("SOC")
data = {}
num_rows = len(sim.solution["Time [min]"].entries)
for var in output_variables:
if var == "TimeDiff":
timeDiffValues = []
for i in range(num_rows):
if i == 0:
timeDiffValues.append(0)
else:
prevTime = sim.solution["Time [s]"].entries[i-1]
currentTime = sim.solution["Time [s]"].entries[i]
deltaTime = currentTime - prevTime
timeDiffValues.append(deltaTime)
data[var] = timeDiffValues
elif var == "CapacityDiff":
capacityDiffValues = []
for i in range(num_rows):
if i == 0:
capacityDiffValues.append(0)
else:
deltaCapacity = sim.solution["Current [A]"].entries[i]*(timeDiffValues[i]/3600)*-1
capacityDiffValues.append(deltaCapacity)
data[var] = capacityDiffValues
elif var == "SOC":
soc_values = []
for i in range(num_rows):
if i == 0:
soc_values.append(1)
else:
## Compute using Coulomb Counting
updatedSOC = soc_values[i-1]+(capacityDiffValues[i]/batteryCapacity)
soc_values.append(updatedSOC)
data[var] = soc_values
else:
data[var] = sim.solution[var].entries
simulationOutputDf = pd.DataFrame(data)
display(simulationOutputDf)
simulationOutputDf.to_csv("simulation_output_coulomb.csv", index=False)
Plot voltage component
In [ ]:
sim.plot_voltage_components()
In [ ]:
pprint("end")