Source code for jarvis.io.phonopy.inputs
"""Modules to generate input files for phonopy using Atoms object."""
import numpy as np
from jarvis.analysis.structure.spacegroup import Spacegroup3D
from jarvis.core.kpoints import Kpoints3D
[docs]class PhonopyInputs(object):
"""
Generate input files for phonopy post-processing.
Make sure to obtain FORCE_CONSTANTS first
E.g. run phonopy --fc vasprun.xml first.
"""
def __init__(self, atoms):
"""Intialize with jarvis.core.Atoms class."""
self.atoms = atoms
self.tag = " ".join(list(set(atoms.elements)))
[docs] def prim_axis(self):
"""
Use when taking conventional cell.
Such as elastic constant calculations.
"""
prim = self.atoms.get_primitive_atoms
if prim.num_atoms < self.atoms.num_atoms:
spaceg = Spacegroup3D(self.atoms)
latt = spaceg.lattice_system
sgp = spaceg.space_group_symbol
if latt == "rhombohedral":
transf = (
np.array(
[[2, -1, -1], [1, 1, -2], [1, 1, 1]], dtype="float"
)
/ 3
)
elif "I" in sgp:
transf = (
np.array(
[[-1, 1, 1], [1, -1, 1], [1, 1, -1]], dtype="float"
)
/ 2
)
elif "F" in sgp:
transf = (
np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]], dtype="float")
/ 2
)
elif "A" in sgp:
transf = (
np.array([[2, 0, 0], [0, 1, -1], [0, 1, 1]], dtype="float")
/ 2
)
elif "C" in sgp:
if latt == "monoclinic":
transf = (
np.array(
[[1, 1, 0], [-1, 1, 0], [0, 0, 2]], dtype="float"
)
/ 2
)
else:
transf = (
np.array(
[[1, -1, 0], [1, 1, 0], [0, 0, 2]], dtype="float"
)
/ 2
)
else:
transf = np.eye(3)
ax = ""
for el in transf:
ax = (
str(ax)
+ str(" ")
+ str(el[0])
+ str(" ")
+ str(el[1])
+ str(" ")
+ str(el[2])
)
ax_line = str("PRIMITIVE_AXIS = ") + str(ax) + "\n"
return ax_line
[docs] def mesh_dos(
self,
filename="meshdos.conf",
dim=[1, 1, 1],
factor=521.471,
grid=[31, 31, 31],
):
"""
Use for DOS and thermal properties.
phonopy -p meshdos.conf
phonopy -t meshdos.conf
"""
mesh = open(filename, "w")
line = str("FORCE_CONSTANTS = READ") + "\n"
mesh.write(line)
line = str("FREQUENCY_CONVERSION_FACTOR = ") + str(factor) + "\n"
mesh.write(line)
line = str("ATOM_NAME = ") + str(self.tag) + "\n"
mesh.write(line)
line = str("DIM = ") + " ".join(map(str, dim)) + "\n"
mesh.write(line)
line = str("MP = ") + " ".join(map(str, grid)) + "\n"
mesh.write(line)
mesh.close()
[docs] def mesh_bands(
self,
dim=[1, 1, 1],
filename="band.conf",
factor=521.471,
line_density=20,
):
"""
Use for making phonon bandstructure plot.
After running phonopy -p bandd.conf, bandplot -o PBAND.png
"""
kpoints = Kpoints3D().kpath(self.atoms, line_density=line_density)
all_kp = kpoints._kpoints
labels = kpoints._labels
all_labels = ""
all_lines = ""
for lb in labels:
if lb == "":
lb = None
all_labels = all_labels + str(lb) + str(" ")
for k in all_kp:
all_lines = (
all_lines
+ str(k[0])
+ str(" ")
+ str(k[1])
+ str(" ")
+ str(k[2])
+ str(" ")
)
file = open(filename, "w")
line = str("FREQUENCY_CONVERSION_FACTOR = ") + str(factor) + "\n"
file.write(line)
ax_line = self.prim_axis()
file.write(ax_line)
line = str("ATOM_NAME = ") + str(self.tag) + "\n"
file.write(line)
line = str("DIM = ") + " ".join(map(str, dim)) + "\n"
file.write(line)
line = str("FORCE_CONSTANTS = READ") + "\n"
file.write(line)
line = str("BAND= ") + str(all_lines) + "\n"
file.write(line)
line = str("BAND_LABELS= ") + str(all_labels) + "\n"
file.write(line)
file.close()
[docs] def mesh_irreps(
self, factor=521.471, filename="irreps.conf", dim=[1, 1, 1], tol=1e-3
):
"""Use for irreducible phonon representation."""
file = open(filename, "w")
line = str("IRREPS = 0 0 0 ") + str(tol) + "\n"
file.write(line)
line = str("FREQUENCY_CONVERSION_FACTOR = ") + str(factor) + "\n"
file.write(line)
ax_line = self.prim_axis()
file.write(ax_line)
line = str("SHOW_IRREPS = .TRUE.") + "\n"
file.write(line)
line = str("DIM = ") + " ".join(map(str, dim)) + "\n"
file.write(line)
line = str("FORCE_CONSTANTS = READ") + "\n"
file.write(line)
file.close()
[docs] def animation(self, factor=521.471, filename="anim.conf", dim=[1, 1, 1]):
"""Use for atom dancing/movement animation."""
anim = open(filename, "w")
line = str("FREQUENCY_CONVERSION_FACTOR = ") + str(factor) + "\n"
anim.write(line)
line = str("FORCE_CONSTANTS = READ") + "\n"
anim.write(line)
line = str("ATOM_NAME = ") + str(self.tag) + "\n"
anim.write(line)
line = str("ANIME_TYPE = JMOL") + "\n"
anim.write(line)
line = str("ANIME = 0 7 0 0 0 0") + "\n"
anim.write(line)
line = str("DIM = ") + " ".join(map(str, dim)) + "\n"
anim.write(line)
anim.close()
[docs] def generate_all_files(self):
"""Generate all the input files mentioned above."""
self.mesh_dos()
self.mesh_bands()
self.mesh_irreps()
self.animation()
"""
if __name__ == "__main__":
from jarvis.core.atoms import Atoms
box = [[2.715, 2.715, 0], [0, 2.715, 2.715], [2.715, 0, 2.715]]
coords = [[0, 0, 0], [0.25, 0.25, 0.25]]
elements = ["Si", "Si"]
Si = Atoms(lattice_mat=box, coords=coords, elements=elements)
PhonopyInputs(atoms=Si).generate_all_files()
"""