平面三角形单元常应变单元matlab程序地编制.doc
三角形常应变单元程序的编制与使用有限元法是求解微分方程边值问题的一种通用数值方法,该方法是一种基于变分法或变分里兹法而开展起来的求解微分方程的数值计算方法,以计算机为手段,采用分片近似,进而逼近整体的研究思想求解物理问题。有限元分析的根本步骤可归纳为三大步:结构离散、单元分析和整体分析。开始输入初始数据生成单刚集成总刚施加约束信息生成荷载向量边界条件处理计算结点位移计算单元应力计算结果整理完毕对于平面问题,结构离散常用的网格形状有三角形、矩形、任意四边形,以三个顶点为节点的三角形单元是最简单的平面单元,它较矩形或四边形对曲边边界有更好的适应性,而矩形或四边形单元较三节点三角形有更高的计算精度。Matlab语言是进展矩阵运算的强大工具,因此,用Matlab语言编写有限元中平面问题的程序有优越性。本章将详细介绍如何利用Matlab语言编制三角形常应变单元的计算程序,程序流程图见图1。有限元法中三节点三角形分析结构的步骤如下:1) 整理原始数据,如材料性质、荷载条件、约束条件等,离散结构并进展单元编码、结点编码、结点位移编码、选取坐标系。2) 单元分析,建立单元刚度矩阵。3) 整体分析,建立总刚矩阵。4) 建立整体结构的等效节点荷载和总荷载矩阵5) 边界条件处理。6) 解方程,求出节点位移。7) 求出各单元的单元应力。8) 计算结果整理。计算结果整理包括位移和应力两个方面;位移计算结果一般不需要特别的处理,利用计算出的节点位移分量,就可画出结构任意方向的位移云图;而应力解的图1 程序流程图误差表现在单元内部不满足平衡方程,单元与单元边界处应力一般不连续,在边界上应力解一般与力的边界条件不相符合。1.1 程序说明%*% 三角形常应变单元求解结构主程序%* l 功能:运用有限元法中三角形常应变单元解平面问题的计算主程序。l 根本思想:单元结点按右手法如此顺序编号。l 荷载类型:可计算结点荷载。l 说明:主程序的作用是通过赋值语句、读取和写入文件、函数调用等完成算法的全过程,即实现程序流程图的程序表达。%-1 程序准备format short e%设定输出类型clear all%去除所有已定义变量clc%清屏l 说明:format short e 设定计算过程中显示在屏幕上的数字类型为短格式、科学计数法; clear all 去除所有已定义变量,目的是在本程序的运行过程中,不会发生变量名一样等可能使计算出错的情况; clc 清屏,使屏幕在本程序运行开始时%-2 全局变量定义global NNODE NPION NELEM NVFIX NFORCE COORD LNODS YOUNG POISS THICKglobal FORCE FIXED global BMATX DMATX SMATX AREA global ASTIF ASLOD ASDISPglobal FP1l 说明:NNODE单元结点数,NPION总结点数, NELEM单元数,NVFIX受约束边界点数,NFORCE结点力数,COORD结构结点坐标数组,LNODS单元定义数组,YOUNG弹性模量,POISS泊松比,THICK厚度 FORCE 节点力数组(n,3) n:受力节点数目,(n,1):作用点,(n,2):x方向,(n,3):y方向; FIXED 约束信息数组(n,3) n:受约束节点数目, (n,1):约束点 (n,2)与(n,3)分别为约束点x方向和y方向的约束情况,受约束为1否如此为0 BMATX单元应变矩阵(3*6), DMATX单元弹性矩阵(3*3),SMATX单元应力矩阵(3*6),AREA单元面积 ASTIF总体刚度矩阵,ASLOD总体荷载向量,ASDISP结点位移向量FP1数据文件指针3 打开文件FP1=fopen('input.txt','rt'); %打开输入数据文件 存放初始数据l 说明:FP1=fopen('input.txt','rt'); 打开已存在的输入数据文件input.txt,且设置其为只读格式,使程序在执行过程中不能改变输入文件中的数值,并用文件句柄FP1来执行FP2=fopen('output.txt','wt');打开输出数据文件,该文件不存在时,通过此命令创建新文件,该文件存在时如此将原有内容全部删除。该文件设置为可写格式,可在程序执行过程中向输出文件写入数据。%-4 读入程序控制信息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)' %单元定义数组单元结点号l 说明:建立LNODS矩阵,该矩阵指出了每一单元的连接信息。矩阵的每一行针对每一单元,共计 NELEM;每一列相应为单元结点号编码、按逆时针顺序输入。命令中,3,NELEM表示读取NELEM行3列数据赋值给LNODS矩阵。显然,LNODS(i,1:3)依次表示i单元的i,j,k结点号。COORD=fscanf(FP1,'%f',2,NPION)' %结点坐标数组l 说明:建立COORD矩阵,该矩阵用来存储各结点x,y方向的坐标值。从FP1文件中读取全部结点个数NPOIN的坐标值,从1开始按顺序读取。COORD(i,1:2)表示第i个结点的x,y坐标。FORCE=fscanf(FP1,'%f',3,NFORCE)' %结点力数组l 说明: (n,3) n:受力结点数目,(n,1):作用点,(n,2):x方向,(n,3):y方向FIXED=fscanf(FP1,'%d',3,inf)' %约束信息数组l 说明: (n,3) n:受约束节点数目, (n,1):约束点 (n,2)与(n,3)分别为约束点x方向和y方向的约束情况,受约束为1否如此为0l 总体说明:从输入文件FP1中读入结点个数,单元个数,结点荷载个数,受约束边界点数,弹性模量,泊松比,厚度,单元定义数组,结点坐标数组,结点力数组,约束信息数组;程序中弹性模量仅输入了一个值,明确本程序仅能求解一种材料构成的结构,如:钢筋混凝土结构、钢结构,不能求解钢筋混凝土钢组合结构。infinite采用了命令fscanf,其中:%d表示读入整数格式,%f'表示读入浮点数;1表示读取1个数,A,B形式表示读A行B列数组,A,B表示将A,B转置,inf表示正无穷。%-5 调用子程生成单刚,组成总刚并参加约束信息 ASSEMBLE()%-6 调用子程生成荷载向量 FORMLOAD()%-7 计算结点位移向量 ASDISP=ASTIFASLOD'%-8调用子程计算单元应力 WRITESTRESS()%*9 关闭输出数据文件 fclose(FP2);%*读取ASSEMBLE 子程%*function ASSEMBLE()% 所引用的全局变量:global NPION NELEM NVFIX LNODS ASTIF THICK global BMATX SMATX AREA FIXED%- -% 计算单刚并生成总刚 ASTIF(1:2*NPION,1:2*NPION)=0; %X成特定大小总刚矩阵并置0l 说明:Array stiffness建立单元刚度矩阵ASTIF,该矩阵的行列数均为2*NPION ,NPION表示结点数,每个结点有两个方向的力和位移。%- for i=1:NELEM FORMSMATX(i) %调用应力子程序 ESTIF=BMATX'*SMATX*THICK*AREA; %求解单元刚度矩阵 a=LNODS(i,:); %临时向量,用来记录当前单元的节点编号 for j=1:3 for k=1:3ASTIF(a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)=ASTIF(a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)+ESTIF(j*2-1:j*2,k*2-1:k*2); %跟据节点编号对应关系将单元刚度分块叠加到总刚矩阵中 end endendl 说明:FORMSMATX(i)调用应力子程序,提取i单元的应力矩阵SMATX;a=LNODS(i,:)记录i单元的三个结点编号;forend循环语句表示行从1到3循环,列从1到3循环,将单刚中的元素叠加至总刚中:ASTIF(a(j)*2-1):a(j)*2,(a(k)*2-1):a(k)*2)表示总刚中第a(j)*2-1到:a(j)*2行,第a(k)*2-1到a(k)*2列的元素由单刚中第j*2-1到j*2行,第k*2-1到k*2列的元素叠加而得,a(j)*2即将单元中的位移编码对应到整体的位移编码。%-%将约束信息参加总刚置0置1法NUM=1; %计数器(当前已分析的节点数)NVFIX:受约束边界点数 i=0; %计数器(当前已处理的约束数) tmp(NVFIX)=0; %临时存被约束的序号while i<NVFIX for j=-1:0 if FIXED(NUM,j+3)=1 %假如发现约束temporary i=i+1; %计数器自增 tmp(i)=FIXED(NUM)*2+j; %求约束序号 end end NUM=NUM+1;endl 说明:tmp(NVFIX)=0,形成一个元素值均为0的一行,NVFIX列的行向量,执行while语句,首先判断i是否小于控制数据NVFIX,假如小于如此往下进展,假如不小于如此退出。执行for语句,FIXED(NUM,j+3)表示约束信息数组中第NUM行,第j+3列的元素,j从-1到0,即j+3表示2到3列,即约束信息数组中描述结点x和y方向受约束的情况,判断FIXED(NUM,j+3)假如等于1,如此约束数自增,假如不等于1如此跳出。FIXED(NUM)表示FIXED(NUM,1),tmp(i)=FIXED(NUM)*2+j计算整体约束序号,将序号放入tmp行向量中的i列。%-for i=1:NVFIX ASTIF(1:2*NPION,tmp(i)=0; %将一约束序号处的总刚列向量清0 ASTIF(tmp(i),1:2*NPION)=0; %.将一约束序号处的总刚行向量清0 ASTIF(tmp(i),tmp(i)=1; %将行列交叉处的元素置为1 endl 说明:后处理法中置0置1法,设包括,如此将总刚中的主元素K jj换为1,j行和j列的其他元素均改为零。%*% 读取FORMSMATX子程%* function FORMSMATX(ELEMENT) %计算应力矩阵%引用所需的全局变量global NPION NELEM COORD LNODS YOUNG POISSglobal BMATX DMATX SMATX AREA%-%生成弹性矩阵Da=YOUNG/(1-POISS2); 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;l 说明: 平面应力问题的弹性矩阵,其中,E为弹性模量,为泊松比。%-i=ELEMENT; %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;l 说明:det表示求矩阵行列式的值,其中分别表示一个三角形单元的三个节点坐标。MATLAB中假如一行中无法写下一个完整的命令,如此可以在行尾参加3个连续的英文句号,表示命令余下的局部在下一行出现。%- %生成应变矩阵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 BMATX=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);l 说明:应变矩阵rem表示求余函数,remx,y命令返回的是x-n.*y,当y0时,n=fix(x./y),其中fix为最近的整数取整。%-SMATX=DMATX*BMATX; %求应力矩阵S=D*B%*% 读取FORMLOAD子程%* function FORMLOAD() %本子程生成荷载向量%-%所需引用的全局变量global ASLOD NPION NFORCE FORCE%-ASLOD(1:2*NPION)=0; %X成特定大小的0向量l 说明:ASLOD为总体荷载向量,每个结点有x,y两个方向的结点力。%- for i=1:NFORCE ASLOD(FORCE(i,1)*2-1):FORCE(i,1)*2)=FORCE(i,2:3); endl 说明:FORCE(i,1)为作用点,FORCE(i,2:3)为x,y方向的结点力。%-%将有约束处的荷载置为0 NUM=1; i=0; tmp(NVFIX)=0; while i<NVFIX for j=-1:0 if FIXED(NUM,j+3)=1 i=i+1; tmp(i)=FIXED(NUM)*2+j; end end NUM=NUM+1; endfor i=1:NVFIX ASLOD(tmp(i)=0; endl 说明:置0置1法,同上。%*ASDISP=ASTIFASLOD' %计算结点位移向量%*% 读取WRITESTRESS子程%* function WRITESTRESS()%求解内力,即两个方向的正应力与一个剪应力)%- %所引用的全局变量 global NELEM NPION SMATX ASDISP LNODS%-ELEDISP(1:6)=0; %当前单元的结点位移向量l 说明:ELEDIS为单元的结点位移%- for i=1:NELEM for j=1:3 ELEDISP(j*2-1:j*2)=ASDISP(LNODS(i,j)*2-1:LNODS(i,j)*2); end FORMSMATX(i) % %调用子程求应力矩阵 i STRESS=SMATX*ELEDISP' %求内力 endl 说明:通过循环,依次从结构位移列阵中对号,赋值给第i个单元的单元位移向量ELEDISP。%-1.2 程序应用举例【例1】利用三角形三节点常应变单元程序计算图2所示的结构。设弹性模量,泊松比为0,厚度为1。 %-输入数据文件input.txt为:6 4 1 6 1.0e0 0.0 13 1 25 2 43 2 5 6 3 5 图2 1 0 -11 1 02 1 04 1 15 0 16 0 1%-说明:第一行:读入程序控制信息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)' %结点坐标值,第1列为x坐标值,第2列为y坐标值第十一行:读入结点荷载信息FORCE=fscanf(FP1,'%f',3,NFORCE)' %结点号,X向结点荷载数值,Y向结点荷载数值与坐标轴方向一致为正第十二、十六行:读入零位移信息FIXED=fscanf(FP1,'%d',3,inf)' %结点号,X向约束,Y向约束%-1.3 程序的改良要点上述三角形三节点程序反映了有限元的根本思路,可以计算简单的平面应力或平面应变问题。在熟练掌握了程序的编制与使用后,可在以下几方面对程序进展改良,以加深对矩阵位移法与MATLAB语言编程的理解:1、本程序的弹性模量仅能输入一个数值,意味着程序仅能计算由同种材料构成的结构。考虑如何改良使程序可计算由不同材料构成的组合结构。2、本程序仅能计算结点集中荷载类型,考虑如何编制体积力、外表力、跨中集中力等类型的程序。3、考虑如何编制有支座位移的程序。4、本程序最后的结果没有生成输出文件,可以编制输出文件。5、本程序计算的应力没有进展结果处理,可以编制最后结果处理的程序。6、可以在此程序根底上编制三角形六节点、四边形四节点等程序。综上所述,本章的三角形三节点常应变程序表现了如何将有限元法的计算方法和过程用MATLAB程序语言表达出来,重点放在程序架构和流程的建立以与算法实现方面,主要依赖手工操作手工输入初始数据前处理、手工绘制计算结果后处理,目的是使学生能够清晰、明确地掌握有限元法的根本理论和概念,熟练掌握应用MATLAB语言编制、修改和调试简单程序的能力。