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
ans = vector3d
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
ans = vector3d
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
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
87.0892 33.2984 320.219
ans = vector3d
ans = vector3d
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
94.0497 29.4341 358.508
ans = rotation
Bunge Euler angles in degree
phi1 Phi phi2
94.0497 29.4341 358.508
ans = rotation
Bunge Euler angles in degree
phi1 Phi phi2
94.0497 29.4341 358.508
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
74.5535 51.5051 9.61062
ans = rotation
Bunge Euler angles in degree
phi1 Phi phi2
74.5535 51.5051 9.61062
ans = rotation
Bunge Euler angles in degree
phi1 Phi phi2
74.5535 51.5051 9.61062
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
61.8386 40.0064 340.052
ori = orientation (321 → xyz)
Bunge Euler angles in degree
phi1 Phi phi2
79.3156 43.3785 9.9013
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
vR2 = vector3d
lR1 = vector3d
lR2 = vector3d
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
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
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
79.3156 43.3785 9.9013
ans = orientation (321 → xyz)
Bunge Euler angles in degree
phi1 Phi phi2
79.3156 43.3785 9.9013
ans = orientation (321 → xyz)
Bunge Euler angles in degree
phi1 Phi phi2
79.3156 43.3785 9.9013
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
74.5535 51.5051 9.61062
ans = orientation (321 → xyz)
Bunge Euler angles in degree
phi1 Phi phi2
74.5535 51.5051 9.61062
ans = orientation (321 → xyz)
Bunge Euler angles in degree
phi1 Phi phi2
74.5535 51.5051 9.61062