Newer
Older
function [Bmat, Amat] = gtCrystHKL2CartesianMatrix(lp)
%
% [Bmat, Amat] = gtCrystHKL2CartesianMatrix(lp)
% ---------------------------------------------
% Returns a 3x3 matrix that can be used for coordinate transform from
% a signed HKL into a Cartesian vector in real space and for any lattice
% and unit cell.
%
% The Cartesian (orthogonal) basis (X,Y,Z) is defined such that:
% - lattice vectors of the unit cell are a1, a2, a3 (not orthogonal)
% - X is parallel with a1
% - Y lies in the a1-a2 plane
% - Z is cross(X,Y)
%
Nicola Vigano
committed
% The definition does not correspond to the one in Poulsen's 3DXRD
% book, Chapter 3, but it is an equivalent representation based on the
% real space lattice.
% This function essentially computes the B matrix in the equation
% Gc = B*Ghkl (used with column vectors!)
%
% INPUT:
% lp = unit cell lattice parameters in real space
% [a b c alpha beta gamma] (angles are in degrees)
%
% OUTPUT:
% Bmat = the transformation matrix for column vectors (!)
Nicola Vigano
committed
% Amat = the A matrix too (real space) for dealing with UVW lattice
% directions.
%
Nicola Vigano
committed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Lattice vectors in real space, in a Cartesian basis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cos_alpha = cosd(lp(4));
cos_beta = cosd(lp(5));
cos_gamma = cosd(lp(6));
sin_gamma = sind(lp(6));
Nicola Vigano
committed
% Calculate 'a', and 'b' lattice vectors in X, Y, Z coordinates:
a = lp(1) * [1, 0, 0];
b = lp(2) * [cos_gamma, sin_gamma, 0];
Nicola Vigano
committed
% Calculate 'c1' and 'c2' components:
c1 = lp(3) * cos_beta;
c2 = lp(3) * (cos_alpha - cos_gamma * cos_beta) / sin_gamma;
% Calculate 'c3' component as the result:
c = [c1, c2, sqrt(([lp(3), c1, c2] .^ 2) * [1; -1; -1])];
Nicola Vigano
committed
% We keep it transposed for the computation of B, and then transpose it
% back again in the end.
Amat = [a; b; c];
Nicola Vigano
committed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Reciprocal lattice vectors in the Cartesian basis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Reciprocal lattice vectors by Crystallographers' definition:
% a* = cross(b, c) / cell_vol
% b* = cross(c, a) / cell_vol
% c* = cross(a, b) / cell_vol
cross_prods = gtMathsCross(Amat, Amat([2 3 1], :))';
Nicola Vigano
committed
% Volume of the direct lattice unit cell: V = (a dot (b cross c))
cell_vol = a * cross_prods(:, 2);
Nicola Vigano
committed
% B matrix finally
Bmat = cross_prods(:, [2 3 1]) / cell_vol;
Nicola Vigano
committed
% A matrix (for output)
Amat = Amat';
Laura Nervo
committed
end % of function