root / ase / calculators / jacapo / validate.py @ 7
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 |