Statistiques
| Révision :

root / ase / calculators / jacapo / validate.py @ 1

Historique | Voir | Annoter | Télécharger (8,76 ko)

1 1 tkerber
import os
2 1 tkerber
import numpy as np
3 1 tkerber
'''
4 1 tkerber
input validation module
5 1 tkerber

6 1 tkerber
provides functions to validate all input variables to the Jacapo calculator.
7 1 tkerber
'''
8 1 tkerber
9 1 tkerber
###########################################3
10 1 tkerber
### Validation functions
11 1 tkerber
##########################################
12 1 tkerber
def valid_int(x):
13 1 tkerber
    return isinstance(x, int)
14 1 tkerber
15 1 tkerber
def valid_float(x):
16 1 tkerber
    return isinstance(x, float)
17 1 tkerber
18 1 tkerber
def valid_int_or_float(x):
19 1 tkerber
    return (isinstance(x, int) or isinstance(x, float))
20 1 tkerber
21 1 tkerber
def valid_boolean(x):
22 1 tkerber
    return isinstance(x, bool)
23 1 tkerber
24 1 tkerber
def valid_str(x):
25 1 tkerber
    return isinstance(x, str)
26 1 tkerber
27 1 tkerber
def valid_atoms(x):
28 1 tkerber
    import ase
29 1 tkerber
    return isinstance(x, ase.Atoms)
30 1 tkerber
31 1 tkerber
def valid_pw(x):
32 1 tkerber
    return (valid_int_or_float(x) and x>0 and x<2000)
33 1 tkerber
34 1 tkerber
def valid_dw(x):
35 1 tkerber
    return (valid_int_or_float(x) and x>0 and x<2000)
36 1 tkerber
37 1 tkerber
def valid_xc(x):
38 1 tkerber
    return (x in ['PW91', 'PBE', 'revPBE', 'RPBE', 'VWN'])
39 1 tkerber
40 1 tkerber
def valid_nbands(x):
41 1 tkerber
    return valid_int(x)
42 1 tkerber
43 1 tkerber
def valid_ft(x):
44 1 tkerber
    return(valid_float, x)
45 1 tkerber
46 1 tkerber
def valid_spinpol(x):
47 1 tkerber
    return valid_boolean(x)
48 1 tkerber
49 1 tkerber
def valid_fixmagmom(x):
50 1 tkerber
    return valid_float(x)
51 1 tkerber
52 1 tkerber
def valid_symmetry(x):
53 1 tkerber
    return valid_boolean(x)
54 1 tkerber
55 1 tkerber
def valid_calculate_stress(x):
56 1 tkerber
    return valid_boolean(x)
57 1 tkerber
58 1 tkerber
def valid_kpts(x):
59 1 tkerber
    if isinstance(x, str):
60 1 tkerber
        return x in ['cc-6-1x1',
61 1 tkerber
                     'cc-12-2x3',
62 1 tkerber
                     'cc-18-sq3xsq3',
63 1 tkerber
                     'cc-18-1x1',
64 1 tkerber
                     'cc-54-sq3xsq3',
65 1 tkerber
                     'cc-54-1x1',
66 1 tkerber
                     'cc-162-1x1']
67 1 tkerber
    x = np.array(x)
68 1 tkerber
    #empty arg is no good
69 1 tkerber
    if x.shape == ():
70 1 tkerber
        return False
71 1 tkerber
    #monkhorst-pack
72 1 tkerber
    elif x.shape == (3,) and ((x.dtype == 'int32') or (x.dtype == 'int64')):
73 1 tkerber
        return True
74 1 tkerber
    #user-defined list
75 1 tkerber
    elif x.shape[1] == 3 and (str(x.dtype))[0:7] == 'float64':
76 1 tkerber
        return True
77 1 tkerber
    else:
78 1 tkerber
        return False
79 1 tkerber
80 1 tkerber
def valid_dipole(x):
81 1 tkerber
    if valid_boolean(x):
