root / ase / io / netcdf.py @ 1
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() |