Statistiques
| Révision :

root / ase / lattice / triclinic.py

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

1 1 tkerber
"""Function-like object creating triclinic lattices.
2 1 tkerber

3 1 tkerber
The following lattice creator is defined:
4 1 tkerber
    Triclinic
5 1 tkerber
"""
6 1 tkerber
7 1 tkerber
from ase.lattice.bravais import Bravais
8 1 tkerber
import numpy as np
9 1 tkerber
from ase.data import reference_states as _refstate
10 1 tkerber
11 1 tkerber
class TriclinicFactory(Bravais):
12 1 tkerber
    "A factory for creating triclinic lattices."
13 1 tkerber
14 1 tkerber
    # The name of the crystal structure in ChemicalElements
15 1 tkerber
    xtal_name = "triclinic"
16 1 tkerber
17 1 tkerber
    # The natural basis vectors of the crystal structure
18 1 tkerber
    int_basis = np.array([[1, 0, 0],
19 1 tkerber
                          [0, 1, 0],
20 1 tkerber
                          [0, 0, 1]])
21 1 tkerber
    basis_factor = 1.0
22 1 tkerber
23 1 tkerber
    # Converts the natural basis back to the crystallographic basis
24 1 tkerber
    inverse_basis = np.array([[1, 0, 0],
25 1 tkerber
                              [0, 1, 0],
26 1 tkerber
                              [0, 0, 1]])
27 1 tkerber
    inverse_basis_factor = 1.0
28 1 tkerber
29 1 tkerber
    def get_lattice_constant(self):
30 1 tkerber
        "Get the lattice constant of an element with triclinic crystal structure."
31 1 tkerber
        if _refstate[self.atomicnumber]['symmetry'].lower() != self.xtal_name:
32 1 tkerber
            raise ValueError, (("Cannot guess the %s lattice constant of"
33 1 tkerber
                                + " an element with crystal structure %s.")
34 1 tkerber
                               % (self.xtal_name,
35 1 tkerber
                                  _refstate[self.atomicnumber]['symmetry']))
36 1 tkerber
        return _refstate[self.atomicnumber].copy()
37 1 tkerber
38 1 tkerber
39 1 tkerber
    def make_crystal_basis(self):
40 1 tkerber
        "Make the basis matrix for the crystal unit cell and the system unit cell."
41 1 tkerber
        lattice = self.latticeconstant
42 1 tkerber
        if type(lattice) == type({}):
43 1 tkerber
            a = lattice['a']
44 1 tkerber
            try:
45 1 tkerber
                b = lattice['b']
46 1 tkerber
            except KeyError:
47 1 tkerber
                b = a * lattice['b/a']
48 1 tkerber
            try:
49 1 tkerber
                c = lattice['c']
50 1 tkerber
            except KeyError:
51 1 tkerber
                c = a * lattice['c/a']
52 1 tkerber
            alpha = lattice['alpha']
53 1 tkerber
            beta = lattice['beta']
54 1 tkerber
            gamma = lattice['gamma']
55 1 tkerber
        else:
56 1 tkerber
            if len(lattice) == 6:
57 1 tkerber
                (a,b,c,alpha,beta,gamma) = lattice
58 1 tkerber
            else:
59 1 tkerber
                raise ValueError, "Improper lattice constants for triclinic crystal."
60 1 tkerber
61 1 tkerber
        degree = np.pi / 180.0
62 1 tkerber
        cosa = np.cos(alpha*degree)
63 1 tkerber
        cosb = np.cos(beta*degree)
64 1 tkerber
        sinb = np.sin(beta*degree)
65 1 tkerber
        cosg = np.cos(gamma*degree)
66 1 tkerber
        sing = np.sin(gamma*degree)
67 1 tkerber
        lattice = np.array([[a,0,0],
68 1 tkerber
                            [b*cosg, b*sing,0],
69 1 tkerber
                            [c*cosb, c*(cosa-cosb*cosg)/sing,
70 1 tkerber
                             c*np.sqrt(sinb**2 - ((cosa-cosb*cosg)/sing)**2)]])
71 1 tkerber
        self.latticeconstant = lattice
72 1 tkerber
        self.miller_basis = lattice
73 1 tkerber
        self.crystal_basis = (self.basis_factor *
74 1 tkerber
                              np.dot(self.int_basis, lattice))
75 1 tkerber
        self.basis = np.dot(self.directions, self.crystal_basis)
76 1 tkerber
        assert abs(np.dot(lattice[0],lattice[1]) - a*b*cosg) < 1e-5
77 1 tkerber
        assert abs(np.dot(lattice[0],lattice[2]) - a*c*cosb) < 1e-5
78 1 tkerber
        assert abs(np.dot(lattice[1],lattice[2]) - b*c*cosa) < 1e-5
79 1 tkerber
        assert abs(np.dot(lattice[0],lattice[0]) - a*a) < 1e-5
80 1 tkerber
        assert abs(np.dot(lattice[1],lattice[1]) - b*b) < 1e-5
81 1 tkerber
        assert abs(np.dot(lattice[2],lattice[2]) - c*c) < 1e-5
82 1 tkerber
83 1 tkerber
Triclinic = TriclinicFactory()