Statistiques
| Révision :

root / ase / old.py @ 11

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