Source code for casm.vasp.io.io
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from builtins import *
import os
import re
import shutil
import six
import sys
from casm.vasp.io import oszicar, outcar, species, poscar
from casm.vasp.io import kpoints as kp
from casm.vasp.io import incar as inc
from casm.project import attribute_info
VASP_INPUT_FILE_LIST = [
"INCAR", "STOPCAR", "POTCAR", "KPOINTS", "POSCAR", "EXHCAR", "CHGCAR",
"WAVECAR", "TMPCAR"
]
DEFAULT_VASP_MOVE_LIST = ["POTCAR"]
DEFAULT_VASP_COPY_LIST = ["INCAR", "KPOINTS"]
DEFAULT_VASP_REMOVE_LIST = [
"IBZKPT", "CHG", "CHGCAR", "WAVECAR", "TMPCAR", "EIGENVAL", "DOSCAR",
"PROCAR", "PCDAT", "XDATCAR", "LOCPOT", "ELFCAR", "PROOUT"
]
[docs]class VaspIOError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
[docs]def job_complete(jobdir=None):
"""Return True if vasp job at path 'jobdir' is complete"""
if jobdir is None:
jobdir = os.getcwd()
outcarfile = os.path.join(jobdir, "OUTCAR")
if (not os.path.isfile(outcarfile)) and (
not os.path.isfile(outcarfile + ".gz")):
return False
if outcar.Outcar(outcarfile).complete:
return True
return False
[docs]def get_incar_tag(key, jobdir=None):
"""Opens INCAR in 'jobdir' and returns 'key' value."""
if jobdir is None:
jobdir = os.getcwd()
tincar = inc.Incar(os.path.join(jobdir, "INCAR"))
for k in tincar.tags:
if key.lower() == k.lower():
return tincar.tags[k]
return None
[docs]def set_incar_tag(tag_dict, jobdir=None, name=None):
"""Opens INCAR in 'jobdir', sets 'key' value, and writes INCAR
If 'val' is None, the tag is removed from the INCAR.
"""
if name is None:
name = "INCAR"
if jobdir is None:
jobdir = os.getcwd()
incarfile = os.path.join(jobdir, name)
tincar = inc.Incar(incarfile)
for key, val in six.iteritems(tag_dict):
for k in tincar.tags:
if key.lower() == k.lower():
if (val is None) or (str(val).strip() == ""):
del tincar.tags[k]
else:
tincar.tags[k] = val
break
if val != None and str(val).strip() != "":
tincar.tags[key] = val
tincar.write(incarfile)
[docs]def ionic_steps(jobdir=None):
"""Find the number of ionic steps completed in 'jobdir'"""
try:
toszicar = oszicar.Oszicar(os.path.join(jobdir, "OSZICAR"))
return len(toszicar.E)
except:
raise VaspIOError("Could not read number of ionic steps from " +
os.path.join(jobdir, "OSZICAR"))
[docs]def write_potcar(filename, poscar, species, sort=True):
""" Write an appropriate POTCAR """
if sort == False:
with open(filename, 'w') as file:
for name in poscar.type_atoms:
with open(os.path.join(species[name].potcardir,
'POTCAR')) as potcar:
file.write(potcar.read())
else:
# dict: key = alias, value = list of Sites
pos = poscar.basis_dict()
with open(filename, 'w') as file:
# for each alias
for alias in sorted(pos.keys()):
# find matching IndividualSpecies with write_potcar == True
for name in species:
if species[name].alias == alias and species[
name].write_potcar:
# add to POTCAR file
with open(
os.path.join(species[name].potcardir,
'POTCAR')) as potcar:
file.write(potcar.read())
break
[docs]def write_stopcar(mode='e', jobdir=None):
""" Write STOPCAR file with two modes:
mode = 'e' for 'VASP stops at the next electronic step'
mode = 'i' for 'VASP stops at the next ionic step' """
if jobdir is None:
jobdir = os.getcwd()
if mode.lower()[0] == 'e':
stop_string = "LABORT = .TRUE."
elif mode.lower()[0] == 'i':
stop_string = "LSTOP = .TRUE."
else:
raise VaspIOError("Invalid STOPCAR mode specified: " + str(mode))
filename = os.path.join(jobdir, 'STOPCAR')
try:
stopcar_write = open(filename, 'w')
except IOError as e:
raise e
stopcar_write.write(stop_string)
stopcar_write.close()
[docs]def write_vasp_input(dirpath,
incarfile,
ref_kpointsfile,
ref_structurefile,
structurefile,
speciesfile,
sort=True,
extra_input_files=[],
strict_kpoints=False):
""" Write VASP input files in directory 'dirpath'
Parameters
----------
ref_structurefile: str
Path to a CASM structure.json file or VASP POS/POSCAR file representing a reference structure used for scaling incar and k-point parameters.
structurefile: str
Path to a CASM structure.json file or VASP POS/POSCAR file representing the structure to be calculated.
"""
print("Setting up VASP input files:", dirpath)
# read reference structure and kpoints
print(" Reading reference KPOINTS:", ref_kpointsfile)
ref_kpoints = kp.Kpoints(ref_kpointsfile)
if ref_structurefile != None:
print(" Reading reference POSCAR:", ref_structurefile)
ref_structure = poscar.Poscar(ref_structurefile)
else:
ref_structure = None
# read species, prim structure.json/POS, and to-be-calculated
# structure.json/POS, and use to construct incar and kpoints for
# the to-be-calculated structure
print(" Reading SPECIES:", speciesfile)
species_settings = species.species_settings(speciesfile)
if structurefile != None:
print(" Reading structure:", structurefile)
structure = poscar.Poscar(structurefile, species_settings)
else:
structure = None
## Reading DOF information present in the structure.json file
## Examples include: Cmagspin, NCmagspin, SOmagspin, etc
## Also contains information about atom types, and mol types
print(" Reading DOF information from structure: ", structurefile)
dof_info = attribute_info.AttributeInfo(structurefile)
print(" Reading INCAR:", incarfile)
incar = inc.Incar(incarfile, species_settings, structure, sort, dof_info)
print(" Generating KPOINTS")
if strict_kpoints:
kpoints = ref_kpoints
else:
kpoints = ref_kpoints.super_kpoints(ref_structure, structure)
# write main input files
if structurefile != None:
print(" Writing POSCAR:", os.path.join(dirpath, 'POSCAR'))
structure.write(os.path.join(dirpath, 'POSCAR'), sort)
print(" Writing INCAR:", os.path.join(dirpath, 'INCAR'))
incar.write(os.path.join(dirpath, 'INCAR'))
print(" Writing KPOINTS:", os.path.join(dirpath, 'KPOINTS'))
kpoints.write(os.path.join(dirpath, 'KPOINTS'))
if structurefile != None:
print(" Writing POTCAR:", os.path.join(dirpath, 'POTCAR'))
write_potcar(os.path.join(dirpath, 'POTCAR'), structure,
species_settings, sort)
# copy extra input files
if len(extra_input_files):
print(" Copying extra input files", end=' ')
for s in extra_input_files:
print(" ", s)
shutil.copy(s, dirpath)
print(" DONE\n")
sys.stdout.flush()