82 1 tkerber
        return True
83 1 tkerber
    #dictionary passed in. we need to check the keys
84 1 tkerber
    valid_keys = {'status':valid_boolean,
85 1 tkerber
                  'mixpar':valid_float,
86 1 tkerber
                  'initval':valid_float,
87 1 tkerber
                  'adddipfield':valid_float,
88 1 tkerber
                  'position':valid_float}
89 1 tkerber
    for key in x:
90 1 tkerber
        if key not in valid_keys:
91 1 tkerber
            return False
92 1 tkerber
        else:
93 1 tkerber
            if x[key] is not None:
94 1 tkerber
                if not valid_keys[key](x[key]):
95 1 tkerber
                    return False
96 1 tkerber
    return True
97 1 tkerber
98 1 tkerber
def valid_nc(x):
99 1 tkerber
    #todo check for read/write access?
100 1 tkerber
    return valid_str(x)
101 1 tkerber
102 1 tkerber
def valid_status(x):
103 1 tkerber
    return valid_str(x)
104 1 tkerber
105 1 tkerber
def valid_pseudopotentials(x):
106 1 tkerber
    #todo check that keys are symbols or numbers
107 1 tkerber
    #todo check that psp files exist
108 1 tkerber
109 1 tkerber
    DACAPOPATH = os.environ.get('DACAPOPATH', None)
110 1 tkerber
    if DACAPOPATH is None:
111 1 tkerber
        raise Exception, 'No $DACAPOPATH found. please set it in .cshrc or .bashrc'
112 1 tkerber
113 1 tkerber
    from ase.data import chemical_symbols
114 1 tkerber
    for key in x:
115 1 tkerber
        if valid_str(key):
116 1 tkerber
            if key not in chemical_symbols:
117 1 tkerber
                return False
118 1 tkerber
        elif not (valid_int(key) and key > 0 and key < 112):
119 1 tkerber
            return False
120 1 tkerber
121 1 tkerber
        #now check for existence of psp files
122 1 tkerber
        psp = x[key]
123 1 tkerber
        if not (os.path.exists(psp)
124 1 tkerber
                or os.path.exists(os.path.join(DACAPOPATH, psp))):
125 1 tkerber
            return False
126 1 tkerber
    return True
127 1 tkerber
128 1 tkerber
def valid_extracharge(x):
129 1 tkerber
    return valid_float(x)
130 1 tkerber
131 1 tkerber
def valid_extpot(x):
132 1 tkerber
    grids = get_fftgrid()
133 1 tkerber
    if (x.shape == np.array(grids['soft'])).all():
134 1 tkerber
        return True
135 1 tkerber
    else:
136 1 tkerber
        return False
137 1 tkerber
138 1 tkerber
def valid_ascii_debug(x):
139 1 tkerber
    return (x in ['Off', 'MediumLevel', 'HighLevel'])
140 1 tkerber
141 1 tkerber
def valid_ncoutput(x):
142 1 tkerber
    if x is None:
143 1 tkerber
        return
144 1 tkerber
    valid_keys = ['wf', 'cd', 'efp', 'esp']
145 1 tkerber
146 1 tkerber
    for key in x:
147 1 tkerber
        if key not in valid_keys:
148 1 tkerber
            return False
149 1 tkerber
        else:
150 1 tkerber
            if x[key] not in ['Yes', 'No']:
151 1 tkerber
                return False
152 1 tkerber
    return True
153 1 tkerber
154 1 tkerber
def valid_ados(x):
155 1 tkerber
    if x is None:
156 1 tkerber
        return
157 1 tkerber
    valid_keys = ['energywindow',
158 1 tkerber
                  'energywidth',
159 1 tkerber
                  'npoints',
160 1 tkerber
                  'cutoff']
161 1 tkerber
    for key in x:
162 1 tkerber
        if key not in valid_keys:
163 1 tkerber
            print '%s not in %s' % (key, str(valid_keys))
164 1 tkerber
            return False
