Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
function varargout = gtGetMaxDisorientation(gvdm, Symm, mode)
if (nargout == 0)
silent = false;
else
silent = true;
end
if (~exist('Symm', 'var') || isempty(Symm))
Symm = gtCrystGetSymmetryOperators('cubic');
end
if (~exist('mode', 'var'))
mode = 'minimal';
end
if (~silent)
fprintf(' * Computing maximum internal disorientation angle (mode: %s)..', mode);
t = tic();
end
try
[vec_1, vec_2] = getExtremes(gvdm, mode, silent);
max_dis_angle = gtDisorientation(vec_1, vec_2, Symm, 'mode', 'active');
catch mexc
gtPrintException(mexc, 'Probably no spread in the distribution')
max_dis_angle = 0;
end
if (silent)
varargout{1} = max_dis_angle;
else
fprintf('\b\b: %f deg (in: %f s)\n', max_dis_angle, toc(t));
end
end
function [vec_1, vec_2] = getExtremes(gvdm, mode, silent)
num_vecs = size(gvdm, 2);
switch (mode)
case 'diameter_zero'
lengths = sum(gvdm .^ 2, 1);
[~, i_max] = max(lengths);
vec_1 = gvdm(:, i_max);
vec_2 = -gvdm(:, i_max);
case 'diameter_average'
center = mean(gvdm, 2);
lengths = sum((gvdm - center(:, ones(num_vecs, 1))) .^ 2, 1);
[~, i_max] = max(lengths);
vec_1 = gvdm(:, i_max);
vec_2 = center - (gvdm(:, i_max) - center);
case 'minimal'
best_match = struct('length', 0.0, 'vec1', 1, 'vec2', 1);
if (~silent)
fprintf('\b\b');
num_chars = fprintf(': ');
end
k = convhull(double(gvdm'));
gvdm = gvdm(:, k);
num_vecs = size(gvdm, 2);
for ii = 1:num_vecs
if (~silent && ~mod(ii, 100))
num_chars = fprintf('%d/%d', ii, num_vecs);
end
rod_vecs_1 = gvdm(:, ii * ones(num_vecs, 1));
rod_vecs_1 = rod_vecs_1 - gvdm;
lengths = sum(rod_vecs_1 .^ 2, 1);
[max_length, i_max] = max(lengths);
if (best_match.length < max_length)
best_match.length = max_length;
best_match.vec1 = ii;
best_match.vec2 = i_max;
end
if (~silent && ~mod(ii, 100))
fprintf(repmat('\b', [1 num_chars]));
end
end
if (~silent)
fprintf([repmat(' ', [1, num_chars]) repmat('\b', [1, num_chars]) '\b\b..'])
end
vec_1 = gvdm(:, best_match.vec1);
vec_2 = gvdm(:, best_match.vec2);
otherwise
error('gtGetMaxDisorientation:wrong_argument', 'No such mode: "%s"', mode)
end
end