root / ase / io / gpawtext.py @ 18
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] |