首页/文章/ 详情

有限元基础知识:空间箱排序(bucket sorting)

4小时前浏览0

上次说到我打算详细的说一说接触算法,

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

那么今天就从接触算法的开端,接触搜索开始,今天先来讲一讲箱排序(bucket-sorting)。首先接触搜索一般来说是一个从全局到局部的过程(也就是很多人喜欢说的Global-local),首先我们通过全局的搜索来快速判断几个物体是否相交,然后再局部的定位哪些单元进行了相交。

以最为常见的两个面之间的接触来说,我们首先定义两个面(在有限元中通常称为主面和从面),我们可以非常简单的计算出这两个面的包围盒子(bounding box),这里计算包围盒子的方法也有很多,后续会讲,最简单的那种(AABB)大家就可以理解成从各个方向上的最小值延伸到各个方向的最大值的一个空间六面体。然后如果两个面包围盒子本身都没有接触,我们就不用进行局部的检测了,如果两个面有的话,我们可以选用两个包围盒子相交的部分进行进一步的接触检测,具体如下图所示。

那么进一步我们需要找到的则是哪个单元和哪个单元或者节点发生了接触,存储成接触对的信息进行接下来的计算,这时候我们就可以采用空间箱排序的技术。总的来说其实非常简单,就是对空间画格子,2D空间就是画长方形格子,3D空间画六面体的格子,然后一个格子中的单元(节点)只跟格子中或者相邻格子中的单元或节点进行接触检测,这样呢就避免了距离非常远的单元进行无意义的检测,整体上提升了效率。

如下图所示,如果我们采用传统的点对面的接触算法(NTS)我们的从面节点需要向主面单元进行投影,假设下边的面为从面, 上面的是主面,我们针对三角形的节点,则只需要在该点所在盒子内部与该盒子周边的盒子进行接触检测就行,比如S点只需呀在S点所在的盒子检测,发现没有,然后去周边的盒子检测,发现了边AB。这里是个简单的2D的例子,对于3D的搜索其实是类似的,原理一样,代码也不用多写啥。 

由于空间中的点根据设定的x,y,z 三个方向上盒子的尺寸,可以快速的直接定位盒子的ID,然后找到盒子中需要搜索的元素,理论上,在单元分布比较均匀的时候,这个搜索方法是     的,也就是接近于线性的,与之前所说的穷举    形成了鲜明的对比,当然如果你全局就画一个盒子,那么就还是这么糟糕。所以大家也可以看到,单元尺寸、空间的分布及盒子的大小会极大的影响这套算法的效率,那么往往单元的尺寸、空间的分布由用户案例具体问题决定,开发者并不能改变什么,那么盒子的大小就很关键了,研究表明以下的盒子尺寸算是一个最优的

 

其中     为单元的边长的最大值,这个取值可以保证其只进行1层“邻居盒子”的搜索。具体可以参考我的友人V.A Yastrebov 的博士论文[1]。

这套方法还有一个好处就是他非常简单去构建,去更新,对于大变形分析,只需要简单的更新坐标,更新包围盒子,重新画一下格子,就完事了。这些操作均是非常简单且快速的。还有一点就是因为各个节点也就在自己的盒子和周边的盒子内进行搜索,所以非常容易并行。

今天先说到这,下次接着讲其他的空间搜索相关的知识。

参考文献:

  1. V.A Yastrebov, Computational Contact Mechanics: geometry, detection and numerical techniques

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

有限元基础知识:牛顿法与修正牛顿法

继前文有限元基础知识:线性化说过Newton-Raphson迭代的基本流程,当时我们介绍的也叫完全牛顿法(FullNewton)我们通过不断的迭代使得即内外力平衡,其中外力是有所施加的载荷决定的,而内力则是由系统的应力与当前构型决定的。那么为了完成这个过程,我们就需要进行如下的计算,即在每一个迭代步都计算切线刚度矩阵,即根据第个迭代步的构型、应力应变状态计算当前的切线刚度矩阵。这个过程就好比精确制导,在每一个迭代之后,我们都准确的知道下一个迭代的方向,但是代价就是在每一个迭代后,我们都需要重新的计算刚度矩阵,并重新进行矩阵求解,而众所周知这个过程开销是比较大的。举个例子,在我们做非线性仿真分析的时候,经常需要将每一步切的比较小,那么可能一个非线性仿真就有几十个上百个增量步,而每个增量步内又有4-5个迭代步,那么可能会使得求解刚度矩阵的次数轻松的超过上百次,非常的费时(这也是非线性分析比线性分析花费时间长的多的主要原因之一)。另外有个问题就是因为每一步都需要计算切线刚度矩阵,当系统接近极值点的时候,就容易切线矩阵奇异,造成数值振动或者不收敛。所以我们就可以做多种方法,来改变一下最原始的牛顿法,今天先说一种:修正牛顿法(ModifiedNewton)其实改进牛顿法也比较容易理解,其核心无非就是,原本的牛顿法是每个迭代步都计算一次切线刚度矩阵,而改进牛顿法采用一种比较懒的策略,那就是我每隔几步算一次刚度矩阵,这样呢,就可以算完刚度矩阵后将分解后的矩阵存下来,大幅度提升效率。然而其实天下也没有免费的午餐,既然现在不再精确制导,而是开始大力出奇迹,我们理所当然的可以认为,现在的迭代路径并没有完全牛顿法那么精确,为了实现同样的收敛,我们往往需要迭代更多次。如下图所示的结构,在考虑几何非线性的情况下,我们可以看到,完全牛顿法收敛步数远小于修正牛顿法,大概是修正牛顿法的,然而因为其每一迭代步求解非常快,总体消耗的时间却可能更少。一般商业软件中对于修正牛顿法有几种方式:在每个增量步开始的时候计算切线刚度矩阵,迭代步不重新计算每隔n个迭代步计算切线刚度矩阵一步中迭代超过预设的最大迭代数的时候就更新切线刚度矩阵总的来说呢,在采用了修正牛顿法后,在非线性并没有特别强烈,边界条件并没有大的突变的情况下,我们一般都是可以更快的得到收敛的结果的。而且同理由于我们的刚度矩阵是在“很久之前”算出来的,可能就有机会跳过那个极值点的奇异矩阵,所以对于有极值点的问题,在一定程度上也可以解决。好了,今天就先说到这里,改进牛顿法一般会与线搜索(linesearch)一起用,而且也还有另外一类的迭代方法:割线类,经常成为拟牛顿法,或BFGS(优化领域居多),我们且听下回分解。来源:大狗子说数值模拟

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