Statistiques
| Révision :

root / ase / lattice / orthorhombic.py @ 1

Historique | Voir | Annoter | Télécharger (5,3 ko)

1 1 tkerber
"""Function-like objects creating orthorhombic lattices.
2 1 tkerber

3 1 tkerber
The following lattice creators are defined:
4 1 tkerber
    SimleOrthorhombic
5 1 tkerber
    BaseCenteredOrthorhombic
6 1 tkerber
    BodyCenteredOrthorhombic
7 1 tkerber
    FaceCenteredOrthorhombic
8 1 tkerber
"""
9 1 tkerber
10 1 tkerber
from ase.lattice.bravais import Bravais
11 1 tkerber
import numpy as np
12 1 tkerber
from ase.data import reference_states as _refstate
13 1 tkerber
14 1 tkerber
15 1 tkerber
class SimpleOrthorhombicFactory(Bravais):
16 1 tkerber
    "A factory for creating simple orthorhombic lattices."
17 1 tkerber
18 1 tkerber
    # The name of the crystal structure in ChemicalElements
19 1 tkerber
    xtal_name = "orthorhombic"
20 1 tkerber
21 1 tkerber
    # The natural basis vectors of the crystal structure
22 1 tkerber
    int_basis = np.array([[1, 0, 0],
23 1 tkerber
                          [0, 1, 0],
24 1 tkerber
                          [0, 0, 1]])
25 1 tkerber
    basis_factor = 1.0
26 1 tkerber
27 1 tkerber
    # Converts the natural basis back to the crystallographic basis
28 1 tkerber
    inverse_basis = np.array([[1, 0, 0],
29 1 tkerber
                              [0, 1, 0],
30 1 tkerber
                              [0, 0, 1]])
31 1 tkerber
    inverse_basis_factor = 1.0
32 1 tkerber
33 1 tkerber
    def get_lattice_constant(self):
34 1 tkerber
        "Get the lattice constant of an element with orhtorhombic crystal structure."
35 1 tkerber
        if _refstate[self.atomicnumber]['symmetry'].lower() != self.xtal_name:
36 1 tkerber
            raise ValueError, (("Cannot guess the %s lattice constant of"
37 1 tkerber
                                + " an element with crystal structure %s.")
38 1 tkerber
                               % (self.xtal_name,
39 1 tkerber
                                  _refstate[self.atomicnumber]['symmetry']))
40 1 tkerber
        return _refstate[self.atomicnumber].copy()
41 1 tkerber
42 1 tkerber
    def make_crystal_basis(self):
43 1 tkerber
        "Make the basis matrix for the crystal unit cell and the system unit cell."
44 1 tkerber
        lattice = self.latticeconstant
45 1 tkerber
        if type(lattice) == type({}):
46 1 tkerber
            a = lattice['a']
47 1 tkerber
            try:
48 1 tkerber
                b = lattice['b']
49 1 tkerber
            except KeyError:
50 1 tkerber
                b = a * lattice['b/a']
51 1 tkerber
            try:
52 1 tkerber
                c = lattice['c']
53 1 tkerber
            except KeyError:
54 1 tkerber
                c = a * lattice['c/a']
55 1 tkerber
        else:
56 1 tkerber
            if len(lattice) == 3:
57 1 tkerber
                (a,b,c) = lattice
58 1 tkerber
            else:
59 1 tkerber
                raise ValueError, "Improper lattice constants for orthorhombic crystal."
60 1 tkerber
61 1 tkerber
        lattice = np.array([[a,0,0],[0,b,0],[0,0,c]])
62 1 tkerber
        self.latticeconstant = lattice
63 1 tkerber
        self.miller_basis = lattice
64 1 tkerber
        self.crystal_basis = (self.basis_factor *
65 1 tkerber
                              np.dot(self.int_basis, lattice))
66 1 tkerber
        self.basis = np.dot(self.directions, self.crystal_basis)
67 1 tkerber
        self.check_basis_volume()
68 1 tkerber
69 1 tkerber
    def check_basis_volume(self):
70 1 tkerber
        "Check the volume of the unit cell."
71 1 tkerber
        vol1 = abs(np.linalg.det(self.basis))
72 1 tkerber
        vol2 = self.calc_num_atoms() * np.linalg.det(self.latticeconstant)
73 1 tkerber
        if self.bravais_basis is not None:
74 1 tkerber
            vol2 /= len(self.bravais_basis)
75 1 tkerber
        if abs(vol1-vol2) > 1e-5:
