Пример #1
0
    def test_write_file(self):
        with ScratchDir("."):
            self.unk_std.write_file("UNK00001.1")
            temp_unk = Unk.from_file("UNK00001.1")
            self.assertEqual(self.unk_std, temp_unk)

        with ScratchDir("."):
            self.unk_ncl.write_file("UNK00001.NC")
            temp_unk = Unk.from_file("UNK00001.NC")
            self.assertEqual(self.unk_ncl, temp_unk)
Пример #2
0
    def test_write_file(self):
        with ScratchDir('.'):
            self.unk_std.write_file('UNK00001.1')
            temp_unk = Unk.from_file('UNK00001.1')
            self.assertEqual(self.unk_std, temp_unk)

        with ScratchDir('.'):
            self.unk_ncl.write_file('UNK00001.NC')
            temp_unk = Unk.from_file('UNK00001.NC')
            self.assertEqual(self.unk_ncl, temp_unk)
Пример #3
0
    def test_read_write(self):
        unk0 = Unk.from_file(self.TEST_FILES_DIR / "UNK.std")
        with ScratchDir("."):
            unk0.write_file("UNK00001.1")
            unk1 = Unk.from_file("UNK00001.1")
            self.assertEqual(unk0, unk1)

        unk0 = Unk.from_file(self.TEST_FILES_DIR / "UNK.ncl")
        with ScratchDir("."):
            unk0.write_file("UNK00001.NC")
            unk1 = Unk.from_file("UNK00001.NC")
            self.assertEqual(unk0, unk1)
Пример #4
0
    def test_read_write(self):
        unk0 = Unk.from_file(self.TEST_FILES_DIR / 'UNK.std')
        with ScratchDir('.'):
            unk0.write_file('UNK00001.1')
            unk1 = Unk.from_file('UNK00001.1')
            self.assertEqual(unk0, unk1)

        unk0 = Unk.from_file(self.TEST_FILES_DIR / 'UNK.ncl')
        with ScratchDir('.'):
            unk0.write_file('UNK00001.NC')
            unk1 = Unk.from_file('UNK00001.NC')
            self.assertEqual(unk0, unk1)
Пример #5
0
    def test_eq(self):
        # not implemented
        self.assertFalse(self.unk_std == "poop")

        # ng
        tmp_unk = Unk(1, np.random.rand(10, 5, 5, 4))
        self.assertFalse(self.unk_std == tmp_unk)

        # ik
        tmp_unk = Unk(2, self.data_std)
        self.assertFalse(self.unk_std == tmp_unk)

        # noncol
        self.assertFalse(self.unk_std == self.unk_ncl)

        # nbnd
        tmp_unk = Unk(1, np.random.rand(9, 5, 5, 5))
        self.assertFalse(self.unk_std == tmp_unk)

        # data
        tmp_unk = Unk(1, np.random.rand(10, 5, 5, 5))
        self.assertFalse(self.unk_std == tmp_unk)
        tmp_unk = Unk(1, np.random.rand(10, 2, 5, 5, 5))
        self.assertFalse(self.unk_ncl == tmp_unk)

        # same
        self.assertTrue(self.unk_std == self.unk_std)
        self.assertTrue(self.unk_std == Unk(1, self.data_std))
        self.assertTrue(self.unk_ncl == self.unk_ncl)
        self.assertTrue(self.unk_ncl == Unk(1, self.data_ncl))
Пример #6
0
    def test_from_file(self):
        unk = Unk.from_file(self.TEST_FILES_DIR / "UNK.std")
        self.assertEqual(unk.ik, 1)
        self.assertEqual(unk.nbnd, 5)
        self.assertEqual(unk.ng[0], 6)
        self.assertEqual(unk.ng[1], 6)
        self.assertEqual(unk.ng[2], 8)
        self.assertFalse(unk.is_noncollinear)
        self.assertTrue(np.allclose(unk.data.shape, (5, 6, 6, 8)))

        unk = Unk.from_file(self.TEST_FILES_DIR / "UNK.ncl")
        self.assertEqual(unk.ik, 1)
        self.assertEqual(unk.nbnd, 5)
        self.assertEqual(unk.ng[0], 6)
        self.assertEqual(unk.ng[1], 6)
        self.assertEqual(unk.ng[2], 8)
        self.assertTrue(unk.is_noncollinear)
        self.assertTrue(np.allclose(unk.data.shape, (5, 2, 6, 6, 8)))
        self.assertNotEqual(unk.data[0, 0, 0, 0, 0].real, 0.0)
        self.assertAlmostEqual(unk.data[0, 1, 0, 0, 0].real, 0.0)
