Ejemplo n.º 1
0
    def test_parameters(self):

        folder = os.path.abspath(os.path.join(directory, '..', 'data'))

        constants = crystal.parameters(folder=folder, filename='CaTiOSiO4.cif')

        a, b, c, alpha, beta, gamma = constants

        self.assertAlmostEqual(a, 7.069)
        self.assertAlmostEqual(b, 8.722)
        self.assertAlmostEqual(c, 6.566)
        self.assertAlmostEqual(alpha, np.deg2rad(90))
        self.assertAlmostEqual(beta, np.deg2rad(113.86))
        self.assertAlmostEqual(gamma, np.deg2rad(90))
Ejemplo n.º 2
0
    def test_pairs(self):

        folder = os.path.abspath(os.path.join(directory, '..', 'data'))

        uc_dict = crystal.unitcell(folder=folder, filename='CaTiOSiO4.cif')

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        atms = uc_dict['atom']

        constants = crystal.parameters(folder=folder, filename='CaTiOSiO4.cif')

        A = crystal.cartesian(*constants)

        pair_dict = crystal.pairs(u, v, w, atms, A)

        pairs = []
        coordination = []
        for i in pair_dict.keys():
            atm = atms[i]
            if (atm != 'O'):
                pair_num, pair_atm = list(pair_dict[i])[0]
                coord_num = len(pair_dict[i][(pair_num, pair_atm)][0])
            pairs.append('_'.join((atm, pair_atm)))
            coordination.append(coord_num)

        pairs = np.array(pairs)
        coordination = np.array(coordination)

        mask = pairs == 'Ca_O'
        np.testing.assert_array_equal(coordination[mask], 7)

        mask = pairs == 'Ti_O'
        np.testing.assert_array_equal(coordination[mask], 6)

        mask = pairs == 'Si_O'
        np.testing.assert_array_equal(coordination[mask], 4)

        uc_dict = crystal.unitcell(folder=folder, filename='Tb2Ir3Ga9.cif')

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        atms = uc_dict['atom']

        constants = crystal.parameters(folder=folder, filename='Tb2Ir3Ga9.cif')

        A = crystal.cartesian(*constants)

        pair_dict = crystal.pairs(u, v, w, atms, A)

        pairs = []
        for i in pair_dict.keys():
            atm = atms[i]
            if (atm == 'Tb'):
                for pair in pair_dict[i].keys():
                    if pair[1] == 'Tb':
                        for ind in pair_dict[i][pair][0]:
                            pairs.append([i, ind])

        pairs = np.unique(pairs)

        self.assertEqual(pairs.size, (atms == 'Tb').sum())

        pair_dict = crystal.pairs(u, v, w, atms, A, extend=True)

        for i in pair_dict.keys():
            d_ref = 0
            for pair in pair_dict[i].keys():
                j, atm_j = pair
                for j, img in zip(*pair_dict[i][pair]):
                    du = u[j] - u[i] + img[0]
                    dv = v[j] - v[i] + img[1]
                    dw = w[j] - w[i] + img[2]
                    dx, dy, dz = crystal.transform(du, dv, dw, A)
                    d = np.sqrt(dx**2 + dy**2 + dz**2)
                    self.assertGreaterEqual(np.round(d, 6), np.round(d_ref, 6))
                    self.assertEqual(atms[j], atm_j)
                    d_ref = d
