Statistiques
| Révision :

root / ase / io / dacapo.py

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

1 1 tkerber
import numpy as np
2 1 tkerber
3 1 tkerber
from ase.calculators.singlepoint import SinglePointCalculator
4 1 tkerber
from ase.atom import Atom
5 1 tkerber
from ase.atoms import Atoms
6 1 tkerber
7 1 tkerber
8 1 tkerber
def read_dacapo_text(fileobj):
9 1 tkerber
    if isinstance(fileobj, str):
10 1 tkerber
        fileobj = open(fileobj)
11 1 tkerber
12 1 tkerber
    lines = fileobj.readlines()
13 1 tkerber
    i = lines.index(' Structure:             A1           A2            A3\n')
14 1 tkerber
    cell = np.array([[float(w) for w in line.split()[2:5]]
15 1 tkerber
                     for line in lines[i + 1:i + 4]]).transpose()
16 1 tkerber
    i = lines.index(' Structure:  >>         Ionic positions/velocities ' +
17 1 tkerber
                    'in cartesian coordinates       <<\n')
18 1 tkerber
    atoms = []
19 1 tkerber
    for line in lines[i + 4:]:
20 1 tkerber
        words = line.split()
21 1 tkerber
        if len(words) != 9:
22 1 tkerber
            break
23 1 tkerber
        Z, x, y, z = words[2:6]
24 1 tkerber
        atoms.append(Atom(int(Z), [float(x), float(y), float(z)]))
25 1 tkerber
26 1 tkerber
    atoms = Atoms(atoms, cell=cell.tolist())
27 1 tkerber
28 1 tkerber
    try:
29 1 tkerber
        i = lines.index(
30 1 tkerber
            ' DFT:  CPU time                           Total energy\n')
31 1 tkerber
    except ValueError:
32 1 tkerber
        pass
33 1 tkerber
    else:
34 1 tkerber
        column = lines[i + 3].split().index('selfcons') - 1
35 1 tkerber
        try:
36 1 tkerber
            i2 = lines.index(' ANALYSIS PART OF CODE\n', i)
37 1 tkerber
        except ValueError:
38 1 tkerber
            pass
39 1 tkerber
        else:
40 1 tkerber
            while i2 > i:
41 1 tkerber
                if lines[i2].startswith(' DFT:'):
42 1 tkerber
                    break
43 1 tkerber
                i2 -= 1
44 1 tkerber
            energy = float(lines[i2].split()[column])
45 1 tkerber
            atoms.set_calculator(SinglePointCalculator(energy, None, None,
46 1 tkerber
                                                       None, atoms))
47 1 tkerber
48 1 tkerber
    return atoms
49 1 tkerber
50 1 tkerber
51 1 tkerber
52 1 tkerber
def read_dacapo(filename):
53 1 tkerber
    from ase.io.pupynere import NetCDFFile
54 1 tkerber
55 1 tkerber
    nc = NetCDFFile(filename)
56 1 tkerber
    dims = nc.dimensions
57 1 tkerber
    vars = nc.variables
58 1 tkerber
59 1 tkerber
    cell = vars['UnitCell'][-1]
60 1 tkerber
    try:
61 1 tkerber
        magmoms = vars['InitialAtomicMagneticMoment'][:]
62 1 tkerber
    except KeyError:
63 1 tkerber
        magmoms = None
64 1 tkerber
    try:
65 1 tkerber
        tags = vars['AtomTags'][:]
66 1 tkerber
    except KeyError:
67 1 tkerber
        tags = None
68 1 tkerber
    atoms = Atoms(scaled_positions=vars['DynamicAtomPositions'][-1],
69 1 tkerber
                  symbols=[(a + b).strip()
70 1 tkerber
                           for a, b in vars['DynamicAtomSpecies'][:]],
71 1 tkerber
                  cell=cell,
72 1 tkerber
                  magmoms=magmoms,
73 1 tkerber
                  tags=tags,
74 1 tkerber
                  pbc=True)
75 1 tkerber
76 1 tkerber
    try:
77 1 tkerber
        energy = vars['TotalEnergy'][-1]
78 1 tkerber
        force = vars['DynamicAtomForces'][-1]
79 1 tkerber
    except KeyError:
80 1 tkerber
        energy = None
81 1 tkerber
        force = None
82 1 tkerber
    calc = SinglePointCalculator(energy,force,None, None, atoms)  ### Fixme magmoms
83 1 tkerber
    atoms.set_calculator(calc)
84 1 tkerber
85 1 tkerber
    return atoms