165 1 tkerber
        if key == 'energywindow':
166 1 tkerber
            if not len(x['energywindow']) == 2:
167 1 tkerber
                print '%s is bad' % key
168 1 tkerber
                return False
169 1 tkerber
        if key == 'energywidth':
170 1 tkerber
            if not valid_float(x['energywidth']):
171 1 tkerber
                print key, ' is bad'
172 1 tkerber
                return False
173 1 tkerber
        elif key == 'npoints':
174 1 tkerber
            if not valid_int(x['npoints']):
175 1 tkerber
                print key, ' is bad'
176 1 tkerber
                return False
177 1 tkerber
        elif key == 'cutoff':
178 1 tkerber
            if not valid_float(x['cutoff']):
179 1 tkerber
                print key, ' is bad'
180 1 tkerber
                return False
181 1 tkerber
    return True
182 1 tkerber
183 1 tkerber
184 1 tkerber
def valid_decoupling(x):
185 1 tkerber
    if x is None:
186 1 tkerber
        return
187 1 tkerber
    valid_keys = ['ngaussians', 'ecutoff', 'gausswidth']
188 1 tkerber
    for key in x:
189 1 tkerber
        if key not in valid_keys:
190 1 tkerber
            return False
191 1 tkerber
        elif key == 'ngaussians':
192 1 tkerber
            if not valid_int(x[key]):
193 1 tkerber
                print key
194 1 tkerber
                return False
195 1 tkerber
        elif key == 'ecutoff':
196 1 tkerber
            if not valid_int_or_float(x[key]):
197 1 tkerber
                return False
198 1 tkerber
        elif key == 'gausswidth':
199 1 tkerber
            if not valid_float(x[key]):
200 1 tkerber
                print key, x[key]
201 1 tkerber
                return False
202 1 tkerber
    return True
203 1 tkerber
204 1 tkerber
def valid_external_dipole(x):
205 1 tkerber
    if x is None:
206 1 tkerber
        return
207 1 tkerber
    if valid_float(x):
208 1 tkerber
        return True
209 1 tkerber
210 1 tkerber
    valid_keys = ['value', 'position']
211 1 tkerber
212 1 tkerber
    for key in x:
213 1 tkerber
        if key not in valid_keys:
214 1 tkerber
            return False
215 1 tkerber
        if key == 'value':
216 1 tkerber
            if not valid_float(x['value']):
217 1 tkerber
                return False
218 1 tkerber
        elif key == 'position':
219 1 tkerber
            if not valid_float(x['position']):
220 1 tkerber
                return False
221 1 tkerber
    return True
222 1 tkerber
223 1 tkerber
def valid_stay_alive(x):
224 1 tkerber
    return valid_boolean(x)
225 1 tkerber
226 1 tkerber
def valid_fftgrid(x):
227 1 tkerber
    valid_keys = ['soft', 'hard']
228 1 tkerber
    for key in x:
229 1 tkerber
        if key not in valid_keys:
230 1 tkerber
            return False
231 1 tkerber
        if x[key] is None:
232 1 tkerber
            continue
233 1 tkerber
234 1 tkerber
        grid = np.array(x[key])
235 1 tkerber
        if (grid.shape != (3,) and grid.dtype != 'int32'):
236 1 tkerber
            return False
237 1 tkerber
    return True
238 1 tkerber
239 1 tkerber
def valid_convergence(x):
240 1 tkerber
    valid_keys = ['energy',
241 1 tkerber
                  'density',
242 1 tkerber
                  'occupation',
243 1 tkerber
                  'maxsteps',
244 1 tkerber
                  'maxtime']
245 1 tkerber
    for key in x:
246 1 tkerber
        if key not in valid_keys:
247 1 tkerber
            return False
248 1 tkerber
        if x[key] is None:
249 1 tkerber
            continue
250 1 tkerber
        if key == 'energy':
251 1 tkerber
            if not valid_float(x[key]):
252 1 tkerber
                return False