Ejemplo n.º 3
0
    def test_disordered(self):

        folder = os.path.abspath(os.path.join(directory, '..', 'data'))

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='CaTiOSiO4.cif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        mom = uc_dict['moment']
        atm = uc_dict['atom']
        n_atm = uc_dict['n_atom']

        nu, nv, nw = 2, 3, 4

        constants = crystal.parameters(folder=folder, filename='CaTiOSiO4.cif')

        A = crystal.cartesian(*constants)
        C = crystal.cartesian_moment(*constants)
        D = crystal.cartesian_displacement(*constants)

        ux, uy, uz = crystal.transform(u, v, w, A)

        ix, iy, iz = space.cell(nu, nv, nw, A)

        rx, ry, rz, atms = space.real(ux, uy, uz, ix, iy, iz, atm)

        U11, U22, U33, U23, U13, U12 = disp.T
        U = np.row_stack(displacive.cartesian(U11, U22, U33, U23, U13, U12, D))
        Ux, Uy, Uz = displacive.expansion(nu, nv, nw, n_atm, U)

        A_r = occupational.composition(nu, nv, nw, n_atm, occ)
        delta = (occ * (1 + A_r.reshape(nu, nv, nw, n_atm))).flatten()

        mu1, mu2, mu3 = mom.T
        mu = np.row_stack(magnetic.cartesian(mu1, mu2, mu3, C))
        Sx, Sy, Sz = magnetic.spin(nu, nv, nw, n_atm, mu)

        crystal.disordered(delta,
                           Ux,
                           Uy,
                           Uz,
                           Sx,
                           Sy,
                           Sz,
                           rx,
                           ry,
                           rz,
                           nu,
                           nv,
                           nw,
                           atm,
                           A,
                           folder + '/disordered_CaTiOSiO4.cif',
                           folder=folder,
                           filename='CaTiOSiO4.cif',
                           ulim=[0, nu],
                           vlim=[0, nv],
                           wlim=[0, nw])

        UC_dict = crystal.unitcell(folder=folder,
                                   filename='disordered_CaTiOSiO4.cif',
                                   tol=1e-4)

        Atm = UC_dict['atom']

        np.testing.assert_array_equal(atms == Atm, True)

        os.remove(folder + '/disordered_CaTiOSiO4.cif')

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='CuMnO2.mcif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        mom = uc_dict['moment']
        atm = uc_dict['atom']
        n_atm = uc_dict['n_atom']

        nu, nv, nw = 2, 3, 4

        constants = crystal.parameters(folder=folder, filename='CuMnO2.mcif')

        A = crystal.cartesian(*constants)
        C = crystal.cartesian_moment(*constants)
        D = crystal.cartesian_displacement(*constants)

        ux, uy, uz = crystal.transform(u, v, w, A)

        ix, iy, iz = space.cell(nu, nv, nw, A)

        rx, ry, rz, atms = space.real(ux, uy, uz, ix, iy, iz, atm)

        Uiso = disp.flatten()
        Ux, Uy, Uz = displacive.expansion(nu, nv, nw, n_atm, Uiso)

        A_r = occupational.composition(nu, nv, nw, n_atm, occ)
        delta = (occ * (1 + A_r.reshape(nu, nv, nw, n_atm))).flatten()

        mu1, mu2, mu3 = mom.T
        mu = np.row_stack(magnetic.cartesian(mu1, mu2, mu3, C))
        Sx, Sy, Sz = magnetic.spin(nu, nv, nw, n_atm, mu)

        crystal.disordered(delta,
                           Ux,
                           Uy,
                           Uz,
                           Sx,
                           Sy,
                           Sz,
                           rx,
                           ry,
                           rz,
                           nu,
                           nv,
                           nw,
                           atm,
                           A,
                           folder + '/disordered_CuMnO2.mcif',
                           folder=folder,
                           filename='CuMnO2.mcif',
                           ulim=[0, nu],
                           vlim=[0, nv],
                           wlim=[0, nw])

        UC_dict = crystal.unitcell(folder=folder,
                                   filename='disordered_CuMnO2.mcif',
                                   tol=1e-4)

        Atm = UC_dict['atom']

        np.testing.assert_array_equal(atms == Atm, True)

        os.remove(folder + '/disordered_CuMnO2.mcif')
