首页/文章/ 详情

详解有限元法中K、M和C矩阵的集成

2小时前浏览10
   

概述

       

该帖子重点讲解有限元法中单元刚度矩阵、质量矩阵和阻尼矩阵如何组装为模型的总体刚度矩阵。

首先采用MATLAB程序自编三维八节点单元,对标ABAQUS中的C3D8单元,采用了B-BAR修正以后,计算的结果与ABAQUS保持一致。然后修改INP文件,将ABAQUS的模型总体矩阵导出为可读文件,再读进MATLAB中,然后用ABAQUS的总体矩阵与自己计算的总体矩阵作对比。

设计悬臂梁一端受动荷载作用算例,自编程序采用newmark积分法,ABAQUS采用动力隐式分析步,对比模型关键点的位移、速度和加速度数据,最终计算结果保持一致。

矩阵的组装原理及程序讲解

     

如图所示,左边的小矩阵为单元刚度矩阵,假定为k,假定该单元刚度矩阵的节点编号为1~8,则单刚的大小为24x24,第P个节点的元素如图所示,则该节点元素在单元刚度矩阵中的位置是k(i:k,i:k);右边的矩阵为总体刚度矩阵,假定为K,假定模型的总节点数为N,则总体刚度矩阵的大小为K(3N,3N),则P节点对应的元素在总体刚度矩阵中的位置为:K(3P-2:3P,3P-2:3P),这样就建立了单元刚度矩阵中元素对应在总体刚度矩阵中的位置。下面给出了三种组装的方法,分别对应了不同教材中的理论,注释注明了来源。需要注意的是,对于质量矩阵和阻尼矩阵,有相同的组装方式。

   

对于下列程序,element为整个模型的单元节点编号,如第n个单元的节点编号为:element(n,:),kk则储存了模型所有单元的单刚,为三维数组,如第n个单元的单刚为:k(:,:,n)。

第一种组装方法依据的理论是将单刚节点对应的3x3矩阵放到总体刚度矩阵中,具体的程序如下:






















function KK=kkAssembly(element,kk)%  组装总刚max_node=max(max(element));KK=zeros(3*max_node,3*max_node);for i=1:size(element,1)    KK=KK+formKK(element(i,:),kk(:,:,i),max_node);endend%% % 按照自由度对应的分块组装方法,计算速度还可以function KK=formKK(element,kk,max_node)% 计算单元节点在全局刚度矩阵中的位置KK=zeros(3*max_node,3*max_node);for i=1:8    for ii=1:8        node1=element(1,i+1);                    node2=element(1,ii+1);        KK(3*node1-2:3*node1,3*node2-2:3*node2)=kk(3*i-2:3*i,3*ii-2:3*ii);    endendend
 

第二种组装方法的理论如下图:

   
   

具体的程序如下:


