Пример #7
0
    def test_init(self):
        # standard unk file
        self.assertEqual(self.unk_std.ik, 1)
        self.assertEqual(self.unk_std.nbnd, 10)
        self.assertEqual(self.unk_std.ng[0], 5)
        self.assertEqual(self.unk_std.ng[1], 5)
        self.assertEqual(self.unk_std.ng[2], 5)
        self.assertTrue(np.allclose(self.unk_std.data.shape, (10, 5, 5, 5)))
        self.assertTrue(np.allclose(self.unk_std.data, self.data_std))
        self.assertFalse(self.unk_std.is_noncollinear)

        # too small data
        with self.assertRaises(ValueError):
            data_bad_shape = \
                np.random.rand(2, 2, 2).astype(np.complex128)
            Unk(1, data_bad_shape)

        # too big data
        with self.assertRaises(ValueError):
            data_bad_shape = \
                np.random.rand(2, 2, 2, 2, 2, 2).astype(np.complex128)
            Unk(1, data_bad_shape)

        # noncollinear unk file
        self.assertEqual(self.unk_ncl.ik, 1)
        self.assertEqual(self.unk_ncl.nbnd, 10)
        self.assertEqual(self.unk_ncl.ng[0], 5)
        self.assertEqual(self.unk_ncl.ng[1], 5)
        self.assertEqual(self.unk_ncl.ng[2], 5)
        self.assertTrue(np.allclose(self.unk_ncl.data.shape, (10, 2, 5, 5, 5)))
        self.assertTrue(np.allclose(self.unk_ncl.data, self.data_ncl))
        self.assertTrue(self.unk_ncl.is_noncollinear)

        # too big data
        with self.assertRaises(ValueError):
            data_bad_ncl = \
                np.random.rand(2, 3, 2, 2, 2).astype(np.complex128)
            Unk(1, data_bad_ncl)
Пример #8
0
def get_Wif_from_UNK(
        unks: List,
        init_unk_path: str,
        def_index: int,
        bulk_index: Sequence[int],
        eigs: Sequence[float],
        fig=None
) -> List:
    """Compute the electron-phonon matrix element using UNK files.

    Evaluate the electron-phonon coupling matrix element using the information
    stored in the given UNK files. This is compatible with any first-principles
    code that write to the wannier90 UNK file format. The onus is on the user
    to ensure the wavefunctions are valid (i.e., norm-conserving).

    Parameters
    ----------
    unks: list((Q, unk_path))
        a list of tuples where the first value is the Q and the second is the
        path to the UNK file
    init_unk_path : string
        path to the initial unk file for computing overlaps
    def_index : int
        index corresponding to the defect wavefunction (1-based indexing)
    bulk_index : int, list(int)
        index or list of indices corresponding to the bulk wavefunction
        (1-based indexing)
    eigs : np.ndarray
        array of eigenvalues in eV where the indices correspond to those given
        by def_index and bulk_index
    fig : matplotlib.figure.Figure
        optional figure object to plot diagnostic information

    Returns
    -------
    list((bulk_index, Wif))
        electron-phonon matrix element Wif in units of
        eV amu^{-1/2} Angstrom^{-1} for each bulk_index
    """
    bulk_index = np.array(bulk_index)
    initial_unk = Unk.from_file(init_unk_path)
    psi_i = initial_unk.data[def_index-1].flatten()

    Nu, Nbi = (len(unks), len(bulk_index))
    Q, matels, deig = (np.zeros(Nu+1), np.zeros((Nbi, Nu+1)), np.zeros(Nbi))

    # first compute the Q = 0 values and eigenvalue differences
    for i, bi in enumerate(bulk_index):
        psi_f = initial_unk.data[bi-1].flatten()
        deig[i] = eigs[bi-1] - eigs[def_index-1]
        matels[i, Nu] = _compute_matel(psi_i, psi_f)
    deig = np.abs(deig)

    # now compute for each Q
    for i, (q, fname) in enumerate(unks):
        Q[i] = q
        final_unk = Unk.from_file(fname)
        for j, bi in enumerate(bulk_index):
            psi_f = final_unk.data[bi-1].flatten()
            matels[j, i] = _compute_matel(psi_i, psi_f)

    print(matels)

    if fig is not None:
        ax = fig.subplots(1, Nbi)
        ax = np.array(ax)
        for a, i in zip(ax, range(Nbi)):
            a.scatter(Q, matels[i, :])
            a.set_title(f'{bulk_index[i]}')

    return [(bi, deig[i] * np.mean(np.abs(np.gradient(matels[i, :], Q))))
            for i, bi in enumerate(bulk_index)]
Пример #9
0
 def setUp(self):
     self.data_std = np.random.rand(10, 5, 5, 5).astype(np.complex128)
     self.unk_std = Unk(1, self.data_std)
     self.data_ncl = np.random.rand(10, 2, 5, 5, 5).astype(np.complex128)
     self.unk_ncl = Unk(1, self.data_ncl)