Ejemplo n.º 4
0
    def test_supercell(self):

        folder = os.path.abspath(os.path.join(directory, '..', 'data'))

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='CaTiOSiO4.cif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        mom = uc_dict['moment']
        atm = uc_dict['atom']
        n_atm = uc_dict['n_atom']

        constants = crystal.parameters(folder=folder, filename='CaTiOSiO4.cif')

        a, b, c, alpha, beta, gamma = constants

        nu, nv, nw = 2, 3, 1

        crystal.supercell(atm,
                          occ,
                          disp,
                          mom,
                          u,
                          v,
                          w,
                          nu,
                          nv,
                          nw,
                          folder + '/supercell_CaTiOSiO4.cif',
                          folder=folder,
                          filename='CaTiOSiO4.cif')

        UC_dict = crystal.unitcell(folder=folder,
                                   filename='supercell_CaTiOSiO4.cif',
                                   tol=1e-4)

        U = UC_dict['u']
        V = UC_dict['v']
        W = UC_dict['w']
        Occ = UC_dict['occupancy']
        Disp = UC_dict['displacement']
        Mom = UC_dict['moment']
        Atm = UC_dict['atom']
        N_atm = UC_dict['n_atom']

        Constants = crystal.parameters(folder=folder,
                                       filename='supercell_CaTiOSiO4.cif')

        A, B, C, Alpha, Beta, Gamma = Constants

        n_uvw = nu * nv * nw

        i, j, k = np.meshgrid(np.arange(nu),
                              np.arange(nv),
                              np.arange(nw),
                              indexing='ij')

        i = i.flatten()[:, np.newaxis]
        j = j.flatten()[:, np.newaxis]
        k = k.flatten()[:, np.newaxis]

        np.testing.assert_array_almost_equal((i + u).flatten(), nu * U, 4)
        np.testing.assert_array_almost_equal((j + v).flatten(), nv * V, 4)
        np.testing.assert_array_almost_equal((k + w).flatten(), nw * W, 4)

        np.testing.assert_array_equal(np.tile(atm, n_uvw), Atm)
        np.testing.assert_array_almost_equal(np.tile(occ, n_uvw), Occ)
        np.testing.assert_array_almost_equal(np.tile(disp.T, n_uvw).T, Disp)

        self.assertEqual(n_atm * n_uvw, N_atm)

        self.assertAlmostEqual(a * nu, A)
        self.assertAlmostEqual(b * nv, B)
        self.assertAlmostEqual(c * nw, C)

        self.assertAlmostEqual(alpha, Alpha)
        self.assertAlmostEqual(beta, Beta)
        self.assertAlmostEqual(gamma, Gamma)

        os.remove(folder + '/supercell_CaTiOSiO4.cif')

        # ---

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='CuMnO2.mcif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        mom = uc_dict['moment']
        atm = uc_dict['atom']
        n_atm = uc_dict['n_atom']

        nu, nv, nw = 1, 2, 3

        crystal.supercell(atm,
                          occ,
                          disp,
                          mom,
                          u,
                          v,
                          w,
                          nu,
                          nv,
                          nw,
                          folder + '/supercell_CuMnO2.mcif',
                          folder=folder,
                          filename='CuMnO2.mcif')

        UC_dict = crystal.unitcell(folder=folder,
                                   filename='supercell_CuMnO2.mcif',
                                   tol=1e-4)

        U = UC_dict['u']
        V = UC_dict['v']
        W = UC_dict['w']
        Occ = UC_dict['occupancy']
        Disp = UC_dict['displacement']
        Mom = UC_dict['moment']
        Atm = UC_dict['atom']
        N_atm = UC_dict['n_atom']

        n_uvw = nu * nv * nw

        np.testing.assert_array_almost_equal(np.tile(mom.T, n_uvw).T, Mom)

        self.assertEqual((atm == 'Cu').sum() * n_uvw, (Atm == 'Cu').sum())
        self.assertEqual((atm == 'Mn').sum() * n_uvw, (Atm == 'Mn').sum())
        self.assertEqual((atm == 'O').sum() * n_uvw, (Atm == 'O').sum())

        os.remove(folder + '/supercell_CuMnO2.mcif')
