def get_chemical_ordering_parameters(self): ''' Computes the mean chemical ordering parameter and chemical ordering parameter variance for all elements in the crystal using Voronoi polyhedra returns: [mean coordination number, coordination number variance] ''' if len(self._crystal.composition) == 1: return [0] * len(self._shells) # Get a list of types elems, fracs = zip(*self._crystal.composition.element_composition. fractional_composition.items()) # Precompute the list of NNs in the structure weight = 'area' voro = VoronoiNN(weight=weight) all_nn = self._get_all_nearest_neighbors(voro, self._crystal) # Evaluate each shell output = [] for shell in self._shells: # Initialize an array to store the ordering parameters ordering = np.zeros((len(self._crystal), len(elems))) # Get the ordering of each type of each atom for site_idx in range(len(self._crystal)): nns = voro._get_nn_shell_info(self._crystal, all_nn, site_idx, shell) # Sum up the weights total_weight = sum(x['weight'] for x in nns) # Get weight by type for nn in nns: site_elem = nn['site'].specie.element \ if isinstance(nn['site'].specie, Specie) else \ nn['site'].specie elem_idx = elems.index(site_elem) ordering[site_idx, elem_idx] += nn['weight'] # Compute the ordering parameter ordering[site_idx, :] = 1 - ordering[site_idx, :] / \ total_weight / np.array(fracs) # Compute the average ordering for the entire structure output.append(np.abs(ordering).mean()) return output
def featurize(self, strc): # Shortcut: Return 0 if there is only 1 type of atom if len(strc.composition) == 1: return [0] * len(self.shells) # Get a list of types elems, fracs = zip(*strc.composition.element_composition. fractional_composition.items()) # Precompute the list of NNs in the structure voro = VoronoiNN(weight=self.weight) all_nn = get_all_nearest_neighbors(voro, strc) # Evaluate each shell output = [] for shell in self.shells: # Initialize an array to store the ordering parameters ordering = np.zeros((len(strc), len(elems))) # Get the ordering of each type of each atom for site_idx in range(len(strc)): nns = voro._get_nn_shell_info(strc, all_nn, site_idx, shell) # Sum up the weights total_weight = sum(x['weight'] for x in nns) # Get weight by type for nn in nns: site_elem = nn['site'].specie.element \ if isinstance(nn['site'].specie, Specie) else \ nn['site'].specie elem_idx = elems.index(site_elem) ordering[site_idx, elem_idx] += nn['weight'] # Compute the ordering parameter ordering[site_idx, :] = 1 - ordering[site_idx, :] / \ total_weight / np.array(fracs) # Compute the average ordering for the entire structure output.append(np.abs(ordering).mean()) return output