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