Statistiques
| Révision :

root / ase / lattice / hexagonal.py @ 20

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()