浅析有限元法中的沙漏现象

本文转自-公众号有限元仿真分析
原文链接:https://mp.weixin.qq.com/s/mHe25cOXFLV1s-bULEZvPg
沙漏 (Hourglass) 模式是一种非物理的零能变形模式,产生零应变和应力。
在有限单元法的力学分析中,一般以节点的位移作为基本变量,单元内节点的位移以及应变均采用形函数对各点位移进行插值计算得到。应力根据本构方程由应变计算得到,之后就可以计算单元的内能了。如果采用单点积分(积分点在等参元中心),在某些情况下节点位移不为零(即单元有形变),但插值得到的应变却为零。比如,一个正方体单元变形为等腰梯形,节点位移相等却方向相反,各点的形函数为零,所以插值结果为零,这样内能计算结果也为零(单元没有变形)。在这种情况下,一对单元叠在一起有点像沙漏,所以这种模式被称之为沙漏模式或者沙漏。如果单元变成交替出现的梯形形状(两两在一起类似沙漏以及Windows系统中的鼠标动画图标),这时就需要小心了。
为了说明问题,首先假定选择一个弯矩作用来模拟纯弯曲荷载的一小块材料。在弯矩作用下,材料中轴线处的长度没有改变,与纵向轴线的夹角也没有改变。这意味着单元单个积分点上的所有应力分量均为零。由于单元变形,没有产生应变能,因此,这种变形的弯曲模式是一个零能量模式。由于单元在此模式下没有刚度,所以,单元不能抵抗这种形式的变形。在粗划的网格中,这种零能量模式会通过网格扩展,从而产生无意义的结果。
一般来说,如果从变形的网格中看不出沙漏效应的话,就认为它造成的影响不大。一个更为量化的途径就是研究伪应变能。它是控制沙漏变形所耗散的主要能量。如果伪应变能过高,说明过多的应变能可能被用来控制沙漏变形了。判断过高伪应变能的来源,最有效的途径是比较伪应变能和其他内部能量的值。一般而言,伪应变能与实际应变能的能量耗散比率应低于5%。处于完全弹性范围阶段的固体,由变形而存储的能量称为应变能,当外力消除时,应变能将释放做功,变形体恢复原状。
总的来说,作用在单独节点上的荷载、边界条件或接触易于产生沙漏现象。而将荷载或约束分布在两个或更多节点上,则大大减轻了沙漏问题,如对角部进行圆角处理等。一般的规律是,两点或多点接触发生得越快,沙漏将减弱的越快。
总能量=内能+动能+滑移界面能
能量之间是可以转化的。但是,对于动力学问题,总能量一般是不变的,也就是能量守恒原理。沙漏模式也就是零能模式在理论上是存在的,大多数实际的模型中是不可能的。零能模式是指有变形,但不消耗能量。显然,这是一种伪变形模式,若不加以控制,计算模型会变得不稳定,并且计算出来的结果是没有意义的。要抵制这种变形模式就需要消耗一定的能量,也就是沙漏能。如果,这个比值太多,就说明计算模型与实际模型的变形有很大差距,当然结果也就是不正确的。这也是使用缩减积分所付出的代价。用完全积分单元可以解决这个问题,但是计算效率不高,还有可能导致单元锁死,过刚度等问题。
由于沙漏问题与网格质量息息相关,虽然几何模型的划分方法至今没有一个统一的标准可以遵循,但是利用经验的积累,以下推荐几项改善网格质量的原则与方法:
01
对于多大数问题而言,采用线性缩减积分单元的细划网格产生的误差可在一个可接受的范围之内。建议当采用这类单元模拟承受弯曲荷载的任何结构时,沿厚度方向上至少应采用四个单元。线性缩减积分单元能很好地承受扭曲变形,因此,在任何扭曲变形很大的模拟中可以采用网格细划的这类单元。
02
标准单元的边长通常以几何模型的最下尺寸确定,即如果几何模型的厚度是结构的最小尺寸,那么标准单元的边长至少应与此厚度相当。在高应力梯度区域的单元应细分,单元大小取决于计算精度与规模等。
03
在高应力梯度区,要进行网格细分的应力稳定性计算。既采用多次,多类型的局部细化网格进行计算,当前后两次计算结果满足计算精度要求时,通常差别不大于5%,用以确定合适的网格。
04
网格划分时,单元各边之间的比例不能太大。对于线性单元,如四节点四边形单元,八节点六面体单元等,要求小于3;对于二次单元,例如十节点四边形单元,20节点六面体单元等,要求小于10等。对于梁结构,在两个节点之间可根据需要划分多个单元。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 所谓“沙漏形状”,指的是在输出符号时按照特定的格式进行排列:每行输出奇数个符号,各行符号心对齐,相邻两行符号数差2,符号数先从大到小顺序递减到1,再从小到大顺序递增,首尾符号数相等。给定任意n个符号,不一定能正好组成一个沙漏,要求打印出的沙漏能用掉尽可能多的符号。 ### 回答2: 题目所要求的沙漏形状,可以分为两个部分: 1. 上半部分 从心向两边逐渐减少符号的数目,直到只剩下一个符号为止。每行输出奇数个符号,且各行符号心对齐,相邻两行符号数差2。可以用一个for循环来输出这部分。 2. 下半部分 从心开始,向两边逐渐增加符号的数目,直到符号的数目达到了n。每行输出奇数个符号,且各行符号心对齐,相邻两行符号数差2。可以用一个while循环来输出这部分。 特别要注意,当n小于符号的数量(即无法完成一个完整的沙漏),需要输出"Invalid Input"。而在可以完成沙漏的情况下,输出要求首尾符号数相等,即输出的符号数必须是偶数。 下面是代码实现: ```python n = int(input()) symbol_num = 1 symbol_list = [] while symbol_num <= n: symbol_list.append(symbol_num) n -= symbol_num symbol_num += 2 symbol_list = symbol_list[::-1] + symbol_list[1:] if len(symbol_list) == 0: print("Invalid Input") else: max_width = symbol_list[-1] for symbol_num in symbol_list: line = '*' * symbol_num print(line.center(max_width, ' ')) ``` ### 回答3: 首先,如果我们想要打印一个能用掉尽可能多符号的沙漏,就需要尽可能多地使用大符号,因为大符号能够占据更多的行数,从而使得使用的总符号数更多。因此,我们可以首先确定整个沙漏的大小,即最大符号数为多少。假设最大符号数为max,那么沙漏的行数应该为2 * n - 1(其n为沙漏心行的符号数),因为最大符号数为max时的行数为2 * max - 1,而我们需要构成一个完整的沙漏,使得沙漏的左右两侧具有相同的形状,因此将两侧行数相加,即2 * n - 1 = 2 * max - 1,解得max = n。 接下来,我们可以从大到小依次考虑每一行。对于每一行,我们都可以按照以下步骤进行构造: 1.输出空格,使得符号能够居对齐。 2.输出符号。首先输出该行前面的符号数,然后输出该行后面的符号数。 3.输出换行符,进行下一行的构造。 特别地,对于心行,只需要输出符号即可,因为没有前面或后面的符号。 以下是具体的伪代码实现: ``` input n max = n for i = max to 1 step -2 do output i 个符号 output (2 * max - i) 个空格 output i 个符号 output 换行符 for i = 3 to max step 2 do output i 个符号 output (2 * max - i) 个空格 output i 个符号 output 换行符 ``` 最后,需要注意的是,如果给定的符号数不足以构成一个完整的沙漏,那么我们只需要输出能够构成的部分即可。具体地,我们可以在第一步和第二步加入判断,如果输出符号的数量超过给定的符号数,那么就停止输出即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值