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.
58 lines
2.0 KiB
58 lines
2.0 KiB
%--------------------------
|
|
% @Author: Jingqiao Hu
|
|
% @Date: 2021-12-07 09:13:42
|
|
% @LastEditTime: 2022-01-29 20:35:31
|
|
|
|
% sensitivity on align-CVT of MMC
|
|
% dcdp = dcdH * dHdp
|
|
%--------------------------
|
|
function [c_dH, c_interEles] = sensitivity_mmc_align(c_nodes, c_tets, seeds0, step, T, ...
|
|
epsilon, conn_list, c_rho, c_phi, c_interPolySeed, nelx, nely, nelz, microx,optDesign)
|
|
|
|
npnts = size(seeds0, 1);
|
|
c_dH = cell(npnts, 4);
|
|
c_interEles = cell(npnts, 4);
|
|
|
|
seeds = [seeds0, T];
|
|
|
|
parfor i = 1 : npnts
|
|
|
|
neighbor = conn_list{i};
|
|
local_idx = int32([neighbor; i]);
|
|
|
|
for j = 1:4
|
|
% tic
|
|
% minus
|
|
seeds_minus = seeds;
|
|
seeds_minus(i, j) = seeds_minus(i, j) - step;
|
|
|
|
% only update the neighbor cells
|
|
[~,~, edges, c_nnbEdgeIDX, c_nnbSeedIDX] = intersection_info(seeds_minus(:,1:3), ...
|
|
local_idx, nelx, nely, nelz, microx ,optDesign);
|
|
MMCs = update_MMCs(edges, seeds_minus(:,4), c_nnbSeedIDX);
|
|
|
|
[rhoMinus, ~] = update_projection(c_nodes, c_tets, MMCs, ...
|
|
epsilon, c_rho, c_phi, c_nnbEdgeIDX, c_interPolySeed, local_idx);
|
|
|
|
% plus
|
|
seeds_plus = seeds;
|
|
seeds_plus(i, j) = seeds_plus(i, j) + step;
|
|
|
|
[~,~, edges, c_nnbEdgeIDX, c_nnbSeedIDX] = intersection_info(seeds_plus(:,1:3), ...
|
|
local_idx, nelx, nely, nelz, microx,optDesign);
|
|
MMCs = update_MMCs(edges, seeds_plus(:,4), c_nnbSeedIDX);
|
|
|
|
[rhoPlus, interEles] = update_projection(c_nodes, c_tets, MMCs, ...
|
|
epsilon, c_rho, c_phi, c_nnbEdgeIDX, c_interPolySeed, local_idx);
|
|
|
|
nnb = length(interEles);
|
|
dH_ele = cell(nnb, 1);
|
|
for k = 1 : nnb
|
|
ele = interEles(k);
|
|
dH_ele{k} = (rhoPlus{ele} - rhoMinus{ele}) / 2 / step;
|
|
end
|
|
c_dH{i,j} = dH_ele;
|
|
c_interEles{i,j} = interEles;
|
|
end
|
|
end
|
|
end
|