def test_cna_adaptive(): atoms, box = pcs.make_crystal(structure="fcc", repetitions=(7, 7, 7), lattice_constant=4.00, noise=0.1) sys = pc.System() sys.atoms = atoms sys.box = box sys.calculate_cna(cutoff=None) atoms = sys.atoms assert atoms[0].structure == 1 atoms, box = pcs.make_crystal(structure="hcp", repetitions=(7, 7, 7), lattice_constant=4.00, noise=0.1) sys = pc.System() sys.atoms = atoms sys.box = box sys.calculate_cna(cutoff=None) atoms = sys.atoms assert atoms[0].structure == 2 atoms, box = pcs.make_crystal(structure="bcc", repetitions=(7, 7, 7), lattice_constant=4.00, noise=0.1) sys = pc.System() sys.atoms = atoms sys.box = box sys.calculate_cna(cutoff=None) atoms = sys.atoms assert atoms[0].structure == 3
def test_create_multislice_dump(): """ Create a multitest dump file and test it """ atoms, boxdims = pcs.make_crystal('bcc', repetitions=[6, 6, 6]) sys = pc.System() sys.box = boxdims sys.atoms = atoms ptp.write_file(sys, "tests/bcc1.dump") atoms2, boxdims2 = pcs.make_crystal('bcc', repetitions=[6, 6, 6]) #modify the coordinates of one atom x = atoms2[0].pos x[0] += 0.01 atoms2[0].pos = x assert len(atoms2) == 432 #write it out sys2 = pc.System() sys2.box = boxdims2 sys2.atoms = atoms2 ptp.write_file(sys2, "tests/bcc2.dump") #now cleanup if os.path.exists("tests/bcc1.dat"): os.remove("tests/bcc1.dat") if os.path.exists("tests/bcc2.dat"): os.remove("tests/bcc2.dat")
def return_possible_polys(struct): if struct=='bcc': atoms, box = pcs.make_crystal('bcc', lattice_constant=4, repetitions=[3,3,3]) sys = pc.System() sys.atoms = atoms sys.box = box sys.find_neighbors(method='voronoi') sys.calculate_vorovector() voros = [" ".join(np.array(atom.vorovector).astype(str)) for atom in sys.atoms] #take unique unique_voros = np.unique(voros) elif struct=='fcc': atoms, box = pcs.make_crystal('fcc', lattice_constant=4, repetitions=[3,3,3]) sys = pc.System() sys.atoms = atoms sys.box = box sys.find_neighbors(method='voronoi') sys.calculate_vorovector() voros = [" ".join(np.array(atom.vorovector).astype(str)) for atom in sys.atoms] #take unique unique_voros = np.unique(voros) elif struct=='liquid': sys = pc.System() sys.read_inputfile('datafiles/lqd.dat') sys.find_neighbors(method='voronoi') sys.calculate_vorovector() voros = [" ".join(np.array(atom.vorovector).astype(str)) for atom in sys.atoms] #take unique unique_voros = np.unique(voros) elif struct=='distorted-bcc': sys = pc.System() sys.read_inputfile('datafiles/mixed_bcc.dat') sys.find_neighbors(method='voronoi') sys.calculate_vorovector(edge_cutoff=0.0, area_cutoff=0.0) voros = [" ".join(np.array(atom.vorovector).astype(str)) for atom in sys.atoms if atom.vorovector[1] >= 2] #take unique unique_voros = np.unique(voros) elif struct=='distorted-fcc': sys = pc.System() sys.read_inputfile('datafiles/mixed_fcc.dat') sys.find_neighbors(method='voronoi') sys.calculate_vorovector() voros = [" ".join(np.array(atom.vorovector).astype(str)) for atom in sys.atoms] #take unique unique_voros = np.unique(voros) #now create a dropdown widget with this option poly_widget = widgets.Dropdown( options=unique_voros, value=unique_voros[0], description='polyhedra:', disabled=False, ) return widgets.interact(visualise_poly, poly=poly_widget, atoms=widgets.fixed(sys.atoms))
def test_neighbors_system_filter(): #create some atoms atoms, boxdims = pcs.make_crystal('bcc', repetitions=[2, 2, 2]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method='cutoff', cutoff=0.867) #any atom should have 8 neighbors atoms = sys.atoms assert atoms[0].coordination == 8 #now we take all the neighbors of atom0 and replace half of #them with a different type neighs = atoms[0].neighbors #replace the neighs atoms[neighs[0]].type = 2 atoms[neighs[1]].type = 2 #now set these atoms back #for atom in atoms: sys.set_atom(atoms[neighs[0]]) sys.set_atom(atoms[neighs[1]]) #recalculate neighbors with filter sys.find_neighbors(method='cutoff', cutoff=0.867, filter='type') #any atom should have 8 neighbors atoms = sys.atoms assert atoms[0].coordination == 6
def test_q_4(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims #sys.get_neighbors(method = 'voronoi') sys.find_neighbors(method = 'cutoff', cutoff=0.9) sys.calculate_q([4, 6], averaged=True) atoms = sys.atoms #assert np.round(atoms[0].q[2], decimals=2) == 0.51 assert np.round(atoms[0].get_q(4, averaged=True), decimals=2) == 0.51 assert np.round(atoms[0].get_q([4, 6])[0], decimals=2) == 0.51 assert np.round(atoms[0].get_q([4, 6], averaged=True)[1], decimals=2) == 0.63 assert np.round(atoms[0].get_q([4, 6]), decimals=2)[0] == 0.51 assert np.round(atoms[0].get_q([4, 6], averaged=True)[1], decimals=2) == 0.63 #now change the q4 values atoms[0].set_q(4, .23) atoms[0].set_q(4, .23, averaged=True) assert np.round(atoms[0].get_q(4), decimals=2) == 0.23 assert np.round(atoms[0].get_q(4, averaged=True), decimals=2) == 0.23 atoms[0].set_q([4, 6], [.23, .46]) atoms[0].set_q([4, 6], [.23, .46], averaged=True) assert np.round(atoms[0].get_q(4), decimals=2) == 0.23 assert np.round(atoms[0].get_q(4, averaged=True), decimals=2) == 0.23 assert np.round(atoms[0].get_q(6), decimals=2) == 0.46 assert np.round(atoms[0].get_q(6, averaged=True), decimals=2) == 0.46
def test_file_system(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [1, 1, 1]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method = 'voronoi') sys.to_file('tests/tjkf.dat') #now try to read in the file sys2 = pc.System() sys2.read_inputfile('tests/tjkf.dat') assert len(sys2.atoms) == 2 #now add some custom values atoms[0].custom = {"velocity":12} atoms[1].custom = {"velocity":24} #now try to read in the file sys3 = pc.System() sys3.atoms = atoms sys3.box = boxdims sys3.to_file('tests/tjkf.dat', custom=['velocity']) #now read it again sys4 = pc.System() sys4.read_inputfile('tests/tjkf.dat', customkeys=['velocity']) #now get atoms and check them atoms = sys4.atoms assert int(atoms[0].custom['velocity']) == 12 assert int(atoms[1].custom['velocity']) == 24
def test_create_structure(): structure = ['bcc', 'fcc', 'hcp', 'diamond', 'a15', 'l12', 'b2'] natoms = [2, 4, 4, 8, 8, 4, 2] for count, struct in enumerate(structure): #dumpfile = os.path.join(os.getcwd(), "test.dat") atoms, boxdims = pcs.make_crystal(struct) assert len(atoms) == natoms[count]
def test_create_multislice_dump(): """ Create a multitest dump file and test it """ atoms, boxdims = pcs.make_crystal('bcc', repetitions=[6, 6, 6]) sys = pc.System() sys.atoms = atoms sys.box = boxdims ptp.write_structure(sys, "tests/bcc1.dump") atoms2, boxdims2 = pcs.make_crystal('bcc', repetitions=[6, 6, 6]) #modify the coordinates of one atom x = atoms2[0].pos x[0] += 0.01 atoms2[0].pos = x assert len(atoms2) == 432 #write it out sys2 = pc.System() sys2.atoms = atoms2 sys2.box = boxdims2 ptp.write_structure(sys2, "tests/bcc2.dump") #now merge the two dump files os.system("cat tests/bcc1.dump tests/bcc2.dump > tests/bcc3.dat") #os.remove("tests/bcc1.dump") #os.remove("tests/bcc2.dump") #now this file should have info of both - read it in sys3 = pc.System() sys3.read_inputfile("tests/bcc3.dat", frame=1) atoms = sys3.atoms assert len(atoms) == 432 assert atoms[0].pos == [0.01, 0, 0] #now this file should have info of both - read it in sys4 = pc.System() sys4.read_inputfile("tests/bcc3.dat", frame=0) atoms = sys4.atoms assert atoms[0].pos == [0.0, 0, 0] #now cleanup os.remove("tests/bcc3.dat")
def test_rdf(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims rdf, r = sys.calculate_rdf() args = np.argsort(rdf) assert(np.round(r[args][-1], decimals=2) == 0.87) #test for an fcc type atoms, boxdims = pcs.make_crystal('fcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims rdf, r = sys.calculate_rdf() args = np.argsort(rdf) assert(np.round(r[args][-1], decimals=2) == 0.69)
def test_cna_cutoff(): atoms, box = pcs.make_crystal(structure="fcc", repetitions=(7, 7, 7), lattice_constant=4.00, noise=0.01) sys = pc.System() sys.atoms = atoms sys.box = box vec = sys.calculate_cna(cutoff=0.8536 * 4.1) assert vec[1] == 7 * 7 * 7 * 4
def test_voro_props(): atoms, boxdims = pcs.make_crystal('bcc', repetitions=[10, 10, 10]) sys = pc.System() sys.box = boxdims sys.atoms = atoms sys.find_neighbors(method='voronoi') sys.calculate_vorovector() atoms = sys.atoms atom = atoms[0]
def test_q_list(): #this might take a while, it will find all qs atoms, boxdims = pcs.make_crystal('bcc', repetitions=[4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method='voronoi') sys.calculate_q([2, 4], averaged=True) q = sys.get_qvals([2, 4], averaged=True)
def test_q_10(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method = 'voronoi') sys.calculate_q(10, averaged=True) q = sys.get_qvals(10, averaged=True) assert np.round(np.mean(np.array(q)), decimals=2) == 0.41
def test_cutoff(): atoms, box = pcs.make_crystal(structure="fcc", lattice_constant=4.07, repetitions=(6, 6, 6)) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_neighbors(method="cutoff", cutoff=0) sys.set_atom_cutoff(factor=2) atoms = sys.atoms assert (atoms[0].cutoff - 5.755849198858498) < 1E-5
def test_q_4(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims #sys.get_neighbors(method = 'voronoi') sys.find_neighbors(method = 'cutoff', cutoff=0.9) sys.calculate_q(4, averaged=True) q = sys.get_qvals(4, averaged=True) assert np.round(np.mean(np.array(q)), decimals=2) == 0.51 , "Calculated q4 value is wrong!"
def test_angular(): atoms, boxdims = pcs.make_crystal('diamond', repetitions=[4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method='voronoi') sys.calculate_angularcriteria() q = [atom.angular for atom in sys.atoms] assert np.round(np.mean(np.array(q)), decimals=2) == 0.00
def test_chiparamsbcc(): atoms, box = pcs.make_crystal('bcc', repetitions=[3, 3, 3], lattice_constant=4) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_neighbors(method='cutoff', cutoff=0) sys.calculate_chiparams() atoms = sys.atoms chip = atoms[2].chiparams assert chip == [3, 0, 0, 0, 36, 12, 0, 36, 0]
def test_q_access(): atoms, boxdims = pcs.make_crystal('bcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims #sys.get_neighbors(method = 'voronoi') sys.find_neighbors(method = 'cutoff', cutoff=0.9) sys.calculate_q([4, 6], averaged=True) atoms = sys.atoms assert np.round(sys.get_custom(atoms[1], ["aq4"]), decimals=2)[0] == 0.51 assert np.round(sys.get_custom(atoms[1], ["q4"]), decimals=2)[0] == 0.51
def test_system_nucsize_fraction(): #create some atoms atoms, boxdims = pcs.make_crystal('bcc', repetitions = [2, 2, 2], lattice_constant=3.20) sys = pc.System() sys.box = boxdims sys.atoms = atoms #test that atoms are set properly assert len(sys.atoms) == 16 #now calculate nucsize sys.find_neighbors(method='cutoff', cutoff=3.63) assert 16 == sys.find_solids(bonds=0.8, threshold=0.5, avgthreshold=0.6, cluster=True)
def test_neighbors_adaptive(): #create some atoms atoms, boxdims = pcs.make_crystal('bcc', repetitions = [6, 6, 6]) sys = pc.System() sys.box = boxdims sys.atoms = atoms #then lets find neighbors #SANN algo test sys.find_neighbors(method = 'cutoff', cutoff='adaptive') #any atom should have 8 neighbors atoms = sys.atoms assert atoms[0].coordination == 14
def test_q_2(): #this might take a while, it will find all qs atoms, boxdims = pcs.make_crystal('bcc', repetitions = [6, 6, 6]) sys = pc.System() sys.atoms = atoms sys.box = boxdims #sys.read_inputfile("tests/bcc.dat") sys.find_neighbors(method = 'voronoi') #sys.get_neighbors(method = 'cutoff', cutoff=0.9) sys.calculate_q(2) q = sys.get_qvals(2) assert np.round(np.mean(np.array(q)), decimals=2) == 0.00
def test_q_6_voro(): atoms, boxdims = pcs.make_crystal('fcc', repetitions = [4, 4, 4]) sys = pc.System() sys.atoms = atoms sys.box = boxdims sys.find_neighbors(method = 'voronoi') sys.calculate_q(6) q = sys.get_qvals(6) assert np.round(np.mean(np.array(q)), decimals=2) == 0.57 , "Calculated q4 value is wrong!" sys.calculate_q(6, only_averaged=True) q = sys.get_qvals(6, averaged=True) assert np.round(np.mean(np.array(q)), decimals=2) == 0.57 , "Calculated q4 value is wrong!"
def test_neighbors_diamond(): atoms, box = pcs.make_crystal(structure="diamond", lattice_constant=5.67, repetitions=(6, 6, 6)) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_diamond_neighbors() sys.calculate_q([4, 6], averaged=True) assert (np.mean(sys.get_qvals(4)) - 0.19094065395649326) < 1E-2 assert (np.mean(sys.get_qvals(6)) - 0.5745242597140696) < 1E-2 atoms, box = pcs.make_crystal(structure="fcc", lattice_constant=4.07, repetitions=(6, 6, 6)) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_neighbors(method="cutoff", cutoff=0) sys.calculate_q([4, 6], averaged=True) assert (np.mean(sys.get_qvals(4)) - 0.19094065395649326) < 1E-2 assert (np.mean(sys.get_qvals(6)) - 0.5745242597140696) < 1E-2 atoms, box = pcs.make_crystal(structure="fcc", lattice_constant=4.07, repetitions=(6, 6, 6)) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_diamond_neighbors() sys.calculate_q([4, 6], averaged=True) assert (np.mean(sys.get_qvals(4)) - 0.210287193019979) < 1E-2 assert (np.mean(sys.get_qvals(6)) - 0.2350776015575979) < 1E-2
def test_q4_condition(): atoms, boxdims = pcs.make_crystal('l12', repetitions = [8, 8, 8]) sys = pc.System() sys.box = boxdims sys.atoms = atoms sys.find_neighbors(method = 'cutoff', cutoff=0.9) sys.find_solids() sys.calculate_q(4, condition="solid") q = sys.get_qvals(4) assert np.round(np.mean(np.array(q)), decimals=2) == 0.19 , "Calculated q4 value is wrong!" sys.calculate_q(4, clear_condition=True, only_averaged=True) q = sys.get_qvals(4, averaged=True) assert np.round(np.mean(np.array(q)), decimals=2) == 0.19 , "Calculated q4 value is wrong!"
def test_file_system(): atoms, boxdims = pcs.make_crystal('bcc', repetitions=[1, 1, 1]) sys = pc.System() sys.box = boxdims sys.atoms = atoms sys.find_neighbors(method='voronoi') sys.to_file('tests/tjkf.dat') #now try to read in the file sys2 = pc.System() sys2.read_inputfile('tests/tjkf.dat') assert len(sys2.atoms) == 2 #now add some custom values atoms[0].custom = {"velocity": 12} atoms[1].custom = {"velocity": 24} #now try to read in the file sys3 = pc.System() sys3.box = boxdims sys3.atoms = atoms sys3.to_file('tests/tjkf.dat', customkeys=['velocity']) #now read it again sys4 = pc.System() sys4.read_inputfile('tests/tjkf.dat', customkeys=['velocity']) #now get atoms and check them atoms = sys4.atoms assert int(atoms[0].custom['velocity']) == 12 assert int(atoms[1].custom['velocity']) == 24 sys4.to_file('tests/tjkf.dat.gz', customkeys=['velocity'], compressed=True) #now read it again sys5 = pc.System() sys5.read_inputfile('tests/tjkf.dat.gz', customkeys=['velocity']) #now get atoms and check them atoms = sys5.atoms assert int(atoms[0].custom['velocity']) == 12 assert int(atoms[1].custom['velocity']) == 24 sys6 = pc.System() sys6.read_inputfile('tests/tjkf.dat') sys6.to_file('tests/poscar_1', format="poscar", species=['Mo']) sys6.to_file('tests/data_1', format="lammps-data", species=['Mo'])
def test_q_2(): #this might take a while, it will find all qs atoms, boxdims = pcs.make_crystal('bcc', repetitions=[6, 6, 6]) sys = pc.System() sys.atoms = atoms sys.box = boxdims #sys.read_inputfile("tests/bcc.dat") sys.find_neighbors(method='voronoi') atoms = sys.atoms vols = [] avgvols = [] for atom in atoms: vols.append(atom.volume) avgvols.append(atom.avg_volume) assert np.mean(np.array(vols)) == 0.5 assert np.mean(np.array(avgvols)) == 0.5
def test_system_atom_access(): #create some atoms atoms, boxdims = pcs.make_crystal('bcc') sys = pc.System() sys.box = boxdims sys.atoms = atoms #fetch an atom xoxo = sys.get_atom(0) assert xoxo.pos == [0, 0, 0] #change pos pf ayom xoxo.pos = [1.1, 2.1, 3.1] sys.set_atom(xoxo) atom = sys.get_atom(0) assert atom.pos == [1.1, 2.1, 3.1]
def test_neighbors_number(): atoms, box = pcs.make_crystal(structure="fcc", repetitions=(3, 3, 3), lattice_constant=4.00) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_neighbors(method="number", nmax=8) atoms = sys.atoms nns = np.mean([atom.coordination for atom in atoms]) assert nns == 8 sys.find_neighbors(method="number", nmax=12) atoms = sys.atoms nns = np.mean([atom.coordination for atom in atoms]) assert nns == 12
def test_cs_ges(): atoms, boxdims = pcs.make_crystal('bcc', repetitions=[4, 4, 4], lattice_constant=4.00) sys = pc.System() sys.box = boxdims sys.atoms = atoms sys.calculate_centrosymmetry(nmax=8) atoms = sys.atoms q = [atom.centrosymmetry for atom in atoms] assert np.round(np.mean(np.array(q)), decimals=2) == 0.00 sys.calculate_centrosymmetry(nmax=12) atoms = sys.atoms q = [atom.centrosymmetry for atom in atoms] assert np.round(np.mean(np.array(q)), decimals=2) > 0.00
def test_sro(): atoms, box = pcs.make_crystal('l12', lattice_constant=4.00, repetitions=[2,2,2]) sys = pc.System() sys.box = box sys.atoms = atoms sys.find_neighbors(method='cutoff', cutoff=4.5) sro = sys.calculate_sro(reference_type=1, average=True) assert np.round(sro[0], decimals=2) == -0.33 assert sro[1] == 1.0 atoms = sys.atoms sro = atoms[4].sro assert np.round(sro[0], decimals=2) == -0.33 assert sro[1] == 1.0 sys.find_neighbors(method='cutoff', cutoff=4.5) sro = sys.calculate_sro(reference_type=1, average=True, shells=1) assert np.round(sro[0], decimals=2) == 0.11