pymatgen.apps.battery package
This package contains all battery-related application classes, including representations of InsertionElectrodes and ConversionElectrodes.
Submodules
pymatgen.apps.battery.analyzer module
Analysis classes for batteries.
- class BatteryAnalyzer(struct_oxid, working_ion='Li', oxi_override=None)[source]
Bases:
object
A suite of methods for starting with an oxidized structure and determining its potential as a battery.
Pass in a structure for analysis.
- Parameters:
struct_oxid – a Structure object; oxidation states must be assigned for this structure; disordered structures should be OK
working_ion – a String symbol or Element for the working ion.
oxi_override – a dict of String element symbol, Integer oxidation state pairs. by default, H, C, N, O, F, S, Cl, Se, Br, Te, I are considered anions.
- get_max_capgrav(remove=True, insert=True)[source]
Give max capacity in mAh/g for inserting and removing a charged ion Note that the weight is normalized to the most ion-packed state, thus removal of 1 Li from LiFePO4 gives the same capacity as insertion of 1 Li into FePO4.
- Parameters:
remove – (bool) whether to allow ion removal
insert – (bool) whether to allow ion insertion
- Returns:
max grav capacity in mAh/g
- get_max_capvol(remove=True, insert=True, volume=None)[source]
Give max capacity in mAh/cc for inserting and removing a charged ion into base structure.
- Parameters:
remove – (bool) whether to allow ion removal
insert – (bool) whether to allow ion insertion
volume – (float) volume to use for normalization (default=volume of initial structure)
- Returns:
max vol capacity in mAh/cc
- get_removals_int_oxid()[source]
Get a set of ion removal steps, e.g. set([1 2 4]) etc. in order to produce integer oxidation states of the redox metals. If multiple redox metals are present, all combinations of reduction/oxidation are tested. Note that having more than 3 redox metals will likely slow down the algorithm.
Examples
LiFePO4 will return [1] Li4Fe3Mn1(PO4)4 will return [1, 2, 3, 4]) Li6V4(PO4)6 will return [4, 6]) note that this example is not normalized
- Returns:
array of integer ion removals. If you double the unit cell, your answers will be twice as large!
- property max_ion_insertion[source]
Maximum number of ion A that can be inserted while maintaining charge-balance. No consideration is given to whether there (geometrically speaking) are ion sites to actually accommodate the extra ions.
- Returns:
integer amount of ion. Depends on cell size (this is an ‘extrinsic’ function!)
pymatgen.apps.battery.battery_abc module
This module defines the abstract base classes for battery-related classes. Regardless of the kind of electrode, conversion or insertion, there are many common definitions and properties, e.g. average voltage, capacity, etc. which can be defined in a general way. The Abc for battery classes implements some of these common definitions to allow sharing of common logic between them.
- class AbstractElectrode(voltage_pairs: tuple[AbstractVoltagePair, ...], working_ion_entry: ComputedEntry, framework_formula: str)[source]
Bases:
Sequence
,MSONable
An Abstract Base Class representing an Electrode. It is essentially a sequence of VoltagePairs. Generally, subclasses only need to implement three abstract properties: voltage_pairs, working_ion and working_ion_entry.
The general concept is that all other battery properties such as capacity, etc. are derived from voltage pairs.
One of the major challenges with representing battery materials is keeping track of the normalization between different entries. For example, one entry might be TiO2 with one unit cell whereas another is LiTi2O4 with two unit cells. When computing battery properties, it is needed to always use a universal reference state otherwise you have normalization errors (e.g., the energy of LiTi2O4 must be divided by two to be compared with TiO2).
For properties such as volume, mass, or mAh transferred within the voltage pair, a universal convention is necessary. AbstractElectrode can query for extrinsic properties of several different AbstractVoltagePairs belonging to a single charge/discharge path and be confident that the normalization is being carried out properly throughout, even if more AbstractVoltagePairs are added later.
The universal normalization is defined by the reduced structural framework of the entries, which is common along the entire charge/discharge path. For example, LiTi2O4 has a reduced structural framework of TiO2. Another example is Li9V6P16O58 which would have a reduced structural framework of V3P8O29. Note that reduced structural frameworks need not be charge-balanced or physical, e.g. V3P8O29 is not charge-balanced, they are just a tool for normalization.
Example: for a LiTi2O4 -> TiO2 AbstractVoltagePair, extrinsic quantities like mAh or cell volumes are given per TiO2 formula unit.
Developers implementing a new battery (other than the two general ones already implemented) need to implement a VoltagePair and an Electrode.
- voltage_pairs[source]
Objects that represent each voltage step
- Type:
tuple[AbstractVoltagePair, …]
- get_average_voltage(min_voltage=None, max_voltage=None)[source]
Average voltage for path satisfying between a min and max voltage.
- Parameters:
min_voltage (float) – The minimum allowable voltage for a given step.
max_voltage (float) – The maximum allowable voltage allowable for a given step.
- Returns:
Average voltage in V across the insertion path (a subset of the path can be chosen by the optional arguments)
- get_capacity_grav(min_voltage=None, max_voltage=None, use_overall_normalization=True)[source]
Get the gravimetric capacity of the electrode.
- Parameters:
min_voltage (float) – The minimum allowable voltage for a given step.
max_voltage (float) – The maximum allowable voltage allowable for a given step.
use_overall_normalization (booL) – If False, normalize by the discharged state of only the voltage pairs matching the voltage criteria. if True, use default normalization of the full electrode path.
- Returns:
Gravimetric capacity in mAh/g across the insertion path (a subset of the path can be chosen by the optional arguments).
- get_capacity_vol(min_voltage=None, max_voltage=None, use_overall_normalization=True)[source]
Get the volumetric capacity of the electrode.
- Parameters:
min_voltage (float) – The minimum allowable voltage for a given step.
max_voltage (float) – The maximum allowable voltage allowable for a given step.
use_overall_normalization (booL) – If False, normalize by the discharged state of only the voltage pairs matching the voltage criteria. if True, use default normalization of the full electrode path.
- Returns:
Volumetric capacity in mAh/cc across the insertion path (a subset of the path can be chosen by the optional arguments)
- get_energy_density(min_voltage=None, max_voltage=None, use_overall_normalization=True)[source]
- Parameters:
min_voltage (float) – The minimum allowable voltage for a given step.
max_voltage (float) – The maximum allowable voltage allowable for a given step.
use_overall_normalization (booL) – If False, normalize by the discharged state of only the voltage pairs matching the voltage criteria. if True, use default normalization of the full electrode path.
- Returns:
Energy density in Wh/L across the insertion path (a subset of the path can be chosen by the optional arguments).
- get_specific_energy(min_voltage=None, max_voltage=None, use_overall_normalization=True)[source]
Get the specific energy of the battery in mAh/g.
- Parameters:
min_voltage (float) – The minimum allowable voltage for a given step.
max_voltage (float) – The maximum allowable voltage allowable for a given step.
use_overall_normalization (booL) – If False, normalize by the discharged state of only the voltage pairs matching the voltage criteria. if True, use default normalization of the full electrode path.
- Returns:
Specific energy in Wh/kg across the insertion path (a subset of the path can be chosen by the optional arguments)
- get_sub_electrodes(adjacent_only=True)[source]
If this electrode contains multiple voltage steps, then it is possible to use only a subset of the voltage steps to define other electrodes. Must be implemented for each electrode object.
- Parameters:
adjacent_only – Only return electrodes from compounds that are adjacent on the convex hull, i.e. no electrodes returned will have multiple voltage steps if this is set true
- Returns:
A list of Electrode objects
- get_summary_dict(print_subelectrodes=True) dict [source]
Generate a summary dict.
- Parameters:
print_subelectrodes – Also print data on all the possible subelectrodes.
- Returns:
A summary of this electrode’s properties in dict format.
- property normalization_mass[source]
The mass used for normalization. This is the mass of the discharged electrode of the last voltage pair.
- property normalization_volume[source]
The mass used for normalization. This is the vol of the discharged electrode of the last voltage pair.
- property num_steps[source]
The number of distinct voltage steps in from fully charge to discharge based on the stable intermediate states.
- voltage_pairs: tuple[AbstractVoltagePair, ...][source]
- working_ion_entry: ComputedEntry[source]
- class AbstractVoltagePair(voltage: float, mAh: float, mass_charge: float, mass_discharge: float, vol_charge: float, vol_discharge: float, frac_charge: float, frac_discharge: float, working_ion_entry: ComputedEntry, framework_formula: str)[source]
Bases:
MSONable
An Abstract Base Class for a Voltage Pair.
- property framework: Composition[source]
The composition object representing the framework.
- working_ion_entry: ComputedEntry[source]
pymatgen.apps.battery.conversion_battery module
This module contains the classes to build a ConversionElectrode.
- class ConversionElectrode(voltage_pairs: tuple[AbstractVoltagePair, ...], working_ion_entry: ComputedEntry, framework_formula: str, initial_comp_formula: str)[source]
Bases:
AbstractElectrode
A ConversionElectrode, since it is dataclass this object can be constructed for the attributes. However, it is usually easier to construct a ConversionElectrode using one of the classmethod constructors provided.
- Attribute:
voltage_pairs: The voltage pairs making up the Conversion Electrode. working_ion_entry: A single ComputedEntry or PDEntry
representing the element that carries charge across the battery, e.g. Li.
- initial_comp_formula: Starting composition for ConversionElectrode represented
as a string/formula.
- classmethod from_composition_and_entries(comp, entries_in_chemsys, working_ion_symbol='Li', allow_unstable=False) Self | None [source]
Convenience constructor to make a ConversionElectrode from a composition and all entries in a chemical system.
- Parameters:
comp – Starting composition for ConversionElectrode, e.g. Composition(“FeF3”)
entries_in_chemsys – Sequence containing all entries in a chemical system. e.g. all Li-Fe-F containing entries.
working_ion_symbol – Element symbol of working ion. Defaults to Li.
allow_unstable – If True, allow any composition to be used as the starting point of a conversion voltage curve, this is useful for comparing with insertion electrodes
- classmethod from_composition_and_pd(comp, pd: PhaseDiagram, working_ion_symbol: str = 'Li', allow_unstable: bool = False) Self | None [source]
Convenience constructor to make a ConversionElectrode from a composition and a phase diagram.
- Parameters:
comp – Starting composition for ConversionElectrode, e.g. Composition(“FeF3”)
pd – A PhaseDiagram of the relevant system (e.g., Li-Fe-F)
working_ion_symbol – Element symbol of working ion. Defaults to Li.
allow_unstable – Allow compositions that are unstable
- get_sub_electrodes(adjacent_only=True)[source]
If this electrode contains multiple voltage steps, then it is possible to use only a subset of the voltage steps to define other electrodes. For example, an LiTiO2 electrode might contain three subelectrodes: [LiTiO2 –> TiO2, LiTiO2 –> Li0.5TiO2, Li0.5TiO2 –> TiO2] This method can be used to return all the subelectrodes with some options.
- Parameters:
adjacent_only – Only return electrodes from compounds that are adjacent on the convex hull, i.e. no electrodes returned will have multiple voltage steps if this is set true
- Returns:
A list of ConversionElectrode objects
- get_summary_dict(print_subelectrodes=True) dict [source]
Generate a summary dict. Populates the summary dict with the basic information from the parent method then populates more information. Since the parent method calls self.get_summary_dict(print_subelectrodes=True) for the subelectrodes. The current method will be called from within super().get_summary_dict.
- Parameters:
print_subelectrodes – Also print data on all the possible subelectrodes.
- Returns:
A summary of this electrode’s properties in dict format.
- property initial_comp: Composition[source]
The pymatgen Composition representation of the initial composition.
- is_super_electrode(conversion_electrode) bool [source]
Check if a particular conversion electrode is a sub electrode of the current electrode. Starting from a more lithiated state may result in a subelectrode that is essentially on the same path. For example, a ConversionElectrode formed by starting from an FePO4 composition would be a super_electrode of a ConversionElectrode formed from an LiFePO4 composition.
- class ConversionVoltagePair(voltage: float, mAh: float, mass_charge: float, mass_discharge: float, vol_charge: float, vol_discharge: float, frac_charge: float, frac_discharge: float, working_ion_entry: ComputedEntry, framework_formula: str, rxn: BalancedReaction, entries_charge: Iterable[ComputedEntry], entries_discharge: Iterable[ComputedEntry])[source]
Bases:
AbstractVoltagePair
A VoltagePair representing a Conversion Reaction with a defined voltage. Typically not initialized directly but rather used by ConversionElectrode.
- entries_charge[source]
Entries representing decompositions products in the charged state. Enumerates the decompositions products at the tieline, so the number of entries will be one fewer than the dimensions of the phase diagram
- Type:
- entries_discharge[source]
Entries representing decompositions products in the discharged state. Enumerates the decompositions products at the tieline, so the number of entries will be one fewer than the dimensions of the phase diagram
- Type:
- entries_charge: Iterable[ComputedEntry][source]
- entries_discharge: Iterable[ComputedEntry][source]
- classmethod from_steps(step1, step2, normalization_els, framework_formula) Self [source]
Create a ConversionVoltagePair from two steps in the element profile from a PD analysis.
- Parameters:
step1 – Starting step
step2 – Ending step
normalization_els – Elements to normalize the reaction by. To ensure correct capacities.
framework_formula – Formula of the framework.
pymatgen.apps.battery.insertion_battery module
This module is used for analysis of materials with potential application as intercalation batteries.
- class InsertionElectrode(voltage_pairs: tuple[AbstractVoltagePair, ...], working_ion_entry: ComputedEntry, framework_formula: str, stable_entries: Iterable[ComputedEntry], unstable_entries: Iterable[ComputedEntry])[source]
Bases:
AbstractElectrode
A set of topotactically related compounds, with different amounts of a single element, e.g. TiO2 and LiTiO2, that can be used to define an insertion battery electrode.
- classmethod from_dict_legacy(dct) Self [source]
- Parameters:
dct (dict) – Dict representation.
- Returns:
InsertionElectrode
- classmethod from_entries(entries: Iterable[ComputedEntry | ComputedStructureEntry], working_ion_entry: ComputedEntry | ComputedStructureEntry | PDEntry, strip_structures: bool = False) Self [source]
Create a new InsertionElectrode.
- Parameters:
entries – A list of ComputedEntries, ComputedStructureEntries, or subclasses representing the different topotactic states of the battery, e.g. TiO2 and LiTiO2.
working_ion_entry – A single ComputedEntry or PDEntry representing the element that carries charge across the battery, e.g. Li.
strip_structures – Since the electrode document only uses volume we can make the electrode object significantly leaner by dropping the structure data. If this parameter is set to True, the ComputedStructureEntry will be replaced with a ComputedEntry and the volume will be stored in ComputedEntry.data[‘volume’]. If entries provided are ComputedEntries, must set strip_structures=False.
- get_all_entries(charge_to_discharge=True)[source]
Return all entries input for the electrode.
- Parameters:
charge_to_discharge – order from most charge to most discharged state? Defaults to True.
- Returns:
A list of all entries in the electrode (both stable and unstable), ordered by amount of the working ion.
- get_max_instability(min_voltage=None, max_voltage=None)[source]
The maximum instability along a path for a specific voltage range.
- Parameters:
min_voltage – The minimum allowable voltage.
max_voltage – The maximum allowable voltage.
- Returns:
Maximum decomposition energy of all compounds along the insertion path (a subset of the path can be chosen by the optional arguments)
- get_max_muO2(min_voltage=None, max_voltage=None)[source]
Maximum critical oxygen chemical potential along path.
- Parameters:
min_voltage – The minimum allowable voltage.
max_voltage – The maximum allowable voltage.
- Returns:
Maximum critical oxygen chemical of all compounds along the insertion path (a subset of the path can be chosen by the optional arguments).
- get_min_instability(min_voltage=None, max_voltage=None)[source]
The minimum instability along a path for a specific voltage range.
- Parameters:
min_voltage – The minimum allowable voltage.
max_voltage – The maximum allowable voltage.
- Returns:
Minimum decomposition energy of all compounds along the insertion path (a subset of the path can be chosen by the optional arguments)
- get_min_muO2(min_voltage=None, max_voltage=None)[source]
Minimum critical oxygen chemical potential along path.
- Parameters:
min_voltage – The minimum allowable voltage for a given step
max_voltage – The maximum allowable voltage allowable for a given step
- Returns:
Minimum critical oxygen chemical of all compounds along the insertion path (a subset of the path can be chosen by the optional arguments).
- get_stable_entries(charge_to_discharge=True)[source]
Get the stable entries.
- Parameters:
charge_to_discharge – order from most charge to most discharged state? Default to True.
- Returns:
A list of stable entries in the electrode, ordered by amount of the working ion.
- get_sub_electrodes(adjacent_only=True, include_myself=True)[source]
If this electrode contains multiple voltage steps, then it is possible to use only a subset of the voltage steps to define other electrodes. For example, an LiTiO2 electrode might contain three subelectrodes: [LiTiO2 –> TiO2, LiTiO2 –> Li0.5TiO2, Li0.5TiO2 –> TiO2] This method can be used to return all the subelectrodes with some options.
- Parameters:
adjacent_only – Only return electrodes from compounds that are adjacent on the convex hull, i.e. no electrodes returned will have multiple voltage steps if this is set True.
include_myself – Include this identical electrode in the list of results.
- Returns:
A list of InsertionElectrode objects
- get_summary_dict(print_subelectrodes=True) dict [source]
Generate a summary dict. Populates the summary dict with the basic information from the parent method then populates more information. Since the parent method calls self.get_summary_dict(print_subelectrodes=True) for the subelectrodes. The current method will be called from within super().get_summary_dict.
- Parameters:
print_subelectrodes – Also print data on all the possible subelectrodes.
- Returns:
A summary of this electrode’s properties in dict format.
- get_unstable_entries(charge_to_discharge=True)[source]
Get the unstable entries for the electrode.
- Parameters:
charge_to_discharge – Order from most charge to most discharged state? Defaults to True.
- Returns:
A list of unstable entries in the electrode, ordered by amount of the working ion.
- stable_entries: Iterable[ComputedEntry][source]
- unstable_entries: Iterable[ComputedEntry][source]
- class InsertionVoltagePair(voltage: float, mAh: float, mass_charge: float, mass_discharge: float, vol_charge: float, vol_discharge: float, frac_charge: float, frac_discharge: float, working_ion_entry: ComputedEntry, framework_formula: str, entry_charge: ComputedEntry, entry_discharge: ComputedEntry)[source]
Bases:
AbstractVoltagePair
A voltage pair for an insertion battery, e.g. LiFePO4 -> FePO4.
- entry_charge: ComputedEntry[source]
- entry_discharge: ComputedEntry[source]
- classmethod from_entries(entry1, entry2, working_ion_entry) Self [source]
- Parameters:
entry1 – Entry corresponding to one of the entries in the voltage step.
entry2 – Entry corresponding to the other entry in the voltage step.
working_ion_entry – A single ComputedEntry or PDEntry representing the element that carries charge across the battery, e.g. Li.
pymatgen.apps.battery.plotter module
This module provides plotting capabilities for battery related applications.
- class VoltageProfilePlotter(xaxis: str = 'capacity', hide_negative: bool = False)[source]
Bases:
object
A plotter to make voltage profile plots for batteries.
- Parameters:
xaxis – The quantity to use as the xaxis. Can be either
capacity_grav (-) – the gravimetric capacity
capacity_vol (-) – the volumetric capacity
x_form (-) – the number of working ions per formula unit of the host
frac_x (-) – the atomic fraction of the working ion
hide_negative – If True only plot the voltage steps above zero.
- add_electrode(electrode: AbstractElectrode, label: str | None = None) None [source]
Add an electrode to the plot.
- Parameters:
electrode – An electrode. All electrodes satisfying the AbstractElectrode interface should work.
label – A label for the electrode. If None, defaults to a counting system, i.e. ‘Electrode 1’, ‘Electrode 2’, …
- get_plot(width: float = 8, height: float = 8, term_zero: bool = True, ax: Axes = None) Axes [source]
Get a plot object.
- Parameters:
width – Width of the plot. Defaults to 8 in.
height – Height of the plot. Defaults to 6 in.
term_zero – If True append zero voltage point at the end
ax (plt.Axes) – matplotlib axes object. Defaults to None.
- Returns:
matplotlib axes object.
- Return type:
plt.Axes
- get_plot_data(electrode: AbstractElectrode, term_zero: bool = True) tuple[list, list] [source]
- Parameters:
electrode – Electrode object
term_zero – If True append zero voltage point at the end.
- Returns:
Plot data in x, y.
- get_plotly_figure(width: float = 800, height: float = 600, font_dict: dict | None = None, term_zero: bool = True, **kwargs) Figure [source]
Return plotly Figure object.
- Parameters:
width – Width of the plot. Defaults to 800 px.
height – Height of the plot. Defaults to 600 px.
font_dict – define the font. Defaults to {“family”: “Arial”, “size”: 24, “color”: “#000000”}
term_zero – If True append zero voltage point at the end
**kwargs – passed to plotly.graph_objects.Layout