Statistiques
| Révision :

root / ase / io / gpawtext.py @ 11

Historique | Voir | Annoter | Télécharger (2,76 ko)

1 1 tkerber
from ase.atoms import Atom, Atoms
2 1 tkerber
from ase.calculators.singlepoint import SinglePointCalculator
3 1 tkerber
4 1 tkerber
5 1 tkerber
def read_gpaw_text(fileobj, index=-1):
6 1 tkerber
    if isinstance(fileobj, str):
7 1 tkerber
        fileobj = open(fileobj)
8 1 tkerber
9 1 tkerber
    def index_startswith(lines, string):
10 1 tkerber
        for i, line in enumerate(lines):
11 1 tkerber
            if line.startswith(string):
12 1 tkerber
                return i
13 1 tkerber
        raise ValueError
14 1 tkerber
15 1 tkerber
    lines = fileobj.readlines()
16 1 tkerber
    images = []
17 1 tkerber
    while True:
18 1 tkerber
        try:
19 1 tkerber
            i = lines.index('Unit Cell:\n')
20 1 tkerber
        except ValueError:
21 1 tkerber
            pass
22 1 tkerber
        else:
23 1 tkerber
            cell = []
24 1 tkerber
            pbc = []
25 1 tkerber
            for line in lines[i + 3:i + 6]:
26 1 tkerber
                words = line.split()
27 1 tkerber
                if len(words) == 5:  # old format
28 1 tkerber
                    cell.append(float(words[2]))
29 1 tkerber
                    pbc.append(words[1] == 'yes')
30 1 tkerber
                else:                # new format with GUC
31 1 tkerber
                    cell.append([float(word) for word in words[3:6]])
32 1 tkerber
                    pbc.append(words[2] == 'yes')
33 1 tkerber
34 1 tkerber
        try:
35 1 tkerber
            i = lines.index('Positions:\n')
36 1 tkerber
        except ValueError:
37 1 tkerber
            break
38 1 tkerber
39 1 tkerber
        atoms = Atoms(cell=cell, pbc=pbc)
40 1 tkerber
        for line in lines[i + 1:]:
41 1 tkerber
            words = line.split()
42 1 tkerber
            if len(words) != 5:
43 1 tkerber
                break
44 1 tkerber
            n, symbol, x, y, z = words
45 1 tkerber
            symbol = symbol.split('.')[0]
46 1 tkerber
            atoms.append(Atom(symbol, [float(x), float(y), float(z)]))
47 1 tkerber
        lines = lines[i + 5:]
48 1 tkerber
        try:
49 1 tkerber
            i = lines.index('-------------------------\n')
50 1 tkerber
        except ValueError:
51 1 tkerber
            e = None
52 1 tkerber
        else:
53 1 tkerber
            line = lines[i + 9]
54 1 tkerber
            assert line.startswith('Zero Kelvin:')
55 1 tkerber
            e = float(line.split()[-1])
56 1 tkerber
        try:
57 1 tkerber
            ii = index_startswith(lines, 'Total Charge:')
58 1 tkerber
        except ValueError:
59 1 tkerber
            q = None
60 1 tkerber
        else:
61 1 tkerber
            q = float(lines[ii].split()[2])
62 1 tkerber
        try:
63 1 tkerber
            ii = lines.index('Forces in eV/Ang:\n')
64 1 tkerber
        except ValueError:
65 1 tkerber
            f = None
66 1 tkerber
        else:
67 1 tkerber
            f = []
68 1 tkerber
            for i in range(ii + 1, ii + 1 + len(atoms)):
69 1 tkerber
                try:
70 1 tkerber
                    x, y, z = lines[i].split()[-3:]
71 1 tkerber
                    f.append((float(x), float(y), float(z)))
72 1 tkerber
                except (ValueError, IndexError), m:
73 1 tkerber
                    raise IOError('Malformed GPAW log file: %s' % m)
74 1 tkerber
75 1 tkerber
        if len(images) > 0 and e is None:
76 1 tkerber
            break
77 1 tkerber
78 1 tkerber
        if e is not None or f is not None:
79 1 tkerber
            atoms.set_calculator(SinglePointCalculator(e, f, None, None, atoms)) ### Fixme magmoms
80 1 tkerber
        if q is not None:
81 1 tkerber
            n = len(atoms)
82 1 tkerber
            atoms.set_charges([q / n] * n)
83 1 tkerber
84 1 tkerber
        images.append(atoms)
85 1 tkerber
        lines = lines[i:]
86 1 tkerber
87 1 tkerber
    if len(images) == 0:
88 1 tkerber
        raise IOError('Corrupted GPAW-text file!')
89 1 tkerber
90 1 tkerber
    return images[index]