def test_xyz(self): "Atom: xyz cartesian attribute" from danse.ins.matter import Lattice C = Atom('C', [0.1, 0.2, 0.3], lattice=Lattice(2, 2, 2, 90, 90, 90)) print "fractional pos=%s" % C.xyz print "cartesian pos=%s" % C.xyz_cartn return
def test_writeStr_xyz(self): """check string representation of normal xyz file""" stru = self.stru stru.description = "test of writeStr" stru.lattice = Lattice(1.0, 2.0, 3.0, 90.0, 90.0, 90.0) stru[:] = [Atom('H', [1., 1., 1.]), Atom('Cl', [3., 2., 1.])] s1 = stru.writeStr(self.format) s1 = re.sub('[ \t]+', ' ', s1) s0 = "2\n%s\nH 1 2 3\nCl 3 4 3\n" % stru.description self.assertEqual(s1, s0)
def test_writeStr_rawxyz(self): """check writing of normal xyz file""" stru = self.stru stru.description = "test of writeStr" stru.lattice = Lattice(1.0, 2.0, 3.0, 90.0, 90.0, 90.0) # plain version stru[:] = [Atom('H', [1., 1., 1.])] s1 = stru.writeStr(self.format) s1 = re.sub('[ \t]+', ' ', s1) s0 = "H 1 2 3\n"
def test_writeStr_xyz_Supercell(self): at1 = Atom('Al', [0.0, 0.0, 0.0]) at2 = Atom('Al', [0.0, 0.5, 0.5]) at3 = Atom('Al', [0.5, 0.0, 0.5]) at4 = Atom('Al', [0.5, 0.5, 0.0]) self.stru4 = Structure([at1, at2, at3, at4], lattice=Lattice(4.05, 4.05, 4.05, 90, 90, 90), sgid=225) from danse.ins.matter.expansion import supercell al_333 = supercell(self.stru4, (3, 3, 3)) s1 = al_333.writeStr(self.format)
def test_write_xyz(self): """check writing of normal xyz file""" stru = self.stru stru.description = "test of writeStr" stru.lattice = Lattice(1.0, 2.0, 3.0, 90.0, 90.0, 90.0) stru[:] = [Atom('H', [1., 1., 1.]), Atom('Cl', [3., 2., 1.])] stru.write(self.tmpname, self.format) f_s = open(self.tmpname).read() f_s = re.sub('[ \t]+', ' ', f_s) s_s = "2\n%s\nH 1 2 3\nCl 3 4 3\n" % stru.description self.assertEqual(f_s, s_s)
def setUp(self): self.lattice = Lattice() self.places = 12 return
class TestLattice(unittest.TestCase): """test methods of Lattice class""" def setUp(self): self.lattice = Lattice() self.places = 12 return def assertListAlmostEqual(self, l1, l2, places=None): """wrapper for list comparison""" if places is None: places = self.places self.assertEqual(len(l1), len(l2)) for i in range(len(l1)): self.assertAlmostEqual(l1[i], l2[i], places) def test_setLatPar(self): """check calculation of standard unit cell vectors""" from numpy import dot from math import radians, sqrt, cos, sin norm = lambda x : sqrt(sum([xi**2 for xi in x])) cosd = lambda x : cos(radians(x)) sind = lambda x : sin(radians(x)) self.lattice.setLatPar(1.0, 2.0, 3.0, 80, 100, 120) base = self.lattice.base self.assertAlmostEqual(1.0, norm(base[0]), self.places) self.assertAlmostEqual(2.0, norm(base[1]), self.places) self.assertAlmostEqual(3.0, norm(base[2]), self.places) self.assertAlmostEqual(cosd(80.0), dot(base[1],base[2])/(2*3), self.places) self.assertAlmostEqual(cosd(100.0), dot(base[0],base[2])/(1*3), self.places) self.assertAlmostEqual(cosd(120.0), dot(base[0],base[1])/(1*2), self.places) def test_setLatBase(self): """check calculation of unit cell rotation""" import numpy import numpy.linalg as numalg base = numpy.array([[ 1.0, 1.0, 0.0], [ 0.0, 1.0, 1.0], [ 1.0, 0.0, 1.0]]) self.lattice.setLatBase(base) self.assertAlmostEqual(self.lattice.a, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.b, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.c, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.alpha, 60.0, self.places) self.assertAlmostEqual(self.lattice.beta, 60.0, self.places) self.assertAlmostEqual(self.lattice.gamma, 60.0, self.places) detR0 = numalg.det(self.lattice.baserot) self.assertAlmostEqual(detR0, 1.0, self.places) # try if rotation matrix works self.assertEqual(numpy.all(base == self.lattice.base), True) self.lattice.setLatPar(alpha=44, beta=66, gamma=88) self.assertNotEqual(numpy.all(base == self.lattice.base), True) self.lattice.setLatPar(alpha=60, beta=60, gamma=60) self.assertListAlmostEqual(base[0], self.lattice.base[0]) self.assertListAlmostEqual(base[1], self.lattice.base[1]) self.assertListAlmostEqual(base[2], self.lattice.base[2]) # try base checking self.assertRaises(LatticeError, self.lattice.setLatBase, [[1, 0, 0], [1,0,0], [0,0,1]]) self.assertRaises(LatticeError, self.lattice.setLatBase, [[1, 0, 0], [0,0,1], [0,1,0]]) return def test_repr(self): """check string representation of this lattice""" r = repr(self.lattice) self.assertEqual(r, "Lattice()") self.lattice.setLatPar(1, 2, 3, 10, 20, 30) r = repr(self.lattice) r0 = "Lattice(a=1, b=2, c=3, alpha=10, beta=20, gamma=30)" self.assertEqual(r, r0) base = [[ 1.0, 1.0, 0.0], [ 0.0, 2.0, 2.0], [ 3.0, 0.0, 3.0]] self.lattice.setLatBase(base) r = repr(self.lattice) self.assertEqual(r, "Lattice(base=%r)" % self.lattice.base) def test_monkhorst_pack(self): self.lattice.setLatPar(3, 3, 3, 90, 90, 90) grid = (2,2,2) print self.lattice.getMonkhorstPackGrid(grid) print self.lattice.getFracMonkhorstPackGrid(grid)
def parseLines(self, lines): """Parse list of lines in PDFfit format. Return Structure object or raise StructureFormatError. """ p_nl = 0 rlist = [] try: self.stru = PDFFitStructure() stru = self.stru cell_line_read = False stop = len(lines) while stop > 0 and lines[stop - 1].strip() == "": stop -= 1 ilines = iter(lines[:stop]) # read header of PDFFit file for l in ilines: p_nl += 1 words = l.split() if len(words) == 0 or words[0][0] == '#': continue elif words[0] == 'title': stru.description = l.lstrip()[5:].strip() elif words[0] == 'scale': stru.pdffit['scale'] = float(words[1]) elif words[0] == 'sharp': l1 = l.replace(',', ' ') sharp_pars = [float(w) for w in l1.split()[1:]] if len(sharp_pars) < 4: stru.pdffit['delta2'] = sharp_pars[0] stru.pdffit['sratio'] = sharp_pars[1] stru.pdffit['rcut'] = sharp_pars[2] else: stru.pdffit['delta2'] = sharp_pars[0] stru.pdffit['delta1'] = sharp_pars[1] stru.pdffit['sratio'] = sharp_pars[2] stru.pdffit['rcut'] = sharp_pars[3] elif words[0] == 'spcgr': key = 'spcgr' start = l.find(key) + len(key) value = l[start:].strip() stru.pdffit['spcgr'] = value elif words[0] == 'shape': self._parse_shape(l) elif words[0] == 'cell': cell_line_read = True l1 = l.replace(',', ' ') latpars = [float(w) for w in l1.split()[1:7]] stru.lattice = Lattice(*latpars) elif words[0] == 'dcell': l1 = l.replace(',', ' ') stru.pdffit['dcell'] = [float(w) for w in l1.split()[1:7]] elif words[0] == 'ncell': l1 = l.replace(',', ' ') stru.pdffit['ncell'] = [int(w) for w in l1.split()[1:5]] elif words[0] == 'format': if words[1] != 'pdffit': emsg = "%d: file is not in PDFfit format" % p_nl raise StructureFormatError(emsg) elif words[0] == 'atoms' and cell_line_read: break else: self.ignored_lines.append(l) # Header reading finished, check if required lines were present. if not cell_line_read: emsg = "%d: file is not in PDFfit format" % p_nl raise StructureFormatError(emsg) # Load data from atom entries. p_natoms = reduce(lambda x, y: x * y, stru.pdffit['ncell']) # we are now inside data block for l in ilines: p_nl += 1 wl1 = l.split() element = wl1[0][0].upper() + wl1[0][1:].lower() xyz = [float(w) for w in wl1[1:4]] occ = float(wl1[4]) stru.addNewAtom(element, xyz=xyz, occupancy=occ) a = stru.getLastAtom() p_nl += 1 wl2 = ilines.next().split() a.sigxyz = [float(w) for w in wl2[0:3]] a.sigo = float(wl2[3]) p_nl += 1 wl3 = ilines.next().split() p_nl += 1 wl4 = ilines.next().split() p_nl += 1 wl5 = ilines.next().split() p_nl += 1 wl6 = ilines.next().split() a.sigU = numpy.zeros((3, 3), dtype=float) a.U11 = float(wl3[0]) a.U22 = float(wl3[1]) a.U33 = float(wl3[2]) a.sigU[0, 0] = float(wl4[0]) a.sigU[1, 1] = float(wl4[1]) a.sigU[2, 2] = float(wl4[2]) a.U12 = float(wl5[0]) a.U13 = float(wl5[1]) a.U23 = float(wl5[2]) a.sigU[0, 1] = a.sigU[1, 0] = float(wl6[0]) a.sigU[0, 2] = a.sigU[2, 0] = float(wl6[1]) a.sigU[1, 2] = a.sigU[2, 1] = float(wl6[2]) if len(stru) != p_natoms: emsg = "expected %d atoms, read %d" % (p_natoms, len(stru)) raise StructureFormatError(emsg) if stru.pdffit['ncell'][:3] != [1, 1, 1]: superlatpars = [ latpars[i] * stru.pdffit['ncell'][i] for i in range(3) ] + latpars[3:] superlattice = Lattice(*superlatpars) stru.placeInLattice(superlattice) stru.pdffit['ncell'] = [1, 1, 1, p_natoms] except (ValueError, IndexError): emsg = "%d: file is not in PDFfit format" % p_nl exc_type, exc_value, exc_traceback = sys.exc_info() raise StructureFormatError, emsg, exc_traceback return stru
class TestLattice(unittest.TestCase): """test methods of Lattice class""" def setUp(self): self.lattice = Lattice() self.places = 12 return def assertListAlmostEqual(self, l1, l2, places=None): """wrapper for list comparison""" if places is None: places = self.places self.assertEqual(len(l1), len(l2)) for i in range(len(l1)): self.assertAlmostEqual(l1[i], l2[i], places) def test_setLatPar(self): """check calculation of standard unit cell vectors""" from numpy import dot from math import radians, sqrt, cos, sin norm = lambda x: sqrt(sum([xi**2 for xi in x])) cosd = lambda x: cos(radians(x)) sind = lambda x: sin(radians(x)) self.lattice.setLatPar(1.0, 2.0, 3.0, 80, 100, 120) base = self.lattice.base self.assertAlmostEqual(1.0, norm(base[0]), self.places) self.assertAlmostEqual(2.0, norm(base[1]), self.places) self.assertAlmostEqual(3.0, norm(base[2]), self.places) self.assertAlmostEqual(cosd(80.0), dot(base[1], base[2]) / (2 * 3), self.places) self.assertAlmostEqual(cosd(100.0), dot(base[0], base[2]) / (1 * 3), self.places) self.assertAlmostEqual(cosd(120.0), dot(base[0], base[1]) / (1 * 2), self.places) def test_setLatBase(self): """check calculation of unit cell rotation""" import numpy import numpy.linalg as numalg base = numpy.array([[1.0, 1.0, 0.0], [0.0, 1.0, 1.0], [1.0, 0.0, 1.0]]) self.lattice.setLatBase(base) self.assertAlmostEqual(self.lattice.a, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.b, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.c, numpy.sqrt(2.0), self.places) self.assertAlmostEqual(self.lattice.alpha, 60.0, self.places) self.assertAlmostEqual(self.lattice.beta, 60.0, self.places) self.assertAlmostEqual(self.lattice.gamma, 60.0, self.places) detR0 = numalg.det(self.lattice.baserot) self.assertAlmostEqual(detR0, 1.0, self.places) # try if rotation matrix works self.assertEqual(numpy.all(base == self.lattice.base), True) self.lattice.setLatPar(alpha=44, beta=66, gamma=88) self.assertNotEqual(numpy.all(base == self.lattice.base), True) self.lattice.setLatPar(alpha=60, beta=60, gamma=60) self.assertListAlmostEqual(base[0], self.lattice.base[0]) self.assertListAlmostEqual(base[1], self.lattice.base[1]) self.assertListAlmostEqual(base[2], self.lattice.base[2]) # try base checking self.assertRaises(LatticeError, self.lattice.setLatBase, [[1, 0, 0], [1, 0, 0], [0, 0, 1]]) self.assertRaises(LatticeError, self.lattice.setLatBase, [[1, 0, 0], [0, 0, 1], [0, 1, 0]]) return def test_repr(self): """check string representation of this lattice""" r = repr(self.lattice) self.assertEqual(r, "Lattice()") self.lattice.setLatPar(1, 2, 3, 10, 20, 30) r = repr(self.lattice) r0 = "Lattice(a=1, b=2, c=3, alpha=10, beta=20, gamma=30)" self.assertEqual(r, r0) base = [[1.0, 1.0, 0.0], [0.0, 2.0, 2.0], [3.0, 0.0, 3.0]] self.lattice.setLatBase(base) r = repr(self.lattice) self.assertEqual(r, "Lattice(base=%r)" % self.lattice.base) def test_monkhorst_pack(self): self.lattice.setLatPar(3, 3, 3, 90, 90, 90) grid = (2, 2, 2) print self.lattice.getMonkhorstPackGrid(grid) print self.lattice.getFracMonkhorstPackGrid(grid)