import numpy as _np def Bravais_to_Miller(*,uvtw=None,hkil=None): """ Transform 4 Miller–Bravais indices to 3 Miller indices of crystal direction [uvw] or plane normal (hkl). Parameters ---------- uvtw|hkil : numpy.ndarray of shape (...,4) Miller–Bravais indices of crystallographic direction [uvtw] or plane normal (hkil). Returns ------- uvw|hkl : numpy.ndarray of shape (...,3) Miller indices of [uvw] direction or (hkl) plane normal. """ if (uvtw is not None) ^ (hkil is None): raise KeyError('Specify either "uvtw" or "hkil"') axis,basis = (_np.array(uvtw),_np.array([[1,0,-1,0], [0,1,-1,0], [0,0, 0,1]])) \ if hkil is None else \ (_np.array(hkil),_np.array([[1,0,0,0], [0,1,0,0], [0,0,0,1]])) return _np.einsum('il,...l',basis,axis) def Miller_to_Bravais(*,uvw=None,hkl=None): """ Transform 3 Miller indices to 4 Miller–Bravais indices of crystal direction [uvtw] or plane normal (hkil). Parameters ---------- uvw|hkl : numpy.ndarray of shape (...,3) Miller indices of crystallographic direction [uvw] or plane normal (hkl). Returns ------- uvtw|hkil : numpy.ndarray of shape (...,4) Miller–Bravais indices of [uvtw] direction or (hkil) plane normal. """ if (uvw is not None) ^ (hkl is None): raise KeyError('Specify either "uvw" or "hkl"') axis,basis = (_np.array(uvw),_np.array([[ 2,-1, 0], [-1, 2, 0], [-1,-1, 0], [ 0, 0, 3]])/3) \ if hkl is None else \ (_np.array(hkl),_np.array([[ 1, 0, 0], [ 0, 1, 0], [-1,-1, 0], [ 0, 0, 1]])) return _np.einsum('il,...l',basis,axis) kinematics = { 'cF': { 'slip' : _np.array([ [+0,+1,-1 , +1,+1,+1], [-1,+0,+1 , +1,+1,+1], [+1,-1,+0 , +1,+1,+1], [+0,-1,-1 , -1,-1,+1], [+1,+0,+1 , -1,-1,+1], [-1,+1,+0 , -1,-1,+1], [+0,-1,+1 , +1,-1,-1], [-1,+0,-1 , +1,-1,-1], [+1,+1,+0 , +1,-1,-1], [+0,+1,+1 , -1,+1,-1], [+1,+0,-1 , -1,+1,-1], [-1,-1,+0 , -1,+1,-1], [+1,+1,+0 , +1,-1,+0], [+1,-1,+0 , +1,+1,+0], [+1,+0,+1 , +1,+0,-1], [+1,+0,-1 , +1,+0,+1], [+0,+1,+1 , +0,+1,-1], [+0,+1,-1 , +0,+1,+1], ],'d'), 'twin' : _np.array([ [-2, 1, 1, 1, 1, 1], [ 1,-2, 1, 1, 1, 1], [ 1, 1,-2, 1, 1, 1], [ 2,-1, 1, -1,-1, 1], [-1, 2, 1, -1,-1, 1], [-1,-1,-2, -1,-1, 1], [-2,-1,-1, 1,-1,-1], [ 1, 2,-1, 1,-1,-1], [ 1,-1, 2, 1,-1,-1], [ 2, 1,-1, -1, 1,-1], [-1,-2,-1, -1, 1,-1], [-1, 1, 2, -1, 1,-1], ],dtype=float), }, 'cI': { 'slip' : _np.array([ [+1,-1,+1 , +0,+1,+1], [-1,-1,+1 , +0,+1,+1], [+1,+1,+1 , +0,-1,+1], [-1,+1,+1 , +0,-1,+1], [-1,+1,+1 , +1,+0,+1], [-1,-1,+1 , +1,+0,+1], [+1,+1,+1 , -1,+0,+1], [+1,-1,+1 , -1,+0,+1], [-1,+1,+1 , +1,+1,+0], [-1,+1,-1 , +1,+1,+0], [+1,+1,+1 , -1,+1,+0], [+1,+1,-1 , -1,+1,+0], [-1,+1,+1 , +2,+1,+1], [+1,+1,+1 , -2,+1,+1], [+1,+1,-1 , +2,-1,+1], [+1,-1,+1 , +2,+1,-1], [+1,-1,+1 , +1,+2,+1], [+1,+1,-1 , -1,+2,+1], [+1,+1,+1 , +1,-2,+1], [-1,+1,+1 , +1,+2,-1], [+1,+1,-1 , +1,+1,+2], [+1,-1,+1 , -1,+1,+2], [-1,+1,+1 , +1,-1,+2], [+1,+1,+1 , +1,+1,-2], [+1,+1,-1 , +1,+2,+3], [+1,-1,+1 , -1,+2,+3], [-1,+1,+1 , +1,-2,+3], [+1,+1,+1 , +1,+2,-3], [+1,-1,+1 , +1,+3,+2], [+1,+1,-1 , -1,+3,+2], [+1,+1,+1 , +1,-3,+2], [-1,+1,+1 , +1,+3,-2], [+1,+1,-1 , +2,+1,+3], [+1,-1,+1 , -2,+1,+3], [-1,+1,+1 , +2,-1,+3], [+1,+1,+1 , +2,+1,-3], [+1,-1,+1 , +2,+3,+1], [+1,+1,-1 , -2,+3,+1], [+1,+1,+1 , +2,-3,+1], [-1,+1,+1 , +2,+3,-1], [-1,+1,+1 , +3,+1,+2], [+1,+1,+1 , -3,+1,+2], [+1,+1,-1 , +3,-1,+2], [+1,-1,+1 , +3,+1,-2], [-1,+1,+1 , +3,+2,+1], [+1,+1,+1 , -3,+2,+1], [+1,+1,-1 , +3,-2,+1], [+1,-1,+1 , +3,+2,-1], ],'d'), 'twin' : _np.array([ [-1, 1, 1, 2, 1, 1], [ 1, 1, 1, -2, 1, 1], [ 1, 1,-1, 2,-1, 1], [ 1,-1, 1, 2, 1,-1], [ 1,-1, 1, 1, 2, 1], [ 1, 1,-1, -1, 2, 1], [ 1, 1, 1, 1,-2, 1], [-1, 1, 1, 1, 2,-1], [ 1, 1,-1, 1, 1, 2], [ 1,-1, 1, -1, 1, 2], [-1, 1, 1, 1,-1, 2], [ 1, 1, 1, 1, 1,-2], ],dtype=float), }, 'hP': { 'slip' : _np.array([ [+2,-1,-1,+0 , +0,+0,+0,+1], [-1,+2,-1,+0 , +0,+0,+0,+1], [-1,-1,+2,+0 , +0,+0,+0,+1], [+2,-1,-1,+0 , +0,+1,-1,+0], [-1,+2,-1,+0 , -1,+0,+1,+0], [-1,-1,+2,+0 , +1,-1,+0,+0], [-1,+1,+0,+0 , +1,+1,-2,+0], [+0,-1,+1,+0 , -2,+1,+1,+0], [+1,+0,-1,+0 , +1,-2,+1,+0], [-1,+2,-1,+0 , +1,+0,-1,+1], [-2,+1,+1,+0 , +0,+1,-1,+1], [-1,-1,+2,+0 , -1,+1,+0,+1], [+1,-2,+1,+0 , -1,+0,+1,+1], [+2,-1,-1,+0 , +0,-1,+1,+1], [+1,+1,-2,+0 , +1,-1,+0,+1], [-2,+1,+1,+3 , +1,+0,-1,+1], [-1,-1,+2,+3 , +1,+0,-1,+1], [-1,-1,+2,+3 , +0,+1,-1,+1], [+1,-2,+1,+3 , +0,+1,-1,+1], [+1,-2,+1,+3 , -1,+1,+0,+1], [+2,-1,-1,+3 , -1,+1,+0,+1], [+2,-1,-1,+3 , -1,+0,+1,+1], [+1,+1,-2,+3 , -1,+0,+1,+1], [+1,+1,-2,+3 , +0,-1,+1,+1], [-1,+2,-1,+3 , +0,-1,+1,+1], [-1,+2,-1,+3 , +1,-1,+0,+1], [-2,+1,+1,+3 , +1,-1,+0,+1], [-1,-1,+2,+3 , +1,+1,-2,+2], [+1,-2,+1,+3 , -1,+2,-1,+2], [+2,-1,-1,+3 , -2,+1,+1,+2], [+1,+1,-2,+3 , -1,-1,+2,+2], [-1,+2,-1,+3 , +1,-2,+1,+2], [-2,+1,+1,+3 , +2,-1,-1,+2], ],'d'), 'twin' : _np.array([ [-1, 0, 1, 1, 1, 0, -1, 2], # shear = (3-(c/a)^2)/(sqrt(3) c/a) <-10.1>{10.2} [ 0, -1, 1, 1, 0, 1, -1, 2], [ 1, -1, 0, 1, -1, 1, 0, 2], [ 1, 0, -1, 1, -1, 0, 1, 2], [ 0, 1, -1, 1, 0, -1, 1, 2], [-1, 1, 0, 1, 1, -1, 0, 2], [-1, -1, 2, 6, 1, 1, -2, 1], # shear = 1/(c/a) <11.6>{-1-1.1} [ 1, -2, 1, 6, -1, 2, -1, 1], [ 2, -1, -1, 6, -2, 1, 1, 1], [ 1, 1, -2, 6, -1, -1, 2, 1], [-1, 2, -1, 6, 1, -2, 1, 1], [-2, 1, 1, 6, 2, -1, -1, 1], [ 1, 0, -1, -2, 1, 0, -1, 1], # shear = (4(c/a)^2-9)/(4 sqrt(3) c/a) <10.-2>{10.1} [ 0, 1, -1, -2, 0, 1, -1, 1], [-1, 1, 0, -2, -1, 1, 0, 1], [-1, 0, 1, -2, -1, 0, 1, 1], [ 0, -1, 1, -2, 0, -1, 1, 1], [ 1, -1, 0, -2, 1, -1, 0, 1], [ 1, 1, -2, -3, 1, 1, -2, 2], # shear = 2((c/a)^2-2)/(3 c/a) <11.-3>{11.2} [-1, 2, -1, -3, -1, 2, -1, 2], [-2, 1, 1, -3, -2, 1, 1, 2], [-1, -1, 2, -3, -1, -1, 2, 2], [ 1, -2, 1, -3, 1, -2, 1, 2], [ 2, -1, -1, -3, 2, -1, -1, 2], ],dtype=float), }, } # Kurdjomov--Sachs orientation relationship for fcc <-> bcc transformation # from S. Morito et al., Journal of Alloys and Compounds 577:s587-s592, 2013 # also see K. Kitahara et al., Acta Materialia 54:1279-1288, 2006 relations = { 'KS': { 'cF' : _np.array([ [[ -1, 0, 1],[ 1, 1, 1]], [[ -1, 0, 1],[ 1, 1, 1]], [[ 0, 1, -1],[ 1, 1, 1]], [[ 0, 1, -1],[ 1, 1, 1]], [[ 1, -1, 0],[ 1, 1, 1]], [[ 1, -1, 0],[ 1, 1, 1]], [[ 1, 0, -1],[ 1, -1, 1]], [[ 1, 0, -1],[ 1, -1, 1]], [[ -1, -1, 0],[ 1, -1, 1]], [[ -1, -1, 0],[ 1, -1, 1]], [[ 0, 1, 1],[ 1, -1, 1]], [[ 0, 1, 1],[ 1, -1, 1]], [[ 0, -1, 1],[ -1, 1, 1]], [[ 0, -1, 1],[ -1, 1, 1]], [[ -1, 0, -1],[ -1, 1, 1]], [[ -1, 0, -1],[ -1, 1, 1]], [[ 1, 1, 0],[ -1, 1, 1]], [[ 1, 1, 0],[ -1, 1, 1]], [[ -1, 1, 0],[ 1, 1, -1]], [[ -1, 1, 0],[ 1, 1, -1]], [[ 0, -1, -1],[ 1, 1, -1]], [[ 0, -1, -1],[ 1, 1, -1]], [[ 1, 0, 1],[ 1, 1, -1]], [[ 1, 0, 1],[ 1, 1, -1]], ],dtype=float), 'cI' : _np.array([ [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ -1, -1, 1],[ 0, 1, 1]], [[ -1, 1, -1],[ 0, 1, 1]], ],dtype=float), }, 'GT': { 'cF' : _np.array([ [[ -5,-12, 17],[ 1, 1, 1]], [[ 17, -5,-12],[ 1, 1, 1]], [[-12, 17, -5],[ 1, 1, 1]], [[ 5, 12, 17],[ -1, -1, 1]], [[-17, 5,-12],[ -1, -1, 1]], [[ 12,-17, -5],[ -1, -1, 1]], [[ -5, 12,-17],[ -1, 1, 1]], [[ 17, 5, 12],[ -1, 1, 1]], [[-12,-17, 5],[ -1, 1, 1]], [[ 5,-12,-17],[ 1, -1, 1]], [[-17, -5, 12],[ 1, -1, 1]], [[ 12, 17, 5],[ 1, -1, 1]], [[ -5, 17,-12],[ 1, 1, 1]], [[-12, -5, 17],[ 1, 1, 1]], [[ 17,-12, -5],[ 1, 1, 1]], [[ 5,-17,-12],[ -1, -1, 1]], [[ 12, 5, 17],[ -1, -1, 1]], [[-17, 12, -5],[ -1, -1, 1]], [[ -5,-17, 12],[ -1, 1, 1]], [[-12, 5,-17],[ -1, 1, 1]], [[ 17, 12, 5],[ -1, 1, 1]], [[ 5, 17, 12],[ 1, -1, 1]], [[ 12, -5,-17],[ 1, -1, 1]], [[-17,-12, 5],[ 1, -1, 1]], ],dtype=float), 'cI' : _np.array([ [[-17, -7, 17],[ 1, 0, 1]], [[ 17,-17, -7],[ 1, 1, 0]], [[ -7, 17,-17],[ 0, 1, 1]], [[ 17, 7, 17],[ -1, 0, 1]], [[-17, 17, -7],[ -1, -1, 0]], [[ 7,-17,-17],[ 0, -1, 1]], [[-17, 7,-17],[ -1, 0, 1]], [[ 17, 17, 7],[ -1, 1, 0]], [[ -7,-17, 17],[ 0, 1, 1]], [[ 17, -7,-17],[ 1, 0, 1]], [[-17,-17, 7],[ 1, -1, 0]], [[ 7, 17, 17],[ 0, -1, 1]], [[-17, 17, -7],[ 1, 1, 0]], [[ -7,-17, 17],[ 0, 1, 1]], [[ 17, -7,-17],[ 1, 0, 1]], [[ 17,-17, -7],[ -1, -1, 0]], [[ 7, 17, 17],[ 0, -1, 1]], [[-17, 7,-17],[ -1, 0, 1]], [[-17,-17, 7],[ -1, 1, 0]], [[ -7, 17,-17],[ 0, 1, 1]], [[ 17, 7, 17],[ -1, 0, 1]], [[ 17, 17, 7],[ 1, -1, 0]], [[ 7,-17,-17],[ 0, -1, 1]], [[-17, -7, 17],[ 1, 0, 1]], ],dtype=float), }, 'GT_prime': { 'cF' : _np.array([ [[ 0, 1, -1],[ 7, 17, 17]], [[ -1, 0, 1],[ 17, 7, 17]], [[ 1, -1, 0],[ 17, 17, 7]], [[ 0, -1, -1],[ -7,-17, 17]], [[ 1, 0, 1],[-17, -7, 17]], [[ 1, -1, 0],[-17,-17, 7]], [[ 0, 1, -1],[ 7,-17,-17]], [[ 1, 0, 1],[ 17, -7,-17]], [[ -1, -1, 0],[ 17,-17, -7]], [[ 0, -1, -1],[ -7, 17,-17]], [[ -1, 0, 1],[-17, 7,-17]], [[ -1, -1, 0],[-17, 17, -7]], [[ 0, -1, 1],[ 7, 17, 17]], [[ 1, 0, -1],[ 17, 7, 17]], [[ -1, 1, 0],[ 17, 17, 7]], [[ 0, 1, 1],[ -7,-17, 17]], [[ -1, 0, -1],[-17, -7, 17]], [[ -1, 1, 0],[-17,-17, 7]], [[ 0, -1, 1],[ 7,-17,-17]], [[ -1, 0, -1],[ 17, -7,-17]], [[ 1, 1, 0],[ 17,-17, -7]], [[ 0, 1, 1],[ -7, 17,-17]], [[ 1, 0, -1],[-17, 7,-17]], [[ 1, 1, 0],[-17, 17, -7]], ],dtype=float), 'cI' : _np.array([ [[ 1, 1, -1],[ 12, 5, 17]], [[ -1, 1, 1],[ 17, 12, 5]], [[ 1, -1, 1],[ 5, 17, 12]], [[ -1, -1, -1],[-12, -5, 17]], [[ 1, -1, 1],[-17,-12, 5]], [[ 1, -1, -1],[ -5,-17, 12]], [[ -1, 1, -1],[ 12, -5,-17]], [[ 1, 1, 1],[ 17,-12, -5]], [[ -1, -1, 1],[ 5,-17,-12]], [[ 1, -1, -1],[-12, 5,-17]], [[ -1, -1, 1],[-17, 12, -5]], [[ -1, -1, -1],[ -5, 17,-12]], [[ 1, -1, 1],[ 12, 17, 5]], [[ 1, 1, -1],[ 5, 12, 17]], [[ -1, 1, 1],[ 17, 5, 12]], [[ -1, 1, 1],[-12,-17, 5]], [[ -1, -1, -1],[ -5,-12, 17]], [[ -1, 1, -1],[-17, -5, 12]], [[ -1, -1, 1],[ 12,-17, -5]], [[ -1, 1, -1],[ 5,-12,-17]], [[ 1, 1, 1],[ 17, -5,-12]], [[ 1, 1, 1],[-12, 17, -5]], [[ 1, -1, -1],[ -5, 12,-17]], [[ 1, 1, -1],[-17, 5,-12]], ],dtype=float), }, 'NW': { 'cF' : _np.array([ [[ 2, -1, -1],[ 1, 1, 1]], [[ -1, 2, -1],[ 1, 1, 1]], [[ -1, -1, 2],[ 1, 1, 1]], [[ -2, -1, -1],[ -1, 1, 1]], [[ 1, 2, -1],[ -1, 1, 1]], [[ 1, -1, 2],[ -1, 1, 1]], [[ 2, 1, -1],[ 1, -1, 1]], [[ -1, -2, -1],[ 1, -1, 1]], [[ -1, 1, 2],[ 1, -1, 1]], [[ 2, -1, 1],[ -1, -1, 1]], [[ -1, 2, 1],[ -1, -1, 1]], [[ -1, -1, -2],[ -1, -1, 1]], ],dtype=float), 'cI' : _np.array([ [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], [[ 0, -1, 1],[ 0, 1, 1]], ],dtype=float), }, 'Pitsch': { 'cF' : _np.array([ [[ 1, 0, 1],[ 0, 1, 0]], [[ 1, 1, 0],[ 0, 0, 1]], [[ 0, 1, 1],[ 1, 0, 0]], [[ 0, 1, -1],[ 1, 0, 0]], [[ -1, 0, 1],[ 0, 1, 0]], [[ 1, -1, 0],[ 0, 0, 1]], [[ 1, 0, -1],[ 0, 1, 0]], [[ -1, 1, 0],[ 0, 0, 1]], [[ 0, -1, 1],[ 1, 0, 0]], [[ 0, 1, 1],[ 1, 0, 0]], [[ 1, 0, 1],[ 0, 1, 0]], [[ 1, 1, 0],[ 0, 0, 1]], ],dtype=float), 'cI' : _np.array([ [[ 1, -1, 1],[ -1, 0, 1]], [[ 1, 1, -1],[ 1, -1, 0]], [[ -1, 1, 1],[ 0, 1, -1]], [[ -1, 1, -1],[ 0, -1, -1]], [[ -1, -1, 1],[ -1, 0, -1]], [[ 1, -1, -1],[ -1, -1, 0]], [[ 1, -1, -1],[ -1, 0, -1]], [[ -1, 1, -1],[ -1, -1, 0]], [[ -1, -1, 1],[ 0, -1, -1]], [[ -1, 1, 1],[ 0, -1, 1]], [[ 1, -1, 1],[ 1, 0, -1]], [[ 1, 1, -1],[ -1, 1, 0]], ],dtype=float), }, 'Bain': { 'cF' : _np.array([ [[ 0, 1, 0],[ 1, 0, 0]], [[ 0, 0, 1],[ 0, 1, 0]], [[ 1, 0, 0],[ 0, 0, 1]], ],dtype=float), 'cI' : _np.array([ [[ 0, 1, 1],[ 1, 0, 0]], [[ 1, 0, 1],[ 0, 1, 0]], [[ 1, 1, 0],[ 0, 0, 1]], ],dtype=float), }, 'Burgers' : { 'cI' : _np.array([ [[ -1, 1, 1],[ 1, 1, 0]], [[ -1, 1, -1],[ 1, 1, 0]], [[ 1, 1, 1],[ 1, -1, 0]], [[ 1, 1, -1],[ 1, -1, 0]], [[ 1, 1, -1],[ 1, 0, 1]], [[ -1, 1, 1],[ 1, 0, 1]], [[ 1, 1, 1],[ -1, 0, 1]], [[ 1, -1, 1],[ -1, 0, 1]], [[ -1, 1, -1],[ 0, 1, 1]], [[ 1, 1, -1],[ 0, 1, 1]], [[ -1, 1, 1],[ 0, -1, 1]], [[ 1, 1, 1],[ 0, -1, 1]], ],dtype=float), 'hP' : _np.array([ [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], [[ -1, 2, -1, 0],[ 0, 0, 0, 1]], [[ -1, -1, 2, 0],[ 0, 0, 0, 1]], ],dtype=float), }, }