%-------------------------- % @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