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.
 
 
 
 

60 lines
1.8 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2021-12-07 09:13:42
% @LastEditTime: 2021-12-08 13:54:13
%--------------------------
function [dc, dv] = sensitivity_cvt_simp(area_cell, rho_cell, psi_cell, sK_cell, ...
nfaces_local, v_local, edofMat, U, e0, e1, penal, optVcons, area0, area_regulator)
ncvt = size(rho_cell, 1);
nele_global = sum(nfaces_local);
dc = zeros(nele_global, 1);
pn = 16; % p-norm for volume fraction
dpnorm = 1/ncvt * (mean(v_local.^pn))^(1/pn-1) * (v_local.^(pn-1)); % [N, 1]
dv_r = dpnorm .* area_regulator;
dv = zeros(nele_global, 1);
% for local fine mesh
nfaces_local(2 : ncvt + 1) = nfaces_local;
nfaces_local(1) = 0;
for ele = 1 : ncvt
%% compliance sensitivity
psi1 = psi_cell{ele}; % [6, 2v, m]
psi2 = permute(psi1, [2,1,3]); % [2v, 6, m]
nvdofs = size(psi2, 1);
sK0 = sK_cell{ele}; % [36, m]
rho = rho_cell{ele};
sK1 = sK0 .* (penal * rho(:)'.^(penal-1) * (e1 - e0));
sK2 = reshape(sK1, 6,6,[]); % [6,6,m]
Ke0 = mtimesx(mtimesx(psi2, sK2), psi1); % [2v,2v,m]
% Ke1 = squeeze(sum(Ke0, 3)); % [2v,2v], each ele is different
Ke1 = reshape(Ke0, nvdofs, []); % [2v, 2v*m]
edof = edofMat{ele};
ue = U(edof); % [2v,1]
dc1 = ue' * Ke1; % [1, 2v*m]
dc2 = reshape(dc1, nvdofs, [])'; % [m,2v]
dc3 = dc2 * ue; % [m, 1]
idx_begin = sum(nfaces_local(1:ele)) + 1;
idx_end = sum(nfaces_local(1:ele+1));
dc(idx_begin : idx_end) = dc3;
%% volume
area = area_cell{ele};
switch optVcons
case 'pnorm'
dv(idx_begin : idx_end) = dv_r(ele) * area / sum(area);
case 'overall'
dv(idx_begin : idx_end) = area / area0;
end
end
end