def __init__(self, entries, comp_dict=None): self._solid_entries = list() self._ion_entries = list() for entry in entries: if entry.phase_type == "Solid": self._solid_entries.append(entry) elif entry.phase_type == "Ion": self._ion_entries.append(entry) else: raise Exception("Incorrect Phase type - needs to be \ Pourbaix entry of phase type Ion/Solid") if len(self._ion_entries) == 0: raise Exception("No ion phase. Equilibrium between ion/solid " "is required to make a Pourbaix Diagram") self._unprocessed_entries = self._solid_entries + self._ion_entries self._elt_comp = comp_dict if comp_dict and len(comp_dict) > 1: self._multielement = True pbx_elements = set() for comp in comp_dict.keys(): for el in [ el for el in ion_or_solid_comp_object(comp).elements if el not in ["H", "O"] ]: pbx_elements.add(el.symbol) self.pourbaix_elements = pbx_elements w = [comp_dict[key] for key in comp_dict] A = [] for comp in comp_dict: comp_obj = ion_or_solid_comp_object(comp) Ai = [] for elt in self.pourbaix_elements: Ai.append(comp_obj[elt]) A.append(Ai) A = np.array(A).T.astype(float) w = np.array(w) A /= np.dot([a.sum() for a in A], w) x = np.linalg.solve(A, w) self._elt_comp = dict(zip(self.pourbaix_elements, x)) else: self._multielement = False self.pourbaix_elements = [ el.symbol for el in entries[0].composition.elements if el.symbol not in ["H", "O"] ] # TODO: document the physical meaning # of ternary oxide of pbx diagrams in both modes self._elt_comp = {self.pourbaix_elements[0]: 1.0} self._make_pourbaix_diagram()
def __init__(self, entries, comp_dict=None): self._solid_entries = list() self._ion_entries = list() for entry in entries: if entry.phase_type == "Solid": self._solid_entries.append(entry) elif entry.phase_type == "Ion": self._ion_entries.append(entry) else: raise Exception("Incorrect Phase type - needs to be \ Pourbaix entry of phase type Ion/Solid") if len(self._ion_entries) == 0: raise Exception("No ion phase. Equilibrium between ion/solid " "is required to make a Pourbaix Diagram") self._unprocessed_entries = self._solid_entries + self._ion_entries self._elt_comp = comp_dict if comp_dict and len(comp_dict) > 1: self._multielement = True pbx_elements = set() for comp in comp_dict.keys(): for el in [el for el in ion_or_solid_comp_object(comp).elements if el not in ["H", "O"]]: pbx_elements.add(el.symbol) self.pourbaix_elements = pbx_elements w = [comp_dict[key] for key in comp_dict] A = [] for comp in comp_dict: comp_obj = ion_or_solid_comp_object(comp) Ai = [] for elt in self.pourbaix_elements: Ai.append(comp_obj[elt]) A.append(Ai) A = np.array(A).T.astype(float) w = np.array(w) A /= np.dot([a.sum() for a in A], w) x = np.linalg.solve(A, w) self._elt_comp = dict(zip(self.pourbaix_elements, x)) else: self._multielement = False self.pourbaix_elements = [el.symbol for el in entries[0].composition.elements if el.symbol not in ["H", "O"]] # TODO: document the physical meaning # of ternary oxide of pbx diagrams in both modes self._elt_comp = {self.pourbaix_elements[0]: 1.0} self._make_pourbaix_diagram()
def __init__(self, entries, comp_dict=None): self._solid_entries = list() self._ion_entries = list() for entry in entries: if entry.phase_type == "Solid": self._solid_entries.append(entry) elif entry.phase_type == "Ion": self._ion_entries.append(entry) else: raise Exception("Incorrect Phase type - needs to be \ Pourbaix entry of phase type Ion/Solid") self._unprocessed_entries = self._solid_entries + self._ion_entries self._elt_comp = comp_dict if comp_dict: self._multielement = True pbx_elements = set() for comp in comp_dict.keys(): for el in [ el for el in ion_or_solid_comp_object(comp).elements if el not in ["H", "O"] ]: pbx_elements.add(el.symbol) self.pourbaix_elements = pbx_elements w = [comp_dict[key] for key in comp_dict] A = [] for comp in comp_dict: comp_obj = ion_or_solid_comp_object(comp) Ai = [] for elt in self.pourbaix_elements: Ai.append(comp_obj[elt]) A.append(Ai) A = np.array(A).T.astype(float) w = np.array(w) A /= np.dot([a.sum() for a in A], w) x = np.linalg.solve(A, w) self._elt_comp = dict(zip(self.pourbaix_elements, x)) else: self._multielement = False self.pourbaix_elements = [ el.symbol for el in entries[0].composition.elements if el.symbol not in ["H", "O"] ] self._elt_comp = {self.pourbaix_elements[0]: 1.0} self._make_pourbaixdiagram()
def __init__(self, entries, comp_dict=None): self._solid_entries = list() self._ion_entries = list() for entry in entries: if entry.phase_type == "Solid": self._solid_entries.append(entry) elif entry.phase_type == "Ion": self._ion_entries.append(entry) else: raise Exception("Incorrect Phase type - needs to be \ Pourbaix entry of phase type Ion/Solid") self._unprocessed_entries = self._solid_entries + self._ion_entries self._elt_comp = comp_dict if comp_dict: self._multielement = True pbx_elements = set() for comp in comp_dict.keys(): for el in [el for el in ion_or_solid_comp_object(comp).elements if el not in ["H", "O"]]: pbx_elements.add(el.symbol) self.pourbaix_elements = pbx_elements w = [comp_dict[key] for key in comp_dict] A = [] for comp in comp_dict: comp_obj = ion_or_solid_comp_object(comp) Ai = [] for elt in self.pourbaix_elements: Ai.append(comp_obj[elt]) A.append(Ai) A = np.array(A).T.astype(float) w = np.array(w) A /= np.dot([a.sum() for a in A], w) x = np.linalg.solve(A, w) self._elt_comp = dict(zip(self.pourbaix_elements, x)) else: self._multielement = False self.pourbaix_elements = [el.symbol for el in entries[0].composition.elements if el.symbol not in ["H", "O"]] self._elt_comp = {self.pourbaix_elements[0]: 1.0} self._make_pourbaixdiagram()