root / ase / io / dacapo.py @ 11
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 |