root / ase / optimize / test / N2Cu_relax.py @ 4
Historique | Voir | Annoter | Télécharger (4,19 ko)
| 1 |
from ase import Atoms, Atom |
|---|---|
| 2 |
from ase.calculators.emt import EMT |
| 3 |
from ase.constraints import FixAtoms |
| 4 |
from ase.optimize.test import run_test |
| 5 |
|
| 6 |
name = 'N2Cu'
|
| 7 |
|
| 8 |
def get_atoms_surf(): |
| 9 |
a = 2.70
|
| 10 |
c = 1.59 * a
|
| 11 |
h = 1.85
|
| 12 |
d = 1.10
|
| 13 |
|
| 14 |
slab = Atoms('2Cu', [(0., 0., 0.), (1/3., 1/3., -0.5*c)], |
| 15 |
tags=(0, 1), |
| 16 |
pbc=(1, 1, 0)) |
| 17 |
slab.set_cell([(a, 0, 0), |
| 18 |
(a / 2, 3**0.5 * a / 2, 0), |
| 19 |
(0, 0, 1)]) |
| 20 |
slab = slab.repeat((4, 4, 1)) |
| 21 |
mask = [a.tag == 1 for a in slab] |
| 22 |
slab.set_constraint(FixAtoms(mask=mask)) |
| 23 |
return slab
|
| 24 |
|
| 25 |
def get_atoms_adsorbate(): |
| 26 |
# We need the relaxed slab here!
|
| 27 |
slab = Atoms([ |
| 28 |
Atom('Cu', [ -1.028468159509163, -0.432387156877267, -0.202086055768265]), |
| 29 |
Atom('Cu', [ 0.333333333333333, 0.333333333333333, -2.146500000000000]), |
| 30 |
Atom('Cu', [ 1.671531840490805, -0.432387156877287, -0.202086055768242]), |
| 31 |
Atom('Cu', [ 3.033333333333334, 0.333333333333333, -2.146500000000000]), |
| 32 |
Atom('Cu', [ 4.371531840490810, -0.432387156877236, -0.202086055768261]), |
| 33 |
Atom('Cu', [ 5.733333333333333, 0.333333333333333, -2.146500000000000]), |
| 34 |
Atom('Cu', [ 7.071531840490944, -0.432387156877258, -0.202086055768294]), |
| 35 |
Atom('Cu', [ 8.433333333333335, 0.333333333333333, -2.146500000000000]), |
| 36 |
Atom('Cu', [ 0.321531840490810, 1.905881433340708, -0.202086055768213]), |
| 37 |
Atom('Cu', [ 1.683333333333333, 2.671601923551318, -2.146500000000000]), |
| 38 |
Atom('Cu', [ 3.021531840490771, 1.905881433340728, -0.202086055768250]), |
| 39 |
Atom('Cu', [ 4.383333333333334, 2.671601923551318, -2.146500000000000]), |
| 40 |
Atom('Cu', [ 5.721531840490857, 1.905881433340735, -0.202086055768267]), |
| 41 |
Atom('Cu', [ 7.083333333333333, 2.671601923551318, -2.146500000000000]), |
| 42 |
Atom('Cu', [ 8.421531840490820, 1.905881433340739, -0.202086055768265]), |
| 43 |
Atom('Cu', [ 9.783333333333335, 2.671601923551318, -2.146500000000000]), |
| 44 |
Atom('Cu', [ 1.671531840490742, 4.244150023558601, -0.202086055768165]), |
| 45 |
Atom('Cu', [ 3.033333333333334, 5.009870513769302, -2.146500000000000]), |
| 46 |
Atom('Cu', [ 4.371531840490840, 4.244150023558694, -0.202086055768265]), |
| 47 |
Atom('Cu', [ 5.733333333333333, 5.009870513769302, -2.146500000000000]), |
| 48 |
Atom('Cu', [ 7.071531840490880, 4.244150023558786, -0.202086055768352]), |
| 49 |
Atom('Cu', [ 8.433333333333335, 5.009870513769302, -2.146500000000000]), |
| 50 |
Atom('Cu', [ 9.771531840491031, 4.244150023558828, -0.202086055768371]), |
| 51 |
Atom('Cu', [ 11.133333333333335, 5.009870513769302, -2.146500000000000]), |
| 52 |
Atom('Cu', [ 3.021531840490714, 6.582418613776583, -0.202086055768197]), |
| 53 |
Atom('Cu', [ 4.383333333333334, 7.348139103987287, -2.146500000000000]), |
| 54 |
Atom('Cu', [ 5.721531840490814, 6.582418613776629, -0.202086055768203]), |
| 55 |
Atom('Cu', [ 7.083333333333333, 7.348139103987287, -2.146500000000000]), |
| 56 |
Atom('Cu', [ 8.421531840490985, 6.582418613776876, -0.202086055768357]), |
| 57 |
Atom('Cu', [ 9.783333333333335, 7.348139103987287, -2.146500000000000]), |
| 58 |
Atom('Cu', [ 11.121531840490929, 6.582418613776676, -0.202086055768221]), |
| 59 |
Atom('Cu', [ 12.483333333333334, 7.348139103987287, -2.146500000000000]), |
| 60 |
]) |
| 61 |
mask = [a.position[2] < -1 for a in slab] |
| 62 |
slab.set_constraint(FixAtoms(mask=mask)) |
| 63 |
|
| 64 |
a = 2.70
|
| 65 |
c = 1.59 * a
|
| 66 |
h = 1.85
|
| 67 |
d = 1.10
|
| 68 |
x = slab.positions[0, 2] / (c / 2) * 100 |
| 69 |
|
| 70 |
molecule = Atoms('2N', positions=[(0., 0., h), |
| 71 |
(0., 0., h + d)]) |
| 72 |
molecule.set_calculator(EMT()) |
| 73 |
slab.extend(molecule) |
| 74 |
return slab
|
| 75 |
|
| 76 |
def get_calculator(): |
| 77 |
return EMT()
|
| 78 |
|
| 79 |
run_test(get_atoms_surf, get_calculator, name + '-surf', steps=200) |
| 80 |
run_test(get_atoms_adsorbate, get_calculator, name + '-N2', steps=200) |