Statistiques
| Révision :

root / ase / io / bader.py @ 11

Historique | Voir | Annoter | Télécharger (1,7 ko)

1 1 tkerber
import numpy as np
2 1 tkerber
from ase.units import Bohr
3 1 tkerber
4 1 tkerber
def attach_charges(atoms, fileobj='ACF.dat', displacement=1e-4):
5 1 tkerber
    """Attach the charges from the fileobj to the Atoms."""
6 1 tkerber
    if isinstance(fileobj, str):
7 1 tkerber
        fileobj = open(fileobj)
8 1 tkerber
9 1 tkerber
    sep = '---------------'
10 1 tkerber
    i = 0 # Counter for the lines
11 1 tkerber
    k = 0 # Counter of sep
12 1 tkerber
    assume6columns = False
13 1 tkerber
    for line in fileobj:
14 1 tkerber
        if line[0] == '\n': # check if there is an empty line in the
15 1 tkerber
            i -= 1          # head of ACF.dat file
16 1 tkerber
        if i == 0:
17 1 tkerber
            headings = line
18 1 tkerber
            if 'BADER' in headings.split():
19 1 tkerber
                j = headings.split().index('BADER')
20 1 tkerber
            elif 'CHARGE' in headings.split():
21 1 tkerber
                j = headings.split().index('CHARGE')
22 1 tkerber
            else:
23 1 tkerber
                print 'Can\'t find keyword "BADER" or "CHARGE".' \
24 1 tkerber
                +' Assuming the ACF.dat file has 6 columns.'
25 1 tkerber
                j = 4
26 1 tkerber
                assume6columns = True
27 1 tkerber
        if sep in line: # Stop at last seperator line
28 1 tkerber
            if k == 1:
29 1 tkerber
                break
30 1 tkerber
            k += 1
31 1 tkerber
        if not i > 1:
32 1 tkerber
            pass
33 1 tkerber
        else:
34 1 tkerber
            words = line.split()
35 1 tkerber
            if assume6columns is True:
36 1 tkerber
                if len(words) != 6:
37 1 tkerber
                    raise IOError('Number of columns in ACF file incorrect!\n'
38 1 tkerber
                                  'Check that Bader program version >= 0.25')
39 1 tkerber
40 1 tkerber
            atom = atoms[int(words[0]) - 1]
41 1 tkerber
            atom.charge = atom.number - float(words[j])
42 1 tkerber
            if displacement is not None: # check if the atom positions match
43 1 tkerber
                xyz = np.array([float(w) for w in words[1:4]]) * Bohr
44 1 tkerber
                assert np.linalg.norm(atom.position - xyz) < displacement
45 1 tkerber
        i += 1