首页/文章/ 详情

有限元网格怎么逆向成几何实体

14小时前浏览5

写在前面

  做过有限元分析的家人们第一眼看到这个题目,内心里的第一想法是:有限元网格转实体?倒反天罡!这不是在扯淡么!“有限元先生”怎么变成了“扯淡先生”?
  能有这个想法非常好,说明家人已经熟练的掌握批判了,而人不能没有批判精神,就像吃蛋挞不能不撒胡椒面。
  但是,家人们就不想知道我是怎么一本正经的扯淡吗?

概述

  帖子给有限元网格转几何实体提供了一条思路,即:将网格处理为stl文件,然后在stl文件的基础上重建几何实体。帖子首先分析了stl文件的数据组织方式,然后讲解了abaqus中的C3D4单元的表面抽取方式,最终以C3D4单元和C3D8单元为例,在matlab平台编制程序,将四面体和六面体网格处理为stl数据,最后将重建的几何实体划分网格,验证了思路的正确性。

stl文件格式

  STL(Stereolithography)文件是一种常用的三维模型文件格式,主要用于3D打印和计算机辅助设计(CAD)。该文件通过仅仅记录几何实体的表面记录几何信息,但是要保证记录的表面必须是水密表面,否则就会报错。
  stl文件通常有两种方式:二进制格式和字符型格式,其中,二进制格式不可以直接读,需要借助程序或者专用的商业软件读写,而字符型格式可以直接用文本编辑器打开查看,这两种格式各有优劣,本次帖子主要以字符型为例讲解stl文件的格式。
  stl文件将几何实体的表面分割成大量的三角面片,面片的数量决定了stl文件的精度,stl文件的关键就是记录这些三角面片,下面是一个三角面片。  首先是三个角点的坐标,就是九个浮点数字,然后是三角面片的外法向量,这个“外”是相对于几何实体的内部来讲的,即法向量的指向和三个节点的排布顺序要满足右手法则。所以,记录一个三角面片需要十二个浮点数字。一个完整的stl文件如下所示  下面是一些需要注意的地方

  • facet normal和 outer loop中都有空格, end开头的关键字都没有空格。
  • 缩进必须用空格,不允许使用 tab。
  • 符号       表示大括号中的内容可以重复一次或多次。
  • 斜体符号是要替换为用户指定值的变量。
  • 平面法线和顶点线中的数值数据是单精度浮点数,例如 1.23456E+789。
  • 面法线坐标可能有一个前导减号; 顶点坐标可能不会。
  • 外法向量是归一化后的向量。

C3D4单元面抽取

  abaqus中的一阶四面体单元的节点排布顺序非常有讲究,事实上每一个单元的节点排布都有说道,我在之前的帖子讨论过怎么搞清楚abaqus的节点排布顺序,这里只介绍如何抽取C3D4单元的面信息。下面是一个一阶四面体单元  如果家人曾经给模型施加过面荷载,而且仔细瞅过inp文件的话,当然,假如你没有看过也没有关系,因为我会掰着手指头给你讲清楚,学不会别说看过我的帖子。abaqus给一阶四面体单元定义面的时候,通常会有这样的关键字,

*Elset, elset=_water_S3, internal
...
...
*Elset, elset=_water_S2, internal
...
...
*Elset, elset=_water_S4, internal
...
...
*Elset, elset=_water_S1, internal
...
...
*Surface, type=ELEMENT, name=water
_water_S3, S3
_water_S2, S2
_water_S4, S4
_water_S1, S1

  相信家人们看到“s1”那几个关键字,顿时好奇心就起来了,那是什么玩意儿?   

        我们知道,在有限元中,无论是什么荷载,都需要换算到节点上,因此,节点的抽取至关重要!abaqus的cae工程师就设计出通过抽取单元的面来抽取节点的方式,上面的四个面就对应了四面体的四个面,而每个具体的面又对应了了节点排布里面的节点编号。
  假如上面的四面体单元节点的排布顺序为

40,1,2,3,4

  那么,这个四面体的四个面就分别为

s1-123
s2-142
s3-243
s4-341

  好了,上面是C3D4单元的面抽取方式,C3D8单元的抽取方式我就不赘述了,留给你们当家庭作业了,明天抽查。

例子

  下面以一个三维坝体-库水-地基的模型为例(这东西很难搞,别向我要,我不给)。下面是这个几何模型的示意  这里我们首先把它划分成C3D4网格,或者C3D8网格,都无所谓,搞清楚了abaqus的面抽取方法,都好写程序,这里以C3D4和C3D8单元为例。下面是整体网格。  下面是地基的网格,采用C3D4单元离散。  下面是拱坝坝体的网格,采用C3D8单元离散。  下面是库水的网格,同样采用C3D8单元离散。  然后,在matlab平台编制程序,将上述的C3D4和C3D8混合的网格处理为stl文件,将坝体、库水和地基分成三个部分创建stl,下面是坝体的stl文件剖面

  下面是库水的stl文件剖面。

  下面是地基的stl文件剖面。  现在有了stl文件,下面就是重建实体了。这部分工作的解决方案并不唯一,可以通过一些软件将stl转成实体文件之后再导入进有限元软件中画网格,如stp和igs等等,也可以直接在stl文件的基础上画网格。这里就直接在stl文件的基础上画网格了,starccm可以直接剖分stl形式的几何实体,我在starccm中采用切割体画网格。下面是划分的整体网格。  你会发现,黑乎乎的,什么都看不见!难道这条帖子我真的是在扯淡!?但是,如果我切开这个网格呢?      仔细观察剖面,发现程序创建的stl文件成功的被starccm划分成了切割体网格,说明了帖子的思路是正确的,将stl文件作为桥梁来把有限元网格逆向成几何实体的思路是可行的。

