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