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