From 85f4513b219a79c8e3a695f920de79c641fe42ae Mon Sep 17 00:00:00 2001
From: Nicola Vigano <nicola.vigano@esrf.fr>
Date: Mon, 14 Dec 2015 15:52:17 +0100
Subject: [PATCH] gtStrainPlaneNormals: optimized for deformation of single
 plane normal

Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr>
---
 zUtil_Strain2/gtStrainPlaneNormals.m | 74 ++++++++++++++++------------
 1 file changed, 42 insertions(+), 32 deletions(-)

diff --git a/zUtil_Strain2/gtStrainPlaneNormals.m b/zUtil_Strain2/gtStrainPlaneNormals.m
index 92f5e5fc..0f34ffb7 100644
--- a/zUtil_Strain2/gtStrainPlaneNormals.m
+++ b/zUtil_Strain2/gtStrainPlaneNormals.m
@@ -21,73 +21,81 @@ function [pldef, drel] = gtStrainPlaneNormals(pl, defT)
 %   drel  - relative elongations along the (deformed) plane normals
 %
 
+num_pls = size(pl, 2);
+num_def = size(defT, 3);
 
 % Get an arbitrary vector e1 perpendicular to n:
 [~, maxcomp] = max(abs(pl), [], 1);
 
 
-ee = zeros(3,size(pl,2)*3);
+ee = zeros(3, num_pls * 3);
 
-zero = zeros(1,size(pl,2));
+zero = zeros(1, num_pls);
 
-ee(:,1:3:end) = [ pl(2,:); -pl(1,:);     zero];
-ee(:,2:3:end) = [    zero;  pl(3,:); -pl(2,:)];
-ee(:,3:3:end) = [-pl(3,:);     zero;  pl(1,:)];
+ee(:, 1:3:end) = [ pl(2, :); -pl(1, :);     zero];
+ee(:, 2:3:end) = [    zero;  pl(3, :); -pl(2, :)];
+ee(:, 3:3:end) = [-pl(3, :);     zero;  pl(1, :)];
 
-ind2 = (0:size(pl,2)-1)*3 + maxcomp;
-e1   = ee(:,ind2);
+ind2 = (0:num_pls-1) * 3 + maxcomp;
+e1   = ee(:, ind2);
 
 
-% Cross product of e1 and pl: e2=cross(e1,pl)
-e2 = [pl(2,:).*e1(3,:) - pl(3,:).*e1(2,:);
-      pl(3,:).*e1(1,:) - pl(1,:).*e1(3,:);
-      pl(1,:).*e1(2,:) - pl(2,:).*e1(1,:)];
+% Cross product of e1 and pl: e2=cross(e1, pl)
+e2 = [pl(2, :) .* e1(3, :) - pl(3, :) .* e1(2, :);
+      pl(3, :) .* e1(1, :) - pl(1, :) .* e1(3, :);
+      pl(1, :) .* e1(2, :) - pl(2, :) .* e1(1, :)];
 
   
 % Check   
 % ne2 = sqrt(sum(e2.*e2, 1));
-% e2n = e2./ne2([1 1 1],:);
+% e2n = e2./ne2([1 1 1], :);
 % 
 % ne1 = sqrt(sum(e1.*e1, 1));
-% e1n = e1./ne1([1 1 1],:);
+% e1n = e1./ne1([1 1 1], :);
 %  
-% cross(e1n,e2n) - pl
+% cross(e1n, e2n) - pl
 
 
 % check flip e2 if needed to get them right handed:
-% ch = [e1(2,:).*e2(3,:) - e1(3,:).*e2(2,:);
-%       e1(3,:).*e2(1,:) - e1(1,:).*e2(3,:);
-%       e1(1,:).*e2(2,:) - e1(2,:).*e2(1,:)];
+% ch = [e1(2, :).*e2(3, :) - e1(3, :).*e2(2, :);
+%       e1(3, :).*e2(1, :) - e1(1, :).*e2(3, :);
+%       e1(1, :).*e2(2, :) - e1(2, :).*e2(1, :)];
 % sum(ch.*pl, 1) < 0
 
 
 % e1 and e2 vectors in deformed state:
-if (size(defT,3) == 1)
+if (num_def == 1)
     e1def = defT*e1 + e1;
     e2def = defT*e2 + e2;
+elseif (num_pls == 1)
+    defT_t = permute(defT, [2 1 3]);
+    defT_t = reshape(defT_t, 3, [])';
+
+    e1def = reshape(defT_t * e1, 3, []) + e1(:, ones(num_def, 1));
+    e2def = reshape(defT_t * e2, 3, []) + e2(:, ones(num_def, 1));
 else
     % Expand vectors for multiplication element-wise
-    e1r   = reshape(e1,1,[]);
-    defTe = reshape(defT,3,[],1).*[e1r; e1r; e1r];
-    defTe = defTe(:,1:3:end) + defTe(:,2:3:end) + defTe(:,3:3:end);
+    e1r   = reshape(e1, 1, []);
+    defTe = reshape(defT, 3, [], 1).*[e1r; e1r; e1r];
+    defTe = defTe(:, 1:3:end) + defTe(:, 2:3:end) + defTe(:, 3:3:end);
     e1def = defTe + e1;
 
-    e2r   = reshape(e2,1,[]);
-    defTe = reshape(defT,3,[],1).*[e2r; e2r; e2r];
-    defTe = defTe(:,1:3:end) + defTe(:,2:3:end) + defTe(:,3:3:end);
+    e2r   = reshape(e2, 1, []);
+    defTe = reshape(defT, 3, [], 1).*[e2r; e2r; e2r];
+    defTe = defTe(:, 1:3:end) + defTe(:, 2:3:end) + defTe(:, 3:3:end);
     e2def = defTe + e2;
 end
 
 
 % new deformed pl
-pldef = [e1def(2,:).*e2def(3,:) - e1def(3,:).*e2def(2,:);
-         e1def(3,:).*e2def(1,:) - e1def(1,:).*e2def(3,:);
-         e1def(1,:).*e2def(2,:) - e1def(2,:).*e2def(1,:)];
+pldef = [e1def(2, :).*e2def(3, :) - e1def(3, :).*e2def(2, :);
+         e1def(3, :).*e2def(1, :) - e1def(1, :).*e2def(3, :);
+         e1def(1, :).*e2def(2, :) - e1def(2, :).*e2def(1, :)];
 
      
 % normalise pldef
 normpldef = sqrt(sum(pldef.*pldef, 1));
-pldef     = pldef./normpldef([1 1 1],:);
+pldef     = pldef./normpldef([1 1 1], :);
 
 
 % check flip
@@ -100,12 +108,14 @@ pldef     = pldef./normpldef([1 1 1],:);
 % New length along original plane normal
 % (exact calculation, non-linear in the defT components)
 
-if (size(defT,3) == 1)
+if (size(defT, 3) == 1)
     fvec = defT*pl + pl;
+elseif (num_pls == 1)
+    fvec = reshape(defT_t * pl, 3, []) + pl(:, ones(num_def, 1));
 else
-    plr   = reshape(pl,1,[]);
-    defTe = reshape(defT,3,[],1).*[plr; plr; plr];
-    defTe = defTe(:,1:3:end) + defTe(:,2:3:end) + defTe(:,3:3:end);
+    plr   = reshape(pl, 1, []);
+    defTe = reshape(defT, 3, [], 1).*[plr; plr; plr];
+    defTe = defTe(:, 1:3:end) + defTe(:, 2:3:end) + defTe(:, 3:3:end);
     
     fvec = defTe + pl;   
 end
-- 
GitLab