root / ase / old.py @ 18
Historique | Voir | Annoter | Télécharger (6,56 ko)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | try:
|
3 | 1 | tkerber | import Numeric as num |
4 | 1 | tkerber | except ImportError: |
5 | 1 | tkerber | pass
|
6 | 1 | tkerber | else:
|
7 | 1 | tkerber | def npy2num(a, typecode=num.Float): |
8 | 1 | tkerber | return num.array(a, typecode)
|
9 | 1 | tkerber | if num.__version__ <= '23.8': |
10 | 1 | tkerber | #def npy2num(a, typecode=num.Float):
|
11 | 1 | tkerber | # return num.array(a.tolist(), typecode)
|
12 | 1 | tkerber | def npy2num(a, typecode=num.Float): |
13 | 1 | tkerber | b = num.fromstring(a.tostring(), typecode) |
14 | 1 | tkerber | b.shape = a.shape |
15 | 1 | tkerber | return b
|
16 | 1 | tkerber | |
17 | 1 | tkerber | from ase.data import chemical_symbols |
18 | 1 | tkerber | |
19 | 1 | tkerber | |
20 | 1 | tkerber | class OldASEListOfAtomsWrapper: |
21 | 1 | tkerber | def __init__(self, atoms): |
22 | 1 | tkerber | self.atoms = atoms
|
23 | 1 | tkerber | self.constraints = []
|
24 | 1 | tkerber | |
25 | 1 | tkerber | def get_positions(self): |
26 | 1 | tkerber | return np.array(self.atoms.GetCartesianPositions()) |
27 | 1 | tkerber | |
28 | 1 | tkerber | def get_calculator(self): |
29 | 1 | tkerber | calc = self.atoms.GetCalculator()
|
30 | 1 | tkerber | if calc is not None: |
31 | 1 | tkerber | return OldASECalculatorWrapper(calc)
|
32 | 1 | tkerber | |
33 | 1 | tkerber | def get_potential_energy(self): |
34 | 1 | tkerber | return self.atoms.GetPotentialEnergy() |
35 | 1 | tkerber | |
36 | 1 | tkerber | def get_forces(self): |
37 | 1 | tkerber | return np.array(self.atoms.GetCartesianForces()) |
38 | 1 | tkerber | |
39 | 1 | tkerber | def get_stress(self): |
40 | 1 | tkerber | return np.array(self.atoms.GetStress()) |
41 | 1 | tkerber | |
42 | 1 | tkerber | def get_atomic_numbers(self): |
43 | 1 | tkerber | return np.array(self.atoms.GetAtomicNumbers()) |
44 | 1 | tkerber | |
45 | 1 | tkerber | def get_tags(self): |
46 | 1 | tkerber | return np.array(self.atoms.GetTags()) |
47 | 1 | tkerber | |
48 | 1 | tkerber | def get_momenta(self): |
49 | 1 | tkerber | return np.array(self.atoms.GetCartesianMomenta()) |
50 | 1 | tkerber | |
51 | 1 | tkerber | def get_masses(self): |
52 | 1 | tkerber | return np.array(self.atoms.GetMasses()) |
53 | 1 | tkerber | |
54 | 1 | tkerber | def get_initial_magnetic_moments(self): |
55 | 1 | tkerber | return np.array(self.atoms.GetMagneticMoments()) |
56 | 1 | tkerber | |
57 | 1 | tkerber | def get_magnetic_moments(self): |
58 | 1 | tkerber | return None |
59 | 1 | tkerber | |
60 | 1 | tkerber | def get_charges(self): |
61 | 1 | tkerber | return np.zeros(len(self)) |
62 | 1 | tkerber | |
63 | 1 | tkerber | def has(self, name): |
64 | 1 | tkerber | return True |
65 | 1 | tkerber | |
66 | 1 | tkerber | def get_cell(self): |
67 | 1 | tkerber | return np.array(self.atoms.GetUnitCell()) |
68 | 1 | tkerber | |
69 | 1 | tkerber | def get_pbc(self): |
70 | 1 | tkerber | return np.array(self.atoms.GetBoundaryConditions(), bool) |
71 | 1 | tkerber | |
72 | 1 | tkerber | def __len__(self): |
73 | 1 | tkerber | return len(self.atoms) |
74 | 1 | tkerber | |
75 | 1 | tkerber | def copy(self): |
76 | 1 | tkerber | from ase.atoms import Atoms |
77 | 1 | tkerber | return Atoms(positions=self.get_positions(), |
78 | 1 | tkerber | numbers=self.get_atomic_numbers(),
|
79 | 1 | tkerber | tags=self.get_tags(),
|
80 | 1 | tkerber | momenta=self.get_momenta(),
|
81 | 1 | tkerber | masses=self.get_masses(),
|
82 | 1 | tkerber | magmoms=self.get_initial_magnetic_moments(),
|
83 | 1 | tkerber | charges=self.get_charges(),
|
84 | 1 | tkerber | cell=self.get_cell(),
|
85 | 1 | tkerber | pbc=self.get_pbc(),
|
86 | 1 | tkerber | constraint=None,
|
87 | 1 | tkerber | calculator=None) # Don't copy the calculator |
88 | 1 | tkerber | |
89 | 1 | tkerber | |
90 | 1 | tkerber | class OldASECalculatorWrapper: |
91 | 1 | tkerber | def __init__(self, calc, atoms=None): |
92 | 1 | tkerber | self.calc = calc
|
93 | 1 | tkerber | |
94 | 1 | tkerber | if atoms is None: |
95 | 1 | tkerber | try:
|
96 | 1 | tkerber | self.atoms = calc.GetListOfAtoms()
|
97 | 1 | tkerber | except AttributeError: |
98 | 1 | tkerber | self.atoms = None |
99 | 1 | tkerber | else:
|
100 | 1 | tkerber | from ASE import Atom, ListOfAtoms |
101 | 1 | tkerber | |
102 | 1 | tkerber | numbers = atoms.get_atomic_numbers() |
103 | 1 | tkerber | positions = atoms.get_positions() |
104 | 1 | tkerber | magmoms = atoms.get_initial_magnetic_moments() |
105 | 1 | tkerber | self.atoms = ListOfAtoms(
|
106 | 1 | tkerber | [Atom(Z=numbers[a], position=positions[a], magmom=magmoms[a]) |
107 | 1 | tkerber | for a in range(len(atoms))], |
108 | 1 | tkerber | cell=npy2num(atoms.get_cell()), |
109 | 1 | tkerber | periodic=tuple(atoms.get_pbc()))
|
110 | 1 | tkerber | self.atoms.SetCalculator(calc)
|
111 | 1 | tkerber | |
112 | 1 | tkerber | def get_atoms(self): |
113 | 1 | tkerber | return OldASEListOfAtomsWrapper(self.atoms) |
114 | 1 | tkerber | |
115 | 1 | tkerber | def get_potential_energy(self, atoms): |
116 | 1 | tkerber | self.atoms.SetCartesianPositions(npy2num(atoms.get_positions()))
|
117 | 1 | tkerber | self.atoms.SetUnitCell(npy2num(atoms.get_cell()), fix=True) |
118 | 1 | tkerber | return self.calc.GetPotentialEnergy() |
119 | 1 | tkerber | |
120 | 1 | tkerber | def get_forces(self, atoms): |
121 | 1 | tkerber | self.atoms.SetCartesianPositions(npy2num(atoms.get_positions()))
|
122 | 1 | tkerber | self.atoms.SetUnitCell(npy2num(atoms.get_cell()), fix=True) |
123 | 1 | tkerber | return np.array(self.calc.GetCartesianForces()) |
124 | 1 | tkerber | |
125 | 1 | tkerber | def get_stress(self, atoms): |
126 | 1 | tkerber | self.atoms.SetCartesianPositions(npy2num(atoms.get_positions()))
|
127 | 1 | tkerber | self.atoms.SetUnitCell(npy2num(atoms.get_cell()), fix=True) |
128 | 1 | tkerber | return np.array(self.calc.GetStress()) |
129 | 1 | tkerber | |
130 | 1 | tkerber | def get_number_of_bands(self): |
131 | 1 | tkerber | return self.calc.GetNumberOfBands() |
132 | 1 | tkerber | |
133 | 1 | tkerber | def get_kpoint_weights(self): |
134 | 1 | tkerber | return np.array(self.calc.GetIBZKPointWeights()) |
135 | 1 | tkerber | |
136 | 1 | tkerber | def get_number_of_spins(self): |
137 | 1 | tkerber | return 1 + int(self.calc.GetSpinPolarized()) |
138 | 1 | tkerber | |
139 | 1 | tkerber | def get_eigenvalues(self, kpt=0, spin=0): |
140 | 1 | tkerber | return np.array(self.calc.GetEigenvalues(kpt, spin)) |
141 | 1 | tkerber | |
142 | 1 | tkerber | def get_fermi_level(self): |
143 | 1 | tkerber | return self.calc.GetFermiLevel() |
144 | 1 | tkerber | |
145 | 1 | tkerber | def get_number_of_grid_points(self): |
146 | 1 | tkerber | return np.array(self.get_pseudo_wave_function(0, 0, 0).shape) |
147 | 1 | tkerber | |
148 | 1 | tkerber | def get_pseudo_wave_function(self, n=0, k=0, s=0, pad=True): |
149 | 1 | tkerber | kpt = self.get_bz_k_points()[k]
|
150 | 1 | tkerber | state = self.calc.GetElectronicStates().GetState(band=n, spin=s,
|
151 | 1 | tkerber | kptindex=k) |
152 | 1 | tkerber | |
153 | 1 | tkerber | # Get wf, without bolch phase (Phase = True doesn't do anything!)
|
154 | 1 | tkerber | wave = state.GetWavefunctionOnGrid(phase=False)
|
155 | 1 | tkerber | |
156 | 1 | tkerber | # Add bloch phase if this is not the Gamma point
|
157 | 1 | tkerber | if np.all(kpt == 0): |
158 | 1 | tkerber | return wave
|
159 | 1 | tkerber | coord = state.GetCoordinates() |
160 | 1 | tkerber | phase = coord[0] * kpt[0] + coord[1] * kpt[1] + coord[2] * kpt[2] |
161 | 1 | tkerber | return np.array(wave) * np.exp(-2.j * np.pi * phase) # sign! XXX |
162 | 1 | tkerber | |
163 | 1 | tkerber | #return np.array(self.calc.GetWaveFunctionArray(n, k, s)) # No phase!
|
164 | 1 | tkerber | |
165 | 1 | tkerber | def get_bz_k_points(self): |
166 | 1 | tkerber | return np.array(self.calc.GetBZKPoints()) |
167 | 1 | tkerber | |
168 | 1 | tkerber | def get_ibz_k_points(self): |
169 | 1 | tkerber | return np.array(self.calc.GetIBZKPoints()) |
170 | 1 | tkerber | |
171 | 1 | tkerber | def get_wannier_localization_matrix(self, nbands, dirG, kpoint, |
172 | 1 | tkerber | nextkpoint, G_I, spin): |
173 | 1 | tkerber | return np.array(self.calc.GetWannierLocalizationMatrix( |
174 | 1 | tkerber | G_I=G_I.tolist(), nbands=nbands, dirG=dirG.tolist(), |
175 | 1 | tkerber | kpoint=kpoint, nextkpoint=nextkpoint, spin=spin)) |
176 | 1 | tkerber | |
177 | 1 | tkerber | def initial_wannier(self, initialwannier, kpointgrid, fixedstates, |
178 | 1 | tkerber | edf, spin): |
179 | 1 | tkerber | # Use initial guess to determine U and C
|
180 | 1 | tkerber | init = self.calc.InitialWannier(initialwannier, self.atoms, |
181 | 1 | tkerber | npy2num(kpointgrid, num.Int)) |
182 | 1 | tkerber | |
183 | 1 | tkerber | states = self.calc.GetElectronicStates()
|
184 | 1 | tkerber | waves = [[state.GetWaveFunction() |
185 | 1 | tkerber | for state in states.GetStatesKPoint(k, spin)] |
186 | 1 | tkerber | for k in self.calc.GetIBZKPoints()] |
187 | 1 | tkerber | |
188 | 1 | tkerber | init.SetupMMatrix(waves, self.calc.GetBZKPoints())
|
189 | 1 | tkerber | c, U = init.GetListOfCoefficientsAndRotationMatrices( |
190 | 1 | tkerber | (self.calc.GetNumberOfBands(), fixedstates, edf))
|
191 | 1 | tkerber | U = np.array(U) |
192 | 1 | tkerber | for k in range(len(c)): |
193 | 1 | tkerber | c[k] = np.array(c[k]) |
194 | 1 | tkerber | return c, U |