Statistiques
| Révision :

root / ase / test / vasp_Al_volrelax.py @ 1

Historique | Voir | Annoter | Télécharger (2,23 ko)

1 1 tkerber
#!/usr/bin/python
2 1 tkerber
3 1 tkerber
"""
4 1 tkerber
Run VASP tests to ensure that relaxation with the VASP calculator works.
5 1 tkerber
This is conditional on the existence of the VASP_COMMAND or VASP_SCRIPT
6 1 tkerber
environment variables.
7 1 tkerber

8 1 tkerber
"""
9 1 tkerber
10 1 tkerber
from ase.test import NotAvailable
11 1 tkerber
import os
12 1 tkerber
13 1 tkerber
vcmd = os.getenv('VASP_COMMAND')
14 1 tkerber
vscr = os.getenv('VASP_SCRIPT')
15 1 tkerber
if vcmd == None and vscr == None:
16 1 tkerber
    raise NotAvailable('Neither VASP_COMMAND nor VASP_SCRIPT defined')
17 1 tkerber
18 1 tkerber
import numpy as np
19 1 tkerber
from ase import io
20 1 tkerber
from ase.optimize import QuasiNewton
21 1 tkerber
from ase.constraints import StrainFilter
22 1 tkerber
from ase.structure import bulk
23 1 tkerber
from ase.calculators.vasp import Vasp
24 1 tkerber
25 1 tkerber
# -- Perform Volume relaxation within Vasp
26 1 tkerber
def vasp_vol_relax():
27 1 tkerber
    Al = bulk('Al', 'fcc', a=4.5, cubic=True)
28 1 tkerber
    calc = Vasp(xc='LDA', isif=7, nsw=5,
29 1 tkerber
                ibrion=1, ediffg=-1e-3, lwave=False, lcharg=False)
30 1 tkerber
    calc.calculate(Al)
31 1 tkerber
32 1 tkerber
    # Explicitly parse atomic position output file from Vasp
33 1 tkerber
    CONTCAR_Al = io.read('CONTCAR', format='vasp')
34 1 tkerber
35 1 tkerber
    print 'Stress after relaxation:\n', calc.read_stress()
36 1 tkerber
37 1 tkerber
    print 'Al cell post relaxation from calc:\n', calc.get_atoms().get_cell()
38 1 tkerber
    print 'Al cell post relaxation from atoms:\n', Al.get_cell()
39 1 tkerber
    print 'Al cell post relaxation from CONTCAR:\n', CONTCAR_Al.get_cell()
40 1 tkerber
41 1 tkerber
    # All the cells should be the same.
42 1 tkerber
    assert (calc.get_atoms().get_cell() == CONTCAR_Al.get_cell()).all()
43 1 tkerber
    assert (Al.get_cell() == CONTCAR_Al.get_cell()).all()
44 1 tkerber
45 1 tkerber
    return Al
46 1 tkerber
47 1 tkerber
# -- Perform Volume relaxation using ASE with Vasp as force/stress calculator
48 1 tkerber
def ase_vol_relax():
49 1 tkerber
    Al = bulk('Al', 'fcc', a=4.5, cubic=True)
50 1 tkerber
    calc = Vasp(xc='LDA')
51 1 tkerber
    Al.set_calculator(calc)
52 1 tkerber
53 1 tkerber
    from ase.constraints import StrainFilter
54 1 tkerber
    sf = StrainFilter(Al)
55 1 tkerber
    qn = QuasiNewton(sf, logfile='relaxation.log')
56 1 tkerber
    qn.run(fmax=0.1, steps=5)
57 1 tkerber
58 1 tkerber
    print 'Stress:\n', calc.read_stress()
59 1 tkerber
    print 'Al post ASE volume relaxation\n', calc.get_atoms().get_cell()
60 1 tkerber
61 1 tkerber
    return Al
62 1 tkerber
63 1 tkerber
# Test function for comparing two cells
64 1 tkerber
def cells_almost_equal(cellA, cellB, tol=0.01):
65 1 tkerber
    return  (np.abs(cellA - cellB) < tol).all()
66 1 tkerber
67 1 tkerber
# Correct LDA relaxed cell
68 1 tkerber
a_rel = 4.18
69 1 tkerber
LDA_cell = np.diag([a_rel, a_rel, a_rel])
70 1 tkerber
71 1 tkerber
Al_vasp = vasp_vol_relax()
72 1 tkerber
Al_ase = ase_vol_relax()
73 1 tkerber
74 1 tkerber
assert cells_almost_equal(LDA_cell, Al_vasp.get_cell())
75 1 tkerber
assert cells_almost_equal(LDA_cell, Al_ase.get_cell())