class TestAtom(object): def setUp(self): self.C = Atom['C'] self.C3 = Atom('C', orbs=3) self.Au = Atom['Au'] self.PT = PeriodicTable() def tearDown(self): del self.C del self.Au del self.C3 del self.PT def test1(self): assert_true(self.C == Atom['C']) assert_true(self.C == Atom[self.C]) assert_true(self.C == Atom[Atom['C']]) assert_true(self.C == Atom[Atom(6)]) assert_true(self.Au == Atom['Au']) assert_true(self.Au != self.C) assert_false(self.Au == self.C) assert_true(self.Au == self.Au.copy()) def test2(self): C = Atom('C', R=20) assert_false(self.C == C) Au = Atom('Au', R=20) assert_false(self.C == Au) C = Atom['C'] assert_false(self.Au == C) Au = Atom['Au'] assert_false(self.C == Au) def test3(self): assert_true(self.C.symbol == 'C') assert_true(self.Au.symbol == 'Au') def test4(self): assert_true(self.C.mass > 0) assert_true(self.Au.mass > 0) def test5(self): assert_true(Atom(Z=1, mass=12).mass == 12) assert_true(Atom(Z=31, mass=12).mass == 12) assert_true(Atom(Z=31, mass=12).Z == 31) def test6(self): assert_true(Atom(Z=1, orbs=3).orbs == 3) assert_true(len(Atom(Z=1, orbs=3)) == 3) assert_true(Atom(Z=1, R=1.4).R == 1.4) assert_true(Atom(Z=1, R=1.4).maxR() == 1.4) assert_true(Atom(Z=1, R=[1.4, 1.8]).orbs == 2) assert_true(Atom(Z=1, R=[1.4, 1.8]).maxR() == 1.8) def test7(self): assert_true(Atom(Z=1, orbs=3).radius() > 0.) assert_true(len(str(Atom(Z=1, orbs=3)))) def test8(self): a = self.PT.Z([1, 2]) assert_true(len(a) == 2) assert_true(a[0] == 1) assert_true(a[1] == 2) def test9(self): a = self.PT.Z_label(['H', 2]) assert_true(len(a) == 2) assert_true(a[0] == 'H') assert_true(a[1] == 'He') a = self.PT.Z_label(1) assert_true(a == 'H') def test10(self): assert_equal(self.PT.atomic_mass(1), self.PT.atomic_mass('H')) assert_true(np.allclose(self.PT.atomic_mass([1, 2]), self.PT.atomic_mass(['H', 'He']))) def test11(self): PT = self.PT for m in ['calc', 'empirical', 'vdw']: assert_equal(PT.radius(1, method=m), PT.radius('H', method=m)) assert_true(np.allclose(PT.radius([1, 2], method=m), PT.radius(['H', 'He'], method=m))) @raises(KeyError) def test12(self): a = Atom(1.2) def test_pickle(self): import pickle as p sC = p.dumps(self.C) sC3 = p.dumps(self.C3) sAu = p.dumps(self.Au) C = p.loads(sC) C3 = p.loads(sC3) Au = p.loads(sAu) assert_false(Au == C) assert_true(Au != C) assert_true(C == self.C) assert_true(C3 == self.C3) assert_false(C == self.Au) assert_true(Au == self.Au) assert_true(Au != self.C)
class TestAtom(object): def setUp(self): self.C = Atom['C'] self.C3 = Atom('C', orbs=3) self.Au = Atom['Au'] self.PT = PeriodicTable() def tearDown(self): del self.C del self.Au del self.C3 del self.PT def test1(self): assert_true(self.C == Atom['C']) assert_true(self.Au == Atom['Au']) assert_true(self.Au != self.C) assert_false(self.Au == self.C) assert_true(self.Au == self.Au.copy()) def test2(self): C = Atom('C', R=20) assert_false(self.C == C) Au = Atom('Au', R=20) assert_false(self.C == Au) C = Atom['C'] assert_false(self.Au == C) Au = Atom['Au'] assert_false(self.C == Au) def test3(self): assert_true(self.C.symbol == 'C') assert_true(self.Au.symbol == 'Au') def test4(self): assert_true(self.C.mass > 0) assert_true(self.Au.mass > 0) def test5(self): assert_true(Atom(Z=1, mass=12).mass == 12) assert_true(Atom(Z=31, mass=12).mass == 12) assert_true(Atom(Z=31, mass=12).Z == 31) def test6(self): assert_true(Atom(Z=1, orbs=3).orbs == 3) assert_true(len(Atom(Z=1, orbs=3)) == 3) assert_true(Atom(Z=1, R=1.4).R == 1.4) assert_true(Atom(Z=1, R=1.4).dR == 1.4) assert_true(Atom(Z=1, R=[1.4, 1.8]).orbs == 2) def test7(self): assert_true(Atom(Z=1, orbs=3).radius() > 0.) assert_true(len(str(Atom(Z=1, orbs=3)))) def test8(self): a = self.PT.Z([1, 2]) assert_true(len(a) == 2) assert_true(a[0] == 1) assert_true(a[1] == 2) def test9(self): a = self.PT.Z_label(['H', 2]) assert_true(len(a) == 2) assert_true(a[0] == 'H') assert_true(a[1] == 'He') a = self.PT.Z_label(1) assert_true(a == 'H') def test_pickle(self): import pickle as p sC = p.dumps(self.C) sC3 = p.dumps(self.C3) sAu = p.dumps(self.Au) C = p.loads(sC) C3 = p.loads(sC3) Au = p.loads(sAu) assert_false(Au == C) assert_true(Au != C) assert_true(C == self.C) assert_true(C3 == self.C3) assert_false(C == self.Au) assert_true(Au == self.Au) assert_true(Au != self.C)
def _r_geometry_multiple(self, steps, ret_data=False, squeeze=False): asteps = steps steps = dict((step, i) for i, step in enumerate(steps)) # initialize all things cell = [None] * len(steps) cell_set = [False] * len(steps) xyz_set = [False] * len(steps) atom = [None for _ in steps] xyz = [None for _ in steps] data = [None for _ in steps] data_set = [not ret_data for _ in steps] line = " " all_loaded = False pt = PeriodicTable() while line != '' and not all_loaded: line = self.readline() if line.isspace(): continue kw = line.split()[0] if kw not in ("CONVVEC", "PRIMVEC", "PRIMCOORD"): continue step = _get_kw_index(line) if step != -1 and step not in steps: continue if step not in steps and step == -1: step = idstep = istep = None else: idstep = steps[step] istep = idstep if kw == "CONVVEC": if step is None: if not any(cell_set): cell_set = [True] * len(cell_set) else: continue elif cell_set[istep]: continue else: cell_set[istep] = True icell = _a.zerosd([3, 3]) for i in range(3): line = self.readline() icell[i] = line.split() if step is None: cell = [icell] * len(cell) else: cell[istep] = icell elif kw == "PRIMVEC": if step is None: cell_set = [True] * len(cell_set) else: cell_set[istep] = True icell = _a.zerosd([3, 3]) for i in range(3): line = self.readline() icell[i] = line.split() if step is None: cell = [icell] * len(cell) else: cell[istep] = icell elif kw == "PRIMCOORD": if step is None: raise ValueError(f"{self.__class__.__name__}" " contains an unindexed (or somehow malformed) 'PRIMCOORD'" " section but you've asked for a particular index. This" f" shouldn't happen. line:\n {line}" ) iatom = [] ixyz = [] idata = [] line = self.readline().split() for _ in range(int(line[0])): line = self.readline().split() if not xyz_set[istep]: iatom.append(pt.Z(line[0])) ixyz.append([float(x) for x in line[1:4]]) if ret_data and len(line) > 4: idata.append([float(x) for x in line[4:]]) if not xyz_set[istep]: atom[istep] = iatom xyz[istep] = ixyz xyz_set[istep] = True data[idstep] = idata data_set[idstep] = True all_loaded = all(xyz_set) and all(cell_set) and all(data_set) if not all(xyz_set): which = [asteps[i] for i in np.flatnonzero(xyz_set)] raise ValueError(f"{self.__class__.__name__} file did not contain atom coordinates for the following requested index: {which}") if ret_data: data = _a.arrayd(data) if data.size == 0: data.shape = (len(steps), len(xyz[0]), 0) xyz = _a.arrayd(xyz) cell = _a.arrayd(cell) atom = _a.arrayi(atom) geoms = [] for istep in range(len(steps)): if len(atom) == 0: geoms.append(Geometry(xyz[istep], sc=SuperCell(cell[istep]))) elif len(atom[0]) == 1 and atom[0][0] == -999: # should we perhaps do AtomUnknown? geoms.append(None) else: geoms.append(Geometry(xyz[istep], atoms=atom[istep], sc=SuperCell(cell[istep]))) if squeeze and len(steps) == 1: geoms = geoms[0] if ret_data: data = data[0] if ret_data: return geoms, data return geoms