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.
 
 
 
 

50 lines
1.5 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2021-11-26 18:33:42
% @LastEditTime: 2022-05-10 16:03:36
%--------------------------
function [U, c_psi, c_regulated] = simulation_CBN_hex(e1, e0, penal, freedofs, F, iK_ma, jK_ma, ...
microx, ke0, iK_mi, jK_mi, edofMat_mi, dofid, bdofs_num, bezier_B, c_rho)
order1 = reshape(edofMat_mi', [], 1);
new_iK = dofid(iK_mi);
new_jK = dofid(jK_mi);
nele = size(c_rho, 1);
c_psi = cell(nele, 1);
parfor ele = 1 : nele
rho = c_rho{ele};
sK1 = reshape(ke0(:) * (e0 + rho(:)'.^penal * (e1 - e0)), [], 1);
K = sparse(new_iK, new_jK, sK1(:));
K = (K + K') / 2;
M = assembleM2(bdofs_num, K, bezier_B); % [i,v] = M * B
R = [bezier_B; M]; % [ndofs, v]
R1 = R(dofid(order1), :); % [24*nele, v]
R2 = reshape(R1, 24, microx^3, []); % [24, m, v]
psi1 = permute(R2, [1,3,2]); % [24, v, m]
psi2 = permute(psi1, [2,1,3]); % [v,24, m]
sK2 = reshape(sK1, 24, 24, []); % [12,12,m]
Ke0 = mtimesx(mtimesx(psi2, sK2), psi1); % [3v,3v,m]
Ke1 = squeeze(sum(Ke0, 3)); % [3v,3v], each ele is different
sK_ma(:, ele) = Ke1(:);
c_psi{ele} = psi1;
c_regulated{ele} = R;
end
K = sparse(iK_ma, jK_ma, sK_ma(:));
K = (K + K')/2;
% nvar = size(K, 1);
% S = spdiags(repmat(1e-5, nvar, 1),0,nvar,nvar);
% K = K + S;
U = zeros(size(F));
U(freedofs,:) = K(freedofs,freedofs)\F(freedofs,:);
end