首页/文章/ 详情

开源fem程序calculix中的线单元积分点讲解

5天前浏览25

概述

   开源程序calculix采用fortran语言编写,该程序自带前处理界面,从abaqus导出的inp文件可以直接被calculix读取计算,我在之前的帖子中讲过如何用calculix导入喷气发动机模型,下面是一个图片,有兴趣可以点击链接看看。  本次帖子学习开源fem程序calculix中的积分点子程序,子程序的名字为gauss.f,里面包含calculix所有单元的积分点数据,包括gauss积分和hammer积分,详细给出了低阶和高阶积分的积分点坐标和权重数据,下面详细讲解这个子程序。

子程序概况

  这个子程序在开始给出了一系列的注释,主要是说明这个子程序包含了所有单元的gauss和hammer数值积分点坐标以及对应的积分权重。如下所示

!
!contains Gauss point information
!
!gauss1d1: lin, 1-point integration (1 integration point)
!gauss1d2: lin, 2-point integration (2 integration points)
!gauss1d3: lin, 3-point integration (3 integration points)
!gauss2d1: quad, 1-point integration (1 integration point)
!gauss2d2: quad, 2-point integration (4 integration points)
!gauss2d3: quad, 3-point integration (9 integration points)
!gauss2d4: tri, 1 integration point
!gauss2d5: tri, 3 integration points
!gauss2d6: tri, 7 integration points
!gauss3d1: hex, 1-point integration (1 integration point)
!gauss3d2: hex, 2-point integration (8 integration points)
!gauss3d3: hex, 3-point integration (27 integration points)
!gauss3d4: tet, 1 integration point
!gauss3d5: tet, 4 integration points
!gauss3d6: tet, 15 integration points
!gauss3d7: wedge, 2 integration points
!gauss3d8: wedge, 9 integration points
!gauss3d9: wedge, 18 integration points
!gauss3d10: wedge, 6 integration points
!gauss3d11: wedge, 1 integration points
!gauss3d12: hex, 14 integration points (for c3d27)
!gauss3d13: hex, 2x5x5=50 integration points (for beams)
!gauss3d14: wedge, 1 integration point
!
!weight2d1,... contains the weights
!
!

  可见calculix中的单元大致可分为三类:线单元(line)、二维单元(2d)和三维单元(3d)。积分点的数据表示为:gaussxdy,其中,表达式里面的x代表单元的维度,当x=1时,单元是一维的,即线单元,以此类推;y代表积分点的个数;当y=1时,只采用一个积分点,以此类推,假如y=14,则说明单元采用了14个积分点。   下面我会在每一类单元中给出若干个单元的图示,包括单元的形状和积分点位置图示。

线单元积分公式

  根据等参元理论,在一维线单元中,刚度矩阵或者质量矩阵,总可以写成如下形式

 

  上述公式是连续的积分,如果无法导出解析解,那就无法直接用计算机求解,虽然一些简单的单元,如线单元和三角形单元可以将刚度矩阵解析求解,但为了通用性,我们还是经常采用数值求解,常常采用的数值积分有gauss积分和hammer积分,对于线单元的gauss积分有如下表达式

 

  其中    为积分点个数,    为积分点坐标对应的权重。下面就依次讲解calculix线单元的三种gauss积分方式。   

线单元(line)1点积分

  线单元的1个积分点坐标对应的代码为

      gauss1d1=reshape(( /0.d0/),(/1,1/))

  对应的权重代码为

      weight1d1=(/2.d0/)

  采用1个积分点计算线单元,则图示为  上面1个标有颜色的点,就是积分点的位置,根据等参元及数值积分的理论,当    时,有

 
 

线单元(line)2点积分

  线单元的2个积分点坐标对应的代码为

      gauss1d2=reshape(( /
     &  -0.577350269189626d0,0.577350269189626d0/),(/1,2/))

  对应的权重代码为

      weight1d2=(/1.d0,1.d0/)

  采用2个积分点计算线单元,则图示为

  上面两个标有颜色的点,就是积分点的位置,根据等参元及数值积分的理论,当    时,有

 
 

  对于质量    矩阵的求解,有类似的表达式,在此不过多赘述。

线单元(line)3点积分

  线单元的2个积分点坐标对应的代码为

      gauss1d3=reshape(( /
     & -0.774596669241483d0,0.d0,0.774596669241483d0/),(/1,3/))

  对应的权重代码为

      weight1d3=(/0.555555555555555d0,0.888888888888888d0,
     &  0.555555555555555d0/)

  采用3个积分点计算线单元,则图示为  上面3个标有颜色的点,就是积分点的位置,根据等参元及数值积分的理论,当    时,有

 
 
 

  对于质量    矩阵的求解,有类似的表达式,在此不过多赘述。

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

matlab一键式导入txt文件