Пример #10
0
class UnkTest(PymatgenTest):
    _multiprocess_shared_ = True

    def setUp(self):
        self.data_std = np.random.rand(10, 5, 5, 5).astype(np.complex128)
        self.unk_std = Unk(1, self.data_std)
        self.data_ncl = np.random.rand(10, 2, 5, 5, 5).astype(np.complex128)
        self.unk_ncl = Unk(1, self.data_ncl)

    def test_init(self):
        # standard unk file
        self.assertEqual(self.unk_std.ik, 1)
        self.assertEqual(self.unk_std.nbnd, 10)
        self.assertEqual(self.unk_std.ng[0], 5)
        self.assertEqual(self.unk_std.ng[1], 5)
        self.assertEqual(self.unk_std.ng[2], 5)
        self.assertTrue(np.allclose(self.unk_std.data.shape, (10, 5, 5, 5)))
        self.assertTrue(np.allclose(self.unk_std.data, self.data_std))
        self.assertFalse(self.unk_std.is_noncollinear)

        # too small data
        with self.assertRaises(ValueError):
            data_bad_shape = np.random.rand(2, 2, 2).astype(np.complex128)
            Unk(1, data_bad_shape)

        # too big data
        with self.assertRaises(ValueError):
            data_bad_shape = np.random.rand(2, 2, 2, 2, 2,
                                            2).astype(np.complex128)
            Unk(1, data_bad_shape)

        # noncollinear unk file
        self.assertEqual(self.unk_ncl.ik, 1)
        self.assertEqual(self.unk_ncl.nbnd, 10)
        self.assertEqual(self.unk_ncl.ng[0], 5)
        self.assertEqual(self.unk_ncl.ng[1], 5)
        self.assertEqual(self.unk_ncl.ng[2], 5)
        self.assertTrue(np.allclose(self.unk_ncl.data.shape, (10, 2, 5, 5, 5)))
        self.assertTrue(np.allclose(self.unk_ncl.data, self.data_ncl))
        self.assertTrue(self.unk_ncl.is_noncollinear)

        # too big data
        with self.assertRaises(ValueError):
            data_bad_ncl = np.random.rand(2, 3, 2, 2, 2).astype(np.complex128)
            Unk(1, data_bad_ncl)

    def test_from_file(self):
        unk = Unk.from_file(self.TEST_FILES_DIR / "UNK.std")
        self.assertEqual(unk.ik, 1)
        self.assertEqual(unk.nbnd, 5)
        self.assertEqual(unk.ng[0], 6)
        self.assertEqual(unk.ng[1], 6)
        self.assertEqual(unk.ng[2], 8)
        self.assertFalse(unk.is_noncollinear)
        self.assertTrue(np.allclose(unk.data.shape, (5, 6, 6, 8)))

        unk = Unk.from_file(self.TEST_FILES_DIR / "UNK.ncl")
        self.assertEqual(unk.ik, 1)
        self.assertEqual(unk.nbnd, 5)
        self.assertEqual(unk.ng[0], 6)
        self.assertEqual(unk.ng[1], 6)
        self.assertEqual(unk.ng[2], 8)
        self.assertTrue(unk.is_noncollinear)
        self.assertTrue(np.allclose(unk.data.shape, (5, 2, 6, 6, 8)))
        self.assertNotEqual(unk.data[0, 0, 0, 0, 0].real, 0.0)
        self.assertAlmostEqual(unk.data[0, 1, 0, 0, 0].real, 0.0)

    def test_write_file(self):
        with ScratchDir("."):
            self.unk_std.write_file("UNK00001.1")
            temp_unk = Unk.from_file("UNK00001.1")
            self.assertEqual(self.unk_std, temp_unk)

        with ScratchDir("."):
            self.unk_ncl.write_file("UNK00001.NC")
            temp_unk = Unk.from_file("UNK00001.NC")
            self.assertEqual(self.unk_ncl, temp_unk)

    def test_read_write(self):
        unk0 = Unk.from_file(self.TEST_FILES_DIR / "UNK.std")
        with ScratchDir("."):
            unk0.write_file("UNK00001.1")
            unk1 = Unk.from_file("UNK00001.1")
            self.assertEqual(unk0, unk1)

        unk0 = Unk.from_file(self.TEST_FILES_DIR / "UNK.ncl")
        with ScratchDir("."):
            unk0.write_file("UNK00001.NC")
            unk1 = Unk.from_file("UNK00001.NC")
            self.assertEqual(unk0, unk1)

    def test_repr(self):
        self.assertNotEqual(repr(self.unk_std), "")
        self.assertNotEqual(repr(self.unk_ncl), "")

    def test_eq(self):
        # not implemented
        self.assertFalse(self.unk_std == "poop")

        # ng
        tmp_unk = Unk(1, np.random.rand(10, 5, 5, 4))
        self.assertFalse(self.unk_std == tmp_unk)

        # ik
        tmp_unk = Unk(2, self.data_std)
        self.assertFalse(self.unk_std == tmp_unk)

        # noncol
        self.assertFalse(self.unk_std == self.unk_ncl)

        # nbnd
        tmp_unk = Unk(1, np.random.rand(9, 5, 5, 5))
        self.assertFalse(self.unk_std == tmp_unk)

        # data
        tmp_unk = Unk(1, np.random.rand(10, 5, 5, 5))
        self.assertFalse(self.unk_std == tmp_unk)
        tmp_unk = Unk(1, np.random.rand(10, 2, 5, 5, 5))
        self.assertFalse(self.unk_ncl == tmp_unk)

        # same
        self.assertTrue(self.unk_std == self.unk_std)
        self.assertTrue(self.unk_std == Unk(1, self.data_std))
        self.assertTrue(self.unk_ncl == self.unk_ncl)
        self.assertTrue(self.unk_ncl == Unk(1, self.data_ncl))