FEM-Course-Matlab/7.小孔应力集中问题matlab有限元编程/main.m

134 lines
3.6 KiB
Mathematica
Raw Permalink Normal View History

2024-01-28 16:46:36 +00:00
clear;clc;;close all
tic
format short
E=210e9;%<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λPa
u=0.4;%<EFBFBD><EFBFBD><EFBFBD>ɱȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
q=100;%<EFBFBD><EFBFBD><EFBFBD>غɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λN/<EFBFBD>O
t=0.1;%<EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>λm
D=[E/(1-u^2),u*E/(1-u^2),0;u*E/(1-u^2),E/(1-u^2),0;0,0,E/(2*(1+u))];%Ӧ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bt=(3+0.5407762)*10^51;%<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
DOF=2;%ÿ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>Ľڵ<EFBFBD><EFBFBD><EFBFBD>
fname='M1.mphtxt';
[node, element] = Readmesh( fname );
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>Ľڵ<EFBFBD><EFBFBD><EFBFBD>
for i=1:length(element(:,1))
x1=node(element(i,1),1);
x2=node(element(i,2),1);
x3=node(element(i,3),1);
y1=node(element(i,1),2);
y2=node(element(i,2),2);
y3=node(element(i,3),2);
A(i)=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);%<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)
end
ele_num=length(element(:,1));%<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
node_num=length(node(:,1));%<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>
%ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
ele_DOF=zeros(ele_num,DOF*3);
for i=1:ele_num
for j=1:length(element(i,:))%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ѭ<EFBFBD><EFBFBD>
ele_DOF(i,1+2*(j-1):2+2*(j-1))=2*(element(i,j)-1)+1:2*(element(i,j)-1)+2;
end
end
KZ=zeros(node_num*2,node_num*2);
for i=1:ele_num
ke=ele_stiff_matrix(element,node,i,A,D,t);%<EFBFBD><EFBFBD>Ԫ<EFBFBD>նȾ<EFBFBD><EFBFBD><EFBFBD>
KZ(ele_DOF(i,:),ele_DOF(i,:)) = KZ(ele_DOF(i,:),ele_DOF(i,:))+ke;
end
%find constrained side and force side
num=0;
num2=0;
num3=0;
for i=1:node_num
min_x=min(node(:,1));
max_x=max(node(:,1));
min_y=min(node(:,2));
if node(i,1)==min_x
num=num+1;
const_side_y(num)=i;%<EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>
elseif node(i,1)==max_x
num2=num2+1;
force_side(num2)=i;%<EFBFBD>ұ߽<EFBFBD>
elseif node(i,2)==min_y
num3=num3+1;
const_side_x(num3)=i;%<EFBFBD>±߽<EFBFBD>
end
end
P=zeros(1,node_num*2);
for i=1:length(force_side)
P(force_side(i)*2-1)=q;%5/10<EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
end
PZ=P';%<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
%<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʩ<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
for i=1:length(const_side_y)
cons_DOF_y(i)=[const_side_y(i)*2-1];%<EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><EFBFBD>ԳƱ߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end
for i=1:length(const_side_x)
cons_DOF_x(i)=[const_side_x(i)*2];%<EFBFBD>±߽<EFBFBD><EFBFBD>ԳƱ߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end
cons_DOF=[cons_DOF_y,cons_DOF_x];
Disp=zeros(length(cons_DOF),1);%λ<EFBFBD><EFBFBD>Ϊ0
for i=1:length(cons_DOF)
KZ(cons_DOF(i),cons_DOF(i))=bt*KZ(cons_DOF(i),cons_DOF(i));
PZ(cons_DOF(i))=Disp(i)*KZ(cons_DOF(i),cons_DOF(i));
end
KZ_xishu=sparse(KZ);%Ϊ<EFBFBD>˼ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>
% a=KZ_xishu\PZ;%<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
a=KZ\PZ;%<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for i=1:ele_num%80<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ
sgm(:,i)=stress_calculate(element,node,i,A,D,t,a);%<EFBFBD><EFBFBD>ԪӦ<EFBFBD><EFBFBD>
end
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ƾ<EFBFBD><EFBFBD><EFBFBD>
SF=1/5*1/max(abs(a));%λ<EFBFBD>ƷŴ<EFBFBD>ϵ<EFBFBD><EFBFBD>
new_node=node+SF*reshape(a,2,length(a)/2)';%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
figure
patch('Faces',element,'Vertices',node,'FaceColor','none','EdgeColor','r')
hold on;
patch('Faces',element,'Vertices',new_node,'FaceColor','none')
xlabel('x-coordinate')
ylabel('y-coordinate')
title('deformation')
axis equal
%Ӧ<EFBFBD><EFBFBD>
figure
patch('Faces',element,'Vertices',node,'FaceVertexCData',sgm(1,:)','FaceColor','flat','EdgeColor','none')
axis equal
xlabel('x-coordinate')
ylabel('\sigma (Pa)')
title('\sigma_{11}')
colorbar
colormap(jet)
%<EFBFBD><EFBFBD>֤Բ<EFBFBD>׳<EFBFBD>1<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>misesӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
node_ID1=10818; %(0.1,0)
node_ID2=12373;%(0,0.1)
ele1=find(element(:,2)==node_ID1);
ele2=find(element(:,2)==node_ID2);
mises1=sqrt((sgm(1,ele1)+sgm(2,ele1))^2-3*(sgm(1,ele1)*sgm(2,ele1)-sgm(3,ele1)^2));
mises2=sqrt((sgm(1,ele2)+sgm(2,ele2))^2-3*(sgm(1,ele2)*sgm(2,ele2)-sgm(3,ele2)^2));
ratio=mises2/mises1
toc
% figure
% patch('Faces',element,'Vertices',node,'FaceVertexCData',sgm(2,:)','FaceColor','flat')
% axis equal
% colorbar
% colormap(jet)
% title('sigma22')
% figure
% patch('Faces',element,'Vertices',node,'FaceVertexCData',sgm(3,:)','FaceColor','flat')
% xlabel('x-coordinate')
% ylabel('\sigma (Pa)')
% axis equal
% colorbar
% colormap(jet)
% title('sigma12')