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.
56 lines
1.6 KiB
56 lines
1.6 KiB
3 years ago
|
%--------------------------
|
||
|
% @Author: Jingqiao Hu
|
||
|
% @Date: 2021-12-07 09:13:42
|
||
|
% @LastEditTime: 2022-05-10 11:12:32
|
||
|
%--------------------------
|
||
|
function [dc, dv] = sensitivity_cvt_hex(c_dH, c_interEles, c_rho, c_psi, ...
|
||
|
edofMat, U, e0, e1, penal, ke0, nelx, nely, nelz, lx)
|
||
|
|
||
|
nele = size(c_rho, 1);
|
||
|
dc_local = cell(nele, 1);
|
||
|
|
||
|
parfor ele = 1 : nele
|
||
|
%% compliance sensitivity
|
||
|
psi1 = c_psi{ele}; % [12, 3v, m]
|
||
|
psi2 = permute(psi1, [2,1,3]); % [3v, 12, m]
|
||
|
nvdofs = size(psi2, 1);
|
||
|
|
||
|
rho = c_rho{ele};
|
||
|
|
||
|
sK1 = reshape(ke0(:) * (e0 + rho(:)'.^penal * (e1 - e0)), [], 1);
|
||
|
sK2 = reshape(sK1, 24,24,[]); % [12,12,m]
|
||
|
|
||
|
Ke0 = mtimesx(mtimesx(psi2, sK2), psi1); % [3v,3v,m]
|
||
|
Ke1 = reshape(Ke0, nvdofs, []); % [3v, 3v*m]
|
||
|
|
||
|
edof = edofMat(ele, :);
|
||
|
ue = U(edof); % [3v,1]
|
||
|
|
||
|
dc1 = ue' * Ke1; % [1, 3v*m]
|
||
|
dc2 = reshape(dc1, nvdofs, [])'; % [m,3v]
|
||
|
dc_local{ele} = dc2 * ue; % [m, 1]
|
||
|
end
|
||
|
|
||
|
npnts = size(c_dH, 1);
|
||
|
dcdp = zeros(npnts, 4);
|
||
|
dvdp = zeros(npnts, 4);
|
||
|
|
||
|
vol0 = nelx * nely * nelz * lx^3;
|
||
|
vol1 = lx^3;
|
||
|
|
||
|
parfor i = 1 : npnts
|
||
|
for j = 1:4
|
||
|
dH_ele = c_dH{i,j};
|
||
|
interEles = c_interEles{i,j};
|
||
|
nnb = length(interEles);
|
||
|
|
||
|
for k = 1 : nnb
|
||
|
ele = interEles(k);
|
||
|
dcdp(i, j) = dcdp(i, j) + sum(dc_local{ele} .* dH_ele{k});
|
||
|
dvdp(i, j) = dvdp(i, j) + sum(vol1 / vol0 .* dH_ele{k});
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
dc = reshape(dcdp', [], 1);
|
||
|
dv = reshape(dvdp', [], 1);
|
||
|
end
|