Révision 10 ase/calculators/vasp.py
vasp.py (revision 10) | ||
---|---|---|
151 | 151 |
class Vasp(Calculator): |
152 | 152 |
def __init__(self, restart=None, output_template='vasp', track_output=False, write_input = True, |
153 | 153 |
**kwargs): |
154 |
self.bool_write_input = write_input
|
|
154 |
self.write_input = write_input |
|
155 | 155 |
self.name = 'Vasp' |
156 | 156 |
self.float_params = {} |
157 | 157 |
self.exp_params = {} |
... | ... | |
248 | 248 |
# Determine the number of atoms of each atomic species |
249 | 249 |
# sorted after atomic species |
250 | 250 |
special_setups = [] |
251 |
symbols = {} |
|
252 | 251 |
if self.input_params['setups']: |
253 | 252 |
for m in self.input_params['setups']: |
254 | 253 |
try : |
... | ... | |
259 | 258 |
continue |
260 | 259 |
#print 'special_setups' , special_setups |
261 | 260 |
|
261 |
#symbols = {} |
|
262 |
#for m,atom in enumerate(atoms): |
|
263 |
# symbol = atom.get_symbol() |
|
264 |
# if m in special_setups: |
|
265 |
# pass |
|
266 |
# else: |
|
267 |
# if not symbols.has_key(symbol): |
|
268 |
# symbols[symbol] = 1 |
|
269 |
# else: |
|
270 |
# symbols[symbol] += 1 |
|
271 |
|
|
272 |
symbols = [] |
|
262 | 273 |
for m,atom in enumerate(atoms): |
263 | 274 |
symbol = atom.get_symbol() |
264 | 275 |
if m in special_setups: |
265 | 276 |
pass |
266 | 277 |
else: |
267 |
if not symbols.has_key(symbol): |
|
268 |
symbols[symbol] = 1 |
|
278 |
ind = 0 |
|
279 |
bfound = False |
|
280 |
for symbolX, iatom in symbols: |
|
281 |
if symbol == symbolX: |
|
282 |
bfound = True |
|
283 |
break |
|
284 |
ind += 1 |
|
285 |
if bfound: |
|
286 |
symbolX, iatom = symbols[ind] |
|
287 |
symbols[ind] = symbolX, iatom+1 |
|
269 | 288 |
else: |
270 |
symbols[symbol] += 1
|
|
289 |
symbols.append((symbol, 1))
|
|
271 | 290 |
|
272 | 291 |
# Build the sorting list |
273 | 292 |
self.sort = [] |
274 | 293 |
self.sort.extend(special_setups) |
275 | 294 |
|
276 |
for symbol in symbols: |
|
295 |
for symbol, iatom in symbols:
|
|
277 | 296 |
for m,atom in enumerate(atoms): |
278 | 297 |
if m in special_setups: |
279 | 298 |
pass |
... | ... | |
284 | 303 |
for n in range(len(self.resort)): |
285 | 304 |
self.resort[self.sort[n]] = n |
286 | 305 |
self.atoms_sorted = atoms[self.sort] |
287 |
|
|
306 |
|
|
288 | 307 |
# Check if the necessary POTCAR files exists and |
289 | 308 |
# create a list of their paths. |
290 | 309 |
self.symbol_count = [] |
291 | 310 |
for m in special_setups: |
292 |
self.symbol_count.append([atomtypes[m],1]) |
|
311 |
for symbol, iatom in symbols: |
|
312 |
if symbol == m: |
|
313 |
self.symbol_count.append([atomtypes[m],1]) |
|
314 |
#self.symbol_count.append([atomtypes[m],1]) |
|
293 | 315 |
for m in symbols: |
294 |
self.symbol_count.append([m,symbols[m]]) |
|
295 |
#print 'self.symbol_count',self.symbol_count |
|
316 |
for symbol, iatom in symbols: |
|
317 |
if symbol == m: |
|
318 |
self.symbol_count.append([m,iatom]) |
|
319 |
#self.symbol_count.append([m,symbols[m]]) |
|
296 | 320 |
sys.stdout.flush() |
297 |
xc = '/' |
|
298 |
#print 'p[xc]',p['xc'] |
|
299 |
if p['xc'] == 'PW91': |
|
300 |
xc = '_gga/' |
|
301 |
elif p['xc'] == 'PBE': |
|
302 |
xc = '_pbe/' |
|
303 |
if 'VASP_PP_PATH' in os.environ: |
|
304 |
pppaths = os.environ['VASP_PP_PATH'].split(':') |
|
305 |
else: |
|
306 |
pppaths = [] |
|
307 |
self.ppp_list = [] |
|
308 |
# Setting the pseudopotentials, first special setups and |
|
309 |
# then according to symbols |
|
310 |
for m in special_setups: |
|
311 |
name = 'potpaw'+xc.upper() + p['setups'][str(m)] + '/POTCAR' |
|
312 |
found = False |
|
313 |
for path in pppaths: |
|
314 |
filename = join(path, name) |
|
315 |
#print 'filename', filename |
|
316 |
if isfile(filename) or islink(filename): |
|
317 |
found = True |
|
318 |
self.ppp_list.append(filename) |
|
319 |
break |
|
320 |
elif isfile(filename + '.Z') or islink(filename + '.Z'): |
|
321 |
found = True |
|
322 |
self.ppp_list.append(filename+'.Z') |
|
323 |
break |
|
324 |
if not found: |
|
325 |
raise RuntimeError('No pseudopotential for %s!' % symbol) |
|
326 |
#print 'symbols', symbols |
|
327 |
for symbol in symbols: |
|
328 |
try: |
|
329 |
name = 'potpaw'+xc.upper()+symbol + p['setups'][symbol] |
|
330 |
except (TypeError, KeyError): |
|
331 |
name = 'potpaw' + xc.upper() + symbol |
|
332 |
name += '/POTCAR' |
|
333 |
found = False |
|
334 |
for path in pppaths: |
|
335 |
filename = join(path, name) |
|
336 |
#print 'filename', filename |
|
337 |
if isfile(filename) or islink(filename): |
|
338 |
found = True |
|
339 |
self.ppp_list.append(filename) |
|
340 |
break |
|
341 |
elif isfile(filename + '.Z') or islink(filename + '.Z'): |
|
342 |
found = True |
|
343 |
self.ppp_list.append(filename+'.Z') |
|
344 |
break |
|
345 |
if not found: |
|
346 |
raise RuntimeError('No pseudopotential for %s!' % symbol) |
|
321 |
if self.write_input: |
|
322 |
xc = '/' |
|
323 |
#print 'p[xc]',p['xc'] |
|
324 |
if p['xc'] == 'PW91': |
|
325 |
xc = '_gga/' |
|
326 |
elif p['xc'] == 'PBE': |
|
327 |
xc = '_pbe/' |
|
328 |
if 'VASP_PP_PATH' in os.environ: |
|
329 |
pppaths = os.environ['VASP_PP_PATH'].split(':') |
|
330 |
else: |
|
331 |
pppaths = [] |
|
332 |
self.ppp_list = [] |
|
333 |
# Setting the pseudopotentials, first special setups and |
|
334 |
# then according to symbols |
|
335 |
for m in special_setups: |
|
336 |
name = 'potpaw'+xc.upper() + p['setups'][str(m)] + '/POTCAR' |
|
337 |
found = False |
|
338 |
for path in pppaths: |
|
339 |
filename = join(path, name) |
|
340 |
#print 'filename', filename |
|
341 |
if isfile(filename) or islink(filename): |
|
342 |
found = True |
|
343 |
self.ppp_list.append(filename) |
|
344 |
break |
|
345 |
elif isfile(filename + '.Z') or islink(filename + '.Z'): |
|
346 |
found = True |
|
347 |
self.ppp_list.append(filename+'.Z') |
|
348 |
break |
|
349 |
if not found: |
|
350 |
raise RuntimeError('No pseudopotential for %s!' % symbol) |
|
351 |
#print 'symbols', symbols |
|
352 |
for symbol in symbols: |
|
353 |
try: |
|
354 |
name = 'potpaw'+xc.upper()+symbol + p['setups'][symbol] |
|
355 |
except (TypeError, KeyError): |
|
356 |
name = 'potpaw' + xc.upper() + symbol |
|
357 |
name += '/POTCAR' |
|
358 |
found = False |
|
359 |
for path in pppaths: |
|
360 |
filename = join(path, name) |
|
361 |
#print 'filename', filename |
|
362 |
if isfile(filename) or islink(filename): |
|
363 |
found = True |
|
364 |
self.ppp_list.append(filename) |
|
365 |
break |
|
366 |
elif isfile(filename + '.Z') or islink(filename + '.Z'): |
|
367 |
found = True |
|
368 |
self.ppp_list.append(filename+'.Z') |
|
369 |
break |
|
370 |
if not found: |
|
371 |
raise RuntimeError('No pseudopotential for %s!' % symbol) |
|
347 | 372 |
self.converged = None |
348 | 373 |
self.setups_changed = None |
349 | 374 |
|
... | ... | |
359 | 384 |
from ase.io.vasp import write_vasp |
360 | 385 |
self.initialize(atoms) |
361 | 386 |
write_vasp('POSCAR', self.atoms_sorted, symbol_count = self.symbol_count) |
362 |
if self.bool_write_input:
|
|
387 |
if self.write_input: |
|
363 | 388 |
self.write_incar(atoms) |
364 | 389 |
self.write_potcar() |
365 | 390 |
self.write_kpoints() |
Formats disponibles : Unified diff