76 1 tkerber
            print "WARNING: Got volume %f, expected %f" % (vol1, vol2)
77 1 tkerber
78 1 tkerber
SimpleOrthorhombic = SimpleOrthorhombicFactory()
79 1 tkerber
80 1 tkerber
class BaseCenteredOrthorhombicFactory(SimpleOrthorhombicFactory):
81 1 tkerber
    "A factory for creating base-centered orthorhombic lattices."
82 1 tkerber
83 1 tkerber
    # The natural basis vectors of the crystal structure
84 1 tkerber
    int_basis = np.array([[1, -1, 0],
85 1 tkerber
                          [1, 1, 0],
86 1 tkerber
                          [0, 0, 2]])
87 1 tkerber
    basis_factor = 0.5
88 1 tkerber
89 1 tkerber
    # Converts the natural basis back to the crystallographic basis
90 1 tkerber
    inverse_basis = np.array([[1, 1, 0],
91 1 tkerber
                              [-1, 1, 0],
92 1 tkerber
                              [0, 0, 1]])
93 1 tkerber
    inverse_basis_factor = 1.0
94 1 tkerber
95 1 tkerber
    def check_basis_volume(self):
96 1 tkerber
        "Check the volume of the unit cell."
97 1 tkerber
        vol1 = abs(np.linalg.det(self.basis))
98 1 tkerber
        vol2 = self.calc_num_atoms() * np.linalg.det(self.latticeconstant) / 2.0
99 1 tkerber
        if abs(vol1-vol2) > 1e-5:
100 1 tkerber
            print "WARNING: Got volume %f, expected %f" % (vol1, vol2)
101 1 tkerber
102 1 tkerber
BaseCenteredOrthorhombic = BaseCenteredOrthorhombicFactory()
103 1 tkerber
104 1 tkerber
class BodyCenteredOrthorhombicFactory(SimpleOrthorhombicFactory):
105 1 tkerber
    "A factory for creating body-centered orthorhombic lattices."
106 1 tkerber
107 1 tkerber
    int_basis = np.array([[-1, 1, 1],
108 1 tkerber
                          [1, -1, 1],
109 1 tkerber
                          [1, 1, -1]])
110 1 tkerber
    basis_factor = 0.5
111 1 tkerber
    inverse_basis = np.array([[0, 1, 1],
112 1 tkerber
                              [1, 0, 1],
113 1 tkerber
                              [1, 1, 0]])
114 1 tkerber
    inverse_basis_factor = 1.0
115 1 tkerber
116 1 tkerber
    def check_basis_volume(self):
117 1 tkerber
        "Check the volume of the unit cell."
118 1 tkerber
        vol1 = abs(np.linalg.det(self.basis))
119 1 tkerber
        vol2 = self.calc_num_atoms() * np.linalg.det(self.latticeconstant) / 2.0
120 1 tkerber
        if abs(vol1-vol2) > 1e-5:
121 1 tkerber
            print "WARNING: Got volume %f, expected %f" % (vol1, vol2)
122 1 tkerber
123 1 tkerber
BodyCenteredOrthorhombic = BodyCenteredOrthorhombicFactory()
124 1 tkerber
class FaceCenteredOrthorhombicFactory(SimpleOrthorhombicFactory):
125 1 tkerber
    "A factory for creating face-centered orthorhombic lattices."
126 1 tkerber
127 1 tkerber
    int_basis = np.array([[0, 1, 1],
128 1 tkerber
                          [1, 0, 1],
129 1 tkerber
                          [1, 1, 0]])
130 1 tkerber
    basis_factor = 0.5
131 1 tkerber
    inverse_basis = np.array([[-1, 1, 1],
132 1 tkerber
                              [1, -1, 1],
133 1 tkerber
                              [1, 1, -1]])
134 1 tkerber
    inverse_basis_factor = 1.0
135 1 tkerber
136 1 tkerber
    def check_basis_volume(self):
137 1 tkerber
        "Check the volume of the unit cell."
138 1 tkerber
        vol1 = abs(np.linalg.det(self.basis))
139 1 tkerber
        vol2 = self.calc_num_atoms() * np.linalg.det(self.latticeconstant) / 4.0
140 1 tkerber
        if abs(vol1-vol2) > 1e-5:
141 1 tkerber
            print "WARNING: Got volume %f, expected %f" % (vol1, vol2)
142 1 tkerber
143 1 tkerber
FaceCenteredOrthorhombic = FaceCenteredOrthorhombicFactory()