Source code for pymatgen.command_line.aconvasp_caller
# coding: utf-8
# Copyright (c) Pymatgen Development Team.
# Distributed under the terms of the MIT License.
"""
Interface with command line aconvasp. http://aflowlib.org/
Only tested on Linux. Inspired by Shyue"s qhull_caller
WARNING: you need to have a convasp in your path for this to work
"""
__author__ = "Geoffroy Hautier"
__copyright__ = "Copyright 2011, The Materials Project"
__version__ = "1.0"
__maintainer__ = "Geoffroy Hautier"
__email__ = "geoffroy.hautier@uclouvain.be"
__status__ = "Production"
__date__ = "$Nov 22, 2011M$"
import subprocess
from pymatgen.io.vasp.inputs import Poscar
[docs]def run_aconvasp_command(command, structure):
"""
Helper function for calling aconvasp with different arguments
"""
poscar = Poscar(structure)
p = subprocess.Popen(command, stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
output = p.communicate(input=poscar.get_string())
return output
[docs]def get_num_division_kpoints(structure, kppa):
"""
Get kpoint divisions for a given k-point density (per reciprocal-atom):
kppa and a given structure
"""
output = run_aconvasp_command(["aconvasp", "--kpoints", str(kppa)],
structure)
tmp = output[0].rsplit("\n")[6].rsplit(" ")
return [int(tmp[5]), int(tmp[6]), int(tmp[7])]
[docs]def get_minkowski_red(structure):
"""
Get a minkowski reduced structure
"""
output = run_aconvasp_command(["aconvasp", "--kpath"], structure)
started = False
poscar_string = ""
if "ERROR" in output[1]:
raise AconvaspError(output[1])
for line in output[0].split("\n"):
if started or line.find("KPOINTS TO RUN") != -1:
poscar_string = poscar_string + line + "\n"
if line.find("STRUCTURE TO RUN") != -1:
started = True
if line.find("KPOINTS TO RUN") != -1:
started = False
return Poscar.from_string(poscar_string).structure
[docs]def get_conv_struct(structure):
"""
Get a minkowski reduced structure
"""
output = run_aconvasp_command(["aconvasp", "--std_conv"], structure)
if "ERROR" in output[1]:
raise AconvaspError(output[1])
tmp = Poscar.from_string(output[0])
return {'struct': tmp.structure, 'comm': tmp.comment}
[docs]def get_prim_struct(structure):
"""
Get standard primitive
"""
output = run_aconvasp_command(["aconvasp", "--std_prim"], structure)
if "ERROR" in output[1]:
raise AconvaspError(output[1])
tmp = Poscar.from_string(output[0])
return {'struct': tmp.structure, 'comm': tmp.comment}
[docs]def get_vasp_kpoint_file_sym(structure):
"""
get a kpoint file ready to be ran in VASP along the symmetry lines of the
Brillouin Zone
"""
output = run_aconvasp_command(["aconvasp", "--kpath"], structure)
if "ERROR" in output[1]:
raise AconvaspError(output[1])
started = False
kpoints_string = ""
for line in output[0].split("\n"):
# print line
if started or line.find("END") != -1:
kpoints_string = kpoints_string + line + "\n"
if line.find("KPOINTS TO RUN") != -1:
started = True
if line.find("END") != -1:
started = False
return kpoints_string
[docs]class AconvaspError(Exception):
"""
Exception class for aconvasp.
Raised when the aconvasp gives an error
"""
def __init__(self, msg):
"""
Args:
msg (str): Error message
"""
self.msg = msg
def __str__(self):
return "AconvaspError : " + self.msg