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

134 lines
3.6 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

clear;clc;;close all
tic
format short
E=210e9;%弹性模量单位Pa
u=0.4;%泊松比,无量纲
q=100;%外载荷面力单位N/㎡
t=0.1;%厚度单位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))];%应力应变矩阵
bt=(3+0.5407762)*10^51;%乘大数法的大数
DOF=2;%每个节点自由度
%定义每个单元的节点号
fname='M1.mphtxt';
[node, element] = Readmesh( fname );
%定义每个单元的节点号
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);%单元面积S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)
end
ele_num=length(element(:,1));%单元数
node_num=length(node(:,1));%节点数
%每个单元自由度在整体矩阵中的索引位置
ele_DOF=zeros(ele_num,DOF*3);
for i=1:ele_num
for j=1:length(element(i,:))%三角形三个节点循环
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);%单元刚度矩阵
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;%左边界
elseif node(i,1)==max_x
num2=num2+1;
force_side(num2)=i;%右边界
elseif node(i,2)==min_y
num3=num3+1;
const_side_x(num3)=i;%下边界
end
end
P=zeros(1,node_num*2);
for i=1:length(force_side)
P(force_side(i)*2-1)=q;%5/10是每个单元的长度
end
PZ=P';%总结点载荷列阵
%乘大数法施加约束条件,最左侧节点全部固定
for i=1:length(const_side_y)
cons_DOF_y(i)=[const_side_y(i)*2-1];%左边界对称边界条件
end
for i=1:length(const_side_x)
cons_DOF_x(i)=[const_side_x(i)*2];%下边界对称边界条件
end
cons_DOF=[cons_DOF_y,cons_DOF_x];
Disp=zeros(length(cons_DOF),1);%位移为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);%为了加快计算速度,采用稀疏矩阵进行计算
% a=KZ_xishu\PZ;%结点位移列阵
a=KZ\PZ;%结点位移列阵
for i=1:ele_num%80个单元
sgm(:,i)=stress_calculate(element,node,i,A,D,t,a);%单元应力
end
%重新排列位移矩阵
SF=1/5*1/max(abs(a));%位移放大系数
new_node=node+SF*reshape(a,2,length(a)/2)';%计算变形后的坐标
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
%应力
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)
%验证圆孔出13的mises应力比
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')