Statistiques
| Révision :

root / ase / io / netcdf.py @ 19

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

1 1 tkerber
"""Read and write ASE2's netCDF trajectory files."""
2 1 tkerber
3 1 tkerber
from ase.io.pupynere import NetCDFFile
4 1 tkerber
from ase.atoms import Atoms
5 1 tkerber
from ase.calculators.singlepoint import SinglePointCalculator
6 1 tkerber
7 1 tkerber
8 1 tkerber
def read_netcdf(filename, index=-1):
9 1 tkerber
    nc = NetCDFFile(filename)
10 1 tkerber
    dims = nc.dimensions
11 1 tkerber
    vars = nc.variables
12 1 tkerber
13 1 tkerber
    positions = vars['CartesianPositions']
14 1 tkerber
    numbers = vars['AtomicNumbers'][:]
15 1 tkerber
    pbc = vars['BoundaryConditions'][:]
16 1 tkerber
    cell = vars['UnitCell']
17 1 tkerber
    tags = vars['Tags'][:]
18 1 tkerber
    if not tags.any():
19 1 tkerber
        tags = None
20 1 tkerber
    magmoms = vars['MagneticMoments'][:]
21 1 tkerber
    if not magmoms.any():
22 1 tkerber
        magmoms = None
23 1 tkerber
24 1 tkerber
    nimages = positions.shape[0]
25 1 tkerber
26 1 tkerber
    attach_calculator = False
27 1 tkerber
    if 'PotentialEnergy' in vars:
28 1 tkerber
        energy = vars['PotentialEnergy']
29 1 tkerber
        attach_calculator = True
30 1 tkerber
    else:
31 1 tkerber
        energy = nimages * [None]
32 1 tkerber
33 1 tkerber
    if 'CartesianForces' in vars:
34 1 tkerber
        forces = vars['CartesianForces']
35 1 tkerber
        attach_calculator = True
36 1 tkerber
    else:
37 1 tkerber
        forces = nimages * [None]
38 1 tkerber
39 1 tkerber
    if 'Stress' in vars:
40 1 tkerber
        stress = vars['Stress']
41 1 tkerber
        attach_calculator = True
42 1 tkerber
    else:
43 1 tkerber
        stress = nimages * [None]
44 1 tkerber
45 1 tkerber
    if isinstance(index, int):
46 1 tkerber
        indices = [index]
47 1 tkerber
    else:
48 1 tkerber
        indices = range(nimages)[index]
49 1 tkerber
50 1 tkerber
    images = []
51 1 tkerber
    for i in indices:
52 1 tkerber
        atoms = Atoms(positions=positions[i],
53 1 tkerber
                      numbers=numbers,
54 1 tkerber
                      cell=cell[i],
55 1 tkerber
                      pbc=pbc,
56 1 tkerber
                      tags=tags, magmoms=magmoms)
57 1 tkerber
58 1 tkerber
        if attach_calculator:
59 1 tkerber
            calc = SinglePointCalculator(energy[i], forces[i], stress[i],
60 1 tkerber
                                         None, atoms) ### Fixme magmoms
61 1 tkerber
            atoms.set_calculator(calc)
62 1 tkerber
63 1 tkerber
        images.append(atoms)
64 1 tkerber
65 1 tkerber
    if isinstance(index, int):
66 1 tkerber
        return images[0]
67 1 tkerber
    else:
68 1 tkerber
        return images
69 1 tkerber
70 1 tkerber
71 1 tkerber
class LOA:
72 1 tkerber
    def __init__(self, images):
73 1 tkerber
        self.set_atoms(images[0])
74 1 tkerber
75 1 tkerber
    def __len__(self):
76 1 tkerber
        return len(self.atoms)
77 1 tkerber
78 1 tkerber
    def set_atoms(self, atoms):
79 1 tkerber
        self.atoms = atoms
80 1 tkerber
81 1 tkerber
    def GetPotentialEnergy(self):
82 1 tkerber
        return self.atoms.get_potential_energy()
83 1 tkerber
84 1 tkerber
    def GetCartesianForces(self):
85 1 tkerber
        return self.atoms.get_forces()
86 1 tkerber
87 1 tkerber
    def GetUnitCell(self):
88 1 tkerber
        return self.atoms.get_cell()
89 1 tkerber
90 1 tkerber
    def GetAtomicNumbers(self):
91 1 tkerber
        return self.atoms.get_atomic_numbers()
92 1 tkerber
93 1 tkerber
    def GetCartesianPositions(self):
94 1 tkerber
        return self.atoms.get_positions()
95 1 tkerber
96 1 tkerber
    def GetBoundaryConditions(self):
97 1 tkerber
        return self.atoms.get_pbc()
98 1 tkerber
99 1 tkerber
100 1 tkerber
def write_netcdf(filename, images):
101 1 tkerber
    from ASE.Trajectories.NetCDFTrajectory import NetCDFTrajectory
102 1 tkerber
103 1 tkerber
    if not isinstance(images, (list, tuple)):
104 1 tkerber
        images = [images]
105 1 tkerber
106 1 tkerber
    loa = LOA(images)
107 1 tkerber
    traj = NetCDFTrajectory(filename, loa)
108 1 tkerber
    for atoms in images:
109 1 tkerber
        loa.set_atoms(atoms)
110 1 tkerber
        traj.Update()
111 1 tkerber
    traj.Close()