Source code for ectoolkits.utils.vasp
import os
import glob
import numpy as np
from ase.io import vasp
from ectoolkits.log import get_logger
logger = get_logger(__name__)
[docs]def scale_iso_cell(atoms, start, end, step, out_name):
    """
    creat the scaling cell for vasp
    atoms: the Atoms object from ase
    start: starting fraction
    end: ending fraction
    step: the step from start to end
    out_name: the name for out file, it can be a path.
    """
    cell_list = np.arange(start, end, step)
    old_cell_vector = atoms.get_cell()
    new_atoms = atoms.copy()
    for scale in cell_list:
        new_atoms.set_cell(old_cell_vector * scale, scale_atoms=True)
        vasp.write_vasp(out_name + "_{0:.3f}".format(scale), new_atoms,
                        direct=True, sort=True)
        logger.info("create POSCAR for {0:.3f} scaling".format(scale)) 
[docs]def find_outcar(dirpath, filename):
    """
    find the outcar path with some fancy output
    """
    dirpath = os.path.abspath(dirpath)
    file = os.path.join(dirpath, filename)
    allfile = glob.glob(file)
    for i in allfile:
        logger.info("The file {0} has been found".format(os.path.basename(i)))
    return allfile 
[docs]def exout_vasp(files):
    """
    extract the vasp file from filepath
    """
    infos = []
    for file in files:
        logger.info("Now extract the cell parameter, volume and "
                  "energy from {0}".format(os.path.basename(file)))
        info = []
        pos = vasp.read_vasp_out(file)
        for i in pos.get_cell_lengths_and_angles():
            info.append(i)
        info.append(pos.get_volume())
        info.append(pos.get_total_energy())
        infos.append(info)
        logger.info("extraction finished")
    infos = np.array(infos)
    # sort the row by volume
    infos = infos[infos[:, 6].argsort()]
    dirname = os.path.dirname(files[0])
    info_file = os.path.join(dirname, "v-e.dat")
    np.savetxt(info_file, infos, fmt='%.8f',
               header="lengthA  lengthB  lengthC  AngleA  AngleB  AngleC"
               "Volume Energy")
    logger.info("store the file in {0}".format(info_file))
    return infos