root / ase / lattice / hexagonal.py @ 19
Historique | Voir | Annoter | Télécharger (3,31 ko)
1 | 1 | tkerber | """Function-like object creating hexagonal lattices.
|
---|---|---|---|
2 | 1 | tkerber |
|
3 | 1 | tkerber | The following lattice creators are defined:
|
4 | 1 | tkerber | Hexagonal
|
5 | 1 | tkerber | HexagonalClosedPacked
|
6 | 1 | tkerber | Graphite
|
7 | 1 | tkerber | """
|
8 | 1 | tkerber | |
9 | 1 | tkerber | from ase.lattice.triclinic import TriclinicFactory |
10 | 1 | tkerber | import numpy as np |
11 | 1 | tkerber | from ase.data import reference_states as _refstate |
12 | 1 | tkerber | |
13 | 1 | tkerber | |
14 | 1 | tkerber | class HexagonalFactory(TriclinicFactory): |
15 | 1 | tkerber | "A factory for creating simple hexagonal lattices."
|
16 | 1 | tkerber | # The name of the crystal structure in ChemicalElements
|
17 | 1 | tkerber | xtal_name = "hexagonal"
|
18 | 1 | tkerber | |
19 | 1 | tkerber | def make_crystal_basis(self): |
20 | 1 | tkerber | "Make the basis matrix for the crystal unit cell and the system unit cell."
|
21 | 1 | tkerber | # First convert the basis specification to a triclinic one
|
22 | 1 | tkerber | if type(self.latticeconstant) == type({}): |
23 | 1 | tkerber | self.latticeconstant['alpha'] = 90 |
24 | 1 | tkerber | self.latticeconstant['beta'] = 90 |
25 | 1 | tkerber | self.latticeconstant['gamma'] = 120 |
26 | 1 | tkerber | self.latticeconstant['b/a'] = 1.0 |
27 | 1 | tkerber | else:
|
28 | 1 | tkerber | if len(self.latticeconstant) == 2: |
29 | 1 | tkerber | a,c = self.latticeconstant
|
30 | 1 | tkerber | self.latticeconstant = (a,a,c,90,90,120) |
31 | 1 | tkerber | else:
|
32 | 1 | tkerber | raise ValueError, "Improper lattice constants for hexagonal crystal." |
33 | 1 | tkerber | TriclinicFactory.make_crystal_basis(self)
|
34 | 1 | tkerber | |
35 | 1 | tkerber | def find_directions(self, directions, miller): |
36 | 1 | tkerber | """Find missing directions and miller indices from the specified ones.
|
37 | 1 | tkerber |
|
38 | 1 | tkerber | Also handles the conversion of hexagonal-style 4-index notation to
|
39 | 1 | tkerber | the normal 3-index notation.
|
40 | 1 | tkerber | """
|
41 | 1 | tkerber | directions = list(directions)
|
42 | 1 | tkerber | miller = list(miller)
|
43 | 1 | tkerber | for obj in (directions,miller): |
44 | 1 | tkerber | for i in range(3): |
45 | 1 | tkerber | if obj[i] is not None: |
46 | 1 | tkerber | (a,b,c,d) = obj[i] |
47 | 1 | tkerber | if a + b + c != 0: |
48 | 1 | tkerber | raise ValueError( |
49 | 1 | tkerber | ("(%d,%d,%d,%d) is not a valid hexagonal Miller " +
|
50 | 1 | tkerber | "index, as the sum of the first three numbers " +
|
51 | 1 | tkerber | "should be zero.") % (a,b,c,d))
|
52 | 1 | tkerber | x = 4*a + 2*b |
53 | 1 | tkerber | y = 2*a + 4*b |
54 | 1 | tkerber | z = 3*d
|
55 | 1 | tkerber | obj[i] = (x,y,z) |
56 | 1 | tkerber | TriclinicFactory.find_directions(self, directions, miller)
|
57 | 1 | tkerber | |
58 | 1 | tkerber | def print_directions_and_miller(self, txt=""): |
59 | 1 | tkerber | "Print direction vectors and Miller indices."
|
60 | 1 | tkerber | print "Direction vectors of unit cell%s:" % (txt,) |
61 | 1 | tkerber | for i in (0,1,2): |
62 | 1 | tkerber | self.print_four_vector("[]", self.directions[i]) |
63 | 1 | tkerber | print "Miller indices of surfaces%s:" % (txt,) |
64 | 1 | tkerber | for i in (0,1,2): |
65 | 1 | tkerber | self.print_four_vector("()", self.miller[i]) |
66 | 1 | tkerber | |
67 | 1 | tkerber | def print_four_vector(self, bracket, numbers): |
68 | 1 | tkerber | bra, ket = bracket |
69 | 1 | tkerber | (x,y,z) = numbers |
70 | 1 | tkerber | a = 2*x - y
|
71 | 1 | tkerber | b = -x + 2*y
|
72 | 1 | tkerber | c = -x -y |
73 | 1 | tkerber | d = 2*z
|
74 | 1 | tkerber | print " %s%d, %d, %d%s ~ %s%d, %d, %d, %d%s" % \ |
75 | 1 | tkerber | (bra,x,y,z,ket, bra,a,b,c,d,ket) |
76 | 1 | tkerber | |
77 | 1 | tkerber | |
78 | 1 | tkerber | Hexagonal = HexagonalFactory() |
79 | 1 | tkerber | |
80 | 1 | tkerber | class HexagonalClosedPackedFactory(HexagonalFactory): |
81 | 1 | tkerber | "A factory for creating HCP lattices."
|
82 | 1 | tkerber | xtal_name = "hcp"
|
83 | 1 | tkerber | bravais_basis = [[0,0,0], [1.0/3.0, 2.0/3.0, 0.5]] |
84 | 1 | tkerber | |
85 | 1 | tkerber | HexagonalClosedPacked = HexagonalClosedPackedFactory() |
86 | 1 | tkerber | |
87 | 1 | tkerber | class GraphiteFactory(HexagonalFactory): |
88 | 1 | tkerber | "A factory for creating graphite lattices."
|
89 | 1 | tkerber | xtal_name = "graphite"
|
90 | 1 | tkerber | bravais_basis = [[0,0,0], [1.0/3.0, 2.0/3.0, 0], [1.0/3.0,2.0/3.0,0.5], [2.0/3.0,1.0/3.0,0.5]] |
91 | 1 | tkerber | |
92 | 1 | tkerber | Graphite = GraphiteFactory() |