Spin Tensors as Ininitesimal Changes of Rotations edit page

Spin tensors are skew symmetric tensors that can be used to describe small rotational changes. Lets consider an arbitrary reference rotation

rot_ref = rotation.byEuler(10*degree,20*degree,30*degree);

and pertube it by a rotation about the axis (123) and angle delta. Since multiplication of rotations is not communatativ we have to distinguish between left and right pertubations

delta = 0.01*degree;
rot_123 = rotation.byAxisAngle(vector3d(1,2,3),delta);
rot_right = rot_123 * rot_ref;
rot_left = rot_ref * rot_123;

We may now ask for the first order Taylor coefficients of the pertubation as delta goes to zero which we find by the formula

\[ T = \lim_{\delta \to 0} \frac{\tilde R - R}{\delta} \]

T_right = (rot_right.matrix - rot_ref.matrix)./delta
T_left = (rot_left.matrix - rot_ref.matrix)./delta
T_right =
   -0.4002   -0.4146    0.7724
    0.5727   -0.5873   -0.2035
   -0.2484    0.5297   -0.1218
T_left =
   -0.5399   -0.6025    0.5816
    0.7530   -0.5816    0.1368
   -0.2648    0.1140    0.0122

Both matrices T_right and T_left are elements of the tangential space attached to the reference rotation rot_ref. Those matrices are characterized by the fact that they becomes scew symmetric matrices when multiplied from the left or from the right with the inverse of the reference rotation

S_right_L =  matrix(inv(rot_ref)) * T_right
S_right_R = T_right * matrix(inv(rot_ref))

S_left_L =  matrix(inv(rot_ref)) * T_left
S_left_R = T_left * matrix(inv(rot_ref))
S_right_L =
   -0.0000   -0.5892    0.4501
    0.5893   -0.0001   -0.6709
   -0.4501    0.6710   -0.0001
S_right_R =
   -0.0001   -0.8018    0.5345
    0.8018   -0.0001   -0.2672
   -0.5345    0.2673   -0.0000
S_left_L =
   -0.0001   -0.8018    0.5345
    0.8018   -0.0001   -0.2672
   -0.5345    0.2673   -0.0000
S_left_R =
   -0.0001   -0.9575    0.2758
    0.9575   -0.0001    0.0850
   -0.2758   -0.0850   -0.0000

A scew symmetric 3x3 matrix S is essentially determined by its entries \(S_{21}\), \(S_{31}\) and \(S_{32}\). Writing these values as a vector \((S_32,-S_{31},S_{21})\) we obtain for the matrices S_right_R and S_left_L exactly the rotational axis of our pertubation

vector3d(spinTensor(S_right_R)) * sqrt(14)

vector3d(spinTensor(S_left_L))  *sqrt(14)
ans = vector3d
  x y z
  1 2 3
 
ans = vector3d
  x y z
  1 2 3

For the other two matrices those vectors are related to the rotational axis by the reference rotation rot_ref

rot_ref * vector3d(spinTensor(S_right_L)) * sqrt(14)

inv(rot_ref) * vector3d(spinTensor(S_left_R)) * sqrt(14)
ans = vector3d
  x y z
  1 2 3
 
ans = vector3d
  x y z
  1 2 3

The Functions Exp and Log

The above definition of the spin tensor works only well if the pertupation rotation has small rotational angle. For large pertubations the matrix logarithm provides the correct way to translate rotational changes into skew symmetric matrices

S = logm(rot_ref * rot_123,rot_ref)

S = logm(rot_123 * rot_ref,rot_ref,'left')
S = spinTensor (xyz)
  rank: 2 (3 x 3)
 
 *10^-5
       0 -13.994   9.329
  13.994       0  -4.665
  -9.329   4.665       0
 
S = spinTensor (xyz)
  rank: 2 (3 x 3)
 
 *10^-5
       0 -13.994   9.329
  13.994       0  -4.665
  -9.329   4.665       0

Again the entries \(S_{21}\), \(S_{31}\) and \(S_{32}\) exactly coincide with the rotional axis multiplied with the rotational angle

vector3d(S) * sqrt(14)
ans = vector3d
            x           y           z
  0.000174533 0.000349066 0.000523599

More directly this disorientation vector may be computed from two rotations by the command log

rot_123 = rotation.byAxisAngle(vector3d(1,2,3),1)
log(rot_ref * rot_123,rot_ref) * sqrt(14)

log(rot_123 * rot_ref,rot_ref,'left') * sqrt(14)
rot_123 = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  87.0892 33.2984 320.219       0
 
 
ans = vector3d
  x y z
  1 2 3
 
ans = vector3d
  x y z
  1 2 3

The other way round

Given a skew symmetric matrix S or a disorientation vector v we may use the command exp to apply this rotational pertubation to a reference rotation rot_ref

