Esempio n. 1
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
Esempio n. 2
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')
Esempio n. 3
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')
Esempio n. 4
0
    def test_unitcell(self):

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

        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']
        site = uc_dict['site']
        atm = uc_dict['atom']
        n_atm = uc_dict['n_atom']

        self.assertEqual(n_atm, 4)

        np.testing.assert_array_almost_equal(u[atm == 'Au'], 0)
        np.testing.assert_array_almost_equal(v[atm == 'Au'], 0)
        np.testing.assert_array_almost_equal(w[atm == 'Au'], 0)

        np.testing.assert_array_equal(atm[site == 0], 'Au')
        np.testing.assert_array_equal(atm[site == 1], 'Cu')

        np.testing.assert_array_almost_equal(occ, 1)
        np.testing.assert_array_almost_equal(disp, 0)

        # ---

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

        occ = uc_dict['occupancy']
        atm = uc_dict['atom']

        np.testing.assert_array_almost_equal(occ[atm == '0'], 1.0)
        np.testing.assert_array_almost_equal(occ[atm == 'H'], 0.5)

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

        disp = uc_dict['displacement']
        atm = uc_dict['atom']

        np.testing.assert_array_almost_equal(disp[atm == 'Ca'][:, 0], 0.02200)
        np.testing.assert_array_almost_equal(disp[atm == 'Ca'][:, 1], 0.00497)
        np.testing.assert_array_almost_equal(disp[atm == 'Ca'][:, 2], 0.00537)

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

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

        np.testing.assert_array_almost_equal(occ[atm == 'FeX']+\
                                             occ[atm == 'AlX']+\
                                             occ[atm == 'MgX'], 1.0, 2)
        np.testing.assert_array_almost_equal(occ[atm == 'FeY']+\
                                             occ[atm == 'AlY'], 1.0)

        np.testing.assert_array_almost_equal(disp[atm == 'FeX'],
                                             disp[atm == 'AlX'])
        np.testing.assert_array_almost_equal(disp[atm == 'AlX'],
                                             disp[atm == 'MgX'])

        x, y, z = np.array([0.2541, 0.242, 0.4976])
        for i in range(8):
            symop = op[atm == 'FeY'][i]
            ux, vy, wz = symmetry.evaluate([symop], [x, y, z]).flatten()
            ux += 1 * (ux < 0) - 1 * (ux >= 1)
            vy += 1 * (vy < 0) - 1 * (vy >= 1)
            wz += 1 * (wz < 0) - 1 * (wz >= 1)
            np.testing.assert_array_almost_equal(u[atm == 'FeY'][i], ux)
            np.testing.assert_array_almost_equal(v[atm == 'FeY'][i], vy)
            np.testing.assert_array_almost_equal(w[atm == 'FeY'][i], wz)

        # ---

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

        mom = uc_dict['moment']
        mag_op = uc_dict['magnetic_operator']
        atm = uc_dict['atom']

        np.testing.assert_array_almost_equal(mom[atm == 'Cu'], 0.0)
        np.testing.assert_array_almost_equal(mom[atm == 'O'], 0.0)

        mx, my, mz = np.array([1.8, 0.0, 1.4])
        for i in range(8):
            sym_op = mag_op[atm == 'Mn'][i]
            moment = symmetry.evaluate_mag([sym_op], [mx, my, mz]).flatten()
            np.testing.assert_array_almost_equal(mom[atm == 'Mn'][i], moment)

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

        disp = uc_dict['displacement']

        np.testing.assert_array_equal(atm[152:184], 'H')

        adp = [0.034, 0.034, 0.034, 0, 0, 0]
        for i in range(152, 168):
            np.testing.assert_array_almost_equal(disp[i], adp)

        adp = [0.032, 0.032, 0.032, 0, 0, 0]
        for i in range(168, 184):
            np.testing.assert_array_almost_equal(disp[i], adp)

        # ---

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

        site = uc_dict['site']
        atm = uc_dict['atom']

        np.testing.assert_array_equal(atm[site < 3], 'Ba2+')
        np.testing.assert_array_equal(atm[(site >= 3) & (site < 7)], 'Co3+')
        np.testing.assert_array_equal(atm[(site >= 7) & (site < 9)], 'C4+')
        np.testing.assert_array_equal(atm[site >= 9], 'O2-')
Esempio 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)
Esempio n. 6
0
    def load_unit_cell(self, folder, filename):

        return crystal.unitcell(folder=folder, filename=filename, tol=1e-2)