首页/文章/ 详情

有限元基础知识:关于接触的事

3小时前浏览3

接触分析在众多有限元分析中是一个比较特殊的领域,大部分有限元算法(教科书上那些)研究连续体内部的应力应变、整体变形等。而接触分析则是研究两个或多个物体(自接触另说)之间的作用关系。另外呢大部分有限元的书,商业软件的理论文档都对接触这里描述的不多。我呢有幸在计算接触力学领域耕耘多年,打算今天先做一个引子,引出未来一步步给大家说的接触分析相关内容。

接触搜索

接触首先的第一步是要分析两个物体哪里发生接触,这个在显式分析和隐式分析中会有些不同,集中体现在:

  1. 显式中,已经穿透的就是发生接触的区域
  2. 隐式中,可能在这步中发生穿透的要检测出来,用于之后的计算

但是两者都离不开一个核心诉求,那就是接触搜索(找到发生接触或者潜在发生接触的区域),这个过程呢与其说是个有限元的过程,其实更接近于图形学也就是CG的那些知识。最简单但却不可用的方法,就是穷举,将主面m个单元和从面n个单元所有单元都建立一个接触单元用于后续分析,那么算下来程序内部就会有     个接触单元对,耗时耗力,根本不可行。所以为了解决这样的问题,我们就要引出一些技术以快速的进行接触搜索,常见的有:

  1. bucket sorting
  2. BVH (boundary volume hierarchy):通常就是指大家常说的八叉树、k-d tree、binary tree 等
  3. Postion code:给每个单元附上一个code,然后通过code去查询单元附近的单元,只在这个范围内搜索

总之呢要么就是对空间进行划分,要么就是对单元去进行排序,然后一个原则就是,两个接触面中     个接触单元对中大部分真实情况下是绝对不可能接触的,接触检测的时候也没必要去搜索他们,提高效率与降低存储空间。

接触有限元计算

当搜索完了可能的接触对之后,我们进行局部的一些投影、分割等,进行真正的接触有限元计算部分,也就是说形成一些刚度矩阵、载荷向量,这个过程中,我们主要会有两类方法的区别:

  1. 点对面
  2. 面对面

这里的两种方法指的是接触的离散方法,并不是说点对面只能用于点和面的接触,其实在用户层面都可以选择两个面进行接触。之前写过这个的文章,可以看:

结构仿真小知识:点对面及面对面

当选定了这两种方法中的任何一种后,我们都会面临一个问题,那就是如何施加如下的接触约束:

 

由于接触问题之于有限元麻烦的就在于,传统有限元本质上是一个优化问题(求能量最小),而接触分析则是一个约束优化问题(在接触约束的情况下,求能量最小),那么我们就要引入一些方法来实现上述的接触约束,总体上有:

  1. 罚函数法(penalty)
  2. 拉格朗日乘子法(LM)
  3. 增广拉格朗日乘子法(Augmented LM)
  4. 内点法以及其他约束优化的方法其实都可以用

事情还没结束

OK,至此如果你正确、且高效的完成了接触搜索、使用某种离散方式构建了接触的关系,通过某种约束方法写出了其刚度矩阵和载荷向量的贡献,那么理论上你是可以求解一个接触问题的。然而事实往往事与愿违(大部分论文绝对不会说这部分,只有鲜花),我们往往会遇到算法稍微算个复杂点的问题就不收敛、算出来的应力、接触力、支座反力上蹿下跳一点不平稳、过盈配合根本算不了等等问题。当然这些问题都有答案,但涉及很多细节的打磨,比如:

  1. 针对点对面算法,应力、接触力上窜下跳就可以换面对面算法,还是一股脑的选择点对面呢,就可以用光顺化(Smoothing)技术以去除由于有限元离散造成一些影响,甚至可以采用基于IGA,NURBS的边界描述进行接触分析
  2. 针对有些高阶单元,并不适合用在接触分析中,提出适合接触分析的高阶单元算法
  3. 面对面Mortar法实现起来比较麻烦,很多人又提出了各种变形,而对mortar法中各种离散格式也有各种变形
  4. 为了提高收敛性对penalty系数的自动选择、对分析步步长进行更为细节的自动控制
  5. 引入多种摩擦本构模型,来更容易更准确的模拟真实情况
  6. 对于自接触分析增加诸多判断、更快更正确的进行几何搜索
  7. 对过盈配合施加渐进式过盈配合与自定义曲线等
  8. ......