253 1 tkerber
        elif key == 'density':
254 1 tkerber
            if not valid_float(x[key]):
255 1 tkerber
                return False
256 1 tkerber
        elif key == 'occupation':
257 1 tkerber
            if not valid_float(x[key]):
258 1 tkerber
                return False
259 1 tkerber
        elif key == 'maxsteps':
260 1 tkerber
            if not valid_int(x[key]):
261 1 tkerber
                return False
262 1 tkerber
        elif key == 'maxtime':
263 1 tkerber
            if not valid_int(x[key]):
264 1 tkerber
                return False
265 1 tkerber
    return True
266 1 tkerber
267 1 tkerber
def valid_charge_mixing(x):
268 1 tkerber
    valid_keys = ['method',
269 1 tkerber
                  'mixinghistory',
270 1 tkerber
                  'mixingcoeff',
271 1 tkerber
                  'precondition',
272 1 tkerber
                  'updatecharge']
273 1 tkerber
274 1 tkerber
    for key in x:
275 1 tkerber
        if key not in valid_keys:
276 1 tkerber
            return False
277 1 tkerber
        elif key == 'method':
278 1 tkerber
            if x[key] not in ['Pulay']:
279 1 tkerber
                return False
280 1 tkerber
        elif key == 'mixinghistory':
281 1 tkerber
            if not valid_int(x[key]):
282 1 tkerber
                return False
283 1 tkerber
        elif key == 'mixingcoeff':
284 1 tkerber
            if not valid_float(x[key]):
285 1 tkerber
                return False
286 1 tkerber
        elif key == 'precondition':
287 1 tkerber
            if x[key] not in ['Yes', 'No']:
288 1 tkerber
                return False
289 1 tkerber
        elif key == 'updatecharge':
290 1 tkerber
            if x[key] not in ['Yes', 'No']:
291 1 tkerber
                return False
292 1 tkerber
    return True
293 1 tkerber
294 1 tkerber
def valid_electronic_minimization(x):
295 1 tkerber
    valid_keys = ['method', 'diagsperband']
296 1 tkerber
    for key in x:
297 1 tkerber
        if key not in valid_keys:
298 1 tkerber
            return False
299 1 tkerber
        elif key == 'method':
300 1 tkerber
            if x[key] not in ['resmin',
301 1 tkerber
                              'eigsolve',
302 1 tkerber
                              'rmm-diis']:
303 1 tkerber
                return False
304 1 tkerber
        elif key == 'diagsperband':
305 1 tkerber
            if not valid_int(x[key]):
306 1 tkerber
                return False
307 1 tkerber
    return True
308 1 tkerber
309 1 tkerber
def valid_occupationstatistics(x):
310 1 tkerber
    return (x in ['FermiDirac', 'MethfesselPaxton'])
311 1 tkerber
312 1 tkerber
313 1 tkerber
def valid_mdos(x):
314 1 tkerber
    return True
315 1 tkerber
316 1 tkerber
def valid_psp(x):
317 1 tkerber
    valid_keys = ['sym','psp']
318 1 tkerber
    if x is None:
319 1 tkerber
        return True
320 1 tkerber
    for key in x:
321 1 tkerber
        if key not in valid_keys:
322 1 tkerber
            return False
323 1 tkerber
        if not valid_str(x[key]):
324 1 tkerber
            return False
325 1 tkerber
        if key == 'sym':
326 1 tkerber
            from ase.data import chemical_symbols
327 1 tkerber
            if key not in chemical_symbols:
328 1 tkerber
                return False
329 1 tkerber
        if key == 'psp':
330 1 tkerber
331 1 tkerber
            if os.path.exists(x['psp']):
332 1 tkerber
                return True
333 1 tkerber
334 1 tkerber
            if os.path.exists(os.path.join(os.environ['DACAPOPATH'],
335 1 tkerber
                                           x['psp'])):
336 1 tkerber
                return True
337 1 tkerber
            #psp not found
338 1 tkerber
            return False