Ejemplo n.º 5
0
    def test_factor(self):

        folder = os.path.abspath(os.path.join(directory, '..', 'data'))

        names = ('h', 'k', 'l', 'd(angstrom)', 'F(real)', 'F(imag)', 'mult')
        formats = (int, int, int, float, float, float, int)

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='Cu3Au.cif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        atm = uc_dict['atom']

        constants = crystal.parameters(folder=folder, filename='Cu3Au.cif')

        symops = crystal.operators(folder=folder, filename='Cu3Au.cif')

        a, b, c, alpha, beta, gamma = constants

        D = crystal.cartesian_displacement(a, b, c, alpha, beta, gamma)

        Uiso = 1 / (8 * np.pi**2)
        uiso = np.dot(np.linalg.inv(D), np.linalg.inv(D.T))

        U11, U22, U33 = Uiso * uiso[0, 0], Uiso * uiso[1, 1], Uiso * uiso[2, 2]
        U23, U13, U12 = Uiso * uiso[1, 2], Uiso * uiso[0, 2], Uiso * uiso[0, 1]

        h, k, l, d, F, mult = structure.factor(u,
                                               v,
                                               w,
                                               atm,
                                               occ,
                                               U11,
                                               U22,
                                               U33,
                                               U23,
                                               U13,
                                               U12,
                                               a,
                                               b,
                                               c,
                                               alpha,
                                               beta,
                                               gamma,
                                               symops,
                                               dmin=0.7,
                                               source='neutron')

        data = np.loadtxt(os.path.join(folder, 'Cu3Au.csv'),
                          dtype={
                              'names': names,
                              'formats': formats
                          },
                          delimiter=',',
                          skiprows=1,
                          unpack=True)

        np.testing.assert_array_equal(h, data[0])
        np.testing.assert_array_equal(k, data[1])
        np.testing.assert_array_equal(l, data[2])
        np.testing.assert_array_equal(mult, data[6])

        np.testing.assert_array_almost_equal(d, data[3])
        np.testing.assert_array_almost_equal(F.real, data[4], decimal=4)
        np.testing.assert_array_almost_equal(F.imag, data[5], decimal=4)

        uc_dict = crystal.unitcell(folder=folder,
                                   filename='CaTiOSiO4.cif',
                                   tol=1e-4)

        u = uc_dict['u']
        v = uc_dict['v']
        w = uc_dict['w']
        occ = uc_dict['occupancy']
        disp = uc_dict['displacement']
        atm = uc_dict['atom']

        constants = crystal.parameters(folder=folder, filename='CaTiOSiO4.cif')

        symops = crystal.operators(folder=folder, filename='CaTiOSiO4.cif')

        a, b, c, alpha, beta, gamma = constants

        U11, U22, U33, U23, U13, U12 = disp.T

        h, k, l, d, F, mult = structure.factor(u,
                                               v,
                                               w,
                                               atm,
                                               occ,
                                               U11,
                                               U22,
                                               U33,
                                               U23,
                                               U13,
                                               U12,
                                               a,
                                               b,
                                               c,
                                               alpha,
                                               beta,
                                               gamma,
                                               symops,
                                               dmin=0.7,
                                               source='neutron')

        data = np.loadtxt(os.path.join(folder, 'CaTiOSiO4.csv'),
                          dtype={
                              'names': names,
                              'formats': formats
                          },
                          delimiter=',',
                          skiprows=1,
                          unpack=True)

        np.testing.assert_array_equal(h, data[0])
        np.testing.assert_array_equal(k, data[1])
        np.testing.assert_array_equal(l, data[2])
        np.testing.assert_array_equal(mult, data[6])

        np.testing.assert_array_almost_equal(d, data[3])
        np.testing.assert_array_almost_equal(F.real, data[4], decimal=4)
        np.testing.assert_array_almost_equal(F.imag, data[5], decimal=4)
Ejemplo n.º 6
0
    def load_lattice_parameters(self, folder, filename):

        return crystal.parameters(folder=folder, filename=filename)