function KK=kkAssembly(element,kk)%  组装总刚max_node=max(max(element));KK=zeros(3*max_node,3*max_node);for i=1:size(element,1)    KK=KK+formKK(element(i,:),kk(:,:,i),max_node);endend% 王勖成老师的《有限单元法》,清华大学出版社,第69页,式(2.2.53% function KK=formKK(element,kk,max_node)% G=zeros(8,2*max_node); % KK=zeros(2*max_node,2*max_node);% for i=1:4%     G(2*i-1:2*i,2*element(1,i+1)-1:2*element(1,i+1))=[1 0;0 1];% end% KK=G'*kk*G;% end
 

第三种组装方法理论为:

   

具体的程序为:


























function KK=kkAssembly(element,kk)%  组装总刚max_node=max(max(element));KK=zeros(3*max_node,3*max_node);for i=1:size(element,1)    KK=KK+formKK(element(i,:),kk(:,:,i),max_node);endend%% %% 采用编码法,朱院士的《有限单元法原理与应用》,第四版,第55页,表2-1% function KK=formKK(element,kk,max_node)% % 计算单元节点在全局刚度矩阵中的位置% KK=zeros(2*max_node,2*max_node);% Globalocation=zeros(1,size(element,2)-1);% for i=1:size(element,2)-1%     Globalocation(1,2*i-1)=2*element(1,i+1)-1;%     Globalocation(1,2*i)=2*element(1,i+1);% end% for i=1:8%     for ii=1:8%         KK(Globalocation(1,i),Globalocation(1,ii))=kk(i,ii);%     end% end% end%%
 

abaqus导出K、C和M

       

abaqus可以导出自身模型关键矩阵,如单元刚度矩阵、总体刚度矩阵、单元质量矩阵和总体质量矩阵等,但是目前无法通过cae界面完成操作,只能手动手改inp文件,只需要在inp文件中添加下方的代码即可导出上述矩阵





























**include,input=mo.inp***************************************************************************************输出单元刚度矩阵*Step, name=Emmkk*static 1.,1.,1e-05*File Format, ASCII*Element Matrix Output, Elset=Part-1-1.SET-1, File Name=EMass, Output File=User Defined, mass=yes*Element Matrix Output, Elset=Part-1-1.SET-1, File Name=EStiffness, Output File=User Defined, stiffness=yes*End Step***************************************************************************************输出总体刚度矩阵*Step, name=Gkk*MATRIX GENERATE, STIFFNESS*MATRIX OUTPUT, STIFFNESS, FORMAT=COORDINATE*End Step***************************************************************************************输出总体质量矩阵,集中质量阵*Step, name=Gmm*MATRIX GENERATE, mass*MATRIX OUTPUT, mass, FORMAT=COORDINATE*End Step  ***************************************************************************************输出总体阻尼矩阵,瑞丽阻尼*Step, name=Gcc*MATRIX GENERATE, VISCOUS DAMPING*MATRIX OUTPUT, VISCOUS DAMPING, FORMAT=COORDINATE*End Step    
 

算例

       

设计一悬臂梁悬臂端受简谐荷载算例,悬臂梁尺寸为10x10x40,弹性模量为1e10,泊松比为0.25,密度为2400,一端固定,另一端节点施加简谐动荷载,边界条件和荷载示意图为:

   

简谐荷载时程曲线为:

   

模型网格为:

   

对该计算模型设计三种工况作对比,三种工况的信息分别为:

1、ABAQUS计算,采用动力隐式分析步,计算总时长为10,固定增量步长为0.01,总增量步数为1000。记为工况一。

2、采用MATLAB完全自编C3D8单元,读取ABAQUS输出的单元节点和节点坐标信息,计算单元刚度矩阵(考虑B-BAR修正)、质量矩阵(集中质量矩阵)和阻尼矩阵(比例阻尼)并集成为总体矩阵,采用newmark时程积分法,计算总时长为10,固定增量步长为0.01,总增量步数为1000。记为工况二。

3、导出ABAQUS的总体矩阵,替换掉自编程序中的总体刚度矩阵,采用newmark时程积分法,计算总时长为10,固定增量步长为0.01,总增量步数为1000。记为工况三。

刚度矩阵、阻尼矩阵和质量矩阵对比

       

首先是自编程序计算的总体刚度矩阵数值的部分截图如下:

   

然后是ABAQUS导出的总体刚度矩阵数值的部分截图如下:

   

可以发现,计算结果是一致的。将两个矩阵做差记为KK,计算KK矩阵的1、2和无穷范数,结果分别为:0.000644803047180176、0.000345101701596316和0.000643551349639893。

计算结果说明自编程序组装的总体刚度矩阵和ABAQUA导出的矩阵是吻合的。质量矩阵他同样是相同的,具体见附件。单刚和质量计算无误,则阻尼一定是准确的。

位移、速度和加速度对比

       

提取悬臂端1节点编号位置的位移时程曲线如下图:

   

提取悬臂端1节点编号位置的速度时程曲线如下图:

   

结果分析

       

在计算精度方面,三种工况的计算结果是一致的。说明,自编C3D8单元能够达到ABAQUS的计算精度,位移数据吻合,说明后续的应变和应力数据也是吻合的,但是目前没有编制相应的程序做验证。而且说明了单元矩阵组装为模型总体刚度矩阵的程序是完全正确的。

在计算时长方面,目前的程序比ABAQUS计算的要快得多,但是这并不意味着自己编制的程序计算效率就一定超越了ABAQUS,这是不可能的。究其原因,是因为自己编制的程序只是简单的计算了最基础的数据,而且采用了最简单的饿newmark时程积分法,在增量步之间没有进行任何的收敛判断计算,这在线弹性小变形问题中是可以的,但是其他情况不适用;但是ABAUQS中的计算流程则极为复杂,包括计算前的矩阵预处理、矩阵求逆以及为了保证计算精度的处理、增量步之间的收敛判断等等等等,这些通用的计算步骤,占据了简单算例的大部分时间。

     
      

来源:有限元先生
Abaqus通用MATLAB理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-10-14
最近编辑:2小时前
外太空土豆儿
硕士 我们穷极一生,究竟在追寻什么?
获赞 2粉丝 0文章 30课程 0
点赞
收藏
作者推荐

基于ABAQUS UEL二次开发的比例边界有限法

零概述 分享一篇关于ABAQUS二次开发的文章,这是比例边界有限法与商业软件结合的第一篇文章,来自于CMAME期刊,很有意义,文章配套的有开源程序,方便学习。文章和开源程序的链接为https://www.sciencedirect.com/science/article/pii/S004578252100102X?via%3Dihubhttps://github.com/ShukaiYa/SBFEM-UEL 壹sbfem嵌入到abaqus中 比例边界有限元法基本理论在这里不做过多介绍,可参考相关文献。这里重点讲解比例边界有限元法如何通过UEL等子程序嵌入到ABAQUS中。有限元求解过程中,单元刚度矩阵的求解和组装是重中之重,这些过程经过商业软件的gui封装,我们已经看不到,只需要点击鼠标就能完成,看起来非常的简单,但这种简单是封装的结果,其内部程序是非常复杂的,abaqus软件主要将fem的算法封装到软件中,但随着有限元理论的发展,各种新型理论层出不穷。作为商业程序,abaqus需要迎合市场需求,因此,abaqus向从业者提供了一系列的二次开发接口,用户可以值只关注自己的科学问题,在编程的过程中能够大幅度的避免重复造轮子,将更多的精力用于优化自己专业部分的理论和程序。其中uel可用于实现刚度矩阵等计算,当abaqus主程序计算单元刚度矩阵的时候,abaqus不再调用自己内部的程序,而是调用用户开发的子程序 ,子程序执行结束会向主程序返回刚度矩阵、质量矩阵和阻尼矩阵等等,abaqus用于迭代求解。下面是文章给出的带有子程序的abaqus执行流程图 sbfem的优势之一是可以直接处理任意多面体的单元,如下面的单元 除了编写uel子程序,还需要手动修改inp文件,对于上面的多面体单元,inp文件中的代码为 其中,user element用于声明一个用户自定义单元,nodes指明了单元的节点数目,type相当于给这种单元指明了单元类型,u8中的数字8会以参数的形式传进子程序里面,可用于识别不同的单元类型,properties指的是单元的浮点型材料属性个数,coordinates代表该单元激活的自由度数目,variables是单元的状态变量个数,与单元的节点数目有关,详细的计算方法可查看文章正文。element用于声明单元的编号和单元节点信息,需要特别注意的是,后面的节点排序是非常有讲究的,我在另一篇帖子详细写过,具体可查看https://mp.weixin.qq.com/s?__biz=MzkwNTc1MDM1MA==&mid=2247483683&idx=1&sn=0750ac09ccc3e840b53be8aaf6213deb&chksm=c0f3b302f7843a14a3253499b92793560c8c467bdd762a7b78c58384fc110f061a53594ccfbf#rd 以六面体单元为例,在ABAQUS中,前四个节点和后四个节点分别组成了六面体的两个对面,其中第15、26、37和48节点是在同一条棱上的,而且要求第一个面的法向是指向单元内部的,那么后一个面的法向就是指向单元外部的,这样依靠节点的排序就可以重现单元的几何拓扑信息。但是在任意多面体中,上述排布方式就不能完全重现单元的几何拓扑信息,那就需要补充外部文件来导入数据,在编程的时候读取这个文件,为此,文章设计了一种txt文件用于补充说明信息, 这张图片就是上面两个多面体单元的txt文件,txt文件包括四种信息。首先是模型的节点坐标信息,这部分数据的第一行是模型的总体节点数目n,后面是n行节点的坐标。第二部分是模型的面信息,这部分数目的第一行是模型的总面数目,假如是一个六面体,那这个数目就是6,后面6行就是六面体的面节点信息,但是面节点信息是有顺序的,采用面的法向表示,即第四部分数据。第四部分数据的第一行是模型的单元总数n,后面是n行数据,每一行的第一个数字是该单元的面数目,后面的数字,是面在第三部分数据中的索引,前面的正负号则代表了面的法向,负号代表面法向是指向单元外部,反之则是指向单元内部。文章通过子程序UEXTERNALDB将上述txt数据导入到程序中,UEXTERNALDB子程序可以在分析的不同位置被调用,如分析开始前、分析进行中和分析结束等止时刻被调用。贰蒙皮单元实现面定义 因为软件的设计机制问题,目前的用户自定义单元并不能无缝的与abaqus自带功能相结合,如用户自定义单元无法施加面荷载、无法定义面,也无法完成单元的可视化和接触属性的定义。根本的原因是abaqus主程序无法得知用户自定义单元的形函数,因此面荷载无法插值到节点上面,也就无法定义面,则abaqus所有涉及到面的功能均无法在用户自定义单元上面使用,接触模型、界面模型也无法使用,为了解决这个问题,文章采用了蒙皮单元技术。蒙皮单元技术具体实行的操作非常的简单,只需要在用户自定义单元的节点上再嵌套一层abaqus自带的单元即可,称之为蒙皮单元,蒙皮单元属性需要设置为无限小,然后将面荷载定义在蒙皮单元上,或者在蒙皮单元上定义接触属性,后面的计算就可以顺利进行。蒙皮单元的原理涉及到运动方程。运动方程等号左边的刚度矩阵、质量矩阵和阻尼矩阵通过uel计算,因为蒙皮单元的材料属性无限小,因为对方程的左端量贡献可以忽略,右端力向量通过abaqus蒙皮单元提供,abaqus主程序将蒙皮单元的力转换到节点上面,而节点不区分用户自定义单元和abaqus内置单元。如下图所示 外部的六面体单元为用户自定义单元,内部的五面体单元为蒙皮单元,即abaqus自带的C3D5单元,这种单元从abaqus2017开始有,之前的版本没有,右面的代码为对应的inp文件,可以看到面定义是基于蒙皮单元的。蒙皮单元的形式不仅仅只有五面体,理论上来讲,abaqus所有内置的单元均可以作为蒙皮单元,只要保证蒙皮单元的节点与用户自定义单元重合、并且材料属性无限小即可。叁悬臂梁受动荷载算例 文章设计悬臂梁算例用与探究子程序在动力问题中的计算性能,悬臂梁一端为固定边界,另一端受动荷载,边界条件、荷载和网格示意图为 文章首先对上述模型进行动力特性分析,验证刚度矩阵和质量矩阵的计算精度,为后续的计算打基础,与abaqus对比,统计了自振频率为 可以发现,计算精度与abaqus相当,从右图发现sbfem的收敛速度是优于abaqus的。再对悬臂梁的悬臂端施加动荷载,荷载示意图为 在统计了悬臂梁悬臂端的下部中点的计算计算结果 观测点的加载向位移、速度和加速度数据与abaqus计算保持一致,初步验证了开发的子程序在动力计算中的计算效果。肆非匹配网格界面接触算例 文章设计了非匹配网格的接触分析算例。采用蒙皮单元技术定义界面接触属性,界面的主从面网格非匹配,与abaqus对比计算结果,模型加载和网格示意图为 统计了界面的应力数据,与abaqus对比的结果为 二者计算一致,初步说明开发的子程序在非匹配界面接触问题中的计算精度与abaqus吻合。伍沥青CT模型算例 设置以上算例的目标是探究子程序在小自由度问题中的计算精度,为了探究子程序在大规模计算中的稳定性,有必要进行进一步研究。文章以沥青混凝土的CT模型为例,CT模型的分辨率为200×200×200,共计539170个多面体单元,208880个cohesive单元,909402个节点,给模型顶部施加荷载,计算结果为 可以看到,在用户自定义单元中嵌入的cohesive单元成功参与计算,界面上清晰地产生了损伤。陆人体膝盖接触分析算例 文章将子程序应用到STL模型中,人体膝盖的STL模型为例 采用八叉树单元离散上述几何模型,模型的单元数目为253079 ,节点数目为361296, 绘制的网格为 在力的作用下,上部骨头向下移动,计算的位移云图为 直到与下部接触,中间的骨头在上下部的挤压下发生变形,中部骨头的应力为 柒结论 将基于SBFEM的多面体单元作为用户自定义单元在商业有限元软件ABAQUS中实现,实现过程涉及用户子程序UEXTERNALDB和UEL,分别用于存储多面体单元几何拓扑结构和执行多面体单元的计算。详细介绍了存储多面体网格和多面体单元几何拓扑所需的数据结构。结合比例边界有限元理论和abaqus计算框架,对UEL子程序计算流程进行了全面的解释。此外,提出了一种将abaqus内置单元叠加在SBFEM用户自定义单元上的改进方法来创建基于单元的面,有助于后续采用自定义单元研究界面接触问题。文章给出了一系列的算例,包括基准测试、动荷载计算、非匹配界面接触计算、基于CT和STL模型的大规模计算,最终的计算结果均与理论解或abaqus保持一致,表明了开发的子程序有良好的计算精度和计算稳定性。点击卡片 关注我们来源:有限元先生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