File: Si.py

package info (click to toggle)
phonopy 2.44.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 29,136 kB
  • sloc: python: 42,934; xml: 12,080; ansic: 3,227; cpp: 525; sh: 213; makefile: 20
file content (67 lines) | stat: -rw-r--r-- 2,003 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""QHA example of Si."""

import tarfile

import matplotlib.pyplot as plt
import numpy as np

from phonopy import Phonopy
from phonopy.interface.vasp import Vasprun, read_vasp


def get_force_sets(index):
    """Parse vasprun.xml and return forces."""
    with tarfile.open("vasprun_xmls.tar.lzma", "r:xz") as tr:
        with tr.extractfile("vasprun_xmls/vasprun.xml-%d" % index) as fp:
            vasprun = Vasprun(fp, use_expat=True)
            forces = vasprun.read_forces()
    return forces


def get_frequency(poscar_filename, force_sets):
    """Calculate phonons and return frequencies."""
    unitcell = read_vasp(poscar_filename)
    volume = unitcell.volume
    phonon = Phonopy(
        unitcell,
        [[2, 0, 0], [0, 2, 0], [0, 0, 2]],
        primitive_matrix=[[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]],
    )
    disps = np.zeros_like(force_sets)
    disps[0] = [0.01, 0, 0]
    phonon.dataset = {
        "natom": len(force_sets),
        "first_atoms": [
            {"number": 0, "displacement": [0.01, 0, 0], "forces": force_sets}
        ],
    }
    phonon.produce_force_constants()
    return phonon.get_frequencies([0.5, 0.5, 0]), volume


def main():
    """Run QHA."""
    frequencies = []
    volumes = []
    for i in range(-5, 6):
        poscar_filename = "POSCAR-%d" % i
        force_sets = get_force_sets(i)
        fs, v = get_frequency(poscar_filename, force_sets)
        frequencies.append(fs)
        volumes.append(v)

    for freq_at_X in np.array(frequencies).T:
        freq_squared = freq_at_X**2 * np.sign(freq_at_X)
        # np.sign is used to treat imaginary mode, since
        # imaginary frequency is returned as a negative value from phonopy.
        plt.plot(volumes, freq_squared, "o-")
        # for v, f2 in zip(volumes, freq_squared):
        #      print("%f %f" % (v, f2))
        # print('')
        # print('')
    plt.title("Frequeny squared (THz^2) at X-point vs volume (A^3)")
    plt.show()


if __name__ == "__main__":
    main()