总的来说接触分析是一个资料特别少、算法基础要求挺高、且条条大路可能都通罗马,但是要在路上自己对付各条路上的盗贼的领域,没有哪条道路一路顺风,我希望在未来给大家详细展开说一说这方面的内容,不求最学术最理论、但求在计算接触力学这个领域最直接、最真实可用。

来源:大狗子说数值模拟
UGUM理论控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-04-24
最近编辑:3小时前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 7粉丝 13文章 54课程 0
点赞
收藏
作者推荐

使用cmake构建C++和Fortran

cmake是一个先进的现代化构建工具,其可以通过编写CMakeLists.txt文件,产生不同平台,支持不同编译器的构建文件,简化了不同平台的项目的编译和构建过程。实际上,不少开源软件均采用Cmake进行构建。本文首先介绍在用命令行的方式编译和运行C++和Fortran程序,然后用最基本的例子表明如何采用Cmake进行构建。在Windows系统下,在安装编译器时,通常会把编译器的安装路径写到系统环境变量里,这样我们可以直接在命令行里用编译器的exe名称启动程序。例如,在本机上安装了Vs和oneAPI2025,其中vs包含了对于C和C++的编译器cl.exe,打开oneApi安装目录下的命令提示符窗口,输入”cl”即可运行cl.exe,oneAPI包含了C++编译器icl.exe和Fortran编译器ifort.exe,因此输入相应的目录即可运行相应的编译器。这样,只要我们有了源代码,就可以直接在命令行里运行,不需要打开vs创建项目:编译器自带就把代码编译成了exe,接下来直接输入text1.exe即可运行。上面这种命令行的方式很简单,对于单个程序时也很方便,如果有多个程序,将多个程序直接写在后面即可,如“cltest1.cppa1.cppa2.cpp”当程序中调用了外部库时,我们当然依然可以采用命令行的方式来编译。但是,配置include路径,设置库文件的目录例如.lib等就很麻烦,而通过Cmake,编写一次CmakeLists文件,我们后续就可以不用重复设置,避免重复工作。在Windows下,安装好cmake后,我们可以通过打开cmake-gui用界面来进行cmake构建操作,也可以用命令行的方式进行构建。以下是一个例子:编写好源程序文件和CMakeLists.txt://cmake-test1.cpp#include<iostream>intmain(intargc,charconst*argv[]){std::cout<<"thisiscmake-test1\n";return0;}CMakeLists.txt中的内容:cmake_minimum_required(VERSION3.31.5)project(cpp1)add_executable(test1cmake-test1.cpp)在cmakeLists.txt共有3行内容,第一行是表明编译时cmake的最小版本,第二行创建了一个叫cpp1的项目,第3行是把cmake-test1.cpp文件加入到项目里,生成一个test1.exe的可执行文件。运行cmake-gui.exe,设置下cpp文件所在路径和希望生成的文件的路径,在先后点击Configure和Generate,就会在build目录下生成相应的解决方案文件。用vs打开cpp1.sln,把test1项目设为启动项目,即可运行。以上,即是对于C++采用cmake进行构建的过程。看起来似乎流程并不简要,但是实际上对于大型工程,能够简化不少。对于Fortran构建,一般还需要在CMakeLists中添加对Fortran的支持:cmake_minimum_required(VERSION3.31.5)project(fortran1)enable_language(Fortran)add_executable(cmake1fortran-cmake1.f90)上面是用Cmake构建C++和Fortran项目中的最基础例子,当然实际中CMAKE还有更多的知识需要学习,例如如何添加头文件路径,添加依赖库,指定各种编译选项,指定编译器等。在下一篇推文中,我们将介绍如何用Cmake工具完成大型稀疏矩阵特征值求解开源库Arpack的编译安装。以上,即是本文的全部内容,感谢您的阅读来源:大狗子说数值模拟

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