概述  当我们需要处理的txt数据非常复杂,每一行的数据没有任何规律的时候,需要我们手动写程序抽取数据,有时候甚至需要用到字符串匹配的正则表达式。  但是如果我们的txt数据每一行的数据类型是一样的,而且每一行的数据个数和分割符号都是一样的,这时候就可以直接使用matlab提供的一键导入数据方法,而且matlab还能针对我们的数据生成定制化的函数,当下次再导入同一种txt数据的时候直接调用上一次生成的函数就行了。  帖子讲述一种不编程导入外部txt文件的方法,而且matlab自动生成函数,方便后续重复导入相同类型的人数据。matlab导入单元节点坐标  针对规律的txt文件,matlab提供了一键导入功能,如下图框框中的部分  这里以读取abaqus生成的C3D8单元的信息为例。我首先将模型的节点坐标拷贝到了外部的txt文件中,如下图  节点坐标信息每一行四个数据,数据之间用英文的逗号分割。是一种规律的数据,可以使用matlab的“导入数据”功能,点击这个功能按钮,选择我们的txt文件并打开,打开后的默认选择为  上图中矩形框中的选项就是需要调整的,其中最重要的有:分割文件、等宽、输出类型,导入所选内容。下面挨个讲解。  首先是分割文件和等宽,当我们打开数据时,默认是等宽,即matlab按照等宽度来分割识别txt中的数据,但是我们的节点坐标信息不符合等宽数据,那就调整到分割文件,以逗号形式,如下图所示  需要注意的是,我们的节点坐标信息是以逗号分割的,事实上分割文件的方式有很多种,如下图所示  如上图,matlab给我们提供了很多种选择,如:Tab键、逗号、空格和分号,甚至下面还有自定义分隔符,可以说matlab给我们导入数据提供了非常高的自由度。  下面再来调整输出类型,这个功能的位置如下图  这里选择的是数值矩阵,可以看到matlab同样提供了很多种输出类型,还有:表、列向量、元胞数组和字符串数组。  然后就是具体的导入选项了,同样有很多种导出的选择,如下图  这里提供了四种导入选项,其中,导入数据是直接将数据导入到内存中,生成函数是matlab针对目前的txt文件数据生成特定的函数,方便后来直接调用,至于生成实时脚本和生成脚本,用的不是很多,就不多说了。  这里首先展示直接导入数据后的效果,如下图所示,节点坐标信息直接导入到了matlab的内存中  如果我们选择了生成函数,matlab则会直接给出一个函数,我们可以直接复 制,今后再导入节点坐标信息的时候直接调用即可,如下图所示  全部的matlab程序为function node = importfile(filename, dataLines)%IMPORTFILE 从文本文件中导入数据% NODE = IMPORTFILE(FILENAME)读取文本文件 FILENAME 中默认选定范围的数据。 返回数值数据。%% NODE = IMPORTFILE(FILE, DATALINES)按指定行间隔读取文本文件 FILENAME% 中的数据。对于不连续的行间隔,请将 DATALINES 指定为正整数标量或 N×2 正整数标量数组。%% 示例:% node = importfile("C:\Users\nnn\Desktop\FEM\info\C3D8\node.txt", [1, Inf]);%% 另请参阅 READTABLE。%% 由 MATLAB 于 2024-12-21 20:11:09 自动生成%% 输入处理% 如果不指定 dataLines,请定义默认范围if nargin < 2 dataLines = [1, Inf];end%% 设置导入选项并导入数据opts = delimitedTextImportOptions("NumVariables", 4);% 指定范围和分隔符opts.DataLines = dataLines;opts.Delimiter = ",";% 指定列名称和类型opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4"];opts.VariableTypes = ["double", "double", "double", "double"];% 指定文件级属性opts.ExtraColumnsRule = "ignore";opts.EmptyLineRule = "read";% 导入数据node = readtable(filename, opts);%% 转换为输出类型node = table2array(node);end matlab导入单元节点信息  下面我再读取C3D8单元的单元节点信息,六面体单元的节点信息如下图  每一行有九个数据,数据之间用逗号分割,是有规律的数据,可以用matlab的导入数据功能。将节点以导入数据的形式导入到内存后,在matlab中显示为  如果以生成函数的形式导入数据,则如下图所示  全部的代码为function element = importfile(filename, dataLines)%IMPORTFILE 从文本文件中导入数据% ELEMENT = IMPORTFILE(FILENAME)读取文本文件 FILENAME 中默认选定范围的数据。 返回数值数据。%% ELEMENT = IMPORTFILE(FILE, DATALINES)按指定行间隔读取文本文件 FILENAME% 中的数据。对于不连续的行间隔,请将 DATALINES 指定为正整数标量或 N×2 正整数标量数组。%% 示例:% element = importfile("C:\Users\nnn\Desktop\FEM\info\C3D8\element.txt", [1, Inf]);%% 另请参阅 READTABLE。%% 由 MATLAB 于 2024-12-21 20:33:49 自动生成%% 输入处理% 如果不指定 dataLines,请定义默认范围if nargin < 2 dataLines = [1, Inf];end%% 设置导入选项并导入数据opts = delimitedTextImportOptions("NumVariables", 9);% 指定范围和分隔符opts.DataLines = dataLines;opts.Delimiter = ",";% 指定列名称和类型opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4", "VarName5", "VarName6", "VarName7", "VarName8", "VarName9"];opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double"];% 指定文件级属性opts.ExtraColumnsRule = "ignore";opts.EmptyLineRule = "read";% 导入数据element = readtable(filename, opts);%% 转换为输出类型element = table2array(element);end   是不是还挺方便的!  但是任何方法都都有它自己的适用范围,这种方式只能适用那些规则的数据,即每一行的数据个数相同,数据之间的分隔符号相同。如果是复杂的字符文本文件,那就非得用matlab的正则表达式进行字符操作了。来源:有限元先生

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