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