104 lines
3.6 KiB
Matlab
104 lines
3.6 KiB
Matlab
|
|
clear all;clc;close all;
|
|
E=210000; %弹性模量
|
|
u=0.3; %泊松比
|
|
D=E/((1+u)*(1-2*u))*[1-u u u 0 0 0;......
|
|
u 1-u u 0 0 0;......
|
|
u u 1-u 0 0 0;......
|
|
0 0 0 (1-2*u)/2 0 0;......
|
|
0 0 0 0 (1-2*u)/2 0;......
|
|
0 0 0 0 0 (1-2*u)/2];%elastic modules matrix
|
|
load nodes_and_elements.mat
|
|
Forces=[7 2 -100;10 2 -100;12 2 -100;13 2 -100;14 2 -100;]; %[nodeID direction value]
|
|
ConID=[2, 3, 5, 8, 36, 37, 38, 61, 62, 63, 64, 87, 88, 89, 90, 91......
|
|
92, 93, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260];
|
|
Constraints=zeros(size(ConID,2)*3,3);
|
|
for i=1:size(ConID,2)
|
|
Constraints(3*i-2:3*i,:)=[ConID(i) 1 0;ConID(i) 2 0;ConID(i) 3 0;];%[nodeID direction value];
|
|
end
|
|
Dof=3; %每个节点三个自由度
|
|
NodeNum = size(Nodes,1); % 节点个数
|
|
ElementNum= size(Elements,1); %单元个数
|
|
Dofs = Dof*NodeNum; %总自由度数
|
|
U=sparse(Dofs,1); % 初始化结构位移(空矩阵),利用稀疏矩阵提高计算速度
|
|
K = sparse(Dofs,Dofs); %初始化总体刚度阵(空矩阵)
|
|
F = sparse(Dofs,1); %初始化外力向量(空矩阵)
|
|
|
|
for I=1:ElementNum
|
|
% 单元节点坐标
|
|
ElementNodeCoordinate=Nodes(Elements(I,:),:);
|
|
% 计算单元刚度矩阵
|
|
ElementStiffnessMatrix=Ke_C3D4(D,ElementNodeCoordinate);
|
|
% 计算单元节点自由度编号
|
|
ElementNodeDOF=zeros(1,12);
|
|
for J=1:4
|
|
II=(J-1)*Dof+1;
|
|
ElementNodeDOF(II:II+2)=(Elements(I,J)-1)*Dof+1:(Elements(I,J)-1)*Dof+3;
|
|
end
|
|
%整体刚度矩阵组装
|
|
K(ElementNodeDOF,ElementNodeDOF)=K(ElementNodeDOF,ElementNodeDOF)+ElementStiffnessMatrix;%根据单元节点自由度 组装总刚
|
|
end
|
|
% 施加外力
|
|
if size(Forces,1)>0
|
|
ForceDOF = Dof*(Forces(:,1)-1)+Forces(:,2); %计算外力自由度编号,第一列为节点号,第二列为方向编号
|
|
F(ForceDOF) = F(ForceDOF) + Forces(:,3);
|
|
end
|
|
% 乘大数法(罚函数法)施加位移约束
|
|
BigNumber=1e8;
|
|
ConsNum=size(Constraints,1);
|
|
if ConsNum~=0
|
|
FixedDof=Dof*(Constraints(:,1)-1)+Constraints(:,2); %被约束的自由度编号(列向量)
|
|
for i=1:ConsNum
|
|
K(FixedDof(i),FixedDof(i))=K(FixedDof(i),FixedDof(i))*BigNumber;
|
|
F(FixedDof(i))=Constraints(i,3)*K(FixedDof(i),FixedDof(i));
|
|
end
|
|
end
|
|
%计算位移
|
|
U = K\F;
|
|
% 输出结果
|
|
%计算高斯点、节点应力应变值
|
|
[NodeStrain,NodeStress]=NodeStressStrain(U,D,Nodes,Elements);
|
|
%求得MISES应力矩阵
|
|
ElementNodeCount=4;% 每个单元节点数
|
|
MISES=zeros(1,ElementNum*ElementNodeCount);
|
|
for I=1:ElementNum*ElementNodeCount
|
|
MISES(I)=sqrt(0.5)*sqrt((NodeStress(1,I)-NodeStress(2,I))^2+(NodeStress(1,I)-NodeStress(3,I))^2+....
|
|
(NodeStress(2,I)-NodeStress(3,I))^2+6*(NodeStress(4,I)^2+NodeStress(5,I)^2+NodeStress(6,I)^2));
|
|
end
|
|
|
|
newNodes=Nodes';
|
|
newNodes=newNodes(:);
|
|
SF=5.0e2; %变形放大系数
|
|
newNodes=newNodes+SF*U;
|
|
newNodes=reshape(newNodes,[3,size(Nodes,1)]);
|
|
newNodes=newNodes';
|
|
% 绘制原始网格和变形网格叠加图
|
|
for i=1:1:size(Elements,1)
|
|
points=Nodes(Elements(i,:),:);
|
|
deformed_points=newNodes(Elements(i,:),:);;
|
|
mesh=1:1:4;%网格信息
|
|
%四面体单元节点坐标
|
|
vertices_matrix = [points(mesh(1,:),1),points(mesh(1,:),2),points(mesh(1,:),3)];
|
|
deformed_vertices_matrix=[deformed_points(mesh(1,:),1),deformed_points(mesh(1,:),2),deformed_points(mesh(1,:),3)];
|
|
%四面体单元节点顺序
|
|
faces_matrix= [1 2 4;2 3 4;3 1 4;1 3 2];%给出每个面的节点序号
|
|
patch('vertices', vertices_matrix,'faces',faces_matrix,'facecolor','g','FaceAlpha',.5);
|
|
view(3);hold on%绘图
|
|
patch('vertices', deformed_vertices_matrix,'faces',faces_matrix,'facecolor','r','FaceAlpha',.5);
|
|
|
|
end
|
|
axis equal
|
|
view(3);
|
|
alpha(1);
|
|
|
|
|
|
%绘制Umag云图
|
|
Umag=zeros(NodeNum,1);
|
|
for i=1:NodeNum
|
|
Umag(i)=sqrt(U(3*i-2)^2+U(3*i-1)^2+U(3*i)^2);
|
|
end
|
|
PostContour(Nodes,Elements,U,Umag)
|
|
title('Umag')
|
|
%绘制MISES云图
|
|
PostContour(Nodes,Elements,U,MISES)
|
|
title('Mises') |