来源:有限元先生

Abaqus网格处理MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-12-26
最近编辑:14小时前
外太空土豆儿
博士 我们穷极一生,究竟在追寻什么?
获赞 23粉丝 4文章 66课程 0
点赞
收藏
作者推荐

高效稳定!在Abaqus子程序中如何使用MKL数学运算库

Abaqus是知名的非线性有限元求解器,其以强悍稳定的非线性求解性能,相对方便的前处理操作界面,强大的二次开发功能在国内和国际获得了广泛的用户,无论是学术研究,还是工程应用,Abaqus均有一席之地。对于Abaqus来说,使用Fortran或其他语言进行二次开发极为常见,通过二次开发,我们可以一定程度上参与到Abaqus的“内核”计算中。比如,通过Umat用户材料子程序,可以实现Abaqus中没有而我们又需要的材料本构;或者是,通过编写Umat子程序实现Abaqus中已有的材料本构与Abaqus自带的材料本构进行对标,从而方便我们验证对该材料本构理论的掌握程度;通过UEL自定义单元,我们可以开发自己需要的单元类型。通过Dload,可以实现我们需要的分布压力的加载。在编写子程序时,通常情况下会遇到一些矩阵向量运算。如果我们采用的是Fortran,对于这些运算可能有一些比较方便的操作,例如矩阵向量乘,矩阵-矩阵乘等。当然,在Abaqus自带的例子中,这部分运算通常还是用循环表达的,比如下面的应力与应变关系的运算:DO 70 K1=1,NTENSDO 60 K2=1,NTENSSTRESS(K2)=STRESS(K2)+DDSDDE(K2,K1)*DSTRAN(K1)60 CONTINUE70 CONTINUE 如果我们使用Fortran的matmul来完成,则只需要一行,当然这里的Dstran需要定义为二维数组而非一维数组:STRESS=STRESS+matmul(DDSDDE,DSTRAN)除了上述这种常规的矩阵向量乘,矩阵矩阵乘这种基础操作之外,在实际中,子程序的运算还可能涉及一些更为复杂的操作,比如矩阵求逆,方程组求解,特征值求解等等。此时,如果自己手动去写这部分的代码当然可以,但是更方便的是调库。MKL库就给了我们一个不错的选项。MKL库是Intel公司开发的数学函数库,其提供了一系列用于数值计算的Fortran和C语言接口如blas,lapack,pardiso等,用户通过调用MKL可以高效并行地完成矩阵乘法,线性方程组求解,FFT快速傅里叶变换等工作,具有优秀的计算性能。通过在Abaqus子程序中调用MKL库,我们可以通过MKL库强悍稳定的求解性能省去了很多基础运算的编写。在之前的文章Fortran77还有前途吗?-Intel MKL的Fortran77接口和C接口使用 和如何快过matlab?-MKL数值计算库的Fortran95接口使用及MKL文档下载 中,我们实际上已经介绍了MKL的基本使用和文档的下载链接,本文主要讲如何在Abaqus的Fortran子程序中调用MKL库,(目前仅仅成功配置了MKL库的Fortran77接口,Fortran95接口后续再进行)。在Fortran子程序中调用MKL库主要有以下几步:在代码中编写调用MKL库的代码。例如:上面这句代码就是调用mkl库中的dasum这个函数对stress这个一维数组各个元素求和,并输出到.log文件中或者是打印到屏幕。在mkl中这个函数的函数原型和参数解释如下:2.修改win86_64.env的配置文件使得子程序能够识别mkl的函数:打开安装目录下的”win86_64.env”文件,这个文件包含了使用子程序时的编译链接选项的配置。文件的位置大致如下:打开后,在”compile_fortran”项下增加'/Qmkl'选项:在”link_sl”和”link_exe”项下增加对应的.lib库文件,一般需要增加以下几个:这里的.lib库文件的位置在mkl的安装目录下,具体可自行文件搜索获得。要注意如果是安装的是OneApi,在mkl下有两个路径:这里虽然实际上两个路径是一个路径,latest实际上是一个快捷方式到2022.1.0,但是我试了一下如果在”link_sl”和”link_exe”项中填写2022.1.0,会识别不出来2022这个数字,因此最好是填latest,正如上面图中所示。3.保存.env文件,abaqus子程序使用mkl库已经配置成功,通过命令行直接运行或者界面提交即可。以上,介绍了如何在Abaqus子程序中使用MKL库,感谢您的阅读。来源:有限元先生

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