S = logm(rot_ref * rot_123,rot_ref);
rot_ref * rot_123
exp(S,rot_ref)

v = log(rot_ref * rot_123,rot_ref);
exp(v,rot_ref)
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  94.0497 29.4341 358.508       0
 
 
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  94.0497 29.4341 358.508       0
 
 
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  94.0497 29.4341 358.508       0
S = logm(rot_123 * rot_ref,rot_ref,'left');
rot_123 * rot_ref
exp(S,rot_ref,'left')

v = log(rot_123 * rot_ref,rot_ref,'left');
exp(v,rot_ref,'left')
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0
 
 
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0
 
 
ans = rotation
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0

Disorientations under the presence of crystal symmetry

Under the presence of crystal symmetry the order whether a rotational pertupation is applied from the left or from the right. Lets perform the above calculations step by step in the presence of trigonal crystal symmetry

cs = crystalSymmetry('321');

% consider an arbitrary rotation
ori_ref = orientation.byEuler(10*degree,20*degree,30*degree,cs);

% next we disturb rot_ref by a rotation about the axis (123)
mori_123 = orientation.byAxisAngle(Miller(1,2,-3,3,cs),1)

% first we multiply from the right
ori = ori_ref * mori_123
mori_123 = misorientation (321 → 321)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  61.8386 40.0064 340.052       0
 
 
ori = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  79.3156 43.3785  9.9013       0

and compute the scew symmetric pertubation matrices

S_right_L =  matrix(inv(rot_ref)) * T_right
S_right_R = T_right * matrix(inv(rot_ref))

S_left_L =  matrix(inv(rot_ref)) * T_left
S_left_R = T_left * matrix(inv(rot_ref))
S_right_L =
   -0.0000   -0.5892    0.4501
    0.5893   -0.0001   -0.6709
   -0.4501    0.6710   -0.0001
S_right_R =
   -0.0001   -0.8018    0.5345
    0.8018   -0.0001   -0.2672
   -0.5345    0.2673   -0.0000
S_left_L =
   -0.0001   -0.8018    0.5345
    0.8018   -0.0001   -0.2672
   -0.5345    0.2673   -0.0000
S_left_R =
   -0.0001   -0.9575    0.2758
    0.9575   -0.0001    0.0850
   -0.2758   -0.0850   -0.0000

make it a vector

vR1 = vector3d(spinTensor(S_right_L))  *sqrt(14)
vR2 = inv(rot_ref) * vector3d(spinTensor(S_right_R)) * sqrt(14)

lR1 = rot_ref * vector3d(spinTensor(S_left_L))  *sqrt(14)
lR2 = vector3d(spinTensor(S_left_R)) * sqrt(14)
vR1 = vector3d
        x       y       z
  2.51049  1.6841 2.20482
 
vR2 = vector3d
        x       y       z
  2.51049  1.6841 2.20482
 
lR1 = vector3d
          x         y         z
  -0.317983   1.03184   3.58248
 
lR2 = vector3d
          x         y         z
  -0.317983   1.03184   3.58248

logarithm to vector3d

log(ori_ref * mori_123,ori_ref)

log(rot_123 * ori_ref,ori_ref,'left') * sqrt(14)
ans = Miller (321)
       h       k       i       l
  0.2335  0.4671 -0.7006  0.7006
 
ans = vector3d
  x y z
  1 2 3

logarithm to skew symmetric matrix

S = logm(ori_ref * mori_123,ori_ref)
round(vector3d(S))

S = logm(rot_123 * ori_ref,ori_ref,'left')
vector3d(S) * sqrt(14)
S = spinTensor (321)
  rank: 2 (3 x 3)
 
 *10^-2
      0 -70.06  46.71
  70.06      0 -53.94
 -46.71  53.94      0
 
ans = Miller (321)
  h  k  i  l
  1  2 -3  3
 
S = spinTensor (xyz)
  rank: 2 (3 x 3)
 
 *10^-2
      0 -80.18  53.45
  80.18      0 -26.73
 -53.45  26.73      0
 
ans = vector3d
  x y z
  1 2 3

The other way round

S = logm(ori_ref * mori_123,ori_ref);
ori_ref * mori_123
exp(S,ori_ref)

v = log(ori_ref * mori_123,ori_ref);
exp(v,ori_ref)
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  79.3156 43.3785  9.9013       0
 
 
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  79.3156 43.3785  9.9013       0
 
 
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  79.3156 43.3785  9.9013       0
S = logm(rot_123 * ori_ref,ori_ref,'left');
rot_123 * ori_ref
exp(S,ori_ref,'left')

v = log(rot_123 * ori_ref,ori_ref,'left');
exp(v,ori_ref,'left')
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0
 
 
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0
 
 
ans = orientation (321 → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2    Inv.
  74.5535 51.5051 9.61062       0