Source code for rxn_network.thermo.utils
"""Utility functions used in the thermodynamic analysis classes."""
from __future__ import annotations
from typing import TYPE_CHECKING
from pymatgen.analysis.phase_diagram import PhaseDiagram
from tqdm import tqdm
if TYPE_CHECKING:
from collections.abc import Iterable
from pymatgen.entries import Entry
[docs]
def expand_pd(entries: Iterable[Entry], pbar: bool = False) -> dict[str, PhaseDiagram]:
"""Helper method for generating a set of smaller phase diagrams for analyzing
thermodynamic stability in large chemical systems. This is necessary when
considering chemical systems which contain 10 or more elements, due to dimensional
limitations of the Qhull algorithm.
Args:
entries ([Entry]): list of Entry objects for building phase diagram.
pbar (bool): whether to show a progress bar.
Returns:
Dictionary of PhaseDiagram objects indexed by chemical subsystem string;
e.g. {"Li-Mn-O": <PhaseDiagram object>, "C-Y": <PhaseDiagram object>, ...}
"""
pd_dict: dict[str, PhaseDiagram] = {}
sorted_entries = sorted(entries, key=lambda x: len(x.composition.elements), reverse=True)
for e in tqdm(sorted_entries, disable=not pbar, desc="Building phase diagrams"):
for chemsys in pd_dict:
if set(e.composition.chemical_system.split("-")).issubset(chemsys.split("-")):
break
else:
pd_dict[e.composition.chemical_system] = PhaseDiagram(
list(
filter(
lambda x: set(x.composition.elements).issubset(e.composition.elements),
entries,
)
)
)
return pd_dict