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.6 KiB
50 lines
1.6 KiB
11 months ago
|
%%%%%%%%%% 3D FEM with brick element %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
function [U]=FEM_Beam(nx,ny,nz,ke_all)
|
||
|
N = 3*(nx+1)*(ny+1)*(nz+1);
|
||
|
% K = sparse(N, N);
|
||
|
nele=nx*ny*nz;
|
||
|
si=zeros(1,nele*24^2);
|
||
|
sj=zeros(1,nele*24^2);
|
||
|
sv=zeros(1,nele*24^2);
|
||
|
|
||
|
for elx = 1:nx
|
||
|
for ely = 1:ny
|
||
|
for elz = 1:nz
|
||
|
% n1 = (nz+1)*(ny+1)*elx + (nz+1)*(ely-1) + elz;
|
||
|
% n2 = n1 - (nz+1)*(ny+1);
|
||
|
n2 = (nz+1)*(ny+1)*elx + (nz+1)*(ely-1) + elz;
|
||
|
n1 = n2-(nz+1)*(ny+1);
|
||
|
n3 = n1 + (nz+1);
|
||
|
n4 = n2 + (nz+1);
|
||
|
n5 = n1 + 1;
|
||
|
n6 = n2 + 1;
|
||
|
n7 = n3 + 1;
|
||
|
n8 = n4 + 1;
|
||
|
edof = [3*n1-2; 3*n1-1; 3*n1;
|
||
|
3*n2-2; 3*n2-1; 3*n2;
|
||
|
3*n3-2; 3*n3-1; 3*n3;
|
||
|
3*n4-2; 3*n4-1; 3*n4;
|
||
|
3*n5-2; 3*n5-1; 3*n5;
|
||
|
3*n6-2; 3*n6-1; 3*n6;
|
||
|
3*n7-2; 3*n7-1; 3*n7;
|
||
|
3*n8-2; 3*n8-1; 3*n8];
|
||
|
ne=(elx-1)*ny*nz+(ely-1)*nz+elz;
|
||
|
si((ne-1)*24^2+1:ne*24^2)=kron(ones(1,24),edof.');
|
||
|
sj((ne-1)*24^2+1:ne*24^2)=kron(edof.',ones(1,24));
|
||
|
ke=ke_all(:,:,elz,ely,elx);
|
||
|
sv((ne-1)*24^2+1:ne*24^2)=ke(:);
|
||
|
% K(edof,edof) = K(edof,edof) + ke_all(:,:,elz,ely,elx);
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
K = sparse(si,sj,sv,N,N);
|
||
|
|
||
|
loadnodes=nx*(ny+1)*(nz+1)+1:nz+1:(nx+1)*(ny+1)*(nz+1)-nz;
|
||
|
loaddofs = loadnodes(:).*3;
|
||
|
F = zeros(N,1); F(loaddofs) = -1;
|
||
|
fixeddofs = [1:3*(ny+1)*(nz+1)];
|
||
|
alldofs = [1:N];
|
||
|
freedofs = setdiff(alldofs,fixeddofs);
|
||
|
U = zeros(N,1);
|
||
|
U(freedofs,:) = K(freedofs,freedofs) \ F(freedofs,:);
|
||
|
end
|