def test_nbors(): box = [[5.493642, 0, 0], [0, 5.493642, 0], [0, 0, 5.493642]] elements = ["Si", "Si", "Si", "Si", "Si", "Si", "Si", "Si"] coords = [ [0, 0, 0], [0.25, 0.25, 0.25], [0.000000, 0.500000, 0.500000], [0.250000, 0.750000, 0.750000], [0.500000, 0.000000, 0.500000], [0.750000, 0.250000, 0.750000], [0.500000, 0.500000, 0.000000], [0.750000, 0.750000, 0.250000], ] coords = np.array(coords) # box = [[2.715, 2.715, 0], [0, 2.715, 2.715], [2.715, 0, 2.715]] # coords = [[0, 0, 0], [0.25, 0.25, 0.25]] # elements = ["Si", "Si"] Si = Atoms(lattice_mat=box, coords=coords, elements=elements) nbr = NeighborsAnalysis(Si) nb = nbr.get_all_distributions tmp = round((nb["rdf"][-3]), 2) assert (tmp) == (4.08) nbr.get_rdf(plot=True) # nbr.ang_dist(nbor_info=info,plot=True) nbr.ang_dist_first(plot=True) nbr.ang_dist_second(plot=True) nbr.get_ddf(plot=True) angs = nbr.atomwise_angle_dist() ardf = nbr.atomwise_radial_dist() cmd = "rm *.png" os.system(cmd)
def from_atoms( atoms=None, get_prim=False, zero_diag=False, node_atomwise_angle_dist=False, node_atomwise_rdf=False, features="basic", enforce_c_size=10.0, max_n=100, max_cut=5.0, verbose=False, make_colormap=True, ): """ Get Networkx graph. Requires Networkx installation. Args: atoms: jarvis.core.Atoms object. rcut: cut-off after which distance will be set to zero in the adjacency matrix. features: Node features. 'atomic_number': graph with atomic numbers only. 'cfid': 438 chemical descriptors from CFID. 'basic':10 features 'atomic_fraction': graph with atomic fractions in 103 elements. array: array with CFID chemical descriptor names. See: jarvis/core/specie.py enforce_c_size: minimum size of the simulation cell in Angst. """ if get_prim: atoms = atoms.get_primitive_atoms dim = get_supercell_dims(atoms=atoms, enforce_c_size=enforce_c_size) atoms = atoms.make_supercell(dim) adj = np.array(atoms.raw_distance_matrix.copy()) # zero out edges with bond length greater than threshold adj[adj >= max_cut] = 0 if zero_diag: np.fill_diagonal(adj, 0.0) nodes = np.arange(atoms.num_atoms) if features == "atomic_number": node_attributes = np.array( [[np.array(Specie(i).Z)] for i in atoms.elements], dtype="float", ) if features == "atomic_fraction": node_attributes = [] fracs = atoms.composition.atomic_fraction_array for i in fracs: node_attributes.append(np.array([float(i)])) node_attributes = np.array(node_attributes) elif features == "basic": feats = [ "Z", "coulmn", "row", "X", "atom_rad", "nsvalence", "npvalence", "ndvalence", "nfvalence", "first_ion_en", "elec_aff", ] node_attributes = [] for i in atoms.elements: tmp = [] for j in feats: tmp.append(Specie(i).element_property(j)) node_attributes.append(tmp) node_attributes = np.array(node_attributes, dtype="float") elif features == "cfid": node_attributes = np.array( [np.array(Specie(i).get_descrp_arr) for i in atoms.elements], dtype="float", ) elif isinstance(features, list): node_attributes = [] for i in atoms.elements: tmp = [] for j in features: tmp.append(Specie(i).element_property(j)) node_attributes.append(tmp) node_attributes = np.array(node_attributes, dtype="float") else: print("Please check the input options.") if node_atomwise_rdf or node_atomwise_angle_dist: nbr = NeighborsAnalysis(atoms, max_n=max_n, verbose=verbose, max_cut=max_cut) if node_atomwise_rdf: node_attributes = np.concatenate( (node_attributes, nbr.atomwise_radial_dist()), axis=1) node_attributes = np.array(node_attributes, dtype="float") if node_atomwise_angle_dist: node_attributes = np.concatenate( (node_attributes, nbr.atomwise_angle_dist()), axis=1) node_attributes = np.array(node_attributes, dtype="float") # construct edge list uv = [] edge_features = [] for ii, i in enumerate(atoms.elements): for jj, j in enumerate(atoms.elements): bondlength = adj[ii, jj] if bondlength > 0: uv.append((ii, jj)) edge_features.append(bondlength) edge_attributes = edge_features if make_colormap: sps = atoms.uniq_species color_dict = random_colors(number_of_colors=len(sps)) new_colors = {} for i, j in color_dict.items(): new_colors[sps[i]] = j color_map = [] for ii, i in enumerate(atoms.elements): color_map.append(new_colors[i]) return Graph( nodes=nodes, edges=uv, node_attributes=np.array(node_attributes), edge_attributes=np.array(edge_attributes), color_map=color_map, )