Source code for ase2sprkkr.asr.bader

"""Bader charges analysis."""
from asr.core import command, ASRResult


@command('asr.bader',
         dependencies=['asr.structureinfo', 'asr.gs'])
def main() -> ASRResult:
    """Calculate bader charges.

    To make Bader analysis we use another program. Download the executable
    for Bader analysis and put in path (this is for Linux, find the
    appropriate executable for you own OS)

        $ mkdir baderext && cd baderext
        $ wget theory.cm.utexas.edu/henkelman/code/bader/download/
        ...bader_lnx_64.tar.gz
        $ tar -zxf bader_lnx_64.tar.gz
        $ echo  'export PATH=~/baderext:$PATH' >> ~/.bashrc
    """
    from pathlib import Path
    from ase.io import write
    from ase.units import Bohr
    from gpaw import GPAW
    from gpaw.mpi import world

    assert world.size == 1, print('Do not run in parallel!')

    gs = GPAW('gs.gpw', txt=None)
    atoms = gs.atoms
    density = gs.get_all_electron_density() * Bohr**3
    write('density.cube', atoms, data=density)

    import subprocess
    import os
    folder = 'data-bader'
    try:
        os.makedirs(folder)
    except FileExistsError:
        pass
    cmd = 'bader -p all_atom -p atom_index ../density.cube'
    out = (Path(folder) / 'bader.out').open('w')
    err = (Path(folder) / 'bader.err').open('w')
    subprocess.run(cmd.split(), cwd=folder,
                   stdout=out,
                   stderr=err)
    out.close()
    err.close()


[docs] def print(): """Print Bader charges.""" import os.path as op fname = 'data-bader/ACF.dat' if not op.isfile(fname): return with open(fname) as f: dat = f.read() print(dat)
if __name__ == '__main__': main.cli()