root / ase / calculators / jacapo / changed.py @ 1
Historique | Voir | Annoter | Télécharger (4,55 ko)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | |
3 | 1 | tkerber | import logging |
4 | 1 | tkerber | log = logging.getLogger('Jacapo')
|
5 | 1 | tkerber | |
6 | 1 | tkerber | '''
|
7 | 1 | tkerber | provides functions to determine if an input parameter has changed.
|
8 | 1 | tkerber | '''
|
9 | 1 | tkerber | |
10 | 1 | tkerber | #######################################################################
|
11 | 1 | tkerber | #### changed functions
|
12 | 1 | tkerber | |
13 | 1 | tkerber | def kpts_changed(calc, x): |
14 | 1 | tkerber | '''
|
15 | 1 | tkerber | check if kpt grid has changed.
|
16 | 1 | tkerber |
|
17 | 1 | tkerber | we have to take care to generate teh right k-points from x if
|
18 | 1 | tkerber | needed. if a user provides (4,4,4) we need to generate the MP
|
19 | 1 | tkerber | grid, etc...
|
20 | 1 | tkerber |
|
21 | 1 | tkerber | Since i changed the MP code in set_kpts, there is some
|
22 | 1 | tkerber | incompatibility with old jacapo calculations and their MP
|
23 | 1 | tkerber | grids.
|
24 | 1 | tkerber | '''
|
25 | 1 | tkerber | #chadi-cohen
|
26 | 1 | tkerber | if isinstance(x, str): |
27 | 1 | tkerber | exec('from ase.dft.kpoints import %s' % kpts)
|
28 | 1 | tkerber | listofkpts = eval(kpts)
|
29 | 1 | tkerber | #monkhorst-pack grid
|
30 | 1 | tkerber | elif np.array(x).shape == (3,): |
31 | 1 | tkerber | from ase.dft.kpoints import monkhorst_pack |
32 | 1 | tkerber | N1, N2, N3 = x |
33 | 1 | tkerber | listofkpts = monkhorst_pack((N1, N2, N3)) |
34 | 1 | tkerber | #user-defined list is provided
|
35 | 1 | tkerber | elif len(np.array(x).shape) == 2: |
36 | 1 | tkerber | listofkpts = np.array(x) |
37 | 1 | tkerber | else:
|
38 | 1 | tkerber | raise Exception, 'apparent invalid setting for kpts' |
39 | 1 | tkerber | |
40 | 1 | tkerber | grid = calc.get_kpts() |
41 | 1 | tkerber | |
42 | 1 | tkerber | if grid.shape != listofkpts.shape:
|
43 | 1 | tkerber | return True |
44 | 1 | tkerber | |
45 | 1 | tkerber | if (abs(listofkpts - grid) < 1e-6).all(): |
46 | 1 | tkerber | return False |
47 | 1 | tkerber | else:
|
48 | 1 | tkerber | return True |
49 | 1 | tkerber | |
50 | 1 | tkerber | def electronic_minimization_changed(calc, x): |
51 | 1 | tkerber | myx = calc.get_electronic_minimization() |
52 | 1 | tkerber | |
53 | 1 | tkerber | for key in myx: |
54 | 1 | tkerber | if myx[key] != x[key]:
|
55 | 1 | tkerber | print key, myx[key], ' changed to ', x[key] |
56 | 1 | tkerber | return True |
57 | 1 | tkerber | return False |
58 | 1 | tkerber | |
59 | 1 | tkerber | def spinpol_changed(calc, x): |
60 | 1 | tkerber | if x != calc.get_spinpol():
|
61 | 1 | tkerber | return True |
62 | 1 | tkerber | else:
|
63 | 1 | tkerber | return False |
64 | 1 | tkerber | |
65 | 1 | tkerber | def symmetry_changed(calc, x): |
66 | 1 | tkerber | if x != calc.get_symmetry():
|
67 | 1 | tkerber | return True |
68 | 1 | tkerber | else:
|
69 | 1 | tkerber | return False |
70 | 1 | tkerber | |
71 | 1 | tkerber | def xc_changed(calc, x): |
72 | 1 | tkerber | if x != calc.get_xc():
|
73 | 1 | tkerber | return True |
74 | 1 | tkerber | return False |
75 | 1 | tkerber | |
76 | 1 | tkerber | def calculate_stress_changed(calc, x): |
77 | 1 | tkerber | if x != calc.get_calculate_stress():
|
78 | 1 | tkerber | return True |
79 | 1 | tkerber | return False |
80 | 1 | tkerber | |
81 | 1 | tkerber | def ados_changed(calc, x): |
82 | 1 | tkerber | ados = calc.get_ados() |
83 | 1 | tkerber | |
84 | 1 | tkerber | #ados may not be defined, and then None is returned
|
85 | 1 | tkerber | if ados is None and x is None: |
86 | 1 | tkerber | return False |
87 | 1 | tkerber | elif ados is None and x is not None: |
88 | 1 | tkerber | return True |
89 | 1 | tkerber | elif ados is not None and x is None: |
90 | 1 | tkerber | return True |
91 | 1 | tkerber | |
92 | 1 | tkerber | #getting here means ados and x are not none so we compare them
|
93 | 1 | tkerber | for key in x: |
94 | 1 | tkerber | try:
|
95 | 1 | tkerber | if x[key] != ados[key]:
|
96 | 1 | tkerber | return True |
97 | 1 | tkerber | except ValueError: |
98 | 1 | tkerber | if (x[key] != ados[key]).all():
|
99 | 1 | tkerber | return True |
100 | 1 | tkerber | return False |
101 | 1 | tkerber | |
102 | 1 | tkerber | def convergence_changed(calc, x): |
103 | 1 | tkerber | conv = calc.get_convergence() |
104 | 1 | tkerber | for key in x: |
105 | 1 | tkerber | if x[key] != conv[key]:
|
106 | 1 | tkerber | return True |
107 | 1 | tkerber | return False |
108 | 1 | tkerber | |
109 | 1 | tkerber | def charge_mixing_changed(calc, x): |
110 | 1 | tkerber | cm = calc.get_charge_mixing() |
111 | 1 | tkerber | if x is None and cm is None: |
112 | 1 | tkerber | return False |
113 | 1 | tkerber | else:
|
114 | 1 | tkerber | return True |
115 | 1 | tkerber | |
116 | 1 | tkerber | for key in x: |
117 | 1 | tkerber | if x[key] != cm[key]:
|
118 | 1 | tkerber | return True |
119 | 1 | tkerber | return False |
120 | 1 | tkerber | |
121 | 1 | tkerber | def decoupling_changed(calc, x): |
122 | 1 | tkerber | pars = calc.get_decoupling() |
123 | 1 | tkerber | for key in x: |
124 | 1 | tkerber | if x[key] != pars[key]:
|
125 | 1 | tkerber | return True |
126 | 1 | tkerber | return False |
127 | 1 | tkerber | |
128 | 1 | tkerber | def dipole_changed(calc, x): |
129 | 1 | tkerber | pars = calc.get_dipole() |
130 | 1 | tkerber | if pars is False and x is False: |
131 | 1 | tkerber | return False |
132 | 1 | tkerber | elif pars is not False: |
133 | 1 | tkerber | for key in x: |
134 | 1 | tkerber | if x[key] != pars[key]:
|
135 | 1 | tkerber | return True |
136 | 1 | tkerber | return False |
137 | 1 | tkerber | |
138 | 1 | tkerber | def extpot_changed(calc, x): |
139 | 1 | tkerber | extpot = calc.get_extpot() |
140 | 1 | tkerber | if (x == extpot).all():
|
141 | 1 | tkerber | return False |
142 | 1 | tkerber | return True |
143 | 1 | tkerber | |
144 | 1 | tkerber | def fftgrid_changed(calc, x): |
145 | 1 | tkerber | validkeys = ['soft', 'hard'] |
146 | 1 | tkerber | |
147 | 1 | tkerber | myx = calc.get_fftgrid() |
148 | 1 | tkerber | if (myx['soft'] == x['soft'] and myx['hard'] == x['hard']): |
149 | 1 | tkerber | return False |
150 | 1 | tkerber | else:
|
151 | 1 | tkerber | return True |
152 | 1 | tkerber | |
153 | 1 | tkerber | |
154 | 1 | tkerber | def nbands_changed(calc, x): |
155 | 1 | tkerber | if calc.get_nbands() == x:
|
156 | 1 | tkerber | return False |
157 | 1 | tkerber | else:
|
158 | 1 | tkerber | return True |
159 | 1 | tkerber | |
160 | 1 | tkerber | def occupationstatistics_changed(calc, x): |
161 | 1 | tkerber | if calc.get_occupationstatistics() == x:
|
162 | 1 | tkerber | return False |
163 | 1 | tkerber | else:
|
164 | 1 | tkerber | return True |
165 | 1 | tkerber | |
166 | 1 | tkerber | def pw_changed(calc, x): |
167 | 1 | tkerber | if calc.get_pw() == x:
|
168 | 1 | tkerber | return False |
169 | 1 | tkerber | else:
|
170 | 1 | tkerber | return True |
171 | 1 | tkerber | |
172 | 1 | tkerber | def dw_changed(calc, x): |
173 | 1 | tkerber | if calc.get_dw() == x:
|
174 | 1 | tkerber | return False |
175 | 1 | tkerber | else:
|
176 | 1 | tkerber | return True |
177 | 1 | tkerber | |
178 | 1 | tkerber | def ft_changed(calc, x): |
179 | 1 | tkerber | if calc.get_ft() == x:
|
180 | 1 | tkerber | return False |
181 | 1 | tkerber | else:
|
182 | 1 | tkerber | return True |
183 | 1 | tkerber | |
184 | 1 | tkerber | def mdos_changed(calc,x): |
185 | 1 | tkerber | |
186 | 1 | tkerber | myx = calc.get_mdos() |
187 | 1 | tkerber | |
188 | 1 | tkerber | log.debug('myx = %s' % str(myx)) |
189 | 1 | tkerber | log.debug('x = %s' % str(x)) |
190 | 1 | tkerber | |
191 | 1 | tkerber | if x is None and myx is None: |
192 | 1 | tkerber | return False |
193 | 1 | tkerber | elif ((x is None and myx is not None) |
194 | 1 | tkerber | or (x is not None and myx is None)): |
195 | 1 | tkerber | return True |
196 | 1 | tkerber | else:
|
197 | 1 | tkerber | for key in x: |
198 | 1 | tkerber | if x[key] != myx[key]:
|
199 | 1 | tkerber | return True |
200 | 1 | tkerber | return False |