a 2D version
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.4 KiB

4 years ago
%--------------------------
% @Author: Jingqiao Hu
% @Date: 2020-10-29 15:04:18
% @LastEditTime: 2021-01-11 22:00:36
%--------------------------
% fast version
% dF.size() = 4 * l * m
function dP = dPdF_fast(global_u, global_l, F, dF)
% expand & reorder -> (4, lenout*eleNum_mi)
lenout = size(dF,2);
F1 = repmat(F, lenout, 1);
F1 = permute(F1, [1,3,2]);
F1 = reshape(F1(:), 4, []);
dF_expand = reshape(dF, 4, []);
dFT = dF_expand([1,3,2,4], :); % NOTE: change 2 rows to get dF^T
Fdet = F1(1, :).*F1(4, :) - F1(2, :).*F1(3, :);
Finv = F1([4,2,3,1], :) .* [1;-1;-1; 1] ./ Fdet;
%% dP1 = u * dF
mu(1,1,:) = global_u(:);
dP1 = dF .* mu; % 4 * l * m
%% dP2 = (mu - lambda * JJ) * Finv' * dF' * Finv';
JJ = reshape(log(Fdet), lenout, []); % l * m
lambda = global_l(:)'; % 1 * m
lm_J(1,:,:) = lambda .* JJ; % 1 * l * m
FinvT = Finv([1,3,2,4], :);
tmp = matrix_3d_multiply(matrix_3d_multiply(FinvT, dFT), FinvT);
tmp = reshape(tmp, size(dF));
dP2 = mu .* tmp - lm_J .* tmp;
%% dP3 = lambda * trace(F\dFe) * Finv'
tmp = matrix_3d_multiply(Finv, dF_expand);
trF = reshape(tmp(1,:)+tmp(4,:), lenout, []); % l*m
lm_tr(1,:,:) = lambda .* trF; % 1*l*m
dP3 = lm_tr .* reshape(FinvT, size(dF));
dP = dP1 + dP2 + dP3; % 4 * l * m
end