平面三角形单元Matlab程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%变量说明
%NPOIN NELEM NVFIX NFORCE NNODE
%总结点数,单元数,受约束边界点数,结点力数, 单元结点数
%COORD LNODS YOUNG POISS THICK %结构结点坐标数组,单元定义数组,弹性模量,泊松比,厚度
%FORCE FIXED BMA TX DMATX SMATX %节点力数组,约束信息数组,单元应变矩阵,单元弹性矩阵,单元应力矩阵%AREA HK ASLOD ASDISP FP1
%单元面积,总体刚度矩阵,总体荷载向量,结点位移向量,数据文件指针format short e
clear
FP1=fopen('C:\Users\Administrator\Desktop\input.txt','rt');
NPION=fscanf(FP1,'%d',1); %结点个数(结点编码总数)NELEM=fscanf(FP1,'%d',1); %单元个数(单元编码总数)NFORCE=fscanf(FP1,'%d',1); %结点荷载个数
NVFIX=fscanf(FP1,'%d',1); %受约束边界点数
YOUNG=fscanf(FP1,'%e',1); %弹性模量
POISS=fscanf(FP1,'%f',1); %泊松比
THICK=fscanf(FP1,'%d',1); %厚度
LNODS=fscanf(FP1,'%d',[3,NELEM])'; %单元定义数组(单元结点号)COORD=fscanf(FP1,'%f',[2,NPION])'; %结点坐标数组
FORCE=fscanf(FP1,'%f',[3,NFORCE])'; %结点力数组
FIXED=fscanf(FP1,'%d',[3,inf])'; %约束信息数组
%引用所需的全局变量
%global NPION NELEM COORD LNODS YOUNG POISS
%global BMA TX DMATX SMA TX AREA
%生成弹性矩阵D
a=YOUNG/(1-POISS^2);
DMATX(1,1)=1*a;
DMATX(1,2)=POISS*a;
DMATX(2,1)=POISS*a;
DMATX(2,2)=1*a;
DMATX(3,3)=(1-POISS)*a/2;
for i=1:NELEM; %i为当前所计算的单元号
%计算当前单元的面积
AREA=det([1 COORD(LNODS(i,1),1) COORD(LNODS(i,1),2);...
1 COORD(LNODS(i,2),1) COORD(LNODS(i,2),2);...
1 COORD(LNODS(i,3),1) COORD(LNODS(i,3),2);])/2;
end
%生成应变矩阵B
for j=0:2
b(j+1)=COORD(LNODS(i,(rem((j+1),3))+1),2)-COORD(LNODS(i,(rem((j+2),3))+1),2);
c(j+1)=-COORD(LNODS(i,(rem((j+1),3))+1),1)+COORD(LNODS(i,(rem((j+2),3))+1),1);
end
BMA TX=[b(1) 0 b(2) 0 b(3) 0;...
0 c(1) 0 c(2) 0 c(3);...
c(1) b(1) c(2) b(2) c(3) b(3)]/(2*AREA);
SMA TX=DMATX*BMATX; %求应力矩阵S=D*B
% 所引用的全局变量:
%global NPION NELEM NVFIX LNODS ASTIF THICK
%global BMA TX SMA TX AREA FIXED
HK=seros(2*NPION,2*NPION); %张成特定大小总刚矩阵并置0
for i=1:NELEM
EK=BMA TX'*SMATX*THICK*AREA; %求解单元刚度矩阵
a=LNODS(i,:); %临时向量,用来记录当前单元的节点编号
for j=1:3
for k=1:3
HK((a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)=HK((a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)+EK(j*2-1:j*2,k* 2-1:k*2);
%跟据节点编号对应关系将单元刚度分块叠加到总刚矩阵中
end
end
end
%将约束信息加入总刚(置0置1法)
NUM=1; %计数器(当前已分析的节点数)
i=0; %计数器(当前已处理的约束数)
tmp(NVFIX)=0; %临时存被约束的序号
while i for j=-1:0 if FIXED(NUM,j+3)==1 %若发现约束 i=i+1; %计数器自增 tmp(i)=FIXED(NUM)*2+j; %求约束序号 end end NUM=NUM+1; end for i=1:NVFIX HK(1:2*NPION,tmp(i))=0; %将一约束序号处的总刚列向量清0 HK(tmp(i),1:2*NPION)=0; %.将一约束序号处的总刚行向量清0 HK(tmp(i),tmp(i))=1; %将行列交叉处的元素置为1 end %所需引用的全局变量 %global ASLOD NPION NFORCE FORCE ASLOD(1:2*NPION)=0; %张成特定大小的0向量 for i=1:NFORCE ASLOD((FORCE(i,1)*2-1):FORCE(i,1)*2)=FORCE(i,2:3); end %将有约束处的荷载置为0 NUM=1; i=0; tmp(NVFIX)=0; while i for j=-1:0 if FIXED(NUM,j+3)==1 i=i+1; tmp(i)=FIXED(NUM)*2+j; end end NUM=NUM+1; end for i=1:NVFIX ASLOD(tmp(i))=0; end ASDISP=HK\ASLOD'; %计算结点位移向量 %所引用的全局变量 %global NELEM NPION SMA TX ASDISP LNODS ELEDISP(1:6)=0; %当前单元的结点位移向量for i=1:NELEM for j=1:3