Redesign a battery¶
In this example we will redesign a battery. As before we import the module and access the baseline design parameters for the Molicel P45B battery. We then create a list of designs that we want to explore. Each design is represented as a dictionary with a design name and the corresponding equilibrium KPIs.
from breathe_design import api_interface as api
from breathe_design import enable_notebook_plotly
enable_notebook_plotly()
base_params = api.get_design_parameters("Molicel P45B")
base_params
{'NPratio': 1.039106051327928,
'Vmax_V': 4.2,
'Vmin_V': 2.5,
'aluminiumThickness_um': 22.2,
'anode': 'molicel_p45b_anode',
'anodeArealLoading_mAhcm2': 3.8996207810294305,
'anodeMassLoading_mgcm2': 8.44896611475494,
'anodePorosity': 0.16663641853607114,
'anodeThickness_um': 48.90000000000002,
'cathode': 'molicel_p45b_cathode',
'cathodeArealLoading_mAhcm2': 3.7528611983790308,
'cathodeMassLoading_mgcm2': 14.188761420434503,
'cathodePorosity': 0.14216134985845785,
'cathodeThickness_um': 37.48333333333334,
'copperThickness_um': 11.2,
'electrolyte': 'lp30',
'electrolyteBuffer_rel': 0.2,
'format': 'molicel_p45b',
'lamne': 0.0,
'lampe': 0.0,
'lli': 0.0,
'separatorThickness_um': 16.8}
Each of the design parameters can be adjusted to explore different designs. It is best not to make too large adjustments as this could lead to unrealistic results.
designs = [
{"designName": "Lower NP", "NPratio": base_params["NPratio"] * 0.95},
{"designName": "Higher Vmax", "Vmax_V": base_params["Vmax_V"] + 0.05},
{
"designName": "Thicker Cathode",
"cathodeThickness_um": base_params["cathodeThickness_um"] * 1.05,
},
{
"designName": "Less Porous Anode",
"anodePorosity": base_params["anodePorosity"] * 0.95,
},
{
"designName": "Thinner Separator",
"separatorThickness_um": base_params["separatorThickness_um"] * 0.95,
},
]
You can view and switch between the different electrodes in your library. If you have multiple cells in Breathe Design, you can also switch between their electrodes.
api.get_active_materials()
| name | formationLoss | trueDensity_gcm3 | heatCapacity_kJkgK | specificCapacity_mAhg | |
|---|---|---|---|---|---|
| 0 | molicel_p45b_anode | 0.210554 | 2.15 | 0.71 | 496.290382 |
| 1 | molicel_p45b_cathode | 0.090000 | 4.68 | 0.80 | 275.515973 |
Now we can calculate all the equilibrium KPIs for each design using the get_eqm_kpis function.
results = api.get_eqm_kpis("Molicel P45B", designs)
Running...: 100%|██████████| 5/5 [00:05<00:00, 1.11s/ designs]
results.get_kpis()
| Baseline | Lower NP | Higher Vmax | Thicker Cathode | Less Porous Anode | Thinner Separator | |
|---|---|---|---|---|---|---|
| KPI | ||||||
| Capacity [Ah] | 4.500000 | 4.668083 | 4.546820 | 4.646725 | 4.500000 | 4.541918 |
| Nominal Voltage [V] | 3.656630 | 3.660280 | 3.662353 | 3.656630 | 3.656630 | 3.656630 |
| Energy [Wh] | 16.454837 | 17.086491 | 16.652063 | 16.991355 | 16.454837 | 16.608117 |
| Gravimetric Energy Density [Wh/kg] | 241.196608 | 248.788314 | 244.087566 | 248.185356 | 241.065108 | 242.447412 |
| Volumetric Energy Density [Wh/l] | 665.310409 | 690.849797 | 673.284752 | 687.003187 | 665.310409 | 671.507913 |
| Minimum Anode Voltage [mV] | 80.490746 | 75.325513 | 80.035853 | 80.490746 | 80.490746 | 80.490746 |
| Weight [g] | 68.221675 | 68.678834 | 68.221675 | 68.462359 | 68.258890 | 68.501935 |
| Volume [l] | 0.024733 | 0.024733 | 0.024733 | 0.024733 | 0.024733 | 0.024733 |
| Heat Capacity [kJ/K] | 0.052220 | 0.052576 | 0.052220 | 0.052439 | 0.052162 | 0.052303 |
These can be plotted using the compare_designs function in two different ways: one for a relative change in the KPIs and one for a delta change in the KPIs.
results.compare_designs("relative")
results.compare_designs("delta")